- 37
- Posts
- 9
- Years
- Seen Sep 10, 2018
Hey guys, pretty easy thing I found just now. You know how you can't just overwrite HM moves whenever? Well, that's a bit annoying, isn't it? Let's change that!
Open up your trusty hex editor and go to the appropriate offset:
You should see the following 16 bytes:
)
This is the list of HM moves that must be deleted by the move deleter and can't simply be overwritten by a new move. They are in order, by the way, which is somewhat convenient. The first two bytes are Cut's index value in little endian and hexadecimal, the second two are Fly's, third two are Surf's, and so on. Let's say you want to turn Flash into a forgettable TM. Simply change "94 00," referring to the 148th move, to "00 00," referring to a nonexistent "0th" move. Flash can now be forgotten, and it's been replaced by a throwaway move we'll never be able to use. In my case, since my FireRed hack won't have Dive as an HM, I can replace "23 01" with "00 00" instead, and suddenly...
...Dive is treated like any other move! Overwrite it with a TM, overwrite it with a level-up move, whatever, you're now free to do that.
Do be careful and check the offset. That sequence of 16 bytes shows up 1 (Ruby) or 2 (FireRed and Emerald) other times in the ROM. Based on the bytes preceding them, I am 99% certain they are related to TMs and HMs, so check your offsets and try not to break anything. Why it only shows up 1 other time in Ruby is beyond me.
What if you want to add HM moves? I'm only going to test this for FireRed (though if you want to test it in others, please do and post your results) since I am assuming that the script is identical for all five Gen III games. Searching through the ROM for the pointer to this HM move table leads us to three offsets:
I'm going to replace this offset with a new one, and I'm going to add the rest of this Bulbasaur's moveset to it alongside the HM moves. If all goes to plan, Tackle, Growl, and Leech Seed as well as existing HMs will require the move deleter. I'm going to move this table to offset A00000, so I'll need to replace the point at 0441DC with "00 00 A0 08." Next, I'm going to copy and paste those 16 bytes from earlier, but I'm also going to add the three other moves to the list. We'll have 22 bytes and the new table will look like this:
Now, if we reload our save, this happens:
Success! We've just added three unforgettable moves to the game. You'll have to take my word for it when I say the actual HMs are still normal and annoying. ;)
I'll be honest, I don't exactly know when this would be useful, since HMs are pretty annoying and newer games have been moving further away from them. Boulders, for example, never have to be moved again once Strength is used on them once, and cuttable trees rarely block your path anymore. I generally agree with this and think it's good game design, since previous games force you to either use an HM slave or stick useless moves on your team. This was particularly bad in Black and White, where Tackle of all things became better than Cut in all possible ways. I'm trying to make HM moves interesting at least - Waterfall is Water-type Extremespeed, Strength is Normal-type Cross Chop, Rock Smash is Fighting-type Crush Claw, Flash is Bug-type, accuracy-reducing Charge Beam... - but they're still more than a bit irritating.
Knowing that we can allow non-essential HM moves to be forgotten in the field, however, is very useful. You know that feeling when you just got a nice level-up move but Fly or Flash is hogging the only free slot? It's not a good one, but it can be taken care of now.
Open up your trusty hex editor and go to the appropriate offset:
Spoiler:
Ruby: 20831A
FireRed: 25E014
Emerald: 329EEA
FireRed: 25E014
Emerald: 329EEA
You should see the following 16 bytes:
(Just search for the above bytes if you're hacking Sapphire of LeafGreen, or better yet switch to another game.0F 00 13 00 39 00 46 00 94 00 F9 00 7F 00 23 01
![[PokeCommunity.com] HM moves and forgetting the darn things [PokeCommunity.com] HM moves and forgetting the darn things](https://www.pokecommunity.com/images/templates/smilies/cerulean/12.%20tongue.gif)
This is the list of HM moves that must be deleted by the move deleter and can't simply be overwritten by a new move. They are in order, by the way, which is somewhat convenient. The first two bytes are Cut's index value in little endian and hexadecimal, the second two are Fly's, third two are Surf's, and so on. Let's say you want to turn Flash into a forgettable TM. Simply change "94 00," referring to the 148th move, to "00 00," referring to a nonexistent "0th" move. Flash can now be forgotten, and it's been replaced by a throwaway move we'll never be able to use. In my case, since my FireRed hack won't have Dive as an HM, I can replace "23 01" with "00 00" instead, and suddenly...
![[PokeCommunity.com] HM moves and forgetting the darn things [PokeCommunity.com] HM moves and forgetting the darn things](https://i.imgur.com/yToqHB5.png)
...Dive is treated like any other move! Overwrite it with a TM, overwrite it with a level-up move, whatever, you're now free to do that.
Do be careful and check the offset. That sequence of 16 bytes shows up 1 (Ruby) or 2 (FireRed and Emerald) other times in the ROM. Based on the bytes preceding them, I am 99% certain they are related to TMs and HMs, so check your offsets and try not to break anything. Why it only shows up 1 other time in Ruby is beyond me.
What if you want to add HM moves? I'm only going to test this for FireRed (though if you want to test it in others, please do and post your results) since I am assuming that the script is identical for all five Gen III games. Searching through the ROM for the pointer to this HM move table leads us to three offsets:
Spoiler:
Ruby: 040A24
FireRed: 0441DC
Emerald: 06E828
FireRed: 0441DC
Emerald: 06E828
I'm going to replace this offset with a new one, and I'm going to add the rest of this Bulbasaur's moveset to it alongside the HM moves. If all goes to plan, Tackle, Growl, and Leech Seed as well as existing HMs will require the move deleter. I'm going to move this table to offset A00000, so I'll need to replace the point at 0441DC with "00 00 A0 08." Next, I'm going to copy and paste those 16 bytes from earlier, but I'm also going to add the three other moves to the list. We'll have 22 bytes and the new table will look like this:
I think you might need to follow that with "FF FF" to terminate the table, but since I'm working in free space, that's already taken care of. If you just follow it with one "FF," you'll probably be turning the 255th move (Spit Up) into an unforgettable move as well as many others that follow.0F 00 13 00 39 00 46 00 94 00 F9 00 7F 00 23 01 21 00 2D 00 49 00
Now, if we reload our save, this happens:
![[PokeCommunity.com] HM moves and forgetting the darn things [PokeCommunity.com] HM moves and forgetting the darn things](https://i.imgur.com/PpJmi3K.png)
Success! We've just added three unforgettable moves to the game. You'll have to take my word for it when I say the actual HMs are still normal and annoying. ;)
I'll be honest, I don't exactly know when this would be useful, since HMs are pretty annoying and newer games have been moving further away from them. Boulders, for example, never have to be moved again once Strength is used on them once, and cuttable trees rarely block your path anymore. I generally agree with this and think it's good game design, since previous games force you to either use an HM slave or stick useless moves on your team. This was particularly bad in Black and White, where Tackle of all things became better than Cut in all possible ways. I'm trying to make HM moves interesting at least - Waterfall is Water-type Extremespeed, Strength is Normal-type Cross Chop, Rock Smash is Fighting-type Crush Claw, Flash is Bug-type, accuracy-reducing Charge Beam... - but they're still more than a bit irritating.
Knowing that we can allow non-essential HM moves to be forgotten in the field, however, is very useful. You know that feeling when you just got a nice level-up move but Fly or Flash is hogging the only free slot? It's not a good one, but it can be taken care of now.