In vorigen Kapiteln wie im Artikel zur Erstellung einfacher Computergegner oder im Artikel zu Banditenlagern und Spawnern haben wir große Teile der Armeesteuerung an Comfortfunktionen übergeben und lediglich Parameter definiert. In diesem Kapitel werden dagegen elementare Kontrollfunktionen für Armeen vorgestellt, wie sie funktionieren und wo ihre Grenzen sind. Für das Verständnis dieses Artikels ist es von Vorteil, mit Banditenlagern und Spawnern vertraut zu sein und damit bereits experimentiert zu haben.
Armeen sind Truppenverbände, die immer im Gesamten gesteuert werden (es werden also nie die einzelnen Truppen angesprochen). Jede Armee hat eine Position (auch Anker genannt) und einen Radius, in dem sie um den Anker herum operiert. Das Gebiet innerhalb des Radius um den Anker werden wir im Folgenden als Aktionsgebiet bezeichnen.
Der Artikel ist folgendermaßen strukturiert: Zuerst beschreiben wir, wie Armeen aufgesetzt werden. Anschließend listen wir Funktionen, mit denen sich der Status einer Armee abfragen lässt. Darauf folgen die elementaren Kontrollfunktionen, die für die Steuerung einer Armee zur Verfügung stehen und wie diese einzusetzen sind. Zum Schluss wollen wir all diese Funktionen zu einer komplexeren Armeesteuerung vereinen, die es zum Beispiel TickOffensiveAIController
auch macht.
Falls du den Abschitt zu Armee-Basisparametern schon kennst, kannst du diesen Abschnitt überspringen. Die Inhalte sind hier der Vollständigkeit halber enthalten.
Armeen werden mit der Funktion SetupArmy(_ArmyTable)
aufgesetzt. Der Parameter _ArmyTable
ist ein Table mit den folgenden Key-Value-Paaren:
Key | Value-Typ | Bedeutung |
---|---|---|
player | Player Id | Spieler-Id des Spielers, dem die Armee gehören soll |
id | Ganze Zahl (0 - 9) | Id der Armee. Es darf pro Spieler-Id und Armee-Id maximal eine Armee geben. Somit ist die Anzahl der Armeen pro Spieler auf 10 beschränkt |
position | Position (Table der Form {X = x, Y = y} ) | Anfangsposition der Armee |
rodeLength | Number | Radius um position , innerhalb dessen sich die Armee bewegt |
beAgressive | Boolean | Legt fest, ob die Armee auf dem Weg zu einem Angriffsziel Gegner angreifen soll (für ausschließlich defensive Armee irrelevant). true ist hier eigentlich immer sinnvoll |
Eine Armee für Spieler 2 kann also beispielsweise so aufgesetzt werden:
function CreateArmy() -- Wir definieren das Armee-Table -- Um die Armee später steuern zu können, muss dieses Table global sein! Army = { player = 2, -- wir wählen die Id 0 -- bei mehreren Armeen für Spieler 2 müssen alle unterschiedliche Ids haben id = 0, position = GetPosition("PositionArmy"), rodeLength = 4000, beAgressive = true } SetupArmy(Army) end
Spieler-Id, Armee-Id, und Aggressivität bleiben für jede Armee fest. Um die Armee zu steuern, werden später nur die Position und die rodeLength
, also der Radius, modifiziert.
Achtung: Die Verwendung von Armeen setzt voraus, dass für den KI-Spieler, dem die Armee gehört, auch eine KI aktiv ist! SetupPlayerAi
ist also zwingend notwendig! Weil das Spiel abstürzt, wenn eine KI aktiviert wird, ohne, dass der KI-Spieler ein Gebäude besitzt, muss für jeden Spieler mit einer Armee auch mindestens 1 Gebäude auf der Map stehen.
Gleichzeitig gibt es Konflikte mit der Funktion MapEditor_SetupAI. Die Angabe einer Armee-Id ist zwingend erforderlich. MapEditor_SetupAI
belegt einige dieser Ids, abhängig vom angegebenen _Strength
-Wert und „bemächtigt“ sich aller Armeen, deren Ids MapEditor_SetupAI
für sich reserviert. Dadurch werden sie der Steuerung durch eigene Skripte entzogen. Die Tabelle unten zeigt die Armee-Ids, die durch MapEditor_SetupAI
nicht mehr zur Verfügung stehen.
_Strength | Reservierte Armee-Ids |
---|---|
0 | keine |
1 | 1 bis 2 |
2 | 1 bis 4 |
3 | 1 bis 6 |
Wichtig: Mit dem Aufruf von SetupArmy
hat die Armee keine Truppen und wird sie auch nicht selbstständig rekrutieren! Es wird dem Spiel lediglich klargemacht, dass der angegebene Spieler eine Armee mit der designierten Id bekommt und ein leerer Container dafür erstellt. Wie die Armee Truppen erhalten kann (sowohl gespawnt als auch rekrutiert) wird im Abschnitt zu Truppenerstellung beschrieben.