diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2020-06-14 18:09:26 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2020-06-14 18:09:26 -0400 |
commit | 925f63ba7497576698c14f0598113294d19b37d9 (patch) | |
tree | 5f5a84da8c48817f33588e1ae131e8e9f1ae0b9c /arm9 | |
parent | 00beac9a26357014440295a095a06ad323bbf737 (diff) |
through FUN_0206A054
Diffstat (limited to 'arm9')
-rw-r--r-- | arm9/asm/pokemon_s.s | 461 | ||||
-rw-r--r-- | arm9/global.inc | 2 | ||||
-rw-r--r-- | arm9/modules/11/asm/module_11.s | 2 | ||||
-rw-r--r-- | arm9/src/pokemon.c | 201 |
4 files changed, 206 insertions, 460 deletions
diff --git a/arm9/asm/pokemon_s.s b/arm9/asm/pokemon_s.s index 7e0497d2..2d6f2579 100644 --- a/arm9/asm/pokemon_s.s +++ b/arm9/asm/pokemon_s.s @@ -1,465 +1,12 @@ - .include "asm/macros.inc" - .include "global.inc" - .include "constants/species.h" + .include "asm/macros.inc" + .include "global.inc" + .include "constants/species.h" - .extern gGameVersion .extern sItemOdds - .extern sLegendaryMonsList - .extern UNK_020F7F16 + .extern sLegendaryMonsList .text - thumb_func_start FUN_02069D50 -FUN_02069D50: ; 0x02069D50 - push {r4-r7, lr} - sub sp, #0xc - str r0, [sp, #0x0] - add r5, r1, #0x0 - bl GetPartyCount - mov r6, #0x0 - str r0, [sp, #0x4] - cmp r0, #0x0 - ble _02069DC2 - add r4, sp, #0x8 -_02069D66: - ldr r0, [sp, #0x0] - add r1, r6, #0x0 - bl GetPartyMonByIndex - mov r1, #0x5 - mov r2, #0x0 - add r7, r0, #0x0 - bl GetMonData - cmp r0, #0x0 - beq _02069DBA - add r0, r7, #0x0 - mov r1, #0x99 - mov r2, #0x0 - bl GetMonData - strb r0, [r4, #0x0] - ldrb r1, [r4, #0x0] - mov r0, #0xf - and r0, r1 - beq _02069DBA - cmp r0, r5 - blt _02069D98 - cmp r5, #0x4 - ble _02069DA2 -_02069D98: - ldrb r1, [r4, #0x0] - mov r0, #0xf0 - and r0, r1 - strb r0, [r4, #0x0] - b _02069DA6 -_02069DA2: - sub r0, r1, r5 - strb r0, [r4, #0x0] -_02069DA6: - ldrb r0, [r4, #0x0] - cmp r0, #0x0 - bne _02069DB0 - mov r0, #0x10 - strb r0, [r4, #0x0] -_02069DB0: - add r0, r7, #0x0 - mov r1, #0x99 - add r2, sp, #0x8 - bl SetMonData -_02069DBA: - ldr r0, [sp, #0x4] - add r6, r6, #0x1 - cmp r6, r0 - blt _02069D66 -_02069DC2: - add sp, #0xc - pop {r4-r7, pc} - .balign 4 - - thumb_func_start FUN_02069DC8 -FUN_02069DC8: ; 0x02069DC8 - push {r3-r7, lr} - sub sp, #0x8 - add r5, r0, #0x0 - bl GetPartyCount - add r7, r0, #0x0 - bl rand_LC - mov r1, #0x3 - bl _s32_div_f - cmp r1, #0x0 - bne _02069E70 - mov r4, #0x0 - cmp r7, #0x0 - ble _02069E70 - sub r0, r7, #0x1 - str r0, [sp, #0x0] -_02069DEC: - add r0, r5, #0x0 - add r1, r4, #0x0 - bl GetPartyMonByIndex - mov r1, #0x5 - mov r2, #0x0 - add r6, r0, #0x0 - bl GetMonData - cmp r0, #0x0 - beq _02069E6A - add r0, r6, #0x0 - mov r1, #0x99 - mov r2, #0x0 - bl GetMonData - add r1, sp, #0x4 - strb r0, [r1, #0x0] - add r0, r1, #0x0 - ldrb r1, [r0, #0x0] - mov r0, #0xf - tst r0, r1 - beq _02069E6A - cmp r4, #0x0 - beq _02069E40 - add r0, r5, #0x0 - sub r1, r4, #0x1 - bl GetPartyMonByIndex - mov r1, #0x99 - mov r2, #0x0 - add r6, r0, #0x0 - bl GetMonData - mov r1, #0xf0 - tst r0, r1 - bne _02069E40 - add r0, r6, #0x0 - mov r1, #0x99 - add r2, sp, #0x4 - bl SetMonData -_02069E40: - ldr r0, [sp, #0x0] - cmp r4, r0 - bge _02069E6A - add r0, r5, #0x0 - add r1, r4, #0x1 - bl GetPartyMonByIndex - mov r1, #0x99 - mov r2, #0x0 - add r6, r0, #0x0 - bl GetMonData - mov r1, #0xf0 - tst r0, r1 - bne _02069E6A - add r0, r6, #0x0 - mov r1, #0x99 - add r2, sp, #0x4 - bl SetMonData - add r4, r4, #0x1 -_02069E6A: - add r4, r4, #0x1 - cmp r4, r7 - blt _02069DEC -_02069E70: - add sp, #0x8 - pop {r3-r7, pc} - - thumb_func_start FUN_02069E74 -FUN_02069E74: ; 0x02069E74 - ldr r3, _02069E78 ; =FUN_02069E7C - bx r3 - .balign 4 -_02069E78: .word FUN_02069E7C - - thumb_func_start FUN_02069E7C -FUN_02069E7C: ; 0x02069E7C - push {r3, lr} - mov r1, #0x99 - mov r2, #0x0 - bl GetBoxMonData - mov r1, #0xf - tst r0, r1 - beq _02069E90 - mov r0, #0x1 - pop {r3, pc} -_02069E90: - mov r0, #0x0 - pop {r3, pc} - - thumb_func_start FUN_02069E94 -FUN_02069E94: ; 0x02069E94 - ldr r3, _02069E98 ; =FUN_02069E9C - bx r3 - .balign 4 -_02069E98: .word FUN_02069E9C - - thumb_func_start FUN_02069E9C -FUN_02069E9C: ; 0x02069E9C - push {r3, lr} - mov r1, #0x99 - mov r2, #0x0 - bl GetBoxMonData - lsl r0, r0, #0x18 - lsr r1, r0, #0x18 - mov r0, #0xf - tst r0, r1 - beq _02069EB4 - mov r0, #0x0 - pop {r3, pc} -_02069EB4: - mov r0, #0xf0 - tst r0, r1 - beq _02069EBE - mov r0, #0x1 - pop {r3, pc} -_02069EBE: - mov r0, #0x0 - pop {r3, pc} - .balign 4 - - thumb_func_start FUN_02069EC4 -FUN_02069EC4: ; 0x02069EC4 - ldr r3, _02069EC8 ; =FUN_02069ECC - bx r3 - .balign 4 -_02069EC8: .word FUN_02069ECC - - thumb_func_start FUN_02069ECC -FUN_02069ECC: ; 0x02069ECC - push {r3-r6, lr} - sub sp, #0x4 - add r5, r0, #0x0 - mov r1, #0x5 - mov r2, #0x0 - bl GetBoxMonData - add r4, r0, #0x0 - add r0, r5, #0x0 - mov r1, #0xa - mov r2, #0x0 - bl GetBoxMonData - add r6, r0, #0x0 - add r0, r5, #0x0 - mov r1, #0x6 - mov r2, #0x0 - bl GetBoxMonData - ldr r1, _02069F20 ; =SPECIES_ARCEUS - cmp r4, r1 - bne _02069F1C - cmp r6, #0x79 - bne _02069F1C - lsl r0, r0, #0x10 - lsr r0, r0, #0x10 - mov r1, #0x1 - mov r2, #0x0 - bl FUN_0206E7B8 - lsl r0, r0, #0x10 - lsr r0, r0, #0x10 - bl GetArceusTypeByPlate - str r0, [sp, #0x0] - add r0, r5, #0x0 - mov r1, #0x70 - add r2, sp, #0x0 - bl SetBoxMonData -_02069F1C: - add sp, #0x4 - pop {r3-r6, pc} - .balign 4 -_02069F20: .word SPECIES_ARCEUS - - thumb_func_start GetArceusTypeByPlate -GetArceusTypeByPlate: ; 0x02069F24 - sub r0, #0x7d - cmp r0, #0xf - bhi _02069F96 - add r0, r0, r0 - add r0, pc - ldrh r0, [r0, #0x6] - lsl r0, r0, #0x10 - asr r0, r0, #0x10 - add pc, r0 -_02069F36: ; jump table (using 16-bit offset) - .short _02069F56 - _02069F36 - 2; case 0 - .short _02069F5A - _02069F36 - 2; case 1 - .short _02069F5E - _02069F36 - 2; case 2 - .short _02069F62 - _02069F36 - 2; case 3 - .short _02069F66 - _02069F36 - 2; case 4 - .short _02069F6A - _02069F36 - 2; case 5 - .short _02069F6E - _02069F36 - 2; case 6 - .short _02069F72 - _02069F36 - 2; case 7 - .short _02069F76 - _02069F36 - 2; case 8 - .short _02069F7A - _02069F36 - 2; case 9 - .short _02069F7E - _02069F36 - 2; case 10 - .short _02069F82 - _02069F36 - 2; case 11 - .short _02069F86 - _02069F36 - 2; case 12 - .short _02069F8A - _02069F36 - 2; case 13 - .short _02069F8E - _02069F36 - 2; case 14 - .short _02069F92 - _02069F36 - 2; case 15 -_02069F56: - mov r0, #0xa - bx lr -_02069F5A: - mov r0, #0xb - bx lr -_02069F5E: - mov r0, #0xd - bx lr -_02069F62: - mov r0, #0xc - bx lr -_02069F66: - mov r0, #0xf - bx lr -_02069F6A: - mov r0, #0x1 - bx lr -_02069F6E: - mov r0, #0x3 - bx lr -_02069F72: - mov r0, #0x4 - bx lr -_02069F76: - mov r0, #0x2 - bx lr -_02069F7A: - mov r0, #0xe - bx lr -_02069F7E: - mov r0, #0x6 - bx lr -_02069F82: - mov r0, #0x5 - bx lr -_02069F86: - mov r0, #0x7 - bx lr -_02069F8A: - mov r0, #0x10 - bx lr -_02069F8E: - mov r0, #0x11 - bx lr -_02069F92: - mov r0, #0x8 - bx lr -_02069F96: - mov r0, #0x0 - bx lr - .balign 4 - - thumb_func_start LoadWotbl_HandleAlternateForme -LoadWotbl_HandleAlternateForme: ; 0x02069F9C - push {r4, lr} - add r4, r2, #0x0 - bl ResolveMonForme - add r2, r0, #0x0 - add r0, r4, #0x0 - mov r1, #0x21 ; NARC_POKETOOL_PERSONAL_WOTBL - bl ReadWholeNarcMemberByIdPair - pop {r4, pc} - - thumb_func_start FUN_02069FB0 -FUN_02069FB0: ; 0x02069FB0 - push {r3-r7, lr} - add r7, r0, #0x0 - ldr r0, _0206A010 ; =0x000001B9 - add r4, r2, #0x0 - add r5, r1, #0x0 - add r6, r3, #0x0 - cmp r4, r0 - bne _02069FFC - add r0, r5, #0x0 - bl FUN_02005F14 - cmp r0, #0x0 - bne _02069FE2 - mov r0, #0x1 - bl FUN_02005E80 - ldr r0, [sp, #0x20] - ldr r3, [sp, #0x18] - str r0, [sp, #0x0] - add r0, r5, #0x0 - add r1, r4, #0x0 - add r2, r6, #0x0 - bl FUN_020056AC - pop {r3-r7, pc} -_02069FE2: - ldr r0, [sp, #0x1c] - cmp r0, #0x0 - beq _02069FEE - mov r0, #0x1 - bl FUN_02005E80 -_02069FEE: - ldr r2, [sp, #0x18] - add r0, r7, #0x0 - mov r1, #0x0 - add r3, r6, #0x0 - bl FUN_02005E90 - pop {r3-r7, pc} -_02069FFC: - ldr r0, [sp, #0x20] - ldr r3, [sp, #0x18] - str r0, [sp, #0x0] - add r0, r5, #0x0 - add r1, r4, #0x0 - add r2, r6, #0x0 - bl FUN_020056AC - pop {r3-r7, pc} - nop -_0206A010: .word 0x000001B9 - - thumb_func_start FUN_0206A014 -FUN_0206A014: ; 0x0206A014 - push {r3-r6, lr} - sub sp, #0xc - ldr r6, [sp, #0x20] - add r5, r0, #0x0 - str r6, [sp, #0x0] - ldr r6, [sp, #0x24] - add r4, r2, #0x0 - str r6, [sp, #0x4] - bl FUN_0206A054 - cmp r4, #0xe - bne _0206A050 - add r0, r5, #0x0 - mov r1, #0xa3 - mov r2, #0x0 - bl GetMonData - str r0, [sp, #0x8] - add r0, r5, #0x0 - mov r1, #0xa2 - add r2, sp, #0x8 - bl SetMonData - mov r0, #0x0 - str r0, [sp, #0x8] - add r0, r5, #0x0 - mov r1, #0x9f - add r2, sp, #0x8 - bl SetMonData -_0206A050: - add sp, #0xc - pop {r3-r6, pc} - - thumb_func_start FUN_0206A054 -FUN_0206A054: ; 0x0206A054 - push {r0-r3} - push {r3-r4, lr} - sub sp, #0x4 - ldr r2, [sp, #0x24] - add r4, r0, #0x0 - str r2, [sp, #0x0] - mov r2, #0x0 - bl FUN_020808AC - ldr r2, _0206A090 ; =gGameVersion - add r0, r4, #0x0 - mov r1, #0x79 - bl SetBoxMonData - add r0, r4, #0x0 - mov r1, #0x9a - add r2, sp, #0x18 - bl SetBoxMonData - add r0, r4, #0x0 - mov r1, #0x9d - add r2, sp, #0x20 - bl SetBoxMonData - add sp, #0x4 - pop {r3-r4} - pop {r3} - add sp, #0x10 - bx r3 - nop -_0206A090: .word gGameVersion - thumb_func_start FUN_0206A094 FUN_0206A094: ; 0x0206A094 push {r3-r7, lr} diff --git a/arm9/global.inc b/arm9/global.inc index ec19fbfe..08442742 100644 --- a/arm9/global.inc +++ b/arm9/global.inc @@ -4792,7 +4792,7 @@ .extern FUN_02069E94
.extern FUN_02069EC4
.extern FUN_02069ECC
-.extern GetArceusTypeByPlate
+.extern GetArceusTypeByHeldItemEffect
.extern LoadWotbl_HandleAlternateForme
.extern FUN_02069FB0
.extern FUN_0206A014
diff --git a/arm9/modules/11/asm/module_11.s b/arm9/modules/11/asm/module_11.s index 5558b99a..5b67e5a9 100644 --- a/arm9/modules/11/asm/module_11.s +++ b/arm9/modules/11/asm/module_11.s @@ -61031,7 +61031,7 @@ _0224B1D8: bl FUN_0206E7B8
lsl r0, r0, #0x10
lsr r0, r0, #0x10
- bl GetArceusTypeByPlate
+ bl GetArceusTypeByHeldItemEffect
mov r1, #0x46
lsl r1, r1, #2
ldr r1, [r5, r1]
diff --git a/arm9/src/pokemon.c b/arm9/src/pokemon.c index 24d95575..ccd6bf54 100644 --- a/arm9/src/pokemon.c +++ b/arm9/src/pokemon.c @@ -36,7 +36,11 @@ void FUN_020698E8(struct BoxPokemon * boxmon, int slot1, int slot2); s8 FUN_02069BD0(struct BoxPokemon * boxmon, int flavor); s8 FUN_02069BE4(u32 personality, int flavor); u8 FUN_02069CF4(struct PlayerParty * party_p, u8 mask); +BOOL FUN_02069E7C(struct BoxPokemon * boxmon); +BOOL FUN_02069E9C(struct BoxPokemon * boxmon); +void FUN_02069ECC(struct BoxPokemon * boxmon); void LoadWotbl_HandleAlternateForme(int species, int forme, u16 * wotbl); +void FUN_0206A054(struct BoxPokemon * boxmon, u32 a1, u32 pokeball, u32 a3, u32 encounterType, u32 a5); u32 MaskOfFlagNo(int flagno); void LoadMonPersonal(int species, struct BaseStats * personal); void LoadMonEvolutionTable(u16 species, struct Evolution * dest); @@ -963,7 +967,7 @@ u32 GetBoxMonDataInternal(struct BoxPokemon * boxmon, int attr, void * dest) case MON_DATA_TYPE_1: case MON_DATA_TYPE_2: if (blockA->species == SPECIES_ARCEUS && blockA->ability == ABILITY_MULTITYPE) - ret = (u32)GetArceusTypeByPlate((u16)FUN_0206E7B8(blockA->heldItem, 1, 0)); + ret = (u32)GetArceusTypeByHeldItemEffect((u16)FUN_0206E7B8(blockA->heldItem, 1, 0)); else { ret = (u32)GetMonBaseStat_HandleFormeConversion(blockA->species, blockB->alternateForm, (enum BaseStat)(attr - MON_DATA_TYPE_1 + BASE_TYPE1)); @@ -3138,3 +3142,198 @@ u8 FUN_02069CF4(struct PlayerParty * party, u8 mask) } return ret; } + +void FUN_02069D50(struct PlayerParty * party, int r5) +{ + int i; + u8 pokerus; + struct Pokemon * pokemon; + int count = GetPartyCount(party); + for (i = 0; i < count; i++) + { + pokemon = GetPartyMonByIndex(party, i); + if (GetMonData(pokemon, MON_DATA_SPECIES, NULL) != SPECIES_NONE) + { + pokerus = GetMonData(pokemon, MON_DATA_POKERUS, NULL); + if (pokerus & 0xF) + { + if ((pokerus & 0xF) < r5 || r5 > 4) + pokerus &= 0xF0; + else + pokerus -= r5; + if (pokerus == 0) + pokerus = 0x10; // immune + SetMonData(pokemon, MON_DATA_POKERUS, &pokerus); + } + } + } +} + +void FUN_02069DC8(struct PlayerParty * party) +{ + int count = GetPartyCount(party); + int i; + struct Pokemon * pokemon; + u8 pokerus; + if ((rand_LC() % 3) == 0) + { + for (i = 0; i < count; i++) + { + pokemon = GetPartyMonByIndex(party, i); + if (GetMonData(pokemon, MON_DATA_SPECIES, NULL) != SPECIES_NONE) + { + pokerus = GetMonData(pokemon, MON_DATA_POKERUS, NULL); + if (pokerus & 0xF) + { + if (i != 0) + { + pokemon = GetPartyMonByIndex(party, i - 1); + if (!(GetMonData(pokemon, MON_DATA_POKERUS, NULL) & 0xF0)) + SetMonData(pokemon, MON_DATA_POKERUS, &pokerus); + } + if (i < count - 1) + { + pokemon = GetPartyMonByIndex(party, i + 1); + if (!(GetMonData(pokemon, MON_DATA_POKERUS, NULL) & 0xF0)) + { + SetMonData(pokemon, MON_DATA_POKERUS, &pokerus); + i++; // don't infect the rest of the party + } + } + } + } + } + } +} + +BOOL FUN_02069E74(struct Pokemon * pokemon) +{ + return FUN_02069E7C(&pokemon->box); +} + +BOOL FUN_02069E7C(struct BoxPokemon * boxmon) +{ + return !!(GetBoxMonData(boxmon, MON_DATA_POKERUS, NULL) & 0xF); +} + +BOOL FUN_02069E94(struct Pokemon * pokemon) +{ + return FUN_02069E9C(&pokemon->box); +} + +BOOL FUN_02069E9C(struct BoxPokemon * boxmon) +{ + u8 pokerus = GetBoxMonData(boxmon, MON_DATA_POKERUS, NULL); + if (pokerus & 0xF) + return FALSE; + if (pokerus & 0xF0) + return TRUE; + return FALSE; +} + +void FUN_02069EC4(struct Pokemon * pokemon) +{ + FUN_02069ECC(&pokemon->box); +} + +void FUN_02069ECC(struct BoxPokemon * boxmon) +{ + u32 species = GetBoxMonData(boxmon, MON_DATA_SPECIES, NULL); + u32 ability = GetBoxMonData(boxmon, MON_DATA_ABILITY, NULL); + u32 heldItem = GetBoxMonData(boxmon, MON_DATA_HELD_ITEM, NULL); + u32 forme; + if (species == SPECIES_ARCEUS && ability == ABILITY_MULTITYPE) + { + forme = GetArceusTypeByHeldItemEffect(FUN_0206E7B8(heldItem, 1, 0)); + SetBoxMonData(boxmon, MON_DATA_FORME, &forme); + } +} + +u32 GetArceusTypeByHeldItemEffect(u16 heldEffect) +{ + switch (heldEffect) + { + case 0x7D: + return TYPE_FIRE; + case 0x7E: + return TYPE_WATER; + case 0x7F: + return TYPE_ELECTRIC; + case 0x80: + return TYPE_GRASS; + case 0x81: + return TYPE_ICE; + case 0x82: + return TYPE_FIGHTING; + case 0x83: + return TYPE_POISON; + case 0x84: + return TYPE_GROUND; + case 0x85: + return TYPE_FLYING; + case 0x86: + return TYPE_PSYCHIC; + case 0x87: + return TYPE_BUG; + case 0x88: + return TYPE_ROCK; + case 0x89: + return TYPE_GHOST; + case 0x8A: + return TYPE_DRAGON; + case 0x8B: + return TYPE_DARK; + case 0x8C: + return TYPE_STEEL; + default: + return TYPE_NORMAL; + } +} + +void LoadWotbl_HandleAlternateForme(int species, int forme, u16 * wotbl) +{ + ReadWholeNarcMemberByIdPair(wotbl, NARC_POKETOOL_PERSONAL_WOTBL, ResolveMonForme(species, forme)); +} + +void FUN_02069FB0(u32 r7, u32 r5, u32 r4, u32 r6, u32 sp18, u32 sp1C, u32 sp20) +{ + if (r4 == SPECIES_CHATOT) + { + if (!FUN_02005F14(r5)) + { + FUN_02005E80(1); + FUN_020056AC(r5, r4, r6, sp18, sp20); + } + else + { + if (sp1C) + FUN_02005E80(1); + FUN_02005E90(r7, 0, sp18, r6); + } + } + else + { + FUN_020056AC(r5, r4, r6, sp18, sp20); + } +} + +void FUN_0206A014(struct Pokemon * pokemon, u32 a1, u32 pokeball, u32 a3, u32 encounterType, u32 a5) +{ + u32 hp; + FUN_0206A054(&pokemon->box, a1, pokeball, a3, encounterType, a5); + if (pokeball == ITEM_HEAL_BALL) + { + hp = GetMonData(pokemon, MON_DATA_MAXHP, NULL); + SetMonData(pokemon, MON_DATA_HP, &hp); + hp = 0; + SetMonData(pokemon, MON_DATA_STATUS, &hp); + } +} + +void FUN_0206A054(struct BoxPokemon * boxmon, u32 a1, u32 pokeball, u32 a3, u32 encounterType, u32 a5) +{ + FUN_020808AC(boxmon, a1, 0, a3, a5); + SetBoxMonData(boxmon, MON_DATA_GAME_VERSION, (void *)&gGameVersion); + SetBoxMonData(boxmon, MON_DATA_POKEBALL, &pokeball); + SetBoxMonData(boxmon, MON_DATA_ENCOUNTER_TYPE, &encounterType); +} |