Hilfe, erste Map und ich kann das Problem nicht lösen
» Siedler Map Source Forum » Siedler DEdK Script Forum » Hilfe, erste Map und ich kann das Problem nicht lösen
Seiten: 1
Nad3003
|
#1 29.10.2017 17:59 Beiträge: 3 |
Hilfe, erste Map und ich kann das Problem nicht lösen
Sehr geehrte Mapper,
neulich erst bin ich auf diese Seite gestoßen und so keimte in mir der Wunsch auf, selbst so eine Map zu erstellen. Ich hab schon tausende Tests gemacht, habe viel mit anderen Skripts verglichen bis ich nun Folgendes zustande brachte:
-------------------------------------------------------------------------------- -- MapName: XXX -- -- Author: XXX -- -------------------------------------------------------------------------------- -- Include main function Script.Load( Folders.MapTools.."Main.lua" ) IncludeGlobals("MapEditorTools") --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- This function is called from main script to initialize the diplomacy states function InitDiplomacy() SetHostile(1,2) SetNeutral(1,4) SetNeutral(2,4) SetPlayerName(2,"Kerberos") end --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- This function is called from main script to init all resources for player(s) function InitResources() -- set some resources AddGold (600) AddSulfur(500) AddIron (500) AddWood (1000) AddStone (1000) AddClay (1000) end --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- This function is called to setup Technology states on mission start function InitTechnologies() end --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- This function is called on game start and after save game is loaded, setup your weather gfx -- sets here function InitWeatherGfxSets() SetupNormalWeatherGfxSet() end --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- This function is called on game start you should setup your weather periods here function InitWeather() --AddPeriodicWinter(10) AddPeriodicSummer(1800) --AddPeriodicRain(120) end --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- This function is called on game start and after save game to initialize player colors function InitPlayerColorMapping() Display.SetPlayerColorMapping(1,FRIENDLY_COLOR3) Display.SetPlayerColorMapping(2,ROBBERS_COLOR) end --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- This function is called on game start after all initialization is done function FirstMapAction() CreatePreludeBriefing() CreatePlayer2() CreateArmyOne() StartCountdown(20,OpenDoorHolz,false) --StartSimpleJob("OpenDoorHolz") StartSimpleJob("VictoryJob") StartSimpleJob("OpenDoorHolzTwo") Mission_InitMerchants() end function Mission_InitMerchants() local mercTent = Logic.GetEntityIDByName("MercTent") Logic.AddMercenaryOffer(mercTent, Entities.PU_LeaderBow4, 4, ResourceType.Gold, 500); --Logic.AddMercenaryOffer(mercTent, Entities.PU_LeaderRifle2, 4, ResourceType.Clay, 500); Logic.AddMercenaryOffer(mercTent, Entities.PU_LeaderSword3, 4, ResourceType.Wood, 500); --Logic.AddMercenaryOffer(mercTent, Entities.PU_LeaderHeavyCavalry1, 4, ResourceType.Iron, 450); --ich weiß noch nicht was ich alles anbieten möchte end function CreatePreludeBriefing() Move("Kundschafter","Kamera", 10) LookAt("Kundschafter", "Dario") LookAt("Dario","Kundschafter") PreludeBriefing = {} PreludeBriefing.finished = PreludeBriefingFinished page = 0 page = page + 1 PreludeBriefing[page] = {} PreludeBriefing[page].title = "Der Anfang" PreludeBriefing[page].position = GetPosition("Kamera") PreludeBriefing[page].text = ("Nach den langen Jahren des Krieges herrschte Friede im K\195\182nigreich. Kerberos sollte nie wieder ein Fu\195\159 ins Land setzen. Alles war gut...") PreludeBriefing[page].dialogCamera = false; --Seite 3 page = page + 1; PreludeBriefing[page] = {}; PreludeBriefing[page].title = "Kundschafter"; PreludeBriefing[page].position = GetPosition("Kundschafter") PreludeBriefing[page].text = "Herr! @cr (keuch) Kerberos wurde gesichtet! Er befindet sich trotz lebenslanger Vebannung wieder in Eurem Lande. @cr Kundschafter berichten, dass er Rache \195\188ben will. Er baut eine gro\195\159e Armee auf und wird Euch in naher Zukunft angreifen um Euch Euren Thron zu entrei\195\159en."; PreludeBriefing[page].npc = {id = GetEntityId("Kundschafter"), isObserved = true }; PreludeBriefing[page].dialogCamera = true page = page + 1 PreludeBriefing[page] = {} PreludeBriefing[page].title = "Missionsziel" PreludeBriefing[page].text = "Haltet den Angriffen stand und schlagt zur\195\188ck, damit diesem Treiben f\195\188r allemal ein Ende gesetzt ist." PreludeBriefing[page].position = GetPosition("Kamera") PreludeBriefing[page].explore = BRIEFING_EXPLORATION_RANGE PreludeBriefing[page].quest = {} PreludeBriefing[page].quest.id = 1 PreludeBriefing[page].quest.type = MAINQUEST_OPEN PreludeBriefing[page].quest.title = "Besiege Kerberos" PreludeBriefing[page].quest.text = "Baut schnell eine Siedlung mit einer guten Verteidigung auf und haltet den Angriffen stand. Sobald Ihr stark genug seid, schlagt selbst zur\195\188ck um Kerberos Rachefeldzug zu beenden" StartBriefing(PreludeBriefing) end function PreludeBriefingFinished() DestroyEntity("Kundschafter") end function OpenDoorHolz() DestroyEntity ("door") end function OpenDoorHolzTwo() if IsDead("door") then ReplaceEntity( "door2", Entities.XD_PalisadeGate2) return true else end end function CreatePlayer2() player2 = {} player2.id = 2 local description = {serfLimit = 10} SetupPlayerAi(player2.id,description) end function CreateArmyOne() armyOne = { player = 2, id = 1, strength = 4, position = GetPosition("armyOne"), rodeLength = 4000 } SetupArmy(armyOne) local troopDescription = { maxNumberOfSoldiers = 8, minNumberOfSoldiers = 0, experiencePoints = MEDIUM_EXPERIENCE, leaderType = Entities.PU_LeaderSword3 } for i = 1, 4 do EnlargeArmy(armyOne, troopDescription) end local troopDescription = { maxNumberOfSoldiers = 8, minNumberOfSoldiers = 0, experiencePoints = HIGH_EXPERIENCE, leaderType = Entities.PU_LeaderBow3 } for i = 1, 4 do EnlargeArmy(armyOne, troopDescription) end StartSimpleJob("ControlArmyOne") end function ControlArmyOne() if IsDead(armyOne) then CreateArmyTwo() Message("Der Angreifer ist besiegt") return true else Advance(armyOne) end end function CreateArmyTwo() armyTwo = { player = 2, id = 2, strength = 4, position = GetPosition("armyTwo"), rodeLength = 4000 } SetupArmy(armyTwo) local troopDescription = { maxNumberOfSoldiers = 8, minNumberOfSoldiers = 0, experiencePoints = MEDIUM_EXPERIENCE, leaderType = Entities.PU_LeaderRifle2 } for i = 1, 4 do EnlargeArmy(armyTwo, troopDescription) end local troopDescription = { maxNumberOfSoldiers = 8, minNumberOfSoldiers = 0, experiencePoints = HIGH_EXPERIENCE, leaderType = Entities.PU_LeaderBow3 } for i = 1, 4 do EnlargeArmy(armyTwo, troopDescription) end StartSimpleJob("ControlArmyTwo") end function ControlArmyTwo() Advance(armyTwo) end function VictoryJob() if IsDead("player2") then Victory() return true 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 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 -- Quest data MapEditor_QuestTitle = "erste Map" MapEditor_QuestDescription = "erste Map"
Es funktioniert soweit alles bis auf die Funktion ControlArmyOne. Hier erscheint armyOne an seinem Platz und greift mich an. Nur erscheint gleichzeitig armyTwo, obwohl ArmyOne noch nicht tot ist. Ich hab alles versucht aber bin nun mit meinem Latein am Ende und hoffe, dass mir jemand von euch sagen kann, wo der Fehler liegt.
Danke euch im Vorraus!
Liebe Grüße,
Nad3003
Dieser Beitrag wurde von Nad3003 am 29.10.2017 um 18:31 editiert.
Nad3003
|
#2 29.10.2017 18:03 Beiträge: 3 |
Ähm ok,
ich merke gerade erst wie die Formatierung leicht auseinander schießt. Tut mir Leid. Das macht die Fehlersuche natürlich viel schwieriger.
Wie kann ich mein Skript in der ursprünglichen Formatierung einfügen?
Wäre nett, wenn jemand das kurz erläutert.
mcb
|
#3 29.10.2017 18:24 Beiträge: 1472 |
[code] script [/code]
Sieht dann so aus:
script
(Kannst du auch noch in deinen Post Editieren)
Das Problem ist wahrscheinlich, das die Truppen nicht sofort erstellt werden, sondern erst mit einiger Verzögerung und so IsDead beim Aufruf des SimpleJobs noch true ergibt.
Einfachste Möglichkeit ist wohl, das ganze nicht so oft zu prüfen, Armeebefehle reichen auch alle 10 Sekunden :
function ControlArmyOne() if Counter.Tick2("controlArmyOne", 10) then if IsDead(armyOne) then CreateArmyTwo() Message("Der Angreifer ist besiegt") return true else Advance(armyOne) end end end
Counter.Tick2(_name, _limit) gibt praktisch bei jedem 10. Aufruf true zurück, sonst false (unterschieden an _name). http://www.siedler-games.de/si...iki/doku.php/reference:counter
(Hab davon aber auch nur gelesen, verwende selber keine Standard-Armeen)
Seiten: 1