top of page

Nature Changer

5.27

This routine rerolls the Personality value of a Pokémon in party to match a Nature of your choice, while keeping the same gender, Ability slot and shininess. CFRU is not required.

HMA Discord Link 2.png

Credits:

Defa


How To

Set var4 to the party slot

Set temp0 to the Nature ID

Then callasm <offset+1>


NOTE: If the Pokémon is shiny, it can take several seconds to find a correct Personality value and the game may look like it froze or crashed. You can add a preparemsg before callasm that says something like "Please wait..." to notify the player.


Add this routine to free space and note the offset:

main:
    push  {r4-r7, lr}
    sub   sp, #4
    ldr   r0, var4 @party mon index
    ldrh  r0, [r0]
    mov   r1, #100 @Pokemon data struct
    mul   r1, r0
    ldr   r0, gPlayerParty
    add   r0, r0, r1
    mov   r4, r0 @save slot
    mov   r0, r4
    mov   r1, #0 @MON_DATA_PERSONALITY
    ldr   r3, GetMonData
    bl    linker
    mov   r6, r0 @save PID
    mov   r1, #1
    and   r0, r1 @get Ability slot
    mov   r7, r0 @save which slot to change to
    mov   r0, r4 @get slot
    mov   r1, #11 @MON_DATA_SPECIES
    ldr   r3, GetMonData
    bl    linker
    mov   r5, r0 @save species
    mov   r1, r6 @get PID
    ldr   r3, GetGenderFSAP
    bl    linker
    mov   r8, r0 @save gender
    mov   r0, r4
    ldr   r3, IsMonShiny
    bl    linker
    mov   r9, r0 @save shininess
    mov   r0, r4
    mov   r1, #1 @MON_DATA_OT_ID
    ldr   r3, GetMonData
    bl    linker
    mov   r11, r0 @save OTID
    ldr   r0, temp0
    ldr   r3, VarGet
    bl    linker
    mov   r10, r0 @save Nature
generatepid:
    ldr   r3, Random
    bl    linker
    lsl   r0, r0, #16
    lsr   r0, r0, #16
    mov   r6, r0
    ldr   r3, Random
    bl    linker
    lsl   r0, r0, #16
    orr   r6, r0
    str   r6, [sp, #0]
    cmp   r7, #2
    beq   skipabilitycheck
    mov   r0, #1
    mov   r1, r6
    and   r1, r0 @get Ability slot
    cmp   r1, r7
    bne   generatepid
skipabilitycheck:
    mov   r0, r5
    mov   r1, r6
    ldr   r3, GetGenderFSAP
    bl    linker
    mov   r1, r8
    cmp   r0, r1
    bne   generatepid
    mov   r0, r11
    mov   r1, r6
    ldr   r3, IsShinyOtIdPersonality
    bl    linker
    mov   r1, r9
    cmp   r0, r1
    bne   generatepid
    mov   r0, r6
    ldr   r3, GetNatureFromPersonality
    bl    linker
    mov   r1, r10
    cmp   r0, r1
    bne   generatepid
    mov   r0, r4
    mov   r1, #0 @MON_DATA_PERSONALITY
    add   r2, sp, #0
    ldr   r3, SetMonData
    bl    linker
    mov   r0, r4
    ldr   r3, CalculateMonStats
    bl    linker
    add   sp, #4
    pop   {r4-r7, pc}
linker:
    bx    r3
monstats:
    .word <data.pokemon.stats>
temp0:
    .word 0x00004000
var4:
    .word 0x020370C0
gPlayerParty:
    .word 0x02024284
GetMonData:
    .word 0x0803FBE9
SetMonData:
    .word 0x0804037D
GetGenderFSAP: @FromSpeciesAndPersonality
    .word 0x0803F78D
IsMonShiny:
    .word 0x08044471
GetNatureFromPersonality:
    .word 0x08042EB5
VarGet:
    .word 0x0806E569
Random:
    .word 0x08044EC9
IsShinyOtIdPersonality:
    .word 0x0804449D
CalculateMonStats:
    .word 0x0803E47D

Happy Hacking!

 


bottom of page