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
