Wie funktioniert 'Logic.GetEntitiesInArea()'

» Siedler Map Source Forum » Siedler DEdK Script Forum » Wie funktioniert 'Logic.GetEntitiesInArea()'

Seiten: 1

Narnius
#1
08.09.2020 14:11
Beiträge: 34

Wie funktioniert 'Logic.GetEntitiesInArea()'

Hallihallo liebe Mitsiedler,

ich versuche gerade in meiner 3-Spieler Coop-Map einen Truppenspawner zu coden, der erst Truppen spawnt, und dann nach Ablauf eines Countdowns diese Truppen richtung Spieler 1 zum Angreifen schickt und sofort neue spawnt. Diese sollen dann wieder nach Ablauf eines Countdowns zu Spieler 3 gesendet werden, dann geht der Spaß mit Spieler 2 weiter und dann wieder mit Spieler 1 und täglich grüßt die Dämonenarmee. Außerdem sollen die Armeen nach den ersten paar Angriffen jeden zweiten Angriff um einen Trupp wachsen, damit sowohl die Verteidigung stärker, als auch die Angriff des Gegners heftiger werden und man sich nicht in aller Ruhe aufbauen kann. Leider stieß ich bei der Umsetzung zwei dieser Konzepte auf Probleme. Mit den Variablen

attackNumber

,

attackNumber2

und

attackNumber3

sollte die Anzahl der Angriffe gezählt werden, die folgende Zählschleife sollte dann beim enlargen der armys dafür sorgen, dass diese wie oben beschrieben stetig wachsen.

 if attackNumber >= 2 then
	for i = 0, attackNumber, 2 do
		EnlargeArmy(armyOne,troopDescription)
		if i + 1 == attackNumber then
			i = i - 1;
		end
	end
 end


Leider hatte dieser Code neben den erwünschten Auswirkungen - warum auch immer - zur Folge, dass die Truppen manchmal bei den Angriffen der anderen armys "mithalfen" und die durch diesen Code erzeugten zusätzlichen Truppen bei ihren eigenen Angriffen nicht mit den zwei Stammtrupps mitkamen. Daher habe ich diese Zählschleifen vorerst herauskommentiert.
Ein weiteres Problem ergab sich bei den Angriffen der dritten Armee auf Spieler 2. Meine Map basiert auf "die Schwarzen Berge"
und Spieler 2 startet dort, wo Mary sonst ihre Stadt hat. Spielerslot 2 ist für den weniger guten Siedler-Spieler reserviert, weil dieser durch einen Fluss vom Gegner abgeschnitten ist und eine Zugbrücke zur Verfügung hat, die er öffnen und schliessen kann. Die Idee ist nun, dass die Dritte Armee - Die Spieler zwei Angreift - in sein Dorf redeployt wird, wenn dieser entweder die Zugbrücke geschlossen hat, oder die andere Brücke gebaut hat, welche sein Dorf mit dem restlichen Gebiet verbindet. Hierbei wusste ich nicht recht, wie ich das Erbauen der großen Brücke oder die eventuelle Sprengung derselben ermitteln sollte. Kann mir jemand diesbezüglich helfen, oder erklären, wie ich Logic.GetEntitiesInArea() verwenden kann, was der Rückgabetyp dieser function ist und wie ich auf das erste Objekt in der zurückgegebenen Liste zugreifen kann?
Anbei ist mein gesamter Code und schon mal vielen dank im voraus! ;D

Narnius
#2
08.09.2020 14:12
Beiträge: 34

Mein Code

-- MapName: Der Fluch der Schwarzen Berge 
-- MapOriginalAuthor: Christian & Matthias
-- Author: Narnius
-- Coop Referencescript für zwei Spieler, Diese spielen gegen eine bestimmte Anzahl an KI Spieler
-- Man muß im Editor beim Kartenscriptassistenten nur die zwei menschlichen Spieler festlegen, damit auch nur diese zwei Plätze später in der Lobby angezeigt werden.
-- Beim Start in der MP Lobby oder im Lan kann man beide Spieler in unterschiedlichen Teams stehen lassen , nach dem Start werden sie im Game verbündet sein .
-- Bei dieser Map sind auch die MP Bugtools von chromix eingebaut Enable Alarmlimit und  enable overtimelimit
--------------------------------------------------------------------------------
-- Hiermit wird die Lobbyfunktion umgangen, so dass die beiden menschlichen Spieler nach dem Start verbündet sind und auch das Gebiet des anderen sehen
if XNetwork then
    XNetwork.GameInformation_GetLogicPlayerTeam = function() return 1; end
    XNetwork.GameInformation_GetFreeAlliancesFlag = function() return 1; end
end

attackNumber = 0;
attackNumber2 = 0;
attackNumber3 = 0;

function GameCallback_OnGameStart()     
 
    -- Include global tool script functions 
    Script.Load(Folders.MapTools.."Ai\\Support.lua")
    Script.Load( Folders.MapTools.."Main.lua" )
    -- Unbedingt muß für die Einbindung der Ki hier auch dieses am Anfang geladen werden
    IncludeGlobals("MapEditorTools")
    Script.Load( "Data\\Script\\MapTools\\Counter.lua" )
    Script.Load( "Data\\Script\\MapTools\\MultiPlayer\\MultiplayerTools.lua" )  
    Script.Load( "Data\\Script\\MapTools\\Tools.lua" )  
    Script.Load( "Data\\Script\\MapTools\\WeatherSets.lua" )
    IncludeGlobals("Comfort")
    -- notwendig damit die Siegbedingungen greifen 
    gvMission = {}
    gvMission.PlayerID = GUI.GetPlayerID()
 
    
    --Init local map stuff
    Mission_InitWeatherGfxSets()
    InitWeather()
    Mission_InitGroups()    
    Mission_InitLocalResources()

    isGreatBridgeAlive = 0;
    isDrawBridgeOpen = 0;
    
    -- Init  global MP stuff
    --MultiplayerTools.InitResources("normal")
    MultiplayerTools.InitCameraPositionsForPlayers()    
    MultiplayerTools.SetUpGameLogicOnMPGameConfig()
    MultiplayerTools.GiveBuyableHerosToHumanPlayer( 1 ) -- 1 Held pro Spieler
    StartSimpleJob("VictoryJob");
    StartSimpleJob("P5HQProtectionJob");
	StartSimpleJob("BridgeCheckJob");
    NewTribute1();
    NewTribute3();
    NewTribute5();
    NewTribute8();
    ModelOverwrite();
    CreateArmyOne();
    CreateArmyTwo();
    CreateArmyThree();
    Turmkaputt();
    ActivateShareExploration( 1 , 6 , false);
    ActivateShareExploration( 1 , 2 , false);
    --ActivateShareExploration( 2 , 6 , true);
    --ActivateShareExploration( 3 , 6 , true);
    --CreateArmyThree();
    --CreateArmyFour();
    CreateArmyFive();
    StartCountdown(3, Friendlyness, false);
    StartCountdown(60, Sprengung, false);
    --CreateArmySix();
    --CreateArmySeven();
    --CreateArmyEight();
    MakeInvulnerable("P5_AI_HQ");
    --TruppenHack();
 
    if XNetwork.Manager_DoesExist() == 0 then      
        for i = 1, 3 do    -- Für 3 Spieler eingestellt
            MultiplayerTools.DeleteFastGameStuff(i)
        end
        local PlayerID = GUI.GetPlayerID()
        Logic.PlayerSetIsHumanFlag( PlayerID, 1 )
        Logic.PlayerSetGameStateToPlaying( PlayerID )
    end
    -- Die weiteren menschlichen Spieler müssen auf Feind gestellt werden so dies gewünscht ist zu allen KI's
    SetHostile( 5, 1 )
    SetHostile( 5, 2 )
    SetHostile( 5, 3 )
    SetHostile( 5, 6 )
    SetFriendly( 6, 1 )

    
    
    
    LocalMusic.UseSet = HIGHLANDMUSIC
    --Befehlsatz einfach Kommentierung durch entfernen der beiden Bindestriche rausnehmen
    -- nicht vergessen das jeweils nur ein Set gesetzt sein sollte
    --LocalMusic.UseSet = EUROPEMUSIC
    --LocalMusic.UseSet = HIGHLANDMUSIC
    --LocalMusic.UseSet = MEDITERANEANMUSIC
    --LocalMusic.UseSet = DARKMOORMUSIC
    --LocalMusic.UseSet = EVELANCEMUSIC
    
    -- Diese  Zeilen kommen noch vom Karteneditor und setzen die Standardsiegbedingung vernicht die Player Id
    MapEditor_SetupDestroyVictoryCondition(5)
    MapEditor_CreateHQDefeatCondition()
 
    -- Hier gehts mit den Parametern für den KI Spieler los. In diesem Fall Spieler 3, denn Spieler 2 ist ja der 2. menschliche Spieler
    -- Man kann diese Werte natürlich auch direkt in die Funktion eintragen,
    -- anstatt sie wie hier übersichtlich aufzulisten
    
 
    --Nächste Ki
    local aiID = 5;
    local strength = 3;
    local range = 300;
    local techlevel = 3;    
    local position = "P5_AI_HQ"; -- natürlich sollte man P5_AI_HQ als Skriptnamen dem Hauptquartier geben, natürlich bei player 4 P4_AI_HQ etc..
    local aggressiveness = 0;   
    local peacetime = 0;  
    MapEditor_SetupAI( aiID, strength, range, techlevel, position, aggressiveness, peacetime );
    SetupPlayerAi( aiID, { extracting = 1, repairing = 1 } );
    SetPlayerName( aiID, "Nebelvolk" );
 
    --Der Teil hier ist nur wichtig wenn man gezielt die Ressourcen bestimmen möchte die die Ki bekommt.
    -- Falls man dies nicht möchte, kann dieser Teil weggelassen werden
    -- Die Parmeter sollten individuelle angpasst werden
    
    SetupPlayerAi( 5, {
    resources =
    { 
        gold                =   10000,
        clay                =   100,
        iron                =   1500,
        sulfur        = 1500,
        stone            =  100,
        wood                =   100,
    }
    } );
    SetupPlayerAi( 5, {
    refresh =
    { 
        gold                =   10000,
        clay                =   1000,
        iron                =   1500,
        sulfur        = 1500,
        stone            =  100,
        wood                =   100,
        updateTime      = 1000
    }
    } );



    --Defenders
    local aiID = 6;
    local strength = 3;
    local range = 700;
    local techlevel = 3;    
    local position = "Defenders";     local aggressiveness = 0;   
    local peacetime = 0;  
    MapEditor_SetupAI( aiID, strength, range, techlevel, position, aggressiveness, peacetime );
    SetupPlayerAi( aiID, { extracting = 0, repairing = 0 } );
    SetPlayerName( aiID, "Kreuzritter" );
 
    --Der Teil hier ist nur wichtig wenn man gezielt die Ressourcen bestimmen möchte die die Ki bekommt.
    -- Falls man dies nicht möchte, kann dieser Teil weggelassen werden
    -- Die Parmeter sollten individuelle angpasst werden
    
end



 
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- This function is called on game start and after save game is loaded, setup your weather gfx
-- sets here
function Mission_InitWeatherGfxSets()
    -- Use gfx sets
    SetupHighlandWeatherGfxSet()
    --Befehlsatz einfach Kommentierung durch entfernen der beiden Bindestriche rausnehmen nicht vergessen das man nur ein setzten sollte
    --SetupNormalWeatherGfxSet()
    --SetupHighlandWeatherGfxSet()
    --SetupSteppeWeatherGfxSet()
    --SetupMoorWeatherGfxSet()
    --SetupEvelanceWeatherGfxSet()
end
 
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- This function is called on game start you should setup your weather periods here
function InitWeather()
    -- Hier wird der Wetterwechsel festgelegtl 
    -- Beispiel 4 Min Sommer, dann 2 Minuten Winter, dann wieder alles von vorne
    AddPeriodicSummer(240) 
    AddPeriodicWinter(120)
    --Befehlsatz einfach Kommentierung durch entfernen der beiden Bindestriche rausnehmen
    --AddPeriodicSummer(600) 
    --AddPeriodicWinter(300) 
    --AddPeriodicRain(120) 
 
end
 
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Build Groups and attach Leaders
function Mission_InitGroups()
        
end
 
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Limit the Technologies here. For example Weathermashine.
function
Mission_InitTechnologies()
    --no limitation in this map
end

--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Set local resources
function
Mission_InitLocalResources()
    local HumenPlayer = XNetwork.GameInformation_GetMapMaximumNumberOfHumanPlayer()
    
 
    -- Dies sind die Startresourcen für alle Spieler. Diese sollten angepasst werden
    local InitGoldRaw     = 300
    local InitClayRaw     = 1800
    local InitWoodRaw     = 1500
    local InitStoneRaw   = 1550
    local InitIronRaw     = 300
    local InitSulfurRaw  = 250
 
    
    --Add Players Resources
    for i = 1, 3 do
        Tools.GiveResouces(i, InitGoldRaw , InitClayRaw,InitWoodRaw, InitStoneRaw,InitIronRaw,InitSulfurRaw)

        --Befehlsatz einfach Kommentierung durch entfernen der beiden Bindestriche rausnehmen
        --Unitechnologien
        
        --ResearchTechnology(Technologies.GT_Mercenaries, i) -->Wehrpflicht 
        --ResearchTechnology(Technologies.GT_StandingArmy, i) -- -> stehendes Heer
        --ResearchTechnology(Technologies.GT_Tactics, i)--> Taktiken
        --ResearchTechnology(Technologies.GT_Strategies, i) ---> Pferdezucht
        
        ResearchTechnology(Technologies.GT_Construction, i) ----> Konstruktion
        --ResearchTechnology(Technologies.GT_ChainBlock, i) --Flaschenzug
        --ResearchTechnology(Technologies.GT_GearWheel, i) --Zahnräder
        --ResearchTechnology(Technologies.GT_Architecture, i) --Architektur
        
        ResearchTechnology(Technologies.GT_Alchemy, i) --Alchimie
        --ResearchTechnology(Technologies.GT_Alloying, i) --Legierungen
        --ResearchTechnology(Technologies.GT_Metallurgy, i) --Metallurgie
        --ResearchTechnology(Technologies.GT_Chemistry, i) --Chemie
        
        
        --ResearchTechnology(Technologies.GT_Taxation, i) --
        --ResearchTechnology(Technologies.GT_Trading, i) --Handelswesen
        --ResearchTechnology(Technologies.GT_Banking, i) --
        --ResearchTechnology(Technologies.GT_Gilds, i) --
        
        --ResearchTechnology(Technologies.GT_Literacy, i) --Bildung
        --ResearchTechnology(Technologies.GT_Printing, i) --Buchdruck
        --ResearchTechnology(Technologies.GT_Laws, i) --
        --ResearchTechnology(Technologies.GT_Library, i) --Büchereien
        
        ResearchTechnology(Technologies.GT_Mathematics, i); --Mathematik
        --ResearchTechnology(Technologies.GT_Binocular, i) -- Ferngläser
        --ResearchTechnology(Technologies.GT_Matchlock, i) --Luntenschloss
        --ResearchTechnology(Technologies.GT_PulledBarrel, i) --gezogener Lauf
            
        --ResearchTechnology(Technologies.T_ChangeWeather, i)
        --ResearchTechnology(Technologies.T_WeatherForecast,i)
        ResearchTechnology(Technologies.T_ThiefSabotage,i)
        --ResearchTechnology(Technologies., i)
        ForbidTechnology(Technologies.UP1_Tower, i); --Balistaturm
        ForbidTechnology(Technologies.UP2_Tower, i); --Kanonenturm
        ForbidTechnology(Technologies.T_UpgradeRifle1); --Schwerer Scharfschütze
        ForbidTechnology(Technologies.T_FleeceArmor); --Vlies-Rüstung
        ForbidTechnology(Technologies.T_LeadShot); --Bleikugel
        ResearchTechnology(Technologies.T_Masonry, 6) --Maurerhandwerk
        
    end
end  
 
-- victory funktion muß bei coop sein 
-- Hier wird die Siegbedingung vorgegeben
function VictoryJob()
    if IsDead("P5_AI_HQ") then
        Victory();
        return true;
    end
end  

function P5HQProtectionJob()
    if IsDead("P5_HQ_Defense1") and IsDead("P5_HQ_Defense2") and IsDead("P5_HQ_Defense3") and IsDead("P5_HQ_Defense4") and IsDead("P5_HQ_Defense5") and IsDead("P5_HQ_Defense6") and IsDead("P5_HQ_Defense7") and IsDead("P5_HQ_Defense8") then
        MakeVulnerable("P5_AI_HQ");
        return true;
    end
end  

function BridgeCheckJob()
    if IsDead("GreatBridge") then
        isGreatBridgeAlive = 0;
	else
		isGreatBridgeAlive = 1;
    end
end

function Friendlyness()
ActivateShareExploration(1, 5, false)
ReplaceEntity ("IsleExit", Entities.XD_DrawBridgeOpen1 );
SetFriendly( 6, 1 );
SetFriendly( 6, 2 );
SetFriendly( 6, 3 );
end



function CreateArmyOne()  
  armyOne            = {}
  
  armyOne.player     = 5
  armyOne.id         = 1
  armyOne.strength   = 3
  armyOne.position   = GetPosition("NVolk")
  armyOne.rodeLength = 500  
 
  SetupArmy(armyOne)  

  troopDescription  = {  
  maxNumberOfSoldiers     = 4,
  minNumberOfSoldiers     = 0,
  experiencePoints        = VERYLOW_EXPERIENCE,
 }

 troopDescription.leaderType = Entities.CU_BlackKnight_LeaderMace1

 EnlargeArmy(armyOne,troopDescription)
 EnlargeArmy(armyOne,troopDescription)
 
 StartCountdown(240, ControlArmyOne, true)

end


function CreateArmyTwo()  
  armyTwo            = {}
  
  armyTwo.player     = 5
  armyTwo.id         = 2
  armyTwo.strength   = 3
  armyTwo.position   = GetPosition("NVolk")
  armyTwo.rodeLength = 500  
 
  SetupArmy(armyTwo)  

  troopDescription  = {  
  maxNumberOfSoldiers     = 5,
  minNumberOfSoldiers     = 0,
  experiencePoints        = VERYLOW_EXPERIENCE,
 }

 troopDescription.leaderType = Entities.PU_LeaderSword3

end

function CreateArmyThree()  
  armyThree            = {}
  
  armyThree.player     = 5
  armyThree.id         = 3
  armyThree.strength   = 3
  armyThree.position   = GetPosition("NVolk")
  armyThree.rodeLength = 500  
 
  SetupArmy(armyThree)  

  troopDescription  = {  
  maxNumberOfSoldiers     = 6,
  minNumberOfSoldiers     = 0,
  experiencePoints        = VERYLOW_EXPERIENCE,
 }

 troopDescription.leaderType = Entities.PU_LeaderPoleArm3

end

function RefillArmyOne()


  troopDescription  = {  
  maxNumberOfSoldiers     = 4,
  minNumberOfSoldiers     = 0,
  experiencePoints        = VERYLOW_EXPERIENCE,
 }

 troopDescription.leaderType = Entities.CU_BlackKnight_LeaderMace1

 EnlargeArmy(armyOne,troopDescription)
 EnlargeArmy(armyOne,troopDescription)

-- if attackNumber >= 2 then
--	for i = 0, attackNumber, 2 do
--		EnlargeArmy(armyOne,troopDescription)
--		if i + 1 == attackNumber then
--			i = i - 1;
--		end
--	end
-- end
 
 Redeploy(armyOne, GetPosition("NVolk" ), 10);
 StartCountdown(240, ControlArmyOne, true)
 
end

function RefillArmyTwo()

  troopDescription  = {  
  maxNumberOfSoldiers     = 5,
  minNumberOfSoldiers     = 0,
  experiencePoints        = VERYLOW_EXPERIENCE,
 }

 troopDescription.leaderType = Entities.PU_LeaderSword3

 EnlargeArmy(armyTwo,troopDescription)
 EnlargeArmy(armyTwo,troopDescription)  

-- if attackNumber2 >= 2 then
--	for i = 0, attackNumber2, 2 do
--		EnlargeArmy(armyOne,troopDescription)
--		if i + 1 == attackNumber2 then
--			i = i - 1;
--		end
--	end
-- end 
 
 Redeploy(armyTwo, GetPosition("NVolk" ), 10);
 StartCountdown(240, ControlArmyTwo, true)
 
end

function RefillArmyThree()

  troopDescription  = {  
  maxNumberOfSoldiers     = 6,
  minNumberOfSoldiers     = 0,
  experiencePoints        = VERYLOW_EXPERIENCE,
 }

 troopDescription.leaderType = Entities.PU_LeaderPoleArm3

 EnlargeArmy(armyThree,troopDescription)
 EnlargeArmy(armyThree,troopDescription)  

-- if attackNumber2 >= 2 then
--	for i = 0, attackNumber3, 2 do
--		EnlargeArmy(armyOne,troopDescription)
--		if i + 1 == attackNumber3 then
--			i = i - 1;
--		end
--	end
-- end
 
 Redeploy(armyThree, GetPosition("NVolk" ), 10);
 StartCountdown(240, ControlArmyThree, true)
 
end

function ControlArmyOne()
    --if not armyOne.created then
        --armyOne.created = not IsDead(armyOne)
        --return false
    --end
    StartCountdown(1, RefillArmyTwo, false)
    StartCountdown(1, AngriffEins, false)
end

function ControlArmyTwo()
 StartCountdown(1, RefillArmyThree, false)
 StartCountdown(1, AngriffZwei, false)
end

function ControlArmyThree()
 StartCountdown(1, RefillArmyOne, false)
 StartCountdown(1, AngriffDrei, false)
end

function AngriffEins()

if IsDead(armyFive) then

   Redeploy(armyOne, GetPosition("StartPos" ), 10);
   Sound.PlayGUISound(Sounds.fanfare,95);

 else

   Sound.PlayGUISound(Sounds.fanfare,95);
   Redeploy(armyOne, GetPosition("Defenders" ), 10);

 end
 
 attackNumber = attackNumber + 1;

end

function AngriffZwei()

 if IsDead("Def-Tower1") and IsDead("Def-Tower2") and IsDead("Def-Tower3") then

  Redeploy(armyTwo, GetPosition("P3StartPos" ), 10);
  Sound.PlayGUISound(Sounds.fanfare,95)

 else

  Sound.PlayGUISound(Sounds.fanfare,95);
  Redeploy(armyTwo, GetPosition("Towers" ), 10);

 end
 
 attackNumber2 = attackNumber2 + 1;

end

function AngriffDrei()

 --if IsDead("Def-Tower1") and IsDead("Def-Tower2") and IsDead("Def-Tower3") then
 if isGreatBridgeAlive == 1 or isDrawBridgeOpen == 1 then

  Redeploy(armyThree, GetPosition("P2StartPos" ), 10);
  Sound.PlayGUISound(Sounds.fanfare,95)

 else

  Sound.PlayGUISound(Sounds.fanfare,95);
  Redeploy(armyThree, GetPosition("Towers" ), 10);

 end
 
 attackNumber3 = attackNumber3 + 1;

end

Narnius
#3
08.09.2020 14:14
Beiträge: 34

Zweiter Teil des Codes

function StartCountdown(_Limit, _Callback, _Show)
    assert(type(_Limit) == "number")
    assert( not _Callback or type(_Callback) == "function" )
 
    Counter.Index = (Counter.Index or 0) + 1
    
    if _Show and CountdownIsVisisble() then
        assert(false, "StartCountdown: A countdown is already visible")
    end
    
    Counter["counter" .. Counter.Index] = {Limit = _Limit, TickCount = 0, Callback = _Callback, Show = _Show, Finished = false}
    
    if _Show then
        MapLocal_StartCountDown(_Limit)
    end
    
    if Counter.JobId == nil then
        Counter.JobId = StartSimpleJob("CountdownTick")
    end
    
    return Counter.Index
end
 
function StopCountdown(_Id)
    if Counter.Index == nil then
        return
    end
 
    if _Id == nil then
        for i = 1, Counter.Index do
            if Counter.IsValid("counter" .. i) then
                if Counter["counter" .. i].Show then
                    MapLocal_StopCountDown()
                end
                Counter["counter" .. i] = nil
            end
        end
    else
        if Counter.IsValid("counter" .. _Id) then
            if Counter["counter" .. _Id].Show then
                MapLocal_StopCountDown()
            end
            Counter["counter" .. _Id] = nil
            i=1
        end
    end
end
 
function CountdownTick()
    local empty = true
    for i = 1, Counter.Index do
        if Counter.IsValid("counter" .. i) then
            if Counter.Tick("counter" .. i) then
                Counter["counter" .. i].Finished = true
            end
            
            if Counter["counter" .. i].Finished and not IsBriefingActive() then
                if Counter["counter" .. i].Show then
                    MapLocal_StopCountDown()
                end
                
                -- callback function
                if type(Counter["counter" .. i].Callback) == "function" then
                    Counter["counter" .. i].Callback()
                end
                
                Counter["counter" .. i] = nil
            end
            
            empty = false
        end
    end
    
    if empty then
        Counter.JobId = nil
        Counter.Index = nil
        return true
    end
end
 
function CountdownIsVisisble()
    for i = 1, Counter.Index do
        if Counter.IsValid("counter" .. i) and Counter["counter" .. i].Show then
            return true
        end
    end
    
    return false
end

function CreateArmyFive()  
  armyFive            = {}
  
  armyFive.player     = 6
  armyFive.id         = 5
  armyFive.strength   = 3
  armyFive.position   = GetPosition("Defenders")
  armyFive.rodeLength = 500  
 
  SetupArmy(armyFive)  

  troopDescription  = {  
  maxNumberOfSoldiers     = 8,
  minNumberOfSoldiers     = 0,
  experiencePoints        = VERYHIGH_EXPERIENCE,
 }

 troopDescription.leaderType = Entities.PU_LeaderSword4  

 EnlargeArmy(armyFive,troopDescription)
 EnlargeArmy(armyFive,troopDescription)


end

function CreateArmySix()  
  armySix            = {}
  
  armySix.player     = 5
  armySix.id         = 6
  armySix.strength   = 3
  armySix.position   = GetPosition("armySix")
  armySix.rodeLength = 1000  
 
  SetupArmy(armySix)  

  troopDescription  = {  
  maxNumberOfSoldiers     = 16,
  minNumberOfSoldiers     = 0,
  experiencePoints        = MEDIUM_EXPERIENCE,
 }

 troopDescription.leaderType = Entities.CU_Evil_LeaderBearman1  

 EnlargeArmy(armySix,troopDescription)
 EnlargeArmy(armySix,troopDescription)  

end


function CreateArmySeven()  
  armySeven            = {}
  
  armySeven.player     = 5
  armySeven.id         = 7
  armySeven.strength   = 3
  armySeven.position   = GetPosition("armySeven")
  armySeven.rodeLength = 1000  
 
  SetupArmy(armySeven)  

  troopDescription  = {  
  maxNumberOfSoldiers     = 16,
  minNumberOfSoldiers     = 0,
  experiencePoints        = MEDIUM_EXPERIENCE,
 }

 troopDescription.leaderType = Entities.CU_Evil_LeaderSkirmisher1  

 EnlargeArmy(armySeven,troopDescription)
 EnlargeArmy(armySeven,troopDescription)  

end

function CreateArmyEight()  
  armyEight            = {}
  
  armyEight.player     = 1
  armyEight.id         = 8
  armyEight.strength   = 3
  armyEight.position   = GetPosition("TestArmy")
  armyEight.rodeLength = 500  
 
  SetupArmy(armyEight)  

  troopDescription  = {  
  maxNumberOfSoldiers     = 4,
  minNumberOfSoldiers     = 0,
  experiencePoints        = VERYHIGH_EXPERIENCE,
 }

 troopDescription.leaderType = Entities.PU_LeaderRifle2  

 EnlargeArmy(armyEight,troopDescription)
 EnlargeArmy(armyEight,troopDescription)
 EnlargeArmy(armyEight,troopDescription)
 EnlargeArmy(armyEight,troopDescription)
 EnlargeArmy(armyEight,troopDescription)
 EnlargeArmy(armyEight,troopDescription)
 EnlargeArmy(armyEight,troopDescription)
 EnlargeArmy(armyEight,troopDescription)
 EnlargeArmy(armyEight,troopDescription)


end


--function CreateArmyThree()  
  --armyOne            = {}
  
  --armyThree.player     = 5
  --armyThree.id         = 9
  --armyThree.strength   = 3
  --armyThree.position   = GetPosition("NVolk3")
  --armyThree.rodeLength = 500  
 
  --SetupArmy(armyThree)  

  --troopDescription  = {  
  --maxNumberOfSoldiers     = 16,
  --minNumberOfSoldiers     = 0,
  --experiencePoints        = VERYLOW_EXPERIENCE,
 --}

 --troopDescription.leaderType = Entities.CU_Evil_LeaderBearman1  

 --EnlargeArmy(armyThree,troopDescription)
 --EnlargeArmy(armyThree,troopDescription)

--end

--function CreateArmyFour()  
  --armyOne            = {}
  
  --armyFour.player     = 5
  --armyFour.id         = 4
  --armyFour.strength   = 3
  --armyFour.position   = GetPosition("NVolk4")
  --armyFour.rodeLength = 500  
 
  --SetupArmy(armyFour)  

  --troopDescription  = {  
  --maxNumberOfSoldiers     = 16,
  --minNumberOfSoldiers     = 0,
  --experiencePoints        = VERYLOW_EXPERIENCE,
 --}

 --troopDescription.leaderType = Entities.CU_Evil_LeaderSkirmisher1  

 --EnlargeArmy(armyFour,troopDescription)
 --EnlargeArmy(armyFour,troopDescription)

--end

--function CreateTestArmy()  
  --testArmy            = {}
  
  --testArmy.player     = 1
  --testArmy.id         = 10
  --testArmy.strength   = 3
  --testArmy.position   = GetPosition("Testarmy")
  --testArmy.rodeLength = 500  
 
  --SetupArmy(testArmy)  

  --troopDescription  = {  
  --maxNumberOfSoldiers     = 8,
  --minNumberOfSoldiers     = 0,
  --experiencePoints        = VERYHIGH_EXPERIENCE,
 --}

 --troopDescription.leaderType = Entities.PU_LeaderRifle2  

 --EnlargeArmy(testArmy,troopDescription)
 --EnlargeArmy(testArmy,troopDescription)
 --EnlargeArmy(testArmy,troopDescription)
 --EnlargeArmy(testArmy,troopDescription)
 --EnlargeArmy(testArmy,troopDescription)
 --EnlargeArmy(testArmy,troopDescription)
 --EnlargeArmy(testArmy,troopDescription)
 --EnlargeArmy(testArmy,troopDescription)
 --EnlargeArmy(testArmy,troopDescription)

--end

function AddTribute( _tribute )
    assert( type( _tribute ) == "table", "Tribut muß ein Table sein" );
    assert( type( _tribute.text ) == "string", "Tribut.text muß ein String sein" );
    assert( type( _tribute.cost ) == "table", "Tribut.cost muß ein Table sein" );
    assert( type( _tribute.playerId ) == "number", "Tribut.playerId muß eine Nummer sein" );
    assert( not _tribute.Tribute , "Tribut.Tribute darf nicht vorbelegt sein");
    
    uniqueTributeCounter = uniqueTributeCounter or 1;
    _tribute.Tribute = uniqueTributeCounter;
    uniqueTributeCounter = uniqueTributeCounter + 1;
    
    local tResCost = {};
    for k, v in pairs( _tribute.cost ) do
        assert( ResourceType[k] );
        assert( type( v ) == "number" );
        table.insert( tResCost, ResourceType[k] );
        table.insert( tResCost, v );
    end
    
    Logic.AddTribute( _tribute.playerId, _tribute.Tribute, 0, 0, _tribute.text, unpack( tResCost ) );
    SetupTributePaid( _tribute );
    
    return _tribute.Tribute;
end  
      
--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
--Hier werden unsere Tribute erstellt
--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
--Tribut Packen WS0
 
function NewTribute1()
    local tribute =  {};
    tribute.playerId = 1; 
    tribute.text = "Oeffnet das noerdliche Tor"; 
    tribute.cost = { Gold = 0}; 
    tribute.Callback = Tributcallback1; 
    TributId1 = AddTribute( tribute ); 
end

function Tributcallback1()
ReplaceEntity ("Tor1", Entities.XD_WallStraightGate )

--8132.64, 18437.32,
if next( Logic.GetEntitiesInArea( 0, 8132.64, 18437.32, 1000, 1 ) ) == nil then
   Message("Keine großen Brücken.")
   else
   Message("Es gibt große Brücken.")
end


NewTribute2()
end

function NewTribute2()
    local tribute =  {};
    tribute.playerId = 1; 
    tribute.text = "Schliesst das noerdliche Tor"; 
    tribute.cost = { Gold = 0}; 
    tribute.Callback = Tributcallback2; 
    TributId1 = AddTribute( tribute ); 
end

function Tributcallback2()
ReplaceEntity ("Tor1", Entities.XD_WallStraightGate_Closed )

NewTribute1()
end



function NewTribute3() 
    local tribute =  {};
    tribute.playerId = 1; 
    tribute.text = "Uebergebt Spieler 3 das Lager"; 
    tribute.cost = { Gold = 0}; 
    tribute.Callback = Tributcallback3; 
    TributId1 = AddTribute( tribute ); 
end
 
function Tributcallback3()

ChangePlayer ("Lager",3);
NewTribute4()

end

function NewTribute4() 
    local tribute =  {};
    tribute.playerId = 3; 
    tribute.text = "Uebergebt Spieler 1 das Lager"; 
    tribute.cost = { Gold = 0}; 
    tribute.Callback = Tributcallback4; 
    TributId1 = AddTribute( tribute ); 
end
 
function Tributcallback4()

ChangePlayer ("Lager",1);
NewTribute3()

end

function NewTribute5()
    local tribute =  {};
    tribute.playerId = 1; 
    tribute.text = "Repariert eine der Turmruinen fuer 300 Stein"; 
    tribute.cost = { Stone = 300}; 
    tribute.Callback = Tributcallback5; 
    TributId1 = AddTribute( tribute ); 
end

function Tributcallback5()
AddStone( 1, -300)

DestroyEntity("RuinTower1");
CreateEntity (1,Entities.PB_Tower2,GetPosition("PosRuinTower1" ),"RepairedTower1" );

NewTribute6()

end

Narnius
#4
08.09.2020 14:14
Beiträge: 34

Dritter Teil des Codes

function NewTribute6()
    local tribute =  {};
    tribute.playerId = 1; 
    tribute.text = "Repariert eine der Turmruinen fuer 300 Stein"; 
    tribute.cost = { Stone = 300}; 
    tribute.Callback = Tributcallback6; 
    TributId1 = AddTribute( tribute ); 
end

function Tributcallback6()
AddStone( 1, -300)

DestroyEntity("RuinTower2");
CreateEntity (1,Entities.PB_Tower2,GetPosition("PosRuinTower2" ),"RepairedTower2" );

NewTribute7()

end

function NewTribute7()
    local tribute =  {};
    tribute.playerId = 1; 
    tribute.text = "Repariert eine der Turmruinen fuer 300 Stein"; 
    tribute.cost = { Stone = 300}; 
    tribute.Callback = Tributcallback7; 
    TributId1 = AddTribute( tribute ); 
end

function Tributcallback7()
AddStone( 1, -300)

DestroyEntity("RuinTower3");
CreateEntity (1,Entities.PB_Tower2,GetPosition("PosRuinTower3" ),"RepairedTower3" );
end

function NewTribute8()
    local tribute =  {};
    tribute.playerId = 2; 
    tribute.text = "Schliesst die Zugbruecke"; 
    tribute.cost = { Gold = 0}; 
    tribute.Callback = Tributcallback8; 
    TributId1 = AddTribute( tribute ); 
end

function Tributcallback8()
ReplaceEntity ("IsleExit", Entities.PB_DrawBridgeClosed1 );
isDrawBridgeOpen = 0;

NewTribute9();
end

function NewTribute9()
    local tribute =  {};
    tribute.playerId = 2; 
    tribute.text = "Schliesst die Zugbruecke"; 
    tribute.cost = { Gold = 0}; 
    tribute.Callback = Tributcallback9; 
    TributId1 = AddTribute( tribute ); 
end

function Tributcallback9()
ReplaceEntity ("IsleExit", Entities.XD_DrawBridgeOpen1 );
isDrawBridgeOpen = 1;

NewTribute8();
end

function Turmkaputt()
--SetHealth("Def-Tower1", 75)
--SetHealth("Def-Tower2", 75)
--SetHealth("Def-Tower3", 75)

end

function ModelOverwrite()
   Logic.SetModelAndAnimSet(GetEntityId("steinmauer"), Models.XD_RuinWall1)
   Logic.SetModelAndAnimSet(GetEntityId("wall1"), Models.XD_Palisade1)
   Logic.SetModelAndAnimSet(GetEntityId("wall2"), Models.XD_Palisade1)
   Logic.SetModelAndAnimSet(GetEntityId("wall3"), Models.XD_Palisade1)
   Logic.SetModelAndAnimSet(GetEntityId("wall4"), Models.XD_Palisade1)
   Logic.SetModelAndAnimSet(GetEntityId("wall5"), Models.XD_Palisade1)
-- wall1-wall5 sind sprengbare Steine, die steinmauer ist eigentlich ein abbaubarer Steinhaufen.
end


function Sprengung()

CreateEntity(1, Entities.XD_Bomb1, { X = 28682, Y = 8176 } );

end

function OnEntityCreated()
		local entityId = Event.GetEntityID()
		local entityType = Logic.GetEntityType( entityId )
		local pos = GetPos( entityId )
		if entityType == Entities.PB_Bridge4 then
			--for i = 0,8 do
				DestroyEntity(Logic.GetEntitiesInArea( 0, pos.X, pos.Y, 100, 1 ).get(0));
				CreateEntity(0, Entities.PB_Bridge4, GetPosition("GreatBridgePos"),"GreatBridge");
				CreateEntity(1, Entities.XD_Bomb1, GetPosition("GreatBridgePos") );
				--GreatBridge = Logic.GetEntitiesInArea( 0, pos.X, pos.Y, 100, 1 ).get(0);
				--GreatBridge = Logic.GetEntitiesInArea( Entities.PB_Bridge4, pos.X, pos.Y, 100, 1 ).get(0);
				isGreatBridgeAlive = 1;
			--end
		end
		
	end

--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

--COMFORT-Funktionen und Tribute reaktivieren.

function ZurEntity(_entity, _range, _currPos) 
	if type (_entity) == "table" then 
		Message("Keine Position sondern Entity angeben")  -- ein Punkt hat keine Blickrichtung
		return nil
	end
	if type (_entity) == "string" then
		_entity = GetEntityId(_entity);
	end
	local tPos = GetPosition(_entity)
	if _currPos == nil then 
		_currPos = tPos
	elseif type (_currPos) == "string" or type (_currPos) == "number"  then
		_currPos = GetPosition(_currPos)
	end
	local nEntityAngle=Logic.GetEntityOrientation(_entity);
	local nSin=math.sin((math.rad(nEntityAngle)));
	local nCos=math.cos((math.rad(nEntityAngle)));
	local tPos = GetPosition(_entity)
	return {X = _currPos.X - nCos * _range, Y =_currPos.Y - nSin * _range}; -- Rückgabe = neue Position
end

------------------------------------------------------------------------------------------------------------------------------------------------------------
-- "IsDead" mit Army-Optimierung		Version 1.00
------------------------------------------------------------------------------------------------------------------------------------------------------------
function IsDeadWrapper(_input)
	if type(_input) == "table" and not _input.created then
		_input.created = not IsDeadOrig(_input);
	    return false;
	end
	return IsDeadOrig(_input);
end
IsDeadOrig = IsDead;
IsDead = IsDeadWrapper;


function AreEnemiesInArea( _player, _position, _range)
    return AreEntitiesOfDiplomacyStateInArea( _player, _position, _range, Diplomacy.Hostile )
end
function AreAlliesInArea( _player, _position, _range)
    return AreEntitiesOfDiplomacyStateInArea( _player, _position, _range, Diplomacy.Friendly )
end
function AreEntitiesOfDiplomacyStateInArea( _player, _position, _range, _state )
    for i = 1,8 do
        if Logic.GetDiplomacyState( _player, i) == _state then
            if AreEntitiesInArea( i, 0, _position, _range, 1) then
                return true
            end
        end
    end
    return false
end 

function ActivateShareExploration(_player1, _player2, _both)
	assert(type(_player1) == "number" and type(_player2) == "number" and _player1 <= 8 and _player2 <= 8 and _player1 >= 1 and _player2 >= 1);
	if _both == false then
		Logic.SetShareExplorationWithPlayerFlag(_player1, _player2, 1);
	else
		Logic.SetShareExplorationWithPlayerFlag(_player1, _player2, 1);
		Logic.SetShareExplorationWithPlayerFlag(_player2, _player1, 1);
	end
end

function TruppenHack()
GUIAction_BuyMilitaryUnit_Orig = GUIAction_BuyMilitaryUnit
	GUIAction_BuyMilitaryUnit = function(_a)
		if _a == UpgradeCategories.LeaderSword then -- Schwertkämpfer
			if HasPlayerABlacksmith() == true then
			_a = UpgradeCategories.BlackKnightLeaderMace1
			GUIAction_BuyMilitaryUnit_Orig(_a)
			else
			Sound.PlayGUISound(Sounds.Misc_SO_WorkMetal_rnd_4,80)
			end
		end
end
end

function HasPlayerABlacksmith()
local p_BS_1 = {Logic.GetPlayerEntities(1,Entities.PB_Blacksmith1,40)}
local p_BS_2 = {Logic.GetPlayerEntities(1,Entities.PB_Blacksmith2,40)}
local p_BS_3 = {Logic.GetPlayerEntities(1,Entities.PB_Blacksmith3,40)}

for i = 1,p_BS_1[1] do
	if Logic.IsConstructionComplete(p_BS_1[i+1]) == 1 then
		return true
	end
end
for i = 1,p_BS_2[1] do
	if Logic.IsConstructionComplete(p_BS_2[i+1]) == 1 then
		return true
	end
end
for i = 1,p_BS_3[1] do
	if Logic.IsConstructionComplete(p_BS_3[i+1]) == 1 then
		return true
	end
end

end

function GameCallback_FulfillTribute() --Im Multiplayer sind Tribute standardmäßig deaktiviert, daher muss man sie erst wieder aktivieren
    return 1
end

Play4FuN
#5
10.09.2020 20:37
Beiträge: 703

Bin noch immer ein wenig verwirrt von deiner Armee-Steuerungslogik. Eine Idee; verwendest du vielleicht die Zählschleife falsch?

for i = 0, attackNumber, 2 do

heißt für i von 0 bis attackNumber in 2-er Schritten, also z.B. 0,2,4,...
Wenn ich das richtig verstehe, sollen alle zwei Angriffe neue Truppen erzeugt werden? Dann reicht es z.B. mit jedem Angriff diesen Counter zu inkrementieren und bei der Erzeugung/enlarge keine Schleife zu verwenden, sondern sowas wie if counter == 2 then [Enlarge...] und counter = 0 zurücksetzen.

Randnotiz:

tribute.cost = { Stone = 300}

zieht selbst schon die 300 Steine ab. Der Aufruf

AddStone( 1, -300)

im Callback ist also zu viel (der Spieler muss 2x300 Steine zahlen).

____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

Narnius
#6
11.09.2020 12:36
Beiträge: 34

Vielen Dank schon mal...

...aber die Zählschleife habe ich gerade überprüft und sie macht was sie soll. Die Idee ist, dass die gegnerische Armee immer weiter wächst, bei jedem zweiten Angriff soll immer ein Trupp mehr dabei sein als beim Angriff davor. Außerdem hatte ich diese Zählschleife ja bereits herauskommentiert und wie bei einem Test kürzlich herausgekommen ist, besteht die Problematik, dass die ArmyTwo ihre Angriffe manchmal versäumt auch ohne diese Zählschleife. Das mit dem Tribut ist allerdings gut zu wissen; danke dafür
Tatsächlich scheint die folgende Überprüfung...

  if isDrawBridgeOpen == 1 then

  Redeploy(armyThree, GetPosition("P2StartPos" ), 10);
  Sound.PlayGUISound(Sounds.fanfare,95)

 else

  Sound.PlayGUISound(Sounds.fanfare,95);
  Redeploy(armyThree, GetPosition("Towers" ), 10);

 end 


...völlig willkürliche Ergebnisse zu erzielen. Als ich zum Test mir immer beim Öffnen und schliessen der Zugbrücke die isDrawBridgeOpen - Variable habe ausgeben lassen waren die Werte erst eine Weile lang komplett vertauscht (also immer 1 wenn es eigentlich 0 sein sollte und umgekehrt) und danach plötzlich auch vollkommen Willkürlich. Da den Problemen mit ArmyTwo und ArmyThree ähnliche if-Anweisungen zugrunde liegen, ist die Wurzel allen Übels vielleicht dort verortet. Trotzalledem stehe ich vor einem Rätsel...

totalwarANGEL
#7
16.09.2020 08:44
Beiträge: 2123

Selber skripten ist so 2019.
Guckst du hier

____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.

Narnius
#8
20.09.2020 18:16
Beiträge: 34

Dankeschön

Ich hab' mir das jetzt mal runtergeladen, hoffentlich komme ich zurecht!

totalwarANGEL
#9
21.09.2020 10:04
Beiträge: 2123

Lösungsvorschlag mit QSB

Es sei noch gesagt, dass die Armeen in der QSB zwar nicht dafür vorgesehen sind zu "wachsen", aber stattdessen so viele verschiedene Punkte gleichzeitig angegriffen werden können, wie die KI Armeen besitzt (für die Angriff nicht abgeschaltet ist). Und zwar Kreuz der Quere über die Map.

____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.

Dieser Beitrag wurde von totalwarANGEL am 21.09.2020 um 14:08 editiert.

Seiten: 1

SiteEngine v1.5.0 by nevermind, ©2005-2007
Design by SpiderFive (www.siedler-games.de) - English translation by juja

Impressum