X-Git-Url: https://troll.desast.re/troll.git/blobdiff_plain/076ea5bbdda8751cd178b657157d3a08458b7c7b..9b7567a9665ab65123d5463c8a288eda917b1117:/src/main/java/com/codingame/game/Referee.java?ds=sidebyside diff --git a/src/main/java/com/codingame/game/Referee.java b/src/main/java/com/codingame/game/Referee.java index 6866b9b..b56cade 100644 --- a/src/main/java/com/codingame/game/Referee.java +++ b/src/main/java/com/codingame/game/Referee.java @@ -21,275 +21,150 @@ public class Referee extends AbstractReferee { @Inject private MultiplayerGameManager gameManager; @Inject private GraphicEntityModule graphicEntityModule; - int roadLength; - int initialStones; - int trollPosition; - Player p0, p1; - Sprite troll; - Text trollPositionGauge; - + @Inject private View view; + @Inject private Model model; + @Override public void init() { - switch (new Random(gameManager.getSeed()).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()); + model.init(gameManager.getSeed()); + gameManager.getPlayer(0).model = model.p0; + gameManager.getPlayer(1).model = model.p1; - Rectangle border2 = graphicEntityModule - .createRectangle() - .setWidth(120) - .setHeight(120) - .setX(x - 60) - .setY(y - 60) - .setLineWidth(0) - .setFillColor(0xffffff); - - Text text = graphicEntityModule.createText(player.getNicknameToken()) - .setX(x) - .setY(y + 120) - .setZIndex(20) - .setFontSize(40) - .setFillColor(0x7f3f00) - .setAnchor(0.5); - - Sprite avatar = graphicEntityModule.createSprite() - .setX(x) - .setY(y) - .setZIndex(20) - .setImage(player.getAvatarToken()) - .setAnchor(0.5) - .setBaseHeight(116) - .setBaseWidth(116); - - Text 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") - .setX(p0 ? 160 : 1920-160) - .setY(p0 ? 890 : 880) - .setZIndex(1) - .setAnchorX(0.5) - .setAnchorY(1); - - player.stone = graphicEntityModule.createText() - .setZIndex(3) - .setFontSize(150) - .setFillColor(0x12322a) - .setAnchor(0.5) - .setAlpha(0); - - player.hud = graphicEntityModule.createGroup(border1, border2, text, avatar, stoneCounter, player.castle); - player.stoneCounter = stoneCounter; + 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); - } - 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); + view.init(model); + 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); - 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; for (Player player : gameManager.getActivePlayers()) { + Model.Player p = player.model; + try { - final int stones = player.getAction(); - player.consumeStones(stones); + int stones = player.getAction(); + 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; + } + else { + throw new InvalidAction("tried not throwing any stone. They were then eaten by a grue."); + } + } + 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.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); + if (stones < 0) { + player.deactivate(player.getNicknameToken() + " CHEAT"); + gameManager.addToGameSummary(GameManager.formatErrorMessage(player.getNicknameToken() + " cheated. Banning account.")); + player.setScore(-1); + disqual = true; + } + else if (stones > 0) { + player.view.animateStones(stones); } } 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); + } + + if (model.haveWinner()) { + int winner = model.getWinner(); + gameManager.addToGameSummary(GameManager.formatErrorMessage("Troll destroys " + gameManager.getPlayer(winner).getNicknameToken())); + victory = true; + } + else if (model.exhausted()) exhausted = true; } + + if (disqual || victory || exhausted) endGame(); } private void endGame() { gameManager.endGame(); - if (p0.getScore() > p1.getScore()) { + 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.hud.setAlpha(0.3); + p1.view.destroy(); } - else if (p0.getScore() < p1.getScore()) { + else if (s0 < s1) { gameManager.addToGameSummary(GameManager.formatSuccessMessage(p1.getNicknameToken() + " wins")); - p0.hud.setAlpha(0.3); + p0.view.destroy(); } - else { + else if (s0 < 0) { gameManager.addToGameSummary(GameManager.formatErrorMessage("Everybody loses!")); - p0.hud.setAlpha(0.3); - p1.hud.setAlpha(0.3); + p0.view.destroy(); + p1.view.destroy(); + } + else { + gameManager.addToGameSummary("Draw."); } } }