diff options
Diffstat (limited to 'old')
-rw-r--r-- | old/Map5Marshal.java | 399 |
1 files changed, 399 insertions, 0 deletions
diff --git a/old/Map5Marshal.java b/old/Map5Marshal.java new file mode 100644 index 0000000..5ada087 --- /dev/null +++ b/old/Map5Marshal.java @@ -0,0 +1,399 @@ +package ch.asynk.rustanddust.game.map; + +import java.io.StringWriter; + +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.utils.Json; +import com.badlogic.gdx.utils.JsonValue; +import com.badlogic.gdx.utils.JsonReader; +import com.badlogic.gdx.utils.JsonWriter.OutputType; + +import ch.asynk.rustanddust.engine.Tile; +import ch.asynk.rustanddust.engine.Path; +import ch.asynk.rustanddust.engine.Move; +import ch.asynk.rustanddust.engine.Orientation; +import ch.asynk.rustanddust.engine.SelectedTile; + +import ch.asynk.rustanddust.RustAndDust; +import ch.asynk.rustanddust.game.Hex; +import ch.asynk.rustanddust.game.Battle; +import ch.asynk.rustanddust.game.Player; +import ch.asynk.rustanddust.game.Army; +import ch.asynk.rustanddust.game.Unit; +import ch.asynk.rustanddust.game.UnitList; +import ch.asynk.rustanddust.game.Order; +import ch.asynk.rustanddust.game.OrderList; +import ch.asynk.rustanddust.game.Engagement; + +public abstract class Map5Marshal extends Map4Orders +{ + private static StringWriter writer = new StringWriter(2048); + private static UnitList units = new UnitList(30); + + public Map5Marshal(final RustAndDust game, Texture map, SelectedTile hex) + { + super(game, map, hex); + } + + public String unload(Player player, Player opponent) + { + Json json = new Json(OutputType.json); + writer.getBuffer().setLength(0); + json.setWriter(writer); + + json.writeObjectStart(); + json.writeArrayStart("players"); + unload(json, player); + unload(json, opponent); + json.writeArrayEnd(); + json.writeObjectStart("map"); + unload(json); + json.writeObjectEnd(); + json.writeArrayStart("orders"); + unload(json, orders); + json.writeArrayEnd(); + json.writeObjectEnd(); + + writer.flush(); + return writer.toString(); + } + + // player + private void unload(Json json, Player player) + { + json.writeObjectStart(); + json.writeValue("id", player.getId()); + json.writeValue("a", player.army); + json.writeArrayStart("v"); + json.writeValue(player.getTurn()); + json.writeValue(player.getAp()); + json.writeValue(player.getApSpent()); + json.writeValue(player.actionCount); + json.writeValue(player.objectivesWon); + json.writeValue(player.engagementWon); + json.writeValue(player.engagementLost); + json.writeArrayEnd(); + unload(json, "Us", player.units, true); + unload(json, "Cs", player.casualties, false); + unload(json, "Rs", player.reinforcement, false); + unload(json, "Ws", player.withdrawed, false); + json.writeObjectEnd(); + } + + // units + private void unload(Json json, String name, UnitList units, boolean pos) + { + json.writeArrayStart(name); + for (Unit u : units) unload(json, u, pos); + json.writeArrayEnd(); + } + + // unit + private void unload(Json json, Unit unit, boolean pos) + { + json.writeObjectStart(); + json.writeValue("id", unit.id); + json.writeValue("code", unit.code); + json.writeArrayStart("v"); + json.writeValue(unit.hq); + json.writeValue(unit.ace); + json.writeValue(unit.hasMoved); + json.writeValue(unit.hasFired); + json.writeArrayEnd(); + if (pos) { + Hex h = unit.getHex(); + json.writeArrayStart("p"); + json.writeValue(h.getCol()); + json.writeValue(h.getRow()); + json.writeValue(unit.getRotation()); + json.writeArrayEnd(); + } + json.writeObjectEnd(); + } + + // map + private void unload(Json json) + { + json.writeArrayStart("o"); + for (Hex h : objectives) { + json.writeObjectStart(); + json.writeValue("army", h.belongsTo()); + json.writeArrayStart("p"); + json.writeValue(h.getCol()); + json.writeValue(h.getRow()); + json.writeArrayEnd(); + json.writeObjectEnd(); + } + json.writeArrayEnd(); + } + + // orders + private void unload(Json json, OrderList orders) + { + for (Order o : orders) { + json.writeObjectStart(); + json.writeValue("type", o.type); + switch(o.type) { + case MOVE: + unload(json, o.move); + break; + case ENGAGE: + unload(json, o.engagement); + break; + case PROMOTE: + json.writeValue("id", o.unit.id); + json.writeArrayStart("p"); + json.writeValue(o.unitHex.getCol()); + json.writeValue(o.unitHex.getRow()); + json.writeArrayEnd(); + break; + } + json.writeObjectEnd(); + } + } + + // move + private void unload(Json json, Move m) + { + json.writeValue("type", m.type); + json.writeValue("id", ((Unit) m.pawn).id); + if (m.from != null) { + json.writeArrayStart("from"); + json.writeValue(m.from.getCol()); + json.writeValue(m.from.getRow()); + json.writeArrayEnd(); + } + if (m.to != null) { + json.writeArrayStart("to"); + json.writeValue(m.to.getCol()); + json.writeValue(m.to.getRow()); + json.writeValue(m.orientation.r()); + json.writeArrayEnd(); + } + if (m.tiles.size() > 0) { + json.writeArrayStart("path"); + for (Tile t : m.tiles) { + json.writeArrayStart(); + json.writeValue(t.getCol()); + json.writeValue(t.getRow()); + json.writeArrayEnd(); + } + json.writeArrayEnd(); + } + } + + // engagement + private void unload(Json json, Engagement e) + { + unload(json, "atk", e.attacker, false); + unload(json, "def", e.defender, false); + json.writeArrayStart("assists"); + for (Unit u : e.assists) + unload(json, null, u, false); + json.writeArrayEnd(); + json.writeArrayStart("dice"); + json.writeValue(e.d1); + json.writeValue(e.d2); + json.writeValue(e.d3); + json.writeValue(e.d4); + json.writeArrayEnd(); + json.writeArrayStart("res"); + json.writeValue(e.success); + json.writeValue(e.attackSum); + json.writeValue(e.defenseSum); + json.writeArrayEnd(); + } + + private void unload(Json json, String key, Unit u) + { + unload(json, key, u, true); + } + + // unit + private void unload(Json json, String key, Unit u, boolean pos) + { + if (key != null) json.writeObjectStart(key); + else json.writeObjectStart(); + json.writeValue("id", u.id); + Hex h = u.getHex(); + if (pos && (h != null)) { + json.writeArrayStart("p"); + json.writeValue(h.getCol()); + json.writeValue(h.getRow()); + json.writeArrayEnd(); + } + json.writeObjectEnd(); + } + + // LOAD + public void load(String payload, Player[] players) + { + units.clear(); + JsonValue root = new JsonReader().parse(payload); + players[0] = loadPlayer(root.get("players").get(0)); + players[1] = loadPlayer(root.get("players").get(1)); + loadMap(root.get("map")); + loadOrders(root.get("orders")); + units.clear(); + } + + private Player loadPlayer(JsonValue v) + { + Player p = new Player(v.getInt("id"), Army.valueOf(v.getString("a"))); + JsonValue a = v.get("v"); + p.setTurn(a.getInt(0), a.getInt(1), a.getInt(2)); + p.actionCount = a.getInt(3); + p.objectivesWon = a.getInt(4); + p.engagementWon = a.getInt(5); + p.engagementLost = a.getInt(6); + + a = v.get("Us"); + for (int i = 0; i < a.size; i++) + p.units.add(loadUnit(a.get(i), true)); + a = v.get("Cs"); + for (int i = 0; i < a.size; i++) + p.casualties.add(loadUnit(a.get(i), false)); + a = v.get("Rs"); + for (int i = 0; i < a.size; i++) + p.reinforcement.add(loadUnit(a.get(i), false)); + a = v.get("Ws"); + for (int i = 0; i < a.size; i++) + p.withdrawed.add(loadUnit(a.get(i), false)); + + return p; + } + + private Unit loadUnit(JsonValue v, boolean pos) + { + int unitId = v.getInt("id"); + Unit.UnitCode code = Unit.UnitCode.valueOf(v.getString("code")); + JsonValue a = v.get("v"); + Unit u = game.factory.getUnit(code, a.getBoolean(0), a.getBoolean(1)); + u.hasMoved = a.getBoolean(2); + u.hasFired = a.getBoolean(3); + u.id = unitId; + if (pos) { + a = v.get("p"); + Hex h = getHex(a.getInt(0), a.getInt(1)); + u.setRotation(a.getInt(2)); + showOnBoard(u, h, Orientation.fromRotation(a.getInt(2))); + } + units.add(u); + return u; + } + + private void loadMap(JsonValue v) + { + JsonValue a = v.get("o"); + for (int i = 0; i < a.size; i++) { + JsonValue o = a.get(i); + Hex h = getHex(o.get("p").getInt(0), o.get("p").getInt(1)); + Army army = Army.valueOf(o.getString("army")); + h.claim(army); + showObjective(h, army); + } + } + + private void loadOrders(JsonValue v) + { + for (int i = 0; i < v.size; i++) { + JsonValue o = v.get(i); + Order order = null; + switch(Order.OrderType.valueOf(o.getString("type"))) { + case MOVE: + order = loadMoveOrder(o); + break; + case ENGAGE: + order = loadEngageOrder(o); + break; + case PROMOTE: + order = loadPromoteOrder(o); + break; + } + orders.add(order); + } + } + + private Order loadMoveOrder(JsonValue v) + { + Unit unit = findById(v.getInt("id")); + Hex from = loadHex(v, "from"); + Hex to = loadHex(v, "to"); + Orientation orientation = Orientation.fromRotation(v.get("to").getInt(2)); + if (unit == null) return null; + + Path path = null; + JsonValue p = v.get("path"); + if (p != null) { + path = Path.get(p.size); + for (int i = 0; i < p.size; i++) { + JsonValue h = p.get(i); + path.tiles.add(getHex(h.getInt(0), h.getInt(1))); + } + } + + Move move = Move.get(unit, from, to, orientation, path); + Order o = Order.get(); + o.setMove(unit, move); + o.unitHex = from; + return o; + } + + private Order loadEngageOrder(JsonValue v) + { + JsonValue u = v.get("atk"); + Unit atk = findById(u.getInt("id")); + u = v.get("def"); + Unit def = findById(u.getInt("id")); + + Order o = Order.get(); + o.setEngage(atk, def); + + u = v.get("dice"); + o.engagement.d1 = u.getInt(0); + o.engagement.d2 = u.getInt(1); + o.engagement.d3 = u.getInt(2); + o.engagement.d4 = u.getInt(3); + + u = v.get("res"); + o.engagement.success = u.getBoolean(0); + o.engagement.attackSum = u.getInt(1); + o.engagement.defenseSum = u.getInt(1); + + u = v.get("assists"); + for (int i = 0; i < u.size; i++) { + JsonValue a = u.get(i); + Unit unit = findById(a.getInt("id")); + o.engagement.assists.add(unit); + } + + return o; + } + + private Order loadPromoteOrder(JsonValue v) + { + Unit unit = findById(v.getInt("id")); + if (unit == null) return null; + + Order o = Order.get(); + o.setPromote(unit); + return o; + } + + private Hex loadHex(JsonValue v, String key) + { + JsonValue p = v.get(key); + if (p == null) return null; + return getHex(p.getInt(0), p.getInt(1)); + } + + private static Unit findById(int id) + { + for (Unit u : units) { + if (u.id == id) + return u; + } + RustAndDust.error(String.format("loadPromoteOrder: unable to find unit %d", id)); + return null; + } +} |