---
name: comfyui_build_vehicle_mount_workflow
kind: function
lang: py
domain: ml
version: "1.0.0"
purity: pure
signature: "def comfyui_build_vehicle_mount_workflow(vehicle: str, *, view: str = \"side\", style: str = \"game vehicle\", 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 = \"vehicle_mount\") -> dict"
description: "Construye el dict (API format) del workflow de UN vehiculo o montura de juego 2D (caballo, dragon-montura, nave espacial, coche, barco, carro, grifo, mecha): el vehiculo COMPLETO en vista lateral o isometrica, centrado, fondo limpio uniforme recortable a alpha, SIN jinete/conductor, para que el motor coloque encima al personaje que lo usa/conduce. Diferenciado de enemy_creature (sujeto a combatir) y prop_object (atrezzo inanimado): aqui el objeto se USA/MONTA, se genera vacio y a escala de vehiculo. Compone comfyui_build_txt2img_workflow + comfyui_inject_lora (estilo opcional) + Image Rembg (fondo transparente si transparent). Hermano de comfyui_build_enemy_creature/prop_object_workflow. Pura, sin red ni I/O. class_types verificados contra /object_info."
tags: [comfyui, ml, gamedev-2d, vehicle, mount, transport, 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: vehicle
    desc: "Descripcion del vehiculo o montura (ej. 'armored war horse with saddle', 'fantasy dragon mount', 'small spaceship', 'red sports car', 'wooden sailing ship', 'war chariot', 'griffon mount'). Se inserta en un prompt scaffold de vehiculo. No puede estar vacio."
  - name: view
    desc: "Vista/perspectiva del vehiculo. 'side' (lateral, para side-scrollers y presentacion limpia) por defecto; 'iso'/'isometric' para RPG isometrico; tambien vale texto libre ('three-quarter', 'top-down'). Se inserta como '{view} view' para fijar la geometria del parque movil. keyword-only."
  - name: style
    desc: "Descriptor de estilo que mantiene consistentes los vehiculos del set (ej. 'game vehicle', 'stylized fantasy mount', 'sci-fi spaceship art', 'cartoon racing car', 'pixel art vehicle'). Pasa el MISMO style + checkpoint + lora + view a todos los vehiculos 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 para soltar en la escena con el personaje encima). False = vehiculo opaco sobre fondo plano, recortable luego por el caller. keyword-only."
  - name: seed
    desc: "Semilla del KSampler. Misma seed + mismo vehicle/view/style -> mismo vehiculo. keyword-only."
  - name: lora
    desc: "LoRA de estilo opcional en models/loras (ej. 'SD15_vehicle_concept.safetensors', 'SDXL_mecha.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 vehiculos (un vehiculo entero VACIO sin jinete/conductor, fondo limpio, sin texto/recorte). 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 vehiculo ('{vehicle}, {view} view, {style}, full vehicle, centered, plain background, game asset, no rider, empty, ...') + LoRA de estilo opcional + Image Rembg (si transparent). UN vehiculo; para un parque movil -> llamar por cada vehicle con mismo view/style/checkpoint/lora; contact-sheet -> montar los PNG con comfyui_build_grid."
tested: true
tests: ["golden transparent: clases CheckpointLoaderSimple/KSampler/VAEDecode/SaveImage/Image Rembg; vehicle + 'side view' + 'full vehicle' + 'centered' + 'game asset' + 'no rider' en prompt; SaveImage <- Rembg; transparency True", "edge transparent=False: sin Rembg, SaveImage <- VAEDecode", "edge size: width==height==768 (cuadrado)", "edge view: 'isometric view' reflejado en prompt", "edge view default 'side view' y vehicle al inicio del scaffold", "edge style en prompt", "edge lora: LoraLoader presente con strength", "error vehicle vacio -> ValueError", "determinismo"]
test_file_path: "python/functions/ml/comfyui_build_vehicle_mount_workflow_test.py"
file_path: "python/functions/ml/comfyui_build_vehicle_mount_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_vehicle_mount_workflow import comfyui_build_vehicle_mount_workflow

# Un vehiculo/montura con fondo transparente (alpha), VACIO, listo para que el
# personaje lo use/conduzca encima en la escena.
wf = comfyui_build_vehicle_mount_workflow(
    "armored war horse with saddle",
    view="side",
    style="stylized fantasy mount",
    transparent=True,
    seed=7,
)
# Parque movil coherente: variar `vehicle` con el MISMO view/style/checkpoint/(lora).
#   for v in ["war horse", "fantasy dragon mount", "small spaceship", "wooden sailing ship"]:
#       wf = comfyui_build_vehicle_mount_workflow(v, view="side", style="game vehicle", seed=7)
#       comfyui_submit_workflow(wf)  # -> comfyui_wait_result -> comfyui_fetch_output_image
# Contact-sheet del parque movil: montar los PNG resultantes con comfyui_build_grid.
```

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

## Cuando usarla

Cuando necesites un vehiculo o montura que el personaje USE o CONDUZCA: caballo,
dragon-montura, nave espacial, coche, barco, carro, grifo, moto, mecha. A diferencia
de `comfyui_build_enemy_creature_workflow` (sujeto vivo a COMBATIR) y
`comfyui_build_prop_object_workflow` (atrezzo inanimado que decora el nivel y no se
interactua), aqui el objeto se MONTA/USA: se genera VACIO (sin jinete) y a escala de
vehiculo para que el personaje quepa encima/dentro, y el motor lo compone con el
sprite del personaje. Fija `view` (side/iso) y `style` + `checkpoint` + (`lora`) para
todo el parque movil y varia solo `vehicle` para que combinen. `transparent` recorta
el fondo (alpha) listo para soltar en la escena. Para un atlas/contact-sheet, genera
cada vehiculo y monta los PNG con `comfyui_build_grid`.

## Gotchas

- **Vehiculo/montura (se USA) != criatura (se COMBATE) != prop (decora)**: si el sujeto
  es un enemigo a derrotar usa `comfyui_build_enemy_creature_workflow`; si es atrezzo
  inanimado de escena usa `comfyui_build_prop_object_workflow`. Una montura viva
  (caballo, dragon que se cabalga) entra AQUI, no en enemy_creature, porque el objetivo
  es montarla.
- **Se genera VACIO (sin jinete)**: el negativo por defecto rechaza "person, rider,
  driver, passenger" para que el vehiculo salga sin nadie encima y el motor componga al
  personaje aparte. Si quieres el vehiculo CON jinete pintado, pasa `negative=""` o un
  negativo propio y anade el jinete al `vehicle`.
- **El recorte usa Rembg, NO luma-to-alpha**: un vehiculo es un objeto solido con
  silueta definida, rembg lo recorta limpio. `comfyui_matting_luma_to_alpha` es para
  translucidos sobre negro (humo/fuego/magia). Si el vehiculo es etereo o translucido
  (nave de energia, montura espectral), pon `transparent=False` y recorta con
  luma-to-alpha en un paso aparte.
- **`view` define la geometria**: side-scroller pide `view="side"`, RPG isometrico pide
  `view="iso"`. Mantenla consistente con el resto de assets del juego; si la mezclas, el
  parque movil deja de encajar con los tiles.
- **Coherencia del set = mismos parametros**: si cambias `view`/`style`/`checkpoint`/
  `lora`/`seed` entre vehiculos, el parque movil deja de combinar. Fija esos y varia solo
  `vehicle`.
- **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.
- `transparent=False` deja el vehiculo opaco 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`.
