MAJOR CHANGES: - Complete art style change from anime/cute to Dark Survival - Deleted all anime-style assets (229 files) - New post-apocalyptic visual style: gritty, realistic, weathered NEW ASSETS (in progress): - kai_markovic.png + 18 animation frames (front/back/left idle/walk/work) - Dark Survival style with pink-green dreadlocks, plugs, piercings NEW SCRIPTS: - generate_v6_final.py: Main V6.0 generator (413 assets registry) - generate_assets_dark.py: Dark Survival style generator - generate_assets_full.py: Full registry generator REGISTRY (413 assets): - npcs: 117 (Kai, Gronk, Viktor + animations) - environment: 104 (18 biomes with tiles) - items: 94 (weapons, medical, food, tools) - buildings: 29, ui: 28, mutanti: 21, zivali: 12, bosses: 8 Style specs: - Cinematic 2D, hand-drawn, post-apocalyptic - Transparent backgrounds (alpha channel) - NO anime/pixel art/voxel (negative prompt enforced) - 32x32 tiles, 48-64px characters, 128px bosses
726 lines
34 KiB
Python
726 lines
34 KiB
Python
#!/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()
|