Get the troll to utter stuff
authorJBM <jbm@codingame.com>
Thu, 28 May 2020 20:36:36 +0000 (22:36 +0200)
committerJBM <jbm@codingame.com>
Thu, 28 May 2020 20:36:36 +0000 (22:36 +0200)
PLAN.org
src/main/java/com/codingame/game/View.java
src/test/java/Main.java

index a73572d..20cee16 100644 (file)
--- a/PLAN.org
+++ b/PLAN.org
@@ -42,3 +42,7 @@ That one's probably never going to be DONE ^^'
 
     Trolls are only counterfeits, made by the Enemy in the Great Darkness, in mockery of Ents, as Orcs were of Elves.
         J. R. R. Tolkien, The Two Towers (1954), Book III, Chapter 4: "Treebeard"
+* TODO View settings
+* TODO Troll quotes
+- pain au chocolat ou chocolatine
+
index b59c0a8..a032aff 100644 (file)
@@ -23,12 +23,13 @@ class View {
     @Inject ToggleModule toggleModule;
 
     enum Dir {
-        LEFT("walks left."),
-        STILL("stands still."),
-        RIGHT("walks right.");
+        LEFT("walks left.", 0),
+        STILL("stands still.", 1),
+        RIGHT("walks right.", 2);
 
         String movement;
-        Dir(String mvt) { movement = mvt; }
+        int index;
+        Dir(String mvt, int i) { movement = mvt; index = i; }
     }
 
     class Player {
@@ -235,6 +236,7 @@ class View {
 
     Model model;
     Random random = new Random();
+    Text trollMessage;
     Sprite troll;
     Text trollPositionGauge;
     Player p0 = new Player(), p1 = new Player();
@@ -265,6 +267,8 @@ class View {
         p0.startTurn();
         p1.startTurn();
 
+        trollMessage.setX(troll.getX());
+
         animateTurnCounter();
     }
 
@@ -360,8 +364,17 @@ class View {
             .setX(1980/2)
             .setY(980)
             .setFillColor(0xffffff);
-
         moveTroll();
+
+        trollMessage = graphicEntityModule.createText()
+            .setX(1902/2)
+            .setY(680)
+            .setAnchorX(0.5)
+            .setAnchorY(0)
+            .setTextAlign(TextBasedEntity.TextAlign.CENTER)
+            .setStrokeColor(0xFFFF00)
+            .setFillColor(0xFFFF00)
+            .setFontSize(40);
     }
 
     private void moveTroll() {
@@ -392,6 +405,11 @@ class View {
     void moveTroll(Dir d) {
         moveTroll();
         gameManager.addToGameSummary("Troll " + d.movement);
+
+        trollMessage.setText(selectTrollMessage(d)).setAlpha(1, Curve.NONE);
+        graphicEntityModule.commitEntityState(0.5, trollMessage);
+        trollMessage.setAlpha(0, Curve.EASE_IN);
+        graphicEntityModule.commitEntityState(1, trollMessage);
     }
 
     void animateTurnCounter() {
@@ -479,4 +497,67 @@ class View {
         gameManager.addToGameSummary("Draw.");
         animateLoss(1920/2, 680, 200, "DRAW");
     }
+
+    String selectTrollMessage(Dir d) {
+        if (random.nextInt(10000) == 0) {
+            return specials[random.nextInt(specials.length)];
+        }
+
+        int i = random.nextInt(directed.length + isotropic.length);
+        if (i < directed.length) {
+            return directed[i][d.index];
+        }
+        else {
+            return isotropic[i-directed.length];
+        }
+    }
+
+    String specials[] = {
+        "CG know what they're doing."
+    };
+
+    String directed[][] = {
+        // movies
+        { "Han shot first", "I am your father", "Greedo shot first" },
+
+        // everyday life
+        { "tea > coffee", "XXX", "coffee > tea" },
+        { "Marvel > DC", "Disney > 50 shades", "DC > Marvel" },
+
+        // troll ou incompris ou SJW
+
+        // gaming
+        { "PC > console", "pong is still\nunequaled", "console > PC" },
+        { "Windows > Linux", "it's all Android anyway", "Linux > Windows" },
+        { "pad > stick", "mouse gaming is lame", "stick > pad" },
+        { "RTS > FPS", "solitaire best game", "FPS > RTS" },
+        { "YT gaming > twitch", "I stream on dailymotion", "twitch > YT gaming" },
+
+        // programming
+        { "vi < emacs", "I code with Notepad", "emacs > vi" },
+        { "tabs < spaces", "gofmt FTW", "spaces < tabs" },
+        { "LISP is the most\npowerful language", "HTML is a programming language", "Forth is the most\npowerful language" },
+        { "static linking best", "symbolic linking best", "dynamic linking best" },
+        { "NPE > SIGSEGV", "kernel panic", "SIGSEGV > NPE" },
+        { "objects > functions", "it's closures\nall the way down", "functions > objects" },
+        { "GOTO FTW", "COME FROM FTW", "don't use GOTO" },
+        { "Agile > Waterfall", "SCRUM isn't Agile", "Waterfall > Agile" },
+
+        // Internet
+        { "gmail > github", "copy-paste FTW", "github > gmail" },
+        { "MSIE > Safari", "Opera did it first", "Safari > MSIE" },
+
+        // CodinGame
+        { "bing > yahoo", "duckduckgo best SE", "yahoo > bing" },
+        { "light theme best", "ascii > graphics", "dark theme best" },
+        { "simulation beats heuristics", "AI is a forest of ifs", "heuristics beat simulation" },
+        { "bruteforce always prevails", "you'll timeout anyway", "algorithms always prevail" }
+    };
+
+    String isotropic[] = {
+        "Electron apps are the fastest",
+        "Rosebud",
+        "Thanos did nothing wrong",
+        "developers developers developers"
+    };
 }
index 250f028..79bfaed 100644 (file)
@@ -5,7 +5,7 @@ public class Main {
         
         MultiplayerGameRunner gameRunner = new MultiplayerGameRunner();
         gameRunner.addAgent(Player1.class);
-        gameRunner.addAgent(Player1.class);
+        gameRunner.addAgent(PlayerRand.class);
         
         // gameRunner.addAgent("python3 /home/user/player.py");