diff --git a/data/data_8107010.s b/data/data_8107010.s index 2977df499..00fcd2831 100644 --- a/data/data_8107010.s +++ b/data/data_8107010.s @@ -7,8 +7,6 @@ .string "pksdir0\0" .string "pksdir0\0" .string "pksdir0\0" -.string "pksdir0\0" -.string "pksdir0\0" @ HandleExplosion .string "pksdir0\0" diff --git a/ld_script.txt b/ld_script.txt index 5677a1003..71dfa4739 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -260,6 +260,8 @@ SECTIONS { src/dungeon_ai_movement.o(.text); src/dungeon_ai_attack.o(.text); src/blow_away.o(.text); + src/warp_target.o(.text); + src/expose_trap.o(.text); src/code_807CD9C.o(.text); src/code_807E1A0.o(.text); src/weather.o(.text); @@ -597,6 +599,8 @@ SECTIONS { src/dungeon_ai_movement.o(.rodata); src/dungeon_ai_attack.o(.rodata); src/blow_away.o(.rodata); + src/warp_target.o(.rodata); + src/expose_trap.o(.rodata); data/data_8107010.o(.rodata); src/dungeon_serializer.o(.rodata); data/data_8107224.o(.rodata); diff --git a/src/code_807CD9C.c b/src/code_807CD9C.c index 070b381ca..0553b2071 100644 --- a/src/code_807CD9C.c +++ b/src/code_807CD9C.c @@ -50,173 +50,6 @@ extern void sub_803F580(u32); bool8 sub_808384C(DungeonPos *, DungeonPos *); u8 sub_8083660(DungeonPos *); -void WarpTarget(Entity *pokemon, Entity *target, u32 param_3, DungeonPos *pos) -{ - EntityInfo *info; - u32 direction; - DungeonPos local_2c; - bool8 flag; - - info = GetEntInfo(target); - flag = FALSE; - - SubstitutePlaceholderStringTags(gFormatBuffer_Monsters[0],target,0); - if (AbilityIsActive(target,ABILITY_SUCTION_CUPS)) { - TryDisplayDungeonLoggableMessage3(pokemon,target,gUnknown_80FCAE8); - return; - } - if (IsCurrentFixedRoomBossFight()) { - TryDisplayDungeonLoggableMessage3(pokemon,target,gUnknown_80FC97C); - return; - } - if (param_3 == 1) - { - DungeonPos stairsPosition = gDungeon->stairsSpawn; - if(stairsPosition.x == target->pos.x && stairsPosition.y == target->pos.y) { - TryDisplayDungeonLoggableMessage3(pokemon,target,gUnknown_80FC9A0); // It's already on the stairs! - PetrifiedStatusTarget(pokemon,target); - return; - } - } - - TryDisplayDungeonLoggableMessage3(pokemon,target,gUnknown_80FC584); // $m0 warped! - TrySendImmobilizeSleepEndMsg(target,target); - sub_80421AC(pokemon,target); - if (sub_8045888(target)) { - direction = (info->action).direction; - target->unk1C.raw += + 0x800; - while ( target->unk1C.raw < 0xa000) { - if ((gDungeonFramesCounter & 3) == 0) { - direction = (direction + 1) & DIRECTION_MASK; - info->action.direction = direction & DIRECTION_MASK; - sub_806CE68(target,direction); - } - DungeonRunFrameActions(0x22); - target->unk1C.raw += 0x800; - } - } - - - switch(param_3) - { - default: - case 0: - if (!sub_8083660(&local_2c)) { - local_2c = target->pos; - flag = TRUE; - } - break; - case 1: - if (!sub_808384C(&local_2c,&gDungeon->stairsSpawn)) { - local_2c = target->pos; - flag = TRUE; - } - break; - case 2: - if (!sub_808384C(&local_2c,pos)) { - local_2c = target->pos; - flag = TRUE; - } - break; - case 3: - local_2c = *pos; - break; - - } - - sub_80694C0(target,local_2c.x,local_2c.y,1); - sub_804535C(target,0); - sub_807BB78(target); - sub_803F580(1); - if (sub_8045888(target)) { - direction = (info->action).direction; - target->unk1C.raw = 0x9c00; - do { - if ((gDungeonFramesCounter & 3) == 0) { - direction = (direction + 1) & DIRECTION_MASK; - info->action.direction = direction & DIRECTION_MASK; - sub_806CE68(target,direction); - } - DungeonRunFrameActions(0x22); - target->unk1C.raw -= 0x400; - } while (0 < target->unk1C.raw); - } - target->unk1C = IntToF248_2(0); - DungeonRunFrameActions(0x22); - if (flag) { - TryDisplayDungeonLoggableMessage3(pokemon,target,gUnknown_80FCB14); // But it dropped back at the same spot! - } - if (param_3 == 1) { - PetrifiedStatusTarget(pokemon,target); - } - if (info->isTeamLeader) { - sub_804AC20(&target->pos); - gDungeon->unk1 = 0; - gDungeon->unk5C0 = -1; - sub_807EC28(0); - } - sub_806A5B8(target); - sub_8075900(target,gDungeon->forceMonsterHouse); -} - -void sub_807D3CC(Entity *param_1) -{ - u32 room; - u8 flag; - int x; - int y; - s32 range; - RoomData *roomData; - - flag = FALSE; - range = gDungeon->unk181e8.visibilityRange; - if (range == 0) { - range = 2; - } - room = GetEntityRoom(param_1); - - if (room == CORRIDOR_ROOM) { - for (y = (param_1->pos).y - range; y <= ((param_1->pos).y + range); y++) - { - for (x = (param_1->pos).x - range; x <= ((param_1->pos).x + range); x++) { - flag |= ExposeTrap(x,y); - } - } - } - else { - roomData = &gDungeon->roomData[room]; - for (y = roomData->bottomRightCornerY + -1; y <= roomData->topLeftCornerY + 1; y++) { - for (x = roomData->bottomRightCornerX + -1; x <= roomData->topLeftCornerX + 1; x++) { - flag |= ExposeTrap(x,y); - } - } - } - if (flag) { - LogMessageByIdWithPopupCheckUser(param_1,gUnknown_80FD2F8); // All traps were exposed - ShowWholeRevealedDungeonMap(); - sub_8049ED4(); - } - else { - LogMessageByIdWithPopupCheckUser(param_1,gUnknown_80FD320); // There appears to be no hidden traps. - } -} - -bool8 ExposeTrap(s32 x,s32 y) -{ - const Tile *tile; - Entity *trap; - - tile = GetTile(x,y); - trap = tile->object; - if (((trap != NULL) && (GetEntityType(trap) == ENTITY_TRAP)) && (!trap->isVisible)) { - trap->isVisible = TRUE; - return TRUE; - } - else { - return FALSE; - } -} - extern const u8 *const gUnknown_80FE034; extern const u8 *const gUnknown_80FE060; extern const DungeonPos gUnknown_80F4468[]; diff --git a/src/expose_trap.c b/src/expose_trap.c new file mode 100644 index 000000000..86e63390e --- /dev/null +++ b/src/expose_trap.c @@ -0,0 +1,103 @@ +#include "global.h" +#include "globaldata.h" +#include "constants/ability.h" +#include "constants/weather.h" +#include "code_803E46C.h" +#include "dungeon_message.h" +#include "code_806CD90.h" +#include "code_807CD9C.h" +#include "structs/str_dungeon.h" +#include "code_8077274_1.h" +#include "dungeon_ai.h" +#include "run_dungeon.h" +#include "dungeon_generation.h" +#include "dungeon_logic.h" +#include "dungeon_map.h" +#include "dungeon_map_access.h" +#include "dungeon_util.h" +#include "math.h" +#include "move_effects_target.h" +#include "moves.h" +#include "move_util.h" +#include "code_8041AD0.h" +#include "code_803E668.h" +#include "weather.h" +#include "dungeon_config.h" +#include "dungeon_misc.h" +#include "dungeon_items.h" +#include "dungeon_strings.h" + +void sub_804EB30(); +bool8 ExposeTrap(s32 x, s32 y); +void ShowWholeRevealedDungeonMap(); +void sub_8049ED4(); +void sub_806A5B8(Entity *); +u8 sub_8045888(Entity *); +void sub_807EC28(u32); +u8 sub_8044B28(void); +extern void sub_806F370(Entity *pokemon, Entity *target, u32, u32, u8 *, u8 moveType, s32, u32, u32, u32); +void sub_80421AC(Entity * pokemon, Entity * target); +void sub_807BB78(Entity *pokemon); +extern void sub_803F580(u32); +bool8 sub_808384C(DungeonPos *, DungeonPos *); +u8 sub_8083660(DungeonPos *); + +extern u32 gDungeonFramesCounter; + +void sub_807D3CC(Entity *param_1) +{ + u32 room; + u8 flag; + int x; + int y; + s32 range; + RoomData *roomData; + + flag = FALSE; + range = gDungeon->unk181e8.visibilityRange; + if (range == 0) { + range = 2; + } + room = GetEntityRoom(param_1); + + if (room == CORRIDOR_ROOM) { + for (y = (param_1->pos).y - range; y <= ((param_1->pos).y + range); y++) + { + for (x = (param_1->pos).x - range; x <= ((param_1->pos).x + range); x++) { + flag |= ExposeTrap(x,y); + } + } + } + else { + roomData = &gDungeon->roomData[room]; + for (y = roomData->bottomRightCornerY + -1; y <= roomData->topLeftCornerY + 1; y++) { + for (x = roomData->bottomRightCornerX + -1; x <= roomData->topLeftCornerX + 1; x++) { + flag |= ExposeTrap(x,y); + } + } + } + if (flag) { + LogMessageByIdWithPopupCheckUser(param_1,gUnknown_80FD2F8); // All traps were exposed + ShowWholeRevealedDungeonMap(); + sub_8049ED4(); + } + else { + LogMessageByIdWithPopupCheckUser(param_1,gUnknown_80FD320); // There appears to be no hidden traps. + } +} + +bool8 ExposeTrap(s32 x,s32 y) +{ + const Tile *tile; + Entity *trap; + + tile = GetTile(x,y); + trap = tile->object; + if (((trap != NULL) && (GetEntityType(trap) == ENTITY_TRAP)) && (!trap->isVisible)) { + trap->isVisible = TRUE; + return TRUE; + } + else { + return FALSE; + } +} diff --git a/src/warp_target.c b/src/warp_target.c new file mode 100644 index 000000000..6f5e08d0b --- /dev/null +++ b/src/warp_target.c @@ -0,0 +1,154 @@ +#include "global.h" +#include "globaldata.h" +#include "constants/ability.h" +#include "constants/weather.h" +#include "code_803E46C.h" +#include "dungeon_message.h" +#include "code_806CD90.h" +#include "code_807CD9C.h" +#include "structs/str_dungeon.h" +#include "code_8077274_1.h" +#include "dungeon_ai.h" +#include "run_dungeon.h" +#include "dungeon_generation.h" +#include "dungeon_logic.h" +#include "dungeon_map.h" +#include "dungeon_map_access.h" +#include "dungeon_util.h" +#include "math.h" +#include "move_effects_target.h" +#include "moves.h" +#include "move_util.h" +#include "code_8041AD0.h" +#include "code_803E668.h" +#include "weather.h" +#include "dungeon_config.h" +#include "dungeon_misc.h" +#include "dungeon_items.h" +#include "dungeon_strings.h" + +extern u32 gDungeonFramesCounter; + +void sub_804EB30(); +bool8 ExposeTrap(s32 x, s32 y); +void ShowWholeRevealedDungeonMap(); +void sub_8049ED4(); +void sub_806A5B8(Entity *); +u8 sub_8045888(Entity *); +void sub_807EC28(u32); +u8 sub_8044B28(void); +extern void sub_806F370(Entity *pokemon, Entity *target, u32, u32, u8 *, u8 moveType, s32, u32, u32, u32); +void sub_80421AC(Entity * pokemon, Entity * target); +void sub_807BB78(Entity *pokemon); +extern void sub_803F580(u32); +bool8 sub_808384C(DungeonPos *, DungeonPos *); +u8 sub_8083660(DungeonPos *); + +void WarpTarget(Entity *pokemon, Entity *target, u32 param_3, DungeonPos *pos) +{ + EntityInfo *info; + u32 direction; + DungeonPos local_2c; + bool8 flag; + + info = GetEntInfo(target); + flag = FALSE; + + SubstitutePlaceholderStringTags(gFormatBuffer_Monsters[0],target,0); + if (AbilityIsActive(target,ABILITY_SUCTION_CUPS)) { + TryDisplayDungeonLoggableMessage3(pokemon,target,gUnknown_80FCAE8); + return; + } + if (IsCurrentFixedRoomBossFight()) { + TryDisplayDungeonLoggableMessage3(pokemon,target,gUnknown_80FC97C); + return; + } + if (param_3 == 1) + { + DungeonPos stairsPosition = gDungeon->stairsSpawn; + if(stairsPosition.x == target->pos.x && stairsPosition.y == target->pos.y) { + TryDisplayDungeonLoggableMessage3(pokemon,target,gUnknown_80FC9A0); // It's already on the stairs! + PetrifiedStatusTarget(pokemon,target); + return; + } + } + + TryDisplayDungeonLoggableMessage3(pokemon,target,gUnknown_80FC584); // $m0 warped! + TrySendImmobilizeSleepEndMsg(target,target); + sub_80421AC(pokemon,target); + if (sub_8045888(target)) { + direction = (info->action).direction; + target->unk1C.raw += + 0x800; + while ( target->unk1C.raw < 0xa000) { + if ((gDungeonFramesCounter & 3) == 0) { + direction = (direction + 1) & DIRECTION_MASK; + info->action.direction = direction & DIRECTION_MASK; + sub_806CE68(target,direction); + } + DungeonRunFrameActions(0x22); + target->unk1C.raw += 0x800; + } + } + + + switch(param_3) + { + default: + case 0: + if (!sub_8083660(&local_2c)) { + local_2c = target->pos; + flag = TRUE; + } + break; + case 1: + if (!sub_808384C(&local_2c,&gDungeon->stairsSpawn)) { + local_2c = target->pos; + flag = TRUE; + } + break; + case 2: + if (!sub_808384C(&local_2c,pos)) { + local_2c = target->pos; + flag = TRUE; + } + break; + case 3: + local_2c = *pos; + break; + + } + + sub_80694C0(target,local_2c.x,local_2c.y,1); + sub_804535C(target,0); + sub_807BB78(target); + sub_803F580(1); + if (sub_8045888(target)) { + direction = (info->action).direction; + target->unk1C.raw = 0x9c00; + do { + if ((gDungeonFramesCounter & 3) == 0) { + direction = (direction + 1) & DIRECTION_MASK; + info->action.direction = direction & DIRECTION_MASK; + sub_806CE68(target,direction); + } + DungeonRunFrameActions(0x22); + target->unk1C.raw -= 0x400; + } while (0 < target->unk1C.raw); + } + target->unk1C = IntToF248_2(0); + DungeonRunFrameActions(0x22); + if (flag) { + TryDisplayDungeonLoggableMessage3(pokemon,target,gUnknown_80FCB14); // But it dropped back at the same spot! + } + if (param_3 == 1) { + PetrifiedStatusTarget(pokemon,target); + } + if (info->isTeamLeader) { + sub_804AC20(&target->pos); + gDungeon->unk1 = 0; + gDungeon->unk5C0 = -1; + sub_807EC28(0); + } + sub_806A5B8(target); + sub_8075900(target,gDungeon->forceMonsterHouse); +}