Saltar al contenido principal

IA de batalla

MCE usa un patron de estrategia intercambiable para la IA de batalla. El sistema de IA esta construido alrededor de la clase base BattleAI y una coleccion de componentes BattleAction que pueden componerse para crear diferentes niveles de dificultad y estilos de comportamiento.

Arquitectura

El flujo de la IA funciona en dos capas:

  1. BattleAI -- El punto de entrada que recibe el estado actual de la batalla y devuelve una BattleAction.
  2. Componentes BattleAction -- Unidades individuales de toma de decisiones que evaluan un aspecto de la batalla (por ejemplo, "deberia usar un movimiento super efectivo?" o "deberia cambiar a un monstruo resistente?").

Una instancia de BattleAI contiene una lista ordenada de componentes BattleAction. Los evalua en orden de prioridad, y el primero que produce una accion valida gana.

Estrategias de IA integradas

MCE incluye varias estrategias de IA que pueden mezclarse y combinarse:

RandomBattleAI

La IA mas simple. Elige un movimiento valido aleatorio cada turno.

  • Dificultad: Muy facil
  • Caso de uso: Encuentros salvajes, entrenadores del inicio
  • Comportamiento: Selecciona aleatoriamente entre los movimientos disponibles. Sin pensamiento estrategico.

PerformEffectiveMove

Elige el movimiento que causa el dano mas efectivo contra el objetivo actual.

  • Dificultad: Media
  • Caso de uso: Entrenadores de media partida, lideres de gimnasio
  • Comportamiento: Calcula la efectividad de tipo para cada movimiento disponible y elige el mejor. No tiene en cuenta cambios de estadisticas ni movimientos de estado.

PerformRandomMove

Similar a RandomBattleAI pero con seleccion de movimiento ponderada.

  • Dificultad: Facil
  • Caso de uso: Entrenadores de bajo nivel
  • Comportamiento: Selecciona un movimiento aleatoriamente, con ligera preferencia por movimientos de dano sobre movimientos de estado.

Componentes de accion integrados

Estos componentes pueden componerse en estrategias de IA personalizadas:

ComponenteDescripcion
PerformEffectiveMoveUsar el movimiento con mejor efectividad de tipo
PerformRandomMoveUsar un movimiento aleatorio
MegaOrGigaIfCanActivar Mega Evolucion o Gigantamax si esta disponible
SwitchToEffectiveMonsterCambiar a un miembro del equipo con ventaja de tipo
UseBattleItemsUsar objetos de curacion o estado cuando el HP es bajo
IfWildWithRunChanceRunLos monstruos salvajes pueden intentar huir

Configurar IA por entrenador

Cada NPC entrenador puede tener una configuracion de IA diferente:

  1. En los datos del Actor o encuentro del entrenador, busque el campo AI Configuration.
  2. Asigne un ScriptableObject BattleAI.
  3. Configure la lista de componentes de accion y su orden de prioridad.

Configuraciones de ejemplo:

Entrenador facil (Ruta 1)

1. PerformRandomMove

Entrenador medio (Puzzle de gimnasio)

1. MegaOrGigaIfCan
2. PerformEffectiveMove
3. PerformRandomMove (respaldo)

Entrenador dificil (Campeon)

1. MegaOrGigaIfCan
2. SwitchToEffectiveMonster (cuando esta en desventaja)
3. UseBattleItems (cuando HP < 25%)
4. PerformEffectiveMove
5. PerformRandomMove (respaldo)

La interfaz IBattleAI

Para usuarios de nivel DLL, el sistema de IA se accede a traves de la clase base BattleAI. Aunque no puede modificar la implementacion interna sin codigo fuente, puede:

  1. Crear nuevos ScriptableObjects BattleAI en el editor.
  2. Configurar la lista de componentes de accion via el Inspector.
  3. Asignarlos a entrenadores.

La interfaz clave:

public abstract class BattleAI : ScriptableObject
{
// List of BattleAction components evaluated in order
public List<BattleAction> Actions;
}

public abstract class BattleAction : ScriptableObject
{
// Evaluate whether this action should be taken
// Returns null if this action does not apply
public abstract BattleActionResult Evaluate(BattleContext context);
}

Integracion con ML-Agents

MCE incluye IA experimental basada en ML-Agents para dificultad avanzada:

MLBattleAI

Usa Unity ML-Agents para tomar decisiones basadas en una red neuronal entrenada.

  • Dificultad: Variable (depende del entrenamiento)
  • Caso de uso: Entrenadores de final de juego, IA competitiva, investigacion
  • Configuracion: Requiere el paquete ML-Agents y un modelo entrenado

Entrenar la IA

  1. Instale las dependencias de ML-Agents: .\MLAgentsInstall.ps1
  2. Configure los parametros de entrenamiento en MLAgentsConfig/OpenMonAgent.yaml
  3. Inicie el entrenamiento: .\RunMLTraining.ps1
  4. Monitoree con TensorBoard: .\ViewMLResults.ps1
  5. Exporte el modelo entrenado (archivo .onnx)
  6. Asigne el modelo al componente MLBattleAI

El MCEBattleAgent define los espacios de observacion y accion:

Observaciones (lo que ve la IA):

  • HP % del propio monstruo, tipos, niveles de estadisticas, condiciones de estado.
  • HP % del monstruo oponente, tipos, niveles de estadisticas, condiciones de estado.
  • Movimientos disponibles y sus tipos.
  • Estado del equipo (monstruos restantes, porcentajes de HP).

Acciones (lo que puede hacer la IA):

  • Usar movimiento 1-4.
  • Cambiar a miembro del equipo 1-5.
  • Usar un objeto.
Dependencia de ML-Agents

ML-Agents es un paquete separado con sus propias dependencias de Python. El sistema de batalla principal de MCE funciona sin el. Solo instale ML-Agents si planea usar IA basada en redes neuronales.

Crear IA personalizada (nivel Source)

Con acceso al codigo fuente, puede crear estrategias de IA completamente nuevas:

BattleAction personalizado

[CreateAssetMenu(menuName = "OpenMon/AI/Actions/Use Status Move If No Status")]
public class UseStatusMoveIfNoStatus : BattleAction
{
public override BattleActionResult Evaluate(BattleContext context)
{
// Check if opponent has no status condition
if (context.OpponentBattler.StatusCondition != StatusCondition.None)
return null; // Skip this action

// Find a status-inflicting move
foreach (var moveSlot in context.OwnBattler.MoveSlots)
{
if (moveSlot.Move.Category == MoveCategory.Status
&& moveSlot.CurrentPP > 0
&& moveSlot.Move.InflictsStatus)
{
return new BattleActionResult
{
ActionType = BattleActionType.UseMove,
MoveIndex = moveSlot.Index
};
}
}

return null; // No applicable status move found
}
}

BattleAI personalizado

[CreateAssetMenu(menuName = "OpenMon/AI/Strategies/Expert AI")]
public class ExpertBattleAI : BattleAI
{
// Override the decision pipeline if needed
public override BattleActionResult DecideAction(BattleContext context)
{
// Custom logic that goes beyond simple action composition
// e.g., look-ahead prediction, team synergy analysis
return base.DecideAction(context);
}
}

Guia de dificultad de IA

DificultadComponentes de IADonde usar
Muy facilSolo movimiento aleatorioEncuentros salvajes
FacilAleatorio con movimientos ponderadosRutas tempranas, novatos
MediaConsciente de efectividad de tipoEntrenadores de gimnasio, rivales
DificilEfectividad + cambio + objetosLideres de gimnasio, Alto Mando
ExpertoComposicion completa + prediccionCampeon, post-juego
NeuronalModelo entrenado con MLCompetitivo, modos desafio

Mejores practicas

  1. Ajuste la IA al contexto narrativo. Un cazabichos aleatorio no deberia jugar como el Campeon.
  2. Pruebe la IA contra equipos del jugador de nivel similar. Una IA desequilibrada se siente injusta.
  3. Use el patron de componentes de accion. Es mas facil de mantener que scripts de IA monoliticos.
  4. Proporcione respaldos. Siempre incluya PerformRandomMove como ultima accion para evitar que la IA se quede atascada.
  5. No sobre-optimice la IA para entrenadores tempranos. Los jugadores necesitan aprender el sistema antes de enfrentar oponentes inteligentes.