Introduce active diplomacy where rival leaders approach the player with
requests, demands, trades, and gifts rather than passively waiting.
New CivilizationDiplomacy.js module handles:
- 9 request kinds (joinWar, breakTreaty, borderUltimatum, demandGold,
demandTech, techTrade, ceasefire, peace, alliance) with initiative
tiers so urgent calls to arms aren't drowned out by filler offers
- Cooldowns per (leader, target, kind) plus a per-leader gap so a
leader can't spam different requests to bypass rate limits
- Frustration grudge (0-100) raised by refusals, decaying each turn
and dragging attitude toward hostility through the ordinary war path
- Escalation: frustrated leaders demand compensation, then renounce
treaties at breaking point, with ordinary hostility finishing the job
- Border ultimatum promises checked when pledges expire (double penalty
for broken word)
- Unprompted gold/tech gifts from leaders with high attitude
- Staleness validation so requests the world invalidated are dropped
- AI-to-AI requests resolve immediately through the same pipeline
UI changes:
- AI requests queued on state.pendingRequests, presented via audience
popup at the start of the human turn (one per turn, configurable)
- Diplomacy screen shows ACCEPT/REFUSE with consequence hints until
answered; unanswered requests lapse with half-weight penalties
- New event types: treatyRenounced, pledgeBroken/pledgeKept, aiGift
- Leader dialogue for demands, refusals, gifts, and renouncements
- Tetris Attack menu gets a title art backdrop
Data/infra:
- diplomacyRequests tuning in civilization-rules.json (thresholds,
cooldowns, attitude weights, per-request config)
- Frustration, requestCooldown, lastRequestTurn, pledges fields on
civ state — all backward-compatible with old saves
- Full verification suite covering eligibility, resolution, cooldowns,
frustration arc, serialization, and fuzz testing
- Implement per-character voice clip system (match, supermatch, win, lose) that
loads lazily per round and falls back gracefully when clips are missing
- Queue voices to play after arcade cues, with intelligent interruption handling
so only one line plays at a time
- Rename ensureRoundBackgrounds to ensureRoundAssets to handle both images and audio
- Reduce background music volume from 0.8 to 0.4
- Update character sprite sheet and document voice clip structure in sprites.md
Add new background images for Klaxon, Steve, and Victor characters
with 5 animation states each (r1-r5).
fix(civilization): resolve hotkey capture in city naming modal
Store hotkey list in this.hotkeyList to properly clear and restore
keyboard captures when opening/closing the city name input modal.
Previously, gameplay hotkeys prevented typing in the input field.
- Implement staggered tile pop animation: face overlay flashes on each tile,
then shatters into four quadrants that fly diagonally while shrinking/fading
- Play 8-bit card sound per tile, 8-bit action/win sounds for 4+/5+ tile clears
- Adjust character speed levels in tetrisattack.json (Jerry-1, Michael-2,
Steve-2, Victor-3, Klaxon-4)
- Replace cursor movement SFX with click sound
- Update advancewars-units and tetrisattack-panels sprite sheets and PSDs
- Add sfx-click and sfx-casino-win-8bit to preload and sound registry
- Replace hard-capped difficulty curves with exponential ramp function
that continues scaling deep into endless play without plateauing
- Reduce base speeds and shot counts for more deliberate gameplay
- Increase flipper, fuseball, and pulsar speeds for more pressure
- Flipper AI now chains hops toward the claw instead of resting,
making it a true pursuer rather than a shuffler
- Change zapper to refill +1 per level instead of full reset, making
charge management meaningful
- Death no longer resets the board: only enemies within threshold t
die with the player, others remain mid-climb
- Improve enemy shot hit detection with lane distance check instead
of exact lane match
- Add advanceShots() helper for cleaner shot advancement logic
- Update verification tests for new mechanics and difficulty curves
- Add michael background sprites and update tetrisattack characters
- Update superkart icons.png and icons.psd assets
- Add renamed background-jerry-r1.png (renamed from background-jerry.png)
- Add new background frames for beth (r2-r5) and jerry (r2-r5)
Restructure Tetris Attack Stage Clear from "clear all target panels" to a
multi-stage round system with a sliding boundary line.
Gameplay changes:
- Each character now has 5 stages instead of a single match
- A CLEAR line appears after a set number of rows rise, then rides the
stack upward; the objective is to clear everything above it
- Clearing a stage advances to the next: same board, faster speed, fresh line
- Stage progress is saved to localStorage; characters unlock sequentially
- Added a stage select screen with progress squares per character
Logic changes:
- Replaced `targetsTotal` with `clearLine` tracking and `countAboveLine`
- Added `advanceStage()` to resume play on the same stack one speed level higher
- Win condition now checks `countAboveLine() === 0` instead of target count
- Removed `target` flag from panels; panels below the line are irrelevant
- Continuous speed ramp via fractional `speed` per stage
UI changes:
- Clear line drawn as a pulsing bar with "◀ CLEAR" label outside the board
- "CLEAR LINE!" announcement on appearance, "STAGE N CLEAR!" banner on win
- HUD shows stage number instead of panel count
- Game over offers "Retry Stage", "Stage Select", or "Menu"
Asset changes:
- Backgrounds renamed to `background-{hero}-r{stage}.png` (5 per character)
- Lazy-load backgrounds per round instead of preloading all 30 images
- Updated tetrisattack.json with `stagesPerRound`, `stageSpeedStep`, and
per-character `clearLineRows`
Tests:
- Rewrote stage clear soak tests for the new mechanic
- Added stage round progression, speed ramp, and board preservation tests
Advance Wars:
- Add HP override system (seed/set/clearHpOverride) so units show correct
HP during enemy-turn replay until their battle animation plays
- Redesign river/road channel rendering with layered depth: rivers get
deep channel, light core, and ripple crests; roads get concrete shoulders,
asphalt, and dashed centre lines phase-locked to tile seams
Tetris Attack:
- Add character sprite sheet and per-host background images (beth, jerry,
michael, steve, victor, klaxon)
- Declare hero background assets in manifest; scene falls back gracefully
when art is missing
- Update characterSheet path in tetrisattack-artwork.json