]> git.cworth.org Git - lmno.games/blobdiff - empathy/empathy.jsx
empathy: Pre-group words according to common patterns
[lmno.games] / empathy / empathy.jsx
index ab45be913f109e782349529af805f8edd82105e1..0789b463fe5813cb3fc23b8cb4a84610dd32b2a5 100644 (file)
@@ -366,10 +366,6 @@ class CategoryRequest extends React.PureComponent {
 const PromptOption = React.memo(props => {
 
   const prompt = props.prompt;
-  const [show_prompt, set_show_prompt] = React.useState(true);
-
-  if (! show_prompt)
-    return false;
 
   if (prompt.votes_against.find(v => v === props.player.name))
     return false;
@@ -385,7 +381,6 @@ const PromptOption = React.memo(props => {
         onClick={(event) => {
           event.stopPropagation();
           fetch_post_json(`vote_against/${prompt.id}`);
-          set_show_prompt(false);
         }}
       >
         ×
@@ -459,11 +454,31 @@ class Ambiguities extends React.PureComponent {
   constructor(props) {
     super(props);
 
-    const word_sets = props.words.map(word => {
-      const set = new Set();
-      set.add(word);
-      return set;
-    });
+    function canonize(word) {
+      return word.replace(/((a|an|the) )?(.*?)s?$/i, '$3');
+    }
+
+    const word_sets = [];
+
+    for (let word of props.words) {
+      const word_canon = canonize(word);
+      console.log("Canonized " + word + " to " + word_canon);
+      let found_match = false;
+      for (let set of word_sets) {
+        const set_canon = canonize(set.values().next().value);
+        console.log("Comparing " + word_canon + " to " + set_canon);
+        if (word_canon === set_canon) {
+          set.add(word);
+          found_match = true;;
+          break;
+        }
+      }
+      if (! found_match) {
+        const set = new Set();
+        set.add(word);
+        word_sets.push(set);
+      }
+    }
 
     this.state = {
       word_sets: word_sets,
@@ -1153,15 +1168,29 @@ class Game extends React.PureComponent {
     const players_total = 1 + state.other_players.length;
 
     if (state.scores) {
+
+      let perfect_score = 0;
+      for (let i = 0;
+           i < state.active_prompt.items &&
+           i < state.scores.words.length;
+           i++)
+      {
+        perfect_score += state.scores.words[i].players.length;
+      }
+
       return (
         <div className="scores">
           <h2>{state.active_prompt.prompt}</h2>
           <h2>Scores</h2>
           <ul>
             {state.scores.scores.map(score => {
+              let perfect = null;
+              if (score.score == perfect_score) {
+                perfect = <span className="label">Perfect!</span>;
+              }
               return (
-                <li key={score.player}>
-                  {score.players.join("/")}: {score.score}
+                <li key={score.players[0]}>
+                  {score.players.join("/")}: {score.score} {perfect}
                 </li>
               );
             })}