---
name: comfyui_build_enemy_creature_workflow
kind: function
lang: py
domain: ml
version: "1.0.0"
purity: pure
signature: "def comfyui_build_enemy_creature_workflow(creature: str, *, variant: str | None = None, style: str = \"game creature, full body\", checkpoint: str = \"IMG_dreamshaper_8.safetensors\", size: int = 512, transparent: bool = True, seed: int = 0, lora: str | None = None, lora_strength: float = 1.0, rembg_model: str = \"u2net\", negative: str | None = None, steps: int = 28, cfg: float = 7.0, sampler_name: str = \"dpmpp_2m\", scheduler: str = \"karras\", filename_prefix: str = \"enemy_creature\") -> dict"
description: "Construye el dict (API format) del workflow de UN enemigo/criatura de juego 2D (goblin, esqueleto, slime, dragon, boss, elemental): figura de cuerpo entero centrada, fondo limpio uniforme recortable a alpha, estilo consistente entre criaturas del bestiario. Variantes por nivel/elemento (ice, fire, elite, corrupted) via `variant`. Compone comfyui_build_txt2img_workflow + comfyui_inject_lora (estilo opcional) + Image Rembg (fondo transparente si transparent). Hermano de comfyui_build_item_icon/ui_hud/sprite_sheet_workflow. Pura, sin red ni I/O. class_types verificados contra /object_info."
tags: [comfyui, ml, gamedev-2d, creature, enemy, monster, bestiary, rembg, workflow]
uses_functions: [comfyui_build_txt2img_workflow_py_ml, comfyui_inject_lora_py_ml]
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: []
params:
  - name: creature
    desc: "Descripcion de la criatura/enemigo (ej. 'goblin warrior', 'skeleton archer', 'green slime', 'fire dragon', 'orc boss'). Se inserta en un prompt scaffold de criatura. No puede estar vacio."
  - name: variant
    desc: "Variante por nivel o elemento (ej. 'ice', 'fire', 'corrupted', 'elite', 'shadow'). Se antepone a la criatura ('ice goblin warrior') para generar una familia coherente del MISMO enemigo. None/'' = criatura base. keyword-only."
  - name: style
    desc: "Descriptor de estilo que mantiene consistentes las criaturas del bestiario (ej. 'game creature, full body', 'dark fantasy creature', 'cartoon RPG monster', 'pixel art creature'). Pasa el MISMO style + checkpoint + lora a todas las criaturas del set para coherencia visual. keyword-only."
  - name: checkpoint
    desc: "Checkpoint del servidor. 'IMG_dreamshaper_8.safetensors' (SD1.5, holgado en 8GB lowvram) por defecto; 'IMG_juggernaut_xl_v11.safetensors' para SDXL (mas VRAM, subir size). keyword-only."
  - name: size
    desc: "Lado del cuadrado en px (width = height = size). 512 SD1.5 por defecto. keyword-only."
  - name: transparent
    desc: "Si True inyecta Image Rembg y el PNG sale con alpha (fondo recortado, listo como sprite/token). False = criatura opaca sobre fondo plano, recortable luego por el caller. keyword-only."
  - name: seed
    desc: "Semilla del KSampler. Misma seed + misma criatura/style -> misma figura; variar solo `variant` da variantes coherentes. keyword-only."
  - name: lora
    desc: "LoRA de estilo/criatura opcional en models/loras (ej. 'SD15_dark_fantasy.safetensors', 'SDXL_monster_design.safetensors'). None = sin LoRA. keyword-only."
  - name: lora_strength
    desc: "Fuerza del LoRA sobre model y clip. Se clampa a [0.0, 2.0]. keyword-only."
  - name: rembg_model
    desc: "Modelo Rembg ('u2net' general, 'isnet-anime' para anime). Solo se usa si transparent=True. keyword-only."
  - name: negative
    desc: "Prompt negativo. None usa el negativo por defecto pensado para criaturas (una criatura entera, fondo limpio, sin texto/recorte; no filtra ningun tipo ni elemento). keyword-only."
  - name: steps
    desc: "Pasos del KSampler. keyword-only."
  - name: cfg
    desc: "CFG del KSampler. keyword-only."
  - name: sampler_name
    desc: "Sampler del KSampler. keyword-only."
  - name: scheduler
    desc: "Scheduler del KSampler. keyword-only."
  - name: filename_prefix
    desc: "Prefijo del PNG en output/. keyword-only."
output: "dict en API format listo para comfyui_submit_workflow: base txt2img cuadrada con prompt scaffold de criatura ('{variant} {creature}, {style}, full body, centered, plain background, game asset, ...') + LoRA de estilo opcional + Image Rembg (si transparent). UNA criatura; un bestiario -> llamar por creature con mismo style/checkpoint/lora; variantes de un enemigo -> misma creature/seed variando `variant`."
tested: true
tests: ["golden transparent: clases CheckpointLoaderSimple/KSampler/VAEDecode/SaveImage/Image Rembg; creature + variant + 'full body' + 'centered' + 'game asset' en prompt; SaveImage <- Rembg; transparency True", "edge transparent=False: sin Rembg, SaveImage <- VAEDecode", "edge size: width==height==768 (cuadrado)", "edge variant opcional: sin variant el prompt arranca con la criatura base", "edge style en prompt", "edge lora: LoraLoader presente con strength", "error creature vacio -> ValueError", "determinismo"]
test_file_path: "python/functions/ml/comfyui_build_enemy_creature_workflow_test.py"
file_path: "python/functions/ml/comfyui_build_enemy_creature_workflow.py"
---

## Ejemplo

```python
import sys, os
sys.path.insert(0, os.path.join(os.environ["HOME"], "fn_registry", "python", "functions"))
from ml.comfyui_build_enemy_creature_workflow import comfyui_build_enemy_creature_workflow

# Un enemigo de cuerpo entero con fondo transparente (alpha), listo para submit.
wf = comfyui_build_enemy_creature_workflow(
    "goblin warrior",
    variant="ice",
    style="dark fantasy creature, full body",
    transparent=True,
    seed=7,
)
# Variantes coherentes del MISMO enemigo: misma creature/seed/style, cambia variant.
#   for v in ["ice", "fire", "corrupted", "elite"]:
#       wf = comfyui_build_enemy_creature_workflow("goblin warrior", variant=v,
#                                                  style="dark fantasy creature, full body", seed=7)
#       comfyui_submit_workflow(wf)  # -> comfyui_wait_result -> comfyui_fetch_output_image
# Bestiario completo: variar `creature` con el mismo style/checkpoint/lora.
# Contact-sheet del set: montar los PNG resultantes con comfyui_build_grid.
```

O lanzable directo con: `./fn run comfyui_build_enemy_creature_workflow` (imprime nodos + class_types del ejemplo).

## Cuando usarla

Cuando necesites enemigos/criaturas para un juego (RPG, roguelike, tower defense,
bestiario) con look consistente entre criaturas: goblins, esqueletos, slimes,
dragones, bosses, elementales. Pasa el MISMO `style` + `checkpoint` + (`lora`) a
todas las criaturas del set para que combinen visualmente; varía solo `creature`.
Para las variantes de un enemigo (ice/fire/elite/corrupted) fija `creature` + `seed`
+ `style` y varía solo `variant`. `transparent` recorta el fondo (alpha) listo como
sprite/token para el motor. Para un atlas/contact-sheet, genera cada criatura y
monta los PNG con `comfyui_build_grid`.

## Gotchas

- **El recorte usa Rembg, NO luma-to-alpha**: una criatura es un sujeto solido con
  silueta definida, rembg la recorta limpio. `comfyui_matting_luma_to_alpha` es para
  translucidos sobre negro (humo/fuego/magia). Si la criatura es un slime translucido
  o un fantasma etereo y quieres conservar la translucidez, pon `transparent=False` y
  recorta con luma-to-alpha en un paso aparte.
- **Coherencia del bestiario = mismos parametros**: si cambias `style`/`checkpoint`/
  `lora`/`seed` entre criaturas, el set deja de combinar. Fija esos y varía solo
  `creature` (y `variant` para las variantes de un mismo enemigo).
- **`variant` se antepone a la criatura**: `variant="ice"` + `creature="goblin warrior"`
  -> prompt "ice goblin warrior". Deja `variant=None` para la criatura base.
- **SDXL pide mas VRAM y resolucion**: con `checkpoint="IMG_juggernaut_xl_v11.safetensors"`
  sube `size` a 768/1024; con IMG_dreamshaper_8 (SD1.5) deja 512 (holgado en 8GB lowvram).
  Si hay OOM, baja `size` o usa SD1.5.
- Si el modelo mete varias criaturas o recorta el cuerpo, el negativo por defecto ya
  empuja a "single creature / full body / no cropped / no out of frame"; refuerza
  `style` con "full body shot, standing, isolated" si insiste.
- `transparent=False` deja la criatura opaca sobre fondo plano: util si prefieres
  recortar fuera del workflow o el motor compone sobre un fondo solido.
- Es una funcion **pura**: solo arma el dict. La generacion real (GPU) la hacen
  `comfyui_submit_workflow` + `comfyui_wait_result` + `comfyui_fetch_output_image`.
