Skip to content

Wizard de Creacion

vykymoon edited this page Sep 30, 2026 · 1 revision

Wizard de Creación de Personaje

El wizard guía la creación en 5 pantallas. Cada una tiene su FXML en src/main/resources/fxml/ y su propio controlador.

flowchart LR
    G[Galería] --> S1[1. Nombre y raza]
    S1 --> S2[2. Clase]
    S2 --> S3[3. Habilidades]
    S3 --> S4[4. Vestuario]
    S4 --> S5[5. Resumen]
    S5 -->|Confirmar| G
    S2 -.Atrás.-> S1
    S3 -.Atrás.-> S2
    S4 -.Atrás.-> S3
    S5 -.Atrás.-> S4
Loading
Paso Controlador FXML Obligatorio
1 Step1NameRaceController step1_name_race.fxml Nombre y raza
2 Step2ClassController step2_class.fxml Clase
3 Step3SkillsController step3_skills.fxml No (puede no llevar habilidades)
4 Step4OutfitController step4_outfit.fxml No (puede no llevar vestuario)
5 Step5SummaryController step5_summary.fxml Confirmar

WizardSession: el estado compartido

WizardSession es un objeto simple que se pasa por constructor de un paso al siguiente. Guarda nombre, raza, clase y las listas de habilidades y vestuario elegidas. Como cada pantalla lee y escribe ahí, volver atrás conserva lo ya elegido: al iniciar, cada paso rellena sus controles con lo que hay en la sesión.

El Character definitivo no existe hasta el paso 5.

Paso 1 — Nombre y raza

  • Llena el ComboBox<Race> con CatalogManager.getInstance().getAvailableRaces().
  • Al cambiar la raza muestra la foto (RaceAvatarLoader), la descripción y los atributos base (FUE/DES/INT/VIT).
  • Al avanzar valida: nombre no vacío y raza elegida (si no, muestra una alerta "Faltan datos").
  • Botón para volver al menú (galería).

Paso 2 — Clase

Llena el combo con las clases del catálogo, valida la selección y avanza. No sabe nada de JSON ni de otras pantallas.

Paso 3 — Habilidades

  • Lista con selección múltiple.
  • Muestra solo las habilidades que cumplen skill.isAvailableFor(raza, clase).
  • Si hay ocultas, una etiqueta avisa: "N habilidad(es) no aparecen: requieren otra raza o clase."
  • Al ir atrás o adelante guarda la selección en la sesión.

Paso 4 — Vestuario

Igual que el paso 3 pero con Outfit. Cada fila muestra el sprite (SpriteLoader), el nombre y el slot. Si el PNG falta o está corrupto, SpriteLoader dibuja un recuadro de color según el slot con la inicial de la pieza, en vez de fallar o dejar un hueco.

Paso 5 — Resumen y confirmación

Muestra en un TextArea el nombre, raza, clase, habilidades y vestuario. Al confirmar (onConfirm):

  1. Comprueba characterDAO.existsByName(nombre); si ya existe, avisa "Nombre duplicado" y se queda en la pantalla.
  2. Construye el personaje con CharacterBuilder (withName, withRace, withClass, addSkill×N, addOutfit×N, build).
  3. Guarda con characterDAO.save(character).
  4. Muestra "Personaje creado" y vuelve a la galería.

Si el Builder lanza IllegalStateException (ítem no permitido, falta un dato), se muestra con DialogUtils.warning.

Defensa en dos niveles

Nivel Qué hace
UI (pasos 3 y 4) Filtra y oculta lo no elegible: el usuario normalmente no puede elegirlo
CharacterBuilder Rechaza lo no elegible aunque la UI falle (sesión con datos viejos, bug de navegación)

Interfaz y estética

  • Tema retro en css/retro-theme.css con la fuente Press Start 2P (licencia OFL incluida en fonts/OFL.txt).
  • DialogUtils centraliza los diálogos (info, warning, confirm).
  • SceneNavigator cambia de pantalla reemplazando la raíz de la escena.

Clone this wiki locally