[Pokémon Feuerrote und Smaragd-Edition] Team-Pokémon-Daten im RAM hacken

  • Hiermit könnt ihr die Pokémon-Daten im RAM auslesen und bearbeiten.
    Das Ändern der Pokémon-Daten kann bequem per Script mit der Hilfe von Variablen und dem Befehl callasm durchgeführt werden.


    Achtung, die Beispiele auf den ersten drei Seiten dieses Themas sind veraltet und passen nicht mehr zu dem neuen Code!
    Falls du etwas nicht verstehst oder Probleme auftreten, scheue dich nicht, hier zu fragen!


    • As­sem­b­lie­rt die richtige ASM-Routine für euer Spiel.
    • Fügt den Binär-Code der ASM-Routine an einer freien Stelle im ROM ein. Das Start-Offset muss mit 0, 4, 8 oder C enden!
    • Im Script wird die ASM-Routine über den Befehl callasm angesteuert. Wichtig ist, dass man zum Offset der ASM-Routine noch 1 dazu addiert, sonst klappt es nicht!
      Tipp für Fortgeschrittene: Nutze anstatt callasm den special-Befehl. Suche dir ein freies special und ändere in der Pointertabelle den Pointer. Alternativ kann man auch die Pointertabelle erweitern.



      Wenn die ASM-Routine im ROM im Bereich 0x0 bis 0xFFFFFF eingefügt worden ist, lautet das Offset so:

      Code
      1. z.B. Routine bei 0xAB0000
      2. callasm 0x08AB0001


      Wenn die ASM-Routine im ROM im erweiterm Bereich 0x1000000 bis 0x1FFFFFF eingefügt worden ist, lautet das Offset so:

      Code
      1. z.B. Routine bei 0x01AB0000
      2. callasm 0x09AB0001


    • Nun kann man über einen Script, siehe Vorlage unten, die Pokémon-Daten im Team und auch des gegnerischen Teams ändern. Man kann alle möglichen Werte auslesen und ändern, siehe Tabelle unten.






    Weitere Informationen über die Pokémon-Daten


    Credits

    • Kairyon , für die deutsche Übersetzung, die ASM-Routinen und die Erweiterung der Tabelle.
    • Jambo51, für die Entdeckung der Decrypt- und Encrypt-Routine sowie das Aufstellen der Tabelle.
    • Wodka , für die Entdeckung der Statusupdate-Routine.

    Edited 61 times, last by Kairyon: Tabelle aktualisiert, Neu: Pokémon Wettbewerbs-Bänder ().

  • Ja, der Wert steht in 0x8007 nach dem ersten callasm. ^^


  • Ich habe jetzt einen Parameter eingebaut, mit dem man das steuern kann.


    Code
    1. setvar 0x8003 0x0 'Statuswerte werden aktualisiert, Aktuelle KP und Statusveränderung (Gift, etc.), die es vor dem Decrypten hatte, werden beibehalten, Aktuelle KP und Statusveränderung lassen sich nicht ändern
    2. setvar 0x8003 0x1 'Statuswerte werden nicht aktualisiert, Aktuelle KP und Statusveränderung (Gift, etc.) lassen sich ändern


    Des Weiteren wird das Pokémon nun durch 0x8004 und der Modus durch 0x8005 festgelegt.
    Ich habe das vertauscht, weil GFs specials immer 0x8004 für den Pokémon-Index benutzen. Ich denke, dass ist nützlich, weil man sich das copyvar spart, falls man das im Zusammenhang mit dem Auswahlfenster benutzt.
    Daher darauf achten, alte Scripts zu aktualisieren.
    Sollte man in 0x8004 einen Wert über 5 haben, wird die Routine nun auch sicherheitshalber beendet.


    Natürlich hält einen nichts davon ab, die Routine nach Belieben selber anzupassen. ;)

  • Seitdem ich die Routine geupdatet habe passiert einfach gar nichts mehr... Das folgende Script gibt mir einfach nur 0 zurück. Vorher war es auch gegangen nur jetzt wo es abgeändert woren ist scheint es nicht mehr zu klappen... Vorschlag?



  • Das ist der Originalcode. Der war in der rom identisch, erstes ASM-offset ist deine Routine, die zweite ASM-Adresse ist eine Funktion, die je nachdem, ob die variable gerade oder ungerade ist 0/1 zurückgibt.


    Bei dem nope stand das bufferpartypokemon 0x0 0x8004.

  • Ich habe die Routine mal auf einer Feuerrot getestet.
    Abgefragt wurde das Ursprungsspiel von Glumanda.
    Siehe da, 4 stimmt.



    Kompiliere die Routine noch einmal, falls du gestern sofort alles übernommen hast und überprüfe deine Parameter.

    bin
  • Jop es lag am ASM-Script von Gestern ;)


    EDIT: Irgendwie verstehe ich nicht wie ich Statusveränderungen setzen soll!? Wenn ich 0x80 setze müsste doch ein Pokémon schwer vergiftet sein, ist es aber irgendwie nicht :/ Auch wenn ich 8003 auf 0x0 habe :(

  • Sag mir mal bitte was ich falsch mache...? Ich verwende wert 37, wenn ich aber einen Wert Setze passiert gar nichts...


  • Random 0x3
    copyvar 0x8000 LASTRESULT
    @oben selbst wenn es so ist, notthinghappens bewirkt sowieso keine statusveränderung.^^ Übrigens passiert auch nichts, wenn es 0x0 oder 0x1 ist... Von daher selbst wenn ich den wert ändere geschiet nichts...


    Es wird immer ein Wert in 0x8000 hineinkopiert! Danach werden die einzelnen statusveränderungen (da es ja zufällig sein soll) entweder gesetzt (1,2,3) oder es passiert nichts (0). Bei den jeweiligen calls setze ich bden Wert 8007 auzf den wert der statusveränderung (sofern der Wert korrekt ist).

  • Hier mal der Script für Vergiftung:


    Edit: Du hast übrigens kein setvar 0x8004 drin.
    Mach unter bufferpartypokemon ein copyvar 0x8004 LASTRESULT.


  • Dieses Script habe ich als Scriptfeld auf den Boden gelegt, wenn ich allerdings drauf gehe freezt das Spiel bzw das lock wird ausgeführt, aber die Musik läuft weiter. Dann bleibt mir nix anderes mehr übrig als aus machen. Was ist daran falsch?


    Edit: Muss das Offset 4-aligned sein, also auf 0, 4, 8 oder C enden?


    Edit 2: Muss das eigentliche Offset +1 auf 0 4 8 C enden oder das Offset wo man es abspeichert?