Mugshot Routine für deutsche Version kompatibel machen

  • Hallo,


    ich habe folgendes Problem. Und zwar würde ich gerne Mugshots in meinem Hack anzeigen lassen und ich hab darüber die letzten Tage viel im Internet gesucht.

    Die simpelste Methode wäre es, mit den Befehlen showpokepic und hidepokepic beim Scripten zu arbeiten, aber wenn man damit scriptet, kommt bei jedem Mugshot der Ruf von Icognito dazu, was nicht schön und auf Dauer sehr nervig war.

    Dann habe ich herausgefunden, dass sowas mit ASM möglich ist und auf PC gibt es auch Routinen dafür, wie in diesem Tutorial hier: [Tutorial] Mugshots via ASM

    Diese funktioniert ja nur für die englische Fire Red, deswegen muss sie für die deutsche Feuerrot nach angepasst werden.

    Daher meine Frage, wie kann man diese Routine für die deutsche Feuerrot anpassen? Würde es reichen, wenn man die Offsets beider Sprachversionen abgleicht und dementsprechend in der Routine ändert? Oder muss man noch weitere Änderungen vornehmen?


    Danke schon mal für eure Hilfe :)

  • Um die ASM Routine kompatibel für die deutsche Feuerrot Version zu machen, musst du alle Offsets an die deutsche Version anpassen,

    aber könnte ein wenig mühevoll an manchen stellen werden.

    Mfg

    DarkGengar

    Danke für die schnelle Antwort :)

    Ich ging auch davon aus, dass ich nur die Offsets ändern müsste, wollte aber lieber nochmal ne Bestätigung von jemandem, mit ASM-Erfahrung ^^


    Geändert hab ich die Offsets auch und die Routine funktioniert auch halbwegs. Ich hab nur das Problem, dass der Mugshot nur aufflackert und nach dem Script nicht verschwindet.


    Ich stell hier mal die veränderte Routine rein, weil ich nicht wirklich weiß, wie ich das Problem beheben kann:

    (Credits hier an Kyoko1 und knizz für die Original-Routine)

    Die Offsets in roter Schrift sind die Offsets aus dem Original (die aber logischerweise in meiner Routine nicht daneben stehen).


    Hab ich irgendwelche Offsets falsch geresearched?

    Oder könnte das Problem woanders liegen?

  • Hast du mal die unveränderten Routinen in eine englische ROM eingebaut und verglichen, ob bei gleichem Skript das Problem bestehen bleibt?
    Ansonsten kann es natürlich sein, dass du manche Offsets falsch angeglichen hast (kann ich jetzt so ohne Weiteres nicht ermitteln), wie hast du denn die Offsets für die deutsche ROM ermittelt?

  • Eine weitere Fehlerquelle könnten auch die RAM Offsets (< 0x8000000) sein, welche in einer englischen ROM teilweise verschieden und deutlich schwerer zu researchen sind.

  • Hast du mal die unveränderten Routinen in eine englische ROM eingebaut und verglichen, ob bei gleichem Skript das Problem bestehen bleibt?
    Ansonsten kann es natürlich sein, dass du manche Offsets falsch angeglichen hast (kann ich jetzt so ohne Weiteres nicht ermitteln), wie hast du denn die Offsets für die deutsche ROM ermittelt?

    Nein das habe ich noch nicht ausprobiert, ich veruch es aber gleich mal und sag dann Bescheid.


    Ich habe einmal eine Clean Feuerrot Rom und daneben eine Clean Firered ROM im VBA gestartet und mittels des Memory Viewers die Bytes abgeglichen und geguckt, wo in Feuerrot die gleichen Bytes auftauchen (oder zumindest ziemlich ähnlich strukturiert sind).

    Unterschiede gab es noch bei den Offsets mit 0x8 und bei allen Offsets (bis auf einem) gab es nur eine Abweichung von 80 Bytes.


    Edit: Habs mit ner englischen Rom probiert und da funktioniert die Routine einwandfrei.


    Eine weitere Fehlerquelle könnten auch die RAM Offsets (< 0x8000000) sein, welche in einer englischen ROM teilweise verschieden und deutlich schwerer zu researchen sind.

    Kann gut sein, dass es daran liegen könnte. Ich hab die Offsets jetzt auch nur oberflächlich abgeglichen durch den Memory Viewer.

    Aber diese Offsets wären mit dem VBA SDL-H researchbar, richtig?

  • An sich kann man RAM-Offsets mit dem VBA-SDLH durchaus nachvollziehen. Ein mögliches Vorgehen wäre: Man sucht eine englische Routine, welches das RAM Offset verwendet. Dann sucht man nach der entsprechenden Funktion in einem deutschen ROM und versucht dann nachzuvollziehen, auf welches RAM-Offset die deutsche Version zurückgreift.

  • Dann mach ich das so, danke für deine Hilfe :)

    Ich könnte ja bei der Starterwahl anfangen nach den Offsets zu suchen. Der Sinn der Funktion ist ja bei der Starterwahl und bei den Mugshots ähnlich. Beide Funktionen sollen mir einen Sprite anzeigen lassen. Lieg ich da richtig, oder hab ich das was übersehen?

  • Ich würde das wiegesagt anders angehen, zumindest mache das ich immer so und es ist recht effizient. Sagen wir du hast ein Offset xyz, das für ein englisches ROM korrekt ist. Jetzt suchst du dir z.b. im Hex-Editor eine Routine in der englischen ROM, die dieses Offset lädt.

    Beispielsweise: Sagen wir xyz = 0x08123456. Dann suchst du jetzt im Hex Editor nach 56 34 12 08. Irgendwo wirst du dann (vermutlich nicht nur einen) Treffer finden. Im Regelfall (es gibt natürlich Ausnahmen), sind Funktionen (in Feuerrot) so kompiliert:

    1. Ein Block mit Befehlen, der enthält dann sowas wie ldr rX, [rD, #...] (= xyz)

    2. Ein Bock mit statischen Symbolen (in dem Block befindet sich 56 34 12 08)

    Gut, sagen wir du hast diesen Block, in dem die Referenz auf das Offset liegt, gefunden. Jetzt öffnest du deine ROM in einem Disassemblierer (z.B. IDA, der VBA hat auch einen) und suchst etwas vor diesem Treffer-Offset nach der Zeile, die dieses Offset lädt (vermutlich eine ldr rX, [rD, #] (= xyz) Anweisung.

    Jetzt gilt es, diese bestimmte Zeile auch ein einem deutschen ROM ausfindig zu machen. Dabei kannst du vorgehen, wie immer es dir beliebt: Also zum Beispiel ein paar Bytes in der Funktion markieren und dann im deutschen ROM suchen, auch hier empfiehlt es sich mit dem Disassemblierer zu vergleichen, ob die Funktion im deutschen ROM der im englischen ähnelt (also ob sie das gleiche tun). Dann kannst du ganz einfach anhand der ldr Zeile herausfinden, welches Offset du im Deutschen hast.

  • Also wenn ich jetzt das Offset 0x020377F8 als Beispiel habe.

    Dann gehe ich wie folgt vor:

    Ich öffne die englische Version im Hex-Editor und suche nach F8 77 03 02.

    Wenn ich das gefunden habe, merk ich mir das Offset, bei dem diese Werte zu finden sind, in dem Fall ist es das Offset 0731D8.

    Dann öffne ich den VBA Dissambler mit der englischen Version, geh zu 0x08073200 und such nach einem Offset, der das lädt.

    In meinem Fall wäre es 080731d8 (daneben steht ldr r2, [$08073200] (=$020377F8))

    Nach dem ich das gemacht habe gehe ich wieder in den Hex-Editor, suche nach dem Offset 0731d8 und kopiere davon ein paar Bytes.

    Danach öffne ich die deutsche Rom im Hex-Editor und suche dort nach den Bytes.

    Ich habe das Offset 07313C gefunden.

    Ich gebe das Offset in den Dissassemblierer des VBAs ein und sehe das 0807313C das gleiche auslöst wie 080731D8 in der englischen Rom.


    Ist das bis dahin richtig so?

    Ich hab irgendwie das Gefühl, dass ich mich da so n bisschen im Kreis gedreht habt bzw was falsch gemacht hab^^


    Edit: Ich hab mal ein bisschen rumprobiert und dabei ist mir folgendes aufgefallen.

    Ändere ich das Offset 0x6014000, dann verschieben sich die Tiles des Sprites, also müsste 0x6014000 richtig sein.

    Also muss ich die 0x02-Offsets ändern.

    Was ich auch herausgefunden habe: Wenn ich das OAM-Buffer Offset in Loading.asm und das OAM-Buffer Offset in Removing.asm verschieden sind, verschwindet der Mugshot wieder, nachdem der Text kam.

    Das OAM-Buffer Offset in der Removing.asm-Routine muss dabei 0x0202063C bleiben.

    Wenn ich aber das OAM-Buffer Offset in der Loading-Routine ändere, ist der Mugshot schwarz.

  • Nein, das sollte dann passen. Das Interessante ist jetzt, welches Offset im deutschen ROM geladen wird. Im Englischen ist es ja ldr r2, [$08073200](=$020377F8)), im Deutschen ist es dann wohl ldr r2, [...] (=xyz).

    xyz ist jetzt das deutsche Offset von 020377F8.

  • Das 020377F8 Offset ist in der deutschen ROM genau dieselbe.



    Versuch mal statt

    Code
    1. 80EE44D

    8EE765 einzusetzen und zu sehen, ob es dann funktioniert.

    Außerdem würde ich Prüfen, ob deine Grafik überhaupt zu .equ OAMNUM, 0x0203C000 geschrieben werden kann, vllt. gibt es ja bereits Änderungen, die du an das genannte Offset schreibst (DAN von Prime würde hier Probleme verursachen).

    Da ich die Routine selbst mal einfügen wollte, kann ich dir sagen, dass ich aber damals genau das gleiche Problem hatte wie du.