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 enrequiresy de los de suloadAfter, y por debajo de los de suloadBefore); 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, porid. 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 enrequires,loadAfteroloadBefore, 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 suloadAfter). 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 suido por suinternalName.idoindexrepetidos: 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 |
idobitrepetidos: 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
valuescon 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
idrepetido, 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 |
selectes obligatorio. Con<set>no puedes asignar un atributo que se llameselect,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 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 & < > " ') |
| 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 |
TEXTOes 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/@replacesinTEXTO, una directiva sin código (salvo@replace),TEXTOno 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.