From 9cae659e18f0d809bcdc4b46ab1bf2113229cbe9 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sat, 13 Jan 2024 11:00:10 -0800 Subject: [PATCH] more trap decomp --- asm/code_807FCD4.s | 258 --------------------------------------------- src/trap.c | 127 ++++++++++++++++++++-- 2 files changed, 121 insertions(+), 264 deletions(-) diff --git a/asm/code_807FCD4.s b/asm/code_807FCD4.s index 0e92f7b2b..d8d4d16e0 100644 --- a/asm/code_807FCD4.s +++ b/asm/code_807FCD4.s @@ -5,264 +5,6 @@ .text - thumb_func_start HandleGrimyTrap -HandleGrimyTrap: - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x58 - mov r8, r0 - adds r6, r1, 0 - movs r0, 0 - mov r9, r0 - cmp r6, 0 - beq _080804F0 - ldr r7, [r6, 0x70] - movs r3, 0 - ldrb r0, [r7, 0x7] - cmp r0, 0 - beq _0808045A - ldr r0, _080804C0 - movs r1, 0x1 - mov r12, r1 - ldr r2, [r0] - mov r4, sp - movs r5, 0x13 -_08080444: - ldrb r1, [r2] - mov r0, r12 - ands r0, r1 - cmp r0, 0 - beq _08080452 - stm r4!, {r2} - adds r3, 0x1 -_08080452: - adds r2, 0x4 - subs r5, 0x1 - cmp r5, 0 - bge _08080444 -_0808045A: - adds r2, r7, 0 - adds r2, 0x60 - ldrb r1, [r2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08080470 - lsls r0, r3, 2 - add r0, sp - str r2, [r0] - adds r3, 0x1 -_08080470: - cmp r3, 0 - ble _080804B6 - mov r4, sp - adds r5, r3, 0 -_08080478: - ldr r0, [r4] - ldrb r0, [r0, 0x2] - bl GetItemCategory - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x3 - bne _080804AE - ldr r0, [r4] - ldrb r0, [r0, 0x2] - cmp r0, 0x54 - beq _080804AE - movs r0, 0x64 - bl DungeonRandInt - ldr r1, _080804C4 - movs r2, 0 - ldrsh r1, [r1, r2] - cmp r0, r1 - bge _080804AE - movs r0, 0x1 - add r9, r0 - ldr r0, [r4] - movs r1, 0x54 - movs r2, 0x2 - bl sub_8045C28 -_080804AE: - adds r4, 0x4 - subs r5, 0x1 - cmp r5, 0 - bne _08080478 -_080804B6: - mov r1, r9 - cmp r1, 0x1 - bne _080804CC - ldr r0, _080804C8 - b _080804D4 - .align 2, 0 -_080804C0: .4byte gTeamInventoryRef -_080804C4: .4byte gUnknown_80F4E0E -_080804C8: .4byte gUnknown_80FD788 -_080804CC: - mov r2, r9 - cmp r2, 0 - bne _080804E4 - ldr r0, _080804E0 -_080804D4: - ldr r2, [r0] - mov r0, r8 - adds r1, r6, 0 - bl sub_80522F4 - b _080804F0 - .align 2, 0 -_080804E0: .4byte gUnknown_80FD7D4 -_080804E4: - ldr r0, _08080500 - ldr r2, [r0] - mov r0, r8 - adds r1, r6, 0 - bl sub_80522F4 -_080804F0: - add sp, 0x58 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08080500: .4byte gUnknown_80FD7AC - thumb_func_end HandleGrimyTrap - - thumb_func_start sub_8080504 -sub_8080504: - push {r4-r7,lr} - mov r7, r8 - push {r7} - adds r6, r0, 0 - adds r4, r1, 0 - adds r7, r2, 0 - movs r0, 0 - mov r8, r0 - cmp r4, 0 - bne _0808051A - b _0808060E -_0808051A: - bl IsBossFight - lsls r0, 24 - cmp r0, 0 - beq _08080534 - ldr r0, _08080530 - ldr r1, [r0] - adds r0, r6, 0 - bl SendMessage - b _0808060E - .align 2, 0 -_08080530: .4byte gUnknown_80FED0C -_08080534: - ldr r5, [r4, 0x70] - adds r0, r4, 0 - bl sub_8045888 - lsls r0, 24 - cmp r0, 0 - beq _0808055E - adds r0, r7, 0 - movs r1, 0x1B - bl sub_8080B00 - movs r1, 0x1 - mov r8, r1 - ldr r1, _080805A4 - adds r0, r4, 0 - bl sub_80421C0 - movs r0, 0x1E - movs r1, 0x48 - bl sub_803E708 -_0808055E: - ldrb r0, [r5, 0x7] - cmp r0, 0 - beq _080805C4 - bl sub_8043D10 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x2 - beq _080805B4 - movs r2, 0xAE - lsls r2, 1 - adds r0, r5, r2 - movs r1, 0x1 - strb r1, [r0] - adds r2, 0x2 - adds r0, r5, r2 - strb r1, [r0] - movs r0, 0x28 - movs r1, 0x4B - bl sub_803E708 - ldr r0, _080805A8 - movs r2, 0 - ldrsh r1, [r0, r2] - ldr r3, _080805AC - adds r0, r4, 0 - movs r2, 0x11 - bl sub_806F324 - ldr r0, _080805B0 - ldr r1, [r0] - movs r0, 0x2 - strb r0, [r1, 0x2] - b _0808060E - .align 2, 0 -_080805A4: .4byte 0x00000193 -_080805A8: .4byte gUnknown_80F4F8A -_080805AC: .4byte 0x00000215 -_080805B0: .4byte gDungeon -_080805B4: - ldr r0, _080805C0 - ldr r1, [r0] - adds r0, r6, 0 - bl SendMessage - b _08080600 - .align 2, 0 -_080805C0: .4byte gUnknown_80F9728 -_080805C4: - ldr r0, _080805E4 - adds r1, r4, 0 - movs r2, 0 - bl SetMessageArgument - ldrb r0, [r5, 0x6] - cmp r0, 0 - beq _080805EC - ldr r0, _080805E8 - ldr r2, [r0] - adds r0, r6, 0 - adds r1, r4, 0 - bl sub_80522F4 - b _080805F6 - .align 2, 0 -_080805E4: .4byte gAvailablePokemonNames -_080805E8: .4byte gUnknown_80F970C -_080805EC: - ldr r0, _08080618 - ldr r1, [r0] - adds r0, r6, 0 - bl sub_805239C -_080805F6: - ldr r1, _0808061C - adds r0, r4, 0 - adds r2, r6, 0 - bl sub_8068FE0 -_08080600: - mov r0, r8 - cmp r0, 0 - beq _0808060E - adds r0, r7, 0 - movs r1, 0x5 - bl sub_8080B00 -_0808060E: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08080618: .4byte gUnknown_80F970C -_0808061C: .4byte 0x00000215 - thumb_func_end sub_8080504 - thumb_func_start HandleSummonTrap HandleSummonTrap: push {r4-r7,lr} diff --git a/src/trap.c b/src/trap.c index e807e9d32..0370e404d 100644 --- a/src/trap.c +++ b/src/trap.c @@ -8,6 +8,7 @@ #include "items.h" #include "code_808417C.h" +#include "dungeon_engine.h" #include "dungeon_items.h" #include "dungeon_random.h" #include "dungeon_map_access.h" @@ -29,19 +30,35 @@ extern s16 gUnknown_80F4E74[]; extern u8 *gUnknown_80FDC18[]; extern u8 *gUnknown_80FDC40[]; extern u8 *gUnknown_80FDC7C[]; +extern u8 *gUnknown_80FD7AC[]; +extern u8 *gUnknown_80FD788[]; +extern u8 *gUnknown_80FD7D4[]; +extern u8 *gUnknown_80F970C[]; +extern u8 *gUnknown_80F9728[]; +extern u8 *gUnknown_80FED0C[]; +extern s16 gUnknown_80F4E0E; extern s16 gUnknown_80F4F84; extern s16 gUnknown_80F4F86; extern u32 gUnknown_8106A4C; extern u32 gUnknown_8106A50; +extern s16 gUnknown_80F4F8A; +bool8 sub_8045888(Entity *); +void sub_8080B00(Tile *, u32); +void sub_803E708(u32, u32); +u8 sub_8043D10(void); +void SetMessageArgument(u8 *, Entity *, u32); +void sub_8068FE0(Entity *, u32, Entity *); +void sub_805239C(Entity *, u8 *); +void sub_8045C28(Item *, u8 , u8); void sub_8045BF8(u8 *, Item *); void HandleTripTrap(Entity *pokemon,Entity *target); void HandleMudTrap(Entity *pokemon,Entity *target); void HandleStickyTrap(Entity *pokemon,Entity *target); void HandleGrimyTrap(Entity *pokemon,Entity *target); void HandleSummonTrap(Entity *pokemon,Position *pos); -void sub_8080504(Entity *pokemon,Entity *target,Tile *tile); +void HandlePitfallTrap(Entity *pokemon,Entity *target,Tile *tile); void HandleWarpTrap(Entity *pokemon,Entity *target); void HandleWhirlwindTrap(Entity *entity,Entity *target); void HandleSpinTrap(Entity *pokemon,Entity *target); @@ -284,7 +301,7 @@ void sub_807FE9C(Entity *pokemon, Position *pos, int param_3, char param_4) break; case TRAP_PITFALL_TRAP: case 0x1B: // ??? - sub_8080504(pokemon,target,tile); + HandlePitfallTrap(pokemon,target,tile); break; case TRAP_WARP_TRAP: HandleWarpTrap(pokemon,target); @@ -367,6 +384,8 @@ void HandleMudTrap(Entity *pokemon, Entity *target) } } +// https://decomp.me/scratch/Yq32k (Seth) + #ifdef NONMATCHING void HandleStickyTrap(Entity *pokemon,Entity *target) { @@ -594,13 +613,109 @@ void HandlePoisonTrap(Entity *pokemon, Entity *target) PoisonedStatusTarget(pokemon, target, TRUE); } -void HandleSelfdestructTrap(Entity *pokemon,Entity *target) +void HandleSelfdestructTrap(Entity *pokemon, Entity *target) { - sub_807DF38(pokemon, target, &target->pos, 1, TYPE_NONE, 0x212); + sub_807DF38(pokemon, target, &target->pos, 1, TYPE_NONE, 0x212); } -void HandleExplosionTrap(Entity *pokemon,Entity *target) +void HandleExplosionTrap(Entity *pokemon, Entity *target) { - sub_807DF38(pokemon, target, &target->pos, 2, TYPE_NONE, 0x212); + sub_807DF38(pokemon, target, &target->pos, 2, TYPE_NONE, 0x212); } +void HandleGrimyTrap(Entity *pokemon, Entity *target) +{ + Item *item; + Item *heldItem; + int counter; + int index; + EntityInfo *info; + int badFoodCount; + Item *itemStack [22]; + + badFoodCount = 0; + if (target != NULL) { + info = target->info; + counter = 0; + if (info->isTeamLeader) { + for(index = 0; index < INVENTORY_SIZE; index++) + { + item = &gTeamInventoryRef->teamItems[index]; + if ((item->flags & ITEM_FLAG_EXISTS)) { + itemStack[counter] = item; + counter++; + } + } + } + heldItem = &info->heldItem; + if ((heldItem->flags & ITEM_FLAG_EXISTS)) { + itemStack[counter] = heldItem; + counter++; + } + for (index = 0; index < counter; index++) { + if (((GetItemCategory(itemStack[index]->id) == CATEGORY_FOOD_GUMMIES) && (itemStack[index]->id != ITEM_GRIMY_FOOD)) && + (DungeonRandInt(100) < gUnknown_80F4E0E)) { + badFoodCount++; + sub_8045C28(itemStack[index], ITEM_GRIMY_FOOD, 2); + } + } + if (badFoodCount == 1) { + sub_80522F4(pokemon,target,*gUnknown_80FD788); // A food item went bad. + } + else if (badFoodCount == 0) { + sub_80522F4(pokemon,target,*gUnknown_80FD7D4); // Nothing particularly bad happened. + } + else + { + sub_80522F4(pokemon,target,*gUnknown_80FD7AC); // Several food items went bad + } + } +} + +void HandlePitfallTrap(Entity *pokemon, Entity *target, Tile *tile) +{ + bool8 flag; + EntityInfo *info; + + flag = FALSE; + if (target != NULL) { + if (IsBossFight()) { + SendMessage(pokemon,*gUnknown_80FED0C); // But nothing happened... + } + else + { + info = target->info; + if (sub_8045888(target)) { + sub_8080B00(tile, 0x1B); + flag = TRUE; + sub_80421C0(target,0x193); + sub_803E708(0x1e,0x48); + } + if (info->isTeamLeader) { + if (sub_8043D10() != 2) { + info->unk15C = 1; + info->unk15E = 1; + sub_803E708(0x28,0x4b); + sub_806F324(target,gUnknown_80F4F8A,0x11,0x215); + gDungeon->unk2 = 2; + return; + } + SendMessage(pokemon,*gUnknown_80F9728); + } + else + { + SetMessageArgument(gAvailablePokemonNames,target,0); + if (info->isNotTeamMember) { + sub_80522F4(pokemon,target,*gUnknown_80F970C); // $m0 fell into the pitfall! + } + else { + sub_805239C(pokemon,*gUnknown_80F970C); // $m0 fell into the pitfall! + } + sub_8068FE0(target,0x215,pokemon); + } + if (flag) { + sub_8080B00(tile, 5); + } + } + } +}