summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-06-13 13:49:41 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2020-06-13 13:49:41 -0400
commit321da97e6fdd66192484ca9aa60581b69fb3e7a4 (patch)
tree8d3793df30bb480a9c682846042184d8c83ec1d8
parentf93a6043eb52c63d1a64a3e9f10c113d4e5acc02 (diff)
Through ModifyStatByNature
-rw-r--r--arm9/asm/pokemon_s.s344
-rw-r--r--arm9/asm/unk_0202B034.s4
-rw-r--r--arm9/asm/unk_0206B688.s8
-rw-r--r--arm9/asm/unk_02079C70.s4
-rw-r--r--arm9/asm/unk_020842DC.s2
-rw-r--r--arm9/global.inc14
-rw-r--r--arm9/modules/05/asm/module_05.s4
-rw-r--r--arm9/modules/14/asm/module_14.s28
-rw-r--r--arm9/modules/27/asm/module_27.s4
-rw-r--r--arm9/modules/35/asm/module_35.s4
-rw-r--r--arm9/modules/69/asm/module_69.s6
-rw-r--r--arm9/modules/71/asm/module_71.s4
-rw-r--r--arm9/modules/80/asm/module_80.s16
-rw-r--r--arm9/modules/81/asm/module_81.s4
-rw-r--r--arm9/modules/83/asm/module_83.s4
-rw-r--r--arm9/src/pokemon.c172
-rw-r--r--include/filesystem.h1
-rw-r--r--include/pokemon.h24
18 files changed, 238 insertions, 409 deletions
diff --git a/arm9/asm/pokemon_s.s b/arm9/asm/pokemon_s.s
index 987aaf06..a2fb59bb 100644
--- a/arm9/asm/pokemon_s.s
+++ b/arm9/asm/pokemon_s.s
@@ -16,320 +16,10 @@
__local_str_poketool_personal_pms_narc: ; 0x02105FC8
.asciz "poketool/personal/pms.narc"
- .section .bss
-
- .global UNK_021C5AC0
-UNK_021C5AC0: ; 0x021C5AC0
- .space 0x194
-
.text
- thumb_func_start GetPercentProgressTowardsNextLevel
-GetPercentProgressTowardsNextLevel: ; 0x02068698
- push {r3-r7, lr}
- add r5, r0, #0x0
- bl TryDecryptMon
- str r0, [sp, #0x0]
- add r0, r5, #0x0
- mov r1, #0x5
- mov r2, #0x0
- bl GetMonData
- lsl r0, r0, #0x10
- lsr r6, r0, #0x10
- add r0, r5, #0x0
- mov r1, #0xa0
- mov r2, #0x0
- bl GetMonData
- lsl r0, r0, #0x18
- lsr r7, r0, #0x18
- add r0, r6, #0x0
- add r1, r7, #0x0
- bl GetMonExpBySpeciesAndLevel
- add r4, r0, #0x0
- add r0, r6, #0x0
- add r1, r7, #0x1
- bl GetMonExpBySpeciesAndLevel
- add r6, r0, #0x0
- add r0, r5, #0x0
- mov r1, #0x8
- mov r2, #0x0
- bl GetMonData
- add r7, r0, #0x0
- ldr r1, [sp, #0x0]
- add r0, r5, #0x0
- bl TryEncryptMon
- sub r1, r7, r4
- mov r0, #0x64
- mul r0, r1
- sub r1, r6, r4
- bl _u32_div_f
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- pop {r3-r7, pc}
-
- thumb_func_start CalcMonExpToNextLevelEncrypted
-CalcMonExpToNextLevelEncrypted: ; 0x020686F8
- ldr r3, _020686FC ; =CalcBoxMonExpToNextLevelEncrypted
- bx r3
- .balign 4
-_020686FC: .word CalcBoxMonExpToNextLevelEncrypted
-
- thumb_func_start CalcBoxMonExpToNextLevelEncrypted
-CalcBoxMonExpToNextLevelEncrypted: ; 0x02068700
- push {r4-r6, lr}
- mov r1, #0x5
- mov r2, #0x0
- add r4, r0, #0x0
- bl GetBoxMonData
- lsl r0, r0, #0x10
- lsr r6, r0, #0x10
- add r0, r4, #0x0
- bl CalcBoxMonLevelEncrypted
- add r0, r0, #0x1
- lsl r0, r0, #0x10
- lsr r5, r0, #0x10
- add r0, r4, #0x0
- mov r1, #0x8
- mov r2, #0x0
- bl GetBoxMonData
- add r4, r0, #0x0
- add r0, r6, #0x0
- add r1, r5, #0x0
- bl GetMonExpBySpeciesAndLevel
- sub r0, r0, r4
- pop {r4-r6, pc}
-
- thumb_func_start GetMonBaseExperienceAtCurrentLevel
-GetMonBaseExperienceAtCurrentLevel: ; 0x02068734
- push {r3-r5, lr}
- add r5, r0, #0x0
- mov r1, #0x5
- mov r2, #0x0
- bl GetMonData
- add r4, r0, #0x0
- add r0, r5, #0x0
- mov r1, #0xa0
- mov r2, #0x0
- bl GetMonData
- add r1, r0, #0x0
- add r0, r4, #0x0
- bl GetMonExpBySpeciesAndLevel
- pop {r3-r5, pc}
- .balign 4
-
- thumb_func_start GetMonExpBySpeciesAndLevel
-GetMonExpBySpeciesAndLevel: ; 0x02068758
- push {r4, lr}
- add r4, r1, #0x0
- mov r1, #0x15
- bl GetMonBaseStat
- add r1, r4, #0x0
- bl GetExpByGrowthRateAndLevel
- pop {r4, pc}
- .balign 4
-
- thumb_func_start LoadGrowthTable
-LoadGrowthTable: ; 0x0206876C
- push {r3-r5, lr}
- add r5, r0, #0x0
- add r4, r1, #0x0
- cmp r5, #0x8
- blt _0206877A
- bl ErrorHandling
-_0206877A:
- add r0, r4, #0x0
- mov r1, #0x3 ; NARC_POKETOOL_PERSONAL_GROWTBL
- add r2, r5, #0x0
- bl ReadWholeNarcMemberByIdPair
- pop {r3-r5, pc}
- .balign 4
-
- thumb_func_start GetExpByGrowthRateAndLevel
-GetExpByGrowthRateAndLevel: ; 0x02068788
- push {r4-r6, lr}
- add r6, r0, #0x0
- add r5, r1, #0x0
- cmp r6, #0x8
- blt _02068796
- bl ErrorHandling
-_02068796:
- cmp r5, #0x65
- ble _0206879E
- bl ErrorHandling
-_0206879E:
- mov r1, #0x65
- mov r0, #0x0
- lsl r1, r1, #0x2
- bl AllocFromHeap
- add r4, r0, #0x0
- add r0, r6, #0x0
- add r1, r4, #0x0
- bl LoadGrowthTable
- lsl r0, r5, #0x2
- ldr r5, [r4, r0]
- add r0, r4, #0x0
- bl FreeToHeap
- add r0, r5, #0x0
- pop {r4-r6, pc}
-
- thumb_func_start CalcMonLevelEncrypted
-CalcMonLevelEncrypted: ; 0x020687C0
- ldr r3, _020687C4 ; =CalcBoxMonLevelEncrypted
- bx r3
- .balign 4
-_020687C4: .word CalcBoxMonLevelEncrypted
-
- thumb_func_start CalcBoxMonLevelEncrypted
-CalcBoxMonLevelEncrypted: ; 0x020687C8
- push {r3-r7, lr}
- add r5, r0, #0x0
- bl TryDecryptBoxMon
- add r6, r0, #0x0
- add r0, r5, #0x0
- mov r1, #0x5
- mov r2, #0x0
- bl GetBoxMonData
- add r4, r0, #0x0
- add r0, r5, #0x0
- mov r1, #0x8
- mov r2, #0x0
- bl GetBoxMonData
- add r7, r0, #0x0
- add r0, r5, #0x0
- add r1, r6, #0x0
- bl TryEncryptBoxMon
- lsl r0, r4, #0x10
- lsr r0, r0, #0x10
- add r1, r7, #0x0
- bl CalcLevelBySpeciesAndExp
- pop {r3-r7, pc}
- .balign 4
-
- thumb_func_start CalcLevelBySpeciesAndExp
-CalcLevelBySpeciesAndExp: ; 0x02068800
- push {r4-r6, lr}
- add r4, r1, #0x0
- add r5, r0, #0x0
- mov r1, #0x0
- bl AllocAndLoadMonPersonal
- add r6, r0, #0x0
- add r1, r5, #0x0
- add r2, r4, #0x0
- bl CalcLevelBySpeciesAndExp_PreloadedPersonal
- add r4, r0, #0x0
- add r0, r6, #0x0
- bl FreeMonPersonal
- add r0, r4, #0x0
- pop {r4-r6, pc}
- .balign 4
-
- thumb_func_start CalcLevelBySpeciesAndExp_PreloadedPersonal
-CalcLevelBySpeciesAndExp_PreloadedPersonal: ; 0x02068824
- push {r4, lr}
- mov r1, #0x15
- add r4, r2, #0x0
- bl GetPersonalAttr
- ldr r1, _0206884C ; =UNK_021C5AC0
- bl LoadGrowthTable
- ldr r2, _02068850 ; =UNK_021C5AC0 + 4
- mov r1, #0x1
-_02068838:
- ldr r0, [r2, #0x0]
- cmp r0, r4
- bhi _02068846
- add r1, r1, #0x1
- add r2, r2, #0x4
- cmp r1, #0x65
- blt _02068838
-_02068846:
- sub r0, r1, #0x1
- pop {r4, pc}
- nop
-_0206884C: .word UNK_021C5AC0
-_02068850: .word UNK_021C5AC0 + 4
-
- thumb_func_start GetMonNature
-GetMonNature: ; 0x02068854
- ldr r3, _02068858 ; =GetBoxMonNature
- bx r3
- .balign 4
-_02068858: .word GetBoxMonNature
-
- thumb_func_start GetBoxMonNature
-GetBoxMonNature: ; 0x0206885C
- push {r4-r6, lr}
- add r5, r0, #0x0
- bl TryDecryptBoxMon
- mov r1, #0x0
- add r4, r0, #0x0
- add r0, r5, #0x0
- add r2, r1, #0x0
- bl GetBoxMonData
- add r6, r0, #0x0
- add r0, r5, #0x0
- add r1, r4, #0x0
- bl TryEncryptBoxMon
- add r0, r6, #0x0
- bl GetNatureFromPersonality
- pop {r4-r6, pc}
- .balign 4
-
- thumb_func_start GetNatureFromPersonality
-GetNatureFromPersonality: ; 0x02068884
- push {r3, lr}
- mov r1, #0x19
- bl _u32_div_f
- lsl r0, r1, #0x18
- lsr r0, r0, #0x18
- pop {r3, pc}
- .balign 4
-
- thumb_func_start ApplyNatureModToStat
-ApplyNatureModToStat: ; 0x02068894
- push {r3, lr}
- cmp r2, #0x1
- blo _0206889E
- cmp r2, #0x5
- bls _020688A2
-_0206889E:
- add r0, r1, #0x0
- pop {r3, pc}
-_020688A2:
- lsl r3, r0, #0x2
- add r3, r0, r3
- ldr r0, _020688E4 ; =sNatureStatMods
- sub r2, r2, #0x1
- add r0, r0, r3
- ldrsb r2, [r2, r0]
- mov r0, #0x0
- mvn r0, r0
- cmp r2, r0
- beq _020688CE
- cmp r2, #0x1
- bne _020688E0
- mov r0, #110
- mul r0, r1
- lsl r0, r0, #0x10
- lsr r0, r0, #0x10
- mov r1, #100
- bl _s32_div_f
- lsl r0, r0, #0x10
- lsr r1, r0, #0x10
- b _020688E0
-_020688CE:
- mov r0, #90
- mul r0, r1
- lsl r0, r0, #0x10
- lsr r0, r0, #0x10
- mov r1, #100
- bl _s32_div_f
- lsl r0, r0, #0x10
- lsr r1, r0, #0x10
-_020688E0:
- add r0, r1, #0x0
- pop {r3, pc}
- .balign 4
-_020688E4: .word sNatureStatMods
+ .extern LoadGrowthTable
+ .extern GetExpByGrowthRateAndLevel
thumb_func_start MonApplyFriendshipModEncrypted
MonApplyFriendshipModEncrypted: ; 0x020688E8
@@ -468,7 +158,7 @@ _020689E4: .word GetBoxMonGenderEncrypted
GetBoxMonGenderEncrypted: ; 0x020689E8
push {r3-r7, lr}
add r5, r0, #0x0
- bl TryDecryptBoxMon
+ bl AcquireBoxMonLock
add r6, r0, #0x0
add r0, r5, #0x0
mov r1, #0x5
@@ -483,7 +173,7 @@ GetBoxMonGenderEncrypted: ; 0x020689E8
add r7, r0, #0x0
add r0, r5, #0x0
add r1, r6, #0x0
- bl TryEncryptBoxMon
+ bl ReleaseBoxMonLock
add r0, r4, #0x0
add r1, r7, #0x0
bl GetGenderBySpeciesAndPersonality
@@ -682,7 +372,7 @@ FUN_02068B70: ; 0x02068B70
str r0, [sp, #0xc]
add r0, r5, #0x0
str r2, [sp, #0x10]
- bl TryDecryptBoxMon
+ bl AcquireBoxMonLock
str r0, [sp, #0x18]
add r0, r5, #0x0
mov r1, #0xad
@@ -734,7 +424,7 @@ _02068BD8:
bl FUN_02068C00
ldr r1, [sp, #0x18]
add r0, r5, #0x0
- bl TryEncryptBoxMon
+ bl ReleaseBoxMonLock
add sp, #0x1c
pop {r4-r7, pc}
nop
@@ -2142,7 +1832,7 @@ InitBoxMonMoveset: ; 0x020695F4
bl AllocFromHeap
str r0, [sp, #0x0]
add r0, r5, #0x0
- bl TryDecryptBoxMon
+ bl AcquireBoxMonLock
str r0, [sp, #0x4]
add r0, r5, #0x0
mov r1, #0x5
@@ -2156,7 +1846,7 @@ InitBoxMonMoveset: ; 0x020695F4
bl GetBoxMonData
add r7, r0, #0x0
add r0, r5, #0x0
- bl CalcBoxMonLevelEncrypted
+ bl CalcBoxMonLevel
lsl r0, r0, #0x18
lsr r6, r0, #0x18
ldr r2, [sp, #0x0]
@@ -2201,7 +1891,7 @@ _0206967C:
bl FreeToHeap
ldr r1, [sp, #0x4]
add r0, r5, #0x0
- bl TryEncryptBoxMon
+ bl ReleaseBoxMonLock
add sp, #0x8
pop {r3-r7, pc}
nop
@@ -2225,7 +1915,7 @@ FUN_020696A8: ; 0x020696A8
ldr r1, _02069700 ; =0x0000FFFF
add r6, r0, #0x0
str r1, [sp, #0x4]
- bl TryDecryptBoxMon
+ bl AcquireBoxMonLock
mov r4, #0x0
str r0, [sp, #0x0]
add r7, r4, #0x0
@@ -2258,7 +1948,7 @@ _020696EA:
_020696F0:
ldr r1, [sp, #0x0]
add r0, r6, #0x0
- bl TryEncryptBoxMon
+ bl ReleaseBoxMonLock
ldr r0, [sp, #0x4]
add sp, #0x8
pop {r3-r7, pc}
@@ -2281,7 +1971,7 @@ FUN_02069718: ; 0x02069718
sub sp, #0x20
add r5, r0, #0x0
str r1, [sp, #0x0]
- bl TryDecryptBoxMon
+ bl AcquireBoxMonLock
str r0, [sp, #0xc]
add r0, sp, #0x18
mov r4, #0x0
@@ -2356,7 +2046,7 @@ _0206978A:
blt _0206978A
ldr r1, [sp, #0xc]
add r0, r5, #0x0
- bl TryEncryptBoxMon
+ bl ReleaseBoxMonLock
add sp, #0x20
pop {r3-r7, pc}
.balign 4
@@ -3702,7 +3392,7 @@ FUN_0206A1CC: ; 0x0206A1CC
push {r3-r7, lr}
sub sp, #0x8
add r5, r0, #0x0
- bl TryDecryptBoxMon
+ bl AcquireBoxMonLock
add r7, r0, #0x0
add r0, r5, #0x0
mov r1, #0x5
@@ -3746,7 +3436,7 @@ _0206A226:
_0206A230:
add r0, r5, #0x0
add r1, r7, #0x0
- bl TryEncryptBoxMon
+ bl ReleaseBoxMonLock
add sp, #0x8
pop {r3-r7, pc}
@@ -5029,7 +4719,7 @@ FUN_0206AAB4: ; 0x0206AAB4
push {r3-r7, lr}
sub sp, #0x8
add r5, r0, #0x0
- bl TryDecryptBoxMon
+ bl AcquireBoxMonLock
mov r4, #0x0
str r0, [sp, #0x0]
add r7, r4, #0x0
@@ -5059,7 +4749,7 @@ _0206AAF0:
blt _0206AAC6
ldr r1, [sp, #0x0]
add r0, r5, #0x0
- bl TryEncryptBoxMon
+ bl ReleaseBoxMonLock
add sp, #0x8
pop {r3-r7, pc}
.balign 4
diff --git a/arm9/asm/unk_0202B034.s b/arm9/asm/unk_0202B034.s
index 9caae8d5..1f26f48a 100644
--- a/arm9/asm/unk_0202B034.s
+++ b/arm9/asm/unk_0202B034.s
@@ -79,7 +79,7 @@ _0202B0BA:
add r1, r7, #0x0
bl FUN_0206B9B0
add r4, r0, #0x0
- bl TryDecryptMon
+ bl AcquireMonLock
str r0, [sp, #0xc]
add r0, r4, #0x0
mov r1, #0x4c
@@ -162,7 +162,7 @@ _0202B17C:
_0202B17E:
ldr r1, [sp, #0xc]
add r0, r4, #0x0
- bl TryEncryptMon
+ bl ReleaseMonLock
ldr r0, [sp, #0x10]
add r7, r7, #0x1
cmp r7, r0
diff --git a/arm9/asm/unk_0206B688.s b/arm9/asm/unk_0206B688.s
index dc966ba6..9b6e863e 100644
--- a/arm9/asm/unk_0206B688.s
+++ b/arm9/asm/unk_0206B688.s
@@ -46,7 +46,7 @@ UNK_020F8074: ; 0x020F8074
FUN_0206B688: ; 0x0206B688
push {r3-r7, lr}
add r5, r0, #0x0
- bl TryDecryptBoxMon
+ bl AcquireBoxMonLock
add r7, r0, #0x0
add r0, r5, #0x0
mov r1, #0x5
@@ -67,7 +67,7 @@ FUN_0206B688: ; 0x0206B688
add r4, r0, #0x0
add r0, r5, #0x0
add r1, r7, #0x0
- bl TryEncryptBoxMon
+ bl ReleaseBoxMonLock
add r0, r4, #0x0
pop {r3-r7, pc}
@@ -289,7 +289,7 @@ _0206B838: .word UNK_020F8074
FUN_0206B83C: ; 0x0206B83C
push {r3-r7, lr}
add r5, r0, #0x0
- bl TryDecryptBoxMon
+ bl AcquireBoxMonLock
add r4, r0, #0x0
add r0, r5, #0x0
bl FUN_0206B754
@@ -306,7 +306,7 @@ FUN_0206B83C: ; 0x0206B83C
str r0, [sp, #0x0]
add r0, r5, #0x0
add r1, r4, #0x0
- bl TryEncryptBoxMon
+ bl ReleaseBoxMonLock
ldr r2, [sp, #0x0]
add r0, r7, #0x0
add r1, r6, #0x0
diff --git a/arm9/asm/unk_02079C70.s b/arm9/asm/unk_02079C70.s
index b3b27fb5..978c1f6d 100644
--- a/arm9/asm/unk_02079C70.s
+++ b/arm9/asm/unk_02079C70.s
@@ -1843,7 +1843,7 @@ FUN_0207AB0C: ; 0x0207AB0C
add r7, r0, #0x0
add r0, r6, #0x0
add r5, r2, #0x0
- bl TryDecryptMon
+ bl AcquireMonLock
str r0, [sp, #0x4]
add r0, r6, #0x0
mov r1, #0x5
@@ -2308,7 +2308,7 @@ _0207AF04:
blo _0207AECC
ldr r1, [sp, #0x4]
add r0, r6, #0x0
- bl TryEncryptMon
+ bl ReleaseMonLock
add sp, #0x8
pop {r3-r7, pc}
nop
diff --git a/arm9/asm/unk_020842DC.s b/arm9/asm/unk_020842DC.s
index f06037c2..fa59f95c 100644
--- a/arm9/asm/unk_020842DC.s
+++ b/arm9/asm/unk_020842DC.s
@@ -797,7 +797,7 @@ _0208495C:
cmp r0, #0x64
bge _020849B2
add r0, r5, #0x0
- bl CalcMonExpToNextLevelEncrypted
+ bl CalcMonExpToNextLevel
add r2, r0, #0x0
add r0, r5, #0x0
mov r1, #0x8
diff --git a/arm9/global.inc b/arm9/global.inc
index 21cfb40c..e61ae077 100644
--- a/arm9/global.inc
+++ b/arm9/global.inc
@@ -4708,10 +4708,10 @@
.extern ZeroBoxMonData
.extern SizeOfStructPokemon
.extern AllocMonZeroed
-.extern TryDecryptMon
-.extern TryEncryptMon
-.extern TryDecryptBoxMon
-.extern TryEncryptBoxMon
+.extern AcquireMonLock
+.extern ReleaseMonLock
+.extern AcquireBoxMonLock
+.extern ReleaseBoxMonLock
.extern CreateMon
.extern CreateMonWithNature
.extern CreateMonWithGenderNatureLetter
@@ -4730,11 +4730,11 @@
.extern GetMonBaseStat_HandleFormeConversion
.extern GetMonBaseStat
.extern GetPercentProgressTowardsNextLevel
-.extern CalcMonExpToNextLevelEncrypted
+.extern CalcMonExpToNextLevel
.extern GetMonBaseExperienceAtCurrentLevel
.extern GetMonExpBySpeciesAndLevel
-.extern CalcMonLevelEncrypted
-.extern CalcBoxMonLevelEncrypted
+.extern CalcMonLevel
+.extern CalcBoxMonLevel
.extern CalcLevelBySpeciesAndExp
.extern CalcLevelBySpeciesAndExp_PreloadedPersonal
.extern GetMonNature
diff --git a/arm9/modules/05/asm/module_05.s b/arm9/modules/05/asm/module_05.s
index cb8c25bd..736c4f38 100644
--- a/arm9/modules/05/asm/module_05.s
+++ b/arm9/modules/05/asm/module_05.s
@@ -43403,7 +43403,7 @@ MOD05_021EC744: ; 0x021EC744
add r2, sp, #0
bl SetBoxMonData
add r0, r4, #0
- bl CalcBoxMonLevelEncrypted
+ bl CalcBoxMonLevel
add r4, r0, #0
add r0, r7, #0
bl FreeToHeap
@@ -43416,7 +43416,7 @@ MOD05_021EC78C: ; 0x021EC78C
add r5, r0, #0
bl FUN_02023C7C
add r6, r0, #0
- bl CalcBoxMonLevelEncrypted
+ bl CalcBoxMonLevel
lsl r0, r0, #0x18
lsr r4, r0, #0x18
add r0, r5, #0
diff --git a/arm9/modules/14/asm/module_14.s b/arm9/modules/14/asm/module_14.s
index e8b7dfbc..0b764ed1 100644
--- a/arm9/modules/14/asm/module_14.s
+++ b/arm9/modules/14/asm/module_14.s
@@ -4713,7 +4713,7 @@ _021D9B9E:
add r1, r6, #0
bl FUN_0206B9B0
add r4, r0, #0
- bl TryDecryptMon
+ bl AcquireMonLock
add r7, r0, #0
add r0, r4, #0
mov r1, #0xac
@@ -4731,7 +4731,7 @@ _021D9B9E:
_021D9BD2:
add r0, r4, #0
add r1, r7, #0
- bl TryEncryptMon
+ bl ReleaseMonLock
cmp r5, #2
blt _021D9BE4
add sp, #8
@@ -5455,7 +5455,7 @@ MOD14_021DA168: ; 0x021DA168
mov r1, #0
add r5, r0, #0
str r1, [sp, #4]
- bl TryDecryptBoxMon
+ bl AcquireBoxMonLock
str r0, [sp]
add r0, r5, #0
mov r1, #0xac
@@ -5483,7 +5483,7 @@ _021DA1A2:
_021DA1A8:
ldr r1, [sp]
add r0, r5, #0
- bl TryEncryptBoxMon
+ bl ReleaseBoxMonLock
ldr r0, [sp, #4]
add sp, #8
pop {r3, r4, r5, r6, r7, pc}
@@ -9189,7 +9189,7 @@ MOD14_021DBEAC: ; 0x021DBEAC
add r0, r5, #0
add r6, r2, #0
add r4, #0x4c
- bl TryDecryptBoxMon
+ bl AcquireBoxMonLock
str r0, [sp]
str r5, [r7, #0x4c]
add r0, r5, #0
@@ -9323,7 +9323,7 @@ _021DBFB8:
bl FreeMonPersonal
ldr r1, [sp]
add r0, r5, #0
- bl TryEncryptBoxMon
+ bl ReleaseBoxMonLock
pop {r3, r4, r5, r6, r7, pc}
thumb_func_start MOD14_021DBFF4
@@ -9371,7 +9371,7 @@ _021DC034:
mov r0, #0x1a
lsl r0, r0, #4
ldr r0, [r5, r0]
- bl TryDecryptMon
+ bl AcquireMonLock
add r6, r0, #0
mov r0, #0x1a
lsl r0, r0, #4
@@ -9489,7 +9489,7 @@ _021DC034:
lsl r0, r0, #4
ldr r0, [r5, r0]
add r1, r6, #0
- bl TryEncryptMon
+ bl ReleaseMonLock
add r0, r7, #0
add r0, #0xa4
ldrb r0, [r0]
@@ -18859,7 +18859,7 @@ MOD14_021E0940: ; 0x021E0940
str r2, [sp, #8]
str r3, [sp, #0xc]
ldr r4, [sp, #0x64]
- bl TryDecryptBoxMon
+ bl AcquireBoxMonLock
lsl r0, r0, #0x18
lsr r0, r0, #0x18
str r0, [sp, #0x10]
@@ -18971,7 +18971,7 @@ _021E0A36:
bl MOD14_021E0B54
ldr r1, [sp, #0x10]
add r0, r6, #0
- bl TryEncryptBoxMon
+ bl ReleaseBoxMonLock
add sp, #0x44
pop {r4, r5, r6, r7, pc}
.align 2, 0
@@ -18987,7 +18987,7 @@ MOD14_021E0A60: ; 0x021E0A60
str r2, [sp, #8]
add r7, r3, #0
ldr r4, [sp, #0x70]
- bl TryDecryptBoxMon
+ bl AcquireBoxMonLock
str r0, [sp, #0x14]
add r0, r6, #0
mov r1, #0x4c
@@ -19079,7 +19079,7 @@ _021E0B28:
bl MOD14_021E0B54
ldr r1, [sp, #0x14]
add r0, r6, #0
- bl TryEncryptBoxMon
+ bl ReleaseBoxMonLock
add sp, #0x40
pop {r3, r4, r5, r6, r7, pc}
nop
@@ -21819,7 +21819,7 @@ _021E204A:
bl FUN_0206B5E4
add r4, r4, #1
add r5, r0, #0
- bl TryDecryptBoxMon
+ bl AcquireBoxMonLock
lsl r0, r0, #0x18
lsr r0, r0, #0x18
str r0, [sp, #0x1c]
@@ -21876,7 +21876,7 @@ _021E20AA:
_021E20C8:
ldr r1, [sp, #0x1c]
add r0, r5, #0
- bl TryEncryptBoxMon
+ bl ReleaseBoxMonLock
ldr r0, [sp, #0x24]
add r6, r6, #2
add r0, r0, #1
diff --git a/arm9/modules/27/asm/module_27.s b/arm9/modules/27/asm/module_27.s
index 58b7d707..ee9a4bd1 100644
--- a/arm9/modules/27/asm/module_27.s
+++ b/arm9/modules/27/asm/module_27.s
@@ -305,7 +305,7 @@ _02254A62:
add r1, r6, #0
bl FUN_0206B9B0
add r4, r0, #0
- bl TryDecryptMon
+ bl AcquireMonLock
add r7, r0, #0
add r0, r4, #0
bl FUN_0206B688
@@ -354,7 +354,7 @@ _02254ABE:
strb r0, [r5, #0x13]
add r0, r4, #0
add r1, r7, #0
- bl TryEncryptMon
+ bl ReleaseMonLock
ldr r0, [sp]
add r6, r6, #1
ldr r0, [r0]
diff --git a/arm9/modules/35/asm/module_35.s b/arm9/modules/35/asm/module_35.s
index 5ef1d37f..760c2f64 100644
--- a/arm9/modules/35/asm/module_35.s
+++ b/arm9/modules/35/asm/module_35.s
@@ -330,7 +330,7 @@ _02254A7A:
str r0, [sp, #8]
bl FUN_02023C7C
add r4, r0, #0
- bl TryDecryptBoxMon
+ bl AcquireBoxMonLock
str r0, [sp, #0xc]
add r0, r4, #0
bl FUN_0206B688
@@ -353,7 +353,7 @@ _02254A7A:
str r0, [r5, #0x14]
ldr r1, [sp, #0xc]
add r0, r4, #0
- bl TryEncryptBoxMon
+ bl ReleaseBoxMonLock
ldr r0, [sp]
add r7, r7, #1
ldrb r0, [r0]
diff --git a/arm9/modules/69/asm/module_69.s b/arm9/modules/69/asm/module_69.s
index 2e724605..3199be5d 100644
--- a/arm9/modules/69/asm/module_69.s
+++ b/arm9/modules/69/asm/module_69.s
@@ -2360,7 +2360,7 @@ MOD69_0222E8FC: ; 0x0222E8FC
mov r1, #0
bl FUN_0200AC60
ldr r0, [r4, #0x24]
- bl CalcMonLevelEncrypted
+ bl CalcMonLevel
add r2, r0, #0
mov r0, #0
str r0, [sp]
@@ -4037,7 +4037,7 @@ MOD69_0222F6C4: ; 0x0222F6C4
add r5, r0, #0
add r0, r4, #0
add r6, r2, #0
- bl TryDecryptMon
+ bl AcquireMonLock
str r0, [sp]
add r0, r4, #0
mov r1, #0x79
@@ -4124,7 +4124,7 @@ _0222F778:
_0222F77A:
ldr r1, [sp]
add r0, r4, #0
- bl TryEncryptMon
+ bl ReleaseMonLock
add r0, r5, #0
pop {r3, r4, r5, r6, r7, pc}
nop
diff --git a/arm9/modules/71/asm/module_71.s b/arm9/modules/71/asm/module_71.s
index 3e877d49..bc13fe8f 100644
--- a/arm9/modules/71/asm/module_71.s
+++ b/arm9/modules/71/asm/module_71.s
@@ -1343,7 +1343,7 @@ MOD71_0222E118: ; 0x0222E118
push {r3, r4, r5, r6, r7, lr}
add r5, r0, #0
add r4, r1, #0
- bl TryDecryptMon
+ bl AcquireMonLock
add r7, r0, #0
add r0, r5, #0
mov r1, #0x9a
@@ -1382,7 +1382,7 @@ MOD71_0222E118: ; 0x0222E118
add r6, r0, #0
add r0, r5, #0
add r1, r7, #0
- bl TryEncryptMon
+ bl ReleaseMonLock
ldrh r0, [r4]
cmp r0, #0
beq _0222E18E
diff --git a/arm9/modules/80/asm/module_80.s b/arm9/modules/80/asm/module_80.s
index 4762946f..ffa44bd8 100644
--- a/arm9/modules/80/asm/module_80.s
+++ b/arm9/modules/80/asm/module_80.s
@@ -10777,7 +10777,7 @@ MOD80_02232BD4: ; 0x02232BD4
MOD80_02232C2C: ; 0x02232C2C
push {r4, lr}
add r4, r1, #0
- bl CalcBoxMonLevelEncrypted
+ bl CalcBoxMonLevel
strb r0, [r4, #3]
pop {r4, pc}
thumb_func_end MOD80_02232C2C
@@ -10832,7 +10832,7 @@ MOD80_02232C88: ; 0x02232C88
add r7, r2, #0
add r6, r3, #0
ldr r4, [sp, #0x40]
- bl TryDecryptBoxMon
+ bl AcquireBoxMonLock
add r0, r5, #0
mov r1, #0xab
mov r2, #0
@@ -10874,7 +10874,7 @@ MOD80_02232C88: ; 0x02232C88
_02232CF2:
add r0, r5, #0
mov r1, #1
- bl TryEncryptBoxMon
+ bl ReleaseBoxMonLock
ldr r0, [sp, #0x1c]
cmp r0, #0
beq _02232D60
@@ -11266,7 +11266,7 @@ MOD80_02233018: ; 0x02233018
push {r3, r4, r5, r6, r7, lr}
add r7, r0, #0
mov r4, #0
- bl TryDecryptBoxMon
+ bl AcquireBoxMonLock
ldr r5, _02233050 ; =0x02237220
str r0, [sp]
add r6, r4, #0
@@ -11282,7 +11282,7 @@ _02233028:
blt _02233028
ldr r1, [sp]
add r0, r7, #0
- bl TryEncryptBoxMon
+ bl ReleaseBoxMonLock
cmp r4, #0
beq _0223304C
mov r0, #1
@@ -11397,7 +11397,7 @@ MOD80_022330E4: ; 0x022330E4
add r0, sp, #0
strb r1, [r0, #2]
add r0, r5, #0
- bl CalcBoxMonLevelEncrypted
+ bl CalcBoxMonLevel
add r1, sp, #0
strb r0, [r1, #3]
add r0, sp, #0
@@ -11433,7 +11433,7 @@ MOD80_0223311C: ; 0x0223311C
add r0, r5, #0
add r0, #0xbc
ldr r0, [r0]
- bl CalcBoxMonLevelEncrypted
+ bl CalcBoxMonLevel
add r1, sp, #0
strb r0, [r1, #9]
add r0, r4, #0
@@ -13381,7 +13381,7 @@ MOD80_022340DC: ; 0x022340DC
bl GetBoxMonData
add r6, r0, #1
ldr r0, [sp, #0xc]
- bl CalcBoxMonLevelEncrypted
+ bl CalcBoxMonLevel
str r0, [sp, #0x10]
add r0, r4, #0
mov r1, #0x64
diff --git a/arm9/modules/81/asm/module_81.s b/arm9/modules/81/asm/module_81.s
index abe12301..82f5fbd1 100644
--- a/arm9/modules/81/asm/module_81.s
+++ b/arm9/modules/81/asm/module_81.s
@@ -999,7 +999,7 @@ _0223860E:
ldr r4, [r0, #4]
_02238610:
add r0, r4, #0
- bl TryDecryptBoxMon
+ bl AcquireBoxMonLock
str r0, [sp, #0x20]
add r0, sp, #0x34
add r1, r4, #0
@@ -1051,7 +1051,7 @@ _02238648:
bl FUN_02017E14
ldr r1, [sp, #0x20]
add r0, r4, #0
- bl TryEncryptBoxMon
+ bl ReleaseBoxMonLock
add r0, r7, #0
bl FreeToHeap
_02238690:
diff --git a/arm9/modules/83/asm/module_83.s b/arm9/modules/83/asm/module_83.s
index 1dbf90c3..bd2f6d2f 100644
--- a/arm9/modules/83/asm/module_83.s
+++ b/arm9/modules/83/asm/module_83.s
@@ -21866,7 +21866,7 @@ MOD83_02237F6C: ; 0x02237F6C
add r0, r4, #0
bl ZeroBoxMonData
add r0, r4, #0
- bl TryDecryptBoxMon
+ bl AcquireBoxMonLock
mov r1, #0
str r0, [sp]
add r0, r6, #0
@@ -22580,7 +22580,7 @@ _0223853E:
bl SetBoxMonData
ldr r1, [sp]
add r0, r4, #0
- bl TryEncryptBoxMon
+ bl ReleaseBoxMonLock
add sp, #0x30
pop {r3, r4, r5, r6, r7, pc}
nop
diff --git a/arm9/src/pokemon.c b/arm9/src/pokemon.c
index 02428ff6..663b581a 100644
--- a/arm9/src/pokemon.c
+++ b/arm9/src/pokemon.c
@@ -2,6 +2,7 @@
#define IN_POKEMON_C
#include "proto.h"
#include "pokemon.h"
+#include "filesystem.h"
#include "heap.h"
#include "MI_memory.h"
#include "math_util.h"
@@ -18,6 +19,7 @@ void SetMonDataInternal(struct Pokemon * pokemon, int attr, void * ptr);
void SetBoxMonDataInternal(struct BoxPokemon * pokemon, int attr, void * ptr);
void AddMonDataInternal(struct Pokemon * pokemon, int attr, int amount);
void AddBoxMonData(struct BoxPokemon * pokemon, int attr, int amount);
+u32 CalcBoxMonExpToNextLevel(struct BoxPokemon * boxmon);
void LoadMonPersonal(int species, struct BaseStats * personal);
int ResolveMonForme(int species, int forme);
@@ -28,7 +30,7 @@ u16 CalcMonChecksum(void * datap, u32 size);
void InitBoxMonMoveset(struct BoxPokemon * boxmon);
PokemonDataBlock * GetSubstruct(struct BoxPokemon * boxmon, u32 personality, u32 which_struct);
void LoadMonBaseStats_HandleAlternateForme(u32 species, u32 forme, struct BaseStats * baseStats);
-int ApplyNatureModToStat(u8 nature, u16 statval, u32 statno);
+u16 ModifyStatByNature(u8 nature, u16 statval, u8 statno);
#define ENCRY_ARGS_PTY(mon) &(mon)->party, sizeof((mon)->party), (mon)->box.pid
#define ENCRY_ARGS_BOX(boxmon) &(boxmon)->substructs, sizeof((boxmon)->substructs), (boxmon)->checksum
@@ -113,7 +115,7 @@ const s8 UNK_020F7F16[][5] = {
{ 0, 0, 0, 0, 0},
};
-const u8 sNatureStatMods[][5] = {
+const s8 sNatureStatMods[][5] = {
{ 0, 0, 0, 0, 0 },
{ 1, -1, 0, 0, 0 },
{ 1, 0, -1, 0, 0 },
@@ -166,7 +168,7 @@ struct Pokemon * AllocMonZeroed(u32 heap_id)
return pokemon;
}
-BOOL TryDecryptMon(struct Pokemon * mon)
+BOOL AcquireMonLock(struct Pokemon * mon)
{
BOOL ret = FALSE;
@@ -182,7 +184,7 @@ BOOL TryDecryptMon(struct Pokemon * mon)
return ret;
}
-BOOL TryEncryptMon(struct Pokemon * mon, BOOL decrypt_result)
+BOOL ReleaseMonLock(struct Pokemon * mon, BOOL decrypt_result)
{
BOOL ret = FALSE;
if (mon->box.party_lock == TRUE && decrypt_result == TRUE)
@@ -197,7 +199,7 @@ BOOL TryEncryptMon(struct Pokemon * mon, BOOL decrypt_result)
return ret;
}
-BOOL TryDecryptBoxMon(struct BoxPokemon * mon)
+BOOL AcquireBoxMonLock(struct BoxPokemon * mon)
{
BOOL ret = FALSE;
@@ -210,7 +212,7 @@ BOOL TryDecryptBoxMon(struct BoxPokemon * mon)
return ret;
}
-BOOL TryEncryptBoxMon(struct BoxPokemon * mon, BOOL decrypt_result)
+BOOL ReleaseBoxMonLock(struct BoxPokemon * mon, BOOL decrypt_result)
{
BOOL ret = FALSE;
if (mon->box_lock == TRUE && decrypt_result == TRUE)
@@ -250,7 +252,7 @@ void CreateBoxMon(struct BoxPokemon * boxPokemon, int species, int level, int fi
u32 exp;
u32 iv;
ZeroBoxMonData(boxPokemon);
- decry = TryDecryptBoxMon(boxPokemon);
+ decry = AcquireBoxMonLock(boxPokemon);
if (hasFixedPersonality == 0)
{
fixedPersonality = (rand_LC() | (rand_LC() << 16));
@@ -317,7 +319,7 @@ void CreateBoxMon(struct BoxPokemon * boxPokemon, int species, int level, int fi
exp = GetBoxMonGenderEncrypted(boxPokemon);
SetBoxMonData(boxPokemon, MON_DATA_GENDER, &exp);
InitBoxMonMoveset(boxPokemon);
- TryEncryptBoxMon(boxPokemon, decry);
+ ReleaseBoxMonLock(boxPokemon, decry);
}
void CreateMonWithNature(struct Pokemon * pokemon, u16 species, u8 level, u8 fixedIv, u8 nature)
@@ -381,11 +383,11 @@ void CreateMonWithFixedIVs(struct Pokemon * pokemon, int species, int level, int
void CalcMonLevelAndStats(struct Pokemon * pokemon)
{
- BOOL decry = TryDecryptMon(pokemon);
- u32 level = CalcMonLevelEncrypted(pokemon);
+ BOOL decry = AcquireMonLock(pokemon);
+ u32 level = CalcMonLevel(pokemon);
SetMonData(pokemon, MON_DATA_LEVEL, &level);
CalcMonStats(pokemon);
- TryEncryptMon(pokemon, decry);
+ ReleaseMonLock(pokemon, decry);
}
void CalcMonStats(struct Pokemon * pokemon)
@@ -414,7 +416,7 @@ void CalcMonStats(struct Pokemon * pokemon)
int newSpeed;
int newSpatk;
int newSpdef;
- BOOL decry = TryDecryptMon(pokemon);
+ BOOL decry = AcquireMonLock(pokemon);
level = (int)GetMonData(pokemon, MON_DATA_LEVEL, NULL);
maxHp = (int)GetMonData(pokemon, MON_DATA_MAXHP, NULL);
hp = (int)GetMonData(pokemon, MON_DATA_HP, NULL);
@@ -445,23 +447,23 @@ void CalcMonStats(struct Pokemon * pokemon)
SetMonData(pokemon, MON_DATA_MAXHP, &newMaxHp);
newAtk = (baseStats->atk * 2 + atkIv + atkEv / 4) * level / 100 + 5;
- newAtk = ApplyNatureModToStat(GetMonNature(pokemon), newAtk, 1);
+ newAtk = ModifyStatByNature(GetMonNature(pokemon), newAtk, 1);
SetMonData(pokemon, MON_DATA_ATK, &newAtk);
newDef = (baseStats->def * 2 + defIv + defEv / 4) * level / 100 + 5;
- newDef = ApplyNatureModToStat(GetMonNature(pokemon), newDef, 2);
+ newDef = ModifyStatByNature(GetMonNature(pokemon), newDef, 2);
SetMonData(pokemon, MON_DATA_DEF, &newDef);
newSpeed = (baseStats->speed * 2 + speedIv + speedEv / 4) * level / 100 + 5;
- newSpeed = ApplyNatureModToStat(GetMonNature(pokemon), newSpeed, 3);
+ newSpeed = ModifyStatByNature(GetMonNature(pokemon), newSpeed, 3);
SetMonData(pokemon, MON_DATA_SPEED, &newSpeed);
newSpatk = (baseStats->spatk * 2 + spatkIv + spatkEv / 4) * level / 100 + 5;
- newSpatk = ApplyNatureModToStat(GetMonNature(pokemon), newSpatk, 4);
+ newSpatk = ModifyStatByNature(GetMonNature(pokemon), newSpatk, 4);
SetMonData(pokemon, MON_DATA_SPATK, &newSpatk);
newSpdef = (baseStats->spdef * 2 + spdefIv + spdefEv / 4) * level / 100 + 5;
- newSpdef = ApplyNatureModToStat(GetMonNature(pokemon), newSpdef, 5);
+ newSpdef = ModifyStatByNature(GetMonNature(pokemon), newSpdef, 5);
SetMonData(pokemon, MON_DATA_SPDEF, &newSpdef);
FreeToHeap(baseStats);
@@ -477,7 +479,7 @@ void CalcMonStats(struct Pokemon * pokemon)
}
if (hp != 0)
SetMonData(pokemon, MON_DATA_HP, &hp);
- TryEncryptMon(pokemon, decry);
+ ReleaseMonLock(pokemon, decry);
}
u32 GetMonData(struct Pokemon * pokemon, int attr, void * dest)
@@ -1881,3 +1883,137 @@ int GetMonBaseStat(int species, enum BaseStat attr)
FreeMonPersonal(personal);
return ret;
}
+
+u8 GetPercentProgressTowardsNextLevel(struct Pokemon * pokemon)
+{
+ BOOL decry = AcquireMonLock(pokemon);
+ u16 species = GetMonData(pokemon, MON_DATA_SPECIES, NULL);
+ u8 level = GetMonData(pokemon, MON_DATA_LEVEL, NULL);
+ u32 lo = GetMonExpBySpeciesAndLevel(species, level);
+ u32 hi = GetMonExpBySpeciesAndLevel(species, level + 1);
+ u32 cur = GetMonData(pokemon, MON_DATA_EXPERIENCE, NULL);
+ ReleaseMonLock(pokemon, decry);
+ return 100 * (cur - lo) / (hi - lo);
+}
+
+u32 CalcMonExpToNextLevel(struct Pokemon * pokemon)
+{
+ return CalcBoxMonExpToNextLevel(&pokemon->box);
+}
+
+u32 CalcBoxMonExpToNextLevel(struct BoxPokemon * boxmon)
+{
+ u16 species = GetBoxMonData(boxmon, MON_DATA_SPECIES, NULL);
+ u16 level = CalcBoxMonLevel(boxmon) + 1;
+ u32 cur = GetBoxMonData(boxmon, MON_DATA_EXPERIENCE, NULL);
+ u32 hi = GetMonExpBySpeciesAndLevel(species, level);
+ return hi - cur;
+}
+
+u32 GetMonBaseExperienceAtCurrentLevel(struct Pokemon * pokemon)
+{
+ int species = GetMonData(pokemon, MON_DATA_SPECIES, NULL);
+ int level = GetMonData(pokemon, MON_DATA_LEVEL, NULL);
+ return GetMonExpBySpeciesAndLevel(species, level);
+}
+
+u32 GetMonExpBySpeciesAndLevel(int species, int level)
+{
+ return GetExpByGrowthRateAndLevel(GetMonBaseStat(species, BASE_GROWTH_RATE), level);
+}
+
+void LoadGrowthTable(int growthRate, u32 * dest)
+{
+ GF_ASSERT(growthRate < 8);
+ ReadWholeNarcMemberByIdPair(dest, NARC_POKETOOL_PERSONAL_GROWTBL, growthRate);
+}
+
+u32 GetExpByGrowthRateAndLevel(int growthRate, int level)
+{
+ u32 * table;
+ u32 ret;
+ GF_ASSERT(growthRate < 8);
+ GF_ASSERT(level <= 101);
+ table = (u32 *)AllocFromHeap(0, 101 * sizeof(u32));
+ LoadGrowthTable(growthRate, table);
+ ret = table[level];
+ FreeToHeap(table);
+ return ret;
+}
+
+int CalcMonLevel(struct Pokemon * pokemon)
+{
+ return CalcBoxMonLevel(&pokemon->box);
+}
+
+int CalcBoxMonLevel(struct BoxPokemon * boxmon)
+{
+ BOOL decry = AcquireBoxMonLock(boxmon);
+ int species = GetBoxMonData(boxmon, MON_DATA_SPECIES, NULL);
+ int exp = GetBoxMonData(boxmon, MON_DATA_EXPERIENCE, NULL);
+ ReleaseBoxMonLock(boxmon, decry);
+ return CalcLevelBySpeciesAndExp(species, exp);
+}
+
+int CalcLevelBySpeciesAndExp(u16 species, u32 exp)
+{
+ int level;
+ struct BaseStats * personal = AllocAndLoadMonPersonal(species, 0);
+ level = CalcLevelBySpeciesAndExp_PreloadedPersonal(personal, species, exp);
+ FreeMonPersonal(personal);
+ return level;
+}
+
+int CalcLevelBySpeciesAndExp_PreloadedPersonal(struct BaseStats * personal, u16 species, u32 exp)
+{
+ static u32 table[101];
+ int i;
+ LoadGrowthTable(GetPersonalAttr(personal, BASE_GROWTH_RATE), table);
+ for (i = 1; i < 101; i++)
+ {
+ if (table[i] > exp)
+ break;
+ }
+ return i - 1;
+}
+
+u8 GetMonNature(struct Pokemon * pokemon)
+{
+ return GetBoxMonNature(&pokemon->box);
+}
+
+u8 GetBoxMonNature(struct BoxPokemon * boxmon)
+{
+ BOOL decry = AcquireBoxMonLock(boxmon);
+ u32 personality = GetBoxMonData(boxmon, MON_DATA_PERSONALITY, NULL);
+ ReleaseBoxMonLock(boxmon, decry);
+ return GetNatureFromPersonality(personality);
+}
+
+u8 GetNatureFromPersonality(u32 pid)
+{
+ return pid % 25;
+}
+
+u16 ModifyStatByNature(u8 nature, u16 n, u8 statIndex)
+{
+ u16 retVal;
+
+ // Dont modify HP, Accuracy, or Evasion by nature
+ if (statIndex < 1 || statIndex > 5)
+ return n;
+
+ switch (sNatureStatMods[nature][statIndex - 1])
+ {
+ case 1:
+ retVal = (u16)(n * 110) / 100; // NOTE: will overflow for n > 595 because the intermediate value is cast to u16 before the division. Fix by removing (u16) cast
+ break;
+ case -1:
+ retVal = (u16)(n * 90) / 100; // NOTE: will overflow for n > 728, see above
+ break;
+ default:
+ retVal = n;
+ break;
+ }
+ return retVal;
+}
diff --git a/include/filesystem.h b/include/filesystem.h
index 37f73bb0..6b5a16d6 100644
--- a/include/filesystem.h
+++ b/include/filesystem.h
@@ -2,6 +2,7 @@
#define POKEDIAMOND_FILESYSTEM_H
#include "nitro/types.h"
+#include "FS_file.h"
typedef struct NARC
{
diff --git a/include/pokemon.h b/include/pokemon.h
index b7642f74..3e277ee1 100644
--- a/include/pokemon.h
+++ b/include/pokemon.h
@@ -471,10 +471,10 @@ void ZeroMonData(struct Pokemon * pokemon);
void ZeroBoxMonData(struct BoxPokemon * boxmon);
u32 SizeOfStructPokemon(void);
struct Pokemon * AllocMonZeroed(u32 heap_id);
-BOOL TryDecryptMon(struct Pokemon * mon);
-BOOL TryEncryptMon(struct Pokemon * mon, BOOL decrypt_result);
-BOOL TryDecryptBoxMon(struct BoxPokemon * mon);
-BOOL TryEncryptBoxMon(struct BoxPokemon * mon, BOOL decrypt_result);
+BOOL AcquireMonLock(struct Pokemon * mon);
+BOOL ReleaseMonLock(struct Pokemon * mon, BOOL decrypt_result);
+BOOL AcquireBoxMonLock(struct BoxPokemon * mon);
+BOOL ReleaseBoxMonLock(struct BoxPokemon * mon, BOOL decrypt_result);
void CreateMon(struct Pokemon * pokemon, int species, int level, int fixedIV, int hasFixedPersonality, int fixedPersonality, int otIdType, int fixedOtId);
void CreateBoxMon(struct BoxPokemon * boxPokemon, int species, int level, int fixedIV, int hasFixedPersonality, int fixedPersonality, int otIdType, int fixedOtId);
void CreateMonWithNature(struct Pokemon * pokemon, u16 species, u8 level, u8 fixedIv, u8 nature);
@@ -494,18 +494,20 @@ void SetMonData(struct Pokemon * pokemon, int attr, void * ptr);
void SetBoxMonData(struct BoxPokemon * pokemon, int attr, void * ptr);
void AddMonData(struct Pokemon * pokemon, int attr, int amount);
struct BaseStats * AllocAndLoadMonPersonal(int species, u32 heap_id);
+int GetMonBaseStat_HandleFormeConversion(int species, int form, enum BaseStat stat_id);
+int GetMonBaseStat(int species, enum BaseStat stat_id);
+u32 GetMonExpBySpeciesAndLevel(int species, int level);
+void LoadGrowthTable(int growthRate, u32 * table);
+u32 GetExpByGrowthRateAndLevel(int rate, int level);
+int CalcMonLevel(struct Pokemon * pokemon);
+int CalcBoxMonLevel(struct BoxPokemon * boxmon);
+int CalcLevelBySpeciesAndExp(u16 species, u32 experience);
+int CalcLevelBySpeciesAndExp_PreloadedPersonal(struct BaseStats * personal, u16 species, u32 experience);
-u32 CalcMonLevelEncrypted(struct Pokemon * pokemon);
u8 GetBoxMonNature(struct BoxPokemon * boxmon);
u8 GetMonNature(struct Pokemon * mon);
u8 GetNatureFromPersonality(u32 pid);
u8 GetGenderBySpeciesAndPersonality(u16 species, u32 pid);
u32 GetBoxMonGenderEncrypted(struct BoxPokemon * boxmon);
-int GetMonBaseStat_HandleFormeConversion(int species, int form, enum BaseStat stat_id);
-int GetMonBaseStat(int species, enum BaseStat stat_id);
-u32 GetMonExpBySpeciesAndLevel(int species, int level);
-void LoadGrowthTable(int species, int * table);
-int GetExpByGrowthRateAndLevel(int rate, int level);
-int CalcLevelBySpeciesAndExp(int species, int experience);
#endif //POKEDIAMOND_POKEMON_H