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:
- BattleAI -- El punto de entrada que recibe el estado actual de la batalla y devuelve una
BattleAction. - 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:
| Componente | Descripcion |
|---|---|
PerformEffectiveMove | Usar el movimiento con mejor efectividad de tipo |
PerformRandomMove | Usar un movimiento aleatorio |
MegaOrGigaIfCan | Activar Mega Evolucion o Gigantamax si esta disponible |
SwitchToEffectiveMonster | Cambiar a un miembro del equipo con ventaja de tipo |
UseBattleItems | Usar objetos de curacion o estado cuando el HP es bajo |
IfWildWithRunChanceRun | Los monstruos salvajes pueden intentar huir |
Configurar IA por entrenador
Cada NPC entrenador puede tener una configuracion de IA diferente:
- En los datos del
Actoro encuentro del entrenador, busque el campo AI Configuration. - Asigne un ScriptableObject
BattleAI. - 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:
- Crear nuevos ScriptableObjects
BattleAIen el editor. - Configurar la lista de componentes de accion via el Inspector.
- 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
- Instale las dependencias de ML-Agents:
.\MLAgentsInstall.ps1 - Configure los parametros de entrenamiento en
MLAgentsConfig/OpenMonAgent.yaml - Inicie el entrenamiento:
.\RunMLTraining.ps1 - Monitoree con TensorBoard:
.\ViewMLResults.ps1 - Exporte el modelo entrenado (archivo
.onnx) - 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.
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
| Dificultad | Componentes de IA | Donde usar |
|---|---|---|
| Muy facil | Solo movimiento aleatorio | Encuentros salvajes |
| Facil | Aleatorio con movimientos ponderados | Rutas tempranas, novatos |
| Media | Consciente de efectividad de tipo | Entrenadores de gimnasio, rivales |
| Dificil | Efectividad + cambio + objetos | Lideres de gimnasio, Alto Mando |
| Experto | Composicion completa + prediccion | Campeon, post-juego |
| Neuronal | Modelo entrenado con ML | Competitivo, modos desafio |
Mejores practicas
- Ajuste la IA al contexto narrativo. Un cazabichos aleatorio no deberia jugar como el Campeon.
- Pruebe la IA contra equipos del jugador de nivel similar. Una IA desequilibrada se siente injusta.
- Use el patron de componentes de accion. Es mas facil de mantener que scripts de IA monoliticos.
- Proporcione respaldos. Siempre incluya
PerformRandomMovecomo ultima accion para evitar que la IA se quede atascada. - No sobre-optimice la IA para entrenadores tempranos. Los jugadores necesitan aprender el sistema antes de enfrentar oponentes inteligentes.