Files
novafarma/scripts/analyze_dino_valley_missing.py
David Kotnik cc462ce894 🎨 Day 8: Multi-Style Decision + Game Bible Complete
 COMPLETED:
- 80-style aesthetic search concluded
- Multi-style approach approved (5 styles)
- 40 category test assets generated
- Style 32 (Cult of Lamb) selected for main characters
- Complete Game Design Bible created
- Gronk, Ana, Susi characters generated

📄 NEW FILES:
- GAME_BIBLE_COMPLETE.md (full design doc)
- MULTI_STYLE_TEST_RESULTS_JAN_02_2026.md
- PRODUCTION_DIARY_JAN_02_2026.md

🎯 NEXT: Begin bulk asset production with multi-style diversity
2026-01-02 04:45:11 +01:00

187 lines
6.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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()