Benutzer-Werkzeuge

Webseiten-Werkzeuge


tutorials:computergegner_-_bau_von_gebaeuden

Im diesem Abschnitt wird erläutert, wie man den KI Gegner dazu bringen kann eine Basis aufzubauen (oder einfach nur mal hier und da ein Wachturm hinzustellen). Der Abschnitt baut auf Computergegner - Grundlagen auf. Der KI Gegner braucht aber nicht unbedingt entsprechend diesem Abschnitt eingestellt werden. So könnte man es beispielsweise erreichen, daß der KI Gegner zwar Gebäude baut, aber keinerlei Truppen produziert.

Beispielscript

Es dauert auf der (unten verlinkten) Beispielkarte, auf der dieses Script ausgeführt wird, ungefähr 8 Minuten, bis der KI Gegner alle Gebäude aufgebaut hat.
Der Bauplan wird nur ausgeführt, wenn der Computergegner wie zuvor in Computergegner - Grundlagen beschrieben aktiviert wird.

-- Die von dem Grundlagenscript übernommene SpielerID des Computergegners
local aiID = 2;
 
-- Mit dieser Zeile wird festgelegt, daß der KI Gegner den Konstruktionsplan befolgen soll
SetupPlayerAi( aiID, { constructing = true } );
 
-- Hier wird der Bauplan für den Spieler festgelegt
local constructionplan = {
    -- Errichte ein einfaches Dorfzentrum möglichst nah am eigenen Hauptquartier
    { type = Entities.PB_VillageCenter1, pos = GetPosition("P2_AI_HQ") },
 
    -- Setze zwei Blumen direkt daneben
    { type = Entities.PB_Beautification09, pos = invalidPosition },
    { type = Entities.PB_Beautification09, pos = invalidPosition },
 
    -- Nun eine Lehmmine bei dem weiter entfernten Schacht (markiert durch eine ScriptEntity) errichten
    { type = Entities.PB_ClayMine1, pos = GetPosition("far_away") },
 
    -- Neben die Lehmmine kommt ein Aussichtsturm, der automatisch zum Ballistaturm ausgebaut wird
    { type = Entities.PB_Tower1, pos = invalidPosition, level = 1 },
 
    -- Dieser Aussichtsturm wird zu einem Kanonenturm
    { type = Entities.PB_Tower1, pos = invalidPosition, level = 2 },
 
    -- Die Lehmmine braucht auch noch eine einfache Farm
    { type = Entities.PB_Farm1, pos = invalidPosition },
 
    -- ..und ein einfaches Wohnhaus (obwohl Residence3 anstatt Residence1 angegeben ist)
    { type = Entities.PB_Residence3, pos = invalidPosition },
 
    -- Nun kommt noch eine normale Universität neben das Hauptquartier
    { type = Entities.PB_University1, pos = GetPosition("P2_AI_HQ") },
 
    -- Sowie eine ausgebaute Farm + Haus daneben. Diesmal aber "normal" ausgebaut
    { type = Entities.PB_Farm1, pos = invalidPosition, level = 2 },
    { type = Entities.PB_Residence1, pos = invalidPosition, level = 2 },
 
    -- Damit der Gegner auch angreifen kann, wird nun noch eine Kaserne ans Hauptquartier gestellt
    { type = Entities.PB_Barracks1, pos = GetPosition("P2_AI_HQ") },
};
 
-- Bauplan an den KI Gegner übergeben
FeedAiWithConstructionPlanFile( aiID, constructionplan );
  • Die verwendeten Gebäudenamen können der Gebäudeliste im Editor entnommen werden.
  • Es wird nicht unbedingt an der exakten vorgegebenen Positon gebaut. Ist diese nämlich belegt, wird das Gebäude an der nächsten freien Stelle aufgebaut.
  • „invalidPosition“ ist eine vom Spiel vorgegebene Variable die besagt „Baue das Gebäude an der Stelle, an der das letzte Gebäude gebaut wurde“. Sie eignet sich also gut dazu, Farmen, Häuser, Wachtürme und Deko Objekte neben ein Gebäude zu stellen. Aber.. warum nicht einfach auch GetPosition() als Position festlegen? Nun, angenommen es wird eine Universität an „Platz A“ gebaut. Jetzt kann es kann ja sein, daß das Gebäude aufgrund des begrenzten Platzes weit weg von der festgelegten Position gebaut wird. Stellt man nun anschliessend eine Wachturm „daneben“, und benutzt dabei „Platz A“, so kann es sein daß der Wachturm hinpasst. Er wird dann also sehr weit entfernt von der Universität stehen.
  • Der Aufbau kann mit dieser Zeile wieder angehalten werden.
    SetupPlayerAi( aiID, { constructing = false } );

    Da „aiID“ als lokale Variable deklariert wurde, sollte man dort das „local“ entfernen und sie umbenennen, wenn man diese später in einer anderen Funktion verwenden möchte.

  • Der Bauplan wird exakt in der vorgegebenen Reihenfolge abgearbeitet. Es kann nichts übersprungen oder nachträglich aus der Liste entfernt werden. Es ist möglich, daß der Aufbau blockiert wird. Dies kann zum Beispiel passieren, wenn der KI Gegner ein Dorfzentrum in seinem Bauplan hat, aber kein Siedlungsplatz mehr frei ist. Wenn man sich nicht sicher sein kann, ob ein entsprechender Bauplatz noch frei ist, so sollte man Abfragen ob dieser Platz noch frei ist, bevor man den Bauauftrag erteilt. Es sollten natürlich zu diesem Zeitpunkt keine anderen Gebäude mehr gebaut werden, da sonst ja zwischen der Prüfung und dem Bauversuch eine gewisse Zeit vergeht, in der der Spieler das Dorfzentrum besetzen könnte.
  • Man braucht nicht zu prüfen, ob ein Spieler ein Gebäude zerstört hat. Diese werden automatisch nach einer gewissen Zeit wieder aufgebaut. Es wäre natürlich interessant zu prüfen ob Wachtürme zerstört werden. Dann könnte man gleich ein paar weitere dazustellen, oder eine Armee hinschicken. Der Bauplan braucht also nicht zu Beginn des Spiels festgelegt werden. Man kann an beliebigen Stellen des Spiels, um auf Ereignisse zu reagieren, beliebige weitere Baupläne hinzufügen. Diese überschreiben die vorherigen Baupläne nicht, sondern werden nur an die interne Bauliste angehängt.
  • Der KI Gegner benötigt natürlich auch Ressourcen für den Bau von Gebäuden. Hat er keine mehr steht der Bauplan still, bis genügend für das aktuelle Gebäude vorhanden sind.
  • Es können alle verfügbaren Gebäude in allen Ausbaustufen gebaut werden, ohne daß der KI Gegner über die notwendige Technologie dafür verfügen muss.

Beispielkarte

Eine funktionierende Beispielkarte mit diesem Script kann hier heruntergeladen werden.

Zur Tutorial-Übersicht

tutorials/computergegner_-_bau_von_gebaeuden.txt · Zuletzt geändert: 2021/09/18 19:16 (Externe Bearbeitung)