#!/usr/bin/env python3 """ GRAVITY BATCH GENERATOR - DolinaSmrti Asset Production Uses ONLY Gravity (generate_image) - NO ComfyUI/Ufi Style: Gritty Noir Hand-Drawn 2D Stylized Indie """ import os import time from pathlib import Path # === CONFIGURATION === BASE_DIR = Path("/Users/davidkotnik/repos/novafarma") ASSETS_DIR = BASE_DIR / "assets" / "images" # === GRITTY NOIR STYLE === STYLE_PROMPT = """ (bold black outlines:1.4), dark hand-drawn stylized indie game asset, (gritty noir aesthetic:1.2), flat colors, muted color palette, exaggerated features, warped perspective, wonky proportions, mature post-apocalyptic vibe, Don't Starve inspired, high contrast noir elements, transparent background PNG """ NEGATIVE_PROMPT = """ pixel art, pixels, grainy, blurry, 3D rendering, realistic photo, shading gradients, Disney style, cute kawaii, bright colors, background elements, text, watermark """ # === ASSET REGISTRY === # Based on DODATNA_VSEBINA_REGISTRY_V1.14.md ASSET_CATEGORIES = { "buildings": [ "church_complete", "church_unfinished", "church_ruined", "workshop_complete", "workshop_ruined", "barn_complete", "barn_damaged", "farmhouse_complete", "farmhouse_ruined", "store_complete", "store_damaged", "windmill", "watchtower", "greenhouse", "laboratory", "vape_lab", "furnace_building", "mint_building", "tailoring_shop", ], "workstations": [ "furnace", "campfire", "tailoring_table", "vape_lab_station", "mint_station", "basic_sprinkler", "quality_sprinkler", "iridium_sprinkler", "enchanting_table", "crafting_bench", ], "items": [ # Weapons "wooden_bow", "crystal_bow", "dragon_bow", "alpha_rainbow_bow", "fire_arrow", "ice_arrow", "lightning_arrow", "bomb_arrow", "poison_arrow", "holy_arrow", "silver_arrow", # Tools "wooden_axe", "iron_axe", "gold_axe", "diamond_axe", "wooden_pickaxe", "iron_pickaxe", "gold_pickaxe", "diamond_pickaxe", "wooden_hoe", "iron_hoe", "gold_hoe", "watering_can", "fishing_rod", # Resources "iron_ore", "gold_ore", "silver_ore", "diamond", "iron_bar", "gold_bar", "silver_bar", "wood_log", "stone", "coal", "hemp_fiber", "leather", "spider_silk", # Food "bread", "cheese", "milk", "beef", "chicken_egg", "truffle", "ham", # Magic "slime_gel_green", "slime_gel_blue", "slime_gel_red", "rainbow_vape_liquid", "menthol_vape_liquid", "magic_mushroom", ], "zivali": [ # Animals # Livestock "sheep_normal", "sheep_fire", "sheep_golden_fleece", "cow_normal", "cow_mutant", "chicken_normal", "chicken_three_headed", "pig_normal", "pig_giant", "horse_normal", "horse_undead", # Wildlife "fox", "deer", "rabbit", "hedgehog", "bear", "wolf", "wild_boar", "owl", "bat", # Marine "fish_bass", "fish_trout", "fish_salmon", "fish_tuna", "fish_piranha", "golden_fish", "sea_dragon", "loch_ness_monster", "shark", "jellyfish", # Dogs "dog_retriever", "dog_shepherd", "dog_husky", "dog_corgi", "dog_dalmatian", "dachshund_susi", # Slimes "slime_green", "slime_blue", "slime_red", "slime_yellow", "slime_purple", "slime_black", "slime_rainbow", ], "mutanti": [ "zombie_brown_dreads", "zombie_bald", "zombie_pink_dreads", "zombie_portrait_closeup", "werewolf_normal", "werewolf_transformed", "skeleton_warrior", "ghost", "mutant_monkey", "mutant_beast", "griffin", "pterodactyl", "hippogriff", "bigfoot", "yeti", ], "bosses": [ "mutant_king", "zombie_horde_leader", "ancient_tree", "giant_troll_king", "ice_titan", "fire_dragon", "king_slime", ], "environment": [ # Crops "wheat_planted", "wheat_growing", "wheat_harvest", "corn_planted", "corn_growing", "corn_harvest", "tomato_planted", "tomato_growing", "tomato_harvest", # Trees "cherry_blossom_tree", "oak_tree", "pine_tree", "dead_tree", "burned_tree", # Decorations "grave_stone", "grave_cross", "grave_angel", "rock_small", "rock_large", "boulder", "bush_green", "bush_dead", # Special "carnivorous_plant_seedling", "carnivorous_plant_giant", "portal_normal", "portal_activated", ], "ui": [ "health_bar", "stamina_bar", "mana_bar", "inventory_slot", "inventory_slot_selected", "coin_icon", "heart_icon", "star_icon", "button_play", "button_pause", "button_settings", ], } def generate_prompt(category: str, asset_name: str) -> str: """Generate full prompt for Gravity image generation""" # Clean asset name for description clean_name = asset_name.replace("_", " ") # Category-specific additions category_context = { "buildings": "game building asset, isometric view, architectural structure", "workstations": "crafting station, work table, game object", "items": "game item icon, inventory object, collectible", "zivali": "animal character, creature sprite, wildlife", "mutanti": "mutant creature, zombie character, monster enemy", "bosses": "boss enemy, large creature, intimidating monster", "environment": "environment object, natural element, decoration", "ui": "UI element, game interface icon, HUD component", } context = category_context.get(category, "game asset") full_prompt = f""" {clean_name}, {context}, {STYLE_PROMPT} """.strip() return full_prompt def main(): """Main batch generation loop""" print("=" * 60) print("šŸŽØ GRAVITY BATCH GENERATOR - DolinaSmrti") print("=" * 60) print(f"Style: Gritty Noir Hand-Drawn 2D Stylized Indie") print(f"Output: {ASSETS_DIR}") print("=" * 60) total_assets = sum(len(assets) for assets in ASSET_CATEGORIES.values()) print(f"\nšŸ“Š Total assets to generate: {total_assets}") generated_count = 0 for category, assets in ASSET_CATEGORIES.items(): print(f"\n{'='*60}") print(f"šŸ“ Category: {category.upper()} ({len(assets)} assets)") print(f"{'='*60}") # Create category directory category_dir = ASSETS_DIR / category category_dir.mkdir(parents=True, exist_ok=True) for i, asset_name in enumerate(assets, 1): output_path = category_dir / f"{asset_name}.png" # Skip if already exists if output_path.exists(): print(f" ā­ļø [{i}/{len(assets)}] SKIP: {asset_name} (already exists)") generated_count += 1 continue # Generate prompt prompt = generate_prompt(category, asset_name) print(f"\n šŸŽØ [{i}/{len(assets)}] Generating: {asset_name}") print(f" Prompt: {prompt[:80]}...") # === THIS IS WHERE GRAVITY INTEGRATION HAPPENS === # In actual usage, Antigravity will call generate_image here # For now, this is a placeholder that will be replaced print(f" āš ļø PLACEHOLDER: Call generate_image('{prompt}', '{asset_name}')") print(f" šŸ’¾ Save to: {output_path}") generated_count += 1 # Progress update progress = (generated_count / total_assets) * 100 print(f"\n šŸ“Š Overall Progress: {generated_count}/{total_assets} ({progress:.1f}%)") # Respectful delay (avoid API hammering) time.sleep(2) print("\n" + "=" * 60) print("āœ… GENERATION COMPLETE!") print("=" * 60) print(f"Total generated: {generated_count}/{total_assets}") print(f"Output directory: {ASSETS_DIR}") if __name__ == "__main__": main()