Benutzer-Werkzeuge

Webseiten-Werkzeuge


utilfunctions:stolenresourceamount

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
utilfunctions/stolenresourceamount.txt · Zuletzt geändert: 2021/09/18 19:16 (Externe Bearbeitung)