diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2020-06-14 14:00:44 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2020-06-14 14:00:44 -0400 |
commit | 654acf33f071db80179fa556097f5663ca4dc311 (patch) | |
tree | 4dd6182a09f4e9714521218aea1a09ae5aed1117 /arm9 | |
parent | d6543eb215c80769469bf352330aa9d6387f859a (diff) |
through FUN_020697D4
Diffstat (limited to 'arm9')
-rw-r--r-- | arm9/asm/pokemon_s.s | 365 | ||||
-rw-r--r-- | arm9/src/pokemon.c | 160 |
2 files changed, 157 insertions, 368 deletions
diff --git a/arm9/asm/pokemon_s.s b/arm9/asm/pokemon_s.s index b0657999..472197ae 100644 --- a/arm9/asm/pokemon_s.s +++ b/arm9/asm/pokemon_s.s @@ -2,378 +2,13 @@ .include "global.inc" .include "constants/species.h" - .extern gGameLanguage .extern gGameVersion .extern sItemOdds - .extern sFriendshipModTable .extern sLegendaryMonsList .extern UNK_020F7F16 - .extern sNatureStatMods - - .section .data - - .global __local_str_poketool_personal_pms_narc -__local_str_poketool_personal_pms_narc: ; 0x02105FC8 - .asciz "poketool/personal/pms.narc" .text - .extern LoadGrowthTable - .extern GetExpByGrowthRateAndLevel - - .extern BoxMonIsShiny - - thumb_func_start ReadFromPersonalPmsNarc -ReadFromPersonalPmsNarc: ; 0x02069558 - push {r3-r4, lr} - sub sp, #0x4c - add r4, r0, #0x0 - mov r1, #0x0 - add r0, sp, #0x0 - strh r1, [r0, #0x0] - ldr r0, _020695A0 ; =SPECIES_EGG - cmp r4, r0 - blo _0206956E - bl ErrorHandling -_0206956E: - add r0, sp, #0x4 - bl FS_InitFile - ldr r1, _020695A4 ; =__local_str_poketool_personal_pms_narc - add r0, sp, #0x4 - bl FS_OpenFile - add r0, sp, #0x4 - lsl r1, r4, #0x1 - mov r2, #0x0 - bl FS_SeekFile - add r0, sp, #0x4 - add r1, sp, #0x0 - mov r2, #0x2 - bl FS_ReadFile - add r0, sp, #0x4 - bl FS_CloseFile - add r0, sp, #0x0 - ldrh r0, [r0, #0x0] - add sp, #0x4c - pop {r3-r4, pc} - nop -_020695A0: .word SPECIES_EGG -_020695A4: .word __local_str_poketool_personal_pms_narc - - thumb_func_start GetEggSpecies -GetEggSpecies: ; 0x020695A8 - push {r3, lr} - cmp r0, #SPECIES_SUDOWOODO - bgt _020695CC - cmp r0, #SPECIES_MARILL - blt _020695BA - beq _020695EC - cmp r0, #SPECIES_SUDOWOODO - beq _020695EC - b _020695E8 -_020695BA: - cmp r0, #SPECIES_MR_MIME - bgt _020695C6 - bge _020695EC - cmp r0, #SPECIES_CHANSEY - beq _020695EC - b _020695E8 -_020695C6: - cmp r0, #SPECIES_SNORLAX - beq _020695EC - b _020695E8 -_020695CC: - cmp r0, #SPECIES_MANTINE - bgt _020695D8 - bge _020695EC - cmp r0, #SPECIES_WOBBUFFET - beq _020695EC - b _020695E8 -_020695D8: - ldr r1, _020695F0 ; =SPECIES_ROSELIA - cmp r0, r1 - bgt _020695E2 - beq _020695EC - b _020695E8 -_020695E2: - add r1, #SPECIES_CHIMECHO-SPECIES_ROSELIA - cmp r0, r1 - beq _020695EC -_020695E8: - bl ReadFromPersonalPmsNarc -_020695EC: - pop {r3, pc} - nop -_020695F0: .word SPECIES_ROSELIA - - thumb_func_start InitBoxMonMoveset -InitBoxMonMoveset: ; 0x020695F4 - push {r3-r7, lr} - sub sp, #0x8 - add r5, r0, #0x0 - mov r0, #0x0 - mov r1, #0x2c - bl AllocFromHeap - str r0, [sp, #0x0] - add r0, r5, #0x0 - bl AcquireBoxMonLock - str r0, [sp, #0x4] - add r0, r5, #0x0 - mov r1, #0x5 - mov r2, #0x0 - bl GetBoxMonData - lsl r0, r0, #0x10 - lsr r4, r0, #0x10 - add r0, r5, #0x0 - mov r1, #0x70 - mov r2, #0x0 - bl GetBoxMonData - add r7, r0, #0x0 - add r0, r5, #0x0 - bl CalcBoxMonLevel - lsl r0, r0, #0x18 - lsr r6, r0, #0x18 - ldr r2, [sp, #0x0] - add r0, r4, #0x0 - add r1, r7, #0x0 - bl LoadWotbl_HandleAlternateForme - ldr r0, [sp, #0x0] - ldrh r1, [r0, #0x0] - ldr r0, _02069690 ; =0x0000FFFF - cmp r1, r0 - beq _0206967C - ldr r4, [sp, #0x0] - lsl r7, r6, #0x9 -_02069648: - ldrh r1, [r4, #0x0] - mov r0, #0xfe - lsl r0, r0, #0x8 - and r0, r1 - cmp r0, r7 - bgt _0206967C - ldr r0, _02069694 ; =0x000001FF - and r0, r1 - lsl r0, r0, #0x10 - lsr r6, r0, #0x10 - add r0, r5, #0x0 - add r1, r6, #0x0 - bl FUN_020696A8 - ldr r1, _02069690 ; =0x0000FFFF - cmp r0, r1 - bne _02069672 - add r0, r5, #0x0 - add r1, r6, #0x0 - bl FUN_02069718 -_02069672: - add r4, r4, #0x2 - ldrh r1, [r4, #0x0] - ldr r0, _02069690 ; =0x0000FFFF - cmp r1, r0 - bne _02069648 -_0206967C: - ldr r0, [sp, #0x0] - bl FreeToHeap - ldr r1, [sp, #0x4] - add r0, r5, #0x0 - bl ReleaseBoxMonLock - add sp, #0x8 - pop {r3-r7, pc} - nop -_02069690: .word 0x0000FFFF -_02069694: .word 0x000001FF - - thumb_func_start FUN_02069698 -FUN_02069698: ; 0x02069698 - push {r4, lr} - add r4, r1, #0x0 - bl FUN_020690E4 - add r1, r4, #0x0 - bl FUN_020696A8 - pop {r4, pc} - - thumb_func_start FUN_020696A8 -FUN_020696A8: ; 0x020696A8 - push {r3-r7, lr} - sub sp, #0x8 - add r5, r1, #0x0 - ldr r1, _02069700 ; =0x0000FFFF - add r6, r0, #0x0 - str r1, [sp, #0x4] - bl AcquireBoxMonLock - mov r4, #0x0 - str r0, [sp, #0x0] - add r7, r4, #0x0 -_020696BE: - add r1, r4, #0x0 - add r0, r6, #0x0 - add r1, #0x36 - add r2, r7, #0x0 - bl GetBoxMonData - lsl r0, r0, #0x10 - lsr r0, r0, #0x10 - bne _020696E0 - lsl r2, r4, #0x18 - add r0, r6, #0x0 - add r1, r5, #0x0 - lsr r2, r2, #0x18 - bl FUN_020697D4 - str r5, [sp, #0x4] - b _020696F0 -_020696E0: - cmp r0, r5 - bne _020696EA - ldr r0, _02069704 ; =0x0000FFFE - str r0, [sp, #0x4] - b _020696F0 -_020696EA: - add r4, r4, #0x1 - cmp r4, #0x4 - blt _020696BE -_020696F0: - ldr r1, [sp, #0x0] - add r0, r6, #0x0 - bl ReleaseBoxMonLock - ldr r0, [sp, #0x4] - add sp, #0x8 - pop {r3-r7, pc} - nop -_02069700: .word 0x0000FFFF -_02069704: .word 0x0000FFFE - - thumb_func_start FUN_02069708 -FUN_02069708: ; 0x02069708 - push {r4, lr} - add r4, r1, #0x0 - bl FUN_020690E4 - add r1, r4, #0x0 - bl FUN_02069718 - pop {r4, pc} - - thumb_func_start FUN_02069718 -FUN_02069718: ; 0x02069718 - push {r3-r7, lr} - sub sp, #0x20 - add r5, r0, #0x0 - str r1, [sp, #0x0] - bl AcquireBoxMonLock - str r0, [sp, #0xc] - add r0, sp, #0x18 - mov r4, #0x0 - str r0, [sp, #0x4] - add r7, sp, #0x14 - add r6, sp, #0x10 -_02069730: - add r1, r4, #0x0 - add r0, r5, #0x0 - add r1, #0x37 - mov r2, #0x0 - bl GetBoxMonData - ldr r1, [sp, #0x4] - mov r2, #0x0 - strh r0, [r1, #0x0] - add r1, r4, #0x0 - add r0, r5, #0x0 - add r1, #0x3b - bl GetBoxMonData - add r1, r4, #0x0 - strb r0, [r7, #0x0] - add r0, r5, #0x0 - add r1, #0x3f - mov r2, #0x0 - bl GetBoxMonData - strb r0, [r6, #0x0] - ldr r0, [sp, #0x4] - add r4, r4, #0x1 - add r0, r0, #0x2 - str r0, [sp, #0x4] - add r7, r7, #0x1 - add r6, r6, #0x1 - cmp r4, #0x3 - blt _02069730 - ldr r0, [sp, #0x0] - add r1, sp, #0x10 - strh r0, [r1, #0xe] - ldr r0, [sp, #0x0] - mov r1, #0x5 - bl FUN_0206AB18 - add r1, sp, #0x10 - strb r0, [r1, #0x7] - mov r4, #0x0 - add r0, sp, #0x18 - strb r4, [r1, #0x3] - str r0, [sp, #0x8] - add r7, sp, #0x14 - add r6, sp, #0x10 -_0206978A: - add r1, r4, #0x0 - ldr r2, [sp, #0x8] - add r0, r5, #0x0 - add r1, #0x36 - bl SetBoxMonData - add r1, r4, #0x0 - add r0, r5, #0x0 - add r1, #0x3a - add r2, r7, #0x0 - bl SetBoxMonData - add r1, r4, #0x0 - add r0, r5, #0x0 - add r1, #0x3e - add r2, r6, #0x0 - bl SetBoxMonData - ldr r0, [sp, #0x8] - add r4, r4, #0x1 - add r0, r0, #0x2 - str r0, [sp, #0x8] - add r7, r7, #0x1 - add r6, r6, #0x1 - cmp r4, #0x4 - blt _0206978A - ldr r1, [sp, #0xc] - add r0, r5, #0x0 - bl ReleaseBoxMonLock - add sp, #0x20 - pop {r3-r7, pc} - .balign 4 - - thumb_func_start FUN_020697CC -FUN_020697CC: ; 0x020697CC - ldr r3, _020697D0 ; =FUN_020697D4 - bx r3 - .balign 4 -_020697D0: .word FUN_020697D4 - - thumb_func_start FUN_020697D4 -FUN_020697D4: ; 0x020697D4 - push {r0-r3} - push {r3-r5, lr} - add r4, r2, #0x0 - add r1, r4, #0x0 - add r1, #0x36 - add r2, sp, #0x14 - add r5, r0, #0x0 - bl SetBoxMonData - add r1, r4, #0x0 - add r0, r5, #0x0 - add r1, #0x3e - mov r2, #0x0 - bl GetBoxMonData - lsl r0, r0, #0x18 - lsr r1, r0, #0x18 - add r0, sp, #0x10 - ldrh r0, [r0, #0x4] - bl FUN_0206AB30 - add r1, sp, #0x0 - strb r0, [r1, #0x0] - add r4, #0x3a - add r0, r5, #0x0 - add r1, r4, #0x0 - add r2, sp, #0x0 - bl SetBoxMonData - pop {r3-r5} - pop {r3} - add sp, #0x10 - bx r3 - .balign 4 - thumb_func_start FUN_02069818 FUN_02069818: ; 0x02069818 push {r3-r7, lr} diff --git a/arm9/src/pokemon.c b/arm9/src/pokemon.c index f1fbcd1d..d3c4ead6 100644 --- a/arm9/src/pokemon.c +++ b/arm9/src/pokemon.c @@ -11,6 +11,7 @@ #include "text.h" #include "constants/abilities.h" #include "constants/items.h" +#include "constants/moves.h" #pragma thumb on @@ -25,6 +26,11 @@ u16 ModifyStatByNature(u8 nature, u16 statval, u8 statno); u8 GetGenderBySpeciesAndPersonality_PreloadedPersonal(struct BaseStats * personal, u16 species, u32 pid); u8 BoxMonIsShiny(struct BoxPokemon * boxmon); u8 CalcShininessByOtIdAndPersonality(u32 otid, u32 pid); +void InitBoxMonMoveset(struct BoxPokemon * boxmon); +u32 FUN_020696A8(struct BoxPokemon * boxmon, u16 move); +void FUN_02069718(struct BoxPokemon * boxmon, u16 move); +void FUN_020697D4(struct BoxPokemon * boxmon, u16 move, u8 slot); +void LoadWotbl_HandleAlternateForme(int species, int forme, u16 * wotbl); u32 MaskOfFlagNo(int flagno); void LoadMonPersonal(int species, struct BaseStats * personal); void LoadMonEvolutionTable(u16 species, struct Evolution * dest); @@ -35,7 +41,6 @@ void MonEncryptSegment(void * datap, u32 size, u32 key); void MonDecryptSegment(void * datap, u32 size, u32 key); u16 MonEncryptionLCRNG(u32 * seed); 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); @@ -2448,9 +2453,9 @@ u8 FUN_020690D4(struct BoxPokemon * boxmon) return GetBoxMonData(boxmon, MON_DATA_FORME, NULL); } -void FUN_020690E4(void) +struct BoxPokemon * FUN_020690E4(struct Pokemon * pokemon) { - + return &pokemon->box; } BOOL FUN_020690E8(struct Pokemon * pokemon) @@ -2720,3 +2725,152 @@ u16 GetMonEvolution(struct PlayerParty * party, struct Pokemon * pokemon, u32 co FreeToHeap(evoTable); return target; } + +u16 ReadFromPersonalPmsNarc(u16 species) +{ + u16 ret = SPECIES_NONE; + GF_ASSERT(species < SPECIES_EGG); + { + FSFile file; + FS_InitFile(&file); + FS_OpenFile(&file, "poketool/personal/pms.narc"); + FS_SeekFile(&file, species * sizeof(u16), FS_SEEK_SET); + FS_ReadFile(&file, &ret, sizeof(u16)); + FS_CloseFile(&file); + } + return ret; +} + +u16 GetEggSpecies(u16 species) +{ + switch (species) + { + case SPECIES_SUDOWOODO: + case SPECIES_MARILL: + case SPECIES_MR_MIME: + case SPECIES_CHANSEY: + case SPECIES_SNORLAX: + case SPECIES_MANTINE: + case SPECIES_WOBBUFFET: + case SPECIES_ROSELIA: + case SPECIES_CHIMECHO: + return species; + default: + return ReadFromPersonalPmsNarc(species); + } +} + +#define WOTBL_END 0xFFFF +#define WOTBL_MOVE_MASK 0x01FF +#define WOTBL_MOVE_SHIFT 0 +#define WOTBL_LVL_MASK 0xFE00 +#define WOTBL_LVL_SHIFT 9 +#define WOTBL_MOVE(x) (((x) & WOTBL_MOVE_MASK) >> WOTBL_MOVE_SHIFT) +#define WOTBL_LVL(x) (((x) & WOTBL_LVL_MASK) >> WOTBL_LVL_SHIFT) + +void InitBoxMonMoveset(struct BoxPokemon * boxmon) +{ + BOOL decry; + u16 * wotbl; + int i; + u16 species; + u32 forme; + u8 level; + u16 move; + wotbl = AllocFromHeap(0, 22 * sizeof(u16)); + decry = AcquireBoxMonLock(boxmon); + species = GetBoxMonData(boxmon, MON_DATA_SPECIES, NULL); + forme = GetBoxMonData(boxmon, MON_DATA_FORME, NULL); + level = CalcBoxMonLevel(boxmon); + LoadWotbl_HandleAlternateForme(species, forme, wotbl); + for (i = 0; wotbl[i] != WOTBL_END; i++) + { + if ((wotbl[i] & WOTBL_LVL_MASK) > (level << WOTBL_LVL_SHIFT)) + break; + move = WOTBL_MOVE(wotbl[i]); + if (FUN_020696A8(boxmon, move) == 0xFFFF) + FUN_02069718(boxmon, move); + } + FreeToHeap(wotbl); + ReleaseBoxMonLock(boxmon, decry); +} + +u32 FUN_02069698(struct Pokemon * pokemon, u16 move) +{ + return FUN_020696A8(FUN_020690E4(pokemon), move); +} + +u32 FUN_020696A8(struct BoxPokemon * boxmon, u16 move) +{ + u32 ret = 0xFFFF; + int i; + BOOL decry = AcquireBoxMonLock(boxmon); + u16 cur_move; + for (i = 0; i < 4; i++) + { + cur_move = GetBoxMonData(boxmon, MON_DATA_MOVE1 + i, NULL); + if (cur_move == MOVE_NONE) + { + FUN_020697D4(boxmon, move, i); + ret = move; + break; + } + if (cur_move == move) + { + ret = 0xFFFE; + break; + } + } + ReleaseBoxMonLock(boxmon, decry); + return ret; +} + +void FUN_02069708(struct Pokemon * pokemon, u16 move) +{ + FUN_02069718(FUN_020690E4(pokemon), move); +} + +void FUN_02069718(struct BoxPokemon * boxmon, u16 move) +{ + BOOL decry = AcquireBoxMonLock(boxmon); + int i; + u16 moves[4]; + u8 pp[4]; + u8 ppUp[4]; + + for (i = 0; i < 3; i++) + { + moves[i] = GetBoxMonData(boxmon, MON_DATA_MOVE1 + i + 1, NULL); + pp[i] = GetBoxMonData(boxmon, MON_DATA_MOVE1PP + i + 1, NULL); + ppUp[i] = GetBoxMonData(boxmon, MON_DATA_MOVE1PPUP + i + 1, NULL); + } + + moves[3] = move; + pp[3] = FUN_0206AB18(move, 5); + ppUp[3] = 0; + + for (i = 0; i < 4; i++) + { + SetBoxMonData(boxmon, MON_DATA_MOVE1 + i, &moves[i]); + SetBoxMonData(boxmon, MON_DATA_MOVE1PP + i, &pp[i]); + SetBoxMonData(boxmon, MON_DATA_MOVE1PPUP + i, &ppUp[i]); + } + + ReleaseBoxMonLock(boxmon, decry); +} + +void FUN_020697CC(struct Pokemon * pokemon, u16 move, u8 slot) +{ + FUN_020697D4(&pokemon->box, move, slot); +} + +void FUN_020697D4(struct BoxPokemon * boxmon, u16 move, u8 slot) +{ + u8 ppUp; + u8 pp; + + SetBoxMonData(boxmon, MON_DATA_MOVE1 + slot, &move); + ppUp = GetBoxMonData(boxmon, MON_DATA_MOVE1PPUP + slot, NULL); + pp = FUN_0206AB30(move, ppUp); + SetBoxMonData(boxmon, MON_DATA_MOVE1PP + slot, &pp); +} |