The PokéCommunity Forums  

Go Back   The PokéCommunity Forums > Creative Discussions > Emulation & ROM Hacking > Tutorials
Register New Account FAQ/Rules Chat Blogs Mark Forums Read

Notices

Tutorials Looking for a guide to help you out? Then you're in the right place! We've got everything you need, ranging from Mapping to Music!
New threads in this forum are to be approved by a moderator before they are displayed. The thread revival limit does not apply here.



Reply
Thread Tools
  #1  
Unread December 30th, 2012, 03:08 PM
Jambo51's Avatar
Jambo51
...
 
Join Date: Jun 2009
Location: Livingston, Scotland
Gender: Male
Nature: Quiet
Hey there, Jambo51 here with another ASM/Hex editing combination tutorial.

In Fire Red, you will surely have noticed, that apart from a few specific classes (Champion, Leader and Elite 4) there is absolutely no class based music for the trainer battles. Generally speaking, that is fine, since you don't want the average Youngsters etc to have special battle music, but what about Team Rocket? Shouldn't they have a special battle theme?

What?!

You can't do that with Fire Red?!

I beg to differ! Follow this tutorial, and we'll have class based music in no time!

So, firstly, assemble and insert this routine, and note down the location of your insert.

Code:
.text
.align 2
.thumb
.thumb_func
.global battlemusichack

main:
	ldr r0, there // This is the battle bits RAM Address. Defines what type of battle it is. Obviously extremely relevant here.
	ldr r1, [r0, #0x0] // Loads the actual bits into R1
	mov r0, #0x80
	lsl r0, r0, #0x5 // Puts the value of (I believe) Link battles into r0
	and r0, r1 // Checks if the battle type is a Link battle
	cmp r0, #0x0 // If the Link battle Bit is set, branch to laber "later"
	bne later
	mov r0, #0x80 // Similar to above, but with different bits
	lsl r0, r0, #0x7
	and r0, r1
	cmp r0, #0x0
	bne later2
	mov r0, #0x2 // Similar to above, with, again, different bits
	and r0, r1
	cmp r0, #0x0
	beq one
later2:	mov r0, #0x85
	lsl r0, r0, #0x1 // Puts 0x10A into R0
	b end
one:	mov r0, #0x8 // Checks if the battle is a TrainerBattle
	and r1, r0
	cmp r1, #0x0
	beq wild
	ldr r2, table // From here
	ldr r2, [r2, #0x0]
	ldr r0, ramoffset
	ldrh r1, [r0, #0x0]
	lsl r0, r1, #0x2
	add r0, r0, r1
	lsl r0, r0, #0x3
	add r0, r0, r2
	ldrb r0, [r0, #0x1] // to here calculates the trainer's trainer Class
	cmp r0, #0x54
	beq gym
        cmp r0, #0x57 // Note, this is the elite 4 class. You can point it to custom music by either removing this check and then including this class on the class table later OR work it into the regional music by defining an extra entry in the regional set. That's actually quite easy.
        beq gym
        cmp r0, #0x5A
        beq champ
normal:	push {r2,r3}
	ldr r3, terminate // loads the terminating string into R3
	ldr r1, classtable // loads teh location of the custom class table into R1
loop:	ldrh r2, [r1, #0x0] // loads the class at R1 into R2 (note, this location changes as the routine loops)
	cmp r2, r0 // compares to see if the trainer's class equals the class from teh table
	beq loadmusic
	cmp r2, r3 // checks to see if the end of the table has been reached
	beq carryon
	add r1, #0x4 // Increments the entry ID on the table and loops
	b loop
carryon:	mov r0, #0x2 // A byte to signify the routine should load the standard trainerbattle music for the region you are in
	pop {r2,r3}
	b return
loadmusic:	ldrh r0, [r1, #0x2] // loads the actual class music
	pop {r2,r3}
	b return2
wild:	ldr r0, there // checking the battle bits again
	ldr r0, [r0, #0x0]
	mov r1, #0x1 // checks if the wild battle is a double wild battle. allows you to define different music for double wild battles a la BW
	and r0, r1
	cmp r0, #0x0
	bne alternate
	mov r0, #0x0 // Signifies that the loading routine should load the normal wild battle music
	b return
alternate:	mov r0, #0x1 // Signifies that the loading routine should load the double wild battle music
	b return
gym:	mov r0, #0x3 // Signifies that the loading routine should load the gym battle music
	b return
champ:	mov r0, #0x4 // signifies that the loading routine should load the champion battle music
return:	push {r2-r7}
	mov r11, r0 // stores the battle music type in a high register so we can keep it for after the variable decryption
	ldr r0, variable
	bl vardecrypt
	ldrh r0, [r0, #0x0] // gets a variable location and loads its value into R0
	mov r1, #0xA // The length of each regional section is (Number of tracks * 2) since each track ID is 2 bytes in length. There are 5 tracks (0-4), so 5 * 2 = 10 (0xA)
	mul r0, r1 // Multiplies the number of tracks per region by the selected region
	ldr r1, normaltable // Loads another custom table with the definitions for the regional music
	add r0, r0, r1 // Jumps to the correct "set" of regional music
	mov r1, r11 // Shifts the music type back into a low register
	lsl r1, r1, #0x1 // Multiplies the music type by 2
        add r0, r0, r1 // Jumps to the correct music type inside the music set
	ldrh r0, [r0, #0x0] // Loads the actual music slot to use
	mov r1, #0x0 // Clears R11 for potential later use
	mov r11, r1
	pop {r2-r7}
return2:	pop {r1}
	bx r1
vardecrypt:	ldr r1, vardec
	bx r1
.align
table:		.word 0x08044028
there:		.word 0x02022B4C
ramoffset:	.word 0x020386AE
terminate:	.word 0x0000FEFE
classtable:	.word 0x08FDFDFD
normaltable:	.word 0x08FEFEFE
vardec:		.word 0x0806E455
variable:	.word 0x000040F6
Now, navigate to 0x43FF2 and change the code to 01 48 00 47 00 00 XX XX XX 08, where the XX's stand for your reversed pointer to the ASM you just inserted, plus 1 for THUMB mode, of course.

Now, we're still not done, of course, so return to the location of the inserted ASM.

Now, we must create a table which contains definitions for the class based music. This allows you to define as many EXTRA classes as you want, but you CANNOT change the music assigned to the Champion/Elite 4/Gym Leaders using this.

So, in some aligned free space, create a table in this format:

[Trainer Class - Byte][00 - Byte][Song to play - Half-Word]

So, for example, I wanted the Team Rocket class to have track 0x130, I would put the following set of bytes into the table:

Code:
55 00 30 01
You must do this for every class you wish to have custom music.

When you're done with this, place:

FE FE 00 00 at the end of the table, so in my example, it would be:

Code:
55 00 30 01 FE FE 00 00
Easy, huh? Note down the location of this table and navigate to The ASM's insert location + 0xC0. Change the pointer here (should be FD FD FD 08) to point to the table you just created, NOT plus one.

Now, for anyone who knows ASM, or is eagle eyed, you will have noticed it also contains a variable check. This variable check allows you to have regional music!

Now, to create a set of regional music, navigate to some aligned free space, and start by putting the following set of values in:

Code:
2A 01 54 01 29 01 28 01 2B 01
You may recognise these as the existing battle theme track numbers. If you don't intend to use regional music, you can move on from here straight to the changing the pointer later on.

However, if you want regional music, you should follow the existing values with this format:

[Wild Battle Track - Half-Word][Double Wild Battle Track - Half-Word][Trainer Battle Track - Half-Word][Gym Battle Track - Half-Word][Champion Battle Track - Half-Word]

If you want any tracks to use the same values as their "normal" versions, you must set them to the same value. Eg, I want tracks 0x10A (wild), 0x140 (double wild), 0x109 (trainer), 0x154 (gym) but want to keep the Champion battle as 0x12B, then I would add the following values:

Code:
0A 01 40 01 09 01 54 01 2B 01
When you're done adding new values, note down the start location of this table, and then navigate to the start of the ASM + 0xC4. The pointer here should be FE FE FE 08. Now you must change it to point to the new regional table you just created.

Once you have done this, you are done!

In terms of in game use, you don't have to do anything to get the class based music, it will immediately start working. For the regional music, you must set variable number 0x40F6 to the set of regional music you want to use.

That is, for the "normal" set, set the variable to 0, and for any additional sets, set it to the correct number to pick that set. Everything else is handled in the background.
__________________

Last edited by Jambo51; March 25th, 2013 at 11:06 AM.
Reply With Quote
  #2  
Unread December 31st, 2012, 12:12 AM
tajaros's Avatar
tajaros
Hi I'm dawg
 
Join Date: Apr 2012
Location: Philippines
Age: 14
Gender: Male
Nature: Timid
Send a message via Windows Live Messenger to tajaros
This is great Jambo it would be really cool to have a specific music for a trainer class... :3

I'm gonna try this out for my hack thanks for sharing this :)
__________________
Reply With Quote
  #3  
Unread December 31st, 2012, 07:32 AM
SchokoInc
Unhatched Egg
 
Join Date: Nov 2012
Awesome thanks :) Great tutorial :)
But somehow it causes the title screen to freeze and also the begin of every battle :(

This is what i did:
I assembled your routine and inserted it at offset 0x800000
(code:
Spoiler:
2C 48 01 68 80 20 40 01 08 40 00 28 FE D1 80 20 C0 01 08 40 00 28 03 D1 02 20 08 40 00 28 02 D0 85 20 40 00 FE E7 08 20 01 40 00 29 1E D0 20 4A 12 68 21 48 01 88 88 00 40 18 C0 00 80 18 40 78 54 28 1D D0 57 28 1B D0 5A 28 1B D0 0C B4 1B 4B 1B 49 0A 88 82 42 06 D0 9A 42 01 D0 04 31 F8 E7 02 20 0C BC 0F E0 48 88 0C BC 1C E0 11 48 00 68 01 21 08 40 00 28 01 D1 00 20 04 E0 01 20 02 E0 03 20 00 E0 04 20 FC B4 83 46 10 48 00 F0 0D F8 00 88 0A 21 48 43 0B 49 40 18 59 46 40 18 00 88 00 21 8B 46 FC BC 02 BC 08 47 07 49 08 47 C0 46 28 40 04 08 4C 2B 02 02 AE 86 03 02 FE FE 00 00 D0 00 08 08 FE FE FE 08 55 E4 06 08 F 640 00 00

(D0 00 08 08 is the pointer to the table at 0x8000D0)


Then i replaced offset 0x043FF2 with 01 48 00 47 00 00 01 00 80 08

And finally i added 55 00 0A 01 FE FE 00 00 at offset 0x8000D0 which should make the hoenn-trainer-battle music play when I'd fight rocket grunts :)

Do you know what went wrong? :)
Reply With Quote
  #4  
Unread December 31st, 2012, 01:49 PM
Jambo51's Avatar
Jambo51
...
 
Join Date: Jun 2009
Location: Livingston, Scotland
Gender: Male
Nature: Quiet
You've not set up the regional part of the hack. Even of you don't intend to use the regional music, you must still set up the "normal" set of music. You also screwed up your pointer to the class music, it points to 0x800D0 instead of 0x8000D0, like it should.
__________________
Reply With Quote
  #5  
Unread December 31st, 2012, 09:09 PM
SchokoInc
Unhatched Egg
 
Join Date: Nov 2012
Oh thanks i didn't get i had to do that too even if i don't use it :< (the FEFEFE08 bytes still confused me :o ) but even with the pointers changed to D0 00 80 08 and 00 01 80 08 and
0A 01 40 01 09 01 54 01 2B 01 inserted at 0x800100 the game still freezes right at the intro :< (not even the game-freak-logo anymore :o ) while it already plays the screen-fading before a battle and freezes afterwards and not before :) Oh and a-map can't open any maps in the rom anymore :O Sorry for bothering again :(
Reply With Quote
  #6  
Unread December 31st, 2012, 09:48 PM
Jambo51's Avatar
Jambo51
...
 
Join Date: Jun 2009
Location: Livingston, Scotland
Gender: Male
Nature: Quiet
Quote:
Originally Posted by SchokoInc View Post
Oh thanks i didn't get i had to do that too even if i don't use it :< (the FEFEFE08 bytes still confused me :o ) but even with the pointers changed to D0 00 80 08 and 00 01 80 08 and
0A 01 40 01 09 01 54 01 2B 01 inserted at 0x800100 the game still freezes right at the intro :< (not even the game-freak-logo anymore :o ) while it already plays the screen-fading before a battle and freezes afterwards and not before Oh and a-map can't open any maps in the rom anymore :O Sorry for bothering again
I don't know what the second half of that post actually means, as to the title screen freezing (or earlier) that could only happen if there's some sort of conflict with another existing hack, or if you screwed up somewhere, since this is the same code that runs in LC (and runs fine, I may add).
__________________
Reply With Quote
  #7  
Unread January 1st, 2013, 07:20 PM
FrozenInfernoZX's Avatar
FrozenInfernoZX
Legendary Trainer ZX
 
Join Date: Jun 2012
Location: United States
Gender: Male
Nature: Adamant
Awesome. Since I'll be having two regions in my hack. Regional music would great!
__________________



Pokémon Normal Version: Elemental Division
A new journey awaits in the Seijo and Taejo Region.
And in the end, there was only whiteness...


Pokémon Normal (Beta 1) is now released

Reply With Quote
  #8  
Unread January 1st, 2013, 10:00 PM
PokemonMasters's Avatar
PokemonMasters
Always Remember Forever&After
 
Join Date: Jun 2012
Location: Nuvema Town, Unova
Gender: Male
Nature: Calm
Oh wow, this is cool. This will really be helpful. Thanks for sharing Jambo! :D
__________________

+ForeverDash on PC's Battle Server | Pair | VM/PM |Partner In Crime
Reply With Quote
  #9  
Unread January 5th, 2013, 09:25 PM
bwburke94's Avatar
bwburke94
2013: A new beginning. 000/649
 
Join Date: Mar 2010
Location: Massachusetts
Age: 18
Gender: Male
Nature: Relaxed
Since double wild battles aren't coded into the hack I'm making, should I set that half-word to the wild battle track?
__________________
YouTube | Twitter | Facebook | ??? (Coming soon!)

Just because I have Asperger's, people think I'm stupid. I'm not. I'm just a little crazy sometimes.

My romhacks and Essentials games are on hold due to work reasons.
Reply With Quote
  #10  
Unread January 5th, 2013, 11:57 PM
Jambo51's Avatar
Jambo51
...
 
Join Date: Jun 2009
Location: Livingston, Scotland
Gender: Male
Nature: Quiet
Quote:
Originally Posted by bwburke94 View Post
Since double wild battles aren't coded into the hack I'm making, should I set that half-word to the wild battle track?
You can set it to whatever you like.
__________________
Reply With Quote
  #11  
Unread January 6th, 2013, 06:35 AM
bwburke94's Avatar
bwburke94
2013: A new beginning. 000/649
 
Join Date: Mar 2010
Location: Massachusetts
Age: 18
Gender: Male
Nature: Relaxed
Quote:
Originally Posted by Jambo51 View Post
You can set it to whatever you like.
OK, that's good to know. I'll use the wild battle music just in case.
__________________
YouTube | Twitter | Facebook | ??? (Coming soon!)

Just because I have Asperger's, people think I'm stupid. I'm not. I'm just a little crazy sometimes.

My romhacks and Essentials games are on hold due to work reasons.
Reply With Quote
  #12  
Unread February 4th, 2013, 08:42 PM
SchokoInc
Unhatched Egg
 
Join Date: Nov 2012
Turns out I was just VEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEERY bad at hex editing sorry :( But well as everything is fine now (and team rocket finally has their own battle theme) i noticed that trainer, gym and champ-battles are silent now (but wild battles still do and i can change their theme with the regional table). Is it possible that this happens due to me not having any wild double battles? :(

EDIT.: fixed it.
and the byte responsible for the wild double battle changes the rivals battle theme for me o.O

Last edited by SchokoInc; February 5th, 2013 at 02:10 AM.
Reply With Quote
  #13  
Unread 4 Weeks Ago, 09:23 AM
vizor
Unhatched Egg
 
Join Date: Dec 2011
Gender: Female
I tried it for a german Firred ROM, and found all the ROM Offsets i need, but somehow it doesnt work for me. All Trainerbattle are muted now and every time i walk in a wildbattle, game freezes isntantly. I guess its because of the RAM-Offsets, wich may be different in FRE and FRD.
But how can i find those?
Reply With Quote
Reply
Quick Reply

Sponsored Links


Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are UTC. The time now is 08:52 AM.


Style by Perdition Haze, artwork by Sa-Dui.
Like our Facebook Page Follow us on TwitterMessage Board Statistics | © 2002 - 2013 The PokéCommunity™, pokecommunity.com.
Pokémon characters and images belong to Pokémon USA, Inc. and Nintendo. This website is in no way affiliated with or endorsed by Nintendo, Creatures, GAMEFREAK, The Pokémon Company, Pokémon USA, Inc., The Pokémon Company International, or Wizards of the Coast. We just love Pokémon.
All forum styles, their images (unless noted otherwise) and site designs are © 2002 - 2013 The PokéCommunity / PokéCommunity.com.
PokéCommunity™ is a trademark of The PokéCommunity. All rights reserved. Sponsor advertisements do not imply our endorsement of that product or service. User posts belong to the user.