Files
novafarma/scripts/slow_generator.py
David Kotnik 21daf45640 🦖 Evening Session: Items & Equipment Complete + Dino Valley 50%
Category 2: Items & Equipment - COMPLETE (105 assets)
- Weapons: 30
- Armor: 20
- Consumables: 25
- Crafting Materials: 30

Dino Valley Biome: 55/109 assets (50%)
- Vegetation: 15/15 (Style 30) 
- Dinosaurs: 12/12 (Style 33) 
- Items: 12/12 (Style 33) 
- Food: 16/16 (Style 33) 

Progress: 215/~1,500 assets (14.3%)
Time: 23:45 CET, 02.01.2026
Production velocity: ~28 assets/hour
2026-01-02 23:47:21 +01:00

120 lines
5.6 KiB
Python

#!/usr/bin/env python3
"""
SLOW MODE GENERATOR - Works within quota limits
Generates 1 image every 3 minutes = 20 images per hour = safe!
"""
import time
import vertexai
from vertexai.preview.vision_models import ImageGenerationModel
from pathlib import Path
PROJECT_ID = "gen-lang-client-0428644398"
LOCATION = "us-central1"
BASE_PATH = Path("/Users/davidkotnik/repos/novafarma/assets/slike")
# Style 32 detailed
STYLE_32 = """Style 32: Cult of the Lamb cute-dark aesthetic. CRITICAL: Bold thick black outlines (3px), chibi proportions (head = 1/3 body), pastel-gothic colors (dusty pink #E8B4D4, muted purple #9B7FB5, cream #F5EFE6, noir shadows #2D2D2D), big expressive eyes (1/4 of face), smooth gradients, cute-dark contradiction. """
COMMON = """2D game sprite, pixel-perfect clarity, centered with 10px margin, solid chroma green background (#00FF00)."""
# Priority assets - most important first
PRIORITY_QUEUE = [
# Zombies (most important for gameplay)
("kreature/zombiji", "zombie_basic_idle", f"{STYLE_32}Basic shambling zombie, rotting flesh, exposed ribs, tattered clothing, blank eyes. IDLE: standing still, slight sway. {COMMON}"),
("kreature/zombiji", "zombie_basic_walk", f"{STYLE_32}Basic shambling zombie, rotting flesh, exposed ribs, tattered clothing. WALKING forward, shambling gait, Stardew Valley hop style. {COMMON}"),
("kreature/zombiji", "zombie_basic_attack", f"{STYLE_32}Basic shambling zombie, rotting flesh, exposed ribs. ATTACKING: arms extended forward, bite motion. {COMMON}"),
("kreature/zombiji", "zombie_runner_idle", f"{STYLE_32}Fast aggressive zombie, sprinting pose, lean athletic build, wild hair, crazed expression. IDLE: aggressive stance, ready to run. {COMMON}"),
("kreature/zombiji", "zombie_runner_walk", f"{STYLE_32}Fast aggressive zombie, lean build, wild hair. RUNNING: full sprint pose, speed motion. {COMMON}"),
("kreature/zombiji", "zombie_runner_attack", f"{STYLE_32}Fast aggressive zombie. ATTACKING: diving tackle lunge. {COMMON}"),
("kreature/zombiji", "zombie_tank_idle", f"{STYLE_32}Massive bulky zombie, muscular frame, cracked skin, intimidating chunky. IDLE: heavy breathing, powerful stance. {COMMON}"),
("kreature/zombiji", "zombie_tank_walk", f"{STYLE_32}Massive bulky zombie, muscular. WALKING: slow powerful stomp. {COMMON}"),
("kreature/zombiji", "zombie_tank_attack", f"{STYLE_32}Massive bulky zombie. ATTACKING: overhead smash motion. {COMMON}"),
# Animals (farm basics)
("kreature/zivali", "chicken_idle", f"{STYLE_32}Cute farm chicken, fluffy feathers, chunky body, big eyes. IDLE: standing, pecking ground. {COMMON}"),
("kreature/zivali", "chicken_walk", f"{STYLE_32}Cute farm chicken, fluffy. WALKING: waddle gait. {COMMON}"),
("kreature/zivali", "cow_idle", f"{STYLE_32}Farm cow, spotted pattern, big eyes, friendly. IDLE: standing, chewing. {COMMON}"),
("kreature/zivali", "cow_walk", f"{STYLE_32}Farm cow, spotted. WALKING: slow amble. {COMMON}"),
# NPCs (basic town)
("npc/trgovci", "merchant_general", f"{STYLE_32}General store merchant, apron over casual clothes, welcoming smile, friendly shopkeeper. IDLE pose behind counter. {COMMON}"),
("npc/zdravstvo", "doctor_main", f"{STYLE_32}Town doctor, white coat, stethoscope, glasses, kind wise expression. IDLE pose standing. {COMMON}"),
]
def generate_slow():
"""Generate assets slowly to stay within quota."""
print("=" * 70)
print("🐌 SLOW MODE GENERATOR")
print("=" * 70)
print("Rate: 1 image every 3 minutes")
print(f"Queue: {len(PRIORITY_QUEUE)} assets")
print(f"Total time: ~{len(PRIORITY_QUEUE) * 3} minutes")
print("=" * 70)
print()
vertexai.init(project=PROJECT_ID, location=LOCATION)
model = ImageGenerationModel.from_pretrained("imagen-3.0-generate-001")
success = 0
failed = 0
for i, (category, filename, prompt) in enumerate(PRIORITY_QUEUE, 1):
print(f"[{i}/{len(PRIORITY_QUEUE)}] {category}/{filename}")
print(f" Generating...")
try:
response = model.generate_images(
prompt=prompt,
number_of_images=1,
aspect_ratio="1:1",
safety_filter_level="block_few",
person_generation="allow_adult"
)
if response.images:
# Save
output_dir = BASE_PATH / category
output_dir.mkdir(parents=True, exist_ok=True)
output_path = output_dir / f"{filename}.png"
response.images[0].save(location=str(output_path))
print(f" ✅ SAVED: {output_path}")
success += 1
else:
print(f" ❌ FAILED: No image returned")
failed += 1
except Exception as e:
print(f" ❌ ERROR: {e}")
failed += 1
if "429" in str(e) or "Quota" in str(e):
print(f" ⏰ QUOTA HIT - Waiting 10 minutes...")
time.sleep(600) # Wait 10 min if quota hit
continue
# Progress
print(f" Progress: {success} success, {failed} failed")
print()
# SLOW DOWN - 3 minutes between images
if i < len(PRIORITY_QUEUE):
print(f" ⏰ Waiting 3 minutes before next image...")
time.sleep(180) # 3 minutes
print()
# Summary
print("=" * 70)
print("✅ SLOW GENERATION COMPLETE!")
print(f" Success: {success}")
print(f" Failed: {failed}")
print("=" * 70)
if __name__ == "__main__":
generate_slow()