Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
Einen Computergegner platzieren
Siedler 5 hat keine selbstständige KI wie seine Vorgänger. Computerspieler werden keine Stadt bauen und auch nicht ohne Weiteres Armeen ausheben und damit angreifen. All diese Dinge sind zwar möglich, müssen aber für jede Karte aufwendig geskriptet werden. Die Einzelheiten dazu werden in Ebene 3 ( link) ausführlich erklärt.
Für einen einfachen Computergegner gibt es allerdings leicht zu bedienende Funktionen, mit denen rudimentäres Verhalten wie Truppenrekrutierung, Frontalangriffe und Wiederaufbau von Gebäuden ausgeführt werden kann. Da das keinen eigenständigen Stadtaufbau beinhaltet, muss die Siedlung des KI-Gegners bereits im Editor platziert werden (siehe auch Objekte platzieren).
Der Vorteil dieser Funktionen ist, dass man mit ihnen schnell einen spielbaren Kartenablauf erhält, der nur noch bzgl. Balancing feinjustiert werden muss. Der Nachteil ist, dass man viel Kontrolle über das KI-Verhalten an den internen KI-Controller abgibt und so weniger genau festlegen kann, wie sich die KI in bestimmten Situationen verhalten soll.
In der folgenden Tabelle wollen wir eine kleine Übersicht darüber geben, was die im Folgenden vorgestellten Funktionen beinhalten und was nicht.
Einfaches KI-Verhalten - Was es kann | Einfaches KI-Verhalten - Was es nicht kann |
---|---|
Wenn Rekrutierungsgebäude gegeben sind: Truppen rekrutieren | Selbstständig eine Stadt aufbauen |
Rekrutierte Truppen zu Armeen zusammenführen | Eine bestimmte Schlüsselposition verteidigen |
Zerstörte Gebäude wieder errichten, beschädigte reparieren | Technologien erforschen |
Leibeigene kaufen | Steuern und Motivation verwalten |
Frontalangriffe bei ausreichender Armeestärke | Komplexes Armeeverhalten wie Angriffe auf Schwachpunkte, Patrouillen, etc. |
In der Regel führt das dazu, dass KI-Gegner nicht allein von den selbst erwirtschafteten Ressourcen „leben“ können, sondern immer zusätzliche Ressourcen per Skript gutgeschrieben bekommen. Auch braucht die KI mit den folgenden Funktionen keine Plätze im Dorfzentrum, um zu funktionieren. Es wirkt aber authentischer für den Spieler, wenn der Computergegner eine theoretisch funktionierende Wirtschaft besitzt.
Es gibt zwei wichtige Funktionen für die Definition unserer einfachen KI:
MapEditor_SetupAI
kontrolliert das militärische Verhalten der KI. Anzahl und Art der Truppen, die die KI rekrutieren soll, werden damit festgelegt.SetupPlayerAi
erlaubt uns die Einstellung ziviler Eigenschaften der KI, vornehmlich das Verhalten der Leibeigenen. Dazu gehören die maximale Zahl der Leibeigenen, ob Ressourcen abgebaut werden sollen oder zerstörte Gebäude wiederaufgebaut.
Wichtig: Beide haben gemeinsam, dass der KI-Spieler mindestens 1 Gebäude besitzen muss, um sie aufrufen zu können. Andernfalls wird das Spiel abstürzen!
Wichtig: SetupPlayerAi
sollte immer nach MapEditor_SetupAI
aufgerufen werden, da letztere Funktion die erste erneut aufruft und somit alle darin definierten KI-Eigenschaften überschreibt. Wir behandeln daher im Folgenden die beiden Funktionen in der korrekten Reihenfolge.
MapEditor_SetupAI
MapEditor_SetupAI(_PlayerId, _Strength, _Range, _Techlevel, _Position, _AggressiveLevel, _PeaceTime)
hat folgende Parameter:
- _PlayerId - Die Spieler-Id des KI-Gegners, also eine ganze Zahl zwischen 2 und 8. Der Spieler muss mindestens 1 Gebäude besitzen, sonst stürzt das Spiel ab
- _Strength - Die Stärke des KI-Gegners als ganze Zahl zwischen 0 und 3, wobei 0 einer deaktivierten KI entspricht, 1 die schwächste und 3 die stärkste aktive Stärke ist. Die Stärke drückt sich durch die Anzahl der Truppen aus, die die KI gleichzeitig kontrolliert. Konkret steuert die KI 2x
_Strength
Armeen, wobei jede Armee 8 Hauptmänner umfasst. Ein Stärkewert von 2 bedeutet also, dass die KI2*_Strength*8 = 32
Hauptmänner steuert - _Range - Die Range gibt den Radius in Siedlerzentimetern an, innerhalb dessen die KI ihre Truppen bewegt. Das Zentrum dieses Kreises wird mit dem Parameter
_Position
gegeben. Um den Radius auf einer Karte genau sehen zu können, ist es hilfreich einXS_Ambient
-Entity auf die Karte zu setzen und den Radius in Siedlermetern einzustellen (siehe auch Objekte platzieren). Dieser Wert x100 entspricht dann dem Wert, der hier als Parameter übergeben werden muss - _Techlevel - Der Techlevel ist eine ganze Zahl zwischen 0 und 3 und drückt die Technologiestufe aus, auf der die KI ihre Truppen ausbildet. Techlevel 0 sorgt beispielsweise für Kurzschwertkämpfer und Techlevel 3 für Bastardschwertkämpfer
- _Position - Der Name der Entity als String, von deren Position aus sich die Truppen der KI um maximal
_Range
Siedlerzentimeter entfernen. Gleichzeitig ist das der Ort, an dem die KI ihre Truppen sammelt. Da das Haupthaus besonders schützenswert ist, ist dafür normalerweise der Skriptname der Burg die beste Wahl - _AggressiveLevel - Die Aggressivität der KI ist eine ganze Zahl zwischen 0 und 3 und bestimmt, wie viele der Armeen, die ihr zur Verfügung stehen, angreifen können. Sie ist daher vom Stärkewert nach oben beschränkt; es können nicht mehr Armeen angreifen, als zur Verfügung stehen. Konkret werden 2x
_AggressiveLevel
Armeen angreifen und der Rest nur verteidigen - _PeaceTime Die Länge des Waffenstillstands in Sekunden, gemessen vom Spielstart
Achtung: Beim Aufruf von MapEditor_SetupAI
wird der Spieler _PlayerId
automatisch dem menschlischen Spieler 1 zum Feind gemacht. Wenn du mit der Funktion einen Verbündeten definieren willst, musst du nach dem Aufruf von MapEditor_SetupAI
zusätzlich SetFriendly
verwenden.
Achte darauf, dass alle Parameter, die du an MapEditor_SetupAI
übergibst, gültige Werte besitzen. Falls das nicht der Fall ist, wird die KI nichts tun. Wenn deine KI beim Test untätig ist, prüfe zuerst die Gültigkeit deiner Parameter.
Hinweis: Eine KI, deren Armeeverhalten mit MapEditor_SetupAI
definiert wurde, kann nur die Truppen rekrutieren, für die sie die entsprechenden Militärgebäude besitzt. Ohne einen Schießplatz wird sie also keine Schützen rekrutieren können.
Gleichzeitig kann die KI nur aus maximal einem Rekrutierungsgebäude der gleichen Gattung rekrutieren. Sie hat also keinen Vorteil davon, beispielsweise mehrere Kasernen zu besitzen.
Mehrfacher Aufruf
Die Funktion MapEditor_SetupAI
kann später erneut aufgerufen werden, um einen KI-Gegner nachträglich zu verändern. Wenn du beispielsweise mehrere Gegner definierst, kannst du, sobald einer der KI-Spieler besiegt wurde, alle anderen etwas verstärken, also beispielsweise deren Aggressivität erhöhen oder deren Radius erweitern.
Dabei gilt es für den Techlevel zu beachten, dass er sich additiv verhält! Der Aufruf von
MapEditor_SetupAI(2, 1, 50000, 1, "Player2", 1, 0)
zu Beginn und später
MapEditor_SetupAI(2, 1, 50000, 1, "Player2", 1, 0)
sorgt dafür, dass der KI-Spieler in Summe Techlevel 2 hat, also beispielsweise Langschwertkämpfer rekrutiert!
SetupPlayerAi
Mit SetupPlayerAi(_PlayerId, _Description)
wird hauptsächlich das Verhalten der Leibeigenen für den KI-Spieler definiert. Auch wird damit festgelegt, wie viele Ressourcen der KI zur Verfügung stehen. Die Funktion hat folgende Parameter:
- _PlayerId - Die Spieler-Id des KI-Gegners, also eine ganze Zahl zwischen 2 und 8. Der Spieler muss mindestens 1 Gebäude besitzen, sonst stürzt das Spiel ab
- _Description - Ein assoziatives Table mit folgenden Parametern:
- resources - Ein weiteres assoziatives Table, in dem die Startressourcen der KI festgelegt werden (siehe Beispiel unten)
- refresh - Gleich aufgebaut wie resources und gibt den Intervall und die Menge der Ressourcen an, die die KI regelmäßig bekommen soll
- serfLimit - Eine ganze Zahl, die die maximale Anzahl an Leibeigenen angibt, die die KI kaufen kann. Falls die KI zu Beginn des Spiels mehr Leibeigene als das gegebene Limit besitzt, kauft sie erst neue nach, sobald ihre Anzahl unter das Limit fällt (vorausgesetzt, sie besitzt eine Burg)
- extracting - Entweder 0 oder 1, wobei 1 bedeutet, dass die Leibeigenen der KI automatisch Ressourcen abbauen und Bäume fällen
- resourceFocus
- repairing - Boolean, der angibt, ob die KI Gebäude reparieren soll
- rebuild - Ein assoziatives Table, in dem definiert ist, nach wie viel Zeit zerstörte Gebäude wieder aufgebaut werden. Wenn dieses Feld nicht angegeben wird, werden keine Gebäude wieder aufgebaut (siehe Beispiel unten)
- constructing - Boolean, der angibt, ob die KI Gebäude errichten darf. Typ und Position aller zu bauenden Gebäude muss ebenfalls abgegeben werden, siehe dazu das zugehörige Kapitel in Ebene 3 ( link einfügen)
Wie MapEditor_SetupAI
kann auch SetupPlayerAi
später erneut aufgerufen werden, um die KI-Einstellungen zu ändern.
Wichtig: Wenn du MapEditor_SetupAI
ein weiteres Mal aufrufst, so muss das auch für SetupPlayerAi
geschehen! Weil die erstere Funktion die Einstellungen der zweiten überschreibt, gilt das auch, wenn keine Änderungen der zivilen Einstellungen vorgesehen sind.
KI für die Beispielkarte
Für unsere Beispielkarte wollen wir einen passenden KI-Gegner definieren. Dazu schreiben wir eine Funktion CreatePlayer2
, die wir in der Funktion FirstMapAction
aufrufen. Im Code unten ist die gesamte Funktion notiert, zusammen mit ausführlichen Kommentaren, in denen wir die Entscheidung zu den jeweiligen Parametern begründen.
function CreatePlayer2() --- Wir beginnen mit MapEditor_SetupAI --- Die Spieler-Id ist 2, da die Gebäude, die wir auf der Karte platziert haben, Spieler 2 gehören --- Für die Stärke wählen wir einen Wert von 2. Das hat den Grund, dass wir zum einen dem Spieler -- den Ausbau zu Kanonentürmen verboten haben und zum anderen nur 3 Siedlungsplätze zur -- Verfügung stellen. Rechnerisch wir die KI bei Stärke 2 32 Hauptmänner auf einmal befehligen. -- Der Spieler soll die Kapazitäten haben, sich dagegen zu verteidigen und auch angreifen zu können --- Da der Gegner von Wasser vom Spieler abgetrennt ist und der Spieler allein entscheidet, wann -- es zu einem Kampf kommt, kann der Radius der Größe der Karte entsprechen. Die Karte hat die -- Größe 320, also tragen wir als Radius 32000 ein --- Beim Techlevel tragen wir 3 ein, da der Spieler beliebig viel Zeit hat, sich vorzubereiten. Da -- ein Angriff die Wettertechnologien voraussetzt, muss er außerdem zwangsläufig schon weit im -- Forschungsbaum fortgeschritten sein. Der KI-Gegner soll dann immer noch eine Herausforderung sein --- Die Position ist die von uns gesetzte und benannte Burg des Gegners "Player2" --- Bei der Aggressivität wählen wir ebenfalls 2, sodass die KI mit allen ihren Truppen angreifen kann --- Eine Friedenszeit brauchen wir nicht einzustellen, da der Spieler selbst entscheidet, wann der -- Kampf beginnt, also lassen wir diesen Parameter auf 0 --- Insgesamt haben wir also: MapEditor_SetupAI(2, 2, 32000, 3, "Player2", 2, 0) --- Wir erstellen nun ein Table, das die Einstellungen für SetupPlayerAi enthält local AiDescription = { resources = { } }