Benutzer-Werkzeuge

Webseiten-Werkzeuge


scripting:tutorials:level3:armies

Armeesteuerung

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.


Aufsetzen einer Armee

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.

Funktionen zum Armeestatus

Elementare Funktionen zur Armeesteuerung

Truppenerstellung und andere wichtige Armeefunktionen

Beispiel für komplexe Armeesteuerung

scripting/tutorials/level3/armies.txt · Zuletzt geändert: 2024/05/20 13:18 von fritz_98