X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=empathy.js;h=f9bf7410d4da8e77f3208b6608005dc770dabbbd;hb=02c84b85c58b60f48bb0baf37cacdd037e84d28d;hp=ca93b30f8be5343197a7877c002fa7181cfb2a02;hpb=d4cda1d79dd27aea818e1e35f30bcc3d745208a3;p=empires-server diff --git a/empathy.js b/empathy.js index ca93b30..f9bf741 100644 --- a/empathy.js +++ b/empathy.js @@ -6,12 +6,34 @@ class Empathy extends Game { super(id); this.state = { prompts: [], - active_prompt: null + active_prompt: null, + players_answered: 0, + scores: null }; this.answers = []; this.next_prompt_id = 1; } + reset() { + /* 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.scores = null; + + this.answers = []; + + this.broadcast_event_object('game-state', this.state); + } + add_prompt(items, prompt_string) { const prompt = new Prompt(this.next_prompt_id, items, prompt_string); this.next_prompt_id++; @@ -74,8 +96,69 @@ class Empathy extends Game { answers: answers }); + /* And notify players how many players have answered. */ + this.state.players_answered++; + this.broadcast_event_object('answered', this.state.players_answered); + return { valid: true }; } + + compute_scores() { + const word_submitters = {}; + const scores = []; + + for (let a of this.answers) { + for (let word of a.answers) { + if (word_submitters[word]) + word_submitters[word].push(a.player.name); + else + word_submitters[word] = [a.player.name]; + } + } + + for (let a of this.answers) { + let score = 0; + for (let word of a.answers) { + score += word_submitters[word].length; + } + scores.push({ + player: a.player.name, + score: score + }); + /* Now that we've computed the score for a player for this + * round, also accumulate that score into the players runnning + * total. */ + if (a.player.score) + a.player.score += score; + else + a.player.score = score; + + /* And broadcast that new score out. */ + this.broadcast_event('player-update', a.player.info_json()); + } + + scores.sort((a,b) => { + return b.score - a.score; + }); + + const word_submitters_arr = []; + for (let word in word_submitters) + word_submitters_arr.push({word: word, players: word_submitters[word]}); + + word_submitters_arr.sort((a,b) => { + 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); + } } Empathy.router = express.Router(); @@ -131,6 +214,14 @@ router.post('/answer/:prompt_id([0-9]+)', (request, response) => { request.session.id, request.body.answers); response.json(result); + + if (game.answers.length >= game.players.length) + game.compute_scores(); +}); + +router.post('/reset', (request, response) => { + const game = request.game; + game.reset(); }); Empathy.meta = {