Speed mode and the third die
A faster, looser way to play — quicker turns, build wherever you like, and a third die that can teleport you across the board.

In plain words
Short on time but still want the full game? Speed mode is the answer. Turns run on a tighter clock — about 45 seconds each — so a whole match wraps up far sooner, and the pressure keeps everyone on their toes.
Building is looser, too. In a classic game you have to spread houses evenly across a colour group, one per turn. In Speed you can pour everything into a single street and build as much as you can afford in one go. And if you mortgage a property, a timer counts down: buy it back in time or it slips back to the bank.
The headline feature is the third die, which joins the roll from round 7. It changes how you move around the board:
- A number adds to your roll — the two white dice plus the third, so you travel further.
- A Bus lets you choose your move: take the full sum, or just one of the white dice.
- An "X" (Mr. Monopoly) sends you to the nearest free property, or the nearest opponent you would have to pay.
- A triple — all three dice matching — lets you teleport to any square on the board, then roll again.
For the technically curious
Modes share one engine. A new modes.ts holds MODE_CONFIGS — per-mode starting cash, turn timer, round cap, tax timing and whether uneven building is allowed — and the daemon reads the game’s mode at start, picks the config, and feeds it into initializeGame. The per-turn deadline uses the mode’s turnSeconds; Classic keeps the admin-tunable base.
// packages/game-engine/src/modes.ts
export const MODE_CONFIGS: Record<GameMode, ModeConfig> = {
classic: { startingCash: 15000, unevenBuild: false, turnSeconds: 90 },
speed: {
startingCash: 30000,
unevenBuild: true, // build any property, multiple per turn
turnSeconds: 45,
speedDie: true,
speedDieFromRound: 7,
},
// ...
};The third die is isolated in speed-die.ts — the SpeedFace type, rollSpeedDie, busOptions, isSpeedTriple and the nearest-property helpers — NOT a fork. The shared reducer only calls into it when state.mode === "speed", reusing the normal movement and landing code, so Classic is untouched and all prior engine tests stay green.
No database migration was needed for the die: the new state (last speed face, pending bus / teleport / re-roll) lives in engine_state JSON, and the die value rides on an optional dice_rolled.speedDie payload field — no new event kind. Migration 0024 only relaxed create_game to accept the "speed" mode; the enum and columns already existed.
