🎨 STRICT STYLE ENFORCEMENT - Style 32/30 Mandatory
STYLE 32 (Dark-Chibi Noir) - ALL entities: - 4-5px thick black outlines (bold marker) - Chibi proportions (40-50% head:body) - Flat colors ONLY (zero gradients) - Sharp noir block shadows - Large empty eyes (NO pupils) - Pastel-gothic palette STYLE 30 (Garden Story Cozy) - ALL vegetation: - Thin outlines (1-2px) - Soft watercolor shading - Rounded organic shapes - Pastel-botanical colors - Wholesome aesthetic Updated files: - STYLE_32_STRICT_MANDATE.md (new enforcement document) - scripts/generate_all_biomes_complete.py (auto-style selection) Zero-tolerance policy for style drift.
This commit is contained in:
156
STYLE_32_STRICT_MANDATE.md
Normal file
156
STYLE_32_STRICT_MANDATE.md
Normal file
@@ -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**
|
||||||
@@ -1,7 +1,11 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
"""
|
"""
|
||||||
COMPLETE BIOME ASSET GENERATOR
|
COMPLETE BIOME ASSET GENERATOR - STRICT STYLE ENFORCEMENT
|
||||||
Generates ALL missing biome assets with dual art style (Style A + B)
|
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
|
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_KEY = os.getenv("GEMINI_API_KEY") # Set this in environment
|
||||||
API_URL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro-image:generateImage"
|
API_URL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro-image:generateImage"
|
||||||
|
|
||||||
# Art styles
|
# Art styles - STRICT ENFORCEMENT (02.01.2026)
|
||||||
STYLE_A = "cartoon vector art with bold black outlines (1.4px), flat vibrant colors, clean playful aesthetic"
|
STYLE_32_ENTITIES = """exact Dark-Chibi Noir style with:
|
||||||
STYLE_B = "dark hand-drawn gritty noir style with dramatic shadows, high contrast, sketchy atmospheric lines"
|
- 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
|
# BIOME DEFINITIONS
|
||||||
@@ -85,8 +101,8 @@ def check_existing_assets(biome_name, category):
|
|||||||
|
|
||||||
return list(set(existing))
|
return list(set(existing))
|
||||||
|
|
||||||
def generate_asset_prompt(asset_name, asset_type, style):
|
def generate_asset_prompt(asset_name, asset_type, is_vegetation=False):
|
||||||
"""Generate prompt for specific asset"""
|
"""Generate prompt for specific asset with strict style enforcement"""
|
||||||
category_prompts = {
|
category_prompts = {
|
||||||
"rekviziti": "2D game prop",
|
"rekviziti": "2D game prop",
|
||||||
"npcs": "2D game character NPC",
|
"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")
|
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
|
# Format asset name to readable
|
||||||
readable_name = asset_name.replace("_", " ").title()
|
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
|
return prompt
|
||||||
|
|
||||||
@@ -134,28 +155,29 @@ def generate_missing_assets(biome_name, category, assets_list):
|
|||||||
print(f"\n🎨 Generating {biome_name}/{category}: {len(missing)} assets missing")
|
print(f"\n🎨 Generating {biome_name}/{category}: {len(missing)} assets missing")
|
||||||
|
|
||||||
for asset_name in missing:
|
for asset_name in missing:
|
||||||
for style in ["A", "B"]:
|
filename = f"{asset_name.lower()}.png"
|
||||||
filename = f"{asset_name.lower()}_style{style.lower()}.png"
|
filepath = BIOME_ROOT / biome_name / category / filename
|
||||||
filepath = BIOME_ROOT / biome_name / category / filename
|
|
||||||
|
|
||||||
if filepath.exists():
|
if filepath.exists():
|
||||||
print(f"⏭️ Skipping (exists): {filename}")
|
print(f"⏭️ Skipping (exists): {filename}")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
print(f"🖼️ Generating: {filename}")
|
print(f"🖼️ Generating: {filename}")
|
||||||
|
|
||||||
prompt = generate_asset_prompt(asset_name, category, style)
|
# 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
|
# TODO: Replace with actual API call
|
||||||
# For now, just create placeholder
|
# For now, just create placeholder
|
||||||
print(f" Prompt: {prompt[:80]}...")
|
print(f" Prompt: {prompt[:100]}...")
|
||||||
|
|
||||||
# Simulate generation delay
|
# Simulate generation delay
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
||||||
# NOTE: Replace this with actual image generation API call
|
# NOTE: Replace this with actual image generation API call
|
||||||
# image_data = call_image_api(prompt)
|
# image_data = call_image_api(prompt)
|
||||||
# save_to_file(image_data, filepath)
|
# save_to_file(image_data, filepath)
|
||||||
|
|
||||||
print(f"✅ {biome_name}/{category} complete!")
|
print(f"✅ {biome_name}/{category} complete!")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user