Advertiser Content

Development ASM Resource Thread Page 58

Started by esperance September 19th, 2014 3:13 PM
  • 258377 views
  • 1476 replies

Petuuuhhh

Age 25
Male
Georgia
Seen 3 Hours Ago
Posted 2 Weeks Ago
613 posts
2.1 Years
Gen 7 Soul Dew Update by Skeli Unbound [FR]

.thumb
.global SoulDewNerf

.equ Psychic, 0xE
.equ Dragon, 0x10

.org 0x3EF58, 0xFF
Main:
	ldrh r0, [r6] @Current Species
	ldr r1, .Latios
	cmp r0, r1
	ldr r1, .Latias
	cmp r0, r1
	bne 0x3EFC8 @DeepSea Items Check

CheckType:
	mov r0, r9
	cmp r0, #Dragon
	beq TwentyBoost
	cmp r0, #Psychic
	bne 0x3EFC8 @DeepSea Items Check

TwentyBoost:
	mov r0, r7 @Attack
	mov r1, #0x5
	bl 0x1E4018 @Divide
	add r7, r0

	mov r0, r8 @Sp. Atk
	mov r1, #0x5
	bl 0x1E4018 @Divide
	mov r1, r8
	add r0, r1
	mov r8, r0
	b 0x3EFC8 @DeepSea Items Check

.align 2
.Latias: .word 0x197
.Latios: .word 0x198
Seen 9 Hours Ago
Posted January 21st, 2019
762 posts
12.2 Years
Hall of Fame Expanded Pokémon Fix [FR]

Fixes an issue where expanded Pokémon above index 0x1FF do not show up correctly in the Hall of Fame.

For example, 0x201 would normally show up as 0x1 (Bulbasaur). This is because the Hall of Fame data only allocated 9 bits to the species number, and 0x1FF is the largest number that can be stored in that space; larger numbers only have their lowest 9 bits stored.

pikachux2

Never Evolve

Male
USA
Seen 2 Weeks Ago
Posted 3 Weeks Ago
116 posts
9.2 Years
I literally no nothing about Assembly in fire red, but is the limited number of flags in fire red really a problem? Is it not possible to make an ASM routine that can check the value of some offset after 800000 and return a pseudo Boolean value to the last result variable 0x800D (or any other for that matter)? This will probably be an easy yes or no for a lot of you, I was just curious.

Petuuuhhh

Age 25
Male
Georgia
Seen 3 Hours Ago
Posted 2 Weeks Ago
613 posts
2.1 Years
Feebas Fishing Tiles in Fire Red
Hey,

Could this be used like in SM/USUM where there are particular Pokemon in particular patches of grass? It's the same concept but it would have to refer to a table of Pokemon that could possibly spawn

Edit: Here's the code by BluRose that should work for wild grass table spawns:

.text
.align 2
.thumb
.thumb_func

main:
	@ Push registers that were pushed in the original routine.
	push    {r4-r6, lr}

	@ Check if current map is Feebas's map.
	ldr  r3, =(0x2031DBC) @ Address of current map id
	ldrh r3, [r3]         @ r3 = current map id
	ldr r2, =(MAP_ID)     @ r2 = Map Id for Feebas tiles
	cmp r3, r2            @ compare the current map id with Feebas's map id
	bne done              @ jump to "done" if they weren't equal

	push {r0-r2}

	@ Get the player's tile coordinates.
	ldr  r0, =(0x3005008)
	ldr  r2, [r0]         @ r2 = pointer to player's X/Y coordinates
	ldrh r0, [r2]         @ r0 = player's X coordinate
	ldrh r1, [r2, #0x02]  @ r1 = player's Y coordinate

gotFishingTileCoords:
	@ At this point, r0 = X, r1 = Y
	bl checkFeebasTile
	cmp r0, #0x0   @ If r0 != 0, then it's a Feebas tile
	beq notFeebas

	@ Set encounter rate.
	ldr r0, .genRandom
	bl linker
	mov r1, #0xff
	and r0, r1
	cmp r0, #ENCOUNTER_RATE
	bgt notFeebas

	pop {r5-r7} @ pop off garbage to get the stack in a good state

	@ Load Feebas id and level.
	ldr r0, =(POKEMON_ID)     @ Load Feebas id into r0
	ldr r1, =(POKEMON_LEVEL)  @ Load level 20 into r1
	ldr r2, =(0x0)            @ Load the fishing data slot(???) into r2

	@ Jump back to original routine where it has calculated the pokemon species and level.
	ldr r3, =0x08082b8e
	mov pc, r3

checkFeebasTile:
	@ Check if the given tile coordinates are a Feebas tile
	@ r0 = X, r1 = Y
	@ return: r0 != 0x0 if it's a Feebas tile
	@
	@ Algorithm:
	@    Define a rectangular area with width w and height h
	@    This area is an array of length w * h
	@    
	@    Check if the fishing tile is inside the rectangle.  Else return.
	@    Convert the fishing tile coordinates to an index within this array.
	@    Take the secret id/trainer id and combine nybbles to form 8-bit values by sliding to the left.
	@    For each of those values 'v':
	@        If v % (w * h) == array index:
	@            It's a Feebas tile
	@
	push {lr}

	@ Is the fishing tile in the Feebas rectangle?
	cmp r0, #RECT_LEFT
	bmi notFeebasTile
	cmp r0, #RECT_RIGHT
	bgt notFeebasTile
	cmp r1, #RECT_TOP
	bmi notFeebasTile
	cmp r1, #RECT_BOTTOM
	bgt notFeebasTile

	@ Convert tile coordinates to the array index.
	sub r0, r0, #RECT_LEFT
	sub r1, r1, #RECT_TOP
	mov r2, #(RECT_RIGHT - RECT_LEFT + 1)  @ width of rectangle
	mul r1, r1, r2
	add r0, r0, r1     @ r0 = array index for rectangular area

	ldr r1, =(0x0300500C)
	ldr r1, [r1]
	add r1, r1, #0xa
	ldrh r5, [r1]           @ Need to load trainer id and secret id separately because they aren't word-aligned
	mov r6, r5
	add r1, r1, #0x2
	ldrh r6, [r1]
	lsl r5, r5, #0x10
	add r1, r5, r6          @ Load the secret id and trainer id into r1

	mov r2, #((RECT_RIGHT - RECT_LEFT + 1) * (RECT_BOTTOM - RECT_TOP + 1))  @ Rectangle's area
	mov r3, #NUM_TILES

	mov r5, #0xff

checkSlot:
	sub r3, r3, #0x1   @ Decrement the counter
	bmi notFeebasTile  @ Return if the counter hit zero.

	mov r4, r1
	and r4, r5         @ Load lower 8 bits of r1 into r4.
	lsr r1, r1, #0x4   @ Shift r1 4 bits to the right, so a new 8-bit value will be used 
	                   @ in the next loop iteration.

modulus:
	@ Perform r4 % r2
	sub r4, r4, r2
	bmi modulusDone
	b modulus

modulusDone:
	add r4, r4, r2  @ Make the result positive.
	cmp r4, r0
	bne checkSlot

exitCheckFeebasTile:
	ldr r0, =(0x1)
	pop {pc}

notFeebasTile:
	ldr r0, =(0x0)
	pop {pc}

notFeebas:
	pop {r0-r2}
done:
	@ Code that was replaced by the hook in the original routine
	mov     r6, r0
	lsl     r0, r1, #0x18
	lsr     r0, r0, #0x18

	@ Jump back to the original routine after the hook
	ldr r2, =0x08082b6c
	mov pc, r2

linker:
	bx r0

.align 2

.genRandom:
	.word 0x08044ec8 + 1

@ Customizable Constants
.set MAP_ID,       0x0603  @ [ID][Bank] (Default CELADON CITY)
.set RECT_LEFT,      0x18  @ X coordinate of left side of rectangle
.set RECT_RIGHT,     0x1d  @ X coordinate of right side of rectangle
.set RECT_TOP,       0x15  @ Y coordinate of top side of rectangle
.set RECT_BOTTOM,    0x17  @ Y coordinate of bottom side of rectangle
.set NUM_TILES,      0x06  @ Number of Feebas tiles (must be between 1 and 8)
.set POKEMON_ID,    0x148  @ Pokemon Id (Feebas)
.set POKEMON_LEVEL,  0x0f  @ Wild Pokemon level (15)
.set ENCOUNTER_RATE, 0xc0  @ This number is divided by 0xFF to get the encounter rate (0xc0 / 0xff = 75% encounter rate)
Just copy paste these lines for each wild Pokemon value:
bgt notFeebas

    pop {r5-r7} @ pop off garbage to get the stack in a good state

    @ Load Feebas id and level.
    ldr r0, =(POKEMON_ID)     @ Load Feebas id into r0
    ldr r1, =(POKEMON_LEVEL)  @ Load level 20 into r1
    ldr r2, =(0x0)            @ Load the fishing data slot(???) into r2
Seen 3 Weeks Ago
Posted February 7th, 2019
3 posts
1.2 Years

Changing the Player's Overworld ingame



Intro:

I recently made this routine, it's kind of limited in the sense that you can only be change to 30 different overworlds (excluding the special version of the default characters). While it is limited, I don't really think that that's a problem (you'd probably only be OWs swapping to 2-3 different OWs the entire game anyways, so unless you wanted to player to play as more than 30 characters, this routine will work just fine for you). It's also a little "smaller" in comparison to JPAN's 6 seperate routines which he used (though in his favor, I don't think his limits the amount like mine). I blame the table, it's weird. Actually the whole overworld loading thing is weird..it's done in like 9 places lol.

I should also note that if the OW you're changing to doesn't have a running frame, things are going to look weird when you try to run~

How to insert:

Compile into free space the following routine:
Spoiler:

.text
.align 2
.thumb
.thumb_func

@hook from 0805CA4C via r0
                            
main:
	@flag check
checkFlag:
	mov r0, #0xFF 
	lsl r0, r0, #0x2
	add r0, r0, #0xA @0x3FC + 0xA = @406
	ldr r2, =(0x806E6D0 +1)
	push {r1, r3}
	bl linker
	pop {r1, r3}
	cmp r0, #0x1
	bne noCrash

setOW:
	ldr r0, =(0x20370B8)
	ldrb r0, [r0]
	cmp r0, #0xFF
	beq noCrash
	mov r3, r0
	
noCrash:
	mov r8, r3
	lsl r4, r4, #0x10
	lsr r4, r4, #0x10
	lsl r5, r5, #0x10
	ldr r0, =(0x805CA54 +1)
	bx r0
	
linker:
	bx r2
	
.align 2
Here's a compiled version:
FF 20 80 00 0A 30 09 4A 0A B4 00 F0 0E F8 0A BC 01 28 04 D1 06 48 00 78 FF 28 00 D0 03 1C 98 46 24 04 24 0C 2D 04 03 48 00 47 10 47 D1 E6 06 08 B8 70 03 02 55 CA 05 08


Now navigate to 0x5CA4C and insert the following byte changes:
00 48 00 47 XX XX XX 08
Where XX XX XX is where you inserted this routine +1.


Usage:

The routine requires two conditions to toggle.
1) Flag 0x406 is set
2) Var 0x8000 is not 0xFF

As you may have guessed you need to set variable 0x8000 to a value which matches the overworld you want the player to transform into. Please note that for the effect to happen, you need to warp first.
Here's a list of values and their corresponding sprite to the left:
Spoiler:

0 - male hero
1 - female hero
3 - female hero bike
4 - male hero run
5 - female hero run
6 - male hero vs-seeker
7 - female hero vs-seeker
8 - male hero fishing
9 - female hero fishing
12 - Brendon
13 - May
26 - Male + Female hero Vs seeker on bike
28 - Random guy (A-MAP ID 25)
29 - Little boy
44 - Gem sign thing (buggy)
48 - Spearow
52 - Old man 1 (A-MAP ID 33)
80 - Jogging girl
83 - Blonde dude (A-MAP ID 26)
84 - Fat guy
88 - Old man 2 (A-MAP ID 88)
92 - Scroll backpack thing (buggy)
93 - Team rocket male
104 - Meowth
112 - Chansey
116 - Slowbro
124 - Snorlax
125 - Fisherman
166 - Kid tuber (male)
170 - Old man 3 (A-MAP ID 30)
176 - Green girl (A-MAP ID 40)
213 - Red dress lady
214 - Old lady
228 - Deoxys (I think this one is normal)
245 - Misty
250 - Hey champ in the making guy
251 - Ghost Girl

While no particular value will cause a crash, I've excluded values which are "repeated" OWs. If you experience bugs, use it in conjunction with the backsprite hack I made. If you still have bugs, report them here!
Hi
I tried to apply this rutine but i got errors:
The change of the OW is lost after the player enter in a menu or enter in a battle.
I also inserted the rutine of swap BS, in that i get a problem with the change of the OW after a warp (the OW change to the Hero surfing or the hero in bike)



What can I do?
Male
Seen January 15th, 2019
Posted December 28th, 2018
9 posts
3.6 Years
Welp, it didn't work.
I compiled the routine and dropped it in the offset 71A250, wrote this script and once I checked it In-Game, this was the result.

Note: Just for the record, the savefile is right after defeating my Rival for the very first time, so there's no way for my Pokémon to have 76 points.

Dunno if you'll be able to fix it, but in any case thank you very much.
Would you be willing to reshare the script (the link is no longer working) in code tags? I am relatively new and trying to figure this stuff out.

Delta231

A noob

Male
India
Seen 18 Hours Ago
Posted 5 Days Ago
687 posts
3 Years
Does anyone know if this function (Steven battle for fire red) has been completed? They wrote that it would be enough to insert a line of code to make it complete, but unfortunately it seems that no one has chosen how to insert it.
No this wasn't completed and I prefer to use Decompilations.

FBI

Free supporter

Male
Unknown Island
Seen 7 Minutes Ago
Posted March 30th, 2019
1,906 posts
6.3 Years
Does anyone know if this function (Steven battle for fire red) has been completed? They wrote that it would be enough to insert a line of code to make it complete, but unfortunately it seems that no one has chosen how to insert it.
This is done for the typical encounter battles (where you meet eyes with two trainers at once). What isn't done is a scripted double battle. That shouldn't be hard given the source code here. The caution is that it isn't thoroughly bug tested because CommHack never took off past the mapping (rip scripters).
...
Seen 10 Hours Ago
Posted 1 Week Ago
45 posts
4.4 Years
This is done for the typical encounter battles (where you meet eyes with two trainers at once). What isn't done is a scripted double battle. That shouldn't be hard given the source code here. The caution is that it isn't thoroughly bug tested because CommHack never took off past the mapping (rip scripters).
I had misunderstood how it worked then, thanks for the clarification!
If I can help, I'll get along well with the fire red scripting :)

Lunos

Random Uruguayan User

Male
Montevideo (Uruguay)
Seen 35 Minutes Ago
Posted 22 Hours Ago
1,897 posts
10.6 Years

[FR] Complimentary Premier Ball for purchases of over 9 Poké Balls

I've used this many many times, I love this feature as silly it may sound.
Surprisingly though, I noticed just now that it seems to glitch the blue bar containing the different HMs descriptions inside the Pokémon Party menu. Could anyone confirm?


Steps that I did:
1) Inserted the text string in 0x456734
C3 B4 E0 E0 00 E8 DC E6 E3 EB 00 DD E2 00 D5 00 CA E6 D9 E1 DD D9 E6 00 BC D5 E0 E0 B8 00 E8 E3 E3 AD FC 09 FF
2) Copy and pasted the routine in a text file, then I modified the offset in L39 accordingly (0x08456734) and compiled.
The result was:
30 B5 00 06 04 0E A0 00 00 19 C0 00 15 49 45 18 15 48 C1 8D 03 20 08 40 00 28 1F D0 05 20 13 4B 00 F0 1F F8 0A 21 68 5A 04 28 13 D1 02 21 68 5A 09 28 0F DD 0C 20 01 21 0D 4B 00 F0 12 F8 00 06 00 0E 01 28 06 D1 0B 49 0B 4A 20 1C 0B 4B 00 F0 08 F8 03 E0 20 1C 08 4B 00 F0 03 F8 30 BC 01 BC 00 47 18 47 98 50 00 03 F0 30 00 03 CD 22 07 08 85 A0 09 08 34 67 45 08 99 BF 09 08 5D F7 13 08
3) Inserted the routine in 0x45675C

4) Went to 0x9BF64 and wrote: 5D 67 45 08

5) Saved and tested.

I'm certainly getting the extra Premier Ball if I purchase 10 Poké Balls. No issues there.
The thing is that if I grab a clean ROM and this is the only thing that I add to it, the issue with the blue bar happens :/

Funny Valentine

I have taken the first napkin!

Seen 6 Days Ago
Posted March 2nd, 2019
13 posts
1.1 Years
I've used this many many times, I love this feature as silly it may sound.
Surprisingly though, I noticed just now that it seems to glitch the blue bar containing the different HMs descriptions inside the Pokémon Party menu. Could anyone confirm?


Steps that I did:
1) Inserted the text string in 0x456734
C3 B4 E0 E0 00 E8 DC E6 E3 EB 00 DD E2 00 D5 00 CA E6 D9 E1 DD D9 E6 00 BC D5 E0 E0 B8 00 E8 E3 E3 AD FC 09 FF
2) Copy and pasted the routine in a text file, then I modified the offset in L39 accordingly (0x08456734) and compiled.
The result was:
30 B5 00 06 04 0E A0 00 00 19 C0 00 15 49 45 18 15 48 C1 8D 03 20 08 40 00 28 1F D0 05 20 13 4B 00 F0 1F F8 0A 21 68 5A 04 28 13 D1 02 21 68 5A 09 28 0F DD 0C 20 01 21 0D 4B 00 F0 12 F8 00 06 00 0E 01 28 06 D1 0B 49 0B 4A 20 1C 0B 4B 00 F0 08 F8 03 E0 20 1C 08 4B 00 F0 03 F8 30 BC 01 BC 00 47 18 47 98 50 00 03 F0 30 00 03 CD 22 07 08 85 A0 09 08 34 67 45 08 99 BF 09 08 5D F7 13 08
3) Inserted the routine in 0x45675C

4) Went to 0x9BF64 and wrote: 5D 67 45 08

5) Saved and tested.

I'm certainly getting the extra Premier Ball if I purchase 10 Poké Balls. No issues there.
The thing is that if I grab a clean ROM and this is the only thing that I add to it, the issue with the blue bar happens :/
Hey man, I have inserted this routine in my ROM hack as well and everything is fine on my end. I would guess that this thing happens because you have put the routine before 71A240: in the past I have tried to insert other routines in free space before it and I have had the same issue as you, but when I do put them over 71A240, no problem at all. Maybe you should try to insert it somewhere there and see what happens? Hope it helps.

Lunos

Random Uruguayan User

Male
Montevideo (Uruguay)
Seen 35 Minutes Ago
Posted 22 Hours Ago
1,897 posts
10.6 Years
Hey man, I have inserted this routine in my ROM hack as well and everything is fine on my end. I would guess that this thing happens because you have put the routine before 71A240: in the past I have tried to insert other routines in free space before it and I have had the same issue as you, but when I do put them over 71A240, no problem at all. Maybe you should try to insert it somewhere there and see what happens? Hope it helps.
I just tried it out, and now it's certainly working perfectly. That's kinda dissapointing though, but eh, I guess the free space before 71A240 could be used for something else like maps or scripts..?
Anyway, thank you :D!

EDIT:

Inheriting IVs from parents (via Destiny Knot, in the daycare)

I was testing this routine out just now, and I'm not entirely sure if it's working correctly.
It looks to me like the Eggs are inheriting 3 stats alone, when they should always inherit 5 stats :/
I've been doing tests using this routine and Jiangzhengwenjz's EV-IV Screen.

In my last attempt for example, the results of the Egg were:
-03 HP IVs. Charmander has 30 and Ditto 26.
-03 Atk IVs inherited from Charmander.
-22 Def IVs inherited from Charmander or Ditto (both have 22 Def IVs.)
-23 Spd IVs. Charmander has 31 and Ditto 25.
-19 SpAtk IVs. Charmander has 31 and Ditto 10.
-31 SpDef IVs inherited from Ditto.

If we assume that HP is the random stat in this spread, Spd and SpAtk are the issue here.
The Egg should have inherited Charmander's or Ditto's values in those stats after all, right?
Has anyone tested this yet?
Male
Seen 1 Day Ago
Posted 1 Week Ago
117 posts
3.2 Years
[FR] Selection from PC Box

This hack allows the player to directly select a pokemon from the pc boxes by modifying the tasks associated with the withdraw function. It doesn't actually do anything with the selection except store relevant data, but this data can then be used in subsequent functions to modify relevant data.

Fortunately, I added in some new/updated specials to allow the user to swap pokemon between box and party for things like trading, nicknaming, and checking/setting pokeball types. Adding new specials for other data manipulation is easy enough, and I would be happy to add more if more ideas come to me.

Current Special Fixes Include:
Spoiler:

special 0x7 - get EVs of party/boxed pokemon
special 0x8 - get IVs of party/boxed pokemon
special 0xB - get pokeball ID of party/boxed pokemon
special 0xD - get happiness of party/boxed pokemon
special 0x13 - set happiness of party/boxed pokemon
special 0x14 - ste pokeball ID of party/boxed pokemon
special 0x1A - save/restore party pokemon data to/from free ram (default is 6th opponent slot)
special 0x1B - save/restore pokemon data to/from pc
special 0x7b - check nicknamed pokemon from party/box
special 0x7c - buffer party/boxed pokemon nickname
special 0x7d - check traded pokemon from party/box
special 0x9e - nickname pokemon from party/box


Here is the repository. The readme should do an adequate job of detailing the usage.

Here is a GIF of using this function with a wonder trade. (credit to sagiri for the dtan system)

Delta231

A noob

Male
India
Seen 18 Hours Ago
Posted 5 Days Ago
687 posts
3 Years
[FR] Selection from PC Box

This hack allows the player to directly select a pokemon from the pc boxes by modifying the tasks associated with the withdraw function. It doesn't actually do anything with the selection except store relevant data, but this data can then be used in subsequent functions to modify relevant data.

Fortunately, I added in some new/updated specials to allow the user to swap pokemon between box and party for things like trading, nicknaming, and checking/setting pokeball types. Adding new specials for other data manipulation is easy enough, and I would be happy to add more if more ideas come to me.

Here is the repository. The readme should do an adequate job of detailing the usage.

Here is a GIF of using this function with a wonder trade. (credit to sagiri for the dtan system)
May I request to remove those .exe files in the repository as not everyone in this community uses Windows and you can just link to those utilities .
Seen February 9th, 2019
Posted February 9th, 2019
1 posts
1.9 Years
Hello, I am interested in hacking the wild pokemon generator of Fire Red to influence the species in a similar manner as Static and Magnet Pull do in later games. I've searched many places, including this thread, but I have not found a routine for this. Does anyone know if this has been done before? If not, could you kindly give me advice on how to approach this problem? I am new to ASM but I have experience from other languages so I'm not a total beginner. I know how to compile and insert routines.

Petuuuhhh

Age 25
Male
Georgia
Seen 3 Hours Ago
Posted 2 Weeks Ago
613 posts
2.1 Years
Expanding the Bag Entirely [FR]

-Big Edit: The routines have been completely rewritten from scratch to work properly now.

This has been done in bits and pieces over the years (I believe it's actually been done completely for Emerald), so I decided to rewrite the bag storage routine for Fire Red.

Pre-Requisites
  • JPAN's Save Block Recycle
    Spoiler:
    .thumb
    .global JPAN_Save_Block_Recycle
    .equ rom, 0x8000000
    .equ offset, 0xA00000 @YOUR INSERT OFFSET HERE
    
    .org 0xD991E, 0xFF
    	bx r7
    
    .org 0xD995C, 0xFF
    .word Recycle_2 + rom + 1
    
    .org 0xD9EDC, 0xFF
    	ldr r0, .Pointer1
    	bx r0
    .align 2
    .Pointer1: .word Recycle_1 + rom + 1
    
    .org 0x3FEC9A, 0xFF
    .byte 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xE0, 0x1F, 0xF0, 0x0F, 0xD0, 0x2F, 0x98, 0xD, 0x0, 0x0, 0xF0, 0x0F, 0xF0, 0xF, 0xF0, 0xF, 0xE0, 0x1F, 0xF0, 0xF, 0xD0, 0x2F, 0xF0, 0xF, 0xC0, 0x3F, 0xF0, 0xF, 0xB0, 0x4F, 0xF0, 0xF, 0xA0, 0x5F, 0xF0, 0xF, 0x90, 0x6F, 0xF0, 0xF, 0x80, 0x7F, 0x50, 0x4
    
    .org offset, 0xFF
    Recycle_1:
    	ldr r1, [r4]
    	mov r3, #0xFF
    	lsl r3, #0x4
    	add r3, r1
    	ldrh r0, [r3, #0x4]
    	cmp r0, #0x0
    	beq Size1
    	cmp r0, #0x4
    	beq Size2
    	cmp r0, #0xD
    	beq Size3
    
    BigLoop:
    	cmp r5, #0xD
    	ble Return
    	mov r0, #0x1
    	pop {r3}
    	mov r8, r3
    	pop {r4-r7,pc}
    
    Size1:
    	mov r1, #0xCC
    	ldr r2, .Loc1
    	b SmallLoop
    
    Size2:
    	mov r1, #0x96
    	lsl r1, #0x2
    	ldr r2, .Loc2
    	b SmallLoop
    
    Size3:
    	mov r1, #0xBA
    	lsl r1, #0x4
    	ldr r2, .Loc3
    
    SmallLoop:
    	sub r3, #0x4
    	ldr r0, [r3]
    	str r0, [r2]
    	sub r2, #0x4
    	sub r1, #0x4
    	cmp r1, #0x0
    	bne SmallLoop
    	b BigLoop
    
    .align 2
    .Loc1: .word 0x203C1C8
    .Loc2: .word 0x203C420
    .Loc3: .word 0x203CFC0
    
    Return:
    	ldr r0, .Return
    	bx r0
    
    .align 2
    .Return: .word 0x80D9E71
    .word 0xFFFFFFFF
    
    Recycle_2:
    	mov r7, #0xFF
    	lsl r7, #0x4
    	add r7, r1, r7
    	strh r0, [r7, #0x6]
    	ldrh r6, [r7, #0x4]
    	cmp r6, #0x0
    	beq Size1_2
    	cmp r6, #0x4
    	beq Size2_2
    	cmp r6, #0xD
    	beq Size3_2
    	lsl r0, #0x0
    
    Return_2:
    	ldr r0, .Return2
    	bx r0
    
    .align 2
    .Return2: .word 0x80D9923
    
    Size1_2:
    	mov r3, #0xCC
    	ldr r2, .Loc1_2
    	b SmallLoop_2
    
    Size2_2:
    	mov r3, #0x96
    	lsl r3, #0x2
    	ldr r2, .Loc2_2
    	b SmallLoop_2
    
    Size3_2:
    	mov r3, #0xBA
    	lsl r3, #0x4
    	ldr r2, .Loc3_2
    
    SmallLoop_2:
    	sub r7, #0x4
    	ldr r0, [r2]
    	str r0, [r7]
    	sub r2, #0x4
    	sub r3, #0x4
    	cmp r3, #0x0
    	bne SmallLoop_2
    	b Return_2
    
    .align 2
    .Loc1_2: .word 0x203C1C8
    .Loc2_2: .word 0x203C420
    .Loc3_2: .word 0x203CFC0
    Insertion Instructions:
    1. Change the .equ offset, 0xA00000 to the offset where you plan on inserting the routine.
    2. Compile the asm file.
    3. Open the .bin file and copy all the data from 0xD991E, 0xD995C, 0xD9EDC 0x3FEC9A, and your insert offset to those same offsets in your rom.
  • An updated Conversion attack routine:
    Spoiler:

    In the following routine, change the location of your attack data at the top if necessary (if you haven't added new moves to your game it probably isn't). Assemble the routine, copy the data from the .bin file, and then do a paste-write at 0x28604 in your rom.

    Or if you don't understand ASM, copy and paste the compiled version to 0x28604 in your rom:
    F0 B5 1B 4F 18 48 19 49 09 78 58 22 51 43 40 18 03 1C 44 7D 85 7D 00 88 12 49 0C 22 50 43 09 18 08 78 A0 42 10 D0 A8 42 0E D0 58 75 98 75 04 1C 10 48 FD 21 01 70 03 21 41 70 84 70 FF 21 C1 70 39 68 05 31 39 60 F0 BD 3A 68 51 78 90 78 00 02 01 43 D0 78 00 04 01 43 10 79 00 06 01 43 39 60 F0 BD C0 46 06 0C 25 08 F0 3B 02 02 6B 3D 02 02 74 3D 02 02 B8 2A 02 02
    (This compiled version assumes you haven't added any new moves)

    Routine:
    .thumb
    .global atk90_changetypestoenemyattacktype
    
    .equ Attack_Data, 0x250C04 @0x900000 for Mr. DS
    .equ rom, 0x8000000
    
    @Conversion: Insert at 0x28604
    CheckMove:
    	push {r4-r7, lr}
    	ldr r7, .ScriptLoc
    	ldr r0, .BattleData
    	ldr r1, .UserBank
    	ldrb r1, [r1]
    	mov r2, #0x58
    	mul r1, r2
    	add r0, r1
    	mov r3, r0
    	ldrb r4, [r0, #0x15] @first type
    	ldrb r5, [r0, #0x16] @second type
    	ldrh r0, [r0] @First Move
    
    GetMoveType:
    	ldr r1, .MoveData
    	mov r2, #0xC
    	mul r0, r2
    	add r1, r0
    	ldrb r0, [r1]
    
    CheckTypeMatch:
    	cmp r0, r4
    	beq Failed
    	cmp r0, r5
    	beq Failed
    
    Store:
    	strb r0, [r3, #0x15]
    	strb r0, [r3, #0x16]
    
    Return:
    	mov r4, r0
    	ldr r0, =0x2022AB8
    	mov r1, #0xFD
    	strb r1, [r0]
    	mov r1, #0x3
    	strb r1, [r0, #0x1]
    	strb r4, [r0, #0x2]
    	mov r1, #0xFF
    	strb r1, [r0, #0x3]
    	ldr r1, [r7]
    	add r1, #0x5
    	str r1, [r7]
    	pop {r4-r7, pc}
    
    Failed:
    	ldr r2, [r7]
    	ldrb r1, [r2,#1]
    	ldrb r0, [r2,#2]
    	lsl r0, #8
    	orr r1, r0
    	ldrb r0, [r2,#3]
    	lsl r0, #0x10
    	orr r1, R0
    	ldrb r0, [r2,#4]
    	lsl r0, #0x18
    	orr r1, r0
    	str r1, [r7]
    	pop {r4-r7, pc}
    
    .align 2
    .MoveData: .word Attack_Data + 0x2  + rom
    .BattleData: .word 0x2023BE4 + 0xC
    .UserBank: .word 0x2023D6B
    .ScriptLoc: .word 0x2023D74


    Why Conversion?
    Spoiler:
    Some of the space from the old Conversion routine is used for the bag expansion. To free up this space, Conversion was rewritten to match its Gen 6+ effect.

The Code
Spoiler:
@Bag Cursor: 203AD0A
.equ Total_Item_Amount, 700 @Change to largest item index number

.equ Regular_Item_Num, 200 @Change to number of items in main bag pocket divided by 2
.equ Key_Item_Num, 30 @Change to number of items in key item pocket divided by 2
.equ Poke_Ball_Num, 14 @Change to number of items in Poke Ball pocket divided by 2
.equ TM_Num, 128 @Change to number of TMs + HMs
.equ Berry_Num, 67 @Change to number of berries

.equ TM_Ram, 0x202583C @Change to your TM Case RAM address
.equ Berry_Ram, 0x2025A3C @Change to your Berry Pouch RAM address
.equ Key_Item_Ram, 0x203C7D0 @Change to your Key Item pocket RAM address
.equ Poke_Ball_Ram, 0x203C8C0 @Change to your main Poke Ball Pocket RAM address
.equ Item_Ram, 0x203C930 @Change to your main bag pocket RAM address

.equ Free_Ram, 0x203D850 @Don't change unless you don't like this free ram
.equ offset, 0x8B3030 @Change to Free Space Offset

.equ largest_pocket_size, Regular_Item_Num * 2
.equ largest_pocket_size_plus_one, largest_pocket_size + 1
.equ strings_size, largest_pocket_size_plus_one * 19

.equ rom, 0x8000000

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@HelperRoutine

.org 0x28760, 0xFF
GetItemAmount:
	push {r1,lr}
	ldr r0, .CurrentPocket
	ldrb r0, [r0]
	lsl r0, #0x1
	ldr r1, .ItemStorage
	add r0, r1
	ldrh r0, [r0]
	pop {r1,pc}

.align 2
.CurrentPocket: .word 0x203AD02
.ItemStorage: .word Free_Ram

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Bag Decryption and DMA Negation
.org 0x4C064, 0xFF
mov r1, #0x0

.org 0x4C13C, 0xFF
mov r4, #0x0

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Routines Related to Obtaining Items

.org 0x99DFC, 0xFF
ldrh r0, [r0, #0x4]

.org 0x99E1A, 0xFF
ldrh r4, [r4, #0x4]

.org 0x99E44, 0xFF
ldr r1, .BagPocket0

@Regular items
ldr r0, ram_FREE_item
str r0, [r1]
mov r0, #Regular_Item_Num
lsl r0, #0x1 @400 regular items
strh r0, [r1, #0x4]

@Key items
ldr r0, ram_FREE_keyitem
str r0, [r1, #0x8]
mov r0, #(Key_Item_Num * 2) @60 key items
strh r0, [r1, #0xC]

@Poke balls
ldr r0, ball_ram
str r0, [r1, #0x10]
mov r0, #(Poke_Ball_Num * 2) @28 balls
strh r0, [r1, #0x14]

@Tms
ldr r0, tm_ram
str r0, [r1, #0x18]
mov r0, #TM_Num @128 TMs
strh r0, [r1, #0x1C]

@Berries
ldr r0, berry_ram
str r0, [r1, #0x20]
add r1, #0x24
mov r0, #Berry_Num @67 berries
strh r0, [r1]
bx lr

.align 2
.BagPocket0:		.word 0x203988C
tm_ram:			.word TM_Ram
berry_ram:		.word Berry_Ram
ram_FREE_keyitem:	.word Key_Item_Ram
ball_ram:		.word Poke_Ball_Ram
ram_FREE_item:		.word Item_Ram

.org 0x99ED8, 0xFF
ldrh r1, [r0, #0x4]

.org 0x99EEA, 0xFF
lsl r0, r2, #0x10
lsr r0, r0, #0x10

.org 0x99F16, 0xFF
ldrh r1, [r0, #0x4]

.org 0x99F32, 0xFF
lsl r0, r0, #0x10
lsl r2, r0, #0x10

.org 0x99F6E, 0xFF
ldrh r1, [r0, #0x4]

.org 0x99F9A, 0xFF
lsl r0, r0, #0x10
lsr r2, r0, #0x10
ldrh r0, [r3, #0x4]

.org 0x9A02A, 0xFF
ldrh r1, [r0, #0x4]

.org 0x9A05E, 0xFF
lsl r0, r0, #0x10
lsr r2, r0, #0x10
ldrh r0, [r3, #0x4]

.org 0x9A06E, 0xFF
lsl r0, r0, #0x10
lsr r0, r0, #0x10

.org 0x9A0B6, 0xFF
ldrh r1, [r0, #0x4]

.org 0x9A0EA, 0xFF
lsl r0, r0, #0x10
lsr r2, r0, #0x10
ldrh r0, [r5, #0x4]

.org 0x9A110, 0xFF
lsl r0, r0, #0x10
lsr r1, r0, #0x10

.org 0x9A14C, 0xFF
lsl r0, r0, #0x10
lsr r1, r0, #0x10

.org 0x9A186, 0xFF
lsl r0, r0, #0x10
lsr r2, r0, #0x10

.org 0x9A204, 0xFF
ldrh r1, [r0, #0x4]

.org 0x9A24E, 0xFF
lsl r0, r0, #0x10
lsr r2, r0, #0x10
ldrh r0, [r6, #0x4]

.org 0x9A2E8, 0xFF
ldrh r1, [r1, #0x4]

.org 0x9A58E, 0xFF @Shifting Items Up
lsl r1, #0x10
lsr r1, #0x10

.org 0x09A8A4, 0xFF
	lsl r0, #0x10
	lsr r0, #0x10
	ldr r1, .ItemLimit
	cmp r1, r0
	bge Return
	mov r0, #0x0
Return:
	bx lr

.align 2
.ItemLimit: .word Total_Item_Amount

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Routines Related to Viewing Items in Bag

Bag_Allocate_Stuff: @Credits to azurile13
.org 0x1083F4, 0xFF
	push {r4,lr}
	ldr r4, .AllocationPointer
	ldr r0, .LargestSize
	lsl r0, #0x3
	bl 0x2B9C @malloc
	str r0, [r4]
	cmp r0, #0x0
	beq No
	ldr r0, .strings_size
	bl 0x2B9C @malloc
	str r0, [r4, #0x4]
	cmp r0, #0x0
	beq No
	mov r0, #0x1
	b End

No:
	mov r0, #0x0

End:
	pop {r4,pc}

.align 2
.LargestSize: .word largest_pocket_size_plus_one
.AllocationPointer: .word 0x0203AD18
.strings_size: .word strings_size

.org 0x108440, 0xFF
bl 0x28760 @GetItemAmount
b 0x10844A

.org 0x10847E, 0xFF @Shop is dis one
bl 0x28760 @GetItemAmount
b 0x108488

.org 0x1084C2, 0xFF
bl 0x28760 @GetItemAmount
b 0x1084CA

.org 0x1085D8, 0xFF
push {r1}
bl 0x28760 @GetItemAmount
pop {r1}
cmp r0, r5

.org 0x108698, 0xFF
ldr r5, .Thing
ldrh r1, [r5, #0x6]
push {r1}
bl 0x28760 @GetItemAmount
pop {r1}
.hword 0x0
cmp r0, r4

.org 0x10871C, 0xFF
.Thing: .word 0x203ACFC

.org 0x10881E, 0xFF
ldr r1, .Thing2
ldrh r1, [r1, #0x6]
push {r1}
bl 0x28760 @GetItemAmount
pop {r1}
.hword 0x0
cmp r2, r0

.org 0x108850, 0xFF
.Thing2: .word 0x203ACFC

.org 0x108894, 0xFF
push {r1}
bl 0x28760 @GetItemAmount
pop {r1}
add r1, #0xD

.org 0x108A1C, 0xFF @Up Cursor Bug 1
ldr r1, .OpenBagBugFix1Pointer
bx r1
.align 2
.OpenBagBugFix1Pointer: .word OpenBagBugFix1 + rom + 1

.org 0x108A40, 0xFF @Up Cursor Bug 2
ldr r0, .OpenBagBugFix2Pointer
bx r0
.align 2
.OpenBagBugFix2Pointer: .word OpenBagBugFix2 + rom + 1
.hword 0x0

.org 0x108AC0, 0xFF @Up Cursor Bug 3
ldr r0, .OpenBagBugFix3Pointer
bx r0
.align 2
.OpenBagBugFix3Pointer: .word OpenBagBugFix3 + rom + 1

.org 0x108DC8, 0xFF
ldr r1, .StoreItemPointer
bx r1
.align 2
.StoreItemPointer: .word StoreItem + rom + 1

ldr r0, .Bag_Pocket_0_2
add r4, r1, r0
ldr r0, [r4]
ldrh r1, [r4, #0x4]

.org 0x108DEA, 0xFF
ldrh r0, [r4, #0x4]

.org 0x108E0A, 0xFF
ldrh r0, [r4, #0x4]

.org 0x108E20, 0xFF
ldr r0, .GetSmallestItemAmountPointer
bx r0
.align 2
.GetSmallestItemAmountPointer: .word GetSmallestItemAmount + rom + 1

.org 0x108E3C, 0xFF
.Bag_Pocket_0_2: .word 0x203988C

.org 0x108E4C, 0xFF
pop {r4-r6,pc}

.org 0x108FB6, 0xFF
ldrh r5, [r5, #0x6]
push {r1}
bl 0x28760 @GetItemAmount
pop {r1}
.hword 0x0
cmp r1, r0

.org 0x10904A, 0xFF
ldrh r1, [r5, #0x6]
push {r1}
bl 0x28760 @GetItemAmount
pop {r1}
.hword 0x0
cmp r4, r0

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Remove Help System
.org 0x13B8C2, 0xFF
b 0x13B900

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@New Routine

.org offset, 0xFF
StoreItem:
	push {r4-r6,lr}
	lsl r0, r0, #0x18
	lsr r5, r0, #0x18
	mov r4, #0x0

GetItemInBagCount:
	mov r6, #0x0
	lsl r0, r4, #0x3
	ldr r1, .Table
	add r0, r1
	ldrh r3, [r0, #0x4]
	lsl r3, #0x1
	ldr r0, [r0]
	mov r1, #0x0

Loop:
	cmp r1, r3
	beq StoreAmount
	ldrh r2, [r0]
	cmp r2, #0x0
	beq CheckNextItemJustInCase
	add r0, #0x4
	add r1, #0x1
	b Loop

CheckNextItemJustInCase:
	ldrh r2, [r0, #0x4]
	cmp r2, #0x0
	beq StoreAmount
	add r0, #0x4
	add r1, #0x1
	mov r6, #0x1
	b Loop	

StoreAmount:
	cmp r6, #0x0
	beq NotShopSkip
	sub r1, #0x1
NotShopSkip:
	ldr r0, .ItemStorage2
	lsl r2, r4, #0x1
	add r0, r2
	strh r1, [r0]
	add r4, #0x1
	cmp r4, #0x3
	beq ReturnToThing
	b GetItemInBagCount

ReturnToThing:
	lsl r1, r5, #0x3
	ldr r0, =0x8108DD1
	bx r0

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

GetSmallestItemAmount:
	push {r1}
	ldr r0, .ItemStorage2
	lsl r1, r5, #0x1
	add r0, r1
	pop {r1}
	ldrh r0, [r0]
	ldr r3, =0x8108E29
	bx r3

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

OpenBagBugFix1:
	push {r0}
	lsl r0, r4, #0x1
	ldr r1, .ItemStorage2
	add r1, r0
	ldrh r1, [r1]
	pop {r0}
	add r0, r1, #0x1
	cmp r2, r0
	ldr r0, =0x8108A27
	bx r0

OpenBagBugFix2:
	lsl r3, r4, #0x1
	ldr r0, .ItemStorage2
	add r0, r3
	ldrh r0, [r0]
	add r3, r0, #0x1
	ldr r4, =0x8108A4D
	bx r4

OpenBagBugFix3:
	lsl r1, r6, #0x1
	ldr r0, .ItemStorage2
	add r0, r1
	ldrh r0, [r0]
	add r0, #0x1
	ldr r1, =0x8108AC9
	bx r1

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

.align 2
.ItemStorage2: .word Free_Ram
.Table: .word TABLE + rom

TABLE:
.word Item_Ram
.hword Regular_Item_Num, 0x0

.word Key_Item_Ram
.hword Key_Item_Num, 0x0

.word Poke_Ball_Ram
.hword Poke_Ball_Num, 0x0
The above code is written in such a way that if you were to insert it as is, you would have support for:
  • 400 Regular Items
  • 60 Key Items
  • 28 Poke Balls
  • 128 TMs/HMs
  • 67 Berries

Obviously if you don't need this many items, you're free to change the ram locations and item amounts by modifying the lines at the top of the routine.

Insertion Instructions:
  1. Customize to your liking
  2. Assemble the routine
  3. Copy the output file and fill this copy with FFs
  4. Create a patch using your blank (filled with FFs) file as the unmodified file, and the output file as the modified file
  5. Patch your rom

This has been confirmed to work with a vanilla Fire Red. However, I can't guarantee it will work with all roms in progress.


Credits
Akame said JPAN's saveblock hack breaks flashcart compatibility. You can disable the Previously On Your Quest system and free up enough free ram for the bag, and since that ram gets saved by the game you can keep your items after turning the power off.

Edit: I read https://www.pokecommunity.com/showpost.php?p=6993092&postcount=204 and I think we were misinformed.

AkameTheBulbasaur

Akame Marukawa of Iyotono

Age 21
Male
A place :D
Seen 8 Hours Ago
Posted 3 Weeks Ago
359 posts
6 Years
It doesn't break flashcart compatibility if you're using the newest version, but it does mean you can't use Save Editors anymore, and you have to start a new save file. This may not be ideal for everyone (it wasn't for me), so here is the way to free up some RAM that gets saved.

To free up the RAM just do the following:

1. Put 28 E0 at 0x110F24
2. Put 04 20 at 0x11192A
3. Put 70 47 at 0x110AEC
4. Put 70 47 at 0x1123BC

This will free up about 8000 flags and 2900 vars (numbers are approximate). Full details are in this post below (ORIGINALLY BY JPAN SO THANK HIM)

https://www.pokecommunity.com/showpost.php?p=8795370&postcount=4

The RAM that I used to free up item space started at 0x2026840 and believe me it is plenty of space. What will happen is that you will lose any items currently in your bag after you switch over. So you'll need to deposit them/give them to PC Pokemon if you want to keep them (alternatively you can write a routine to move the data at the original item RAM over to the new one).

If you have a previous save file, your bag will be a bunch of junk because the save file wrote stuff in the RAM from the Previously On Your Quest thing. To fix that use this routine:

Spoiler:

.text
.align 2
.thumb
.thumb_func

Main:
push {r4-r5, lr}

ClearItems:
ldr r4, .RAMStart
mov r0, #0x0
Loop:
str r0, [r4]
add r4, r4, #0x4
ldr r5, .RAMEnd
cmp r4, r5
beq Return
b Loop

Return:
pop {r4-r5, pc}

.align 2
.RAMStart: .word 0xPLACE WHERE RAM STARTS
.RAMEnd: .word 0xPLACE WHERE RAM ENDS


This routine just makes everything in the RAM range go to zero (so your bag will then be empty and you can put all your items back in).

To use the above routine just insert it and then write an NPC using callasm and call the routine. Then just talk to the NPC you gave it to in-game, save and you'll be done. You can delete the routine and the script afterwards if you want to.
"The human sacrificed himself, to save the Pokemon. I pitted them against each other, but not until they set aside their differences did I see the true power they all share deep inside. I see now that the circumstances of one's birth are irrelevant; it is what you do with the gift of life that determines who you are." -Mewtwo
Seen April 7th, 2019
Posted February 17th, 2019
1 posts
99 Days
I've been working on a FR hack for a few months recreating Pokémon Colosseum/Gale of Darkness. About 95% done with the trainer editing (The shadow pokemon concept wasn't really working out as I was having trouble catching a specific pokemon from a trainer's party, so I've just been using the givepokemon command after the battle and using the flags from various overworld item sprites).

I'd really like to add a function where an opponents party level matches the highest in your party, like in the Mt Battle area in those games. Is there a way to set that up in a specific area of the game? Like to pull a certain trainer hex ID into the trainerbattle command and temporarily adjust the levels from their original setting to the highest in your party? Or would entirely new trainers have to be made? I'm leaning toward that because I've tried to find the trainers in the Trainer Tower in FR but they don't seem to be available to edit in trainer editing programs.

I've been scouring threads looking for info on this, but haven't had much luck. If anyone is able to help, wants to take a crack at it, or point me in the right direction I'd greatly appreciate it.

EDIT

I've come across how to get the highest level in my party, but I'm unsure how to have the game temporarily overwrite the trainer's pokemon level with a script, so I was thinking an ASM routine might be the way to go.
Seen 10 Hours Ago
Posted 1 Week Ago
45 posts
4.4 Years
[FR] Selection from PC Box

This hack allows the player to directly select a pokemon from the pc boxes by modifying the tasks associated with the withdraw function. It doesn't actually do anything with the selection except store relevant data, but this data can then be used in subsequent functions to modify relevant data.

Fortunately, I added in some new/updated specials to allow the user to swap pokemon between box and party for things like trading, nicknaming, and checking/setting pokeball types. Adding new specials for other data manipulation is easy enough, and I would be happy to add more if more ideas come to me.

Current Special Fixes Include:
Spoiler:

special 0x7 - get EVs of party/boxed pokemon
special 0x8 - get IVs of party/boxed pokemon
special 0xB - get pokeball ID of party/boxed pokemon
special 0xD - get happiness of party/boxed pokemon
special 0x13 - set happiness of party/boxed pokemon
special 0x14 - ste pokeball ID of party/boxed pokemon
special 0x1A - save/restore party pokemon data to/from free ram (default is 6th opponent slot)
special 0x1B - save/restore pokemon data to/from pc
special 0x7b - check nicknamed pokemon from party/box
special 0x7c - buffer party/boxed pokemon nickname
special 0x7d - check traded pokemon from party/box
special 0x9e - nickname pokemon from party/box


Here is the repository. The readme should do an adequate job of detailing the usage.

Here is a GIF of using this function with a wonder trade. (credit to sagiri for the dtan system)
GREAT!!!!
Can u make a example script please? I don't understand how to make it (I just read the README text in the repository). Thank you :)
Advertiser Content