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 enrequiresy de los de suloadAfter, y por debajo de los de suloadBefore); 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, porid. 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 enrequires,loadAfteroloadBefore, 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 suloadAfter). 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 suido suinternalName.idoindexrepetidos: 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 |
idobitrepetidos: 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
valuescon 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
idrepetido 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 |
selectes obligatorio. No puedes poner con<set>un atributo llamadoselect,optionalounset.optional:1,yes,si,síotrueevitan 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 & < > " ') |
| 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 |
TEXTOes 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/@replacesinTEXTO, directiva sin código (salvo@replace),TEXTOsin 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.