@Inject private GraphicEntityModule graphicEntityModule;
@Inject private View view;
-
- Model model = new Model();
-
- // Hybrid :-(
- Player p0, p1;
+ @Inject private Model model;
@Override
public void init() {
model.init(gameManager.getSeed());
+ gameManager.getPlayer(0).model = model.p0;
+ gameManager.getPlayer(1).model = model.p1;
- p0 = gameManager.getPlayer(0);
- p0.setCastlePosition(0);
- p0.setMultiplier(1);
- p0.adjustScore(model.trollPosition);
- p0.sendInputLine(String.format("%d %d", model.roadLength, model.initialStones));
-
- p1 = gameManager.getPlayer(1);
- p1.setCastlePosition(model.roadLength);
- p1.setMultiplier(-1);
- p1.adjustScore(model.trollPosition);
- p1.sendInputLine(String.format("%d %d", model.roadLength, model.initialStones));
+ for (Player p : gameManager.getPlayers()) {
+ p.sendInputLine(String.format("%d %d", model.roadLength, model.initialStones));
+ }
- view.init();
- drawPlayer();
+ view.init(model);
- // result in text display, so do last:
- p0.setStones(model.initialStones);
- p1.setStones(model.initialStones);
+ gameManager.getPlayer(0).view = view.p0;
+ gameManager.getPlayer(1).view = view.p1;
gameManager.setFrameDuration(2000); // XXX
}
- private void drawPlayer() {
- for (Player player : gameManager.getPlayers()) {
- boolean p0 = player.getIndex() == 0;
- int x = p0 ? 280 : 1920 - 280;
- int y = 220;
-
- Rectangle border1 = graphicEntityModule
- .createRectangle()
- .setWidth(140)
- .setHeight(140)
- .setX(x - 70)
- .setY(y - 70)
- .setLineWidth(0)
- .setFillColor(player.getColorToken());
-
- Rectangle border2 = graphicEntityModule
- .createRectangle()
- .setWidth(120)
- .setHeight(120)
- .setX(x - 60)
- .setY(y - 60)
- .setLineWidth(0)
- .setFillColor(0xffffff);
-
- Sprite avatarSprite = graphicEntityModule.createSprite()
- .setX(x)
- .setY(y)
- .setZIndex(20)
- .setImage(player.getAvatarToken())
- .setAnchor(0.5)
- .setBaseHeight(116)
- .setBaseWidth(116);
-
- player.avatar = graphicEntityModule.createGroup(border1, border2, avatarSprite);
-
- Text text = graphicEntityModule.createText(player.getNicknameToken())
- .setX(x)
- .setY(y + 120)
- .setZIndex(20)
- .setFontSize(40)
- .setFillColor(0x7f3f00)
- .setAnchor(0.5);
-
- player.stoneCounter = graphicEntityModule.createText("S")
- .setX(x)
- .setY(y+200)
- .setZIndex(20)
- .setFontSize(40)
- .setFillColor(0x7f3f00)
- .setAnchor(0.5);
-
- player.message = graphicEntityModule.createText()
- .setX(p0 ? 15 : 1920-15)
- .setY(680)
- .setZIndex(1)
- .setFontSize(40)
- .setStrokeColor(0x000000)
- .setFillColor(0xffbf7f)
- .setAnchorX(p0 ? 0 : 1)
- .setAnchorY(1);
-
- player.castle = graphicEntityModule.createSprite()
- .setImage("castle.png")
- .setTint(player.getColorToken())
- .setX(p0 ? 160 : 1920-160)
- .setY(p0 ? 890 : 880)
- .setZIndex(1)
- .setAnchorX(0.5)
- .setAnchorY(1)
- .setScaleX(p0 ? 1 : -1);
-
- player.stone = graphicEntityModule.createText()
- .setZIndex(3)
- .setFontSize(150)
- .setFillColor(0x12322a)
- .setAnchor(0.5)
- .setAlpha(0);
- }
- }
-
- private void moveTroll() {
- graphicEntityModule.commitEntityState(0.5, view.troll, view.trollPositionGauge);
- int x0 = p0.castle.getX(), x1 = p1.castle.getX();
- int y0 = p0.castle.getY(), y1 = p1.castle.getY();
- view.troll.setX(x0 + model.trollPosition * (x1-x0) / model.roadLength,
- Curve.ELASTIC);
- view.troll.setY(y0 + model.trollPosition * (y1-y0) / model.roadLength,
- Curve.ELASTIC);
-
- view.trollPositionGauge.setX((view.trollPositionGauge.getX() + view.troll.getX()) / 2);
- int delta = model.trollPosition - model.roadLength / 2;
- if (delta < 0) {
- view.trollPositionGauge.setText("← " + Math.abs(delta));
- }
- else if (delta > 0) {
- view.trollPositionGauge.setText(Math.abs(delta) + " →");
- }
- else {
- view.trollPositionGauge.setText("↔");
- }
- graphicEntityModule.commitEntityState(0.75, view.trollPositionGauge);
- view.trollPositionGauge.setX(view.troll.getX());
- }
-
@Override
public void gameTurn(int turn) {
+ // System.err.println("Starting turn " + turn);
+
+ view.startTurn();
- p0.sendInputLine(String.format("%d %d %d", p0.getScore(), p0.getStones(), p1.getStones()));
- p1.sendInputLine(String.format("%d %d %d", p1.getScore(), p1.getStones(), p0.getStones()));
+ boolean disqual = false;
+ boolean victory = false;
+ boolean exhausted = false;
+ int delta = 0;
for (Player player : gameManager.getActivePlayers()) {
+ Model.Player p = player.model;
+ {
+ int trollDistance = p.getTrollDistance();
+ int stones = p.getStones();
+ int oppStones = p.getOppStones();
+ player.sendInputLine(String.format("%d %d %d", trollDistance, stones, oppStones));
+ }
player.execute();
}
- int delta = 0;
+ // SDK @#%^&! arbitrary sequence point: last input < first output
+
for (Player player : gameManager.getActivePlayers()) {
+ Model.Player p = player.model;
+
try {
int stones = player.getAction();
- if (stones == 0 && player.getStones() > 0) {
+ if (stones == 0 && p.getStones() > 0) {
if (model.random.nextInt(10) > 0) {
gameManager.addToGameSummary(GameManager.formatErrorMessage(player.getNicknameToken() + " tried not throwing stones. Fixing that for them because I'm in a good mood today."));
stones = 1;
throw new InvalidAction("tried not throwing any stone. They were then eaten by a grue.");
}
}
- player.consumeStones(stones);
+ p.consumeStones(stones);
gameManager.addToGameSummary(String.format("%s throws %d stone%s at the troll.", player.getNicknameToken(), stones, stones == 1 ? "" : "s"));
- delta += player.getMultiplier() * stones;
+ delta += player.model.getMultiplier() * stones;
if (stones < 0) {
player.deactivate(player.getNicknameToken() + " CHEAT");
gameManager.addToGameSummary(GameManager.formatErrorMessage(player.getNicknameToken() + " cheated. Banning account."));
player.setScore(-1);
- endGame();
+ disqual = true;
}
else if (stones > 0) {
- player.stone.setX(player.castle.getX());
- player.stone.setY(player.castle.getY() - 100);
- player.stone.setText(new Integer(stones).toString());
- player.stone.setAlpha(1);
- graphicEntityModule.commitEntityState(0, player.stone);
-
- int peakX = (player.castle.getX() + view.troll.getX()) / 2;
- int peakY = 540;
- player.stone.setX(peakX);
- player.stone.setY(peakY, Curve.EASE_OUT);
- graphicEntityModule.commitEntityState(0.25, player.stone,
- player.stoneCounter);
-
- player.stone.setX(view.troll.getX());
- player.stone.setY(view.troll.getY() - 50, Curve.EASE_IN);
- player.stone.setAlpha(0, Curve.EASE_IN);
- graphicEntityModule.commitEntityState(0.5, player.stone);
+ player.view.animateStones(stones);
+ player.view.updateStoneCounter();
}
}
catch (InvalidAction e) {
player.deactivate(player.getNicknameToken() + " INVALID");
gameManager.addToGameSummary(GameManager.formatErrorMessage(player.getNicknameToken() + " " + e.getMessage()));
player.setScore(-1);
- endGame();
+ disqual = true;
}
catch (NumberFormatException e) {
player.deactivate(player.getNicknameToken() + " ERROR");
gameManager.addToGameSummary(GameManager.formatErrorMessage(player.getNicknameToken() + " provided malformed input!"));
player.setScore(-1);
- endGame();
+ disqual = true;
}
catch (TimeoutException e) {
gameManager.addToGameSummary(player.getNicknameToken() + " timed out!");
player.deactivate(player.getNicknameToken() + " T/O");
player.setScore(-1);
- endGame();
+ disqual = true;
}
- player.message
- .setText(player.getMessageString());
- // .setAnchorX(/*player == p0 ? 0 : */ 1);
- graphicEntityModule.commitEntityState(0, player.message);
+ player.view.displayMessage(player.getMessageString());
}
- if (delta > 0) {
- gameManager.addToGameSummary("Troll walks right.");
- model.trollPosition++;
- moveTroll();
- }
- else if (delta < 0) {
- gameManager.addToGameSummary("Troll walks left.");
- model.trollPosition--;
- moveTroll();
- }
- else {
- gameManager.addToGameSummary("Troll stands still.");
- }
+ if (! disqual) {
+ if (delta > 0) {
+ gameManager.addToGameSummary("Troll walks right.");
+ model.trollPosition++;
+ }
+ else if (delta < 0) {
+ gameManager.addToGameSummary("Troll walks left.");
+ model.trollPosition--;
+ }
+ else {
+ gameManager.addToGameSummary("Troll stands still.");
+ // XXX animate
+ }
+ view.moveTroll();
- for (Player player : gameManager.getActivePlayers()) {
- player.adjustScore(model.trollPosition);
- if (model.trollPosition == player.getCastlePosition()) {
- gameManager.addToGameSummary(GameManager.formatErrorMessage("Troll destroys " + player.getNicknameToken()));
- endGame();
+ for (Player player : gameManager.getActivePlayers()) {
+ player.model.adjustScore(model.trollPosition);
}
- }
- if (p0.getStones() <= 0 && p1.getStones() <= 0) {
- endGame();
+ if (model.haveWinner()) {
+ int loser = model.getLoser();
+ gameManager.addToGameSummary(GameManager.formatErrorMessage("Troll destroys " + gameManager.getPlayer(loser).getNicknameToken()) + ".");
+ victory = true;
+ }
+ else if (model.exhausted()) exhausted = true;
}
- }
-
- private void destroyPlayer(Player player) {
- player.avatar.setRotation(170*Math.PI/180, Curve.ELASTIC);
- graphicEntityModule.commitEntityState(0.5, player.castle);
- player.castle.setX(player.castle.getX(), Curve.ELASTIC);
- player.castle.setScaleY(-0.2, Curve.EASE_IN);
+ if (disqual || victory || exhausted) endGame();
}
private void endGame() {
- if (! gameManager.isGameEnd()) {
- gameManager.endGame();
+ gameManager.endGame();
- if (p0.getScore() > p1.getScore()) {
- gameManager.addToGameSummary(GameManager.formatSuccessMessage(p0.getNicknameToken() + " wins"));
- destroyPlayer(p1);
- }
- else if (p0.getScore() < p1.getScore()) {
- gameManager.addToGameSummary(GameManager.formatSuccessMessage(p1.getNicknameToken() + " wins"));
- destroyPlayer(p0);
- }
- else if (p0.getScore() < 0) {
- gameManager.addToGameSummary(GameManager.formatErrorMessage("Everybody loses!"));
- destroyPlayer(p0);
- destroyPlayer(p1);
- }
- else {
- gameManager.addToGameSummary("Draw.");
- }
+ Player p0 = gameManager.getPlayer(0);
+ Player p1 = gameManager.getPlayer(1);
+
+ int s0 = p0.getScore();
+ int s1 = p1.getScore();
+
+ if (s0 > s1) {
+ gameManager.addToGameSummary(GameManager.formatSuccessMessage(p0.getNicknameToken() + " wins."));
+ p1.view.destroy();
+ }
+ else if (s0 < s1) {
+ gameManager.addToGameSummary(GameManager.formatSuccessMessage(p1.getNicknameToken() + " wins."));
+ p0.view.destroy();
+ }
+ else if (s0 < 0) {
+ gameManager.addToGameSummary(GameManager.formatErrorMessage("Everybody loses!"));
+ p0.view.destroy();
+ p1.view.destroy();
+ }
+ else {
+ gameManager.addToGameSummary("Draw.");
}
}
}