Editing Pokemon in Rumble Blast with Citra and Squalr

This guide will show you how to edit Pokémon in Pokémon Rumble Blast (Super Pokémon Rumble) using Citra and a memory editor. My memory editor of choice is Squalr and this is what I will be using for this guide, however if you have another one that you prefer the process will be pretty much the same. You can even use CitraMMJ on Android as it has memory search and edit functionality.

If you are already familiar with memory editing you can probably skip over most of this guide. Simply use the offsets from the current HP in combination with lists attached to edit Pokémon.

DarkRust.png



Lets get started! First open up Citra and load up Pokémon Rumble Blast, then open up Squalr. First attach to Citra by clicking the button circled with green in the screenshot below. Select "citra-qt" from the list of processes. Next lets create a new project by clicking the button circled in blue below.

first.png


Click the new project button circled in blue below. Give your project a name and click accept.

second.png


Now we are ready to start editing. To find data for a particular Pokémon in memory we want to start by choosing a value we can see and manipulate in game, in the case of this game we quite obviously should choose the Pokémon's current HP as we can easily see it, and easily change it by taking damage. So switch out the Pokémon you wish to edit then start a search in Sqaulr for it's current HP value. Type it's current HP into the box circled in blue below and click the play button next to it. (You can keep the default scan settings). This will likely find a few hundred values.To narrow the list down go and take some damage, then type the new HP value into the circled box and click the play button. This should narrow the list down to 1 or 2 values (If there are more simply repeat this step until there
are only 1 or 2, take damage then search for new value). If you only have 1 value then this is the value you want. If you have 2 then 1 of them will be the HP value of the Pokémon currently selected on the switch menu. Move up and down the switch menu and you will notice one of the values changes to match the current HP of the Pokémon selected on the menu, you want the value that does NOT change as you navigate the menu. When you have identified the value that represents the HP of the active Pokémon double click it to add it to your project.

third.png


Now it's time for the fun part!

Select our newly found address in the project explorer in Squalr, then we need to edit the address to point to the value we wish to change. To get to the desired locations we will need to subtract from this value, the amount depends on what you wish to edit. The offsets are as follows:

Trait: Subtract 0x18
Moves: Subtract 0x20
Species: Subtract 0x24

Please note that the address and these values are in hexadecimal, the math is easy but if you get stuck use a hexadecimal calculator for help. With the address selected in the project explorer turn your attention to the property viewer. Go to the module offset, circled in blue below:

fourth.png



Now edit this value to point the property you wish to edit. For example in my screenshot the address is: 0000017987108788 so if I wanted to edit the species I would change this value to: 0000017987108764 (0x0000017987108788 - 0x24 = 0x0000017987108764). When you click outside the box you will notice the value change in the property explorer.

To edit the actual value being pointed to simply double click it in the project explorer, and the value editor will be shown. All values provided in the lists below are in hexadecimal so we must right click the value editor's textbox and select hexadecimal. For species and trait simply paste the desired value into the box and click accept (You will need to switch out a different Pokémon and switch back for changes to take effect). For moves you must set both moves at the same time, again set the value editor input to hexadecimal. First paste in the B move then the A move. For example if I wanted the B move to be "B No Type Dark Rust Blast (02d1)" and the A move to be "Z Iron Tail (02a5)", I would enter 02d102a5 into the value editor and click accept.

You don't have to use Squalr, the process is exactly the same regardless of how you search and edit memory. The basic steps are simply:

1: Identify the current HP address of the pokemon you wish to edit
2: Subtract the desired offset from this address depending on what you wish to edit
3: Paste in the value(s) from one of the attached lists

Please note there may be a couple of typos in the lists, and the names of some of the forms are definitely wrong. Also I haven't tried out all the unused moves and Pokemon to find out what they do, I haven't played this game (or much Pokemon at all in recent years). Really this was a project for my son but seeing as I couldn't really find any info on how to do this for this game I thought I would make a guide. With the species list you will notice some values after Dark Rust, for some their names were in Japanese and they were just an un-textured model so I had no idea what to call them, some of them were 'turrets' as my son called them. With Citra on the PC these would cause an exception whenever the switch menu was opened however if you click to continue running and then close the switch menu in game it seems you can continue playing. The un-textured Pokemon couldn't move but the turrets could.

Update:

I thought it would be fun to use this information to make a simple Gateway code that changes a specific Pokémon, and came up with the following simple cheat to edit the Pokémon that is active when the save file is first loaded. I have also attached to this post some cheats that can be used on a 3DS by placing the cheats.txt file in the following folder on your SD card /luma/titles/0004000000066C00/ (Create it if it does not exist). These include some example Pokémon edits but also some simple "switchers" to make very basic edits to the Pokémon that is active when the save file is first loaded. Please note these cheats will not work on Citra due to the different address that this Pokémon is loaded to. It wouldn't take much to edit the cheats to work with Citra, simply change any instance of 091037XX to 091027XX. (Where XX represents any number, so 09103724 would become 09102724).

When our Pokémon are loaded from the save file they are always loaded into the same area of memory of the 3DS. When using Squalr to edit the memory of an instance of Citra you will notice that the addresses do change, but this is because Citra is loaded into a different area of memory every time that you run it. Using this knowledge we can create a simple cheat that changes our active Pokémon.

A simple memory write code has the following format:

0XXXXXXX YYYYYYYY - 0 = Indicates we wish to make a 32 bit write
X = Memory address we wish to write to
Y = Value we wish to write

The address of our active Pokémon's current HP is slightly different depending on if you are running Citra or on a 3DS.

If you are running the game on a 3DS then the address is: 09103748
If you are running the game on Citra then the address is: 09102748

So with this address and the offsets listed above we can create a simple cheat code to edit the Pokémon that is active when the save file is first loaded.

09103724 - Species address
09103728 - Moves address
09103730 - Trait address


[Change active to dark rust] - Name label for our cheat

09103724 005012A4 - 32 bit write value 005012A4 (Dark rust) to address 9103724
09103728 00030004 - 32 bit write value 00030004 (B no type dash, B no type Cobalion blast) to address 9103728
09103730 00003400 - 32 bit write value 00003400 (Epic) to address 9103730

This is enough to create a simple cheat to change our active Pokémon however if we enable this cheat before our save file has loaded the game will crash, luckily Action replay/Gateway codes allow operations to be performed conditionally. We can use this to perform some basic checks to make sure we don't write to these locations unless our save data is loaded.

The codes we will be using have the following format:

5XXXXXXX YYYYYYYY - 5 Indicates we wish to check the 32 bit value at address X is equal to value Y

6XXXXXXX YYYYYYYY - The same as above however we are checking the 32 bit value at address X is not equal to value Y

D2000000 00000000 - Indicates the end of all conditional blocks

5910374C 00000000 - When the save file has been loaded the 32 bit value at 0910374C will be equal to 0
69103740 00000000 - 09103740 is the address of the max hp of the active Pokémon, so when the save file has loaded this will not be equal to 0

This is pretty crude and if you try and activate the cheat while still on the Nintendo 3DS splash screen you will still get crashes. There are probably some better values that could be checked that would make this cheat more robust, but like I say as long as you don't activate the cheat on the Nintendo 3DS splash that displays as the game is loading you should be fine. If you are using your cheat with Citra then these checks are not needed, and you can activate the cheat whenever you like.

Putting it all together:

[Change active poké to dark rust]

5910374C 00000000
69103740 00000000
09103724 005012A4
09103728 00030004
09103730 00003400
D2000000 00000000

[Change active poké to dark rust]

09102724 005012A4
09102728 00030004
09102730 00003400

Another thing we could do is to give this Pokémon infinite HP by adding the following writes. The first bold line sets the active Pokémon's current HP to 9001, the second sets it's max HP to the same. You do not have to set the max HP but if you set a current HP that is larger than the max HP then the in game HP bar will extend beyond it's boundaries

[Change active to infinite HP dark rust]

5910374C 00000000
69103740 00000000
09103724 005012A4
09103728 00030004
09103730 00003400
09103748 00002329
09103740 00002329

D2000000 00000000

[Change active to infinite HP dark rust]

5910274C 00000000
69102740 00000000
09102724 005012A4
09102728 00030004
09102730 00003400
09102748 00002329
09102740 00002329

D2000000 00000000

You can also set the power value of Pokémon which is at address 09103744 on 3DS/Luma and 09102744 on Citra, however I'm not sure what effect (If any) that this really has.

I should note that any changes that you make to species, moves, or trait will be written to your save file. Changes to HP or Power will not.

To add this cheat to a 3DS running Luma create a text file called cheats.txt, add your cheat(s) to this file, and then copy it to the following folder on your SD card (Create any folders that do not exist): /luma/titles/0004000000066C00/

To add this cheat on Citra right click on the game on Citra's main menu, then click Properties, click on the Cheats tab. Now click on the Add Cheat button. Paste your cheat name where it says [new cheat], Paste your code into the box labelled Code:. Finally click the Save when you are finished.
 

Attachments

Last edited by User154,
Why i can only adjust the hp bar. can you give step by step instructions with pictures?
To adjust the other values you need to edit the module offset, there aren't really any other pictures I can add to show this. Simply click the circled area and write the new value.

fourth.png


Adjust the value by one of the following depending on what you wish to edit.

Trait: Subtract 0x18
Moves: Subtract 0x20
Species: Subtract 0x24

This describes what the value pictured will become depending on which offset has been applied:

Now edit this value to point the property you wish to edit. For example in my screenshot the address is: 0000017987108788 so if I wanted to edit the species I would change this value to: 0000017987108764 (0x0000017987108788 - 0x24 = 0x0000017987108764).
 
  • Like
Reactions: HoTuan
To adjust the other values you need to edit the module offset, there aren't really any other pictures I can add to show this. Simply click the circled area and write the new value.

View attachment 490767

Adjust the value by one of the following depending on what you wish to edit.



This describes what the value pictured will become depending on which offset has been applied:
Thanks, i got it
 
Can I do the same thing on checkpoint's savefile?

No you cannot, the save file has it's own structure. It's a bit long winded but you could:

Export the save file with checkpoint.
Load it up on the pc with Citra.
Make your edits and save.
Finally copy the new save to your console and import with checkpoint.

Alternatively you can make edits on the console. I found the address of the active pokemon when the game is first loaded, again quite long winded, but you could:
Edit this pokemon.
Switch to a new pokemon.
Save and and quit (Close the game).
Reload and edit the new pokemon.
Repeat for each pokemon to be edited.

The HP address of this pokemon will be 0x09103748, the offsets are the same as described in the OP, so the species address, for example, is 0x09103724.


You can make the edits on the console either by making cheat codes or using Luma's memory viewer. Select processes from the Rosalina menu, then caviar, then use the jump function to go to address 0x09103748
 
Last edited by User154,
None of the cheats in the OP appear to be functional on real hardware or Citra/Azahar. Many errors are given as well on Citra/Azahar. I was hoping to use the Legendary code, since it would make farming the perfect Regigigas far easier.
 
None of the cheats in the OP appear to be functional on real hardware or Citra/Azahar. Many errors are given as well on Citra/Azahar. I was hoping to use the Legendary code, since it would make farming the perfect Regigigas far easier.

The cheats will not work on an emulator because the address is different, but there shouldn't be any problems with real hardware. Would you mind checking what value is at the address 0x09103724, and telling me what your active Pokemon is?

If you load the game then open the rosalina menu, select process list, then choose caviar, next press the X button to jump to an address.

Just hoping to see whether or not you have a Pokemon species at that address or not.
 
The cheats will not work on an emulator because the address is different, but there shouldn't be any problems with real hardware. Would you mind checking what value is at the address 0x09103724, and telling me what your active Pokemon is?

If you load the game then open the rosalina menu, select process list, then choose caviar, next press the X button to jump to an address.

Just hoping to see whether or not you have a Pokemon species at that address or not.
Speedy++ Ninjask, in Toy Town. Modded previously using memory edits as well.

All Values near or at 0x09103724 is 00. After enabling the Legend cheat, there is now 788A4F at the address. Perhaps something didn't load fully.

Checked again with cheat disabled, swapping to a Lucky+ Arceus (Fire). Value is the same, 788A4F. I can post my save file later as well. Played a Forest level, found one Rumpus room, no shiny catapult, meaning the code did not work, or im misinterpreting its purpose.
 
Speedy++ Ninjask, in Toy Town. Modded previously using memory edits as well.

All Values near or at 0x09103724 is 00. After enabling the Legend cheat, there is now 788A4F at the address. Perhaps something didn't load fully.

Checked again with cheat disabled, swapping to a Lucky+ Arceus (Fire). Value is the same, 788A4F. I can post my save file later as well. Played a Forest level, found one Rumpus room, no shiny catapult, meaning the code did not work, or im misinterpreting its purpose.

Even with the cheat disabled there should have been some value at 0x09103724. The value 0078A44f would indicate that your active pokemon is Moltres. So is definitely the value out there by the cheat. The cheat itself doesn't change wild Pokemon, it changes your active Pokemon, you change by holding L and then pressing x or y.

If you could upload your save that would be really helpful, hopefully I can work out why the memory address isn't correct in this instance
 
Hii dear author. Been really wanted to try the cheats cuz I'm struggling on the midgame (about Stage 4 or 5) sooooo hard. But sadly I'm running on the Japan version of the game (title ID: 000400000004D700), and the cheats.txt you kindly shared above doesn't work at all. Is there something I could try to fix this? Thanks for the cheats anyway :)
 
Hii dear author. Been really wanted to try the cheats cuz I'm struggling on the midgame (about Stage 4 or 5) sooooo hard. But sadly I'm running on the Japan version of the game (title ID: 000400000004D700), and the cheats.txt you kindly shared above doesn't work at all. Is there something I could try to fix this? Thanks for the cheats anyway :)

Hello, I'm really sorry but I don't currently have a physical console to be able to find the addresses for the Japanese version, and the addresses are slightly different when running in an emulator. What you could try is backing up your save then use an emulator and memory editor to edit some Pokemon, save your game, then import the new save on your console. Some of the beta moves will one shot everything, "B no type coballion blast" for example.
 
Hello, I'm really sorry but I don't currently have a physical console to be able to find the addresses for the Japanese version, and the addresses are slightly different when running in an emulator. What you could try is backing up your save then use an emulator and memory editor to edit some Pokemon, save your game, then import the new save on your console. Some of the beta moves will one shot everything, "B no type coballion blast" for example.
That’s what I’ll try next time! Thanks for your suggestion!
 
You're welcome if you need any help with it then let me know, I'm just sorry I couldn't be of more help.
I tried the data editing method and it worked without any problem. Thank you again for the informative tutorial and your kind reply!

Funny how I thought the "B no type coballion blast" was like a beam type of move which is powerful but requires you to aim every time, but man, it was until I used it then I realize it literally one shot everything at sight. It's a life saver for how convenient it is!

And just out of curious, how did you find the offset of the pointer? (idk if I'm using the correct term, but by offset I mean 'subtract 0x18, etc'). From my guess, the address for the pokemon data (hp, battle point,...) is stored in a formatted package which can be divided into multiple addresses. Was your method related to accessing the whole package? If so, is there a way to edit other data like max hp and BP? I'm fascinated by the process. :ha:
 
I tried the data editing method and it worked without any problem. Thank you again for the informative tutorial and your kind reply!

Funny how I thought the "B no type coballion blast" was like a beam type of move which is powerful but requires you to aim every time, but man, it was until I used it then I realize it literally one shot everything at sight. It's a life saver for how convenient it is!

And just out of curious, how did you find the offset of the pointer? (idk if I'm using the correct term, but by offset I mean 'subtract 0x18, etc'). From my guess, the address for the pokemon data (hp, battle point,...) is stored in a formatted package which can be divided into multiple addresses. Was your method related to accessing the whole package? If so, is there a way to edit other data like max hp and BP? I'm fascinated by the process. :ha:

Really glad that it worked for you! Yes that move literally just wipes everything out, I'm not sure where it is used in the game legitimately (If at all).

Really finding the values was just a process of trial and error. With a memory searcher it is very easy to find the location of anything that you can see the value of and easily change, in this case that is the Pokémon's current HP value. You can see how much HP a Pokémon has as a numerical value and can easily change it simply by taking damage. I knew that it was highly likely that other values relating to the same Pokémon would be stored close to the HP value. In my head I was imagining there would be some sort of struct that looked roughly similar to this:

Code:
struct Pokemon{
     uint32_t current_hp;
     uint32_t max_hp;
     uint32_t trait;
     uint32_t species;
     uint32_t a_move;
     uint32_t b_move;
};

Obviously that's not exactly how it is, and I knew it wouldn't be exactly the same but the key thing is that I was fairly sure, like you, that all values relating to one specific Pokémon would be part of the same data structure. This means that all values relating to a Pokémon would be allocated a contiguous block of memory rather than being scattered around randomly. From there I then found the current HP address for 2 distinctly different Pokémon (i.e they had totally different moves, species and trait), then I started swapping around values that were stored at the same distance away from the current HP address and observed what attributes swapped between the 2. The max HP and the BP are both right next the current HP (0x04 either side, I just can't remember off the top of my head which way around), the only problem is that these values are reloaded from the save file each time you enter a new area so editing them with a memory editor is largely pointless as the values keep being reset to their original values from the save file. When using cheat codes this isn't really a problem because every read from a given address will be replaced with the value from the cheat. However I struggled to see what effect, if any, that changing the BP actually had. It could be set really high or really low and it didn't seem to do anything. Some of the cheats are for "pre-made" (for lack of a better term) Pokémon that my son came up with and they do actually change the max HP value.
 
Really glad that it worked for you! Yes that move literally just wipes everything out, I'm not sure where it is used in the game legitimately (If at all).

Really finding the values was just a process of trial and error. With a memory searcher it is very easy to find the location of anything that you can see the value of and easily change, in this case that is the Pokémon's current HP value. You can see how much HP a Pokémon has as a numerical value and can easily change it simply by taking damage. I knew that it was highly likely that other values relating to the same Pokémon would be stored close to the HP value. In my head I was imagining there would be some sort of struct that looked roughly similar to this:

Code:
struct Pokemon{
     uint32_t current_hp;
     uint32_t max_hp;
     uint32_t trait;
     uint32_t species;
     uint32_t a_move;
     uint32_t b_move;
};

Obviously that's not exactly how it is, and I knew it wouldn't be exactly the same but the key thing is that I was fairly sure, like you, that all values relating to one specific Pokémon would be part of the same data structure. This means that all values relating to a Pokémon would be allocated a contiguous block of memory rather than being scattered around randomly. From there I then found the current HP address for 2 distinctly different Pokémon (i.e they had totally different moves, species and trait), then I started swapping around values that were stored at the same distance away from the current HP address and observed what attributes swapped between the 2. The max HP and the BP are both right next the current HP (0x04 either side, I just can't remember off the top of my head which way around), the only problem is that these values are reloaded from the save file each time you enter a new area so editing them with a memory editor is largely pointless as the values keep being reset to their original values from the save file. When using cheat codes this isn't really a problem because every read from a given address will be replaced with the value from the cheat. However I struggled to see what effect, if any, that changing the BP actually had. It could be set really high or really low and it didn't seem to do anything. Some of the cheats are for "pre-made" (for lack of a better term) Pokémon that my son came up with and they do actually change the max HP value.
The process couldn't be explained any better. The 'same distance' trick is especially clever. (it should be written in the textbook of game hacking 101, really)

As I was just tweaking around, I had a few trivial discoveries I thought I might share them as well:

1. The more BP the pokemon has, the more damage it can deal. for instance my BP1789 Gyarados had to use 3 to 4 times of 'Coballion Blast' to defeat the boss of Stage 1-1 (10-Star), where my BP3000 Gardevoir only used 2 blasts.

2. Not verified but based on probability, there are pokemons with lower capture rate (or 'befriend rate') seemed can never be captured with 'Coballion Blast' or any beta moves that one shot things. My original theory was that these pokemon can't be captured by lower BP pokemon, so I was testing in Stage 1-1 on Skitty and Delcatty, but it proved me wrong after about 50 Skitty Rushes. Then I noticed that it was almost a guaranteed capture on Delcatty when using normal move, but I've never captured Delcatty using beta moves in over 100 Skitty Rushes. To be fair the Delcatty is quite rare to appear (feels like 1 in 10 times it appears), so I'm not sure if the lack of samples has anything to do with it.

I realized a possibly better explanation after typing the above, which is that the game seems have a 'dizzy mechanism'. In short, if the pokemon is caused dizzy by your move, then it is a guaranteed capture. Since the beta moves kill everything they touch, they couldn't trigger dizzy. Still, not verified. I blame the game for not having decent in-game explanation. We basically have to guess everything :unsure:

3. My memory might be wrong but the animation of 'B no type Coballion blast' seems come from the first encounter of Coballion (in the plot fight scene).
 
Wait is it better to use the memory searcher on the pc and then save the save file then upload it through checkpoint? Or should I just rock out with the cheats because I can one-shot everything? Sorry for inconvience

@User154 is there a way to use the memory viewer on the 3ds to do more damage while using the OP cheat?
 
Last edited by MiirOverHeaven,

Site & Scene News

Popular threads in this forum