Your collectible cards finally do something: rent boosts
The property cards you win now boost your own rent on that field — the rarer the card, the bigger the boost, capped at +30%.

In plain words
Winning a game drops a collectible property card into your inventory. Until now that card was pure decoration. Now it works for you: owning a card boosts the rent you collect on that exact field for the whole game.
The boost scales with rarity, and only the rarest card you own on a field counts — boosts never stack. The total is capped at +30%, so no single card ever runs away with the game.
For the technically curious
A new engine module cards.ts is the single source of truth for the rarity ladder (common 5 / rare 10 / epic 20 / legendary 30, hard-capped at 30). GameState gained a per-slot map of field → boost percent; computeRent and rentForDisplay apply round(rent × (1 + pct/100)) after the unimproved-monopoly ×2, so the two multipliers commute and default games with no cards keep byte-identical integer rents.
// cards.ts — the single source of truth (web catalog.ts re-exports it)
export const CARD_RARITY_BOOST = { common: 5, rare: 10, epic: 20, legendary: 30 };
export const MAX_CARD_BOOST_PCT = 30; // total cap; boosts never stackThe daemon reads each seated player’s inventory once at game start (user_inventory ⋈ inventory_items), keeps the highest rarity per field, and bakes the per-slot map into the initial state — so the whole game stays replay-deterministic with no mid-game database read. Bots own no cards, and the map is omitted entirely when nobody at the table owns one.
Phase 2 shipped code-only — the boosts live in the JSON engine_state. A follow-up migration 0032 then tiered the 28 seed cards by field group and added a weighted picker (70 / 20 / 8 / 2 across common / rare / epic / legendary) so wins actually drop rarer cards over time instead of only commons.
