Imperivm Resurrected

Referencia del SDK

Lista consultable de todo lo que un mod puede declarar. Para aprender a hacerlo, mira las guías enlazadas en cada tabla.

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

1. Estructura de un mod

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

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

Ruta en el mod Qué hace Jugabilidad
mod.json La ficha del mod. Ver sección 2 No
data\… Archivos nuevos o que sustituyen a los del juego, con su misma ruta Sí
scenarios\, adventures\, conquests\ Mapas, aventuras y conquistas Sí
units\, buildings\, mapobjects\ Sustituyen a los del juego. Los .xml y los .pass (huellas) cuentan; los .rle y demás no Solo .xml y .pass
visuals\ Efectos y proyectiles Solo .xml
packs\*.bfhp Mapas (aleatorios, asentamientos…) Sí
packs\*.pak Paquetes que se montan con los del juego Según lo que lleven dentro
randommap\, randommapsettlements\ Formas de mapa aleatorio y plantillas de ciudad (Mapas aleatorios, Plantillas) Sí
patches\<ruta> Parche del archivo del juego con esa ruta. Solo .xml, .ini y .vs. Ver sección 6 Según la ruta que parchea
civs\<id>.json Civilizaciones. Sección 3 Sí
specials\*.json Especialidades. Sección 4 Sí
options\*.json Opciones de partida. Sección 5 Sí
events\<Evento>.vs Scripts de evento. Sección 7 Sí
loc\<idioma>.loc.xml, loc\<idioma>\*.loc.xml Textos que se suman a los del juego (Idiomas) No
local\<idioma>\<ruta> Archivo que el juego ve como currentlang\<ruta>, solo con ese idioma No
local\<idioma>.pak Paquete de idioma (también <idioma>_algo.pak). Solo se monta el del idioma del juego Según lo que lleve
hidden.txt Archivos del juego que el mod oculta, una ruta por línea; las que van tras [idioma] solo se ocultan con ese idioma. Para los mods antiguos que quitaban archivos al sustituir paquetes del juego; lo escribe reducir-mod.js Sí, si oculta archivos de jugabilidad
rle.mmp.tail Gráficos añadidos al final del rle.mmp del juego, con la huella del rle.mmp que amplía. Lo escribe reducir-mod.js. Solo puede haber un paquete activo con él No
movies\… Cinemáticas (PlayMovie): se buscan primero en los paquetes activos, por orden de carga No
gameres\… Imágenes de interfaz sueltas (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, el mod no se carga.
  • Una extensión que no es de las conocidas, y no está prohibida, se permite y nunca se ejecuta.
  • Si dos mods traen el mismo archivo, un archivo suelto gana a uno que va dentro de un .pak; entre dos sueltos, o entre dos dentro de .pak, gana el que va primero en el orden de carga. Ese orden lo calcula el juego, no se elige: primero cuenta 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 estéticos van por encima del contenido (mapas, batallas, conquista) y este por encima de los que cambian la jugabilidad; a igualdad, por id. Con los mismos mods sale el mismo orden en todos los ordenadores. En la ficha de cada mod, el gestor muestra los archivos que comparte con otros mods activos y de cuál se usa cada uno. Si dos mods activos reemplazan los mismos archivos de jugabilidad y ninguno nombra al otro en requires, loadAfter o loadBefore, sale como problema: hay que usar solo uno, o un parche de compatibilidad (un mod que trae los archivos combinados y tiene a los dos en su loadAfter). Si todos los archivos que comparten son estéticos (texturas, sonidos, interfaz), el jugador puede elegir de qué mod se usan; la elección se guarda en el perfil, solo vale para archivos sueltos y no cambia el orden de carga ni lo que cuenta en el online. Para cambiar unos pocos valores de un archivo que otro mod también puede tocar, mejor un parche (sección 6): los parches se suman en vez de reemplazar el archivo.

Carpeta de pruebas <juego>\mod\ (sin crear un mod; gana a todos los mods):

Ruta Qué hace
mod\<ruta> Sustituye el archivo del juego con esa ruta (si [Mods] Override=1)
mod\patches\<ruta>, mod\loc\<idioma>.loc.xml, mod\events\<Evento>.vs, mod\civs\*.json, mod\specials\*.json Lo mismo que en un mod. options\ no se lee de aquí
mod\_cache\ La genera el juego (textos sumados, archivos parcheados). No la toques

2. mod.json

Campo Tipo Defecto Qué hace
id texto nombre de la carpeta, en minúsculas y con - Identificador del mod
name texto u objeto por idioma nombre de la carpeta Nombre en el gestor
version texto vacío Versión
authors lista de textos vacía Autores
description texto u objeto por idioma vacío Descripción
license texto vacío Licencia
redistributable booleano false El anfitrión puede enviar el mod a quien no lo tenga
requires lista de ids, u objetos {"id", "version"} vacía Mods que necesita. version admite >=, <=, >, <, =, *, 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ío Categoría de GameBanana (Publicar)
tags lista de textos vacía Etiquetas de GameBanana: jugadores (mapas) e idioma (campañas, traducciones, audio)
sources objeto ninguno url (o page), gamebanana (número) y tags (lista, se suman a las de arriba)
language objeto, lista de objetos o texto ninguno code, name y base (por defecto english). Texto solo = solo el código. Ver Idiomas
commands objeto ninguno {"<archivo de órdenes sin extensión>": {"name": texto u objeto por idioma}}. Ver Teclas

Un texto por idioma elige el del juego; si no está, el inglés; si no, el primero.

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

3. civs\<id>.json

Guía: Civilizaciones.

Campo Tipo Defecto Obligatorio Qué hace
id texto nombre del archivo No Letras, números y _; empieza por letra; hasta 24. Se guarda en minúsculas. En scripts es la constante tal como la escribes, con la primera en mayúscula (Dacia, RomeImperial)
index entero 10-99 — Sí 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 mayúscula inicial No Nombre en la sala
letter una letra la de la base No Prefijo de clases y órdenes
template texto vacío No Prefijo de tus plantillas de ciudad y aldea
internalName texto el de la base No Nombre con el que el juego busca archivos de interfaz. También vale 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 la base). En el sorteo, a una IA solo le tocan las que lo tienen
ownAi booleano false No Con ai: el mod trae todos los guiones de 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 da la base y Mod_PlayerCiv la elegida. Con ella, ai vale true si no se pone
replacesBase booleano false No La base no sale en la sala: esta civilización ocupa su sitio y su parte del sorteo aleatorio
  • race="<id>" en <properties> de una clase usa la civilización por su id o su internalName.
  • id o index repetidos: vale el del mod que va primero; los demás se ignoran con aviso.
  • Alias en inglés: index, name, letter, template, internalName, folder, random, biome, ai, ownAi.

4. specials\*.json

Guía: Especialidades.

Campo Tipo Defecto Obligatorio Qué hace
id texto — Sí Letras, números y _; empieza por letra; hasta 24. No puede ser una especialidad del juego. Es la constante de 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ío No Se lee; no se muestra
icon texto vacío No Se lee; no se usa
  • id o bit repetidos: vale el del mod que va primero.
  • En unit_specials, los nombres van separados por comas; los de mod no distinguen mayú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 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ío 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: 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 ignora la opción entera.
  • Bits: interruptor 1; lista de 2 valores 1; de 3-4, 2; de 5-8, 3; de 9-16, 4. Entran por orden alfabético de id.
  • Con id repetido vale el del mod que va primero.
  • Alias en inglés: name, description, values, default.

6. Parches

Guía: Parches. Un parche va en patches\<ruta del archivo del juego>. Solo .xml, .ini y .vs. Orden: del último al primero del orden de carga, así que el primero tiene la última palabra; mod\patches el último.

XML

La primera etiqueta del parche es la raíz (se suele llamar <patch>); sus hijos son las operaciones, que se aplican en orden. Los nombres de operación, etiquetas y atributos no distinguen mayú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 elegidos. 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 elegidos
<replace> select, optional Elementos o comentarios Cambia los elementos elegidos por el contenido
  • select es obligatorio. No puedes poner con <set> un atributo llamado 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 salta con error; las demás siguen. Si el parche no está bien formado, no se aplica ninguna operación.
  • El archivo parcheado conserva comentarios y comillas; los atributos pasan a una línea.

Selector

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

Se pueden encadenar condiciones ([@a='v'][2]). No existe nada más (and, contains, text(), ..). Empieza siempre por / 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 de esa clave en la sección, o la añade al final de la sección. Se escribe como Clave = valor
-Clave Quita de la sección todas las líneas con esa clave, o esa línea exacta. Error si no hay ninguna
+Linea Añade una línea suelta si no está ya
[Seccion] Cambia la sección. Si no existe en el archivo, se crea al final
;… o #… Comentario. Solo vale en una línea entera

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

Scripts .vs

Las directivas empiezan por @ en la primera columna; el código 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; lo que siga hasta la próxima directiva se ignora
  • TEXTO es un trozo literal de una línea (distingue mayúsculas). Se usa la primera línea que lo contiene, y las directivas se aplican en orden: ven lo insertado por las anteriores.
  • Error (y se salta la directiva): directiva desconocida, @before/@after/@replace sin TEXTO, directiva sin código (salvo @replace), TEXTO sin encontrar.

7. Eventos de script

Guía: Scripts. Archivo: events\<Evento>.vs. Corre en todos los PCs; con varios mods se ejecutan todos.

Evento Cuándo Firma (primera línea)
OnGameStart Al empezar una partida, tras arrancar 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 con la partida en marcha. Jugadores 1-16; 0 = sin dueño // void, Obj building, int oldPlayer, int newPlayer
OnAttackResolved Un golpe que hace 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 al momento y no pueden esperar.
  • Un evento que se dispara dentro de sí mismo se corta a los 4 niveles.
  • Si el script falla al ejecutarse, el log lo apunta 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; entra en 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 en mayúscula (valor = su index) y el id de cada especialidad de mod (valor = su bit).

9. imperivm-mod.ini

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

Sección Clave Valor Defecto Qué hace
[Debug] LogFiles 0 o 1 0 El log 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\<ruta> tal como lo lee el juego (parches y 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 <juego>\mod\<ruta> como sustituto 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; un cambio se aplica al reiniciar

10. Límites

Qué Límite Dónde consta
Bits de opciones de partida 8 entre todas las opciones de todos los mods Código
Valores de una lista de opciones 2 a 16 Código
id de opción hasta 32; letras, números, _, - Código
id de civilización y de especialidad hasta 24; letras, números, _; empieza por letra Código
index de civilización 10 a 99 Código
letter de civilización 1 carácter Código
bit de especialidad 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 queda en 0 Código
Errores de script de evento en el log 5 por script Código
Eventos anidados 4 niveles Código
Errores de parche por mod se guardan 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 de 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 un sprite 8 soldados, 12 héroes y animales, 4 barcos Gráficos
Colores de un 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 una formación de -1000 a 1000 Formaciones
Nombre de tipo de mapa aleatorio 2 a 31 caracteres Mapas aleatorios
--jugadores, --pequeno, --distorsion de crear-mapa-aleatorio.js 2 a 8, 0 a 8, 0 a 0,5 crear-mapa-aleatorio.js
--ancho de crear-plantilla.js 0 a 4 Plantillas

Las guías explican cómo se hace cada cosa; esto es la lista completa. Vuelve al README.