[Pokémon Feurrote Edition] Bestimmbare Trainerbattle-Musik

  • Hallo Leute,



    mein neustes ASM Snippet ermöglicht es euch, in Kämpfen eine bestimmte Musik als Kampfmusik auszulösen. Zuerst einmal implementiere ich das Ganze so, dass man es über eine Variable ansteuern kann. Das läuft dann so: Wenn die Variable nicht auf 0x0 gesetzt ist, wird anstatt der normalen Trainerbattle-Musik die Musik, die in der Variable gespeichert ist, abgespielt.
    Ein Beispiel: Die Variable hat den Inhalt 0x120. Dann wird beim nächsten Kampf die Musik 0x120 abgespielt, während die Variable sich wieder auf 0x0 zurücksetzt.

    1. Einfügen des Variablen-Triggers


    Um das zu erreichen fügt ihr die sich im Anhang befindende setMusic.bin an einem 4-alingeden Offset (es muss auf 0,4,8 oder C enden) ein. In der binary-File findet ihr am Offset 0x2C den Hex-String [00 80 00 00], als Wert -> 0x00008000. Dieser Wert stellt die Variable dar, die das ganze auslöst. Ihr könnt sie auf einem beliebige andere abändern. Das Offset, an dem ihr setMusic.bin eingefügt habt, bezeichne ich fortan als setBattleMusic.


    Ihr geht jetzt zum Offset 0x719DA und ändert das dort befindliche [08 80] in ein [08 47] um. Dann geht ihr zum Offset 0x719EC und ändert die dort befindlichen 4 Bytes zu einem Pointer auf setBattleMusic+1.



    Nun haben wir schon einmal die Möglichkeit per Variable eine bestimmte Trainerbattle-Musik zu triggern, sprich wir können z.B. ein einem Script die gewählte Variable auf einen Wert setzten und haben dann eine Musik, die abgespielt wird. Weiter geht es damit, dass wir die Variable automatisch per Trainerklasse auf einen Wert setzten.


    2. Einfügen der Klassentabelle


    Ihr nehmt euch also die beigelegte TrainerclassBypass.bin zur Hand und fügt sie wieder an einem 4-aligndem Offset ein. Dieses Offset bezeichne ich fortan als TrainerclassBypass. Dann nehmt ihr euch die Datei bx_r1.bin zur Hand. Ihr navigiert zum Offset 0x43f14 und fügt die 8 Bytes ein. Unter diesen 8 Byte befindet sich an 0x4 [FE FE EF FE] und ersetzt diese 4 Bytes mit dem Pointer auf TrainerclassBypass+1.


    Weiter geht es, indem ihr zum zu TrainerclassBypass navigiert. An 0x4C findet ihr wieder [00 80 00 00], als Wert -> 0x00008000. Dieser Wert stellt die Variable dar, in welche die abzuspielende Musik geschrieben wird. Ihr könnt diesen Wert wieder ändern. Damit alles funtkioniert solltet ihr logischerweise die Variable nehmen, die Trainerbattlemusik triggert, also die von oben.


    Im nächsten Schritt erstellen wir die sog. Klassentabelle, in der wir bestimmten Trainerklassen eine Musik zuweisen können. Ein Eintrag in dieser Tabelle hat 0x4 Bytes und sieht wie folgt aus. [Hword: Klassen-ID] [Hword: Musik]. Wollen wir also, dass die Trainerklasse 0x4 eine eigene Musik, z.B. 0x12A bekommt, so fertigen wir einen Eintrag an, der wie folgt aussieht:


    Code
    1. 04 00 2A 01


    Ihr könnt belieb viele Einträge hintereinander einfügen und müsst dabei nicht auf eine bestimmte Reihenfolge achten. Sprich ihr könnt zuerst eine Musik für Trainerklasse 0x20 definieren, dann eine für 0x4. Wichtig ist jedoch, dass ihr das Ende der Tabelle mit einem [ FF FF ] kennzeichnet. Das Offset an dem ihr diese Tabelle erstellt habt bezeichne ich als table.


    Ihr geht jetzt wieder nach TrainerclassBypass an die Stelle 0x44: Dort findet ihr folgenden String vor: [FE FE FE FE]. Ihr ersetzt diesen String durch einen Pointer auf table.



    3. Schlusswort


    Habt ihr alles richtig gemacht, könnt ihr Kampfmusiken (das funtkioniert übrigends auch für Wildbattles) jetzt sowohl über Variablen, als auch per Trainerklasse triggern. Ich hoffe, dass alles recht klar und einfach erklärt wurde, bei Fragen und Anregungen könnt ihr gerne hier antworten.

  • Ist ja mal Nice,


    Würde mich nur Interessieren ob es möglich ist das die var sich nicht jedes mal resettet.!

    ------------------------------------------------------------------------------------
    ~ ~ ~ SoulK3 ~ ~ ~


    :thumbsup: Wer Rechtschreibfehler findet darf sie gerne Behalten :thumbsup:


    Drei Menschen können ein Geheimnis bewahren.
    Wenn Zwei von ihnen Tot sind.
    :evil:
    ------------------------------------------------------------------------------------

  • Ist sogar ganz leicht, aber dann resettet sie sich nie, und nach dem Kampf wird ebenfalls nocheinmal die Kampfmusik getriggert (also für die Map-Overworld). Solltest du das trotzdem wollen ersetzt du in der setBattleMusic.bin an der Stelle 0x16 das [02 80] mit [00 00]. Aber wiegesagt. Nach einem Kampf wird dann für die Map die gleiche Musik nochmal getriggerd, was mmn keinen Sinn macht.

  • okay, so sinn macht das nicht aber ist bestimmt an manchen stellen ganz nützlich wenn man daran denkt die var zurück zusetzten ^^

    ------------------------------------------------------------------------------------
    ~ ~ ~ SoulK3 ~ ~ ~


    :thumbsup: Wer Rechtschreibfehler findet darf sie gerne Behalten :thumbsup:


    Drei Menschen können ein Geheimnis bewahren.
    Wenn Zwei von ihnen Tot sind.
    :evil:
    ------------------------------------------------------------------------------------

  • Wäre vielleicht noch sinnvoll hinzuschreiben, um welches Spiel/Sprache es sich überhaupt handelt (obwohl ich jetzt mal BPRD impliziere).

    Du möchtest mich mal treffen? Dann sag hallo und besuche mich an der FAU in Erlangen.