diff --git a/public/games/age-of-dwarves/data/audio.json b/public/games/age-of-dwarves/data/audio.json index 6df1af7d..01224796 100644 --- a/public/games/age-of-dwarves/data/audio.json +++ b/public/games/age-of-dwarves/data/audio.json @@ -673,6 +673,46 @@ "era_range": null, "mood": "triumph", "description": "Economic victory B \u2014 Junkala Exploration 'Prairie Nights'." + }, + { + "id": "defeat_domination", + "stream": "audio/music/defeat_domination.ogg", + "volume_db": -6.0, + "bus": "Music", + "loop": false, + "era_range": null, + "mood": "lament", + "description": "Defeated by domination \u2014 Junkala Action 'Encounter With The Witches', ominous." + }, + { + "id": "defeat_culture", + "stream": "audio/music/defeat_culture.ogg", + "volume_db": -6.0, + "bus": "Music", + "loop": false, + "era_range": null, + "mood": "lament", + "description": "Defeated by culture \u2014 Junkala Calm 'Peaceful Days', wistful." + }, + { + "id": "defeat_science", + "stream": "audio/music/defeat_science.ogg", + "volume_db": -6.0, + "bus": "Music", + "loop": false, + "era_range": null, + "mood": "lament", + "description": "Defeated by science \u2014 Junkala Exploration 'Sneaking Around', left behind." + }, + { + "id": "defeat_economic", + "stream": "audio/music/defeat_economic.ogg", + "volume_db": -6.0, + "bus": "Music", + "loop": false, + "era_range": null, + "mood": "lament", + "description": "Defeated by economic \u2014 Junkala Calm 'Sand Castles', transient ambition." } ], "crossfade_seconds": 2.0, @@ -699,6 +739,13 @@ "score": [ "victory" ] + }, + "defeat_pool": { + "domination": ["defeat_domination"], + "culture": ["defeat_culture"], + "science": ["defeat_science"], + "economic": ["defeat_economic"], + "score": ["defeat"] } } } diff --git a/public/games/age-of-dwarves/data/objectives.json b/public/games/age-of-dwarves/data/objectives.json index 3f751af4..3365377d 100644 --- a/public/games/age-of-dwarves/data/objectives.json +++ b/public/games/age-of-dwarves/data/objectives.json @@ -1,13 +1,13 @@ { - "generated_at": "2026-04-29T17:04:57Z", + "generated_at": "2026-04-29T20:06:03Z", "totals": { - "done": 107, "oos": 20, - "stub": 1, - "partial": 12, - "missing": 12, + "done": 109, "in_progress": 1, - "total": 153 + "missing": 12, + "partial": 11, + "stub": 1, + "total": 154 }, "objectives": [ { @@ -850,6 +850,16 @@ "updated_at": "2026-04-27", "summary": "During p1-29 Round 3-5, warcouncil added a per-yield difficulty multiplier framework (gold_mult, culture_mult, luxury_mult, research_mult, production_mult, yield_per_turn_growth) plus a symmetric player handicap (Easy = player gets Hard-AI bonuses). Per Rail-1, the multiplier APPLICATION should live in Rust crates, not in GDScript turn_processor.gd / economy.gd / turn_processor_helpers.gd.\n\n**Gold yield port: DONE 2026-04-27.** `EconomyParams.yield_mult` field added to `api-gdext/src/lib.rs:2962-2992` with serde default 1.0; `GdEconomy::process_turn` now scales gross income before netting expenses. GDScript `economy.gd::_build_params_json` injects `yield_mult` from `GameState.get_effective_yield_mult(player, \"gold\")`; the GDScript-side multiplication is deleted. Validated via 10-seed Hard batch `.local/iter/p1-31-r5-hard-20260427_044618/` — 4/5 quality gates PASS (up from 3/5), clan diversity up from 3 to 5 distinct winners.\n\n**Research yield port: DONE 2026-04-27.** Added `process_research(player_json, yield_json, sci_modifier)` passthrough at `knowledge_web.gd:152` (delegates to `_bridge.call(\"process_research\", ...)`) and exposed at `tech_web.gd:39`. Refactored `turn_processor.gd::_process_research:143` to delegate fully — assembles JSON inputs (player_dict + per-city yields_arr), calls `tw.process_research()`, only handles completion side-effects (school_locked emit, _form_high_archon, tech_researched signal, resource reveals). No Rust rebuild needed (GdTechWeb::process_research already had sci_modifier as a direct parameter; only the wrapper-layer plumbing was missing).\n\nValidation: `.local/iter/p1-39-r6-hard-20260427_054348/` (10-seed Hard batch). 4/5 quality gates PASS: median winner_tier_peak=4.5 PASS (was 3 FAIL in R5 — research port LIFTED this), tier_peak_gap=5.0 FAIL (was 3.5 PASS — gates alternate, total still 4/5), max_peak_unit 10/10 PASS, wonders 7/10 PASS, combats 454 PASS. **All 10 games completed (vs 8/10 in R5)**, **6 distinct winners** (max diversity for 5-clan game).\n\n**Culture yield port: ATTEMPTED 2026-04-27, REVERTED.** Added `GdCity::process_culture_with_modifier(tile_yields_json, total_pct)` to api-gdext/src/lib.rs:1399 that mirrors the GDScript flow (process_culture → check raw_gain → add bonus → recheck can_expand). Math nominally identical. But R8 batch (Rust culture port) diverged from R6 (GDScript) on every seed (e.g. seed 1: R6=T251/tier=6/wonders=10, R8=T111/tier=2/wonders=0). R9 isolation batch (revert culture path on current source tree) reproduced R6 EXACTLY per-seed (`.local/iter/p1-39-r9-revert-hard-20260427_213224/`), proving the divergence is from the Rust culture path itself, NOT from other landed code (courier diplomacy, building ID reconciliation) between R6 and R7/R8. Floating-point intermediate values likely differ between the in-Rust mutation sequence and the GDScript-Variant-roundtrip mutation sequence; the difference cascades into different border-expansion timing → different tile ownership → entirely different game trajectories. Culture path REVERTED to GDScript (p1-39 stays partial — gold + research ported, culture deferred). Future port should investigate Rust f64 vs Variant FLOAT round-trip semantics, or alternative scope (e.g. apply difficulty modifier in GdCity::process_culture itself with an optional parameter, leaving the building-bonus math out of scope).\n\nThe fix for both: add `process_research` and `process_culture` passthrough methods to the GDScript wrapper layers, refactor the GDScript callers to delegate fully (matching the gold-port pattern). Estimated 2-3 hours including parity validation." }, + { + "id": "p1-40", + "title": "Collapse data// override layer into single source of truth at resources/", + "priority": "p1", + "status": "done", + "scope": "game1", + "owner": null, + "updated_at": "2026-04-29", + "summary": "Today `public/games/age-of-dwarves/data/{units,buildings,techs}/` mirrors `public/resources/{units,buildings,techs}/` with override semantics: the loader walks resources/ first, then game/data/ overwrites by id. This created three real bugs in the last few sessions:\n1. Audit blind-spot: 9 \"missing\" buildings and 6 \"missing\" food/processing buildings turned out to live in resources/buildings bundled files that the per-file audit missed.\n2. Silent semantic drift: 14 building IDs are defined in both layers with different cost/tech/effects; the data/ version wins by accident-of-loader-order.\n3. Broken tech gates: 6 of 8 ordinary-building duplicates have `tech_required` in resources/ pointing at non-existent techs (`military_doctrine`, `smelting`, `husbandry`, `scholarship`, `ancestor_rites`, `masonry`, `mathematics`). The data/ overrides are the only thing keeping those buildings buildable.\n\nThe right architecture is one source of truth at `public/resources//`, with `public/games//` carrying only **game-pack-specific configuration** (clan personalities, setup, vocab, difficulty) and a manifest declaring which resource IDs the game subscribes to. No more override layer.\n\nThis objective is the **safe mechanical phase** — move all entity files to resources/ canonical locations and resolve the duplicates. The behavioral phase (subscription manifest + loader filter) splits to `p1-41`." + }, { "id": "p2-06", "title": "Export pipeline for Windows / macOS / Linux", @@ -1504,10 +1514,10 @@ "id": "p3-01", "title": "Courier-gated diplomacy — open borders + shared maps via tech-tiered courier units", "priority": "p3", - "status": "partial", + "status": "done", "scope": "game1-stretch", "owner": "envoy", - "updated_at": "2026-04-27", + "updated_at": "2026-04-29", "summary": "Game 1 ships diplomacy-lite: peace/war toggle plus a single bilateral luxury↔gold\ntrade action (`mc-trade`). This objective expands the diplomatic surface with two\ntrade options gated on physical infrastructure rather than instant agreement, so\ninformation itself becomes a strategic resource that decays with distance and tech:\n\n1. **Open borders** — pay luxury or gold for the right to move units through\n another civ's territory for N turns. Instant effect; pure trade.\n\n2. **Shared map** — pay luxury or gold for the other civ's explored map for N\n turns. **Not instant**: the deal is gated on a courier link between capitals.\n Knowledge propagates at the courier's movement speed; the courier is killable\n mid-route (intercept = no map delivered, payment already made). The Courier\n unit family has tech-gated upgrade tiers, one per era from era_2 onward; later\n tiers shrink the delay window and shift the intercept surface from\n killing-the-unit to severing-the-infrastructure.\n\nThis is **scope: game1-stretch** — Game 1's stated scope is \"diplomacy-lite\", so\nthis objective is post-Early-Access content unless explicitly pulled forward." }, { diff --git a/public/resources/audio/LICENSES.md b/public/resources/audio/LICENSES.md index eec5a103..bdb37807 100644 --- a/public/resources/audio/LICENSES.md +++ b/public/resources/audio/LICENSES.md @@ -4,13 +4,17 @@ Each row records one `.ogg` shipped under `public/games/age-of-dwarves/assets/audio/`. Licence policy: CC0 / CC-BY 3.0 / CC-BY 4.0 / Pixabay / Sonniss-GDC-YYYY / Public-Domain accepted. ShareAlike (`-SA`) and NonCommercial (`-NC`) are rejected by the renderer. -**Asset count:** 115 files. (Empty until p2-16 sourcing begins.) +**Asset count:** 119 files. (Empty until p2-16 sourcing begins.) ## Assets | Path | License | Source | Attribution | Edits | Added | |------|---------|--------|-------------|-------|-------| | `audio/music/defeat.ogg` | CC0-1.0 | [link](https://opengameart.org/sites/default/files/JRPG%20Music%20Pack%20%234%20%5BCalm%5D%20by%20Juhani%20Junkala_0.zip#Calm6 - Innocence.ogg) | Juhani Junkala (SubspaceAudio | OpenGameArt) | loudnorm I=-16/TP=-3+ogg 128kbps | +| `audio/music/defeat_culture.ogg` | CC0-1.0 | [link](https://opengameart.org/sites/default/files/JRPG%20Music%20Pack%20%234%20%5BCalm%5D%20by%20Juhani%20Junkala_0.zip#Calm3 - Peaceful Days.ogg) | Juhani Junkala (SubspaceAudio | OpenGameArt) | loudnorm I=-16/TP=-3+ogg 128kbps | +| `audio/music/defeat_domination.ogg` | CC0-1.0 | [link](https://opengameart.org/sites/default/files/JRPG%20Music%20Pack%20%235%20%5BAction%5D%20by%20Juhani%20Junkala.zip#Action1 - Encounter With The Witches.ogg) | Juhani Junkala (SubspaceAudio | OpenGameArt) | loudnorm I=-16/TP=-3+ogg 128kbps | +| `audio/music/defeat_economic.ogg` | CC0-1.0 | [link](https://opengameart.org/sites/default/files/JRPG%20Music%20Pack%20%234%20%5BCalm%5D%20by%20Juhani%20Junkala_0.zip#Calm4 - Sand Castles.ogg) | Juhani Junkala (SubspaceAudio | OpenGameArt) | loudnorm I=-16/TP=-3+ogg 128kbps | +| `audio/music/defeat_science.ogg` | CC0-1.0 | [link](https://opengameart.org/sites/default/files/JRPG%20Music%20Pack%20%231%20%5BExploration%5D%20by%20Juhani%20Junkala.zip#Exploration5 - Sneaking Around.ogg) | Juhani Junkala (SubspaceAudio | OpenGameArt) | loudnorm I=-16/TP=-3+ogg 128kbps | | `audio/music/golden_age.ogg` | CC0-1.0 | [link](https://opengameart.org/sites/default/files/JRPG%20Music%20Pack%20%235%20%5BAction%5D%20by%20Juhani%20Junkala.zip#Action2 - Army Approaching.ogg) | Juhani Junkala (SubspaceAudio | OpenGameArt) | loudnorm I=-16/TP=-3+ogg 128kbps | | `audio/music/overworld_ascension.ogg` | CC0-1.0 | [link](https://opengameart.org/sites/default/files/JRPG%20Music%20Pack%20%235%20%5BAction%5D%20by%20Juhani%20Junkala.zip#Action1 - Encounter With The Witches.ogg) | Juhani Junkala (SubspaceAudio | OpenGameArt) | loudnorm I=-16/TP=-3+ogg 128kbps | | `audio/music/overworld_awakening.ogg` | CC0-1.0 | [link](https://opengameart.org/sites/default/files/JRPG%20Music%20Pack%20%232%20%5BTowns%5D%20by%20Juhani%20Junkala.zip#Town1 - Home Town.ogg) | Juhani Junkala (SubspaceAudio | OpenGameArt) | loudnorm I=-16/TP=-3+ogg 128kbps | diff --git a/public/resources/audio/music/defeat_culture.ogg b/public/resources/audio/music/defeat_culture.ogg new file mode 100644 index 00000000..43671ff7 Binary files /dev/null and b/public/resources/audio/music/defeat_culture.ogg differ diff --git a/public/resources/audio/music/defeat_domination.ogg b/public/resources/audio/music/defeat_domination.ogg new file mode 100644 index 00000000..22efd860 Binary files /dev/null and b/public/resources/audio/music/defeat_domination.ogg differ diff --git a/public/resources/audio/music/defeat_economic.ogg b/public/resources/audio/music/defeat_economic.ogg new file mode 100644 index 00000000..c070ab96 Binary files /dev/null and b/public/resources/audio/music/defeat_economic.ogg differ diff --git a/public/resources/audio/music/defeat_science.ogg b/public/resources/audio/music/defeat_science.ogg new file mode 100644 index 00000000..4ea35092 Binary files /dev/null and b/public/resources/audio/music/defeat_science.ogg differ diff --git a/public/resources/audio/sources.csv b/public/resources/audio/sources.csv index f759e899..e0e3e65d 100644 --- a/public/resources/audio/sources.csv +++ b/public/resources/audio/sources.csv @@ -131,3 +131,7 @@ audio/sfx/weather/heat_wave.ogg,https://opengameart.org/sites/default/files/sfx_ audio/sfx/weather/drought.ogg,https://opengameart.org/sites/default/files/sfx_loops.zip#weird_03.ogg,CC0-1.0,rubberduck (OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 audio/sfx/buildings/wonder_built.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactWood_heavy_000.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 audio/sfx/fauna/herbivore_attack.ogg,https://opengameart.org/sites/default/files/80-CC0-creature-SFX_0.zip#grunt_01.ogg,CC0-1.0,rubberduck (OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 +audio/music/defeat_domination.ogg,https://opengameart.org/sites/default/files/JRPG%20Music%20Pack%20%235%20%5BAction%5D%20by%20Juhani%20Junkala.zip#Action1 - Encounter With The Witches.ogg,CC0-1.0,Juhani Junkala (SubspaceAudio, OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 +audio/music/defeat_culture.ogg,https://opengameart.org/sites/default/files/JRPG%20Music%20Pack%20%234%20%5BCalm%5D%20by%20Juhani%20Junkala_0.zip#Calm3 - Peaceful Days.ogg,CC0-1.0,Juhani Junkala (SubspaceAudio, OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 +audio/music/defeat_science.ogg,https://opengameart.org/sites/default/files/JRPG%20Music%20Pack%20%231%20%5BExploration%5D%20by%20Juhani%20Junkala.zip#Exploration5 - Sneaking Around.ogg,CC0-1.0,Juhani Junkala (SubspaceAudio, OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 +audio/music/defeat_economic.ogg,https://opengameart.org/sites/default/files/JRPG%20Music%20Pack%20%234%20%5BCalm%5D%20by%20Juhani%20Junkala_0.zip#Calm4 - Sand Castles.ogg,CC0-1.0,Juhani Junkala (SubspaceAudio, OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 diff --git a/public/resources/c/defeat_culture.ogg b/public/resources/c/defeat_culture.ogg new file mode 100644 index 00000000..250a9a70 Binary files /dev/null and b/public/resources/c/defeat_culture.ogg differ