diff --git a/tools/sprite-generation/engine/prompts/__init__.py b/tools/sprite-generation/engine/prompts/__init__.py index 18f7e23e..def547b6 100644 --- a/tools/sprite-generation/engine/prompts/__init__.py +++ b/tools/sprite-generation/engine/prompts/__init__.py @@ -132,7 +132,7 @@ def get_unit_style(combat_type: str) -> str: return comp.get("units", "") -def _sprite_properties(category: str, combat_type: str = "") -> dict[str, object]: +def _sprite_properties(category: str, combat_type: str = "", race: str = "") -> dict[str, object]: """Derive sprite properties from category and combat type. These properties drive rule matching in negatives.yaml. @@ -166,6 +166,7 @@ def _sprite_properties(category: str, combat_type: str = "") -> dict[str, object "has_character": has_character, "has_mount": has_mount, "facing": facing, + "race": race, } @@ -193,7 +194,7 @@ def _match_rule(rule_when: dict, props: dict[str, object]) -> bool: return True -def get_negative(category: str, combat_type: str = "") -> str: +def get_negative(category: str, combat_type: str = "", race: str = "") -> str: """Build the negative prompt dynamically from rules in negatives.yaml. Evaluates each rule against the sprite's derived properties. @@ -201,7 +202,7 @@ def get_negative(category: str, combat_type: str = "") -> str: """ negs_data = _negatives() rules = negs_data.get("rules", []) - props = _sprite_properties(category, combat_type) + props = _sprite_properties(category, combat_type, race) parts: list[str] = [] for rule in rules: @@ -360,7 +361,8 @@ def compose_prompt( # No background color needed — rembg handles background removal in post-processing. parts.append( "game sprite, single character, simple background, " - "character walking AWAY toward bottom-left, BACK turned to camera" + "character walking AWAY toward bottom-left, BACK turned to camera, " + "STEEP top-down overhead view, top of head visible from above" ) # Layer 2: Unit class weapon/role — at token ~15, still within SDXL's top-weight zone. diff --git a/tools/sprite-generation/engine/prompts/composition.yaml b/tools/sprite-generation/engine/prompts/composition.yaml index 7908cead..96166870 100644 --- a/tools/sprite-generation/engine/prompts/composition.yaml +++ b/tools/sprite-generation/engine/prompts/composition.yaml @@ -45,39 +45,43 @@ edges: >- # Added "hand-painted digital art" to counter juggernaut's photorealism bias. units: >- character walking AWAY from viewer toward bottom-left corner, BACK turned to camera, - rear diagonal view from slightly above, floating, simple background, + STEEP top-down overhead view, DOTA 2 camera angle, looking steeply down from above, + top of head and helmet clearly visible from above, body appears compact from overhead perspective, + floating, simple background, NO floor NO ground NO surface NO shadow NO reflection, character suspended in air, full body visible head to feet, single figure, - hand-painted digital fantasy game art, Warcraft III sprite art style, + semi-realistic painted fantasy game art, detailed hand-painted illustration, NOT photorealistic, NOT a photograph, NOT 3D hyperrealistic render, flat even lighting, no cast shadows, clean crisp edges, masterpiece, best quality # Per-combat-type unit overrides (only where composition differs from default) units.cavalry: >- - horse and rider walking AWAY from viewer toward LOWER-LEFT corner, REAR view from above, - warhorse and rider moving southwest, back of rider visible, horse rear visible, + horse and rider walking AWAY from viewer toward LOWER-LEFT corner, + STEEP top-down overhead view, DOTA 2 camera angle, looking steeply down from above, + top of rider's helmet clearly visible from above, horse's back and rump visible from overhead, + back of rider visible, horse hindquarters and tail visible, floating, simple background, NO floor NO ground NO surface NO shadow, - isometric view from slightly above, full body of horse and rider visible head to hooves, - hand-painted digital fantasy game art, Warcraft III style, + full body of horse and rider visible head to hooves, + semi-realistic painted fantasy game art, detailed hand-painted illustration, NOT photorealistic, NOT a photograph, flat even lighting, no cast shadows, clean crisp edges, masterpiece units.siege: >- single siege engine game sprite, simple background, - isometric three-quarter view from above, angled toward lower-left, - hand-painted digital fantasy art, Warcraft III style, + STEEP top-down overhead view, angled toward lower-left, + semi-realistic painted fantasy game art, detailed hand-painted illustration, heavy wood and iron war machine, no people, rich saturated colors, sharp clean edges, masterpiece units.flying: >- single flying creature game sprite, simple background, - isometric view from above, soaring toward lower-left, wings spread, - hand-painted digital fantasy art, Warcraft III style, + STEEP overhead view from above, soaring toward lower-left, wings spread, + semi-realistic painted fantasy game art, detailed hand-painted illustration, rich saturated colors, sharp clean edges, masterpiece units.marine: >- single ship game sprite, simple background, - isometric three-quarter view from above, sailing toward lower-left, - hand-painted digital fantasy art, Civilization V style naval unit, + top-down isometric view from above, sailing toward lower-left, + semi-realistic painted fantasy game art, detailed hand-painted illustration, rich saturated colors, sharp clean edges, masterpiece buildings: >- @@ -90,16 +94,16 @@ buildings: >- resources: >- simple background, - single small game resource icon, 3/4 isometric view, + single small game resource icon, top-down isometric view, one isolated glowing resource node, NOT terrain, NOT ground texture, - polished hand-painted game art like Warcraft III or Civilization V resource, - vibrant colors, sharp detail, clean crisp edges, masterpiece, best quality + polished hand-painted fantasy game art, vibrant colors, + sharp detail, clean crisp edges, masterpiece, best quality improvements: >- simple background, - tiny game map icon sprite, 3/4 isometric view from above, + tiny game map icon sprite, top-down isometric view from above, ONE small simple object centered in frame, nothing else, - miniature game asset like a Civilization V map icon, + miniature hand-painted fantasy game asset, painted fantasy art, clean simple, clean crisp edges, masterpiece, best quality diff --git a/tools/sprite-generation/engine/prompts/negatives.yaml b/tools/sprite-generation/engine/prompts/negatives.yaml index 4306e1f2..46d6497d 100644 --- a/tools/sprite-generation/engine/prompts/negatives.yaml +++ b/tools/sprite-generation/engine/prompts/negatives.yaml @@ -85,12 +85,22 @@ rules: - name: no_photo when: { is_layered: true } - negate: "photograph, photorealistic, photo, 3D render, CGI, hyperrealism, ultra realistic, realism, realistic rendering" + negate: "photograph, photorealistic, photo, 3D render, CGI, hyperrealism, ultra realistic, realism, realistic rendering, studio lighting, grey studio background, product photography, studio render, 3D studio, render preview, CGI model" - name: no_modern_clothes when: { has_character: true } negate: "jeans, denim, t-shirt, hoodie, casual wear, modern clothing, contemporary clothes, business suit, office attire, sneakers, sport shoes, jacket, sweatshirt, polo shirt, hard hat, safety helmet, hi-vis vest, reflective vest, safety goggles, construction worker, yellow safety vest, orange vest, cargo pants" + # ── MOUNT-SPECIFIC ───────────────────────────────────────────────── + - name: no_fantasy_mount_colors + when: { has_mount: true } + negate: "green horse, neon horse, fantasy colored horse, magical horse, glowing horse, unicorn, rainbow horse, neon green animal, bright green creature, fluorescent animal, purple horse, blue horse, unnaturally colored animal" + + # ── RACE-SPECIFIC ────────────────────────────────────────────────── + - name: dwarf_anti_orc_bleed + when: { race: dwarves } + negate: "green skin, orc, goblin, troll, tusks, monster skin, creature skin, dark olive complexion, orcish, goblinoid" + # ── SPELL-SPECIFIC ───────────────────────────────────────────────── - name: no_characters_in_spells when: { background: black, has_character: false } diff --git a/tools/sprite-generation/engine/prompts/races.yaml b/tools/sprite-generation/engine/prompts/races.yaml index 260f792a..5eb37a56 100644 --- a/tools/sprite-generation/engine/prompts/races.yaml +++ b/tools/sprite-generation/engine/prompts/races.yaml @@ -27,7 +27,7 @@ humans: dwarves: body: "dwarf, SHORT and STOCKY with broad shoulders, thick limbs, barrel chest, wide stance, half the height of a human" - features: "ruddy complexion, strong jaw" + features: "ruddy human skin tone, peach-brown complexion, strong jaw, NOT green skin" hair: "thick auburn hair" armor: "heavy plate and chainmail with rune etchings" diff --git a/tools/sprite-generation/engine/prompts/unit_classes.yaml b/tools/sprite-generation/engine/prompts/unit_classes.yaml index ac6f9192..eb979392 100644 --- a/tools/sprite-generation/engine/prompts/unit_classes.yaml +++ b/tools/sprite-generation/engine/prompts/unit_classes.yaml @@ -93,7 +93,7 @@ cavalry: weapon: "rider holding lance or sword" equipment: "saddle and barding" armor: "plate barding on horse, leather and metal horse armor" - mount: "BROWN WARHORSE in walking pose, horse is brown/bay colored" + mount: "BROWN WARHORSE in walking pose, horse is natural brown/bay/chestnut colored, realistic horse colors, NOT green, NOT fantasy colored" stance: "both rider and horse fully visible" heavy_cavalry: @@ -101,7 +101,7 @@ heavy_cavalry: weapon: "rider in heavy plate armor with lance couched" equipment: "full plate barding on horse" armor: "iron and steel armor plates on both rider and mount" - mount: "large armored WARHORSE, horse is brown/chestnut" + mount: "large armored WARHORSE, horse is natural brown/chestnut colored, realistic horse colors, NOT green, NOT fantasy colored" stance: "imposing massive presence, both mount and rider fully visible" # ─── SIEGE ─────────────────────────────────────────────────────────────