Start › Modding-Infos › Ein Gehirn machen
Kapitel 07

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ßerhalb

Der 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üsselPflichtWirkung
oabrainjaDas Format. Die Ganzzahl 1. 1.0 und eine 1 in Anführungszeichen werden abgelehnt.
idjaKebab-Schreibweise in Kleinbuchstaben, 1 bis 64 Bytes. Kein Bindestrich am Anfang, am Ende oder doppelt. Der Ordnername unter Brains/.
nameja1 bis 64 Bytes, kein Steuerzeichen. Der Name, den Spieler sehen.
versionjaIn 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.
authorjaEine Abbildung. name ist Pflicht, 1 bis 128 Bytes. email ist optional.
descriptionjaPflicht, 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.
homepageneinEine http- oder https-Adresse.
iconneinNur icon.png, das Bild oben im Paket. Alles andere wird abgelehnt.
tagsja1 bis 4 der neun Tags unten, keines wiederholt.
works-withja1 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.
requiresneinNur 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.
levelsja1 bis 6 Stufen. Jede Abbildung ist genau id, name und difficulty.
fullAwarenessneintrue oder false. Fehlt der Schlüssel, gilt false. Ein true in Anführungszeichen wird abgelehnt.
networksnein1 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.
optionsneinHö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.
stringsneinHöchstens 16 Sprachen. Eine Sprache darf name, description, options, labels und levels enthalten.
entryneinEine 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.

SituationWas läuft
GefechtJeder Computersitz, den diese Maschine spielt, wenn ein Spieler ein Gehirn darauf gesetzt hat. Eine leere Kennung ist der eingebaute Computerspieler.
KampagnenmissionDer Kampagnensitz folgt dem Standardgehirn, das der Spieler gesetzt hat. Eine Mission ignoriert diesen Standard nicht.
NetzwerkspielDie Maschine, der der Computersitz gehört, führt das Gehirn aus, volle Sicht eingeschlossen. Die anderen Maschinen tun es nicht.
Gespeichertes Spiel, später geladenDer Spielstand nennt jeden Sitz. Der Standard sagt, was geschieht, wenn das Paket fehlt oder die Version abweicht.
Abgespielte AufnahmeDie 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 TurnierDer 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.

BudgetWert
Instruktionen in load, fits, start, save und report50,000,000
Instruktionen, die ein Tick hinzufügt2,000,000
Ticks, die die Bank halten darf, den aktuellen Tick eingeschlossen30, darum beginnt der Stand bei 60,000,000
Lua-Speicher64 MiB (67,108,864 Bytes). Er wird zwischen den Phasen nicht zurückgesetzt.
Speicher des Netzes64 MiB, getrennt von der Lua-Grenze
Echtzeit, eine Phase, die kein Zug ist, in Millisekunden10,000
Echtzeit, ein Zug, in Millisekunden250
Eine Zeichenkette, in Bytes65,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.