Inhaltsverzeichnis
StolenResourceAmount
Im Game gibt es eine tolle PU (Player Unit), nämlich den Dieb. Leider wird er nicht sehr häufig auf Maps eingesetzt, und wenn, dann meist nur zur Sabotage. Das finde ich schade, verfügt der Dieb doch, wie der Name ja schon ausdrückt, auch noch über eine andere, sehr wertvolle Eigenschaft: Er kann Sachen (Resourcen) stehlen!
Unerkannt schleicht er dazu zu gegnerischen Gebäuden oder Minen und lädt seinen Sack voll mit Gold/ Talern oder Rohstoffen. Ist der Sack voll, gilt es die Beute noch in eine (eigene) Taverne oder ein Wirtshaus in Sicherheit zu bringen.
Um diese Funktion der Diebe allerdings „sinnvoll“ verwenden zu können (z.B. in einem Quest/ Auftrag), fehlt jedoch eine Comfort-Funktion, mittels derer es einfach wäre, die jeweils von einem Dieb gestohlene Ware und Menge zu ermitteln.
Diese Aufgabe übernehmen die folgenden Funktionen.
Wie funktioniert's
Nun, der gesamte Vorgang des Stehlens ist etwas umfangreicher, und es gibt eine Reihe von Punkten, die beachtet, bzw. geprüft werden müssen. Prinzipiell läuft der Vorgang so ab, dass uns ja eigentlich nur interessiert, was und wie viel einer unserer Diebe in der Taverne/ dem Wirtshaus abliefert.
Dazu „klinken“ wir uns die Originalfunktion ein, die aufgerufen wird, wenn die vom Spieler selektierte Entity ein Dieb ist. Dort prüfen wir dann, ob dieser Dieb bereits etwas geklaut hat. Ist dies der Fall, merken wir uns die EntityId, die Resource und die geklaute Menge dieses Diebs, da ja immer noch die Möglichkeit besteht, dass er nicht lebend mit seiner Beute ankommt.
Jetzt prüfen wir mittels eines SimpleJobs solange die Menge dieses Diebs, bis er entweder tot ist, oder die Menge 0 ist. Ist Letzteres der Fall, hat der Dieb seine Beute erfolgreich abgeliefert, und wir können die Menge zur bereits erbeuteten Menge dazu addieren.
So lässt sich also jederzeit im Spielverlauf feststellen, welche Resourcen in welchen Mengen uns unsere Diebe beschafft haben.
Code
Dieser Teil muss in die FMA (FirstMapAction):
GUIUpdate_ThiefSelectionOrig = GUIUpdate_ThiefSelection GUIUpdate_ThiefSelection = function() GUIUpdate_ThiefSelectionOrig() if GUI.GetCurrentStateName() == "SecureStolenGoodsCommand" then local selected = { GUI.GetSelectedEntities() }; for i = 1, table.getn(selected) do local resType, resAmount = Logic.GetStolenResourceInfo(selected[i]) if resAmount > 0 then Merkliste[selected[i]] = {resType,resAmount} if not IsThiefAlive_JobId then IsThiefAlive_JobId = StartSimpleJob("IsThiefAlive") end end end end end
Der Rest kann an beliebiger Stelle (nicht innerhalb einer anderen Funktion!) ins Script gepackt werden:
Merkliste = {} StolenGoods = {} StolenResourceAmount = {} -- # für jede mögliche Resource wird die "gestohlene" Menge erstmal auf 0 gesetzt for k,v in pairs(ResourceType) do StolenResourceAmount[v] = 0 end function CountStolenGoods(_resourceType, _resourceAmount, _callback) local runsAlready = 0 _resourceType = ResourceType[_resourceType] for i=1,table.getn(StolenGoods) do if StolenGoods[i][1] == _resourceType then runsAlready = 1 end end if not runsAlready == 1 then table.insert(StolenGoods,{_resourceType,_resourceAmount,_callback}) StolenResourceAmount[_resourceType] = 0 end end function IsThiefAlive() -- # SimpleJob local Loeschliste = {} local delete_count = 0 local thief_count = 0 for thiefId,resTypeAmount in pairs(Merkliste) do if not IsAlive(thiefId) then delete_count = delete_count + 1 Loeschliste[delete_count] = thiefId else local res_Type, res_Amount = Logic.GetStolenResourceInfo(thiefId) if res_Amount == 0 then StolenResourceAmount[resTypeAmount[1]] = StolenResourceAmount[resTypeAmount[1]] + resTypeAmount[2] delete_count = delete_count + 1 Loeschliste[delete_count] = thiefId else thief_count = thief_count + 1 end end end for i=1,delete_count do Merkliste[Loeschliste[delete_count]] = nil end if thief_count == 0 then EndJob(IsThiefAlive_JobId) IsThiefAlive_JobId = nil end -- # hier kommt dann die Abfrage hin, ob die gestohlene Menge den erforderlichen Wert erreicht hat local _counter_StolenGoods = {} for i=1,table.getn(StolenGoods) do if StolenGoods[i][2] <= StolenResourceAmount[StolenGoods[i][1]] then -- # Funktionsaufruf / Rückgabe StolenGoods[i][3](StolenGoods[i][1],StolenResourceAmount[StolenGoods[i][1]]) table.insert(_counter_StolenGoods,i) end end if table.getn(_counter_StolenGoods) > 0 then for i=1,table.getn(_counter_StolenGoods) do table.remove(StolenGoods,i) end end end