[[http://www.siedler-games.de|{{:sg-link.jpg|}}]]
====== 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