Benutzer-Werkzeuge

Webseiten-Werkzeuge


scripting:tutorials:level1:enemy_ai

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige ÜberarbeitungVorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
scripting:tutorials:level1:enemy_ai [2023/08/03 12:24] fritz_98scripting:tutorials:level1:enemy_ai [2024/05/16 14:13] (aktuell) fritz_98
Zeile 1: Zeile 1:
 =====Einen Computergegner platzieren===== =====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 (FIXME link) ausführlich erklärt.+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 [[ scripting:tutorials#massgeschneiderte_ki |Ebene 3]] 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 [[ scripting:tutorials:level1:place_entities#umsetzung_der_beispielkarteobjekte |Objekte platzieren]]). 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 [[ scripting:tutorials:level1:place_entities#umsetzung_der_beispielkarteobjekte |Objekte platzieren]]).
Zeile 9: Zeile 9:
 In der folgenden Tabelle wollen wir eine kleine Übersicht darüber geben, was die im Folgenden vorgestellten Funktionen beinhalten und was nicht. In der folgenden Tabelle wollen wir eine kleine Übersicht darüber geben, was die im Folgenden vorgestellten Funktionen beinhalten und was nicht.
  
-FIXME 
 ^ Einfaches KI-Verhalten - Was es kann ^ Einfaches KI-Verhalten - Was es nicht kann ^ ^ 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 | | Wenn Rekrutierungsgebäude gegeben sind: Truppen rekrutieren | Selbstständig eine Stadt aufbauen |
 | Rekrutierte Truppen zu Armeen zusammenführen | Eine bestimmte Schlüsselposition verteidigen | | Rekrutierte Truppen zu Armeen zusammenführen | Eine bestimmte Schlüsselposition verteidigen |
-| Zerstörte Gebäude wieder errichten, beschädigte reparieren |  |+| Zerstörte Gebäude wieder errichten, beschädigte reparieren | Technologien erforschen |
 | Leibeigene kaufen | Steuern und Motivation verwalten | | Leibeigene kaufen | Steuern und Motivation verwalten |
 | Frontalangriffe bei ausreichender Armeestärke | Komplexes Armeeverhalten wie Angriffe auf Schwachpunkte, Patrouillen, etc. | | Frontalangriffe bei ausreichender Armeestärke | Komplexes Armeeverhalten wie Angriffe auf Schwachpunkte, Patrouillen, etc. |
-FIXME 
  
 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. 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.
Zeile 36: Zeile 34:
   - **_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   - **_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 KI ''2*_Strength*8 = 32'' Hauptmänner steuert   - **_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 KI ''2*_Strength*8 = 32'' Hauptmänner steuert
-  - **_Range** - Die Range gibt den Radius in Siedler**zentimetern** 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 ein ''XS_Ambient''-Entity auf die Karte zu setzen und den Radius in Siedler**metern** einzustellen (siehe auch [[ https://dedk.de/wiki/doku.php?id=scripting:tutorials:level1:place_entities |Objekte platzieren]]). Dieser Wert x100 entspricht dann dem Wert, der hier als Parameter übergeben werden muss+  - **_Range** - Die Range gibt den Radius in Siedler**zentimetern** 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 ein ''XS_Ambient''-Entity auf die Karte zu setzen und den Radius in Siedler**metern** einzustellen (siehe auch [[ scripting:tutorials:level1:place_entities |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   - **_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   - **_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+  - **_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 ''(_Strength*_AggressiveLevel)/2'' Armeen angreifen und der Rest nur verteidigen
   - **_PeaceTime** Die Länge des Waffenstillstands in Sekunden, gemessen vom Spielstart   - **_PeaceTime** Die Länge des Waffenstillstands in Sekunden, gemessen vom Spielstart
  
Zeile 70: Zeile 68:
  
   - **_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   - **_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 [[ https://dedk.de/wiki/doku.php?id=scripting:tutorials:level1:tables#tables_als_woerterbuecher |assoziatives Table]] mit folgenden Parametern: +  - **_Description** - Ein [[ scripting:tutorials:level1:tables#tables_als_woerterbuecher |assoziatives Table]] mit folgenden Parametern: 
-      * **resources** -  Ein weiteres assoziatives Table, in dem die Startressourcen der KI festgelegt werden (siehe Beispiel [[ scripting:tutorials:level1:enemy_ai&do=edit#ki_fuer_die_beispielkarte |unten]]) +      * **resources** -  Ein weiteres assoziatives Table, in dem die Start- bzw. Maximalressourcen der KI festgelegt werden (siehe Beispiel [[ scripting:tutorials:level1:enemy_ai#ki_fuer_die_beispielkarte |unten]]) 
-      * **refresh** - Gleich aufgebaut wie **resources** und gibt den Intervall und die Menge der Ressourcen an, die die KI regelmäßig bekommen soll+      * **refresh** - Gleich aufgebaut wie **resources** und gibt den Intervall in Sekunden und die Menge der Ressourcen an, die die KI regelmäßig bekommen soll (bis zum Maximum, das in ''resources'' angegeben ist)
       * **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)       * **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       * **extracting** - Entweder 0 oder 1, wobei 1 bedeutet, dass die Leibeigenen der KI automatisch Ressourcen abbauen und Bäume fällen
       * **resourceFocus** FIXME       * **resourceFocus** FIXME
       * **repairing** - Boolean, der angibt, ob die KI Gebäude reparieren soll       * **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 [[ scripting:tutorials:level1:enemy_ai&do=edit#ki_fuer_die_beispielkarte |unten]]) +      * **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 [[ scripting:tutorials:level1:enemy_ai#ki_fuer_die_beispielkarte |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 (FIXME link einfügen)+      * **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 [[ scripting:tutorials:level3:ai_construction |das zugehörige Kapitel in Ebene 3]]
  
 Wie ''MapEditor_SetupAI'' kann auch ''SetupPlayerAi'' später erneut aufgerufen werden, um die KI-Einstellungen zu ändern. 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.
 +
 +**Achtung**: Sowohl der Bau von (Wieder-) Aufbau von Gebäuden als auch das Abbauen von Ressourcen durch die KI hat einen Bug, bei dem das Spiel stark zu ruckeln beginnt, wenn sich eine Baustelle oder ein Ressourcenvorkommen außerhalb der Reichweite aller Leibeigenen befindet (zum Beispiel durch Fluss, Berg oder Mauer getrennt). Die beiden Optionen sollten also nur gesetzt werden, wenn man garantieren kann, dass sie für die gesamte Laufzeit der Karte ausgeführt werden können. \\
 +Der Bau von Gebäuden verursacht noch ein weiteres Problem: Wenn die KI eine Baustelle an eine unzugängliche Position setzt, wird außerdem die komplette Warteschleife für alle zu bauenden Gebäuden unterbrochen, da niemals zum nächsten zu bauenden Gebäude fortgeschritten werden kann.
  
 ---- ----
  
 ====KI für die Beispielkarte==== ====KI für die Beispielkarte====
 +
 +Für unsere [[ scripting:tutorials:drafting#einfaches_beispiel_fuer_einen_plan |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.
 +
 +<code lua>
 +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 der Hälfte ihrer 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 = {
 +        -- Wir machen folgende Verteilung: Ressourcen, die für den (Wieder-) Aufbau von Gebäuden gebraucht 
 +        -- werden, sollen ausreichend zur Verfügung stehen
 +        -- Ressourcen, die für die Rekrutierung der Armeen notwendig sind, sollen regelmäßig, aber nicht
 +        -- zu üppig an die KI gehen, damit sie zwar längere Gefechte austragen, aber auf lange Sicht nicht 
 +        -- beliebig viele Truppen ausheben kann
 +        resources = {
 +            gold = 4500,
 +            clay = 10000,
 +            iron = 3000,
 +            sulfur = 1500,
 +            stone = 15000,
 +            wood = 12000
 +        },
 +        -- Die KI erhält alle 2 Minuten 1500 Taler, 1000 Eisen und 700 Schwefel, solange diese Ressourcen
 +        -- unterhalb des angegebenen Maximums liegen
 +        refresh = {
 +            gold = 1500,
 +            clay = 0,
 +            iron = 1000,
 +            sulfur = 700,
 +            stone = 0,
 +            wood = 0,
 +            updateTime = 120
 +        },
 +        -- Beim Limit für Leibeigene entscheiden wir uns für 6, da die KI keine Ressourcen abzubauen braucht.
 +        -- Die Leibeigenen sollen also allein zerstörte Gebäude reparieren bzw. wieder aufbauen. Damit der
 +        -- Spieler in seinem Fortschritt nicht zu sehr gebremst wird, sollte diese Zahl nicht zu hoch sein,
 +        -- da er andernfalls viel Zeit damit verbringen wird, feindlichen Leibeigenen hinterher zu jagen 
 +        serfLimit = 6,
 +        -- Leibeigene sollen keine Ressourcen abbauen. Dadurch entgehen wir auch dem Bug, bei dem das Spiel
 +        -- stark zu ruckeln beginnt, wenn Leibeigene keinen Zugang zu Ressourcen mehr haben
 +        extracting = 0,
 +        -- Wenn Leibeigene keine Ressourcen abbauen, brauchen sie sich auch auf keinen Ressourcentyp zu 
 +        -- fokussieren
 +        resourceFocus = nil,
 +        -- Beschädigte Gebäude sollen repariert werden
 +        repairing = true,
 +        -- Zerstörte Gebäude sollen nach genau 90 Sekunden wieder aufgebaut werden, also ohne zufällige
 +        -- Zeitkomponente
 +        rebuild = {
 +            delay = 90,
 +            randomTime = 0
 +        },
 +        -- Damit der Wiederaufbau funktioniert, muss es der KI erlaubt sein, Gebäude zu errichten
 +        constructing = true
 +    }
 +    SetupPlayerAi(2, AiDescription)
 +end
 +</code>
 +
 +----
 +
 +Im nächsten Kapitel behandeln wir die Erstellung von Briefings, also Ingame-Texte für die Darstellung von Dialogen und Questzielen.
 +
 +[[ scripting:tutorials:level1:briefings | Nächstes Kapitel: Ein Briefing abspielen ]]\\
 +[[ scripting:tutorials:level1:enemy_ai | Zurück nach oben ]]
scripting/tutorials/level1/enemy_ai.1691065442.txt.gz · Zuletzt geändert: 2023/08/03 12:24 von fritz_98