[[http://www.siedler-games.de|{{:sg-link.jpg|}}]] ===== TickOffensiveAIController ===== function TickOffensiveAIController( _extendedArmy ) Eine sehr schöne Funktion um Armeen zu kontrollieren. Sie vereint die bekannten Kontroll-Funktionen von Armeen zu einer sehr dynamischen Allround-Funktion. Vor allem in Verbindung mit dem AITroopSpawnGenerator ist das sehr praktisch. Um die Funktion nutzen zu können, muss das Army-Table um folgende Werte erweitert werden: ^Index^Beschreibung^ |//retreatStrength//|Wenn weniger als die hier angegebenen Hauptmänner in der Armee sind, zieht sie sich in die baseDefenseRange zurück.| |//baseDefenseRange//|Der Radius des inneren Verteidigungsrings. Die Armee zieht sich hierhin zurück, falls sie zu schwach ist| |//outerDefenseRange//|Wenn die Armee stark genug ist (gleich oder mehr Truppen als in stregth angegeben), wird sie offensiv innerhalb dieses Radius um ihre Position bewegen| |//AttackAllowed//|Wenn auf true gesetzt, wird die Armee langsam vorrücken und den Gegner attakieren. Dabei wird sie ihren vorgegebenen Aktionsradius auch verlassen| |//AttackPos//|Kann ein einziger Positionstable oder auch ein Table mit mehreren Positionstables sein. Die Armee wird dann einen dieser Punkte angreifen, sofern er erlaubt ist und sie stark genug ist| |//pulse//|Wenn true, wird die Armee hin und wieder ihre Formation verlassen und für ein paar Sekunden einen "FrontalAttack" starten. Was das für einen Sinn hat könnt ihr euch ja ausdenken;) Angeblich ist das praktisch gegen Kanonen.| ==== Beispiel ==== Die Funktion muss in dem Job nicht jede Sekunde aufgerufen werden, das wird die Armee auch nur sehr verwirren. In dem Beispiel wird bewusst auf den Aufruf SetupArmy() verzichtet, das ist in Verbindung mit dieser Funktion auch nicht nötig. RobberArmy = { -- Normale Armee Daten id = 1, player = 3, strength = 8, rodeLength = 8000, position = GetPosition("RobberTower"), -- Daten für den SpawnGenerator spawnTypes = { {Entities.CU_BanditLeaderSword2, 8}, {Entities.CU_BanditLeaderSword2, 8}, {Entities.CU_BanditLeaderBow1, 4}, {Entities.PV_Cannon3, 0}, {Entities.CU_BanditLeaderSword2, 8}, {Entities.CU_BanditLeaderSword2, 8}, {Entities.CU_BanditLeaderBow1, 4}, {Entities.CU_BanditLeaderSword2, 8}, {Entities.PV_Cannon3, 0}, }, spawnPos = GetPosition("RobberSpawn"), spawnGenerator = "RobberTower", endless = true, respawnTime = 45, refresh = true, maxSpawnAmount = 2, noEnemy = true, noEnemyDistance = 500, -- Daten für diese Control-Funktion retreatStrength = 2, -- Wenn nur noch 2 Hauptmänner existieren, dann urück zur Basis laufen... baseDefenseRange = 1000, -- ...und sich nur innerhalb dieses Radius bewegen und verteidigen outerDefenseRange = 10000, -- Wenn stark genug, dann bewegt sich die Armee offensiv in diesem Radius AttackAllowed = true, -- Die Armee darf auch angreifen... AttackPos = { -- Zufällig einen dieser drei Punkte angreifen GetPosition("Haupthaus"), GetPosition("Dorfzentrum"), GetPosition("Außenposten"), }, pulse = true, -- und dabei auch mal die Formation auflösen. } SetupAITroopSpawnGenerator("RobberArmy", RobberArmy) StartSimpleJob("ControlRobberArmy") function ControlRobberArmy() -- Nur alle 10 Sekunden Befehle erteilen, das reicht if Counter.Tick2("ControlRobberArmy", 10) then -- Wenn die Armee noch Soldaten hat, dann die Befehle erteilen if IsAlive(RobberArmy) then TickOffensiveAIController(RobberArmy) -- Ansonsten prüfen, ob überhaupt noch eine Armee entstehen kann. Wenn der Spawn Generator kaputt ist, brauchen wir den Job auch nicht mehr elseif IsAITroopGeneratorDead(RobberArmy) then return true end end end ====Siehe auch==== * [[Advance]]\\ * [[Defend]]\\ * [[FrontalAttack]]\\ * [[Redeploy]]\\ * [[Retreat]]\\ * [[Synchronize]]\\ * [[s5lua_g:counter|Counter Funktionen]]\\ * [[tutorials:armeen_erstellen|Armee erstellen]]\\ * [[s5lua_g:setupaitroopspawngenerator|AITroopSpawnGenerator]]\\ \\ [[:tutorials:index|Zur Tutorial-Übersicht]]