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 fuoriIl 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.
| Chiave | Obbligatorio | Cosa fa |
|---|---|---|
oabrain | sì | Il formato. L'intero 1. 1.0 e un 1 tra virgolette sono rifiutati. |
id | sì | Kebab-case minuscolo, da 1 a 64 byte. Niente trattino iniziale, finale o doppio. Il nome della cartella sotto Brains/. |
name | sì | Da 1 a 64 byte, nessun carattere di controllo. Il nome che vedono i giocatori. |
version | sì | 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. |
author | sì | Una mappa. name è obbligatorio, da 1 a 128 byte. email è facoltativo. |
description | sì | 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. |
homepage | no | Un indirizzo http o https. |
icon | no | Solo icon.png, l'immagine in cima al pacchetto. Qualsiasi altra cosa è rifiutata. |
tags | sì | Da 1 a 4 dei nove tag sotto, nessuno ripetuto. |
works-with | sì | 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. |
requires | no | Solo 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. |
levels | sì | Da 1 a 6 livelli. Ogni mappa è esattamente id, name e difficulty. |
fullAwareness | no | true o false. Se manca, vale false. Un true tra virgolette è rifiutato. |
networks | no | Da 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. |
options | no | Al 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. |
strings | no | Al massimo 16 lingue. Una lingua può contenere name, description, options, labels e levels. |
entry | no | Un 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.
| Situazione | Che cosa gira |
|---|---|
| Schermaglia | Ogni posto computer che questa macchina gioca, quando un giocatore ci ha messo un cervello. Un identificativo vuoto è il giocatore computer integrato. |
| Missione di campagna | Il posto di campagna segue il cervello predefinito che ha impostato il giocatore. Una missione non ignora quel predefinito. |
| Partita in rete | La macchina che possiede il posto computer esegue il cervello, vista completa compresa. Le altre macchine no. |
| Partita salvata caricata dopo | La partita salvata nomina ogni posto. Lo standard dice che cosa succede quando manca il pacchetto o la versione è diversa. |
| Registrazione riprodotta | La 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 torneo | L'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.
| Budget | Valore |
|---|---|
| Istruzioni in load, fits, start, save e report | 50,000,000 |
| Istruzioni che un tick aggiunge | 2,000,000 |
| Tick che la banca può tenere, tick corrente compreso | 30, così il saldo parte da 60,000,000 |
| Memoria Lua | 64 MiB (67,108,864 byte). Non si azzera fra le fasi. |
| Memoria di rete | 64 MiB, a parte il tetto Lua |
| Tempo reale, una fase che non è un turno, in millisecondi | 10,000 |
| Tempo reale, un turno, in millisecondi | 250 |
| Una stringa, in byte | 65,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.