From a601fd3a084041a4cd249ba614b998f290f5d608 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 7 May 2023 11:03:18 -0700 Subject: [PATCH] more decomp --- asm/code_807CD9C.s | 453 ---------------------------------- include/dungeon_global_data.h | 6 +- include/move_util.h | 4 + src/dungeon_util_1.c | 8 +- src/weather.c | 181 ++++++++++++++ 5 files changed, 193 insertions(+), 459 deletions(-) diff --git a/asm/code_807CD9C.s b/asm/code_807CD9C.s index d59b9f0c4..bdd43540a 100644 --- a/asm/code_807CD9C.s +++ b/asm/code_807CD9C.s @@ -2482,457 +2482,4 @@ _0807E198: .4byte 0x0000fffc _0807E19C: .4byte gUnknown_203B444 thumb_func_end sub_807DF38 - thumb_func_start sub_807E1A0 -sub_807E1A0: - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x24 - mov r9, r0 - adds r6, r1, 0 - lsls r2, 24 - lsrs r2, 24 - mov r8, r2 - lsls r3, 16 - asrs r7, r3, 16 - adds r0, r6, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _0807E244 - ldr r5, [r6, 0x70] - add r4, sp, 0x1C - ldr r1, _0807E20C - adds r0, r4, 0 - bl InitPokemonMove - adds r0, r6, 0 - adds r1, r4, 0 - bl sub_80571F0 - lsls r0, 24 - cmp r0, 0 - bne _0807E244 - ldrb r0, [r5, 0x6] - cmp r0, 0 - bne _0807E210 - movs r0, 0xE - ldrsh r4, [r5, r0] - lsrs r0, r4, 31 - adds r5, r4, r0 - asrs r4, r5, 1 - adds r0, r6, 0 - movs r1, 0x2 - bl MonsterIsType - lsls r0, 24 - cmp r0, 0 - beq _0807E202 - lsrs r0, r5, 31 - adds r0, r4, r0 - asrs r4, r0, 1 -_0807E202: - cmp r4, 0 - bgt _0807E226 - movs r4, 0x1 - b _0807E226 - .align 2, 0 -_0807E20C: .4byte 0x00000163 -_0807E210: - ldr r4, [sp, 0x40] - adds r0, r6, 0 - movs r1, 0x2 - bl MonsterIsType - lsls r0, 24 - cmp r0, 0 - beq _0807E226 - lsrs r0, r4, 31 - adds r0, r4, r0 - asrs r4, r0, 1 -_0807E226: - add r0, sp, 0x18 - str r0, [sp] - mov r0, r8 - str r0, [sp, 0x4] - str r7, [sp, 0x8] - movs r0, 0 - str r0, [sp, 0xC] - str r0, [sp, 0x10] - str r0, [sp, 0x14] - mov r0, r9 - adds r1, r6, 0 - adds r2, r4, 0 - movs r3, 0 - bl sub_806F370 -_0807E244: - add sp, 0x24 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_807E1A0 - - thumb_func_start sub_807E254 -sub_807E254: - push {r4-r7,lr} - sub sp, 0x8 - adds r6, r0, 0 - adds r7, r1, 0 - movs r1, 0xE - bl HasAbility - lsls r0, 24 - cmp r0, 0 - beq _0807E274 - ldr r0, _0807E270 - adds r1, r6, 0 - b _0807E286 - .align 2, 0 -_0807E270: .4byte gAvailablePokemonNames -_0807E274: - adds r0, r7, 0 - movs r1, 0xE - bl HasAbility - lsls r0, 24 - cmp r0, 0 - beq _0807E2A4 - ldr r0, _0807E29C - adds r1, r7, 0 -_0807E286: - movs r2, 0 - bl SetMessageArgument - ldr r0, _0807E2A0 - ldr r2, [r0] - adds r0, r6, 0 - adds r1, r7, 0 - bl sub_80522F4 - b _0807E366 - .align 2, 0 -_0807E29C: .4byte gAvailablePokemonNames -_0807E2A0: .4byte gUnknown_80FCAC0 -_0807E2A4: - ldrh r1, [r6, 0x6] - lsls r1, 16 - ldrh r0, [r6, 0x4] - orrs r0, r1 - str r0, [sp] - ldrh r1, [r7, 0x6] - lsls r1, 16 - ldrh r0, [r7, 0x4] - orrs r0, r1 - str r0, [sp, 0x4] - mov r5, sp - mov r0, sp - bl nullsub_93 - add r4, sp, 0x4 - adds r0, r4, 0 - bl nullsub_93 - movs r0, 0 - ldrsh r1, [r4, r0] - movs r0, 0x2 - ldrsh r2, [r4, r0] - adds r0, r6, 0 - movs r3, 0x1 - bl sub_80694C0 - mov r0, sp - movs r2, 0 - ldrsh r1, [r0, r2] - movs r0, 0x2 - ldrsh r2, [r5, r0] - adds r0, r7, 0 - movs r3, 0x1 - bl sub_80694C0 - adds r0, r6, 0 - movs r1, 0 - bl sub_804535C - adds r0, r7, 0 - movs r1, 0 - bl sub_804535C - adds r0, r6, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _0807E330 - ldr r0, [r6, 0x70] - ldrb r0, [r0, 0x7] - cmp r0, 0 - beq _0807E31A - adds r0, r6, 0x4 - bl sub_804AC20 - movs r0, 0 - bl sub_807EC28 -_0807E31A: - adds r0, r6, 0 - bl sub_806A5B8 - ldr r0, _0807E370 - ldr r0, [r0] - ldr r1, _0807E374 - adds r0, r1 - ldrb r1, [r0] - adds r0, r6, 0 - bl sub_8075900 -_0807E330: - adds r0, r7, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _0807E366 - ldr r0, [r7, 0x70] - ldrb r0, [r0, 0x7] - cmp r0, 0 - beq _0807E350 - adds r0, r7, 0x4 - bl sub_804AC20 - movs r0, 0 - bl sub_807EC28 -_0807E350: - adds r0, r7, 0 - bl sub_806A5B8 - ldr r0, _0807E370 - ldr r0, [r0] - ldr r2, _0807E374 - adds r0, r2 - ldrb r1, [r0] - adds r0, r7, 0 - bl sub_8075900 -_0807E366: - add sp, 0x8 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0807E370: .4byte gDungeon -_0807E374: .4byte 0x00003a08 - thumb_func_end sub_807E254 - - thumb_func_start sub_807E378 -sub_807E378: - push {r4-r7,lr} - bl GetLeader - adds r4, r0, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - bne _0807E38C - b _0807E564 -_0807E38C: - ldr r0, _0807E41C - ldr r1, [r0] - ldr r3, _0807E420 - adds r2, r1, r3 - ldrh r3, [r2] - movs r5, 0 - ldrsh r1, [r2, r5] - adds r6, r0, 0 - cmp r1, 0 - ble _0807E3AA - subs r0, r3, 0x1 - strh r0, [r2] - lsls r0, 16 - cmp r0, 0 - bgt _0807E3B4 -_0807E3AA: - ldr r0, [r6] - ldr r1, _0807E424 - adds r0, r1 - movs r1, 0x3 - strb r1, [r0] -_0807E3B4: - adds r5, r6, 0 - ldr r1, [r5] - ldr r7, _0807E424 - adds r0, r1, r7 - ldrb r0, [r0] - cmp r0, 0 - bne _0807E434 - ldr r2, _0807E420 - adds r0, r1, r2 - movs r3, 0 - ldrsh r0, [r0, r3] - cmp r0, 0xF9 - ble _0807E3D0 - b _0807E564 -_0807E3D0: - bl sub_805E804 - adds r0, r4, 0 - movs r1, 0x1 - bl sub_806A2BC - adds r0, r4, 0 - bl UseAttack - bl sub_8044B28 - lsls r0, 24 - cmp r0, 0 - beq _0807E3EE - b _0807E564 -_0807E3EE: - ldr r0, _0807E428 - ldr r1, [r0] - adds r0, r4, 0 - bl SendMessage - ldr r1, _0807E42C - ldr r0, [r5] - ldr r2, _0807E430 - adds r0, r2 - movs r3, 0 - ldrsh r0, [r0, r3] - lsls r0, 2 - adds r0, r1 - ldr r0, [r0] - movs r1, 0 - bl sub_80426C8 - ldr r0, [r5] - adds r0, r7 - movs r1, 0x1 - strb r1, [r0] - b _0807E564 - .align 2, 0 -_0807E41C: .4byte gDungeon -_0807E420: .4byte 0x00000666 -_0807E424: .4byte 0x0000067a -_0807E428: .4byte gUnknown_80F9C4C -_0807E42C: .4byte gUnknown_80F5FAC -_0807E430: .4byte 0x00003a0e -_0807E434: - cmp r0, 0x1 - bne _0807E4A0 - ldr r2, _0807E490 - adds r0, r1, r2 - movs r3, 0 - ldrsh r0, [r0, r3] - cmp r0, 0x95 - ble _0807E446 - b _0807E564 -_0807E446: - bl sub_805E804 - adds r0, r4, 0 - movs r1, 0x1 - bl sub_806A2BC - adds r0, r4, 0 - bl UseAttack - bl sub_8044B28 - lsls r0, 24 - cmp r0, 0 - beq _0807E464 - b _0807E564 -_0807E464: - ldr r0, _0807E494 - ldr r1, [r0] - adds r0, r4, 0 - bl SendMessage - ldr r1, _0807E498 - ldr r0, [r5] - ldr r2, _0807E49C - adds r0, r2 - movs r3, 0 - ldrsh r0, [r0, r3] - lsls r0, 2 - adds r0, r1 - ldr r0, [r0] - movs r1, 0x1 - bl sub_80426C8 - ldr r0, [r5] - adds r0, r7 - movs r1, 0x2 - strb r1, [r0] - b _0807E564 - .align 2, 0 -_0807E490: .4byte 0x00000666 -_0807E494: .4byte gUnknown_80F9C70 -_0807E498: .4byte gUnknown_80F5FAC -_0807E49C: .4byte 0x00003a0e -_0807E4A0: - cmp r0, 0x2 - bne _0807E508 - ldr r2, _0807E4F8 - adds r0, r1, r2 - movs r3, 0 - ldrsh r0, [r0, r3] - cmp r0, 0x31 - bgt _0807E564 - bl sub_805E804 - adds r0, r4, 0 - movs r1, 0x1 - bl sub_806A2BC - adds r0, r4, 0 - bl UseAttack - bl sub_8044B28 - lsls r0, 24 - cmp r0, 0 - bne _0807E564 - ldr r0, _0807E4FC - ldr r1, [r0] - adds r0, r4, 0 - bl SendMessage - ldr r1, _0807E500 - ldr r0, [r5] - ldr r2, _0807E504 - adds r0, r2 - movs r3, 0 - ldrsh r0, [r0, r3] - lsls r0, 2 - adds r0, r1 - ldr r0, [r0] - movs r1, 0x2 - bl sub_80426C8 - ldr r0, [r5] - adds r0, r7 - movs r1, 0x3 - strb r1, [r0] - b _0807E564 - .align 2, 0 -_0807E4F8: .4byte 0x00000666 -_0807E4FC: .4byte gUnknown_80F9C8C -_0807E500: .4byte gUnknown_80F5FAC -_0807E504: .4byte 0x00003a0e -_0807E508: - ldr r5, _0807E56C - adds r0, r1, r5 - movs r1, 0 - ldrsh r0, [r0, r1] - cmp r0, 0 - bgt _0807E564 - bl sub_805E804 - adds r0, r4, 0 - movs r1, 0x1 - bl sub_806A2BC - adds r0, r4, 0 - bl UseAttack - bl sub_8044B28 - lsls r0, 24 - cmp r0, 0 - bne _0807E564 - ldr r0, _0807E570 - ldr r1, [r0] - adds r0, r4, 0 - bl SendMessage - ldr r1, _0807E574 - ldr r0, [r6] - ldr r2, _0807E578 - adds r0, r2 - movs r3, 0 - ldrsh r0, [r0, r3] - lsls r0, 2 - adds r0, r1 - ldr r0, [r0] - movs r1, 0x3 - bl sub_80426C8 - ldr r0, [r6] - adds r0, r7 - movs r1, 0x4 - strb r1, [r0] - ldr r1, _0807E57C - adds r0, r4, 0 - adds r2, r4, 0 - bl sub_8068FE0 -_0807E564: - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0807E56C: .4byte 0x00000666 -_0807E570: .4byte gUnknown_80F9CBC -_0807E574: .4byte gUnknown_80F5FAC -_0807E578: .4byte 0x00003a0e -_0807E57C: .4byte 0x0000021e - thumb_func_end sub_807E378 - .align 2, 0 diff --git a/include/dungeon_global_data.h b/include/dungeon_global_data.h index a3f91d9fa..e9e0b36de 100644 --- a/include/dungeon_global_data.h +++ b/include/dungeon_global_data.h @@ -94,7 +94,7 @@ struct Dungeon u8 fill65D[0x660 - 0x65D]; /* 0x660 */ s16 fractionalTurn; // Handles turn order when Pokémon have different movement speeds. u8 fill662[0x666 - 0x662]; - /* 0x666 */ u16 windTurns; // Turns remaining before getting swept out of the dungeon. + /* 0x666 */ s16 windTurns; // Turns remaining before getting swept out of the dungeon. /* 0x668 */ u16 unk668; u16 bossSongIndex; u8 unk66C; @@ -110,7 +110,9 @@ struct Dungeon /* 0x676 */ bool8 itemHoldersIdentified; u8 unk677; u8 unk678; - u8 unk679[0x68A - 0x679]; + u8 unk679; + u8 unk67A; + u8 unk67B[0x68A - 0x67B]; /* 0x68A */ u8 unk68A; u8 fill68B[0x699 - 0x68B]; u8 unk699; diff --git a/include/move_util.h b/include/move_util.h index b8065b492..0f0491315 100644 --- a/include/move_util.h +++ b/include/move_util.h @@ -3,6 +3,10 @@ #include "dungeon_entity.h" +u32 sub_8057144(struct Entity * pokemon); +bool8 sub_80571F0(struct Entity * pokemon, struct Move *move); +bool8 sub_805727C(struct Entity * pokemon, struct Entity * target, s32 chance); +bool8 sub_8057308(struct Entity *pokemon, s32 chance); bool8 CanAIUseMove(struct Entity *pokemon, s32 moveIndex, bool8 hasPPChecker); bool8 CanMonsterUseMove(struct Entity *pokemon, struct Move *move, bool8 hasPPChecker); diff --git a/src/dungeon_util_1.c b/src/dungeon_util_1.c index 0ff11335d..7a171962d 100644 --- a/src/dungeon_util_1.c +++ b/src/dungeon_util_1.c @@ -27,23 +27,23 @@ typedef void (*DungeonCallback)(struct Entity *); void sub_80855E4(DungeonCallback func) { - bool8 bVar1; + bool8 flag; struct Entity * entity; struct Entity * partnerEntity; s32 index; - bVar1 = FALSE; + flag = FALSE; for(index = 0; index < MAX_TEAM_MEMBERS; index++) { entity = gDungeon->teamPokemon[index]; if (EntityExists(entity)) { if (entity->info->joinedAt == 0x41) { - bVar1 = TRUE; + flag = TRUE; } func(entity); } } - if ((!bVar1) && (partnerEntity = GetPartnerEntity(), partnerEntity != NULL)) { + if ((!flag) && (partnerEntity = GetPartnerEntity(), partnerEntity != NULL)) { func(partnerEntity); } } diff --git a/src/weather.c b/src/weather.c index 685179299..c8f421feb 100644 --- a/src/weather.c +++ b/src/weather.c @@ -1,15 +1,196 @@ #include "global.h" #include "weather.h" +#include "constants/ability.h" #include "constants/item.h" +#include "constants/move_id.h" +#include "constants/type.h" #include "constants/weather.h" #include "dungeon_global_data.h" #include "dungeon_items.h" #include "dungeon_random.h" +#include "dungeon_leader.h" +#include "dungeon_util.h" +#include "code_80521D0.h" +#include "dungeon_ai.h" +#include "dungeon_pokemon_attributes.h" +#include "moves.h" +#include "move_util.h" extern void TriggerWeatherAbilities(void); extern void sub_807EAA0(u32, u32); void sub_807E5E4(u8); +extern u8 UseAttack(struct Entity *); +extern void sub_805E804(void); +void sub_806A2BC(struct Entity *pokemon, u8 param_2); +extern u8 sub_8044B28(void); +extern void sub_80426C8(u32, u32); +extern void sub_8068FE0(struct Entity *, u32, struct Entity *r2); +extern void nullsub_93(struct Position *); +extern void sub_80522F4(struct Entity *, struct Entity *, u8 *); +extern void SetMessageArgument(char[], struct Entity*, u32); +extern void sub_806F370(struct Entity *r0, struct Entity *r1, u32, u32, u8 *, u8, s32, u32, u32, u32); +extern void sub_80694C0(struct Entity *, s32, s32, u32); +extern void sub_804535C(struct Entity *, u32); +extern void sub_804AC20(struct Position *); +extern void sub_807EC28(u32); +extern void sub_806A5B8(struct Entity *); + +extern u32 gUnknown_80F5FAC[]; +extern u8 *gUnknown_80F9C4C[]; +extern u8 *gUnknown_80F9C70[]; +extern u8 *gUnknown_80F9C8C[]; +extern u8 *gUnknown_80F9CBC[]; +extern u8 gAvailablePokemonNames[]; +extern u8 *gUnknown_80FCAC0[]; + + +void sub_807E1A0(struct Entity *pokemon,struct Entity *target,u8 param_3,s16 param_4,s32 param_5) +{ + struct EntityInfo *targetInfo; + u8 flag; + struct Move move; + s32 newHP; + s32 param_4_s32; + + param_4_s32 = param_4; + + if (EntityExists(target)) { + targetInfo = target->info; + InitPokemonMove(&move, MOVE_REGULAR_ATTACK); + if (!sub_80571F0(target,&move)) { + if (!targetInfo->isNotTeamMember) { + newHP = targetInfo->HP; + newHP /= 2; + if (MonsterIsType(target, TYPE_FIRE)) { + newHP /= 2; + } + if (newHP < 1) { + newHP = 1; + } + } + else { + newHP = param_5; + if (MonsterIsType(target, TYPE_FIRE)) { + newHP /= 2; + } + } + sub_806F370(pokemon,target,newHP,0,&flag,param_3,param_4_s32,0,0,0); + } + } +} + +void sub_807E254(struct Entity *pokemon,struct Entity *target) +{ + struct Position pokemonPos; + struct Position targetPos; + + + if (HasAbility(pokemon, ABILITY_SUCTION_CUPS)) { + SetMessageArgument(gAvailablePokemonNames,pokemon,0); + sub_80522F4(pokemon,target,*gUnknown_80FCAC0); // $m0 is anchored! It won't switch places + } + else if(HasAbility(target, ABILITY_SUCTION_CUPS)) + { + SetMessageArgument(gAvailablePokemonNames,target,0); + sub_80522F4(pokemon,target,*gUnknown_80FCAC0); // $m0 is anchored! It won't switch places + } + else + { + pokemonPos.x = pokemon->pos.x; + pokemonPos.y = pokemon->pos.y; + targetPos.x = target->pos.x; + targetPos.y = target->pos.y; + nullsub_93(&pokemonPos); + nullsub_93(&targetPos); + sub_80694C0(pokemon,targetPos.x,targetPos.y,1); + sub_80694C0(target,pokemonPos.x,pokemonPos.y,1); + sub_804535C(pokemon,0x0); + sub_804535C(target,0x0); + + if (EntityExists(pokemon)) { + if (pokemon->info->isTeamLeader) { + sub_804AC20(&pokemon->pos); + sub_807EC28(0); + } + sub_806A5B8(pokemon); + sub_8075900(pokemon,gDungeon->unk3A08); + } + + if (EntityExists(target)) { + if (target->info->isTeamLeader) { + sub_804AC20(&target->pos); + sub_807EC28(0); + } + sub_806A5B8(target); + sub_8075900(target,gDungeon->unk3A08); + } + } +} + +void sub_807E378(void) +{ + u16 uVar2; + struct Entity *leader; + + leader = GetLeader(); + if (EntityExists(leader)) { + + uVar2 = gDungeon->windTurns; + if ((gDungeon->windTurns < 1) || + (gDungeon->windTurns--, ((uVar2 - 1) << 0x10) < 1)) { + gDungeon->unk67A = 3; + } + + if (gDungeon->unk67A == 0) { + if (gDungeon->windTurns < 0xfa) { + sub_805E804(); + sub_806A2BC(leader,1); + UseAttack(leader); + if (sub_8044B28() == 0) { + SendMessage(leader,*gUnknown_80F9C4C); + sub_80426C8(gUnknown_80F5FAC[gDungeon->tileset],0); + gDungeon->unk67A = 1; + } + } + } + else if (gDungeon->unk67A == 1) { + if (gDungeon->windTurns < 0x96) { + sub_805E804(); + sub_806A2BC(leader,1); + UseAttack(leader); + if (sub_8044B28() == 0) { + SendMessage(leader,*gUnknown_80F9C70); + sub_80426C8(gUnknown_80F5FAC[gDungeon->tileset],1); + gDungeon->unk67A = 2; + } + } + } + else if (gDungeon->unk67A == 2) { + if (gDungeon->windTurns < 0x32) { + sub_805E804(); + sub_806A2BC(leader,1); + UseAttack(leader); + if (sub_8044B28() == 0) { + SendMessage(leader,*gUnknown_80F9C8C); + sub_80426C8(gUnknown_80F5FAC[gDungeon->tileset],2); + gDungeon->unk67A = 3; + } + } + } + else if (gDungeon->windTurns < 1) { + sub_805E804(); + sub_806A2BC(leader,1); + UseAttack(leader); + if (sub_8044B28() == 0) { + SendMessage(leader,*gUnknown_80F9CBC); + sub_80426C8(gUnknown_80F5FAC[gDungeon->tileset],3); + gDungeon->unk67A = 4; + sub_8068FE0(leader,0x21e,leader); + } + } + } +} u8 GetApparentWeather(struct Entity *pokemon) {