.text
.align 2
.thumb
.thumb_func
main:
push {r0-r7, lr}
ldr r0, .SLOT @calculate address of Pokemon we want to evolve
ldrh r0, [r0]
mov r1, #0x64
mul r0, r0, r1
ldr r1, =(0x2024284)
add r0, r0, r1
mov r7, r0
mov r1, #0xB
ldr r3, =(0x803FBE8 +1) @get current species, prior to evolving
bl linker
mov r5, r0
bl getEvolvedForm @check what species it evolves into
mov r6, r0
mov r0, r7
mov r1, #0x38
ldr r3, =(0x803FBE8 +1) @save level before evolution
bl linker
mov r4, r0
SetEvolve:
mov r0, r7 @evolve it
ldr r2, .VAR
mov r1, r6
strh r1, [r2]
mov r1, #0xB
ldr r3, =(0x804037C +1)
bl linker
mov r0, r7
ldr r3, =(0x803E47C +1) @recalculate stats
bl linker
AddToDex:
mov r0, r6
ldr r3, =(0x8043298 +1) @get dex index of species
bl linker
mov r0, r6
mov r1, #0x2
ldr r3, =(0x8088E74 +1) @normal dex
bl linker
mov r0, r6
mov r1, #0x3
ldr r3, =(0x8088E74 +1) @national
bl linker
FinishCalc:
mov r0, r7 @check current level (after evolving)
mov r1, #0x38
ldr r3, =(0x803FBE8 +1)
bl linker
cmp r0, r4 @exp curves skewed level
bne AdjustLvl
b Nickname
getEvolvedForm:
ldr r0, =(0x20370BC)
ldrh r0, [r0]
bx lr
Nickname:
mov r0, r7
ldr r1, =(0x2021CD0) @store current nickname here
mov r2, r1
mov r1, #0x2
ldr r3, =(0x803FBE8 +1)
bl linker
ldr r0, =(0x8245EE0)@calculate species default name
mov r1, #0xB
mul r1, r1, r5
add r1, r1, r0
mov r5, r1
ldr r1, =(0x2021CD0)
mov r4, r1
mov r0, #0x0
checkEqual:
cmp r0, #0xA @While nickname has char
beq setName
add r5, r5, #0x1 @get next char of species name
ldrb r1, [r5]
add r4, r4, #0x1 @get next char of nickname
ldrb r2, [r4]
cmp r2, r1 @if x != y ==> has nickname
bne end
cmp r2, #0xFF @strings are 0xFF terminated
beq checkOne
b contLoop
checkOne:
cmp r1, #0xFF
beq setName
b end
contLoop:
add r0, r0, #0x1 @loop counter ++
b checkEqual
setName:
ldr r2, =(0x8245EE0) @set nickname as species name
mov r0, #0xB
mul r6, r6, r0
add r6, r6, r2
mov r0, r7
mov r2, r6
mov r1, #0x2
ldr r3, =(0x804037C +1)
bl linker
b end
AdjustLvl:
cmp r0, r4
beq Nickname
mov r2, r0
mov r0, r7
mov r1, #0x19
ldr r3, =(0x803FBE8 +1) @x = currentExp * 1.1
bl linker
mov r1, r0
lsr r0, #0x4
cmp r2, r4 @if current lvl < old lvl; currentExp -= x
bls subtract
add r1, r1, r0
b updateExp
subtract:
sub r1, r1, r0 @else currentExp += x
updateExp:
ldr r2, .VAR
str r1, [r2]
mov r1, #0x19
mov r0, r7
ldr r3, =(0x804037C +1)
bl linker
mov r0, r7
ldr r3, =(0x803E47C +1)
bl linker
mov r0, r7
mov r1, #0x38
ldr r3, =(0x803FBE8 +1)
bl linker
b AdjustLvl
end:
pop {r0-r7, pc}
linker:
bx r3
.align 2
.VAR:
.word 0x20270B8 + (0x8000 *2) @change to any 2 byte free space in RAM
.SLOT:
.word 0x20270B8 + (0x8001 *2) @slot of Pokemon to evolve