#!/usr/bin/env python3 """ CONTINUOUS SPRITE GENERATION - Auto Queue System Generates sprites until API quota exhausted, waits for reset, continues Usage: python3 continuous_sprite_generation.py """ import time import json import os from datetime import datetime, timedelta from pathlib import Path # Configuration OUTPUT_DIR = Path("assets/images/STYLE_32_SESSION_JAN_04") QUEUE_FILE = Path("sprite_generation_queue.json") LOG_FILE = Path("generation_log.txt") # API Limits (Google Gemini Pro Image) API_QUOTA_LIMIT = 60 # Images per reset period API_RESET_INTERVAL_MINUTES = 60 # Resets every hour # Generation queue (priority ordered) SPRITE_QUEUE = [ # ======================================== # BATCH 1: HIGH PRIORITY (15 sprites) - 14:19-14:25 # ======================================== { "name": "interior_bed_kingsize", "prompt": "128x96px ornate kingsize bed, dark wood Gothic headboard with skull carvings, purple silk sheets, two skull pillows, candelabra on nightstand, ultra-thick 5px black outlines, flat cel-shaded colors, Dark-Chibi Noir style, chroma green #00FF00 background", "priority": 1, "category": "interior", "size": "128x96" }, { "name": "interior_chest_locked", "prompt": "48x48px wooden treasure chest, large skull-shaped lock, metal bands, purple glow emanating from keyhole, mystery box, ultra-thick 5px black outlines, Dark-Chibi Noir, chroma green background", "priority": 1, "category": "interior" }, { "name": "interior_bookshelf", "prompt": "64x96px tall Gothic bookcase, filled with dark leather books, some books glowing purple light, skull bookends on shelves, candles on top shelf creating atmosphere, ultra-thick 5px black outlines, Dark-Chibi Noir style, chroma green #00FF00 background", "priority": 1, "category": "interior" }, { "name": "interior_kitchen_fridge", "prompt": "64x96px tall refrigerator, black metal construction, skull-shaped door handle, purple magical glow from crack in door (cold magic), ultra-thick 5px black outlines, flat colors, Dark-Chibi Noir, chroma green background", "priority": 1, "category": "interior" }, { "name": "interior_kitchen_sink", "prompt": "48x48px stone sink basin, Gothic ornate faucet, skull-shaped drain, water dripping, ultra-thick 5px black outlines, Dark-Chibi Noir style, chroma green #00FF00 background", "priority": 1, "category": "interior" }, { "name": "interior_recipe_shelf", "prompt": "64x64px cookbook shelf, recipe books organized neatly, some books glowing purple (magical recipes), skull bookends holding them, ultra-thick 5px black outlines, Dark-Chibi Noir, chroma green background", "priority": 1, "category": "interior" }, { "name": "interior_secret_passage", "prompt": "64x96px hidden door in stone wall, slightly ajar revealing purple light from inside, skull-shaped door handle, secret passage to underground bunker, ultra-thick 5px black outlines, Dark-Chibi Noir style, chroma green #00FF00 background", "priority": 1, "category": "interior" }, { "name": "interior_ritual_circle", "prompt": "96x96px dark magic circle on floor (floor decal), purple glowing occult runes in circle pattern, skull symbols at cardinal points, pentagram in center, can place ritual items on it, ultra-thick 5px black outlines, Dark-Chibi Noir, chroma green background", "priority": 1, "category": "interior" }, { "name": "interior_memory_vault", "prompt": "64x64px special ornate locked chest, intricate skull and rose carvings, Ana's belongings inside glowing purple, mystical emotional aura around it, ultra-thick 5px black outlines, Dark-Chibi Noir style, chroma green #00FF00 background", "priority": 1, "category": "interior" }, { "name": "interior_piercing_tools", "prompt": "48x48px medical tray with sterile piercing needles, piercing guns, variety of ear gauges displayed, sterilization purple UV light glowing, ultra-thick 5px black outlines, Dark-Chibi Noir, chroma green background", "priority": 1, "category": "interior" }, { "name": "interior_scissors_rack", "prompt": "32x64px professional barber scissors hanging on wall rack, straight razors, various combs, all with skull-shaped handles, ultra-thick 5px black outlines, Dark-Chibi Noir style, chroma green #00FF00 background", "priority": 1, "category": "interior" }, { "name": "mine_ore_vein_copper", "prompt": "48x48px exposed copper ore vein in dark stone wall, orange metallic shine, can be mined with pickaxe, resource node, ultra-thick 5px black outlines, Dark-Chibi Noir, chroma green background", "priority": 1, "category": "mine" }, { "name": "mine_ore_vein_gold", "prompt": "48x48px gold ore vein in stone, yellow golden glitter and shine, very valuable resource, can be mined, ultra-thick 5px black outlines, Dark-Chibi Noir style, chroma green #00FF00 background", "priority": 1, "category": "mine" }, { "name": "mine_crystal_purple", "prompt": "32x48px glowing purple crystal growing from dark cave floor, LIGHT SOURCE emitting bright purple glow in darkness, mystical energy, ultra-thick 5px black outlines, Dark-Chibi Noir, chroma green background", "priority": 1, "category": "mine" }, { "name": "interior_zombie_brain_jar", "prompt": "32x48px glass jar containing preserved zombie brain, purple preservative liquid, glowing eerily, for zombie worker home decoration, ultra-thick 5px black outlines, Dark-Chibi Noir style, chroma green #00FF00 background", "priority": 1, "category": "interior" }, # ======================================== # BATCH 2: MEDIUM PRIORITY - Living Room (15 sprites) - 14:25-14:35 # ======================================== { "name": "interior_sofa_gothic", "prompt": "96x64px large Gothic sofa, purple velvet cushions, skull decorations on armrests, dark wood frame, ultra-thick 5px black outlines, Dark-Chibi Noir, chroma green background", "priority": 2, "category": "living_room" }, { "name": "interior_armchair_skull", "prompt": "64x64px ornate armchair, skull-shaped backrest, purple cushion, dark wood, ultra-thick 5px black outlines, Dark-Chibi Noir style, chroma green #00FF00 background", "priority": 2, "category": "living_room" }, { "name": "interior_coffee_table", "prompt": "64x48px dark wood coffee table, skull centerpiece, magazines scattered, purple glass top, ultra-thick 5px black outlines, Dark-Chibi Noir, chroma green background", "priority": 2, "category": "living_room" }, { "name": "interior_fireplace_gothic", "prompt": "96x128px large stone fireplace, purple magical flames burning inside, skull mantelpiece, Gothic carvings, LIGHT SOURCE, ultra-thick 5px black outlines, Dark-Chibi Noir style, chroma green #00FF00 background", "priority": 2, "category": "living_room" }, { "name": "interior_tv_modern", "prompt": "64x48px flat screen TV showing static with purple glow, mounted on wall, skull logo on frame, ultra-thick 5px black outlines, Dark-Chibi Noir, chroma green background", "priority": 2, "category": "living_room" }, { "name": "interior_painting_portrait", "prompt": "48x64px framed dark portrait painting, mysterious figure with purple glow, skull in corner, ornate Gothic frame, ultra-thick 5px black outlines, Dark-Chibi Noir style, chroma green #00FF00 background", "priority": 2, "category": "living_room" }, { "name": "interior_rug_persian", "prompt": "96x128px ornate Persian rug, dark purple and black patterns, skull motifs woven in, floor decal, ultra-thick 5px black outlines, Dark-Chibi Noir, chroma green background", "priority": 2, "category": "living_room" }, { "name": "interior_curtains_velvet", "prompt": "32x96px heavy purple velvet curtains, skull-shaped tiebacks, draped dramatically, ultra-thick 5px black outlines, Dark-Chibi Noir style, chroma green #00FF00 background", "priority": 2, "category": "living_room" }, { "name": "interior_grandfather_clock", "prompt": "48x128px tall Gothic grandfather clock, skull on pendulum, purple glowing clock face, Roman numerals, ticking ominously, ultra-thick 5px black outlines, Dark-Chibi Noir, chroma green background", "priority": 2, "category": "living_room" }, { "name": "interior_chandelier_crystal", "prompt": "64x64px ornate crystal chandelier, purple crystals, skull decorations, LIGHT SOURCE emitting purple glow, ultra-thick 5px black outlines, Dark-Chibi Noir style, chroma green #00FF00 background", "priority": 2, "category": "living_room" }, { "name": "interior_plant_dead", "prompt": "32x48px dead decorative plant in Gothic pot, withered purple leaves, skull planter, ultra-thick 5px black outlines, Dark-Chibi Noir, chroma green background", "priority": 2, "category": "living_room" }, { "name": "interior_candelabra_five", "prompt": "48x64px five-candle candelabra, purple magical flames, ornate black metal, skull base, LIGHT SOURCE, ultra-thick 5px black outlines, Dark-Chibi Noir style, chroma green #00FF00 background", "priority": 2, "category": "living_room" }, { "name": "interior_mirror_ornate", "prompt": "64x96px large ornate mirror, Gothic skull frame, purple reflection glow, slightly cracked glass, ultra-thick 5px black outlines, Dark-Chibi Noir, chroma green background", "priority": 2, "category": "living_room" }, { "name": "interior_side_table", "prompt": "48x48px small side table, dark wood, skull drawer knob, purple lamp on top, ultra-thick 5px black outlines, Dark-Chibi Noir style, chroma green #00FF00 background", "priority": 2, "category": "living_room" }, { "name": "interior_trophy_skull", "prompt": "32x48px mounted trophy skull on wooden plaque, purple glowing eyes, hunter achievement, ultra-thick 5px black outlines, Dark-Chibi Noir, chroma green background", "priority": 2, "category": "living_room" }, # Continue with more batches... # BATCH 3: Bedroom Extended (12 sprites) - After reset # BATCH 4: Kitchen/Dining (18 sprites) # BATCH 5: Outdoors (20 sprites) # etc. ] def log_message(message): """Log to file and print""" timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") log_entry = f"[{timestamp}] {message}" print(log_entry) with open(LOG_FILE, 'a') as f: f.write(log_entry + "\n") def check_api_quota(): """Check if we have API quota remaining""" # This would check actual API usage # For now, return True (implement actual check) return True def wait_for_api_reset(): """Wait until next API quota reset""" next_reset = datetime.now().replace(minute=19, second=0, microsecond=0) if datetime.now() > next_reset: next_reset += timedelta(hours=1) wait_seconds = (next_reset - datetime.now()).total_seconds() log_message(f"⏰ Waiting {wait_seconds/60:.1f} minutes for API reset at {next_reset.strftime('%H:%M')}") time.sleep(wait_seconds) def generate_sprite(sprite_data): """Generate a single sprite (placeholder)""" log_message(f"🎨 Generating: {sprite_data['name']} ({sprite_data['category']})") # This would call actual generation API # For now, simulate time.sleep(2) # Simulate generation time output_file = OUTPUT_DIR / f"{sprite_data['name']}.png" log_message(f"✅ Saved: {output_file}") return True def main(): """Main generation loop""" log_message("=" * 60) log_message("🚀 CONTINUOUS SPRITE GENERATION - STARTING") log_message("=" * 60) OUTPUT_DIR.mkdir(parents=True, exist_ok=True) total_generated = 0 batch_number = 1 for i, sprite in enumerate(SPRITE_QUEUE): # Check quota before generation if not check_api_quota(): log_message("⚠️ API quota exhausted!") wait_for_api_reset() batch_number += 1 log_message(f"🔄 Batch {batch_number} starting after reset") # Generate sprite success = generate_sprite(sprite) if success: total_generated += 1 log_message(f"📊 Progress: {total_generated}/{len(SPRITE_QUEUE)} ({total_generated/len(SPRITE_QUEUE)*100:.1f}%)") # Batch completion notifications if total_generated % 15 == 0: log_message("=" * 60) log_message(f"🎉 BATCH {batch_number} COMPLETE: {total_generated} sprites generated!") log_message("=" * 60) log_message("=" * 60) log_message(f"✅ ALL SPRITES GENERATED: {total_generated} total") log_message("=" * 60) if __name__ == "__main__": main()