Ein Gehirn machen
Eine .oabrain, die einen Computersitz spielt: der Ordner, jeder Schlüssel des Manifests, die Tags, die Stufen, die volle Sicht, wo das Skript läuft, die Budgets und was geschieht, wenn es anhält.
Dieses Kapitel fasst docs/brains/oabrain-standard.md, docs/brains/authoring.md und docs/playing-with-brains.md zusammen. Diese Dokumente sind der maßgebliche Text.
Was ein Gehirn ist
Der eigene Computerspieler der Engine bleibt der Standard und bleibt in der Engine. Ein Gehirn spielt einen Computersitz, und nur einen Sitz, den ein Spieler auf dieses Gehirn gesetzt hat. Eine leere Gehirn-Kennung ist dieser eingebaute Spieler. Ein Sitz ohne Gehirn, ein Gehirn, das nicht passt, und ein Gehirn, das anhält, werden alle von demselben Spieler gespielt. Classic ist in Lua geschrieben und spielt so, wie dieser Spieler spielt. Es ist die Dokumentation dieses Spielers, kein Ersatz.
Nur die Maschine, die den Computerspieler einsetzt, führt das Skript aus, darum brauchen die anderen Spieler nichts installiert. Ihre Maschinen spiegeln die Einheiten des Sitzes. Eine abgespielte Aufnahme führt das Skript nicht aus. Ein Gehirn ist Lua-Quelltext und Daten. Es hat keinen nativen Code, keine Datei, kein Netz und keine Uhr. Volle Sicht ist ein Flag im Manifest. Ein Gehirn darf es setzen, darf damit in einem Netzwerkspiel spielen, und der Sitz zeigt das Flag.
Das Paket
Ein Gehirn ist eine .oabrain-Datei oder der Ordner, in den diese Datei entpackt wird. Das Manifest ist das strikte YAML, das ein Mod-Profil nutzt: ein Dokument, eine Abbildung auf oberster Ebene, keine Anker und keine Blockskalare. Oben im Paket liegt oabrain.yaml. Daneben ist eine Datei eine von diesen. Eine Datei außerhalb dieser Liste wird abgelehnt.
my-brain.oabraindie Datei, die ein Spieler bekommt├─ oabrain.yamlerforderlich das Manifest, höchstens 256 KiB├─ brain.luadas Einstiegsskript. Der Standardname ist brain.lua. entry nennt eine andere Datei, und diese Datei muss im Paket sein├─ lua/weiterer Lua-Quelltext. require liest nur diese Dateien. Jeder Teil besteht aus Kleinbuchstaben, Ziffern und _├─ nets/ein Netz, das das Manifest nennt, nets/ und ein Stamm, der auf .oann endet├─ data/eine Datentabelle, einen Ordner tief: .csv, .tdf, .json oder .txt├─ icon.pngdas Bild, nur wenn icon es nennt. Ohne diesen Schlüssel liegt die Datei außerhalb├─ README.mdeine Notiz oben. Das Spiel lädt sie nicht└─ LICENSEdie Lizenz oben. Der Name licence und ein readme in einem Unterordner liegen außerhalbDer Vergleich ignoriert die Großschreibung von ASCII-Buchstaben, außer wo der Standard sagt, dass die Bytes übereinstimmen müssen. brain.lua liegt außerhalb, wenn entry eine andere Datei nennt. Eine Lua-Datei hat höchstens 1 MiB. Das Icon ist ein quadratisches PNG, jede Seite höchstens 256 Pixel, höchstens 256 KiB. OA installiert ein Gehirn nach Brains/ und die Kennung aus dem Manifest.
Das Manifest
Der Leser sammelt jede verletzte Regel und lässt das Manifest unverändert, wenn irgendeine Regel verletzt ist. Ein Schlüssel, den der Standard nicht aufführt, wird abgelehnt. Ein Profilschlüssel gehört in einen Mod. Ein Mutatorschlüssel wird als Schlüssel eines Mutators abgelehnt. Setze eine Version in Anführungszeichen, denn eine nackte 1.0 ist eine Zahl, und setze einen Stern in Anführungszeichen, denn ein nackter Stern ist ein YAML-Alias.
| Schlüssel | Pflicht | Wirkung |
|---|---|---|
oabrain | ja | Das Format. Die Ganzzahl 1. 1.0 und eine 1 in Anführungszeichen werden abgelehnt. |
id | ja | Kebab-Schreibweise in Kleinbuchstaben, 1 bis 64 Bytes. Kein Bindestrich am Anfang, am Ende oder doppelt. Der Ordnername unter Brains/. |
name | ja | 1 bis 64 Bytes, kein Steuerzeichen. Der Name, den Spieler sehen. |
version | ja | In Anführungszeichen, ein bis drei Teile, eine Mutator-Version, etwa "2.0". Eine nackte Zahl wird abgelehnt. 2, 2.0 und 2.0.0 gelten als gleich. |
author | ja | Eine Abbildung. name ist Pflicht, 1 bis 128 Bytes. email ist optional. |
description | ja | Pflicht, 1 bis 2.000 Bytes. Ein Zeilenumbruch ist erlaubt. Jedes andere Steuerzeichen wird abgelehnt. Die erste Zeile, auf 200 Bytes gekürzt, ist die Zusammenfassung. |
homepage | nein | Eine http- oder https-Adresse. |
icon | nein | Nur icon.png, das Bild oben im Paket. Alles andere wird abgelehnt. |
tags | ja | 1 bis 4 der neun Tags unten, keines wiederholt. |
works-with | ja | 1 bis 32 Bedingungen, keine Kennung doppelt. Ein Stern meint jeden Mod und das Grundspiel und ist dann der einzige Eintrag. ta-3.1c meint das Grundspiel ohne Mod. Jede andere Kennung ist ein Mod, mit optionalem Versionsbereich. |
requires | nein | Nur engine und expansions. engine ist ein Bereich, in Anführungszeichen, wenn er mit einem Größer-als-Zeichen beginnt. expansions sind 1 bis 16 Bündelkennungen. Ein Gehirn kann keinen Mutator voraussetzen. |
levels | ja | 1 bis 6 Stufen. Jede Abbildung ist genau id, name und difficulty. |
fullAwareness | nein | true oder false. Fehlt der Schlüssel, gilt false. Ein true in Anführungszeichen wird abgelehnt. |
networks | nein | 1 bis 16, jedes ist genau id, file und sha256. file ist nets/ und ein Stamm, der auf .oann endet. sha256 ist 64 Hexziffern in Kleinbuchstaben, in Anführungszeichen. |
options | nein | Höchstens 16, die Optionsregeln des Mutators. Ein Schalter ist true oder false, eine Zahl ist eine Zahl, und eine Wahl ist ihr Text. me.options liest sie. |
strings | nein | Höchstens 16 Sprachen. Eine Sprache darf name, description, options, labels und levels enthalten. |
entry | nein | Eine Lua-Datei oben im Paket, benannt mit Kleinbuchstaben, Ziffern und _. Fehlt der Schlüssel, ist es brain.lua. |
Die neun Tags
Ein Tag ist eines dieser neun, Byte für Byte verglichen. Mehr als vier, wenn die gemeinsame Tag-Regel schon bestanden hat, ist ein eigenes Problem. Ein Tag, das keines der neun ist, wird abgelehnt.
| Schlüssel |
|---|
classic |
economy |
rush |
turtle |
air |
naval |
learned |
teaching |
experimental |
Stufen und Schwierigkeit
levels ist eine Liste von 1 bis 6 Abbildungen. Jede ist genau id, name und difficulty, alle Pflicht. id ist Kebab-Schreibweise in Kleinbuchstaben, 1 bis 32 Bytes lang, und keine id wird wiederholt. name ist 1 bis 64 Bytes, kein Steuerzeichen. difficulty ist easy, medium oder hard, Byte für Byte.
Diese drei Namen sind die Werte 0, 1 und 2. Ein Sitz, der die Stufe wählt, nutzt diesen Wert als seine Einkommensregeln, dieselbe Schwierigkeit, die das Spiel schon nutzt.
Volle Sicht
fullAwareness ist true oder false. Fehlt der Schlüssel, gilt false. Ein Gehirn mit dem Flag sieht Einheiten, die ein Sitz im Nebel nicht sehen würde, so wie der eingebaute Computerspieler, und seine site-Prüfungen brauchen keinen platzierenden Spieler. Das Flag ist in einem Netzwerkspiel erlaubt. Die Bibliothek zeigt Sieht jede Einheit auf der Karte, so wie der Computerspieler von Total Annihilation.. Das Flag ist das eigene des Manifests. Die Paketkennung verleiht es nicht, und es gehört nicht zu dem, was nur Classic bekommt.
Wo ein Gehirn läuft
Nur die Maschine, die den Computerspieler einsetzt, braucht das Paket, und nur diese Maschine führt das Skript aus. Ein Sitz ist ein Computerspieler dieser Maschine. Ein menschlicher Sitz wird abgelehnt. game.mode ist skirmish, campaign oder network.
| Situation | Was läuft |
|---|---|
| Gefecht | Jeder Computersitz, den diese Maschine spielt, wenn ein Spieler ein Gehirn darauf gesetzt hat. Eine leere Kennung ist der eingebaute Computerspieler. |
| Kampagnenmission | Der Kampagnensitz folgt dem Standardgehirn, das der Spieler gesetzt hat. Eine Mission ignoriert diesen Standard nicht. |
| Netzwerkspiel | Die Maschine, der der Computersitz gehört, führt das Gehirn aus, volle Sicht eingeschlossen. Die anderen Maschinen tun es nicht. |
| Gespeichertes Spiel, später geladen | Der Spielstand nennt jeden Sitz. Der Standard sagt, was geschieht, wenn das Paket fehlt oder die Version abweicht. |
| Abgespielte Aufnahme | Die Aufnahme speichert den Text der Gehirne. Die Wiedergabe wendet die aufgezeichneten Pakete an. Sie setzt kein Gehirn ein und ruft seine Hooks nicht auf. |
| Deathmatch oder Turnier | Der Start setzt keine Computerspieler ein. |
Das Gehirn, das ein Sitz spielt, ist keine Eingabe des Simulationshashs. Zwei Matches, die sich nur darin unterscheiden, welches Gehirn eingesetzt ist, behalten denselben Hash des Matchzustands. Die ai.*-Regelwerte des Mods gehören zum Mod-Profil, das dieser Hash abdeckt, darum erreichen sie trotzdem jede Maschine.
Die Budgets der Laufzeit
Ein Gehirn läuft als Lua in einer Sandbox. Zwei Gehirne teilen keine Module, keine Globals und keine Budgets. Das Skript hat keine Datei, keine Uhr, keine Umgebung, keinen Prozess und kein Netz. Jeder Block wird als Text geladen. pcall und xpcall können eine aufgebrauchte Phase nicht am Leben halten. Ein Zug ist ein Aufruf aus der Bank, am Controller-Punkt des Sitzes, nach dem Durchlauf der Einheiten. Befehle, die ein Hook gibt, wirken im nächsten Tick.
| Budget | Wert |
|---|---|
| Instruktionen in load, fits, start, save und report | 50,000,000 |
| Instruktionen, die ein Tick hinzufügt | 2,000,000 |
| Ticks, die die Bank halten darf, den aktuellen Tick eingeschlossen | 30, darum beginnt der Stand bei 60,000,000 |
| Lua-Speicher | 64 MiB (67,108,864 Bytes). Er wird zwischen den Phasen nicht zurückgesetzt. |
| Speicher des Netzes | 64 MiB, getrennt von der Lua-Grenze |
| Echtzeit, eine Phase, die kein Zug ist, in Millisekunden | 10,000 |
| Echtzeit, ein Zug, in Millisekunden | 250 |
| Eine Zeichenkette, in Bytes | 65,536 |
Wenn ein Gehirn scheitert
Ein Gehirn stoppt bei einem Fehler in einem Hook oder einem Timer, einem aufgebrauchten Befehlskontingent, dem Echtzeit-Rückhalt, der Lua-Speichergrenze, einer Zeichenkette über 65.536 Bytes oder einem Ladevorgang, den der Sitz ablehnt. Ein gescheiterter Zug schließt die Sandbox und löscht die Hooks, bevor dieser Zug zurückkehrt. Der scheiternde Zug zählt trotzdem als gespielt. Der nächste Befehls-Tick hat keine Hooks, darum übernimmt ihn der eingebaute Computerspieler. Ein Gehirn, das abgelehnt wird, nicht startet oder nicht passt, hat nie Hooks, darum spielt dieser Spieler von Anfang an. Der Hinweis verwendet den Namen aus dem Manifest und den Grund, auf 160 Bytes gekürzt:
- `{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`
Wenn der Sitz keinen eigenen Grund hat, ist der Grund the brain could not be seated. Ein besiegter Spieler wird einfach nicht mehr aufgerufen. Die Sandbox schließt mit dem Match.