Opzioni di partita personalizzate
Una mod può aggiungere interruttori (sì / no) e elenchi di valori (un menu a tendina) all'elenco REGOLE della stanza, accanto a "Fog of war" o "Lock diplomacy". L'host della stanza li sceglie, tutti li vedono e i tuoi script leggono la scelta con Mod_GetOption("id") (interruttore) o Mod_GetOptionValue("id") (elenco). Entrambe fanno parte dell'API degli script 6.
Esempio: examples/options-example (l'interruttore "Fast heroes" e l'elenco "Hero speed").
Metodo rapido
create-option.js scrive il JSON e, se vuoi, uno scheletro di script. Non ha bisogno della cartella DATA.
node tools/create-option.js mods/my-mod fast-heroes --name "Fast heroes" --description "All heroes move 50% faster."
node tools/create-option.js mods/my-mod hero-speed --name "Hero speed" --values "Normal,Fast,Very fast" --default Normal --script
Il primo crea un interruttore; con --values (da 2 a 16, separati da virgole) crea un elenco.
| Opzione | Cosa fa |
|---|---|
--name |
Obbligatoria. Il nome mostrato nella stanza |
--name-es, --name-it |
Il nome in spagnolo e in italiano |
--description, --description-es, --description-it |
Il testo di aiuto nella stanza |
--values, --values-es, --values-it |
I valori di un elenco, nello stesso ordine e nello stesso numero. L'id di ogni valore deriva dal suo testo in --values |
--default |
Interruttore: true o false. Elenco: il numero del valore (da 0), il suo id o il suo testo. Se manca: false, oppure il primo valore |
--script |
Crea anche data\mod\<id>.vs, un behavior con l'if (Mod_GetOption("<id>")) (o Mod_GetOptionValue) già pronto da completare. Collegalo a una classe con una patch, come fa l'esempio |
Genera options\<id>.json e, con --script, data\mod\<id>.vs. Ti dice quanti degli 8 bit usa e quanti ne usa già la mod. Non sovrascrive mai nulla: se la mod ha già quell'id, si ferma senza scrivere.
Farlo a mano
Un file
options\<id>.jsonnella tua mod.Un interruttore:
{ "id": "fast-heroes", "name": "Fast heroes", "description": "All heroes move 50% faster.", "default": false }Un elenco (da 2 a 16 valori):
{ "id": "hero-speed", "name": "Hero speed", "values": [ { "id": "normal", "name": "Normal" }, { "id": "fast", "name": "Fast (+25%)" }, "Very fast" ], "default": "normal" }id: lettere, numeri,_e-, fino a 32. Lo usano gli script; non distingue maiuscole e minuscole. Se manca, si usa il nome del file.nameedescription: un solo testo, oppure uno per lingua:{"english": "Fast heroes", "spanish": "Héroes veloces"}(la lingua del gioco, con l'inglese come ripiego). L'esempio fa così.values: ognuno è un testo o un oggetto conidename. Il primo è 0.default: per un interruttore,trueofalse; per un elenco, il numero del valore (da 0) o il suoid. Unidche non esiste ripiega in silenzio su 0;validate-mod.jslo segnala.
Uno script che la legge (un behavior di classe, un evento o uno script di vittoria):
if (Mod_GetOption("fast-heroes")) { This.AsUnit().SetSpeedFactor(150); } if (Mod_GetOptionValue("hero-speed") == 1) { This.AsUnit().SetSpeedFactor(125); }Mod_GetOptionrestituiscetruese il valore non è 0 (anche per gli elenchi).Mod_GetOptionValuerestituisce il numero del valore scelto.
Limiti
- Ci sono 8 bit per tutte le opzioni di tutte le mod attive. Un interruttore ne usa 1; un elenco ne usa 1 per 2 valori, 2 per 3 o 4, 3 da 5 a 8 e 4 da 9 a 16. Vengono assegnati in ordine alfabetico di
id; ciò che non entra viene ignorato e il log lo segnala. Se due opzioni hanno lo stessoid, il gioco usa la prima che trova quando assembla le mod. - Funzionano solo con una stanza. Le opzioni si fissano quando una partita parte dalla stanza (o quando rientri in una partita online). Avventure, campagne e tutorial non hanno stanza:
Mod_GetOptionrestituisce sempre 0 e un elenco vale 0, anche con"default": true. - I preset della stanza (Classic, Competitive) non toccano le opzioni delle mod.
Regole fisse di una mod
Alcune regole del motore non sono opzioni della stanza: la mod le fissa per tutte le sue partite in rules\game.json:
{
"armyStaysWithHero": true,
"sentriesUnselectable": true,
"protectedClasses": ["Peasant", "PeasantAmbient", "Trader", "Tradecar_Donkey", "Camel", "CartTrader"]
}
| Campo | Cosa fa |
|---|---|
armyStaysWithHero |
Con true, le unità di un esercito non lasciano il loro eroe quando uno è dentro le mura e l'altro fuori. Il percorso viene comunque ricalcolato. |
sentriesUnselectable |
Con true, le sentinelle delle mura non si possono selezionare (cliccandone una si seleziona la porta) e non si uniscono agli eserciti dell'IA. |
protectedClasses |
Classi che non subiscono danni e non possono essere attaccate, insieme a tutte quelle che ne ereditano. Sono nomi di classe (Peasant), non nomi di unità. |
Cambiano il gioco, quindi in multigiocatore tutti devono usare la mod. Se più mod attive portano delle regole, queste si sommano.
Online
È gameplay: tutti i giocatori devono avere la stessa mod. L'opzione viaggia insieme alle altre regole della stanza e viene salvata con la partita.