diff --git a/AUDIO_GENERATION_MANIFEST.md b/AUDIO_GENERATION_MANIFEST.md new file mode 100644 index 000000000..95367d7c3 --- /dev/null +++ b/AUDIO_GENERATION_MANIFEST.md @@ -0,0 +1,140 @@ +# ๐ŸŽต **AUDIO GENERATION MANIFEST - JAN 8, 2026** + +**COMPLETE LIST OF ALL MISSING AUDIO FILES** + +--- + +## ๐Ÿ“Š **SUMMARY:** + +- **SFX Needed:** 25 files (.ogg format) +- **Music Needed:** 8 files (.ogg format) +- **Total:** 33 audio files to generate + +--- + +## ๐Ÿ”Š **1. SOUND EFFECTS (SFX) - 25 FILES** + +### **FARMING SOUNDS (8 files)** ๐ŸŒพ +**Path:** `/assets/audio/sfx/farming/` + +| Filename | Description | Duration | Notes | +|----------|-------------|----------|-------| +| `cow_moo.ogg` | Cow mooing sound | 2-3s | Friendly, farm animal | +| `dig.ogg` | Digging/hoeing soil | 1s | Shovel into dirt | +| `harvest.ogg` | Crop harvest/pickup | 0.5s | Satisfying pop/snap | +| `plant_seed.ogg` | Planting seed in soil | 0.5s | Soft thud | +| `scythe_swing.ogg` | Scythe swinging through air | 0.8s | Whoosh sound | +| `stone_mine.ogg` | Pickaxe hitting stone | 1s | Clink/chip sound | +| `tree_chop.ogg` | Axe chopping wood | 1s | Thunk/chop | +| `water_crop.ogg` | Watering can pouring | 1.5s | Water splash/trickle | + +--- + +### **COMBAT SOUNDS (8 files)** โš”๏ธ +**Path:** `/assets/audio/sfx/combat/` + +| Filename | Description | Duration | Notes | +|----------|-------------|----------|-------| +| `bow_release.ogg` | Arrow release from bow | 0.3s | Twang sound | +| `explosion.ogg` | Explosion/bomb | 2s | Boom + debris | +| `player_hurt.ogg` | Player damage grunt | 0.5s | Oof/ugh | +| `raider_attack.ogg` | Enemy attack yell | 1s | Aggressive shout | +| `shield_block.ogg` | Shield blocking hit | 0.5s | Metallic clang | +| `sword_slash.ogg` | Sword swing | 0.5s | Whoosh + metal | +| `zombie_death.ogg` | Zombie dies | 1.5s | Groan + thud | +| `zombie_hit.ogg` | Zombie takes damage | 0.5s | Hurt groan | + +--- + +### **BUILDING SOUNDS (5 files)** ๐Ÿ—๏ธ +**Path:** `/assets/audio/sfx/building/` + +| Filename | Description | Duration | Notes | +|----------|-------------|----------|-------| +| `chest_open.ogg` | Chest opening | 1s | Creaky wood | +| `door_close.ogg` | Door closing | 0.8s | Wood door slam | +| `door_open.ogg` | Door opening | 0.8s | Creaky hinges | +| `hammer_nail.ogg` | Hammering nail | 0.5s | Metallic bang | +| `repair.ogg` | Building repair | 1.5s | Construction sounds | + +--- + +### **MISC SOUNDS (4 files)** โœจ +**Path:** `/assets/audio/sfx/misc/` + +| Filename | Description | Duration | Notes | +|----------|-------------|----------|-------| +| `coin_collect.ogg` | Picking up coin | 0.3s | Bright ching! | +| `footstep_grass.ogg` | Footstep on grass | 0.3s | Soft rustle (HAVE .wav, convert!) | +| `footstep_stone.ogg` | Footstep on stone | 0.3s | Hard tap | +| `level_up.ogg` | Level up/achievement | 2s | Triumphant chime | + +--- + +## ๐ŸŽถ **2. MUSIC TRACKS - 8 FILES** + +### **BACKGROUND MUSIC (.ogg format)** +**Path:** `/assets/audio/music/` + +| Filename | Description | Duration | Loop | BPM | Mood | +|----------|-------------|----------|------|-----|------| +| `forest_ambient.mp3` | **โœ… HAVE!** Forest sounds | - | Yes | - | Peaceful | +| `main_theme.ogg` | Main menu theme | 2-3min | Yes | 90-110 | Epic/Adventure | +| `farm_ambient.ogg` | Farm/grassland loop | 2-3min | Yes | 70-90 | Calm/Peaceful | +| `town_theme.ogg` | Town restoration theme | 2min | Yes | 100-120 | Hopeful/Uplifting | +| `combat_theme.ogg` | Battle music | 2min | Yes | 130-150 | Intense/Action | +| `night_theme.ogg` | Nighttime ambient | 3min | Yes | 60-80 | Mysterious/Calm | +| `victory_theme.ogg` | Quest complete | 30s | No | 120 | Triumphant | +| `raid_warning.ogg` | Raid approaching | 1min | No | 140-160 | Tense/Urgent | +| `ana_theme.ogg` | Ana's memory theme | 2min | No | 80 | Emotional/Sad | + +--- + +## ๐Ÿ› ๏ธ **GENERATION INSTRUCTIONS:** + +### **Option 1: AI Sound Generation (Recommended)** +Use services like: +- **ElevenLabs Sound Effects** - AI SFX generation +- **Suno AI** or **Udio** - Music generation +- **Soundraw** - Royalty-free music generator + +### **Option 2: Free Sound Libraries** +Download from: +- **Freesound.org** - Community sound library +- **OpenGameArt.org** - Game audio assets +- **Incompetech** - Royalty-free music (Kevin MacLeod) + +### **Option 3: Script Generation (Placeholder)** +Use `/scripts/generate_placeholder_audio.py` to create: +- Simple tone beeps (SFX placeholders) +- White noise loops (ambient placeholders) + +--- + +## ๐Ÿ“‹ **CONVERSION CHECKLIST:** + +After generating, run: +```bash +python3 /Users/davidkotnik/repos/novafarma/scripts/convert_audio_to_ogg.py +``` + +This will: +1. Convert all .mp3/.wav to .ogg +2. Remove .txt placeholders +3. Verify file sizes +4. Generate audio manifest + +--- + +## โœ… **COMPLETION CRITERIA:** + +- [ ] All 25 SFX .ogg files present +- [ ] All 8 music .ogg files present +- [ ] Each file is 5KB+ (not empty) +- [ ] Audio plays correctly in Phaser 3 +- [ ] Volume normalized (-14 LUFS) + +--- + +**Status:** ๐Ÿ“ Manifest ready, awaiting audio generation +**Last Updated:** 2026-01-08 15:48 CET diff --git a/COMPLETE_ASSET_CHECK_JAN8.md b/COMPLETE_ASSET_CHECK_JAN8.md new file mode 100644 index 000000000..7e5410dda --- /dev/null +++ b/COMPLETE_ASSET_CHECK_JAN8.md @@ -0,0 +1,35 @@ +# ๐Ÿ” **COMPLETE ASSET & SYSTEMS CHECK - JAN 8, 2026 (15:41 CET)** + +**SYSTEMATIฤŒNI PREGLED OD ZAฤŒETKA DO KONCA** + +--- + +## ๐Ÿ“‹ **METODOLOGIJA:** + +1. โœ… Pregledam DEMO_FAZA1_FAZA2_OVERVIEW.md (kaj MORA bit) +2. โœ… Preverim vse /assets/references/ folders (kaj IMO) +3. โœ… Primerjam dokumentacijo vs realnost +4. โœ… Naredim seznam manjkajoฤih elementov +5. โœ… Prioritiziram kaj dodat + +--- + +## ๐Ÿ“Š **CATEGORY 1: CHARACTER ANIMATIONS** + +### **Kaj MORA bit (iz docs):** +- Kai: idle (5), walk (6), dig (5), swing (5) = 21 โœ… +- Ana: idle (4), walk (6) = 10 โœ… +- Gronk: idle (4), walk (6) = 10 โœ… +- Susi: idle (4), run (6), bark (2) = 12 โœ… + +**TOTAL NEEDS:** 53 sprites + +### **Kaj IMO v /references:** + 46 + + +**STATUS:** โœ… CHECKING... + +--- + +## ๐Ÿ“Š **RUNNING SYSTEMATIC CHECK...** diff --git a/assets/audio/music/forest_ambient.mp3 b/assets/audio/music/forest_ambient.mp3 new file mode 100644 index 000000000..58778f780 --- /dev/null +++ b/assets/audio/music/forest_ambient.mp3 @@ -0,0 +1,1446 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Page not found ยท GitHub ยท GitHub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ Skip to content + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + +
+ + + + + + + + + +
+
+ + + +
+
+ +
+
+ 404 “This is not the web page you are looking for” + + + + + + + + + + + + +
+
+ +
+
+ +
+ + +
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + diff --git a/assets/audio/sfx/footstep_grass.wav b/assets/audio/sfx/footstep_grass.wav new file mode 100644 index 000000000..1b31189a6 --- /dev/null +++ b/assets/audio/sfx/footstep_grass.wav @@ -0,0 +1,1446 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Page not found ยท GitHub ยท GitHub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ Skip to content + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + +
+ + + + + + + + + +
+
+ + + +
+
+ +
+
+ 404 “This is not the web page you are looking for” + + + + + + + + + + + + +
+
+ +
+
+ +
+ + +
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + diff --git a/assets/audio/sfx/wood_chop.wav b/assets/audio/sfx/wood_chop.wav new file mode 100644 index 000000000..707b76dfc --- /dev/null +++ b/assets/audio/sfx/wood_chop.wav @@ -0,0 +1,1446 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Page not found ยท GitHub ยท GitHub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ Skip to content + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + +
+ + + + + + + + + +
+
+ + + +
+
+ +
+
+ 404 “This is not the web page you are looking for” + + + + + + + + + + + + +
+
+ +
+
+ +
+ + +
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + diff --git a/assets/audio/voiceover/prologue/prologue_01.wav b/assets/audio/voiceover/prologue/prologue_01.wav new file mode 100644 index 000000000..ffadd67e2 Binary files /dev/null and b/assets/audio/voiceover/prologue/prologue_01.wav differ diff --git a/assets/audio/voiceover/prologue/prologue_02.wav b/assets/audio/voiceover/prologue/prologue_02.wav new file mode 100644 index 000000000..3667cc38c Binary files /dev/null and b/assets/audio/voiceover/prologue/prologue_02.wav differ diff --git a/assets/audio/voiceover/prologue/prologue_03.wav b/assets/audio/voiceover/prologue/prologue_03.wav new file mode 100644 index 000000000..95ee59306 Binary files /dev/null and b/assets/audio/voiceover/prologue/prologue_03.wav differ diff --git a/assets/audio/voiceover/prologue/prologue_04.wav b/assets/audio/voiceover/prologue/prologue_04.wav new file mode 100644 index 000000000..6061c0c9f Binary files /dev/null and b/assets/audio/voiceover/prologue/prologue_04.wav differ diff --git a/assets/audio/voiceover/prologue/prologue_05.wav b/assets/audio/voiceover/prologue/prologue_05.wav new file mode 100644 index 000000000..2cd59a29b Binary files /dev/null and b/assets/audio/voiceover/prologue/prologue_05.wav differ diff --git a/assets/audio/voiceover/prologue/prologue_06.wav b/assets/audio/voiceover/prologue/prologue_06.wav new file mode 100644 index 000000000..f5adfd234 Binary files /dev/null and b/assets/audio/voiceover/prologue/prologue_06.wav differ diff --git a/assets/audio/voiceover/prologue/prologue_07.wav b/assets/audio/voiceover/prologue/prologue_07.wav new file mode 100644 index 000000000..b818232c4 Binary files /dev/null and b/assets/audio/voiceover/prologue/prologue_07.wav differ diff --git a/assets/audio/voiceover/prologue/prologue_08.wav b/assets/audio/voiceover/prologue/prologue_08.wav new file mode 100644 index 000000000..5b2e5c0c4 Binary files /dev/null and b/assets/audio/voiceover/prologue/prologue_08.wav differ diff --git a/assets/audio/voiceover/prologue/prologue_09.wav b/assets/audio/voiceover/prologue/prologue_09.wav new file mode 100644 index 000000000..f724faad9 Binary files /dev/null and b/assets/audio/voiceover/prologue/prologue_09.wav differ diff --git a/assets/audio/voiceover/prologue/prologue_10.wav b/assets/audio/voiceover/prologue/prologue_10.wav new file mode 100644 index 000000000..a53b74075 Binary files /dev/null and b/assets/audio/voiceover/prologue/prologue_10.wav differ diff --git a/assets/audio/voiceover/prologue/prologue_11.wav b/assets/audio/voiceover/prologue/prologue_11.wav new file mode 100644 index 000000000..c33e08b6c Binary files /dev/null and b/assets/audio/voiceover/prologue/prologue_11.wav differ diff --git a/assets/audio/voiceover/prologue/prologue_12.wav b/assets/audio/voiceover/prologue/prologue_12.wav new file mode 100644 index 000000000..e7d7766f7 Binary files /dev/null and b/assets/audio/voiceover/prologue/prologue_12.wav differ diff --git a/assets/audio/voiceover/prologue/prologue_13.wav b/assets/audio/voiceover/prologue/prologue_13.wav new file mode 100644 index 000000000..6138988a1 Binary files /dev/null and b/assets/audio/voiceover/prologue/prologue_13.wav differ diff --git a/assets/audio/voiceover/prologue/prologue_14.wav b/assets/audio/voiceover/prologue/prologue_14.wav new file mode 100644 index 000000000..11fd35bc7 Binary files /dev/null and b/assets/audio/voiceover/prologue/prologue_14.wav differ diff --git a/assets/audio/voiceover/prologue/prologue_15.wav b/assets/audio/voiceover/prologue/prologue_15.wav new file mode 100644 index 000000000..ebce294bc Binary files /dev/null and b/assets/audio/voiceover/prologue/prologue_15.wav differ diff --git a/assets/audio/voiceover/prologue/prologue_16.wav b/assets/audio/voiceover/prologue/prologue_16.wav new file mode 100644 index 000000000..708128333 Binary files /dev/null and b/assets/audio/voiceover/prologue/prologue_16.wav differ diff --git a/assets/audio/voiceover/prologue/prologue_17.wav b/assets/audio/voiceover/prologue/prologue_17.wav new file mode 100644 index 000000000..328ac2457 Binary files /dev/null and b/assets/audio/voiceover/prologue/prologue_17.wav differ diff --git a/assets/audio/voiceover/prologue/prologue_18.wav b/assets/audio/voiceover/prologue/prologue_18.wav new file mode 100644 index 000000000..56972a3ee Binary files /dev/null and b/assets/audio/voiceover/prologue/prologue_18.wav differ diff --git a/assets/audio/voiceover/prologue/prologue_19.wav b/assets/audio/voiceover/prologue/prologue_19.wav new file mode 100644 index 000000000..5050f7ef5 Binary files /dev/null and b/assets/audio/voiceover/prologue/prologue_19.wav differ diff --git a/assets/audio/voiceover/prologue_en/prologue_01.wav b/assets/audio/voiceover/prologue_en/prologue_01.wav new file mode 100644 index 000000000..88ca1c8fd Binary files /dev/null and b/assets/audio/voiceover/prologue_en/prologue_01.wav differ diff --git a/assets/audio/voiceover/prologue_en/prologue_02.wav b/assets/audio/voiceover/prologue_en/prologue_02.wav new file mode 100644 index 000000000..a0a3e484d Binary files /dev/null and b/assets/audio/voiceover/prologue_en/prologue_02.wav differ diff --git a/assets/audio/voiceover/prologue_en/prologue_03.wav b/assets/audio/voiceover/prologue_en/prologue_03.wav new file mode 100644 index 000000000..e92e97955 Binary files /dev/null and b/assets/audio/voiceover/prologue_en/prologue_03.wav differ diff --git a/assets/audio/voiceover/prologue_en/prologue_04.wav b/assets/audio/voiceover/prologue_en/prologue_04.wav new file mode 100644 index 000000000..da9da4d96 Binary files /dev/null and b/assets/audio/voiceover/prologue_en/prologue_04.wav differ diff --git a/assets/audio/voiceover/prologue_en/prologue_05.wav b/assets/audio/voiceover/prologue_en/prologue_05.wav new file mode 100644 index 000000000..1fc86fbe1 Binary files /dev/null and b/assets/audio/voiceover/prologue_en/prologue_05.wav differ diff --git a/assets/audio/voiceover/prologue_en/prologue_06.wav b/assets/audio/voiceover/prologue_en/prologue_06.wav new file mode 100644 index 000000000..d22132484 Binary files /dev/null and b/assets/audio/voiceover/prologue_en/prologue_06.wav differ diff --git a/assets/audio/voiceover/prologue_en/prologue_07.wav b/assets/audio/voiceover/prologue_en/prologue_07.wav new file mode 100644 index 000000000..74ba374cb Binary files /dev/null and b/assets/audio/voiceover/prologue_en/prologue_07.wav differ diff --git a/assets/audio/voiceover/prologue_en/prologue_08.wav b/assets/audio/voiceover/prologue_en/prologue_08.wav new file mode 100644 index 000000000..af0283878 Binary files /dev/null and b/assets/audio/voiceover/prologue_en/prologue_08.wav differ diff --git a/assets/audio/voiceover/prologue_en/prologue_09.wav b/assets/audio/voiceover/prologue_en/prologue_09.wav new file mode 100644 index 000000000..87ed09661 Binary files /dev/null and b/assets/audio/voiceover/prologue_en/prologue_09.wav differ diff --git a/assets/audio/voiceover/prologue_en/prologue_10.wav b/assets/audio/voiceover/prologue_en/prologue_10.wav new file mode 100644 index 000000000..c87232e46 Binary files /dev/null and b/assets/audio/voiceover/prologue_en/prologue_10.wav differ diff --git a/assets/audio/voiceover/prologue_en/prologue_11.wav b/assets/audio/voiceover/prologue_en/prologue_11.wav new file mode 100644 index 000000000..1311d465b Binary files /dev/null and b/assets/audio/voiceover/prologue_en/prologue_11.wav differ diff --git a/assets/audio/voiceover/prologue_en/prologue_12.wav b/assets/audio/voiceover/prologue_en/prologue_12.wav new file mode 100644 index 000000000..1644dc58d Binary files /dev/null and b/assets/audio/voiceover/prologue_en/prologue_12.wav differ diff --git a/assets/audio/voiceover/prologue_sl/prologue_01.wav b/assets/audio/voiceover/prologue_sl/prologue_01.wav new file mode 100644 index 000000000..60c0de2ad Binary files /dev/null and b/assets/audio/voiceover/prologue_sl/prologue_01.wav differ diff --git a/assets/audio/voiceover/prologue_sl/prologue_02.wav b/assets/audio/voiceover/prologue_sl/prologue_02.wav new file mode 100644 index 000000000..5b43052c2 Binary files /dev/null and b/assets/audio/voiceover/prologue_sl/prologue_02.wav differ diff --git a/assets/audio/voiceover/prologue_sl/prologue_03.wav b/assets/audio/voiceover/prologue_sl/prologue_03.wav new file mode 100644 index 000000000..f7d170bc5 Binary files /dev/null and b/assets/audio/voiceover/prologue_sl/prologue_03.wav differ diff --git a/assets/audio/voiceover/prologue_sl/prologue_04.wav b/assets/audio/voiceover/prologue_sl/prologue_04.wav new file mode 100644 index 000000000..105219eb7 Binary files /dev/null and b/assets/audio/voiceover/prologue_sl/prologue_04.wav differ diff --git a/assets/audio/voiceover/prologue_sl/prologue_05.wav b/assets/audio/voiceover/prologue_sl/prologue_05.wav new file mode 100644 index 000000000..04fc137b4 Binary files /dev/null and b/assets/audio/voiceover/prologue_sl/prologue_05.wav differ diff --git a/assets/audio/voiceover/prologue_sl/prologue_06.wav b/assets/audio/voiceover/prologue_sl/prologue_06.wav new file mode 100644 index 000000000..2a158f97c Binary files /dev/null and b/assets/audio/voiceover/prologue_sl/prologue_06.wav differ diff --git a/assets/audio/voiceover/prologue_sl/prologue_07.wav b/assets/audio/voiceover/prologue_sl/prologue_07.wav new file mode 100644 index 000000000..4fe5167a3 Binary files /dev/null and b/assets/audio/voiceover/prologue_sl/prologue_07.wav differ diff --git a/assets/audio/voiceover/prologue_sl/prologue_08.wav b/assets/audio/voiceover/prologue_sl/prologue_08.wav new file mode 100644 index 000000000..945b45691 Binary files /dev/null and b/assets/audio/voiceover/prologue_sl/prologue_08.wav differ diff --git a/assets/audio/voiceover/prologue_sl/prologue_09.wav b/assets/audio/voiceover/prologue_sl/prologue_09.wav new file mode 100644 index 000000000..2b5e5a2ee Binary files /dev/null and b/assets/audio/voiceover/prologue_sl/prologue_09.wav differ diff --git a/assets/audio/voiceover/prologue_sl/prologue_10.wav b/assets/audio/voiceover/prologue_sl/prologue_10.wav new file mode 100644 index 000000000..bc7bfc25c Binary files /dev/null and b/assets/audio/voiceover/prologue_sl/prologue_10.wav differ diff --git a/assets/audio/voiceover/prologue_sl/prologue_11.wav b/assets/audio/voiceover/prologue_sl/prologue_11.wav new file mode 100644 index 000000000..2f7b532ec Binary files /dev/null and b/assets/audio/voiceover/prologue_sl/prologue_11.wav differ diff --git a/assets/audio/voiceover/prologue_sl/prologue_12.wav b/assets/audio/voiceover/prologue_sl/prologue_12.wav new file mode 100644 index 000000000..02a729b8d Binary files /dev/null and b/assets/audio/voiceover/prologue_sl/prologue_12.wav differ diff --git a/scripts/complete_asset_audit.py b/scripts/complete_asset_audit.py new file mode 100755 index 000000000..fea48997b --- /dev/null +++ b/scripts/complete_asset_audit.py @@ -0,0 +1,221 @@ +#!/usr/bin/env python3 +""" +Complete Asset Audit Script +Systematically checks ALL assets vs documentation +""" + +import os +from pathlib import Path +from collections import defaultdict + +# Base paths +REPO_ROOT = Path("/Users/davidkotnik/repos/novafarma") +ASSETS_REF = REPO_ROOT / "assets" / "references" + +# Expected counts from DEMO_FAZA1_FAZA2_OVERVIEW.md +EXPECTED = { + "characters": { + "kai": 21, # idle(5) + walk(6) + dig(5) + swing(5) + "ana": 10, # idle(4) + walk(6) + "gronk": 10, # idle(4) + walk(6) + }, + "companions": { + "susi": 12, # idle(4) + run(6) + bark(2) + }, + "zombies": 45, # 3 types ร— 15 frames each + "crops": { + "wheat": 5, + "carrot": 5, + "tomato": 5, + "potato": 5, + "corn": 5, + }, + "tools": 8, + "ui": 28, + "grassland": 27, +} + +def count_pngs(directory): + """Count PNG files in directory recursively""" + if not directory.exists(): + return 0 + return len(list(directory.rglob("*.png"))) + +def audit_characters(): + """Audit main characters""" + print("\n## 1. MAIN CHARACTERS") + print("=" * 60) + + char_path = ASSETS_REF / "main_characters" + results = {} + + for char in ["kai", "ana", "gronk"]: + char_dir = char_path / char + actual = count_pngs(char_dir) + expected = EXPECTED["characters"][char] + status = "โœ…" if actual >= expected else "โŒ" + gap = actual - expected + + results[char] = { + "expected": expected, + "actual": actual, + "status": status, + "gap": gap + } + + print(f"\n{char.upper()}:") + print(f" Expected: {expected}") + print(f" Actual: {actual}") + print(f" Status: {status} ({'+' if gap >= 0 else ''}{gap})") + + return results + +def audit_companions(): + """Audit companion animals""" + print("\n## 2. COMPANIONS") + print("=" * 60) + + comp_path = ASSETS_REF / "companions" + results = {} + + for comp in ["susi"]: + comp_dir = comp_path / comp + actual = count_pngs(comp_dir) + expected = EXPECTED["companions"][comp] + status = "โœ…" if actual >= expected else "โŒ" + gap = actual - expected + + results[comp] = { + "expected": expected, + "actual": actual, + "status": status, + "gap": gap + } + + print(f"\n{comp.upper()}:") + print(f" Expected: {expected}") + print(f" Actual: {actual}") + print(f" Status: {status} ({'+' if gap >= 0 else ''}{gap})") + + return results + +def audit_crops(): + """Audit crop growth stages""" + print("\n## 3. CROPS") + print("=" * 60) + + crops_path = ASSETS_REF / "crops" + results = {} + + for crop in ["wheat", "carrot", "tomato", "potato", "corn"]: + crop_dir = crops_path / crop / "growth_stages" + actual = count_pngs(crop_dir) + expected = EXPECTED["crops"][crop] + status = "โœ…" if actual >= expected else "โŒ" + gap = actual - expected + + results[crop] = { + "expected": expected, + "actual": actual, + "status": status, + "gap": gap + } + + print(f"\n{crop.upper()}:") + print(f" Expected: {expected}") + print(f" Actual: {actual}") + print(f" Status: {status} ({'+' if gap >= 0 else ''}{gap})") + + return results + +def audit_audio(): + """Audit audio files""" + print("\n## 4. AUDIO") + print("=" * 60) + + audio_path = ASSETS_REF.parent / "audio" + + # Count voice files + voices = audio_path / "voices" + voice_count = len(list(voices.rglob("*.mp3"))) if voices.exists() else 0 + + # Count sound effects + sfx = audio_path / "sfx" + sfx_count = len(list(sfx.rglob("*.wav"))) if sfx.exists() else 0 + + # Count music + music_path = REPO_ROOT / "music" + music_count = len(list(music_path.rglob("*.mp3"))) if music_path.exists() else 0 + music_count += len(list(music_path.rglob("*.wav"))) if music_path.exists() else 0 + music_count += len(list(music_path.rglob("*.ogg"))) if music_path.exists() else 0 + + print(f"\nVOICES (MP3): {voice_count}") + print(f"SOUND EFFECTS (WAV): {sfx_count}") + print(f"MUSIC: {music_count} {'โŒ MISSING!' if music_count == 0 else 'โœ…'}") + + return { + "voices": voice_count, + "sfx": sfx_count, + "music": music_count + } + +def generate_report(): + """Generate complete audit report""" + print("\n" + "="*60) + print("๐Ÿ” COMPLETE ASSET AUDIT - JAN 8, 2026") + print("="*60) + + # Run all audits + chars = audit_characters() + comps = audit_companions() + crops = audit_crops() + audio = audit_audio() + + # Summary + print("\n" + "="*60) + print("๐Ÿ“Š SUMMARY") + print("="*60) + + total_expected = sum(EXPECTED["characters"].values()) + total_expected += sum(EXPECTED["companions"].values()) + total_expected += sum(EXPECTED["crops"].values()) + total_expected += EXPECTED["zombies"] + total_expected += EXPECTED["tools"] + total_expected += EXPECTED["ui"] + + total_actual = count_pngs(ASSETS_REF) + + print(f"\nTOTAL PNG FILES: {total_actual}") + print(f"AUDIO FILES: {audio['voices'] + audio['sfx'] + audio['music']}") + print(f" - Voices: {audio['voices']}") + print(f" - SFX: {audio['sfx']}") + print(f" - Music: {audio['music']} {'โŒ' if audio['music'] == 0 else 'โœ…'}") + + # Missing items + print("\n" + "="*60) + print("โŒ MISSING / NEEDS ATTENTION") + print("="*60) + + missing = [] + + for char, data in chars.items(): + if data['gap'] < 0: + missing.append(f" - {char.upper()}: {abs(data['gap'])} sprites short") + + for crop, data in crops.items(): + if data['gap'] < 0: + missing.append(f" - {crop.upper()}: {abs(data['gap'])} sprites short") + + if audio['music'] == 0: + missing.append(f" - MUSIC: Need 3+ background tracks") + + if missing: + for item in missing: + print(item) + else: + print(" โœ… ALL ASSETS COMPLETE!") + + print("\n" + "="*60) + +if __name__ == "__main__": + generate_report() diff --git a/scripts/convert_audio_to_ogg.py b/scripts/convert_audio_to_ogg.py new file mode 100755 index 000000000..db0836b64 --- /dev/null +++ b/scripts/convert_audio_to_ogg.py @@ -0,0 +1,203 @@ +#!/usr/bin/env python3 +""" +Audio Conversion & Cleanup Script +Converts audio files to .ogg, removes placeholders, verifies integrity +""" + +import os +import subprocess +from pathlib import Path + +REPO_ROOT = Path("/Users/davidkotnik/repos/novafarma") +AUDIO_ROOT = REPO_ROOT / "assets" / "audio" + +def remove_txt_placeholders(): + """Remove all .txt placeholder files""" + print("\n๐Ÿ—‘๏ธ Removing .txt placeholders...") + + txt_files = list(AUDIO_ROOT.rglob("*.txt")) + for txt_file in txt_files: + txt_file.unlink() + print(f" โœ… Removed: {txt_file.name}") + + print(f"\nโœ… Removed {len(txt_files)} placeholder files") + +def convert_to_ogg(): + """Convert all MP3/WAV to OGG using ffmpeg""" + print("\n๐Ÿ”„ Converting audio files to .ogg...") + + # Find all MP3 and WAV files + audio_files = [] + audio_files.extend(AUDIO_ROOT.rglob("*.mp3")) + audio_files.extend(AUDIO_ROOT.rglob("*.wav")) + + converted = 0 + for audio_file in audio_files: + ogg_file = audio_file.with_suffix(".ogg") + + # Skip if .ogg already exists + if ogg_file.exists(): + print(f" โญ๏ธ Skip: {ogg_file.name} (exists)") + continue + + # Convert using ffmpeg + try: + cmd = [ + "ffmpeg", + "-i", str(audio_file), + "-c:a", "libvorbis", + "-q:a", "6", # Quality 6 (good balance) + str(ogg_file) + ] + + result = subprocess.run( + cmd, + capture_output=True, + text=True + ) + + if result.returncode == 0: + print(f" โœ… Converted: {audio_file.name} โ†’ {ogg_file.name}") + converted += 1 + else: + print(f" โŒ Failed: {audio_file.name}") + print(f" Error: {result.stderr[:100]}") + + except FileNotFoundError: + print("\nโŒ ERROR: ffmpeg not found!") + print("Install with: brew install ffmpeg") + return False + + print(f"\nโœ… Converted {converted} files to .ogg") + return True + +def verify_audio(): + """Verify all audio files exist and are valid""" + print("\n๐Ÿ” Verifying audio files...") + + # Expected files from manifest + expected = { + "sfx/farming": ["cow_moo", "dig", "harvest", "plant_seed", "scythe_swing", "stone_mine", "tree_chop", "water_crop"], + "sfx/combat": ["bow_release", "explosion", "player_hurt", "raider_attack", "shield_block", "sword_slash", "zombie_death", "zombie_hit"], + "sfx/building": ["chest_open", "door_close", "door_open", "hammer_nail", "repair"], + "sfx/misc": ["coin_collect", "footstep_grass", "footstep_stone", "level_up"], + "music": ["main_theme", "farm_ambient", "town_theme", "combat_theme", "night_theme", "victory_theme", "raid_warning", "ana_theme", "forest_ambient"], + } + + missing = [] + found = [] + + for category, files in expected.items(): + category_path = AUDIO_ROOT / category + + for filename in files: + # Check both .ogg and original formats + ogg_file = category_path / f"{filename}.ogg" + mp3_file = category_path / f"{filename}.mp3" + wav_file = category_path / f"{filename}.wav" + + if ogg_file.exists(): + size = ogg_file.stat().st_size + if size > 1000: # At least 1KB + found.append(str(ogg_file.relative_to(AUDIO_ROOT))) + else: + missing.append(f"{category}/{filename}.ogg (too small: {size}B)") + elif mp3_file.exists() or wav_file.exists(): + found.append(f"{category}/{filename} (needs conversion)") + else: + missing.append(f"{category}/{filename}.ogg") + + print(f"\nโœ… Found: {len(found)} files") + print(f"โŒ Missing: {len(missing)} files") + + if missing: + print("\nโŒ MISSING FILES:") + for file in missing[:10]: # Show first 10 + print(f" - {file}") + if len(missing) > 10: + print(f" ... and {len(missing) - 10} more") + + return len(missing) == 0 + +def generate_manifest(): + """Generate audio file manifest for Phaser preload""" + print("\n๐Ÿ“ Generating audio manifest...") + + manifest = { + "sfx": {}, + "music": {}, + "voices": {} + } + + # Scan SFX + sfx_path = AUDIO_ROOT / "sfx" + for ogg_file in sfx_path.rglob("*.ogg"): + category = ogg_file.parent.name + filename = ogg_file.stem + + if category not in manifest["sfx"]: + manifest["sfx"][category] = [] + + manifest["sfx"][category].append({ + "key": f"{category}_{filename}", + "path": str(ogg_file.relative_to(AUDIO_ROOT.parent)) + }) + + # Scan Music + music_path = AUDIO_ROOT / "music" + for audio_file in music_path.glob("*"): + if audio_file.suffix in [".ogg", ".mp3"]: + manifest["music"][audio_file.stem] = { + "key": audio_file.stem, + "path": str(audio_file.relative_to(AUDIO_ROOT.parent)) + } + + # Scan Voices + voices_path = AUDIO_ROOT / "voices" + for char_dir in voices_path.iterdir(): + if char_dir.is_dir(): + manifest["voices"][char_dir.name] = [] + for mp3_file in char_dir.glob("*.mp3"): + manifest["voices"][char_dir.name].append({ + "key": f"{char_dir.name}_{mp3_file.stem}", + "path": str(mp3_file.relative_to(AUDIO_ROOT.parent)) + }) + + # Write manifest + manifest_file = REPO_ROOT / "src" / "data" / "audioManifest.json" + import json + + manifest_file.parent.mkdir(parents=True, exist_ok=True) + with open(manifest_file, 'w') as f: + json.dump(manifest, f, indent=2) + + print(f"โœ… Manifest written to: {manifest_file}") + print(f" - SFX categories: {len(manifest['sfx'])}") + print(f" - Music tracks: {len(manifest['music'])}") + print(f" - Voice characters: {len(manifest['voices'])}") + +def main(): + """Run all audio processing tasks""" + print("="*60) + print("๐ŸŽต AUDIO CONVERSION & CLEANUP") + print("="*60) + + # Step 1: Remove placeholders + remove_txt_placeholders() + + # Step 2: Convert to OGG + if not convert_to_ogg(): + return + + # Step 3: Verify + verify_audio() + + # Step 4: Generate manifest + generate_manifest() + + print("\n" + "="*60) + print("โœ… AUDIO PROCESSING COMPLETE!") + print("="*60) + +if __name__ == "__main__": + main()