Informationen aus Statistikmenu nutzen

» Siedler Map Source Forum » Siedler DEdK Script Forum » Informationen aus Statistikmenu nutzen

Seiten: 1 2 Nächste Seite

totalwarANGEL
#1
15.12.2009 21:46
Beiträge: 2123

Informationen aus Statistikmenu nutzen

So, nachdem mir mit den Steuern geholfen wurde, stieß ich auf die nächste Grenze.
Gibt es eine Möglichkeit bspw. die besiegten Gegnereinheiten und die eigenen Verluste als Zahlenwert für eine Varriable zu bekommen?

Also in der Form:
LostUnits = ... -- Funktion die benörigt wird
KilledEnemy = ... -- Funktion die benötigt wird


Die Varriabelen müssen nicht so heißen.

ich zittere schon vor freude auf die antwort

____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.

Dieser Beitrag wurde von totalwarANGEL am 16.12.2009 um 11:49 editiert.

Kalle
#2
16.12.2009 14:45
Beiträge: 1150

Eine interesante Frage:

... nur leider habe ich auch keinen Lösungsansatz. Vielleicht aus den GUI-Hack, da gäbe es doch StatisticsWindow_SelectStatistics, oder?

____________________
Lieber Siedeln statt (fern)sehen.....

totalwarANGEL
#3
16.12.2009 17:52
Beiträge: 2123

Zitat von Kalle:
Vielleicht aus den GUI-Hack, da gäbe es doch StatisticsWindow_SelectStatistics, oder?


welche Parameter het diese Funktion?

____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.

Kalle
#4
16.12.2009 18:48
Beiträge: 1150

dazu fällt mir nur Noigi's "Hack" ein....

Zitat von Noigi:

GUICreateSoldiersForLeader_Orig = GUI.BuySoldier;
GUI.BuySoldier = function(...)
	Message("Anzahl Parameter: "..table.getn(arg))
	local v = {GUICreateSoldiersForLeader_Orig(unpack(arg))};
	Message("Anzahl Rückgabewerte: "..table.getn(v));
	return unpack(v);
end


Das hier ist der Hack einer GUI-Funktion, den Aufbau kann man auch für jede andere Funktionen benutzen. Wenn du das Glück hast und die Funktion intern verwendet wird, kriegst du die Anzahl der Parameter und Rückgabewerte ausgegeben. Dann kann man gezielter nachfragen. Bei 2 Parametern und 1 Rückgabewert zB so:

GUICreateSoldiersForLeader_Orig = GUI.BuySoldier;
GUI.BuySoldier = function(a,b)
	Message("Parameter: "..type(a).." / "..type(b))
	local v = GUICreateSoldiersForLeader_Orig(a,b);
	Message("Rückgabewert: "..type(v));
	return v;
end


Wenn man type() weglässt, werden die tatsächlichen Inhalte ausgegeben, aber natürlich nur bei string und number-Werten



Der Rest bedeutet nun, viel probieren....

____________________
Lieber Siedeln statt (fern)sehen.....

totalwarANGEL
#5
16.12.2009 19:34
Beiträge: 2123

Zitat von Kalle:
Der Rest bedeutet nun, viel probieren....


toll. jetzt muss ich erst mal raffen was diese funktion tut

ich bekomme immer die meldung:

[ 2009/12/16 20:18:50 ] ERROR: DEBUG ERROR!

Error: LUA_ERRRUN: [string "C:\Users\Nutzer\Documents\DIE SIEDLER - DEd..."]:30: attempt to call global `Check' (a nil value)



____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.

Dieser Beitrag wurde von totalwarANGEL am 16.12.2009 um 20:19 editiert.

Noigi
#6
16.12.2009 20:19
Beiträge: 772

"StatisticsWindow_SelectStatistics" ist mit großer Wahrscheinlichkeit ein Button-Callback; also eine Funktion, kein table mit Informationen.
Um das genau herauszufinden müsste man wie Kalle richtig beschrieben hat die internen Aufrufe abfangen.

Ich habe den _G mal grob überflogen und nichts gefunden, das wie ein Speichertable für die Statistik-Daten aussieht. "Score" enthält scheinbar die erreichten Punkte pro Statistik-Kategorie, aber nicht die Daten selber.


Eine Alternative zur Verwendung internen Daten wäre, die Daten selbst zu sammeln:

Trigger.RequestTrigger( Events.LOGIC_EVENT_ENTITY_DESTROYED, "", "Verwaltung_der_Todesfaelle", 1);


In der Funktion "Verwaltung_der_Todesfaelle" müssten dann playerID und Entity-Typ (->nur Einheiten) der zerstörten Entities abgefragt werden, und bei Treffern entsprechende Zählvariablen erhöht werden.
Wenn der Trigger von Anfang an läuft, sollte er auf ähnliche Werte kommen wie die internen Statistik-Daten. Allerdings natürlich ne Ecke aufwändiger.

totalwarANGEL
#7
16.12.2009 20:26
Beiträge: 2123

Zitat von Noigi:
Eine Alternative zur Verwendung internen Daten wäre, die Daten selbst zu sammeln:

Trigger.RequestTrigger( Events.LOGIC_EVENT_ENTITY_DESTROYED, "", "Verwaltung_der_Todesfaelle", 1);


In der Funktion "Verwaltung_der_Todesfaelle" müssten dann playerID und Entity-Typ (->nur Einheiten) der zerstörten Entities abgefragt werden, und bei Treffern entsprechende Zählvariablen erhöht werden.
Wenn der Trigger von Anfang an läuft, sollte er auf ähnliche Werte kommen wie die internen Statistik-Daten. Allerdings natürlich ne Ecke aufwändiger.


aha. also für jede einheit die der/die gegner haben können.

jetzt brauch ich nur noch ein muster wie die funktion geschrieben werden muss. oda geht das mit funktion()... end? brauch ich dafür comfort-funktionen?

____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.

Dieser Beitrag wurde von totalwarANGEL am 16.12.2009 um 20:36 editiert.

totalwarANGEL
#8
16.12.2009 20:53
Beiträge: 2123

Die Lösung gefunden?

kann es seien das die lösung in diesem beitrag steckt:
http://www.siedler-portal.de/s...25-erfassen-von-vorg-ngen.html

oda nicht?

____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.

Noigi
#9
16.12.2009 21:13
Beiträge: 772

Ja, genau das Prinzip meine ich.
Willst du knobeln?
Wenn ja, nicht weiterlesen!

.
.
.
.


function Verwaltung_der_Todesfaelle()
	local kaputt = Event.GetEntityID(); -- hier wird die gerade zerstörte Entity erfasst
	if (Logic.IsEntityInCategory(kaputt,EntityCategories.Military) == 1) then -- eine Einheit!
		if GetPlayer(kaputt) == 1 then
			VerloreneEinheiten = ((VerloreneEinheiten or 0) +1);
		elseif GetPlayer(kaputt) == 2 then -- GegnerID 2
			BesiegteEinheiten = ((BesiegteEinheiten or 0) +1);
		end
	end
end


Ein Manko hat das Ganze: Es werden auch Einheiten erfasst, die nur entlassen oder vom Skript zerstört werden.

totalwarANGEL
#10
16.12.2009 21:30
Beiträge: 2123

Zitat von Noigi:

function Verwaltung_der_Todesfaelle()
	local kaputt = Event.GetEntityID(); -- hier wird die gerade zerstörte Entity erfasst
	if (Logic.IsEntityInCategory(kaputt,EntityCategories.Military) == 1) then -- eine Einheit!
		if GetPlayer(kaputt) == 1 then
			VerloreneEinheiten = ((VerloreneEinheiten or 0) +1);
		elseif GetPlayer(kaputt) == 2 then -- GegnerID 2
			BesiegteEinheiten = ((BesiegteEinheiten or 0) +1);
		end
	end
end


Ein Manko hat das Ganze: Es werden auch Einheiten erfasst, die nur entlassen oder vom Skript zerstört werden.


und und vorher das:

Trigger.RequestTrigger( Events.LOGIC_EVENT_ENTITY_DESTROYED, "", "Verwaltung_der_Todesfaelle", 1);


für die sache mit dem entlassen müsste was gefunden werden mit dem man die klicks auf entlassen zählt...

____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.

totalwarANGEL
#11
17.12.2009 18:42
Beiträge: 2123

Geschafft

function Verwaltung_der_Todesfaelle2()
	GUIAction_ExpelSettler_Orig = GUIAction_ExpelSettler
	GUIAction_ExpelSettler = function()
		GUIAction_ExpelSettler_Orig()
		EntlasseneEinheiten = EntlasseneEinheiten + 1
	end
end


Habe es hinbekommen. diese Funktion scheint alle Klicks auf "Entlassen" zu zählen. die ziehe ich dann von "Verlorene Einheiten" ab. Danke Noigi und Kalle, für Vorschläge und Hilfe.

____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.

Kalle
#12
18.12.2009 12:47
Beiträge: 1150

.. also, ich habe mal ein wenig probiert...

wenn ich nutze:

GUI.StatisticsWindow_SelectStatistics = function(a,b,c,d)
Message ("gui startet" )
Message("Parameter: "..type(a).." / "..type(b))
Message ("nummer von a "..a)
end

... dann bekomme ich für jede Statistik einen nummerischen Wert. Aber was mache ich mit der Nummer (zB ich glaube 30 war für gebaute Wohnungen) ? Wie komme ich nun an das Ergebnis dieser Statistik? Dann könnte man die gewünschten Statistiken direkt im Spiel übernehmen....

Scheinbar sind die Statistiken durchnumeriert. Jetzt müsste man zb den Namen des Table wissen, um nach dem Ergebnis von table(zb30) zu fragen (in der Hoffnung, dort steht die Summe der gewünschten Statistik).

Vielleicht hat noch einer eine Idee? Ich probiere auf jeden Fall mal weiter....

____________________
Lieber Siedeln statt (fern)sehen.....

totalwarANGEL
#13
21.12.2009 13:44
Beiträge: 2123

Zitat von Kalle:
Vielleicht hat noch einer eine Idee? Ich probiere auf jeden Fall mal weiter


                 Statistics_SubHouses_all
                   Calls: GUI.StatisticsWindow_SelectStatistics(30)
                 Statistics_SubHouses_Farms
                   Calls: GUI.StatisticsWindow_SelectStatistics(31)
                 Statistics_SubHouses_Residences
                   Calls: GUI.StatisticsWindow_SelectStatistics(32)
                 Statistics_SubHouses_Workers
                   Calls: GUI.StatisticsWindow_SelectStatistics(33)


vllt. sind es ja diese nummern hier.

____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.

Kalle
#14
23.12.2009 17:37
Beiträge: 1150

jau, aber wie bekomme ich den Wert zurück, den er oben rechts auf dem Screen ausgibt?
wert = GUI.StatisticsWindow_SelectStatistics hat mir nichts gegeben...

____________________
Lieber Siedeln statt (fern)sehen.....

Noigi
#15
23.12.2009 21:15
Beiträge: 772

Es handelt sich bei GUI.StatisticsWindow_SelectStatistics ja wie erwartet um eine "oberflächliche" GUI-Funktion, die bloß die Anzeige der Untermenüs im Statistikfenster steuert - aus ihr kannst du auch mit vorgehaltener Pistole keine Statistik-Infos herausholen.

Es müsste wenn dann einen globalen table geben, der die Daten enthält; aber wie gesagt glaube ich, dass sie gar nicht auf Skriptbasis gespeichert werden, sondern vom Spiel selbst. In dem Fall keine Chance, dranzukommen.

Kalle
#16
23.12.2009 22:21
Beiträge: 1150

... mist..., aber trotzdem Danke für den niederschmetternden Hinweis....

____________________
Lieber Siedeln statt (fern)sehen.....

totalwarANGEL
#17
08.11.2010 18:51
Beiträge: 2123

Gesammte Statistik bekommen

Sorry, wenn ich diese Leiche hier nochmal schände

Konnte man nicht irgend wie die gesamte Statistik als Wert bekommen, oder irre ich mich?

____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.

Noigi
#18
08.11.2010 21:38
Beiträge: 772

Eine sehr umständliche Möglichkeit könnte es sein, mit Skriptaufrufen das Statistikfenster selbst einzublenden, die passende "Select"-Funktion aufzurufen (so dass die richtige Ansicht angezeigt wird), und dann den gesuchten Wert per XGUIEng.GetText() auszulesen. Danach das Statistikfenster dann wieder ausblenden. Ich weiß jetzt aber nicht genau, welchen konkreten Wert du haben willst, und ob der überhaupt in einem Widget ausgegeben wird, das man mit XGUIEng.GetText() auslesen kann.

Mordred
#19
08.11.2010 22:29
Beiträge: 939

Tja, da wirds kompliziert
Die Todesfälle abfangen wird noch schwieriger, da du ja noch wissen müsstest, welcher Spieler das Opfer umgebracht hat, und dann auch noch, wie die Spieler zueinander stehen...
Das Entlassen:

GUIAction_ExpelSettlerTodesfaelle = GUIAction_ExpelSettler
 function GUIAction_ExpelSettler()
  local tot = GUI.GetSelectedEntitiy()
  -- was du machen willst, z.B. eine Variable
  GUIAction_ExpelSettlerTodesfaelle()
 end



Im _G-Table steht noch lange nicht alles.
Z.B. nicht das Table mit den Jobs oder sonstige kleine Teilfunktionen wie in RemoveEntityInFog usw, was man erst mit der Funktionen-einlesen-Funktion findet.
Oder durch ein paar Rechtschreibfehler: ERROR! a nil value!, was ich teilweise ausgebessert habe...
Ist aber schwer.

Wenn dein PC wieder fit ist, kannst du dich ja mal da dran machen
LG Mordred

Dieser Beitrag wurde von Mordred am 08.11.2010 um 22:34 editiert.

Anarki
#20
09.11.2010 00:52
Beiträge: 518

Tja, getötete und verlorene Einheiten, das alte Dilemma!
Die Werte hätte ich für meine Statistikausgabe in meinen Multiplayercomfort-Maps auch gern gehabt...

Die Sache mit GUI GetText auslesen klingt eigentlich ganz vielversprechend? Naja, eigentlich aber auch nur

Also mit getöteten Einheiten kann ich nicht helfen... Anzahl Soldaten, Schlafplätzen, Essplätzen... da kann ich vlt. doch helfen (aber auch nur bedingt... Diebe und Spione hab ich nämlich einfach mal nicht beachtet)

	GetNumberOfSoldiers = function()
		local _nr = {0,0,0,0,0,0,0,0}
		for _pId = 1,8 do
			_nr[_pId] = Logic.GetNumberOfAttractedSoldiers(_pId)
		end
		return _nr
	end
	GetNumberOfSerfs = function()
		local _nr = {0,0,0,0,0,0,0,0}
		for _pId = 1,8 do
			_nr[_pId] = Logic.GetNumberOfEntitiesOfTypeOfPlayer(_pId, Entities.PU_Serf)
		end	
		return _nr	
	end
	GetNumberOfSettlers = function()
		local _nr = {0,0,0,0,0,0,0,0}
		for _pId = 1,8 do
			_nr[_pId] = Logic.GetNumberOfAttractedSettlers(_pId)
		end
		return _nr		
	end
	GetNumberOfWorkerWithoutEatPlace = function()
		local _nr = {0,0,0,0,0,0,0,0}
		for _pId = 1,8 do
			_nr[_pId] = Logic.GetNumberOfWorkerWithoutEatPlace(_pId)
		end
		return _nr		
	end
	GetNumberOfWorkerWithoutSleepPlace = function()
		local _nr = {0,0,0,0,0,0,0,0}
		for _pId = 1,8 do
			_nr[_pId] = Logic.GetNumberOfWorkerWithoutSleepPlace(_pId)
		end
		return _nr		
	end



____________________
Siedler V Tool: Selbstextrahierende Maps erstellen
Bitte testen und kommentieren

totalwarANGEL
#21
09.11.2010 16:24
Beiträge: 2123

Eigene Messungen

Anscheinend sind eigene essungen nötig. Das bietet aber auch Potenzial für eigene Kreativitzät

____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.

Mordred
#22
09.11.2010 16:39
Beiträge: 939

Ich sehe mal, ob sich aus den Funktionen eine Variable rausbekommen lässt, sonst ist wirklich Kreativität angesagt

Kalle
#23
18.03.2011 17:47
Beiträge: 1150

Gibt es hierzu neue Erkentnisse ? Die könnte ich gerade sehr gut gebrauchen !!!

Danke

____________________
Lieber Siedeln statt (fern)sehen.....

totalwarANGEL
#24
18.03.2011 18:09
Beiträge: 2123

Zitat von Kalle:
Gibt es hierzu neue Erkentnisse ? Die könnte ich gerade sehr gut gebrauchen !!!


Von meiner Seite gibts nix neues.

____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.

Anarki
#25
24.03.2011 10:08
Beiträge: 518

Zitat von totalwarANGEL:
Sorry, wenn ich diese Leiche hier nochmal schände

Konnte man nicht irgend wie die gesamte Statistik als Wert bekommen, oder irre ich mich?



Table: Score
BattleBuildingPoints
BattleSettlersPoints
CallBackGameWon
CallBackResearched
CallBackUpgrade
ConstructionPoints
GetPlayerScore
GetTeamScore
OnBuildingConstructionComplete
Player
ResearchPoints
ResourcePoints
SettlersPoints
UpgradePoints
WinPoints

Also mal probieren mit Score.BattleBuildingsPoints[pID]
etc - und einfach alles addieren was benötigt ist für die "Gesamtpunkte"

Zitat von Kalle:
Gibt es hierzu neue Erkentnisse ? Die könnte ich gerade sehr gut gebrauchen !!!


Ne, nix gemacht.
Aber um zum Ursprungspost zurückzukehren:
- Erledigte Feinde
- Verlorene Einheiten

Es gibt den Trigger "OnEntityHurt" - dazu bekommt man die EntityIDs und daraus die SpielerIDs!! Ein kleiner Check ob die Entity danach hinüber ist reicht - dazu könnte man die EntityID in einen Table legen und über einen HiResJob auf "IsDead" checken - und "falls nicht tod" wieder aus dem Table werfen(?)

Hier ein Beispiel mit aktiviertem Trigger aus meiner "TowerFight Map"
Hier gibt es ein Hauptquartier, das
a) nur jede Sekunde einmal Schaden nehmen kann
b) also Unverwundbar ist während 2 Angriffen die kürzer als 1 Sekunde sind
c) und ausserdem nur einen fixen Wert an Schaden nimmt, egal welche Einheit.

Mehr zu den Triggern hier:
Glossary:Auslöser

function ActionOnEntityHurt()
	local attacker = Event.GetEntityID1() --Angreifer
	local hurt = Event.GetEntityID2() --Angriffsziel
    if Track_Entity_Table[1][Entities.CB_DarkCastle][1] == hurt then
		MakeInvulnerable(hurt)
		DamageHeadQuartersTable[1] = true
	end	
    if Track_Entity_Table[5][Entities.CB_DarkCastle][1] == hurt then	
		MakeInvulnerable(hurt)
		DamageHeadQuartersTable[2] = true
	end		
end

function DamageHeadQuarters()
	if DamageHeadQuartersTable[1] then
		MakeVulnerable(Track_Entity_Table[1][Entities.CB_DarkCastle][1])
		SetHealth(Track_Entity_Table[1][Entities.CB_DarkCastle][1],GetHealth(Track_Entity_Table[1][Entities.CB_DarkCastle][1])-0.08)		
		DamageHeadQuartersTable[1] = false
		if IsDead(Track_Entity_Table[1][Entities.CB_DarkCastle][1]) then
			for _pId = 1,4 do
				for i = Track_Entity_Table[_pId][Entities.PB_Barracks2].count, 1, -1 do
					MakeVulnerable( Track_Entity_Table[_pId][Entities.PB_Barracks2][i] )
					DestroyEntity(Track_Entity_Table[_pId][Entities.PB_Barracks2][i])
				end
				for i = Track_Entity_Table[_pId][Entities.PB_Archery2].count, 1, -1 do
					MakeVulnerable( Track_Entity_Table[_pId][Entities.PB_Archery2][i] )
					DestroyEntity(Track_Entity_Table[_pId][Entities.PB_Archery2][i])
				end
			end	
		end
	end
	if DamageHeadQuartersTable[2] then
		MakeVulnerable(Track_Entity_Table[5][Entities.CB_DarkCastle][1])
		SetHealth(Track_Entity_Table[5][Entities.CB_DarkCastle][1],GetHealth(Track_Entity_Table[5][Entities.CB_DarkCastle][1])-0.08)		
		DamageHeadQuartersTable[2] = false
		if IsDead(Track_Entity_Table[5][Entities.CB_DarkCastle][1]) then
			for _pId = 5,8 do
				for i = Track_Entity_Table[_pId][Entities.PB_Barracks2].count, 1, -1 do
					MakeVulnerable( Track_Entity_Table[_pId][Entities.PB_Barracks2][i] )
					DestroyEntity(Track_Entity_Table[_pId][Entities.PB_Barracks2][i])
				end
				for i = Track_Entity_Table[_pId][Entities.PB_Archery2].count, 1, -1 do
					MakeVulnerable( Track_Entity_Table[_pId][Entities.PB_Archery2][i] )
					DestroyEntity(Track_Entity_Table[_pId][Entities.PB_Archery2][i])
				end
			end
		end
	end
end
function GetHealth( _entity )
    local entityID = GetEntityId( _entity );
    if not Tools.IsEntityAlive( entityID ) then
        return 0;
    end
    local MaxHealth = Logic.GetEntityMaxHealth( entityID );
    local Health = Logic.GetEntityHealth( entityID );
    return ( Health / MaxHealth ) * 100
end



____________________
Siedler V Tool: Selbstextrahierende Maps erstellen
Bitte testen und kommentieren

Seiten: 1 2 Nächste Seite

SiteEngine v1.5.0 by nevermind, ©2005-2007
Design by SpiderFive (www.siedler-games.de) - English translation by juja

Impressum