Saltearse al contenido

Balanceo de combate de NPCs

Descripción general

Los archivos del Combat Action Evaluator (CAE) configuran el sistema de IA de utilidad que impulsa el combate de los NPCs. Cada archivo define la frecuencia de ejecución del evaluador, un conjunto de acciones disponibles con nombre y condiciones de puntuación, y uno o más conjuntos de acciones que agrupan qué acciones y ataques básicos están activos en un estado de combate dado. El evaluador puntúa todas las acciones disponibles en cada tick y ejecuta la que tenga la puntuación más alta por encima de un umbral mínimo.

Flujo de IA de combate

flowchart TD;
A[NPC Enters Combat] --> B[Load Action Sets];
B --> C["Active Action Set<br>e.g. Default Combat"];
C --> D["Evaluator Tick<br>every N frames"];
D --> E[Score All Available Actions];
E --> F["Action: Melee Attack<br>Conditions → Score: 0.7"];
E --> G["Action: Ranged Attack<br>Conditions → Score: 0.3"];
E --> H["Action: Shield Block<br>Conditions → Score: 0.85"];
E --> I["Action: Flee<br>Conditions → Score: 0.2"];
F --> J["Highest Score<br>Above Threshold?"];
G --> J;
H --> J;
I --> J;
J -->|"Shield Block: 0.85"| K[Execute Shield Block];
J -->|"All below threshold"| L["Use Basic Attack<br>from ActionSet"];
K --> M{Action Complete};
L --> M;
M --> D;
style A fill:darkred,color:white;
style K fill:rebeccapurple,color:white;
style L fill:steelblue,color:white;

Transiciones de conjuntos de acciones

flowchart LR;
A["Default Set<br>Melee + Block"] -->|"HP < 30%"| B["Enraged Set<br>Aggressive + No Block"];
A -->|"Target far away"| C["Ranged Set<br>Projectile + Retreat"];
C -->|"Target close"| A;
B -->|"Healing received"| A;
style A fill:darkgreen,color:white;
style B fill:darkred,color:white;
style C fill:steelblue,color:white;

Ubicación de archivos

  • Assets/Server/NPC/Balancing/Beast/*.json — CAEs de animales y criaturas
  • Assets/Server/NPC/Balancing/Intelligent/*.json — CAEs de NPCs de facción
  • Assets/Server/NPC/Balancing/CAE_Test_*.json — CAEs de prueba y referencia

Esquema

Campos de nivel superior

FieldTypeRequiredDefaultDescripción
Type"CombatActionEvaluator"Identifica este archivo como un archivo CAE.
TargetMemoryDurationnumberNoCuántos segundos el NPC recuerda a un objetivo después de perderlo de vista.
CombatActionEvaluatorobjectEl bloque de configuración del evaluador (ver abajo).

Bloque CombatActionEvaluator

FieldTypeRequiredDefaultDescripción
RunConditionsarrayNoCondiciones evaluadas antes de ejecutar el evaluador completo. Todas deben pasar para que el evaluador proceda en este tick.
MinRunUtilitynumberNoPuntuación de utilidad combinada mínima de RunConditions requerida para ejecutar el evaluador.
MinActionUtilitynumberNoPuntuación de utilidad mínima que una acción debe alcanzar para ser considerada para ejecución.
AvailableActionsobjectDefiniciones de acciones con nombre. Las claves son IDs de acción referenciados por ActionSets.
ActionSetsobjectConjuntos con nombre de acciones activas y ataques básicos. El conjunto activo es controlado por el sub-estado de combate del NPC.

Entrada del arreglo RunConditions

Cada entrada es un objeto de condición (ver Toma de decisiones del NPC). Comúnmente usados:

TypePropósito
TimeSinceLastUsedLimita la frecuencia de ejecución del evaluador.
RandomiserAgrega aleatoriedad para evitar comportamiento perfectamente predecible.

Entrada de AvailableActions

Cada clave en AvailableActions es una acción con nombre. Los campos del objeto de acción:

FieldTypeRequiredDefaultDescripción
TypestringTipo de acción. Ver tabla de tipos de acción abajo.
DescriptionstringNoDescripción legible de la acción.
TargetstringNoCategoría del objetivo: "Hostile", "Friendly", "Self".
WeaponSlotnumberNoÍndice del slot de arma usado para esta acción.
SubStatestringNoSub-estado de combate a activar cuando esta acción se ejecuta (mapea a una clave de ActionSets).
AbilitystringNoID de habilidad a ejecutar.
AttackDistanceRange[number, number]NoDistancia [min, max] en bloques dentro de la cual esta acción puede usarse.
PostExecuteDistanceRange[number, number]NoRango de distancia que el NPC intenta mantener después de ejecutar.
ChargeFornumberNoSegundos de carga antes de ejecutar.
WeightCoefficientnumberNo1.0Multiplicador aplicado a la puntuación de utilidad final de esta acción.
InteractionVarsobjectNoSobrecargas de variables de interacción aplicadas cuando esta acción se dispara.
ConditionsarrayNoCondiciones de puntuación para esta acción específica (ver Toma de decisiones del NPC).

Tipos de acción

TypeDescripción
SelectBasicAttackTargetSelecciona un objetivo para ataques básicos usando las condiciones para puntuar candidatos.
AbilityEjecuta una habilidad con nombre (golpe cuerpo a cuerpo, lanzamiento a distancia, curación, etc.).

Entrada de ActionSets

Cada clave en ActionSets es un nombre de sub-estado (p.ej. "Default", "Ranged", "Attack"). El valor:

FieldTypeRequiredDefaultDescripción
BasicAttacksobjectNoConfiguración de ataques básicos para este sub-estado (ver abajo).
Actionsstring[]NoLista de IDs de acción de AvailableActions que se evalúan en este sub-estado.

Objeto BasicAttacks

FieldTypeRequiredDefaultDescripción
Attacksstring[]IDs de habilidad usados como ataques básicos.
RandomisebooleanNofalseSi es true, selecciona aleatoriamente de la lista Attacks en cada ciclo.
MaxRangenumberNoRango máximo en bloques para ataques básicos.
TimeoutnumberNoSegundos de espera para que el ataque impacte antes de cancelar.
CooldownRange[number, number]No[min, max] de enfriamiento en segundos entre ataques básicos.
UseProjectedDistancebooleanNofalseSi es true, usa la distancia proyectada (predicha) en lugar de la distancia actual.
InteractionVarsobjectNoSobrecargas de variables de interacción para todos los ataques básicos en este conjunto.

Ejemplos

CAE simple de bestia (Rata)

Una rata con un solo ataque de mordida, sin habilidades especiales:

{
"Type": "CombatActionEvaluator",
"TargetMemoryDuration": 10,
"CombatActionEvaluator": {
"RunConditions": [
{
"Type": "TimeSinceLastUsed",
"Curve": { "ResponseCurve": "Linear", "XRange": [0, 10] }
},
{
"Type": "Randomiser",
"MinValue": 0.9,
"MaxValue": 1
}
],
"MinRunUtility": 0.5,
"MinActionUtility": 0.01,
"AvailableActions": {
"SelectTarget": {
"Type": "SelectBasicAttackTarget",
"Description": "Select a target",
"Conditions": [
{
"Type": "TargetDistance",
"Curve": { "ResponseCurve": "SimpleDescendingLogistic", "XRange": [0, 15] }
}
]
}
},
"ActionSets": {
"Default": {
"BasicAttacks": {
"Attacks": ["Rat_Bite"],
"Randomise": false,
"MaxRange": 2,
"Timeout": 0.5,
"CooldownRange": [0.001, 0.001]
},
"Actions": ["SelectTarget"]
}
}
}
}

CAE de NPC inteligente (Goblin Scrapper) — múltiples conjuntos de acciones

Un goblin que cambia entre sub-estados de cuerpo a cuerpo y a distancia:

{
"Type": "CombatActionEvaluator",
"TargetMemoryDuration": 5,
"CombatActionEvaluator": {
"RunConditions": [
{
"Type": "TimeSinceLastUsed",
"Curve": { "ResponseCurve": "Linear", "XRange": [0, 5] }
},
{ "Type": "Randomiser", "MinValue": 0.9, "MaxValue": 1 }
],
"MinRunUtility": 0.5,
"MinActionUtility": 0.01,
"AvailableActions": {
"Melee": {
"Type": "Ability",
"Description": "Quick melee swing",
"WeaponSlot": 0,
"SubState": "Default",
"Ability": "Goblin_Scrapper_Attack",
"Target": "Hostile",
"AttackDistanceRange": [2.5, 2.5],
"PostExecuteDistanceRange": [2.5, 2.5],
"Conditions": [
{
"Type": "TimeSinceLastUsed",
"Curve": { "ResponseCurve": "Linear", "XRange": [0, 1] }
}
]
},
"Ranged": {
"Type": "Ability",
"Description": "Throw rubble from range",
"WeaponSlot": 0,
"SubState": "Ranged",
"Ability": "Goblin_Scrapper_Rubble_Throw",
"Target": "Hostile",
"AttackDistanceRange": [15, 15],
"PostExecuteDistanceRange": [2.5, 2.5],
"Conditions": [
{
"Type": "TimeSinceLastUsed",
"Curve": { "ResponseCurve": "Linear", "XRange": [0, 2] }
},
{
"Type": "TargetDistance",
"Curve": { "ResponseCurve": "SimpleLogistic", "XRange": [0, 15] }
}
]
}
},
"ActionSets": {
"Default": {
"BasicAttacks": {
"Attacks": ["Goblin_Scrapper_Attack"],
"Randomise": false,
"MaxRange": 2.5,
"Timeout": 0.5,
"CooldownRange": [0.001, 0.001]
},
"Actions": ["SwingDown", "Ranged"]
},
"Ranged": {
"BasicAttacks": {
"Attacks": ["Goblin_Scrapper_Rubble_Throw"],
"Randomise": false,
"MaxRange": 15,
"Timeout": 0.5,
"CooldownRange": [0.8, 2]
},
"Actions": ["Melee"]
}
}
}
}

Páginas relacionadas

  • Toma de decisiones del NPC — Tipos de condición usados en RunConditions y AvailableActions[*].Conditions
  • Roles de NPC — Archivos de rol que referencian archivos CAE vía el campo _CombatConfig en Modify
  • Plantillas de NPC — Plantillas que conectan el evaluador de combate vía el árbol Instructions