Spielefunktionen einsehen

» Settlers Map Source Forums » Siedler DEdK Script Forum » Spielefunktionen einsehen

Pages: 1

Mordred
#1
06-09-2010 14:19
Posts: 939

Spielefunktionen einsehen

Hallo, hier mal eine etwas kompliziertere Frage:
Wie kann man die Original-Spiele-Funktionen einsehen?

Erster Versuch: (mit Move)

function LeseEin()
 --LeseFunktionEin(Move)
 --GebeFunktionAus(27,76,117,97,80,1,4,4,4,6,8,9,9,8,182,9,147,104,231,245,125,65,33,68,97,116,97,92,83,99,114,105,112,116,92,77,97,112,84,111,111,108,115,92,67,111,109,102,111,114,116,46,108,117,97,117,3,3,15,66,118,3,118,3,118,3,120,3,120,3,120,3,120,3,122,3,123,3,123,3,123,3,123,3,123,3,124,3,124,3,124,3,124,3,124,3,124,3,126,3,129,3,129,3,129,3,129,3,129,3,129,3,129,3,130,3,133,3,133,3,133,3,133,3,134,3,135,3,136,3,136,3,137,3,138,3,138,3,138,3,138,3,133,3,140,3,141,3,141,3,141,3,141,3,141,3,141,3,141,3,141,3,141,3,141,3,142,3,142,3,142,3,142,3,142,3,144,3,146,3,146,3,146,3,146,3,146,3,146,3,147,3,6,8,95,101,110,116,105,116,121,65,10,95,112,111,115,105,116,105,111,110,65,10,95,100,105,115,116,97,110,99,101,65,9,101,110,116,105,116,121,73)
 GebeFunktionAus(100,3,65,15,116,97,114,103,101,116,69,110,116,105,116,121,73,100,8,42,9,112,111,115,105,116,105,111,110,43,65,18,4,12,71,101,116,69,110,116,105,116,121,73,100,3,4,5,116,121,112,101,4,7,115,116,114,105,110,103,4,6,76,111,103)
end
function LeseFunktionEin(_function)
 local StringA = string.dump(_function)
 local StringB = ""
  for i=1,string.len(StringA) do
   StringB = StringB..","..string.byte(StringA,i)
  end
   StringB = string.gsub(StringB,",0","")
 assert(false,StringB)
end
function GebeFunktionAus(...)
 local Raus = ""
  for i=1,table.getn(arg) do
   Raus = Raus..string.char(arg[i])
  end
 assert(false,Raus)
end


Zuerst wird die Funktion in die Zwischenablage eingelesen.
in einen Texteditor kopiert.
Dann wird das Err-Zeugs entfernt.
Dann wird der String leider geteilt, weil zu lang.
Dann wird er bei GebeAus eingegeben (beide teile)
Dann wird er wieder in einen Texteditor kopiert:

LuaP		¶	hçõ}A!Data\Script\MapTools\Comfort.luau
Bvvvxxxxz{{{{{||||||~


_entityA
_positionA
_distanceA	
entityIdAtargetEntityId*	position+AGetEntityIdtypestringLog



stellt sich natürlich die Frage:
Was bringts??
Aber wie man unschwer erkennt, hat move noch einen dritten Parameter, nämlich die Distanz, bei der _entityA vor _positionA anhält.

Aber geht das auch noch etwas einfacher?
Lg Mordred

This posting has been edited by Mordred: 06-09-2010 at 14:38.

totalwarANGEL
#2
06-09-2010 15:20
Posts: 2123

Move ( _entity, _pos, _distance )

Wusstest du das vorher nicht, mit dem 3 Parameter?

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

Mordred
#3
06-09-2010 17:24
Posts: 939

nein, aber das ist eig. nebensache.
Hast du eine funktion mit unbekannten parametern?
So danach nicht mehr.

Leider etwas umständlich.

edit:Hier ein Beispiel: (EGUIX_ApplicationCallback_Feedback_KeyStroke)

LuaP		¶	hçõ}AData\Script\Interface\chat.luaóõõõõõõöSound
PlayGUISoundSoundsklick_rnd_1Æ>F¿Y



Die ist vermutlich nur für das klick-geräusch zuständig.

This posting has been edited by Mordred: 06-09-2010 at 17:33.

warrior1024
#4
06-09-2010 18:34
Posts: 345

Ok, dann sag mal, was setmetatable braucht.

____________________
"Banken machen keine Fehlentscheidungen! Haben Euch das Eure Eltern nicht beigebracht?"
- Bankier Samael Silren, Enderal

Kalle
#5
06-09-2010 18:58
Posts: 1150

... oft entdecke ich hier potentiale, da kann ich nur neidvoll staunen....

Aber, wenn wir schon mal dabei sind....

Seit Tagen bastle ich immer mal wieder an den drei Angaben:

GameEndScreen
GameEndScreenMessage
GameEndScreenWindowHint

ohne nennenswerte Erfolge rum. Ich bekomme den Hilfsbildschirm (man erinnere sich an die BB-Maps, bei denen man immer nach!! dem Spiel Tipps erfragen konnte) bereits auf den Schirm, aber leider direkt bei Ende und ich kann da nichts eingeben.....

Hier würden mich die Buttons interessieren. Viele bauen ja im Script die Funktion "Weiter spielen" ein, das wäre/ist doch quasi dort vorhanden (zurück zum Spiel), aber der Button lässt sich ja nicht aktivieren...

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

Mordred
#6
06-09-2010 19:09
Posts: 939

@warrior1024:
Leider kann man nur kleine Funktionen einlesen
Dump ist nicht sehr leistungsfähig.

@Kalle:
[ 2010/09/06 19:06:56 ] ERROR: DEBUG ERROR!

Error: LUA_ERRRUN: [string "O:\Siedler5\Simulator_backup.lua"]:47: bad argument #1 to `dump' (function expected, got nil)
Das sind keine funktionen.

Kalle
#7
06-09-2010 19:18
Posts: 1150

hmmm....

XGUIEng.ShowWidget(gvGUI_WidgetID.GameEndScreenWindowHint,1,)-- zeigt am ende den screen tipps

zB in die FMA zeigt nach Victory() genau diesen Screen.

Nun, falls ich mich dort falsch Ausdrücke (Kommando, Funktion, etc etc), bitte ich um Nachsicht....

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

Noigi
#8
06-09-2010 19:57
Posts: 772

Der Button für das Hinweis-Fenster im GameEndScreen heißt "GameEndScreen_WindowTips". Zuständig dafür ist die Update-Funktion "GUIUpdate_DisplayButtonOnlyInMode(2)". Diese könntest du hacken und darin (nach dem Originalaufruf mit originalem Parameter) den Button "GameEndScreen_WindowTips" auf enabled setzen, damit er verfügbar bleibt.
Es gibt außerdem noch ein Widget namens "GameEndScreen_WindowTipsOverlay" ohne zugehörige Funktion - das vielleicht mal probehalber ein- und ausblenden, um herauszufinden was damit gemeint ist.

Für den Text in "GameEndScreen_WindowHintMapName" ist die Funktion "GUIUpdate_AOHintText()" (ohne Parameter) zuständig. Also innerhalb dieser Funktion den Text setzen oder die Funktion mit einer Leerfunktion überschreiben, damit der Text korrekt übernommen wird.


Alle Infos einfach aus der gui_elements-Liste abgelesen.

nevermind
Siedler Map Source Admin (Web)
#9
06-09-2010 21:17
Posts: 483

Posted by Noigi:
Der Button für das Hinweis-Fenster im GameEndScreen heißt "GameEndScreen_WindowTips". Zuständig dafür ist die Update-Funktion "GUIUpdate_DisplayButtonOnlyInMode(2)". Diese könntest du hacken und darin (nach dem Originalaufruf mit originalem Parameter) den Button "GameEndScreen_WindowTips" auf enabled setzen, damit er verfügbar bleibt.



Braucht nicht gehackt zu werden, wie folgt überschreiben sollte reichen:

function GUIUpdate_DisplayButtonOnlyInMode(_ModeFlag)
    XGUIEng.DisableButton(XGUIEng.GetCurrentWidgetID(), 0)
end



Damit sollten dann alle Buttons aktiv bleiben.

Posted by Noigi:
Für den Text in "GameEndScreen_WindowHintMapName" ist die Funktion "GUIUpdate_AOHintText()" (ohne Parameter) zuständig. Also innerhalb dieser Funktion den Text setzen oder die Funktion mit einer Leerfunktion überschreiben, damit der Text korrekt übernommen wird.



Überschreiben wie folgt:

function GUIUpdate_AOHintText()
    XGUIEng.SetText("GameEndScreen_OutputBG", "HIER DEIN TEXT")	
    XGUIEng.SetText(XGUIEng.GetCurrentWidgetID(), "DER NAME DER MAP")	
end



Ungetestet, bitte selber ausprobieren.

____________________
LUA_ERRSYNTAX: [string "?"]:1: `=' expected near `<eof>'

This posting has been edited by nevermind: 06-09-2010 at 21:25.

Kalle
#10
06-09-2010 21:31
Posts: 1150

... Danke an alle für die Info, werde alsbald darüber berichten...

Gruß an alle

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

Anarki
#11
06-09-2010 22:29
Posts: 518

Posted by nevermind:

function GUIUpdate_DisplayButtonOnlyInMode(_ModeFlag)
    XGUIEng.DisableButton(XGUIEng.GetCurrentWidgetID(), 0)
end



Na hätte ich das mal gewusst hätte ich mir für mein Multiplayer-Skript einiges an knobeln gespart
Da hab ich per Simplejob den PlayerGameState abgefragt und wenn einer verloren oder gewonnen hat das Fenster eben ausgeblendet.oO

Muss ich mal probieren ob das geht Der Hack wirkt sich nur auf das F1-menü aus? Nicht dass da noch unvorhergesehenes aktiviert wird mh

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

Kalle
#12
07-09-2010 07:33
Posts: 1150

Lösung für Weiterspielen nach dem Sieg/Niederlage

So, nun ist mit Hilfe von Noigi und Nevermind das Problem gelöst, und kann von allen für Maps verwendet werden:

Ich habe den Code einfach mit in die FMA genommen (obwohl ich nicht wusste, dass ich innerhalb der Function (FMA) weitere "function-end-Anweisungen" setzen durfte).

Also, mit in die FMA:

function GUIUpdate_DisplayButtonOnlyInMode(_ModeFlag)
    XGUIEng.DisableButton(XGUIEng.GetCurrentWidgetID(), 0)
end
function GUIUpdate_AOHintText()
    XGUIEng.SetText("GameEndScreen_OutputBG", "HIER DEIN TEXT")	
    XGUIEng.SetText(XGUIEng.GetCurrentWidgetID(), "DER NAME DER MAP")	
end



und schon kann man nach Sieg (und vermutlich auch nach der Niederlage) weiterspielen, wenn man möchte;
der Button "zurück zum Spiel" funktioniert !!!

Ich bedanke mich nocheinmal bei allen.

Gruß
Kalle

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

Anarki
#13
07-09-2010 08:12
Posts: 518

innerhalb anderer Funktionen schreib ich es immer so zur besseren Übersicht:
(ich lade dann sowieso alle Comforts extra nochmal ein durch einen Call der 'Comfort-Funktion')

GUIUpdate_DisplayButtonOnlyInMode = function(_ModeFlag)
    XGUIEng.DisableButton(XGUIEng.GetCurrentWidgetID(), 0)
end
GUIUpdate_AOHintText = function()
    XGUIEng.SetText("GameEndScreen_OutputBG", "HIER DEIN TEXT")	
    XGUIEng.SetText(XGUIEng.GetCurrentWidgetID(), "DER NAME DER MAP")	
end



Zum Beispiel packe ich alle GUI-Hacks in eine Funktion, so in der Art:

function GUI_Hacks()
   GUIUpdate_DisplayButtonOnlyInMode = function(_ModeFlag)
       XGUIEng.DisableButton(XGUIEng.GetCurrentWidgetID(), 0)
   end
   GUIUpdate_AOHintText = function()
       XGUIEng.SetText("GameEndScreen_OutputBG", "HIER DEIN TEXT")	
       XGUIEng.SetText(XGUIEng.GetCurrentWidgetID(), "DER NAME DER MAP")	
   end
end


und dann rufe ich in der Startfunktion einfach einmal GUI_Hacks() auf.
Nur so zum Thema Codestrukturierung kurz angemerkt

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

totalwarANGEL
#14
08-09-2010 15:38
Posts: 2123

Nun...

... es gibt da schon ein paar Funktionen aus dem Logic und dem AI Table, die ich gerne mal "einlesen" wollte.

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

Kalle
#15
08-09-2010 15:42
Posts: 1150

by the way...

hat schon mal jemand per Script einen Scout (mir egal, ob ID1 oder andere ID) dazu gebracht, sein Fernglas zu nutzen ?
(so dass der Player den Bereich gezeigt bekommt?)

Ich stelle mir sowas vor, wie "Zahle den Tribut, und der Scout auf dem Berg wird für Euch über den Fluss schauen...".

Geht so etwas?

Gruß

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

Mordred
#16
08-09-2010 16:34
Posts: 939

@totalwarANGEL:
Aus dem Logicbereich wird vermutlich der größte Teil einlesbar sein.
Wenn du schreibst, welche, dann kann ich dir das gerne machen.

@kalle:
Ach du meine Güte...
Nachbauen ja, sogar ziemlich gut, aber wirklich??
Du gibst dem Scout die TaskList durch-Fernglas-schauen und deckst dann den bereich auf.

warrior1024
#17
08-09-2010 16:55
Posts: 345

@Kalle:

Das KI-Skript aus dem Wiki enthält etwas ähnliches:
Da die AI-Befehle beim Erforschen von Techs versagen, hat man sich schnell eine eigene Funktion geschrieben:
Player-Selektion speichern, dem Player die Kontrolle über die KI gegeben, automatisch die Uni selektieren, die GUI-Action aufrufen, dem Player die Kontrolle wieder nehmen und die Selektion wiederherstellen.

Gar nicht so schwer, oder?

____________________
"Banken machen keine Fehlentscheidungen! Haben Euch das Eure Eltern nicht beigebracht?"
- Bankier Samael Silren, Enderal

Mordred
#18
08-09-2010 16:58
Posts: 939

ja, aber den kundschafter kriegst du so auch nicht.

Kalle
#19
08-09-2010 17:03
Posts: 1150

Posted by Mordred:

Ach du meine Güte...
Nachbauen ja, sogar ziemlich gut, aber wirklich??
Du gibst dem Scout die TaskList durch-Fernglas-schauen und deckst dann den bereich auf.



... das würde aber nicht ganz reichen. Erstens weiß ich noch nicht, welcher Scout wo steht, zweitens noch kenne ich seine Blickrichtung, und drittens mir würde der "Blick-Trichter" fehlen.

Also suche ich explizit die Gui- oder andere Funktionen, die das "sehen" des Scouts erlauben würden...

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

Mordred
#20
08-09-2010 18:49
Posts: 939

Posted by Kalle:

... das würde aber nicht ganz reichen. Erstens weiß ich noch nicht, welcher Scout wo steht, zweitens noch kenne ich seine Blickrichtung, und drittens mir würde der "Blick-Trichter" fehlen.

Also suche ich explizit die Gui- oder andere Funktionen, die das "sehen" des Scouts erlauben würden...



mit etwas mehr aufwand schon.
Den Kundschafter finden geht recht einfach, allerdings solltest du schon wissen, von welchem spieler, welcher scout "blickt" und wohin.
den trichter kann man mit kosinus und sinus berechen.

Mordred
#21
08-09-2010 21:23
Posts: 939

dump (und somit die Funktion) ist anscheinend nur für funktionen ohne upvalues geeignet, was auch immer das ist
Somit wird sie nur noch für die kleinen funktionen wie SetHealth, Move, MakeInvulnerable usw sein.

Falls jemand weiss, was diese upvalues sind, oder wie man die aus der funktion rauskriegt, wäre ich sehr dankbar für eine Antwort

Schade.
Lg Mordred

Hier ein paar funktionen, die schon fertig sind, aber wirklich viel bringt das nichts - ausser um zu sehen, dass manche funktionen nette, selbstgeschriebene Comforts wie es sie auch hier gibt, sind.
Ebenso sieht man den Grund für die Langsamkeit der Funktion "AreEntitiesInArea": sie verwendet Logic.GetEntitiesInArea.

This posting has been edited by Mordred: 08-09-2010 at 22:02.

Anarki
#22
09-09-2010 08:24
Posts: 518

Hi Mordred,
finde das echt recht reizend... bei einigen Funktionen gerade bei den XUbiNetwork. und Network. würde mich brennendst interessieren welche variablen da dahinter stehen.

Ich hab ein Tool mit vb.net programmiert mit dem ich aus den Error-Meldungen 'nur den Error' Text extrahieren kann und das mir in Sekundenschnelle auch x-viele Error-Meldungen 'auswertet' und dann schließlich 'den ganzen Text' ohne diese Zeilenmeldungen ausspuckt.

Hier wäre eine Anwendung!
Nur noch eine Schleife die mir aus _G alle Funktionen ausspuckt und schwupp *g*
Mit dem Tool könnte man ja evtl die Funktionen auch direkt noch 'aufteilen'.

Wenn du Lust und Zeit hast und so ne Schleife hinkriegst würd ich das Tool so anpassen dass es die Ausgabe-Meldungen rausfiltert... einmal laufen lassen und wir hätten viiiiiiiele schöne Daten

Können auch gern mal mit nur dem Logic Table anfangen

Grüße,
Anarki

PS:
Das Tool nutze ich momentan um in Tables alle 30 Sekunden gespeicherte Statistiken in Multiplayerspielen am Ende von Spiele 'rauszuholen' per Error-Meldungen (in meinem Multiplayer Comfort Skript siehe Mappack auf dedk.de)
Damit du dir was drunter vorstellen kannst...
Da kommen gut und gerne mal 3000 Zeilen mal 6Spalten Daten zu sammen.. die ich per Error Assert ausgebe.
Und dann paste ich das nur noch in Excel, lass ein kurzes VBA Makro drüber laufen, und Ergebnis ist sowas:
http://dedk.de/index.php/forum/viewtopic/topic/42/start/0#pid248

Ausserdem nutze ich eine Variation des Tools um die Onlineliste, siehe im eingeloggten Status auf http://www.dedk.de rechts oben, aus der Lobby 'rauszuholen' und automatisch auf meinen Server auf dedk.de zu spielen.
Dazu läuft auf meinem 2. Computer ein Onlinespiel mit nur einem Mitspieler (dedk.de-onliste) bei dem regelmässig jede Minute ein Error erzeugt wird mit allen momentanen Onlinespielern

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

This posting has been edited by Anarki: 09-09-2010 at 08:31.

Mordred
#23
10-09-2010 22:12
Posts: 939

Weiterentwicklung!

So jetzt kann man das auch bequem selbermachen:

-- Aufruf: --
 LeseFunktionEin(EineFunktion)



ein Leeres Dokument bereithalten, dann kommen die Errormeldungen bei längeren Funktionen alle 5 sekunden rein, str. + v, dann die nächste.
Das ganze störende Zeugs noch entfernen.
fertig

Falls noch irgendwelche Fehler auftreten, dann bitte hier reinschreiben.

Ach, und CX-Tools sollten deaktiviert sein.

function LeseFunktionEin(_function)
 local FString = string.dump(_function)
 local STable  = {}
  for i=1,string.len(FString) do
   table.insert(STable,string.byte(FString,i))
  end
  for i=table.getn(STable),1,-1 do
   if (STable[i] == 0)then
    table.remove(STable,i)
   end
  end
   Message(table.getn(STable))
   local FunkString = ""
  for k,v in STable do
   FunkString = FunkString..string.char(v)
  end
 if (string.len(FunkString) < 700)then
  assert(false," \n Ausgabe 1 von 1: \n \n "..FunkString)
 else
  FunkStringStelle	 = 0
  FunkStringT		 = {}
  local ErsatzString = ""
   while (string.len(FunkString) > 700) do
    ErsatzString = FunkString
	FunkString = string.sub(FunkString,600,string.len(FunkString))
	table.insert(FunkStringT,FunkString)
	FunkString = string.sub(ErsatzString,1,600)
   end
    table.insert(FunkStringT,FunkString)
    StartSimpleJob("PrintFString")
 end
end
function PrintFString()
 if Counter.Tick2("PrintFString",5)then
  if (FunkStringStelle >= table.getn(FunkStringT))then
   Counter.Reset("PrintFString")
   FunkStringStelle = nil
   FunkStringT		= nil
   return true
  else
   FunkStringStelle = FunkStringStelle + 1
   assert(false," \n Ausgabe "..FunkStringStelle.." von "..table.getn(FunkStringT)..": \n \n "..FunkStringT[FunkStringStelle])
  end
 end
end



Viel Spaß () wünscht Mordred

Pages: 1

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

Impressum