Rom-Hacking Guide

Wir sammeln alle Infos der Bonusepisode von Pokémon Karmesin und Purpur für euch!

Zu der Infoseite von „Die Mo-Mo-Manie“
  • Vorwort


    Hallo und herzlich Willkommen zu meinem Rom-Hacking Guide!
    Dies ist Einführung, die euch Tipps & Tricks oder Anleitungen gibt, um euch das Romhacking zu erleichtern.
    Außerdem vergisst man so nicht wichtige Sachen, wenn man diesem Guide folgt.
    Besonders für Anfänger ist dieses Tutorial geeignet!


    Einleitung


    Was ist überhaupt Romhacking?
    Unter Romhacking versteht man das Modifizieren oder Abändern eines ROMs (Read Only Memory)
    Der Begriff "Modifikation" hat sich als leichte Abänderung des Spiels eingebürgert, wie z.B Trainer stärker machen o.Ä.
    Ein "Hack" hingegen ist das volle Programm: Tileänderung, Mapänderung, ...


    Vorbereitung


    Bevor wir anfangen, zu hacken, müssen wir uns zuerst ein paar Dinge zurechtlegen.
    Zuerst downloadet euch ein ROM, welches ihr hacken wollt.
    Diese findet ihr über Google, Direktlinks sind im Bisaboard untersagt!


    Haben wir die 16 MB große ROM auf dem Desktop gespeichert, machen wir einen Ordner namens "Pokemon Hack".
    Dort machen wir folgende Unterordner: "ROM"; "Grafiken"; "Maps"; "Scripts"; "Dokumentation" und "Notizen".
    Die zuvor gedownloadete Datei geben wir in den ROM-Ordner. :-) (falls ihr eine .zip gedownloadet habt, entzippt sie!)


    Wenden wir uns jetzt dem Dokumentations-Ordner zu.
    Erstellt dort 3 Textdateien: "Flags-Doku"; "Variablen-Doku"; "Grafik-Offsets"
    Für was ihr diese drei verwendet, erfährt ihr ein paar Kapitel später.. =)


    Wenn ihr wollt, könnt ihr jetzt im Ordner "Notizen" eine Textdatei namens "Storyline" erstellen, falls ihr schon eine Geschichte für euren Hack habt. ;-)


    Grundkenntnisse


    Damit ihr ohne Einschränkung hacken könnt, müsst ihr euch mit einigen Begriffen und Systemen vertraut machen.
    Da wären z.B das Hexadezimal-System und das Binär-System.
    Ihr werdet am Anfang nur das Hexadezimal-System brauchen, weshalb ich dieses jetzt erkläre.





    Fangen wir an!


    Ich, als langjähriger Hacker, empfehle euch, mit dem Tiles einfügen zu beginnen.
    Dies hat mehrere Gründe, unter Anderem kann es problematisch werden, wenn man
    schon gemappt hat und dann noch Tiles einfügt. Die Blöcke werden mit Sicherheit
    an einer anderen Stelle als die vorherigen sein und schlimmstenfalls die ganze Map zerschießen..


    Wenn man sich ein wenig damit beschäftigt, fällt es einem leicht.
    Für die ganz Faulen gibt es auch die Möglichkeit, eine Rombase (bzw Tilebase) zu verwenden.
    Dort sind die Tiles schon gehackt und ihr könnt sofort mit dem Mapping anfangen.


    Rombasen findet ihr hier und hier.


    Falls ihr nicht wisst, wie man so eine patcht, schaut hier vorbei ;-)


    Mapping


    Logischerweise sollte man nach dem Tiles-einfügen zum Mappen beginnen.
    Denn ohne Maps kann man auch die Scripts auf dieser nicht erstellen bzw koordinieren.


    Es ist übrigens für Anfänger empfohlen, die bestehenden Maps zu hacken, da dies weniger Verwirrung und
    Extra-Arbeit stiftet. Man könnte die Maps auch zuerst löschen und danach neue erstellen, aber dann gäbe es
    Probleme mit den "sethealingplaces" und den Flug-Positionen (rotes F in AM).


    Wenn ihr lernen wollt, wie man gute Maps erstellt, geht hierher.


    Events erstellen


    Es gibt verschiedene Arten von Events.

    • Personen (Grüne P-Felder bzw. der Sprite)
      Die NPCs, die man auf Maps ansprechen kann
    • Signposts (rote S-Felder)
      Schilder oder Tafeln, auf denen etwas steht.
    • Warps (lila W-Felder)
      Wenn du auf einen Warp trittst, wird du auf eine andere Map gewarpt.
    • Script-Felder (grüne S-Felder)
      Diese grünen Felder werden beim Betreten ausgelöst und leiten meist ein spezielles Event ein.
    • Flug-Positionen (rote F-Felder)
      Wenn du Fliegen einsetzt, wirst du an diese Position "abgesetzt".


    Events kannst du Erstellen, indem du unter "Eventmenge" die Zahlen veränderst.


    Personen


    Personen haben die Meisten Funktionen:


    -Bewegung
    -Trainer
    -Ansprechen
    (-man kann sie auch verschwinden lassen)


    Alle gleichfarbigen Elemente haben etwas miteinander zu tun.


    Kommen wir als Erstes zur Bewegung.
    Den Bewegungs-Typ könnt ihr aus der Liste auswählen.
    Aber was bedeuten die anderen Kästchen?
    Unter "Bewegung" könnt ihr schreiben, um wie viele Felder die Person auf/ab oder links/rechts gehen kann.
    Wenn ihr z.B "Herumgehen" und bei Bewegung "$22" stehen habt, wird die Person maximal 2 rauf und runter
    und maximal 2 Felder nach links und rechts gehen.
    "Unbekannt" ist ziemlich unwichtig, in der Regel steht hier immer "$00".


    Die Trainer-Funktion ist auch sehr praktisch.
    Um zu definieren, dass die Person ein Trainer ist, macht ihr bei "Trainer" ein "$01" hin.
    Die Sichtweite gibt an, bei wie vielen Feldern dich der Trainer "erwischen" kann.
    Wenn dort z.B "2" steht, kann der Trainer 2 Felder weit blicken und dich in einem Radius von 2 feldern erwischen.
    Abhängig davon ist die Blickrichtung (Movement-Typ).


    Bei Script-Offset kopiert ihr das vom XSE-Compiler erhaltene Offset hinein.
    Interessant wird es jetzt bei der Personen-ID.
    Wenn ihr dort eine schon gesettete Flag hineinschreibt, ist die Person verschwunden!
    "Unbekannt" ist in dem Fall einfach 2 nop's (00 bytes)


    Signposts
    Signposts haben zwei Funktion:


    -Ansprechen
    -versteckte Items
    (-Geheimbasen (nur in RSS))


    Unter Signpost-Typ könnt ihr auswählen, ob das Script erscheint, wenn ihr draufklickt oder
    wenn ihr zum Beispiel nach oben geht und das Script sofort ausgelöst wird.
    Interessant ist hier "verstecktes Item".


    Normales Script beim Anklicken


    Bei Unbekannt lässt ihr 0000 stehen und bei Script-Offset kopiert ihr das von XSE ausgespuckte Offset rein.


    Verstecktes Item


    Es wird empfohlen, immer Typ [07] zu nehmen.
    Bei Hidden-ID ist es eigentlich egal was man angibt, es sei denn man hat mehrere Items auf der Map.
    Wenn mehrere Items auf der Map sind, darf man nicht bei jedem z.B $00 angeben, sondern 2 versch. Werte :-)
    Anzahl ist glaub ich selbsterklärend ;-D


    Warps


    Bei Warp-Nummer müsst ihr die Nummer des Warps angeben, auf den ihr euch bei der anderen Map warpen wollt.
    Bei Bank gebt ihr die erste Nummer der Map an, die man hier ablesen kann

    [Originale Grafik nicht mehr vorhanden]
    Bei Map hingegen gebt ihr die zweite Nummer an.
    Wenn ich jetzt nach Alabastia will, wären das Bank: 3 Map: 0.


    Scriptfelder


    Da gibts jetzt wieder etwas mehr zu erklären.
    Also bei Scriptfeldern muss man nur drauftreten, damit das Script auslöst.
    Allerdings funktioniert das nur, wenn man eine variable und wert angibt..


    Bei Unbekannt kommt einfach 00.
    Bei der Var-Nummer könnt ihr theoretisch alles über 1000 und unter 8000 angeben.
    Empfohlen ist allerdings 4000-6000, sollte aber für ein Spiel reichen. ;-)
    Bei Wert kommt immer "$00". Als Anfänger braucht ihr nicht zu verstehen warum, wenn ihr
    den Anweisungen folgt.


    Wenn ihr also zum Beispiel jetzt die Var 5000 mit dem Wert 0 angegeben habt, schreibt ihr im Script setvar 0x5000 0x1.


    Bei dem Unbekannt danach kommt wieder 0000.
    Und schließlich beim "Script-Offset" das vom XSE-Compiler ausgespuckte Offset.


    Scripten


    Jetzt geht's ans Scripten.
    Personen, Schilder und spezielle Events.
    Fangt zuerst immer mit den Personen und Schildern an.
    Diese sind in der Regeln immer am Leichtesten und leider auch am Langweiligsten.^^
    Habt ihr das gemacht, könnt ihr euch den speziellen Events widmen.
    Wie zum Beispiel "Pokemon erhalten" oder ein Minispiel..


    Scripten ist eigentlich etwas sehr kreatives und fordert viel Gehirnschmalz.
    Es gibt Situationen, in denen man nicht einfach ein Tutorial zur Hand nimmt und das Problem ist gelöst..
    Wenn ihr jetzt zum Beispiel ein Minispiel scriptet:


    Ihr macht ein kleines Quiz.
    Eventuell mit ein paar multichoices, damit es professioneller aussieht usw.
    Wie zum Teufel frage ich aber die Antworten auf richtig oder falsch ab und wie
    mache ich ein Abfragungssystem, damit der Spieler gemäß seiner Antworten einen Preis bekommt?


    Hierfür verwenden wir setvar, addvar, subvar und compare (evtl giveitem für den Preis)


    Setvar benutzt man ja normalerweise bei Levelscripts oder Script-Feldern.
    Hier haben Vars aber eine ganz andere Funktion.
    Eine Var speichert hier sozusagen die Anzahl an richtigen Antworten.
    Wann immer eine Antwort richtig ist (mit compare abgefragt), macht ihr ein addvar 0xeure_var 0x1.
    Dies bewirkt, dass der Wert der Var um eins erhöht wird.
    Das spannende an der Sache sind dann noch die Buffers.


    Code
    buffernumber 0x0 0xeure_var


    Damit wird der Wert der Var (Wert enspricht richtigen Antworten) in Buffer 1 gespeichert.
    Dann macht ihr in einem Textscript: "[player] hat [buffer1] richtige Antworten genannt."
    Da seht ihr mal, was mit Scripting alles möglich ist! ;-)


    Hier findet ihr 2 Scripting-Tutorials, eins davon von mir:


    XSE Tut by pilo


    Was jetzt?


    Jetzt könnt ihr noch diverse Grafiken hacken, wie zum Beispiel den Title-Screen oder den Boot-Screen..
    Aber auch Trainersprites und Overworlds.


    Ich empfehle euch, Map für Map voranzugehen.
    Nachdem die eine Map gemappt wurde, macht auch die Scripts für diese.
    Nicht einfach alles Mappen und dann Scripten, denn so verliert man schnell die Motivation.
    Außerdem ist empfohlen, spezielle Grafiken für diese Map sofort nach den Scripts einzufügen.


    In den Folgenden Kapiteln wird es kleine Mini-Tutorials zu einzelnen Sachen geben, wie das Hacken der Textbox
    oder des Bootscreens.


    Für alle die ab jetzt Schluss machen: Ich hoffe euch hat die kleine Einführung in das Hacking gefallen.
    Ihr könnt mich immer anschreiben, falls ihr etwas nicht versteht oder mehr wissen wollt. ;-)


    Mini-Tutorials


    Bootscreen hacken


    Benötigte Programme:


    [list][*]Unlz GBA
    [*]Nameless Tilemap Editor
    [*]Irfanview


    Nun, der Bootscreen ist etwas tükisch, da der RAM uns nur eine begrenzte Tileanzahl für das Tileset zur Verfügung stellt.
    Wer jetzt nicht unbedingt Routinen (ASM) ändern will, sollte sich an das Tutorial halten.


    Ich würde gerne diesen Bootscreen einfügen:

    [Originale Grafik nicht mehr vorhanden]


    Der ist für meinen Hack und daher bitte ich euch, ihn nicht irgendwie zu benutzen :-P


    Habt ihr euren Bootscreen gezeichnet (Der GBA ist 240x160 Pixel), müsst ihr das Set verkleinern.
    Das macht ihr, indem ihr alle doppelten Tiles oder jene, die über die X oder Y-Achse
    gespiegelt werden können, entfernt.
    Wenn ihr dann fertig seid, sieht das Set ziemlich mickrig aus.^^


    Vergesst unbedingt nicht, links oben ein vollschwarzes 8x8 Tile zu machen!
    (falls schon schwarz z.b im Text vorhanden ist, ändert diese zu 24/24/24 RGB, fällt keinem auf und ihr tut euch einfacher!)


    Habt ihr also nun das Set, öffnet Irfanview.
    Image -> Decrease Colour Depth -> 16 Colours
    Damit reduzieren wir die Farben im Set auf 16.
    Speichert euer Bild.


    Jetzt geht auf Image -> Increase Colour Depth -> 256 Colours
    Speichert nun die Palette mit Image -> Palette -> Export Palette -> euername.pal
    SPEICHERT DAS BILD NICHT!
    Irfanview können wir wieder schließen..


    Kommen wir zur Tilemap.
    Startet den NTME (nameless tilemap editor) und öffnet euer Tileset.


    Nehmt jetzt euren ursprünglichen 240x160 Bootscreen zur Hand und versucht ihn im NTME nachzustellen.
    Zu guter letzt schweift ihr euren Blick dorthin, wo "(Tilemap 30x20)" steht.
    Mit Width, Height und dem Plus-Button macht ihr die Tilemap auf 32x32.
    Wenn ihr fertig seid, sollte da "(Tilemap 32x32)" stehen.
    Dann speichert die Tilemap und ihr könnt den NTME auch schon wieder schließen.


    Jetzt brauchen wir den unlz gba.
    Ihr geht ungefähr zur Nummer 212 im 16-Farben-Modus und Black/White.


    Geht nun auf "Import" und wählt euer Tileset aus.
    Sucht euch aber zuvor ein freies Offset im Hexeditor.
    Wo wir dabei sind: Jetzt könnt ihr dieses freie Offset in euer "Grafik-Offset"-Textdokument schreiben.
    Dann kannst du das Offset nicht versehentlich überschreiben ;-)


    Macht alle Haken bis auf "Export Palette"
    Habt ihr das gemacht, klickt auf OK und ihr bekommt eine Meldung, dass alles gut verlief.
    Drückt jetzt auf "Next".
    Ihr seht ein etwas misshandeltes Bild, das ist die Tilemap des Bootscreens.
    Richtig geraten, die werden wir jetzt ersetzen.
    File -> Load RAW


    Drückt nun auf Write to ROM, gebt erneut ein freies Offset ein, und drückt OK.
    Habt ihr das alles getan, schließt den Unlz GBA.


    Macht nun einen Test im VBA.
    Wenn ihr irgendwas falsch gemacht habt, wird der VBA steckenbleiben und nicht einmal der Titelbildschirm wird geladen.
    Also, VBA starten und hoffen.


    Yay, es hat funktioniert, allerdings müssen wir ja noch die farben ändern..


    Und hier kommt der Advance Palette Editor (APE) ins Spiel.
    Startet ihn, und öffnet eure ROM.


    Klickt auf "Von Offset laden" und gebt in dem Kästchen das Offset 402264 ein.

    Weil ich so nett war, habe ich euch die Research-Arbeit erspart. :-D


    Nun müsst ihr eure palette von irfanview importieren.
    Das geht, indem ihr auf den Import-Button drückt.
    Jetzt noch ein Klick auf "Ersetzen" und ihr könnt APE schließen!


    Und schon haben wir den Bootscreen erfolgreich gehackt! :3


    Ich hoffe das Mini-Tutorial hat euch geholfen![/b]

    2 Mal editiert, zuletzt von Trikeyyy () aus folgendem Grund: Bilder/Links ausgetauscht die nicht mehr funktionieren. Der Originale Imagehoster hat die meisten Bilder leider schon gelöscht.

  • Wäre ein sehr hilfreiches Tutorial, wenn nicht sowohl in dem Mapping-Ressourcen-Topic als auch hier all deine Links ungültig wären.
    :/


    Schade eigentlich.


    MfG Nortius