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+AGetEntityIdtypestringLog
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 PlayGUISoundSoundsklick_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
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