diff --git a/STYLE_32_STRICT_MANDATE.md b/STYLE_32_STRICT_MANDATE.md new file mode 100644 index 000000000..1b25ab0fe --- /dev/null +++ b/STYLE_32_STRICT_MANDATE.md @@ -0,0 +1,156 @@ +# 🎨 STYLE 32 - DARK-CHIBI NOIR (STRICT MANDATE) + +**EFFECTIVE:** 02.01.2026, 23:51 CET +**STATUS:** 🔒 LOCKED - MANDATORY FOR ALL ENTITY GENERATION + +--- + +## ⚠️ CRITICAL RULE: + +**Vsaka slika MORA imeti vseh 6 karakteristik. Če ne, ZAVRZI in generiraj ponovno!** + +--- + +## 📋 STYLE 32 - MANDATORY CHECKLIST: + +### **1. ✅ Vrhunska obroba (Extreme Bold Outlines)** +- **Debelina:** 4-5px črne linije +- **Karakter:** Marker-like, BOLD +- **Prepoved:** Mehke/tanke linije + +### **2. ✅ Chibi proporci (Chibi Proportions)** +- **Glava:** 40-50% celotnega telesa +- **Ušesa:** Velika, izrazita (za Kai, Gronk) +- **Stil:** Cute, deformed, cartoon + +### **3. ✅ Flat Look (Zero Gradients)** +- **Barve:** Popolnoma ravne (flat colors) +- **Teksture:** PREPOVEDANO senčenje s prelivi +- **Pravilo:** NO GRADIENTS - samo solid colors + +### **4. ✅ Noir sence (Sharp Block Shadows)** +- **Tip:** Ostri črni ali temno vijolični bloki +- **Pozicija:** Ena stran lika (ne mehak prehod) +- **Učinek:** Srhljiv kontrast (creepy vibe) + +### **5. ✅ Cult Oči (Empty Eyes)** +- **Velikost:** Velike, izrazite +- **Barva:** Bele ali rdeče +- **Zenice:** BREZ ZENIC (no pupils) +- **Stil:** Prazne, cult-like + +### **6. ✅ Tehnično (Technical Specs)** +- **Ozadje:** Chroma Green (#00FF00) +- **Format:** 32-bit PNG, alpha channel +- **Pripravljenost:** Animation-ready (centered, margins) + +--- + +## 🎯 USAGE: + +**Apply Style 32 to:** +- ✅ Karakterji (Kai, Ana, Gronk, Susi) +- ✅ NPCs (merchants, services, mentors) +- ✅ Enemies (zombies, creatures, bosses) +- ✅ Animals (farm animals, wild animals) +- ✅ Dinosaurs & biome creatures +- ✅ Magical beings +- ✅ Props & objects (tools, weapons, items) +- ✅ Buildings & structures + +**DO NOT apply to:** +- ❌ Vegetation (use Style 30 - Garden Story Cozy) +- ❌ Plants, crops, flowers, trees + +--- + +## 🚨 STRICT ENFORCEMENT: + +**IF any image fails ANY of the 6 criteria:** +1. REJECT immediately +2. Generate again with corrections +3. Do NOT save/use failed asset + +**Agent's responsibility:** +- Check EVERY generated image +- Verify all 6 points +- Ensure consistency across ALL assets + +--- + +## 📝 PROMPT TEMPLATE: + +``` +[SUBJECT] in exact Dark-Chibi Noir style. CRITICAL SPECS: +- Very thick black outlines (4-5px bold marker lines) +- Chibi proportions (head 40-50% of body) +- Flat colors ONLY, NO gradients, NO soft shading +- Sharp block shadows (black/dark purple on one side) +- Large empty eyes (white or red, NO pupils) +- Animation-ready pose +Chroma green background (#00FF00). Clean vector cartoon. +``` + +--- + +## 🔒 LOCKED PARAMETERS: + +| Parameter | Value | Non-Negotiable | +|-----------|-------|----------------| +| Outline thickness | 4-5px | ✅ YES | +| Head:Body ratio | 40-50% | ✅ YES | +| Gradients | ZERO | ✅ YES | +| Shadow style | Sharp blocks | ✅ YES | +| Pupils | NONE | ✅ YES | +| Background | #00FF00 | ✅ YES | + +--- + +## ✅ QUALITY CONTROL: + +**Before saving ANY asset, verify:** +- [ ] Are outlines 4-5px thick and bold? +- [ ] Is head 40-50% of total body? +- [ ] Are colors flat (zero gradients)? +- [ ] Are shadows sharp blocks (not soft)? +- [ ] Are eyes large and empty (no pupils)? +- [ ] Is background chroma green (#00FF00)? + +**If ALL checks pass:** ✅ APPROVE +**If ANY check fails:** ❌ REJECT & REGENERATE + +--- + +## 🎨 STYLE REFERENCE: + +**Mood:** Cult of the Lamb meets Don't Starve +**Vibe:** Cute but disturbing, chibi but dark +**Aesthetic:** Bold cartoon noir with cult undertones + +**Key Inspirations:** +- Cult of the Lamb (chibi proportions, cult eyes) +- Don't Starve (bold outlines, dark shadows) +- Hollow Knight (sharp noir aesthetic) + +--- + +## 🔄 STYLE 30 vs STYLE 32: + +| Aspect | Style 30 (Plants) | Style 32 (Entities) | +|--------|-------------------|---------------------| +| Outlines | Thin (1-2px) | Thick (4-5px) | +| Proportions | Realistic botanical | Chibi 40-50% head | +| Colors | Soft gradients OK | Flat ONLY | +| Shadows | Soft watercolor | Sharp blocks | +| Eyes | N/A | Large, no pupils | +| Mood | Cozy, wholesome | Dark, cult-like | + +--- + +**MANDATORY COMPLIANCE:** 100% +**ZERO TOLERANCE:** For style drift +**ENFORCEMENT:** Agent must auto-reject non-compliant assets + +--- + +**END OF STRICT STYLE 32 MANDATE** diff --git a/scripts/generate_all_biomes_complete.py b/scripts/generate_all_biomes_complete.py index 0bd68252a..4109b3fef 100644 --- a/scripts/generate_all_biomes_complete.py +++ b/scripts/generate_all_biomes_complete.py @@ -1,7 +1,11 @@ #!/usr/bin/env python3 """ -COMPLETE BIOME ASSET GENERATOR -Generates ALL missing biome assets with dual art style (Style A + B) +COMPLETE BIOME ASSET GENERATOR - STRICT STYLE ENFORCEMENT +Generates ALL missing biome assets with dual art style: +- Style 32 (Dark-Chibi Noir): ALL entities, creatures, NPCs, objects +- Style 30 (Garden Story Cozy): ALL vegetation, plants, botanical items + +UPDATED: 02.01.2026 - Zero-tolerance style enforcement """ import os @@ -21,9 +25,21 @@ BIOME_ROOT = PROJECT_ROOT / "assets/slike/biomi" API_KEY = os.getenv("GEMINI_API_KEY") # Set this in environment API_URL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro-image:generateImage" -# Art styles -STYLE_A = "cartoon vector art with bold black outlines (1.4px), flat vibrant colors, clean playful aesthetic" -STYLE_B = "dark hand-drawn gritty noir style with dramatic shadows, high contrast, sketchy atmospheric lines" +# Art styles - STRICT ENFORCEMENT (02.01.2026) +STYLE_32_ENTITIES = """exact Dark-Chibi Noir style with: +- Very thick black outlines (4-5px bold marker lines) +- Chibi proportions (head 40-50% of total body, large features) +- Flat colors ONLY, NO gradients, NO soft shading +- Sharp block shadows (black/dark purple on one side for noir effect) +- Large empty eyes (white or red, NO pupils, cult-like) +- Pastel-gothic color palette (soft colors + dark accents)""" + +STYLE_30_VEGETATION = """exact Garden Story cozy botanical style with: +- Thin gentle outlines (1-2px) +- Soft watercolor-like shading (subtle gradients allowed) +- Rounded organic shapes, wholesome aesthetic +- Pastel-vibrant botanical colors +- Friendly, inviting, nature-focused look""" # ======================================== # BIOME DEFINITIONS @@ -85,8 +101,8 @@ def check_existing_assets(biome_name, category): return list(set(existing)) -def generate_asset_prompt(asset_name, asset_type, style): - """Generate prompt for specific asset""" +def generate_asset_prompt(asset_name, asset_type, is_vegetation=False): + """Generate prompt for specific asset with strict style enforcement""" category_prompts = { "rekviziti": "2D game prop", "npcs": "2D game character NPC", @@ -101,12 +117,17 @@ def generate_asset_prompt(asset_name, asset_type, style): } base_prompt = category_prompts.get(asset_type, "2D game asset") - style_text = STYLE_A if style == "A" else STYLE_B + + # Select style based on asset type + if asset_type == "vegetacija" or is_vegetation: + style_text = STYLE_30_VEGETATION + else: + style_text = STYLE_32_ENTITIES # Format asset name to readable readable_name = asset_name.replace("_", " ").title() - prompt = f"{base_prompt}, {style_text}. Asset: {readable_name}. Background: SOLID BRIGHT CHROMA KEY GREEN (#00FF00), centered, game-ready." + prompt = f"{base_prompt}, {style_text}. Asset: {readable_name}. Background: SOLID CHROMA GREEN (#00FF00), centered, animation-ready, game-ready." return prompt @@ -134,29 +155,30 @@ def generate_missing_assets(biome_name, category, assets_list): print(f"\n🎨 Generating {biome_name}/{category}: {len(missing)} assets missing") for asset_name in missing: - for style in ["A", "B"]: - filename = f"{asset_name.lower()}_style{style.lower()}.png" - filepath = BIOME_ROOT / biome_name / category / filename - - if filepath.exists(): - print(f"⏭️ Skipping (exists): {filename}") - continue - - print(f"🖼️ Generating: {filename}") - - prompt = generate_asset_prompt(asset_name, category, style) - - # TODO: Replace with actual API call - # For now, just create placeholder - print(f" Prompt: {prompt[:80]}...") - - # Simulate generation delay - time.sleep(1) - - # NOTE: Replace this with actual image generation API call - # image_data = call_image_api(prompt) - # save_to_file(image_data, filepath) - + filename = f"{asset_name.lower()}.png" + filepath = BIOME_ROOT / biome_name / category / filename + + if filepath.exists(): + print(f"⏭️ Skipping (exists): {filename}") + continue + + print(f"🖼️ Generating: {filename}") + + # Check if this is vegetation for style selection + is_veg = (category == "vegetacija") + prompt = generate_asset_prompt(asset_name, category, is_vegetation=is_veg) + + # TODO: Replace with actual API call + # For now, just create placeholder + print(f" Prompt: {prompt[:100]}...") + + # Simulate generation delay + time.sleep(1) + + # NOTE: Replace this with actual image generation API call + # image_data = call_image_api(prompt) + # save_to_file(image_data, filepath) + print(f"✅ {biome_name}/{category} complete!") # ========================================