Home › Info modding › Creare un cervello
Capitolo 07

Creare un cervello

Un .oabrain che gioca un posto computer: la cartella, ogni chiave del manifesto, i tag, i livelli, la vista completa, dove gira lo script, i budget e che cosa succede quando si ferma.

Questo capitolo riassume docs/brains/oabrain-standard.md, docs/brains/authoring.md e docs/playing-with-brains.md. Quei documenti sono il testo normativo.

Che cos'è un cervello

Il giocatore computer proprio del motore resta il predefinito e resta nel motore. Un cervello gioca un posto computer, e solo un posto che un giocatore ha impostato su di esso. Un identificativo di cervello vuoto è quel giocatore computer integrato. Un posto senza cervello, un cervello che non si adatta e un cervello che si ferma li gioca tutti quello stesso giocatore. Classic è scritto in Lua e gioca come fa quel giocatore. È la documentazione di quel giocatore, non un sostituto.

Solo la macchina che mette al posto il giocatore computer esegue lo script, quindi gli altri giocatori non hanno bisogno di niente installato. Le loro macchine rispecchiano le unità del posto. Una registrazione riprodotta non esegue lo script. Un cervello è sorgente Lua e dati. Non ha codice nativo, né file, né rete, né orologio. La vista completa è un flag sul manifesto. Un cervello può impostarlo, può giocare con esso in una partita in rete, e il posto mostra il flag.

Il pacchetto

Un cervello è un file .oabrain, o la cartella in cui quel file si decomprime. Il manifesto è lo YAML stretto che usa un profilo di mod: un documento, una mappa di primo livello, niente ancore e niente scalari a blocco. In cima al pacchetto c'è oabrain.yaml. Accanto, un file è uno di questi. Un file fuori da quell'elenco è rifiutato.

my-brain.oabrainil file che riceve un giocatore├─ oabrain.yamlobbligatorio il manifesto, al massimo 256 KiB├─ brain.lualo script di ingresso. Il nome predefinito è brain.lua. entry ne nomina un altro, e quel file deve stare nel pacchetto├─ lua/altro sorgente Lua. require legge solo questi file. Ogni parte è lettere minuscole, cifre e _├─ nets/una rete che il manifesto nomina, nets/ e una radice che finisce in .oann├─ data/una tabella di dati, profonda una sola cartella: .csv, .tdf, .json o .txt├─ icon.pngl'immagine, solo quando icon la nomina. Senza quella chiave il file è fuori├─ README.mduna nota in cima. Il gioco non la carica└─ LICENSEla licenza in cima. Il nome licence, e un readme in una sottocartella, sono fuori

Il confronto ignora le maiuscole delle lettere ASCII, salvo dove lo standard dice che i byte devono coincidere. brain.lua è fuori quando entry nomina un altro file. Un file Lua è al massimo 1 MiB. L'icona è un PNG quadrato, ogni lato al massimo 256 pixel, al massimo 256 KiB. OA installa un cervello in Brains/ e l'identificativo del manifesto.

Il manifesto

Il lettore raccoglie ogni regola rotta e lascia il manifesto invariato quando una regola è rotta. Una chiave che lo standard non elenca è rifiutata. Una chiave di profilo appartiene a una mod. Una chiave di mutatore è rifiutata come chiave di un mutatore. Metti tra virgolette una versione, perché un 1.0 nudo è un numero, e metti tra virgolette un asterisco, perché un asterisco nudo è un alias YAML.

ChiaveObbligatorioCosa fa
oabrainsì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 sotto Brains/.
namesìDa 1 a 64 byte, nessun carattere di controllo. Il nome che vedono i giocatori.
versionsìTra virgolette, da una a tre parti, una versione da mutatore, come "2.0". Un numero nudo è rifiutato. 2, 2.0 e 2.0.0 si confrontano come uguali.
authorsìUna mappa. name è obbligatorio, da 1 a 128 byte. email è facoltativo.
descriptionsìObbligatorio, da 1 a 2.000 byte. Un a capo è ammesso. Qualsiasi altro carattere di controllo è rifiutato. La prima riga, tagliata a 200 byte, è il riassunto.
homepagenoUn indirizzo http o https.
iconnoSolo icon.png, l'immagine in cima al pacchetto. Qualsiasi altra cosa è rifiutata.
tagssìDa 1 a 4 dei nove tag sotto, nessuno ripetuto.
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.
requiresnoSolo engine e expansions. engine è un intervallo, tra virgolette quando inizia con un segno di maggiore. expansions è da 1 a 16 identificativi di bundle. Un cervello non può richiedere un mutatore.
levelssìDa 1 a 6 livelli. Ogni mappa è esattamente id, name e difficulty.
fullAwarenessnotrue o false. Se manca, vale false. Un true tra virgolette è rifiutato.
networksnoDa 1 a 16, ciascuno esattamente id, file e sha256. file è nets/ e una radice che finisce in .oann. sha256 è 64 cifre esadecimali minuscole, tra virgolette.
optionsnoAl massimo 16, le regole delle opzioni del mutatore. Un interruttore è true o false, un numero è un numero e una scelta è il suo testo. me.options le legge.
stringsnoAl massimo 16 lingue. Una lingua può contenere name, description, options, labels e levels.
entrynoUn file Lua in cima al pacchetto, con nome di lettere minuscole, cifre e _. Se manca, è brain.lua.

I nove tag

Un tag è uno di questi nove, confrontato byte per byte. Più di quattro, quando la regola condivisa dei tag è già passata, è un problema a sé. Un tag che non è uno dei nove è rifiutato.

Chiave
classic
economy
rush
turtle
air
naval
learned
teaching
experimental

Livelli e difficoltà

levels è una lista da 1 a 6 mappe. Ciascuna è esattamente id, name e difficulty, tutti obbligatori. id è kebab-case minuscolo, da 1 a 32 byte, e nessun id si ripete. name è da 1 a 64 byte, senza carattere di controllo. difficulty è easy, medium o hard, byte per byte.

Quei tre nomi sono i valori 0, 1 e 2. Un posto che sceglie il livello usa quel valore come sue regole di reddito, la stessa difficoltà che il gioco usa già.

Vista completa

fullAwareness è true o false. Se manca, vale false. Un cervello con il flag vede unità che un posto nella nebbia non vedrebbe, come fa il giocatore computer integrato, e i suoi controlli di sito non hanno bisogno di un giocatore che piazza. Il flag è ammesso in una partita in rete. La Libreria mostra Vede ogni unità sulla mappa, come il giocatore computer di Total Annihilation. Il flag è proprio del manifesto. Non lo concede l'identificativo del pacchetto, e non è una delle cose date solo a Classic.

Dove gira un cervello

Solo la macchina che mette al posto il giocatore computer ha bisogno del pacchetto, e solo quella macchina esegue lo script. Un posto è un giocatore computer di questa macchina. Un posto umano è rifiutato. game.mode è skirmish, campaign o network.

SituazioneChe cosa gira
SchermagliaOgni posto computer che questa macchina gioca, quando un giocatore ci ha messo un cervello. Un identificativo vuoto è il giocatore computer integrato.
Missione di campagnaIl posto di campagna segue il cervello predefinito che ha impostato il giocatore. Una missione non ignora quel predefinito.
Partita in reteLa macchina che possiede il posto computer esegue il cervello, vista completa compresa. Le altre macchine no.
Partita salvata caricata dopoLa partita salvata nomina ogni posto. Lo standard dice che cosa succede quando manca il pacchetto o la versione è diversa.
Registrazione riprodottaLa registrazione memorizza il testo dei cervelli. La riproduzione applica i pacchetti registrati. Non mette un cervello al posto e non chiama i suoi hook.
Deathmatch o torneoL'avvio non mette al posto nessun giocatore computer.

Il cervello che un posto gioca non entra nell'hash di simulazione. Due partite che differiscono solo per quale cervello è al posto conservano lo stesso hash dello stato della partita. I valori delle regole ai.* della mod fanno parte del profilo di mod che quell'hash copre, quindi arrivano comunque a ogni macchina.

I budget del runtime

Un cervello gira come Lua in una sandbox. Due cervelli non condividono moduli, né globali, né budget. Lo script non ha file, né orologio, né ambiente, né processo, né rete. Ogni blocco è caricato come testo. pcall e xpcall non possono tenere in vita una fase esaurita. Un turno è una chiamata a carico della banca, nel punto del controllore del posto, dopo la passata delle unità. Gli ordini che un hook dà hanno effetto nel tick successivo.

BudgetValore
Istruzioni in load, fits, start, save e report50,000,000
Istruzioni che un tick aggiunge2,000,000
Tick che la banca può tenere, tick corrente compreso30, così il saldo parte da 60,000,000
Memoria Lua64 MiB (67,108,864 byte). Non si azzera fra le fasi.
Memoria di rete64 MiB, a parte il tetto Lua
Tempo reale, una fase che non è un turno, in millisecondi10,000
Tempo reale, un turno, in millisecondi250
Una stringa, in byte65,536

Quando un cervello fallisce

Un cervello si ferma per un errore in un hook o in un timer, una quota di istruzioni esaurita, il fermo di riserva del tempo reale, il tetto di memoria Lua, una stringa oltre 65.536 byte, o un caricamento che il posto rifiuta. Un turno fallito chiude la sandbox e toglie gli hook prima che quel turno ritorni. Il turno che fallisce conta comunque come giocato. Il tick di ordini successivo non ha hook, quindi lo prende il giocatore computer integrato. Un cervello rifiutato, che non parte o che non si adatta, non ha mai hook, quindi quel giocatore gioca dall'inizio. L'avviso usa il nome del manifesto e il motivo, tagliati a 160 byte:

- `{brain} stopped ({reason}); the engine plays this seat on`
- `{brain} could not start ({reason}); the engine plays this seat`
- `{brain} does not fit this game ({reason}); the engine plays this seat`

Quando il posto non ha un motivo suo, il motivo è the brain could not be seated. Un giocatore sconfitto semplicemente non viene più chiamato. La sandbox si chiude con la partita.