window.game.set_other_player_info(info);
});
+events.addEventListener("player-exit", event => {
+ const info = JSON.parse(event.data);
+
+ window.game.remove_player(info);
+});
+
events.addEventListener("player-update", event => {
const info = JSON.parse(event.data);
window.game.set_end_judging(state.end_judging);
window.game.set_scores(state.scores);
+
+ window.game.set_new_game_votes(state.new_game_votes);
+
+ window.game.state_ready();
});
events.addEventListener("prompt", event => {
window.game.set_scores(scores);
});
+events.addEventListener("vote-new-game", event => {
+ const player = JSON.parse(event.data);
+
+ window.game.set_player_vote_new_game(player);
+});
+
+events.addEventListener("unvote-new-game", event => {
+ const player = JSON.parse(event.data);
+
+ window.game.set_player_unvote_new_game(player);
+});
+
/*********************************************************
* Game and supporting classes *
*********************************************************/
);
}
+ let still_waiting = null;
+ if (Object.keys(this.props.players_judging).length) {
+ still_waiting = [
+ <p>
+ Still waiting for the following players:
+ </p>,
+ <ul>
+ {Object.keys(this.props.players_judging).map(player => {
+ return (
+ <li
+ key={player}
+ >
+ {player}
+ {this.props.players_judging[player] ?
+ <span className="typing"/> : null }
+ </li>
+ );
+ })}
+ </ul>
+ ];
+ }
+
if (this.props.players_judged.has(this.props.player.name)) {
return (
<div className="please-wait">
<h2>Submission received</h2>
<p>
- The following players have completed judging:
+ The following players have completed judging:{' '}
{[...this.props.players_judged].join(', ')}
</p>
- <p>
- Still waiting for the following players:
- </p>
- <ul>
- {Object.keys(this.props.players_judging).map(player => {
- return (
- <li
- key={player}
- >
- {player}
- {this.props.players_judging[player] ?
- <span className="typing"/> : null }
- </li>
- );
- })}
- </ul>
+ {still_waiting}
{move_on_button}
</div>
what goes around comes around, so it's best to be generous when
judging.
</p>
+ <h2>{this.props.prompt.prompt}</h2>
{this.state.word_sets.map(set => {
return (
<div
);
}
+ let still_waiting = null;
+ if (Object.keys(this.props.players_answering).length) {
+ still_waiting = [
+ <p>
+ Still waiting for the following players:
+ </p>,
+ <ul>
+ {Object.keys(this.props.players_answering).map(player => {
+ return (
+ <li
+ key={player}
+ >
+ {player}
+ {this.props.players_answering[player] ?
+ <span className="typing"/> : null }
+ </li>
+ );
+ })}
+ </ul>
+ ];
+ }
+
if (this.props.players_answered.has(this.props.player.name)) {
return (
<div className="please-wait">
<h2>Submission received</h2>
<p>
- The following players have submitted their answers:
+ The following players have submitted their answers:{' '}
{[...this.props.players_answered].join(', ')}
</p>
- <p>
- Still waiting for the following players:
- </p>
- <ul>
- {Object.keys(this.props.players_answering).map(player => {
- return (
- <li
- key={player}
- >
- {player}
- {this.props.players_answering[player] ?
- <span className="typing"/> : null }
- </li>
- );
- })}
- </ul>
+ {still_waiting}
{move_on_button}
</div>
<p>
Remember, you're trying to match your answers with
what the other players submit.
- Give {this.props.prompt.items} answers for the following prompt:
+ Give {this.props.prompt.items} answer
+ {this.props.prompt.items > 1 ? 's' : ''} for the following prompt:
</p>
<h2>{this.props.prompt.prompt}</h2>
<form onSubmit={this.handle_submit}>
players_judging: {},
judging_idle: false,
end_judging_votes: new Set(),
- scores: null
+ scores: null,
+ new_game_votes: new Set(),
+ ready: false
};
}
});
}
+ remove_player(info) {
+ this.setState({
+ other_players: this.state.other_players.filter(o => o.id !== info.id)
+ });
+ }
+
reset_game_state() {
this.setState({
prompts: [],
players_judging: {},
judging_idle: false,
end_judging_votes: new Set(),
- scores: null
+ scores: null,
+ new_game_votes: new Set(),
+ ready: false
});
}
}
set_judging_idle(value) {
- console.log("Setting judging idle to " + value);
this.setState({
judging_idle: value
});
});
}
+ set_new_game_votes(players) {
+ this.setState({
+ new_game_votes: new Set(players)
+ });
+ }
+
+ set_player_vote_new_game(player) {
+ this.setState({
+ new_game_votes: new Set([...this.state.new_game_votes, player])
+ });
+ }
+
+ set_player_unvote_new_game(player) {
+ this.setState({
+ new_game_votes: new Set([...this.state.new_game_votes].filter(p => p !== player))
+ });
+ }
+
+ state_ready() {
+ this.setState({
+ ready: true
+ });
+ }
+
render() {
const state = this.state;
const players_total = 1 + state.other_players.length;
if (state.scores) {
return (
<div className="scores">
+ <h2>{state.active_prompt.prompt}</h2>
<h2>Scores</h2>
<ul>
{state.scores.scores.map(score => {
return (
<li key={score.player}>
- {score.player}: {score.score}
+ {score.players.join("/")}: {score.score}
</li>
);
})}
{state.scores.words.map(word => {
return (
<li key={word.word}>
- {`${word.word}: ${word.players.join(', ')}`}
+ {word.word} ({word.players.length}): {word.players.join(', ')}
</li>
);
})}
</ul>
<button
- className="new-game"
- onClick={() => fetch_post_json('reset') }
+ className="vote-button"
+ onClick={() => fetch_post_json(`new-game/${state.active_prompt.id}`) }
>
New Game
+ <div className="vote-choices">
+ {[...state.new_game_votes].map(v => {
+ return (
+ <div
+ key={v}
+ className="vote-choice"
+ >
+ {v}
+ </div>
+ );
+ })}
+ </div>
</button>
</div>
);
/>;
}
+ if (! state.ready)
+ return null;
+
return [
<GameInfo
key="game-info"