• TypeScript 93.8%
  • CSS 5.9%
  • HTML 0.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Lukas Schaefer 7d960a1932
All checks were successful
Test / test (push) Successful in 8s
Deploy / deploy (push) Successful in 9s
Validate game state more strictly
Signed-off-by: Lukas Schaefer <lukas@lschaefer.xyz>
2026-07-28 17:33:12 -04:00
.forgejo Fix file extension name 2026-07-27 22:19:50 -04:00
public Initial monopoly version 2026-07-25 12:48:45 -04:00
src Validate game state more strictly 2026-07-28 17:33:12 -04:00
.gitignore Initial monopoly version 2026-07-25 12:48:45 -04:00
.oxlintrc.json Initial monopoly version 2026-07-25 12:48:45 -04:00
AGENTS.md Support saving 2026-07-27 22:01:03 -04:00
ARCHITECTURE.md Support saving 2026-07-27 22:01:03 -04:00
index.html Implement go green expansion 2026-07-27 21:36:24 -04:00
LICENSE Add MIT license 2026-07-26 19:27:02 -04:00
package-lock.json Add vitest and workflow to test it (#1) 2026-07-25 13:52:39 -04:00
package.json Implement Monopoly empire inner baord 2026-07-25 19:14:55 -04:00
README.md Fix file extension name 2026-07-27 22:19:50 -04:00
tsconfig.app.json Initial monopoly version 2026-07-25 12:48:45 -04:00
tsconfig.json Initial monopoly version 2026-07-25 12:48:45 -04:00
tsconfig.node.json Initial monopoly version 2026-07-25 12:48:45 -04:00
vite.config.ts Add vitest and workflow to test it (#1) 2026-07-25 13:52:39 -04:00

Amalgolopoly — Local Multiplayer

Hot-seat Amalgolopoly in React with rules based off of https://www.youtube.com/watch?v=QpBjWFin4LI and https://www.youtube.com/watch?v=aSnzlXGodp4&t=181s. You can also view it at https://amalgolopoly.lschaefer.xyz/. You can email me at amalgolopoly@lschaefer.xyz if you are interested in working on this too. Note this is vibe coded and more meant to try out the rules of the game then to be a polished app.

See ARCHITECTURE.md for module layers and how to add a phase.

Run

npm install
npm run dev

Saves

Games auto-save to browser localStorage. From the in-game toolbar you can Download save (.amalgolopoly file). On the setup screen you can Upload save to resume from a file. If a save fails to load, a recovery screen lets you download the corrupt file, report an issue, or start a new game.

Cheats (console)

Open DevTools and use window.cheat to set up scenarios:

cheat.help()
cheat.ownGroup('orange', 0)
cheat.ownGroup('railroad', 0)
cheat.own('GO', 0)
cheat.ownGroup('corner', 0)
cheat.sale('the-bank', 0)
cheat.corruption('framed', 0)
cheat.superCorruption('blackmail', 0)
cheat.superJail(1, 0)        // Bob in Super Jail; Alice is sender
cheat.houses('New York Avenue', 3)   // residential blocks (clears industrial)
cheat.industrial('Boardwalk', 2)
cheat.hazard('Park Place', 'prison')
cheat.cityBonus('Boardwalk', 'park')
cheat.stadium('Boardwalk')
cheat.skyscraper('Park Place')
cheat.money(5000, 0)
cheat.pos(28, 1)             // Bob on New York Avenue
cheat.phase('roll')
cheat.turn(1)
cheat.soreLoserTokens(4, 0)
cheat.mrMonopoly(0)
cheat.forceDice(1, 1)        // next roll only
cheat.forceSpeedDie('sneaky-swapper') // or 'mr-monopoly' / 'bus' / 1|2|3
cheat.forcePowerUpDie('coins') // or 'green-shell' / 'red-shell' / 'pow' / 'blooper' / 'vault'
cheat.forceBuyDie('buy')     // next Buy die only
cheat.depot('Reading Railroad')
cheat.forceEscapeDie({ type: 'corruption', count: 2 })
cheat.actions.rollDice()
cheat.secretVault()
cheat.lock('Vermont Avenue')
cheat.vaultCombo(4)
cheat.emptyVault(0)
cheat.corruptSave()          // invalid save → recovery screen (reloads)

Useful helpers: cheat.player(), cheat.board(), cheat.vault(), cheat.secretVault(), cheat.bonus('jackpot'), cheat.sale('jet-pack'), cheat.corruption('snitch'), cheat.dealMobile(playerId), cheat.forceWedge('jackpot'), cheat.forceHeistDie({ type: 'money', amount: 200 }), cheat.set({ ... }).

Rules covered

  • 28 players; hot-seat local multiplayer

  • Doubles (extra turn); three doubles → Jail (see Pokémon for optional doubles bonuses)

  • Buy or auction unowned properties

  • Rent (City blocks; railroads; utilities ×4/×10/×20; skyscraper / Monopoly Tower multipliers)

  • Monopoly City building (replaces classic houses/hotels — see below)

  • Mortgage / unmortgage (+10%)

  • Chance & Community Chest

  • Income Tax ($200) & Luxury Tax ($100)

  • Monopoly City:

    • Streets use residential and industrial blocks (max 8 combined; industrial costs 2× residential). No color monopoly or even-building required to build.
    • Rent uses block count (industrial-only while a hazard is on the property). Empty land uses the land rent tier (no classic monopoly ×2).
    • 4 Planning Permission spaces (one per outer side): free hazard or bonus (mutually exclusive; stadiums block hazards).
    • Stadium $200 (need 3 of a color; bank of 2; one per color): each owned stadium adds +50% to GO salary.
    • Skyscraper (deed cost; one per full Mega color set): ×2 rent for the whole set.
    • Monopoly Tower $700 (need 2+ full sets; bank of 1): ×2 all your street rents; stacks with skyscraper.
    • Streets must be greened or a monopoly before city builds (see Go Green).
    • Board pieces: green/blue residential, gray/red industrial; hazard ⚠; bonus shield; stadium; cyan skyscraper outline on the set; Tower marked on the owner (not the tile).
  • Monopoly Go Green:

    • Pay a streets deed price to green it (light-green tint on the board): unlocks City building and doubles that streets rent. Completing a color set greens the whole set for free.
    • 4 Bike Share spaces (midway between Warp Pipes: outer left/right, empire top-left / bottom-right): pay $10 to move to any space until the next Bike Share clockwise.
  • Free Parking Jackpot expansion: +6 Spin spaces (3 outer / 3 Empire); Deal Mobile; Bonus cards; Free Parking spinner / jackpot pot

  • Secret Vault: +6 guess spaces (4 Guess for Free / 2 Pay to Guess — Empire on top & bottom); separate vault money pot (seeds $400; +$50 on pass GO; pay-to-guess $100 and Power-Up vault face pay go into the vault); Free Parking / jackpot wedge still collect only the Jackpot; opening the vault collects Jackpot + vault money plus stadium/Tower and a locked deed, then choose Deal Mobile or Mr. Monopoly; stadium in vault then Monopoly Tower when stadiums are out; 6 locked outer deeds; every guess draws a bonus card; Power-Up die Vault face (optional $100 pay-to-guess).

  • Buy Everything expansion: purchasable corners/taxes/Chance/CC, Sale Vault + Buy die (instant-win Sale cards omitted). Owner of Jail / Just Visiting receives jail bail instead of the Jackpot when someone pays to leave Jail.

  • Go to Jail expansion:

    • Jail bail is $100 (not classic $50); Get Out of Jail Free or roll doubles still work (max 3 turns; may stay to farm Corruption)
    • Corruption + Heist (split across outer / Empire); Corruption / Super Corruption cards
    • Super Jail (Go To Jail corner): pay $300 to the sender, give Super Corruption cards drawn this stay, or stay to farm (max 3 turns). Super Jail turns allow only that one choice — no Buy Die, bonus/corruption plays, or other post-roll actions
    • Three Go To Jail spaces (one outer mid-track, one Empire, Super Jail corner); landing on any sends you to Jail
  • Mega Edition:

    • Starting cash $2500 / $2700 / $2900 (male / other / female)
    • Mega streets, Gas Company, Auction, Bus Ticket, Birthday Gift
    • 16 one-use bus tickets (1 expires all); train depots ($100, bank of 4, double RR rent)
    • 3-utility rent ×4/×10/×20
    • Speed Die (13 / Bus / Mr. Monopoly / Sneaky Swapper) with doubles-on-white, triples-to-any-space
  • Ms. Monopoly: GO salary wage gap (Male $200, Female $240, Other $220 when passing GO); Warp Pipes (2 outer + 2 Empire; land → next pipe clockwise)

  • Monopoly for Sore Losers:

    • Electric Bill and Water Bill spaces ($150 each; pay Jackpot, earn a Sore Loser token). Mr. Monopoly collects $150 from the bank instead.
    • Earn Sore Loser tokens (pay rent/tax/bill/utility, go to Jail, land on own property, trapped by Mr. Monopoly); cash 4 → become Mr. Monopoly (separate from Deal Mobile — both allowed). Powers: send someone else when youd go to Jail; reverse rent; collect taxes/bills; free house whenever anyone rolls doubles; land on another player → skip their next turn + steal a property. Becoming Mr. Monopoly frees you from Jail / Super Jail.
  • Monopoly Empire (inner board): after Boardwalk you enter Empire GO, then the Empire loop (22 brands, 2 Empire card spaces, Chance replaced by Super Star on Empire, Electric/Water Empire, Rival Tower Tax / Tower Tax, 1 of 3 Go To Jail), then back to outer GO — 120 spaces total (76 outer + 44 Empire). Billboard rent = $50 × tower height; pass Empire GO collects tower value (min $50). +1 Office tiles: unlimited, one buy per turn ($500); free +1 on completing an Empire color set. No tower-height cap or win condition. Empire cards separate deck; land on Empire spaces to draw

  • Monopoly Gamer (Mario):

    • Characters (13, unique at setup): Mario, Peach, Yoshi, Donkey Kong + collectors (Bowser, Luigi, Toad, Wario, Rosalina, Boo, Diddy Kong, Fire Mario, Tanooki Mario) with Super Star abilities and Power-Up boosts
    • Spaces: 2 Coin Block, 2 Thwomp, 1 Super Star; dropped coins stay on spaces until picked up when passing/landing
    • Power-Up die (optional before or after move): coins / green shell / red shell / POW / blooper / vault (7 faces; vault = optional $100 pay-to-guess)
    • Boss fights when passing GO or Empire GO.
  • Monopoly Pokémon (1995 doubles):

    • After doubles you may take a face bonus instead of the extra turn: 6s duel for an opponent property not in a completed set; 5s Community Chest; 4s Chance; 3s steal $50; 2s $200 from the bank
    • Snake eyes (1s): choose before moving — pick a move of 215 (replaces the doubles move and the re-roll), or confirm the normal doubles move and keep the extra turn

Persistence

Game state is saved to localStorage (key amalgolopoly-game) with a version string and an optional migration chain (MIGRATIONS in src/game/persist.ts). Refresh keeps the current game when the version matches or can be migrated; unsupported older versions are dropped and you start at setup. Use New Game in the sidebar (or after Game Over) to discard the save and return to setup.

When changing the save shape, bump the version, add a migrator, and drop a fixture under src/game/__tests__/fixtures/persist/ (see AGENTS.md).