Files
novafarma/scripts/generate_world_expansion_assets.py

423 lines
14 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
"""
WORLD EXPANSION ASSET GENERATOR
Generates Phase 1 assets for Town Restoration, Zombie Scout, and Nomad Raiders systems.
Total Phase 1 Assets: ~80 sprites
- 48 Town buildings (3 towns × 8 buildings × 2 states)
- 8 Zombie Scout sprites (base form)
- 20 Raider sprites (Desert Nomads)
- 4 Camp structures
"""
# PHASE 1: SAMPLE TOWNS (3 biomes)
TOWN_BUILDINGS = {
"forest_town": {
"biome": "Temperate Forest",
"style": "Wooden cabins, thatched roofs, brown/green palette",
"buildings": [
{
"name": "town_hall",
"size": "64x64",
"states": ["ruined", "restored"],
"description": "Main building, two-story wooden structure"
},
{
"name": "trading_post",
"size": "48x48",
"states": ["ruined", "restored"],
"description": "Merchant shop with counter and shelves"
},
{
"name": "inn",
"size": "64x48",
"states": ["ruined", "restored"],
"description": "Small hotel, beds visible through windows"
},
{
"name": "blacksmith",
"size": "48x48",
"states": ["ruined", "restored"],
"description": "Forge with chimney, anvil outside"
},
{
"name": "general_store",
"size": "48x48",
"states": ["ruined", "restored"],
"description": "Shop with barrels and crates"
},
{
"name": "guard_tower",
"size": "32x64",
"states": ["ruined", "restored"],
"description": "Tall wooden watchtower"
},
{
"name": "farm_school",
"size": "64x48",
"states": ["ruined", "restored"],
"description": "Greenhouse-like structure, crop displays"
},
{
"name": "town_gate",
"size": "64x48",
"states": ["ruined", "restored"],
"description": "Main entrance with wooden arch"
}
]
},
"desert_town": {
"biome": "Desert Storm",
"style": "Sandstone domes, flat roofs, tan/gold palette",
"buildings": [
{
"name": "town_hall",
"size": "64x64",
"states": ["ruined", "restored"],
"description": "Domed sandstone palace, market stalls"
},
{
"name": "trading_post",
"size": "48x48",
"states": ["ruined", "restored"],
"description": "Bazaar with canopy, spice barrels"
},
{
"name": "inn",
"size": "64x48",
"states": ["ruined", "restored"],
"description": "Caravanserai, courtyard visible"
},
{
"name": "blacksmith",
"size": "48x48",
"states": ["ruined", "restored"],
"description": "Stone forge, bellows, scimitar display"
},
{
"name": "general_store",
"size": "48x48",
"states": ["ruined", "restored"],
"description": "Market stall with pottery and cloth"
},
{
"name": "guard_tower",
"size": "32x64",
"states": ["ruined", "restored"],
"description": "Minaret-style watchtower"
},
{
"name": "farm_school",
"size": "64x48",
"states": ["ruined", "restored"],
"description": "Oasis garden, palm trees"
},
{
"name": "town_gate",
"size": "64x48",
"states": ["ruined", "restored"],
"description": "Arched sandstone gate with carvings"
}
]
},
"frozen_town": {
"biome": "Frozen Wasteland",
"style": "Ice/metal buildings, flat roofs, white/blue palette",
"buildings": [
{
"name": "town_hall",
"size": "64x64",
"states": ["ruined", "restored"],
"description": "Ice palace, metal reinforcements, icicles"
},
{
"name": "trading_post",
"size": "48x48",
"states": ["ruined", "restored"],
"description": "Igloo shop, fur pelts visible"
},
{
"name": "inn",
"size": "64x48",
"states": ["ruined", "restored"],
"description": "Warm lodge, smoke from chimney"
},
{
"name": "blacksmith",
"size": "48x48",
"states": ["ruined", "restored"],
"description": "Ice forge, blue flame, frost weapons"
},
{
"name": "general_store",
"size": "48x48",
"states": ["ruined", "restored"],
"description": "Supply depot, crates and barrels"
},
{
"name": "guard_tower",
"size": "32x64",
"states": ["ruined", "restored"],
"description": "Metal tower, frozen flag on top"
},
{
"name": "farm_school",
"size": "64x48",
"states": ["ruined", "restored"],
"description": "Heated greenhouse, frost-resistant crops"
},
{
"name": "town_gate",
"size": "64x48",
"states": ["ruined", "restored"],
"description": "Ice arch gate with metal spikes"
}
]
}
}
# ZOMBIE SCOUT SPRITES
ZOMBIE_SCOUT = {
"base_form": [
{
"name": "scout_idle_down",
"size": "32x32",
"description": "Zombie scout idle facing down, blue bandana, backpack, red eyes with pupils, friendly pose"
},
{
"name": "scout_idle_up",
"size": "32x32",
"description": "Zombie scout idle facing up, blue bandana visible, backpack, friendly pose"
},
{
"name": "scout_idle_left",
"size": "32x32",
"description": "Zombie scout idle facing left, blue bandana, side view, backpack visible"
},
{
"name": "scout_idle_right",
"size": "32x32",
"description": "Zombie scout idle facing right, blue bandana, side view, backpack visible"
},
{
"name": "scout_walking_down",
"size": "32x32",
"description": "Zombie scout walking down, one leg forward, blue bandana"
},
{
"name": "scout_walking_up",
"size": "32x32",
"description": "Zombie scout walking up, one leg forward, backpack bouncing"
},
{
"name": "scout_pointing",
"size": "32x32",
"description": "Zombie scout pointing at discovery, excited pose, blue bandana"
},
{
"name": "scout_digging",
"size": "32x32",
"description": "Zombie scout digging ground, bent over, finding item, backpack"
}
]
}
# NOMAD RAIDERS - DESERT NOMADS
DESERT_RAIDERS = {
"units": [
{
"name": "nomad_warrior_idle",
"size": "32x32",
"description": "Desert nomad warrior idle, tan robes, scimitar, turban, Style 32"
},
{
"name": "nomad_warrior_attack",
"size": "32x32",
"description": "Desert nomad warrior attacking, scimitar raised, aggressive"
},
{
"name": "nomad_archer_idle",
"size": "32x32",
"description": "Desert nomad archer idle, bow, quiver, tan clothing"
},
{
"name": "nomad_archer_shoot",
"size": "32x32",
"description": "Desert nomad archer shooting arrow, bow drawn"
},
{
"name": "nomad_scout_idle",
"size": "32x32",
"description": "Desert nomad scout, lighter armor, dagger, lookout pose"
},
{
"name": "nomad_scout_run",
"size": "32x32",
"description": "Desert nomad scout running, fast movement"
},
{
"name": "nomad_brute_idle",
"size": "32x32",
"description": "Desert nomad brute, heavy armor, large axe, intimidating"
},
{
"name": "nomad_brute_smash",
"size": "32x32",
"description": "Desert nomad brute smashing with axe, powerful attack"
},
{
"name": "nomad_leader_idle",
"size": "32x32",
"description": "Desert nomad leader, ornate robes, golden scimitar, commander"
},
{
"name": "nomad_leader_command",
"size": "32x32",
"description": "Desert nomad leader giving orders, raised hand"
}
],
"camps": [
{
"name": "nomad_tent_large",
"size": "48x48",
"description": "Large desert tent, tan fabric, ropes, entrance visible"
},
{
"name": "nomad_tent_small",
"size": "32x32",
"description": "Small desert tent, simple structure, bedroll inside"
},
{
"name": "nomad_campfire",
"size": "32x32",
"description": "Desert campfire, burning logs, cooking pot, sand circle"
},
{
"name": "nomad_loot_chest",
"size": "32x32",
"description": "Raider loot chest, locked box, gold trim, treasures"
}
]
}
# GENERATION MANIFEST
def generate_manifest():
"""Generate complete asset manifest for Phase 1."""
manifest = {
"phase": 1,
"total_assets": 0,
"categories": {}
}
# Count town buildings
town_count = 0
for town_key, town_data in TOWN_BUILDINGS.items():
for building in town_data["buildings"]:
town_count += len(building["states"]) # ruined + restored
manifest["categories"]["towns"] = town_count
# Count scout sprites
manifest["categories"]["zombie_scout"] = len(ZOMBIE_SCOUT["base_form"])
# Count raider sprites
raider_count = len(DESERT_RAIDERS["units"]) + len(DESERT_RAIDERS["camps"])
manifest["categories"]["nomad_raiders"] = raider_count
# Total
manifest["total_assets"] = sum(manifest["categories"].values())
return manifest
# PROMPT GENERATOR
def generate_prompts():
"""Generate all Style 32 prompts for asset generation."""
prompts = []
# TOWN BUILDINGS
for town_key, town_data in TOWN_BUILDINGS.items():
biome = town_data["biome"]
style = town_data["style"]
for building in town_data["buildings"]:
for state in building["states"]:
prompt = {
"category": "town_building",
"town": town_key,
"building": building["name"],
"state": state,
"size": building["size"],
"prompt": f"{state.capitalize()} {building['name']} in {biome} biome, {style}, {building['description']}, "
f"{'collapsed walls broken windows debris' if state == 'ruined' else 'restored clean functional'}, "
f"Style 32 Dark-Chibi Noir, thick black outlines, top-down view, {building['size']}px, green background"
}
prompts.append(prompt)
# ZOMBIE SCOUT
for sprite in ZOMBIE_SCOUT["base_form"]:
prompt = {
"category": "zombie_scout",
"name": sprite["name"],
"size": sprite["size"],
"prompt": f"{sprite['description']}, Style 32 Dark-Chibi Noir, thick black outlines, chibi proportions, "
f"{sprite['size']}px, green background"
}
prompts.append(prompt)
# NOMAD RAIDERS
for unit in DESERT_RAIDERS["units"]:
prompt = {
"category": "nomad_raider",
"type": "unit",
"name": unit["name"],
"size": unit["size"],
"prompt": f"{unit['description']}, thick black outlines, chibi proportions, {unit['size']}px, green background"
}
prompts.append(prompt)
for camp in DESERT_RAIDERS["camps"]:
prompt = {
"category": "nomad_raider",
"type": "camp",
"name": camp["name"],
"size": camp["size"],
"prompt": f"{camp['description']}, Style 32 Dark-Chibi Noir, thick black outlines, top-down view, "
f"{camp['size']}px, green background"
}
prompts.append(prompt)
return prompts
if __name__ == "__main__":
import json
# Generate manifest
manifest = generate_manifest()
print("=" * 60)
print("WORLD EXPANSION - PHASE 1 MANIFEST")
print("=" * 60)
print(f"\nTotal Assets: {manifest['total_assets']}")
print(f"\nBreakdown:")
for category, count in manifest["categories"].items():
print(f" - {category}: {count} sprites")
# Generate prompts
prompts = generate_prompts()
# Save to JSON
output = {
"manifest": manifest,
"prompts": prompts
}
with open("world_expansion_phase1.json", "w", encoding="utf-8") as f:
json.dump(output, f, indent=2, ensure_ascii=False)
print(f"\n✅ Generated {len(prompts)} prompts")
print(f"📝 Saved to: world_expansion_phase1.json")
print("\n" + "=" * 60)