Home › Info modding › Creare un mutatore
Capitolo 03

Creare un mutatore

Un piccolo .oamut sopra il gioco base o qualsiasi mod: la cartella, il manifesto, il piano che mutate restituisce, le opzioni, la sandbox e l'ordine di una pila.

Questo capitolo riassume docs/mutators/authoring.md e docs/mutators/oamut-standard.md.

Che cos'è un mutatore

Un mutatore è un piccolo pacchetto .oamut, a strati sul gioco base o su qualsiasi mod. Cambia una partita. La Libreria lo installa nella cartella Mutators sotto l'identificativo del manifesto, e installarlo non lo accende. Il giocatore lo accende per una schermaglia, una sala di battaglia o una campagna. works-with dice con quali mod funziona, e un asterisco significa qualsiasi mod e il gioco base.

Il pacchetto

In cima alla cartella c'è oamut.yaml. Lo script di ingresso sta accanto: mutator.lua, salvo che entry ne nomini un altro, e mai sotto files/, rules/ o lua/. lua/ tiene altro sorgente Lua, gli unici file che require legge. files/ tiene i byte che lo strato files può aggiungere. rules/ tiene i file di regole il cui nome finisce in .sm. Un'icona è il PNG che il manifesto nomina. Una nota il cui nome finisce in .md o .txt viaggia per le persone, e il gioco non la carica. Un file fuori da quell'elenco è rifiutato. Il confronto ignora le maiuscole delle lettere ASCII.

my-mutator.oamutil file che riceve un giocatore├─ oamut.yamlobbligatorio il manifesto├─ mutator.lualo script di ingresso, mutate(ctx)├─ lua/facoltativo; moduli Lua, gli unici file che require legge├─ files/facoltativo; modelli, script e altri byte├─ rules/facoltativo; file di regole .sm├─ icon.pngfacoltativo; il PNG nominato da icon└─ README.mduna nota; il gioco non la carica

Il manifesto

YAML stretto, le stesse regole di un profilo di mod: un documento, una mappa al primo livello, niente ancore e niente scalari a blocco. Il file inizia con oamut come intero 1. Una chiave che lo standard non elenca è rifiutata. Metti tra virgolette un valore che inizia con un segno di maggiore, e un asterisco, altrimenti il lettore li prende per altro. requires.engine è tra virgolette per questo. Anche la versione: un numero nudo è rifiutato.

ChiaveObbligatorioCosa fa
oamutsìIl formato. L'intero 1. 1.0, e un 1 tra virgolette, sono rifiutati.
idsìKebab-case minuscolo, da 1 a 64 byte. Niente trattino iniziale, finale o doppio. Il nome della cartella di installazione.
namesìDa 1 a 64 byte, nessun carattere di controllo. Il nome che vedono i giocatori.
versionsìTra virgolette, al massimo 32 byte. Da una a tre parti unite da un punto, ciascuna un numero da 0 a 65535 senza zero iniziale.
authorsìUna mappa. name è obbligatorio, da 1 a 128 byte. email è facoltativo.
descriptionnoFacoltativo, da 1 a 2.000 byte. Un a capo è ammesso. La prima riga, tagliata a 200 byte, è il riassunto che mostra il catalogo.
homepagenoFacoltativo, da 1 a 256 byte. Un indirizzo http o https.
iconnoFacoltativo. Il percorso nel pacchetto di un PNG quadrato, che finisce in .png. L'installatore controlla l'immagine.
tagssìDa uno a quattro identificativi, nessuno ripetuto. Gli otto che la Libreria disegna sono sotto.
works-withsìDa 1 a 32 condizioni, nessun identificativo due volte. Un asterisco significa qualsiasi mod e il gioco base, ed è allora l'unica voce. ta-3.1c significa il gioco base senza mod. Ogni altro identificativo è una mod, con un intervallo di versione facoltativo.
requiresnoFacoltativo. Solo engine e mutators. engine è un intervallo tra virgolette rispetto a questa build. mutators nomina pacchetti che devono essere accesi; si applicano prima di questo, nell'ordine scritto.
conflicts-withnoFacoltativo. Mutatori accanto ai quali questo rifiuta di girare. Un identificativo qui non è uno che requires.mutators nomina, né l'identificativo di questo mutatore.
layerssìDa uno a nove nomi, nessuno ripetuto: files, units, weapons, features, sides, tables, menus, maps e hacks. Un piano può scrivere solo uno strato nominato qui.
clashesnoFacoltativo, add o replace: che cosa fa questo mutatore con un'unità o un'arma il cui nome è già nel gioco. Prima vale la scelta del giocatore, poi questa chiave, poi la preferenza mutators.clash-default, che è replace quando non è impostata.
optionsnoFacoltativo, al massimo 16. Impostazioni che il giocatore sceglie prima della partita. ctx.options le legge.
stringsnoFacoltativo, al massimo 16 codici di lingua. Traduzioni del nome, della descrizione e delle etichette delle opzioni.
entrynoFacoltativo. Lo script di ingresso, un percorso del pacchetto che finisce in .lua e non sta sotto files/, rules/ o lua/. Se la chiave manca, è mutator.lua.
legacynoFacoltativo, da 1 a 16 schede di mutatori TA: Mutation che questo pacchetto sostituisce. Ogni scheda è name, prefix, compatibility e files. Una mappa nuda è rifiutata.

Gli otto tag

Il lettore accetta qualsiasi tag in kebab-case minuscolo, da 1 a 32 byte, al massimo quattro. La Libreria disegna un'icona e un'etichetta tradotta per questi otto identificativi, uguali alla lettera. Ogni altro identificativo si mostra come è stato scritto, senza un'icona sua. Se il manifesto non nomina un'icona, il badge usa l'icona del primo tag quando quell'identificativo è uno degli otto.

ChiaveCosa fa
statisticsStatistiche
economyEconomia
commandersComandanti
new-unitsNuove unità
disableDivieti
gameplayGioco
aiIA
mapsMappe

Il piano

L'ingresso definisce mutate. Il motore chiama mutate(ctx) una volta, nella fase di piano, e quella chiamata non cambia il gioco da sola. mutate restituisce una tabella. Una tabella vuota non cambia nulla. Una chiave che il motore non conosce è rifiutata.

files è una tabella di add e mask. Ciascuno è una lista di testo, e uno dei due può mancare. add nomina cartelle del pacchetto, in ordine, e una cartella successiva vince un percorso che entrambe tengono. mask nasconde percorsi. rules è una lista di blocchi finiti, fatti con where, all, named o on e poi :change, e di percorsi sm che nominano un file .sm. Un cambiamento è set, scale, lock, remove o append. scale può prendere un limite basso e uno alto, e quel limite ferma solo quel fattore. Gli hook sono funzioni. Girano in quest'ordine: units, weapons, features, sides, tables, poi menus. maps gira dopo ogni mutatore, e solo quando la partita ha scelto una mappa. hacks imposta, per questa partita, un parametro che il registro apre ai mutatori. Dichiarare lo strato è ciò che permette la scrittura.

Opzioni e ctx

Durante mutate, ctx tiene la mod (identificativo, versione e gioco), la versione del motore, le opzioni e ctx.incompatible. ctx.mod.id è ta-3.1c quando nessuna mod è accesa. Chiamare ctx.incompatible con un motivo ferma questo mutatore, e il motivo è il testo che vede il giocatore. Le collezioni non sono ancora caricate. Un hook può leggere units, weapons, features, sides, tables e menus su ctx senza dichiarare lo strato. Scriverne uno richiede lo strato.

ctx.options tiene un campo per identificativo di opzione. Un interruttore è true o false. Un numero, e una scelta i cui valori sono numeri, è un numero. Una scelta i cui valori sono identificativi è testo. Un'opzione che il giocatore ha lasciato è il valore predefinito. type è toggle, choice o number. Una scelta elenca da 2 a 16 values, tutti numeri o tutti identificativi, e labels quando le parole differiscono dai valori. Un numero ha min, max, step e default. Il giocatore può scegliere solo un valore da min a max che cade su un passo, così lo script non deve ricontrollare l'intervallo: un valore fuori dai passi è rifiutato prima che lo script giri. L'identificativo dell'opzione è un nome Lua, e una parola chiave Lua è rifiutata.

La sandbox

Lo script gira come Lua in una sandbox. Non ha file, né rete, né orologio, né ambiente, né processo. io, os, debug, package e coroutine non sono aperti, e un blocco precompilato è rifiutato. Ogni blocco è sorgente. Due mutatori non condividono stato.

Ogni fase riparte dall'intera quota di istruzioni, 50.000.000, e dall'intero limite di tempo reale di 10 secondi. Il tetto di memoria è 64 MiB e non viene ridato per la fase successiva. Una stringa è al massimo 65.536 byte. Usa fixed per un valore che lo script calcola. Conta 65.536esimi, così lo stesso script scrive lo stesso testo su ogni macchina. pairs percorre le chiavi in un ordine fisso. Il risultato non dipende dalla macchina.

Impilare

Il giocatore elenca i mutatori in un ordine, applicati dall'alto in basso. Il primo si applica per primo. Ogni successivo vede il gioco come l'hanno lasciato quelli sopra. I mutatori nominati in requires.mutators si accendono con questo e si applicano prima, nell'ordine in cui la lista li scrive. Più di 32 mutatori, un identificativo due volte, un requisito che niente sopra soddisfa, o due in conflitto, rifiuta l'intera lista, e non gira nulla.

I file di ogni mutatore si stratificano per primi, nell'ordine della lista, e un mutatore successivo vince un percorso. Poi ogni mutatore, nello stesso ordine, legge i propri file di unità, armi e download come schede, applica le sue regole e poi esegue i suoi hook. Le regole applicano un cambiamento alla volta, in un ordine fisso. Un fattore moltiplica il numero corrente, e un limite ferma solo quel fattore, non uno successivo. Un'assegnazione sostituisce il valore corrente. lock imposta il valore e impedisce a ogni mutatore successivo di cambiare quel campo. Dentro un blocco Lua i cambiamenti girano per nome di campo dopo le minuscole ASCII, non nell'ordine in cui la tabella è stata scritta. Non c'è una media tra mutatori. Quando tutti i mutatori si sono applicati, un numero di unità o di arma oltre la larghezza che il gioco memorizza, e un numero di elemento oltre l'intervallo che il gioco legge, è tenuto all'estremo di quell'intervallo, una volta.