scripting:tutorials:level2:bandit_camps
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige ÜberarbeitungVorherige ÜberarbeitungNächste Überarbeitung | Vorherige Überarbeitung | ||
scripting:tutorials:level2:bandit_camps [2023/11/26 09:50] – fritz_98 | scripting:tutorials:level2:bandit_camps [2024/05/20 13:03] (aktuell) – fritz_98 | ||
---|---|---|---|
Zeile 28: | Zeile 28: | ||
^ Key ^ Value-Typ ^ Bedeutung ^ | ^ Key ^ Value-Typ ^ Bedeutung ^ | ||
| **player** | Player Id | Spieler-Id des Spielers, dem die Armee gehören soll | | | **player** | Player Id | Spieler-Id des Spielers, dem die Armee gehören soll | | ||
- | | **id** | Ganze Zahl (0 - 9) | Id der Armee. Es sollte | + | | **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 '' | | **position** | Position (Table der Form '' | ||
| **rodeLength** | Number | Radius um '' | | **rodeLength** | Number | Radius um '' | ||
Zeile 143: | Zeile 143: | ||
=====Das Kampfverhalten===== | =====Das Kampfverhalten===== | ||
- | [[ s5lua_g:g_funktionen:tickoffensiveaicontroller | + | Damit die Armee eben dieses Kampfverhalten ausführen kann, erweitern wird erneut das Armee-Table mit weiteren Parametern, die unser gewünschtes Kampfverhalten beschreiben. Nach dem Armee- und Spawner-Setup starten wir einen [[ scripting:tutorials:level1: |
+ | Für das Armeeverhalten verwenden wir die Funktion '' | ||
+ | Das Armee-Table wird um folgende Key-Value-Paare erweitert: | ||
+ | ^Key^Value-Typ^Bedeutung^ | ||
+ | |**outerDefenseRange**|Zahl|Der Radius des äußeren Verteidigungsrings. Wenn die Armee maximale Stärke hat, verteidigt sie die angegebene Position '' | ||
+ | |**baseDefenseRange**|Zahl|Der Radius des inneren Verteidigungsrings. Die Armee verteidigt sich in diesem Umkreis an der Position '' | ||
+ | |**retreatStrength**|Integer < '' | ||
+ | |**AttackPos**|Table|Liste an Postionen, aus denen zufällig eine als Angriffsziel für die Armee gewählt wird| | ||
+ | |**AttackAllowed**|Boolean|Gibt an, ob die Armee angreifen darf. Falls **true**, wird sie bei voller Stärke eine der Positionen in '' | ||
+ | |**pulse**|Boolean|Wenn **true**, darf die KI kurzzeitig ihren Verteidiungsring verlassen, falls sie volle Stärke hat. Dadurch kann sie schwieriger von außerhalb des Rings beschossen werden| | ||
+ | Für unser Beispiel machen wir folgende Angaben (unter der Voraussetzung, | ||
+ | |||
+ | <code lua> | ||
+ | function CreateArmyBandits() | ||
+ | ArmyBandits = { | ||
+ | player = 2, | ||
+ | id = 0, | ||
+ | position = GetPosition(" | ||
+ | rodeLength = 4000, | ||
+ | beAgressive = true, | ||
+ | |||
+ | strength = 8, | ||
+ | spawnTypes = { | ||
+ | {Entities.CU_BanditLeaderSword1, | ||
+ | {Entities.CU_BanditLeaderBow1, | ||
+ | {Entities.CU_BanditLeaderSword1, | ||
+ | {Entities.PU_LeaderPoleArm1, | ||
+ | }, | ||
+ | endless = true, | ||
+ | spawnPos = GetPosition(" | ||
+ | spawnGenerator = " | ||
+ | maxSpawnAmount = 2, | ||
+ | respawnTime = 90, | ||
+ | noEnemy = true, | ||
+ | noEnemyDistance = 2000, | ||
+ | | ||
+ | -- die baseDefenseRange entspricht der Konsistenz zuliebe genau der rodeLength, | ||
+ | -- die wir weiter oben angegeben haben | ||
+ | baseDefenseRange = 4000, | ||
+ | | ||
+ | -- wenn die Armee volle Stärke hat, soll sie einen Umkreis von 6000 scm verteidigen... | ||
+ | outerDefenseRange = 6000, | ||
+ | | ||
+ | -- ...und sich wieder zurückziehen, | ||
+ | retreatStrength = 3, | ||
+ | | ||
+ | -- Angriffe sind erlaubt | ||
+ | AttackAllowed = true, | ||
+ | | ||
+ | -- Die Armee soll entweder das Hauptquartier vom Spieler oder die Position eines (neutralen) | ||
+ | -- Dorfzentrums angreifen | ||
+ | AttackPos = { | ||
+ | GetPosition(" | ||
+ | GetPosition(" | ||
+ | }, | ||
+ | | ||
+ | -- Die Truppen sollen außerdem für kurze Zeit außerhalb ihres Radius kämpfen dürfen | ||
+ | pulse = true | ||
+ | } | ||
+ | |||
+ | SetupArmy(ArmyBandits) | ||
+ | SetupAITroopSpawnGenerator(" | ||
+ | -- Den Armee-Kontrolljob findest du im Codebeispiel weiter unten | ||
+ | StartSimpleJob(" | ||
+ | end | ||
+ | </ | ||
+ | |||
+ | Der Kontrolljob '' | ||
+ | |||
+ | <code lua> | ||
+ | function ControlArmyBandits() | ||
+ | -- Die Kontrollfunktion soll nur alle 10 Sekunden aufgerufen werden | ||
+ | -- Dazu verwenden wir den Counter, der im letzten Kapitel vorgestellt wurde | ||
+ | -- Es ist zwar möglich, die Kontrollfunktion jede Sekunde aufzurufen - das | ||
+ | -- ist allerdings verschwendete Performance und lässt die Armee erratisch wirken, | ||
+ | -- da sie u.U. jede Sekunde neue Befehle erhält | ||
+ | if Counter.Tick2(" | ||
+ | |||
+ | -- Die Funktion IsAITroopGeneratorDead prüft, ob sowohl alle Truppen der Armee | ||
+ | -- als auch ihr Spawngebäude zerstört wurde | ||
+ | if IsAITroopGeneratorDead(ArmyBandits) then | ||
+ | -- Falls ja, beende den Kontrolljob | ||
+ | return true | ||
+ | else | ||
+ | -- Andernfalls führe das im Armee-Table definierte Verhalten aus | ||
+ | TickOffensiveAIController(ArmyBandits) | ||
+ | end | ||
+ | |||
+ | end | ||
+ | |||
+ | end | ||
+ | </ | ||
+ | |||
+ | ---- | ||
+ | |||
+ | Die " | ||
+ | |||
+ | [[ scripting: | ||
+ | [[ scripting: | ||
+ | [[ scripting: |
scripting/tutorials/level2/bandit_camps.1700992221.txt.gz · Zuletzt geändert: 2023/11/26 09:50 von fritz_98