✅ 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
187 lines
6.3 KiB
Python
187 lines
6.3 KiB
Python
#!/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()
|