• Our software update is now concluded. You will need to reset your password to log in. In order to do this, you will have to click "Log in" in the top right corner and then "Forgot your password?".
  • Welcome to PokéCommunity! Register now and join one of the best fan communities on the 'net to talk Pokémon and more! We are not affiliated with The Pokémon Company or Nintendo.

[Fire Red]: Controlling Legendary Battle Music (Special 0x138)


Glory To Arstotzka
  • 736
    • Seen Jan 28, 2018
    First things first, this only applies to legendary battles created through the use of setwildbattle followed by special 0x138.

    A short health warning before you embark on this tutorial - You have to redefine all species you wish to put through this code, so Mewtwo, Zapdos and Moltres will default to a certain track if you don't put them on the definition list.

    Ever wondered why Moltres, Zapdos and Mewtwo get their own battle music, while every other Pokémon has to have the "normal" battle music?

    More importantly, have you ever wished you could control which Pokémon gets what piece of music played for it?

    If so, then read on!

    First up, some more ASM code to assemble:

    .align 2
    .global battlemusichackleg
    main: push {r2,r3}
    ldr r0, tableloc
    loopstart: ldrh r2, [r0, #0x0]       // Loads the species ID from the current slot of the table
    cmp r1, r2                 // R1 contains the species you are about to battle
    beq loadmusic            // If R1 == R2, then go on to load the music ID
    ldr r3, end                // Loads the delimiter ID to check if the end of the table has been reached
    cmp r2, r3                // Checks if the Loaded species ID is the same as the table delimiter
    beq loadnormal          // If it is, it loads a standard music slot instead (same slot as vanilla FR)
    add r0, #0x4             // Increments the slot ID
    b loopstart                    // Loops back round to the start
    loadnormal: mov r1, #0xAA
    lsl r1, r1, #0x1
    add r1, #0x1                 // R1 will contain 0x155 at this point
    return: pop {r2,r3}
    ldr r0, goback               // Returns to normal execution
    bx r0
    loadmusic: ldrh r1, [r0, #0x2]             // Loads the song ID provided in the table to R1
    b return
    end: .word 0x0000FEFE
    goback: .word 0x0807FA3F
    tableloc: .word 0x08FFFFFF

    Then, navigate to 0x7F9F4 and change the bytes to 01 1C 00 00 00 48 00 47 XX XX XX 08.
    Where the XX's stand for the pointer to the new routine plus 1.

    Finally, you need to add a new table to your ROM, and repoint the tableloc: .word 0x08FFFFFF to it. The table should be arranged as such:

    [Species - Half-Word][Music to Play - Half-Word]

    SO, for example, I wanted Mew to have song 0x129 as its music and Ho-oh to have 0x124 as its music, it would look like:

    97 00 29 01 FA 00 24 01 FE FE 00 00

    The FEFE0000 at the end is necessary to limit the table length. On reading that number, the game will stop searching for new species to get music for.

    The table can be as long or as short as you desire. Just ensure it's correctly aligned and has the FEFE0000 delimiter at the end.


    (☞゚ヮ゚)☞ http://GoGoJJTech.com ☜(゚ヮ゚☜)
  • 2,475
    I've looked into this for a while. Great work as always Jambo, I'm using this!
  • 5
    • Seen Aug 22, 2022
    I know this is an old thread, but I'm trying to implement this script and it freezes when I talk to the npc that initiates the wild battle.
    Any ideas why?