joined: false,
/* Center pool letters */
center: [],
- revealing: {}, /* letter_id -> { seconds, opacity } */
+ revealing: {}, /* letter_id -> { number, opacity } */
/* Player words: { session_id: { name, words: [...] } } */
player_words: {},
/* Scores: { session_id: { name, score, words } } */
if (!positions[tile.id]) {
positions[tile.id] = this._random_position();
}
- const seconds = Math.ceil(countdown_ms / 1000);
const revealing = { ...this.state.revealing };
- revealing[tile.id] = { seconds, opacity: 1 };
+ revealing[tile.id] = { number: 3, opacity: 1 };
this.setState({
center,
bag_remaining: remaining
});
- /* Animate: each second, show the number with a fade from full
- * opacity to transparent, then switch to the next number. */
- const total_ms = seconds * 1000;
+ /* Animate: show 3, 2, 1 evenly spaced within countdown_ms,
+ * each fading from full opacity to transparent. */
+ const phase_ms = countdown_ms / 3;
const start = Date.now();
const step = () => {
this.setState(prev => {
const elapsed = Date.now() - start;
- if (elapsed >= total_ms) {
+ if (elapsed >= countdown_ms) {
delete r[tile.id];
return { revealing: r };
}
- const current_second = seconds - Math.floor(elapsed / 1000);
- const frac = (elapsed % 1000) / 1000;
- r[tile.id] = { seconds: current_second, opacity: 1 - frac };
+ const phase = Math.min(2, Math.floor(elapsed / phase_ms));
+ const current_number = 3 - phase;
+ const frac = (elapsed - phase * phase_ms) / phase_ms;
+ r[tile.id] = { number: current_number, opacity: 1 - frac };
return { revealing: r };
});
onMouseDown={(e) => this.on_center_mouse_down(e, tile)}
onTouchStart={(e) => this.on_center_touch_start(e, tile)}>
{is_revealing
- ? <span style={{opacity: rev.opacity}}>{rev.seconds}</span>
+ ? <span style={{opacity: rev.opacity}}>{rev.number}</span>
: tile.letter}
</div>
);