Specialità delle unità personalizzate
Il gioco include 36 specialità delle unità fisse (Parry, Penetration, Deflection…). Non si possono estendere, ma una mod può dichiararne di nuove e tu ne programmi l'effetto con gli script.
Esempio pronto da copiare: examples/specialty-example, "Critical hit": il 25% dei colpi dell'hastatus infligge danno triplo.
Come funziona
Ogni unità porta una maschera a 64 bit, un bit per specialità. I bit da 0 a 35 sono le 36 del gioco. I bit da 36 a 63 sono tuoi e vengono salvati con la partita. Una specialità di una mod occupa un bit.
I passi sono tre.
1. Dichiararla. Un file specials\<id>.json nella tua mod:
{
"id": "Critical",
"bit": 36,
"name": {"spanish": "Golpe crítico", "english": "Critical hit", "italian": "Colpo critico"},
"description": {"spanish": "Uno de cada cuatro golpes hace el triple de daño.", "english": "One hit in four does triple damage.", "italian": "Un colpo su quattro fa il triplo del danno."}
}
| Campo | Cos'è |
|---|---|
id |
Il nome: lettere, numeri e _, deve iniziare con una lettera, fino a 24 caratteri. Lo scrivi in unit_specials ed è la costante dello script (Critical). Non può essere il nome di una delle 36 del gioco (Triple strike…). Evita anche gli id che, in minuscolo e con _ al posto degli spazi, coincidono con costanti del gioco (triple_strike, keen_sight, life_steal…): il validatore non lo controlla e la costante andrebbe in conflitto con quella del gioco. |
bit |
Un numero da 36 a 63. Non cambiarlo dopo la pubblicazione: le partite salvate lo ricordano. Due mod non possono usare lo stesso. |
name |
Il suo nome in ogni lingua, oppure una sola stringa. |
description |
Viene letta ma per ora non compare da nessuna parte. Descrivila nel testo di aiuto dell'unità. |
icon |
(Facoltativo) Viene letta ma non usata. |
2. Assegnarla alle classi. Con il solito attributo unit_specials. Il gioco ignora i nomi che non conosce e la mod imposta il bit. Meglio farlo con una patch, così non sostituisci il file della classe:
<patch>
<set select="/class/properties[@unit_specials='Deflection']" unit_specials="Deflection, Critical"/>
</patch>
L'ereditarietà funziona come nel gioco. Se una classe imposta unit_specials, il suo elenco sostituisce quello della madre; se non lo fa, eredita l'intero elenco della madre. Quando ne aggiungi una a una classe che ne ha già, ripeti quelle che aveva (Deflection, Critical). Nel gioco i nomi distinguono maiuscole e minuscole; quelli della tua mod no.
3. Programmarne l'effetto. Il gioco memorizza soltanto il bit. Ciò che fa lo scrivi tu in uno script:
| Funzione | Cosa fa |
|---|---|
Mod_HasSpecial(Unit unidad, int bit) : bool |
L'unità ha questa specialità? Funziona per qualsiasi bit da 0 a 63, anche quelli del gioco. Prende una Unit; con un Obj, usa objeto.AsUnit() (se non è un'unità, restituisce false). |
Mod_SetSpecial(Unit unidad, int bit, bool puesta) |
Imposta o toglie la specialità su quell'unità, per esempio al passaggio di livello. Viene salvata con la partita. |
Il bit è la costante che ha il nome dell'id: Mod_HasSpecial(attacker.AsUnit(), Critical).
Il posto naturale per l'effetto è l'evento OnAttackResolved, che può cambiare il danno di ogni colpo (events\OnAttackResolved.vs). Va bene anche qualsiasi altro script: un <behavior> che controlla le unità a intervalli, OnObjectKill, OnObjectDie…
// void, Obj attacker, Obj victim, int damage
if (!attacker.IsValid) return;
if (!Mod_HasSpecial(attacker.AsUnit(), Critical)) return;
if (rand(100) >= 25) return;
Mod_SetAttackDamage(damage * 3);
Multigiocatore
specials\, events\ e civs\ contano come gameplay: tutti i giocatori devono avere la stessa mod.
Errori
Compaiono in Logs\imperivm\imperivm-mod.log (righe con l'etichetta specials) e nella scheda della mod nel gestore dei contenuti: un id non valido, un bit mancante o duplicato, un nome che appartiene a una specialità del gioco.
Attenzione: se aggiungi una [Section] sconosciuta a UNIT_SPECIALS.INI (con una patch, per dare a una specialità un'icona e un testo), il gioco potrebbe andare in crash. Non farlo. Le specialità delle mod non usano quel file.
Cosa manca
- La barra informativa dell'unità in alto, dove il gioco mostra fino a tre specialità di un'unità con la loro icona, non mostra le specialità delle mod.
- Il testo delle statistiche del pulsante di reclutamento dovrebbe elencarle sotto quelle del gioco, senza il titolo "Specials": un'unità con sole specialità di mod le mostrerebbe senza titolo.
- Icone personalizzate: non vengono mostrate.
- Non puoi aggiungere righe alla tabella delle 36 del gioco né creare nuove abilità native degli eroi. Quelle attive si fanno con ordini e script.