The Hitchhiker's Guide to Items

  • The Hitchhikers Guide to [IMG:http://www.pokewiki.de/images/3/3d/Trank_Traumwelt.png](Für Deutsche Hacker und deren ROMs)

    0Vorwort

    Einen schönen Tag wünsche ich euch, oder für die Nachteulen: Guten Abend. Wenn du das hier ließt hast du dein Handtuch bereits eingepackt und machst dich auf zu einer Reise in die Welt der Items, aus denen ein RPG teilweise besteht. Pokémon ist hierbei keine Ausnahme, von Tränken um sich zu heilen, bis hin zu Hyperraumfahrrädern, die man gemeinsam mit seinen 200 Pokébällen in seinem Rucksack tragen kann gibt es so ziemlich alles, was das Herz begehrt. Was aber, wenn man eigene Items erstellen will? Nun, anscheinend willst DU das, denn DU hast soeben auf diesen Link geklickt, und willst dich mit der Materie der Items befassen.


    「1」 Einleitung
    Du denkst dir womöglich: Ja ist klar, jetzt werden mir gleich 200 ASM Begriffe aufeinmal an den Kopf geworfen, aber ich habe bewusst den Tag "Strukturdaten" gewählt, da die Inhalte dieses Tutorials zwar einen technischen(ASM) Hintergrund haben, ihr aber damit arbeiten könnt ohne jemals ASM gelernt zu haben. Ich werde auch den technischen Hintergrund erklären, sollte es jemanden interessieren, so kann er diese Informationen nachlesen. Ich werde sie entsprechend Kennzeichnen um euch die Suche zu ersparen. Außerdem wird es eine allgemeine Erklärung geben, denn grundsätzlich sind alle Items gleich gebaut und folgen einem System.


    「2」 Vorbereitung
    Wir wollen also Items erstellen? Dies komplett im Hex Editor zu tun wäre zwar möglich, wie alles andere im Romhacking auch, ist aber nicht nötig. Es gibt bereits Tools, die aber bis jetzt nicht für deutsche Roms veröffentlicht wurden. Die Autoren der Tools waren aber so freundlich, Konfigurationsdateien zu erstellen, mit denen es möglich ist diese Tools an deutsche Roms anzupassen. Was brauchen wir aber nun genau?


    • Einen ROM
    • Einen Hexeditor //Sobald Teil 2 fertig ist
    • GBA Item Editor DEU.zip(Mirror )
    • Ein paar Codes, die ich hier posten und erläutern werde(Siehe entsprechender Abschnitt
    • Ini für Feuerrot von ra369(Ist von nun an in den Download integriert und muss nicht nachinstalliert werden)

    Das wäre alles, der Hexeditor ist leider zum einfügen von ASM Code immer nötig, ein Tool wäre hier überflüssig.


    「3」 Die Item Editor GUI
    Wir wollen uns erstmal einen groben Überblick darüber verschaffen, was wir verändern wollen und können, in folgendem Screenshot wird dies anhand eines Smaragd ROMs erklärt:


    Ja, das wäre sie, die GUI des mächtigen Tools, die einzelnen Bereiche erklären sich teilweise von selbst, ich möchte trotzdem alle behandeln.


    「3.1」 Item Auswahl
    Hier wählt man das Item, welches man bearbeiten will, simpel genug um sich weitere Erklärungen zu sparen. Das Item mit Index 0 ist immer leer und ich würde euch empfehlen, dies dabei zu belassen.


    「3.2Name und Preis
    Auch hier wieder relativ leicht erklärt, links der "Item Name", also der, der angezeigt wird wenn man sich das Item in seinem Beutel ansieht und rechts der Preis, den das Item im Laden kostet, sofern man sein Item dort auch zum Verkauf anbieten möchte. Zu beachten ist, dass das einstellen in den Markt kein Teil des Tutorials ist, man sollte also beachten, wenn man beispielsweiße den Trank ersetzt, dass dieser trotzdem noch im Laden verkauft wird, auch wenn er durch eine VM(Beispielsweise) ersetzt wird und auch der Preis des Trankes bleibt, sofern man ihn nicht ändert.


    「3.3Icon
    Dieser bereich dient einzig der Grafik und der Palette des Items. Um ein neues Item einzufügen müsst ihr zuerst eine Grafik samt Palette mit unlz.gba(oder ähnlichem) einfügen. Dies ist kein eigentlicher Teil des Tutorials, hier aber eine Anleitung in wenigen Schritten:

    • Öffne deinen ROM in unlz.gba
    • Importiere dein indiziertes Bild(Größe beachten)
    • Klicke "write to rom" und wähle freihe Stellen für Image und Palette Offset, wähle Export Image und Export Palette.
    • Wähle NICHT "Auto abort if new Data is bigger" und NICHT "Automatically Fix Pointers"
    • Exportiere dein Bild in den ROM und schließe den unlz.gba

    Befolgst du diese Anleitung so kannst du die von dir gewählten Offsets bei "Image Offset und "Plaette Offset" angeben und anschließend den Repoint Button drücken. Um sicher zu gehen solltest du vor dem einfügen mit dem unlz.gba deine Items Speichern(Save) und während des Arbeitsvorgangs im unlz.gba den Item Editor schließen!


    「3.4」Index
    Hier siehst du den Index deines Items, diesen verwendest du unter anderem mit dem "giveitem" Befehl wenn du dein Item in Scripts verwendest. In diesem Programm wird der Index NICHT in Hexadezimaler Form dargestellt, sondern im normalen Dezimalsystem. Unter XSE könntest du den Timerball aus dem Beispiel wie folgt verwenden: "giveitem 10 2 2", oder "giveitem 0xA 0x2 0x2".


    「3.5Übergabepararmeter
    Ein sehr wichtiger Aspekt der Items, hier werden gewissen Items Attribute übergeben, vergleichbar mit den Pararmetern bei XSE. In XSE hat zum Beispiel der "givepokemon" Befehl 3 wesentliche Pararmeter, nämlich das Pokémon, sein Level und das getragene Item. Hier im Item Editor sind diese Pararmeter die Special Values und die Attacke. Special Values verwendet unter anderem der Trank, genau wie andere Heil Items. Der Trank hat als Special Values 00 20, was dafür sorgt, dass er uns 20 KP auffrischt. Der Supertrank hingegen hat 00 50 und der Hypertrank 00 200. Wollen wir die maximale Anzahl an KP auffrischen(Siehe TOP-Trank oder TOP-Genesung), so verwenden wir die Werte 00 255. Mit diesen Werten könnt ihr euch spielen.
    Die Attacke ist wichtig bei TM's, sie gibt an welche Attacke ein Pokémon lernen soll, wenn eine TM eingesetzt wird, selbiges gilt für VM's. Es ist so also möglich auch komplett neue TM's zu erstellen, wie ich später in einem Beispiel zeigen werde(Auch VM's lassen sich erstellen, allerdings sind die Attacken dann nicht zwagsläufig an Orden gebunden oder außerhalb des Kampfes verwendbar, die so erstellten Items lassen sich aber öfter einsetzen, als nur einmal)



    「3.6」Beschreibung
    Die Beschreibung(Description) wird einfach nur im Beutel angezeigt, wenn ihr ein neues Item erstellt ist es natürlich ein muss diese zu ändern. Achtung: Es können immer nur soviele Zeichen verwendet werden wie die alte Beschreibung hat, solange ihr sie nicht repointet. Dazu einfach das neue Offset(Mit genügend Platz) angeben und auf repoint klicken.


    「3.7」Tasche
    Hier wieder etwas mehr als unter 3.6! Ihr könnt angeben in welcher Tasche euer Item landen soll, und wie es verwendet werden soll. Erstmal entscheidet ihr euch für eine Tasche, der Timerball landet natürlich bei den anderen Pokébällen. Danach die uninteressanten Mystery Werte(Warscheinlich sind sie interessant, allerdings weiß ich nicht wofür sie gut sind, sollte dazu jemand Infos haben, nur raus damit), die wir außen vor lassen und das "Battle Usage"(Kampfbenutzung) Byte, welches entscheidet wie unser Item im Kampf eingesetzt werden soll, dazu eine kleine aber feine Liste:


    • 0: Das Item kann nicht im Kampf eingesetzt werden
    • 1: Das Item kann im Kampf eingesetzt werden, ist aber kein Ball(e.g.: Trank, Feuerheiler, ...)
    • 2: Das Item ist ein Pokéball.

    Eigentlich ganz simpel wie ich finde :)


    「3.8Das Item einsetzen
    So, wir haben uns zwar angesehen, das gewisse Items Pararmeter brauchen, und auch wofür diese gut sind, aber woher weiß mein Item, dass es ein Trank ist? Oder wie es sich verhalten muss, wenn ich es einsetzen will? Nun, dafür gibt es den letzten, meiner Meinung nach wichtigsten Bereich des Editors: Der Usage(Benutzungs) Bereich. Hier gibt es zwei Offsets, einmal das Field Usage Offset(Benutzung am "Feld") und dann das Battle Usage Offeset(Benutzung im Kampf). Was bringen uns diese beiden Offsets? Nun, eigentlich müsste ich ab hier einen ASM Teil beginnen, da beide Offsets ASM Routinen anspringen und diese einfach ausführen sobald das Item in der entsprechenden Situation eingesetzt wird. Okay, ich habe aber versprochen nicht zu weit ins technische zu gehen, für diejenigen die es nicht wissen wollen, auch wenn es nicht schadet, sich sowas anzuschauen. Das heißt was machen wir mit den beiden Werten? Ich habe versucht das ganze für euch so zu vereinfachen, dass ihr die Items nicht mit ASM, sondern mit XSE oder einem anderen Scripteditor scripten könnt. Wer sich mit ASM auskennt, der sollte sich folgendes ansehen:



    Okay, soviel dazu. Wie ihr Items in XSE schreiben könnt erkläre ich in einem späteren Teil, da dies einige Vorbereitung von nöten hat.


    「3.8.1Spezielle Offsets von Gamefreak
    Es gibt natürlich auch die Möglichkeit vorhandene Codes zu verwenden, einige sind hier aufgelistet:


    TODO: Weitere Editionen nachtragen, diese könnt ihr euch aber auch selbst suchen, da das ganze relativ selbsterklärend ist :)


    4」 Custom Items über Scripts
    Auf die nächste Seite gerückt :)


    5」 Nachwort
    Gut, da wir dies nun hinter uns haben wird es Zeit ein paar Unwarscheinlichkeitsfaktoren zu berechnen um uns letztlich an unser Ziel, neuen Items zu bringen, alle Faktoren der Unwarscheinlichen Hyperfunktion habt ihr hier gegeben, worauf wartet ihr also noch, und vergesst dabei nie: Die Antwort lautet stehts 42, wichtig ist es nur, die Frage zu kennen und sie richtig zu stellen. Solltet ihr Probleme mit dem Verständnis haben biete ich euch einen Handelsüblichen Babelfisch, der für euch die Übersetzung übernimmt.(Ihr könnt mir aber auch eine PN schreiben oder wichtige Fragen hier posten) Und damit verabschiede ich mich von euch, ach nein, es gibt noch Leute, bei denen ich mich bedanken muss.


    6Special Thanks
    Jaja, es gibt einige Leute, denen ich hier und jetzt danken möchte, zum einen wären das Leute die maßgeblich geholfen haben das hier zu verwirklichen, danke an:


    Dragonflye, für die Offsets der deutschen Editionen und das kompatible Programm und dafür, dass er meine SkillZ aufgefrischt hat mit dem SOTS Projekt
    ra369, für die Feuerrot Offsets
    JPAN, für sein Dokument zu den Items
    Mastermind X, für "The Hitchhiker's Guide To Scripting" und die Scripthandler Offsets der Firered Version sowie den Titel des Tutorials
    Douglas Adams, für den Titel des Tutorials und die Antwort
    Dich, dafür, dass du bis jetzt gelesen und hoffentlich etwas gelernt hast.


    Let the old ways live and prosper in the hearts of our young


    Einmal editiert, zuletzt von Sturmvogel () aus folgendem Grund: -Farben aktualisiert, Screenshot aktualisiert -Namen aktualisiert -Überschriften aktualisiert -Feuerrot ini hinzugefügt und in die zip integriert

  • 4」 Custom Items über Scripts
    Wie versprochen trage ich nun diesen Teil nach. Zu Anfang sei gesagt: Das ganze ist etwas komplizierter und wer vor dem Hexeditor Angst hat, der sollte hier lieber aufhören zu lesen, denn ansonsten wird er bald von ihm gefressen werden(oder so ähnlich). Da das Spiel normalerweiße keine Items als Scripts ausführen kann muss zuerst der Beutel geschlossen werden und danach der Script dem Scripthandler übergeben werden, damit der alles weitere für uns erledigen kann. Nun, es gibt eine Engine für Pokémon Firered (US) welche genau das bereits bietet: Die JPAN Engine. JPAN war so nett und hat Teile seines Codes von dort veröffentlicht, was die ganze Sache etwas erleichtert. Diese Codes habe ich bereits ein wenig adaptiert, sodass sie für die deutsche Version von Pokémon Feuerrot verwendbar sind, leider aber nicht für Smaragd(Mal sehen, vielleicht lässt sich da noch was machen)
    Auch ist zu beachten: Es ist zwar möglich Items vom Beutel heraus zu starten, aber nicht aus dem Select Menü, denn da stürzt das Spiel ab. Sollte man solche Items erstellen wollen, kann man diese wie gewohnt in ASM schreiben.
    So, nach dieser kurzen Erläuterug wollen wir uns an's Werk machen:


    「4.1」 Voraussetzungen
    Zuerst brauchen wir die kompilierten ASM Codes für die deutsche Version von Feuerrot:

    • executeRaw.bin Diese Routine wird später unsere Scripts ausführen
    • key_map_force.bin Diese Routine wird als Script zwischen allen Script Ausführungen stehen, da sie u.A. den Beutel für uns schließt.
    • keyFix.bin Dieser Bypass erlaubt es uns in das Key Management des Spiels einzugreifen und so Tastenanschläge an das Spiel zu senden.

    Diese speichern wir uns am besten alle in ein Verzeichnis, sodass wir sie später finden können.


    「4.2Alles nur Routine
    Nun da wir die Codes haben öffnen wir unseren ROM im Hexeditor, gemeinsam mit allen heruntergeladenen Dateien. Für executeRaw.bin und key_map_force.bin müssen wir einfach den Inhalt der .bin Datei an eine freihe Stelle im ROM kopieren. Gebt darauf acht, dass ihr nicht die Größe des ROMs ändert, was passieren kann wenn man nicht genau soviele Bytes markiert wie man mit STRG + V einfügen will.
    Für keyFix.bin müssen wir einen ASM Bypass erstellen. Zuerst fügen wir auch diese Datei an eine beliebige freihe Stelle im ROM ein. Im Hex Editor navigieren wir nun zu 0x5FC, einem sehr wichtigen Codeabschnitt des Spiels, wer hier etwas falsches treibt oder nicht weiß, was er tut kann sich sein Spiel ratz fatz crashen. Den Wert an 0x5FC überschreiben wir mit 0x00 0x47, danach geht es weiter zu 0x634, dort steht ein Pointer auf die Key Hardware, den überschreiben wir mit einem Pointer zu unserer keyFix.bin Routine (+1), die wir vorher eingefügt haben. Nun ist unser byPass erstellt, so sieht die Stelle bei mir aus:



    Nun müssen wir noch folgendes Script in unseren ROM schreiben:


    Code
    1. copyvar 0x8012 0x8004
    2. copyvar 0x8013 0x8005
    3. setvar 0x8004 0x2
    4. setvar 0x8005 0x7
    5. pause 0x16
    6. callasm 0xOFFSET VON KEY_MAP_FORCE.bin + 1
    7. pause 0x1
    8. copyvar 0x8004 0x8012
    9. copyvar 0x8005 0x8013
    10. goto 0x203F3EB


    Nun suchen wir nach dem Pointer 0xDE 0xC0 0xAD 0xDE(DEADC0DE) welcher sich im executeRaw.bin Code befindet. Diesen ersetzen wir durch einen Pointer auf unseren Script. Das wird später dafür sorgen, dass das Spiel Beutel und Menü schließt, was für die Ausführung des Scripts unerlässlich ist.


    Gut, nun ist alles vorbereitet, wir können nun Scripts über Items ausführen.


    「4.3」 Das eigentliche Item
    Wir öffnen wieder unseren Item Editor und erstellen uns ein Item, so wie wir es in den vorherigen Abschnitten gelernt haben, allerdings setzen wir unseren Field Usage Pointer auf das Offset, an das wir executeRaw.bin geschrieben haben + 1. Beispiel: Ich schreibe executeRaw.bin an 0x803000, mein Field Usage Pointer muss 0x803001 lauten, da executeRaw.bin als Thumb ausgeführt werden soll. Nun müssen wir dem Item noch irgendwie den Script übergeben. Nun es gibt eine Lücke in den Item Daten, dh.: Ein Pointer der vom Spiel nicht verwendet wird, dort schreiben wir den Pointer zu unserem Script hinein, im Hex Editor. Um zu diesem Pointer zu gelangen nehmen wir ihn uns ausrechnen, und zwar so: 4039960 + (ITEM_INDEX * 44) + 40, daraus erhalten wir das Offset in Dezimal, wir können es nun mit dem Windows Taschenrechner oder mit einem Gerät eurer Wahl(gerne auch im Kopf) in das Hexadezimalsystem umrechnen und mit dem Hex Editor dorthin navigieren. Wir schreiben dorthin jetzt den Pointer auf ein Script welches wir in XSE erstellt haben, es sollte eigentlich so gut wie alles funktionieren, u.A. auch Warps, specials, ... Seit also so kreativ wie ihr sein wollt :)


    「4.4」 Credits

    • JPAN für die Hauptarbeit der Routinen und seine Veröffentlichung
    • Sturmvogel für die deutschen Offsets und einige Adaptionen der Codes

    「4.5」 Changelog
    27.03.2013: Fehlerkorrektur, essentieller Schritt beim hinzufügen der Routinen eingefügt


    Let the old ways live and prosper in the hearts of our young


  • das tut ist gut genau das was ich brauche aber kanste das sch.... grelle gelb austauschen








    nächster tag: bitte ich weis das ist nur ein kleines detail aber mach das gelb doch bitte etwas matter


    @unten ok tut mir leid wen ich ein wenig gespamt habe

    Zitat von Casper


    "...Man sagt am Ende wird alles gut.
    Und wenn es nicht gut ist, kann es auch nicht das Ende sein.
    Am Ende wird alles gut und ist es nicht gut, ist es verdammt nochmal nicht das Ende - NEIN"

    2 Mal editiert, zuletzt von madlukas971 ()

  • nächster tag: bitte ich weis das ist nur ein kleines detail aber mach das gelb doch bitte etwas matter

    Davon abgesehen, dass Weihnachten ist: Die Farbe wird dich wohl nicht töten, auch wenn es den Lesefluss stört, falls du es garnicht lesen kannst markiere es doch, sind nur zwei Überschriften...
    Ich habe es mir notiert und werde es beim nächsten Update beheben, sind ja nicht nur die Überschriften sondern auch die Farbe im Screenshot, die zu ändern sind, wäre es nur das hätte ich es getan.
    Gfe : Schön, dass es dir gefällt.


    ~Sturmvogel


    Let the old ways live and prosper in the hearts of our young


  • Dem Offsets müssen wegen der Thumb Architektur 1 dazuaddiert werden, dein Pointer wäre dann 0x0B 0x00 0x80 0x08, dass du einen whitescreen bekommst zeigt aber, dass es die richtige Stelle ist, denn diese Routine wird bereits beim Start ausgeführt :)


    ~Sturmvogel


    Edit: Außerdem ist der Befehl oben nicht 48 00 sondern 00 47(bx r0) :) Du hast wohl die falschen Bytes markiert, es aber grundsätzlich richtig eingetragen </verwirrung>


    Let the old ways live and prosper in the hearts of our young


  • Da stellen sich mir schlagartig einige Fragen:


    1. Wie müssten die Mysterybytes aussehen? AtkID Byteverkehrt, sprich für pfund 00 00?
    2. Ob eine TM/VM Pokemon-kompatibel ist, entscheidet ein Bit in der Datastructure, jedoch existieren doch nur 58 von ihnen, die vom Spiel überprüft werden, nicht wahr? Wie also kann ich den Code so umprogrammieren, dass er mir da mehr BITS zur Verfügung stellt, so in etwa 64, wären 8 Bytes...

  • Code
    1. copyvar 0x8012 0x8004
    2. copyvar 0x8013 0x8005
    3. setvar 0x8004 0x2
    4. setvar 0x8005 0x7
    5. pause 0x16
    6. special 0xOFFSET VON KEY_MAP_FORCE.bin + 1
    7. pause 0x1
    8. copyvar 0x8004 0x8012
    9. copyvar 0x8005 0x8013
    10. goto 0x203F3EB


    Wie kann man Special 0xOffset machen. Ich dachte special hat ein Hword als param.

  • Da der thread eh reaktiviert worden ist, mal die Frage wie man völlig neue Itemeffekte erzeugen kann, die nicht vorhanden sind. Als besipiel nehme man sich das Item "Luftballon" das verhindert, das der Träger von Bodenattacken getroffen wird und bei einem Treffer zerplatzt.


    Wie geht das :D?

  • Solche "Wenn das Item getragen wird" Items werden während des Kampfes überprüft und dann ggf. zerstört, deaktiviert, ... Das liegt nicht in der Macht der Item Struktur und ist versteckt in irgendwelchen Routinen, die keiner speziellen Scriptsprache folgen. Der einzige Weg dort neue Items reinzubekommen wäre die entsprechenden Stellen aufzuhacken, diese müsste man natürlich erst finden.


    ~Sturmvogel


    Let the old ways live and prosper in the hearts of our young