#!/usr/bin/env python3 """ πŸ”₯ DOLINA SMRTI V6.0 - FINALNI GENERATOR Post-Apocalyptic Dark Survival Style 9000+ Assets - NO anime, NO pixel art, NO voxels """ import os import json import time import uuid import requests from pathlib import Path from typing import List, Dict # Configuration COMFYUI_URL = "http://127.0.0.1:8000" OUTPUT_DIR = "/Users/davidkotnik/repos/novafarma/assets/images" # ============================================================================ # DARK SURVIVAL STYLE - V6.0 FINAL # ============================================================================ STYLE_PREFIX = """cinematic 2d game asset, hand-drawn dark survival style, detailed textures, weathered post-apocalyptic, industrial decay, realistic proportions, gritty atmosphere, rust and dirt color palette, overgrown nature, concrete ruins, sharp details, serious tone, isolated on transparent background with alpha channel, """ NEGATIVE_PROMPT = """anime, manga, cute, bright colors, kawaii, pixelated, pixel art, voxel, 3d render, cartoonish, childish, chibi, happy, cheerful, colorful, clean, pristine, shiny, watermark, text, signature, blurry, low quality, white background, solid background""" # ============================================================================ # DOLINA SMRTI V6.0 - MASTER REGISTRY # ============================================================================ def generate_v6_registry() -> List[Dict]: """Generate complete Dolina Smrti V6.0 asset registry""" assets = [] # ======================================================================== # 1. GLAVNI TRIO - Main Characters with Animations # ======================================================================== main_chars = [ # KAI MARKOVIΔ† - Protagonist ("kai_markovic", """Kai Markovic protagonist, young adult male survivor, PINK and GREEN dreadlocks hair, stretched earlobes with large plugs gauges, facial piercings nose and lip, dirty worn blue jacket, serious hybrid expression, post-apocalyptic survivor clothing, determined look, 64px character sprite"""), # GRONK (GROK) - Ally Troll ("gronk_troll", """Gronk the massive zen troll, huge green-grey skin creature, long dreadlocks hair, PINK stretched earlobes with large plugs, facial piercings, holding golden vape device with smoke coming out, peaceful wise expression despite size, post-apocalyptic tribal clothing, 96px character sprite"""), # VIKTOR KRNIΔ† - Villain ("viktor_krnic", """Viktor Krnic military villain antagonist, sharp dangerous look, post-apocalyptic military commander uniform, scars, cruel expression, tactical gear, medals and insignia, authority figure, threatening pose, 64px character sprite"""), ] # Add main characters for name, prompt in main_chars: assets.append({"cat": "npcs", "file": f"{name}.png", "prompt": prompt}) # Animation frames for each direction for direction in ["front", "back", "left", "right"]: for action in ["idle1", "idle2", "walk1", "walk2", "walk3", "walk4", "work1", "work2"]: assets.append({ "cat": "npcs", "file": f"{name}_{direction}_{action}.png", "prompt": f"{prompt}, {direction} facing view, {action} animation frame, smooth animation" }) # ======================================================================== # 2. SECONDARY NPCs (~50) # ======================================================================== secondary_npcs = [ ("survivor_scavenger", "scavenger survivor, gas mask, heavy backpack, layered dirty clothing, 48px"), ("survivor_soldier", "ex-military survivor, tactical gear, worn camouflage, 48px"), ("survivor_medic", "field medic survivor, bloodstained coat, medical bag, 48px"), ("survivor_mechanic", "mechanic survivor, oil-stained overalls, wrench, goggles, 48px"), ("survivor_farmer", "apocalypse farmer, patched clothing, improvised tools, 48px"), ("survivor_trader", "wasteland trader, cart goods, protective clothing, 48px"), ("survivor_hunter", "wasteland hunter, animal pelts, crossbow, 48px"), ("survivor_elder", "old survivor, scars, walking stick, wise, 48px"), ("survivor_child", "young survivor, oversized clothes, dirty, 48px"), ("raider_basic", "raider bandit, leather armor spikes, makeshift weapon, 48px"), ("raider_chief", "raider boss, intimidating armor, brutal, 64px"), ("bandit_sniper", "wasteland sniper, camouflage, rifle, 48px"), ("cultist_member", "apocalypse cultist, robes strange symbols, 48px"), ("cultist_leader", "cult leader, ornate robes staff, 64px"), ("scientist_bunker", "bunker scientist, hazmat suit, 48px"), ("doctor_wasteland", "wasteland doctor, surgical tools, 48px"), ("blacksmith_post", "post-apocalyptic blacksmith, forge apron, 48px"), ("radio_operator", "radio operator, headphones, 48px"), ] for name, prompt in secondary_npcs: assets.append({"cat": "npcs", "file": f"{name}.png", "prompt": prompt}) # ======================================================================== # 3. MUTANTS & MONSTERS (~100) # ======================================================================== mutants = [ # Zombies ("zombie_fresh", "freshly turned zombie, recent victim, bloody shambling, 48px"), ("zombie_rotten", "decomposed zombie, exposed bones, slow, 48px"), ("zombie_bloated", "bloated zombie, toxic gas, swollen, 48px"), ("zombie_crawler", "legless zombie, crawling grasping, 32px"), ("zombie_runner", "fast zombie, sprinting aggressive, 48px"), ("zombie_screamer", "screamer zombie, alerting open mouth, 48px"), ("zombie_giant", "giant zombie, massive strong terrifying, 96px"), ("zombie_armored", "armored zombie, riot gear, tough, 48px"), # Radiation Mutants ("mutant_humanoid", "mutated human, extra limbs radiation burns, 64px"), ("mutant_dog", "mutated dog, hairless sores pack hunter, 48px"), ("mutant_rat_giant", "giant mutant rat size of dog diseased, 48px"), ("mutant_crow", "mutant crow, large intelligent circling, 32px"), ("mutant_boar", "mutated boar, tusks armored hide, 64px"), ("mutant_wolf", "mutated wolf, glowing eyes pack alpha, 64px"), ("mutant_bear", "irradiated bear, massive unstoppable, 96px"), ("mutant_spider", "giant mutant spider, eight legs web, 64px"), ("mutant_snake", "mutant snake, elongated venomous, 48px"), # Anomalies ("anomaly_shadow", "shadow anomaly, darkness flickering, 64px"), ("anomaly_electric", "electric anomaly, crackling energy, 64px"), ("anomaly_fire", "fire anomaly, burning spreading, 64px"), ("anomaly_acid", "acid pool anomaly, bubbling corrosive, 64px"), ] for name, prompt in mutants: assets.append({"cat": "mutanti", "file": f"{name}.png", "prompt": prompt}) # ======================================================================== # 4. BOSSES (~15) # ======================================================================== bosses = [ ("boss_zombie_king", "Zombie King boss, crown rotting massive undead ruler, 128px"), ("boss_mutant_alpha", "Alpha Mutant boss, evolved intelligent deadly, 128px"), ("boss_raider_warlord", "Raider Warlord boss, throne of bones brutal, 128px"), ("boss_irradiated_giant", "Irradiated Giant boss, glowing unstoppable, 128px"), ("boss_shadow_entity", "Shadow Entity boss, darkness consuming, 128px"), ("boss_machine_sentinel", "Machine Sentinel boss, corrupted military robot, 128px"), ("boss_mutant_queen", "Mutant Queen boss, egg sacs birthing horrors, 128px"), ("boss_viktor_final", "Viktor Krnic final form, power armor mech suit, 128px"), ] for name, prompt in bosses: assets.append({"cat": "bosses", "file": f"{name}.png", "prompt": prompt}) # ======================================================================== # 5. 18 BIOMES - Terrain Tiles (32x32) # ======================================================================== biomes = { "travnik": [ # Grasslands ("tile_grass_dead", "dead grass tile brown patchy, 32x32 seamless"), ("tile_grass_overgrown", "overgrown wild grass tile weeds, 32x32 seamless"), ("tile_grass_burnt", "burnt grass tile scorched, 32x32 seamless"), ], "gozd": [ # Forest ("tile_forest_floor", "forest floor tile leaves dirt, 32x32 seamless"), ("tile_forest_moss", "mossy forest floor tile, 32x32 seamless"), ("tile_forest_mud", "muddy forest floor tile, 32x32 seamless"), ], "mesto": [ # City/Urban ("tile_concrete_cracked", "cracked concrete tile weeds, 32x32 seamless"), ("tile_asphalt_broken", "broken asphalt road tile, 32x32 seamless"), ("tile_rubble", "rubble debris tile urban, 32x32 seamless"), ], "industrijska": [ # Industrial ("tile_metal_rusted", "rusted metal floor tile, 32x32 seamless"), ("tile_factory_floor", "dirty factory floor tile oil stains, 32x32 seamless"), ("tile_grate_metal", "metal grate floor tile, 32x32 seamless"), ], "podzemlje": [ # Underground/Bunker ("tile_bunker_floor", "bunker concrete floor tile, 32x32 seamless"), ("tile_tunnel_floor", "tunnel floor tile damp, 32x32 seamless"), ("tile_metro_tile", "metro station tile dirty, 32x32 seamless"), ], "katakombe": [ # Catacombs ("tile_catacomb_stone", "catacomb stone floor tile ancient, 32x32 seamless"), ("tile_catacomb_bone", "bone littered floor tile skulls, 32x32 seamless"), ("tile_catacomb_moss", "mossy catacomb floor tile damp, 32x32 seamless"), ], "mocvirje": [ # Swamp ("tile_swamp_mud", "swamp mud tile murky, 32x32 seamless"), ("tile_swamp_water", "swamp shallow water tile green, 32x32 seamless"), ("tile_swamp_grass", "swamp grass tile reeds, 32x32 seamless"), ], "pustinja": [ # Desert/Wasteland ("tile_sand_radioactive", "radioactive sand tile glowing, 32x32 seamless"), ("tile_cracked_earth", "cracked dry earth tile drought, 32x32 seamless"), ("tile_salt_flat", "salt flat tile white crystalline, 32x32 seamless"), ], "sneg": [ # Snow/Winter ("tile_snow_dirty", "dirty snow tile ash mixed, 32x32 seamless"), ("tile_ice_cracked", "cracked ice tile frozen, 32x32 seamless"), ("tile_frozen_ground", "frozen ground tile permafrost, 32x32 seamless"), ], "gorovje": [ # Mountains ("tile_rock_grey", "grey mountain rock tile, 32x32 seamless"), ("tile_gravel_mountain", "mountain gravel tile loose, 32x32 seamless"), ("tile_cliff_edge", "cliff edge rock tile, 32x32 seamless"), ], "obala": [ # Coast ("tile_beach_sand", "beach sand tile wet, 32x32 seamless"), ("tile_rocky_shore", "rocky shore tile waves, 32x32 seamless"), ("tile_pier_wood", "wooden pier planks rotting, 32x32 seamless"), ], "jezero": [ # Lake ("tile_water_shallow", "shallow lake water tile, 32x32 seamless"), ("tile_water_deep", "deep lake water tile dark, 32x32 seamless"), ("tile_water_toxic", "toxic water tile green glowing, 32x32 seamless"), ], "reka": [ # River ("tile_river_water", "river water tile flowing, 32x32 seamless"), ("tile_riverbank_mud", "muddy riverbank tile, 32x32 seamless"), ("tile_river_rocks", "river rocks tile rounded, 32x32 seamless"), ], "vulkan": [ # Volcano ("tile_lava", "lava tile glowing orange hot, 32x32 seamless"), ("tile_volcanic_rock", "volcanic rock tile black jagged, 32x32 seamless"), ("tile_ash_ground", "volcanic ash ground tile grey, 32x32 seamless"), ], "cernobil": [ # Chernobyl-like ("tile_radiation_zone", "radiation zone tile glowing green danger, 32x32 seamless"), ("tile_contaminated", "contaminated ground tile toxic, 32x32 seamless"), ("tile_dead_zone", "dead zone ground tile lifeless, 32x32 seamless"), ], "ruine": [ # Ruins ("tile_ruin_floor", "ancient ruin floor tile crumbling, 32x32 seamless"), ("tile_ruin_mosaic", "broken mosaic floor tile ancient, 32x32 seamless"), ("tile_ruin_overgrown", "overgrown ruin floor tile vines, 32x32 seamless"), ], "podvodni": [ # Underwater ("tile_ocean_floor", "ocean floor tile sand shells, 32x32 seamless"), ("tile_coral_reef", "coral reef tile colorful dead, 32x32 seamless"), ("tile_seaweed_floor", "seaweed covered floor tile, 32x32 seamless"), ], "atlantida": [ # Atlantis-like ("tile_atlantis_marble", "ancient atlantis marble tile weathered, 32x32 seamless"), ("tile_atlantis_crystal", "crystal floor tile glowing blue, 32x32 seamless"), ("tile_atlantis_ruin", "atlantis ruin floor tile barnacles, 32x32 seamless"), ], } for biome_name, tiles in biomes.items(): for tile_name, prompt in tiles: assets.append({ "cat": "environment", "file": f"{tile_name}.png", "prompt": prompt, "biome": biome_name }) # ======================================================================== # 6. ENVIRONMENT OBJECTS (~150) # ======================================================================== env_objects = [ # Trees (Dead/Dying) ("tree_dead_large", "large dead tree no leaves gnarled haunting"), ("tree_dead_small", "small dead tree twisted creepy"), ("tree_dying", "dying tree few leaves diseased"), ("tree_burnt", "burnt tree charred fire damage"), ("tree_overgrown", "overgrown tree wild vines reclaiming"), # Vegetation ("bush_thorny", "thorny bush overgrown barrier wild"), ("bush_dead", "dead bush brown brittle"), ("grass_tall_wild", "tall wild grass hiding dangers swaying"), ("weeds_concrete", "weeds growing through concrete cracks"), ("vines_climbing", "climbing vines on wall overgrown"), ("mushroom_cluster", "cluster of regular mushrooms forest floor"), # Rocks ("rock_small", "small rocks pebbles scattered"), ("rock_medium", "medium boulder moss covered"), ("rock_large", "large boulder obstacle"), ("rock_formation", "rock formation natural cave entrance"), # Ruins ("ruin_wall_brick", "ruined brick wall crumbling bullet holes"), ("ruin_wall_concrete", "crumbled concrete wall rebar graffiti"), ("ruin_pillar", "collapsed pillar debris overgrown"), ("ruin_doorframe", "abandoned doorframe door missing"), ("ruin_window", "broken window frame glass shards boarded"), ("ruin_stairs", "ruined staircase collapsed dangerous"), # Vehicles ("vehicle_car_rusted", "rusted abandoned car flat tires looted"), ("vehicle_car_burned", "burned out car wreck charred"), ("vehicle_truck_military", "abandoned military truck damaged"), ("vehicle_bus_crashed", "crashed bus on side broken windows"), ("vehicle_helicopter", "crashed helicopter burned military"), ("vehicle_tank", "destroyed tank explosion damage"), # Urban Objects ("streetlight_bent", "bent streetlight not working rusted"), ("mailbox_rusted", "rusted mailbox dented forgotten"), ("bench_broken", "broken park bench weathered rotting"), ("dumpster", "abandoned dumpster overflowing rusted"), ("shopping_cart", "abandoned shopping cart bent rusted"), ("phone_booth", "destroyed phone booth glass broken"), ("fire_hydrant", "broken fire hydrant leaking rusted"), ("sign_stop", "bent stop sign bullet holes faded"), ("sign_radiation", "radiation warning sign faded ominous"), # Bodies/Remains ("skeleton_remains", "skeleton remains old clothes remnants"), ("corpse_bag", "body bag sealed ominous"), # Industrial ("barrel_toxic", "toxic waste barrel leaking hazard"), ("barrel_oil", "rusted oil barrel fuel valuable"), ("crate_wooden", "damaged wooden crate broken open"), ("crate_military", "military supply crate sealed"), ("pipe_large", "large rusted pipe drainage hiding"), ("tank_water", "rusted water tank possibly full"), ("generator_broken", "broken generator salvageable parts"), ("machinery_rusted", "rusted industrial machinery dangerous"), ("fence_chainlink", "torn chainlink fence opening"), ("barbed_wire", "barbed wire barrier wound danger"), ("sandbag_wall", "sandbag wall fortification cover"), ("concrete_barrier", "concrete road barrier defensive"), ] for name, prompt in env_objects: assets.append({"cat": "environment", "file": f"{name}.png", "prompt": prompt}) # ======================================================================== # 7. BUILDINGS & STRUCTURES (~60) # ======================================================================== buildings = [ # Shelters ("shelter_makeshift", "makeshift shelter tarps wood survivor camp"), ("shelter_bunker", "bunker entrance blast door military"), ("shelter_basement", "basement entrance cellar door hidden"), ("shelter_tent", "military tent camouflage supplies"), ("shelter_shack", "survivor shack scrap materials patched"), # Ruined Buildings ("building_house", "ruined house collapsed roof looted"), ("building_apartment", "ruined apartment building floors exposed"), ("building_shop", "looted shop broken windows empty"), ("building_hospital", "abandoned hospital eerie supplies"), ("building_school", "ruined school desks children drawings creepy"), ("building_church", "destroyed church steeple fallen sanctuary"), ("building_factory", "abandoned factory machinery industrial"), ("building_warehouse", "ruined warehouse storage scavenging"), ("building_gas_station", "abandoned gas station pumps rusted"), ("building_police", "ransacked police station cells weapons"), ("building_fire_station", "abandoned fire station truck rusted"), # Workstations ("workstation_forge", "wasteland forge scrap metal fire crafting"), ("workstation_workbench", "survivor workbench tools repairs"), ("workstation_chemistry", "chemistry station beakers medicine"), ("workstation_cooking", "cooking station fire pit pot meat"), # Storage ("storage_chest", "locked metal chest valuable heavy"), ("storage_locker", "rusted locker storage secured"), ("storage_safe", "old safe locked valuable inside"), ("storage_cabinet", "metal cabinet rusted storage"), # Defenses ("defense_barricade", "survivor barricade wood metal spikes"), ("defense_watchtower", "makeshift watchtower observation"), ("defense_trap_spike", "spike trap hidden deadly"), ("defense_trap_bear", "bear trap rusted dangerous"), ("defense_sandbags", "sandbag defensive position"), ] for name, prompt in buildings: assets.append({"cat": "buildings", "file": f"{name}.png", "prompt": prompt}) # ======================================================================== # 8. WEAPONS (~80) # ======================================================================== weapons = [ # Melee ("weapon_pipe", "metal pipe weapon rusty blood stains"), ("weapon_crowbar", "crowbar multi-use worn"), ("weapon_machete", "machete jungle knife worn blade"), ("weapon_axe_fire", "fire axe red emergency worn"), ("weapon_axe_wood", "wood chopping axe handle worn"), ("weapon_bat_nails", "baseball bat nails added brutal"), ("weapon_knife_combat", "combat knife tactical sharp"), ("weapon_knife_kitchen", "kitchen knife improvised weapon"), ("weapon_hammer", "claw hammer rusted bloody"), ("weapon_wrench", "large wrench heavy blunt"), ("weapon_shovel", "sharpened shovel deadly"), ("weapon_pickaxe", "pickaxe mining tool weapon"), ("weapon_sledgehammer", "sledgehammer heavy devastating"), ("weapon_sword_makeshift", "makeshift sword sharpened metal"), ("weapon_spear", "wooden spear sharpened tip primitive"), # Ranged ("weapon_pistol", "worn pistol 9mm reliable"), ("weapon_revolver", "old revolver powerful limited"), ("weapon_shotgun", "pump shotgun close range devastating"), ("weapon_rifle_hunting", "hunting rifle scope accurate"), ("weapon_rifle_assault", "assault rifle military automatic"), ("weapon_smg", "submachine gun compact fast"), ("weapon_crossbow", "crossbow silent reusable ammo"), ("weapon_bow_makeshift", "makeshift bow primitive quiet"), # Explosives ("weapon_molotov", "molotov cocktail fire bomb bottle"), ("weapon_grenade", "fragmentation grenade military deadly"), ("weapon_pipe_bomb", "pipe bomb improvised explosive"), ("weapon_mine_land", "landmine military dangerous"), ] for name, prompt in weapons: assets.append({"cat": "items", "file": f"{name}.png", "prompt": prompt}) # ======================================================================== # 9. ITEMS & SUPPLIES (~150) # ======================================================================== items = [ # Ammo ("ammo_9mm", "9mm ammunition box pistol rounds"), ("ammo_shotgun", "shotgun shells red buckshot"), ("ammo_rifle", "rifle ammunition 308 box"), ("ammo_arrow", "crossbow bolts quiver reusable"), # Medical ("med_bandage", "dirty bandage first aid cloth"), ("med_medkit", "military first aid kit valuable"), ("med_painkillers", "painkiller bottle pills relief"), ("med_antibiotics", "antibiotic pills infection cure"), ("med_antidote", "antidote vial poison cure rare"), ("med_rad_pills", "anti-radiation pills iodide"), ("med_blood_bag", "blood bag transfusion rare"), ("med_surgical_kit", "surgical tools operations"), ("med_splint", "makeshift splint broken bones"), ("med_syringe", "medical syringe injection clean"), # Food ("food_canned_beans", "canned beans preserved sustenance"), ("food_canned_meat", "canned meat spam protein"), ("food_canned_fruit", "canned fruit sweet valuable"), ("food_mre", "military MRE complete meal rare"), ("food_dried_meat", "dried meat jerky long lasting"), ("food_raw_meat", "raw meat needs cooking dangerous"), ("food_mushrooms_edible", "foraged edible mushrooms careful"), ("food_berries", "wild berries foraged nutrition"), ("food_rat_meat", "rat meat desperate times"), # Water ("water_bottle_dirty", "dirty water bottle needs purification"), ("water_bottle_clean", "clean water bottle safe valuable"), ("water_canteen", "military canteen durable"), ("water_filter", "water purification filter valuable"), # Crafting ("material_scrap_metal", "scrap metal salvage crafting"), ("material_wood_plank", "wooden plank building fuel"), ("material_cloth", "dirty cloth bandages repairs"), ("material_duct_tape", "duct tape roll repairs valuable"), ("material_rope", "rope coil climbing binding"), ("material_wire", "electrical wire electronics traps"), ("material_nails", "box of nails building traps"), ("material_screws", "bag of screws repairs building"), ("material_glass", "glass shards weapons traps"), ("material_chemicals", "chemical compounds crafting dangerous"), ("material_gunpowder", "gunpowder explosives ammo"), ("material_electronics", "salvaged electronics components"), ("material_fuel", "fuel canister gasoline valuable"), ("material_leather", "leather scraps armor repairs"), # Tools ("tool_flashlight", "flashlight batteries darkness"), ("tool_lockpick", "lockpick set breaking in valuable"), ("tool_multitool", "multitool swiss army useful"), ("tool_binoculars", "binoculars scouting military"), ("tool_compass", "compass navigation survival"), ("tool_grapple", "grappling hook climbing access"), ("tool_geiger", "geiger counter radiation detection"), ("tool_gas_mask", "gas mask protection filters"), ("tool_radio", "handheld radio communication"), ("tool_lighter", "zippo lighter fire starting"), ("tool_matches", "matchbox fire starting limited"), ("tool_flare", "flare signaling light source"), # Armor ("armor_jacket", "worn leather jacket protection"), ("armor_vest", "kevlar vest bullet protection worn"), ("armor_helmet", "military helmet head protection"), ("armor_gas_mask", "gas mask full face protection"), ("armor_hazmat", "hazmat suit radiation protection"), ("armor_boots", "combat boots sturdy reliable"), ("armor_gloves", "tactical gloves grip protection"), ("armor_backpack_military", "military backpack large capacity"), ("armor_backpack_civilian", "civilian backpack worn storage"), # Valuables ("valuable_gold_ring", "gold ring trade valuable"), ("valuable_watch", "expensive watch trade"), ("valuable_jewelry", "jewelry necklace trade"), ("valuable_coins", "old coins currency"), ("valuable_documents", "important documents intel"), ] for name, prompt in items: assets.append({"cat": "items", "file": f"{name}.png", "prompt": prompt}) # ======================================================================== # 10. UI ELEMENTS (~50) # ======================================================================== ui = [ # Status Bars ("ui_health_bar", "health bar red blood gritty worn"), ("ui_stamina_bar", "stamina bar yellow exhaustion worn"), ("ui_hunger_bar", "hunger bar empty stomach icon worn"), ("ui_thirst_bar", "thirst bar water drop icon worn"), ("ui_radiation_bar", "radiation bar hazard symbol green glow worn"), # Status Icons ("ui_icon_infected", "infected status icon biohazard green"), ("ui_icon_bleeding", "bleeding status icon blood drops red"), ("ui_icon_poisoned", "poisoned status icon skull purple"), ("ui_icon_broken", "broken limb icon bone crack"), ("ui_icon_hungry", "hungry icon empty stomach"), ("ui_icon_thirsty", "thirsty icon water drop empty"), ("ui_icon_cold", "cold icon snowflake freezing"), ("ui_icon_hot", "heat icon sun overheating"), ("ui_icon_tired", "tired icon zzz exhausted"), ("ui_icon_irradiated", "irradiated icon nuclear symbol green"), # Buttons ("ui_button_inventory", "inventory button backpack icon gritty metal"), ("ui_button_map", "map button worn paper gritty"), ("ui_button_crafting", "crafting button gear icon gritty"), ("ui_button_skills", "skills button person icon gritty"), ("ui_button_journal", "journal button book icon worn"), # Frames ("ui_frame_inventory", "inventory frame metal rusted edges dark"), ("ui_frame_dialog", "dialog frame worn paper dark"), ("ui_slot_item", "item slot metal frame worn dark"), ("ui_slot_weapon", "weapon slot larger metal worn"), # Cursors ("ui_cursor_normal", "normal cursor pointer worn"), ("ui_cursor_interact", "interact cursor hand worn"), ("ui_cursor_attack", "attack cursor crosshair red"), ("ui_cursor_loot", "loot cursor grab hand"), ] for name, prompt in ui: assets.append({"cat": "ui", "file": f"{name}.png", "prompt": prompt}) # ======================================================================== # 11. WILDLIFE (~40) # ======================================================================== wildlife = [ ("animal_crow", "crow bird scavenger ominous circling"), ("animal_rat", "rat scurrying diseased common"), ("animal_dog_feral", "feral dog pack predator aggressive"), ("animal_wolf", "wolf predator pack hunter grey"), ("animal_deer", "deer prey animal forest cautious"), ("animal_boar", "wild boar tusks aggressive"), ("animal_bear", "bear large predator territorial"), ("animal_fox", "fox cunning scavenger red"), ("animal_rabbit", "rabbit prey quick brown"), ("animal_snake", "snake venomous slithering"), ("animal_fish_common", "common fish swimming edible"), ("animal_fish_mutant", "mutant fish glowing deformed"), ] for name, prompt in wildlife: assets.append({"cat": "zivali", "file": f"{name}.png", "prompt": prompt}) return assets # ============================================================================ # COMFYUI INTEGRATION # ============================================================================ def create_workflow(prompt_text: str, output_name: str) -> dict: """Creates ComfyUI workflow for dark survival style""" seed = int(time.time() * 1000) % 2147483647 return { "1": { "class_type": "CheckpointLoaderSimple", "inputs": {"ckpt_name": "dreamshaper_8.safetensors"} }, "2": { "class_type": "EmptyLatentImage", "inputs": {"width": 512, "height": 512, "batch_size": 1} }, "3": { "class_type": "CLIPTextEncode", "inputs": {"text": STYLE_PREFIX + prompt_text, "clip": ["1", 1]} }, "4": { "class_type": "CLIPTextEncode", "inputs": {"text": NEGATIVE_PROMPT, "clip": ["1", 1]} }, "5": { "class_type": "KSampler", "inputs": { "seed": seed, "steps": 35, "cfg": 8.0, "sampler_name": "dpmpp_2m", "scheduler": "karras", "denoise": 1.0, "model": ["1", 0], "positive": ["3", 0], "negative": ["4", 0], "latent_image": ["2", 0] } }, "6": {"class_type": "VAEDecode", "inputs": {"samples": ["5", 0], "vae": ["1", 2]}}, "7": {"class_type": "SaveImage", "inputs": {"filename_prefix": output_name, "images": ["6", 0]}} } def queue_prompt(workflow: dict) -> str: try: r = requests.post(f"{COMFYUI_URL}/prompt", json={"prompt": workflow, "client_id": f"v6_{uuid.uuid4().hex[:8]}"}) return r.json().get("prompt_id") except: return None def wait_completion(prompt_id: str, timeout: int = 300) -> bool: start = time.time() while time.time() - start < timeout: try: r = requests.get(f"{COMFYUI_URL}/history/{prompt_id}") if prompt_id in r.json() and r.json()[prompt_id].get("outputs"): return True except: pass time.sleep(2) return False def download_image(prompt_id: str, output_path: Path) -> bool: try: h = requests.get(f"{COMFYUI_URL}/history/{prompt_id}").json() for out in h.get(prompt_id, {}).get("outputs", {}).values(): for img in out.get("images", []): r = requests.get(f"{COMFYUI_URL}/view", params={"filename": img["filename"], "subfolder": img.get("subfolder", ""), "type": "output"}) if r.status_code == 200: output_path.parent.mkdir(parents=True, exist_ok=True) output_path.write_bytes(r.content) return True return False except: return False def main(): print("=" * 70) print("πŸ”₯ DOLINA SMRTI V6.0 - FINALNI GENERATOR") print(" Post-Apocalyptic Dark Survival Style") print("=" * 70) try: d = requests.get(f"{COMFYUI_URL}/system_stats", timeout=5).json() print(f"βœ… ComfyUI v{d['system']['comfyui_version']} running") except: print(f"❌ ComfyUI not responding - start with: open /Applications/ComfyUI.app") return print("\nπŸ“‹ Building V6.0 Registry...") ASSETS = generate_v6_registry() print(f"πŸ“Š Total: {len(ASSETS)} assets") existing = sum(1 for a in ASSETS if (Path(OUTPUT_DIR) / a["cat"] / a["file"]).exists()) print(f"βœ… Exist: {existing} | 🎯 Generate: {len(ASSETS) - existing}") print("\nπŸ”₯ STARTING DOLINA SMRTI V6.0 GENERATION...\n") success, skip, fail = 0, 0, 0 for i, asset in enumerate(ASSETS, 1): path = Path(OUTPUT_DIR) / asset["cat"] / asset["file"] if path.exists(): skip += 1 continue print(f"[{i}/{len(ASSETS)}] πŸ”₯ {asset['file'][:40]}...") wf = create_workflow(asset["prompt"], asset["file"].replace(".png", "")) pid = queue_prompt(wf) if pid and wait_completion(pid) and download_image(pid, path): print(f" βœ… SAVED") success += 1 else: print(f" ❌ FAILED") fail += 1 if i % 25 == 0: print(f"\nπŸ“Š [{i}/{len(ASSETS)}] βœ…{success} ⏭️{skip} ❌{fail}\n") time.sleep(0.5) print("\n" + "=" * 70) print("πŸ”₯ DOLINA SMRTI V6.0 COMPLETE!") print(f"βœ… Success: {success} | ⏭️ Skip: {skip} | ❌ Fail: {fail}") print(f"πŸ“ Output: {OUTPUT_DIR}") if __name__ == "__main__": main()