Imperivm Resurrected

Referencia del SDK

Una lista de consulta con todo lo que puede declarar un mod. Para aprender a hacerlo, mira las guías enlazadas en cada tabla.

Las rutas de esta página usan \. El juego no distingue mayúsculas de minúsculas.

1. Estructura del mod

Un mod es una carpeta en mods\. Las carpetas que empiezan por . o _ se ignoran. Sin mod.json, el juego crea uno básico (con autoGenerated).

"Jugabilidad" = todos los jugadores deben tener el mismo mod (README).

Ruta en el mod Qué hace Jugabilidad
mod.json El manifiesto del mod. Mira la sección 2 No
data\… Archivos nuevos, o que reemplazan los del juego, en la misma ruta Sí
scenarios\, adventures\, conquests\ Mapas, aventuras y conquistas Sí
units\, buildings\, mapobjects\ Reemplazan los del juego. Cuentan los .xml y los .pass (huellas); los .rle y el resto, no Solo .xml y .pass
visuals\ Efectos y proyectiles Solo .xml
packs\*.bfhp Mapas (aleatorios, asentamientos…) Sí
packs\*.pak Paquetes que se montan junto a los del juego Depende de su contenido
randommap\, randommapsettlements\ Formas de mapa aleatorio y plantillas de ciudad (Tipos de mapa aleatorio, Plantillas de ciudad y aldea) Sí
patches\<path> Parche del archivo del juego que está en esa ruta. Solo .xml, .ini y .vs. Mira la sección 6 Depende de la ruta que parchea
civs\<id>.json Civilizaciones. Sección 3 Sí
specials\*.json Especialidades de unidad. Sección 4 Sí
options\*.json Opciones de partida. Sección 5 Sí
events\<Event>.vs Scripts de evento. Sección 7 Sí
loc\<language>.loc.xml, loc\<language>\*.loc.xml Textos que se suman a los del juego (Idiomas) No
local\<language>\<path> Archivo que el juego ve como currentlang\<path>, solo con ese idioma No
local\<language>.pak Paquete de idioma (también <language>_something.pak). Solo se monta el del idioma del juego Depende de su contenido
hidden.txt Archivos del juego que el mod oculta, uno por línea; los que van después de [language] solo se ocultan con ese idioma. Pensado para mods antiguos que quitaban archivos reemplazando los paquetes del juego; lo escribe shrink-mod.js Sí, si oculta archivos de jugabilidad
rle.mmp.tail Los gráficos del mod: lo que cambia o añade en el rle.mmp del juego, que va detrás de este, con la huella del rle.mmp del juego para el que se hizo. Lo escribe shrink-mod.js. Solo un paquete activo puede tenerlo No
movies\… Vídeos (PlayMovie): se buscan primero en los paquetes activos, por orden de carga No
gameres\… Imágenes sueltas de la interfaz (Imágenes) No
Cualquier otra ruta Archivo suelto con la misma ruta que en el juego No
  • Extensiones prohibidas: .exe .dll .asi .bat .cmd .com .scr .ps1 .vbs .js .msi .sys .cpl .lnk .reg .jar .hta .wsf .pif. Con una de ellas, el mod no se carga.
  • Una extensión que no es de las conocidas y tampoco está prohibida se permite y nunca se ejecuta.
  • Si dos mods incluyen el mismo archivo, uno suelto gana a uno dentro de un .pak; entre dos sueltos, o entre dos dentro de .pak, gana el que va antes en el orden de carga. El juego calcula ese orden, nadie lo elige: primero lo que piden los mods (un mod va por encima de los que necesita en requires y de los de su loadAfter, y por debajo de los de su loadBefore); después los mods cosméticos van por encima del contenido (mapas, batallas, conquista), y el contenido por encima de los mods que cambian la jugabilidad; en caso de empate, por id. Los mismos mods dan el mismo orden en todos los ordenadores. En la ficha de cada mod, el gestor de contenido lista los archivos que comparte con otros mods activos y de cuál se usa la copia de cada uno. Si dos mods activos reemplazan los mismos archivos de jugabilidad y ninguno nombra al otro en requires, loadAfter o loadBefore, se muestra como un problema: usa solo uno, o un parche de compatibilidad (un mod que incluye los archivos combinados y tiene a ambos en su loadAfter). Cuando todos los archivos que comparten son cosméticos (texturas, sonidos, interfaz), el jugador puede elegir de quién se usan los archivos; la elección se guarda en el perfil, solo se aplica a archivos sueltos y no cambia ni el orden de carga ni lo que cuenta online. Para cambiar unos pocos valores de un archivo que otro mod también puede cambiar, es mejor un parche (sección 6): los parches se suman en lugar de reemplazar el archivo.

Carpeta de pruebas <game>\mod\ (no hace falta ningún mod; gana a todos los mods):

Ruta Qué hace
mod\<path> Reemplaza el archivo del juego que está en esa ruta (si [Mods] Override=1)
mod\patches\<path>, mod\loc\<language>.loc.xml, mod\events\<Event>.vs, mod\civs\*.json, mod\specials\*.json Igual que en un mod. options\ no se lee desde aquí
mod\_cache\ Lo genera el juego (textos combinados, archivos parcheados). No la toques

2. mod.json

Campo Tipo Por defecto Qué hace
id texto nombre de la carpeta, en minúsculas y con - El identificador del mod
name texto, u objeto por idioma nombre de la carpeta Nombre en el gestor de contenido
version texto vacío Versión
authors lista de textos vacía Autores
description texto, u objeto por idioma vacía Descripción
license texto vacía Licencia
redistributable booleano false El anfitrión puede enviar el mod a quien no lo tiene
requires lista de ids, o de objetos {"id", "version"} vacía Mods que necesita. version acepta >=, <=, >, <, =, *, o un número (igual)
incompatibleWith lista de ids vacía Mods con los que no se puede activar
loadAfter lista de ids vacía Tu mod va por encima de esos: sus archivos, parches y textos ganan
loadBefore lista de ids vacía Tu mod va por debajo de esos
category texto vacía Categoría de GameBanana (Publicar en GameBanana)
tags lista de textos vacía Etiquetas de GameBanana, Title: value: más categorías (Type), jugadores (Players) e idioma (Language). Mira Publicar en GameBanana
sources objeto ninguno url (o page), gamebanana o gamebananaSound (número, de la sección Mods o Sounds) y tags (lista que se suma a las anteriores)
language objeto, lista de objetos o texto ninguno code, name y base (english por defecto). Un texto solo = solo el código. Mira Idiomas
commands objeto ninguno {"<orders file without extension>": {"name": text or object per language}}. Mira Teclas

Un texto por idioma toma el del idioma del juego; si falta, el inglés; si tampoco está, el primero.

Alias en inglés que el juego también lee: name, description, license, redistributable, language (con code, name).

3. civs\<id>.json

Guía: Civilizaciones.

Campo Tipo Por defecto Obligatorio Qué hace
id texto nombre del archivo No Letras, números y _; empieza por una letra; hasta 24. Se guarda en minúsculas. En los scripts es la constante tal como la escribes, con la primera letra en mayúscula (Dacia, RomeImperial)
index entero 10-99 - Sí El número de la civilización
base texto Gaul No Civilización del juego de la que hereda: Gaul, RepublicanRome, Carthage, Iberia, ImperialRome, Britain, Egypt, Germany (también Rome, Roman, Briton)
name texto, u objeto por idioma el id, con la primera en mayúscula No Nombre en la sala
letter una letra la de la base No Prefijo de las clases y las órdenes
template texto vacío No Prefijo de tus plantillas de ciudad y aldea
internalName texto el de la base No Nombre que usa el juego para buscar los archivos de la interfaz. También es válido en race= si no es el de la base
folder texto el de la base No Nombre en los textos de selección
random booleano true No Entra en el sorteo de civilización aleatoria
biome texto (una civilización del juego) la base No Terreno, árboles y objetos del mapa aleatorio
ai booleano false No La IA juega con tus clases y órdenes (si no, con las de la base). En el sorteo, una IA solo recibe civilizaciones que la tengan
ownAi booleano false No Con ai: el mod incluye todos los scripts de la IA
alias objeto ninguno No classes y commands: nombre en la base → nombre en tu civilización (cada valor, un texto)
variant booleano false No Variante de la base: usa sus clases, GetPlayerRace devuelve la base y Mod_PlayerCiv la elegida. Con él, ai es true salvo que lo indiques
replacesBase booleano false No La base no aparece en la sala: esta civilización ocupa su lugar y su parte del sorteo aleatorio
  • race="<id>" en las <properties> de una clase usa la civilización por su id o por su internalName.
  • id o index repetidos: gana el del mod que va antes; los demás se ignoran con una advertencia.
  • Alias en inglés: index, name, letter, template, internalName, folder, random, biome, ai, ownAi.

4. specials\*.json

Guía: Especialidades de unidad.

Campo Tipo Por defecto Obligatorio Qué hace
id texto - Sí Letras, números y _; empieza por una letra; hasta 24. No puede coincidir con un especialidad de unidad del juego. Es la constante del script (Critical) y el nombre en unit_specials
bit entero 36-63 - Sí Bit de la máscara. No lo cambies una vez publicado
name texto, u objeto por idioma el id No Nombre
description texto, u objeto por idioma vacía No Se lee; no se muestra
icon texto vacío No Se lee; no se usa
  • id o bit repetidos: gana el del mod que va antes.
  • En unit_specials, los nombres van separados por comas; los de mod no distinguen mayúsculas de minúsculas. El juego ignora los que no conoce.
  • Alias en inglés: name, description, icon.

5. options\<id>.json

Guía: Opciones de partida.

Campo Tipo Por defecto Qué hace
id texto nombre del archivo Letras, números, _ y -; hasta 32. Se guarda en minúsculas. Es lo que usan Mod_GetOption y Mod_GetOptionValue
name texto, u objeto por idioma el id Texto en la sala
description texto, u objeto por idioma vacía El texto de ayuda de la fila
values lista de 2 a 16 ninguna (= interruptor) Cada valor: un texto, o {"id", "nombre"}. El primero es el 0
default booleano, número o texto false / 0 Interruptor: true/false. Lista: el número del valor (desde 0) o su id. Un id que no existe da 0
  • Un values con menos de 2 o más de 16 elementos hace que se ignore la opción entera.
  • Bits: interruptor 1; lista de 2 valores 1; de 3-4, 2; de 5-8, 3; de 9-16, 4. Se asignan en orden alfabético de id.
  • Con un id repetido, gana el del mod que va antes.
  • Alias en inglés: name, description, values, default.

6. Parches

Guía: Parches. Un parche va en patches\<path of the game file>. Solo .xml, .ini y .vs. Orden: del último mod del orden de carga al primero, de modo que el primero tiene la última palabra; mod\patches va el último.

XML

La primera etiqueta del parche es la raíz (normalmente se llama <patch>); sus hijas son las operaciones, que se aplican en orden. Los nombres de operaciones, etiquetas y atributos no distinguen mayúsculas de minúsculas.

Operación Atributos Contenido Qué hace
<set> select, optional, unset, y cualquier otro atributo Ninguno Cambia o añade esos atributos en los elementos seleccionados. unset quita atributos (separados por espacios o comas)
<add> select, optional, position Elementos o comentarios Los añade. position: end (por defecto), start, before, after
<remove> select, optional Ninguno Quita los elementos seleccionados
<replace> select, optional Elementos o comentarios Reemplaza los elementos seleccionados por el contenido
  • select es obligatorio. Con <set> no puedes asignar un atributo que se llame select, optional o unset.
  • optional: 1, yes, si, sí o true evitan el error si el selector no encuentra nada.
  • <add> y <replace> sin contenido dan error.
  • Un selector sin resultados, o una operación desconocida, se omite con un error; las demás siguen. Si el parche no está bien formado, no se aplica ninguna operación.
  • El archivo parcheado conserva los comentarios y las comillas; los atributos se juntan en una sola línea.

Selector

Elemento Sintaxis
Paso a hijo / descendiente /nombre, //nombre
Cualquier nombre *
Con atributo igual a [@a='v'] o [@a="v"] (sin distinguir mayúsculas; entiende &amp; &lt; &gt; &quot; &apos;)
Con atributo [@a]
El enésimo [n], desde 1: el enésimo de los que cumplen nombre y condiciones, dentro de cada padre

Puedes encadenar condiciones ([@a='v'][2]). No existe nada más (and, contains, text(), ..). Empieza siempre con / o //.

INI

Cada línea del parche, bajo una [Seccion] (obligatoria antes de cualquier línea):

Línea Qué hace
Clave = valor Cambia la primera línea con esa clave en la sección, o la añade al final de la sección. Se escribe como Clave = valor
-Clave Quita todas las líneas con esa clave de la sección, o esa línea exacta. Da error si no hay ninguna
+Linea Añade una línea suelta si no está ya
[Seccion] Cambia de sección. Si no existe en el archivo, se crea al final
;… o #… Comentario. Solo vale en una línea entera

Las claves y las secciones no distinguen mayúsculas de minúsculas. Un comentario al final de una línea del parche no se elimina.

Scripts .vs

Las directivas empiezan con @ en la primera columna; el código que va debajo de cada una es lo que se inserta.

Directiva Dónde inserta
@top Después de la primera línea si es un comentario // (la firma); si no, al principio
@bottom Al final del script
@before TEXTO Antes de la primera línea que contiene TEXTO
@after TEXTO Después de esa línea
@replace TEXTO En lugar de esa línea. Sin código debajo, borra la línea
@end Cierra el bloque; todo lo que haya después, hasta la siguiente directiva, se ignora
  • TEXTO es un trozo literal de una línea (distingue mayúsculas de minúsculas). Se usa la primera línea que lo contiene, y las directivas se aplican en orden: ven lo que insertaron las anteriores.
  • Error (y la directiva se omite): directiva desconocida, @before/@after/@replace sin TEXTO, una directiva sin código (salvo @replace), TEXTO no encontrado.

7. Eventos de script

Guía: Scripts. Archivo: events\<Event>.vs. Se ejecuta en todos los PC; con varios mods, se ejecutan todos.

Evento Cuándo Firma (primera línea)
OnGameStart Cuando empieza una partida, después de que arranquen los scripts de victoria. Puede usar Sleep // void
OnObjectDie Muere un objeto, antes de procesar su muerte (la primera vez) // void, Obj victim
OnObjectKill Un golpe mata a un objeto // void, Obj killer, Obj victim
OnSettlementCaptured Un asentamiento cambia de dueño mientras la partida está en marcha. Jugadores 1-16; 0 = sin dueño // void, Obj building, int oldPlayer, int newPlayer
OnAttackResolved Un golpe que causa daño, antes de aplicarlo // void, Obj attacker, Obj victim, int damage
OnPlayerDefeated Se declara derrotado a un jugador (1-8), una vez por jugador // void, int player
  • Salvo OnGameStart, se ejecutan de inmediato y no pueden esperar.
  • Un evento que se dispara dentro de sí mismo se corta a los 4 niveles.
  • Si el script falla en ejecución, el registro lo anota hasta 5 veces por script.
  • Solo se leen estos nombres de evento. Los nombres de los parámetros los eliges tú.

8. Funciones Mod_*

Guía: Scripts. La API actual es la 6; forma parte de la comprobación de multijugador.

Función API
Mod_Log(str text) 1
Mod_LogInt(str text, int value) 1
Mod_IsActive(str id) : bool 1
Mod_ApiVersion() : int 1
Mod_SetInt(str name, int value) 2
Mod_GetInt(str name) : int 2
Mod_AddInt(str name, int delta) : int 2
Mod_HasKey(str name) : bool 2
Mod_AttackDamage() : int 3
Mod_SetAttackDamage(int damage) 3
Mod_HasSpecial(Unit unit, int bit) : bool 4
Mod_SetSpecial(Unit unit, int bit, bool on) 4
Mod_TrueRace(Obj obj) : int 5
Mod_GetOption(str id) : bool 6
Mod_GetOptionValue(str id) : int 6

Constantes de script: el id de cada civilización de mod con la primera letra en mayúscula (valor = su index) y el id de cada especialidad de unidad de mod (valor = su bit).

9. imperivm-mod.ini

Está en la carpeta del juego. Se lee al arrancar.

Sección Clave Valor Por defecto Qué hace
[Debug] LogFiles 0 o 1 0 El registro anota cada archivo que abre el juego y marca los que no existen (VFS: opens … -> does not exist)
[Debug] Dump rutas separadas por comas, o * vacío Copia cada archivo a mod-dump\<path> tal como lo lee el juego (con los parches y los textos de mods ya aplicados), la primera vez que lo abre. Nombre exacto, sin comodines salvo * (todos)
[Debug] DumpAtStartup rutas separadas por comas vacío Copia esos archivos a mod-dump\ al arrancar, sin esperar a que el juego los abra
[Mods] Override 0 o 1 1 Activa <game>\mod\<path> como reemplazo de archivos
[Mods] Profile nombre del perfil, Original o No profile Original Perfil con el que arranca el juego (No profile es "Mi contenido" en el gestor). Lo cambia el gestor de contenido; el cambio se aplica al reiniciar

10. Límites

Qué Límite Fuente
Bits de opciones de partida 8 entre todas las opciones de todos los mods Código
Valores en una lista de opción 2 a 16 Código
id de opción hasta 32; letras, números, _, - Código
id de civilización y de especialidad de unidad hasta 24; letras, números, _; empieza por una letra Código
index de civilización 10 a 99 Código
letter de civilización 1 carácter Código
bit de especialidad de unidad 36 a 63 Código
bit en Mod_HasSpecial y Mod_SetSpecial 0 a 63 (fuera de rango: false / no hace nada) Código
Nombre de variable de mod hasta 64 caracteres Código
Variables de mod hasta 1.024; enteros de 32 bits Código
Mod_Log y Mod_LogInt 2.000 líneas por sesión Código
Mod_SetAttackDamage un valor negativo se reduce a 0 Código
Errores de scripts de evento en el registro 5 por script Código
Eventos anidados 4 niveles Código
Errores de parche por mod se conservan los 50 primeros Código
Dump hasta 1.023 caracteres; DumpAtStartup, 2.047 Código
<behavior> por clase 8 Scripts
Imágenes, capas y estados en un .ent.xml 32, 32 y 8 Gráficos
idx de <anim> y fotogramas por animación 1 a 28; hasta 64 (2 son centinelas: 62 filas) Gráficos
Direcciones de sprite 8 soldados, 12 héroes y animales, 4 barcos Gráficos
Colores de sprite 256; con color de jugador, 192 Gráficos
Botón / retrato 153 x 51 / 65 x 76 Imágenes
BonusDamage, BonusArmor, BonusRange, BonusLevel de formación -1000 a 1000 Formaciones
Nombre de tipo de mapa aleatorio 2 a 31 caracteres Tipos de mapa aleatorio
--players, --small, --distortion de create-random-map.js 2 a 8, 0 a 8, 0 a 0,5 create-random-map.js
--width de create-template.js 0 a 4 Plantillas de ciudad y aldea

Las guías explican cómo hacer cada cosa; esta es la lista completa. Vuelve al README.