Alternative zu isDead
» Siedler Map Source Forum » Siedler DEdK Script Forum » Alternative zu isDead
Seiten: 1
Narnius
|
#1 30.11.2018 16:00 Beiträge: 34 |
Alternative zu isDead
Hallo liebe Mitsiedlerinnen und Mitsiedler,
ich skripte immer noch an meiner einfach gestrickten Dreispieler-Coop-Map mit den Schwarzen Bergen als Vorlage. Es fehlt nicht mehr viel damit diese spielbar ist, allerdings gibt es noch ein Problem: IsDead funktioniert bei der Abfrage, ob Balistatürme noch stehen zwar wunderbar, bei armyFive allerdings nicht. Der rückgabewert ist dann immer verfälscht. Ich habe auch bereits den isDead-Wrapper ins Skript kopiert... immer noch Fehlanzeige.
Wahrscheinlich mache ich irgendetwas falsch, wenn ja, würde ich mich freuen, wenn ihr mich darauf hinweisen könntet. Ansonsten freue ich mich auch über Alternative Lösungen ohne isDead.
Hier das Skript:
if XNetwork then XNetwork.GameInformation_GetLogicPlayerTeam = function() return 1; end XNetwork.GameInformation_GetFreeAlliancesFlag = function() return 1; end end 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() -- Init global MP stuff --MultiplayerTools.InitResources("normal") MultiplayerTools.InitCameraPositionsForPlayers() MultiplayerTools.SetUpGameLogicOnMPGameConfig() MultiplayerTools.GiveBuyableHerosToHumanPlayer( 1 ) -- 1 Held pro Spieler StartSimpleJob("VictoryJob") NewTribute1(); ModelOverwrite(); CreateArmyOne(); Turmkaputt(); ActivateShareExploration( 1 , 6 , false); --ActivateShareExploration( 2 , 6 , true); --ActivateShareExploration( 3 , 6 , true); --CreateArmyThree(); --CreateArmyFour(); Game.GameTimeSetFactor(4); CreateArmyFive(); 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, 2 ) SetHostile( 5, 3 ) SetHostile( 5, 6 ) SetFriendly( 6, 1 ) SetFriendly( 6, 2 ) SetFriendly( 6, 3 ) 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 = 3000; 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 = 3; 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 } } ); 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 = 700 local InitWoodRaw = 400 local InitStoneRaw = 300 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.UP2_Tower, i) 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 CreateArmyOne() armyOne = {} armyOne.player = 5 armyOne.id = 6 armyOne.strength = 3 armyOne.position = GetPosition("NVolk") armyOne.rodeLength = 500 SetupArmy(armyOne) troopDescription = { maxNumberOfSoldiers = 16, minNumberOfSoldiers = 0, experiencePoints = VERYLOW_EXPERIENCE, } troopDescription.leaderType = Entities.CU_Evil_LeaderBearman1 EnlargeArmy(armyOne,troopDescription) EnlargeArmy(armyOne,troopDescription) StartCountdown(240, ControlArmyOne, true) end function CreateArmyTwo() armeeZweite = {} armeeZweite.player = 5 armeeZweite.id = 7 armeeZweite.strength = 3 armeeZweite.position = GetPosition("NVolk") armeeZweite.rodeLength = 500 SetupArmy(armeeZweite) troopDescription = { maxNumberOfSoldiers = 16, minNumberOfSoldiers = 0, experiencePoints = VERYLOW_EXPERIENCE, } troopDescription.leaderType = Entities.CU_Evil_LeaderSkirmisher1 EnlargeArmy(armeeZweite,troopDescription) EnlargeArmy(armeeZweite,troopDescription) StartCountdown(240, ControlArmyTwo, true) end function ControlArmyOne() --if not armyOne.created then --armyOne.created = not IsDead(armyOne) --return false --end StartCountdown(1, CreateArmyTwo, false) StartCountdown(1, AngriffEins, false) end function ControlArmyTwo() StartCountdown(1, CreateArmyOne, false) StartCountdown(1, AngriffZwei, false) end function AngriffEins() if IsDead(armyFive) then Redeploy(armyOne, GetPosition("StartPos" ), 200); Sound.PlayGUISound(Sounds.fanfare,95) else Sound.PlayGUISound( Sounds.VoicesHero7_HERO7_NO_rnd_07,100) Redeploy(armyOne, GetPosition("Defenders" ), 2000); end end function AngriffZwei() if IsDead("Def-Tower1") and IsDead("Def-Tower2") and IsDead("Def-Tower3") then Redeploy(armeeZweite, GetPosition("P3StartPos" ), 2300); Sound.PlayGUISound(Sounds.fanfare,95) else Sound.PlayGUISound( Sounds.VoicesHero7_HERO7_NO_rnd_07,100) Redeploy(armeeZweite, GetPosition("Towers" ), 600); end end 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 = 8 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) EnlargeArmy(armyFive,troopDescription) EnlargeArmy(armyFive,troopDescription) 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 --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --COMFORT-Funktionen und Tribute reaktivieren. ------------------------------------------------------------------------------------------------------------------------------------------------------------ -- "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 GameCallback_FulfillTribute() --Im Multiplayer sind Tribute standardmäßig deaktiviert, daher muss man sie erst wieder aktivieren return 1 end
Dieser Beitrag wurde von Narnius am 30.11.2018 um 16:11 editiert.
Narnius
|
#2 30.11.2018 16:13 Beiträge: 34 |
Hinweis
Ich musste ein/zwei Sachen rausnehmen, sonst hätte der Beitrag nicht mehr voll angezeigt werden können.
Der_Deutsche
|
#3 30.11.2018 18:44 Beiträge: 349 |
Hast du das ganze mal mit IsAlive versucht?
____________________
Nachbau von Siedler 5 Lobbys "Ubi.Com"
Updatelösungen Siedler 5 Patch 1.06
Creators Update Lösung Windows 10
Siedler 5
Narnius
|
#4 30.11.2018 19:09 Beiträge: 34 |
In der Tat
Zitat von Der_Deutsche:
Hast du das ganze mal mit IsAlive versucht?
Ja, habe ich.
Der_Deutsche
|
#5 30.11.2018 19:55 Beiträge: 349 |
Is Entity in Area oder sowas war das
____________________
Nachbau von Siedler 5 Lobbys "Ubi.Com"
Updatelösungen Siedler 5 Patch 1.06
Creators Update Lösung Windows 10
Siedler 5
mcb
|
#6 30.11.2018 20:49 Beiträge: 1472 |
Initialisiere mal die KI, bevor du die erste Armee erstellst. (Also den Aufruf für die erste Arme ganz unten in die GameCallback_OnGameStart)
Narnius
|
#7 30.11.2018 21:02 Beiträge: 34 |
Ok
Zitat von mcb:
Initialisiere mal die KI, bevor du die erste Armee erstellst. (Also den Aufruf für die erste Arme ganz unten in die GameCallback_OnGameStart)
Das habe ich gemacht, als ich dann meinen Blick auf das Gegnerische Lager richtete, sah ich einen stetig expandierenden Teppich aus Dämonen...
mcb
|
#8 01.12.2018 02:04 Beiträge: 1472 |
Dann pack mal überall wo du Truppen Spawnst ne Message rein, damit du weißt wo du nach dem Fehler auchen musst.
Narnius
|
#9 01.12.2018 14:23 Beiträge: 34 |
Zitat von mcb:
Dann pack mal überall wo du Truppen Spawnst ne Message rein, damit du weißt wo du nach dem Fehler auchen musst.
Habe ich doch schon. Der Fehler liegt eindeutig bei der isDead-Abfrage. Ich brauche nur eine geeignetete Alternative. Mit IsEntityInArea komme ich net so gut zurecht, als ich das Ausprobiert habe, hat es noch schlechter funktioniert als isDead. Bei isDead, isAlive, und deren Umkehrungen durch not, wurde immer ein Rückgabewert ausgegeben, welcher damit übereinstimmt, das die armyFive Tot ist.
mcb
|
#10 01.12.2018 15:16 Beiträge: 1472 |
armyFive.player = 6
Erstellst du auch irgendwo die KI für Spieler 6?
Wenn keine KI erstellt wurde, sind Armeen von diesem Spieler auch immer tot.
Narnius
|
#11 01.12.2018 15:25 Beiträge: 34 |
Tatsache!
Zitat von mcb:
armyFive.player = 6
Erstellst du auch irgendwo die KI für Spieler 6?
Wenn keine KI erstellt wurde, sind Armeen von diesem Spieler auch immer tot.
Daran müsste es liegen, vielen Dank!
Dann probiere ich das gleich einmal!
mcb
|
#12 01.12.2018 16:33 Beiträge: 1472 |
Noch nen Tipp: Wenn du die ganzen Funktionen sortierst, also alle Comforts ans Ende, die CreateArmies zusammen und dahinter die ControlJobs, macht es das ganze deutlich einfacher zu lesen und auf Fehler zu prüfen.
Narnius
|
#13 01.12.2018 16:41 Beiträge: 34 |
Ja
Stimmt schon.
Ich habe jetzt gerade das Problem, dass die Ki, wenn ich sie Erstelle, dem Spieler IMMER feindlich gesinnt ist. Kann man dagegen was machen? Selbst im Diplomatiemenü, obwohl, ich sie an anderer Stelle zu Verbündeten gemacht habe.
Narnius
|
#14 01.12.2018 16:56 Beiträge: 34 |
HURRA!
So wie es aussieht, habe ich jetzt endlich die Lösung. Ich starte einen unsichtbaren Countdown am Anfang des Spiels, welcher dann Gegen Ende Player 6 freundlich stellt.
mcb
|
#15 01.12.2018 17:16 Beiträge: 1472 |
Das liegt wahrscheinlich daran, das MapEditor_SetupAI den Spieler zu Spieler 1 feindlich stellt. Wenn du danach nochmal SetFriendly aufrufst, funktioniert es.
(Wie du mit dem Countdown ja schon rausgefunden hast, es reicht allerdings, die Diplomatieeinstellungen hinter die KI Initialisierungen zu schieben)
Narnius
|
#16 01.12.2018 18:16 Beiträge: 34 |
Genau
Zitat von mcb:
Das liegt wahrscheinlich daran, das MapEditor_SetupAI den Spieler zu Spieler 1 feindlich stellt. Wenn du danach nochmal SetFriendly aufrufst, funktioniert es.
(Wie du mit dem Countdown ja schon rausgefunden hast, es reicht allerdings, die Diplomatieeinstellungen hinter die KI Initialisierungen zu schieben)
Als ich das aber schon während dem GameCallback_OnGameStart()
aufrief, hat das ganze Spiel versagt. Der Grafikkontrast war plötzlich Grundlos Düster, und viele Funktionen wurden ausgelassen. Ein Hurra auf den Countdown also!
mcb
|
#17 01.12.2018 19:09 Beiträge: 1472 |
Klingt nach nem Syntaxfehler, hast du due Fehlermeldungen nicht an?
Narnius
|
#18 04.12.2018 09:21 Beiträge: 34 |
Also
Vom Editor wurde mir, soweit ich weiß, kein Syntaxfehler angezeigt. Ich kenne mich zwar nicht besonders gut aus, meine Vermutung wäre, das wenn das Setup der KI diese auf Hostile setzt, dann in der selben Funktion (nämlich GameCallbackOnStart oder wie das genau hieß ) dieselbe KI auf Friendly gestellt wird, dass das Spiel dann einfach aufgibt.
mcb
|
#19 04.12.2018 15:18 Beiträge: 1472 |
Die Diplo 2 mal zu ändern erzeugt mit Sicherheit keinen Fehler.
Mit Fehlermeldungen meine ich das hier: http://www.siedler-games.de/si...als:fehlermeldungen_aktivieren, nicht die im Mapeditor (die ist des öfteren falsch).
Narnius
|
#20 04.12.2018 15:26 Beiträge: 34 |
Hm
Jagut, da es jetzt ja funktioniert, habe ich keine große Lust, das noch einmal abzuändern.
Seiten: 1