⚖️ Carry weight & encumbrance (new)
Every character has a carry capacity derived from their Strength. The Inventory tab shows a live Load / Capacity readout (e.g. "68 / 560 lbs") that turns red when you're over-encumbered.
Every item now has a real weight. New items get a sensible weight by type when they're created (a ring is light, a greataxe or plate armor is heavy), the storyteller is asked to author weights, and your existing items are filled in with sensible weights automatically the first time you load.
The storyteller sees your load and narrates an over-encumbered character as slowed. Base capacity, per-Strength scaling, and the weight unit are all configurable.
🧠 The AI sees your world more completely
Your own faction: the storyteller now sees your organization's full profile — Tier, power, economy, agendas, long-term goals, and current direction — not just its diplomacy. (This is why it used to lose track of your own faction's Tier.)
Abilities: it now sees what a skill actually does — range, area, damage, effect, cooldown, save DC — instead of just its name and cost.
Bestiary: the encounter table now lists each creature's special moves, not only its stats.
An NPC's vengeance and family drives are now visible, so grudges and loyalties actually play out.
🪖 Recruitment, reworked
Recruitment now uses a configurable base price scaled by disposition and your relationship — far cheaper for friends, far pricier for the wary.
Family and close allies in good standing can join for free; a target must be at least neutral to be recruited; the openly hostile won't come at any price.
Fixed the recruit button's broken white pop-up (now a proper themed dialog) and units that recruited for 0 cost or wrongly demanded workforce.
⚔️ Combat
XP for everyone who wins: every survivor on the winning side earns experience when the last enemy falls — not just you. Configurable as a flat amount per enemy level, a percentage of the bar, or both.
Clearer combat log: each hit names attacker → target, the damage dealt, and the HP left.
A garbled AI combat turn is now recovered instead of forcing a full re-roll.
🎲 Dice & skill checks (new)
Uncertain non-combat actions — persuading, sneaking, climbing, picking a lock, recalling lore, haggling — are now resolved by real engine dice, not the AI's imagination. The storyteller declares what is attempted and how hard; the engine rolls a real d20 against the character's actual stat and decides the result.
You see every roll — in the tech log and inline in the story, e.g. 🎲 Persuade the guard — Adam: d20(14) + 2 = 16 vs DC 15 → SUCCESS.
Rich outcomes: natural 20 = critical success, natural 1 = fumble, plus strong/narrow degrees; contested rolls (your deception vs their insight) and advantage/disadvantage are supported. The storyteller must narrate to the real verdict — and if its prose ever gets ahead of the dice, the engine re-writes that beat to match the real result (the same safeguard combat uses). All the dials (crit range, difficulty bands, modifier vs raw stats) are configurable.
🐛 Fixes
Fresh AI narration now renders bold, italics, and quotes correctly on the first paint — previously ** showed as literal asterisks until you edited the message.
The story no longer occasionally prints raw JSON instead of prose.
The campaign generator's Redo no longer produces duplicate-numbered names like "Aeloria 2" — it was reusing a stale cached world roster, and now rebuilds cleanly each time.
New Start Over button in the campaign generator header — wipes all generated draft and drops you back to Phase 1.
A spawned creature now adopts its Bestiary card's artwork.
Editing the Global JSON rules no longer reverts after you save.
Big region maps zoom in much further, with on-screen zoom and fit-to-screen buttons.