In diesem Tutorial wird erklärt, wie man den KI-Spieler „aktiviert“ und dazu bringt, viele Aktionen selbstständig auszuführen.
Der Vorteil hierbei ist, daß man den KI-Spieler quasi nur „hinstellen“ braucht. Dies bringt aber auch einen Nachteil mit sich: Abgesehen von der Grundkonfiguration hat man wenig Kontrolle über dessen Verhalten während des Spiels.
Damit ein KI-Spieler überhaupt etwas „von alleine“ tut, muss er „aktiviert“, bzw. „initialisiert“ werden. Wie dies geschieht und welche Parameter man dabei angeben kann/ muss wird im folgenden erläutert.
MapEditor_SetupAI()
Wenn man eine neue Karte erstellt, wird einem eine Wizard Seite präsentiert, auf der man die Eigenschaften der KI Spieler festlegen kann. Man muss die gewünschten Werte nicht in dem Wizard eingeben, sondern kann sie später in aller Ruhe im Script festlegen. Wenn man also im Wizard nichts eingibt, sieht der erzeugte Scriptteil (steht in der FirstMapAction-Funktion) dann so aus:
-- Level 0 is deactivated...ignore
MapEditor_SetupAI(2, 0, 0, 0, "", 0, 0)
MapEditor_SetupAI(3, 0, 0, 0, "", 0, 0)
MapEditor_SetupAI(4, 0, 0, 0, "", 0, 0)
MapEditor_SetupAI(5, 0, 0, 0, "", 0, 0)
MapEditor_SetupAI(6, 0, 0, 0, "", 0, 0)
MapEditor_SetupAI(7, 0, 0, 0, "", 0, 0)
MapEditor_SetupAI(8, 0, 0, 0, "", 0, 0)
Welcher Wert steht nun wofür?
KI SpielerId
Die erste Zahl gibt also die jeweilige KI SpielerId an (es sind ja schon alle möglichen KI Spieler Ids, nämlich von 2-8, vorhanden)
Strength (Spielstärke)
Dieser Wert kann zwischen 0 - 3 liegen und gibt die quasi die Spielstärke der KI an, wobei sich das letztlich nur auf die maximale Anzahl an Truppen (siehe unten: Reservierte Ids für Armeen) bezieht, die die KI rekrutiert. Bei dem Wert 0 werden von der KI keine Truppen rekrutiert (darauf bezieht sich auch der Kommentar im Script „– Level 0 is deactivated…ignore“). Nur wenn dieser Wert größer als 0 ist, rekrutiert (sofern entsprechende Gebäude, egal in welcher Ausbaustufe, vorhanden sind) und steuert die KI selbständig Truppen!
Range (Aktionsradius)
Dieser Wert bestimmt den Radius um den Punkt, der unter Position angegeben wird. Das Gebiet innerhalb dieses Kreises wird von den Truppen der KI als „ihr“ Territorium angesehen und wird somit verteidigt, selbst wenn der Wert für die Aggressivität auf 0 (nur Selbstverteidigung) steht. Das Eindringen feindlicher Truppen in diesen Kreis wird als Angriff gewertet. Auch feindliche Gebäude innerhalb dieses Kreises werden angegriffen.
Techlevel (Technologiestufe)
Dieser Wert zwischen 0 - 3 gibt an, welche Upgradestufe an Tuppen von der KI rekrutiert wird, wobei bei 0 Soldaten des niedrigsten Levels (also bspw. Swordman1), und bei 3 Soldaten des höchsten Levels (also bspw. Swordman4) rekrutiert werden (entsprechende Gebäude vorausgesetzt). Ebenso bestimmt der Wert, welche Kanonen von der KI produziert werden. Leider ist den Entwicklern hierbei ein (Denk-)Fehler unterlaufen
, denn es wird der Wert selber an den Entitynamen angehängt. Das führt dazu, dass bei Level 0 keine Kanonen produziert werden, da es keine Entity PV_Cannon0 gibt. Genauso wird eine KI nie eine PV_Cannon4 produzieren, da der Wert ja nur maximal 3 sein kann. Vielleicht wird das ja mal mit einem zukünftigen Patch (aktuell Vers. 1.06) behoben indem man einfach Techlevelwert + 1 für die Kanonenproduktion verwendet
Position (Mittelpunkt des Aktionsradius)
Dies muss ein Scriptname einer Entity (egal welche) auf der Map sein. Wenn die KI aktiviert ist (Spielstärke > 0) werden die Truppen an diesem Punkt versammelt (wenn sie nicht anderweitig „beschäftigt“ sind
). Dieser Punkt sollte daher eine strategisch wichtige Stelle sein, z.B. das Hauptquartier (Skriptname), oder ziemlich genau in der Mitte des „KI-Landes“ liegen.
Aggressiveness (Aggressivität)
Dieser Wert zwischen 0 - 3 gibt die Aggressivität einer (aktivierten) KI an, wobei sie sich bei 0 nur selbst verteidigt, bis hin zu massiven Angriffen bei einem Wert von 3.
Peacetime (Friedens-, bzw. Nicht Angriffszeit)
Hier kann man in Sekunden die Zeit festlegen, in der von der KI rekrutierte Truppen (gilt nicht für per Script generierte Truppen) nicht angreifen. Die Zeit zählt vom Spielanfang und nicht vom Zeitpunkt der Rekrutierung der jeweiligen Truppen.
Man kann also jetzt in aller Ruhe die gewünschten Werte im Script eintragen. Wird ein KI-Spieler nicht benötigt, läßt man einfach die entsprechende Zeile im Scriptcode unverändert!
SetupPlayerAi()
Wenn man nun einen KI-Spieler durch z.B.
MapEditor_SetupAI(4, 1, 50000, 2, "HQ_Player4", 0, 600)
initialisiert hat, dann hat man damit quasi alle „militärischen“ Einstellungen vorgenommen.
Allerdings gibt es auch noch eine Reihe anderer („ziviler“) Einstellungen für einen KI-Spieler, die man mit der Funktion MapEditor_SetupAI() nicht vornehmen kann (bzw. die in Abhängigkeit von den Werten automatisch gesetzt werden).
Als da wären:
-
Extracting (Resourcenabbau) [0|1]
Repairing (Reparatur von Gebäuden) [true|false]
SerfLimit (Maximale Anzahl an Leibeigenen) [Zahl]
Da die Funktion MapEditor_SetupAI() intern die Funktion SetupPlayerAi() nutzt, muss ein Aufruf von SetupPlayerAi() also immer nach dem Aufruf von MapEditor_SetupAI() erfolgen.
Wenn man also unabhängig von den bei MapEditor_SetupAI() festgelegten Werten die o.g. Parameter selber bestimmen möchte, muss man diese an die Funktion SetupPlayerAi() übergeben.
Dies muss in Form eines Tables geschehen, da die Funktion SetupPlayerAi() nur zwei Paramter erwartet.
SetupPlayerAi( _playerId,_description )
Der erste Parameter ist die KI PlayerId und der zweite Parameter das o.g. Table.
Beispiel (für Spieler 4):
SetupPlayerAi( 4, {constructing = false, extracting = 1, repairing = true, serfLimit = 10} )
Die Reihenfolge der Parameter innerhalb des Tables spielt dabei keine Rolle. Man braucht auch nur die Parameter in dem Table angeben, deren Wert man explizit setzen möchte.
SetupPlayerAi( 4, { extracting = 1 } )
Die nicht angegebenen Parameter werden dann entsprechend den vordefinierten Werten „automatisch“ gesetzt.
Wenn man also direkt zu Beginn die jeweiligen KI-Spieler initialisieren (erstellen) will, sehen die jeweiligen Funktionsaufrufe bspw. so aus:
-- Level 0 is deactivated...ignore
-- will man die Werte für constructing, repairing, und das serfLimit selbst bestimmen, dann muss man nach MapEditor_SetupAI() auch noch SetupPlayerAi() aufrufen!
MapEditor_SetupAI( 2, 3, 11000, 3, "playerTwo", 3, 0);
SetupPlayerAi( 2, { serfLimit = 20, extracting = 1, constructing = true, repairing = true } )
MapEditor_SetupAI(3, 1, 8000, 2, "Zentrum_Player3", 0, 600)
SetupPlayerAi( 3, {constructing = false, repairing = true, serfLimit = 15} )
-- will man die Werte für constructing, repairing, und das serfLimit nicht selbst bestimmen, dann reicht der Aufruf von MapEditor_SetupAI():
MapEditor_SetupAI(4, 2, 5000, 1, "Zentrum_Player4", 1, 0)
MapEditor_SetupAI(5, 2, 9000, 0, "Zentrum_Player5", 2, 0)
MapEditor_SetupAI(6, 1, 6000, 3, "Zentrum_Player6", 3, 0)
MapEditor_SetupAI(7, 3, 3500, 2, "Zentrum_Player7", 0, 0)
-- KI-Spieler 8 wird "militärisch" nicht aktiviert
MapEditor_SetupAI(8, 0, 0, 0, "", 0, 0)
Hinweise
Nun noch einige Hinweise:
Ohne ein Gebäude (egal welches) funktioniert der KI Gegner nicht. Alle Armeen werden sofort für tot erklärt oder das Spiel stürzt sogar ab! Also jedem Spieler mindestens ein Gebäude (richtige SpielerId!) hinstellen!
Sofern der KI-Spieler (militärische) Einheiten rekrutieren soll, braucht dieser die entsprechenden Gebäude. Diese müssen nicht ausgebaut sein/ werden, da sich der Upgradelevel der Truppen nach dem Techlevelwert richtet.
Damit ein KI-Spieler „zivile“ Siedler für die Werkstätten und Minen bekommen kann, braucht er dafür ein Dorfzentrum. Auch hier reicht eins in der nicht ausgebauten (upgegradeten) Variante, da ein KI-Spieler keinem Siedlerlimit wie der menschliche Spieler unterliegt.
Wenn Resourcen abgebaut, oder Gebäude repariert werden sollen, wäre es recht praktisch, wenn der KI Gegner dazu ein paar Leibeigene hingestellt bekäme.
Wenn der KI-Spieler selber Leibeigene „kaufen“ soll, braucht er dafür (und nur dann) zwingend ein Haupthaus (PB_Headquarter). Man kann ihm die Leibeigenen aber auch per Script (Stichwort „SerfSpawnGenerator“) nachliefern, oder er muss mit denen am Anfang vorhandenen auskommen (Bedenke: Eine KI ohne Serfs macht meistens nicht viel Sinn!).
Zerstörte Gebäude werden (je nach Strength-Wert) automatisch wieder aufgebaut, allerdings werden dazu Leibeigene benötigt.
Durch den Abbau von Ressourcen hat der KI Gegner natürlich mehr für seine Produktion zur Verfügung. Allerdings kann dieser auch komplett ohne den Abbau überleben, da er gelegentlich (je nach Spielstärke) „per Luftpost“ Resourcennachschub erhält.
Der Abbau von Ressourcen kann auch während des Spiels wieder deaktiviert werden. Dazu ruft man die entsprechende Zeile einfach mit einer 0 auf:
SetupPlayerAi( _playerId, { extracting = 0 } );
Selbiges gilt für die automatische Reparatur von Gebäuden. Beides kann beliebig an- und abgeschaltet werden.
Achtung! Wenn man dem KI-Spieler einen Construction-Plan übergibt (siehe
Computergegner - Bau von Gebäuden), muss auch constructing=true sein. Ansonsten entsteht nur die erste Baustelle, aber kein Serf eilt hin, um zu bauen.
Der KI Gegner ist Spieler 1 gegenüber immer feindlich gesinnt. Dies kann man verhindern, in dem man nachträglich, also nach dem SetupAI Aufruf, SetNeutral( 1, KI-SpielerId ) aufruft.
Wenn der KI Spieler mit einem Namen im Diplomatiemenü auftauchen soll, kann man diesen hier festlegen
SetPlayerName( _playerId, "Starker Gegner" )
Alle einer KI-Armee mit entsprechender ID zugeordneten Einzeleinheiten, also einzelne Truppen oder Hauptmänner, werden von der KI kontrolliert. Es wird versucht, diese zu dem unter Position angegebenen Punkt zu bewegen. Wenn es keinen Weg für die Einheiten zu dem Punkt gibt, kann das Spiel anfangen stark zu ruckeln.
Wichtig: Je nach Strength-Wert werden für die KI unterschiedlich viele Slots für Armeen reserviert. Armeen mit einer der entsprechenden IDs werden von der KI kontrolliert, egal ob sie per Script erstellt wurden (was man eh nicht machen sollte), oder die KI sie selbst rekrutiert hat.
Zur Vermeidung von Problemen sollten diese IDs für die Erstellung von Armeen per Script nicht verwendet werden.
Stärke | Reservierte IDs |
0 | keine |
1 | 1 bis 2 |
2 | 1 bis 4 |
3 | 1 bis 6 |
Die KI erteilt Armeen mit einer anderen ID keine Befehle! Diese können ausschließlich per Skriptbefehlen kontrolliert werden.
Beispiel:
MapEditor_SetupAI( 2, 3, 11000, 3, "playerTwo", 3, 0)
SetupPlayerAi( 2, { serfLimit = 20, extracting = 1, constructing = true, repairing = true } )
Da in diesem Fall playerTwo strength = 3 ist, würde für den playerTwo nur noch die ID 0, 7, 8, 9 für zusätzliche Armee zur verfügung stehen
In C fängt alles bei 0 an, wie beispielsweise auch die Armee IDs, in Lua hingegen gehts erst bei 1 los.
Daher ist die 0 eben noch frei, da erst ab 1 reserviert wird.
Wer das alles soweit verstanden hat, und noch etwas mehr Einfluß auf die KI nehmen will, für den gibt es noch das Kapitel Computergegner für Fortgeschrittene.
Zur Tutorial-Übersicht