X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=empathy.js;h=3b613e672ade0e14e0f4ff03e1b3205b4f78cddd;hb=2690233f317b87e7336b0404ae711837e726d5cf;hp=11539d854a4473c38be1b7a8373f903986bef7f5;hpb=9fb6009a9666b92b18436975409d3717128ec9ba;p=empires-server diff --git a/empathy.js b/empathy.js index 11539d8..3b613e6 100644 --- a/empathy.js +++ b/empathy.js @@ -8,6 +8,8 @@ class Empathy extends Game { prompts: [], active_prompt: null, players_answered: 0, + ambiguities: null, + players_judged: 0, scores: null }; this.answers = []; @@ -15,8 +17,34 @@ class Empathy extends Game { } reset() { + + /* Before closing out the current round, we accumulate that score + * for each player into their runnning total. */ + for (let score of this.state.scores.scores) { + const player = this.players.find(p => p.name === score.player); + if (player.score) + player.score += score.score; + else + player.score = score.score; + + /* And broadcast that new score out. */ + this.broadcast_event('player-update', player.info_json()); + } + + /* Now that we're done with the active prompt, we remove it from + * the list of prompts and also remove any prompts that received + * no votes. This keeps the list of prompts clean. + */ + const active_id = this.state.active_prompt.id; + this.state.prompts = + this.state.prompts.filter( + p => p.id !== active_id && p.votes.length > 0 + ); + 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 = []; @@ -93,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 = []; @@ -129,11 +184,14 @@ class Empathy extends Game { return b.players.length - a.players.length; }); + /* Put this round's scores into the game state object so it will + * be sent to any new clients that join. */ this.state.scores = { scores: scores, words: word_submitters_arr }; + /* And broadcast the scores to all connected clients. */ this.broadcast_event_object('scores', this.state.scores); } } @@ -192,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(); });