Inhaltsverzeichnis

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:

IndexBeschreibung
retreatStrengthWenn weniger als die hier angegebenen Hauptmänner in der Armee sind, zieht sie sich in die baseDefenseRange zurück.
baseDefenseRangeDer Radius des inneren Verteidigungsrings. Die Armee zieht sich hierhin zurück, falls sie zu schwach ist
outerDefenseRangeWenn die Armee stark genug ist (gleich oder mehr Truppen als in stregth angegeben), wird sie offensiv innerhalb dieses Radius um ihre Position bewegen
AttackAllowedWenn auf true gesetzt, wird die Armee langsam vorrücken und den Gegner attakieren. Dabei wird sie ihren vorgegebenen Aktionsradius auch verlassen
AttackPosKann 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
pulseWenn 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


Zur Tutorial-Übersicht