#!/usr/bin/env python3 """ Analyze Dino Valley missing assets Compares manifest vs actual files Generates missing asset list for Vertex AI generation """ import os import json from pathlib import Path # Dino Valley full specification from ALL_BIOMES_COMPLETE_BREAKDOWN.md DINO_VALLEY_SPEC = { "fauna": { "count": 16, # 32 PNG (16 types × 2 styles) "items": [ "tyrannosaurus_rex", "triceratops", "velociraptor", "stegosaurus", "brachiosaurus", "pterodactyl", "ankylosaurus", "parasaurolophus", "dilophosaurus", "spinosaurus", "iguanodon", "archaeopteryx", "compsognathus", "plesiosaurus", "mosasaurus", "carnotaurus" ] }, "teren": { "count": 8, # 16 PNG (8 types × 2 styles) "items": [ "dino_volcanic_rock", "dino_lava_cracks", "dino_prehistoric_grass", "dino_dirt_brown", "dino_volcanic_ash", "dino_hot_springs", "dino_tar_pit", "dino_fossilized_ground" ] }, "vegetacija": { "count": 10, # 20 PNG (10 types × 2 styles) "items": [ "dino_giant_fern_large", "dino_giant_fern_medium", "dino_fern_small", "dino_cycad", "dino_palm_tree", "dino_giant_mushroom", "dino_prehistoric_vine", "dino_horsetail", "dino_tree_fern", "dino_ginkgo_tree" ] }, "rekviziti": { "count": 20, # 40 PNG (20 types × 2 styles) "items": [ "dino_skull", "dino_bones_pile", "dino_ribcage", "dino_nest", "dino_eggs", "fossil_amber", "fossil_trilobite", "fossil_ammonite", "volcanic_rock_large", "lava_pool", "steam_vent", "tar_bubble", "cave_entrance", "ancient_ruins_pillar", "ancient_ruins_altar", "dino_footprint", "prehistoric_log", "crystal_formation", "geothermal_spring", "obsidian_shard" ] }, "zgradbe": { "count": 4, # 8 PNG (4 types × 2 styles) "items": [ "dino_research_station", "dino_cave_dwelling", "dino_observation_tower", "dino_fossil_excavation_site" ] }, "hrana": { "count": 16, # 32 PNG (16 types × 2 styles) "items": [ "dino_meat_raw", "dino_meat_cooked", "dino_egg_raw", "dino_egg_cooked", "prehistoric_berries", "cycad_fruit", "fern_shoots", "mushroom_caps", "tar_honey", "volcanic_salt", "mineral_water", "bone_broth", "smoked_meat", "dried_berries", "roasted_nuts", "herbal_tea" ] }, "materiali": { "count": 9, # 18 PNG (9 types × 2 styles) "items": [ "dino_bone", "dino_hide", "dino_tooth", "amber_chunk", "obsidian", "volcanic_glass", "fossil_fuel", "tar", "sulfur" ] }, "oblacila": { "count": 8, # 16 PNG (8 types × 2 styles) "items": [ "dino_hide_vest", "dino_hide_pants", "dino_hide_boots", "dino_tooth_necklace", "amber_pendant", "bone_helmet", "hide_gloves", "volcanic_goggles" ] }, "orodja": { "count": 10, # 20 PNG (10 types × 2 styles) "items": [ "bone_pickaxe", "bone_axe", "bone_sword", "bone_spear", "obsidian_knife", "volcanic_hammer", "tar_torch", "fossil_brush", "hide_backpack", "bone_fishing_rod" ] }, "npcs": { "count": 5, # 10 PNG (5 types × 2 styles) "items": [ "paleontologist", "cave_dweller_male", "cave_dweller_female", "dino_keeper", "fossil_trader" ] } } BASE_PATH = Path("/Users/davidkotnik/repos/novafarma/assets/slike/biomi/dino_valley") def scan_existing_assets(): """Scan existing PNG files in Dino Valley""" existing = { "fauna": [], "teren": [], "vegetacija": [], "rekviziti": [], "zgradbe": [], "hrana": [], "materiali": [], "oblacila": [], "orodja": [], "npcs": [] } for category in existing.keys(): category_path = BASE_PATH / category if category_path.exists(): for file in category_path.glob("*.png"): # Extract base name without _styleA / _styleB suffix name = file.stem if name.endswith("_stylea") or name.endswith("_styleb"): base_name = name.rsplit("_", 1)[0] else: base_name = name if base_name not in existing[category]: existing[category].append(base_name) return existing def find_missing_assets(): """Compare spec vs existing, return missing list""" existing = scan_existing_assets() missing = {} for category, spec in DINO_VALLEY_SPEC.items(): missing[category] = { "items": [], "total_png_needed": 0 } for item in spec["items"]: if item not in existing[category]: missing[category]["items"].append(item) # Each item needs 2 PNG (Style A + B) missing[category]["total_png_needed"] = len(missing[category]["items"]) * 2 return missing def generate_report(): """Generate detailed missing assets report""" missing = find_missing_assets() total_missing_items = sum(len(cat["items"]) for cat in missing.values()) total_missing_png = sum(cat["total_png_needed"] for cat in missing.values()) print("=" * 60) print("DINO VALLEY MISSING ASSETS REPORT") print("=" * 60) print() for category, data in missing.items(): if data["items"]: print(f"📁 {category.upper()} - {data['total_png_needed']} PNG needed") for item in data["items"]: print(f" ❌ {item}") print() print("=" * 60) print(f"TOTAL MISSING ITEMS: {total_missing_items}") print(f"TOTAL MISSING PNG: {total_missing_png} (including both styles)") print("=" * 60) # Save to JSON for next script output_file = Path("/Users/davidkotnik/repos/novafarma/scripts/dino_valley_missing.json") with open(output_file, 'w') as f: json.dump(missing, f, indent=2) print(f"\n✅ Report saved to: {output_file}") return missing if __name__ == "__main__": generate_report()