Imperivm Resurrected

Especialidades de unidad propias

El juego trae 36 especialidades de unidad fijas (Parry, Penetration, Deflection…). No se pueden ampliar, pero un mod puede declarar otras nuevas, y tú programas su efecto con scripts.

Ejemplo listo para copiar: examples/specialty-example, "Golpe crítico": el 25 % de los golpes del hastatus hacen el triple de daño.

Cómo funciona

Cada unidad lleva una máscara de 64 bits, un bit por especialidad. Los bits 0 a 35 son las 36 del juego. Los bits 36 a 63 son tuyos y se guardan con la partida. Una especialidad de mod ocupa un bit.

Hay tres pasos.

1. Declararla. Un archivo specials\<id>.json en tu mod:

{
  "id": "Critical",
  "bit": 36,
  "name": {"spanish": "Golpe crítico", "english": "Critical hit", "italian": "Colpo critico"},
  "description": {"spanish": "Uno de cada cuatro golpes hace el triple de daño.", "english": "One hit in four does triple damage.", "italian": "Un colpo su quattro fa il triplo del danno."}
}
Campo Qué es
id El nombre: letras, números y _, empezando por letra, hasta 24 caracteres. Lo escribes en unit_specials y es la constante del script (Critical). No puede ser el nombre de una de las 36 del juego (Triple strike…). Evita también los ids que, en minúsculas y con _ en lugar de espacios, coincidan con constantes del juego (triple_strike, keen_sight, life_steal…): el validador no lo comprueba y la constante chocaría con la del juego.
bit Un número de 36 a 63. No lo cambies una vez publicado: las partidas guardadas lo recuerdan. Dos mods no pueden usar el mismo.
name Su nombre en cada idioma, o una sola cadena.
description Se lee, pero todavía no se muestra en ningún sitio. Descríbela en el texto de ayuda de la unidad.
icon (Opcional) Se lee, pero no se usa.

2. Asignarla a clases. Con el atributo habitual unit_specials. El juego ignora los nombres que no conoce y el mod activa el bit. Mejor hacerlo con un parche, para no reemplazar el archivo de la clase:

<patch>
  <set select="/class/properties[@unit_specials='Deflection']" unit_specials="Deflection, Critical"/>
</patch>

La herencia funciona como en el juego. Si una clase define unit_specials, su lista reemplaza la del padre; si no lo define, hereda la lista entera del padre. Al añadir una a una clase que ya tiene otras, repite las que tenía (Deflection, Critical). En el juego los nombres distinguen mayúsculas; los de tu mod no.

3. Programar el efecto. El juego solo guarda el bit. Lo que hace lo escribes tú en un script:

Función Qué hace
Mod_HasSpecial(Unit unidad, int bit) : bool Indica si la unidad tiene esta especialidad. Vale para cualquier bit de 0 a 63, también los del juego. Recibe una Unit; con un Obj, usa objeto.AsUnit() (si no es una unidad, devuelve false).
Mod_SetSpecial(Unit unidad, int bit, bool puesta) Activa o quita la especialidad de esa unidad, por ejemplo al subir de nivel. Se guarda con la partida.

El bit es la constante que se llama como el id: Mod_HasSpecial(attacker.AsUnit(), Critical).

El lugar natural para el efecto es el evento OnAttackResolved, que puede cambiar el daño de cada golpe (events\OnAttackResolved.vs). Sirve cualquier otro script: un <behavior> que revise las unidades cada cierto tiempo, OnObjectKill, OnObjectDie…

// void, Obj attacker, Obj victim, int damage
if (!attacker.IsValid) return;
if (!Mod_HasSpecial(attacker.AsUnit(), Critical)) return;
if (rand(100) >= 25) return;
Mod_SetAttackDamage(damage * 3);

Multijugador

specials\, events\ y civs\ cuentan como jugabilidad: todos los jugadores necesitan el mismo mod.

Errores

Salen en Logs\imperivm\imperivm-mod.log (líneas con la etiqueta specials) y en la tarjeta del mod en el gestor: un id no válido, un bit que falta o está duplicado, un nombre que pertenece a una especialidad del juego.

Aviso: si añades una [Section] desconocida a UNIT_SPECIALS.INI (con un parche, para darle icono y texto a una especialidad), el juego puede cerrarse por un fallo. No lo hagas. Las especialidades de mod no usan ese archivo.

Lo que falta

  • La barra de información de la unidad, arriba, donde el juego muestra hasta tres especialidades de una unidad con su icono, no muestra las de los mods.
  • El texto de estadísticas del botón de reclutar debería listarlas debajo de las del juego, sin el título "Specials": una unidad con solo especialidades de mod las mostraría sin título.
  • Iconos propios: no se muestran.
  • No se puede ampliar la tabla de las 36 del juego ni crear habilidades nativas de héroe nuevas. Las activas se hacen con comandos y scripts.