]> git.cworth.org Git - empires-server/commitdiff
Add a game phase to perform judging
authorCarl Worth <cworth@cworth.org>
Thu, 11 Jun 2020 14:22:29 +0000 (07:22 -0700)
committerCarl Worth <cworth@cworth.org>
Thu, 11 Jun 2020 14:22:29 +0000 (07:22 -0700)
This is after all answers are submitted, and before scores are computed.

The list of unique words are sent to each player so that they can
group them into sets of equivalent words.

The server isn't yet _doing_ anything with the word groups that are
submitted from judging, but that will be the next step.

empathy.js

index b12c3e75553f596b7cc2108cc9e1c21f0bd97444..3b613e672ade0e14e0f4ff03e1b3205b4f78cddd 100644 (file)
@@ -8,6 +8,8 @@ class Empathy extends Game {
       prompts: [],
       active_prompt: null,
       players_answered: 0,
+      ambiguities: null,
+      players_judged: 0,
       scores: null
     };
     this.answers = [];
@@ -41,6 +43,8 @@ class Empathy extends Game {
 
     this.state.active_prompt = null;
     this.state.players_answered = 0;
+    this.state.ambiguities = 0;
+    this.state.players_judged = 0;
     this.state.scores = null;
 
     this.answers = [];
@@ -117,6 +121,33 @@ class Empathy extends Game {
     return { valid: true };
   }
 
+  perform_judging() {
+    const word_map = {};
+
+    for (let a of this.answers) {
+      for (let word of a.answers) {
+        const key = this.canonize(word);
+        word_map[key] = word;
+      }
+    }
+
+    this.state.ambiguities = Object.values(word_map);
+
+    this.broadcast_event_object('ambiguities', this.state.ambiguities);
+  }
+
+  receive_judging() {
+    /* And notify players how many players have completed judging. */
+    this.state.players_judged++;
+    this.broadcast_event_object('judged', this.state.players_judged);
+
+    return { valid: true };
+  }
+
+  canonize(word) {
+    return word.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();
+  }
+
   compute_scores() {
     const word_submitters = {};
     const scores = [];
@@ -219,7 +250,20 @@ router.post('/answer/:prompt_id([0-9]+)', (request, response) => {
                                      request.body.answers);
   response.json(result);
 
-  if (game.answers.length >= game.players.length)
+  if (game.state.players_answered >= game.players.length)
+    game.perform_judging();
+});
+
+router.post('/judging/:prompt_id([0-9]+)', (request, response) => {
+  const game = request.game;
+  const prompt_id = parseInt(request.params.prompt_id, 10);
+
+  const result = game.receive_judging(prompt_id,
+                                      request.session.id,
+                                      request.body);
+  response.json(result);
+
+  if (game.state.players_judged >= game.players.length)
     game.compute_scores();
 });