Riferimento dell'SDK
Elenco da consultare di tutto ciò che una mod può dichiarare. Per imparare a farlo, guarda le guide collegate in ogni tabella.
I percorsi di questa pagina usano \. Il gioco non distingue maiuscole e minuscole.
1. Struttura di una mod
Una mod è una cartella di mods\. Le cartelle che iniziano con . o _ vengono ignorate. Senza mod.json, il gioco ne crea uno base (con autoGenerated).
"Gameplay" = tutti i giocatori devono avere la stessa mod (README).
| Percorso nella mod | Cosa fa | Gameplay |
|---|---|---|
mod.json |
La scheda della mod. Vedi sezione 2 | No |
data\… |
File nuovi o che sostituiscono quelli del gioco, con lo stesso percorso | Sì |
scenarios\, adventures\, conquests\ |
Mappe, avventure e conquiste | Sì |
units\, buildings\, mapobjects\ |
Sostituiscono quelli del gioco. I .xml e i .pass (impronte) contano; i .rle e il resto no |
Solo .xml e .pass |
visuals\ |
Effetti e proiettili | Solo .xml |
packs\*.bfhp |
Mappe (casuali, insediamenti…) | Sì |
packs\*.pak |
Pacchetti che si montano insieme a quelli del gioco | Dipende da cosa contengono |
randommap\, randommapsettlements\ |
Forme di mappa casuale e modelli di città (Mappe casuali, Modelli di città) | Sì |
patches\<percorso> |
Patch del file del gioco con quel percorso. Solo .xml, .ini e .vs. Vedi sezione 6 |
Dipende dal percorso che modifica |
civs\<id>.json |
Civiltà. Sezione 3 | Sì |
specials\*.json |
Specialità. Sezione 4 | Sì |
options\*.json |
Opzioni di partita. Sezione 5 | Sì |
events\<Evento>.vs |
Script di evento. Sezione 7 | Sì |
loc\<idioma>.loc.xml, loc\<idioma>\*.loc.xml |
Testi che si aggiungono a quelli del gioco (Lingue) | No |
local\<idioma>\<percorso> |
File che il gioco vede come currentlang\<percorso>, solo con quella lingua |
No |
local\<idioma>.pak |
Pacchetto di lingua (anche <idioma>_algo.pak). Si monta solo quello della lingua del gioco |
Dipende da cosa contiene |
hidden.txt |
File del gioco che la mod nasconde, un percorso per riga; quelli dopo [lingua] si nascondono solo con quella lingua. Per le mod vecchie che toglievano file sostituendo i pacchetti del gioco; lo scrive riduci-mod.js |
Sì, se nasconde file di gameplay |
rle.mmp.tail |
Grafica aggiunta in fondo all'rle.mmp del gioco, con l'impronta dell'rle.mmp che amplia. Lo scrive riduci-mod.js. Può esserci un solo pacchetto attivo che ce l'ha |
No |
movies\… |
Filmati (PlayMovie): si cercano prima nei pacchetti attivi, in ordine di caricamento |
No |
gameres\… |
Immagini dell'interfaccia singole (Immagini) | No |
| Qualsiasi altro percorso | File singolo con lo stesso percorso che nel gioco | No |
- Estensioni vietate:
.exe .dll .asi .bat .cmd .com .scr .ps1 .vbs .js .msi .sys .cpl .lnk .reg .jar .hta .wsf .pif. Con una di queste, la mod non si carica. - Un'estensione che non è tra quelle note e non è vietata viene accettata e non viene mai eseguita.
- Se due mod hanno lo stesso file, un file sciolto vince su uno dentro un
.pak; tra due file sciolti, o tra due dentro.pak, vince quella che viene prima nell'ordine di caricamento. Quell'ordine lo calcola il gioco, non si sceglie: prima conta ciò che chiedono le mod (una mod sta sopra a quelle di cui ha bisogno inrequirese a quelle del suoloadAfter, e sotto a quelle del suoloadBefore); poi le estetiche stanno sopra ai contenuti (mappe, battaglie, conquista) e questi sopra alle mod che cambiano il gameplay; a parità, perid. Con le stesse mod esce lo stesso ordine su tutti i computer. Nella scheda di ogni mod, il gestore mostra i file che condivide con altre mod attive e di quale mod si usa ciascuno. Se due mod attive sostituiscono gli stessi file di gameplay e nessuna nomina l'altra inrequires,loadAfteroloadBefore, appare come problema: bisogna usarne solo una, o una patch di compatibilità (una mod che porta i file uniti e ha entrambe nel suoloadAfter). Se tutti i file che condividono sono estetici (texture, suoni, interfaccia), il giocatore può scegliere di quale mod usarli; la scelta si salva nel profilo, vale solo per i file sciolti e non cambia né l'ordine di caricamento né ciò che conta online. Per cambiare pochi valori di un file che anche un'altra mod può toccare, è meglio una patch (sezione 6): le patch si sommano invece di sostituire il file.
Cartella di prova <gioco>\mod\ (senza creare una mod; vince su tutte le mod):
| Percorso | Cosa fa |
|---|---|
mod\<percorso> |
Sostituisce il file del gioco con quel percorso (se [Mods] Override=1) |
mod\patches\<percorso>, mod\loc\<idioma>.loc.xml, mod\events\<Evento>.vs, mod\civs\*.json, mod\specials\*.json |
Lo stesso che in una mod. options\ da qui non si legge |
mod\_cache\ |
La genera il gioco (testi aggiunti, file con le patch). Non toccarla |
2. mod.json
| Campo | Tipo | Default | Cosa fa |
|---|---|---|---|
id |
testo | nome della cartella, in minuscolo e con - |
Identificatore della mod |
name |
testo o oggetto per lingua | nome della cartella | Nome nel gestore |
version |
testo | vuoto | Versione |
authors |
elenco di testi | vuoto | Autori |
description |
testo o oggetto per lingua | vuoto | Descrizione |
license |
testo | vuoto | Licenza |
redistributable |
booleano | false |
L'host può inviare la mod a chi non ce l'ha |
requires |
elenco di id, o di oggetti {"id", "version"} |
vuoto | Mod di cui ha bisogno. version accetta >=, <=, >, <, =, *, o un numero (uguale) |
incompatibleWith |
elenco di id | vuoto | Mod con cui non si può attivare |
loadAfter |
elenco di id | vuoto | La tua mod sta sopra a quelle: vincono i suoi file, patch e testi |
loadBefore |
elenco di id | vuoto | La tua mod sta sotto a quelle |
category |
testo | vuoto | Categoria di GameBanana (Pubblicare) |
tags |
elenco di testi | vuoto | Tag di GameBanana: giocatori (mappe) e lingua (campagne, traduzioni, audio) |
sources |
oggetto | nessuno | url (o page), gamebanana (numero) ed tags (elenco, si sommano a quelle sopra) |
language |
oggetto, elenco di oggetti o testo | nessuno | code, name e base (di default english). Solo testo = solo il codice. Vedi Lingue |
commands |
oggetto | nessuno | {"<file degli ordini senza estensione>": {"name": testo o oggetto per lingua}}. Vedi Tasti |
Un testo per lingua sceglie quello del gioco; se manca, l'inglese; se manca, il primo.
Alias in inglese che il gioco legge comunque: name, description, license, redistributable, language (con code, name).
3. civs\<id>.json
Guida: Civiltà.
| Campo | Tipo | Default | Obbligatorio | Cosa fa |
|---|---|---|---|---|
id |
testo | nome del file | No | Lettere, numeri e _; inizia con una lettera; fino a 24. Si salva in minuscolo. Negli script è la costante così come la scrivi, con la prima maiuscola (Dacia, RomeImperial) |
index |
intero 10-99 | — | Sì | Numero della civiltà |
base |
testo | Gaul |
No | Civiltà del gioco da cui eredita: Gaul, RepublicanRome, Carthage, Iberia, ImperialRome, Britain, Egypt, Germany (anche Rome, Roman, Briton) |
name |
testo o oggetto per lingua | l'id con la maiuscola iniziale |
No | Nome nella lobby |
letter |
una lettera | quella della base | No | Prefisso di classi e ordini |
template |
testo | vuoto | No | Prefisso dei tuoi modelli di città e villaggio |
internalName |
testo | quello della base | No | Nome con cui il gioco cerca i file dell'interfaccia. Vale anche in race= se non è quello della base |
folder |
testo | quello della base | No | Nome nei testi di selezione |
random |
booleano | true |
No | Entra nel sorteggio della civiltà casuale |
biome |
testo (una civiltà del gioco) | la base | No | Terreno, alberi e oggetti della mappa casuale |
ai |
booleano | false |
No | L'IA gioca con le tue classi e i tuoi ordini (altrimenti, con quelli della base). Nel sorteggio, a un'IA toccano solo quelle che ce l'hanno |
ownAi |
booleano | false |
No | Con ai: la mod porta tutti gli script di IA |
alias |
oggetto | nessuno | No | classes e commands: nome nella base → nome nella tua civiltà (ogni valore, un testo) |
variant |
booleano | false |
No | Variante della base: usa le sue classi, GetPlayerRace dà la base e Mod_PlayerCiv quella scelta. Con essa, ai vale true se non indicato |
replacesBase |
booleano | false |
No | La base non compare nella lobby: questa civiltà prende il suo posto e la sua quota del sorteggio casuale |
race="<id>"in<properties>di una classe usa la civiltà tramite il suoido il suointernalName.idoindexripetuti: vale quello della mod che viene prima; gli altri vengono ignorati con un avviso.- Alias in inglese:
index,name,letter,template,internalName,folder,random,biome,ai,ownAi.
4. specials\*.json
Guida: Specialità.
| Campo | Tipo | Default | Obbligatorio | Cosa fa |
|---|---|---|---|---|
id |
testo | — | Sì | Lettere, numeri e _; inizia con una lettera; fino a 24. Non può essere una specialità del gioco. È la costante di script (Critical) e il nome in unit_specials |
bit |
intero 36-63 | — | Sì | Bit della maschera. Non cambiarlo dopo la pubblicazione |
name |
testo o oggetto per lingua | l'id |
No | Nome |
description |
testo o oggetto per lingua | vuoto | No | Viene letta; non viene mostrata |
icon |
testo | vuoto | No | Viene letto; non viene usato |
idobitripetuti: vale quello della mod che viene prima.- In
unit_specials, i nomi sono separati da virgole; quelli delle mod non distinguono maiuscole e minuscole. Il gioco ignora quelli che non conosce. - Alias in inglese:
name,description,icon.
5. options\<id>.json
Guida: Opzioni di partita.
| Campo | Tipo | Default | Cosa fa |
|---|---|---|---|
id |
testo | nome del file | Lettere, numeri, _ e -; fino a 32. Si salva in minuscolo. È quello che usano Mod_GetOption e Mod_GetOptionValue |
name |
testo o oggetto per lingua | l'id |
Testo nella lobby |
description |
testo o oggetto per lingua | vuoto | Aiuto della riga |
values |
elenco da 2 a 16 | nessuno (= interruttore) | Ogni valore: un testo, oppure {"id", "nombre"}. Il primo è lo 0 |
default |
booleano, numero o testo | false / 0 |
Interruttore: true/false. Lista: numero del valore (da 0) o il suo id. Un id che non esiste dà 0 |
- Un
valuescon meno di 2 o più di 16 elementi fa ignorare l'intera opzione. - Bit: interruttore 1; lista di 2 valori 1; da 3-4, 2; da 5-8, 3; da 9-16, 4. Entrano in ordine alfabetico di
id. - Con
idripetuto vale quello della mod che viene prima. - Alias in inglese:
name,description,values,default.
6. Patch
Guida: Patch. Una patch va in patches\<percorso del file del gioco>. Solo .xml, .ini e .vs. Ordine: dall'ultima mod dell'ordine di caricamento alla prima, così la prima ha l'ultima parola; mod\patches per ultimo.
XML
Il primo tag della patch è la radice (di solito si chiama <patch>); i suoi figli sono le operazioni, che si applicano in ordine. I nomi di operazioni, tag e attributi non distinguono maiuscole e minuscole.
| Operazione | Attributi | Contenuto | Cosa fa |
|---|---|---|---|
<set> |
select, optional, unset, e qualsiasi altro attributo |
Nessuno | Cambia o aggiunge quegli attributi negli elementi scelti. unset toglie attributi (separati da spazi o virgole) |
<add> |
select, optional, position |
Elementi o commenti | Li aggiunge. position: end (default), start, before, after |
<remove> |
select, optional |
Nessuno | Toglie gli elementi scelti |
<replace> |
select, optional |
Elementi o commenti | Sostituisce gli elementi scelti con il contenuto |
selectè obbligatorio. Con<set>non puoi impostare un attributo che si chiamiselect,optionalounset.optional:1,yes,si,síotrueevitano l'errore se il selettore non trova nulla.<add>e<replace>senza contenuto danno errore.- Un selettore senza risultati, o un'operazione sconosciuta, viene saltato con un errore; le altre proseguono. Se la patch non è ben formata, non viene applicata nessuna operazione.
- Il file con la patch mantiene commenti e virgolette; gli attributi passano su una sola riga.
Selettore
| Elemento | Sintassi |
|---|---|
| Passo figlio / discendente | /nombre, //nombre |
| Qualsiasi nome | * |
| Con attributo uguale | [@a='v'] o [@a="v"] (non distingue maiuscole e minuscole; capisce & < > " ') |
| Con attributo | [@a] |
| L'n-esimo | [n], da 1: l'n-esimo tra quelli che soddisfano nome e condizioni, dentro ogni padre |
Si possono concatenare condizioni ([@a='v'][2]). Non esiste altro (and, contains, text(), ..). Inizia sempre con / o //.
INI
Ogni riga della patch, sotto una [Seccion] (obbligatoria prima di qualsiasi riga):
| Riga | Cosa fa |
|---|---|
Clave = valor |
Cambia la prima riga con quella chiave nella sezione, oppure la aggiunge in fondo alla sezione. Si scrive come Clave = valor |
-Clave |
Toglie dalla sezione tutte le righe con quella chiave, o quella riga esatta. Errore se non ce n'è nessuna |
+Linea |
Aggiunge una riga singola se non c'è già |
[Seccion] |
Cambia la sezione. Se non esiste nel file, viene creata in fondo |
;… o #… |
Commento. Vale solo su una riga intera |
Le chiavi e le sezioni non distinguono maiuscole e minuscole. Un commento a fine riga di una riga della patch non viene tolto.
Script .vs
Le direttive iniziano con @ nella prima colonna; il codice sotto ogni direttiva è ciò che viene inserito.
| Direttiva | Dove inserisce |
|---|---|
@top |
Dopo la prima riga, se è un commento // (la firma); altrimenti, all'inizio |
@bottom |
In fondo allo script |
@before TEXTO |
Prima della prima riga che contiene TEXTO |
@after TEXTO |
Dopo quella riga |
@replace TEXTO |
Al posto di quella riga. Senza codice sotto, cancella la riga |
@end |
Chiude il blocco; quello che segue fino alla direttiva successiva viene ignorato |
TEXTOè un pezzo letterale di una riga (distingue maiuscole e minuscole). Si usa la prima riga che lo contiene, e le direttive si applicano in ordine: vedono ciò che hanno inserito le precedenti.- Errore (e la direttiva viene saltata): direttiva sconosciuta,
@before/@after/@replacesenzaTEXTO, direttiva senza codice (tranne@replace),TEXTOnon trovato.
7. Eventi di script
Guida: Script. File: events\<Evento>.vs. Gira su tutti i PC; con più mod vengono eseguiti tutti.
| Evento | Quando | Firma (prima riga) |
|---|---|---|
OnGameStart |
All'inizio di una partita, dopo l'avvio degli script di vittoria. Può usare Sleep |
// void |
OnObjectDie |
Muore un oggetto, prima di elaborarne la morte (la prima volta) | // void, Obj victim |
OnObjectKill |
Un colpo uccide un oggetto | // void, Obj killer, Obj victim |
OnSettlementCaptured |
Un insediamento cambia proprietario a partita in corso. Giocatori 1-16; 0 = senza proprietario | // void, Obj building, int oldPlayer, int newPlayer |
OnAttackResolved |
Un colpo che fa danno, prima di applicarlo | // void, Obj attacker, Obj victim, int damage |
OnPlayerDefeated |
Si dichiara sconfitto un giocatore (1-8), una volta per giocatore | // void, int player |
- Tranne
OnGameStart, vengono eseguiti subito e non possono aspettare. - Un evento che scatta dentro se stesso viene interrotto al 4º livello.
- Se lo script fallisce durante l'esecuzione, il log lo annota fino a 5 volte per script.
- Si leggono solo questi nomi di evento. I nomi dei parametri li scegli tu.
8. Funzioni Mod_*
Guida: Script. L'API attuale è la 6; entra nel controllo del multigiocatore.
| Funzione | 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 |
Costanti di script: l'id di ogni civiltà di mod con la prima maiuscola (valore = il suo index) e l'id di ogni specialità di mod (valore = il suo bit).
9. imperivm-mod.ini
Si trova nella cartella del gioco. Si legge all'avvio.
| Sezione | Chiave | Valore | Default | Cosa fa |
|---|---|---|---|---|
[Debug] |
LogFiles |
0 o 1 |
0 |
Il log annota ogni file che apre il gioco e segna quelli che non esistono (VFS: opens … -> does not exist) |
[Debug] |
Dump |
percorsi separati da virgole, o * |
vuoto | Copia ogni file in mod-dump\<percorso> così come lo legge il gioco (patch e testi delle mod già applicati), la prima volta che lo apre. Nome esatto, senza caratteri jolly tranne * (tutti) |
[Debug] |
DumpAtStartup |
percorsi separati da virgole | vuoto | Copia quei file in mod-dump\ all'avvio, senza aspettare che il gioco li apra |
[Mods] |
Override |
0 o 1 |
1 |
Attiva <gioco>\mod\<percorso> come sostituto dei file |
[Mods] |
Profile |
nome del profilo, Original o No profile |
Original |
Profilo con cui parte il gioco (No profile è «I miei contenuti» nel gestore). Lo cambia il gestore; una modifica si applica al riavvio |
10. Limiti
| Cosa | Limite | Dove risulta |
|---|---|---|
| Bit delle opzioni di partita | 8 tra tutte le opzioni di tutte le mod | Codice |
| Valori di una lista di opzioni | da 2 a 16 | Codice |
id di opzione |
fino a 32; lettere, numeri, _, - |
Codice |
id di civiltà e di specialità |
fino a 24; lettere, numeri, _; inizia con una lettera |
Codice |
index di civiltà |
da 10 a 99 | Codice |
letter di civiltà |
1 carattere | Codice |
bit di specialità |
da 36 a 63 | Codice |
bit in Mod_HasSpecial e Mod_SetSpecial |
da 0 a 63 (fuori intervallo: false / non fa nulla) |
Codice |
| Nome di variabile di mod | fino a 64 caratteri | Codice |
| Variabili di mod | fino a 1.024; interi a 32 bit | Codice |
Mod_Log e Mod_LogInt |
2.000 righe per sessione | Codice |
Mod_SetAttackDamage |
un valore negativo resta a 0 | Codice |
| Errori di script di evento nel log | 5 per script | Codice |
| Eventi annidati | 4 livelli | Codice |
| Errori di patch per mod | si conservano i primi 50 | Codice |
Dump |
fino a 1.023 caratteri; DumpAtStartup, 2.047 |
Codice |
<behavior> per classe |
8 | Script |
Immagini, livelli e stati di un .ent.xml |
32, 32 e 8 | Grafica |
idx di <anim> e fotogrammi per animazione |
da 1 a 28; fino a 64 (2 sono sentinella: 62 righe) | Grafica |
| Direzioni di uno sprite | 8 soldati, 12 eroi e animali, 4 navi | Grafica |
| Colori di uno sprite | 256; con colore del giocatore, 192 | Grafica |
| Pulsante / ritratto | 153 x 51 / 65 x 76 | Immagini |
BonusDamage, BonusArmor, BonusRange, BonusLevel di una formazione |
da -1000 a 1000 | Formazioni |
| Nome di tipo di mappa casuale | da 2 a 31 caratteri | Mappe casuali |
--giocatori, --piccolo, --distorsione di crea-mappa-casuale.js |
da 2 a 8, da 0 a 8, da 0 a 0,5 | crea-mappa-casuale.js |
--larghezza di crea-modello.js |
da 0 a 4 | Modelli di città |
Le guide spiegano come si fa ogni cosa; questo è l'elenco completo. Torna al README.