Skip to content

Commit

Permalink
keep tile definitions only at client side, use %load directive to poi…
Browse files Browse the repository at this point in the history
…nt them
  • Loading branch information
farin committed May 15, 2021
1 parent 1a94568 commit 95d1046
Show file tree
Hide file tree
Showing 32 changed files with 32 additions and 3,426 deletions.
37 changes: 4 additions & 33 deletions src/main/java/com/jcloisterzone/board/TilePackBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.w3c.dom.NodeList;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
Expand Down Expand Up @@ -94,44 +95,14 @@ public Tile createTile(String tileId, Vector<Element> tileElements) throws Remov
}


public TilePack createTilePack() throws IOException {
public TilePack createTilePack(java.util.List<String> definitions) throws IOException {
java.util.Map<String, Integer> tilesCount = new java.util.HashMap<>();
java.util.Set<String> removedTiles = new java.util.HashSet<>();

java.util.List<String> definitions = new ArrayList<>();

CodeSource src = TilePackBuilder.class.getProtectionDomain().getCodeSource();
if (src != null) {
URL jar = src.getLocation();
if (jar.toString().endsWith(".jar")) {
// invoked from bundled app
ZipInputStream zip = new ZipInputStream(jar.openStream());
while (true) {
ZipEntry e = zip.getNextEntry();
if (e == null)
break;
String name = e.getName();
if (name.startsWith("tile-definitions/") && name.endsWith(".xml")) {
definitions.add(name);
}
}
} else {
// invoked in development
Path definitionsDir = new File(TilePackBuilder.class.getClassLoader().getResource("tile-definitions").getFile()).toPath();
Files.list(definitionsDir).forEach(path -> {
definitions.add("tile-definitions/" + definitionsDir.relativize(path).toString());
});
Path fanDefinitionsDir = new File(TilePackBuilder.class.getClassLoader().getResource("tile-definitions/fan").getFile()).toPath();
Files.list(fanDefinitionsDir).forEach(path -> {
definitions.add("tile-definitions/fan/" + fanDefinitionsDir.relativize(path).toString());
});
}
}

definitions.forEach(path -> {
InputStream defFile;
try {
defFile = TilePackBuilder.class.getClassLoader().getResource(path).openStream();
defFile = new FileInputStream(new File(path));
} catch (IOException e) {
logger.error(e.getMessage(), e);
return;
Expand Down Expand Up @@ -168,7 +139,7 @@ public TilePack createTilePack() throws IOException {
definitions.forEach(path -> {
InputStream defFile;
try {
defFile = TilePackBuilder.class.getClassLoader().getResource(path).openStream();
defFile = new FileInputStream(new File(path));
} catch (IOException e) {
logger.error(e.getMessage(), e);
return;
Expand Down
40 changes: 24 additions & 16 deletions src/main/java/com/jcloisterzone/engine/Engine.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,8 @@
import java.net.ServerSocket;
import java.net.Socket;
import java.net.URL;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.*;
import java.util.Map.Entry;
import java.util.NoSuchElementException;
import java.util.Scanner;
import java.util.function.Predicate;
import java.util.jar.Manifest;

Expand All @@ -57,6 +54,7 @@ public class Engine implements Runnable {
private boolean bulk;

private boolean compatJavaRandom = false;
private ArrayList<String> tileDefinitions = new ArrayList<>();

public Engine(InputStream in, PrintStream out, PrintStream err, PrintStream log) {
this.in = new Scanner(in);
Expand Down Expand Up @@ -198,20 +196,30 @@ private GameSetup createSetupFromMessage(GameSetupMessage setupMsg) {
}

private void parseDirective(String line) {
if (line.equals("%bulk on")) {
bulk = true;
} else if (line.equals("%bulk off")) {
bulk = false;
out.println(gson.toJson(game));
} else if (line.startsWith("%compat")) {
Version compat = Version.valueOf(line.replace("%compat ", ""));
if (compat.lessThan(Version.valueOf("5.7.0"))) {
compatJavaRandom = true;
}
String[] s = line.split("\\s+", 2);
var directive = s[0];
var value = s[1];
switch (directive) {
case "%bulk":
bulk = "on".equals(value);
if (!bulk) {
out.println(gson.toJson(game));
}
break;
case "%compat":
Version compat = Version.valueOf(value);
if (compat.lessThan(Version.valueOf("5.7.0"))) {
compatJavaRandom = true;
}
break;
case "%load":
tileDefinitions.add(value);
break;
default:
err.println("#unknown directive " + line);
}
}


@Override
public void run() {
String line;
Expand All @@ -235,7 +243,7 @@ public void run() {
game = new Game(gameSetup);

GameStatePhaseReducer phaseReducer = new GameStatePhaseReducer(gameSetup, initialSeed, compatJavaRandom);
GameStateBuilder builder = new GameStateBuilder(gameSetup, setupMsg.getPlayers());
GameStateBuilder builder = new GameStateBuilder(tileDefinitions, gameSetup, setupMsg.getPlayers());

if (setupMsg.getGameAnnotations() != null) {
builder.setGameAnnotations(setupMsg.getGameAnnotations());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,14 @@ public class GameStateBuilder {
private Map<String, Object> gameAnnotations;

private GameState state;
java.util.List<String> definitions;


public GameStateBuilder(GameSetup setup, int playersCount) {
public GameStateBuilder(java.util.List<String> definitions, GameSetup setup, int playersCount) {
if (playersCount < 1) {
throw new IllegalArgumentException("No player in game");
}
this.definitions = definitions;
this.setup = setup;
this.playersCount = playersCount;
}
Expand Down Expand Up @@ -119,7 +121,7 @@ private void createTilePack() {
tilePackBuilder.setTileSets(setup.getTileSets());

try {
TilePack tilePack = tilePackBuilder.createTilePack();
TilePack tilePack = tilePackBuilder.createTilePack(definitions);
state = state.setTilePack(tilePack);
} catch (IOException e) {
throw new RuntimeException("Can't parse tile definitions", e);
Expand Down
134 changes: 0 additions & 134 deletions src/main/resources/tile-definitions/abbey_and_mayor.xml

This file was deleted.

Loading

0 comments on commit 95d1046

Please sign in to comment.