diff --git a/public/games/age-of-dwarves/assets/audio/sfx/fauna/herbivore_attack.ogg b/public/games/age-of-dwarves/assets/audio/sfx/fauna/herbivore_attack.ogg deleted file mode 100644 index 580077db..00000000 Binary files a/public/games/age-of-dwarves/assets/audio/sfx/fauna/herbivore_attack.ogg and /dev/null differ diff --git a/public/games/age-of-dwarves/assets/audio/sfx/wonder_built.ogg b/public/games/age-of-dwarves/assets/audio/sfx/wonder_built.ogg deleted file mode 100644 index 556b7953..00000000 Binary files a/public/games/age-of-dwarves/assets/audio/sfx/wonder_built.ogg and /dev/null differ diff --git a/public/games/age-of-dwarves/data/audio.json b/public/games/age-of-dwarves/data/audio.json index 7cd2ad88..6df1af7d 100644 --- a/public/games/age-of-dwarves/data/audio.json +++ b/public/games/age-of-dwarves/data/audio.json @@ -2,91 +2,91 @@ "schema_version": 2, "sfx": { "turn_started": { - "stream": "audio/sfx/turn_started.ogg", + "stream": "audio/sfx/ui/turn_started.ogg", "volume_db": -6.0, "bus": "SFX", - "description": "UI window-maximize tone — turn-start cue." + "description": "UI window-maximize tone \u2014 turn-start cue." }, "turn_ended": { - "stream": "audio/sfx/turn_ended.ogg", + "stream": "audio/sfx/ui/turn_ended.ogg", "volume_db": -8.0, "bus": "SFX", - "description": "UI window-minimize tone — end-turn commit." + "description": "UI window-minimize tone \u2014 end-turn commit." }, "city_founded": { - "stream": "audio/sfx/city_founded.ogg", + "stream": "audio/sfx/city/city_founded.ogg", "volume_db": -4.0, "bus": "SFX", "description": "Stone-on-stone founding chime, bell tail." }, "tech_researched": { - "stream": "audio/sfx/tech_researched.ogg", + "stream": "audio/sfx/ui/tech_researched.ogg", "volume_db": -5.0, "bus": "SFX", "description": "Bright scholarly chime when a tech completes." }, "unit_killed": { - "stream": "audio/sfx/unit_killed.ogg", + "stream": "audio/sfx/combat/unit_killed.ogg", "volume_db": -6.0, "bus": "SFX", "description": "Neutral combat death thud \u2014 plays when neither side is the local human (AI vs AI, AI vs wild)." }, "unit_defeated": { - "stream": "audio/sfx/unit_defeated.ogg", + "stream": "audio/sfx/combat/unit_defeated.ogg", "volume_db": -4.0, "bus": "SFX", "description": "Somber wood thud \u2014 local human's unit died. Layered on top of the species death sound." }, "unit_victorious": { - "stream": "audio/sfx/unit_victorious.ogg", + "stream": "audio/sfx/combat/unit_victorious.ogg", "volume_db": -4.0, "bus": "SFX", "description": "Bright metallic ting \u2014 local human scored a kill. Layered on top of the species death sound." }, "wonder_built": { - "stream": "audio/sfx/wonder_built.ogg", + "stream": "audio/sfx/buildings/wonder_built.ogg", "volume_db": -3.0, "bus": "SFX", - "description": "Generic wonder-built cue \u2014 used when neither own/rival variant exists in the manifest." + "description": "Deep wood toll \u2014 generic wonder-built cue (fallback when neither own/rival variant exists)." }, "wonder_built.own": { - "stream": "audio/sfx/wonder_built_own.ogg", + "stream": "audio/sfx/buildings/wonder_built_own.ogg", "volume_db": -2.0, "bus": "SFX", "description": "Triumphant brass fanfare when YOUR wonder completes (~5s, full ensemble)." }, "wonder_built.rival": { - "stream": "audio/sfx/wonder_built_rival.ogg", + "stream": "audio/sfx/buildings/wonder_built_rival.ogg", "volume_db": -8.0, "bus": "SFX", "description": "Distant ominous bell when a rival wonder completes (short, restrained, somewhere else in the world)." }, "era_advanced": { - "stream": "audio/sfx/era_advanced.ogg", + "stream": "audio/sfx/era/era_advanced.ogg", "volume_db": -3.0, "bus": "SFX", "description": "Deep bell toll on era change." }, "combat_hit": { - "stream": "audio/sfx/combat_hit.ogg", + "stream": "audio/sfx/combat/combat_hit.ogg", "volume_db": -8.0, "bus": "SFX", "description": "Generic combat impact \u2014 endpoint of the categorical ladder for unit hit events." }, "unit_moved": { - "stream": "audio/sfx/unit_moved.ogg", + "stream": "audio/sfx/ui/unit_moved.ogg", "volume_db": -18.0, "bus": "SFX", "description": "Soft footstep tick on unit movement (throttled)." }, "defeat_stinger": { - "stream": "audio/sfx/defeat_stinger.ogg", + "stream": "audio/sfx/era/defeat_stinger.ogg", "volume_db": -3.0, "bus": "SFX", "description": "Somber descending stinger on defeat / player_eliminated." }, "victory_fanfare": { - "stream": "audio/sfx/victory_fanfare.ogg", + "stream": "audio/sfx/era/victory_fanfare.ogg", "volume_db": -2.0, "bus": "SFX", "description": "Full brass fanfare on victory_achieved." @@ -98,7 +98,7 @@ "description": "Heavy bell toll before first blow lands." }, "unit_promoted": { - "stream": "audio/sfx/unit_promoted.ogg", + "stream": "audio/sfx/ui/unit_promoted.ogg", "volume_db": -5.0, "bus": "SFX", "description": "Bright UI confirmation chime on unit promotion." @@ -113,28 +113,28 @@ "stream": "audio/sfx/city/city_starved.ogg", "volume_db": -8.0, "bus": "SFX", - "description": "UI error tone — starvation warning." + "description": "UI error tone \u2014 starvation warning." }, "golden_age_swell": { - "stream": "audio/sfx/golden_age_swell.ogg", + "stream": "audio/sfx/era/golden_age_swell.ogg", "volume_db": -3.0, "bus": "SFX", "description": "Slow brass crescendo on golden-age start." }, "border_expanded": { - "stream": "audio/sfx/border_expanded.ogg", + "stream": "audio/sfx/ui/border_expanded.ogg", "volume_db": -10.0, "bus": "SFX", "description": "Soft brass on border-tile claim." }, "research_start": { - "stream": "audio/sfx/research_start.ogg", + "stream": "audio/sfx/ui/research_start.ogg", "volume_db": -12.0, "bus": "SFX", "description": "Soft tap on research-start; deliberately quiet." }, "culture_researched": { - "stream": "audio/sfx/culture_researched.ogg", + "stream": "audio/sfx/ui/culture_researched.ogg", "volume_db": -5.0, "bus": "SFX", "description": "Bright UI confirmation chime on cultural-tradition completion." @@ -183,7 +183,7 @@ "volume_db": -6.0, "bus": "SFX", "pitch_jitter": 0.05, - "description": "Quick light release — bow approximation (no real bowstring sample available in our CC0 packs)." + "description": "Quick light release \u2014 bow approximation (no real bowstring sample available in our CC0 packs)." }, "unit.ranged.hit": { "streams": [ @@ -308,19 +308,19 @@ "stream": "audio/sfx/weather/blizzard.ogg", "volume_db": -8.0, "bus": "SFX", - "description": "Ethereal high-frequency loop — icy wind cue." + "description": "Ethereal high-frequency loop \u2014 icy wind cue." }, "weather.heat_wave": { "stream": "audio/sfx/weather/heat_wave.ogg", "volume_db": -10.0, "bus": "SFX", - "description": "Shimmering mid-frequency drone — heat-wave cue." + "description": "Shimmering mid-frequency drone \u2014 heat-wave cue." }, "weather.drought": { "stream": "audio/sfx/weather/drought.ogg", "volume_db": -12.0, "bus": "SFX", - "description": "Dry low-frequency drone — drought cue." + "description": "Dry low-frequency drone \u2014 drought cue." }, "weather.tornado": { "stream": "audio/sfx/weather/tornado.ogg", @@ -333,148 +333,148 @@ "bus": "SFX" }, "unit.melee.spawn": { - "stream": "audio/sfx/units/melee_spawn.ogg", + "stream": "audio/sfx/units/melee/spawn.ogg", "volume_db": -8.0, "bus": "SFX", - "description": "Muffled wood thump — a melee unit musters into play." + "description": "Muffled wood thump \u2014 a melee unit musters into play." }, "unit.ranged.spawn": { - "stream": "audio/sfx/units/ranged_spawn.ogg", + "stream": "audio/sfx/units/ranged/spawn.ogg", "volume_db": -8.0, "bus": "SFX", - "description": "Quick wood tap — a ranged unit takes position." + "description": "Quick wood tap \u2014 a ranged unit takes position." }, "unit.siege.hit": { - "stream": "audio/sfx/units/siege_hit.ogg", + "stream": "audio/sfx/units/siege/hit.ogg", "volume_db": -5.0, "bus": "SFX", - "description": "Strained plank creak — siege engine takes damage." + "description": "Strained plank creak \u2014 siege engine takes damage." }, "unit.siege.death": { - "stream": "audio/sfx/units/siege_death.ogg", + "stream": "audio/sfx/units/siege/death.ogg", "volume_db": -4.0, "bus": "SFX", - "description": "Heavy plate collapse — siege engine destroyed." + "description": "Heavy plate collapse \u2014 siege engine destroyed." }, "unit.support.attack": { - "stream": "audio/sfx/units/support_attack.ogg", + "stream": "audio/sfx/units/support/attack.ogg", "volume_db": -7.0, "bus": "SFX", - "description": "Soft string pluck — support unit's contributory action." + "description": "Soft string pluck \u2014 support unit's contributory action." }, "unit.support.hit": { - "stream": "audio/sfx/units/support_hit.ogg", + "stream": "audio/sfx/units/support/hit.ogg", "volume_db": -6.0, "bus": "SFX", - "description": "Soft body impact — support unit takes damage." + "description": "Soft body impact \u2014 support unit takes damage." }, "unit.support.death": { - "stream": "audio/sfx/units/support_death.ogg", + "stream": "audio/sfx/units/support/death.ogg", "volume_db": -5.0, "bus": "SFX", - "description": "Soft heavy fall — support unit killed." + "description": "Soft heavy fall \u2014 support unit killed." }, "fauna.apex_predator.hit": { "stream": "audio/sfx/fauna/apex_hit.ogg", "volume_db": -5.0, "bus": "SFX", - "description": "Pained snarl — apex predator takes damage." + "description": "Pained snarl \u2014 apex predator takes damage." }, "fauna.herbivore.attack": { "stream": "audio/sfx/fauna/herbivore_attack.ogg", "volume_db": -6.0, "bus": "SFX", - "description": "Panicked headbutt grunt — cornered herbivore charges." + "description": "Pained grunt \u2014 cornered herbivore charges." }, "fauna.herbivore.hit": { "stream": "audio/sfx/fauna/herbivore_hit.ogg", "volume_db": -6.0, "bus": "SFX", - "description": "Bleat of pain — herbivore wounded." + "description": "Bleat of pain \u2014 herbivore wounded." }, "fauna.omnivore.spawn": { "stream": "audio/sfx/fauna/omnivore_spawn.ogg", "volume_db": -8.0, "bus": "SFX", - "description": "Inquisitive chitter — omnivore enters the map." + "description": "Inquisitive chitter \u2014 omnivore enters the map." }, "fauna.omnivore.attack": { "stream": "audio/sfx/fauna/omnivore_attack.ogg", "volume_db": -6.0, "bus": "SFX", - "description": "Aggressive bark — omnivore lunges." + "description": "Aggressive bark \u2014 omnivore lunges." }, "fauna.omnivore.hit": { "stream": "audio/sfx/fauna/omnivore_hit.ogg", "volume_db": -6.0, "bus": "SFX", - "description": "Yelp — omnivore takes damage." + "description": "Yelp \u2014 omnivore takes damage." }, "fauna.omnivore.death": { "stream": "audio/sfx/fauna/omnivore_death.ogg", "volume_db": -5.0, "bus": "SFX", - "description": "Final roar trailing off — omnivore killed." + "description": "Final roar trailing off \u2014 omnivore killed." }, "building.culture.complete": { "stream": "audio/sfx/buildings/culture_complete.ogg", "volume_db": -6.0, "bus": "SFX", - "description": "Resonant wood-stop — culture building completed." + "description": "Resonant wood-stop \u2014 culture building completed." }, "building.diplomacy.complete": { "stream": "audio/sfx/buildings/diplomacy_complete.ogg", "volume_db": -6.0, "bus": "SFX", - "description": "Brass-plate ring — diplomacy building completed." + "description": "Brass-plate ring \u2014 diplomacy building completed." }, "building.infrastructure.complete": { "stream": "audio/sfx/buildings/infrastructure_complete.ogg", "volume_db": -6.0, "bus": "SFX", - "description": "Stone settle — infrastructure building completed." + "description": "Stone settle \u2014 infrastructure building completed." }, "building.research.complete": { "stream": "audio/sfx/buildings/research_complete.ogg", "volume_db": -6.0, "bus": "SFX", - "description": "Light scholarly tap — research building completed." + "description": "Light scholarly tap \u2014 research building completed." }, "building.complete": { "stream": "audio/sfx/buildings/generic_complete.ogg", "volume_db": -6.0, "bus": "SFX", - "description": "Stone-on-plate impact — kind-only fallback for any building category." + "description": "Stone-on-plate impact \u2014 kind-only fallback for any building category." }, "complete": { "stream": "audio/sfx/generic/complete.ogg", "volume_db": -7.0, "bus": "SFX", - "description": "Plate impact — bare-kind fallback for any 'complete' event." + "description": "Plate impact \u2014 bare-kind fallback for any 'complete' event." }, "attack": { "stream": "audio/sfx/generic/attack.ogg", "volume_db": -7.0, "bus": "SFX", - "description": "Generic attack swing — last-resort fallback for unclassified entities." + "description": "Generic attack swing \u2014 last-resort fallback for unclassified entities." }, "hit": { "stream": "audio/sfx/generic/hit.ogg", "volume_db": -7.0, "bus": "SFX", - "description": "Generic impact — last-resort fallback for unclassified entities." + "description": "Generic impact \u2014 last-resort fallback for unclassified entities." }, "death": { "stream": "audio/sfx/generic/death.ogg", "volume_db": -6.0, "bus": "SFX", - "description": "Generic fall thud — last-resort fallback for unclassified entities." + "description": "Generic fall thud \u2014 last-resort fallback for unclassified entities." }, "spawn": { "stream": "audio/sfx/fauna/spawn.ogg", "volume_db": -9.0, "bus": "SFX", - "description": "Brush rustle — bare-kind fallback (aliases wild_spawn texture for unclassified spawn events)." + "description": "Brush rustle \u2014 bare-kind fallback (aliases wild_spawn texture for unclassified spawn events)." } }, "music": { @@ -701,4 +701,4 @@ ] } } -} \ No newline at end of file +} diff --git a/public/games/age-of-dwarves/assets/audio/LICENSES.md b/public/resources/audio/LICENSES.md similarity index 99% rename from public/games/age-of-dwarves/assets/audio/LICENSES.md rename to public/resources/audio/LICENSES.md index 37c25bd4..572e6add 100644 --- a/public/games/age-of-dwarves/assets/audio/LICENSES.md +++ b/public/resources/audio/LICENSES.md @@ -50,7 +50,7 @@ Each row records one `.ogg` shipped under `public/games/age-of-dwarves/assets/au | `audio/sfx/fauna/apex_death.ogg` | CC0-1.0 | [link](https://opengameart.org/sites/default/files/80-CC0-creature-SFX_0.zip#scream_02.ogg) | rubberduck (OpenGameArt) | loudnorm I=-16/TP=-3+ogg 128kbps | 2026-04-27 | | `audio/sfx/fauna/apex_hit.ogg` | CC0-1.0 | [link](https://opengameart.org/sites/default/files/80-CC0-creature-SFX_0.zip#hurt_05.ogg) | rubberduck (OpenGameArt) | loudnorm I=-16/TP=-3+ogg 128kbps | 2026-04-29 | | `audio/sfx/fauna/apex_roar.ogg` | CC0-1.0 | [link](https://opengameart.org/sites/default/files/80-CC0-creature-SFX_0.zip#roar_02.ogg) | rubberduck (OpenGameArt) | loudnorm I=-16/TP=-3+ogg 128kbps | 2026-04-27 | -| `audio/sfx/fauna/herbivore_attack.ogg` | CC0-1.0 | [link](https://opengameart.org/sites/default/files/80-CC0-creature-SFX_0.zip#monster_02.ogg) | rubberduck (OpenGameArt) | loudnorm I=-16/TP=-3+ogg 128kbps | 2026-04-29 | +| `audio/sfx/fauna/herbivore_attack.ogg` | CC0-1.0 | [link](https://opengameart.org/sites/default/files/80-CC0-creature-SFX_0.zip#grunt_01.ogg) | rubberduck (OpenGameArt) | loudnorm I=-16/TP=-3+ogg 128kbps | 2026-04-29 | | `audio/sfx/fauna/herbivore_call.ogg` | CC0-1.0 | [link](https://opengameart.org/sites/default/files/80-CC0-creature-SFX_0.zip#cute_05.ogg) | rubberduck (OpenGameArt) | loudnorm I=-16/TP=-3+ogg 128kbps | 2026-04-27 | | `audio/sfx/fauna/herbivore_death.ogg` | CC0-1.0 | [link](https://opengameart.org/sites/default/files/80-CC0-creature-SFX_0.zip#hurt_04.ogg) | rubberduck (OpenGameArt) | loudnorm I=-16/TP=-3+ogg 128kbps | 2026-04-27 | | `audio/sfx/fauna/herbivore_hit.ogg` | CC0-1.0 | [link](https://opengameart.org/sites/default/files/80-CC0-creature-SFX_0.zip#hurt_03.ogg) | rubberduck (OpenGameArt) | loudnorm I=-16/TP=-3+ogg 128kbps | 2026-04-29 | @@ -109,7 +109,7 @@ Each row records one `.ogg` shipped under `public/games/age-of-dwarves/assets/au | `audio/sfx/weather/hurricane.ogg` | CC0-1.0 | [link](https://opengameart.org/sites/default/files/sfx_loops.zip#ambient_02.ogg) | rubberduck (OpenGameArt) | loudnorm I=-16/TP=-3+ogg 128kbps | 2026-04-27 | | `audio/sfx/weather/storm.ogg` | CC0-1.0 | [link](https://opengameart.org/sites/default/files/sfx_100_v2.zip#sfx100v2_thunder_01.ogg) | rubberduck (OpenGameArt) | loudnorm I=-16/TP=-3+ogg 128kbps | 2026-04-28 | | `audio/sfx/weather/tornado.ogg` | CC0-1.0 | [link](https://opengameart.org/sites/default/files/sfx_loops.zip#ambient_03.ogg) | rubberduck (OpenGameArt) | loudnorm I=-16/TP=-3+ogg 128kbps | 2026-04-27 | -| `audio/sfx/wonder_built.ogg` | CC0-1.0 | [link](https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactBell_heavy_001.ogg) | Kenney (Impact Sounds) | loudnorm I=-16/TP=-3+ogg 128kbps | 2026-04-27 | +| `audio/sfx/wonder_built.ogg` | CC0-1.0 | [link](https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactWood_heavy_000.ogg) | Kenney (Impact Sounds) | loudnorm I=-16/TP=-3+ogg 128kbps | 2026-04-29 | | `audio/sfx/wonder_built_own.ogg` | CC0-1.0 | [link](https://opengameart.org/sites/default/files/fanfare_0.ogg) | Spring Spring (OpenGameArt) | loudnorm I=-16/TP=-3+ogg 128kbps | 2026-04-28 | | `audio/sfx/wonder_built_rival.ogg` | CC0-1.0 | [link](https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactBell_heavy_002.ogg) | Kenney (Impact Sounds) | loudnorm I=-22/TP=-6+ogg 128kbps (extra-quiet for distant feel) | 2026-04-28 | | `c/victory.ogg` | CC0-1.0 | [link](https://opengameart.org/sites/default/files/JRPG%20Music%20Pack%20%235%20%5BAction%5D%20by%20Juhani%20Junkala.zip#Action3 - Preparing For Battle.ogg) | Juhani Junkala (SubspaceAudio | OpenGameArt) | loudnorm I=-16/TP=-3+ogg 128kbps | diff --git a/public/games/age-of-dwarves/assets/audio/music/defeat.ogg b/public/resources/audio/music/defeat.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/music/defeat.ogg rename to public/resources/audio/music/defeat.ogg diff --git a/public/games/age-of-dwarves/assets/audio/music/golden_age.ogg b/public/resources/audio/music/golden_age.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/music/golden_age.ogg rename to public/resources/audio/music/golden_age.ogg diff --git a/public/games/age-of-dwarves/assets/audio/music/overworld_ascension.ogg b/public/resources/audio/music/overworld_ascension.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/music/overworld_ascension.ogg rename to public/resources/audio/music/overworld_ascension.ogg diff --git a/public/games/age-of-dwarves/assets/audio/music/overworld_awakening.ogg b/public/resources/audio/music/overworld_awakening.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/music/overworld_awakening.ogg rename to public/resources/audio/music/overworld_awakening.ogg diff --git a/public/games/age-of-dwarves/assets/audio/music/overworld_craft.ogg b/public/resources/audio/music/overworld_craft.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/music/overworld_craft.ogg rename to public/resources/audio/music/overworld_craft.ogg diff --git a/public/games/age-of-dwarves/assets/audio/music/overworld_industry.ogg b/public/resources/audio/music/overworld_industry.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/music/overworld_industry.ogg rename to public/resources/audio/music/overworld_industry.ogg diff --git a/public/games/age-of-dwarves/assets/audio/music/overworld_kingdoms.ogg b/public/resources/audio/music/overworld_kingdoms.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/music/overworld_kingdoms.ogg rename to public/resources/audio/music/overworld_kingdoms.ogg diff --git a/public/games/age-of-dwarves/assets/audio/music/victory.ogg b/public/resources/audio/music/victory.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/music/victory.ogg rename to public/resources/audio/music/victory.ogg diff --git a/public/games/age-of-dwarves/assets/audio/music/victory_culture_a.ogg b/public/resources/audio/music/victory_culture_a.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/music/victory_culture_a.ogg rename to public/resources/audio/music/victory_culture_a.ogg diff --git a/public/games/age-of-dwarves/assets/audio/music/victory_culture_b.ogg b/public/resources/audio/music/victory_culture_b.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/music/victory_culture_b.ogg rename to public/resources/audio/music/victory_culture_b.ogg diff --git a/public/games/age-of-dwarves/assets/audio/music/victory_culture_c.ogg b/public/resources/audio/music/victory_culture_c.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/music/victory_culture_c.ogg rename to public/resources/audio/music/victory_culture_c.ogg diff --git a/public/games/age-of-dwarves/assets/audio/music/victory_domination_a.ogg b/public/resources/audio/music/victory_domination_a.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/music/victory_domination_a.ogg rename to public/resources/audio/music/victory_domination_a.ogg diff --git a/public/games/age-of-dwarves/assets/audio/music/victory_domination_b.ogg b/public/resources/audio/music/victory_domination_b.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/music/victory_domination_b.ogg rename to public/resources/audio/music/victory_domination_b.ogg diff --git a/public/games/age-of-dwarves/assets/audio/music/victory_domination_c.ogg b/public/resources/audio/music/victory_domination_c.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/music/victory_domination_c.ogg rename to public/resources/audio/music/victory_domination_c.ogg diff --git a/public/games/age-of-dwarves/assets/audio/music/victory_economic_a.ogg b/public/resources/audio/music/victory_economic_a.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/music/victory_economic_a.ogg rename to public/resources/audio/music/victory_economic_a.ogg diff --git a/public/games/age-of-dwarves/assets/audio/music/victory_economic_b.ogg b/public/resources/audio/music/victory_economic_b.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/music/victory_economic_b.ogg rename to public/resources/audio/music/victory_economic_b.ogg diff --git a/public/games/age-of-dwarves/assets/audio/music/victory_science_a.ogg b/public/resources/audio/music/victory_science_a.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/music/victory_science_a.ogg rename to public/resources/audio/music/victory_science_a.ogg diff --git a/public/games/age-of-dwarves/assets/audio/music/victory_science_b.ogg b/public/resources/audio/music/victory_science_b.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/music/victory_science_b.ogg rename to public/resources/audio/music/victory_science_b.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/buildings/build_complete_civic.ogg b/public/resources/audio/sfx/buildings/build_complete_civic.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/buildings/build_complete_civic.ogg rename to public/resources/audio/sfx/buildings/build_complete_civic.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/buildings/build_complete_def.ogg b/public/resources/audio/sfx/buildings/build_complete_def.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/buildings/build_complete_def.ogg rename to public/resources/audio/sfx/buildings/build_complete_def.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/buildings/build_complete_mil.ogg b/public/resources/audio/sfx/buildings/build_complete_mil.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/buildings/build_complete_mil.ogg rename to public/resources/audio/sfx/buildings/build_complete_mil.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/buildings/build_complete_prod.ogg b/public/resources/audio/sfx/buildings/build_complete_prod.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/buildings/build_complete_prod.ogg rename to public/resources/audio/sfx/buildings/build_complete_prod.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/buildings/culture_complete.ogg b/public/resources/audio/sfx/buildings/culture_complete.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/buildings/culture_complete.ogg rename to public/resources/audio/sfx/buildings/culture_complete.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/buildings/diplomacy_complete.ogg b/public/resources/audio/sfx/buildings/diplomacy_complete.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/buildings/diplomacy_complete.ogg rename to public/resources/audio/sfx/buildings/diplomacy_complete.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/buildings/generic_complete.ogg b/public/resources/audio/sfx/buildings/generic_complete.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/buildings/generic_complete.ogg rename to public/resources/audio/sfx/buildings/generic_complete.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/buildings/infrastructure_complete.ogg b/public/resources/audio/sfx/buildings/infrastructure_complete.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/buildings/infrastructure_complete.ogg rename to public/resources/audio/sfx/buildings/infrastructure_complete.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/buildings/research_complete.ogg b/public/resources/audio/sfx/buildings/research_complete.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/buildings/research_complete.ogg rename to public/resources/audio/sfx/buildings/research_complete.ogg diff --git a/public/resources/audio/sfx/buildings/wonder_built.ogg b/public/resources/audio/sfx/buildings/wonder_built.ogg new file mode 100644 index 00000000..513aa065 Binary files /dev/null and b/public/resources/audio/sfx/buildings/wonder_built.ogg differ diff --git a/public/games/age-of-dwarves/assets/audio/sfx/wonder_built_own.ogg b/public/resources/audio/sfx/buildings/wonder_built_own.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/wonder_built_own.ogg rename to public/resources/audio/sfx/buildings/wonder_built_own.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/wonder_built_rival.ogg b/public/resources/audio/sfx/buildings/wonder_built_rival.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/wonder_built_rival.ogg rename to public/resources/audio/sfx/buildings/wonder_built_rival.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/city_founded.ogg b/public/resources/audio/sfx/city/city_founded.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/city_founded.ogg rename to public/resources/audio/sfx/city/city_founded.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/city/city_grew.ogg b/public/resources/audio/sfx/city/city_grew.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/city/city_grew.ogg rename to public/resources/audio/sfx/city/city_grew.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/city/city_starved.ogg b/public/resources/audio/sfx/city/city_starved.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/city/city_starved.ogg rename to public/resources/audio/sfx/city/city_starved.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/combat_hit.ogg b/public/resources/audio/sfx/combat/combat_hit.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/combat_hit.ogg rename to public/resources/audio/sfx/combat/combat_hit.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/combat/combat_started.ogg b/public/resources/audio/sfx/combat/combat_started.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/combat/combat_started.ogg rename to public/resources/audio/sfx/combat/combat_started.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/unit_defeated.ogg b/public/resources/audio/sfx/combat/unit_defeated.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/unit_defeated.ogg rename to public/resources/audio/sfx/combat/unit_defeated.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/unit_killed.ogg b/public/resources/audio/sfx/combat/unit_killed.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/unit_killed.ogg rename to public/resources/audio/sfx/combat/unit_killed.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/unit_victorious.ogg b/public/resources/audio/sfx/combat/unit_victorious.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/unit_victorious.ogg rename to public/resources/audio/sfx/combat/unit_victorious.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/defeat_stinger.ogg b/public/resources/audio/sfx/era/defeat_stinger.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/defeat_stinger.ogg rename to public/resources/audio/sfx/era/defeat_stinger.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/era_advanced.ogg b/public/resources/audio/sfx/era/era_advanced.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/era_advanced.ogg rename to public/resources/audio/sfx/era/era_advanced.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/golden_age_swell.ogg b/public/resources/audio/sfx/era/golden_age_swell.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/golden_age_swell.ogg rename to public/resources/audio/sfx/era/golden_age_swell.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/victory_fanfare.ogg b/public/resources/audio/sfx/era/victory_fanfare.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/victory_fanfare.ogg rename to public/resources/audio/sfx/era/victory_fanfare.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/fauna/apex_attack.ogg b/public/resources/audio/sfx/fauna/apex_attack.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/fauna/apex_attack.ogg rename to public/resources/audio/sfx/fauna/apex_attack.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/fauna/apex_death.ogg b/public/resources/audio/sfx/fauna/apex_death.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/fauna/apex_death.ogg rename to public/resources/audio/sfx/fauna/apex_death.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/fauna/apex_hit.ogg b/public/resources/audio/sfx/fauna/apex_hit.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/fauna/apex_hit.ogg rename to public/resources/audio/sfx/fauna/apex_hit.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/fauna/apex_roar.ogg b/public/resources/audio/sfx/fauna/apex_roar.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/fauna/apex_roar.ogg rename to public/resources/audio/sfx/fauna/apex_roar.ogg diff --git a/public/resources/audio/sfx/fauna/herbivore_attack.ogg b/public/resources/audio/sfx/fauna/herbivore_attack.ogg new file mode 100644 index 00000000..bf4f6b4b Binary files /dev/null and b/public/resources/audio/sfx/fauna/herbivore_attack.ogg differ diff --git a/public/games/age-of-dwarves/assets/audio/sfx/fauna/herbivore_call.ogg b/public/resources/audio/sfx/fauna/herbivore_call.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/fauna/herbivore_call.ogg rename to public/resources/audio/sfx/fauna/herbivore_call.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/fauna/herbivore_death.ogg b/public/resources/audio/sfx/fauna/herbivore_death.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/fauna/herbivore_death.ogg rename to public/resources/audio/sfx/fauna/herbivore_death.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/fauna/herbivore_hit.ogg b/public/resources/audio/sfx/fauna/herbivore_hit.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/fauna/herbivore_hit.ogg rename to public/resources/audio/sfx/fauna/herbivore_hit.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/fauna/omnivore_attack.ogg b/public/resources/audio/sfx/fauna/omnivore_attack.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/fauna/omnivore_attack.ogg rename to public/resources/audio/sfx/fauna/omnivore_attack.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/fauna/omnivore_death.ogg b/public/resources/audio/sfx/fauna/omnivore_death.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/fauna/omnivore_death.ogg rename to public/resources/audio/sfx/fauna/omnivore_death.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/fauna/omnivore_hit.ogg b/public/resources/audio/sfx/fauna/omnivore_hit.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/fauna/omnivore_hit.ogg rename to public/resources/audio/sfx/fauna/omnivore_hit.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/fauna/omnivore_spawn.ogg b/public/resources/audio/sfx/fauna/omnivore_spawn.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/fauna/omnivore_spawn.ogg rename to public/resources/audio/sfx/fauna/omnivore_spawn.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/fauna/predator_attack_01.ogg b/public/resources/audio/sfx/fauna/predator_attack_01.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/fauna/predator_attack_01.ogg rename to public/resources/audio/sfx/fauna/predator_attack_01.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/fauna/predator_attack_02.ogg b/public/resources/audio/sfx/fauna/predator_attack_02.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/fauna/predator_attack_02.ogg rename to public/resources/audio/sfx/fauna/predator_attack_02.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/fauna/predator_death.ogg b/public/resources/audio/sfx/fauna/predator_death.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/fauna/predator_death.ogg rename to public/resources/audio/sfx/fauna/predator_death.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/fauna/predator_hurt_01.ogg b/public/resources/audio/sfx/fauna/predator_hurt_01.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/fauna/predator_hurt_01.ogg rename to public/resources/audio/sfx/fauna/predator_hurt_01.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/fauna/predator_hurt_02.ogg b/public/resources/audio/sfx/fauna/predator_hurt_02.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/fauna/predator_hurt_02.ogg rename to public/resources/audio/sfx/fauna/predator_hurt_02.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/fauna/predator_spawn.ogg b/public/resources/audio/sfx/fauna/predator_spawn.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/fauna/predator_spawn.ogg rename to public/resources/audio/sfx/fauna/predator_spawn.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/fauna/spawn.ogg b/public/resources/audio/sfx/fauna/spawn.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/fauna/spawn.ogg rename to public/resources/audio/sfx/fauna/spawn.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/generic/attack.ogg b/public/resources/audio/sfx/generic/attack.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/generic/attack.ogg rename to public/resources/audio/sfx/generic/attack.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/generic/complete.ogg b/public/resources/audio/sfx/generic/complete.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/generic/complete.ogg rename to public/resources/audio/sfx/generic/complete.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/generic/death.ogg b/public/resources/audio/sfx/generic/death.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/generic/death.ogg rename to public/resources/audio/sfx/generic/death.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/generic/hit.ogg b/public/resources/audio/sfx/generic/hit.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/generic/hit.ogg rename to public/resources/audio/sfx/generic/hit.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/border_expanded.ogg b/public/resources/audio/sfx/ui/border_expanded.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/border_expanded.ogg rename to public/resources/audio/sfx/ui/border_expanded.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/culture_researched.ogg b/public/resources/audio/sfx/ui/culture_researched.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/culture_researched.ogg rename to public/resources/audio/sfx/ui/culture_researched.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/research_start.ogg b/public/resources/audio/sfx/ui/research_start.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/research_start.ogg rename to public/resources/audio/sfx/ui/research_start.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/tech_researched.ogg b/public/resources/audio/sfx/ui/tech_researched.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/tech_researched.ogg rename to public/resources/audio/sfx/ui/tech_researched.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/turn_ended.ogg b/public/resources/audio/sfx/ui/turn_ended.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/turn_ended.ogg rename to public/resources/audio/sfx/ui/turn_ended.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/turn_started.ogg b/public/resources/audio/sfx/ui/turn_started.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/turn_started.ogg rename to public/resources/audio/sfx/ui/turn_started.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/unit_moved.ogg b/public/resources/audio/sfx/ui/unit_moved.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/unit_moved.ogg rename to public/resources/audio/sfx/ui/unit_moved.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/unit_promoted.ogg b/public/resources/audio/sfx/ui/unit_promoted.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/unit_promoted.ogg rename to public/resources/audio/sfx/ui/unit_promoted.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/units/civilian/death.ogg b/public/resources/audio/sfx/units/civilian/death.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/units/civilian/death.ogg rename to public/resources/audio/sfx/units/civilian/death.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/units/melee/attack_01.ogg b/public/resources/audio/sfx/units/melee/attack_01.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/units/melee/attack_01.ogg rename to public/resources/audio/sfx/units/melee/attack_01.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/units/melee/attack_02.ogg b/public/resources/audio/sfx/units/melee/attack_02.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/units/melee/attack_02.ogg rename to public/resources/audio/sfx/units/melee/attack_02.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/units/melee/attack_03.ogg b/public/resources/audio/sfx/units/melee/attack_03.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/units/melee/attack_03.ogg rename to public/resources/audio/sfx/units/melee/attack_03.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/units/melee/death_01.ogg b/public/resources/audio/sfx/units/melee/death_01.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/units/melee/death_01.ogg rename to public/resources/audio/sfx/units/melee/death_01.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/units/melee/death_02.ogg b/public/resources/audio/sfx/units/melee/death_02.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/units/melee/death_02.ogg rename to public/resources/audio/sfx/units/melee/death_02.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/units/melee/hit_01.ogg b/public/resources/audio/sfx/units/melee/hit_01.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/units/melee/hit_01.ogg rename to public/resources/audio/sfx/units/melee/hit_01.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/units/melee/hit_02.ogg b/public/resources/audio/sfx/units/melee/hit_02.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/units/melee/hit_02.ogg rename to public/resources/audio/sfx/units/melee/hit_02.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/units/melee/hit_03.ogg b/public/resources/audio/sfx/units/melee/hit_03.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/units/melee/hit_03.ogg rename to public/resources/audio/sfx/units/melee/hit_03.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/units/melee_spawn.ogg b/public/resources/audio/sfx/units/melee/spawn.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/units/melee_spawn.ogg rename to public/resources/audio/sfx/units/melee/spawn.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/units/ranged/death_01.ogg b/public/resources/audio/sfx/units/ranged/death_01.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/units/ranged/death_01.ogg rename to public/resources/audio/sfx/units/ranged/death_01.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/units/ranged/fire_01.ogg b/public/resources/audio/sfx/units/ranged/fire_01.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/units/ranged/fire_01.ogg rename to public/resources/audio/sfx/units/ranged/fire_01.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/units/ranged/fire_02.ogg b/public/resources/audio/sfx/units/ranged/fire_02.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/units/ranged/fire_02.ogg rename to public/resources/audio/sfx/units/ranged/fire_02.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/units/ranged/hit_01.ogg b/public/resources/audio/sfx/units/ranged/hit_01.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/units/ranged/hit_01.ogg rename to public/resources/audio/sfx/units/ranged/hit_01.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/units/ranged/hit_02.ogg b/public/resources/audio/sfx/units/ranged/hit_02.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/units/ranged/hit_02.ogg rename to public/resources/audio/sfx/units/ranged/hit_02.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/units/ranged_spawn.ogg b/public/resources/audio/sfx/units/ranged/spawn.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/units/ranged_spawn.ogg rename to public/resources/audio/sfx/units/ranged/spawn.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/units/siege/bombard_01.ogg b/public/resources/audio/sfx/units/siege/bombard_01.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/units/siege/bombard_01.ogg rename to public/resources/audio/sfx/units/siege/bombard_01.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/units/siege/bombard_02.ogg b/public/resources/audio/sfx/units/siege/bombard_02.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/units/siege/bombard_02.ogg rename to public/resources/audio/sfx/units/siege/bombard_02.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/units/siege_death.ogg b/public/resources/audio/sfx/units/siege/death.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/units/siege_death.ogg rename to public/resources/audio/sfx/units/siege/death.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/units/siege_hit.ogg b/public/resources/audio/sfx/units/siege/hit.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/units/siege_hit.ogg rename to public/resources/audio/sfx/units/siege/hit.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/units/support_attack.ogg b/public/resources/audio/sfx/units/support/attack.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/units/support_attack.ogg rename to public/resources/audio/sfx/units/support/attack.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/units/support_death.ogg b/public/resources/audio/sfx/units/support/death.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/units/support_death.ogg rename to public/resources/audio/sfx/units/support/death.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/units/support_hit.ogg b/public/resources/audio/sfx/units/support/hit.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/units/support_hit.ogg rename to public/resources/audio/sfx/units/support/hit.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/weather/blizzard.ogg b/public/resources/audio/sfx/weather/blizzard.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/weather/blizzard.ogg rename to public/resources/audio/sfx/weather/blizzard.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/weather/drought.ogg b/public/resources/audio/sfx/weather/drought.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/weather/drought.ogg rename to public/resources/audio/sfx/weather/drought.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/weather/heat_wave.ogg b/public/resources/audio/sfx/weather/heat_wave.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/weather/heat_wave.ogg rename to public/resources/audio/sfx/weather/heat_wave.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/weather/hurricane.ogg b/public/resources/audio/sfx/weather/hurricane.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/weather/hurricane.ogg rename to public/resources/audio/sfx/weather/hurricane.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/weather/storm.ogg b/public/resources/audio/sfx/weather/storm.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/weather/storm.ogg rename to public/resources/audio/sfx/weather/storm.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sfx/weather/tornado.ogg b/public/resources/audio/sfx/weather/tornado.ogg similarity index 100% rename from public/games/age-of-dwarves/assets/audio/sfx/weather/tornado.ogg rename to public/resources/audio/sfx/weather/tornado.ogg diff --git a/public/games/age-of-dwarves/assets/audio/sources.csv b/public/resources/audio/sources.csv similarity index 82% rename from public/games/age-of-dwarves/assets/audio/sources.csv rename to public/resources/audio/sources.csv index 57dde0c2..f759e899 100644 --- a/public/games/age-of-dwarves/assets/audio/sources.csv +++ b/public/resources/audio/sources.csv @@ -17,14 +17,14 @@ # Lines starting with `#` are ignored. The header row below is required. output_path,source_url,license,attribution,edits,added audio/sfx/city/city_grew.ogg,https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/confirmation_001.wav,CC0-1.0,Kenney (Calinou repackage),loudnorm I=-16/TP=-3/LRA=11+wav→ogg 128kbps,2026-04-27 -audio/sfx/turn_started.ogg,https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/maximize_001.wav,CC0-1.0,Kenney (Calinou repackage),loudnorm I=-16/TP=-3+wav→ogg 128kbps,2026-04-27 -audio/sfx/turn_ended.ogg,https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/minimize_001.wav,CC0-1.0,Kenney (Calinou repackage),loudnorm I=-16/TP=-3+wav→ogg 128kbps,2026-04-27 -audio/sfx/research_start.ogg,https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/tick_002.wav,CC0-1.0,Kenney (Calinou repackage),loudnorm I=-16/TP=-3+wav→ogg 128kbps,2026-04-27 -audio/sfx/tech_researched.ogg,https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/confirmation_002.wav,CC0-1.0,Kenney (Calinou repackage),loudnorm I=-16/TP=-3+wav→ogg 128kbps,2026-04-27 -audio/sfx/border_expanded.ogg,https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/pluck_001.wav,CC0-1.0,Kenney (Calinou repackage),loudnorm I=-16/TP=-3+wav→ogg 128kbps,2026-04-27 -audio/sfx/unit_promoted.ogg,https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/confirmation_004.wav,CC0-1.0,Kenney (Calinou repackage),loudnorm I=-16/TP=-3+wav→ogg 128kbps,2026-04-27 -audio/sfx/unit_moved.ogg,https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/click_004.wav,CC0-1.0,Kenney (Calinou repackage),loudnorm I=-16/TP=-3+wav→ogg 128kbps,2026-04-27 -audio/sfx/city_founded.ogg,https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/bong_001.wav,CC0-1.0,Kenney (Calinou repackage),loudnorm I=-16/TP=-3+wav→ogg 128kbps,2026-04-27 +audio/sfx/ui/turn_started.ogg,https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/maximize_001.wav,CC0-1.0,Kenney (Calinou repackage),loudnorm I=-16/TP=-3+wav→ogg 128kbps,2026-04-27 +audio/sfx/ui/turn_ended.ogg,https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/minimize_001.wav,CC0-1.0,Kenney (Calinou repackage),loudnorm I=-16/TP=-3+wav→ogg 128kbps,2026-04-27 +audio/sfx/ui/research_start.ogg,https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/tick_002.wav,CC0-1.0,Kenney (Calinou repackage),loudnorm I=-16/TP=-3+wav→ogg 128kbps,2026-04-27 +audio/sfx/ui/tech_researched.ogg,https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/confirmation_002.wav,CC0-1.0,Kenney (Calinou repackage),loudnorm I=-16/TP=-3+wav→ogg 128kbps,2026-04-27 +audio/sfx/ui/border_expanded.ogg,https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/pluck_001.wav,CC0-1.0,Kenney (Calinou repackage),loudnorm I=-16/TP=-3+wav→ogg 128kbps,2026-04-27 +audio/sfx/ui/unit_promoted.ogg,https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/confirmation_004.wav,CC0-1.0,Kenney (Calinou repackage),loudnorm I=-16/TP=-3+wav→ogg 128kbps,2026-04-27 +audio/sfx/ui/unit_moved.ogg,https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/click_004.wav,CC0-1.0,Kenney (Calinou repackage),loudnorm I=-16/TP=-3+wav→ogg 128kbps,2026-04-27 +audio/sfx/city/city_founded.ogg,https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/bong_001.wav,CC0-1.0,Kenney (Calinou repackage),loudnorm I=-16/TP=-3+wav→ogg 128kbps,2026-04-27 audio/sfx/city/city_starved.ogg,https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/error_004.wav,CC0-1.0,Kenney (Calinou repackage),loudnorm I=-16/TP=-3+wav→ogg 128kbps,2026-04-27 audio/sfx/buildings/build_complete_civic.ogg,https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/confirmation_001.wav,CC0-1.0,Kenney (Calinou repackage),loudnorm I=-16/TP=-3+wav→ogg 128kbps,2026-04-27 audio/sfx/units/melee/attack_01.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactMetal_light_000.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 @@ -43,13 +43,12 @@ audio/sfx/units/ranged/death_01.ogg,https://kenney.nl/media/pages/assets/impact- audio/sfx/units/siege/bombard_01.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactPlate_heavy_001.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 audio/sfx/units/siege/bombard_02.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactPlate_heavy_004.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 audio/sfx/units/civilian/death.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactPlate_light_003.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 -audio/sfx/combat_hit.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactMetal_medium_000.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 +audio/sfx/combat/combat_hit.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactMetal_medium_000.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 audio/sfx/combat/combat_started.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactBell_heavy_000.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 audio/sfx/buildings/build_complete_mil.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactBell_heavy_002.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 audio/sfx/buildings/build_complete_def.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactPlate_heavy_002.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 -audio/sfx/wonder_built.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactBell_heavy_001.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 -audio/sfx/era_advanced.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactBell_heavy_003.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 -audio/sfx/golden_age_swell.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactBell_heavy_004.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 +audio/sfx/era/era_advanced.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactBell_heavy_003.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 +audio/sfx/era/golden_age_swell.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactBell_heavy_004.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 audio/music/overworld_awakening.ogg,https://opengameart.org/sites/default/files/JRPG%20Music%20Pack%20%232%20%5BTowns%5D%20by%20Juhani%20Junkala.zip#Town1 - Home Town.ogg,CC0-1.0,Juhani Junkala (SubspaceAudio, OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 usic/overworld_craft.ogg,https://opengameart.org/sites/default/files/JRPG%20Music%20Pack%20%232%20%5BTowns%5D%20by%20Juhani%20Junkala.zip#Town2 - Where Time Stands Still.ogg,CC0-1.0,Juhani Junkala (SubspaceAudio, OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 music/overworld_industry.ogg,https://opengameart.org/sites/default/files/JRPG%20Music%20Pack%20%232%20%5BTowns%5D%20by%20Juhani%20Junkala.zip#Town3 - Sunshine Coast.ogg,CC0-1.0,Juhani Junkala (SubspaceAudio, OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 @@ -59,8 +58,8 @@ ic/golden_age.ogg,https://opengameart.org/sites/default/files/JRPG%20Music%20Pac c/victory.ogg,https://opengameart.org/sites/default/files/JRPG%20Music%20Pack%20%235%20%5BAction%5D%20by%20Juhani%20Junkala.zip#Action3 - Preparing For Battle.ogg,CC0-1.0,Juhani Junkala (SubspaceAudio, OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 audio/sfx/weather/tornado.ogg,https://opengameart.org/sites/default/files/sfx_loops.zip#ambient_03.ogg,CC0-1.0,rubberduck (OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 audio/sfx/weather/hurricane.ogg,https://opengameart.org/sites/default/files/sfx_loops.zip#ambient_02.ogg,CC0-1.0,rubberduck (OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 -audio/sfx/victory_fanfare.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactBell_heavy_001.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 -audio/sfx/culture_researched.ogg,https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/confirmation_003.wav,CC0-1.0,Kenney (Calinou repackage),loudnorm I=-16/TP=-3+wav→ogg 128kbps,2026-04-27 +audio/sfx/era/victory_fanfare.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactBell_heavy_001.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 +audio/sfx/ui/culture_researched.ogg,https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/confirmation_003.wav,CC0-1.0,Kenney (Calinou repackage),loudnorm I=-16/TP=-3+wav→ogg 128kbps,2026-04-27 audio/music/overworld_craft.ogg,https://opengameart.org/sites/default/files/JRPG%20Music%20Pack%20%232%20%5BTowns%5D%20by%20Juhani%20Junkala.zip#Town2 - Where Time Stands Still.ogg,CC0-1.0,Juhani Junkala (SubspaceAudio, OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 audio/music/overworld_kingdoms.ogg,https://opengameart.org/sites/default/files/JRPG%20Music%20Pack%20%232%20%5BTowns%5D%20by%20Juhani%20Junkala.zip#Town4 - Bazaar.ogg,CC0-1.0,Juhani Junkala (SubspaceAudio, OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 audio/music/golden_age.ogg,https://opengameart.org/sites/default/files/JRPG%20Music%20Pack%20%235%20%5BAction%5D%20by%20Juhani%20Junkala.zip#Action2 - Army Approaching.ogg,CC0-1.0,Juhani Junkala (SubspaceAudio, OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 @@ -78,9 +77,9 @@ audio/sfx/fauna/apex_attack.ogg,https://opengameart.org/sites/default/files/80-C audio/sfx/fauna/apex_death.ogg,https://opengameart.org/sites/default/files/80-CC0-creature-SFX_0.zip#scream_02.ogg,CC0-1.0,rubberduck (OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 audio/sfx/fauna/herbivore_call.ogg,https://opengameart.org/sites/default/files/80-CC0-creature-SFX_0.zip#cute_05.ogg,CC0-1.0,rubberduck (OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 audio/sfx/fauna/herbivore_death.ogg,https://opengameart.org/sites/default/files/80-CC0-creature-SFX_0.zip#hurt_04.ogg,CC0-1.0,rubberduck (OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-27 -audio/sfx/defeat_stinger.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactPlate_heavy_004.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-28 +audio/sfx/era/defeat_stinger.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactPlate_heavy_004.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-28 audio/music/defeat.ogg,https://opengameart.org/sites/default/files/JRPG%20Music%20Pack%20%234%20%5BCalm%5D%20by%20Juhani%20Junkala_0.zip#Calm6 - Innocence.ogg,CC0-1.0,Juhani Junkala (SubspaceAudio, OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-28 -audio/sfx/wonder_built_own.ogg,https://opengameart.org/sites/default/files/fanfare_0.ogg,CC0-1.0,Spring Spring (OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-28 +audio/sfx/buildings/wonder_built_own.ogg,https://opengameart.org/sites/default/files/fanfare_0.ogg,CC0-1.0,Spring Spring (OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-28 udio/sfx/wonder_built_rival.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactBell_heavy_002.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-22/TP=-6+ogg 128kbps (extra-quiet for distant feel),2026-04-28 audio/sfx/weather/storm.ogg,https://opengameart.org/sites/default/files/sfx_100_v2.zip#sfx100v2_thunder_01.ogg,CC0-1.0,rubberduck (OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-28 audio/music/victory_domination_a.ogg,https://opengameart.org/sites/default/files/JRPG%20Music%20Pack%20%235%20%5BAction%5D%20by%20Juhani%20Junkala.zip#Action3 - Preparing For Battle.ogg,CC0-1.0,Juhani Junkala (SubspaceAudio, OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-28 @@ -100,17 +99,16 @@ audio/music/victory_economic_a.ogg,https://opengameart.org/sites/default/files/J music/victory_economic_b.ogg,https://opengameart.org/sites/default/files/JRPG%20Music%20Pack%20%231%20%5BExploration%5D%20by%20Juhani%20Junkala.zip#Exploration4 - Prairie Nights.ogg,CC0-1.0,Juhani Junkala (SubspaceAudio, OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-28 audio/music/victory_science_b.ogg,https://opengameart.org/sites/default/files/JRPG%20Music%20Pack%20%231%20%5BExploration%5D%20by%20Juhani%20Junkala.zip#Exploration6 - Tropical Island.ogg,CC0-1.0,Juhani Junkala (SubspaceAudio, OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-28 audio/music/victory_economic_b.ogg,https://opengameart.org/sites/default/files/JRPG%20Music%20Pack%20%231%20%5BExploration%5D%20by%20Juhani%20Junkala.zip#Exploration4 - Prairie Nights.ogg,CC0-1.0,Juhani Junkala (SubspaceAudio, OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-28 -audio/sfx/wonder_built_rival.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactBell_heavy_002.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-22/TP=-6+ogg 128kbps (extra-quiet for distant feel),2026-04-28 -audio/sfx/unit_defeated.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactWood_heavy_002.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-28 -audio/sfx/unit_victorious.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactMetal_light_002.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-28 -audio/sfx/units/melee_spawn.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactWood_heavy_001.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 -audio/sfx/units/ranged_spawn.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactWood_heavy_003.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 -audio/sfx/units/siege_hit.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactPlank_medium_004.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 -audio/sfx/units/siege_death.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactPlate_medium_002.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 -audio/sfx/units/support_hit.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactSoft_heavy_001.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 -audio/sfx/units/support_death.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactSoft_heavy_002.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 +audio/sfx/buildings/wonder_built_rival.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactBell_heavy_002.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-22/TP=-6+ogg 128kbps (extra-quiet for distant feel),2026-04-28 +audio/sfx/combat/unit_defeated.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactWood_heavy_002.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-28 +audio/sfx/combat/unit_victorious.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactMetal_light_002.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-28 +audio/sfx/units/melee/spawn.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactWood_heavy_001.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 +audio/sfx/units/ranged/spawn.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactWood_heavy_003.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 +audio/sfx/units/siege/hit.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactPlank_medium_004.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 +audio/sfx/units/siege/death.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactPlate_medium_002.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 +audio/sfx/units/support/hit.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactSoft_heavy_001.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 +audio/sfx/units/support/death.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactSoft_heavy_002.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 audio/sfx/fauna/apex_hit.ogg,https://opengameart.org/sites/default/files/80-CC0-creature-SFX_0.zip#hurt_05.ogg,CC0-1.0,rubberduck (OpenGameArt),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#monster_02.ogg,CC0-1.0,rubberduck (OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 audio/sfx/fauna/herbivore_hit.ogg,https://opengameart.org/sites/default/files/80-CC0-creature-SFX_0.zip#hurt_03.ogg,CC0-1.0,rubberduck (OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 audio/sfx/fauna/omnivore_spawn.ogg,https://opengameart.org/sites/default/files/80-CC0-creature-SFX_0.zip#cute_07.ogg,CC0-1.0,rubberduck (OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 audio/sfx/fauna/omnivore_attack.ogg,https://opengameart.org/sites/default/files/80-CC0-creature-SFX_0.zip#barking_02.ogg,CC0-1.0,rubberduck (OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 @@ -123,11 +121,13 @@ audio/sfx/buildings/research_complete.ogg,https://kenney.nl/media/pages/assets/i audio/sfx/generic/attack.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactGeneric_light_000.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 audio/sfx/generic/hit.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactGeneric_light_002.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 audio/sfx/generic/death.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactGeneric_light_004.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 -audio/sfx/buildings/build_complete_prod.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactMetal_heavy_002.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 -audio/sfx/buildings/generic_complete.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactPlate_medium_003.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 -audio/sfx/generic/complete.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactPlate_medium_004.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 -audio/sfx/units/support_attack.ogg,https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/pluck_002.wav,CC0-1.0,Kenney (Calinou repackage),loudnorm I=-16/TP=-3+wav→ogg 128kbps,2026-04-29 -audio/sfx/unit_killed.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactPlate_light_002.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 -audio/sfx/weather/blizzard.ogg,https://opengameart.org/sites/default/files/sfx_loops.zip#weird_01.ogg,CC0-1.0,rubberduck (OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 -audio/sfx/weather/heat_wave.ogg,https://opengameart.org/sites/default/files/sfx_loops.zip#weird_02.ogg,CC0-1.0,rubberduck (OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 -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/build_complete_prod.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactMetal_heavy_002.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 +audio/sfx/buildings/generic_complete.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactPlate_medium_003.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 +audio/sfx/generic/complete.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactPlate_medium_004.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 +audio/sfx/units/support/attack.ogg,https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/pluck_002.wav,CC0-1.0,Kenney (Calinou repackage),loudnorm I=-16/TP=-3+wav→ogg 128kbps,2026-04-29 +audio/sfx/combat/unit_killed.ogg,https://kenney.nl/media/pages/assets/impact-sounds/8aa7b545c9-1677589768/kenney_impact-sounds.zip#Audio/impactPlate_light_002.ogg,CC0-1.0,Kenney (Impact Sounds),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 +audio/sfx/weather/blizzard.ogg,https://opengameart.org/sites/default/files/sfx_loops.zip#weird_01.ogg,CC0-1.0,rubberduck (OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 +audio/sfx/weather/heat_wave.ogg,https://opengameart.org/sites/default/files/sfx_loops.zip#weird_02.ogg,CC0-1.0,rubberduck (OpenGameArt),loudnorm I=-16/TP=-3+ogg 128kbps,2026-04-29 +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 diff --git a/tools/audio-batch-11-quality-fixes-2.tsv b/tools/audio-batch-11-quality-fixes-2.tsv new file mode 100644 index 00000000..6216284a --- /dev/null +++ b/tools/audio-batch-11-quality-fixes-2.tsv @@ -0,0 +1,9 @@ +# Batch 11 — Quality fixes round 2. +# +# - wonder_built (generic): break dup with victory_fanfare (was both +# impactBell_heavy_001) — switch to a deep wood toll. +# - fauna.herbivore.attack: a generic "monster" sample reads wrong for a +# panicked herbivore — switch to a grunt. + +audio/sfx/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 +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 diff --git a/tools/audio-reorganize.py b/tools/audio-reorganize.py new file mode 100644 index 00000000..b2b3d64c --- /dev/null +++ b/tools/audio-reorganize.py @@ -0,0 +1,192 @@ +#!/usr/bin/env python3 +"""One-shot reorganization: move audio assets from theme-specific dir to +shared `public/resources/audio/`, and normalize the SFX layout into a +consistent flat-categorical structure. + +Idempotent enough to re-run if interrupted, but designed for a single pass. + +Old layout: + public/games/age-of-dwarves/assets/audio/sfx/turn_started.ogg (flat) + public/games/age-of-dwarves/assets/audio/sfx/buildings/... (nested) + public/games/age-of-dwarves/assets/audio/sfx/units/melee_spawn.ogg (flat-but-named) + public/games/age-of-dwarves/assets/audio/sfx/units/melee/... (nested) + public/games/age-of-dwarves/assets/audio/music/... + +New layout: + public/resources/audio/sfx//.ogg + public/resources/audio/music/.ogg + public/resources/audio/sources.csv + public/resources/audio/LICENSES.md + +Categories: ui, city, combat, era, buildings, units/, fauna, +weather, generic. +""" + +import json, csv, io, shutil, sys, re +from pathlib import Path + +REPO_ROOT = Path(__file__).resolve().parent.parent +OLD_ROOT = REPO_ROOT / "public/games/age-of-dwarves/assets/audio" +NEW_ROOT = REPO_ROOT / "public/resources/audio" +MANIFEST = REPO_ROOT / "public/games/age-of-dwarves/data/audio.json" + +# Map of old asset-relative path -> new asset-relative path. The asset-relative +# part is what shows up as `audio/...` in the manifest streams + sources.csv. +RENAMES: dict[str, str] = { + # ── flat sfx top-level → categorical subfolders ───────────────────── + "audio/sfx/turn_started.ogg": "audio/sfx/ui/turn_started.ogg", + "audio/sfx/turn_ended.ogg": "audio/sfx/ui/turn_ended.ogg", + "audio/sfx/unit_moved.ogg": "audio/sfx/ui/unit_moved.ogg", + "audio/sfx/unit_promoted.ogg": "audio/sfx/ui/unit_promoted.ogg", + "audio/sfx/border_expanded.ogg": "audio/sfx/ui/border_expanded.ogg", + "audio/sfx/research_start.ogg": "audio/sfx/ui/research_start.ogg", + "audio/sfx/tech_researched.ogg": "audio/sfx/ui/tech_researched.ogg", + "audio/sfx/culture_researched.ogg": "audio/sfx/ui/culture_researched.ogg", + + "audio/sfx/city_founded.ogg": "audio/sfx/city/city_founded.ogg", + + "audio/sfx/combat_hit.ogg": "audio/sfx/combat/combat_hit.ogg", + "audio/sfx/unit_killed.ogg": "audio/sfx/combat/unit_killed.ogg", + "audio/sfx/unit_defeated.ogg": "audio/sfx/combat/unit_defeated.ogg", + "audio/sfx/unit_victorious.ogg": "audio/sfx/combat/unit_victorious.ogg", + + "audio/sfx/era_advanced.ogg": "audio/sfx/era/era_advanced.ogg", + "audio/sfx/golden_age_swell.ogg": "audio/sfx/era/golden_age_swell.ogg", + "audio/sfx/victory_fanfare.ogg": "audio/sfx/era/victory_fanfare.ogg", + "audio/sfx/defeat_stinger.ogg": "audio/sfx/era/defeat_stinger.ogg", + + "audio/sfx/wonder_built.ogg": "audio/sfx/buildings/wonder_built.ogg", + "audio/sfx/wonder_built_own.ogg": "audio/sfx/buildings/wonder_built_own.ogg", + "audio/sfx/wonder_built_rival.ogg": "audio/sfx/buildings/wonder_built_rival.ogg", + + # ── normalize unit subcategory paths (flat-but-named → nested) ────── + "audio/sfx/units/melee_spawn.ogg": "audio/sfx/units/melee/spawn.ogg", + "audio/sfx/units/ranged_spawn.ogg": "audio/sfx/units/ranged/spawn.ogg", + "audio/sfx/units/siege_hit.ogg": "audio/sfx/units/siege/hit.ogg", + "audio/sfx/units/siege_death.ogg": "audio/sfx/units/siege/death.ogg", + "audio/sfx/units/support_attack.ogg":"audio/sfx/units/support/attack.ogg", + "audio/sfx/units/support_hit.ogg": "audio/sfx/units/support/hit.ogg", + "audio/sfx/units/support_death.ogg": "audio/sfx/units/support/death.ogg", +} + +def step_move_files() -> tuple[int, int]: + """Move every audio file from OLD_ROOT to NEW_ROOT, applying RENAMES.""" + moved = 0 + skipped = 0 + for src in OLD_ROOT.rglob("*"): + if not src.is_file(): + continue + rel = src.relative_to(OLD_ROOT) + # The manifest path is "audio/..." — equivalent to the relative path + # under OLD_ROOT prefixed with "audio/". So a file at + # OLD_ROOT/sfx/turn_started.ogg matches "audio/sfx/turn_started.ogg". + manifest_key = f"audio/{rel.as_posix()}" + new_manifest_key = RENAMES.get(manifest_key, manifest_key) + # Special-case: LICENSES.md and sources.csv at OLD_ROOT root keep + # their basename, no "audio/" prefix. + if rel.parent == Path("."): + new_path = NEW_ROOT / rel.name + else: + assert new_manifest_key.startswith("audio/") + new_path = NEW_ROOT / new_manifest_key[len("audio/"):] + new_path.parent.mkdir(parents=True, exist_ok=True) + if new_path.exists(): + skipped += 1 + continue + shutil.move(str(src), str(new_path)) + moved += 1 + return moved, skipped + + +def step_update_manifest() -> int: + """Rewrite audio.json stream paths.""" + with open(MANIFEST) as f: + data = json.load(f) + rewrites = 0 + for key, entry in data.get("sfx", {}).items(): + if "stream" in entry and entry["stream"] in RENAMES: + entry["stream"] = RENAMES[entry["stream"]] + rewrites += 1 + if "streams" in entry: + new_list = [] + for s in entry["streams"]: + if s in RENAMES: + new_list.append(RENAMES[s]) + rewrites += 1 + else: + new_list.append(s) + entry["streams"] = new_list + # Music tracks didn't move (they were never in the flat-confusion zone), + # but defensive. + for track in data.get("music", {}).get("tracks", []): + if "stream" in track and track["stream"] in RENAMES: + track["stream"] = RENAMES[track["stream"]] + rewrites += 1 + with open(MANIFEST, "w") as f: + json.dump(data, f, indent=2) + f.write("\n") + return rewrites + + +def step_update_sources_csv() -> int: + """Rewrite output_path column in sources.csv.""" + csv_path = NEW_ROOT / "sources.csv" + if not csv_path.exists(): + return 0 + head_lines: list[str] = [] + body_lines: list[str] = [] + with open(csv_path) as f: + for ln in f: + if ln.startswith("#"): + head_lines.append(ln) + else: + body_lines.append(ln) + reader = csv.reader(io.StringIO("".join(body_lines))) + rows = list(reader) + hdr, body = rows[0], rows[1:] + op_idx = hdr.index("output_path") + rewrites = 0 + for r in body: + if r[op_idx] in RENAMES: + r[op_idx] = RENAMES[r[op_idx]] + rewrites += 1 + with open(csv_path, "w") as f: + f.writelines(head_lines) + w = csv.writer(f) + w.writerow(hdr) + w.writerows(body) + return rewrites + + +def step_remove_old_root() -> None: + """Delete OLD_ROOT if empty after the move.""" + if not OLD_ROOT.exists(): + return + leftover = list(OLD_ROOT.rglob("*")) + leftover_files = [p for p in leftover if p.is_file()] + if leftover_files: + print(f" WARN: {len(leftover_files)} files remain at {OLD_ROOT}") + for p in leftover_files[:5]: + print(f" {p}") + return + shutil.rmtree(OLD_ROOT) + # Walk up and prune empty parent dirs (assets/) but never above public/games/age-of-dwarves + parent = OLD_ROOT.parent # .../assets + if parent.is_dir() and not any(parent.iterdir()): + parent.rmdir() + + +def main() -> None: + NEW_ROOT.mkdir(parents=True, exist_ok=True) + moved, skipped = step_move_files() + print(f"moved {moved} files, skipped {skipped} (already at destination)") + rewrites = step_update_manifest() + print(f"manifest rewrites: {rewrites}") + csv_rewrites = step_update_sources_csv() + print(f"sources.csv rewrites: {csv_rewrites}") + step_remove_old_root() + print("done.") + + +if __name__ == "__main__": + main()