🎨 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:
@@ -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!")
|
||||
|
||||
# ========================================
|
||||
|
||||
Reference in New Issue
Block a user