@Inject private MultiplayerGameManager<Player> gameManager;
@Inject private GraphicEntityModule graphicEntityModule;
- Random random;
+ @Inject private View view;
+ @Inject private Model model;
- int roadLength;
- int initialStones;
- int trollPosition;
- Player p0, p1;
- Sprite troll;
- Text trollPositionGauge;
-
@Override
public void init() {
- random = new Random(gameManager.getSeed());
- switch (random.nextInt(4)) {
- case 0:
- roadLength = 7;
- initialStones = 15;
- break;
- case 1:
- roadLength = 7;
- initialStones = 30;
- break;
- case 2:
- roadLength = 15;
- initialStones = 30;
- break;
- case 3:
- roadLength = 15;
- initialStones = 50;
- break;
- }
-
- trollPosition = (roadLength - 1) / 2;
-
- p0 = gameManager.getPlayer(0);
- p0.setCastlePosition(0);
- p0.setMultiplier(1);
- p0.adjustScore(trollPosition);
- p0.sendInputLine(String.format("%d %d", roadLength - 1, initialStones));
-
- p1 = gameManager.getPlayer(1);
- p1.setCastlePosition(roadLength-1);
- p1.setMultiplier(-1);
- p1.adjustScore(trollPosition);
- p1.sendInputLine(String.format("%d %d", roadLength - 1, initialStones));
-
- drawBackground();
- drawPlayer();
- drawTroll();
-
- // result in text display, so do last:
- p0.setStones(initialStones);
- p1.setStones(initialStones);
-
- gameManager.setFrameDuration(2000);
- }
-
- private void drawBackground() {
- graphicEntityModule.createSprite()
- .setImage("background.png")
- .setAnchor(0);
- }
-
- 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.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);
+ model.init(gameManager.getSeed());
+ gameManager.getPlayer(0).model = model.p0;
+ gameManager.getPlayer(1).model = model.p1;
+ for (Player p : gameManager.getPlayers()) {
+ p.sendInputLine(String.format("%d %d", model.roadLength, model.initialStones));
}
- }
- private void drawTroll() {
- troll = graphicEntityModule.createSprite()
- .setImage("troll.png")
- .setAnchorX(0.5)
- .setAnchorY(1)
- .setX(1920/2)
- .setY(880)
- .setZIndex(2);
- trollPositionGauge = graphicEntityModule.createText()
- .setZIndex(2)
- .setAnchor(0.5)
- .setFontSize(40)
- .setX(1980/2)
- .setY(980)
- .setFillColor(0xffffff);
- }
+ view.init(model);
- private void moveTroll() {
- graphicEntityModule.commitEntityState(0.5, troll, trollPositionGauge);
- int x0 = p0.castle.getX(), x1 = p1.castle.getX();
- int y0 = p0.castle.getY(), y1 = p1.castle.getY();
- troll.setX(x0 + trollPosition * (x1-x0) / (roadLength - 1),
- Curve.ELASTIC);
- troll.setY(y0 + trollPosition * (y1-y0) / (roadLength - 1),
- Curve.ELASTIC);
+ gameManager.getPlayer(0).view = view.p0;
+ gameManager.getPlayer(1).view = view.p1;
- trollPositionGauge.setX((trollPositionGauge.getX() + troll.getX()) / 2);
- int delta = trollPosition - (roadLength - 1) / 2;
- if (delta < 0) {
- trollPositionGauge.setText("← " + Math.abs(delta));
- }
- else if (delta > 0) {
- trollPositionGauge.setText(Math.abs(delta) + " →");
- }
- else {
- trollPositionGauge.setText("↔");
- }
- graphicEntityModule.commitEntityState(0.75, trollPositionGauge);
- trollPositionGauge.setX(troll.getX());
+ gameManager.setFrameDuration(2000); // XXX
}
@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 (random.nextInt(10) > 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() + 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(troll.getX());
- player.stone.setY(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;
}
- }
- if (delta > 0) {
- gameManager.addToGameSummary("Troll walks right.");
- trollPosition++;
- moveTroll();
- }
- else if (delta < 0) {
- gameManager.addToGameSummary("Troll walks left.");
- trollPosition--;
- moveTroll();
- }
- else {
- gameManager.addToGameSummary("Troll stands still.");
+ player.view.displayMessage(player.getMessageString());
}
- for (Player player : gameManager.getActivePlayers()) {
- player.adjustScore(trollPosition);
- if (trollPosition == player.getCastlePosition()) {
- gameManager.addToGameSummary(GameManager.formatErrorMessage("Troll destroys " + player.getNicknameToken()));
- endGame();
+ 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();
- if (p0.getStones() <= 0 && p1.getStones() <= 0) {
- endGame();
- }
- }
+ for (Player player : gameManager.getActivePlayers()) {
+ player.model.adjustScore(model.trollPosition);
+ }
- private void destroyPlayer(Player player) {
- player.avatar.setRotation(170*Math.PI/180, Curve.ELASTIC);
+ 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;
+ }
- 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() {
gameManager.endGame();
- if (p0.getScore() > p1.getScore()) {
- gameManager.addToGameSummary(GameManager.formatSuccessMessage(p0.getNicknameToken() + " wins"));
- destroyPlayer(p1);
+ 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 (p0.getScore() < p1.getScore()) {
- gameManager.addToGameSummary(GameManager.formatSuccessMessage(p1.getNicknameToken() + " wins"));
- destroyPlayer(p0);
+ else if (s0 < s1) {
+ gameManager.addToGameSummary(GameManager.formatSuccessMessage(p1.getNicknameToken() + " wins."));
+ p0.view.destroy();
}
- else if (p0.getScore() < 0) {
+ else if (s0 < 0) {
gameManager.addToGameSummary(GameManager.formatErrorMessage("Everybody loses!"));
- destroyPlayer(p0);
- destroyPlayer(p1);
+ p0.view.destroy();
+ p1.view.destroy();
}
else {
gameManager.addToGameSummary("Draw.");