diff --git a/asm/code_807FCD4.s b/asm/code_807FCD4.s deleted file mode 100644 index b7100db21..000000000 --- a/asm/code_807FCD4.s +++ /dev/null @@ -1,231 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start HandlePokemonTrap -HandlePokemonTrap: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x30 - str r0, [sp, 0x14] - adds r5, r1, 0 - movs r0, 0 - str r0, [sp, 0x20] - ldr r6, _080808D0 - ldr r0, [r6] - ldr r1, _080808D4 - adds r0, r1 - ldrb r4, [r0] - bl IsBossFight - lsls r0, 24 - cmp r0, 0 - beq _080808DC - ldr r0, _080808D8 - b _08080A2E - .align 2, 0 -_080808D0: .4byte gDungeon -_080808D4: .4byte 0x00018209 -_080808D8: .4byte gUnknown_80FED08 -_080808DC: - cmp r4, 0 - bne _080808E2 - movs r4, 0x2 -_080808E2: - movs r2, 0 - ldrsh r0, [r5, r2] - movs r3, 0x2 - ldrsh r1, [r5, r3] - bl GetTile - ldrb r1, [r0, 0x9] - cmp r1, 0xFF - bne _0808090A - movs r0, 0 - ldrsh r1, [r5, r0] - subs r2, r1, r4 - str r2, [sp, 0x18] - movs r3, 0x2 - ldrsh r0, [r5, r3] - subs r2, r0, r4 - adds r1, r4 - mov r10, r1 - adds r0, r4 - b _08080934 -_0808090A: - lsls r0, r1, 3 - subs r0, r1 - lsls r0, 2 - ldr r1, _08080994 - adds r0, r1 - ldr r1, [r6] - adds r1, r0 - movs r2, 0x2 - ldrsh r0, [r1, r2] - subs r0, 0x1 - str r0, [sp, 0x18] - movs r3, 0x4 - ldrsh r0, [r1, r3] - subs r2, r0, 0x1 - movs r3, 0x6 - ldrsh r0, [r1, r3] - adds r0, 0x1 - mov r10, r0 - movs r3, 0x8 - ldrsh r0, [r1, r3] - adds r0, 0x1 -_08080934: - str r0, [sp, 0x1C] - adds r7, r2, 0 - ldr r0, [sp, 0x1C] - cmp r7, r0 - bgt _08080A26 -_0808093E: - ldr r6, [sp, 0x18] - adds r1, r7, 0x1 - str r1, [sp, 0x24] - cmp r6, r10 - bgt _08080A1E - mov r5, sp -_0808094A: - adds r0, r6, 0 - adds r1, r7, 0 - bl GetTile - adds r4, r0, 0 - ldr r0, [r4, 0x14] - adds r2, r6, 0x1 - mov r9, r2 - cmp r0, 0 - beq _08080A18 - bl GetEntityType - cmp r0, 0x3 - bne _08080A18 - ldr r0, [r4, 0x14] - bl GetItemData - ldrb r1, [r0] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _08080A18 - movs r0, 0xBE - lsls r0, 1 - strh r0, [r5] - movs r2, 0 - mov r4, sp -_08080980: - ldr r0, _08080998 - ldr r0, [r0] - ldr r3, _0808099C - adds r0, r3 - ldrb r0, [r0] - cmp r0, 0 - beq _080809A0 - movs r0, 0xBE - lsls r0, 1 - b _080809AE - .align 2, 0 -_08080994: .4byte 0x000104c4 -_08080998: .4byte gDungeon -_0808099C: .4byte 0x0000066e -_080809A0: - movs r0, 0 - str r2, [sp, 0x28] - bl sub_803D970 - lsls r0, 16 - asrs r0, 16 - ldr r2, [sp, 0x28] -_080809AE: - movs r1, 0 - mov r8, r1 - movs r3, 0 - strh r0, [r4] - movs r1, 0 - ldrsh r0, [r4, r1] - movs r1, 0 - str r2, [sp, 0x28] - str r3, [sp, 0x2C] - bl sub_806AA0C - lsls r0, 24 - ldr r2, [sp, 0x28] - ldr r3, [sp, 0x2C] - cmp r0, 0 - bne _080809D4 - adds r2, 0x1 - cmp r2, 0x63 - ble _08080980 -_080809D4: - movs r2, 0 - ldrsh r0, [r5, r2] - movs r1, 0 - str r3, [sp, 0x2C] - bl sub_806AA0C - lsls r0, 24 - ldr r3, [sp, 0x2C] - cmp r0, 0 - beq _08080A10 - strh r3, [r5, 0x8] - mov r0, r8 - strb r0, [r5, 0x2] - strh r6, [r5, 0xC] - strh r7, [r5, 0xE] - str r3, [sp, 0x4] - strb r0, [r5, 0x10] - mov r0, sp - movs r1, 0x1 - bl sub_806B7F8 - cmp r0, 0 - beq _08080A10 - add r0, sp, 0xC - movs r1, 0 - bl sub_80461C8 - ldr r1, [sp, 0x20] - adds r1, 0x1 - str r1, [sp, 0x20] -_08080A10: - adds r0, r6, 0 - adds r1, r7, 0 - bl sub_80402AC -_08080A18: - mov r6, r9 - cmp r6, r10 - ble _0808094A -_08080A1E: - ldr r7, [sp, 0x24] - ldr r2, [sp, 0x1C] - cmp r7, r2 - ble _0808093E -_08080A26: - ldr r3, [sp, 0x20] - cmp r3, 0 - beq _08080A3C - ldr r0, _08080A38 -_08080A2E: - ldr r1, [r0] - ldr r0, [sp, 0x14] - bl LogMessageByIdWithPopupCheckUser - b _08080A46 - .align 2, 0 -_08080A38: .4byte gUnknown_80FDACC -_08080A3C: - ldr r0, _08080A58 - ldr r1, [r0] - ldr r0, [sp, 0x14] - bl LogMessageByIdWithPopupCheckUser -_08080A46: - add sp, 0x30 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08080A58: .4byte gUnknown_80FDAE4 - thumb_func_end HandlePokemonTrap - - .align 2, 0 diff --git a/ld_script.txt b/ld_script.txt index d9813a59a..45890305a 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -265,8 +265,6 @@ SECTIONS { src/weather.o(.text); src/code_807E5AC.o(.text); src/trap.o(.text); - asm/code_807FCD4.o(.text); - src/trap_1.o(.text); src/dungeon_serializer.o(.text); src/dungeon_range.o(.text); src/code_808333C.o(.text); diff --git a/src/trap.c b/src/trap.c index 024fd0731..5b6e251b9 100644 --- a/src/trap.c +++ b/src/trap.c @@ -9,6 +9,7 @@ #include "code_8077274_1.h" #include "code_807CD9C.h" #include "code_808417C.h" +#include "code_806CD90.h" #include "constants/trap.h" #include "constants/type.h" #include "dungeon_engine.h" @@ -48,17 +49,20 @@ extern u8 *gUnknown_80FDAA0[]; extern u8 *gUnknown_80FDA80[]; extern u8 *gUnknown_80FDB04[]; extern u8 *gUnknown_80FDB2C[]; - +extern u8 *gUnknown_80FDAE4[]; +extern u8 *gUnknown_80FDACC[]; +extern u8 *gUnknown_80FED08[]; extern u32 gUnknown_8106A4C; extern u32 gUnknown_8106A50; void sub_806A9B4(Entity *, u32); - +void sub_80461C8(DungeonPos *, u32); +void sub_80402AC(s32, s32); s16 sub_803D970(u32); bool8 sub_806AA0C(s32, s32); void sub_80421EC(DungeonPos *, u32); - +extern void sub_804687C(Entity *, DungeonPos *, DungeonPos *, Item *, u32); bool8 sub_8045888(Entity *); u8 GetFloorType(void); void sub_8068FE0(Entity *, u32, Entity *); @@ -698,3 +702,124 @@ void HandleWhirlwindTrap(Entity *pokemon, Entity *target) BlowAwayTarget(pokemon, target, DungeonRandInt(NUM_DIRECTIONS)); } } + +void HandlePokemonTrap(Entity *param_1,DungeonPos *pos) +{ + s32 x, y, roomId; + s32 maxX; + struct unkStruct_806B7F8 local_50; + s32 bottomX; + s32 maxY; + s32 bottomY; + s32 counter = 0; + s32 range = gDungeon->unk181e8.visibilityRange; + + if (IsBossFight()) { + LogMessageByIdWithPopupCheckUser(param_1,*gUnknown_80FED08); + return; + } + + if (range == 0) { + range = 2; + } + + roomId = GetTile(pos->x,pos->y)->room; + if (roomId == CORRIDOR_ROOM) { + bottomX = pos->x - range; + bottomY = pos->y - range; + maxX = pos->x + range; + maxY = pos->y + range; + } + else { + RoomData *room = &gDungeon->roomData[roomId]; + bottomX = room->bottomRightCornerX + -1; + bottomY = room->bottomRightCornerY + -1; + maxX = room->topLeftCornerX + 1; + maxY = room->topLeftCornerY + 1; + } + + for (y = bottomY; y <= maxY; y++) { + for (x = bottomX; x <= maxX; x++) { + const Tile *tile = GetTile(x,y); + if (tile->object != NULL && GetEntityType(tile->object) == ENTITY_ITEM && !(GetItemData(tile->object)->flags & ITEM_FLAG_IN_SHOP)) { + s32 i, species; + + local_50.species = MONSTER_KECLEON; + for (i = 0; i < 100; i++) { + if (gDungeon->unk644.unk2A != 0) { + species = MONSTER_KECLEON; + } + else { + species = (s16) sub_803D970(0); + ASM_MATCH_TRICK(species); + } + + local_50.species = species; + if (sub_806AA0C(local_50.species, 0) != 0) + break; + } + + if (sub_806AA0C(local_50.species, 0)) { + local_50.level = 0; + local_50.unk2 = 0; + local_50.pos.x = x; + local_50.pos.y = y; + local_50.unk4 = 0; + local_50.unk10 = 0; + if (sub_806B7F8(&local_50, TRUE) != 0) { + sub_80461C8(&local_50.pos,0); + counter++; + } + } + sub_80402AC(x,y); + } + } + } + + if (counter != 0) { + LogMessageByIdWithPopupCheckUser(param_1,*gUnknown_80FDACC); + } + else { + LogMessageByIdWithPopupCheckUser(param_1,*gUnknown_80FDAE4); + } +} + +void HandleTripTrap(Entity *pokemon, Entity *target) +{ + u32 direction; + EntityInfo *info; + DungeonPos pos; + Item item; + + if (target != NULL) { + sub_806CDD4(target, 6, NUM_DIRECTIONS); + sub_803E708(0x10, 0x55); + sub_806CE68(target, NUM_DIRECTIONS); + info = GetEntInfo(target); + if ((info->heldItem).flags & ITEM_FLAG_EXISTS) { + item = (info->heldItem); + (info->heldItem).flags = 0; + FillInventoryGaps(); + sub_80421C0(target, 400); + direction = (info->action).direction & DIRECTION_MASK; + pos.x = (target->pos).x + gAdjacentTileOffsets[direction].x; + pos.y = (target->pos).y + gAdjacentTileOffsets[direction].y; + sub_804687C(pokemon, &target->pos, &pos, &item, 1); + } + } +} + +void SetTrap(Tile *tile, u8 id) +{ + Trap *trapData; + Entity *entity; + + entity = tile->object; + if (EntityIsValid(entity)) { + if (GetEntityType(entity) == ENTITY_TRAP) { + trapData = GetTrapData(entity); + trapData->id = id; + } + sub_8049ED4(); + } +} diff --git a/src/trap_1.c b/src/trap_1.c deleted file mode 100644 index 8e5aa8c2b..000000000 --- a/src/trap_1.c +++ /dev/null @@ -1,51 +0,0 @@ -#include "global.h" -#include "code_803E668.h" -#include "code_8041AD0.h" -#include "code_806CD90.h" -#include "dungeon_map_access.h" -#include "dungeon_util.h" -#include "items.h" - -// TODO: Merge this file with trap.c after "HandlePokemonTrap" is in c - -extern void sub_804687C(Entity *, DungeonPos *, DungeonPos *, Item *, u32); - -void HandleTripTrap(Entity *pokemon, Entity *target) -{ - u32 direction; - EntityInfo *info; - DungeonPos pos; - Item item; - - if (target != NULL) { - sub_806CDD4(target, 6, NUM_DIRECTIONS); - sub_803E708(0x10, 0x55); - sub_806CE68(target, NUM_DIRECTIONS); - info = GetEntInfo(target); - if ((info->heldItem).flags & ITEM_FLAG_EXISTS) { - item = (info->heldItem); - (info->heldItem).flags = 0; - FillInventoryGaps(); - sub_80421C0(target, 400); - direction = (info->action).direction & DIRECTION_MASK; - pos.x = (target->pos).x + gAdjacentTileOffsets[direction].x; - pos.y = (target->pos).y + gAdjacentTileOffsets[direction].y; - sub_804687C(pokemon, &target->pos, &pos, &item, 1); - } - } -} - -void SetTrap(Tile *tile, u8 id) -{ - Trap *trapData; - Entity *entity; - - entity = tile->object; - if (EntityIsValid(entity)) { - if (GetEntityType(entity) == ENTITY_TRAP) { - trapData = GetTrapData(entity); - trapData->id = id; - } - sub_8049ED4(); - } -}