diff options
Diffstat (limited to 'core')
5 files changed, 52 insertions, 27 deletions
| diff --git a/core/src/ch/asynk/rustanddust/game/Battle.java b/core/src/ch/asynk/rustanddust/game/Battle.java index c8063d1..a21e5a4 100644 --- a/core/src/ch/asynk/rustanddust/game/Battle.java +++ b/core/src/ch/asynk/rustanddust/game/Battle.java @@ -17,6 +17,8 @@ public interface Battle      public Position getHudPosition(); +    public int getTurnCount(); +      public Player getPlayer();      public Player getOpponent(); @@ -37,7 +39,7 @@ public interface Battle      public State.StateType getState(); -    public void load(String payload); +    public void load(int turn, String payload);      public String unload(boolean full);  } diff --git a/core/src/ch/asynk/rustanddust/game/battles/BattleCommon.java b/core/src/ch/asynk/rustanddust/game/battles/BattleCommon.java index 2a4f766..50bb1bd 100644 --- a/core/src/ch/asynk/rustanddust/game/battles/BattleCommon.java +++ b/core/src/ch/asynk/rustanddust/game/battles/BattleCommon.java @@ -22,6 +22,7 @@ public abstract class BattleCommon implements Battle      protected final Factory factory;      protected int _id; +    protected int turnCount;      protected Factory.MapType mapType;      protected String name;      protected String description; @@ -67,6 +68,7 @@ public abstract class BattleCommon implements Battle      {          this.map = factory.getMap(getMapType());          setup(); +        this.turnCount = 0;          this.currentPlayer = players[0];      } @@ -74,6 +76,7 @@ public abstract class BattleCommon implements Battle      public void desinit()      {          this.map = null; +        this.turnCount = 0;          this.players[0] = null;          this.players[1] = null;          this.currentPlayer = null; @@ -95,8 +98,9 @@ public abstract class BattleCommon implements Battle      }      @Override -    public void load(String payload) +    public void load(int turn, String payload)      { +        this.turnCount = turn;          map.load(payload, players);          this.currentPlayer = players[0];      } @@ -130,13 +134,14 @@ public abstract class BattleCommon implements Battle              currentPlayer = getOpponent();              currentPlayer.turnStart(getActionPoints());          } +        turnCount += 1;          map.turnDone();          return ret;      }      protected boolean turnDoneForBoth()      { -        return ((currentPlayer.getTurn() > 0) && (currentPlayer.getTurn() == getOpponent().getTurn())); +        return ((turnCount > 0) && ((turnCount % 2) == 0));      }      protected Player getWinner(int minTurns) @@ -167,6 +172,12 @@ public abstract class BattleCommon implements Battle      }      @Override +    public int getTurnCount() +    { +        return turnCount; +    } + +    @Override      public Player getPlayer()      {          return currentPlayer; diff --git a/core/src/ch/asynk/rustanddust/game/ctrl/Solo.java b/core/src/ch/asynk/rustanddust/game/ctrl/Solo.java index 51a7172..a2c0600 100644 --- a/core/src/ch/asynk/rustanddust/game/ctrl/Solo.java +++ b/core/src/ch/asynk/rustanddust/game/ctrl/Solo.java @@ -1,6 +1,7 @@  package ch.asynk.rustanddust.game.ctrl;  import ch.asynk.rustanddust.RustAndDust; +import ch.asynk.rustanddust.util.GameRecord;  import ch.asynk.rustanddust.game.Ctrl;  import ch.asynk.rustanddust.game.Battle; @@ -25,7 +26,9 @@ public class Solo extends Ctrl              battle.getOpponent().id = other;              battle.initialDeployment();          } else { -            battle.load(game.db.loadGame(gameId)); +            GameRecord r = game.db.loadGame(gameId); +            battle.load(r.turn, r.payload); +            r.dispose();          }      } @@ -44,11 +47,11 @@ public class Solo extends Ctrl      private void storeGame()      { -        game.db.storeGame(gameId, battle.getPlayer().id, battle.unload(true)); +        game.db.storeGame(gameId, battle.getTurnCount(), battle.getPlayer().id, battle.unload(true));      }      private void storeTurn()      { -        game.db.storeTurn(gameId, battle.getPlayer().id, battle.unload(false)); +        game.db.storeTurn(gameId, battle.getTurnCount(), battle.getPlayer().id, battle.unload(false));      }  } diff --git a/core/src/ch/asynk/rustanddust/util/DB.java b/core/src/ch/asynk/rustanddust/util/DB.java index 8de4747..44cb79c 100644 --- a/core/src/ch/asynk/rustanddust/util/DB.java +++ b/core/src/ch/asynk/rustanddust/util/DB.java @@ -40,7 +40,7 @@ public class DB      private static final String TBL_GAMES_CRT = "create table if not exists"          + " games ( _id integer primary key autoincrement"          + " ,opponent integer not null, battle integer not null, mode integer not null" -        + " ,ts datetime default current_timestamp" +        + " ,turn integer not null, ts datetime default current_timestamp"          + " ,player integer default null, hash text default null, payload text default null"          + " ,foreign key (opponent) references players(_id)"          + " ,foreign key (battle) references battles(_id)" @@ -50,10 +50,11 @@ public class DB      private static final String TBL_TURNS_CRT = "create table if not exists"          + " turns ( _id integer primary key autoincrement" -        + " ,game integer not null, player integer not null" +        + " ,game integer not null, turn integer not null, player integer not null"          + " ,hash text not null, payload text not null"          + " ,foreign key (game) references games(_id)"          + " ,foreign key (player) references players(_id)" +        + " unique (game, turn)"          + ");";      private static final String FEED_CONFIG = " insert or ignore into config values(\"version\", " + DB_SCHEMA_VERSION + ");"; @@ -202,7 +203,7 @@ public class DB          } catch (SQLiteGdxException e) { RustAndDust.error("storeBattle"); }      } -    private static final String INSERT_GAME = "insert or ignore into games(opponent,battle,mode) values (%d,%d,%d);"; +    private static final String INSERT_GAME = "insert or ignore into games(opponent,battle,mode,turn) values (%d,%d,%d,0);";      public void storeGame(int opponent, int battle, int mode)      { @@ -232,14 +233,14 @@ public class DB          return getGameId(opponent, battle, mode);      } -    private static final String INSERT_TURN = "insert into turns(game,player,hash,payload) values (%d,%d,'%s','%s');"; +    private static final String INSERT_TURN = "insert into turns(game,turn,player,hash,payload) values (%d,%d,%d,'%s','%s');"; -    public boolean storeTurn(int game, int player, String payload) +    public boolean storeTurn(int game, int turn, int player, String payload)      {          try {              String hash = getDigest(payload);              if (hash == null) return false; -            exec(String.format(INSERT_TURN, game, player, hash, payload)); +            exec(String.format(INSERT_TURN, game, turn, player, hash, payload));          } catch (SQLiteGdxException e) {              RustAndDust.error("storeTurn");              return false; @@ -270,15 +271,15 @@ public class DB          return ret;      } -    private static final String UPDATE_GAME = "update games set ts=current_timestamp, player=%d, hash='%s', payload='%s' where _id=%d;"; +    private static final String UPDATE_GAME = "update games set ts=current_timestamp, turn=%d, player=%d, hash='%s', payload='%s' where _id=%d;"; -    public boolean storeGame(int game, int player, String payload) +    public boolean storeGame(int game, int turn, int player, String payload)      {          RustAndDust.debug("storeGame");          try {              String hash = getDigest(payload);              if (hash == null) return false; -            exec(String.format(UPDATE_GAME, player, hash, payload, game)); +            exec(String.format(UPDATE_GAME, turn, player, hash, payload, game));          } catch (SQLiteGdxException e) {              RustAndDust.error("storeGame");              return false; @@ -286,17 +287,23 @@ public class DB          return true;      } -    private static final String LOAD_GAME = "select g.payload from games g players g(where g._id=%d;"; +    private static final String LOAD_GAME = "select g._id, g.opponent, g.battle, g.mode, g.turn, g.ts, g.player, '', '', g.hash, g.payload" +        + " from games g where g._id=%d;"; -    public String loadGame(int game) +    public GameRecord loadGame(int game)      {          RustAndDust.debug("loadGame"); -        String r = null; +        GameRecord r = null;          try {              DatabaseCursor cursor = query(String.format(LOAD_GAME, game));              if (cursor.getCount() > 0) {                  cursor.next(); -                r = cursor.getString(0); +                r = from(cursor); +                if (!r.hash.equals(getDigest(r.payload))) { +                    // TODO recover from that big shit +                    RustAndDust.error(String.format("corrupted game %d", game)); +                    r = null; +                }              }          } catch (SQLiteGdxException e) { RustAndDust.error("loadGame"); }          return r; @@ -319,7 +326,7 @@ public class DB      } -    private static final String GET_GAMES = "select g._id, g.opponent, g.battle, g.mode, g.ts, g.player, p.name, b.name, null, null" +    private static final String GET_GAMES = "select g._id, g.opponent, g.battle, g.mode, g.turn, g.ts, g.player, p.name, b.name, null, null"          + " from games g inner join players p on (p._id=g.opponent) inner join battles b on (b._id=g.battle);";      public void loadGames() @@ -347,16 +354,17 @@ public class DB              r.opponent = cursor.getInt(1);              r.battle = cursor.getInt(2);              r.mode = GameMode.from(cursor.getInt(3)); -            try { r.ts = df.parse(cursor.getString(4)); } +            r.turn = cursor.getInt(4); +            try { r.ts = df.parse(cursor.getString(5)); }              catch (java.text.ParseException e) {                  r.ts = null; -                RustAndDust.error(String.format("can't parse", cursor.getString(4))); +                RustAndDust.error(String.format("can't parse", cursor.getString(5)));              } -            r.currentPlayer = cursor.getInt(5); -            r.oName = cursor.getString(6); -            r.bName = cursor.getString(7); -            r.hash = cursor.getString(8); -            r.payload = cursor.getString(9); +            r.currentPlayer = cursor.getInt(6); +            r.oName = cursor.getString(7); +            r.bName = cursor.getString(8); +            r.hash = cursor.getString(9); +            r.payload = cursor.getString(10);          } catch (Exception e) {              r.dispose(); RustAndDust.error("GameRecord from cursor");          } diff --git a/core/src/ch/asynk/rustanddust/util/GameRecord.java b/core/src/ch/asynk/rustanddust/util/GameRecord.java index a17e967..8a1a4eb 100644 --- a/core/src/ch/asynk/rustanddust/util/GameRecord.java +++ b/core/src/ch/asynk/rustanddust/util/GameRecord.java @@ -16,6 +16,7 @@ public class GameRecord implements List.ListElement, Disposable, Pool.Poolable      public int id;      public int opponent;      public int battle; +    public int turn;      public GameMode mode;      public Date ts;      public int currentPlayer; | 
