für die folgende Problembeschreibung muss ich etwas ausholen. Im Moment arbeiten ein guter Freund und ich mithilfe eines Spieleeditors an einem Freewarespielchen. Dieses besitzt bereits viele fertige Funktionen wie auch z.B. ein Lade/Speichersystem. Diese System kann am Anfang über ein Menü erreicht werden.
Das ganze sieht in etwa so aus:
Dieses Menü lässt sich über die Pfeiltasten bedienen. Sobald man per "New Game" ins Spiel gelangt, kann man mit der Funktionstaste "F12" wieder zurück in das abgebildete Menü wechseln. Sobald man "Load Game" anwählt, taucht ein Ladescreen auf. In diesem können mehrere Spielstände ausgewählt werden.
Was ich nun möchte:
Ich möchte gerne den Vorgang :
"F12 drücken -> "Load Game" auswählen -> Enter drücken" automatisieren. Ich müsste also dem Programm auf irgendeine Art und Weise mitteilen das es ins Hauptmenü zurückspringen soll(eventuell ja über F12) und dann entsprechend auf den "Load Game" Eintrag zu navigieren. Dort brauche ich dann noch einen Enter Tastendruck.
Die Sache ist nun nur: wie soll ich das bewerkstelligen?
Ich habe ein Programm gesehen welches genau dies tut. Jedoch funktioniert es für die Version des Editors die ich benutze leider nicht. Der Autor des Programms lässt zur Benutzung über ein weiteres Miniprogramm ersteinmal einen Offsetwert ermitteln. Dieser scheint mit der EXE des Spieles zusammenzuhängen. Jedoch beginnt ab hier absolutes Neuland für mich. Wenn er das ganze über den Arbeitsspeicher realisiert, dann weiß ich leider nicht wie er in diesen Vorgang genau ins Rollen bringt.
Ich erhoffe mir nun also von den Antworten hier das mir jemand einen Weg zeigen kann wie ich die eben beschriebene Automatisierung verwirklichen kann. Ob dies nun über den Arbeitsspeicher passiert oder auf anderem Wege ist mir dabei egal.
Als kleine Zusatzfrage:
Das eben erwähnte Editorsystem hat zur Realisierung des eigenen Spiels natürlich auch eine Funktion mit der man Variablen anlegen kann. Diese Variablen sind dabei entweder vom Typ Boolean oder eine Art Integer.
Kann man diese Variablen die sich wahrscheinlich während der Laufzeit des Programms im Speicher befinden dürften irgendwie auslesen? Kann man eventuell auch die Variablen des Programms im Speicher selbst modifizieren? Während das Programm läuft?
Das war es dann nun auch endlich mit einer Anfrage. Ich hoffe trotz der Menge an Text auf Antworten. An sich ist mir jeder Weg lieb der hier jemandem einfällt. Falls ich etwas vergessen haben sollte zu erwähnen, dann werde ich es natürlich nennen.
PS: Bei dem Editor handelt es sich um den RPG Maker 2003. Jedoch geht hierbei ja nicht um den Editor an sich. Hoffe das die Frage damit trotzdem legitim ist. Ich wüsste nicht nämlich außer der Programmierung keine Zuflucht für dieses Problem. Ich habe es selbst schon mit Java versucht. Jedoch bietet dieses leider keine Methoden um den Speicher in irgendeiner Weise auszulesen. :/
Wie wäre es mit http://multimediaxis.net/search.php.
z.B. hier aus diesem Thread
edit: Ach ja der letze Satz bezog sich darauf das er absolut keine Ahnung hatte und am Ende, wie du selbst lesen kannst, etwas unhöglich wurde.
Java ist für sowas sowieso fehl am Platz (meiner persönlichen Meinung nach ist Java immer fehl am Platz). Speicherzugriffe kann man recht leicht in C machen, wenn du es einfacher haben willst würde ich Delphi nehmen, wenn du es schwer willst Assembler. Alle drei Sprachen wirst du kostenlos beziehen können (Nur nimm bei C(++) bitte nicht ein Microsoft Produkt, sonst wirst du enttäuscht werden - garantiert).
Also an sich ist es möglich, aber wenn du schon nicht weißt wie du es machen musst, informiere dich ab Besten vorher über alles mögliche und überlege dir gut ob du wirklich denkst du kannst es, sonst verschwendest du nur deine Zeit.
--
Signature.
Geändert von Crash-Override (17.03.2007 um 16:55 Uhr)
genau mit dem selben Krempel habe ich mich auch schon fuer den rm2k rumgeschlagen fuer meine Patches .. und bei allen habe ich dann aus Zeitmangel aufgegeben.
Ich hatte sigar mal eine Loesung fuer F12+runter+enter, aber dort war das Problem dann, dass das timing exakt stimmen musste. Also hab ich die funktion irgendwann ausgebaut, weil es einfach zu kompliziert war, die tastendruecke in exakt dem richtigen moment zu senden.
Fuer das Load Problem waere es wohl eine loesung, wenn man im Spiel die Addresse der Load Subroutine mit einem Debugger oder einem Disassembler rausbekommen wuerde, und dann in einer dll (z.B. dem Tastenpatch), die vom rm2k geladen wird (-> gleicher addressraum) als funktionspointer aufruft. Allerdings hab ich das noch nicht probiert, da ich mich mit debuggern nicht so sonderlich auskenne und keine Zeit hab zum einarbeiten ...
Beim rm2k3 sieht es noch schlechter aus, da dort die moeglichkeit wegfaellt, ueber eine DLL freien Zugriff auf die Programmbibliotheken zu bekommen ...
Das Problem mit dem Aendern der Variablen ist aehnlich vertrackt. Zwar kannst du mit Read/WriteProcessMemory daten lesen und schreiben, das Problem ist allerdings, zu wissen, wo die Daten stehen. Da der maker seinen Speicher dynamisch alloziiert, stehen die bei jedem Start idR wo anders im speicher. Zwar sollte es eine konstante Addresse geben (die pointervariable zum Speicherbereich) die die addresse enthaellt, und ich konnte auch schon die Routine ermitteln (rm2k), in der die Variablen geaendert werden, doch fehlte mir dann zeit und ausdauer, den schritt zu komplementieren.
Alles in allem ein kompliziertes Problem, selbst fuer mich.
Ich kann ja mal posten, was ich damals so rausbekommen habe ...
Vielleicht nuetzt es ja einem. Alle Angaben natuerlich ohne Gewähr.
Bitte nicht schlagen .. ich hab den Code vor Jahren geschrieben, und war damals noch dumm und unwissend ^^
Ziel war es also, beim ersten Aufruf von ChangeVariable im Spiel nach injektion des neuen codes den wert des Pointers zu bekommen. Den habe ich kurzerhand im Programmsegment nops ueberschreiben lassen, weil ich dann genau wusste, wo er steht. nach dem change Variable, wenn ich den pointer hatte, ersetzte ich den veraenderten code wieder durch das original. Das Problem watr aber immer, man brauchte Change Variable dazu, wobei die ausfuehrung exakt einmal kommen musste. wuerde in der zeit vor der wiederherstellung nochmal change variable durchgefuehrt, haette man das Programm ins Nirvana geschickt.
Das Verfahren hat wirklich funktioniert, allerdings war es mir fuer den allgemeinen Markt zu unsicher.
Ersteinmal: vielen Dank an dich Ineluki und auch an Crash-Override.
Besonderes letzterer hat mir netterweise per Messenger ausgeholfen.
Im Endeffekt hat sich nun eine entsprechend modifizierte EXE gefunden die die Grundlage bot um die gewünschten Effekte umzusetzen. Mit ein paar Zusatzexen konnten auch die fehlenden Bestandteile eingefügt werden. Im großen und ganzen kann ich mich also nur nochmals bedanken.
In diesem Sinne -> der Thread kann gern geschlossen werde.