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: 704 |
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