Arquitectura del sistema de batalla
El sistema de batalla de MCE esta construido sobre una arquitectura de componentes modulares. El BattleManager orquesta mas de 15 modulos especializados, cada uno responsable de un aspecto individual del combate. Un BattleStateMachine controla el flujo de turnos, y todo el sistema esta conectado mediante inyeccion de dependencias de Zenject.
Vision general de la arquitectura
BattleLauncher
└─ BattleManager (orquestador)
├─ BattleStateMachine (flujo de turnos)
├─ BattlersModule (instancias de combatientes)
├─ HealthModule (HP, debilitamiento)
├─ MovesModule (ejecucion de movimientos, PP)
├─ ItemsModule (objetos en batalla)
├─ CaptureModule (mecanicas de captura)
├─ AIModule (decisiones del enemigo)
├─ AnimationModule (animaciones de batalla)
├─ AudioModule (musica, SFX)
├─ StatusesModule (quemadura, veneno, sueno...)
├─ BattlerStatsModule (niveles de estadisticas)
├─ BattlerSwitchModule (cambio de equipo)
├─ RostersModule (gestion de equipo)
├─ ScenariosModule (config. tipo de batalla)
├─ MegaModule (Mega Evolucion)
└─ CharactersModule (sprites de entrenadores)
BattleManager
El BattleManager es el coordinador central. No contiene logica de batalla en si mismo; en su lugar, delega a sus modulos. Sus responsabilidades son:
- Inicializar todos los modulos cuando comienza una batalla.
- Proporcionar un punto de referencia compartido para la comunicacion entre modulos.
- Recibir comandos de la UI (acciones del jugador) y de la IA (acciones del enemigo).
- Senalizar eventos de inicio y fin de batalla.
El BattleManager implementa IBattleManager, que es la interfaz interna utilizada por los modulos para comunicarse entre si.
BattleStateMachine
El BattleStateMachine controla el flujo basado en turnos:
BattleStart
-> Introduction (mostrar oponentes, reproducir musica)
-> TurnStart
-> ActionSelection (jugador elige Luchar/Mochila/Monstruo/Huir)
-> ActionExecution (resolver todas las acciones en orden de velocidad)
-> TurnEffects (clima, dano de estado, habilidades de fin de turno)
-> FaintCheck (verificar si algun combatiente se debilito)
-> ReplaceFainted (jugador/IA envia el siguiente monstruo)
-> TurnEnd
-> [volver a TurnStart si la batalla continua]
-> BattleEnd (determinar ganador)
-> Results (XP, EVs, dinero, resultado de captura)
BattleCleanup
Cada estado es una clase discreta. Las transiciones son deterministas: no hay ambiguedad sobre que estado sigue a cual.
Modulos de batalla en detalle
BattlersModule
Gestiona las instancias de Battler para ambos lados. Un Battler es la representacion en batalla de un MonsterInstance:
- Rastrea el HP actual, PP de cada movimiento, niveles de estadisticas, estados volatiles.
- Mantiene referencias al
MonsterInstancesubyacente y alMonsterEntry. - Calcula estadisticas efectivas (base + IVs + EVs + naturaleza + niveles de estadisticas).
HealthModule
Maneja todos los cambios de HP:
- Aplicacion de dano (despues de efectividad de tipo, STAB, golpes criticos, niveles de estadisticas).
- Curacion (objetos, movimientos, habilidades).
- Deteccion de debilitamiento y procesamiento de debilitamiento.
- Sustitutos y efectos tipo Focus Sash.
MovesModule
El motor central de dano:
- Seleccion y validacion de movimientos (verificacion de PP, movimientos deshabilitados, movimientos bloqueados por eleccion).
- Calculo de dano usando formulas Gen V+.
- Consulta de efectividad de tipo.
- Determinacion de golpes criticos.
- Movimientos de multiples golpes, movimientos de dano fijo, movimientos OHKO.
- Verificaciones de precision y evasion.
- Efectos de movimientos (cambios de estadisticas, infligir estados, efectos de campo).
ItemsModule
Uso de objetos en batalla:
- Objetos de curacion (Pocion, Super Pocion, etc.).
- Objetos de cura de estado (Antidoto, Despertar, etc.).
- Objetos de batalla (Ataque X, Defensa X, etc.).
- Los objetos se consumen de la mochila del jugador al usarlos.
CaptureModule
Mecanicas de captura de monstruos salvajes:
- Calculo de tasa de captura basado en la tasa de captura de la especie, % de HP actual, condicion de estado y tipo de bola.
- Animacion de agitacion de bola (1-3 agitaciones antes de captura o escape).
- Probabilidad de captura critica.
- Anade el monstruo capturado al equipo del jugador o al almacenamiento del PC.
AIModule
Delega a una estrategia IBattleAI intercambiable:
- Recibe el estado actual de la batalla.
- Devuelve una
BattleAction(que movimiento usar, si cambiar, si usar un objeto). - Consulte IA de Batalla para detalles sobre estrategias integradas y personalizadas.
StatusesModule
Gestiona condiciones de estado no volatiles y volatiles:
No volatiles (solo una a la vez):
- Quemadura, Congelacion, Paralisis, Veneno, Veneno grave, Sueno.
Volatiles (se pueden acumular):
- Confusion, Enamoramiento, Retroceso, Atrapado, Drenadoras, y mas.
Cada estado aplica sus efectos en el momento correcto del ciclo de turnos (por ejemplo, dano por quemadura al final del turno, verificacion de paralisis antes de la ejecucion del movimiento).
BattlerStatsModule
Maneja las modificaciones de niveles de estadisticas:
- Los niveles de estadisticas van de -6 a +6.
- Cada nivel aplica un multiplicador: +1 = 1.5x, +2 = 2.0x, ..., -1 = 0.67x, etc.
- Rastrea que estadisticas han sido modificadas y cuanto.
- Maneja habilidades que previenen caidas de estadisticas (Clear Body, White Smoke).
MegaModule
Soporte de Mega Evolucion:
- Verifica si la especie del combatiente activo tiene una forma Mega.
- Verifica si el jugador tiene el objeto Mega requerido.
- Activa la animacion de Mega Evolucion.
- Aplica las sobreescrituras de estadisticas y tipo de la forma Mega.
- Solo una Mega Evolucion por batalla por entrenador.
Ejemplo de flujo de batalla
Esto es lo que sucede cuando el jugador selecciona "Luchar" y elige un movimiento:
- ActionSelection -- El jugador elige un movimiento del panel de 4 movimientos.
- Calculo de prioridad -- Todas las acciones (jugador + IA) se ordenan por:
- Prioridad del movimiento (por ejemplo, Quick Attack tiene prioridad +1).
- Estadistica de velocidad (mayor va primero, con desempate aleatorio).
- Ejecucion del movimiento (para el combatiente mas rapido):
- Verificar precision: ¿acierta el movimiento?
- Calcular dano (si causa dano):
((2*Nivel/5+2) * Poder * Atk/Def) / 50 + 2 - Aplicar modificadores: STAB, efectividad de tipo, golpe critico, factor aleatorio (0.85-1.0), objetos, habilidades, clima.
- Aplicar efectos secundarios (cambios de estadisticas, condiciones de estado).
- Ejecucion del movimiento (para el combatiente mas lento, si sigue en pie).
- TurnEffects -- Dano climatico, dano de estado, efectos de objetos portados, activaciones de habilidades.
- FaintCheck -- Si un combatiente tiene 0 HP, procesar debilitamiento (dar XP/EVs, verificar evolucion).
Batallas salvajes vs de entrenador
| Aspecto | Batalla salvaje | Batalla de entrenador |
|---|---|---|
| Se puede capturar | Si | No |
| Se puede huir | Si (con verificacion de huida) | No |
| Equipo oponente | 1 monstruo | 1-6 monstruos |
| Dinero de premio | No | Si (basado en clase de entrenador + nivel) |
| Comportamiento de IA | Tipicamente aleatorio | Configurable por entrenador |
| Revancha | Encuentro aleatorio | Con guion (CommandGraph) |
Configuracion de batalla
El ScriptableObject BattleConfigurationFile controla los ajustes globales de batalla:
- Velocidad de batalla predeterminada.
- Preferencias de saltar animaciones.
- Tasa de golpes criticos.
- Efectos climaticos.
- Modificadores de formula de experiencia.
- Modificadores de tasa de captura.
Acceda a el en Assets/OpenMon/Core/Runtime/Configuration/.
Escuchar eventos de batalla
Todos los niveles (SDK)
IBattleSystem battle = engine.Battle;
battle.OnBattleStarted += () => Debug.Log("Battle started");
battle.OnBattleEnded += (won) => Debug.Log($"Battle ended, won: {won}");
Nivel Source (eventos internos)
Con acceso al codigo fuente, puede suscribirse a eventos internos granulares en modulos individuales (dano infligido, estado aplicado, intento de captura, etc.).