diff options
| author | theo3 <arisstephenson2@gmail.com> | 2022-03-27 00:19:10 -0700 |
|---|---|---|
| committer | theo3 <arisstephenson2@gmail.com> | 2022-03-27 00:19:10 -0700 |
| commit | ca139bf5584ceaada7fbd19291a91559851918ce (patch) | |
| tree | 16581618ed2c11480402867f0b4d31fb0c035d5f /src | |
| parent | 5208bfd1aa3d0103fb8e57ba08a99511e1b524b7 (diff) | |
| parent | 74f88fe5eeaf14ed3f6e8d6344aca88a36d7a697 (diff) | |
merge
Diffstat (limited to 'src')
135 files changed, 8929 insertions, 1157 deletions
diff --git a/src/code_08049CD4.c b/src/code_08049CD4.c index a773306d..c98323d1 100644 --- a/src/code_08049CD4.c +++ b/src/code_08049CD4.c @@ -1,25 +1,76 @@ +#define NENT_DEPRECATED #include "global.h" - -extern u32* gUnk_020354B0; -extern u32 gRoomMemory; +#include "room.h" extern void MemFill32(u32, void*, u32); +void sub_08049DCC(RoomMemory*); +RoomMemory* sub_08049D88(void); + void ClearRoomMemory(void) { - MemFill32(0xFFFFFFFF, &gRoomMemory, 0x40); - gUnk_020354B0 = &gRoomMemory; + MemFill32(0xFFFFFFFF, gRoomMemory, 0x40); + gUnk_020354B0 = gRoomMemory; } -void sub_08049CF4(u8* arg0) { - u8 field_0x6c = *(arg0 + 0x6c); +void sub_08049CF4(GenericEntity* ent) { + u8 field_0x6c = ent->field_0x6c.HALF.LO; if (field_0x6c & 0x80) { - *(gUnk_020354B0 + 1) |= 1 << (field_0x6c & 0x1f); + gUnk_020354B0->unk_04 |= 1 << (field_0x6c & 0x1f); } } u32 sub_08049D1C(u32 arg0) { - u32 bitmask = *(gUnk_020354B0 + 1) >> arg0; + u32 bitmask = gUnk_020354B0->unk_04 >> arg0; u32 output = 1; output &= ~bitmask; return output; } + +void UpdateRoomTracker(void) { + gUnk_020354B0 = gRoomMemory; + + do { + if (gUnk_020354B0->area == gRoomControls.area && gUnk_020354B0->room == gRoomControls.room) { + sub_08049DCC(gUnk_020354B0); + return; + } + gUnk_020354B0++; + + } while (gUnk_020354B0 < gRoomMemory + 8); + gUnk_020354B0 = sub_08049D88(); +} + +RoomMemory* sub_08049D88(void) { + RoomMemory* rm = gRoomMemory; + RoomMemory* r1 = rm + 1; + + do { + if (r1->unk_02 > rm->unk_02) { + rm = r1; + } + r1++; + } while (r1 < gRoomMemory + 8); + + rm->area = gRoomControls.area; + rm->room = gRoomControls.room; + + rm->unk_02 = 0xFFFF; + rm->unk_04 = 0; + + sub_08049DCC(rm); + + return rm; +} + +void sub_08049DCC(RoomMemory* rm) { + RoomMemory* r1 = gRoomMemory; + + do { + if (r1->unk_02 < rm->unk_02) { + r1->unk_02++; + } + r1++; + } while (r1 < gRoomMemory + 8); + + rm->unk_02 = 0; +} diff --git a/src/code_08049DF4.c b/src/code_08049DF4.c new file mode 100644 index 00000000..06b77524 --- /dev/null +++ b/src/code_08049DF4.c @@ -0,0 +1,324 @@ +#define NENT_DEPRECATED +#include "asm.h" +#include "global.h" +#include "entity.h" +#include "functions.h" +#include "map.h" +#include "player.h" +#include "room.h" + +extern Entity* gUnk_020000B0; +extern Entity* (*const gUnk_080D3BE8[])(void); + +extern void ReplaceMonitoredEntity(Entity*, Entity*); + +Entity* sub_08049DF4(u32 arg0) { + if (gUnk_020000B0 != NULL) { + return gUnk_020000B0; + } + return gUnk_080D3BE8[arg0](); +} + +Entity* sub_08049E18(void) { + if ((gPlayerState.field_0x3c[0] == 0) && !(gPlayerState.flags & 0x22189b75)) { + gUnk_020000B0 = &gPlayerEntity; + return &gPlayerEntity; + } + return NULL; +} + +Entity* sub_08049E4C(void) { + if ((gPlayerState.field_0x3c[0] == 0) && !(gPlayerState.flags & 0x22189bf5)) { + gUnk_020000B0 = &gPlayerEntity; + return &gPlayerEntity; + } + return NULL; +} + +Entity* sub_08049E80(void) { + if ((gPlayerState.field_0x3c[0] != 0) || !(gPlayerState.flags & 0x80)) { + return NULL; + } + gUnk_020000B0 = &gPlayerEntity; + return &gPlayerEntity; +} + +Entity* sub_08049EB0(void) { + if ((gPlayerState.field_0x3c[0] == 0) && !(gPlayerState.flags & 0x80190)) { + gUnk_020000B0 = &gPlayerEntity; + return &gPlayerEntity; + } + return NULL; +} + +u32 sub_08049EE4(Entity* ent) { + GenericEntity* genEnt = (GenericEntity*)ent; + u16 tempLO = genEnt->field_0x70.HALF.LO + 4 * genEnt->field_0x6e.HALF.LO; + u16 tempHI = genEnt->field_0x70.HALF.HI + 4 * genEnt->field_0x6e.HALF.HI; + + return CalculateDirectionTo(genEnt->base.x.HALF.HI, genEnt->base.y.HALF.HI, tempLO, tempHI); +} + +bool32 sub_08049F1C(Entity* entA, Entity* entB, s32 maxDist) { + if ((entA->collisionLayer & entB->collisionLayer) != 0) { + s32 xDiff = entB->x.HALF.HI - entA->x.HALF.HI; + s32 yDiff = entB->y.HALF.HI - entA->y.HALF.HI; + s32 maxDistSq = maxDist * maxDist; + s32 distSq = xDiff * xDiff + yDiff * yDiff; + + if (maxDistSq >= distSq) { + return TRUE; + } + } + return FALSE; +} + +bool32 PlayerInRange(Entity* ent, u32 arg1, s32 maxDist) { + Entity* tempEnt = sub_08049DF4(arg1); + if (tempEnt == NULL) { + return FALSE; + } else { + return sub_08049F1C(ent, tempEnt, maxDist); + } +} + +u32 sub_08049F84(Entity* ent, s32 arg2) { + Entity* target = sub_08049DF4(arg2); + + if (target == NULL) { + return 0xFF; + } else { + return GetFacingDirection(ent, target); + } +} + +bool32 sub_08049FA0(Entity* ent) { + GenericEntity* genEnt = (GenericEntity*)ent; + u32 temp = 8 * genEnt->field_0x6e.HALF.LO; + + if (temp >= genEnt->base.x.HALF.HI - genEnt->field_0x70.HALF_U.LO) { + temp = 8 * genEnt->field_0x6e.HALF.HI; + if (temp >= genEnt->base.y.HALF.HI - genEnt->field_0x70.HALF_U.HI) { + return TRUE; + } + } + return FALSE; +} + +bool32 sub_08049FDC(Entity* ent, u32 arg1) { + u32 temp; + GenericEntity* genEnt = (GenericEntity*)ent; + GenericEntity* tempEnt = (GenericEntity*)sub_08049DF4(arg1); + + if (tempEnt != NULL) { + temp = 8 * genEnt->field_0x6e.HALF.LO; + if (temp >= tempEnt->base.x.HALF.HI - genEnt->field_0x70.HALF_U.LO) { + temp = 8 * genEnt->field_0x6e.HALF.HI; + if (temp >= tempEnt->base.y.HALF.HI - genEnt->field_0x70.HALF_U.HI) { + return TRUE; + } + } + } + return FALSE; +} + +u32 sub_0804A024(Entity* ent, u32 arg1, u32 arg2) { + Entity* tempEnt = sub_08049DF4(arg1); + if (tempEnt == NULL) { + return 0xFF; + } else { + return sub_0804A044(ent, tempEnt, arg2); + } +} + +u32 sub_0804A168(Entity*, Entity*, LayerStruct*); +u32 sub_0804A318(Entity*, Entity*, LayerStruct*); + +u32 sub_0804A044(Entity* entA, Entity* entB, u32 arg2) { + LayerStruct* layer; + s32 ret; + s32 yDiff; + s32 xDiff; + s32 flags; + + if ((entB->collisionLayer & entA->collisionLayer) != 0) { + flags = 0; + xDiff = entB->x.HALF.HI + entB->hitbox->offset_x - entA->x.HALF.HI - entA->hitbox->offset_x; + + if (arg2 >= xDiff + (arg2 >> 1)) { + flags |= 1; + } + if (arg2 << 1 >= xDiff + arg2) { + flags |= 2; + } + + yDiff = entB->y.HALF.HI + entB->hitbox->offset_y - entA->y.HALF.HI - entA->hitbox->offset_y; + if (arg2 >= yDiff + (arg2 >> 1)) { + flags |= 4; + } + if (arg2 << 1 >= yDiff + arg2) { + flags |= 8; + } + + //! @bug flags & 5 can never equal 0xA + if (flags && ((flags & 5) != 0xA)) { + layer = GetLayerByIndex(entA->collisionLayer); + if (xDiff < 0) { + xDiff = -xDiff; + } + if (yDiff < 0) { + yDiff = -yDiff; + } + if (xDiff < yDiff) { + if (flags & 1) { + ret = sub_0804A168(entA, entB, layer); + if (ret != 0xFF) { + return ret; + } + } + if (!(flags & 4)) { + return 0xFF; + } + ret = sub_0804A318(entA, entB, layer); + } else { + if (flags & 4) { + ret = sub_0804A318(entA, entB, layer); + if (ret != 0xFF) { + return ret; + } + } + if (!(flags & 1)) { + return 0xFF; + } + ret = sub_0804A168(entA, entB, layer); + } + if (ret != 0xFF) { + return ret; + } + } + } + return 0xFF; +} + +bool32 sub_0804A4BC(u8* arg0, u8* arg1, s32 arg2, u32 arg3); + +u32 sub_0804A168(Entity* entA, Entity* entB, LayerStruct* layer) { + u32 uVar2; + u32 uVar3; + u32 tile1; + u32 tile2; + + if (entB->y.HALF.HI > entA->y.HALF.HI) { + uVar2 = entA->x.HALF.HI - 4; + uVar3 = ((uVar2 & 0xF) < 8) ? 10 : 5; + tile1 = TILE(uVar2, entA->y.HALF.HI + 10); + tile2 = TILE(uVar2, entB->y.HALF.HI); + + if (sub_0804A4BC(&layer->collisionData[tile1], &layer->collisionData[tile2], 0x40, uVar3)) { + uVar2 = entA->x.HALF.HI + 4; + uVar3 ^= 0xF; + tile1 = TILE(uVar2, entA->y.HALF.HI + 10); + tile2 = TILE(uVar2, entB->y.HALF.HI); + + if (sub_0804A4BC(&layer->collisionData[tile1], &layer->collisionData[tile2], 0x40, uVar3)) { + return 0x10; + } + } + } else { + uVar2 = entA->x.HALF.HI - 4; + uVar3 = ((uVar2 & 0xF) < 8) ? 10 : 5; + tile1 = TILE(uVar2, entA->y.HALF.HI - 10); + tile2 = TILE(uVar2, entB->y.HALF.HI); + + if (sub_0804A4BC(&layer->collisionData[tile1], &layer->collisionData[tile2], -0x40, uVar3)) { + uVar2 = entA->x.HALF.HI + 4; + uVar3 ^= 0xF; + tile1 = TILE(uVar2, entA->y.HALF.HI - 10); + tile2 = TILE(uVar2, entB->y.HALF.HI); + + if (sub_0804A4BC(&layer->collisionData[tile1], &layer->collisionData[tile2], -0x40, uVar3)) { + return 0; + } + } + } + return 0xFF; +} + +u32 sub_0804A318(Entity* entA, Entity* entB, LayerStruct* layer) { + u32 uVar2; + u32 uVar3; + u32 tile1; + u32 tile2; + + if (entB->x.HALF.HI > entA->x.HALF.HI) { + uVar2 = entA->y.HALF.HI - 4; + uVar3 = ((uVar2 & 0xF) < 8) ? 0xC : 3; + tile1 = TILE(entA->x.HALF.HI + 10, uVar2); + tile2 = TILE(entB->x.HALF.HI, uVar2); + + if (sub_0804A4BC(&layer->collisionData[tile1], &layer->collisionData[tile2], 1, uVar3)) { + uVar2 = entA->y.HALF.HI + 4; + uVar3 ^= 0xF; + tile1 = TILE(entA->x.HALF.HI + 10, uVar2); + tile2 = TILE(entB->x.HALF.HI, uVar2); + + if (sub_0804A4BC(&layer->collisionData[tile1], &layer->collisionData[tile2], 1, uVar3)) { + return 8; + } + } + } else { + uVar2 = entA->y.HALF.HI - 4; + uVar3 = ((uVar2 & 0xF) < 8) ? 0xC : 3; + tile1 = TILE(entA->x.HALF.HI - 10, uVar2); + tile2 = TILE(entB->x.HALF.HI, uVar2); + + if (sub_0804A4BC(&layer->collisionData[tile1], &layer->collisionData[tile2], -1, uVar3)) { + uVar2 = entA->y.HALF.HI + 4; + uVar3 ^= 0xF; + tile1 = TILE(entA->x.HALF.HI - 10, uVar2); + tile2 = TILE(entB->x.HALF.HI, uVar2); + if (sub_0804A4BC(&layer->collisionData[tile1], &layer->collisionData[tile2], -1, uVar3)) { + return 0x18; + } + } + } + return 0xFF; +} + +bool32 sub_0804A4BC(u8* arg0, u8* arg1, s32 arg2, u32 arg3) { + while (arg0 != arg1) { + u8 r0 = *arg0; + + if (r0 != 0) { + if (r0 > 0xF) { + return FALSE; + } + + r0 &= arg3; + if (r0 != 0) { + return FALSE; + } + } + arg0 += arg2; + } + + return TRUE; +} + +void sub_0804A4E4(Entity* entA, Entity* entB) { + GenericEntity* r5 = (GenericEntity*)entA; + GenericEntity* r6 = (GenericEntity*)entB; + + r6->field_0x6c.HALF.HI = (r5->field_0x6c.HALF.HI & 0x40) | 4; + r6->field_0x6c.HALF.LO = r5->field_0x6c.HALF.LO; + r6->field_0x70.HALF.LO = r5->field_0x70.HALF.LO; + r6->field_0x70.HALF.HI = r5->field_0x70.HALF.HI; + r6->field_0x6e.HALF.LO = r5->field_0x6e.HALF.LO; + r6->field_0x6e.HALF.HI = r5->field_0x6e.HALF.HI; + + CopyPositionAndSpriteOffset(&r5->base, &r6->base); + + if (r5->field_0x6c.HALF.HI & 0x40) { + ReplaceMonitoredEntity(&r5->base, &r6->base); + } +} diff --git a/src/collision.c b/src/collision.c index 52bd8d27..6c4f9a5b 100644 --- a/src/collision.c +++ b/src/collision.c @@ -61,7 +61,7 @@ void CollisionMain(void) { prio = gPriorityHandler.ent_priority; // if any priority is set, dont do collision - if (prio) + if (prio != 0) return; doCollision = &ram_CollideAll; diff --git a/src/coord.c b/src/coord.c index 629f700a..98f3f65e 100644 --- a/src/coord.c +++ b/src/coord.c @@ -1,6 +1,8 @@ +#define NENT_DEPRECATED #include "asm.h" #include "area.h" #include "player.h" +#include "new_player.h" #include "coord.h" #include "common.h" #include "sound.h" @@ -38,7 +40,7 @@ void sub_0806F38C(void) { u32 sub_0806F39C(Entity* ent) { s32 dist; - if (gPlayerEntity.animationState & 2) { + if (gNewPlayerEntity.base.animationState & 2) { dist = ent->x.HALF.HI - gPlayerEntity.x.HALF.HI; } else { dist = ent->y.HALF.HI - gPlayerEntity.y.HALF.HI; @@ -55,7 +57,7 @@ u32 sub_0806F39C(Entity* ent) { } bool32 sub_0806F3E4(Entity* ent) { - Entity tmp_ent; + GenericEntity tmp_ent; s8* p; if ((gPlayerState.field_0x1c & 0x7F) != 1) @@ -74,15 +76,15 @@ bool32 sub_0806F3E4(Entity* ent) { if (ent->knockbackSpeed > 0x500) ent->knockbackSpeed = 0x500; p = &gUnk_08126EE4[gPlayerEntity.animationState & 0xE]; - tmp_ent.x.HALF.HI = p[0] + gPlayerEntity.x.HALF.HI; - tmp_ent.y.HALF.HI = p[1] + gPlayerEntity.y.HALF.HI; - LinearMoveDirection(ent, ent->knockbackSpeed, GetFacingDirection(ent, &tmp_ent)); - if (sub_0800419C(&tmp_ent, ent, 4, 4)) { + tmp_ent.base.x.HALF.HI = p[0] + gPlayerEntity.x.HALF.HI; + tmp_ent.base.y.HALF.HI = p[1] + gPlayerEntity.y.HALF.HI; + LinearMoveDirection(ent, ent->knockbackSpeed, GetFacingDirection(ent, &tmp_ent.base)); + if (sub_0800419C(&tmp_ent.base, ent, 4, 4)) { u32 state = ent->field_0x1c & 0xF; if (state == 2) { Entity* item; ent->subAction = 3; - (Entity*)gPlayerEntity.field_0x70.WORD = ent; + gNewPlayerEntity.unk_70 = ent; gPlayerState.field_0x1c = 7; item = CreatePlayerItem(0x11, 0, 0, 0); if (item != NULL) { @@ -116,7 +118,7 @@ void sub_0806F4E8(Entity* ent) { } } -u32 sub_0806F520(Entity* ent) { +bool32 sub_0806F520(Entity* ent) { if (ent->bitfield == 0x93) return 1; ent->field_0x3a &= ~4; @@ -336,38 +338,38 @@ void SortEntityBelow(Entity* above_ent, Entity* below_ent) { below_ent->spritePriority.b0 = gSpriteSortBelowTable[above_ent->spritePriority.b0]; } -void sub_0806FB00(Entity* ent, u32 param_1, u32 param_2, u32 param_3) { +void sub_0806FB00(GenericEntity* ent, u32 param_1, u32 param_2, u32 param_3) { if (param_3 == 0) { param_3 = 1; } ent->field_0x7c.BYTES.byte2 = 0; ent->field_0x7c.BYTES.byte3 = param_3; - ent->field_0x80.HWORD = ent->x.HALF.HI; - ent->field_0x82.HWORD = ent->y.HALF.HI; + ent->field_0x80.HWORD = ent->base.x.HALF.HI; + ent->field_0x82.HWORD = ent->base.y.HALF.HI; ent->cutsceneBeh.HWORD = param_1; ent->field_0x86.HWORD = param_2; } -bool32 sub_0806FB38(Entity* ent) { +bool32 sub_0806FB38(GenericEntity* ent) { s32 val; u32 rv; if (ent->field_0x7c.BYTES.byte2 < ent->field_0x7c.BYTES.byte3) { ent->field_0x7c.BYTES.byte2++; - ent->x.HALF.HI = + ent->base.x.HALF.HI = ((((((s16)ent->cutsceneBeh.HWORD - (s16)ent->field_0x80.HWORD) * ent->field_0x7c.BYTES.byte2) << 8) / ent->field_0x7c.BYTES.byte3) >> 8) + ent->field_0x80.HWORD; - ent->y.HALF.HI = + ent->base.y.HALF.HI = (((((((s16)ent->field_0x86.HWORD - (s16)ent->field_0x82.HWORD) * ent->field_0x7c.BYTES.byte2) << 8) / ent->field_0x7c.BYTES.byte3) >> 8)) + ent->field_0x82.HWORD; rv = 0; } else { - ent->x.HALF.HI = ent->cutsceneBeh.HWORD; - ent->y.HALF.HI = ent->field_0x86.HWORD; + ent->base.x.HALF.HI = ent->cutsceneBeh.HWORD; + ent->base.y.HALF.HI = ent->field_0x86.HWORD; rv = 1; } return rv; diff --git a/src/data/transitions.c b/src/data/transitions.c new file mode 100644 index 00000000..5787352d --- /dev/null +++ b/src/data/transitions.c @@ -0,0 +1,3958 @@ +#include "transitions.h" +#include "area.h" +#include "roomid.h" + +// clang-format off + +// this terminates a list of Transitions +#define TransitionListEnd { WARP_TYPE_END_OF_LIST, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + +const Transition gExitList_NoExitList[] = { TransitionListEnd }; +const Transition* const gExitLists_NoExit[] = { + gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, + gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, + gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, + gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, + gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, + gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, + gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, + gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, + gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, + gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, + gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, + gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, + gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, +}; + +const Transition gExitList_MinishWoods_Main[] = { + { WARP_TYPE_AREA, 0x00, 0x0138, 0x0318, 0x0078, 0x0078, 0x00, AREA_MINISH_HOUSE_INTERIORS, + ROOM_MINISH_HOUSE_INTERIORS_MINISH_WOODS_BOMB, 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x01c8, 0x0258, 0x00a8, 0x00d8, 0x00, AREA_DEEPWOOD_SHRINE, ROOM_DEEPWOOD_SHRINE_ENTRANCE, + 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x03a8, 0x0010, 0x0078, 0x0088, 0x02, AREA_BEANSTALKS, ROOM_BEANSTALKS_EASTERN_HILLS, + 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0210, 0x01c8, 0x0078, 0x0078, 0x02, AREA_TREE_INTERIORS, + ROOM_TREE_INTERIORS_MINISH_WOODS_BUSINESS_SCRUB, 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0070, 0x0048, 0x0078, 0x0078, 0x02, AREA_TREE_INTERIORS, + ROOM_TREE_INTERIORS_MINISH_WOODS_GREAT_FAIRY, 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x02c0, 0x0048, 0x0078, 0x0088, 0x02, AREA_TREE_INTERIORS, ROOM_TREE_INTERIORS_WITCH_HUT, + 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x03b8, 0x0038, 0x0078, 0x0108, 0x00, AREA_MINISH_CAVES, + ROOM_MINISH_CAVES_MINISH_WOODS_NORTH_1, 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0048, 0x0218, 0x0058, 0x0118, 0x00, AREA_MINISH_CAVES, + ROOM_MINISH_CAVES_MINISH_WOODS_SOUTHWEST, 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0068, 0x0218, 0x0138, 0x0118, 0x00, AREA_MINISH_CAVES, + ROOM_MINISH_CAVES_MINISH_WOODS_SOUTHWEST, 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0088, 0x0218, 0x0218, 0x0118, 0x00, AREA_MINISH_CAVES, + ROOM_MINISH_CAVES_MINISH_WOODS_SOUTHWEST, 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_BORDER, 0x00, 0x0000, 0x0000, 0x01d8, 0x0fff, 0x40, AREA_HYRULE_FIELD, + ROOM_HYRULE_FIELD_EASTERN_HILLLS_NORTH, 1, TRANSITION_TYPE_NORMAL, 0x06, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_BORDER, 0x00, 0x0000, 0x0000, 0x01d8, 0x00a0, 0x80, AREA_HYRULE_FIELD, + ROOM_HYRULE_FIELD_EASTERN_HILLLS_SOUTH, 1, TRANSITION_TYPE_NORMAL, 0x06, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_BORDER, 0x00, 0x0000, 0x0000, 0x0fff, 0x03b8, 0x01, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_MAIN, 1, + TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_BORDER, 0x00, 0x0000, 0x0000, 0x0fff, 0x03ac, 0x02, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_MAIN, 1, + TRANSITION_TYPE_INSTANT_MINISH, 0x00, 0x00, 0x00, 0x00, 0x00 }, + TransitionListEnd, +}; +const Transition* const gExitLists_MinishWoods[] = { + [ROOM_MINISH_WOODS_MAIN] = gExitList_MinishWoods_Main, +}; + +const Transition gExitList_LakeHylia_Main[] = { + { WARP_TYPE_AREA, 0, 0x02a0, 0x0378, 0x0078, 0x00a0, 0x02, AREA_HOUSE_INTERIORS_4, + ROOM_HOUSE_INTERIORS_4_MAYOR_LAKE_CABIN, 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0, 0x0120, 0x0038, 0x0078, 0x0078, 0x02, AREA_HOUSE_INTERIORS_2, + ROOM_HOUSE_INTERIORS_2_STOCKWELL_LAKE_HOUSE, 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0, 0x0100, 0x02b8, 0x0078, 0x0078, 0x02, AREA_TREE_INTERIORS, ROOM_TREE_INTERIORS_WAVEBLADE, + 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0, 0x00c8, 0x0198, 0x0078, 0x0078, 0x00, AREA_MINISH_HOUSE_INTERIORS, + ROOM_MINISH_HOUSE_INTERIORS_LAKE_HYLIA_OCARINA, 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0, 0x01e8, 0x01a8, 0x0078, 0x0078, 0x00, AREA_MINISH_HOUSE_INTERIORS, + ROOM_MINISH_HOUSE_INTERIORS_LIBRARI, 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0, 0x02b8, 0x0058, 0x0188, 0x01a8, 0x00, AREA_MINISH_CAVES, ROOM_MINISH_CAVES_LAKE_HYLIA_NORTH, + 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0, 0x0148, 0x0374, 0x0248, 0x01a8, 0x00, AREA_LAKE_WOODS_CAVE, ROOM_LAKE_WOODS_CAVE_MAIN, + 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_BORDER, 0, 0x0000, 0x0000, 0x02c8, 0x0fff, 0xc0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_LON_LON_RANCH, + 1, TRANSITION_TYPE_NORMAL, 0x06, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_BORDER, 0, 0x0000, 0x0000, 0x0fff, 0x0010, 0x10, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, + 1, TRANSITION_TYPE_NORMAL, 0x04, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_BORDER, 0, 0x0000, 0x0000, 0x0fff, 0x0024, 0x20, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x04, 0x00, 0x00, 0x00, 0x00 }, + TransitionListEnd, +}; +const Transition gExitList_LakeHylia_Beanstalk[] = { + { WARP_TYPE_AREA, 0, 0x0208, 0x94, 0x248, 0x88, 0, AREA_HYLIA_DIG_CAVES, ROOM_HYLIA_DIG_CAVES_1, 1, TRANSITION_TYPE_NORMAL, + 0, 0, 0, 0, 0 }, + { WARP_TYPE_AREA, 0, 0x0308, 0x94, 0x308, 0x88, 0, AREA_HYLIA_DIG_CAVES, ROOM_HYLIA_DIG_CAVES_1, 1, TRANSITION_TYPE_NORMAL, + 0, 0, 0, 0, 0 }, + { WARP_TYPE_AREA, 0, 0x0388, 0x64, 0x398, 0x68, 0, AREA_HYLIA_DIG_CAVES, ROOM_HYLIA_DIG_CAVES_1, 1, TRANSITION_TYPE_NORMAL, + 0, 0, 0, 0, 0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_LakeHylia[] = { + [ROOM_LAKE_HYLIA_MAIN] = gExitList_LakeHylia_Main, + [ROOM_LAKE_HYLIA_BEANSTALK] = gExitList_LakeHylia_Beanstalk, +}; + +const Transition gExitList_CastorWilds_Main[] = { + { WARP_TYPE_AREA, 0, 0x0248, 0x0032, 0x0038, 0x0078, 0x00, AREA_CASTOR_CAVES, ROOM_CASTOR_CAVES_NORTH, + 1, TRANSITION_TYPE_NORMAL, 0, 0, 0, 0, 0 }, + { WARP_TYPE_AREA, 0, 0x0288, 0x0032, 0x0128, 0x0078, 0x00, AREA_CASTOR_CAVES, ROOM_CASTOR_CAVES_NORTH, + 1, TRANSITION_TYPE_NORMAL, 0, 0, 0, 0, 0 }, + { WARP_TYPE_AREA, 0, 0x01a8, 0x01a2, 0x0088, 0x0078, 0x00, AREA_CASTOR_CAVES, ROOM_CASTOR_CAVES_DARKNUT, + 1, TRANSITION_TYPE_NORMAL, 0, 0, 0, 0, 0 }, + { WARP_TYPE_AREA, 0, 0x02d8, 0x0382, 0x0078, 0x0098, 0x00, AREA_CASTOR_CAVES, ROOM_CASTOR_CAVES_SOUTH, + 1, TRANSITION_TYPE_NORMAL, 0, 0, 0, 0, 0 }, + { WARP_TYPE_AREA, 0, 0x03c8, 0x0038, 0x0078, 0x0078, 0x00, AREA_CASTOR_CAVES, ROOM_CASTOR_CAVES_HEART_PIECE, + 1, TRANSITION_TYPE_NORMAL, 0, 0, 0, 0, 0 }, + { WARP_TYPE_AREA, 0, 0x0038, 0x02d4, 0x0078, 0x0088, 0x00, AREA_DOJOS, ROOM_DOJOS_SWIFTBLADE_I, 1, TRANSITION_TYPE_NORMAL, + 0, 0, 0, 0, 0 }, + { WARP_TYPE_AREA, 0, 0x03b8, 0x02f8, 0x0078, 0x01f8, 0x00, AREA_MINISH_CAVES, ROOM_MINISH_CAVES_SOUTHEAST_WATER_1, + 1, TRANSITION_TYPE_NORMAL, 0, 0, 0, 0, 0 }, + { WARP_TYPE_BORDER, 0, 0x0000, 0x0000, 0x0008, 0x0fff, 0x08, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_NORTH, + 1, TRANSITION_TYPE_NORMAL, 2, 0, 0, 0, 0 }, + { WARP_TYPE_BORDER, 0, 0x0000, 0x0000, 0x0fff, 0x0010, 0x10, AREA_RUINS, ROOM_RUINS_ENTRANCE, 1, TRANSITION_TYPE_NORMAL, 4, 0, + 0, 0, 0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_CastorWilds[] = { + [ROOM_CASTOR_WILDS_MAIN] = gExitList_CastorWilds_Main, +}; + +const Transition gExitList_Ruins_Entrance[] = { + { WARP_TYPE_BORDER, 0, 0x00, 0x00, 0x0fff, 0x3b8, 0x01, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0, 0, 0, 0, 0 }, + { WARP_TYPE_AREA, 0, 0xc8, 0x38, 0x0078, 0x078, 0x00, AREA_CASTOR_CAVES, ROOM_CASTOR_CAVES_WIND_RUINS, + 1, TRANSITION_TYPE_NORMAL, 0, 0, 0, 0, 0 }, + TransitionListEnd, +}; +const Transition gExitList_Ruins_Beanstalk[] = { + TransitionListEnd, +}; +const Transition gExitList_Ruins_LadderToTektites[] = { + { WARP_TYPE_AREA, 0, 0x38, 0x08, 0x148, 0xb8, 0, AREA_MINISH_CAVES, ROOM_MINISH_CAVES_RUINS, 1, TRANSITION_TYPE_NORMAL, 0, + 0, 0, 0, 0 }, + TransitionListEnd, +}; +const Transition gExitList_Ruins_FortressEntrance[] = { + { WARP_TYPE_BORDER, 0, 0, 0, 0x1d8, 0xb0, 3, AREA_OUTER_FORTRESS_OF_WINDS, ROOM_OUTER_FORTRESS_OF_WINDS_ENTRANCE_HALL, + 1, TRANSITION_TYPE_NORMAL, 0, 0, 0, 0, 0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_Ruins[] = { + [ROOM_RUINS_ENTRANCE] = gExitList_Ruins_Entrance, + [ROOM_RUINS_BEANSTALK] = gExitList_Ruins_Beanstalk, + [ROOM_RUINS_TEKTITES] = gExitList_NoExitList, + [ROOM_RUINS_LADDER_TO_TEKTITES] = gExitList_Ruins_LadderToTektites, + [ROOM_RUINS_FORTRESS_ENTRANCE] = gExitList_Ruins_FortressEntrance, + [ROOM_RUINS_BELOW_FORTRESS_ENTRANCE] = gExitList_NoExitList, +}; + +const Transition gExitList_HyruleTown_0[] = { + { WARP_TYPE_AREA, 0x00, 0x02c8, 0x0138, 0x0068, 0x0098, 0x00, AREA_HOUSE_INTERIORS_1, ROOM_HOUSE_INTERIORS_1_MAYOR, + 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0308, 0x0120, 0x00e8, 0x0070, 0x01, AREA_HOUSE_INTERIORS_1, ROOM_HOUSE_INTERIORS_1_MAYOR, + 1, TRANSITION_TYPE_NORMAL, 0x06, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0048, 0x00a8, 0x0078, 0x0090, 0x00, AREA_HOUSE_INTERIORS_1, + ROOM_HOUSE_INTERIORS_1_POST_OFFICE, 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0138, 0x0048, 0x0078, 0x0088, 0x00, AREA_HOUSE_INTERIORS_1, + ROOM_HOUSE_INTERIORS_1_LIBRARY_2F, 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0168, 0x00a8, 0x00e8, 0x00d8, 0x00, AREA_HOUSE_INTERIORS_1, + ROOM_HOUSE_INTERIORS_1_LIBRARY_1F, 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0388, 0x0258, 0x0068, 0x0078, 0x00, AREA_HOUSE_INTERIORS_1, ROOM_HOUSE_INTERIORS_1_INN_1F, + 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0368, 0x01b8, 0x0068, 0x0078, 0x00, AREA_HOUSE_INTERIORS_1, + ROOM_HOUSE_INTERIORS_1_INN_WEST_2F, 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x03a8, 0x0218, 0x0048, 0x01a8, 0x00, AREA_HOUSE_INTERIORS_1, + ROOM_HOUSE_INTERIORS_1_INN_EAST_2F, 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x02c8, 0x0098, 0x0078, 0x00c8, 0x00, AREA_HOUSE_INTERIORS_1, + ROOM_HOUSE_INTERIORS_1_SCHOOL_WEST, 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0328, 0x0068, 0x00d8, 0x0088, 0x00, AREA_HOUSE_INTERIORS_1, + ROOM_HOUSE_INTERIORS_1_SCHOOL_EAST, 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0258, 0x02e8, 0x0078, 0x00a8, 0x00, AREA_HOUSE_INTERIORS_3, + ROOM_HOUSE_INTERIORS_3_STOCKWELL_SHOP, 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0198, 0x02e8, 0x0078, 0x00a8, 0x00, AREA_HOUSE_INTERIORS_3, ROOM_HOUSE_INTERIORS_3_CAFE, + 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0178, 0x0210, 0x00c8, 0x0060, 0x01, AREA_HOUSE_INTERIORS_3, + ROOM_HOUSE_INTERIORS_3_REM_SHOE_SHOP, 1, TRANSITION_TYPE_NORMAL, 0x06, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0278, 0x01f0, 0x0028, 0x0090, 0x01, AREA_HOUSE_INTERIORS_3, ROOM_HOUSE_INTERIORS_3_BAKERY, + 1, TRANSITION_TYPE_NORMAL, 0x02, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0178, 0x0250, 0x00c8, 0x0070, 0x01, AREA_HOUSE_INTERIORS_3, ROOM_HOUSE_INTERIORS_3_SIMON, + 1, TRANSITION_TYPE_NORMAL, 0x06, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0178, 0x0290, 0x00c8, 0x0060, 0x01, AREA_HOUSE_INTERIORS_3, + ROOM_HOUSE_INTERIORS_3_FIGURINE_HOUSE, 1, TRANSITION_TYPE_NORMAL, 0x06, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0138, 0x0290, 0x0028, 0x0060, 0x01, AREA_HOUSE_INTERIORS_3, + ROOM_HOUSE_INTERIORS_3_FIGURINE_HOUSE, 1, TRANSITION_TYPE_NORMAL, 0x02, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0298, 0x0258, 0x0078, 0x0088, 0x00, AREA_HOUSE_INTERIORS_3, + ROOM_HOUSE_INTERIORS_3_BORLOV_ENTRANCE, 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0090, 0x02c8, 0x0078, 0x0098, 0x02, AREA_HOUSE_INTERIORS_4, ROOM_HOUSE_INTERIORS_4_CARPENTER, + 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0098, 0x0168, 0x0078, 0x0078, 0x00, AREA_HOUSE_INTERIORS_2, ROOM_HOUSE_INTERIORS_2_STRANGER, + 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0038, 0x0248, 0x0078, 0x0098, 0x00, AREA_HOUSE_INTERIORS_2, ROOM_HOUSE_INTERIORS_2_DR_LEFT, + 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x02e8, 0x02f0, 0x0078, 0x0078, 0x00, AREA_HOUSE_INTERIORS_2, ROOM_HOUSE_INTERIORS_2_ROMIO, + 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0348, 0x02f8, 0x0078, 0x0098, 0x00, AREA_HOUSE_INTERIORS_2, ROOM_HOUSE_INTERIORS_2_JULIETTA, + 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x03b8, 0x0358, 0x0078, 0x0078, 0x00, AREA_HOUSE_INTERIORS_2, ROOM_HOUSE_INTERIORS_2_CUCCO, + 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0138, 0x0388, 0x0078, 0x0098, 0x00, AREA_HOUSE_INTERIORS_4, + ROOM_HOUSE_INTERIORS_4_SWIFTBLADE, 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0038, 0x01a8, 0x0078, 0x0078, 0x00, AREA_MINISH_HOUSE_INTERIORS, + ROOM_MINISH_HOUSE_INTERIORS_HYRULE_TOWN, 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0050, 0x0378, 0x0078, 0x0078, 0x02, AREA_TREE_INTERIORS, + ROOM_TREE_INTERIORS_STAIRS_TO_CARLOV, 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x00f0, 0x0188, 0x0078, 0x0078, 0x02, AREA_CAVES, ROOM_CAVES_HYRULE_TOWN_WATERFALL, + 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0040, 0x01b8, 0x0078, 0x0098, 0x02, AREA_HOUSE_INTERIORS_2, + ROOM_HOUSE_INTERIORS_2_WEST_ORACLE, 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x02b8, 0x0360, 0x0078, 0x0078, 0x00, AREA_HOUSE_INTERIORS_2, + ROOM_HOUSE_INTERIORS_2_EAST_ORACLE, 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_AREA, 0x00, 0x0338, 0x0134, 0x0288, 0x0118, 0x00, AREA_HYRULE_TOWN_UNDERGROUND, + ROOM_HYRULE_TOWN_UNDERGROUND_0, 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_BORDER, 0x00, 0x0000, 0x0000, 0x01f8, 0x0318, 0x03, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, + 1, TRANSITION_TYPE_NORMAL, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_BORDER, 0x00, 0x0000, 0x0000, 0x01d8, 0x0230, 0x40, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_TRILBY_HIGHLANDS, + 1, TRANSITION_TYPE_NORMAL, 0x06, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_BORDER, 0x00, 0x0000, 0x0000, 0x0008, 0x0230, 0x04, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_LON_LON_RANCH, + 1, TRANSITION_TYPE_NORMAL, 0x02, 0x00, 0x00, 0x00, 0x00 }, + { WARP_TYPE_BORDER, 0x00, 0x0000, 0x0000, 0x01f8, 0x0010, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_SOUTH_HYRULE_FIELD, + 1, TRANSITION_TYPE_NORMAL, 0x04, 0x00, 0x00, 0x00, 0x00 }, + TransitionListEnd, +}; +const Transition* const gExitLists_HyruleTown[] = { + [ROOM_HYRULE_TOWN_MAIN] = gExitList_HyruleTown_0, +}; + +const Transition gExitList_HyruleTown_1[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x318, 0x3, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_FestivalTown[] = { + [ROOM_FESTIVAL_TOWN_MAIN] = gExitList_HyruleTown_1, +}; + +const Transition gExitList_MtCrenel_MountainTop[] = { + { WARP_TYPE_AREA, 0x0, 0x328, 0x34, 0x1a8, 0x28, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_BLOCK_PUSHING, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x18, 0x30, AREA_MT_CRENEL, ROOM_MT_CRENEL_WALL_CLIMB, 1, TRANSITION_TYPE_NORMAL, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MtCrenel_WallClimb[] = { + { WARP_TYPE_AREA, 0x0, 0xa8, 0x58, 0x78, 0x78, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_HERMIT, 1, + TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x148, 0x1e8, 0x78, 0xf8, 0x0, AREA_GREAT_FAIRIES, ROOM_GREAT_FAIRIES_CRENEL, 1, + TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0xd8, 0x3, AREA_MT_CRENEL, ROOM_MT_CRENEL_TOP, 1, TRANSITION_TYPE_NORMAL, 0x0, + 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MtCrenel_CaveOfFlamesEntrance[] = { + { WARP_TYPE_AREA, 0x0, 0x128, 0x18, 0x58, 0x1b8, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_BLOCK_PUSHING, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x208, 0x18, 0x298, 0x1b8, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_BLOCK_PUSHING, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x1d8, 0xb8, 0xb8, 0x88, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_PILLAR_CAVE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x238, 0xb8, 0x48, 0x1c8, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_BRIDGE_SWITCH, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x188, 0xf8, 0xb8, 0x98, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_EXIT_TO_MINES, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x208, 0x148, 0x78, 0xf0, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_TO_GRAYBLADE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x1e8, 0x1d8, 0x78, 0x78, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_GRIP_RING, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x68, 0x72, 0x88, 0xa8, 0x0, AREA_CAVE_OF_FLAMES, ROOM_CAVE_OF_FLAMES_ENTRANCE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MtCrenel_GustJarShortcut[] = { + { WARP_TYPE_AREA, 0x0, 0xa8, 0x48, 0x78, 0x78, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_FAIRY_FOUNTAIN, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x2f8, 0x28, 0x38, 0x98, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_SPINY_CHU_PUZZLE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x348, 0x58, 0xb8, 0x88, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_CHUCHU_POT_CHEST, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x38, 0x108, 0x78, 0x118, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_WATER_HEART_PIECE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MtCrenel_Entrance[] = { + { WARP_TYPE_AREA, 0x0, 0x298, 0x28, 0x78, 0x78, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_RUPEE_FAIRY_FOUINTAIN, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x198, 0xd8, 0x1f8, 0x78, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_HELMASAUR_HALLWAY, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x138, 0x138, 0xb8, 0x138, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_MUSHROOM_KEESE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x2d8, 0x188, 0x78, 0x88, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_LADDER_TO_SPRING_WATER, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xb8, 0x198, 0x78, 0x78, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_BOMB_BUSINESS_SCRUB, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x3b8, 0x168, 0x78, 0x78, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_HINT_SCRUB, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x1c8, 0x18, 0x98, 0x1a8, 0x0, AREA_MINISH_CAVES, ROOM_MINISH_CAVES_BEAN_PESTO, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x2d8, 0x154, 0x78, 0x38, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_LADDER_TO_SPRING_WATER, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x8, 0xfff, 0x8, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_TRILBY_HIGHLANDS, + 1, TRANSITION_TYPE_NORMAL, 0x2, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_MtCrenel[] = { + [ROOM_MT_CRENEL_TOP] = gExitList_MtCrenel_MountainTop, + [ROOM_MT_CRENEL_WALL_CLIMB] = gExitList_MtCrenel_WallClimb, + [ROOM_MT_CRENEL_CAVERN_OF_FLAMES_ENTRANCE] = gExitList_MtCrenel_CaveOfFlamesEntrance, + [ROOM_MT_CRENEL_CENTER] = gExitList_MtCrenel_GustJarShortcut, + [ROOM_MT_CRENEL_ENTRANCE] = gExitList_MtCrenel_Entrance, +}; + +const Transition gExitList_HyruleField_WesternWoodSouth[] = { + { WARP_TYPE_AREA, 0x0, 0xb8, 0x28, 0x78, 0x78, 0x0, AREA_MINISH_HOUSE_INTERIORS, + ROOM_MINISH_HOUSE_INTERIORS_HYRULE_FIELD_SOUTHWEST, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HyruleField_SouthHyruleField[] = { + { WARP_TYPE_AREA, 0x0, 0x290, 0x188, 0x78, 0x78, 0x2, AREA_HOUSE_INTERIORS_2, + ROOM_HOUSE_INTERIORS_2_LINKS_HOUSE_ENTRANCE, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x3a0, 0x228, 0x78, 0x78, 0x2, AREA_TREE_INTERIORS, + ROOM_TREE_INTERIORS_SOUTH_HYRULE_FIELD_HEART_PIECE, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x118, 0xa8, 0x78, 0x78, 0x0, AREA_CAVES, ROOM_CAVES_SOUTH_HYRULE_FIELD_FAIRY_FOUNTAIN, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x58, 0x118, 0x78, 0x78, 0x0, AREA_CAVES, ROOM_CAVES_SOUTH_HYRULE_FIELD_RUPEE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x178, 0xd8, 0x78, 0xb8, 0x0, AREA_MINISH_CAVES, ROOM_MINISH_CAVES_OUTSIDE_LINKS_HOUSE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x48, 0x1c8, 0x78, 0x78, 0x0, AREA_MINISH_HOUSE_INTERIORS, + ROOM_MINISH_HOUSE_INTERIORS_SOUTH_HYRULE_FIELD, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1f8, 0x3b8, 0x3, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HyruleField_EasternHillsSouth[] = { + { WARP_TYPE_AREA, 0x0, 0x38, 0x28, 0x78, 0x78, 0x0, AREA_MINISH_HOUSE_INTERIORS, + ROOM_MINISH_HOUSE_INTERIORS_HYRULE_FIELD_EXIT, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x8, 0x3c8, 0x8, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x2, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HyruleField_EasternHillsCenter[] = { + { WARP_TYPE_AREA, 0x0, 0xa8, 0x98, 0x78, 0x78, 0x0, AREA_CAVES, ROOM_CAVES_HILLS_KEESE_CHEST, 1, TRANSITION_TYPE_NORMAL, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HyruleField_EasternHillsNorth[] = { + { WARP_TYPE_AREA, 0x0, 0x40, 0x48, 0x78, 0x88, 0x2, AREA_HOUSE_INTERIORS_4, ROOM_HOUSE_INTERIORS_4_FARM_HOUSE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x8, 0xfff, 0xc, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x2, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HyruleField_LonLonRanch[] = { + { WARP_TYPE_AREA, 0x0, 0x158, 0x278, 0x68, 0x78, 0x0, AREA_HOUSE_INTERIORS_4, ROOM_HOUSE_INTERIORS_4_RANCH_HOUSE_WEST, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x188, 0x278, 0x78, 0x78, 0x0, AREA_HOUSE_INTERIORS_4, ROOM_HOUSE_INTERIORS_4_RANCH_HOUSE_EAST, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xe8, 0x1b4, 0xa8, 0xd8, 0x0, AREA_CAVES, ROOM_CAVES_LON_LON_RANCH, 1, TRANSITION_TYPE_NORMAL, 0x0, + 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x1f8, 0x208, 0x78, 0x78, 0x0, AREA_CAVES, ROOM_CAVES_LON_LON_RANCH_WALLET, 1, + TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x88, 0x354, 0x78, 0x78, 0x0, AREA_GORON_CAVE, ROOM_GORON_CAVE_STAIRS, 1, TRANSITION_TYPE_NORMAL, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xb8, 0x154, 0x38, 0x28, 0x0, AREA_CAVES, ROOM_CAVES_LON_LON_RANCH, 1, TRANSITION_TYPE_NORMAL, 0x0, + 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x3e8, 0x1, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 1, TRANSITION_TYPE_NORMAL, 0x0, + 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1c8, 0x3e8, 0x2, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 1, TRANSITION_TYPE_NORMAL, 0x0, + 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x8, 0xfff, 0xc, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_MAIN, 1, TRANSITION_TYPE_NORMAL, 0x2, + 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x3e8, 0xf0, 0x80, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x6, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HyruleField_NorthHyruleField[] = { + { WARP_TYPE_AREA, 0x0, 0x1f8, 0x38, 0x1f8, 0x208, 0x3, AREA_CASTLE_GARDEN, ROOM_CASTLE_GARDEN_MAIN, 1, + TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x1b0, 0x128, 0x78, 0x78, 0x2, AREA_TREE_INTERIORS, ROOM_TREE_INTERIORS_BOOMERANG_NORTHWEST, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x240, 0x128, 0x78, 0x78, 0x2, AREA_TREE_INTERIORS, ROOM_TREE_INTERIORS_BOOMERANG_NORTHEAST, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x1b0, 0x188, 0x78, 0x78, 0x2, AREA_TREE_INTERIORS, ROOM_TREE_INTERIORS_BOOMERANG_SOUTHWEST, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x240, 0x188, 0x78, 0x78, 0x2, AREA_TREE_INTERIORS, ROOM_TREE_INTERIORS_BOOMERANG_SOUTHEAST, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x2f0, 0x138, 0x78, 0x78, 0x2, AREA_TREE_INTERIORS, + ROOM_TREE_INTERIORS_NORTH_HYRULE_FIELD_FAIRY_FOUNTAIN, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x1f8, 0x154, 0xa8, 0xd8, 0x0, AREA_CAVES, ROOM_CAVES_BOOMERANG, 1, TRANSITION_TYPE_NORMAL, 0x4, + 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x108, 0x138, 0x108, 0xd8, 0x0, AREA_CAVES, ROOM_CAVES_TO_GRAVEYARD, 1, TRANSITION_TYPE_NORMAL, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x138, 0x1e8, 0x78, 0xc8, 0x0, AREA_CAVES, ROOM_CAVES_HEART_PIECE_HALLWAY, 1, + TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x88, 0xf4, 0x38, 0x58, 0x0, AREA_CAVES, ROOM_CAVES_TO_GRAVEYARD, 1, TRANSITION_TYPE_NORMAL, 0x0, + 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x118, 0xf4, 0x118, 0x58, 0x0, AREA_CAVES, ROOM_CAVES_TO_GRAVEYARD, 1, TRANSITION_TYPE_NORMAL, 0x0, + 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x208, 0x3, AREA_CASTLE_GARDEN, ROOM_CASTLE_GARDEN_MAIN, 1, + TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1f8, 0x18, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x8, 0xfff, 0x4, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 1, TRANSITION_TYPE_NORMAL, 0x2, + 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1d8, 0x260, 0x40, AREA_ROYAL_VALLEY, ROOM_ROYAL_VALLEY_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x6, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HyruleField_TrilbyHighlands[] = { + { WARP_TYPE_AREA, 0x0, 0x40, 0x388, 0x78, 0x78, 0x2, AREA_TREE_INTERIORS, ROOM_TREE_INTERIORS_PERCYS_TREEHOUSE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x88, 0x222, 0x78, 0x78, 0x0, AREA_CAVES, ROOM_CAVES_TRILBY_KEESE_CHEST, 1, TRANSITION_TYPE_NORMAL, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x38, 0x2a8, 0x78, 0x78, 0x0, AREA_CAVES, ROOM_CAVES_TRILBY_RUPEE, 1, TRANSITION_TYPE_NORMAL, 0x0, + 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x198, 0x2b2, 0x78, 0x78, 0x0, AREA_CAVES, ROOM_CAVES_TRILBY_FAIRY_FOUNTAIN, 1, + TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x88, 0x94, 0x88, 0x68, 0x0, AREA_DIG_CAVES, ROOM_DIG_CAVES_TRILBY_HIGHLANDS, 1, + TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x98, 0x284, 0x38, 0x38, 0x0, AREA_CAVES, ROOM_CAVES_TRILBY_HIGHLANDS, 1, TRANSITION_TYPE_NORMAL, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x118, 0x284, 0x128, 0x38, 0x0, AREA_CAVES, ROOM_CAVES_TRILBY_HIGHLANDS, 1, TRANSITION_TYPE_NORMAL, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x3e8, 0x1, AREA_ROYAL_VALLEY, ROOM_ROYAL_VALLEY_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x8, 0xf0, 0x8, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, 0x2, + 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x3e8, 0xfff, 0x40, AREA_MT_CRENEL, ROOM_MT_CRENEL_ENTRANCE, 1, TRANSITION_TYPE_NORMAL, + 0x6, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HyruleField_WesternWoodsNorth[] = { + { WARP_TYPE_AREA, 0x0, 0xa0, 0x1e8, 0x78, 0x78, 0x2, AREA_TREE_INTERIORS, + ROOM_TREE_INTERIORS_WESTERN_WOODS_HEART_PIECE, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x3e8, 0xfff, 0x40, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x6, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HyruleField_WesternWoodsCenter[] = { + { WARP_TYPE_AREA, 0x0, 0x90, 0x48, 0x78, 0x88, 0x2, AREA_HOUSE_INTERIORS_2, ROOM_HOUSE_INTERIORS_2_PERCY, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_HyruleField[] = { + [ROOM_HYRULE_FIELD_WESTERN_WOODS_SOUTH] = gExitList_HyruleField_WesternWoodSouth, + [ROOM_HYRULE_FIELD_SOUTH_HYRULE_FIELD] = gExitList_HyruleField_SouthHyruleField, + [ROOM_HYRULE_FIELD_EASTERN_HILLLS_SOUTH] = gExitList_HyruleField_EasternHillsSouth, + [ROOM_HYRULE_FIELD_EASTERN_HILLLS_CENTER] = gExitList_HyruleField_EasternHillsCenter, + [ROOM_HYRULE_FIELD_EASTERN_HILLLS_NORTH] = gExitList_HyruleField_EasternHillsNorth, + [ROOM_HYRULE_FIELD_LON_LON_RANCH] = gExitList_HyruleField_LonLonRanch, + [ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD] = gExitList_HyruleField_NorthHyruleField, + [ROOM_HYRULE_FIELD_TRILBY_HIGHLANDS] = gExitList_HyruleField_TrilbyHighlands, + [ROOM_HYRULE_FIELD_WESTERN_WOODS_NORTH] = gExitList_HyruleField_WesternWoodsNorth, + [ROOM_HYRULE_FIELD_WESTERN_WOODS_CENTER] = gExitList_HyruleField_WesternWoodsCenter, +}; + +// TODO this is one table +const Transition gExitList_CastleGarden_Main[] = { + { WARP_TYPE_AREA, 0x0, 0x1f8, 0x28, 0xd8, 0x208, 0x2, AREA_HYRULE_CASTLE, ROOM_HYRULE_CASTLE_0, 1, TRANSITION_TYPE_NORMAL, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x308, 0x48, 0x78, 0x78, 0x0, AREA_GARDEN_FOUNTAINS, ROOM_GARDEN_FOUNTAINS_EAST, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xe8, 0x48, 0x78, 0x78, 0x0, AREA_GARDEN_FOUNTAINS, ROOM_GARDEN_FOUNTAINS_WEST, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x68, 0x74, 0x68, 0x1a8, 0x0, AREA_HYRULE_CASTLE_CELLAR, ROOM_HYRULE_CASTLE_CELLAR_0, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x3a8, 0x184, 0x78, 0x68, 0x0, AREA_DOJOS, ROOM_DOJOS_TO_GRIMBLADE, 1, TRANSITION_TYPE_NORMAL, 0x0, + 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1f8, 0x48, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gUnk_08134FBC[] = { + { WARP_TYPE_AREA, 0x0, 0x1f8, 0x28, 0x198, 0x1f0, 0x2, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_1F_ENTRANCE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x308, 0x48, 0x78, 0x78, 0x0, AREA_GARDEN_FOUNTAINS, ROOM_GARDEN_FOUNTAINS_EAST, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xe8, 0x48, 0x78, 0x78, 0x0, AREA_GARDEN_FOUNTAINS, ROOM_GARDEN_FOUNTAINS_WEST, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x68, 0x74, 0x68, 0x1a8, 0x0, AREA_HYRULE_CASTLE_CELLAR, ROOM_HYRULE_CASTLE_CELLAR_0, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x3a8, 0x184, 0x78, 0x68, 0x0, AREA_DOJOS, ROOM_DOJOS_TO_GRIMBLADE, 1, TRANSITION_TYPE_NORMAL, 0x0, + 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1f8, 0x48, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gUnk_08135048[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x8, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_CastleGarden[] = { + [ROOM_CASTLE_GARDEN_MAIN] = gExitList_CastleGarden_Main, +}; + +const Transition gExitList_CloudTops_House[] = { + { WARP_TYPE_AREA, 0x0, 0x1e8, 0x158, 0x78, 0x138, 0x0, AREA_WIND_TRIBE_TOWER, ROOM_WIND_TRIBE_TOWER_ENTRANCE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_CloudTops[] = { + [ROOM_CLOUD_TOPS_CLOUD_TOPS] = gExitList_CloudTops_House, +}; + +const Transition gExitList_RoyalValley_Main[] = { + { WARP_TYPE_AREA, 0x0, 0xf0, 0x28, 0x88, 0x78, 0x2, AREA_ROYAL_CRYPT, ROOM_ROYAL_CRYPT_ENTRANCE, 1, + TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x1a0, 0x198, 0x78, 0x78, 0x2, AREA_HOUSE_INTERIORS_2, ROOM_HOUSE_INTERIORS_2_DAMPE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x198, 0x2a8, 0x78, 0xf8, 0x0, AREA_GREAT_FAIRIES, ROOM_GREAT_FAIRIES_GRAVEYARD, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x58, 0x84, 0x78, 0x78, 0x0, AREA_ROYAL_VALLEY_GRAVES, ROOM_ROYAL_VALLEY_GRAVES_HEART_PIECE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x188, 0x84, 0x78, 0x118, 0x0, AREA_ROYAL_VALLEY_GRAVES, ROOM_ROYAL_VALLEY_GRAVES_GINA, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x10, 0x10, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_TRILBY_HIGHLANDS, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x8, 0x50, 0x8, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, + 1, TRANSITION_TYPE_NORMAL, 0x2, 0x0, 0x0, 0x0, 0x0 }, +#ifndef EU + { WARP_TYPE_AREA, 0x0, 0x78, 0x28c, 0x78, 0x18, 0x0, AREA_ROYAL_VALLEY, ROOM_ROYAL_VALLEY_FOREST_MAZE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, +#else + { WARP_TYPE_AREA, 0x0, 0x78, 0x288, 0x78, 0x18, 0x0, AREA_ROYAL_VALLEY, ROOM_ROYAL_VALLEY_FOREST_MAZE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, +#endif + { WARP_TYPE_AREA, 0x0, 0x78, 0x328, 0x78, 0x98, 0x0, AREA_ROYAL_VALLEY, ROOM_ROYAL_VALLEY_FOREST_MAZE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_RoyalValley_ForestMaze[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x78, 0x338, 0x30, AREA_ROYAL_VALLEY, ROOM_ROYAL_VALLEY_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gUnk_08135190[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x78, 0x278, 0x3, AREA_ROYAL_VALLEY, ROOM_ROYAL_VALLEY_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x78, 0x338, 0x30, AREA_ROYAL_VALLEY, ROOM_ROYAL_VALLEY_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_RoyalValley[] = { + [ROOM_ROYAL_VALLEY_MAIN] = gExitList_RoyalValley_Main, + [ROOM_ROYAL_VALLEY_FOREST_MAZE] = gExitList_RoyalValley_ForestMaze, +}; + +const Transition gExitList_VeilFalls_Main[] = { + { WARP_TYPE_AREA, 0x0, 0xa8, 0x22, 0x38, 0x78, 0x0, AREA_VEIL_FALLS_CAVES, ROOM_VEIL_FALLS_CAVES_HALLWAY_2F, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x158, 0x22, 0x118, 0x78, 0x0, AREA_VEIL_FALLS_CAVES, ROOM_VEIL_FALLS_CAVES_HALLWAY_2F, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x118, 0x42, 0xb8, 0x78, 0x0, AREA_VEIL_FALLS_CAVES, ROOM_VEIL_FALLS_CAVES_HALLWAY_1F, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x38, 0x1e2, 0x38, 0x78, 0x0, AREA_VEIL_FALLS_CAVES, ROOM_VEIL_FALLS_CAVES_ENTRANCE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xd8, 0x1c2, 0x98, 0x78, 0x0, AREA_VEIL_FALLS_CAVES, ROOM_VEIL_FALLS_CAVES_EXIT, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xd8, 0x142, 0x98, 0x118, 0x0, AREA_VEIL_FALLS_CAVES, + ROOM_VEIL_FALLS_CAVES_HALLWAY_BLOCK_PUZZLE, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xa8, 0xc2, 0xb8, 0x118, 0x0, AREA_VEIL_FALLS_CAVES, ROOM_VEIL_FALLS_CAVES_HALLWAY_RUPEE_PATH, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x38, 0x28, 0x78, 0x78, 0x0, AREA_VEIL_FALLS_CAVES, ROOM_VEIL_FALLS_CAVES_HALLWAY_HEART_PIECE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xc8, 0x74, 0x38, 0x108, 0x0, AREA_VEIL_FALLS_CAVES, ROOM_VEIL_FALLS_CAVES_HALLWAY_1F, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x10, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_LON_LON_RANCH, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0xb8, 0x3, AREA_VEIL_FALLS_TOP, ROOM_VEIL_FALLS_TOP_0, 1, TRANSITION_TYPE_NORMAL, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x3e8, 0xfff, 0xc0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, + 1, TRANSITION_TYPE_NORMAL, 0x6, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_VeilFalls[] = { + [ROOM_VEIL_FALLS_MAIN] = gExitList_VeilFalls_Main, +}; + +const Transition gExitList_Beanstalks_MountCrenel[] = { + { WARP_TYPE_AREA, 0x0, 0x58, 0x88, 0x78, 0x18, 0x2, AREA_BEANSTALKS, ROOM_BEANSTALKS_CRENEL_CLIMB, 1, + TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Beanstalks_LakeHylia[] = { + { WARP_TYPE_AREA, 0x0, 0x58, 0x88, 0x78, 0x18, 0x2, AREA_BEANSTALKS, ROOM_BEANSTALKS_LAKE_HYLIA_CLIMB, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Beanstalks_Ruins[] = { + { WARP_TYPE_AREA, 0x0, 0x58, 0x88, 0x78, 0x18, 0x2, AREA_BEANSTALKS, ROOM_BEANSTALKS_RUINS_CLIMB, 1, + TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Beanstalks_EasternHills[] = { + { WARP_TYPE_AREA, 0x0, 0x58, 0x88, 0x78, 0x18, 0x2, AREA_BEANSTALKS, ROOM_BEANSTALKS_EASTERN_HILLS_CLIMB, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Beanstalks_WesternWoods[] = { + { WARP_TYPE_AREA, 0x0, 0x58, 0x88, 0x78, 0x18, 0x2, AREA_BEANSTALKS, ROOM_BEANSTALKS_WESTERN_WOODS_CLIMB, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Beanstalks_MountCrenelClimb[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x58, 0x68, 0x3, AREA_BEANSTALKS, ROOM_BEANSTALKS_CRENEL, 1, TRANSITION_TYPE_NORMAL, 0x0, + 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x98, 0x18, 0x30, AREA_MT_CRENEL, ROOM_MT_CRENEL_TOP, 1, TRANSITION_TYPE_NORMAL, 0x0, + 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Beanstalks_LakeHyliaClimb[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x58, 0x68, 0x3, AREA_BEANSTALKS, ROOM_BEANSTALKS_LAKE_HYLIA, 1, TRANSITION_TYPE_NORMAL, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x228, 0x18, 0x30, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_BEANSTALK, 1, TRANSITION_TYPE_NORMAL, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Beanstalks_RuinsClimb[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x58, 0x68, 0x3, AREA_BEANSTALKS, ROOM_BEANSTALKS_RUINS, 1, TRANSITION_TYPE_NORMAL, 0x0, + 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x48, 0x18, 0x30, AREA_RUINS, ROOM_RUINS_BEANSTALK, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, + 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Beanstalks_EasternHillsClimb[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x58, 0x68, 0x3, AREA_BEANSTALKS, ROOM_BEANSTALKS_EASTERN_HILLS, 1, + TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x48, 0x18, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_EASTERN_HILLLS_CENTER, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Beanstalks_WesternWoodsClimb[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x58, 0x68, 0x3, AREA_BEANSTALKS, ROOM_BEANSTALKS_WESTERN_WOODS, 1, + TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x38, 0x18, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_SOUTH, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_Beanstalks[] = { + [ROOM_BEANSTALKS_CRENEL] = gExitList_Beanstalks_MountCrenel, + [ROOM_BEANSTALKS_LAKE_HYLIA] = gExitList_Beanstalks_LakeHylia, + [ROOM_BEANSTALKS_RUINS] = gExitList_Beanstalks_Ruins, + [ROOM_BEANSTALKS_EASTERN_HILLS] = gExitList_Beanstalks_EasternHills, + [ROOM_BEANSTALKS_WESTERN_WOODS] = gExitList_Beanstalks_WesternWoods, + [ROOM_BEANSTALKS_5] = gExitList_NoExitList, + [ROOM_BEANSTALKS_6] = gExitList_NoExitList, + [ROOM_BEANSTALKS_7] = gExitList_NoExitList, + [ROOM_BEANSTALKS_8] = gExitList_NoExitList, + [ROOM_BEANSTALKS_9] = gExitList_NoExitList, + [ROOM_BEANSTALKS_a] = gExitList_NoExitList, + [ROOM_BEANSTALKS_b] = gExitList_NoExitList, + [ROOM_BEANSTALKS_c] = gExitList_NoExitList, + [ROOM_BEANSTALKS_d] = gExitList_NoExitList, + [ROOM_BEANSTALKS_e] = gExitList_NoExitList, + [ROOM_BEANSTALKS_f] = gExitList_NoExitList, + [ROOM_BEANSTALKS_CRENEL_CLIMB] = gExitList_Beanstalks_MountCrenelClimb, + [ROOM_BEANSTALKS_LAKE_HYLIA_CLIMB] = gExitList_Beanstalks_LakeHyliaClimb, + [ROOM_BEANSTALKS_RUINS_CLIMB] = gExitList_Beanstalks_RuinsClimb, + [ROOM_BEANSTALKS_EASTERN_HILLS_CLIMB] = gExitList_Beanstalks_EasternHillsClimb, + [ROOM_BEANSTALKS_WESTERN_WOODS_CLIMB] = gExitList_Beanstalks_WesternWoodsClimb, +}; + +const Transition gExitList_LakeWoodsCave_Main[] = { + { WARP_TYPE_AREA, 0x0, 0x248, 0x188, 0x148, 0x358, 0x0, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_LakeWoodsCave[] = { + [ROOM_LAKE_WOODS_CAVE_MAIN] = gExitList_LakeWoodsCave_Main, +}; + +const Transition gExitList_HyruleDigCaves_Main[] = { + { WARP_TYPE_AREA, 0x0, 0x188, 0x218, 0x48, 0x118, 0x0, AREA_HYRULE_TOWN_UNDERGROUND, ROOM_HYRULE_TOWN_UNDERGROUND_0, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_HyruleDigCaves[] = { + [ROOM_HYRULE_DIG_CAVES_TOWN] = gExitList_HyruleDigCaves_Main, +}; + +const Transition gExitList_MinishVillage_Main[] = { + { WARP_TYPE_AREA, 0x0, 0x78, 0x88, 0x78, 0x78, 0x0, AREA_MINISH_HOUSE_INTERIORS, + ROOM_MINISH_HOUSE_INTERIORS_GENTARI_MAIN, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x38, 0x70, 0x68, 0x50, 0x1, AREA_MINISH_HOUSE_INTERIORS, + ROOM_MINISH_HOUSE_INTERIORS_GENTARI_EXIT, 1, TRANSITION_TYPE_NORMAL, 0x2, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x258, 0x58, 0xe8, 0xb8, 0x0, AREA_MINISH_HOUSE_INTERIORS, ROOM_MINISH_HOUSE_INTERIORS_FESTARI, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x128, 0x228, 0x80, 0x78, 0x0, AREA_MINISH_HOUSE_INTERIORS, ROOM_MINISH_HOUSE_INTERIORS_RED, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x168, 0x1d8, 0x80, 0x78, 0x0, AREA_MINISH_HOUSE_INTERIORS, ROOM_MINISH_HOUSE_INTERIORS_GREEN, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x1a8, 0x208, 0x80, 0x78, 0x0, AREA_MINISH_HOUSE_INTERIORS, ROOM_MINISH_HOUSE_INTERIORS_BLUE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x1e8, 0x2d8, 0x78, 0x78, 0x0, AREA_MINISH_HOUSE_INTERIORS, + ROOM_MINISH_HOUSE_INTERIORS_SHOE_MINISH, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x48, 0x248, 0x78, 0xc8, 0x0, AREA_MINISH_HOUSE_INTERIORS, + ROOM_MINISH_HOUSE_INTERIORS_POT_MINISH, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x378, 0x288, 0x78, 0x140, 0x0, AREA_MINISH_HOUSE_INTERIORS, + ROOM_MINISH_HOUSE_INTERIORS_BARREL_MINISH, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x368, 0x234, 0x58, 0x100, 0x0, AREA_MINISH_HOUSE_INTERIORS, + ROOM_MINISH_HOUSE_INTERIORS_BARREL_MINISH, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x78, 0x18, 0x30, AREA_MINISH_PATHS, ROOM_MINISH_PATHS_MINISH_VILLAGE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1c8, 0x338, 0x1, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1a8, 0x348, 0x40, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x6, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishVillage_SideHouse[] = { + { WARP_TYPE_AREA, 0x0, 0x138, 0x68, 0x80, 0x78, 0x0, AREA_MINISH_HOUSE_INTERIORS, + ROOM_MINISH_HOUSE_INTERIORS_SIDE_AREA, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_MinishVillage[] = { + [ROOM_MINISH_VILLAGE_MAIN] = gExitList_MinishVillage_Main, + [ROOM_MINISH_VILLAGE_SIDE_HOUSE_AREA] = gExitList_MinishVillage_SideHouse, + [ROOM_MINISH_VILLAGE_2] = gExitList_NoExitList, + [ROOM_MINISH_VILLAGE_3] = gExitList_NoExitList, +}; + +const Transition gExitList_MelarisMine_Main[] = { + { WARP_TYPE_AREA, 0x0, 0x78, 0x38, 0x78, 0xa8, 0x0, AREA_CRENEL_MINISH_PATHS, ROOM_CRENEL_MINISH_PATHS_MELARI, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x70, 0x12c, 0xbc, 0x138, 0x0, AREA_MT_CRENEL, ROOM_MT_CRENEL_CAVERN_OF_FLAMES_ENTRANCE, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x6, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xa8, 0x220, 0x78, 0x28, 0x0, AREA_MINISH_HOUSE_INTERIORS, + ROOM_MINISH_HOUSE_INTERIORS_MELARI_MINES_SOUTHWEST, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x228, 0x220, 0x78, 0x28, 0x0, AREA_MINISH_HOUSE_INTERIORS, + ROOM_MINISH_HOUSE_INTERIORS_MELARI_MINES_SOUTHEAST, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x280, 0x11c, 0x24, 0x56, 0x0, AREA_MINISH_HOUSE_INTERIORS, + ROOM_MINISH_HOUSE_INTERIORS_MELARI_MINES_EAST, 1, TRANSITION_TYPE_NORMAL, 0x2, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_MelarisMine[] = { + [ROOM_MELARIS_MINE_MAIN] = gExitList_MelarisMine_Main, +}; + +const Transition gExitList_MinishPaths_ToMinishVillage[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x208, 0x3e0, 0x3, AREA_MINISH_VILLAGE, ROOM_MINISH_VILLAGE_MAIN, 1, + TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1d8, 0x398, 0x30, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishPaths_CastorWilds[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x28, 0x68, 0x3, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x28, 0xa8, 0x30, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishPaths_HyruleTown[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x398, 0x68, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishPaths_LonLonRanch[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1e0, 0x174, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_LON_LON_RANCH, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishPaths_MayorsCabin[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x2a8, 0x31a, 0x3, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, 0x0, + 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xb8, 0x48, 0x30, AREA_HOUSE_INTERIORS_4, ROOM_HOUSE_INTERIORS_4_MAYOR_LAKE_CABIN, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_MinishPaths[] = { + [ROOM_MINISH_PATHS_MINISH_VILLAGE] = gExitList_MinishPaths_ToMinishVillage, + [ROOM_MINISH_PATHS_BOW] = gExitList_MinishPaths_CastorWilds, + [ROOM_MINISH_PATHS_SCHOOLYARD] = gExitList_MinishPaths_HyruleTown, + [ROOM_MINISH_PATHS_LON_LON_RANCH] = gExitList_MinishPaths_LonLonRanch, + [ROOM_MINISH_PATHS_LAKE_HYLIA] = gExitList_MinishPaths_MayorsCabin, +}; + +const Transition gExitList_CrenelMinishPaths_CrenelBean[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xd2, 0x60, 0x30, AREA_MT_CRENEL, ROOM_MT_CRENEL_ENTRANCE, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CrenelMinishPaths_CrenelWater[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x372, 0xf5, 0x30, AREA_MT_CRENEL, ROOM_MT_CRENEL_ENTRANCE, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CrenelMinishPaths_Rainfall[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x2cc, 0x98, 0xc0, AREA_MT_CRENEL, ROOM_MT_CRENEL_TOP, 1, TRANSITION_TYPE_INSTANT_MINISH, 0x6, + 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x2f4, 0x98, 0xc, AREA_MT_CRENEL, ROOM_MT_CRENEL_TOP, 1, TRANSITION_TYPE_INSTANT_MINISH, 0x2, + 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CrenelMinishPaths_MelarisMine[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xf4, 0x108, 0xc, AREA_MT_CRENEL, ROOM_MT_CRENEL_CAVERN_OF_FLAMES_ENTRANCE, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x2, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x78, 0x48, 0x30, AREA_MELARIS_MINE, ROOM_MELARIS_MINE_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_CrenelMinishPaths[] = { + [ROOM_CRENEL_MINISH_PATHS_BEAN] = gExitList_CrenelMinishPaths_CrenelBean, + [ROOM_CRENEL_MINISH_PATHS_SPRING_WATER] = gExitList_CrenelMinishPaths_CrenelWater, + [ROOM_CRENEL_MINISH_PATHS_RAIN] = gExitList_CrenelMinishPaths_Rainfall, + [ROOM_CRENEL_MINISH_PATHS_MELARI] = gExitList_CrenelMinishPaths_MelarisMine, +}; + +const Transition gExitList_DigCaves1_TrilbyHighlands[] = { + { WARP_TYPE_AREA, 0x0, 0x88, 0x44, 0x88, 0x78, 0x0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_TRILBY_HIGHLANDS, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x1a8, 0x78, 0xb8, 0x28, 0x0, AREA_CAVES, ROOM_CAVES_TRILBY_MITTS_FAIRY_FOUNTAIN, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_DigCaves1[] = { + [ROOM_DIG_CAVES_EASTERN_HILLS] = gExitList_NoExitList, + [ROOM_DIG_CAVES_1] = gExitList_NoExitList, + [ROOM_DIG_CAVES_2] = gExitList_NoExitList, + [ROOM_DIG_CAVES_TRILBY_HIGHLANDS] = gExitList_DigCaves1_TrilbyHighlands, +}; + +const Transition gExitList_MinishHouseInteriors_GentariMain[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x78, 0x98, 0x30, AREA_MINISH_VILLAGE, ROOM_MINISH_VILLAGE_MAIN, 1, + TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishHouseInteriors_GentariExit[] = { + { WARP_TYPE_AREA, 0x0, 0x48, 0x50, 0x28, 0x70, 0x1, AREA_MINISH_VILLAGE, ROOM_MINISH_VILLAGE_MAIN, 1, + TRANSITION_TYPE_NORMAL, 0x6, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishHouseInteriors_Festari[] = { + { WARP_TYPE_AREA, 0x0, 0xe8, 0xe8, 0x258, 0x68, 0x0, AREA_MINISH_VILLAGE, ROOM_MINISH_VILLAGE_MAIN, 1, + TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xe8, 0x18, 0x1d0, 0x33c, 0x0, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 1, + TRANSITION_TYPE_INSTANT_MINISH, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishHouseInteriors_Red[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x128, 0x238, 0x30, AREA_MINISH_VILLAGE, ROOM_MINISH_VILLAGE_MAIN, 1, + TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishHouseInteriors_Green[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x168, 0x1e8, 0x30, AREA_MINISH_VILLAGE, ROOM_MINISH_VILLAGE_MAIN, 1, + TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishHouseInteriors_Blue[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1a8, 0x218, 0x30, AREA_MINISH_VILLAGE, ROOM_MINISH_VILLAGE_MAIN, 1, + TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishHouseInteriors_SideArea[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x138, 0x78, 0x30, AREA_MINISH_VILLAGE, ROOM_MINISH_VILLAGE_SIDE_HOUSE_AREA, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishHouseInteriors_ShoeMinish[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1e8, 0x2e8, 0x30, AREA_MINISH_VILLAGE, ROOM_MINISH_VILLAGE_MAIN, 1, + TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishHouseInteriors_PotMinish[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x48, 0x258, 0x30, AREA_MINISH_VILLAGE, ROOM_MINISH_VILLAGE_MAIN, 1, + TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishHouseInteriors_BarrelMinish[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x378, 0x298, 0x30, AREA_MINISH_VILLAGE, ROOM_MINISH_VILLAGE_MAIN, 1, + TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x58, 0xd0, 0x368, 0x218, 0x0, AREA_MINISH_VILLAGE, ROOM_MINISH_VILLAGE_MAIN, 1, + TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishHouseInteriors_NULL1[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x378, 0x290, 0x30, AREA_MINISH_VILLAGE, ROOM_MINISH_VILLAGE_SIDE_HOUSE_AREA, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishHouseInteriors_NULL2[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x138, 0x70, 0x30, AREA_MINISH_VILLAGE, ROOM_MINISH_VILLAGE_SIDE_HOUSE_AREA, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishHouseInteriors_MelariMinesSouthwest[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xa8, 0x208, 0x3, AREA_MELARIS_MINE, ROOM_MELARIS_MINE_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishHouseInteriors_MelariMinesSoutheast[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x228, 0x208, 0x3, AREA_MELARIS_MINE, ROOM_MELARIS_MINE_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishHouseInteriors_MelariMinesEast[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x270, 0x11e, 0xc0, AREA_MELARIS_MINE, ROOM_MELARIS_MINE_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x6, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishHouseInteriors_HyruleFieldSouthwest[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xb8, 0x35, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_SOUTH, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishHouseInteriors_SouthHyruleField[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x48, 0x1d4, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_SOUTH_HYRULE_FIELD, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishHouseInteriors_NextToKnuckle[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x28, 0x55, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_TRILBY_HIGHLANDS, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishHouseInteriors_Librari[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1e8, 0x1b4, 0x30, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishHouseInteriors_HyruleFieldExit[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x38, 0x35, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_EASTERN_HILLLS_SOUTH, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishHouseInteriors_HyruleTown[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x38, 0x1b5, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishHouseInteriors_MinishWoodsBomb[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x138, 0x325, 0x30, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishHouseInteriors_LakeHyliaOcarina[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xc8, 0x1a4, 0x30, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, + 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_MinishHouseInteriors[] = { + [ROOM_MINISH_HOUSE_INTERIORS_GENTARI_MAIN] = gExitList_MinishHouseInteriors_GentariMain, + [ROOM_MINISH_HOUSE_INTERIORS_GENTARI_EXIT] = gExitList_MinishHouseInteriors_GentariExit, + [ROOM_MINISH_HOUSE_INTERIORS_FESTARI] = gExitList_MinishHouseInteriors_Festari, + [ROOM_MINISH_HOUSE_INTERIORS_RED] = gExitList_MinishHouseInteriors_Red, + [ROOM_MINISH_HOUSE_INTERIORS_GREEN] = gExitList_MinishHouseInteriors_Green, + [ROOM_MINISH_HOUSE_INTERIORS_BLUE] = gExitList_MinishHouseInteriors_Blue, + [ROOM_MINISH_HOUSE_INTERIORS_SIDE_AREA] = gExitList_MinishHouseInteriors_SideArea, + [ROOM_MINISH_HOUSE_INTERIORS_SHOE_MINISH] = gExitList_MinishHouseInteriors_ShoeMinish, + [ROOM_MINISH_HOUSE_INTERIORS_POT_MINISH] = gExitList_MinishHouseInteriors_PotMinish, + [ROOM_MINISH_HOUSE_INTERIORS_BARREL_MINISH] = gExitList_MinishHouseInteriors_BarrelMinish, + [ROOM_MINISH_HOUSE_INTERIORS_NULL1] = gExitList_MinishHouseInteriors_NULL1, + [ROOM_MINISH_HOUSE_INTERIORS_NULL2] = gExitList_MinishHouseInteriors_NULL2, + [ROOM_MINISH_HOUSE_INTERIORS_c] = gExitList_NoExitList, + [ROOM_MINISH_HOUSE_INTERIORS_d] = gExitList_NoExitList, + [ROOM_MINISH_HOUSE_INTERIORS_e] = gExitList_NoExitList, + [ROOM_MINISH_HOUSE_INTERIORS_f] = gExitList_NoExitList, + [ROOM_MINISH_HOUSE_INTERIORS_MELARI_MINES_SOUTHWEST] = gExitList_MinishHouseInteriors_MelariMinesSouthwest, + [ROOM_MINISH_HOUSE_INTERIORS_MELARI_MINES_SOUTHEAST] = gExitList_MinishHouseInteriors_MelariMinesSoutheast, + [ROOM_MINISH_HOUSE_INTERIORS_MELARI_MINES_EAST] = gExitList_MinishHouseInteriors_MelariMinesEast, + [ROOM_MINISH_HOUSE_INTERIORS_13] = gExitList_NoExitList, + [ROOM_MINISH_HOUSE_INTERIORS_14] = gExitList_NoExitList, + [ROOM_MINISH_HOUSE_INTERIORS_15] = gExitList_NoExitList, + [ROOM_MINISH_HOUSE_INTERIORS_16] = gExitList_NoExitList, + [ROOM_MINISH_HOUSE_INTERIORS_17] = gExitList_NoExitList, + [ROOM_MINISH_HOUSE_INTERIORS_18] = gExitList_NoExitList, + [ROOM_MINISH_HOUSE_INTERIORS_19] = gExitList_NoExitList, + [ROOM_MINISH_HOUSE_INTERIORS_1a] = gExitList_NoExitList, + [ROOM_MINISH_HOUSE_INTERIORS_1b] = gExitList_NoExitList, + [ROOM_MINISH_HOUSE_INTERIORS_1c] = gExitList_NoExitList, + [ROOM_MINISH_HOUSE_INTERIORS_1d] = gExitList_NoExitList, + [ROOM_MINISH_HOUSE_INTERIORS_1e] = gExitList_NoExitList, + [ROOM_MINISH_HOUSE_INTERIORS_1f] = gExitList_NoExitList, + [ROOM_MINISH_HOUSE_INTERIORS_HYRULE_FIELD_SOUTHWEST] = gExitList_MinishHouseInteriors_HyruleFieldSouthwest, + [ROOM_MINISH_HOUSE_INTERIORS_SOUTH_HYRULE_FIELD] = gExitList_MinishHouseInteriors_SouthHyruleField, + [ROOM_MINISH_HOUSE_INTERIORS_NEXT_TO_KNUCKLE] = gExitList_MinishHouseInteriors_NextToKnuckle, + [ROOM_MINISH_HOUSE_INTERIORS_LIBRARI] = gExitList_MinishHouseInteriors_Librari, + [ROOM_MINISH_HOUSE_INTERIORS_HYRULE_FIELD_EXIT] = gExitList_MinishHouseInteriors_HyruleFieldExit, + [ROOM_MINISH_HOUSE_INTERIORS_HYRULE_TOWN] = gExitList_MinishHouseInteriors_HyruleTown, + [ROOM_MINISH_HOUSE_INTERIORS_MINISH_WOODS_BOMB] = gExitList_MinishHouseInteriors_MinishWoodsBomb, + [ROOM_MINISH_HOUSE_INTERIORS_LAKE_HYLIA_OCARINA] = gExitList_MinishHouseInteriors_LakeHyliaOcarina, +}; + +const Transition gExitList_OuterFortressOfWinds_EntranceHall[] = { + { WARP_TYPE_AREA, 0x0, 0x78, 0x22, 0x78, 0xb0, 0x0, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_WIZZROBE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x128, 0x22, 0x68, 0xb0, 0x0, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_WEST_STAIRS_1F, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x1d8, 0x22, 0x78, 0xb0, 0x0, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_CENTER_STAIRS_1F, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x288, 0x22, 0x68, 0xb0, 0x0, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_EAST_STAIRS_1F, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x338, 0x22, 0x88, 0xb0, 0x0, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_HEART_PIECE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x198, 0x28, 0x30, AREA_RUINS, ROOM_RUINS_FORTRESS_ENTRANCE, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_OuterFortressOfWinds_2F[] = { + { WARP_TYPE_AREA, 0x0, 0x78, 0x22, 0x88, 0xb0, 0x0, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_STALFOS, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x1d8, 0x92, 0x88, 0x170, 0x0, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_MAIN_2F, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x288, 0x92, 0x88, 0xa0, 0x0, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_EAST_STAIRS_2F, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x338, 0x22, 0x28, 0xb0, 0x0, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_BOSS_KEY, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x128, 0xd8, 0x128, 0x68, 0x0, AREA_OUTER_FORTRESS_OF_WINDS, ROOM_OUTER_FORTRESS_OF_WINDS_3F, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x1d8, 0xd8, 0x1d8, 0x68, 0x0, AREA_OUTER_FORTRESS_OF_WINDS, ROOM_OUTER_FORTRESS_OF_WINDS_3F, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x288, 0xd8, 0x288, 0x68, 0x0, AREA_OUTER_FORTRESS_OF_WINDS, ROOM_OUTER_FORTRESS_OF_WINDS_3F, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x338, 0xd8, 0x338, 0x68, 0x0, AREA_OUTER_FORTRESS_OF_WINDS, ROOM_OUTER_FORTRESS_OF_WINDS_3F, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_OuterFortressOfWinds_3F[] = { + { WARP_TYPE_AREA, 0x0, 0x68, 0x22, 0x78, 0xa0, 0x0, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_PIT_PLATFORMS, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x1d8, 0x22, 0x198, 0xa0, 0x0, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_WEST_KEY_LEVER, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x2e8, 0x22, 0x198, 0x178, 0x0, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_EAST_KEY_LEVER, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x338, 0x22, 0x1f8, 0x178, 0x0, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_EAST_KEY_LEVER, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x1d8, 0x84, 0x1d8, 0xf8, 0x0, AREA_OUTER_FORTRESS_OF_WINDS, ROOM_OUTER_FORTRESS_OF_WINDS_2F, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x288, 0x84, 0x288, 0xf8, 0x0, AREA_OUTER_FORTRESS_OF_WINDS, ROOM_OUTER_FORTRESS_OF_WINDS_2F, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x338, 0x84, 0x338, 0xf8, 0x0, AREA_OUTER_FORTRESS_OF_WINDS, ROOM_OUTER_FORTRESS_OF_WINDS_2F, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x128, 0x84, 0x128, 0xf8, 0x0, AREA_OUTER_FORTRESS_OF_WINDS, ROOM_OUTER_FORTRESS_OF_WINDS_2F, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_OuterFortressOfWinds_MoleMitts[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x88, 0x22, 0x30, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_ENTRANCE_MOLE_MITTS, + 2, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_OuterFortressOfWinds_SmallKey[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x78, 0x22, 0x30, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_MINISH_HOLE, + 2, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_OuterFortressOfWinds[] = { + [ROOM_OUTER_FORTRESS_OF_WINDS_ENTRANCE_HALL] = gExitList_OuterFortressOfWinds_EntranceHall, + [ROOM_OUTER_FORTRESS_OF_WINDS_2F] = gExitList_OuterFortressOfWinds_2F, + [ROOM_OUTER_FORTRESS_OF_WINDS_3F] = gExitList_OuterFortressOfWinds_3F, + [ROOM_OUTER_FORTRESS_OF_WINDS_MOLE_MITTS] = gExitList_OuterFortressOfWinds_MoleMitts, + [ROOM_OUTER_FORTRESS_OF_WINDS_SMALL_KEY] = gExitList_OuterFortressOfWinds_SmallKey, +}; + +const Transition gExitList_HyliaDigCaves_North[] = { + { WARP_TYPE_AREA, 0x0, 0x248, 0x62, 0x208, 0x78, 0x0, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_BEANSTALK, 1, + TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x308, 0x62, 0x308, 0x78, 0x0, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_BEANSTALK, 1, + TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x398, 0x52, 0x388, 0x48, 0x0, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_BEANSTALK, 1, + TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_HyliaDigCaves[] = { + [ROOM_HYLIA_DIG_CAVES_0] = gExitList_NoExitList, + [ROOM_HYLIA_DIG_CAVES_1] = gExitList_HyliaDigCaves_North, + NULL, + NULL, + NULL, +}; + +const Transition gExitList_VeilFallsTop_Main[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x10, 0x30, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 1, TRANSITION_TYPE_NORMAL, 0x4, + 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_VeilFallsTop[] = { + [ROOM_VEIL_FALLS_TOP_0] = gExitList_VeilFallsTop_Main, +}; + +const Transition gExitList_HouseInteriors2_Stranger[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x98, 0x17c, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors2_WestOracle[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x40, 0x1cc, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors2_2[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x40, 0x1cc, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors2_3[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x40, 0x1cc, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors2_DrLeft[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x38, 0x25c, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors2_NULL1[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x40, 0x5c, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_EASTERN_HILLLS_NORTH, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors2_Romio[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x2e8, 0x304, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors2_Julietta[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x348, 0x30c, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors2_Percy[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x90, 0x5c, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_CENTER, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors2_EastOracle[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x2b8, 0x374, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors2_A[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x2b8, 0x374, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors2_B[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x2b8, 0x374, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors2_Cucco[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x3b8, 0x36c, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors2_LinksHouseEntrance[] = { + { WARP_TYPE_AREA, 0x0, 0x58, 0x18, 0x58, 0x28, 0x0, AREA_HOUSE_INTERIORS_2, ROOM_HOUSE_INTERIORS_2_LINKS_HOUSE_BEDROOM, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x290, 0x19c, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_SOUTH_HYRULE_FIELD, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors2_Dampe[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1a0, 0x1ac, 0x30, AREA_ROYAL_VALLEY, ROOM_ROYAL_VALLEY_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors2_NULL2[] = { + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors2_StockwellLakeHouse[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x120, 0x4c, 0x30, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_MAIN, 1, TRANSITION_TYPE_NORMAL, 0x4, + 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors2_LinksHouseBedroom[] = { + { WARP_TYPE_AREA, 0x0, 0x58, 0x18, 0x58, 0x28, 0x0, AREA_HOUSE_INTERIORS_2, + ROOM_HOUSE_INTERIORS_2_LINKS_HOUSE_ENTRANCE, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_HouseInteriors2[] = { + [ROOM_HOUSE_INTERIORS_2_STRANGER] = gExitList_HouseInteriors2_Stranger, + [ROOM_HOUSE_INTERIORS_2_WEST_ORACLE] = gExitList_HouseInteriors2_WestOracle, + [ROOM_HOUSE_INTERIORS_2_2] = gExitList_HouseInteriors2_2, + [ROOM_HOUSE_INTERIORS_2_3] = gExitList_HouseInteriors2_3, + [ROOM_HOUSE_INTERIORS_2_DR_LEFT] = gExitList_HouseInteriors2_DrLeft, + [ROOM_HOUSE_INTERIORS_2_5] = gExitList_HouseInteriors2_NULL1, + [ROOM_HOUSE_INTERIORS_2_ROMIO] = gExitList_HouseInteriors2_Romio, + [ROOM_HOUSE_INTERIORS_2_JULIETTA] = gExitList_HouseInteriors2_Julietta, + [ROOM_HOUSE_INTERIORS_2_PERCY] = gExitList_HouseInteriors2_Percy, + [ROOM_HOUSE_INTERIORS_2_EAST_ORACLE] = gExitList_HouseInteriors2_EastOracle, + [ROOM_HOUSE_INTERIORS_2_a] = gExitList_HouseInteriors2_A, + [ROOM_HOUSE_INTERIORS_2_b] = gExitList_HouseInteriors2_B, + [ROOM_HOUSE_INTERIORS_2_CUCCO] = gExitList_HouseInteriors2_Cucco, + [ROOM_HOUSE_INTERIORS_2_d] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_e] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_f] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_LINKS_HOUSE_ENTRANCE] = gExitList_HouseInteriors2_LinksHouseEntrance, + [ROOM_HOUSE_INTERIORS_2_LINKS_HOUSE_SMITH] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_DAMPE] = gExitList_HouseInteriors2_Dampe, + [ROOM_HOUSE_INTERIORS_2_13] = gExitList_HouseInteriors2_NULL2, + [ROOM_HOUSE_INTERIORS_2_STOCKWELL_LAKE_HOUSE] = gExitList_HouseInteriors2_StockwellLakeHouse, + [ROOM_HOUSE_INTERIORS_2_LINKS_HOUSE_BEDROOM] = gExitList_HouseInteriors2_LinksHouseBedroom, + [ROOM_HOUSE_INTERIORS_2_16] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_17] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_18] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_19] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_1a] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_1b] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_1c] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_1d] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_1e] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_1f] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_20] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_21] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_22] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_23] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_24] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_25] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_26] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_27] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_28] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_29] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_2a] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_2b] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_2c] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_2d] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_2e] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_2_2f] = gExitList_NoExitList, +}; + +const Transition gExitList_HouseInteriors4_Carpenter[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x90, 0x2dc, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors4_Swiftblade[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x138, 0x39c, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors4_RanchHouseWest[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x158, 0x28c, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_LON_LON_RANCH, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors4_RanchHouseEast[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x188, 0x28c, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_LON_LON_RANCH, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors4_FarmHouse[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x40, 0x5c, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_EASTERN_HILLLS_NORTH, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors4_MayorLakeCabin[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x2a0, 0x38c, 0x30, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_HouseInteriors4[] = { + [ROOM_HOUSE_INTERIORS_4_CARPENTER] = gExitList_HouseInteriors4_Carpenter, + [ROOM_HOUSE_INTERIORS_4_SWIFTBLADE] = gExitList_HouseInteriors4_Swiftblade, + [ROOM_HOUSE_INTERIORS_4_RANCH_HOUSE_WEST] = gExitList_HouseInteriors4_RanchHouseWest, + [ROOM_HOUSE_INTERIORS_4_RANCH_HOUSE_EAST] = gExitList_HouseInteriors4_RanchHouseEast, + [ROOM_HOUSE_INTERIORS_4_FARM_HOUSE] = gExitList_HouseInteriors4_FarmHouse, + [ROOM_HOUSE_INTERIORS_4_MAYOR_LAKE_CABIN] = gExitList_HouseInteriors4_MayorLakeCabin, + [ROOM_HOUSE_INTERIORS_4_6] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_4_7] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_4_8] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_4_9] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_4_a] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_4_b] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_4_c] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_4_d] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_4_e] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_4_f] = gExitList_NoExitList, +}; + +const Transition gExitList_GreatFairies_Graveyard[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x198, 0x2b8, 0x30, AREA_ROYAL_VALLEY, ROOM_ROYAL_VALLEY_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_GreatFairies_MinishWoods[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x78, 0x58, 0x30, AREA_TREE_INTERIORS, ROOM_TREE_INTERIORS_MINISH_WOODS_GREAT_FAIRY, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_GreatFairies_MtCrenel[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x148, 0x1f8, 0x30, AREA_MT_CRENEL, ROOM_MT_CRENEL_WALL_CLIMB, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_GreatFairies[] = { + [ROOM_GREAT_FAIRIES_GRAVEYARD] = gExitList_GreatFairies_Graveyard, + [ROOM_GREAT_FAIRIES_MINISH_WOODS] = gExitList_GreatFairies_MinishWoods, + [ROOM_GREAT_FAIRIES_CRENEL] = gExitList_GreatFairies_MtCrenel, + [ROOM_GREAT_FAIRIES_NOT_IMPLEMENTED] = gExitList_NoExitList, +}; + +const Transition gExitList_HouseInteriors3_StockwellShop[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x258, 0x2fc, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors3_Cafe[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x198, 0x2fc, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors3_RemShoeShop[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x188, 0x210, 0xc, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x2, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors3_Bakery[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x268, 0x1f0, 0xc0, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x6, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors3_Simon[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x188, 0x250, 0xc, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x2, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors3_FigurineHouse[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x188, 0x290, 0xc, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x2, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x128, 0x290, 0xc0, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x6, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors3_BorlovEntrance[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x298, 0x26c, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xb8, 0x78, 0x3, AREA_HOUSE_INTERIORS_3, ROOM_HOUSE_INTERIORS_3_BORLOV, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors3_Carlov[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x78, 0x60, 0x30, AREA_TREE_INTERIORS, ROOM_TREE_INTERIORS_STAIRS_TO_CARLOV, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors3_Borlov[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x78, 0x68, 0x30, AREA_HOUSE_INTERIORS_3, ROOM_HOUSE_INTERIORS_3_BORLOV_ENTRANCE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_HouseInteriors3[] = { + [ROOM_HOUSE_INTERIORS_3_STOCKWELL_SHOP] = gExitList_HouseInteriors3_StockwellShop, + [ROOM_HOUSE_INTERIORS_3_CAFE] = gExitList_HouseInteriors3_Cafe, + [ROOM_HOUSE_INTERIORS_3_REM_SHOE_SHOP] = gExitList_HouseInteriors3_RemShoeShop, + [ROOM_HOUSE_INTERIORS_3_BAKERY] = gExitList_HouseInteriors3_Bakery, + [ROOM_HOUSE_INTERIORS_3_SIMON] = gExitList_HouseInteriors3_Simon, + [ROOM_HOUSE_INTERIORS_3_FIGURINE_HOUSE] = gExitList_HouseInteriors3_FigurineHouse, + [ROOM_HOUSE_INTERIORS_3_BORLOV_ENTRANCE] = gExitList_HouseInteriors3_BorlovEntrance, + [ROOM_HOUSE_INTERIORS_3_CARLOV] = gExitList_HouseInteriors3_Carlov, + [ROOM_HOUSE_INTERIORS_3_BORLOV] = gExitList_HouseInteriors3_Borlov, + [ROOM_HOUSE_INTERIORS_3_9] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_3_a] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_3_b] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_3_c] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_3_d] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_3_e] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_3_f] = gExitList_NoExitList, +}; + +const Transition gExitList_HouseInteriors1_Mayor[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x2c8, 0x14c, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x318, 0x120, 0xc, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x2, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors1_PostOffice[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x48, 0xb8, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors1_Library2F[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x138, 0x58, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 2, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x78, 0x18, 0x68, 0x28, 0x0, AREA_HOUSE_INTERIORS_1, ROOM_HOUSE_INTERIORS_1_LIBRARY_1F, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors1_Library1F[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x168, 0xb8, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x68, 0x18, 0x78, 0x28, 0x0, AREA_HOUSE_INTERIORS_1, ROOM_HOUSE_INTERIORS_1_LIBRARY_2F, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors1_Inn1F[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x388, 0x268, 0x10, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x78, 0x18, 0x98, 0x78, 0x0, AREA_HOUSE_INTERIORS_1, ROOM_HOUSE_INTERIORS_1_INN_WEST_ROOM, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xb8, 0x18, 0x78, 0x78, 0x0, AREA_HOUSE_INTERIORS_1, ROOM_HOUSE_INTERIORS_1_INN_MIDDLE_ROOM, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xf8, 0x18, 0x78, 0x78, 0x0, AREA_HOUSE_INTERIORS_1, ROOM_HOUSE_INTERIORS_1_INN_EAST_ROOM, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x118, 0x38, 0xb8, 0x168, 0x0, AREA_HOUSE_INTERIORS_1, ROOM_HOUSE_INTERIORS_1_INN_EAST_2F, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors1_InnWestRoom[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x78, 0x28, 0x30, AREA_HOUSE_INTERIORS_1, ROOM_HOUSE_INTERIORS_1_INN_1F, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors1_InnMiddleRoom[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xb8, 0x28, 0x30, AREA_HOUSE_INTERIORS_1, ROOM_HOUSE_INTERIORS_1_INN_1F, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors1_InnEastRoom[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xf8, 0x28, 0x30, AREA_HOUSE_INTERIORS_1, ROOM_HOUSE_INTERIORS_1_INN_1F, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors1_InnWest2F[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x368, 0x1c8, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors1_InnEast2F[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x3a8, 0x230, 0x10, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 2, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xb8, 0x178, 0x118, 0x48, 0x0, AREA_HOUSE_INTERIORS_1, ROOM_HOUSE_INTERIORS_1_INN_1F, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors1_SchoolWest[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x2c8, 0xa8, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x78, 0x48, 0x168, 0x28, 0x0, AREA_HYRULE_TOWN_UNDERGROUND, ROOM_HYRULE_TOWN_UNDERGROUND_0, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HouseInteriors1_SchoolEast[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x328, 0x78, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_HouseInteriors1[] = { + [ROOM_HOUSE_INTERIORS_1_MAYOR] = gExitList_HouseInteriors1_Mayor, + [ROOM_HOUSE_INTERIORS_1_POST_OFFICE] = gExitList_HouseInteriors1_PostOffice, + [ROOM_HOUSE_INTERIORS_1_LIBRARY_2F] = gExitList_HouseInteriors1_Library2F, + [ROOM_HOUSE_INTERIORS_1_LIBRARY_1F] = gExitList_HouseInteriors1_Library1F, + [ROOM_HOUSE_INTERIORS_1_INN_1F] = gExitList_HouseInteriors1_Inn1F, + [ROOM_HOUSE_INTERIORS_1_INN_WEST_ROOM] = gExitList_HouseInteriors1_InnWestRoom, + [ROOM_HOUSE_INTERIORS_1_INN_MIDDLE_ROOM] = gExitList_HouseInteriors1_InnMiddleRoom, + [ROOM_HOUSE_INTERIORS_1_INN_EAST_ROOM] = gExitList_HouseInteriors1_InnEastRoom, + [ROOM_HOUSE_INTERIORS_1_INN_WEST_2F] = gExitList_HouseInteriors1_InnWest2F, + [ROOM_HOUSE_INTERIORS_1_INN_EAST_2F] = gExitList_HouseInteriors1_InnEast2F, + [ROOM_HOUSE_INTERIORS_1_INN_MINISH_HEART_PIECE] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_1_SCHOOL_WEST] = gExitList_HouseInteriors1_SchoolWest, + [ROOM_HOUSE_INTERIORS_1_SCHOOL_EAST] = gExitList_HouseInteriors1_SchoolEast, + [ROOM_HOUSE_INTERIORS_1_d] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_1_e] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_1_f] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_1_10] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_1_11] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_1_12] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_1_13] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_1_14] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_1_15] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_1_16] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_1_17] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_1_18] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_1_19] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_1_1a] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_1_1b] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_1_1c] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_1_1d] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_1_1e] = gExitList_NoExitList, + [ROOM_HOUSE_INTERIORS_1_1f] = gExitList_NoExitList, +}; + +const Transition gExitList_TreeInteriors_WitchHut[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x2c0, 0x58, 0x30, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TreeInteriors_StairsToCarlov[] = { + { WARP_TYPE_AREA, 0x0, 0x78, 0x48, 0x78, 0x78, 0x0, AREA_HOUSE_INTERIORS_3, ROOM_HOUSE_INTERIORS_3_CARLOV, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x50, 0x388, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TreeInteriors_PercysTreehouse[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x40, 0x398, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_TRILBY_HIGHLANDS, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TreeInteriors_HeartPiece[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x3a0, 0x238, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_SOUTH_HYRULE_FIELD, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TreeInteriors_Waveblade[] = { + { WARP_TYPE_AREA, 0x0, 0x78, 0x48, 0x78, 0x98, 0x0, AREA_DOJOS, ROOM_DOJOS_WAVEBLADE, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, + 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x100, 0x2c8, 0x30, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TreeInteriors_14[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x210, 0x1d8, 0x30, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TreeInteriors_BoomerangNorthwest[] = { + { WARP_TYPE_AREA, 0x0, 0x78, 0x54, 0x48, 0x88, 0x0, AREA_CAVES, ROOM_CAVES_BOOMERANG, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, + 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1b0, 0x138, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TreeInteriors_BoomerangNortheast[] = { + { WARP_TYPE_AREA, 0x0, 0x78, 0x54, 0x108, 0x88, 0x0, AREA_CAVES, ROOM_CAVES_BOOMERANG, 1, TRANSITION_TYPE_NORMAL, 0x0, + 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x240, 0x138, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TreeInteriors_BoomerangSouthwest[] = { + { WARP_TYPE_AREA, 0x0, 0x78, 0x54, 0x48, 0xf8, 0x0, AREA_CAVES, ROOM_CAVES_BOOMERANG, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, + 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1b0, 0x198, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TreeInteriors_BoomerangSoutheast[] = { + { WARP_TYPE_AREA, 0x0, 0x78, 0x54, 0x108, 0xf8, 0x0, AREA_CAVES, ROOM_CAVES_BOOMERANG, 1, TRANSITION_TYPE_NORMAL, 0x0, + 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x240, 0x198, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TreeInteriors_WesternWoodsHeartPiece[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xa0, 0x1f8, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_WESTERN_WOODS_NORTH, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TreeInteriors_NorthHyruleFieldFairyFountain[] = { + { WARP_TYPE_AREA, 0x0, 0x78, 0x48, 0x78, 0x78, 0x0, AREA_CAVES, ROOM_CAVES_NORTH_HYRULE_FIELD_FAIRY_FOUNTAIN, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x2f0, 0x148, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TreeInteriors_MinishWoodsGreatFairy[] = { + { WARP_TYPE_AREA, 0x0, 0x78, 0x48, 0x78, 0xf8, 0x0, AREA_GREAT_FAIRIES, ROOM_GREAT_FAIRIES_MINISH_WOODS, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x70, 0x58, 0x30, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TreeInteriors_1C[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x50, 0x298, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_TRILBY_HIGHLANDS, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TreeInteriors_MinishWoodsBusinessScrub[] = { + { WARP_TYPE_AREA, 0x0, 0x78, 0x48, 0x78, 0x78, 0x0, AREA_CAVES, ROOM_CAVES_KINSTONE_BUSINESS_SCRUB, 1, + TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x210, 0x1d8, 0x30, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TreeInteriors_1E[] = { + TransitionListEnd, +}; +const Transition gExitList_TreeInteriors_UnusedHeartContainer[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1e0, 0x1b8, 0x30, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_TreeInteriors[] = { + [ROOM_TREE_INTERIORS_WITCH_HUT] = gExitList_TreeInteriors_WitchHut, + [ROOM_TREE_INTERIORS_1] = gExitList_NoExitList, + [ROOM_TREE_INTERIORS_2] = gExitList_NoExitList, + [ROOM_TREE_INTERIORS_3] = gExitList_NoExitList, + [ROOM_TREE_INTERIORS_4] = gExitList_NoExitList, + [ROOM_TREE_INTERIORS_5] = gExitList_NoExitList, + [ROOM_TREE_INTERIORS_6] = gExitList_NoExitList, + [ROOM_TREE_INTERIORS_7] = gExitList_NoExitList, + [ROOM_TREE_INTERIORS_8] = gExitList_NoExitList, + [ROOM_TREE_INTERIORS_9] = gExitList_NoExitList, + [ROOM_TREE_INTERIORS_a] = gExitList_NoExitList, + [ROOM_TREE_INTERIORS_b] = gExitList_NoExitList, + [ROOM_TREE_INTERIORS_c] = gExitList_NoExitList, + [ROOM_TREE_INTERIORS_d] = gExitList_NoExitList, + [ROOM_TREE_INTERIORS_e] = gExitList_NoExitList, + [ROOM_TREE_INTERIORS_f] = gExitList_NoExitList, + [ROOM_TREE_INTERIORS_STAIRS_TO_CARLOV] = gExitList_TreeInteriors_StairsToCarlov, + [ROOM_TREE_INTERIORS_PERCYS_TREEHOUSE] = gExitList_TreeInteriors_PercysTreehouse, + [ROOM_TREE_INTERIORS_SOUTH_HYRULE_FIELD_HEART_PIECE] = gExitList_TreeInteriors_HeartPiece, + [ROOM_TREE_INTERIORS_WAVEBLADE] = gExitList_TreeInteriors_Waveblade, + [ROOM_TREE_INTERIORS_14] = gExitList_TreeInteriors_14, + [ROOM_TREE_INTERIORS_BOOMERANG_NORTHWEST] = gExitList_TreeInteriors_BoomerangNorthwest, + [ROOM_TREE_INTERIORS_BOOMERANG_NORTHEAST] = gExitList_TreeInteriors_BoomerangNortheast, + [ROOM_TREE_INTERIORS_BOOMERANG_SOUTHWEST] = gExitList_TreeInteriors_BoomerangSouthwest, + [ROOM_TREE_INTERIORS_BOOMERANG_SOUTHEAST] = gExitList_TreeInteriors_BoomerangSoutheast, + [ROOM_TREE_INTERIORS_WESTERN_WOODS_HEART_PIECE] = gExitList_TreeInteriors_WesternWoodsHeartPiece, + [ROOM_TREE_INTERIORS_NORTH_HYRULE_FIELD_FAIRY_FOUNTAIN] = gExitList_TreeInteriors_NorthHyruleFieldFairyFountain, + [ROOM_TREE_INTERIORS_MINISH_WOODS_GREAT_FAIRY] = gExitList_TreeInteriors_MinishWoodsGreatFairy, + [ROOM_TREE_INTERIORS_1c] = gExitList_TreeInteriors_1C, + [ROOM_TREE_INTERIORS_MINISH_WOODS_BUSINESS_SCRUB] = gExitList_TreeInteriors_MinishWoodsBusinessScrub, + [ROOM_TREE_INTERIORS_1e] = gExitList_TreeInteriors_1E, + [ROOM_TREE_INTERIORS_UNUSED_HEART_CONTAINER] = gExitList_TreeInteriors_UnusedHeartContainer, +}; + +const Transition gExitList_Dojos_Grayblade[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x78, 0x20, 0x30, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_TO_GRAYBLADE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Dojos_Swiftblade[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x38, 0x2e8, 0x30, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Dojos_Waveblade[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x78, 0x58, 0x30, AREA_TREE_INTERIORS, ROOM_TREE_INTERIORS_WAVEBLADE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Dojos_ToGrimblade[] = { + { WARP_TYPE_AREA, 0x0, 0x78, 0x48, 0x3a8, 0x168, 0x0, AREA_CASTLE_GARDEN, ROOM_CASTLE_GARDEN_MAIN, 1, + TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Dojos_ToSplitblade[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xf8, 0x358, 0x30, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 1, TRANSITION_TYPE_NORMAL, 0x4, + 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Dojos_ToGreatblade[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xc8, 0x1f8, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Dojos_ToScarblade[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x398, 0x48, 0x30, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_Dojos[] = { + [ROOM_DOJOS_GRAYBLADE] = gExitList_Dojos_Grayblade, + [ROOM_DOJOS_SPLITBLADE] = gExitList_NoExitList, + [ROOM_DOJOS_GREATBLADE] = gExitList_NoExitList, + [ROOM_DOJOS_SCARBLADE] = gExitList_NoExitList, + [ROOM_DOJOS_SWIFTBLADE_I] = gExitList_Dojos_Swiftblade, + [ROOM_DOJOS_GRIMBLADE] = gExitList_NoExitList, + [ROOM_DOJOS_WAVEBLADE] = gExitList_Dojos_Waveblade, + [ROOM_DOJOS_7] = gExitList_NoExitList, + [ROOM_DOJOS_8] = gExitList_NoExitList, + [ROOM_DOJOS_9] = gExitList_NoExitList, + [ROOM_DOJOS_TO_GRIMBLADE] = gExitList_Dojos_ToGrimblade, + [ROOM_DOJOS_TO_SPLITBLADE] = gExitList_Dojos_ToSplitblade, + [ROOM_DOJOS_TO_GREATBLADE] = gExitList_Dojos_ToGreatblade, + [ROOM_DOJOS_TO_SCARBLADE] = gExitList_Dojos_ToScarblade, + [ROOM_DOJOS_e] = gExitList_NoExitList, + [ROOM_DOJOS_f] = gExitList_NoExitList, +}; + +const Transition gExitList_MinishCracks_LonLonRanchNorth[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x232, 0x18, 0x3, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_LON_LON_RANCH, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x6, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishCracks_LakeHyliaEast[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x2d8, 0x114, 0x3, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, + 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishCracks_HyruleCastleGarden[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x3a8, 0x40, 0x3, AREA_CASTLE_GARDEN, ROOM_CASTLE_GARDEN_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishCracks_MtCrenel[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x158, 0x54, 0x3, AREA_MT_CRENEL, ROOM_MT_CRENEL_ENTRANCE, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x2, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishCracks_EastHyruleCastle[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x3c8, 0x184, 0x3, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishCracks_5[] = { + TransitionListEnd, +}; +const Transition gExitList_MinishCracks_CastorWildsBow[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x28, 0x54, 0x3, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishCracks_RuinsEntrance[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x48, 0x17c, 0x3, AREA_RUINS, ROOM_RUINS_ENTRANCE, 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, + 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishCracks_MinishWoodsSouth[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x218, 0x3c4, 0x3, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishCracks_CastorWildsNorth[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xc8, 0x44, 0x3, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishCracks_CastorWildsWest[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x38, 0x134, 0x3, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishCracks_CastorWildsMiddle[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x168, 0x2d4, 0x3, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishCracks_RuinsTektite[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xc8, 0x54, 0x3, AREA_RUINS, ROOM_RUINS_TEKTITES, 1, TRANSITION_TYPE_INSTANT_MINISH, 0x0, 0x0, + 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishCracks_CastorWildsNextToBow[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x18, 0x54, 0x3, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishCracks_11[] = { + TransitionListEnd, +}; +const Transition* const gExitLists_MinishCracks[] = { + [ROOM_MINISH_CRACKS_LON_LON_RANCH_NORTH] = gExitList_MinishCracks_LonLonRanchNorth, + [ROOM_MINISH_CRACKS_LAKE_HYLIA_EAST] = gExitList_MinishCracks_LakeHyliaEast, + [ROOM_MINISH_CRACKS_HYRULE_CASTLE_GARDEN] = gExitList_MinishCracks_HyruleCastleGarden, + [ROOM_MINISH_CRACKS_MT_CRENEL] = gExitList_MinishCracks_MtCrenel, + [ROOM_MINISH_CRACKS_EAST_HYRULE_CASTLE] = gExitList_MinishCracks_EastHyruleCastle, + [ROOM_MINISH_CRACKS_5] = gExitList_MinishCracks_5, + [ROOM_MINISH_CRACKS_CASTOR_WILDS_BOW] = gExitList_MinishCracks_CastorWildsBow, + [ROOM_MINISH_CRACKS_RUINS_ENTRANCE] = gExitList_MinishCracks_RuinsEntrance, + [ROOM_MINISH_CRACKS_MINISH_WOODS_SOUTH] = gExitList_MinishCracks_MinishWoodsSouth, + [ROOM_MINISH_CRACKS_CASTOR_WILDS_NORTH] = gExitList_MinishCracks_CastorWildsNorth, + [ROOM_MINISH_CRACKS_CASTOR_WILDS_WEST] = gExitList_MinishCracks_CastorWildsWest, + [ROOM_MINISH_CRACKS_CASTOR_WILDS_MIDDLE] = gExitList_MinishCracks_CastorWildsMiddle, + [ROOM_MINISH_CRACKS_RUINS_TEKTITE] = gExitList_MinishCracks_RuinsTektite, + [ROOM_MINISH_CRACKS_CASTOR_WILDS_NEXT_TO_BOW] = gExitList_MinishCracks_CastorWildsNextToBow, + [ROOM_MINISH_CRACKS_e] = gExitList_NoExitList, + [ROOM_MINISH_CRACKS_f] = gExitList_NoExitList, + [ROOM_MINISH_CRACKS_10] = gExitList_NoExitList, + [ROOM_MINISH_CRACKS_11] = gExitList_MinishCracks_11, + [ROOM_MINISH_CRACKS_12] = gExitList_NoExitList, + [ROOM_MINISH_CRACKS_13] = gExitList_NoExitList, + [ROOM_MINISH_CRACKS_14] = gExitList_NoExitList, + [ROOM_MINISH_CRACKS_15] = gExitList_NoExitList, + [ROOM_MINISH_CRACKS_16] = gExitList_NoExitList, + [ROOM_MINISH_CRACKS_17] = gExitList_NoExitList, +}; + +const Transition gExitList_CrenelCaves_BlockPushing[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x328, 0x18, 0x3, AREA_MT_CRENEL, ROOM_MT_CRENEL_TOP, 1, TRANSITION_TYPE_NORMAL, 0x0, + 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x128, 0x28, 0x10, AREA_MT_CRENEL, ROOM_MT_CRENEL_CAVERN_OF_FLAMES_ENTRANCE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x208, 0x28, 0x20, AREA_MT_CRENEL, ROOM_MT_CRENEL_CAVERN_OF_FLAMES_ENTRANCE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x238, 0xb8, 0x38, 0x38, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_BRIDGE_SWITCH, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CrenelCaves_PillarCave[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1d8, 0xc8, 0x30, AREA_MT_CRENEL, ROOM_MT_CRENEL_CAVERN_OF_FLAMES_ENTRANCE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x38, 0x28, 0xb8, 0x48, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_EXIT_TO_MINES, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CrenelCaves_BridgeSwitch[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x238, 0xc8, 0x30, AREA_MT_CRENEL, ROOM_MT_CRENEL_CAVERN_OF_FLAMES_ENTRANCE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x38, 0x28, 0x238, 0xc8, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_BLOCK_PUSHING, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CrenelCaves_ExitToMines[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x188, 0x108, 0x30, AREA_MT_CRENEL, ROOM_MT_CRENEL_CAVERN_OF_FLAMES_ENTRANCE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xb8, 0x38, 0x38, 0x38, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_PILLAR_CAVE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CrenelCaves_GripRing[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1e8, 0x1e8, 0x30, AREA_MT_CRENEL, ROOM_MT_CRENEL_CAVERN_OF_FLAMES_ENTRANCE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CrenelCaves_FairyFountain[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xa8, 0x58, 0x30, AREA_MT_CRENEL, ROOM_MT_CRENEL_CENTER, 1, TRANSITION_TYPE_NORMAL, 0x4, + 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CrenelCaves_SpinyChuPuzzle[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x2f8, 0x38, 0x30, AREA_MT_CRENEL, ROOM_MT_CRENEL_CENTER, 1, TRANSITION_TYPE_NORMAL, 0x4, + 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xb8, 0x38, 0x38, 0x38, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_CHUCHU_POT_CHEST, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CrenelCaves_ChuchuPotChest[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x348, 0x68, 0x30, AREA_MT_CRENEL, ROOM_MT_CRENEL_CENTER, 1, TRANSITION_TYPE_NORMAL, 0x4, + 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x38, 0x28, 0xb8, 0x48, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_SPINY_CHU_PUZZLE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CrenelCaves_WaterHeartPiece[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x38, 0x118, 0x30, AREA_MT_CRENEL, ROOM_MT_CRENEL_CENTER, 1, TRANSITION_TYPE_NORMAL, 0x4, + 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CrenelCaves_RupeeFairyFountain[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x298, 0x38, 0x30, AREA_MT_CRENEL, ROOM_MT_CRENEL_ENTRANCE, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CrenelCaves_HelmasaurHallway[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x198, 0xe8, 0x30, AREA_MT_CRENEL, ROOM_MT_CRENEL_ENTRANCE, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x68, 0x18, 0xb8, 0x48, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_MUSHROOM_KEESE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CrenelCaves_MushroomKeese[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x138, 0x148, 0x30, AREA_MT_CRENEL, ROOM_MT_CRENEL_ENTRANCE, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xb8, 0x38, 0x68, 0x28, 0x0, AREA_CRENEL_CAVES, ROOM_CRENEL_CAVES_HELMASAUR_HALLWAY, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CrenelCaves_LadderToSpringWater[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x2d8, 0x198, 0x30, AREA_MT_CRENEL, ROOM_MT_CRENEL_ENTRANCE, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x2d8, 0x138, 0x3, AREA_MT_CRENEL, ROOM_MT_CRENEL_ENTRANCE, 1, TRANSITION_TYPE_NORMAL, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CrenelCaves_BombBusinessScrub[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xb8, 0x1a8, 0x30, AREA_MT_CRENEL, ROOM_MT_CRENEL_ENTRANCE, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CrenelCaves_Hermit[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xa8, 0x68, 0x30, AREA_MT_CRENEL, ROOM_MT_CRENEL_WALL_CLIMB, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CrenelCaves_HintScrub[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x3b8, 0x178, 0x30, AREA_MT_CRENEL, ROOM_MT_CRENEL_ENTRANCE, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CrenelCaves_ToGrayblade[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x78, 0xa0, 0x3, AREA_DOJOS, ROOM_DOJOS_GRAYBLADE, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, + 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x208, 0x158, 0x30, AREA_MT_CRENEL, ROOM_MT_CRENEL_CAVERN_OF_FLAMES_ENTRANCE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_CrenelCaves[] = { + [ROOM_CRENEL_CAVES_BLOCK_PUSHING] = gExitList_CrenelCaves_BlockPushing, + [ROOM_CRENEL_CAVES_PILLAR_CAVE] = gExitList_CrenelCaves_PillarCave, + [ROOM_CRENEL_CAVES_BRIDGE_SWITCH] = gExitList_CrenelCaves_BridgeSwitch, + [ROOM_CRENEL_CAVES_EXIT_TO_MINES] = gExitList_CrenelCaves_ExitToMines, + [ROOM_CRENEL_CAVES_GRIP_RING] = gExitList_CrenelCaves_GripRing, + [ROOM_CRENEL_CAVES_FAIRY_FOUNTAIN] = gExitList_CrenelCaves_FairyFountain, + [ROOM_CRENEL_CAVES_SPINY_CHU_PUZZLE] = gExitList_CrenelCaves_SpinyChuPuzzle, + [ROOM_CRENEL_CAVES_CHUCHU_POT_CHEST] = gExitList_CrenelCaves_ChuchuPotChest, + [ROOM_CRENEL_CAVES_WATER_HEART_PIECE] = gExitList_CrenelCaves_WaterHeartPiece, + [ROOM_CRENEL_CAVES_RUPEE_FAIRY_FOUINTAIN] = gExitList_CrenelCaves_RupeeFairyFountain, + [ROOM_CRENEL_CAVES_HELMASAUR_HALLWAY] = gExitList_CrenelCaves_HelmasaurHallway, + [ROOM_CRENEL_CAVES_MUSHROOM_KEESE] = gExitList_CrenelCaves_MushroomKeese, + [ROOM_CRENEL_CAVES_LADDER_TO_SPRING_WATER] = gExitList_CrenelCaves_LadderToSpringWater, + [ROOM_CRENEL_CAVES_BOMB_BUSINESS_SCRUB] = gExitList_CrenelCaves_BombBusinessScrub, + [ROOM_CRENEL_CAVES_HERMIT] = gExitList_CrenelCaves_Hermit, + [ROOM_CRENEL_CAVES_HINT_SCRUB] = gExitList_CrenelCaves_HintScrub, + [ROOM_CRENEL_CAVES_TO_GRAYBLADE] = gExitList_CrenelCaves_ToGrayblade, +}; + +const Transition gExitList_CastorCaves_South[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x2d8, 0x398, 0x30, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CastorCaves_North[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x248, 0x48, 0x10, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x288, 0x48, 0x20, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CastorCaves_WindRuins[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xc8, 0x48, 0x30, AREA_RUINS, ROOM_RUINS_ENTRANCE, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, + 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CastorCaves_Darknut[] = { + { WARP_TYPE_AREA, 0x0, 0x68, 0x18, 0x188, 0x28, 0x0, AREA_CASTOR_DARKNUT, ROOM_CASTOR_DARKNUT_HALL, 1, + TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1a8, 0x1b8, 0x30, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CastorCaves_HeartPiece[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x3c8, 0x48, 0x30, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_CastorCaves[] = { + [ROOM_CASTOR_CAVES_SOUTH] = gExitList_CastorCaves_South, + [ROOM_CASTOR_CAVES_NORTH] = gExitList_CastorCaves_North, + [ROOM_CASTOR_CAVES_WIND_RUINS] = gExitList_CastorCaves_WindRuins, + [ROOM_CASTOR_CAVES_DARKNUT] = gExitList_CastorCaves_Darknut, + [ROOM_CASTOR_CAVES_HEART_PIECE] = gExitList_CastorCaves_HeartPiece, + [ROOM_CASTOR_CAVES_5] = gExitList_NoExitList, + [ROOM_CASTOR_CAVES_6] = gExitList_NoExitList, + [ROOM_CASTOR_CAVES_7] = gExitList_NoExitList, +}; + +const Transition gExitList_CastorDarknut_Main[] = { + TransitionListEnd, +}; +const Transition gExitList_CastorDarknut_Hall[] = { + { WARP_TYPE_AREA, 0x0, 0x188, 0x18, 0x68, 0x28, 0x0, AREA_CASTOR_CAVES, ROOM_CASTOR_CAVES_DARKNUT, 1, + TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_CastorDarknut[] = { + [ROOM_CASTOR_DARKNUT_MAIN] = gExitList_CastorDarknut_Main, + [ROOM_CASTOR_DARKNUT_HALL] = gExitList_CastorDarknut_Hall, + NULL, + NULL, +}; + +const Transition gExitList_ArmosInteriors_RuinsEntranceNorth[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x78, 0xf8, 0x30, AREA_RUINS, ROOM_RUINS_ENTRANCE, 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, + 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_ArmosInteriors_RuinsEntranceSouth[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x88, 0x1a8, 0x30, AREA_RUINS, ROOM_RUINS_ENTRANCE, 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, + 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_ArmosInteriors_RuinsLeft[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x48, 0x68, 0x30, AREA_RUINS, ROOM_RUINS_BELOW_FORTRESS_ENTRANCE, 1, + TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_ArmosInteriors_RuinsMiddleLeft[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x78, 0x68, 0x30, AREA_RUINS, ROOM_RUINS_BELOW_FORTRESS_ENTRANCE, 1, + TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_ArmosInteriors_RuinsMiddleRight[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xa8, 0x68, 0x30, AREA_RUINS, ROOM_RUINS_BELOW_FORTRESS_ENTRANCE, 1, + TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_ArmosInteriors_RuinsRight[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xd8, 0x68, 0x30, AREA_RUINS, ROOM_RUINS_BELOW_FORTRESS_ENTRANCE, 1, + TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_ArmosInteriors_6[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x108, 0x68, 0x30, AREA_RUINS, ROOM_RUINS_BELOW_FORTRESS_ENTRANCE, 1, + TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_ArmosInteriors_RuinsGrassPath[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xa8, 0xa8, 0x30, AREA_RUINS, ROOM_RUINS_FORTRESS_ENTRANCE, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_ArmosInteriors_8[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xc8, 0x58, 0x30, AREA_RUINS, ROOM_RUINS_ENTRANCE, 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, + 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_ArmosInteriors_FortressOfWindsLeft[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xc8, 0x58, 0x30, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_EAST_KEY_LEVER, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_ArmosInteriors_FortressOfWindsRight[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xc8, 0x58, 0x30, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_EAST_KEY_LEVER, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_ArmosInteriors[] = { + [ROOM_ARMOS_INTERIORS_RUINS_ENTRANCE_NORTH] = gExitList_ArmosInteriors_RuinsEntranceNorth, + [ROOM_ARMOS_INTERIORS_RUINS_ENTRANCE_SOUTH] = gExitList_ArmosInteriors_RuinsEntranceSouth, + [ROOM_ARMOS_INTERIORS_RUINS_LEFT] = gExitList_ArmosInteriors_RuinsLeft, + [ROOM_ARMOS_INTERIORS_RUINS_MIDDLE_LEFT] = gExitList_ArmosInteriors_RuinsMiddleLeft, + [ROOM_ARMOS_INTERIORS_RUINS_MIDDLE_RIGHT] = gExitList_ArmosInteriors_RuinsMiddleRight, + [ROOM_ARMOS_INTERIORS_RUINS_RIGHT] = gExitList_ArmosInteriors_RuinsRight, + [ROOM_ARMOS_INTERIORS_6] = gExitList_ArmosInteriors_6, + [ROOM_ARMOS_INTERIORS_RUINS_GRASS_PATH] = gExitList_ArmosInteriors_RuinsGrassPath, + [ROOM_ARMOS_INTERIORS_8] = gExitList_ArmosInteriors_8, + [ROOM_ARMOS_INTERIORS_FORTRESS_LEFT] = gExitList_ArmosInteriors_FortressOfWindsLeft, + [ROOM_ARMOS_INTERIORS_FORTRESS_RIGHT] = gExitList_ArmosInteriors_FortressOfWindsRight, +}; + +const Transition gExitList_TownMinishHoles_MayorsHouse[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x38, 0x2c, 0x30, AREA_HOUSE_INTERIORS_1, ROOM_HOUSE_INTERIORS_1_MAYOR, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TownMinishHoles_WestOracle[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xc, 0x38, 0xc, AREA_HOUSE_INTERIORS_2, ROOM_HOUSE_INTERIORS_2_WEST_ORACLE, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x2, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TownMinishHoles_DrLeft[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xa8, 0x44, 0x30, AREA_HOUSE_INTERIORS_2, ROOM_HOUSE_INTERIORS_2_DR_LEFT, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TownMinishHoles_Carpenter[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xc, 0x68, 0xc, AREA_HOUSE_INTERIORS_4, ROOM_HOUSE_INTERIORS_4_CARPENTER, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x2, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TownMinishHoles_Cafe[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xcc, 0x48, 0xc0, AREA_HOUSE_INTERIORS_3, ROOM_HOUSE_INTERIORS_3_CAFE, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x6, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TownMinishHoles_LibraryBookshelf[] = { + { WARP_TYPE_AREA, 0x0, 0x100, 0xc8, 0x78, 0xc0, 0x0, AREA_TOWN_MINISH_HOLES, + ROOM_TOWN_MINISH_HOLES_LIBRARY_BOOKS_HOUSE, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x3e, 0x3c, 0x10, AREA_HOUSE_INTERIORS_1, ROOM_HOUSE_INTERIORS_1_LIBRARY_2F, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x54, 0x3c, 0x20, AREA_HOUSE_INTERIORS_1, ROOM_HOUSE_INTERIORS_1_LIBRARY_2F, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TownMinishHoles_LibrariBookHouse[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xf8, 0xd8, 0x30, AREA_TOWN_MINISH_HOLES, ROOM_TOWN_MINISH_HOLES_LIBRARY_BOOKSHELF, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TownMinishHoles_RemShoeShop[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x74, 0x64, 0x30, AREA_HOUSE_INTERIORS_3, ROOM_HOUSE_INTERIORS_3_REM_SHOE_SHOP, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_TownMinishHoles[] = { + [ROOM_TOWN_MINISH_HOLES_MAYORS_HOUSE] = gExitList_TownMinishHoles_MayorsHouse, + [ROOM_TOWN_MINISH_HOLES_WEST_ORACLE] = gExitList_TownMinishHoles_WestOracle, + [ROOM_TOWN_MINISH_HOLES_DR_LEFT] = gExitList_TownMinishHoles_DrLeft, + [ROOM_TOWN_MINISH_HOLES_CARPENTER] = gExitList_TownMinishHoles_Carpenter, + [ROOM_TOWN_MINISH_HOLES_CAFE] = gExitList_TownMinishHoles_Cafe, + [ROOM_TOWN_MINISH_HOLES_5] = gExitList_NoExitList, + [ROOM_TOWN_MINISH_HOLES_6] = gExitList_NoExitList, + [ROOM_TOWN_MINISH_HOLES_7] = gExitList_NoExitList, + [ROOM_TOWN_MINISH_HOLES_8] = gExitList_NoExitList, + [ROOM_TOWN_MINISH_HOLES_9] = gExitList_NoExitList, + [ROOM_TOWN_MINISH_HOLES_a] = gExitList_NoExitList, + [ROOM_TOWN_MINISH_HOLES_b] = gExitList_NoExitList, + [ROOM_TOWN_MINISH_HOLES_c] = gExitList_NoExitList, + [ROOM_TOWN_MINISH_HOLES_d] = gExitList_NoExitList, + [ROOM_TOWN_MINISH_HOLES_e] = gExitList_NoExitList, + [ROOM_TOWN_MINISH_HOLES_f] = gExitList_NoExitList, + [ROOM_TOWN_MINISH_HOLES_LIBRARY_BOOKSHELF] = gExitList_TownMinishHoles_LibraryBookshelf, + [ROOM_TOWN_MINISH_HOLES_LIBRARY_BOOKS_HOUSE] = gExitList_TownMinishHoles_LibrariBookHouse, + [ROOM_TOWN_MINISH_HOLES_REM_SHOE_SHOP] = gExitList_TownMinishHoles_RemShoeShop, + [ROOM_TOWN_MINISH_HOLES_13] = gExitList_NoExitList, +}; + +const Transition gExitList_MinishRafters_Cafe[] = { + { WARP_TYPE_AREA, 0x0, 0x38, 0x18, 0x48, 0x2c, 0x0, AREA_HOUSE_INTERIORS_3, ROOM_HOUSE_INTERIORS_3_CAFE, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1bc, 0x2b4, 0xc, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 2, TRANSITION_TYPE_INSTANT_MINISH, + 0x2, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishRafters_Stockwell[] = { + { WARP_TYPE_AREA, 0x0, 0x198, 0x18, 0xac, 0x2c, 0x0, AREA_HOUSE_INTERIORS_3, ROOM_HOUSE_INTERIORS_3_STOCKWELL_SHOP, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x238, 0x2b4, 0xc0, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 2, TRANSITION_TYPE_INSTANT_MINISH, + 0x6, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishRafters_DrLeft[] = { + { WARP_TYPE_AREA, 0x0, 0xe8, 0x18, 0x88, 0x2c, 0x0, AREA_HOUSE_INTERIORS_2, ROOM_HOUSE_INTERIORS_2_DR_LEFT, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishRafters_Bakery[] = { + { WARP_TYPE_AREA, 0x0, 0x48, 0x18, 0x48, 0x2c, 0x0, AREA_HOUSE_INTERIORS_3, ROOM_HOUSE_INTERIORS_3_BAKERY, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x148, 0x18, 0x88, 0x2c, 0x0, AREA_HOUSE_INTERIORS_3, ROOM_HOUSE_INTERIORS_3_BAKERY, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_MinishRafters[] = { + [ROOM_MINISH_RAFTERS_CAFE] = gExitList_MinishRafters_Cafe, + [ROOM_MINISH_RAFTERS_STOCKWELL] = gExitList_MinishRafters_Stockwell, + [ROOM_MINISH_RAFTERS_DR_LEFT] = gExitList_MinishRafters_DrLeft, + [ROOM_MINISH_RAFTERS_BAKERY] = gExitList_MinishRafters_Bakery, +}; + +const Transition gExitList_GoronCave_Stairs[] = { + { WARP_TYPE_AREA, 0x0, 0x78, 0x38, 0x78, 0x278, 0x0, AREA_GORON_CAVE, ROOM_GORON_CAVE_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x88, 0x368, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_LON_LON_RANCH, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_GoronCave_Main[] = { + { WARP_TYPE_AREA, 0x0, 0x78, 0x288, 0x78, 0x48, 0x0, AREA_GORON_CAVE, ROOM_GORON_CAVE_STAIRS, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_GoronCave[] = { + [ROOM_GORON_CAVE_STAIRS] = gExitList_GoronCave_Stairs, + [ROOM_GORON_CAVE_MAIN] = gExitList_GoronCave_Main, +}; + +const Transition gExitList_WindTribeTower_Entrance[] = { + { WARP_TYPE_AREA, 0x0, 0x88, 0xe8, 0xb8, 0xf8, 0x0, AREA_WIND_TRIBE_TOWER, ROOM_WIND_TRIBE_TOWER_FLOOR_1, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1e8, 0x168, 0x30, AREA_CLOUD_TOPS, ROOM_CLOUD_TOPS_CLOUD_TOPS, 1, + TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_WindTribeTower_Floor2[] = { + { WARP_TYPE_AREA, 0x0, 0xb8, 0xe8, 0x88, 0xf8, 0x0, AREA_WIND_TRIBE_TOWER, ROOM_WIND_TRIBE_TOWER_ENTRANCE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x88, 0xe8, 0xb8, 0xf8, 0x0, AREA_WIND_TRIBE_TOWER, ROOM_WIND_TRIBE_TOWER_FLOOR_2, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_WindTribeTower_Floor3[] = { + { WARP_TYPE_AREA, 0x0, 0xb8, 0xe8, 0x88, 0xf8, 0x0, AREA_WIND_TRIBE_TOWER, ROOM_WIND_TRIBE_TOWER_FLOOR_1, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x88, 0xe8, 0xb8, 0xf8, 0x0, AREA_WIND_TRIBE_TOWER, ROOM_WIND_TRIBE_TOWER_FLOOR_3, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_WindTribeTower_Floor4[] = { + { WARP_TYPE_AREA, 0x0, 0xb8, 0xe8, 0x88, 0xf8, 0x0, AREA_WIND_TRIBE_TOWER, ROOM_WIND_TRIBE_TOWER_FLOOR_2, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x88, 0xe8, 0xb8, 0x148, 0x0, AREA_WIND_TRIBE_TOWER_ROOF, ROOM_WIND_TRIBE_TOWER_ROOF_0, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_WindTribeTower[] = { + [ROOM_WIND_TRIBE_TOWER_ENTRANCE] = gExitList_WindTribeTower_Entrance, + [ROOM_WIND_TRIBE_TOWER_FLOOR_1] = gExitList_WindTribeTower_Floor2, + [ROOM_WIND_TRIBE_TOWER_FLOOR_2] = gExitList_WindTribeTower_Floor3, + [ROOM_WIND_TRIBE_TOWER_FLOOR_3] = gExitList_WindTribeTower_Floor4, +}; + +const Transition gExitList_WindTribeTowerRoof_Main[] = { + { WARP_TYPE_AREA, 0x0, 0xb8, 0x138, 0x88, 0xf8, 0x0, AREA_WIND_TRIBE_TOWER, ROOM_WIND_TRIBE_TOWER_FLOOR_3, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_WindTribeTowerRoof[] = { + [ROOM_WIND_TRIBE_TOWER_ROOF_0] = gExitList_WindTribeTowerRoof_Main, +}; + +const Transition gExitList_Caves_Boomerang[] = { + { WARP_TYPE_AREA, 0x0, 0x48, 0x68, 0x78, 0x38, 0x0, AREA_TREE_INTERIORS, ROOM_TREE_INTERIORS_BOOMERANG_NORTHWEST, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x108, 0x68, 0x78, 0x38, 0x0, AREA_TREE_INTERIORS, ROOM_TREE_INTERIORS_BOOMERANG_NORTHEAST, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x48, 0xd8, 0x78, 0x38, 0x0, AREA_TREE_INTERIORS, ROOM_TREE_INTERIORS_BOOMERANG_SOUTHWEST, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x108, 0xd8, 0x78, 0x38, 0x0, AREA_TREE_INTERIORS, ROOM_TREE_INTERIORS_BOOMERANG_SOUTHEAST, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xa8, 0xb8, 0x1f8, 0x138, 0x0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Caves_ToGraveyard[] = { + { WARP_TYPE_AREA, 0x0, 0x38, 0x38, 0x88, 0xd8, 0x0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x118, 0x38, 0x118, 0xd8, 0x0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x138, 0x98, 0x78, 0x48, 0x0, AREA_CAVES, ROOM_CAVES_HEART_PIECE_HALLWAY, 1, + TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x108, 0x148, 0x20, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Caves_2[] = { + { WARP_TYPE_AREA, 0x0, 0x48, 0x28, 0x308, 0x98, 0x0, AREA_CASTLE_GARDEN, ROOM_CASTLE_GARDEN_MAIN, 1, + TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Caves_3[] = { + TransitionListEnd, +}; +const Transition gExitList_Caves_4[] = { + TransitionListEnd, +}; +const Transition gExitList_Caves_5[] = { + TransitionListEnd, +}; +const Transition gExitList_Caves_TrilbyKeeseChest[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x88, 0x238, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_TRILBY_HIGHLANDS, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Caves_TrilbyFairyFountain[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x198, 0x2c8, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_TRILBY_HIGHLANDS, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Caves_SouthHyruleFieldFairyFountain[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x118, 0xb8, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_SOUTH_HYRULE_FIELD, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Caves_A[] = { + TransitionListEnd, +}; +const Transition gExitList_Caves_HyruleTownWaterfall[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xf0, 0x198, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Caves_LonLonRanch[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xe8, 0x1c8, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_LON_LON_RANCH, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xb8, 0x138, 0x3, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_LON_LON_RANCH, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Caves_TrilbyHighlands[] = { + { WARP_TYPE_AREA, 0x0, 0x38, 0x18, 0x98, 0x268, 0x0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_TRILBY_HIGHLANDS, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x128, 0x18, 0x118, 0x268, 0x0, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_TRILBY_HIGHLANDS, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Caves_LonLonRanchWallet[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1f8, 0x218, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_LON_LON_RANCH, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Caves_SouthHyruleFieldRupee[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x58, 0x128, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_SOUTH_HYRULE_FIELD, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Caves_TrilbyRupee[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x38, 0x2b8, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_TRILBY_HIGHLANDS, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Caves_TrilbyMittsFairyFountain[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1a8, 0x68, 0x3, AREA_DIG_CAVES, ROOM_DIG_CAVES_TRILBY_HIGHLANDS, 1, + TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Caves_HillsKeeseChest[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xa8, 0xa8, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_EASTERN_HILLLS_CENTER, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Caves_BottleBusinessScrub[] = { + TransitionListEnd, +}; +const Transition gExitList_Caves_HeartPieceHallway[] = { + { WARP_TYPE_AREA, 0x0, 0x78, 0x38, 0x138, 0x88, 0x0, AREA_CAVES, ROOM_CAVES_TO_GRAVEYARD, 1, TRANSITION_TYPE_NORMAL, 0x0, + 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x138, 0x1f8, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_NORTH_HYRULE_FIELD, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Caves_NorthHyruleFieldFairyFountain[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x78, 0x58, 0x30, AREA_TREE_INTERIORS, + ROOM_TREE_INTERIORS_NORTH_HYRULE_FIELD_FAIRY_FOUNTAIN, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Caves_KinstoneBusinessScrub[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x78, 0x58, 0x30, AREA_TREE_INTERIORS, + ROOM_TREE_INTERIORS_MINISH_WOODS_BUSINESS_SCRUB, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_Caves[] = { + [ROOM_CAVES_BOOMERANG] = gExitList_Caves_Boomerang, + [ROOM_CAVES_TO_GRAVEYARD] = gExitList_Caves_ToGraveyard, + [ROOM_CAVES_2] = gExitList_Caves_2, + [ROOM_CAVES_3] = gExitList_Caves_3, + [ROOM_CAVES_4] = gExitList_Caves_4, + [ROOM_CAVES_5] = gExitList_Caves_5, + [ROOM_CAVES_6] = gExitList_NoExitList, + [ROOM_CAVES_TRILBY_KEESE_CHEST] = gExitList_Caves_TrilbyKeeseChest, + [ROOM_CAVES_TRILBY_FAIRY_FOUNTAIN] = gExitList_Caves_TrilbyFairyFountain, + [ROOM_CAVES_SOUTH_HYRULE_FIELD_FAIRY_FOUNTAIN] = gExitList_Caves_SouthHyruleFieldFairyFountain, + [ROOM_CAVES_a] = gExitList_Caves_A, + [ROOM_CAVES_HYRULE_TOWN_WATERFALL] = gExitList_Caves_HyruleTownWaterfall, + [ROOM_CAVES_LON_LON_RANCH] = gExitList_Caves_LonLonRanch, + [ROOM_CAVES_LON_LON_RANCH_SECRET] = gExitList_NoExitList, + [ROOM_CAVES_TRILBY_HIGHLANDS] = gExitList_Caves_TrilbyHighlands, + [ROOM_CAVES_LON_LON_RANCH_WALLET] = gExitList_Caves_LonLonRanchWallet, + [ROOM_CAVES_SOUTH_HYRULE_FIELD_RUPEE] = gExitList_Caves_SouthHyruleFieldRupee, + [ROOM_CAVES_TRILBY_RUPEE] = gExitList_Caves_TrilbyRupee, + [ROOM_CAVES_TRILBY_MITTS_FAIRY_FOUNTAIN] = gExitList_Caves_TrilbyMittsFairyFountain, + [ROOM_CAVES_HILLS_KEESE_CHEST] = gExitList_Caves_HillsKeeseChest, + [ROOM_CAVES_BOTTLE_BUSINESS_SCRUB] = gExitList_Caves_BottleBusinessScrub, + [ROOM_CAVES_HEART_PIECE_HALLWAY] = gExitList_Caves_HeartPieceHallway, + [ROOM_CAVES_NORTH_HYRULE_FIELD_FAIRY_FOUNTAIN] = gExitList_Caves_NorthHyruleFieldFairyFountain, + [ROOM_CAVES_KINSTONE_BUSINESS_SCRUB] = gExitList_Caves_KinstoneBusinessScrub, +}; + +const Transition gExitList_VeilFallsCaves_Hallway2F[] = { + { WARP_TYPE_AREA, 0x0, 0xd8, 0x28, 0x78, 0x28, 0x0, AREA_VEIL_FALLS_CAVES, ROOM_VEIL_FALLS_CAVES_HALLWAY_1F, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xa8, 0x38, 0x10, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 1, TRANSITION_TYPE_NORMAL, 0x4, + 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x158, 0x38, 0x20, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 1, TRANSITION_TYPE_NORMAL, 0x4, + 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_VeilFallsCaves_Hallway1F[] = { + { WARP_TYPE_AREA, 0x0, 0x38, 0x18, 0x98, 0x28, 0x0, AREA_VEIL_FALLS_CAVES, ROOM_VEIL_FALLS_CAVES_HALLWAY_RUPEE_PATH, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x78, 0x18, 0xd8, 0x38, 0x0, AREA_VEIL_FALLS_CAVES, ROOM_VEIL_FALLS_CAVES_HALLWAY_2F, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xb8, 0x8c, 0x118, 0x58, 0x0, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x38, 0xe8, 0xc8, 0x58, 0x0, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 1, TRANSITION_TYPE_NORMAL, 0x0, + 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_VeilFallsCaves_Entrance[] = { + { WARP_TYPE_AREA, 0x0, 0x128, 0x18, 0x58, 0x28, 0x0, AREA_VEIL_FALLS_CAVES, ROOM_VEIL_FALLS_CAVES_EXIT, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x38, 0x1f8, 0x30, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 1, TRANSITION_TYPE_NORMAL, 0x4, + 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_VeilFallsCaves_Exit[] = { + { WARP_TYPE_AREA, 0x0, 0x58, 0x18, 0x128, 0x28, 0x0, AREA_VEIL_FALLS_CAVES, ROOM_VEIL_FALLS_CAVES_ENTRANCE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xd8, 0x1d8, 0x30, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 1, TRANSITION_TYPE_NORMAL, 0x4, + 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_VeilFallsCaves_SecretChest[] = { + { WARP_TYPE_AREA, 0x0, 0x58, 0x38, 0x98, 0x48, 0x0, AREA_VEIL_FALLS_CAVES, + ROOM_VEIL_FALLS_CAVES_HALLWAY_SECRET_STAIRCASE, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_VeilFallsCaves_SecretStaircases[] = { + { WARP_TYPE_AREA, 0x0, 0x58, 0x38, 0x98, 0x48, 0x0, AREA_VEIL_FALLS_CAVES, ROOM_VEIL_FALLS_CAVES_HALLWAY_BLOCK_PUZZLE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x98, 0x38, 0x58, 0x48, 0x0, AREA_VEIL_FALLS_CAVES, ROOM_VEIL_FALLS_CAVES_SECRET_CHEST, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_VeilFallsCaves_BlockPuzzle[] = { + { WARP_TYPE_AREA, 0x0, 0x98, 0x38, 0x58, 0x48, 0x0, AREA_VEIL_FALLS_CAVES, + ROOM_VEIL_FALLS_CAVES_HALLWAY_SECRET_STAIRCASE, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xd8, 0x158, 0x30, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 1, TRANSITION_TYPE_NORMAL, 0x4, + 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_VeilFallsCaves_RupeePath[] = { + { WARP_TYPE_AREA, 0x0, 0x98, 0x18, 0x38, 0x28, 0x0, AREA_VEIL_FALLS_CAVES, ROOM_VEIL_FALLS_CAVES_HALLWAY_1F, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xa8, 0xd8, 0x30, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 1, TRANSITION_TYPE_NORMAL, 0x4, + 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_VeilFallsCaves_HeartPiece[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x38, 0x38, 0x30, AREA_VEIL_FALLS, ROOM_VEIL_FALLS_MAIN, 1, TRANSITION_TYPE_NORMAL, 0x4, + 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_VeilFallsCaves[] = { + [ROOM_VEIL_FALLS_CAVES_HALLWAY_2F] = gExitList_VeilFallsCaves_Hallway2F, + [ROOM_VEIL_FALLS_CAVES_HALLWAY_1F] = gExitList_VeilFallsCaves_Hallway1F, + [ROOM_VEIL_FALLS_CAVES_HALLWAY_SECRET_ROOM] = gExitList_NoExitList, + [ROOM_VEIL_FALLS_CAVES_ENTRANCE] = gExitList_VeilFallsCaves_Entrance, + [ROOM_VEIL_FALLS_CAVES_EXIT] = gExitList_VeilFallsCaves_Exit, + [ROOM_VEIL_FALLS_CAVES_SECRET_CHEST] = gExitList_VeilFallsCaves_SecretChest, + [ROOM_VEIL_FALLS_CAVES_HALLWAY_SECRET_STAIRCASE] = gExitList_VeilFallsCaves_SecretStaircases, + [ROOM_VEIL_FALLS_CAVES_HALLWAY_BLOCK_PUZZLE] = gExitList_VeilFallsCaves_BlockPuzzle, + [ROOM_VEIL_FALLS_CAVES_HALLWAY_RUPEE_PATH] = gExitList_VeilFallsCaves_RupeePath, + [ROOM_VEIL_FALLS_CAVES_HALLWAY_HEART_PIECE] = gExitList_VeilFallsCaves_HeartPiece, + [ROOM_VEIL_FALLS_CAVES_a] = gExitList_NoExitList, + [ROOM_VEIL_FALLS_CAVES_b] = gExitList_NoExitList, + [ROOM_VEIL_FALLS_CAVES_c] = gExitList_NoExitList, + [ROOM_VEIL_FALLS_CAVES_d] = gExitList_NoExitList, + [ROOM_VEIL_FALLS_CAVES_e] = gExitList_NoExitList, + [ROOM_VEIL_FALLS_CAVES_f] = gExitList_NoExitList, +}; + +const Transition gExitList_RoyalValleyGraves_HeartPiece[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x58, 0x98, 0x30, AREA_ROYAL_VALLEY, ROOM_ROYAL_VALLEY_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_RoyalValleyGraves_Gina[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x188, 0x98, 0x30, AREA_ROYAL_VALLEY, ROOM_ROYAL_VALLEY_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_RoyalValleyGraves[] = { + [ROOM_ROYAL_VALLEY_GRAVES_HEART_PIECE] = gExitList_RoyalValleyGraves_HeartPiece, + [ROOM_ROYAL_VALLEY_GRAVES_GINA] = gExitList_RoyalValleyGraves_Gina, +}; + +const Transition gExitList_MinishCaves_BeanPesto[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1c8, 0x28, 0x30, AREA_MT_CRENEL, ROOM_MT_CRENEL_ENTRANCE, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishCaves_SoutheastWater1[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x3b8, 0x308, 0x30, AREA_CASTOR_WILDS, ROOM_CASTOR_WILDS_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishCaves_Ruins[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x38, 0x14, 0x30, AREA_RUINS, ROOM_RUINS_LADDER_TO_TEKTITES, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishCaves_OutsideLinksHouse[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x178, 0xe8, 0x30, AREA_HYRULE_FIELD, ROOM_HYRULE_FIELD_SOUTH_HYRULE_FIELD, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishCaves_MinishWoodsNorth1[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x3b8, 0x48, 0x30, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishCaves_LakeHyliaNorth[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x2b8, 0x68, 0x30, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, + 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishCaves_LakeHyliaLibrari[] = { + { WARP_TYPE_AREA, 0x0, 0x48, 0x38, 0x98, 0x204, 0x0, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x378, 0x38, 0x1b8, 0x1c4, 0x0, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_MinishCaves_MinishWoodsSouthwest[] = { + { WARP_TYPE_AREA, 0x0, 0x58, 0x138, 0x48, 0x224, 0x0, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 1, + TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x138, 0x138, 0x68, 0x224, 0x0, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 1, + TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x218, 0x138, 0x88, 0x224, 0x0, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 1, + TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_MinishCaves[] = { + [ROOM_MINISH_CAVES_BEAN_PESTO] = gExitList_MinishCaves_BeanPesto, + [ROOM_MINISH_CAVES_SOUTHEAST_WATER_1] = gExitList_MinishCaves_SoutheastWater1, + [ROOM_MINISH_CAVES_2] = gExitList_NoExitList, + [ROOM_MINISH_CAVES_RUINS] = gExitList_MinishCaves_Ruins, + [ROOM_MINISH_CAVES_OUTSIDE_LINKS_HOUSE] = gExitList_MinishCaves_OutsideLinksHouse, + [ROOM_MINISH_CAVES_MINISH_WOODS_NORTH_1] = gExitList_MinishCaves_MinishWoodsNorth1, + [ROOM_MINISH_CAVES_6] = gExitList_NoExitList, + [ROOM_MINISH_CAVES_LAKE_HYLIA_NORTH] = gExitList_MinishCaves_LakeHyliaNorth, + [ROOM_MINISH_CAVES_LAKE_HYLIA_LIBRARI] = gExitList_MinishCaves_LakeHyliaLibrari, + [ROOM_MINISH_CAVES_MINISH_WOODS_SOUTHWEST] = gExitList_MinishCaves_MinishWoodsSouthwest, +}; + +const Transition gExitList_CastleGardenMinishHoles_East[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x308, 0x2c, 0x30, AREA_CASTLE_GARDEN, ROOM_CASTLE_GARDEN_MAIN, 1, + TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CastleGardenMinishHoles_West[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xe8, 0x2c, 0x30, AREA_CASTLE_GARDEN, ROOM_CASTLE_GARDEN_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_CastleGardenMinishHoles[] = { + [ROOM_CASTLE_GARDEN_MINISH_HOLES_0] = gExitList_CastleGardenMinishHoles_East, + [ROOM_CASTLE_GARDEN_MINISH_HOLES_1] = gExitList_CastleGardenMinishHoles_West, +}; + +const Transition gExitList_37_0[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x308, 0x2c, 0x30, AREA_CASTLE_GARDEN, ROOM_CASTLE_GARDEN_MAIN, 1, + TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_37_1[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xe8, 0x2c, 0x30, AREA_CASTLE_GARDEN, ROOM_CASTLE_GARDEN_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_37[] = { + [ROOM_37_0] = gExitList_37_0, + [ROOM_37_1] = gExitList_37_1, +}; + +const Transition gExitList_HyruleTownUnderground_Main[] = { + { WARP_TYPE_AREA, 0x0, 0x288, 0xf8, 0x338, 0x118, 0x0, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x168, 0x18, 0x78, 0x38, 0x0, AREA_HOUSE_INTERIORS_1, ROOM_HOUSE_INTERIORS_1_SCHOOL_WEST, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x48, 0xf8, 0x188, 0x208, 0x0, AREA_HYRULE_DIG_CAVES, ROOM_HYRULE_DIG_CAVES_TOWN, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x138, 0x238, 0x88, 0x50, 0x1, AREA_HYRULE_TOWN_UNDERGROUND, ROOM_HYRULE_TOWN_UNDERGROUND_1, + 1, TRANSITION_TYPE_NORMAL, 0x6, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HyruleTownUnderground_Well[] = { + { WARP_TYPE_AREA, 0x0, 0x98, 0x50, 0x148, 0x23c, 0x1, AREA_HYRULE_TOWN_UNDERGROUND, ROOM_HYRULE_TOWN_UNDERGROUND_0, + 1, TRANSITION_TYPE_NORMAL, 0x2, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x78, 0x28, 0x2f8, 0x26c, 0x0, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_HyruleTownUnderground[] = { + [ROOM_HYRULE_TOWN_UNDERGROUND_0] = gExitList_HyruleTownUnderground_Main, + [ROOM_HYRULE_TOWN_UNDERGROUND_1] = gExitList_HyruleTownUnderground_Well, +}; + +const Transition gExitList_HyruleTownMinishCaves_Entrance[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x174, 0x196, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HyruleTownMinishCaves_Entrance2[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xe2, 0x58, 0x30, AREA_HYRULE_TOWN, ROOM_HYRULE_TOWN_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_HyruleTownMinishCaves[] = { + gExitList_HyruleTownMinishCaves_Entrance, + gExitList_NoExitList, + gExitList_NoExitList, + gExitList_NoExitList, + gExitList_NoExitList, + gExitList_NoExitList, + gExitList_NoExitList, + gExitList_NoExitList, + gExitList_NoExitList, + gExitList_NoExitList, + gExitList_NoExitList, + gExitList_NoExitList, + gExitList_NoExitList, + gExitList_NoExitList, + gExitList_NoExitList, + gExitList_NoExitList, + gExitList_NoExitList, + gExitList_NoExitList, + gExitList_NoExitList, + gExitList_NoExitList, + gExitList_NoExitList, + gExitList_HyruleTownMinishCaves_Entrance2, + gExitList_NoExitList, + gExitList_NoExitList, +}; + +const Transition gExitList_GardenFountains_East[] = { + { WARP_TYPE_AREA, 0x0, 0x78, 0x88, 0x308, 0x58, 0x0, AREA_CASTLE_GARDEN, ROOM_CASTLE_GARDEN_MAIN, 1, + TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_GardenFountains_West[] = { + { WARP_TYPE_AREA, 0x0, 0x78, 0x88, 0xe8, 0x58, 0x0, AREA_CASTLE_GARDEN, ROOM_CASTLE_GARDEN_MAIN, 1, + TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_GardenFountains[] = { + [ROOM_GARDEN_FOUNTAINS_EAST] = gExitList_GardenFountains_East, + [ROOM_GARDEN_FOUNTAINS_WEST] = gExitList_GardenFountains_West, +}; + +const Transition gExitList_GreatFairies_Entrance[] = { + { WARP_TYPE_AREA, 0x0, 0x68, 0x188, 0x68, 0x58, 0x0, AREA_CASTLE_GARDEN, ROOM_CASTLE_GARDEN_MAIN, 1, + TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_GreatFairies_Exit[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x52, 0x29c, 0xc, AREA_HYRULE_CASTLE, ROOM_HYRULE_CASTLE_3, 1, TRANSITION_TYPE_NORMAL, + 0x2, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_HyruleCastleCellar[] = { + [ROOM_HYRULE_CASTLE_CELLAR_0] = gExitList_GreatFairies_Entrance, + [ROOM_HYRULE_CASTLE_CELLAR_1] = gExitList_GreatFairies_Exit, +}; + +const Transition* const gExitLists_40[] = { + gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, + gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, gExitList_NoExitList, +}; + +const Transition gExitList_DeepwoodShrine_StairsToB1[] = { + { WARP_TYPE_AREA, 0x0, 0xc8, 0x28, 0xc8, 0x38, 0x0, AREA_DEEPWOOD_SHRINE, ROOM_DEEPWOOD_SHRINE_COMPASS, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DeepwoodShrine_BluePortal[] = { +#ifdef EU + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x38, 0x30, AREA_DEEPWOOD_SHRINE, ROOM_DEEPWOOD_SHRINE_BARREL, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, +#endif + TransitionListEnd, +}; +const Transition gExitList_DeepwoodShrine_Map[] = { +#ifdef EU + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x18, 0xfff, 0xc, AREA_DEEPWOOD_SHRINE, ROOM_DEEPWOOD_SHRINE_BARREL, + 1, TRANSITION_TYPE_NORMAL, 0x2, 0x0, 0x0, 0x0, 0x0 }, +#endif + TransitionListEnd, +}; +const Transition gExitList_DeepwoodShrine_Button[] = { +#ifdef EU + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1b8, 0xfff, 0xc0, AREA_DEEPWOOD_SHRINE, ROOM_DEEPWOOD_SHRINE_BARREL, + 1, TRANSITION_TYPE_NORMAL, 0x6, 0x0, 0x0, 0x0, 0x0 }, +#endif + TransitionListEnd, +}; +const Transition gExitList_DeepwoodShrine_Lever[] = { +#ifdef EU + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x168, 0x3, AREA_DEEPWOOD_SHRINE, ROOM_DEEPWOOD_SHRINE_BARREL, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, +#endif + TransitionListEnd, +}; +const Transition gExitList_DeepwoodShrine_Barrel[] = { + { WARP_TYPE_AREA, 0x0, 0xb8, 0x88, 0x50, 0x38, 0x0, AREA_DEEPWOOD_SHRINE, ROOM_DEEPWOOD_SHRINE_INSIDE_BARREL, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x118, 0x88, 0xa0, 0x38, 0x0, AREA_DEEPWOOD_SHRINE, ROOM_DEEPWOOD_SHRINE_INSIDE_BARREL, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xb8, 0x108, 0x50, 0x70, 0x0, AREA_DEEPWOOD_SHRINE, ROOM_DEEPWOOD_SHRINE_INSIDE_BARREL, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x118, 0x108, 0xa0, 0x70, 0x0, AREA_DEEPWOOD_SHRINE, ROOM_DEEPWOOD_SHRINE_INSIDE_BARREL, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, +#ifdef EU + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0xc8, 0x3, AREA_DEEPWOOD_SHRINE, ROOM_DEEPWOOD_SHRINE_BLUE_PORTAL, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x28, 0xfff, 0xc, AREA_DEEPWOOD_SHRINE, ROOM_DEEPWOOD_SHRINE_BUTTON, + 1, TRANSITION_TYPE_NORMAL, 0x2, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x38, 0x30, AREA_DEEPWOOD_SHRINE, ROOM_DEEPWOOD_SHRINE_LEVER, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xe8, 0xfff, 0xc0, AREA_DEEPWOOD_SHRINE, ROOM_DEEPWOOD_SHRINE_MAP, 1, + TRANSITION_TYPE_NORMAL, 0x6, 0x0, 0x0, 0x0, 0x0 }, +#endif + TransitionListEnd, +}; +const Transition gExitList_DeepwoodShrine_Entrance[] = { + { WARP_TYPE_AREA, 0x0, 0x48, 0x68, 0x48, 0x78, 0x0, AREA_DEEPWOOD_SHRINE, ROOM_DEEPWOOD_SHRINE_BOSS_DOOR, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x108, 0x68, 0x108, 0x78, 0x0, AREA_DEEPWOOD_SHRINE, ROOM_DEEPWOOD_SHRINE_BOSS_DOOR, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x78, 0x64, 0x30, AREA_DEEPWOOD_SHRINE_ENTRY, ROOM_DEEPWOOD_SHRINE_ENTRY_MAIN, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DeepwoodShrine_Compass[] = { + { WARP_TYPE_AREA, 0x0, 0xc8, 0x28, 0xc8, 0x38, 0x0, AREA_DEEPWOOD_SHRINE, ROOM_DEEPWOOD_SHRINE_STAIRS_TO_B1, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DeepwoodShrineBoss_Main[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xa8, 0x8, 0x30, AREA_DEEPWOOD_SHRINE, ROOM_DEEPWOOD_SHRINE_BOSS_DOOR, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DeepwoodShrine_PreBoss[] = { + { WARP_TYPE_AREA, 0x0, 0x48, 0x68, 0x48, 0x78, 0x0, AREA_DEEPWOOD_SHRINE, ROOM_DEEPWOOD_SHRINE_ENTRANCE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x108, 0x68, 0x108, 0x78, 0x0, AREA_DEEPWOOD_SHRINE, ROOM_DEEPWOOD_SHRINE_ENTRANCE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x88, 0xd8, 0x3, AREA_DEEPWOOD_SHRINE_BOSS, ROOM_DEEPWOOD_SHRINE_BOSS_MAIN, + 1, TRANSITION_TYPE_INSTANT, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_DeepwoodShrine[] = { + [ROOM_DEEPWOOD_SHRINE_MADDERPILLAR] = gExitList_NoExitList, + [ROOM_DEEPWOOD_SHRINE_BLUE_PORTAL] = gExitList_DeepwoodShrine_BluePortal, + [ROOM_DEEPWOOD_SHRINE_STAIRS_TO_B1] = gExitList_DeepwoodShrine_StairsToB1, + [ROOM_DEEPWOOD_SHRINE_POT_BRIDGE] = gExitList_NoExitList, + [ROOM_DEEPWOOD_SHRINE_DOUBLE_STATUE] = gExitList_NoExitList, + [ROOM_DEEPWOOD_SHRINE_MAP] = gExitList_DeepwoodShrine_Map, + [ROOM_DEEPWOOD_SHRINE_BARREL] = gExitList_DeepwoodShrine_Barrel, + [ROOM_DEEPWOOD_SHRINE_BUTTON] = gExitList_DeepwoodShrine_Button, + [ROOM_DEEPWOOD_SHRINE_MULLDOZER] = gExitList_NoExitList, + [ROOM_DEEPWOOD_SHRINE_PILLARS] = gExitList_NoExitList, + [ROOM_DEEPWOOD_SHRINE_LEVER] = gExitList_DeepwoodShrine_Lever, + [ROOM_DEEPWOOD_SHRINE_ENTRANCE] = gExitList_DeepwoodShrine_Entrance, + [ROOM_DEEPWOOD_SHRINE_c] = gExitList_NoExitList, + [ROOM_DEEPWOOD_SHRINE_d] = gExitList_NoExitList, + [ROOM_DEEPWOOD_SHRINE_e] = gExitList_NoExitList, + [ROOM_DEEPWOOD_SHRINE_f] = gExitList_NoExitList, + [ROOM_DEEPWOOD_SHRINE_TORCHES] = gExitList_NoExitList, + [ROOM_DEEPWOOD_SHRINE_BOSS_KEY] = gExitList_NoExitList, + [ROOM_DEEPWOOD_SHRINE_COMPASS] = gExitList_DeepwoodShrine_Compass, + [ROOM_DEEPWOOD_SHRINE_13] = gExitList_NoExitList, + [ROOM_DEEPWOOD_SHRINE_LILY_PAD_WEST] = gExitList_NoExitList, + [ROOM_DEEPWOOD_SHRINE_LILY_PAD_EAST] = gExitList_NoExitList, + [ROOM_DEEPWOOD_SHRINE_16] = gExitList_NoExitList, + [ROOM_DEEPWOOD_SHRINE_BOSS_DOOR] = gExitList_DeepwoodShrine_PreBoss, + [ROOM_DEEPWOOD_SHRINE_18] = gExitList_NoExitList, + [ROOM_DEEPWOOD_SHRINE_19] = gExitList_NoExitList, + [ROOM_DEEPWOOD_SHRINE_1a] = gExitList_NoExitList, + [ROOM_DEEPWOOD_SHRINE_1b] = gExitList_NoExitList, + [ROOM_DEEPWOOD_SHRINE_1c] = gExitList_NoExitList, + [ROOM_DEEPWOOD_SHRINE_1d] = gExitList_NoExitList, + [ROOM_DEEPWOOD_SHRINE_1e] = gExitList_NoExitList, + [ROOM_DEEPWOOD_SHRINE_1f] = gExitList_NoExitList, + [ROOM_DEEPWOOD_SHRINE_INSIDE_BARREL] = gExitList_NoExitList, +}; + +const Transition* const gExitLists_DeepwoodShrineBoss[] = { + [ROOM_DEEPWOOD_SHRINE_BOSS_MAIN] = gExitList_DeepwoodShrineBoss_Main, +}; + +const Transition gExitList_DeepwoodShrineEntry_Main[] = { + { WARP_TYPE_AREA, 0x0, 0x78, 0x58, 0xa8, 0xd8, 0x0, AREA_DEEPWOOD_SHRINE, ROOM_DEEPWOOD_SHRINE_ENTRANCE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x88, 0x1, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1c8, 0x272, 0x30, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1d8, 0x272, 0xc, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x2, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1b8, 0x272, 0xc0, AREA_MINISH_WOODS, ROOM_MINISH_WOODS_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x6, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_DeepwoodShrineEntry[] = { + [ROOM_DEEPWOOD_SHRINE_ENTRY_MAIN] = gExitList_DeepwoodShrineEntry_Main, +}; + +const Transition gExitList_CaveOfFlames_AfterCane[] = { + { WARP_TYPE_AREA, 0x0, 0x88, 0x38, 0x1a8, 0x38, 0x0, AREA_CAVE_OF_FLAMES, ROOM_CAVE_OF_FLAMES_MINISH_SPIKES, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CaveOfFlames_Entrance[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x68, 0x88, 0x30, AREA_MT_CRENEL, ROOM_MT_CRENEL_CAVERN_OF_FLAMES_ENTRANCE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CaveOfFlames_MainCart[] = { + { WARP_TYPE_AREA, 0x0, 0x1f8, 0x38, 0x88, 0x28, 0x0, AREA_CAVE_OF_FLAMES, ROOM_CAVE_OF_FLAMES_NORTH_ENTRANCE, + 2, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CaveOfFlames_NorthEntrance[] = { + { WARP_TYPE_AREA, 0x0, 0x88, 0x18, 0x1f8, 0x48, 0x0, AREA_CAVE_OF_FLAMES, ROOM_CAVE_OF_FLAMES_MAIN_CART, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CaveOfFlames_MinishSpikes[] = { + { WARP_TYPE_AREA, 0x0, 0x1a8, 0x28, 0x88, 0x48, 0x0, AREA_CAVE_OF_FLAMES, ROOM_CAVE_OF_FLAMES_AFTER_CANE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CaveOfFlames_BeforeGleerok[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x28, 0x30, AREA_CAVE_OF_FLAMES, ROOM_CAVE_OF_FLAMES_BOSS_DOOR, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_CaveOfFlames_BossDoor[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0xc0, 0x1, AREA_CAVE_OF_FLAMES, ROOM_CAVE_OF_FLAMES_BEFORE_GLEEROK, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_CaveOfFlames[] = { + [ROOM_CAVE_OF_FLAMES_AFTER_CANE] = gExitList_CaveOfFlames_AfterCane, + [ROOM_CAVE_OF_FLAMES_SPINY_CHU] = gExitList_NoExitList, + [ROOM_CAVE_OF_FLAMES_CART_TO_SPINY_CHU] = gExitList_NoExitList, + [ROOM_CAVE_OF_FLAMES_ENTRANCE] = gExitList_CaveOfFlames_Entrance, + [ROOM_CAVE_OF_FLAMES_MAIN_CART] = gExitList_CaveOfFlames_MainCart, + [ROOM_CAVE_OF_FLAMES_NORTH_ENTRANCE] = gExitList_CaveOfFlames_NorthEntrance, + [ROOM_CAVE_OF_FLAMES_CART_WEST] = gExitList_NoExitList, + [ROOM_CAVE_OF_FLAMES_HELMASAUR_FIGHT] = gExitList_NoExitList, + [ROOM_CAVE_OF_FLAMES_ROLLOBITE_LAVA_ROOM] = gExitList_NoExitList, + [ROOM_CAVE_OF_FLAMES_MINISH_LAVA_ROOM] = gExitList_NoExitList, + [ROOM_CAVE_OF_FLAMES_a] = gExitList_NoExitList, + [ROOM_CAVE_OF_FLAMES_b] = gExitList_NoExitList, + [ROOM_CAVE_OF_FLAMES_c] = gExitList_NoExitList, + [ROOM_CAVE_OF_FLAMES_d] = gExitList_NoExitList, + [ROOM_CAVE_OF_FLAMES_e] = gExitList_NoExitList, + [ROOM_CAVE_OF_FLAMES_f] = gExitList_NoExitList, + [ROOM_CAVE_OF_FLAMES_MINISH_SPIKES] = gExitList_CaveOfFlames_MinishSpikes, + [ROOM_CAVE_OF_FLAMES_TOMPAS_DOOM] = gExitList_NoExitList, + [ROOM_CAVE_OF_FLAMES_BEFORE_GLEEROK] = gExitList_CaveOfFlames_BeforeGleerok, + [ROOM_CAVE_OF_FLAMES_BOSSKEY_PATH1] = gExitList_NoExitList, + [ROOM_CAVE_OF_FLAMES_BOSSKEY_PATH2] = gExitList_NoExitList, + [ROOM_CAVE_OF_FLAMES_COMPASS] = gExitList_NoExitList, + [ROOM_CAVE_OF_FLAMES_BOB_OMB_WALL] = gExitList_NoExitList, + [ROOM_CAVE_OF_FLAMES_BOSS_DOOR] = gExitList_CaveOfFlames_BossDoor, + [ROOM_CAVE_OF_FLAMES_18] = gExitList_NoExitList, + [ROOM_CAVE_OF_FLAMES_19] = gExitList_NoExitList, + [ROOM_CAVE_OF_FLAMES_1a] = gExitList_NoExitList, + [ROOM_CAVE_OF_FLAMES_1b] = gExitList_NoExitList, + [ROOM_CAVE_OF_FLAMES_1c] = gExitList_NoExitList, + [ROOM_CAVE_OF_FLAMES_1d] = gExitList_NoExitList, + [ROOM_CAVE_OF_FLAMES_1e] = gExitList_NoExitList, + [ROOM_CAVE_OF_FLAMES_1f] = gExitList_NoExitList, + [ROOM_CAVE_OF_FLAMES_20] = gExitList_NoExitList, +}; + +const Transition gExitList_FortressOfWinds_BeforeMazaal[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x18, 0x30, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_WEST_KEY_LEVER, + 1, TRANSITION_TYPE_INSTANT, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_FortressOfWinds_EastKeyLever[] = { + { WARP_TYPE_AREA, 0x0, 0x198, 0x198, 0x2e8, 0x38, 0x0, AREA_OUTER_FORTRESS_OF_WINDS, ROOM_OUTER_FORTRESS_OF_WINDS_3F, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x1f8, 0x198, 0x338, 0x38, 0x0, AREA_OUTER_FORTRESS_OF_WINDS, ROOM_OUTER_FORTRESS_OF_WINDS_3F, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_FortressOfWinds_PitPlatforms[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x68, 0x38, 0x30, AREA_OUTER_FORTRESS_OF_WINDS, ROOM_OUTER_FORTRESS_OF_WINDS_3F, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_FortressOfWinds_WestKeyLever[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0xc8, 0x3, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_BEFORE_MAZAAL, + 1, TRANSITION_TYPE_INSTANT, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1d8, 0x38, 0x30, AREA_OUTER_FORTRESS_OF_WINDS, ROOM_OUTER_FORTRESS_OF_WINDS_3F, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_FortressOfWinds_Mazaal[] = { + { WARP_TYPE_AREA, 0x0, 0xb8, 0x18, 0xa0, 0x18c, 0x0, AREA_FORTRESS_OF_WINDS_TOP, ROOM_FORTRESS_OF_WINDS_TOP_MAIN, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_FortressOfWinds_Stalfos[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x78, 0x38, 0x30, AREA_OUTER_FORTRESS_OF_WINDS, ROOM_OUTER_FORTRESS_OF_WINDS_2F, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_FortressOfWinds_EntranceMoleMitts[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x88, 0xb0, 0x3, AREA_OUTER_FORTRESS_OF_WINDS, + ROOM_OUTER_FORTRESS_OF_WINDS_MOLE_MITTS, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_FortressOfWinds_Main2F[] = { + { WARP_TYPE_AREA, 0x0, 0x88, 0xf8, 0x78, 0x38, 0x0, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_CENTER_STAIRS_1F, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1d8, 0xa8, 0x30, AREA_OUTER_FORTRESS_OF_WINDS, ROOM_OUTER_FORTRESS_OF_WINDS_2F, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_FortressOfWinds_MinishHole[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x68, 0xb0, 0x3, AREA_OUTER_FORTRESS_OF_WINDS, ROOM_OUTER_FORTRESS_OF_WINDS_SMALL_KEY, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_FortressOfWinds_BossKey[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x338, 0x38, 0x30, AREA_OUTER_FORTRESS_OF_WINDS, ROOM_OUTER_FORTRESS_OF_WINDS_2F, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_FortressOfWinds_WestStairs2F[] = { + { WARP_TYPE_AREA, 0x0, 0x88, 0x28, 0x68, 0x38, 0x0, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_WEST_STAIRS_1F, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_FortressOfWinds_EastStairs2F[] = { + { WARP_TYPE_AREA, 0x0, 0x88, 0x28, 0x68, 0x38, 0x0, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_EAST_STAIRS_1F, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x288, 0xa8, 0x30, AREA_OUTER_FORTRESS_OF_WINDS, ROOM_OUTER_FORTRESS_OF_WINDS_2F, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_FortressOfWinds_WestStairs1F[] = { + { WARP_TYPE_AREA, 0x0, 0x68, 0x28, 0x88, 0x38, 0x0, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_WEST_STAIRS_2F, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x128, 0x38, 0x30, AREA_OUTER_FORTRESS_OF_WINDS, + ROOM_OUTER_FORTRESS_OF_WINDS_ENTRANCE_HALL, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_FortressOfWinds_CenterStairs1F[] = { + { WARP_TYPE_AREA, 0x0, 0x78, 0x28, 0x88, 0x108, 0x0, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_MAIN_2F, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1d8, 0x38, 0x30, AREA_OUTER_FORTRESS_OF_WINDS, + ROOM_OUTER_FORTRESS_OF_WINDS_ENTRANCE_HALL, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_FortressOfWinds_EastStairs1F[] = { + { WARP_TYPE_AREA, 0x0, 0x68, 0x28, 0x88, 0x38, 0x0, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_EAST_STAIRS_2F, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x288, 0x38, 0x30, AREA_OUTER_FORTRESS_OF_WINDS, + ROOM_OUTER_FORTRESS_OF_WINDS_ENTRANCE_HALL, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_FortressOfWinds_Wizzrobe[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x78, 0x38, 0x30, AREA_OUTER_FORTRESS_OF_WINDS, + ROOM_OUTER_FORTRESS_OF_WINDS_ENTRANCE_HALL, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_FortressOfWinds_HeartPiece[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x338, 0x38, 0x30, AREA_OUTER_FORTRESS_OF_WINDS, + ROOM_OUTER_FORTRESS_OF_WINDS_ENTRANCE_HALL, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_FortressOfWinds[] = { + [ROOM_FORTRESS_OF_WINDS_DOUBLE_EYEGORE] = gExitList_NoExitList, + [ROOM_FORTRESS_OF_WINDS_BEFORE_MAZAAL] = gExitList_FortressOfWinds_BeforeMazaal, + [ROOM_FORTRESS_OF_WINDS_EAST_KEY_LEVER] = gExitList_FortressOfWinds_EastKeyLever, + [ROOM_FORTRESS_OF_WINDS_PIT_PLATFORMS] = gExitList_FortressOfWinds_PitPlatforms, + [ROOM_FORTRESS_OF_WINDS_WEST_KEY_LEVER] = gExitList_FortressOfWinds_WestKeyLever, + [ROOM_FORTRESS_OF_WINDS_5] = gExitList_NoExitList, + [ROOM_FORTRESS_OF_WINDS_6] = gExitList_NoExitList, + [ROOM_FORTRESS_OF_WINDS_7] = gExitList_NoExitList, + [ROOM_FORTRESS_OF_WINDS_8] = gExitList_NoExitList, + [ROOM_FORTRESS_OF_WINDS_9] = gExitList_NoExitList, + [ROOM_FORTRESS_OF_WINDS_a] = gExitList_NoExitList, + [ROOM_FORTRESS_OF_WINDS_b] = gExitList_NoExitList, + [ROOM_FORTRESS_OF_WINDS_c] = gExitList_NoExitList, + [ROOM_FORTRESS_OF_WINDS_d] = gExitList_NoExitList, + [ROOM_FORTRESS_OF_WINDS_e] = gExitList_NoExitList, + [ROOM_FORTRESS_OF_WINDS_f] = gExitList_NoExitList, + [ROOM_FORTRESS_OF_WINDS_DARKNUT_ROOM] = gExitList_NoExitList, + [ROOM_FORTRESS_OF_WINDS_ARROW_EYE_BRIDGE] = gExitList_NoExitList, + [ROOM_FORTRESS_OF_WINDS_NORTH_SPLIT_PATH_PIT] = gExitList_NoExitList, + [ROOM_FORTRESS_OF_WINDS_WALLMASTER_MINISH_PORTAL] = gExitList_NoExitList, + [ROOM_FORTRESS_OF_WINDS_PILLAR_CLONE_BUTTONS] = gExitList_NoExitList, + [ROOM_FORTRESS_OF_WINDS_ROTATING_SPIKE_TRAPS] = gExitList_NoExitList, + [ROOM_FORTRESS_OF_WINDS_MAZAAL] = gExitList_FortressOfWinds_Mazaal, + [ROOM_FORTRESS_OF_WINDS_STALFOS] = gExitList_FortressOfWinds_Stalfos, + [ROOM_FORTRESS_OF_WINDS_ENTRANCE_MOLE_MITTS] = gExitList_FortressOfWinds_EntranceMoleMitts, + [ROOM_FORTRESS_OF_WINDS_MAIN_2F] = gExitList_FortressOfWinds_Main2F, + [ROOM_FORTRESS_OF_WINDS_MINISH_HOLE] = gExitList_FortressOfWinds_MinishHole, + [ROOM_FORTRESS_OF_WINDS_BOSS_KEY] = gExitList_FortressOfWinds_BossKey, + [ROOM_FORTRESS_OF_WINDS_WEST_STAIRS_2F] = gExitList_FortressOfWinds_WestStairs2F, + [ROOM_FORTRESS_OF_WINDS_EAST_STAIRS_2F] = gExitList_FortressOfWinds_EastStairs2F, + [ROOM_FORTRESS_OF_WINDS_1e] = gExitList_NoExitList, + [ROOM_FORTRESS_OF_WINDS_1f] = gExitList_NoExitList, + [ROOM_FORTRESS_OF_WINDS_WEST_STAIRS_1F] = gExitList_FortressOfWinds_WestStairs1F, + [ROOM_FORTRESS_OF_WINDS_CENTER_STAIRS_1F] = gExitList_FortressOfWinds_CenterStairs1F, + [ROOM_FORTRESS_OF_WINDS_EAST_STAIRS_1F] = gExitList_FortressOfWinds_EastStairs1F, + [ROOM_FORTRESS_OF_WINDS_WIZZROBE] = gExitList_FortressOfWinds_Wizzrobe, + [ROOM_FORTRESS_OF_WINDS_HEART_PIECE] = gExitList_FortressOfWinds_HeartPiece, + [ROOM_FORTRESS_OF_WINDS_25] = gExitList_NoExitList, + [ROOM_FORTRESS_OF_WINDS_26] = gExitList_NoExitList, + [ROOM_FORTRESS_OF_WINDS_27] = gExitList_NoExitList, +}; + +const Transition gExitList_FortressOfWindsTop_Main[] = { + { WARP_TYPE_AREA, 0x0, 0xa0, 0x1a0, 0xb8, 0x28, 0x0, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_MAZAAL, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_FortressOfWindsTop[] = { + [ROOM_FORTRESS_OF_WINDS_TOP_MAIN] = gExitList_FortressOfWindsTop_Main, +}; + +const Transition gExitList_InnerMazaal_Main[] = { + { WARP_TYPE_AREA, 0x0, 0x88, 0x11c, 0xb8, 0x5c, 0x0, AREA_FORTRESS_OF_WINDS, ROOM_FORTRESS_OF_WINDS_MAZAAL, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_InnerMazaal[] = { + [ROOM_INNER_MAZAAL_MAIN] = gExitList_InnerMazaal_Main, + [ROOM_INNER_MAZAAL_PHASE_1] = gExitList_InnerMazaal_Main, +}; + +const Transition gExitList_TempleOfDroplets_WestHole[] = { + { WARP_TYPE_AREA, 0x0, 0x58, 0x28, 0x58, 0x38, 0x0, AREA_TEMPLE_OF_DROPLETS, ROOM_TEMPLE_OF_DROPLETS_BOSS_KEY, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TempleOfDroplets_EastHole[] = { + { WARP_TYPE_AREA, 0x0, 0xd8, 0x28, 0xd8, 0x38, 0x0, AREA_TEMPLE_OF_DROPLETS, ROOM_TEMPLE_OF_DROPLETS_NORTH_SMALL_KEY, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TempleOfDroplets_HoleToBlueChuchu[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x208, 0xfff, 0xc0, AREA_TEMPLE_OF_DROPLETS, ROOM_TEMPLE_OF_DROPLETS_ELEMENT, + 1, TRANSITION_TYPE_NORMAL, 0x6, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xc8, 0x28, 0x88, 0x28, 0x0, AREA_TEMPLE_OF_DROPLETS, + ROOM_TEMPLE_OF_DROPLETS_BLUE_CHU_KEY_LEVER, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TempleOfDroplets_BigBlueChuchu[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0xb8, 0x3, AREA_TEMPLE_OF_DROPLETS, ROOM_TEMPLE_OF_DROPLETS_TO_BLUE_CHU, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TempleOfDroplets_BigBlueChuchuKey[] = { + { WARP_TYPE_AREA, 0x0, 0x58, 0x28, 0xc8, 0x28, 0x0, AREA_TEMPLE_OF_DROPLETS, + ROOM_TEMPLE_OF_DROPLETS_BLUE_CHU_KEY_LEVER, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TempleOfDroplets_BossKey[] = { + { WARP_TYPE_AREA, 0x0, 0x58, 0x28, 0x58, 0x38, 0x0, AREA_TEMPLE_OF_DROPLETS, ROOM_TEMPLE_OF_DROPLETS_WEST_HOLE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TempleOfDroplets_NorthSmallKey[] = { + { WARP_TYPE_AREA, 0x0, 0xd8, 0x28, 0xd8, 0x38, 0x0, AREA_TEMPLE_OF_DROPLETS, ROOM_TEMPLE_OF_DROPLETS_EAST_HOLE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TempleOfDroplets_BlueChuchuKeyLever[] = { + { WARP_TYPE_AREA, 0x0, 0x88, 0x18, 0xc8, 0x38, 0x0, AREA_TEMPLE_OF_DROPLETS, + ROOM_TEMPLE_OF_DROPLETS_HOLE_TO_BLUE_CHU_KEY, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xc8, 0x18, 0x58, 0x38, 0x0, AREA_TEMPLE_OF_DROPLETS, ROOM_TEMPLE_OF_DROPLETS_BLUE_CHU_KEY, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TempleOfDroplets_Entrance[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x18, 0x30, AREA_TEMPLE_OF_DROPLETS, ROOM_TEMPLE_OF_DROPLETS_ELEMENT, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TempleOfDroplets_WaterfallNortheast[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x18, 0xfff, 0xc, AREA_TEMPLE_OF_DROPLETS, ROOM_TEMPLE_OF_DROPLETS_ELEMENT, + 1, TRANSITION_TYPE_NORMAL, 0x2, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TempleOfDroplets_Element[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xf8, 0xfff, 0xc0, AREA_TEMPLE_OF_DROPLETS, + ROOM_TEMPLE_OF_DROPLETS_WATERFALL_NORTHEAST, 1, TRANSITION_TYPE_NORMAL, 0x6, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x8, 0xfff, 0x4, AREA_TEMPLE_OF_DROPLETS, ROOM_TEMPLE_OF_DROPLETS_ICE_CORNER, + 1, TRANSITION_TYPE_NORMAL, 0x2, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x8, 0xfff, 0x8, AREA_TEMPLE_OF_DROPLETS, + ROOM_TEMPLE_OF_DROPLETS_HOLE_TO_BLUE_CHU_KEY, 1, TRANSITION_TYPE_NORMAL, 0x2, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x178, 0x3, AREA_TEMPLE_OF_DROPLETS, ROOM_TEMPLE_OF_DROPLETS_ENTRANCE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x28, 0x30, AREA_TEMPLE_OF_DROPLETS, ROOM_TEMPLE_OF_DROPLETS_BIG_OCTO, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TempleOfDroplets_IceCorner[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x208, 0xfff, 0xc0, AREA_TEMPLE_OF_DROPLETS, ROOM_TEMPLE_OF_DROPLETS_ELEMENT, + 1, TRANSITION_TYPE_NORMAL, 0x6, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TempleOfDroplets_BigOcto[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x178, 0x3, AREA_TEMPLE_OF_DROPLETS, ROOM_TEMPLE_OF_DROPLETS_ELEMENT, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TempleOfDroplets_NorthwestStairs[] = { + { WARP_TYPE_AREA, 0x0, 0x88, 0x18, 0x88, 0x28, 0x0, AREA_TEMPLE_OF_DROPLETS, + ROOM_TEMPLE_OF_DROPLETS_BLOCK_CLONE_ICE_BRIDGE, 2, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TempleOfDroplets_ScissorsMiniboss[] = { + { WARP_TYPE_AREA, 0x0, 0xc8, 0x18, 0xc8, 0x28, 0x0, AREA_TEMPLE_OF_DROPLETS, + ROOM_TEMPLE_OF_DROPLETS_STAIRS_TO_SCISSORS_MINIBOSS, 2, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TempleOfDroplets_WaterfallSouthwest[] = { + { WARP_TYPE_AREA, 0x0, 0x38, 0x170, 0x38, 0x18, 0x0, AREA_TEMPLE_OF_DROPLETS, ROOM_TEMPLE_OF_DROPLETS_LILYPAD_B2_WEST, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TempleOfDroplets_ToBigBlueChuchu[] = { + { WARP_TYPE_AREA, 0x0, 0x58, 0x58, 0x58, 0x68, 0x0, AREA_TEMPLE_OF_DROPLETS, ROOM_TEMPLE_OF_DROPLETS_COMPASS, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x8, 0x30, AREA_TEMPLE_OF_DROPLETS, ROOM_TEMPLE_OF_DROPLETS_BLUE_CHU, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TempleOfDroplets_BlockCloneIceBridge[] = { + { WARP_TYPE_AREA, 0x0, 0x88, 0x18, 0x88, 0x28, 0x0, AREA_TEMPLE_OF_DROPLETS, ROOM_TEMPLE_OF_DROPLETS_NORTHWEST_STAIRS, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TempleOfDroplets_StairsToScissorsMiniboss[] = { + { WARP_TYPE_AREA, 0x0, 0xc8, 0x18, 0xc8, 0x28, 0x0, AREA_TEMPLE_OF_DROPLETS, ROOM_TEMPLE_OF_DROPLETS_SCISSORS_MINIBOSS, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TempleOfDroplets_LilypadWestB2[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x38, 0x168, 0x3, AREA_TEMPLE_OF_DROPLETS, + ROOM_TEMPLE_OF_DROPLETS_WEST_WATERFALL_SOUTHWEST, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_TempleOfDroplets_CompassRoom[] = { + { WARP_TYPE_AREA, 0x0, 0x58, 0x58, 0x58, 0x68, 0x0, AREA_TEMPLE_OF_DROPLETS, ROOM_TEMPLE_OF_DROPLETS_TO_BLUE_CHU, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_TempleOfDroplets[] = { + [ROOM_TEMPLE_OF_DROPLETS_WEST_HOLE] = gExitList_TempleOfDroplets_WestHole, + [ROOM_TEMPLE_OF_DROPLETS_NORTH_SPLIT_ROOM] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_EAST_HOLE] = gExitList_TempleOfDroplets_EastHole, + [ROOM_TEMPLE_OF_DROPLETS_ENTRANCE] = gExitList_TempleOfDroplets_Entrance, + [ROOM_TEMPLE_OF_DROPLETS_NORTHWEST_STAIRS] = gExitList_TempleOfDroplets_NorthwestStairs, + [ROOM_TEMPLE_OF_DROPLETS_SCISSORS_MINIBOSS] = gExitList_TempleOfDroplets_ScissorsMiniboss, + [ROOM_TEMPLE_OF_DROPLETS_WATERFALL_NORTHWEST] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_WATERFALL_NORTHEAST] = gExitList_TempleOfDroplets_WaterfallNortheast, + [ROOM_TEMPLE_OF_DROPLETS_ELEMENT] = gExitList_TempleOfDroplets_Element, + [ROOM_TEMPLE_OF_DROPLETS_ICE_CORNER] = gExitList_TempleOfDroplets_IceCorner, + [ROOM_TEMPLE_OF_DROPLETS_ICE_PIT_MAZE] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_HOLE_TO_BLUE_CHU_KEY] = gExitList_TempleOfDroplets_HoleToBlueChuchu, + [ROOM_TEMPLE_OF_DROPLETS_WEST_WATERFALL_SOUTHEAST] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_WEST_WATERFALL_SOUTHWEST] = gExitList_TempleOfDroplets_WaterfallSouthwest, + [ROOM_TEMPLE_OF_DROPLETS_BIG_OCTO] = gExitList_TempleOfDroplets_BigOcto, + [ROOM_TEMPLE_OF_DROPLETS_TO_BLUE_CHU] = gExitList_TempleOfDroplets_ToBigBlueChuchu, + [ROOM_TEMPLE_OF_DROPLETS_BLUE_CHU] = gExitList_TempleOfDroplets_BigBlueChuchu, + [ROOM_TEMPLE_OF_DROPLETS_BLUE_CHU_KEY] = gExitList_TempleOfDroplets_BigBlueChuchuKey, + [ROOM_TEMPLE_OF_DROPLETS_12] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_13] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_14] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_15] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_16] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_17] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_18] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_19] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_1a] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_1b] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_1c] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_1d] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_1e] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_1f] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_BOSS_KEY] = gExitList_TempleOfDroplets_BossKey, + [ROOM_TEMPLE_OF_DROPLETS_NORTH_SMALL_KEY] = gExitList_TempleOfDroplets_NorthSmallKey, + [ROOM_TEMPLE_OF_DROPLETS_BLOCK_CLONE_BUTTON_PUZZLE] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_BLOCK_CLONE_PUZZLE] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_BLOCK_CLONE_ICE_BRIDGE] = gExitList_TempleOfDroplets_BlockCloneIceBridge, + [ROOM_TEMPLE_OF_DROPLETS_STAIRS_TO_SCISSORS_MINIBOSS] = gExitList_TempleOfDroplets_StairsToScissorsMiniboss, + [ROOM_TEMPLE_OF_DROPLETS_SPIKE_BAR_FLIPPER_ROOM] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_9_LANTERNS] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_LILYPAD_ICE_BLOCKS] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_29] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_MULLDOZERS_FIRE_BARS] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_DARK_MAZE] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_TWIN_MADDERPILLARS] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_AFTER_TWIN_MADDERPILLARS] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_BLUE_CHU_KEY_LEVER] = gExitList_TempleOfDroplets_BlueChuchuKeyLever, + [ROOM_TEMPLE_OF_DROPLETS_MULLDOZER_KEY] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_BEFORE_TWIN_MADDERPILLARS] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_LILYPAD_B2_WEST] = gExitList_TempleOfDroplets_LilypadWestB2, + [ROOM_TEMPLE_OF_DROPLETS_COMPASS] = gExitList_TempleOfDroplets_CompassRoom, + [ROOM_TEMPLE_OF_DROPLETS_DARK_SCISSOR_BEETLES] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_LILYPAD_B2_MIDDLE] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_ICE_MADDERPILLAR] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_FLAMEBAR_BLOCK_PUZZLE] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_37] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_38] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_39] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_3a] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_3b] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_3c] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_3d] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_3e] = gExitList_NoExitList, + [ROOM_TEMPLE_OF_DROPLETS_3f] = gExitList_NoExitList, +}; + +const Transition gExitList_61_0[] = { + { WARP_TYPE_AREA, 0x0, 0x78, 0x58, 0xa8, 0xd8, 0x0, AREA_DEEPWOOD_SHRINE, ROOM_DEEPWOOD_SHRINE_ENTRANCE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x118, 0x174, 0x30, AREA_LAKE_HYLIA, ROOM_LAKE_HYLIA_MAIN, 1, TRANSITION_TYPE_INSTANT_MINISH, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_61[] = { + [ROOM_NULL_61_0] = gExitList_61_0, +}; + +const Transition gExitList_RoyalCrypt_WaterRope[] = { + TransitionListEnd, +}; +const Transition gExitList_RoyalCrypt_Gibdo[] = { + { WARP_TYPE_AREA, 0x0, 0xa8, 0x12e, 0x128, 0x48, 0x0, AREA_ROYAL_CRYPT, ROOM_ROYAL_CRYPT_KEY_BLOCK, 1, + TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_RoyalCrypt_KeyBlock[] = { + { WARP_TYPE_AREA, 0x0, 0x128, 0x38, 0xa8, 0x118, 0x0, AREA_ROYAL_CRYPT, ROOM_ROYAL_CRYPT_GIBDO, 1, TRANSITION_TYPE_NORMAL, + 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x128, 0x16e, 0x88, 0x48, 0x0, AREA_ROYAL_CRYPT, ROOM_ROYAL_CRYPT_MUSHROOM_PIT, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_RoyalCrypt_MushroomPit[] = { + { WARP_TYPE_AREA, 0x0, 0x88, 0x38, 0x128, 0x158, 0x0, AREA_ROYAL_CRYPT, ROOM_ROYAL_CRYPT_KEY_BLOCK, 1, + TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_RoyalCrypt_Entrance[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xf0, 0x3c, 0x30, AREA_ROYAL_VALLEY, ROOM_ROYAL_VALLEY_MAIN, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_RoyalCrypt[] = { + [ROOM_ROYAL_CRYPT_0] = gExitList_NoExitList, + [ROOM_ROYAL_CRYPT_WATER_ROPE] = gExitList_RoyalCrypt_WaterRope, + [ROOM_ROYAL_CRYPT_GIBDO] = gExitList_RoyalCrypt_Gibdo, + [ROOM_ROYAL_CRYPT_3] = gExitList_NoExitList, + [ROOM_ROYAL_CRYPT_KEY_BLOCK] = gExitList_RoyalCrypt_KeyBlock, + [ROOM_ROYAL_CRYPT_5] = gExitList_NoExitList, + [ROOM_ROYAL_CRYPT_6] = gExitList_NoExitList, + [ROOM_ROYAL_CRYPT_MUSHROOM_PIT] = gExitList_RoyalCrypt_MushroomPit, + [ROOM_ROYAL_CRYPT_ENTRANCE] = gExitList_RoyalCrypt_Entrance, +}; + +const Transition gExitList_PalaceOfWinds_GyorgTornado[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x18, 0x30, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_GYORG_BOSS_DOOR, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_PalaceOfWinds_GyorgBossDoor[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x1c8, 0x3, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_GYORG_TORNADO, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_PalaceOfWinds_BallAndChainSoldiers[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x18, 0x30, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_HOLE_TO_DARKNUT, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_PalaceOfWinds_BombarossaPath[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x18, 0x30, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_TO_BOMBAROSSA_PATH, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_PalaceOfWinds_HoleToDarknut[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x128, 0x3, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_BALL_AND_CHAIN_SOLDIERS, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_PalaceOfWinds_ToBombarossaPath[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x88, 0x3, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_BOMBAROSSA_PATH, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x18, 0xfff, 0xc, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_BOMB_WALL_OUTSIDE, + 1, TRANSITION_TYPE_NORMAL, 0x2, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_PalaceOfWinds_BombWallInside[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x18, 0xfff, 0xc, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_BOMB_WALL_OUTSIDE, + 1, TRANSITION_TYPE_NORMAL, 0x2, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x38, 0x38, 0x218, 0xe8, 0x0, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_RED_WARP_HALL, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_PalaceOfWinds_BombWallOutside[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xc8, 0xfff, 0x40, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_TO_BOMBAROSSA_PATH, + 1, TRANSITION_TYPE_NORMAL, 0x6, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xc8, 0xfff, 0x80, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_BOMB_WALL_INSIDE, + 1, TRANSITION_TYPE_NORMAL, 0x6, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_PalaceOfWinds_BlockMazeToBossDoor[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x18, 0x30, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_RED_WARP_HALL, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_PalaceOfWinds_HeartPieceBridge[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x18, 0x30, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_RED_WARP_HALL, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_PalaceOfWinds_RedWarpHall[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x88, 0x1, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_HEART_PIECE_BRIDGE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x1c8, 0x2, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_BLOCK_MAZE_TO_BOSS_DOOR, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xb8, 0xd8, 0xb8, 0x48, 0x0, AREA_PALACE_OF_WINDS, + ROOM_PALACE_OF_WINDS_STAIRS_AFTER_FLOORMASTER, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x218, 0xd8, 0x38, 0x48, 0x0, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_BOMB_WALL_INSIDE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_PalaceOfWinds_PitCornerAfterKey[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xd8, 0xfff, 0xc0, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_KEY_ARROW_BUTTON, + 1, TRANSITION_TYPE_NORMAL, 0x6, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_PalaceOfWinds_PotPush[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x78, 0x1, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_KEY_ARROW_BUTTON, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_PalaceOfWinds_StairsAfterFloormaster[] = { + { WARP_TYPE_AREA, 0x0, 0xb8, 0x38, 0xb8, 0xe8, 0x0, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_RED_WARP_HALL, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_PalaceOfWinds_KeyArrowButton[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x10, 0xfff, 0xc, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_PIT_CORNER_AFTER_KEY, + 1, TRANSITION_TYPE_NORMAL, 0x2, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x28, 0x30, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_POT_PUSH, + 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x38, 0x38, 0x38, 0x48, 0x0, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_GIBDO_STAIRS, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_PalaceOfWinds_PeahatSwitch[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x88, 0x3, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_TO_PEAHAT_SWITCH, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_PalaceOfWinds_WhirlwindBombarossa[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x88, 0x3, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_GIBDO_STAIRS, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_PalaceOfWinds_ToPeahatSwitch[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x18, 0x30, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_PEAHAT_SWITCH, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xb8, 0x38, 0xb8, 0xe8, 0x0, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_DARK_COMPASS_HALL, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_PalaceOfWinds_GibdoStairs[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xfff, 0x18, 0x30, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_WHIRLWIND_BOMBAROSSA, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x38, 0x38, 0x38, 0x48, 0x0, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_KEY_ARROW_BUTTON, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_PalaceOfWinds_BridgeAfterDarknut[] = { + { WARP_TYPE_AREA, 0x0, 0x78, 0x18, 0x168, 0x118, 0x0, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_DARK_COMPASS_HALL, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_PalaceOfWinds_DarkCompassHall[] = { + { WARP_TYPE_AREA, 0x0, 0x168, 0x130, 0x78, 0x28, 0x0, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_BRIDGE_AFTER_DARKNUT, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xb8, 0xd8, 0xb8, 0x48, 0x0, AREA_PALACE_OF_WINDS, ROOM_PALACE_OF_WINDS_TO_PEAHAT_SWITCH, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_PalaceOfWinds[] = { + [ROOM_PALACE_OF_WINDS_GYORG_TORNADO] = gExitList_PalaceOfWinds_GyorgTornado, + [ROOM_PALACE_OF_WINDS_BOSS_KEY] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_BEFORE_BALL_AND_CHAIN_SOLDIERS] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_GYORG_BOSS_DOOR] = gExitList_PalaceOfWinds_GyorgBossDoor, + [ROOM_PALACE_OF_WINDS_EAST_CHEST_FROM_GYORG_BOSS_DOOR] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_MOBLIN_AND_WIZZROBE_FIGHT] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_FOUR_BUTTON_STALFOS] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_FAN_AND_KEY_TO_BOSS_KEY] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_BALL_AND_CHAIN_SOLDIERS] = gExitList_PalaceOfWinds_BallAndChainSoldiers, + [ROOM_PALACE_OF_WINDS_BOMBAROSSA_PATH] = gExitList_PalaceOfWinds_BombarossaPath, + [ROOM_PALACE_OF_WINDS_HOLE_TO_DARKNUT] = gExitList_PalaceOfWinds_HoleToDarknut, + [ROOM_PALACE_OF_WINDS_TO_BOMBAROSSA_PATH] = gExitList_PalaceOfWinds_ToBombarossaPath, + [ROOM_PALACE_OF_WINDS_DARKNUT_MINIBOSS] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_BOMB_WALL_INSIDE] = gExitList_PalaceOfWinds_BombWallInside, + [ROOM_PALACE_OF_WINDS_BOMB_WALL_OUTSIDE] = gExitList_PalaceOfWinds_BombWallOutside, + [ROOM_PALACE_OF_WINDS_CLOUD_JUMPS] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_BLOCK_MAZE_TO_BOSS_DOOR] = gExitList_PalaceOfWinds_BlockMazeToBossDoor, + [ROOM_PALACE_OF_WINDS_CRACKED_FLOOR_LAKITU] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_HEART_PIECE_BRIDGE] = gExitList_PalaceOfWinds_HeartPieceBridge, + [ROOM_PALACE_OF_WINDS_FAN_BRIDGE] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_TO_FAN_BRIDGE] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_RED_WARP_HALL] = gExitList_PalaceOfWinds_RedWarpHall, + [ROOM_PALACE_OF_WINDS_PLATFORM_CLONE_RIDE] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_PIT_CORNER_AFTER_KEY] = gExitList_PalaceOfWinds_PitCornerAfterKey, + [ROOM_PALACE_OF_WINDS_PLATFORM_CROW_RIDE] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_GRATE_PLATFORM_RIDE] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_POT_PUSH] = gExitList_PalaceOfWinds_PotPush, + [ROOM_PALACE_OF_WINDS_FLOORMASTER_LEVER] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_MAP] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_CORNER_TO_MAP] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_STAIRS_AFTER_FLOORMASTER] = gExitList_PalaceOfWinds_StairsAfterFloormaster, + [ROOM_PALACE_OF_WINDS_HOLE_TO_KINSTONE_WIZZROBE] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_KEY_ARROW_BUTTON] = gExitList_PalaceOfWinds_KeyArrowButton, + [ROOM_PALACE_OF_WINDS_GRATES_TO_3F] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_SPINY_FIGHT] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_PEAHAT_SWITCH] = gExitList_PalaceOfWinds_PeahatSwitch, + [ROOM_PALACE_OF_WINDS_WHIRLWIND_BOMBAROSSA] = gExitList_PalaceOfWinds_WhirlwindBombarossa, + [ROOM_PALACE_OF_WINDS_DOOR_TO_STALFOS_FIREBAR] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_STALFOS_FIREBAR_HOLE] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_SHORTCUT_DOOR_BUTTONS] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_TO_PEAHAT_SWITCH] = gExitList_PalaceOfWinds_ToPeahatSwitch, + [ROOM_PALACE_OF_WINDS_KINSTONE_WIZZROBE_FIGHT] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_GIBDO_STAIRS] = gExitList_PalaceOfWinds_GibdoStairs, + [ROOM_PALACE_OF_WINDS_SPIKE_BAR_SMALL_KEY] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_ROC_CAPE] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_FIRE_BAR_GRATES] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_PLATFORM_RIDE_BOMBAROSSAS] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_BRIDGE_AFTER_DARKNUT] = gExitList_PalaceOfWinds_BridgeAfterDarknut, + [ROOM_PALACE_OF_WINDS_BRIDGE_SWITCHES_CLONE_BLOCK] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_ENTRANCE_ROOM] = gExitList_NoExitList, + [ROOM_PALACE_OF_WINDS_DARK_COMPASS_HALL] = gExitList_PalaceOfWinds_DarkCompassHall, + [ROOM_PALACE_OF_WINDS_33] = gExitList_NoExitList, +}; + +const Transition gExitList_Unused1[] = { + TransitionListEnd, +}; + +const Transition gExitList_DarkHyruleCastle_1FEntrance[] = { + { WARP_TYPE_AREA, 0x0, 0x108, 0xd8, 0x108, 0xe8, 0x0, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_B1_MAP, + 2, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x228, 0xd8, 0x228, 0xe8, 0x0, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_B1_MAP, + 2, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x198, 0x220, 0x1f8, 0x38, 0x2, AREA_CASTLE_GARDEN, ROOM_CASTLE_GARDEN_MAIN, 1, + TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_3FTopLeftTower[] = { + { WARP_TYPE_AREA, 0x0, 0xa8, 0x38, 0x68, 0x48, 0x0, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_2F_TOP_LEFT_TOWER, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_3FTopRightTower[] = { + { WARP_TYPE_AREA, 0x0, 0xa8, 0x38, 0x68, 0x48, 0x0, AREA_DARK_HYRULE_CASTLE, + ROOM_DARK_HYRULE_CASTLE_2F_TOP_RIGHT_TOWER, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_3FBottomLeftTower[] = { + { WARP_TYPE_AREA, 0x0, 0xa8, 0x38, 0x68, 0x48, 0x0, AREA_DARK_HYRULE_CASTLE, + ROOM_DARK_HYRULE_CASTLE_2F_BOTTOM_LEFT_TOWER, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_3FBottomRightTower[] = { + { WARP_TYPE_AREA, 0x0, 0xa8, 0x38, 0x68, 0x118, 0x0, AREA_DARK_HYRULE_CASTLE, + ROOM_DARK_HYRULE_CASTLE_2F_BOTTOM_RIGHT_TOWER, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_3FKeatonHallToVaati[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xa8, 0xe8, 0x3, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_3F_TRIPLE_DARKNUT, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xa8, 0x190, 0x88, 0x28, 0x0, AREA_DARK_HYRULE_CASTLE_BRIDGE, + ROOM_DARK_HYRULE_CASTLE_BRIDGE_MAIN, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_3FTripleDarknut[] = { + { WARP_TYPE_AREA, 0x0, 0xa8, 0x28, 0x78, 0x168, 0x0, AREA_DARK_HYRULE_CASTLE_OUTSIDE, + ROOM_DARK_HYRULE_CASTLE_OUTSIDE_ZELDA_STATUE_PLATFORM, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xb8, 0x18, 0x30, AREA_DARK_HYRULE_CASTLE, + ROOM_DARK_HYRULE_CASTLE_3F_KEATON_HALL_TO_VAATI, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_2FTopLeftTower[] = { + { WARP_TYPE_AREA, 0x0, 0x68, 0x38, 0xa8, 0x48, 0x0, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_3F_TOP_LEFT_TOWER, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xa8, 0x38, 0x68, 0x48, 0x0, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_1F_TOP_LEFT_TOWER, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x88, 0xc0, 0x88, 0xd8, 0x0, AREA_DARK_HYRULE_CASTLE_OUTSIDE, + ROOM_DARK_HYRULE_CASTLE_OUTSIDE_NORTHWEST, 2, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_2FTopRightTower[] = { + { WARP_TYPE_AREA, 0x0, 0x68, 0x38, 0xa8, 0x48, 0x0, AREA_DARK_HYRULE_CASTLE, + ROOM_DARK_HYRULE_CASTLE_3F_TOP_RIGHT_TOWER, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xa8, 0x38, 0x68, 0x48, 0x0, AREA_DARK_HYRULE_CASTLE, + ROOM_DARK_HYRULE_CASTLE_1F_TOP_RIGHT_TOWER, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x88, 0xc0, 0x88, 0xd8, 0x0, AREA_DARK_HYRULE_CASTLE_OUTSIDE, + ROOM_DARK_HYRULE_CASTLE_OUTSIDE_NORTHEAST, 2, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_2FRight[] = { + { WARP_TYPE_AREA, 0x0, 0xf0, 0x5c, 0x44, 0x5e, 0x0, AREA_DARK_HYRULE_CASTLE_OUTSIDE, + ROOM_DARK_HYRULE_CASTLE_OUTSIDE_EAST, 2, TRANSITION_TYPE_NORMAL, 0x2, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xf0, 0xec, 0x44, 0xee, 0x0, AREA_DARK_HYRULE_CASTLE_OUTSIDE, + ROOM_DARK_HYRULE_CASTLE_OUTSIDE_EAST, 2, TRANSITION_TYPE_NORMAL, 0x2, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_2FBossDoor[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x88, 0x118, 0x3, AREA_DARK_HYRULE_CASTLE_BRIDGE, ROOM_DARK_HYRULE_CASTLE_BRIDGE_MAIN, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_2FEntrance[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x198, 0xd8, 0x30, AREA_DARK_HYRULE_CASTLE_OUTSIDE, + ROOM_DARK_HYRULE_CASTLE_OUTSIDE_SOUTH, 2, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_2FBottomLeftTower[] = { + { WARP_TYPE_AREA, 0x0, 0x68, 0x38, 0xa8, 0x48, 0x0, AREA_DARK_HYRULE_CASTLE, + ROOM_DARK_HYRULE_CASTLE_3F_BOTTOM_LEFT_TOWER, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xa8, 0x38, 0x68, 0x48, 0x0, AREA_DARK_HYRULE_CASTLE, + ROOM_DARK_HYRULE_CASTLE_1F_BOTTOM_LEFT_TOWER, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x88, 0xc0, 0x78, 0xe8, 0x0, AREA_DARK_HYRULE_CASTLE_OUTSIDE, + ROOM_DARK_HYRULE_CASTLE_OUTSIDE_SOUTHWEST, 2, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_2FBottomLeftGhini[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x88, 0xd8, 0x30, AREA_DARK_HYRULE_CASTLE_OUTSIDE, + ROOM_DARK_HYRULE_CASTLE_OUTSIDE_SOUTH, 2, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_B1Entrance[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x88, 0x188, 0x3, AREA_DARK_HYRULE_CASTLE_OUTSIDE, + ROOM_DARK_HYRULE_CASTLE_OUTSIDE_GARDEN, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_2FBottomRightTower[] = { + { WARP_TYPE_AREA, 0x0, 0x68, 0x108, 0xa8, 0x48, 0x0, AREA_DARK_HYRULE_CASTLE, + ROOM_DARK_HYRULE_CASTLE_3F_BOTTOM_RIGHT_TOWER, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0xa8, 0x108, 0x68, 0x48, 0x0, AREA_DARK_HYRULE_CASTLE, + ROOM_DARK_HYRULE_CASTLE_1F_BOTTOM_RIGHT_TOWER, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x88, 0x190, 0x88, 0x288, 0x0, AREA_DARK_HYRULE_CASTLE_OUTSIDE, + ROOM_DARK_HYRULE_CASTLE_OUTSIDE_SOUTHEAST, 2, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_1FTopLeftTower[] = { + { WARP_TYPE_AREA, 0x0, 0x68, 0x38, 0xa8, 0x48, 0x0, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_2F_TOP_LEFT_TOWER, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_1FThroneRoom[] = { + { WARP_TYPE_AREA, 0x0, 0x88, 0x48, 0x88, 0x38, 0x0, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_B1_BELOW_THRONE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_1FCompass[] = { + { WARP_TYPE_AREA, 0x0, 0xb8, 0x38, 0xb8, 0x48, 0x0, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_B1_BELOW_COMPASS, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_1FTopRightTower[] = { + { WARP_TYPE_AREA, 0x0, 0x68, 0x38, 0xa8, 0x48, 0x0, AREA_DARK_HYRULE_CASTLE, + ROOM_DARK_HYRULE_CASTLE_2F_TOP_RIGHT_TOWER, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_1FBeforeThrone[] = { + { WARP_TYPE_AREA, 0x0, 0x88, 0x68, 0x88, 0x78, 0x0, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_B1_BEFORE_THRONE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_1FBottomLeftTower[] = { + { WARP_TYPE_AREA, 0x0, 0x68, 0x38, 0xa8, 0x48, 0x0, AREA_DARK_HYRULE_CASTLE, + ROOM_DARK_HYRULE_CASTLE_2F_BOTTOM_LEFT_TOWER, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_1FBottomRightTower[] = { + { WARP_TYPE_AREA, 0x0, 0x68, 0x38, 0xa8, 0x118, 0x0, AREA_DARK_HYRULE_CASTLE, + ROOM_DARK_HYRULE_CASTLE_2F_BOTTOM_RIGHT_TOWER, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_B1BelowThrone[] = { + { WARP_TYPE_AREA, 0x0, 0x88, 0x48, 0x88, 0x58, 0x0, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_1F_THRONE_ROOM, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_B1BelowCompass[] = { + { WARP_TYPE_AREA, 0x0, 0xb8, 0x38, 0xb8, 0x48, 0x0, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_1F_COMPASS, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_B1BeforeThrone[] = { + { WARP_TYPE_AREA, 0x0, 0x88, 0x68, 0x88, 0x58, 0x0, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_1F_BEFORE_THRONE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_B1ToPrison[] = { + { WARP_TYPE_AREA, 0x0, 0x58, 0x28, 0x58, 0x28, 0x0, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_B2_TO_PRISON, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_B1Map[] = { + { WARP_TYPE_AREA, 0x0, 0x108, 0xd8, 0x108, 0xe8, 0x0, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_1F_ENTRANCE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x228, 0xd8, 0x228, 0xe8, 0x0, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_1F_ENTRANCE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastle_B2ToPrison[] = { + { WARP_TYPE_AREA, 0x0, 0x58, 0x18, 0x58, 0x38, 0x0, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_B1_TO_PRISON, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_DarkHyruleCastle[] = { + [ROOM_DARK_HYRULE_CASTLE_1F_ENTRANCE] = gExitList_DarkHyruleCastle_1FEntrance, + [ROOM_DARK_HYRULE_CASTLE_3F_TOP_LEFT_TOWER] = gExitList_DarkHyruleCastle_3FTopLeftTower, + [ROOM_DARK_HYRULE_CASTLE_3F_TOP_RIGHT_TOWER] = gExitList_DarkHyruleCastle_3FTopRightTower, + [ROOM_DARK_HYRULE_CASTLE_3F_BOTTOM_LEFT_TOWER] = gExitList_DarkHyruleCastle_3FBottomLeftTower, + [ROOM_DARK_HYRULE_CASTLE_3F_BOTTOM_RIGHT_TOWER] = gExitList_DarkHyruleCastle_3FBottomRightTower, + [ROOM_DARK_HYRULE_CASTLE_3F_KEATON_HALL_TO_VAATI] = gExitList_DarkHyruleCastle_3FKeatonHallToVaati, + [ROOM_DARK_HYRULE_CASTLE_3F_TRIPLE_DARKNUT] = gExitList_DarkHyruleCastle_3FTripleDarknut, + [ROOM_DARK_HYRULE_CASTLE_2F_TOP_LEFT_TOWER] = gExitList_DarkHyruleCastle_2FTopLeftTower, + [ROOM_DARK_HYRULE_CASTLE_2F_TOP_LEFT_CORNER] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_2F_BOSS_KEY] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_2F_BLUE_WARP] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_2F_TOP_RIGHT_CORNER_GHINI] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_2F_TOP_RIGHT_CORNER_TORCHES] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_2F_TOP_RIGHT_TOWER] = gExitList_DarkHyruleCastle_2FTopRightTower, + [ROOM_DARK_HYRULE_CASTLE_2F_TOP_LEFT_DARKNUT] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_2F_SPARKS] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_2F_TOP_RIGHT_DARKNUTS] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_2F_LEFT] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_2F_RIGHT] = gExitList_DarkHyruleCastle_2FRight, + [ROOM_DARK_HYRULE_CASTLE_2F_BOTTOM_LEFT_DARKNUTS] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_2F_BOSS_DOOR] = gExitList_DarkHyruleCastle_2FBossDoor, + [ROOM_DARK_HYRULE_CASTLE_2F_BOTTOM_RIGHT_DARKNUT] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_2F_BOTTOM_LEFT_CORNER_PUZZLE] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_2F_ENTRANCE] = gExitList_DarkHyruleCastle_2FEntrance, + [ROOM_DARK_HYRULE_CASTLE_2F_BOTTOM_RIGHT_CORNER] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_2F_BOTTOM_LEFT_TOWER] = gExitList_DarkHyruleCastle_2FBottomLeftTower, + [ROOM_DARK_HYRULE_CASTLE_2F_BOTTOM_LEFT_GHINI] = gExitList_DarkHyruleCastle_2FBottomLeftGhini, + [ROOM_DARK_HYRULE_CASTLE_1b] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_B1_ENTRANCE] = gExitList_DarkHyruleCastle_B1Entrance, + [ROOM_DARK_HYRULE_CASTLE_2F_BOTTOM_RIGHT_TOWER] = gExitList_DarkHyruleCastle_2FBottomRightTower, + [ROOM_DARK_HYRULE_CASTLE_1F_TOP_LEFT_TOWER] = gExitList_DarkHyruleCastle_1FTopLeftTower, + [ROOM_DARK_HYRULE_CASTLE_1F_THRONE_ROOM] = gExitList_DarkHyruleCastle_1FThroneRoom, + [ROOM_DARK_HYRULE_CASTLE_1F_COMPASS] = gExitList_DarkHyruleCastle_1FCompass, + [ROOM_DARK_HYRULE_CASTLE_1F_TOP_RIGHT_TOWER] = gExitList_DarkHyruleCastle_1FTopRightTower, + [ROOM_DARK_HYRULE_CASTLE_1F_BEFORE_THRONE] = gExitList_DarkHyruleCastle_1FBeforeThrone, + [ROOM_DARK_HYRULE_CASTLE_1F_LOOP_TOP_LEFT] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_1F_LOOP_TOP] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_1F_LOOP_TOP_RIGHT] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_1F_LOOP_LEFT] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_1F_LOOP_RIGHT] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_1F_LOOP_BOTTOM_LEFT] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_1F_LOOP_BOTTOM] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_1F_LOOP_BOTTOM_RIGHT] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_1F_BOTTOM_LEFT_TOWER] = gExitList_DarkHyruleCastle_1FBottomLeftTower, + [ROOM_DARK_HYRULE_CASTLE_1F_BOTTOM_RIGHT_TOWER] = gExitList_DarkHyruleCastle_1FBottomRightTower, + [ROOM_DARK_HYRULE_CASTLE_B1_BELOW_THRONE] = gExitList_DarkHyruleCastle_B1BelowThrone, + [ROOM_DARK_HYRULE_CASTLE_B1_BELOW_COMPASS] = gExitList_DarkHyruleCastle_B1BelowCompass, + [ROOM_DARK_HYRULE_CASTLE_B1_BEFORE_THRONE] = gExitList_DarkHyruleCastle_B1BeforeThrone, + [ROOM_DARK_HYRULE_CASTLE_B1_TO_PRISON] = gExitList_DarkHyruleCastle_B1ToPrison, + [ROOM_DARK_HYRULE_CASTLE_B1_BOMB_WALL] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_B1_KEATONS] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_B1_TO_PRISON_FIREBAR] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_B1_CANNONS] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_B1_LEFT] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_B1_RIGHT] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_B1_MAP] = gExitList_DarkHyruleCastle_B1Map, + [ROOM_DARK_HYRULE_CASTLE_B2_TO_PRISON] = gExitList_DarkHyruleCastle_B2ToPrison, + [ROOM_DARK_HYRULE_CASTLE_B2_PRISON] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_B2_DROPDOWN] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_3b] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_3c] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_3d] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_3e] = gExitList_NoExitList, + [ROOM_DARK_HYRULE_CASTLE_3f] = gExitList_NoExitList, +}; + +const Transition gExitList_Unused2[] = { + TransitionListEnd, +}; + +const Transition gExitList_DarkHyruleCastleOutside_ZeldaStatuePlatform[] = { + { WARP_TYPE_AREA, 0x0, 0x78, 0x178, 0xa8, 0x38, 0x0, AREA_DARK_HYRULE_CASTLE, + ROOM_DARK_HYRULE_CASTLE_3F_TRIPLE_DARKNUT, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastleOutside_Garden[] = { + { WARP_TYPE_AREA, 0x0, 0x88, 0x38, 0xc8, 0x1e8, 0x0, AREA_SANCTUARY, ROOM_SANCTUARY_HALL, 1, TRANSITION_TYPE_NORMAL, 0x0, + 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x88, 0x18, 0x30, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_B1_ENTRANCE, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastleOutside_OutsideNorthwest[] = { + { WARP_TYPE_AREA, 0x0, 0x88, 0xc8, 0x88, 0xa8, 0x0, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_2F_TOP_LEFT_TOWER, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastleOutside_OutsideNortheast[] = { + { WARP_TYPE_AREA, 0x0, 0x88, 0xc8, 0x88, 0xb0, 0x0, AREA_DARK_HYRULE_CASTLE, + ROOM_DARK_HYRULE_CASTLE_2F_TOP_RIGHT_TOWER, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastleOutside_OutsideEast[] = { + { WARP_TYPE_AREA, 0x0, 0x38, 0x5c, 0xde, 0x5e, 0x0, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_2F_RIGHT, + 1, TRANSITION_TYPE_NORMAL, 0x6, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x38, 0xec, 0xde, 0xee, 0x0, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_2F_RIGHT, + 1, TRANSITION_TYPE_NORMAL, 0x6, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastleOutside_OutsideSouthwest[] = { + { WARP_TYPE_AREA, 0x0, 0x78, 0xd8, 0x88, 0xb0, 0x0, AREA_DARK_HYRULE_CASTLE, + ROOM_DARK_HYRULE_CASTLE_2F_BOTTOM_LEFT_TOWER, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastleOutside_OutsideSouth[] = { + { WARP_TYPE_AREA, 0x0, 0x198, 0xc8, 0x88, 0x170, 0x0, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_2F_ENTRANCE, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x88, 0xc8, 0x88, 0xa0, 0x0, AREA_DARK_HYRULE_CASTLE, + ROOM_DARK_HYRULE_CASTLE_2F_BOTTOM_LEFT_GHINI, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_DarkHyruleCastleOutside_OutsideSoutheast[] = { + { WARP_TYPE_AREA, 0x0, 0x88, 0x278, 0x88, 0x178, 0x0, AREA_DARK_HYRULE_CASTLE, + ROOM_DARK_HYRULE_CASTLE_2F_BOTTOM_RIGHT_TOWER, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_DarkHyruleCastleOutside[] = { + [ROOM_DARK_HYRULE_CASTLE_OUTSIDE_ZELDA_STATUE_PLATFORM] = gExitList_DarkHyruleCastleOutside_ZeldaStatuePlatform, + [ROOM_DARK_HYRULE_CASTLE_OUTSIDE_GARDEN] = gExitList_DarkHyruleCastleOutside_Garden, + [ROOM_DARK_HYRULE_CASTLE_OUTSIDE_NORTHWEST] = gExitList_DarkHyruleCastleOutside_OutsideNorthwest, + [ROOM_DARK_HYRULE_CASTLE_OUTSIDE_NORTHEAST] = gExitList_DarkHyruleCastleOutside_OutsideNortheast, + [ROOM_DARK_HYRULE_CASTLE_OUTSIDE_EAST] = gExitList_DarkHyruleCastleOutside_OutsideEast, + [ROOM_DARK_HYRULE_CASTLE_OUTSIDE_SOUTHWEST] = gExitList_DarkHyruleCastleOutside_OutsideSouthwest, + [ROOM_DARK_HYRULE_CASTLE_OUTSIDE_SOUTH] = gExitList_DarkHyruleCastleOutside_OutsideSouth, + [ROOM_DARK_HYRULE_CASTLE_OUTSIDE_SOUTHEAST] = gExitList_DarkHyruleCastleOutside_OutsideSoutheast, +}; + +const Transition gExitList_VaatisArms_First[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xb0, 0x88, 0x30, AREA_VAATI_3, ROOM_VAATI_3_0, 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, + 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_VaatisArms_Second[] = { + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xb0, 0x88, 0x30, AREA_VAATI_3, ROOM_VAATI_3_0, 1, TRANSITION_TYPE_INSTANT_MINISH, 0x4, 0x0, 0x0, + 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_VaatisArms[] = { + [ROOM_VAATIS_ARMS_FIRST] = gExitList_VaatisArms_First, + [ROOM_VAATIS_ARMS_SECOND] = gExitList_VaatisArms_Second, +}; + +const Transition gExitList_DarkHyruleCastleBridge_Main[] = { + { WARP_TYPE_AREA, 0x0, 0x88, 0x18, 0xa8, 0x178, 0x0, AREA_DARK_HYRULE_CASTLE, + ROOM_DARK_HYRULE_CASTLE_3F_KEATON_HALL_TO_VAATI, 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x88, 0x28, 0x30, AREA_DARK_HYRULE_CASTLE, ROOM_DARK_HYRULE_CASTLE_2F_BOSS_DOOR, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_DarkHyruleCastleBridge[] = { + [ROOM_DARK_HYRULE_CASTLE_BRIDGE_MAIN] = gExitList_DarkHyruleCastleBridge_Main, +}; + +const Transition gExitList_HyruleCastle_0[] = { + { WARP_TYPE_AREA, 0x0, 0x48, 0xd8, 0x88, 0x288, 0x0, AREA_HYRULE_CASTLE, ROOM_HYRULE_CASTLE_3, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x1f8, 0x38, 0x30, AREA_CASTLE_GARDEN, ROOM_CASTLE_GARDEN_MAIN, 1, + TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HyruleCastle_1[] = { + { WARP_TYPE_AREA, 0x0, 0x58, 0x28, 0x68, 0x28, 0x0, AREA_HYRULE_CASTLE, ROOM_HYRULE_CASTLE_3, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x198, 0x28, 0x1c8, 0x28, 0x0, AREA_HYRULE_CASTLE, ROOM_HYRULE_CASTLE_3, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_HyruleCastle_3[] = { + { WARP_TYPE_AREA, 0x0, 0x68, 0x18, 0x58, 0x38, 0x0, AREA_HYRULE_CASTLE, ROOM_HYRULE_CASTLE_1, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x1c8, 0x18, 0x198, 0x38, 0x0, AREA_HYRULE_CASTLE, ROOM_HYRULE_CASTLE_1, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x88, 0x278, 0x48, 0xe8, 0x0, AREA_HYRULE_CASTLE, ROOM_HYRULE_CASTLE_0, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_AREA, 0x0, 0x118, 0x1c8, 0x88, 0x180, 0x0, AREA_SANCTUARY_ENTRANCE, ROOM_SANCTUARY_ENTRANCE_MAIN, + 1, TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0xd2, 0x5c, 0xc0, AREA_HYRULE_CASTLE_CELLAR, ROOM_HYRULE_CASTLE_CELLAR_1, + 1, TRANSITION_TYPE_NORMAL, 0x6, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_HyruleCastle[] = { + [ROOM_HYRULE_CASTLE_0] = gExitList_HyruleCastle_0, + [ROOM_HYRULE_CASTLE_1] = gExitList_HyruleCastle_1, + [ROOM_HYRULE_CASTLE_2] = gExitList_NoExitList, + [ROOM_HYRULE_CASTLE_3] = gExitList_HyruleCastle_3, + [ROOM_HYRULE_CASTLE_4] = gExitList_NoExitList, + [ROOM_HYRULE_CASTLE_5] = gExitList_NoExitList, + [ROOM_HYRULE_CASTLE_6] = gExitList_NoExitList, + [ROOM_HYRULE_CASTLE_7] = gExitList_NoExitList, +}; + +const Transition gExitList_SanctuaryEntrance_Main[] = { + { WARP_TYPE_AREA, 0x0, 0x88, 0x38, 0xc8, 0x1e8, 0x0, AREA_SANCTUARY, ROOM_SANCTUARY_HALL, 1, TRANSITION_TYPE_NORMAL, 0x0, + 0x0, 0x0, 0x0, 0x0 }, + { WARP_TYPE_BORDER, 0x0, 0x0, 0x0, 0x118, 0x1e8, 0x30, AREA_HYRULE_CASTLE, ROOM_HYRULE_CASTLE_3, 1, TRANSITION_TYPE_NORMAL, + 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_SanctuaryEntrance[] = { + [ROOM_SANCTUARY_ENTRANCE_MAIN] = gExitList_SanctuaryEntrance_Main, +}; + +const Transition gExitList_Sanctuary_Hall[] = { + { WARP_TYPE_AREA, 0x0, 0xc8, 0x1fc, 0x88, 0x48, 0x0, AREA_SANCTUARY_ENTRANCE, ROOM_SANCTUARY_ENTRANCE_MAIN, + 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gUnk_0813A76C[] = { + { WARP_TYPE_AREA, 0x0, 0xc8, 0x1fc, 0x88, 0x48, 0x0, AREA_DARK_HYRULE_CASTLE_OUTSIDE, + ROOM_DARK_HYRULE_CASTLE_OUTSIDE_GARDEN, 1, TRANSITION_TYPE_NORMAL, 0x4, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Sanctuary_Main[] = { + { WARP_TYPE_AREA, 0x0, 0xe8, 0x28, 0x98, 0x130, 0x0, AREA_SANCTUARY, ROOM_SANCTUARY_STAINED_GLASS, 2, + TRANSITION_TYPE_NORMAL, 0x0, 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition gExitList_Sanctuary_StainedGlass[] = { + { WARP_TYPE_AREA, 0x0, 0x98, 0x140, 0xe8, 0x38, 0x0, AREA_SANCTUARY, ROOM_SANCTUARY_MAIN, 2, TRANSITION_TYPE_NORMAL, 0x4, + 0x0, 0x0, 0x0, 0x0 }, + TransitionListEnd, +}; +const Transition* const gExitLists_Sanctuary[] = { + [ROOM_SANCTUARY_HALL] = gExitList_Sanctuary_Hall, + [ROOM_SANCTUARY_MAIN] = gExitList_Sanctuary_Main, + [ROOM_SANCTUARY_STAINED_GLASS] = gExitList_Sanctuary_StainedGlass, +}; + +const Transition* const* const gExitLists[] = { + /*AREA_MINISH_WOODS*/ gExitLists_MinishWoods, + /*AREA_MINISH_VILLAGE*/ gExitLists_MinishVillage, + /*AREA_HYRULE_TOWN*/ gExitLists_HyruleTown, + /*AREA_HYRULE_FIELD*/ gExitLists_HyruleField, + /*AREA_CASTOR_WILDS*/ gExitLists_CastorWilds, + /*AREA_RUINS*/ gExitLists_Ruins, + /*AREA_MT_CRENEL*/ gExitLists_MtCrenel, + /*AREA_CASTLE_GARDEN*/ gExitLists_CastleGarden, + /*AREA_CLOUD_TOPS*/ gExitLists_CloudTops, + /*AREA_ROYAL_VALLEY*/ gExitLists_RoyalValley, + /*AREA_VEIL_FALLS*/ gExitLists_VeilFalls, + /*AREA_LAKE_HYLIA*/ gExitLists_LakeHylia, + /*AREA_LAKE_WOODS_CAVE*/ gExitLists_LakeWoodsCave, + /*AREA_BEANSTALKS*/ gExitLists_Beanstalks, + /*AREA_EMPTY*/ gExitLists_NoExit, + /*AREA_HYRULE_DIG_CAVES*/ gExitLists_HyruleDigCaves, + /*AREA_MELARIS_MINE*/ gExitLists_MelarisMine, + /*AREA_MINISH_PATHS*/ gExitLists_MinishPaths, + /*AREA_CRENEL_MINISH_PATHS*/ gExitLists_CrenelMinishPaths, + /*AREA_DIG_CAVES*/ gExitLists_DigCaves1, + /*AREA_CRENEL_DIG_CAVE*/ gExitLists_NoExit, + /*AREA_FESTIVAL_TOWN*/ gExitLists_FestivalTown, + /*AREA_VEIL_FALLS_DIG_CAVE*/ gExitLists_NoExit, + /*AREA_CASTOR_WILDS_DIG_CAVE*/ gExitLists_NoExit, + /*AREA_OUTER_FORTRESS_OF_WINDS*/ gExitLists_OuterFortressOfWinds, + /*AREA_HYLIA_DIG_CAVES*/ gExitLists_HyliaDigCaves, + /*AREA_VEIL_FALLS_TOP*/ gExitLists_VeilFallsTop, + /*AREA_NULL_1B*/ gExitLists_NoExit, + /*AREA_NULL_1C*/ gExitLists_NoExit, + /*AREA_NULL_1D*/ gExitLists_NoExit, + /*AREA_NULL_1E*/ gExitLists_NoExit, + /*AREA_NULL_1F*/ gExitLists_NoExit, + /*AREA_MINISH_HOUSE_INTERIORS*/ gExitLists_MinishHouseInteriors, + /*AREA_HOUSE_INTERIORS_1*/ gExitLists_HouseInteriors1, + /*AREA_HOUSE_INTERIORS_2*/ gExitLists_HouseInteriors2, + /*AREA_HOUSE_INTERIORS_3*/ gExitLists_HouseInteriors3, + /*AREA_TREE_INTERIORS*/ gExitLists_TreeInteriors, + /*AREA_DOJOS*/ gExitLists_Dojos, + /*AREA_CRENEL_CAVES*/ gExitLists_CrenelCaves, + /*AREA_MINISH_CRACKS*/ gExitLists_MinishCracks, + /*AREA_HOUSE_INTERIORS_4*/ gExitLists_HouseInteriors4, + /*AREA_GREAT_FAIRIES*/ gExitLists_GreatFairies, + /*AREA_CASTOR_CAVES*/ gExitLists_CastorCaves, + /*AREA_CASTOR_DARKNUT*/ gExitLists_CastorDarknut, + /*AREA_ARMOS_INTERIORS*/ gExitLists_ArmosInteriors, + /*AREA_TOWN_MINISH_HOLES*/ gExitLists_TownMinishHoles, + /*AREA_MINISH_RAFTERS*/ gExitLists_MinishRafters, + /*AREA_GORON_CAVE*/ gExitLists_GoronCave, + /*AREA_WIND_TRIBE_TOWER*/ gExitLists_WindTribeTower, + /*AREA_WIND_TRIBE_TOWER_ROOF*/ gExitLists_WindTribeTowerRoof, + /*AREA_CAVES*/ gExitLists_Caves, + /*AREA_VEIL_FALLS_CAVES*/ gExitLists_VeilFallsCaves, + /*AREA_ROYAL_VALLEY_GRAVES*/ gExitLists_RoyalValleyGraves, + /*AREA_MINISH_CAVES*/ gExitLists_MinishCaves, + /*AREA_CASTLE_GARDEN_MINISH_HOLES*/ gExitLists_CastleGardenMinishHoles, + /*AREA_37*/ gExitLists_37, + /*AREA_EZLO_CUTSCENE*/ gExitLists_NoExit, + /*AREA_NULL_39*/ gExitLists_NoExit, + /*AREA_NULL_3A*/ gExitLists_NoExit, + /*AREA_NULL_3B*/ gExitLists_NoExit, + /*AREA_NULL_3C*/ gExitLists_NoExit, + /*AREA_NULL_3D*/ gExitLists_NoExit, + /*AREA_NULL_3E*/ gExitLists_NoExit, + /*AREA_NULL_3F*/ gExitLists_NoExit, + /*AREA_40*/ gExitLists_40, + /*AREA_HYRULE_TOWN_UNDERGROUND*/ gExitLists_HyruleTownUnderground, + /*AREA_GARDEN_FOUNTAINS*/ gExitLists_GardenFountains, + /*AREA_HYRULE_CASTLE_CELLAR*/ gExitLists_HyruleCastleCellar, + /*AREA_SIMONS_SIMULATION*/ gExitLists_NoExit, + /*AREA_45*/ gExitLists_NoExit, + /*AREA_NULL_46*/ gExitLists_40, + /*AREA_47*/ gExitLists_NoExit, + /*AREA_DEEPWOOD_SHRINE*/ gExitLists_DeepwoodShrine, + /*AREA_DEEPWOOD_SHRINE_BOSS*/ gExitLists_DeepwoodShrineBoss, + /*AREA_DEEPWOOD_SHRINE_ENTRY*/ gExitLists_DeepwoodShrineEntry, + /*AREA_NULL_4B*/ gExitLists_NoExit, + /*AREA_NULL_4C*/ gExitLists_NoExit, + /*AREA_4D*/ gExitLists_NoExit, + /*AREA_NULL_4E*/ gExitLists_NoExit, + /*AREA_NULL_4F*/ gExitLists_NoExit, + /*AREA_CAVE_OF_FLAMES*/ gExitLists_CaveOfFlames, + /*AREA_CAVE_OF_FLAMES_BOSS*/ gExitLists_NoExit, + /*AREA_NULL_52*/ gExitLists_NoExit, + /*AREA_NULL_53*/ gExitLists_NoExit, + /*AREA_NULL_54*/ gExitLists_NoExit, + /*AREA_NULL_55*/ gExitLists_NoExit, + /*AREA_NULL_56*/ gExitLists_NoExit, + /*AREA_57*/ gExitLists_NoExit, +#ifndef DEMO_USA + /*AREA_FORTRESS_OF_WINDS*/ gExitLists_FortressOfWinds, + /*AREA_FORTRESS_OF_WINDS_TOP*/ gExitLists_FortressOfWindsTop, + /*AREA_INNER_MAZAAL*/ gExitLists_InnerMazaal, + /*AREA_NULL_5B*/ gExitLists_NoExit, + /*AREA_NULL_5C*/ gExitLists_NoExit, + /*AREA_NULL_5D*/ gExitLists_NoExit, + /*AREA_NULL_5E*/ gExitLists_NoExit, + /*AREA_5F*/ gExitLists_NoExit, +#endif + /*AREA_TEMPLE_OF_DROPLETS*/ gExitLists_TempleOfDroplets, + /*AREA_NULL_61*/ gExitLists_61, + /*AREA_HYRULE_TOWN_MINISH_CAVES*/ gExitLists_HyruleTownMinishCaves, + /*AREA_NULL_63*/ gExitLists_NoExit, + /*AREA_NULL_64*/ gExitLists_NoExit, + /*AREA_NULL_65*/ gExitLists_NoExit, + /*AREA_NULL_66*/ gExitLists_NoExit, + /*AREA_67*/ gExitLists_NoExit, + /*AREA_ROYAL_CRYPT*/ gExitLists_RoyalCrypt, + /*AREA_NULL_69*/ gExitLists_NoExit, + /*AREA_NULL_6A*/ gExitLists_NoExit, + /*AREA_NULL_6B*/ gExitLists_NoExit, + /*AREA_NULL_6C*/ gExitLists_NoExit, + /*AREA_NULL_6D*/ gExitLists_NoExit, + /*AREA_NULL_6E*/ gExitLists_NoExit, + /*AREA_6F*/ gExitLists_NoExit, + /*AREA_PALACE_OF_WINDS*/ gExitLists_PalaceOfWinds, + /*AREA_PALACE_OF_WINDS_BOSS*/ gExitLists_NoExit, + /*AREA_NULL_72*/ gExitLists_NoExit, + /*AREA_NULL_73*/ gExitLists_NoExit, + /*AREA_NULL_74*/ gExitLists_NoExit, + /*AREA_NULL_75*/ gExitLists_NoExit, + /*AREA_NULL_76*/ gExitLists_NoExit, + /*AREA_77*/ gExitLists_NoExit, + /*AREA_SANCTUARY*/ gExitLists_Sanctuary, + /*AREA_NULL_79*/ gExitLists_NoExit, + /*AREA_NULL_7A*/ gExitLists_NoExit, + /*AREA_NULL_7B*/ gExitLists_NoExit, + /*AREA_NULL_7C*/ gExitLists_NoExit, + /*AREA_NULL_7D*/ gExitLists_NoExit, + /*AREA_NULL_7E*/ gExitLists_NoExit, + /*AREA_7F*/ gExitLists_NoExit, + /*AREA_HYRULE_CASTLE*/ gExitLists_HyruleCastle, + /*AREA_SANCTUARY_ENTRANCE*/ gExitLists_SanctuaryEntrance, + /*AREA_NULL_82*/ gExitLists_NoExit, + /*AREA_NULL_83*/ gExitLists_NoExit, + /*AREA_NULL_84*/ gExitLists_NoExit, + /*AREA_NULL_85*/ gExitLists_NoExit, + /*AREA_NULL_86*/ gExitLists_NoExit, + /*AREA_87*/ gExitLists_NoExit, + /*AREA_DARK_HYRULE_CASTLE*/ gExitLists_DarkHyruleCastle, + /*AREA_DARK_HYRULE_CASTLE_OUTSIDE*/ gExitLists_DarkHyruleCastleOutside, + /*AREA_VAATIS_ARMS*/ gExitLists_VaatisArms, + /*AREA_VAATI_3*/ gExitLists_NoExit, + /*AREA_VAATI_2*/ gExitLists_NoExit, + /*AREA_DARK_HYRULE_CASTLE_BRIDGE*/ gExitLists_DarkHyruleCastleBridge, + /*AREA_NULL_8E*/ gExitLists_NoExit, + /*AREA_8F*/ gExitLists_NoExit, + /*AREA_90*/ gExitLists_NoExit, + /*AREA_91*/ gExitLists_NoExit, + /*AREA_92*/ gExitLists_NoExit, + /*AREA_93*/ gExitLists_NoExit, + /*AREA_94*/ gExitLists_NoExit, + /*AREA_95*/ gExitLists_NoExit, + /*AREA_96*/ gExitLists_NoExit, + /*AREA_97*/ gExitLists_NoExit, + /*AREA_98*/ gExitLists_NoExit, +}; +// clang-format on @@ -216,7 +216,7 @@ void sub_080A3198(u32 param_1, u32 param_2) { MemClear(gUnk_08127C98 - 0x1e, 0x180); if (r4 != 0) { - sub_0805F46C(r4, &gUnk_08127C98); + sub_0805F46C(r4, (Font*)&gUnk_08127C98); // TODO } gScreen.bg0.updated = 1; diff --git a/src/enemy/acroBandits.c b/src/enemy/acroBandits.c index 34d0ea7c..d240ecab 100644 --- a/src/enemy/acroBandits.c +++ b/src/enemy/acroBandits.c @@ -10,15 +10,39 @@ extern Entity* gUnk_020000B0; extern void (*const gUnk_080012C8[])(Entity*); -extern void (*const AcroBandit_Functions[])(Entity*); -extern void (*const gUnk_080CE584[])(Entity*); -extern void (*const gUnk_080CE58C[])(Entity*); -extern void (*const gUnk_080CE5C8[])(Entity*); -extern u8 gUnk_080CE5B0[8]; -extern u8 gUnk_080CE5B8[8]; -extern s8 gUnk_080CE5C0[8]; -extern u16 gUnk_080CE5F0[5]; -extern u8 gUnk_080CE5FA[20]; // Directions + +void AcroBandit_OnTick(Entity* this); +void AcroBandit_OnCollision(Entity* this); +void AcroBandit_OnKnockback(Entity* this); +void GenericDeath(Entity* this); +void GenericConfused(Entity* this); +void AcroBandit_OnGrabbed(Entity* this); +void AcroBandit_Type0(Entity* this); +void AcroBandit_Type1(Entity* this); +void AcroBandit_Type0Action0(Entity* this); +void AcroBandit_Type0Action1(Entity* this); +void AcroBandit_Type0Action2(Entity* this); +void AcroBandit_Type0Action3(Entity* this); +void AcroBandit_Type0Action4(Entity* this); +void AcroBandit_Type0Action5(Entity* this); +void AcroBandit_Type0Action6(Entity* this); +void AcroBandit_Type0Action7(Entity* this); +void AcroBandit_Type0Action8(Entity* this); +void AcroBandit_Type1Init(Entity* this); +void AcroBandit_Type1Action1(Entity* this); +void AcroBandit_Type1Action2(Entity* this); +void AcroBandit_Type1Action3(Entity* this); +void AcroBandit_Type1Action4(Entity* this); +void AcroBandit_Type1Action5(Entity* this); +void AcroBandit_Type1Action6(Entity* this); +void AcroBandit_Type1Action7(Entity* this); +void AcroBandit_Type1Action8(Entity* this); +void AcroBandit_Type1Action9(Entity* this); + +static void (*const AcroBandit_Functions[])(Entity*) = { + AcroBandit_OnTick, AcroBandit_OnCollision, AcroBandit_OnKnockback, + GenericDeath, GenericConfused, AcroBandit_OnGrabbed, +}; void AcroBandit(Entity* this) { s32 index; @@ -37,7 +61,11 @@ void AcroBandit(Entity* this) { } void AcroBandit_OnTick(Entity* this) { - gUnk_080CE584[this->type](this); + static void (*const typeFuncs[])(Entity*) = { + AcroBandit_Type0, + AcroBandit_Type1, + }; + typeFuncs[this->type](this); } void AcroBandit_OnCollision(Entity* this) { @@ -47,7 +75,7 @@ void AcroBandit_OnCollision(Entity* this) { if (this->type == 1) { if (this->action < 7 && this->knockbackDuration != 0) { brother = this->child; - if (brother) { + if (brother != NULL) { brother->parent = this->parent; do { brother->action = 5; @@ -56,10 +84,10 @@ void AcroBandit_OnCollision(Entity* this) { brother->iframes = -12; } while (brother = brother->child, brother != NULL); } - if (this->parent) { + if (this->parent != NULL) { this->parent->child = this->child; } else { - if (this->child) + if (this->child != NULL) this->parent = this; } @@ -109,25 +137,27 @@ void AcroBandit_OnKnockback(Entity* this) { GenericKnockback(this); } -void AcroBandit_OnGrabbed(void) { - /* ... */ +void AcroBandit_OnGrabbed(Entity* this) { } -void sub_08031A88(Entity* this) { - gUnk_080CE58C[this->action](this); +void AcroBandit_Type0(Entity* this) { + static void (*const actionFuncs[])(Entity*) = { + AcroBandit_Type0Action0, AcroBandit_Type0Action1, AcroBandit_Type0Action2, + AcroBandit_Type0Action3, AcroBandit_Type0Action4, AcroBandit_Type0Action5, + AcroBandit_Type0Action6, AcroBandit_Type0Action7, AcroBandit_Type0Action8, + }; + actionFuncs[this->action](this); } -void sub_08031AA0(Entity* this) { +void AcroBandit_Type0Action0(Entity* this) { sub_0804A720(this); - this->action = '\x01'; + this->action = 1; this->field_0x74.HWORD = this->x.HALF.HI; this->field_0x76.HWORD = this->y.HALF.HI; this->field_0x78.HALF.HI = Random(); } -void sub_08031AC8(Entity* this) - -{ +void AcroBandit_Type0Action1(Entity* this) { u32 rand; s32 x, y; @@ -149,7 +179,9 @@ void sub_08031AC8(Entity* this) } } -void sub_08031B48(Entity* this) { +void AcroBandit_Type0Action2(Entity* this) { + static const u8 actionDelays[] = { 2, 2, 2, 3, 3, 3, 3, 4 }; + GetNextFrame(this); if (this->frame & 1) { this->frame = 0; @@ -157,13 +189,13 @@ void sub_08031B48(Entity* this) { } else { if (this->frame & ANIM_DONE) { this->action = 0x3; - this->actionDelay = gUnk_080CE5B0[Random() & 7]; + this->actionDelay = actionDelays[Random() & 7]; InitializeAnimation(this, 1); } } } -void sub_08031B98(Entity* this) { +void AcroBandit_Type0Action3(Entity* this) { if (sub_08031E04(this)) { this->action = 5; if (this->x.HALF.HI > gUnk_020000B0->x.HALF.HI) { @@ -186,21 +218,22 @@ void sub_08031B98(Entity* this) { } } -void sub_08031C1C(Entity* this) { +void AcroBandit_Type0Action4(Entity* this) { + static const u8 actionDelays[] = { 60, 60, 90, 120, 120, 120, 120, 150 }; GetNextFrame(this); if (this->frame & ANIM_DONE) { - this->action = '\x01'; - this->actionDelay = gUnk_080CE5B8[Random() & 7]; + this->action = 1; + this->actionDelay = actionDelays[Random() & 7]; this->spriteSettings.draw = 0; } } -void sub_08031C58(Entity* this) { +void AcroBandit_Type0Action5(Entity* this) { Entity *a, *b; GetNextFrame(this); if (this->frame & ANIM_DONE) { - if (gEntCount < 0x43) { + if (gEntCount < MAX_ENTITIES - 4) { u32 tmp = Random(); tmp &= 3; @@ -252,7 +285,7 @@ void sub_08031C58(Entity* this) { } } -void sub_08031D70(Entity* this) { +void AcroBandit_Type0Action6(Entity* this) { GetNextFrame(this); if (--this->actionDelay == 0) { this->action = 7; @@ -262,7 +295,7 @@ void sub_08031D70(Entity* this) { } } -void sub_08031DA0(Entity* this) { +void AcroBandit_Type0Action7(Entity* this) { if ((this->actionDelay & 0xf) == 0) { if (this->actionDelay == 0x50) { DeleteEntity(this); @@ -273,7 +306,7 @@ void sub_08031DA0(Entity* this) { } } -void sub_08031DC4(Entity* this) { +void AcroBandit_Type0Action8(Entity* this) { if (this->frame & ANIM_DONE) { this->action = 1; this->actionDelay = 0xb4; @@ -286,13 +319,14 @@ void sub_08031DC4(Entity* this) { } } -u32 sub_08031E04(Entity* this) { +bool32 sub_08031E04(Entity* this) { + static const s8 gUnk_080CE5C0[] = { -32, 0, 0, 32, 32, 0, 0, 0 }; Entity* ent; - s8* tmp; + const s8* tmp; ent = sub_08049DF4(1); if (ent == NULL) - return 0; + return FALSE; tmp = &gUnk_080CE5C0[this->frame & 6]; return EntityWithinDistance(this, ent->x.HALF.HI + tmp[0], ent->y.HALF.HI + tmp[1], 0x50); @@ -308,11 +342,16 @@ void sub_08031E48(Entity* this, Entity* child) { child->field_0x7c.WORD = (s32)this; } -void sub_08031E90(Entity* this) { - gUnk_080CE5C8[this->action](this); +void AcroBandit_Type1(Entity* this) { + static void (*const actionFuncs[])(Entity*) = { + AcroBandit_Type1Init, AcroBandit_Type1Action1, AcroBandit_Type1Action2, AcroBandit_Type1Action3, + AcroBandit_Type1Action4, AcroBandit_Type1Action5, AcroBandit_Type1Action6, AcroBandit_Type1Action7, + AcroBandit_Type1Action8, AcroBandit_Type1Action9, + }; + actionFuncs[this->action](this); } -void sub_08031EA8(Entity* this) { +void AcroBandit_Type1Init(Entity* this) { this->action = 1; this->spritePriority.b1 = 1; this->zVelocity = Q_16_16(4.0); @@ -321,7 +360,7 @@ void sub_08031EA8(Entity* this) { InitializeAnimation(this, 4); } -void sub_08031EE8(Entity* this) { +void AcroBandit_Type1Action1(Entity* this) { int draw; this->z.WORD -= this->zVelocity; @@ -346,8 +385,10 @@ void sub_08031EE8(Entity* this) { } } -void sub_08031F54(Entity* this) { - GravityUpdate(this, gUnk_080CE5F0[this->type2]); +void AcroBandit_Type1Action2(Entity* this) { + static const u16 banditGravity[] = { 0x1600, 0x1300, 0x1000, 0xD00, 0xB00 }; + + GravityUpdate(this, banditGravity[this->type2]); if (this->type2 * -0xe <= this->z.HALF.HI) { this->action = 3; this->actionDelay = 20; @@ -358,13 +399,13 @@ void sub_08031F54(Entity* this) { } } -void sub_08031FB0(Entity* this) { +void AcroBandit_Type1Action3(Entity* this) { GetNextFrame(this); - if ((this->frame & ANIM_DONE) && (this->parent || --this->actionDelay == 0)) { + if ((this->frame & ANIM_DONE) && ((this->parent != NULL) || (--this->actionDelay == 0))) { this->action = 4; this->direction = sub_08049F84(this, 1); *(u8*)&this->field_0x76 = 0; - if (this->child) { + if (this->child != NULL) { InitializeAnimation(this, 9); } else { InitializeAnimation(this, 8); @@ -372,12 +413,12 @@ void sub_08031FB0(Entity* this) { } } -void sub_08032008(Entity* this) { +void AcroBandit_Type1Action4(Entity* this) { Entity* parent; - if (sub_080322A4(this) == 0) { + if (!sub_080322A4(this)) { parent = this->parent; - if (parent == 0) { + if (parent == NULL) { if (sub_08049FDC(this, 1)) { if ((++this->field_0x78.HALF.HI & 7) == 0) { sub_08004596(this, GetFacingDirection(this, gUnk_020000B0)); @@ -421,20 +462,22 @@ void sub_08032008(Entity* this) { } } -void sub_08032148(Entity* this) { +void AcroBandit_Type1Action5(Entity* this) { if (GravityUpdate(this, 0x2000)) return; sub_08032290(this); } -void sub_08032160(Entity* this) { +void AcroBandit_Type1Action6(Entity* this) { + static const u8 fallDirections[] = { 0x8, 0x1c, 0x11, 0x2, 0x15, 0xc, 0x0, 0x15, 0x6, 0x19, + 0x10, 0x4, 0x19, 0xa, 0x1d, 0x14, 0x8, 0x1d, 0xe, 0x1 }; Entity* tmp; u32 dir; if (this->actionDelay == 0) { this->action = 7; - dir = gUnk_080CE5FA[this->field_0x74.HALF.LO * 5 + this->type2]; + dir = fallDirections[this->field_0x74.HALF.LO * 5 + this->type2]; this->direction = dir; if (dir >= 0x10) { this->spriteSettings.flipX = 1; @@ -456,14 +499,14 @@ void sub_08032160(Entity* this) { } } -void sub_080321E8(Entity* this) { +void AcroBandit_Type1Action7(Entity* this) { ProcessMovement2(this); if (sub_080044EC(this, 0x2000) == 0) this->action = 8; } -void sub_08032204(Entity* this) { +void AcroBandit_Type1Action8(Entity* this) { GetNextFrame(this); if (this->frame & 1) { this->frame = 0; @@ -476,7 +519,7 @@ void sub_08032204(Entity* this) { } } -void sub_08032248(Entity* this) { +void AcroBandit_Type1Action9(Entity* this) { if (GravityUpdate(this, Q_8_8(24.0)) == 0) { if (this->frame & ANIM_DONE) { ((Entity*)this->field_0x7c.WORD)->actionDelay--; @@ -497,30 +540,29 @@ void sub_08032290(Entity* this) { InitializeAnimation(this, 11); } -u32 sub_080322A4(Entity* this) { +bool32 sub_080322A4(Entity* this) { if (this->child != NULL && (this->child->z.HALF.HI + 8) >= this->z.HALF.HI) { if (this->z.HALF.HI) { this->action = 5; this->z.HALF.HI = this->child->z.HALF.HI + 8; InitializeAnimation(this, 11); - return 1; + return TRUE; } else { sub_08032290(this); - return 1; + return TRUE; } } - return 0; + return FALSE; } void sub_080322E8(Entity* this) { - u8 tmp; if (this->field_0x78.HALF.LO) { if (--this->field_0x78.HALF.LO == 0) { u32 flipX = this->spriteSettings.flipX; this->spriteSettings.flipX = flipX ^ 1; } } else { - tmp = this->direction; + u8 tmp = this->direction; if (tmp & 0xF) { tmp >>= 4; tmp ^= 1; diff --git a/src/enemy/armos.c b/src/enemy/armos.c index 0fd596a2..09c732e7 100644 --- a/src/enemy/armos.c +++ b/src/enemy/armos.c @@ -306,12 +306,12 @@ bool32 sub_08030650(ArmosEntity* this) { return 1; } } else if (this->unk_80 != 2) { - if ((sub_08049FDC(super, 1) == 0) || (0x20 < (gUnk_020000B0->x.HALF.HI - super->x.HALF.HI) + 0x10U)) { + if (!sub_08049FDC(super, 1) || (0x20 < (gUnk_020000B0->x.HALF.HI - super->x.HALF.HI) + 0x10U)) { return FALSE; } return TRUE; } else { - if (sub_08049FDC(super, 1) == 0) { + if (!sub_08049FDC(super, 1)) { return FALSE; } if (gUnk_020000B0->x.HALF.HI >= (s32)(gRoomControls.origin_x + 0xa8)) { diff --git a/src/enemy/beetle.c b/src/enemy/beetle.c index 25e104c8..dc15be53 100644 --- a/src/enemy/beetle.c +++ b/src/enemy/beetle.c @@ -60,7 +60,7 @@ void Beetle_OnDeath(Entity* this) { GenericDeath(this); } else { Entity* ent = this->parent; - if (ent) { + if (ent != NULL) { ent->field_0xf--; this->parent = NULL; } diff --git a/src/enemy/bobomb.c b/src/enemy/bobomb.c index 7e214b63..e47bf4e4 100644 --- a/src/enemy/bobomb.c +++ b/src/enemy/bobomb.c @@ -6,6 +6,7 @@ */ #include "asm.h" +#include "collision.h" #include "sound.h" #include "enemy.h" #include "object.h" @@ -160,7 +161,7 @@ void sub_0802C91C(Entity* this) { GetNextFrame(this); ProcessMovement0(this); if (this->field_0x82.HALF.LO) { - if (this->collisions) { + if (this->collisions != COL_NONE) { sub_0800417E(this, this->collisions); InitializeAnimation(this, (this->direction >> 4) | 2); } @@ -173,7 +174,7 @@ void sub_0802C91C(Entity* this) { sub_0802CC18(this); } } else { - if (this->collisions) { + if (this->collisions != COL_NONE) { sub_0800417E(this, this->collisions); InitializeAnimation(this, this->direction >> 4); } @@ -289,7 +290,7 @@ void sub_0802CBC4(Entity* this) { FreeCarryEntity(this); ent = CreateObjectWithParent(this, OBJECT_20, 0, 0); - if (ent) { + if (ent != NULL) { ent->collisionLayer = this->collisionLayer; } } diff --git a/src/enemy/bombPeahat.c b/src/enemy/bombPeahat.c index 5c327b91..5cb6e1db 100644 --- a/src/enemy/bombPeahat.c +++ b/src/enemy/bombPeahat.c @@ -92,7 +92,6 @@ void sub_0802A8FC(Entity* this) { } void nullsub_143(Entity* this) { - /* ... */ } void sub_0802A91C(Entity* this) { @@ -167,7 +166,7 @@ void sub_0802AA40(Entity* this) { this->actionDelay--; } else { Entity* ent = this->child; - if (ent) { + if (ent != NULL) { if (ent->next == NULL) { this->child = NULL; } else { @@ -212,7 +211,7 @@ void sub_0802AAC0(Entity* this) { } } #else - } else if (ent->actionDelay == 0 && ent->field_0xf < 0x51) { + } else if ((ent->actionDelay == 0) && (ent->field_0xf <= 0x50)) { this->field_0x80.HALF.HI = 0; } #endif @@ -304,7 +303,7 @@ void sub_0802AC40(Entity* this) { GetNextFrame(this); LinearMoveUpdate(this); if (this->field_0x7a.HALF.LO) { - if (sub_0802B234(this) == 0) { + if (!sub_0802B234(this)) { this->field_0x7a.HALF.LO = 0; this->spritePriority.b1 = 0; #ifndef EU @@ -349,7 +348,7 @@ void sub_0802ACDC(Entity* this, u32 param_2) { void sub_0802AD1C(Entity* this, u32 param_2) { Entity* ent = sub_08049DF4(1); - if (ent) { + if (ent != NULL) { u32 y = ent->y.HALF.HI - 0x18; u32 x = ent->x.HALF.HI; sub_08004596(this, sub_080045B4(this, x, y)); @@ -416,7 +415,7 @@ void sub_0802AE24(Entity* this) { #ifdef EU void sub_0802AE68(Entity* this) { Entity* ent = this->parent; - if (ent == 0) { + if (ent == NULL) { this->action = 3; this->spriteSettings.draw = 1; this->field_0x80.HALF.LO = 1; @@ -441,7 +440,7 @@ void sub_0802AE68(Entity* this) { #else void sub_0802AE68(Entity* this) { Entity* ent = sub_0802B250(this); - if (ent == 0) { + if (ent == NULL) { this->action = 3; this->field_0x80.HALF.LO = 1; sub_0802B264(this); @@ -559,7 +558,7 @@ void sub_0802B048(Entity* this) { } ent = this->parent; - if (ent && this->action == 1) { + if ((ent != NULL) && this->action == 1) { this->spriteRendering.b3 = ent->spriteRendering.b3; this->spritePriority.b0 = ent->spritePriority.b0; this->spriteOrientation.flipY = ent->spriteOrientation.flipY; @@ -588,7 +587,7 @@ void sub_0802B048(Entity* this) { COLLISION_ON(this); this->field_0x7a.HALF.HI = 0; FreeCarryEntity(this); - if (this->parent->next) { + if (this->parent->next != NULL) { this->parent->field_0x80.HALF.HI = 0; } ent = CreateObjectWithParent(this, OBJECT_20, 0, 0); @@ -622,7 +621,7 @@ void sub_0802B1BC(Entity* this) { } ent = this->parent; - if (ent == 0) { + if (ent == NULL) { this->action = 2; this->spriteSettings.draw = 1; } @@ -651,7 +650,7 @@ void sub_0802B1BC(Entity* this) { } ent = sub_0802B250(this); - if (ent == 0) { + if (ent == NULL) { this->action = 2; sub_0802B264(this); } else { @@ -668,7 +667,7 @@ void sub_0802B1BC(Entity* this) { void sub_0802B204(Entity* this) { if (sub_080044EC(this, 0x2800) == 1) { Entity* ent = CreateEnemy(BOBOMB, 1); - if (ent) { + if (ent != NULL) { CopyPosition(this, ent); ent->parent = this->parent; } @@ -686,7 +685,7 @@ bool32 sub_0802B234(Entity* this) { #ifndef EU Entity* sub_0802B250(Entity* this) { Entity* parent = this->parent; - if (parent && parent->next == NULL) { + if ((parent != NULL) && (parent->next == NULL)) { parent = NULL; } return parent; diff --git a/src/enemy/bombarossa.c b/src/enemy/bombarossa.c index 4004edb5..2119c5e0 100644 --- a/src/enemy/bombarossa.c +++ b/src/enemy/bombarossa.c @@ -44,7 +44,7 @@ void Bombarossa_OnCollision(BombarossaEntity* this) { switch (super->bitfield & 0x7f) { default: ent = CreateObject(OBJECT_20, 0, 0); - if (ent) { + if (ent != NULL) { CopyPosition(super, ent); } DeleteThisEntity(); diff --git a/src/enemy/bowMoblin.c b/src/enemy/bowMoblin.c index b65f1ea3..35d3b011 100644 --- a/src/enemy/bowMoblin.c +++ b/src/enemy/bowMoblin.c @@ -230,7 +230,7 @@ void sub_0803C400(BowMoblinEntity* this) { } sub_0803C6DC(this); - if (super->child) { + if (super->child != NULL) { sub_0803C714(this); } } @@ -271,7 +271,7 @@ void sub_0803C4B0(BowMoblinEntity* this) { u32 sub_0803C568(BowMoblinEntity* this) { if (this->unk_0x81 == 0) { Entity* ent = sub_08049DF4(1); - if (ent) { + if (ent != NULL) { if (this->unk_0x82 == 2) { if (sub_0806FC80(super, ent, 0x30)) { return 1; diff --git a/src/enemy/businessScrub.c b/src/enemy/businessScrub.c index 8283894b..45cf55b8 100644 --- a/src/enemy/businessScrub.c +++ b/src/enemy/businessScrub.c @@ -384,7 +384,7 @@ void sub_08028F0C(Entity* this) { SetPlayerControl(1); } MessageFromTarget(dialog); - gMessage.field_0x10 = offer->price; + gMessage.rupees = offer->price; } } diff --git a/src/enemy/businessScrubPrologue.c b/src/enemy/businessScrubPrologue.c index b4dd50e1..4366c0ab 100644 --- a/src/enemy/businessScrubPrologue.c +++ b/src/enemy/businessScrubPrologue.c @@ -48,7 +48,7 @@ void BusinessScrubPrologue_OnCollision(BusinessScrubPrologueEntity* this) { super->flags &= ~ENT_COLLIDE; sub_08046030(this, 4); ent = CreateFx(super, FX_BUSH, 0); - if (ent) { + if (ent != NULL) { ent->z.HALF.HI -= 8; } @@ -123,7 +123,7 @@ void sub_08045CE0(BusinessScrubPrologueEntity* this) { sub_0804604C(this); if (super->frame & 1) { ent = CreateProjectileWithParent(super, DEKU_SEED_PROJECTILE, 0); - if (ent) { + if (ent != NULL) { ent->parent = super; ent->direction = super->direction; super->frame &= 0xfe; @@ -186,7 +186,7 @@ void sub_08045E14(BusinessScrubPrologueEntity* this) { super->subAction = 0; sub_08046030(this, 0); ent = Create0x68FX(super, FX_STARS); - if (ent) { + if (ent != NULL) { ent->spritePriority.b0 = 3; ent->z.HALF.HI -= 0xc; SetDefaultPriority(ent, PRIO_MESSAGE); @@ -299,7 +299,7 @@ void sub_08046078(BusinessScrubPrologueEntity* this) { for (index = 0; index <= 4; index++) { ent = CreateFx(super, FX_DEATH, 0x40); - if (ent) { + if (ent != NULL) { ent->x.HALF.HI = gRoomControls.origin_x + *ptr; ptr++; ent->y.HALF.HI = gRoomControls.origin_y + *ptr; @@ -315,12 +315,12 @@ void sub_08046078(BusinessScrubPrologueEntity* this) { RestorePrevTileEntity(0x7a7, 1); ent = CreateFx(super, FX_BIG_EXPLOSION2, 0x40); - if (ent) { + if (ent != NULL) { CopyPosition(super, ent); EnqueueSFX(SFX_184); } - if (super->child) { + if (super->child != NULL) { super->child->action = 0xff; } diff --git a/src/enemy/chuchu.c b/src/enemy/chuchu.c index 9f23dd3b..856acda5 100644 --- a/src/enemy/chuchu.c +++ b/src/enemy/chuchu.c @@ -123,7 +123,7 @@ void Chuchu_OnCollision(Entity* this) { } void Chuchu_OnGrabbed(Entity* this) { - if (sub_0806F520(this) == 0 && this->confusedTime) { + if (!sub_0806F520(this) && this->confusedTime) { Create0x68FX(this, FX_STARS); InitializeAnimation(this, 6); } else { @@ -552,7 +552,7 @@ void sub_0801F884(Entity* this) { this->field_0xf--; } else { Entity* ent = Create0x68FX(this, FX_LIGHTNING_STRIKE); - if (ent) { + if (ent != NULL) { ent->type2 = 64; this->action = 4; this->hitType = 165; diff --git a/src/enemy/cloudPiranha.c b/src/enemy/cloudPiranha.c index 6922958c..e1075af3 100644 --- a/src/enemy/cloudPiranha.c +++ b/src/enemy/cloudPiranha.c @@ -7,6 +7,7 @@ #define NENT_DEPRECATED #include "global.h" +#include "collision.h" #include "enemy.h" #include "functions.h" #include "coord.h" @@ -259,7 +260,7 @@ void sub_080387F0(CloudPiranhaEntity* this) { if ((iVar4 == 0xf) || (iVar4 == 0x2a)) { super->direction = (super->direction + 0x10) & 0x1f; } else { - if (super->collisions != 0) { + if (super->collisions != COL_NONE) { sub_0800417E(super, super->collisions); } } diff --git a/src/enemy/cuccoAggr.c b/src/enemy/cuccoAggr.c index 28b32be5..5d2631df 100644 --- a/src/enemy/cuccoAggr.c +++ b/src/enemy/cuccoAggr.c @@ -295,7 +295,7 @@ void sub_080391B4(CuccoAggrEntity* this) { if (this->unk_7a) { if ((this->unk_7b++ & 0x1f) == 0) { Entity* ent = CreateEnemy(CUCCO_AGGR, 2); - if (ent) { + if (ent != NULL) { u32 rand = (Random() & 0x17); const PosOffset* ptr = &gCuccoAggrSpawnPoints[rand]; ent->x.HALF.HI = gRoomControls.scroll_x + ptr->x; @@ -321,7 +321,7 @@ void sub_08039218(CuccoAggrEntity* this) { void CuccoAggr_CreateFx(CuccoAggrEntity* this) { Entity* ent = CreateFx(super, gCuccoAggrFx[super->type], 0); - if (ent) { + if (ent != NULL) { ent->x.HALF.HI += gCuccoAggrFxHorizontalOffsets[super->spriteSettings.flipX]; } } diff --git a/src/enemy/darkNut.c b/src/enemy/darkNut.c index 7fae4b0b..3d91e7f4 100644 --- a/src/enemy/darkNut.c +++ b/src/enemy/darkNut.c @@ -312,7 +312,7 @@ void sub_080210E4(Entity* this) { this->frame &= ~1; ent = CreateProjectileWithParent(this, DARK_NUT_SWORD_SLASH, 2); - if (ent) { + if (ent != NULL) { ent->parent = this; this->child = ent; } @@ -558,7 +558,7 @@ void sub_08021540(Entity* this) { } void sub_08021588(Entity* this) { - if (this->child) { + if (this->child != NULL) { this->child->parent = NULL; this->child = NULL; } @@ -571,7 +571,7 @@ void sub_0802159C(Entity* this) { this->frame = 0; this->hitType = 0x51; ent = CreateProjectileWithParent(this, DARK_NUT_SWORD_SLASH, 3); - if (ent) { + if (ent != NULL) { ent->parent = this; this->child = ent; } @@ -592,7 +592,7 @@ void sub_08021600(Entity* this) { this->frame = 0; this->hitType = 0x51; ent = CreateProjectileWithParent(this, DARK_NUT_SWORD_SLASH, 4); - if (ent) { + if (ent != NULL) { ent->parent = this; this->child = ent; } @@ -610,8 +610,6 @@ void sub_08021644(Entity* this) { } } -extern u32 sub_08049F1C(Entity*, Entity*, u32); - u32 sub_08021664(Entity* this, Entity* ent) { switch (this->animationState) { case 0: diff --git a/src/enemy/enemy50.c b/src/enemy/enemy50.c index 2811e901..40bd1fde 100644 --- a/src/enemy/enemy50.c +++ b/src/enemy/enemy50.c @@ -154,7 +154,7 @@ void sub_08040D30(Enemy50Entity* this) { } void sub_08040D90(Enemy50Entity* this) { - if (sub_0806F520()) { + if (sub_0806F520(super)) { Enemy50_SubActions[super->subAction](this); } else { sub_08041128(this); diff --git a/src/enemy/fallingBoulder.c b/src/enemy/fallingBoulder.c index 4928bf84..828b3670 100644 --- a/src/enemy/fallingBoulder.c +++ b/src/enemy/fallingBoulder.c @@ -97,7 +97,7 @@ NONMATCH("asm/non_matching/fallingBoulder/sub_0802C334.inc", void sub_0802C334(E s32 i; for (i = 1; i > -1; i--) { Entity* ent = CreateFx(this, FX_ROCK2, 0); - if (ent) { + if (ent != NULL) { ent->x.HALF.HI += 12; ent->x.HALF.HI -= diff; } diff --git a/src/enemy/fireballGuy.c b/src/enemy/fireballGuy.c index 43ceb90c..6e140df5 100644 --- a/src/enemy/fireballGuy.c +++ b/src/enemy/fireballGuy.c @@ -91,7 +91,7 @@ void sub_08045454(Entity* this) { } ent = CreateFx(this, FX_DEATH, 0); - if (ent) + if (ent != NULL) CopyPosition(this, ent); DeleteEntity(this); diff --git a/src/enemy/flyingPot.c b/src/enemy/flyingPot.c new file mode 100644 index 00000000..1736979d --- /dev/null +++ b/src/enemy/flyingPot.c @@ -0,0 +1,265 @@ +/** + * @file flyingPot.c + * @ingroup Enemies + * + * @brief Flying pot enemy + */ +#define NENT_DEPRECATED +#include "collision.h" +#include "functions.h" +#include "enemy.h" +#include "player.h" +#include "room.h" + +extern void (*const gUnk_080012C8[])(Entity*); +extern Hitbox gUnk_080FD34C; + +typedef struct { + /* 0x00 */ Entity base; + /* 0x68 */ u8 filler[0xC]; + /* 0x74 */ u16 tileIndex; +} FlyingPotEntity; + +enum FlyingPotActions { + /* 0 */ FLYING_POT_ACTION_0, + /* 1 */ FLYING_POT_ACTION_1, + /* 2 */ FLYING_POT_ACTION_2, + /* 3 */ FLYING_POT_ACTION_3, + /* 4 */ FLYING_POT_ACTION_4, + /* 5 */ FLYING_POT_ACTION_5, + /* 6 */ FLYING_POT_ACTION_6, +}; + +enum FlyingPotSubActions { + /* 0 */ FLYING_POT_SUBACTION_0, + /* 1 */ FLYING_POT_SUBACTION_1, + /* 2 */ FLYING_POT_SUBACTION_2, + /* 3 */ FLYING_POT_SUBACTION_3, + /* 4 */ FLYING_POT_SUBACTION_DO_NOTHING, + /* 5 */ FLYING_POT_SUBACTION_5, +}; + +// Functions +void FlyingPot_OnTick(FlyingPotEntity*); // 0803708C +void FlyingPot_OnCollision(FlyingPotEntity*); // 080370A4 +void FlyingPot_OnGrabbed(FlyingPotEntity*); // 0803712C + +// Subactions +void FlyingPot_SubAction0(FlyingPotEntity*); // 08037144 +void FlyingPot_SubAction1(FlyingPotEntity*); // 0803715C +void FlyingPot_SubAction2(FlyingPotEntity*); // 0803718C +void FlyingPot_SubAction3(FlyingPotEntity*); // 080371F8 +void FlyingPot_SubActionDoNothing(FlyingPotEntity*); +void FlyingPot_SubAction5(FlyingPotEntity*); // 08037218 + +// Actions +void FlyingPot_Init(FlyingPotEntity*); // ? // 08037220 +void FlyingPot_Action1(FlyingPotEntity*); // 08037280 +void FlyingPot_Action2(FlyingPotEntity*); // 080372E8 +void FlyingPot_Action3(FlyingPotEntity*); // 0803737C +void FlyingPot_Action4(FlyingPotEntity*); // 080373B0 +void FlyingPot_Action5(FlyingPotEntity*); // 080373C8 +void FlyingPot_Action6(FlyingPotEntity*); // 080373E0 + +void sub_08037408(FlyingPotEntity*); +void sub_08037418(FlyingPotEntity*); + +void (*const FlyingPot_Functions[])(Entity*) = { + (EntityActionPtr)FlyingPot_OnTick, + (EntityActionPtr)FlyingPot_OnCollision, + GenericKnockback, + GenericDeath, + GenericConfused, + (EntityActionPtr)FlyingPot_OnGrabbed, +}; + +void FlyingPot(Entity* thisx) { + s32 index = sub_080012DC(thisx); + + if (index != 0) { + gUnk_080012C8[index](thisx); + } else { + FlyingPot_Functions[GetNextFunction(thisx)](thisx); + } +} + +void FlyingPot_OnTick(FlyingPotEntity* this) { + static void (*const FlyingPot_Actions[])(FlyingPotEntity*) = { + FlyingPot_Init, FlyingPot_Action1, FlyingPot_Action2, FlyingPot_Action3, + FlyingPot_Action4, FlyingPot_Action5, FlyingPot_Action6, + }; + + FlyingPot_Actions[super->action](this); +} + +void FlyingPot_OnCollision(FlyingPotEntity* this) { + sub_08037418(this); + + if (super->bitfield == 0x9D) { + super->action = FLYING_POT_ACTION_6; + COLLISION_OFF(super); + super->zVelocity = 0x2A000; + super->spritePriority.b1 = 1; + + SetTile(this->tileIndex, TILE(super->x.HALF.HI, super->y.HALF.HI), super->collisionLayer); + } else if (super->z.HALF.HI != 0) { + sub_08037408(this); + } + + EnemyFunctionHandlerAfterCollision(super, FlyingPot_Functions); +} + +void FlyingPot_OnGrabbed(FlyingPotEntity* this) { + static void (*const FlyingPot_SubActions[])(FlyingPotEntity*) = { + FlyingPot_SubAction0, FlyingPot_SubAction1, FlyingPot_SubAction2, + FlyingPot_SubAction3, FlyingPot_SubActionDoNothing, FlyingPot_SubAction5, + }; + + FlyingPot_SubActions[super->subAction](this); +} + +void FlyingPot_SubAction0(FlyingPotEntity* this) { + sub_08037418(this); + + super->subAction = FLYING_POT_SUBACTION_1; + super->actionDelay = 0; + super->field_0x1d = 0x30; +} + +void FlyingPot_SubAction1(FlyingPotEntity* this) { + sub_08037418(this); + + if (sub_0806F520(super)) { + sub_0806F4E8(super); + } else { + super->spriteOffsetX = 0; + + if (super->z.HALF.HI != 0) { + sub_08037408(this); + } + } +} + +void FlyingPot_SubAction2(FlyingPotEntity* this) { + if (super->actionDelay == 0) { + sub_08037418(this); + super->actionDelay = 1; + COLLISION_OFF(super); + super->spriteOffsetX = 0; + + SetTile(this->tileIndex, TILE(super->x.HALF.HI, super->y.HALF.HI), super->collisionLayer); + } + + if (sub_0806F520(super)) { + sub_0806F3E4(super); + } else { + sub_08037408(this); + } +} + +void FlyingPot_SubAction3(FlyingPotEntity* this) { + if (!(gPlayerState.field_0x1c & 0xF)) { + sub_08037408(this); + } +} + +void FlyingPot_SubActionDoNothing(FlyingPotEntity* this) { +} + +void FlyingPot_SubAction5(FlyingPotEntity* this) { + sub_08037408(this); +} + +void FlyingPot_Init(FlyingPotEntity* this) { + u32 tile; + + super->action = FLYING_POT_ACTION_1; + super->field_0x1c = 2; + super->y.HALF.HI += 3; + + tile = TILE(super->x.HALF.HI, super->y.HALF.HI); + this->tileIndex = GetTileIndex(tile, super->collisionLayer); + SetTile(0x4000, tile, super->collisionLayer); + InitializeAnimation(super, 5); +} + +void FlyingPot_Action1(FlyingPotEntity* this) { + sub_08037418(this); + + if (GetTileTypeByEntity(super) != 0x4000) { + SetTile(this->tileIndex, TILE(super->x.HALF.HI, super->y.HALF.HI), super->collisionLayer); + sub_08037408(this); + } + + if (PlayerInRange(super, 1, 0x40)) { + super->action = FLYING_POT_ACTION_2; + super->actionDelay = 30; + } +} + +void FlyingPot_Action2(FlyingPotEntity* this) { + static const u8 offsets[] = { -1, 1, 1, -1 }; + + sub_08037418(this); + + super->spriteOffsetX += offsets[super->actionDelay & 3]; + + if (--super->actionDelay == 0) { + super->action = FLYING_POT_ACTION_3; + super->spritePriority.b1 = 1; + super->spriteOffsetX = 0; + super->hitType = 0xA0; + super->flags2 = 0xF; + super->hitbox = &gUnk_080FD34C; + + SetTile(this->tileIndex, TILE(super->x.HALF.HI, super->y.HALF.HI), super->collisionLayer); + } +} + +void FlyingPot_Action3(FlyingPotEntity* this) { + super->z.WORD -= 0x10000; + + if (super->z.HALF.HI <= -6) { + super->action = FLYING_POT_ACTION_4; + super->actionDelay = 10; + super->direction = GetFacingDirection(super, &gPlayerEntity); + } +} + +void FlyingPot_Action4(FlyingPotEntity* this) { + if (--super->actionDelay == 0) { + super->action = FLYING_POT_ACTION_5; + } +} + +void FlyingPot_Action5(FlyingPotEntity* this) { + ProcessMovement2(super); + + if (super->collisions != COL_NONE) { + sub_08037408(this); + } +} + +void FlyingPot_Action6(FlyingPotEntity* this) { + if (super->zVelocity < 0) { + super->spriteSettings.flipY = 1; + } + + if (!GravityUpdate(super, 0x2000)) { + sub_08037408(this); + } +} + +void sub_08037408(FlyingPotEntity* this) { + CreateFx(super, FX_POT_SHATTER, 0); + DeleteThisEntity(); +} + +void sub_08037418(FlyingPotEntity* this) { + u32 tile = COORD_TO_TILE(super); + + if (GetTileIndex(tile, super->collisionLayer) == 0x4067) { + SetTile(this->tileIndex, tile, super->collisionLayer); + DeleteThisEntity(); + } +} diff --git a/src/enemy/flyingSkull.c b/src/enemy/flyingSkull.c index 262781bb..0374b579 100644 --- a/src/enemy/flyingSkull.c +++ b/src/enemy/flyingSkull.c @@ -1,4 +1,5 @@ #define NENT_DEPRECATED +#include "collision.h" #include "entity.h" #include "enemy.h" #include "functions.h" @@ -140,7 +141,7 @@ void sub_08039DD8(FlyingSkullEntity* this) { super->actionDelay = 0x1e; } else { ent = CreateEnemy(STALFOS, super->type - 2); - if (ent) { + if (ent != NULL) { ent->type2 = 1; CopyPosition(super, ent); SetTile(this->unk_0x74, COORD_TO_TILE(super), super->collisionLayer); @@ -159,7 +160,7 @@ void sub_08039ECC(FlyingSkullEntity* this) { void sub_08039EE4(FlyingSkullEntity* this) { super->subAction = 1; COLLISION_OFF(super); - super->collisions = 0; + super->collisions = COL_NONE; super->hitbox = (Hitbox*)&gUnk_080FD340; gPlayerEntity.animationState; this->unk_0x76 = gPlayerEntity.animationState; @@ -175,7 +176,7 @@ void sub_08039F4C(FlyingSkullEntity* this) { void sub_08039F78(FlyingSkullEntity* this) { super->spritePriority.b1 = 1; - if (super->z.HALF.HI == 0 || super->collisions) { + if (super->z.HALF.HI == 0 || (super->collisions != COL_NONE)) { sub_0803A0E0(this); } } @@ -222,7 +223,7 @@ void sub_0803A09C(FlyingSkullEntity* this) { GetNextFrame(super); ProcessMovement2(super); - if (super->collisions) { + if (super->collisions != COL_NONE) { sub_0803A0E0(this); } } diff --git a/src/enemy/ghini.c b/src/enemy/ghini.c index 7bd4179b..ab807ba0 100644 --- a/src/enemy/ghini.c +++ b/src/enemy/ghini.c @@ -113,7 +113,7 @@ void Ghini_OnConfused(GhiniEntity* this) { } void Ghini_OnGrabbed(GhiniEntity* this) { - if (sub_0806F520()) { + if (sub_0806F520(super)) { Ghini_SubActions[super->subAction](this); } else { sub_0803F51C(this); diff --git a/src/enemy/gibdo.c b/src/enemy/gibdo.c index 4e18f26e..611e2fcc 100644 --- a/src/enemy/gibdo.c +++ b/src/enemy/gibdo.c @@ -42,9 +42,6 @@ void sub_08037ACC(GibdoEntity*); void Gibdo_CreateObjects(GibdoEntity*); void sub_08037A14(GibdoEntity*); -extern void sub_0804A4E4(Entity*, Entity*); -u32 sub_0804A044(Entity*, Entity*, u32); - void (*const Gibdo_Functions[6])(Entity*); void (*const gUnk_080CF2AC[9])(GibdoEntity*); extern Entity* gUnk_020000B0; diff --git a/src/enemy/gleerok.c b/src/enemy/gleerok.c index 0577eec7..95c2232c 100644 --- a/src/enemy/gleerok.c +++ b/src/enemy/gleerok.c @@ -283,7 +283,7 @@ NONMATCH("asm/non_matching/gleerok/sub_0802D3B8.inc", void sub_0802D3B8(GleerokE do { ent = CreateEnemy(GLEEROK, 1); super->child = ent; - if (ent) { + if (ent != NULL) { ent->type2 = uvar1 + 1; super->child->collisionLayer = super->collisionLayer; super->child->x.HALF.HI = super->x.HALF.HI; @@ -301,7 +301,7 @@ NONMATCH("asm/non_matching/gleerok/sub_0802D3B8.inc", void sub_0802D3B8(GleerokE ent = CreateEnemy(GLEEROK, 2); super->child = ent; - if (ent) { + if (ent != NULL) { super->child->collisionLayer = super->collisionLayer; super->child->x.HALF.HI = super->x.HALF.HI; super->child->y.HALF.HI = super->y.HALF.HI + ((uvar1 + 1) * 12); @@ -760,7 +760,7 @@ void sub_0802DCE0(GleerokEntity* this) { if (this->unk_84->ent2->field_0xf == 0) { super->child = CreateProjectileWithParent(super, GLEEROK_PROJECTILE, 0); - if (super->child) { + if (super->child != NULL) { super->child->direction = this->unk_84->filler[0x15]; super->child->type2 = this->unk_84->ent2->frame & 0xf; super->child->parent = this->unk_84->ent2; @@ -827,7 +827,7 @@ void sub_0802DDD8(GleerokEntity* this) { if (this->unk_84->ent2->field_0xf == 1) { super->child = CreateProjectileWithParent(super, GLEEROK_PROJECTILE, r2); - if (super->child) { + if (super->child != NULL) { super->child->direction = this->unk_84->filler[0x15]; super->child->type2 = this->unk_84->ent2->frame & 0xf; super->child->parent = this->unk_84->ent2; @@ -1094,7 +1094,7 @@ void sub_0802E300(GleerokEntity* this) { InitializeAnimation(super, 0x4d); ent = CreateEnemy(GLEEROK, 5); super->child = ent; - if (super->child) { + if (super->child != NULL) { super->child->parent = super; heap->ent = super->child; ((GleerokEntity*)super->child)->unk_84 = heap; diff --git a/src/enemy/gyorgChild.c b/src/enemy/gyorgChild.c index 698ad03a..84bd4e6e 100644 --- a/src/enemy/gyorgChild.c +++ b/src/enemy/gyorgChild.c @@ -56,7 +56,7 @@ void GyorgChild_OnGrabbed(GyorgChildEntity* this) { GyorgChild_OnGrabbed_Action1, GyorgChild_OnGrabbed_Action3, }; - if (sub_0806F520()) { + if (sub_0806F520(super)) { GyorgChild_OnGrabbed_Actions[super->subAction](this); } } diff --git a/src/enemy/helmasaur.c b/src/enemy/helmasaur.c index 5d34065a..731e24bb 100644 --- a/src/enemy/helmasaur.c +++ b/src/enemy/helmasaur.c @@ -98,7 +98,7 @@ void sub_0802BCA8(Entity* this) { this->field_0x3a = this->field_0x3a & 0xfb; this->field_0x1c = 0x12; ent = CreateEnemy(HELMASAUR, 1); - if (ent) { + if (ent != NULL) { ent->animationState = this->animationState; CopyPosition(this, ent); } @@ -356,7 +356,7 @@ void sub_0802C18C(Entity* this) { this->field_0x78.HALF.LO--; if ((this->field_0x78.HALF.LO & 7) == 0) { Entity* ent = CreateObject(SPECIAL_FX, 0x11, 0x40); - if (ent) { + if (ent != NULL) { PositionRelative(this, ent, 0, Q_16_16(1.0)); } } diff --git a/src/enemy/lakituCloud.c b/src/enemy/lakituCloud.c index 25616556..1c311f6c 100644 --- a/src/enemy/lakituCloud.c +++ b/src/enemy/lakituCloud.c @@ -34,7 +34,7 @@ void LakituCloud_OnKnockback(Entity* this) { } void LakituCloud_OnGrabbed(Entity* this) { - if (sub_0806F520(this) == 0) { + if (!sub_0806F520(this)) { if (this->subAction == 2) { sub_0803CE3C(this); } diff --git a/src/enemy/mazaalMacro.c b/src/enemy/mazaalMacro.c index 6140e2e5..24cca8a9 100644 --- a/src/enemy/mazaalMacro.c +++ b/src/enemy/mazaalMacro.c @@ -144,7 +144,7 @@ void sub_08034E68(Entity* this) { sub_08035120(this); } if (gRoomTransition.field_0x39 == 0) { - if (sub_08079F8C() != 0) { + if (sub_08079F8C()) { this->action = 3; scriptExecutionContext = StartCutscene(this, (u16*)script_MazaalMacroDefeated); *(ScriptExecutionContext**)&this->cutsceneBeh = scriptExecutionContext; diff --git a/src/enemy/miniSlime.c b/src/enemy/miniSlime.c index 7c82d1d6..aba4510e 100644 --- a/src/enemy/miniSlime.c +++ b/src/enemy/miniSlime.c @@ -34,7 +34,7 @@ void MiniSlime_OnCollision(Entity* this) { void MiniSlime_OnDeath(Entity* this) { Entity* parent = this->parent; - if (this != parent && parent) { + if ((this != parent) && (parent != NULL)) { this->field_0x6c.HALF.LO &= 0x7f; this->parent->child = this->child; this->child->parent = this->parent; diff --git a/src/enemy/moldorm.c b/src/enemy/moldorm.c index 7a5ab69c..2e7597ee 100644 --- a/src/enemy/moldorm.c +++ b/src/enemy/moldorm.c @@ -6,6 +6,7 @@ */ #include "enemy.h" +#include "collision.h" #include "functions.h" void sub_08022EAC(Entity*); @@ -103,7 +104,7 @@ void sub_08022D40(Entity* this) { sub_08022F14(this); ProcessMovement0(this); - if (this->collisions) { + if (this->collisions != COL_NONE) { sub_0800417E(this, this->collisions); this->animationState = ((this->direction + 2) & 0x1c) >> 2; this->frameIndex = this->animationState; @@ -112,7 +113,7 @@ void sub_08022D40(Entity* this) { } void sub_08022D90(Entity* this) { - if (this->parent->next) { + if (this->parent->next != NULL) { Entity* parent; gUnk_080CBBBC[this->action](this); diff --git a/src/enemy/moldworm.c b/src/enemy/moldworm.c index 03f29e2a..96a3ada3 100644 --- a/src/enemy/moldworm.c +++ b/src/enemy/moldworm.c @@ -42,7 +42,7 @@ NONMATCH("asm/non_matching/moldworm/Moldworm.inc", void Moldworm(Entity* this)) this->field_0x7c.BYTES.byte1 = this->field_0x7c.BYTES.byte0; EnemyFunctionHandler(this, Moldworm_Functions); } else { - if (this->parent->next) { + if (this->parent->next != NULL) { if (this->type != 8) { sub_080235BC(this); } else { @@ -191,7 +191,7 @@ void sub_08023AB0(Entity*); void sub_08023398(Entity* this) { this->field_0x7c.BYTES.byte0++; - if (this->field_0x7c.BYTES.byte3 && sub_08049FDC(this, 1) == 0) { + if (this->field_0x7c.BYTES.byte3 && !sub_08049FDC(this, 1)) { this->field_0x78.HWORD = 1; } @@ -258,7 +258,7 @@ void sub_080234D8(Entity* this) { } void sub_0802351C(Entity* this) { - if (this->actionDelay != 0 && (this->type2 == 1 || gPlayerEntity.frameIndex == 0xff)) { + if ((this->actionDelay != 0) && ((this->type2 == 1) || (gPlayerEntity.frameIndex == 0xff))) { this->actionDelay = 0; this->child->action = 3; this->child->field_0xf = this->field_0x80.HALF.LO; @@ -377,8 +377,8 @@ void sub_0802376C(Entity* this) { void sub_080237D8(Entity* this) { Entity* parent = this->parent; - if (parent->animIndex == 0x17 && this->actionDelay != 0 && this->x.HALF.HI == parent->x.HALF.HI && - this->y.HALF.HI == parent->y.HALF.HI) { + if ((parent->animIndex == 0x17) && (this->actionDelay != 0) && (this->x.HALF.HI == parent->x.HALF.HI) && + (this->y.HALF.HI == parent->y.HALF.HI)) { this->action = 1; COLLISION_OFF(this); this->spriteSettings.draw = 0; @@ -501,7 +501,7 @@ void sub_08023AB0(Entity* this) { if (this->field_0x7a.HALF.HI == 8) { if (this->field_0x7c.BYTES.byte2) { this->field_0x7c.BYTES.byte2--; - } else if (!sub_08023B38(this) || 0x1d >= this->field_0x78.HWORD) { + } else if (!sub_08023B38(this) || (this->field_0x78.HWORD <= 0x1D)) { this->hitType = 0x85; this->field_0x7a.HALF.HI = 0; this->field_0x7c.BYTES.byte2 = 30; diff --git a/src/enemy/mulldozer.c b/src/enemy/mulldozer.c index 6a6a79de..1550c4d1 100644 --- a/src/enemy/mulldozer.c +++ b/src/enemy/mulldozer.c @@ -7,6 +7,7 @@ #define NENT_DEPRECATED #include "global.h" +#include "collision.h" #include "enemy.h" #include "functions.h" @@ -63,11 +64,11 @@ void sub_08032CAC(MulldozerEntity* this) { case 2: case 3: super->action = 6; - super->actionDelay = super->type != 0 ? 0x5a : 200; + super->actionDelay = (super->type != 0) ? 0x5a : 200; super->field_0xf = 2; this->unk_80 = 3; super->direction = super->knockbackDirection; - super->direction = (super->direction + ((Random() & 0x40) != 0 ? 4 : 0x1c)); + super->direction += ((Random() & 0x40) != 0) ? 4 : 0x1c; super->direction &= 0x1f; super->speed = 0; break; @@ -102,7 +103,7 @@ void Mulldozer_Action1(MulldozerEntity* this) { if (--super->actionDelay == 0) { sub_080330C0(this); } else { - if (sub_08033364(this) != 0) { + if (sub_08033364(this)) { sub_08033100(this); } } @@ -200,7 +201,7 @@ void sub_08032F48(MulldozerEntity* this) { } void sub_08032F64(MulldozerEntity* this) { - if (super->collisions != 0) { + if (super->collisions != COL_NONE) { sub_0800417E(super, super->collisions); super->animationState = super->direction >> 2; sub_08032F24(this); diff --git a/src/enemy/octorok.c b/src/enemy/octorok.c index a205d1d6..85ed9aaa 100644 --- a/src/enemy/octorok.c +++ b/src/enemy/octorok.c @@ -129,7 +129,7 @@ void Octorok_ShootNut(Entity* this) { GetNextFrame(this); if (this->frame & 1) { Entity* ent = CreateProjectileWithParent(this, ROCK_PROJECTILE, 0); - if (ent) { + if (ent != NULL) { const s8* off; ent->direction = this->direction; off = &gOctorokNutOffset[this->direction / 4]; diff --git a/src/enemy/octorokBoss.c b/src/enemy/octorokBoss.c index 49ca9525..d69fefd0 100644 --- a/src/enemy/octorokBoss.c +++ b/src/enemy/octorokBoss.c @@ -6,6 +6,7 @@ */ #define NENT_DEPRECATED #include "enemy/octorokBoss.h" +#include "collision.h" #include "functions.h" #include "game.h" #include "object.h" @@ -494,7 +495,7 @@ void OctorokBoss_Action1(OctorokBossEntity* this) { sub_08036914(super, angle, radius); this->angle.HALF.HI = -((OctorokBossEntity*)super->parent)->angle.HALF.HI; } - if (IS_FROZEN((OctorokBossEntity*)super->parent) == 0) { + if (!IS_FROZEN((OctorokBossEntity*)super->parent)) { super->spriteSettings.draw |= 1; } break; @@ -639,14 +640,15 @@ void OctorokBoss_Action1_ChargeAttack(OctorokBossEntity* this) { if (this->timer == 0) { ProcessMovement0(super); - knockbackCondition = 0; + knockbackCondition = FALSE; if ((super->direction != 0) && (super->direction != 0x10)) { - knockbackCondition = ((u32)super->collisions & 0xee00) != 0; + knockbackCondition = ((super->collisions & (COL_EAST_ANY | COL_WEST_ANY)) != COL_NONE); } - if (((super->direction != 0x18) && (super->direction != 8)) && ((super->collisions & 0xee) != 0)) { - knockbackCondition = 1; + if (((super->direction != 0x18) && (super->direction != 8)) && + (super->collisions & (COL_NORTH_ANY | COL_SOUTH_ANY))) { + knockbackCondition = TRUE; } - if (knockbackCondition != 0) { + if (knockbackCondition) { super->knockbackDuration = 0x20; super->knockbackSpeed = 0x200; super->knockbackDirection = super->direction ^ 0x10; @@ -911,7 +913,7 @@ void OctorokBoss_Burning(OctorokBossEntity* this) { void OctorokBoss_Burning_SubAction0(OctorokBossEntity* this) { super->subAction = 1; super->speed = 0x200; - super->collisions = 0; + super->collisions = COL_NONE; super->direction = (u8)(-this->angle.HALF.HI ^ 0x80U) >> 3; this->timer = 0x78; this->angularSpeed.HWORD = 0x180; @@ -922,13 +924,13 @@ void OctorokBoss_Burning_SubAction0(OctorokBossEntity* this) { void OctorokBoss_Burning_SubAction1(OctorokBossEntity* this) { ProcessMovement0(super); - if (super->collisions != 0) { + if (super->collisions != COL_NONE) { super->subAction = 2; this->heap->targetAngle = this->angle.HALF.HI; - if ((super->collisions & 0xee00) != 0) { + if ((super->collisions & (COL_EAST_ANY | COL_WEST_ANY)) != COL_NONE) { this->heap->targetAngle = -this->heap->targetAngle; } - if ((super->collisions & 0xee) != 0) { + if ((super->collisions & (COL_NORTH_ANY | COL_SOUTH_ANY)) != COL_NONE) { this->heap->targetAngle = -this->heap->targetAngle ^ 0x80; } super->knockbackDuration = 0x18; @@ -951,10 +953,10 @@ void OctorokBoss_Burning_SubAction2(OctorokBossEntity* this) { if ((u32)(this->heap->targetAngle - this->angle.HALF.HI + 7) < 0xf) { super->subAction = 1; super->direction = ((u8) - this->angle.HALF.HI ^ 0x80) >> 3; - super->collisions = 0; + super->collisions = COL_NONE; ProcessMovement0(super); } else { - if ((u8)(this->heap->targetAngle - this->angle.HALF.HI) >= 0x81) { + if ((u8)(this->heap->targetAngle - this->angle.HALF.HI) > 0x80) { this->angle.HWORD -= this->angularSpeed.HWORD; } else { this->angle.HWORD += this->angularSpeed.HWORD; @@ -1161,7 +1163,7 @@ void OctorokBoss_StartRegularAttack(OctorokBossEntity* this) { super->subAction = ACTION1_SUBACTION2; super->speed = 0x200; this->timer = 0x3c; - super->collisions = 0; + super->collisions = COL_NONE; this->heap->unk_0 = 4; SoundReq(SFX_159); return; diff --git a/src/enemy/octorokGolden.c b/src/enemy/octorokGolden.c index 4bdac449..a2fcfab6 100644 --- a/src/enemy/octorokGolden.c +++ b/src/enemy/octorokGolden.c @@ -8,9 +8,6 @@ extern void (*const gUnk_080012C8[])(Entity*); const s8 gUnk_080CF490[]; const u8 gUnk_080CF498[]; -extern s32 sub_080012DC(Entity*); -extern u32 sub_0804A044(Entity*, Entity*, u32); - void sub_08037E14(Entity* this); bool32 sub_08037E90(Entity* this); diff --git a/src/enemy/peahat.c b/src/enemy/peahat.c index c6051ba0..93452e64 100644 --- a/src/enemy/peahat.c +++ b/src/enemy/peahat.c @@ -19,9 +19,6 @@ extern const s8 gUnk_080CA5D4[]; void sub_080205F8(Entity*); void sub_08020604(Entity*); -extern u32 sub_08049F1C(Entity*, Entity*, u32); -extern void sub_0804AA1C(Entity*); - extern Entity* gUnk_020000B0; enum { @@ -57,7 +54,7 @@ void Peahat_OnCollision(Entity* this) { if (this->field_0x82.HALF.LO) { if (this->bitfield == 0x94) { Entity* ent = CreateEnemy(PEAHAT, PeahatForm_Propeller); - if (ent) { + if (ent != NULL) { CopyPosition(this, ent); ent->z.HALF.HI -= 8; } diff --git a/src/enemy/pesto.c b/src/enemy/pesto.c index f7f8baf1..210d8b41 100644 --- a/src/enemy/pesto.c +++ b/src/enemy/pesto.c @@ -6,6 +6,7 @@ */ #include "enemy.h" +#include "collision.h" #include "object.h" #include "game.h" #include "functions.h" @@ -170,7 +171,7 @@ void sub_080240B8(Entity* this) { this->field_0x82.HALF.HI = 0; ent = CreateProjectileWithParent(this, DIRT_BALL_PROJECTILE, this->field_0x82.HALF.HI); - if (ent) { + if (ent != NULL) { this->child = ent; ent->parent = this; ent->y.HALF.HI += 0x10; @@ -413,7 +414,7 @@ void sub_080244E8(Entity* this) { this->field_0x78.HWORD -= 0xe; ent = CreateProjectileWithParent(this, DIRT_BALL_PROJECTILE, this->field_0x82.HALF.HI); - if (ent) { + if (ent != NULL) { ent->parent = this; ent->z.HALF.HI += 0xe; ent->child = this->child; @@ -436,7 +437,7 @@ void sub_080244E8(Entity* this) { this->field_0x78.HWORD -= 0xe; ent = CreateProjectileWithParent(this, DIRT_BALL_PROJECTILE, this->field_0x82.HALF.HI); - if (ent) { + if (ent != NULL) { ent->parent = this; ent->z.HALF.HI += 0xe; this->child = ent; @@ -525,7 +526,7 @@ void sub_080244E8(Entity* this) { void sub_08024940(Entity* this) { u32 random = Random() & 0x70; - if (this->collisions != 0) { + if (this->collisions != COL_NONE) { sub_0800417E(this, this->collisions); sub_080249F4(this); } @@ -661,7 +662,7 @@ bool32 sub_08024B38(Entity* this) { } ent = FindEntityByID(PLAYER_ITEM, PLAYER_ITEM_BOMB, 2); - if (ent) { + if (ent != NULL) { do { if (ent->action != 2 && ent->z.HALF.HI == 0 && sub_08049F1C(this, ent, 0xa0)) { iVar4 = 1; @@ -678,7 +679,7 @@ bool32 sub_08024B38(Entity* this) { } ent = FindEntityByID(OBJECT, POT, 6); - if (ent) { + if (ent != NULL) { do { if (ent->action == 1 && sub_08049F1C(this, ent, 0xa0)) { iVar4 = 1; diff --git a/src/enemy/puffstool.c b/src/enemy/puffstool.c index 18838cf6..3b080dd8 100644 --- a/src/enemy/puffstool.c +++ b/src/enemy/puffstool.c @@ -6,6 +6,7 @@ */ #include "enemy.h" +#include "collision.h" #include "object.h" #include "functions.h" @@ -156,7 +157,7 @@ void sub_08025230(Entity* this) { this->direction = sub_08025C60(this); } - if (this->collisions != 0) { + if (this->collisions != COL_NONE) { if (--this->field_0xf == 0) { sub_0800417E(this, this->collisions); } @@ -528,12 +529,12 @@ void sub_08025AE8(Entity* this) { Entity* ent; ent = CreateFx(this, FX_BROWN_SMOKE, 0); - if (ent) { + if (ent != NULL) { ent->y.WORD--; } ent = CreateFx(this, FX_BROWN_SMOKE_LARGE, 0); - if (ent) { + if (ent != NULL) { ent->y.WORD++; } } @@ -552,7 +553,7 @@ void sub_08025B18(Entity* this) { sub_08025AB8((((x + offset[0]) >> 4) & 0x3fU) | ((((y + offset[1]) >> 4) & 0x3fU) << 6), layer); ent = CreateObject(OBJECT_21, 2, 0); - if (ent) { + if (ent != NULL) { PositionRelative(this, ent, Q_16_16(offset[0]), Q_16_16(offset[1])); ent->x.HALF.HI &= -0x10; ent->x.HALF.HI += 8; @@ -566,7 +567,7 @@ void sub_08025B18(Entity* this) { void sub_08025BD4(Entity* this) { if (this->field_0x82.HALF.LO && (this->frame & 1) == 0) { Entity* ent = CreateObject(OBJECT_21, 0, 0); - if (ent) { + if (ent != NULL) { PositionRelative(this, ent, Q_16_16(gUnk_080CC0BA[this->animationState * 2 + 0]), Q_16_16(gUnk_080CC0BA[this->animationState * 2 + 1])); ent->z.HALF.HI = -10; diff --git a/src/enemy/rockChuchu.c b/src/enemy/rockChuchu.c index f1d8bad4..9f118b2b 100644 --- a/src/enemy/rockChuchu.c +++ b/src/enemy/rockChuchu.c @@ -8,8 +8,6 @@ #include "enemy.h" #include "functions.h" -extern void sub_0804A4E4(Entity*, Entity*); - extern void (*const RockChuchu_Functions[])(Entity*); extern void (*const gUnk_080CB960[])(Entity*); @@ -47,7 +45,7 @@ void RockChuchu_OnCollision(Entity* this) { case 0x1c: CreateFx(this, FX_ROCK, 0); ent = CreateEnemy(CHUCHU, 1); - if (ent) { + if (ent != NULL) { ent->type2 = 1; #ifndef EU ent->iframes = -8; @@ -102,7 +100,7 @@ void sub_080223E4(Entity* this) { Entity* ent; ent = this->child; - if (ent) { + if (ent != NULL) { ent->bitfield = 0x94; ent->iframes = 0x10; #ifndef EU diff --git a/src/enemy/rope.c b/src/enemy/rope.c index 8d728a03..37c63337 100644 --- a/src/enemy/rope.c +++ b/src/enemy/rope.c @@ -12,7 +12,6 @@ extern void (*const Rope_Functions[6])(Entity*); extern void (*const gUnk_080CE460[4])(Entity*); extern void (*const gUnk_080CE470[3])(Entity*); extern Entity* gUnk_020000B0; -extern u32 sub_0804A044(Entity*, Entity*, u32); void sub_08031600(Entity*); u32 sub_0803163C(Entity*); @@ -39,7 +38,7 @@ void Rope_OnCollision(Entity* this) { } void Rope_OnGrabbed(Entity* this) { - if (sub_0806F520()) { + if (sub_0806F520(this)) { gUnk_080CE470[this->subAction](this); } } diff --git a/src/enemy/ropeGolden.c b/src/enemy/ropeGolden.c index ca3a57c7..a4a6fc99 100644 --- a/src/enemy/ropeGolden.c +++ b/src/enemy/ropeGolden.c @@ -14,9 +14,6 @@ extern void (*const gUnk_080012C8[])(Entity*); extern void (*const RopeGolden_Functions[6])(Entity*); extern void (*const gUnk_080CF4E0[4])(Entity*); -extern s32 sub_080012DC(Entity*); -extern u32 sub_0804A044(Entity*, Entity*, u32); - void sub_080383AC(Entity*); void sub_080383E4(Entity*); diff --git a/src/enemy/scissorsBeetle.c b/src/enemy/scissorsBeetle.c index 28ce9d57..66914591 100644 --- a/src/enemy/scissorsBeetle.c +++ b/src/enemy/scissorsBeetle.c @@ -1,4 +1,5 @@ #define NENT_DEPRECATED +#include "collision.h" #include "entity.h" #include "enemy.h" #include "functions.h" @@ -63,7 +64,7 @@ void ScissorsBeetle_OnGrabbed(ScissorsBeetleEntity* this) { void ScissorsBeetle_Init(ScissorsBeetleEntity* this) { Entity* ent = CreateProjectile(MANDIBLES_PROJECTILE); - if (!ent) + if (ent == NULL) return; sub_0804A720(super); @@ -92,7 +93,7 @@ void sub_080389E8(ScissorsBeetleEntity* this) { sub_08038C2C((ScissorsBeetleEntity*)child); } else if (super->actionDelay) { super->actionDelay--; - } else if (super->collisions) { + } else if (super->collisions != COL_NONE) { super->actionDelay = 0xc; if ((child->animationState & 1) == 0) { child->animationState += Random() & 0x20 ? 1 : 7; diff --git a/src/enemy/slime.c b/src/enemy/slime.c index 3c88ae1c..ddae5cb9 100644 --- a/src/enemy/slime.c +++ b/src/enemy/slime.c @@ -15,8 +15,6 @@ typedef struct { void sub_08044FF8(Entity*); void sub_08045178(Entity*, Entity*, int, int); -extern void sub_0804A4E4(Entity*, Entity*); - extern void (*const gUnk_080D16BC[])(Entity*); extern void (*const Slime_Functions[])(Entity*); extern u8 gUnk_080D16D0[4]; // Entity count per form @@ -116,7 +114,7 @@ void sub_080450A8(Entity* this) { } ent = CreateFx(this, FX_DEATH, 0); - if (ent) + if (ent != NULL) CopyPosition(this, ent); DeleteEntity(this); diff --git a/src/enemy/sluggula.c b/src/enemy/sluggula.c index 5405cf71..759a3c5c 100644 --- a/src/enemy/sluggula.c +++ b/src/enemy/sluggula.c @@ -8,13 +8,9 @@ #include "enemy.h" #include "functions.h" -extern s32 sub_080012DC(Entity*); -bool32 PlayerInRange(Entity*, u32, u32); - void sub_08023E10(Entity*); void sub_08023E54(Entity*); void sub_08023E9C(Entity*); -void sub_0804A4E4(Entity*, Entity*); extern void (*const gUnk_080012C8[])(Entity*); @@ -136,7 +132,7 @@ void sub_08023CE0(Entity* this) { if (this->frame) { if (this->frame & ANIM_DONE) { Entity* ent = CreateEnemy(SLUGGULA, 1); - if (ent) { + if (ent != NULL) { sub_0804A4E4(this, ent); DeleteThisEntity(); } @@ -167,7 +163,7 @@ void sub_08023E54(Entity* this) { if (this->field_0xf++ > 27) { this->field_0xf = 0; ent = CreateEnemy(SLUGGULA, 2); - if (ent) { + if (ent != NULL) { const s8* ptr = &gUnk_080CBDF7[this->animationState * 2]; PositionRelative(this, ent, Q_16_16(ptr[0]), Q_16_16(ptr[1])); } @@ -178,7 +174,7 @@ extern Entity* gUnk_020000B0; void sub_08023E9C(Entity* this) { u32 uVar3 = Random(); - if (sub_08049FA0(this) == 0 && (uVar3 & 1)) { + if (!sub_08049FA0(this) && (uVar3 & 1)) { this->direction = DirectionRoundUp(sub_08049EE4(this)); } else if (sub_08049FDC(this, 1) && (uVar3 & 6)) { u32 uVar3 = GetFacingDirection(this, gUnk_020000B0) - this->direction; diff --git a/src/enemy/spark.c b/src/enemy/spark.c index f6f9325d..32cb9345 100644 --- a/src/enemy/spark.c +++ b/src/enemy/spark.c @@ -5,6 +5,7 @@ * @brief Spark enemy */ +#include "collision.h" #include "enemy.h" #include "object.h" #include "functions.h" @@ -30,7 +31,7 @@ void Spark_OnCollision(Entity* this) { this->spriteSettings.draw = 0; this->action = 2; ent = CreateFx(this, FX_DEATH, 0); - if (ent) { + if (ent != NULL) { this->child = ent; this->actionDelay = 14; CopyPosition(this, ent); @@ -40,7 +41,6 @@ void Spark_OnCollision(Entity* this) { } void Spark_OnGrabbed(Entity* this) { - /* ... */ } void sub_0802B33C(Entity* this) { @@ -57,7 +57,7 @@ void sub_0802B35C(Entity* this) { GetNextFrame(this); ProcessMovement0(this); is_head = this->type == 0; - if (this->collisions == 0) { + if (this->collisions == COL_NONE) { if (--this->field_0xf == 0) { this->field_0xf = 0x78; @@ -68,49 +68,49 @@ void sub_0802B35C(Entity* this) { this->field_0xf = 0x78; switch (DirectionRound(this->direction)) { case DirectionNorth: - if (this->collisions & 0xe) { + if ((this->collisions & COL_NORTH_ANY) != COL_NONE) { this->direction = is_head ? DirectionWest : DirectionEast; } else { - if ((this->collisions & 0xe000) == 0x4000 && is_head) { + if (((this->collisions & COL_EAST_ANY) == COL_EAST_NORTH) && is_head) { this->direction = DirectionEast; } - if ((this->collisions & 0xe00) == 0x400 && !is_head) { + if (((this->collisions & COL_WEST_ANY) == COL_WEST_NORTH) && !is_head) { this->direction = DirectionWest; } } break; case DirectionSouth: - if (this->collisions & 0xe0) { + if ((this->collisions & COL_SOUTH_ANY) != COL_NONE) { this->direction = is_head ? DirectionEast : DirectionWest; } else { - if ((this->collisions & 0xe000) == 0x2000 && !is_head) { + if (((this->collisions & COL_EAST_ANY) == COL_EAST_SOUTH) && !is_head) { this->direction = DirectionEast; } - if ((this->collisions & 0xe00) == 0x200 && is_head) { + if (((this->collisions & COL_WEST_ANY) == COL_WEST_SOUTH) && is_head) { this->direction = DirectionWest; } } break; case DirectionWest: - if (this->collisions & 0xe00) { + if ((this->collisions & COL_WEST_ANY) != COL_NONE) { this->direction = is_head ? DirectionSouth : DirectionNorth; } else { - if ((this->collisions & 0xe) == 4 && is_head) { + if (((this->collisions & COL_NORTH_ANY) == COL_NORTH_EAST) && is_head) { this->direction = DirectionNorth; } - if ((this->collisions & 0xe0) == 0x40 && !is_head) { + if (((this->collisions & COL_SOUTH_ANY) == COL_SOUTH_EAST) && !is_head) { this->direction = DirectionSouth; } } break; case DirectionEast: - if (this->collisions & 0xe000) { + if ((this->collisions & COL_EAST_ANY) != COL_NONE) { this->direction = is_head ? DirectionNorth : DirectionSouth; } else { - if ((this->collisions & 0xe) == 2 && !is_head) { + if (((this->collisions & COL_NORTH_ANY) == COL_NORTH_WEST) && !is_head) { this->direction = DirectionNorth; } - if ((this->collisions & 0xe0) == 0x20 && is_head) { + if (((this->collisions & COL_SOUTH_ANY) == COL_SOUTH_WEST) && is_head) { this->direction = DirectionSouth; } } @@ -122,7 +122,7 @@ void sub_0802B35C(Entity* this) { void sub_0802B4A8(Entity* this) { if (--this->actionDelay == 0) { Entity* ent = CreateObjectWithParent(this, GROUND_ITEM, 0x60, 0); - if (ent) { + if (ent != NULL) { ent->y.HALF.HI -= 4; } DeleteEntity(this); diff --git a/src/enemy/spearMoblin.c b/src/enemy/spearMoblin.c index 53412903..a824b803 100644 --- a/src/enemy/spearMoblin.c +++ b/src/enemy/spearMoblin.c @@ -380,7 +380,7 @@ bool32 sub_080288A4(Entity* this) { void sub_080288C0(Entity* this) { Entity* ent = this->child; - if (ent && (ent->bitfield & 0x80)) { + if ((ent != NULL) && (ent->bitfield & 0x80)) { this->knockbackDirection = ent->knockbackDirection; this->iframes = -ent->iframes; this->knockbackSpeed = ent->knockbackSpeed; diff --git a/src/enemy/spinyChuchu.c b/src/enemy/spinyChuchu.c index 7d49e0d2..7499234b 100644 --- a/src/enemy/spinyChuchu.c +++ b/src/enemy/spinyChuchu.c @@ -9,11 +9,6 @@ #include "functions.h" #include "hitbox.h" -extern void sub_08001318(Entity*); -extern u32 PlayerInRange(Entity*, u32, u32); -extern void sub_0804A4E4(Entity*, Entity*); -extern void sub_0804AA1C(Entity*); - u32 sub_080228CC(Entity*); u32 sub_080228F0(Entity*); diff --git a/src/enemy/stalfos.c b/src/enemy/stalfos.c index 67f6b6e1..31086dc1 100644 --- a/src/enemy/stalfos.c +++ b/src/enemy/stalfos.c @@ -7,6 +7,7 @@ #define NENT_DEPRECATED #include "global.h" +#include "collision.h" #include "enemy.h" #include "functions.h" @@ -123,7 +124,7 @@ void sub_08039418(StalfosEntity* this) { } void sub_08039438(StalfosEntity* this) { - if (sub_0806F520()) { + if (sub_0806F520(super)) { Stalfos_SubActions[super->subAction](this); } } @@ -366,7 +367,7 @@ void sub_0803992C(StalfosEntity* this) { super->direction = super->animationState << 3; this->unk_78 = (u16)gUnk_080CF900[Random() & 0xf]; CalculateEntityTileCollisions(super, super->direction, 0); - if ((gUnk_080CF910[super->animationState] & super->collisions) != 0) { + if ((gUnk_080CF910[super->animationState] & super->collisions) != COL_NONE) { InitAnimationForceUpdate(super, super->animationState); } else { InitAnimationForceUpdate(super, super->animationState + 4); diff --git a/src/enemy/takkuri.c b/src/enemy/takkuri.c index dc28b862..64c61158 100644 --- a/src/enemy/takkuri.c +++ b/src/enemy/takkuri.c @@ -74,7 +74,7 @@ void Takkuri_OnCollision(TakkuriEntity* this) { void Takkuri_OnGrabbed(TakkuriEntity* this) { gUnk_080CFF6C[super->subAction](this); GetNextFrame(super); - if (sub_0806F520(super) == 0) { + if (!sub_0806F520(super)) { super->action = 2; super->subAction = 0; this->unk_0x84 = 2; @@ -132,7 +132,7 @@ void sub_0803BD08(TakkuriEntity* this) { sub_0803BEE8(this); GetNextFrame(super); ent = sub_08049DF4(1); - if (ent) { + if (ent != NULL) { if (EntityInRectRadius(super, gUnk_020000B0, 0x88, 0x50)) { if (gUnk_020000B0->y.HALF.HI > super->y.HALF.HI + 8) { super->action = 2; @@ -306,7 +306,7 @@ void sub_0803C0AC(Entity* this) { u32 index, rupeeType, rupees; Entity* ent; ent = sub_08049DF4(1); - if (!ent) + if (ent == NULL) return; rupees = gSave.stats.rupees; diff --git a/src/enemy/tektite.c b/src/enemy/tektite.c index db461a94..776f08e5 100644 --- a/src/enemy/tektite.c +++ b/src/enemy/tektite.c @@ -5,6 +5,7 @@ * @brief Tektite enemy */ +#include "collision.h" #include "enemy.h" #include "functions.h" @@ -135,7 +136,7 @@ void sub_0802F300(Entity* this) { this->field_0xf = 0; InitializeAnimation(this, 3); return; - } else if (this->collisions != 0) { + } else if (this->collisions != COL_NONE) { sub_0800417E(this, this->collisions); } else if ((GetTileUnderEntity(this) & 0xf0) == 0x50) { this->direction = (this->direction + 0x10) & 0x1f; diff --git a/src/enemy/tektiteGolden.c b/src/enemy/tektiteGolden.c index af71db25..f8862aa8 100644 --- a/src/enemy/tektiteGolden.c +++ b/src/enemy/tektiteGolden.c @@ -5,6 +5,7 @@ * @brief Golden Tektite enemy */ +#include "collision.h" #include "enemy.h" #include "functions.h" @@ -114,7 +115,7 @@ void sub_08038048(Entity* this) { this->actionDelay = 0x14; InitializeAnimation(this, 3); return; - } else if (this->collisions != 0) { + } else if (this->collisions != COL_NONE) { sub_0800417E(this, this->collisions); } else if ((GetTileUnderEntity(this) & 0xf0) == 0x50) { this->direction = (this->direction + 0x10) & 0x1f; diff --git a/src/enemy/vaatiWrath.c b/src/enemy/vaatiWrath.c index 2d8c3619..f2c8c769 100644 --- a/src/enemy/vaatiWrath.c +++ b/src/enemy/vaatiWrath.c @@ -561,7 +561,7 @@ void VaatiWrathType0ActionD(Entity* this) { void sub_08041BE8(Entity* this) { Entity* entity; - if (sub_08079F8C() != 0) { + if (sub_08079F8C()) { this->subAction = 1; this->actionDelay = 120; this->updatePriority = PRIO_NO_BLOCK; diff --git a/src/enemy/waterDrop.c b/src/enemy/waterDrop.c index 629c54cd..2b390879 100644 --- a/src/enemy/waterDrop.c +++ b/src/enemy/waterDrop.c @@ -34,7 +34,7 @@ void sub_0802A250(Entity* this) { UpdateSpriteForCollisionLayer(this); ent = CreateObject(OBJECT_66, 0, 0); - if (ent) { + if (ent != NULL) { ent->parent = this; } } diff --git a/src/enemy/wisp.c b/src/enemy/wisp.c index 94943d52..73f82457 100644 --- a/src/enemy/wisp.c +++ b/src/enemy/wisp.c @@ -5,6 +5,7 @@ * @brief Wisp enemy */ +#include "collision.h" #include "enemy.h" #include "save.h" #include "object.h" @@ -69,7 +70,7 @@ void Wisp_OnCollision(Entity* this) { } void Wisp_OnGrabbed(Entity* this) { - if (sub_0806F520() != 0) { + if (sub_0806F520(this)) { gUnk_080CEB98[this->subAction](this); } } @@ -102,7 +103,7 @@ void sub_08033674(Entity* this) { void sub_080336A8(Entity* this) { if (--this->actionDelay == 0) { sub_08033744(this); - } else if (this->collisions != 0) { + } else if (this->collisions != COL_NONE) { sub_0800417E(this, this->collisions); } ProcessMovement0(this); diff --git a/src/enemy/wizzrobeWind.c b/src/enemy/wizzrobeWind.c index 4ea7da19..4fce3d5a 100644 --- a/src/enemy/wizzrobeWind.c +++ b/src/enemy/wizzrobeWind.c @@ -7,6 +7,7 @@ #define NENT_DEPRECATED #include "global.h" +#include "collision.h" #include "enemy.h" #include "enemy/wizzrobe.h" #include "functions.h" @@ -262,7 +263,7 @@ void sub_0802F9C8(WizzrobeEntity* this) { } else { if (super->type2 != 0) { ProcessMovement0(super); - if (super->collisions != 0) { + if (super->collisions != COL_NONE) { super->flags &= 0x7f; this->timer1 = 0x28; } diff --git a/src/entity.c b/src/entity.c index d696050c..7345650f 100644 --- a/src/entity.c +++ b/src/entity.c @@ -339,7 +339,7 @@ void DeleteEntityAny(Entity* ent) { } void DeleteEntity(Entity* ent) { - if (ent->next) { + if (ent->next != NULL) { UnloadGFXSlots(ent); UnloadOBJPalette(ent); UnloadOBJPalette2(ent); @@ -418,7 +418,7 @@ Manager* GetEmptyManager(void) { void DeleteManager(void* ent) { Manager* manager = (Manager*)ent; - if (!manager->next) + if (manager->next == NULL) return; ReleaseTransitionManager(manager); diff --git a/src/fileselect.c b/src/fileselect.c index 93355380..b0ce954b 100644 --- a/src/fileselect.c +++ b/src/fileselect.c @@ -106,12 +106,12 @@ void sub_08051458(void); void CreateDialogBox(u32 arg0, u32 arg1) { u32 sfx; - struct_080FC844 var0; + Font var0; sub_08050384(); MemCopy(&gUnk_080FC844, &var0, sizeof(gUnk_080FC844)); sub_08056FEC(arg1, gUnk_020227E8); - var0.unk10 |= gUnk_080FC85C[arg0][0] << 0xC; + var0.gfx_src |= gUnk_080FC85C[arg0][0] << 0xC; sub_0805F46C(gUnk_080FC85C[arg0][1], &var0); sfx = gUnk_080FC85C[arg0][2]; if (sfx) { @@ -296,7 +296,7 @@ static void sub_0805066C(void) { void sub_0805070C(void) { u32 i; int j; - struct_02036540* var0; + WStruct* var0; char* name; var0 = sub_0805F2C8(); @@ -322,7 +322,7 @@ void sub_0805070C(void) { void sub_08050790(void) { u32 i, j; - struct_02036540* var0; + WStruct* var0; u32 var1; var0 = sub_0805F2C8(); @@ -30,6 +30,8 @@ #include "subtask.h" #include "itemMetaData.h" #include "player.h" +#include "transitions.h" +#include "roomid.h" // Game task @@ -82,10 +84,8 @@ extern void** gAreaTilesets[]; extern void** gAreaRoomMaps[]; extern void* gAreaMetatiles[]; extern void* gUnk_080B755C[]; -extern void** gExitLists[]; extern void** gAreaTable[]; -extern void CreateDialogBox(u32, u32); extern void FinalizeSave(void); extern void ClearArmosData(void); extern void ClearRoomMemory(void); @@ -169,24 +169,6 @@ typedef struct { extern struct_08127F94 gUnk_08127F94[]; typedef struct { - u16* dest; - void* gfx_dest; - void* buffer_loc; - u32 _c; - u16 gfx_src; - u8 width; - u8 right_align : 1; - u8 sm_border : 1; - u8 unused : 1; - u8 draw_border : 1; - u8 border_type : 4; - u8 fill_type; - u8 _15; - u8 _16; - u8 stylized; -} Font; - -typedef struct { u8 dest_off[8]; u8 _8; u8 right_align; @@ -195,7 +177,7 @@ typedef struct { typedef struct { u8 area; - u8 room; + RoomID room : 8; u8 _2; u8 _3; u16 x; @@ -1438,7 +1420,7 @@ static void InitRoomResInfo(RoomResInfo* info, RoomHeader* r_hdr, u32 area, u32 info->map = *(gAreaRoomMaps[area] + room); info->metatiles = gAreaMetatiles[area]; info->bg_anim = gUnk_080B755C[area]; - info->exits = *(gExitLists[area] + room); + info->exits = gExitLists[area][room]; if (gAreaTable[area] != NULL) { info->properties = *(gAreaTable[area] + room); } diff --git a/src/manager/manager4.c b/src/manager/manager4.c index 7568960d..7ed53807 100644 --- a/src/manager/manager4.c +++ b/src/manager/manager4.c @@ -12,7 +12,7 @@ void Manager4_Main(Manager* this) { gUnk_08107C70[this->action](this); } -extern void sub_080805F8(void); +extern void UpdateIsDiggingCave(void); extern DiggingCaveEntrance* sub_08057AA8(DiggingCaveEntrance*, int); @@ -21,8 +21,8 @@ void sub_0805786C(Manager* this) { u8 room; u8 area; u16 uVar = 0x81 << 7; - sub_080805F8(); - if (gUnk_03004030.unk_08 != 0) { + UpdateIsDiggingCave(); + if (gUnk_03004030.isDiggingCave != 0) { if (gUnk_03004030.unk_00 == 0) { gUnk_03004030.unk_0a = 0xFF; room = gRoomControls.room; @@ -66,7 +66,7 @@ void sub_08057A18(Manager*, DiggingCaveEntrance*); u32 sub_0805795C(Manager* this, DiggingCaveEntrance* entr) { u16 offsetX, offsetY, offsetX2, offsetY2; u32 tmp, tmp2; - if (gUnk_03004030.unk_08) { + if (gUnk_03004030.isDiggingCave) { offsetX = gPlayerEntity.x.HALF.HI - gRoomControls.origin_x; offsetY = gPlayerEntity.y.HALF.HI - gRoomControls.origin_y; offsetX2 = (entr->unk_00 & 0x3F) * 16 + 8; @@ -105,10 +105,10 @@ void sub_08057A18(Manager* this, DiggingCaveEntrance* entr) { gUnk_03004030.unk_06 = gPlayerEntity.y.HALF.HI - gRoomControls.origin_y - ((entr->unk_00 & 0xFC0) >> 2); #ifndef EU - tmp = gUnk_03004030.unk_08; + tmp = gUnk_03004030.isDiggingCave; if (!tmp) { if ((entr->target_room | 0x80) != gUnk_03004030.unk_0b) { - gUnk_02034480.unk_00 = gUnk_03004030.unk_08; + gUnk_02034480.unk_00 = gUnk_03004030.isDiggingCave; } gUnk_03004030.unk_0b = entr->target_room | 0x80; } diff --git a/src/manager/managerB.c b/src/manager/managerB.c index a54ae310..1e49669f 100644 --- a/src/manager/managerB.c +++ b/src/manager/managerB.c @@ -62,8 +62,9 @@ void ManagerB_WaitForFlag(ManagerB* this) { void ManagerB_WaitForDone(ManagerB* this) { // check if all helpers are done - if (this->manager.unk_0e) + if (this->manager.unk_0e) { return; + } // set the completion flag for the fight SetFlag(this->unk_3e); // restore music (if it was set, which apparently is only possible if there's a flag the fight waited for) @@ -87,25 +88,28 @@ void ManagerB_LoadFight(Manager* this) { EntityData* prop; Entity* ent; u32 counter; + this->action = 2; this->unk_0e = 0; counter = 0; // Create a helper to keep track of the created entities. monitor = CreateHelper(this); - if (!monitor) + if (monitor == NULL) { DeleteThisEntity(); + } + prop = (EntityData*)GetCurrentRoomProperty(this->unk_0b); - if (prop) { - while (*((u8*)prop) != 0xFF) { + if (prop != NULL) { + while (prop->kind != 0xFF) { ent = LoadRoomEntity(prop++); - if (ent && (ent->kind == ENEMY)) { + if ((ent != NULL) && (ent->kind == ENEMY)) { ent->field_0x6c.HALF.HI |= 0x40; ManagerBHelper_Monitor(monitor, ent, counter++); } if (counter >= 7) { counter = 0; monitor = CreateHelper(this); - if (!monitor) + if (monitor == NULL) return; } } @@ -139,27 +143,31 @@ void ManagerBHelper_Monitor(ManagerBHelper* this, Entity* ent, u32 index) { // case volumeMasterTarget is 1: The manager is a helper void ManagerBHelper_Main(Manager* this) { - u8 i, anyRemaining; + u8 i; + bool32 anyRemaining; Entity* current; + if (this->action == 0) { this->action = 1; SetDefaultPriority((Entity*)this, PRIO_NO_BLOCK); } // go through and check all monitored enemies. - anyRemaining = 0; + anyRemaining = FALSE; for (i = 0; i < 8; i++) { - if ((current = ((ManagerBHelper*)this)->enemies[i])) { - if (!current->next) { + current = ((ManagerBHelper*)this)->enemies[i]; + if (current != NULL) { + if (current->next == NULL) { ((ManagerBHelper*)this)->enemies[i] = 0; } else { - anyRemaining = 1; + anyRemaining = TRUE; } } } if (!anyRemaining) { // inform the parent that we're done - if (((ManagerB*)this->parent)->manager.unk_0e) { - ((ManagerB*)this->parent)->manager.unk_0e--; + ManagerB* parent = (ManagerB*)this->parent; + if (parent->manager.unk_0e != 0) { + parent->manager.unk_0e--; } DeleteThisEntity(); } @@ -174,8 +182,9 @@ void ReplaceMonitoredEntity(Entity* old, Entity* new) { u32 i; for (current = (ManagerBHelper*)end->next; (Manager*)current != end; current = (ManagerBHelper*)current->manager.next) { - if (current->manager.type != 0x9 || current->manager.subtype != 0xB) + if (current->manager.type != 0x9 || current->manager.subtype != 0xB) { continue; + } for (i = 0; i < 8; i++) { if (old == current->enemies[i]) { current->enemies[i] = new; diff --git a/src/menu/kinstone_menu.c b/src/menu/kinstone_menu.c index 2643eb57..13d95850 100644 --- a/src/menu/kinstone_menu.c +++ b/src/menu/kinstone_menu.c @@ -15,16 +15,6 @@ #include "enemy.h" #include "functions.h" -typedef struct { - u8 filler0[0x1]; - u8 unk1; - u8 charColor; - u8 bgColor; - u16 unk4; - u16 unk6; - u8* unk8; -} struct_02036540; - extern u32 sub_08000E44(u32); extern void sub_080A3B74(void); extern s32 sub_080A3B48(void); @@ -32,9 +22,9 @@ extern void sub_0805ECEC(u32, u32, u32, u32); extern void sub_0801C2F0(u32, u32); extern void sub_0801E6C8(u32); extern void sub_0801E798(u32); -extern struct_02036540* sub_0805F2C8(void); -extern void sub_0805F300(struct_02036540*); -extern u32 sub_0805F76C(u8*, struct_02036540*); +extern WStruct* sub_0805F2C8(void); +extern void sub_0805F300(WStruct*); +extern u32 sub_0805F76C(u8*, WStruct*); typedef struct { void* sourceAddress; @@ -55,7 +45,7 @@ extern const u8 gGlobalGfxAndPalettes[]; extern u8 gTextGfxBuffer[]; extern u8 gUnk_02002AC0[]; -u32 sub_080A44E0(struct_02036540*, u8*, u32); +u32 sub_080A44E0(WStruct*, u8*, u32); u32 sub_080A4418(u32, u32); u32 sub_080A43DC(u32); u32 sub_080A43A8(u32); @@ -74,6 +64,13 @@ Subtask KinstoneMenu_Type2; Subtask KinstoneMenu_Type3; Subtask KinstoneMenu_Type4; Subtask KinstoneMenu_Type5; + +ASM_FUNC("asm/non_matching/menu/kinstone_menu/sub_080A3B48.inc", s32 sub_080A3B48(void)) + +void sub_080A3B74(void) { + gKinstoneMenu.unk2f = 0; +} + void Subtask_KinstoneMenu(void) { static Subtask* const kinstoneMenuTypes[] = { KinstoneMenu_Type0, KinstoneMenu_Type1, KinstoneMenu_Type2, @@ -594,7 +591,7 @@ void KinstoneMenu_080A4468(void) { } u32 KinstoneMenu_080A4494(void) { - struct_02036540* psVar1; + WStruct* psVar1; u8* r1; u32 ret; @@ -617,7 +614,7 @@ u32 KinstoneMenu_080A4494(void) { return ret; } -u32 sub_080A44E0(struct_02036540* param_1, u8* param_2, u32 param_3) { +u32 sub_080A44E0(WStruct* param_1, u8* param_2, u32 param_3) { u32 uVar1; u32 size; diff --git a/src/message.c b/src/message.c index b10d00a1..e4db0a1e 100644 --- a/src/message.c +++ b/src/message.c @@ -31,17 +31,17 @@ enum { }; extern void WriteBit(u32*, u32); -extern void sub_0805EF40(Token* tok, const u8*); +extern bool32 sub_0805EF40(Token* tok, const u8*); extern void RecoverUI(u32 bottomPt, u32 topPt); extern void RefreshUI(void); -extern void sub_0805F918(u32, u32, u32); +extern void sub_0805F918(u32, u32, void*); extern u32 DecToHex(u32, u8*, u32); u32 sub_08056FEC(u32, u8*); u32 GetCharacter(Token* tok); extern void sub_0805EEB4(Token* tok, u32 textIdx); -u16 sub_0805F7DC(u32, u8*); -u32 GetFontStrWith(u8*, u32); +u32 sub_0805F7DC(u32, WStruct*); +u32 GetFontStrWith(Token*, u32); static void StatusUpdate(u32 status); @@ -270,7 +270,7 @@ END_NONMATCH if (gTextRender.renderStatus == RENDER_INIT) { gTextRender.renderStatus = RENDER_UPDATE; gTextRender._98.bytes.b1 = 1; - sub_08056F88(gTextRender.message.unk3, gTextRender._50.unk3); + sub_08056F88(gTextRender.message.unk3, gTextRender._50.bgColor); SoundReq(SFX_TEXTBOX_OPEN); } @@ -315,7 +315,7 @@ static u32 MsgUpdate(void) { } static void TextDispInit(TextRender* this) { - if ((gTextRender.curToken.flags & 1) == 0) { + if (gTextRender.curToken.unk00 == 0) { if (gTextRender._98.bytes.b1 == 0) { StatusUpdate(MSG_DIE); } @@ -398,7 +398,7 @@ NONMATCH("asm/non_matching/textbox/RunTextCommand.inc", /*static*/ u16 RunTextCo StatusUpdate(MSG_CLOSE); break; case 4: - this->_50.unk6 += (this->_50.unk4 - this->_50.unk6 - GetFontStrWith(&this->curToken.flags, 0)) / 2; + this->_50.unk6 += (this->_50.unk4 - this->_50.unk6 - GetFontStrWith(&this->curToken, 0)) / 2; break; case 5: gMessage.unk = this->curToken.param; @@ -427,7 +427,7 @@ NONMATCH("asm/non_matching/textbox/RunTextCommand.inc", /*static*/ u16 RunTextCo break; case 9: gTextRender.message.unk3 = this->curToken.param; - sub_08056F88(this->curToken.param, this->_50.unk3); + sub_08056F88(this->curToken.param, this->_50.bgColor); break; case 10: this->message.textWindowPosY = this->curToken.param; @@ -488,14 +488,14 @@ NONMATCH("asm/non_matching/textbox/RunTextCommand.inc", /*static*/ u16 RunTextCo PaletteChange(this, palette); } } - return sub_0805F7DC(chr, &this->_50.unk0); + return sub_0805F7DC(chr, &this->_50); } END_NONMATCH /*static*/ void PaletteChange(TextRender* this, u32 id) { u32 temp = id % 8; this->_8f = temp; - this->_50.unk2 = temp; + this->_50.charColor = temp; } const u8 gUnk_08107C0F[] = { 0x8, 0x1e, 0x4, 0x12, 0x0 }; @@ -813,12 +813,12 @@ void sub_08056F88(u32 unk_1, u32 unk_2) { uVar1 = unk_1 << 4 | unk_2; if (gTextRender._9c != uVar1) { gTextRender._9c = uVar1; - sub_0805F918(unk_1, unk_2, 0x0600CF60); + sub_0805F918(unk_1, unk_2, (void*)0x0600CF60); } } static void sub_08056FBC(TextRender* ctb) { - sub_08056FEC(ctb->message.field_0x10, &ctb->_66[0x2]); + sub_08056FEC(ctb->message.rupees, &ctb->_66[0x2]); sub_08056FEC(ctb->message.field_0x14, &ctb->_66[0xa]); sub_08056FEC(ctb->message.field_0x18, &ctb->_77[0x1]); sub_08056FEC(ctb->message.field_0x1c, &ctb->_77[0x9]); diff --git a/src/movement.c b/src/movement.c index 29eeb5a9..1e54b3c5 100644 --- a/src/movement.c +++ b/src/movement.c @@ -1,4 +1,5 @@ #include "global.h" +#include "collision.h" #include "entity.h" #include "room.h" #include "area.h" @@ -6,38 +7,9 @@ #include "asm.h" #include "item.h" #include "coord.h" +#include "transitions.h" #include "functions.h" -/** Collisions. */ -typedef enum { - COL_NONE = 0x0, - COL_NORTH_WEST = 0x2, - COL_NORTH_EAST = 0x4, - COL_NORTH_FULL = 0x6, - COL_NORTH_ANY = 0xe, - COL_SOUTH_WEST = 0x20, - COL_SOUTH_EAST = 0x40, - COL_SOUTH_FULL = 0x60, - COL_SOUTH_ANY = 0xe0, - COL_WEST_SOUTH = 0x200, - COL_WEST_NORTH = 0x400, - COL_WEST_FULL = 0x600, - COL_WEST_ANY = 0xe00, - COL_EAST_SOUTH = 0x2000, - COL_EAST_NORTH = 0x4000, - COL_EAST_FULL = 0x6000, - COL_EAST_ANY = 0xe000, -} Collisions; - -extern u8 gExitList_RoyalValley_ForestMaze[]; -extern u8 gUnk_08135190[]; -extern u8 gUnk_08134FBC[]; -extern u8 gUnk_08135048[]; -extern u8 gUnk_0813A76C[]; - -bool32 IsTileCollision(const u8*, s32, s32, u32); -void CalculateEntityTileCollisions(Entity*, u32, u32); -bool32 ProcessMovementInternal(Entity*, s32, s32, u32); bool32 sub_080AF0C8(Entity*); /** The type of the movement/collision? that is done. */ @@ -117,7 +89,8 @@ bool32 TileCollisionFunction2(s32 x, s32 y) { 0b1111111111111110, 0b1111111111111111, */ - 32768, 49152, 57344, 61440, 63488, 64512, 65024, 65280, 65408, 65472, 65504, 65520, 65528, 65532, 65534, 65535, + 0x8000, 0xC000, 0xE000, 0xF000, 0xF800, 0xFC00, 0xFE00, 0xFF00, + 0xFF80, 0xFFC0, 0xFFE0, 0xFFF0, 0xFFF8, 0xFFFC, 0xFFFE, 0xFFFF, }; return gUnk_08133918[y & 0xf] >> (x & 0xf) & 1; @@ -127,24 +100,24 @@ bool32 TileCollisionFunction2(s32 x, s32 y) { bool32 TileCollisionFunction3(s32 x, s32 y) { static const u16 gUnk_08133938[] = { /* - 0b1, - 0b11, - 0b111, - 0b1111, - 0b11111, - 0b111111, - 0b1111111, - 0b11111111, - 0b111111111, - 0b1111111111, - 0b11111111111, - 0b111111111111, - 0b1111111111111, - 0b11111111111111, - 0b111111111111111, + 0b0000000000000001, + 0b0000000000000011, + 0b0000000000000111, + 0b0000000000001111, + 0b0000000000011111, + 0b0000000000111111, + 0b0000000001111111, + 0b0000000011111111, + 0b0000000111111111, + 0b0000001111111111, + 0b0000011111111111, + 0b0000111111111111, + 0b0001111111111111, + 0b0011111111111111, + 0b0111111111111111, 0b1111111111111111, */ - 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535, + 0x1, 0x3, 0x7, 0xF, 0x1F, 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF, }; return gUnk_08133938[y & 0xf] >> (x & 0xf) & 1; } @@ -170,7 +143,8 @@ bool32 TileCollisionFunction4(s32 x, s32 y) { 0b1100000000000000, 0b1000000000000000, */ - 65535, 65534, 65532, 65528, 65520, 65504, 65472, 65408, 65280, 65024, 64512, 63488, 61440, 57344, 49152, 32768, + 0xFFFF, 0xFFFE, 0xFFFC, 0xFFF8, 0xFFF0, 0xFFE0, 0xFFC0, 0xFF80, + 0xFF00, 0xFE00, 0xFC00, 0xF800, 0xF000, 0xE000, 0xC000, 0x8000, }; return gUnk_08133958[y & 0xf] >> (x & 0xf) & 1; } @@ -180,23 +154,23 @@ bool32 TileCollisionFunction5(s32 x, s32 y) { static const u16 gUnk_08133978[] = { /* 0b1111111111111111, - 0b111111111111111, - 0b11111111111111, - 0b1111111111111, - 0b111111111111, - 0b11111111111, - 0b1111111111, - 0b111111111, - 0b11111111, - 0b1111111, - 0b111111, - 0b11111, - 0b1111, - 0b111, - 0b11, - 0b1, + 0b0111111111111111, + 0b0011111111111111, + 0b0001111111111111, + 0b0000111111111111, + 0b0000011111111111, + 0b0000001111111111, + 0b0000000111111111, + 0b0000000011111111, + 0b0000000001111111, + 0b0000000000111111, + 0b0000000000011111, + 0b0000000000001111, + 0b0000000000000111, + 0b0000000000000011, + 0b0000000000000001, */ - 65535, 32767, 16383, 8191, 4095, 2047, 1023, 511, 255, 127, 63, 31, 15, 7, 3, 1, + 0xFFFF, 0x7FFF, 0x3FFF, 0x1FFF, 0xFFF, 0x7FF, 0x3FF, 0x1FF, 0xFF, 0x7F, 0x3F, 0x1F, 0xF, 0x7, 0x3, 0x1, }; return gUnk_08133978[y & 0xf] >> (x & 0xf) & 1; } @@ -215,14 +189,14 @@ bool32 TileCollisionFunction6(s32 x, s32 y) { 0b1111111111111111, 0b1111111111111111, 0b1111111111111111, - 0b0, - 0b0, - 0b0, - 0b0, - 0b0, - 0b0, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, */ - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 0, 0, 0, 0, 0, 0, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; return gUnk_08133998[y & 0xf] >> (x & 0xf) & 1; @@ -232,12 +206,12 @@ bool32 TileCollisionFunction6(s32 x, s32 y) { bool32 TileCollisionFunction7(s32 x, s32 y) { static const u16 gUnk_081339B8[] = { /* - 0b0, - 0b0, - 0b0, - 0b0, - 0b0, - 0b0, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, 0b1111111111111111, 0b1111111111111111, 0b1111111111111111, @@ -249,7 +223,7 @@ bool32 TileCollisionFunction7(s32 x, s32 y) { 0b1111111111111111, 0b1111111111111111, */ - 0, 0, 0, 0, 0, 0, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, }; return gUnk_081339B8[y & 0xf] >> (x & 0xf) & 1; } @@ -275,7 +249,8 @@ bool32 TileCollisionFunction8(s32 x, s32 y) { 0b1111111111000000, 0b1111111111000000, */ - 65472, 65472, 65472, 65472, 65472, 65472, 65472, 65472, 65472, 65472, 65472, 65472, 65472, 65472, 65472, 65472, + 0xFFC0, 0xFFC0, 0xFFC0, 0xFFC0, 0xFFC0, 0xFFC0, 0xFFC0, 0xFFC0, + 0xFFC0, 0xFFC0, 0xFFC0, 0xFFC0, 0xFFC0, 0xFFC0, 0xFFC0, 0xFFC0, }; return gUnk_081339D8[y & 0xf] >> (x & 0xf) & 1; } @@ -284,24 +259,24 @@ bool32 TileCollisionFunction8(s32 x, s32 y) { bool32 TileCollisionFunction9(s32 x, s32 y) { static const u16 gUnk_081339F8[] = { /* - 0b1111111111, - 0b1111111111, - 0b1111111111, - 0b1111111111, - 0b1111111111, - 0b1111111111, - 0b1111111111, - 0b1111111111, - 0b1111111111, - 0b1111111111, - 0b1111111111, - 0b1111111111, - 0b1111111111, - 0b1111111111, - 0b1111111111, - 0b1111111111, + 0b[000001111111111, + 0b0000001111111111, + 0b0000001111111111, + 0b0000001111111111, + 0b0000001111111111, + 0b0000001111111111, + 0b0000001111111111, + 0b0000001111111111, + 0b0000001111111111, + 0b0000001111111111, + 0b0000001111111111, + 0b0000001111111111, + 0b0000001111111111, + 0b0000001111111111, + 0b0000001111111111, + 0b0000001111111111, */ - 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, + 0x3FF, 0x3FF, 0x3FF, 0x3FF, 0x3FF, 0x3FF, 0x3FF, 0x3FF, 0x3FF, 0x3FF, 0x3FF, 0x3FF, 0x3FF, 0x3FF, 0x3FF, 0x3FF, }; return gUnk_081339F8[y & 0xf] >> (x & 0xf) & 1; } @@ -2269,28 +2244,27 @@ void ProcessMovementInternal2(Entity* this, u32 direction, u32 speed) { void sub_080AF250(s32 param_1) { gArea.pCurrentRoomInfo = GetCurrentRoomInfo(); if (param_1 != 0) { - (gArea.pCurrentRoomInfo)->exits = gUnk_08135190; + gArea.pCurrentRoomInfo->exits = gUnk_08135190; } else { - (gArea.pCurrentRoomInfo)->exits = gExitList_RoyalValley_ForestMaze; + gArea.pCurrentRoomInfo->exits = gExitList_RoyalValley_ForestMaze; } } void sub_080AF284(void) { if (CheckPlayerInRegion(0x78, gRoomControls.height - 0x50, 0x78, 0x50)) { gArea.pCurrentRoomInfo = GetCurrentRoomInfo(); - (gArea.pCurrentRoomInfo)->exits = gUnk_08135048; + gArea.pCurrentRoomInfo->exits = gUnk_08135048; } else { - if (GetInventoryValue(ITEM_FOURSWORD) == 0) { - return; + if (GetInventoryValue(ITEM_FOURSWORD) != 0) { + gArea.pCurrentRoomInfo = GetCurrentRoomInfo(); + gArea.pCurrentRoomInfo->exits = gUnk_08134FBC; } - gArea.pCurrentRoomInfo = GetCurrentRoomInfo(); - (gArea.pCurrentRoomInfo)->exits = gUnk_08134FBC; } } void sub_080AF2E4(void) { if (GetInventoryValue(ITEM_FOURSWORD)) { gArea.pCurrentRoomInfo = GetCurrentRoomInfo(); - (gArea.pCurrentRoomInfo)->exits = gUnk_0813A76C; + gArea.pCurrentRoomInfo->exits = gUnk_0813A76C; } } diff --git a/src/npc/castorWildsStatue.c b/src/npc/castorWildsStatue.c index d12e9b28..92cd3358 100644 --- a/src/npc/castorWildsStatue.c +++ b/src/npc/castorWildsStatue.c @@ -127,7 +127,7 @@ void sub_080675D4(Entity* this) { for (i = 0; i < 9; i++, gUnk++) { Entity* ent = CreateFx(this, FX_DEATH, 0); - if (ent) { + if (ent != NULL) { ent->x.HALF.HI += gUnk->x; ent->y.HALF.HI += gUnk->y; ent->z.HALF.HI = subAction; @@ -140,7 +140,7 @@ void sub_080675D4(Entity* this) { gUnk = gUnk_08110E8A; for (i = 0; i < 4; i++, gUnk++) { Entity* ent = CreateFx(this, FX_ROCK, 0); - if (ent) { + if (ent != NULL) { ent->x.HALF.HI = gUnk->x + ent->x.HALF.HI; ent->y.HALF.HI = gUnk->y + ent->y.HALF.HI; ent->z.HALF.HI = subAction; diff --git a/src/npc/dog.c b/src/npc/dog.c index 0f9f3f12..9a6364ec 100644 --- a/src/npc/dog.c +++ b/src/npc/dog.c @@ -1,4 +1,5 @@ #include "entity.h" +#include "collision.h" #include "functions.h" #include "npc.h" #include "item.h" @@ -143,17 +144,17 @@ void sub_08069D54(Entity* this) { if (this->x.HALF.HI < this->field_0x6e.HWORD) { this->x.HALF.HI = this->field_0x6e.HWORD + 1; - collisions = 0xe00; + collisions = COL_WEST_ANY; } else if (this->x.HALF.HI > this->field_0x6c.HWORD) { this->x.HALF.HI = this->field_0x6c.HWORD - 1; - collisions = 0xe000; + collisions = COL_EAST_ANY; } if (this->y.HALF.HI < this->field_0x70.HALF_U.LO) { this->y.HALF.HI = this->field_0x70.HALF_U.LO + 1; - collisions = 0xe; + collisions = COL_NORTH_ANY; } else if (this->y.HALF.HI > this->field_0x70.HALF_U.HI) { this->y.HALF.HI = this->field_0x70.HALF_U.HI - 1; - collisions = 0xe0; + collisions = COL_SOUTH_ANY; } sub_0800417E(this, collisions); sub_08069F6C(this); diff --git a/src/npc/goronMerchant.c b/src/npc/goronMerchant.c index 9a0cf266..3cb1a668 100644 --- a/src/npc/goronMerchant.c +++ b/src/npc/goronMerchant.c @@ -77,7 +77,7 @@ void sub_08069654(Entity* this) { void sub_08069660(Entity* this) { MessageNoOverlap(0x2c1c, this); - gMessage.field_0x10 = (u16)GoronMerchant_GetSalePrice(this); + gMessage.rupees = (u16)GoronMerchant_GetSalePrice(this); } void sub_08069684(void) { diff --git a/src/npc/kid.c b/src/npc/kid.c index 911dc22c..79cb7a89 100644 --- a/src/npc/kid.c +++ b/src/npc/kid.c @@ -270,15 +270,18 @@ void sub_080627E8(Entity* this, ScriptExecutionContext* context) { RestorePrevTileEntity(0x64d, 1); } -NONMATCH("asm/non_matching/kid/Kid_Head.inc", void Kid_Head(Entity* this)) { - s32 iVar1; +void Kid_Head(Entity* this) { + u32 uVar1; u32 uVar2; u32 uVar3; u32 uVar4; + u32 uVar5; + u8* ptr; - iVar1 = (u32)this->type * 4; - uVar3 = ((u8)this->frame & 0x1f) + (u32)gUnk_0810C0A0[iVar1]; - uVar4 = (this->frameIndex & 0x1f) + (u32)gUnk_0810C0A0[iVar1 + 1]; + uVar1 = this->type * 4; + ptr = &gUnk_0810C0A0[uVar1]; + uVar3 = ((u8)this->frame & 0x1f) + ptr[0]; + uVar4 = (this->frameIndex & 0x1f) + ptr[1]; switch (this->type) { case 0: case 1: @@ -290,19 +293,20 @@ NONMATCH("asm/non_matching/kid/Kid_Head.inc", void Kid_Head(Entity* this)) { if (uVar2 != 0) { uVar2 = uVar2 + 0x50; } + uVar2--; SetExtraSpriteFrame(this, 0, uVar3); SetExtraSpriteFrame(this, 1, uVar4); - SetExtraSpriteFrame(this, 2, uVar2 - 1); + SetExtraSpriteFrame(this, 2, uVar2); SetSpriteSubEntryOffsetData1(this, 1, 0); SetSpriteSubEntryOffsetData2(this, 1, 2); sub_0807000C(this); break; case 6: - uVar2 = this->frameSpriteSettings & 0xf; + uVar5 = this->frameSpriteSettings & 0xf; if ((this->frameSpriteSettings & 0xf) != 0) { - uVar2 = uVar2 + 0x93; + uVar5 = uVar5 + 0x93; } - SetExtraSpriteFrame(this, 0, uVar2 - 1); + SetExtraSpriteFrame(this, 0, uVar5 - 1); SetExtraSpriteFrame(this, 1, uVar3); SetExtraSpriteFrame(this, 2, uVar4); SetSpriteSubEntryOffsetData1(this, 2, 1); @@ -320,10 +324,9 @@ NONMATCH("asm/non_matching/kid/Kid_Head.inc", void Kid_Head(Entity* this)) { break; } } -END_NONMATCH -NONMATCH("asm/non_matching/kid/sub_08062948.inc", void sub_08062948(Entity* this, ScriptExecutionContext* context)) { - u8 bVar1; +void sub_08062948(Entity* this, ScriptExecutionContext* context) { + s32 bVar1; u16 uVar2; u32 uVar3; s32 iVar4; @@ -332,64 +335,60 @@ NONMATCH("asm/non_matching/kid/sub_08062948.inc", void sub_08062948(Entity* this context->unk_18 += 1; context->unk_12 = (Random() & 0x3f) + 0x20; uVar3 = Random() & 0x18; - bVar1 = this->direction; - if (bVar1 != 8) { - if (bVar1 >= 9) { - if (bVar1 == 0x10) { - if (uVar3 == 0) { - uVar3 = 0x18; - } - } else { - if ((bVar1 == 0x18) && (uVar3 == 8)) { - uVar3 = 0; - } - } - } else { - if ((bVar1 == 0) && (uVar3 == 0x10)) { + switch (this->direction) { + case 0: + if (uVar3 == 0x10) { uVar3 = 8; } - } - } else { - if (uVar3 == 0x18) { - uVar3 = 0x10; - } + break; + case 0x8: + if (uVar3 == 0x18) { + uVar3 = 0x10; + } + break; + case 0x10: + if (uVar3 == 0) { + uVar3 = 0x18; + } + break; + case 0x18: + if ((uVar3 == 8)) { + uVar3 = 0; + } } + this->direction = (u8)uVar3; - uVar3 = sub_0806F5B0(uVar3); - this->animationState = (u8)uVar3; + this->animationState = sub_0806F5B0(uVar3); this->speed = 0x80; } uVar3 = (this->animationState >> 1) + 4; if (uVar3 != this->animIndex) { InitializeAnimation(this, uVar3); - this->field_0x80.HALF.LO = (u16)this->animIndex; + this->field_0x80.HWORD = (u16)this->animIndex; } ProcessMovement0(this); - iVar4 = this->x.HALF.HI - this->field_0x6c.HALF.LO; + iVar4 = this->x.HALF.HI - (s16)this->field_0x6c.HWORD; if (0x10 < iVar4) { - this->x.HALF.HI = this->field_0x6c.HALF.LO + 0x10; + this->x.HALF.HI = this->field_0x6c.HWORD + 0x10; context->unk_12 = 1; } if (iVar4 < -0x10) { - this->x.HALF.HI = this->field_0x6c.HALF.LO + -0x10; + this->x.HALF.HI = this->field_0x6c.HWORD - 0x10; context->unk_12 = 1; } - iVar4 = this->y.HALF.HI - this->field_0x6e.HALF.LO; + iVar4 = this->y.HALF.HI - (s16)this->field_0x6e.HWORD; if (0x10 < iVar4) { - this->y.HALF.HI = this->field_0x6e.HALF.LO + 0x10; + this->y.HALF.HI = this->field_0x6e.HWORD + 0x10; context->unk_12 = 1; } if (iVar4 < -0x10) { - this->y.HALF.HI = this->field_0x6e.HALF.LO + -0x10; + this->y.HALF.HI = this->field_0x6e.HWORD - 0x10; context->unk_12 = 1; } - uVar2 = context->unk_12 - 1; - context->unk_12 = uVar2; - if (uVar2 != 0) { + if (--context->unk_12 != 0) { gActiveScriptInfo.commandSize = 0; } } -END_NONMATCH void sub_08062A48(Entity* this, ScriptExecutionContext* context) { this->field_0x6a.HALF.LO = sub_0801E99C(this); diff --git a/src/npc/phonograph.c b/src/npc/phonograph.c index dd731979..8643cf95 100644 --- a/src/npc/phonograph.c +++ b/src/npc/phonograph.c @@ -12,7 +12,7 @@ void sub_0806EABC(Entity* this); void sub_0806EABC(Entity* this, u32 param); #endif -extern u32 gUnk_081146B8; +extern Font gUnk_081146B8; extern s8 gUnk_081145E4[]; void Phonograph(Entity* this) { diff --git a/src/npc/picolyteBottle.c b/src/npc/picolyteBottle.c index 6dbf5010..dec3e542 100644 --- a/src/npc/picolyteBottle.c +++ b/src/npc/picolyteBottle.c @@ -175,7 +175,7 @@ void sub_0806E140(PicolyteBottleEntity* this, ScriptExecutionContext* context) { MessageFromTarget(0x421b); } else { MessageFromTarget(0x4218); - gMessage.field_0x10 = this->unk76; + gMessage.rupees = this->unk76; } } else { context->condition = 0; @@ -201,7 +201,7 @@ void sub_0806E1FC(PicolyteBottleEntity* this) { void sub_0806E20C(void) { if (gRoomTransition.field_0x6 != 0) { MessageFromTarget(0x421f); - gMessage.field_0x10 = gRoomTransition.field_0x6; + gMessage.rupees = gRoomTransition.field_0x6; } else { MessageFromTarget(0x4220); } diff --git a/src/npc/stockwell.c b/src/npc/stockwell.c index e72cb9c0..d305d835 100644 --- a/src/npc/stockwell.c +++ b/src/npc/stockwell.c @@ -66,7 +66,7 @@ void sub_080650CC(Entity* this) { MessageNoOverlap(confirmMsgId, this); //! @bug itemPrice (r8) is not initialized if gRoomVars.shopItemType == 0 - gMessage.field_0x10 = (u16)itemPrice; + gMessage.rupees = (u16)itemPrice; } else if ((this->frame & 0x40)) { InitializeAnimation(this, gUnk_0810FDB8[Random() & 0xf]); } else { diff --git a/src/npc/tingleSiblings.c b/src/npc/tingleSiblings.c index 82eb9ee2..32d6ab05 100644 --- a/src/npc/tingleSiblings.c +++ b/src/npc/tingleSiblings.c @@ -117,7 +117,7 @@ void sub_08064EE8(Entity* this) { } fxEnt = CreateFx(this, confettiFx, 0); - if (fxEnt && bVar1 == 2) { + if ((fxEnt != NULL) && (bVar1 == 2)) { fxEnt->spriteSettings.flipX = 1; } } @@ -171,7 +171,7 @@ void sub_08064F28(Entity* this, ScriptExecutionContext* context) { } MessageNoOverlap(TingleSiblings_MessageIndices[this->type][uVar5], this); if (iVar4 > 0) { - gMessage.field_0x10 = (u16)iVar4; + gMessage.rupees = (u16)iVar4; } if (CheckRoomFlag(roomFlag) == 0) { diff --git a/src/npcUtils.c b/src/npcUtils.c index 2bd9564a..09906e44 100644 --- a/src/npcUtils.c +++ b/src/npcUtils.c @@ -138,7 +138,7 @@ u32 sub_0806EE20(Entity* ent) { u32 v3; if (!ent->interactType) { - if (ent->child) + if (ent->child != NULL) return gUnk_08114EFC[ent->field_0x16](ent); } else { ent->knockbackSpeed = 8; diff --git a/src/object.c b/src/object.c index da1eb312..060876d7 100644 --- a/src/object.c +++ b/src/object.c @@ -187,7 +187,7 @@ void (*const gObjectFunctions[])(Entity*) = { [OBJECT_B6] = ObjectB6, [WELL] = Well, [WIND_TRIBE_TELEPORTER] = WindTribeTeleporter, - [OBJECT_B9] = ObjectB9, + [CUCCO_MINIGAME] = ObjectB9, [GYORG_BOSS_OBJECT] = GyorgBossObject, [WINDCREST] = Windcrest, [LIT_AREA] = LitArea, diff --git a/src/object/bakerOven.c b/src/object/bakerOven.c index fd2b80aa..d4b26c28 100644 --- a/src/object/bakerOven.c +++ b/src/object/bakerOven.c @@ -22,7 +22,7 @@ void sub_0809CC74(Entity* this) { /* Create steam clouds */ for (i = 0; i < 3; i++) { ent = CreateObject(BAKER_OVEN, 1, i); - if (ent) { + if (ent != NULL) { ent->parent = this; PositionRelative(this, ent, 16 * Q_16_16((i + 1) / 2) - Q_16_16(8.0), Q_16_16(-14.0)); } diff --git a/src/object/bigBarrel.c b/src/object/bigBarrel.c index af09b0f4..77e6ff6a 100644 --- a/src/object/bigBarrel.c +++ b/src/object/bigBarrel.c @@ -105,7 +105,7 @@ void sub_08088BE0(BigBarrelEntity* this) { if (CheckLocalFlag(0x15) == 0) { sub_08088C78(this, 2, 0, 0xffffff88); ent = sub_08088C78(this, 4, 0x15, 0); - if (ent) { + if (ent != NULL) { ent->x.HALF.HI = gRoomControls.origin_x + 0x48; ent->y.HALF.HI = gRoomControls.origin_y + 200; } @@ -114,7 +114,7 @@ void sub_08088BE0(BigBarrelEntity* this) { if (CheckLocalFlag(0x16) == 0) { sub_08088C78(this, 2, 1, 0x78); ent = sub_08088C78(this, 4, 0x16, 0); - if (ent) { + if (ent != NULL) { ent->x.HALF.HI = gRoomControls.origin_x + 0x188; ent->y.HALF.HI = gRoomControls.origin_y + 200; } @@ -249,7 +249,7 @@ void sub_08088E74(BigBarrelEntity* this) { } else { if ((gRoomTransition.frameCount & 7U) == 0) { ent = CreateObjectWithParent(super, OBJECT_2A, 0, 0x1e); - if (ent) { + if (ent != NULL) { ent->updatePriority = 3; ent->spriteRendering.b3 = 0; ent->spritePriority.b0 = 0; diff --git a/src/object/bird.c b/src/object/bird.c index f16d46b5..3cb75c4b 100644 --- a/src/object/bird.c +++ b/src/object/bird.c @@ -2,22 +2,45 @@ #include "object.h" #include "functions.h" #include "item.h" +#include "message.h" +#include "game.h" -extern void (*const gUnk_08123EC0[])(Entity*); -extern void (*const gUnk_08123EEC[])(Entity*); -extern void (*const gUnk_08123EF4[])(Entity*); -extern void (*const gUnk_08123EFC[])(Entity*); -extern void (*const gUnk_08123F04[])(Entity*); +extern u16 script_EzloTalkOcarina[]; + +void Bird_Type0(Entity*); +void Bird_Type1(Entity*); +void Bird_Type2(Entity*); +void Bird_Type3(Entity*); +void Bird_Type8(Entity*); +void Bird_Type9(Entity*); +void Bird_Type10(Entity*); +void Bird_Type0_Init(Entity*); +void Bird_Type0_Action1(Entity*); +void Bird_Type1_Init(Entity*); +void Bird_Type1_Action1(Entity*); +void Bird_Type1_Action1_Subaction0(Entity*); +void Bird_Type1_Action1_Subaction1(Entity*); +void Bird_Type2_Init(Entity*); +void Bird_Type2_Action1(Entity*); void Bird(Entity* this) { - gUnk_08123EC0[this->type](this); + static void (*const typeFuncs[])(Entity*) = { + Bird_Type0, Bird_Type1, Bird_Type2, Bird_Type3, Bird_Type3, Bird_Type3, + Bird_Type3, Bird_Type3, Bird_Type8, Bird_Type9, Bird_Type10, + }; + typeFuncs[this->type](this); } -void sub_0809CF3C(Entity* this) { - gUnk_08123EEC[this->action](this); +void Bird_Type0(Entity* this) { + static void (*const actionFuncs[])(Entity*) = { + Bird_Type0_Init, + Bird_Type0_Action1, + }; + + actionFuncs[this->action](this); } -void sub_0809CF54(Entity* this) { +void Bird_Type0_Init(Entity* this) { Entity* target; this->action++; @@ -42,8 +65,7 @@ void sub_0809CF54(Entity* this) { } } -void sub_0809CFEC(Entity* this) { - +void Bird_Type0_Action1(Entity* this) { LinearMoveUpdate(this); GravityUpdate(this, *(s16*)&this->field_0x68.HWORD); if (this->actionDelay != 0) { @@ -56,22 +78,30 @@ void sub_0809CFEC(Entity* this) { UpdateAnimationSingleFrame(this); } -void sub_0809D030(Entity* this) { - gUnk_08123EF4[this->action](this); +void Bird_Type1(Entity* this) { + static void (*const actionFuncs[])(Entity*) = { + Bird_Type1_Init, + Bird_Type1_Action1, + }; + actionFuncs[this->action](this); } -void sub_0809D048(Entity* this) { +void Bird_Type1_Init(Entity* this) { this->action++; this->collisionLayer = 1; UpdateSpriteForCollisionLayer(this); InitAnimationForceUpdate(this, 0x17); } -void sub_0809D06C(Entity* this) { - gUnk_08123EFC[this->subAction](this); +void Bird_Type1_Action1(Entity* this) { + static void (*const subActionFuncs[])(Entity*) = { + Bird_Type1_Action1_Subaction0, + Bird_Type1_Action1_Subaction1, + }; + subActionFuncs[this->subAction](this); } -void sub_0809D084(Entity* this) { +void Bird_Type1_Action1_Subaction0(Entity* this) { u32 temp; if (this->parent != NULL) { @@ -85,7 +115,7 @@ void sub_0809D084(Entity* this) { } } -void sub_0809D0AC(Entity* this) { +void Bird_Type1_Action1_Subaction1(Entity* this) { Entity* fx; if (sub_080044EC(this, 0x1800) < 2) { @@ -102,28 +132,32 @@ void sub_0809D0AC(Entity* this) { } } -void sub_0809D0F4(Entity* this) { - gUnk_08123F04[this->action](this); +void Bird_Type2(Entity* this) { + static void (*const actionFuncs[])(Entity*) = { + Bird_Type2_Init, + Bird_Type2_Action1, + }; + actionFuncs[this->action](this); } -void sub_0809D10C(Entity* this) { +void Bird_Type2_Init(Entity* this) { this->action++; this->collisionLayer = 1; UpdateSpriteForCollisionLayer(this); InitAnimationForceUpdate(this, 0x17); } -void sub_0809D130(Entity* this) { +void Bird_Type2_Action1(Entity* this) { if ((gPlayerState.flags & PL_MINISH) != 0) { sub_0800445C(this); } else if (IsCollidingPlayer(this) != 0) { - CreateItemEntity(0x17, 0, 0); + CreateItemEntity(ITEM_OCARINA, 0, 0); gSave.windcrests |= 0x10000000; DeleteThisEntity(); } } -void sub_0809D178(Entity* this) { +void Bird_Type3(Entity* this) { if (this->action == 0) { this->action++; @@ -131,6 +165,7 @@ void sub_0809D178(Entity* this) { UpdateSpriteForCollisionLayer(this); this->frame = 0x80; } + if ((this->frame & ANIM_DONE) != 0) { InitializeAnimation(this, Random() & 3); this->frameDuration = (Random() & 0xf) + 0x10; @@ -142,3 +177,225 @@ void sub_0809D178(Entity* this) { GetNextFrame(this); } } + +void Bird_Type8(Entity* this) { + Entity* pEVar5; + + switch (this->action) { + case 0: + if (this->actionDelay != 0) { + this->frameIndex = 0xff; + this->actionDelay--; + return; + } + this->action = 1; + this->zVelocity = 0; + this->z.WORD = Q_16_16(-20.0); + this->speed = 0x180; + this->direction = 8; + this->collisionLayer = 1; + this->spritePriority.b0 = 0; + this->spriteRendering.b3 = 0; + this->spriteOrientation.flipY = 1; + this->x.HALF.HI = gRoomControls.scroll_x; + this->y.HALF.HI = gPlayerEntity.y.HALF.HI; + this->child = NULL; + SetDefaultPriority(this, 6); + InitAnimationForceUpdate(this, 0); + SoundReq(0x123); + break; + case 1: + this->collisionLayer = gPlayerEntity.collisionLayer; + this->speed += 8; + if (this->speed > 0x300) { + this->speed = 0x300; + } + + if ((gPlayerEntity.flags & 0x80) != 0 && (gMessage.doTextBox & 0x7f) == 0 && gPlayerEntity.action != 28 && + gPlayerEntity.action != 6 && gPlayerEntity.action != 9 && gPlayerState.framestate != 24 && + gPlayerState.framestate != 11 && gPlayerState.framestate != 8 && sub_08079F8C() && + (EntityInRectRadius(this, &gPlayerEntity, 0xe, 0xe))) { + s32 z = gPlayerEntity.z.HALF.HI - this->z.HALF.HI - 8; + if ((u16)z < 0x20 && gPlayerEntity.health != 0) { + pEVar5 = CreateObject(0x95, 10, 0); + if (pEVar5 != NULL) { + this->child = pEVar5; + this->action = 2; + this->actionDelay = 8; + this->speed = 0x300; + this->field_0x68.HWORD = 0xe000; + sub_08079184(); + sub_08078B48(); + ResetPlayerAnimationAndAction(); + sub_08077B20(); + gPlayerState.swim_state = 0; + gPlayerState.jump_status = 0; + gPlayerEntity.flags &= 0x7f; + gPlayerEntity.spriteSettings.draw = 0; + gPriorityHandler.sys_priority = 6; + gUnk_02034490.unk0 = 1; + } + } + } + break; + default: + sub_08078B48(); + gPlayerEntity.spriteSettings.draw = 0; + break; + } + LinearMoveUpdate(this); + GravityUpdate(this, (s16)this->field_0x68.HWORD); + UpdateAnimationSingleFrame(this); + pEVar5 = this->child; + if (pEVar5 != NULL) { + if (gPlayerEntity.x.HALF.HI < this->x.HALF.HI - 8) { + this->actionDelay = 0; + } + + if (this->actionDelay == 0) { + PositionRelative(this, pEVar5, 0xfff80000, 0); + pEVar5->z.HALF.HI += 0x18; + pEVar5->spritePriority.b0 = this->spritePriority.b0; + pEVar5->spriteRendering.b3 = this->spriteRendering.b3; + pEVar5->spriteOrientation.flipY = this->spriteOrientation.flipY; + } else { + this->actionDelay--; + CopyPosition(&gPlayerEntity, pEVar5); + } + } + + if (CheckOnScreen(this) == 0) { + if (this->action == 2) { + gSave.windcrests |= 0x10000000; + MenuFadeIn(9, 0); + } + pEVar5 = this->child; + if (pEVar5 != NULL) { + DeleteEntityAny(pEVar5); + } + DeleteThisEntity(); + } +} + +void Bird_Type9(Entity* this) { + Entity* pEVar1; + Entity* child; + + if (this->action == 0) { + this->action = 1; + this->spriteSettings.draw = 1; + this->zVelocity = -0x28000; + this->z.WORD = 0xffb4c000; + this->field_0x68.HWORD = 0xf000; + this->speed = 0x300; + this->direction = 8; + this->collisionLayer = 1; + this->spritePriority.b0 = 0; + this->spriteRendering.b3 = 0; + this->spriteOrientation.flipY = 1; + ; + SetDefaultPriority(this, 6); + this->x.HALF.HI = gRoomControls.scroll_x; + this->y.HALF.HI = gPlayerEntity.y.HALF.HI; + SoundReq(SFX_123); + this->spritePriority.b1 = 2; + InitAnimationForceUpdate(this, 0); + sub_08078B48(); + } else if (this->action == 1) { + gPlayerEntity.spriteSettings.draw = 0; + child = this->child; + if (child != NULL) { + PositionRelative(this, child, Q_16_16(-8), 0); + child->z.HALF.HI += 0x18; + child->spritePriority.b0 = this->spritePriority.b0; + child->spriteRendering.b3 = this->spriteRendering.b3; + child->spriteOrientation.flipY = this->spriteOrientation.flipY; + } + sub_08078B48(); + if (gRoomControls.scroll_x + 0x78 < this->x.HALF.HI) { + this->action++; + this->spritePriority.b1 = 1; + if (child != NULL) { + child->action++; + } + gRoomControls.camera_target = &gPlayerEntity; + gPlayerEntity.spriteSettings.draw = 1; + ResetPlayerAnimationAndAction(); + ResetPlayerEventPriority(); + gUnk_02034490.unk0 = 0; + if (!CheckGlobalFlag(WARP_1ST)) { + pEVar1 = CreateObject(OBJECT_69, 0, 0); + if (pEVar1 != NULL) { + *(ScriptExecutionContext**)&pEVar1->cutsceneBeh = StartCutscene(pEVar1, script_EzloTalkOcarina); + SetGlobalFlag(WARP_1ST); + } + } + } + } + LinearMoveUpdate(this); + GravityUpdate(this, (short)this->field_0x68.HWORD); + UpdateAnimationSingleFrame(this); + if (!CheckOnScreen(this)) { + DeleteThisEntity(); + } +} + +void Bird_Type10(Entity* this) { + this->palette.b.b0 = gPlayerEntity.palette.b.b0; + switch (this->action) { + case 0: + this->action = 1; + this->spriteSettings.draw = 1; + this->collisionLayer = 1; + this->spritePriority.b0 = 0; + this->spriteRendering.b3 = 0; + this->spriteOrientation.flipY = 1; + SetDefaultPriority(this, 6); + InitAnimationForceUpdate(this, 0xe0); + case 1: + UpdateAnimationSingleFrame(this); + break; + case 2: + this->action = 3; + break; + case 3: + DeleteThisEntity(); + break; + } +} + +void CreateBird(void) { + Entity* birdEnt; + +#ifndef EU + if (AreaAllowsWarp()) { +#else + if (AreaIsOverworld()) { +#endif + if (!FindEntity(OBJECT, BIRD, 6, 8, 0)) { + birdEnt = CreateObject(BIRD, 8, 0); + if (birdEnt != NULL) { + birdEnt->actionDelay = 0; + } + } + } +} + +void sub_0809D738(void) { + Entity* pEVar1; + Entity* pEVar2; + + pEVar1 = CreateObject(BIRD, 9, 0); + if (pEVar1 != NULL) { + gRoomControls.camera_target = NULL; + SetDefaultPriority(pEVar1, 6); + SetPlayerEventPriority(); + pEVar2 = CreateObject(BIRD, 10, 0); + if (pEVar2 != NULL) { + pEVar1->child = pEVar2; + } + gUnk_02034490.unk0 = 1; + } else { + ResetPlayerAnimationAndAction(); + } +} diff --git a/src/object/book.c b/src/object/book.c index f42b2f1d..3c9e12b5 100644 --- a/src/object/book.c +++ b/src/object/book.c @@ -15,11 +15,9 @@ void Book(Entity* this) { } void sub_0809B3C4(Entity* this) { - u32 obtained; - - obtained = GetInventoryValue(this->type + ITEM_QST_BOOK1); + u32 obtained = GetInventoryValue(this->type + ITEM_QST_BOOK1); if (this->type2 != 3) { - if (obtained) { + if (obtained != 0) { DeleteThisEntity(); } } else { @@ -42,7 +40,7 @@ void sub_0809B3C4(Entity* this) { } UpdateSpriteForCollisionLayer(this); - InitAnimationForceUpdate(this, this->type + 0x39); + InitAnimationForceUpdate(this, this->type + ITEM_QST_BOOK1); switch (this->type2) { case 0: @@ -55,22 +53,23 @@ void sub_0809B3C4(Entity* this) { case 1: { u32 scroll; u32 height; + this->action = 3; scroll = (u16)gRoomControls.scroll_y - 0x10; height = (u16)this->y.HALF.HI - scroll; this->z.HALF.HI -= height; - return; + break; } case 2: this->action = 4; - return; + break; case 3: this->action = 5; this->subAction = 0; this->spritePriority.b0 = 3; break; default: - return; + break; } } @@ -89,10 +88,10 @@ void sub_0809B4A8(Entity* this) { this->action = 2; this->actionDelay = 30; - this->speed = 64; - this->direction = 16; + this->speed = 0x40; + this->direction = 0x10; - gPlayerState.pushedObject = 0x9e; + gPlayerState.pushedObject = TREE_THORNS; gPlayerState.queued_action = PLAYER_PUSH; gPlayerState.flags |= PL_BUSY; @@ -101,7 +100,7 @@ void sub_0809B4A8(Entity* this) { gPlayerEntity.direction = gPlayerEntity.animationState << 2; EnqueueSFX(SFX_10F); } else { - this->actionDelay = 0x16; + this->actionDelay = 22; } } @@ -109,12 +108,12 @@ void sub_0809B524(Entity* this) { if (--this->actionDelay == 0) { if (--this->field_0xf == 0) { this->action = 3; - this->y.HALF.HI += 32; - this->z.HALF.HI -= 32; + this->y.HALF.HI += 0x20; + this->z.HALF.HI -= 0x20; } else { this->action = 1; this->actionDelay = 22; - this->field_0x80.HALF.LO = 24; + this->field_0x80.HALF.LO = 0x18; } } @@ -134,7 +133,7 @@ void sub_0809B56C(Entity* this) { SetFlag(this->field_0x86.HWORD); fx = CreateFx(this, FX_DEATH, 0); - if (fx) { + if (fx != NULL) { SortEntityAbove(this, fx); } } @@ -143,7 +142,7 @@ void sub_0809B5B4(Entity* this) { if (gPlayerState.flags & PL_MINISH) { sub_0800445C(this); } else if (IsCollidingPlayer(this)) { - CreateItemEntity(this->type + 0x39, 0, 0); + CreateItemEntity(this->type + ITEM_QST_BOOK1, 0, 0); DeleteThisEntity(); } } @@ -152,9 +151,8 @@ void sub_0809B5EC(Entity* this) { if (this->spriteSettings.draw == 1) { switch (this->subAction) { case 0: { - Entity* parent; - parent = FindEntityByID(NPC, STURGEON, 7); - if (!parent) { + Entity* parent = FindEntityByID(NPC, STURGEON, 7); + if (parent == NULL) { return; } if (parent->x.HALF.HI < this->x.HALF.HI) { @@ -170,7 +168,7 @@ void sub_0809B5EC(Entity* this) { break; } case 1: { - if (!this->parent || !this->parent->next) { + if ((this->parent == NULL) || (this->parent->next == NULL)) { DeleteThisEntity(); return; } @@ -206,9 +204,8 @@ void sub_0809B5EC(Entity* this) { } u32 sub_0809B688(Entity* this) { - u32 ret; + u32 ret = EntityInRectRadius(this, &gPlayerEntity, 6, 12); - ret = EntityInRectRadius(this, &gPlayerEntity, 6, 12); if (ret == 1 && gPlayerState.field_0xd != 16) { ret = 0; } @@ -217,8 +214,7 @@ u32 sub_0809B688(Entity* this) { } void sub_0809B6B0(Entity* parent, Entity* this) { - s32 offset; - offset = (s32)gUnk_08123D94[parent->animationState >> 1] << 16; + s32 offset = (s32)gUnk_08123D94[parent->animationState >> 1] << 16; PositionRelative(parent, this, 0, offset); diff --git a/src/object/button.c b/src/object/button.c index 5a29e636..d4f602ba 100644 --- a/src/object/button.c +++ b/src/object/button.c @@ -242,7 +242,7 @@ u32 sub_08081F7C(Entity* this, u32 r7) { if (this->actionDelay == 0) return 1; if (--this->actionDelay > 6) { - if (this->child) + if (this->child != NULL) this->child->spriteOffsetY = -4; } else { if (this->actionDelay == 6) { diff --git a/src/object/cuccoMinigame.c b/src/object/cuccoMinigame.c new file mode 100644 index 00000000..19f63c3f --- /dev/null +++ b/src/object/cuccoMinigame.c @@ -0,0 +1,358 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "script.h" +#include "npc.h" +#include "fileselect.h" +#include "functions.h" +#include "object.h" +#include "enemy.h" + +typedef struct { + Entity base; + s16 unk68; + s16 unk6a; + s16 unk6c; + u16 unk6e; + u8 unk70[0x18]; +} ObjectB9Entity; + +typedef Entity* ObjectB9Heap[10]; + +u32 sub_080A1514(); + +const u16 gUnk_08124C20[] = { + 25, 0x2, 25, 0x3, 30, 0x4, 45, 0x5, 50, 0x5, 45, 0x5, 50, 0x6, 60, 0x7, 55, 0x2, 55, 0x3, +}; + +static const u16 pObjectB9_MinigameCuccoDefs[][30] = { + { 0x0001, 0x02E9, 0x0318, 0x0001, 0x0280, 0x0380, 0x0002, 0x0277, 0x0314, 0x0001, + 0x0332, 0x0248, 0x0001, 0x0257, 0x028C, 0x0001, 0x0199, 0x031B, 0x0001, 0x0321, + 0x01B4, 0x0002, 0x02DF, 0x01D8, 0x0001, 0x03AD, 0x02DE, 0x0001, 0x0216, 0x01CC }, + { 0x0001, 0x02E9, 0x0318, 0x0001, 0x0280, 0x0380, 0x0002, 0x0277, 0x0314, 0x0001, + 0x0332, 0x0248, 0x0001, 0x0257, 0x028C, 0x0001, 0x0199, 0x031B, 0x0001, 0x0321, + 0x01B4, 0x0002, 0x02DF, 0x01D8, 0x0001, 0x03AD, 0x02DE, 0x0001, 0x0216, 0x01CC }, + { 0x0001, 0x02E9, 0x0318, 0x0001, 0x0280, 0x0380, 0x0002, 0x0277, 0x0314, 0x0001, + 0x0332, 0x0248, 0x0001, 0x0257, 0x028C, 0x0001, 0x0199, 0x031B, 0x0001, 0x0321, + 0x01B4, 0x0002, 0x02DF, 0x01D8, 0x0001, 0x03AD, 0x02DE, 0x0001, 0x0216, 0x01CC }, + { + 0x0002, 0x02F6, 0x0346, 0x0001, 0x0266, 0x033C, 0x0001, 0x0319, 0x0296, 0x0001, + 0x0284, 0x0284, 0x0002, 0x0216, 0x0284, 0x0001, 0x0142, 0x0330, 0x0002, 0x0179, + 0x039F, 0x0001, 0x03A6, 0x0280, 0x0001, 0x039A, 0x015D, 0x0001, 0x031E, 0x01E5, + }, + { 0x0001, 0x0296, 0x0314, 0x0001, 0x02E6, 0x0231, 0x0001, 0x0254, 0x0290, 0x0001, + 0x01F8, 0x0325, 0x0001, 0x0185, 0x0367, 0x0001, 0x0320, 0x01D6, 0x0002, 0x01F8, + 0x0287, 0x0002, 0x029D, 0x01B1, 0x0002, 0x01F9, 0x022D, 0x0002, 0x0114, 0x0321 }, + { 0x0002, 0x02F6, 0x0346, 0x0001, 0x0266, 0x033C, 0x0001, 0x0319, 0x0296, 0x0001, + 0x0284, 0x0284, 0x0002, 0x0216, 0x0284, 0x0001, 0x0142, 0x0330, 0x0002, 0x0179, + 0x039F, 0x0002, 0x022D, 0x01CB, 0x0001, 0x039A, 0x015D, 0x0001, 0x031E, 0x01E5 }, + { 0x0001, 0x02E9, 0x0318, 0x0001, 0x0280, 0x0380, 0x0002, 0x0277, 0x0314, 0x0001, + 0x0332, 0x0248, 0x0001, 0x0257, 0x028C, 0x0001, 0x0199, 0x031B, 0x0001, 0x0321, + 0x01B4, 0x0002, 0x02DF, 0x01D8, 0x0001, 0x03AD, 0x02DE, 0x0001, 0x0216, 0x01CC }, + { 0x0001, 0x02E9, 0x0318, 0x0002, 0x0280, 0x0380, 0x0002, 0x0277, 0x0314, 0x0001, + 0x0332, 0x0248, 0x0001, 0x0257, 0x028C, 0x0001, 0x0199, 0x031B, 0x0001, 0x0321, + 0x01B4, 0x0002, 0x02DF, 0x01D8, 0x0002, 0x03AD, 0x02DE, 0x0001, 0x0216, 0x01CC }, + { 0x0001, 0x004D, 0x00F3, 0x0001, 0x011A, 0x0247, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, + { 0x0001, 0x0051, 0x0328, 0x0002, 0x0114, 0x0321, 0x0002, 0x0332, 0x0248, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 } +}; + +static const u8 gUnk_08124EA0[] = { 0x3F, 0x0A, 0x01, 0x00, 0x3F, 0x0A, 0x01, 0x00, 0x3F, 0x14, 0x01, 0x00, 0x3F, 0x14, + 0x01, 0x00, 0x3F, 0x1E, 0x01, 0x00, 0x3F, 0x1E, 0x01, 0x00, 0x5C, 0x6E, 0x01, 0x00, + 0x5C, 0x6F, 0x01, 0x00, 0x5C, 0x70, 0x01, 0x00, 0x63, 0x00, 0x01, 0x00 }; + +static const u16 CuccoMinigame_Sounds[] = { SFX_VO_CUCCO5, SFX_VO_CUCCO_CALL }; + +static const u8 CuccoMinigameRupees[] = { 0, 10, 50, 0 }; + +void ObjectB9(ObjectB9Entity* this) { + int index; + u32 val; + u8* puVar2; + const u16* ptr; + + if (super->action == 0) { + super->action++; + ptr = gUnk_08124C20 + sub_080A1514() * 2; + this->unk68 = ptr[0] * 0x3c; + this->unk6a = 0; + this->unk6c = ptr[1]; + this->unk6e = 1; + + for (puVar2 = this->unk70, val = 0, index = 9; index >= 0; index--) { + *puVar2++ = val; + } + sub_0807DD64(super); + sub_0806EC20(super); + } + sub_0807DD94(super, 0); +} + +NONMATCH("asm/non_matching/objectB9/sub_080A1270.inc", void sub_080A1270(ObjectB9Entity* this)) { + s32 iVar1; + int iVar2; + s32 iVar4; + s32 sVar6; + int iVar7; + s8* ptr; + s32 val; + Entity* pEnt; + Entity** entArray; + + sVar6 = 0; + entArray = ((Entity**)super->myHeap); + ptr = this->unk70; + iVar1 = (gRoomControls.origin_x + 0x360); + iVar4 = (gRoomControls.origin_y + 0x350); + iVar1 = (iVar1 << 16) >> 16; + iVar4 = (iVar4 << 16) >> 16; + val = -1; + + for (iVar7 = 0; iVar7 < 9; iVar7++) { + pEnt = entArray[iVar7]; + if (((s8*)ptr)[iVar7] == 0) { + if (pEnt->next != NULL && pEnt != NULL) { + if ((iVar1 <= pEnt->x.HALF.HI) && (iVar4 <= pEnt->y.HALF.HI)) { + ptr[iVar7] = pEnt->type + 1; + pEnt->type2 = 1; + sVar6++; + SoundReq(CuccoMinigame_Sounds[pEnt->type]); + } + } else { + ((s8*)ptr)[iVar7] = val; + } + } else if (0 < (s8)ptr[iVar7]) { + sVar6++; + if (pEnt->next != NULL && pEnt != NULL) { + iVar2 = iVar1 + 4; + if (iVar2 > pEnt->x.HALF.HI) { + pEnt->x.HALF.HI = iVar2; + } + iVar2 = iVar4 + 4; + if (iVar2 > pEnt->y.HALF.HI) { + pEnt->y.HALF.HI = iVar2; + } + } else { + ((s8*)ptr)[iVar7] = val; + } + } + } + + this->unk6a = sVar6; + gPlayerState.field_0x27[0] = 0xff; + if (--this->unk68 < 1) { + SoundReq(SFX_CUCCO_MINIGAME_BELL); + sub_08050384(); + } else { + gActiveScriptInfo.commandSize = 0; + } +} +END_NONMATCH + +void CuccoMinigame_Cleanup(ObjectB9Entity* this) { + Entity** puVar1; + s8* pcVar2; + int index; + + pcVar2 = this->unk70; + puVar1 = super->myHeap; + + for (index = 9; index >= 0; index--, pcVar2++, puVar1++) { + Entity* pEnt = *puVar1; + if (*pcVar2 >= 0 && pEnt != NULL) { + DeleteEntityAny(pEnt); + } + } +} + +void sub_080A13B4(ObjectB9Entity* this, ScriptExecutionContext* context) { + if (this->unk6a >= this->unk6c) { + MessageFromTarget(0x300c); + context->condition = 1; + } else { + MessageFromTarget(0x3005); + context->condition = 0; + } +} + +void sub_080A13E8(ObjectB9Entity* this) { + bool32 bVar2; + const u8* ptr = &gUnk_08124EA0[sub_080A1514() * 4]; + + bVar2 = 0; + switch (ptr[0]) { + case 0x3f: + if (gSave.stats.hasAllFigurines) { + bVar2 = 1; + } + break; + case 0x5c: + if (gSave.didAllFusions) { + bVar2 = 1; + } + break; + case 0x63: + if (!CheckGlobalFlag(0x4f)) { + SetGlobalFlag(0x4f); + break; + } + bVar2 = 1; + break; + } + + if (!bVar2) { + sub_080A7C18(ptr[0], ptr[1], 0); + } else { + this->unk6e = 2; + } +} + +void sub_080A1460(ObjectB9Entity* this) { + s8* pcVar1; + int iVar2; + s32 rupees; + const u8* ptr; + + sub_080A1514(); + pcVar1 = this->unk70; + rupees = 0; + ptr = CuccoMinigameRupees; + + for (iVar2 = 9; iVar2 >= 0; iVar2--) { + // Weird register addition + // ptr[*pcVar1] translates to add r0,r3,r0 but should be add r0,r3 + u32 temp = *pcVar1; + temp += (int)ptr; + rupees += *(u8*)temp; + pcVar1++; + } + ModRupees(rupees); + MessageNoOverlap(0x3007, super); + gMessage.rupees = (u16)rupees; +} + +void sub_080A14A8(void) { + int iVar1; + + iVar1 = sub_080A1514(); + iVar1++; + if (iVar1 > 9) { + iVar1 = 9; + } + + if (iVar1 & 1) { + SetGlobalFlag(0x4b); + } else { + ClearGlobalFlag(0x4b); + } + + if (iVar1 & 2) { + SetGlobalFlag(0x4c); + } else { + ClearGlobalFlag(0x4c); + } + + if (iVar1 & 4) { + SetGlobalFlag(0x4d); + } else { + ClearGlobalFlag(0x4d); + } + + if (iVar1 & 8) { + SetGlobalFlag(0x4e); + } else { + ClearGlobalFlag(0x4e); + } +} + +u32 sub_080A1514(void) { + u32 rv = 0; + + if (CheckGlobalFlag(0x4b)) { + rv = 1; + } + + if (CheckGlobalFlag(0x4c)) { + rv |= 2; + } + + if (CheckGlobalFlag(0x4d)) { + rv |= 4; + } + + if (CheckGlobalFlag(0x4e)) { + rv |= 8; + } + return rv; +} + +void CuccoMinigame_Init(Entity* this, ScriptExecutionContext* context) { + Entity* pEnt; + const short* pCuccoMinigameDef; + int index; + Entity** ppEVar5; + RoomControls* room; + + context->condition = 0; + pEnt = CreateObject(CUCCO_MINIGAME, 0, 0); + if (pEnt != NULL) { + pEnt->myHeap = (u32*)zMalloc(sizeof(ObjectB9Heap)); + if (pEnt->myHeap == NULL) { + DeleteEntityAny(pEnt); + } else { + *(ScriptExecutionContext**)&((GenericEntity*)pEnt)->cutsceneBeh = + (ScriptExecutionContext*)StartCutscene(pEnt, (u16*)context->intVariable); + pCuccoMinigameDef = pObjectB9_MinigameCuccoDefs[sub_080A1514()]; + ppEVar5 = (Entity**)pEnt->myHeap; + room = &gRoomControls; + for (index = 9; index >= 0; index--, pCuccoMinigameDef += 3) { + if (pCuccoMinigameDef[0] < 1) { + pEnt = NULL; + } else { + pEnt = (Entity*)CreateEnemy(CUCCO_AGGR, pCuccoMinigameDef[0] - 1); + if (pEnt != NULL) { + pEnt->x.HALF.HI = room->origin_x + pCuccoMinigameDef[1]; + pEnt->y.HALF.HI = room->origin_y + pCuccoMinigameDef[2]; + pEnt->collisionLayer = 1; + } + } + *ppEVar5++ = pEnt; + } + context->condition = 1; + } + } +} + +void sub_080A1608(void) { + u16 messageIndex; + const u16* ptr; + + messageIndex = 0x3002; + if (CheckRoomFlag(1)) { + messageIndex = 0x3006; + } + MessageFromTarget(messageIndex); + gMessage.textWindowPosX = 1; + gMessage.textWindowPosY = 0; + ptr = &gUnk_08124C20[sub_080A1514() * 2]; + gMessage.rupees = ptr[0]; + gMessage.field_0x14 = ptr[1]; +} + +void sub_080A1648(void) { + SetTileType(0x407f, 0xd36, 1); + SetTileType(0x407f, 0xd37, 1); + SetTileType(0x407f, 0xd38, 1); + SetTileType(0x407e, 0xd75, 1); + SetTileType(0x407e, 0xe75, 1); +} + +void sub_080A169C(void) { + sub_0807BA8C(0xd36, 1); + sub_0807BA8C(0xd37, 1); + sub_0807BA8C(0xd38, 1); + sub_0807BA8C(0xd75, 1); + sub_0807BA8C(0xe75, 1); +} diff --git a/src/object/figurineDevice.c b/src/object/figurineDevice.c index df7dbdc5..a9efe80c 100644 --- a/src/object/figurineDevice.c +++ b/src/object/figurineDevice.c @@ -303,7 +303,7 @@ void FigurineDevice_Action4(FigurineDeviceEntity* this) { gMessage.textWindowPosX = 1; gMessage.textWindowPosY = 0xc; #endif - gMessage.field_0x10 = this->unk_81; + gMessage.rupees = this->unk_81; break; } } @@ -417,9 +417,9 @@ void sub_080882A8(FigurineDeviceEntity* this) { sub_08057044(this->unk_83, &gUnk_020227E8[1], 0x202020); ptr = (u8*)0x02000000; if (ptr[7] == 0) { - sub_0805F46C((u32)gUnk_08120AE4[super->type2], &gUnk_08120AB4); + sub_0805F46C((u32)gUnk_08120AE4[super->type2], (Font*)&gUnk_08120AB4); // TODO convert data } else { - sub_0805F46C((u32)gUnk_08120AE4[super->type2], &gUnk_08120ACC); + sub_0805F46C((u32)gUnk_08120AE4[super->type2], (Font*)&gUnk_08120ACC); // TODO convert data } gScreen.bg0.updated = 1; } @@ -477,7 +477,7 @@ void sub_08088478(void) { gMessage.textWindowPosX = 1; gMessage.textWindowPosY = 0xc; if (set0x10) { - gMessage.field_0x10 = 5; + gMessage.rupees = 5; } #ifndef EU gPlayerEntity.animationState = 6; diff --git a/src/object/fileScreenObjects.c b/src/object/fileScreenObjects.c index 7d2a295f..c7cac4e7 100644 --- a/src/object/fileScreenObjects.c +++ b/src/object/fileScreenObjects.c @@ -252,7 +252,7 @@ void sub_0808EABC(Entity* this) { void sub_0808EB74(Entity* this) { Entity* entity = sub_0808EC80(gMapDataBottomSpecial.unk6); - if (entity) { + if (entity != NULL) { this->x.WORD = entity->x.WORD; this->y.WORD = entity->y.WORD; this->spriteRendering.b3 = entity->spriteRendering.b3; @@ -305,7 +305,7 @@ void sub_0808EBB8(Entity* this) { // Fall through default: entity = sub_0808EC80(var0); - if (entity) { + if (entity != NULL) { SortEntityBelow(entity, this); this->spriteRendering.b3 = entity->spriteRendering.b3; x = entity->x.HALF.HI; diff --git a/src/object/fireballChain.c b/src/object/fireballChain.c new file mode 100644 index 00000000..ac5322b7 --- /dev/null +++ b/src/object/fireballChain.c @@ -0,0 +1,41 @@ +#define NENT_DEPRECATED +#include "global.h" +#include "entity.h" +#include "functions.h" +#include "projectile.h" +#include "projectile/winder.h" + +void FireballChain(Entity* thisx) { + WinderEntity* newSegment; + Entity* parent; + Entity* child; + s32 i; + s32 j; + + if (gEntCount > 0x42) { + return; + } + + for (i = 0; i < 5; i++) { + u16* tmp; + + newSegment = (WinderEntity*)CreateProjectile(WINDER); + if (i == 0) { + child = parent = &newSegment->base; + } + + newSegment->base.type = i; + newSegment->base.parent = parent; + newSegment->base.child = child; + CopyPosition(thisx, &newSegment->base); + + for (j = 0, tmp = newSegment->positions; j < WINDER_NUM_SEGMENTS; j++) { + *tmp++ = thisx->x.HALF.HI; + *tmp++ = thisx->y.HALF.HI; + } + + child = &newSegment->base; + } + + DeleteThisEntity(); +} diff --git a/src/object/floatingPlatform.c b/src/object/floatingPlatform.c index d62d7603..9701ba66 100644 --- a/src/object/floatingPlatform.c +++ b/src/object/floatingPlatform.c @@ -33,12 +33,11 @@ void sub_080860D8(FloatingPlatformEntity* this) { } void sub_0808611C(FloatingPlatformEntity* this) { - int iVar2; + bool32 iVar2 = sub_08086168(this); - iVar2 = sub_08086168(this); if (super->actionDelay != 0 && super->parent->actionDelay == 0) { - if (iVar2 != 0) { + if (iVar2) { super->parent->actionDelay++; } @@ -46,7 +45,7 @@ void sub_0808611C(FloatingPlatformEntity* this) { } else if (super->actionDelay == 0) { sub_080A2BE4(super, iVar2); } else { - sub_080A2BE4(super, 0); + sub_080A2BE4(super, FALSE); } if (--this->unk70 == 0) { diff --git a/src/object/gyorgBossObject.c b/src/object/gyorgBossObject.c index b63b8d81..ebbec424 100644 --- a/src/object/gyorgBossObject.c +++ b/src/object/gyorgBossObject.c @@ -10,7 +10,6 @@ extern const ScreenTransitionData gUnk_0813ABD0; -extern u32 sub_08079F8C(void); struct GyorgChildSpawns { s16 offsetX; s16 offsetY; diff --git a/src/object/houseDoorExterior.c b/src/object/houseDoorExterior.c index 1627c7e8..baadd362 100644 --- a/src/object/houseDoorExterior.c +++ b/src/object/houseDoorExterior.c @@ -53,7 +53,7 @@ void sub_080866D8(Entity* this) { if ((*((u32*)(&this->field_0x68)) & mask) == 0 && sub_080867CC(prop->unk5) && CheckRegionOnScreen(prop->unk0, prop->unk2, 32, 32)) { entity = CreateObject(HOUSE_DOOR_EXT, prop->unk7, prop->unk6); - if (entity) { + if (entity != NULL) { entity->field_0x6c.HALF.LO = i; entity->x.HALF.HI = gRoomControls.origin_x + prop->unk0 + 16; entity->y.HALF.HI = gRoomControls.origin_y + prop->unk2 + 32; @@ -157,7 +157,7 @@ static void sub_080868EC(Entity* entity, unk_80868EC* arg1) { void sub_0808692C(Entity* this) { this->flags &= ~ENT_SCRIPTED; this->type2 = 2; - this->action = this->frameIndex == 0 ? 1 : 2; + this->action = (this->frameIndex == 0) ? 1 : 2; this->subAction = 0; this->actionDelay = 8; } diff --git a/src/object/lilypadSmall.c b/src/object/lilypadSmall.c index ce03ff99..eed1578f 100644 --- a/src/object/lilypadSmall.c +++ b/src/object/lilypadSmall.c @@ -4,7 +4,7 @@ extern u16 gUnk_08123318[]; static void sub_08097B24(Entity* this); -static u32 sub_08097ADC(Entity* this); +static bool32 sub_08097ADC(Entity* this); void LilypadSmall(Entity* this) { u32 rand; @@ -29,19 +29,19 @@ void LilypadSmall(Entity* this) { } } -static u32 sub_08097ADC(Entity* this) { - if ((gPlayerState.flags & PL_MINISH) == 0) { - return 0; +static bool32 sub_08097ADC(Entity* this) { + if (!(gPlayerState.flags & PL_MINISH)) { + return FALSE; } else if (EntityInRectRadius(this, &gPlayerEntity, 8, 8) == 0) { - return 0; - } else if (sub_08079F8C() == 0) { - return 0; + return FALSE; + } else if (!sub_08079F8C()) { + return FALSE; } else { gPlayerState.field_0x14 = 1; if (gPlayerEntity.z.HALF.HI != 0) { - return 0; + return FALSE; } else { - return 1; + return TRUE; } } } @@ -52,7 +52,7 @@ static void sub_08097B24(Entity* this) { u16* temp3; if (--this->actionDelay == 0) { - this->actionDelay = 0x5a; + this->actionDelay = 90; this->frameIndex = (this->frameIndex + 1) & 3; } temp3 = gUnk_08123318; diff --git a/src/object/mazaalBossObject.c b/src/object/mazaalBossObject.c new file mode 100644 index 00000000..adc3ab6d --- /dev/null +++ b/src/object/mazaalBossObject.c @@ -0,0 +1,207 @@ +#define NENT_DEPRECATED +#include "global.h" +#include "entity.h" +#include "enemy.h" +#include "functions.h" +#include "item.h" +#include "object.h" +#include "player.h" +#include "new_player.h" +#include "room.h" +#include "screen.h" +#include "sound.h" + +extern u16 script_Object89Mazaal[]; + +typedef struct { + /* 0x00 */ Entity base; + /* 0x68 */ u8 unk_68[0x1C]; + /* 0x84 */ ScriptExecutionContext* cutsceneBeh; +} MazaalBossObjectEntity; + +enum MazaalBossObjectActions { + /* 0 */ MAZAAL_BOSS_OBJECT_ACTION_0, + /* 1 */ MAZAAL_BOSS_OBJECT_ACTION_1, + /* 2 */ MAZAAL_BOSS_OBJECT_ACTION_2, + /* 3 */ MAZAAL_BOSS_OBJECT_ACTION_3, + /* 4 */ MAZAAL_BOSS_OBJECT_ACTION_4, + /* 5 */ MAZAAL_BOSS_OBJECT_ACTION_5, + /* 6 */ MAZAAL_BOSS_OBJECT_ACTION_6, + /* 7 */ MAZAAL_BOSS_OBJECT_ACTION_7, + /* 8 */ MAZAAL_BOSS_OBJECT_ACTION_8, +}; + +void MazaalBossObject_Action0(MazaalBossObjectEntity* this); // 0809AB04 +void MazaalBossObject_Action1(MazaalBossObjectEntity* this); // 0809ABA4 +void MazaalBossObject_Action2(MazaalBossObjectEntity* this); // 0809ABB0 +void MazaalBossObject_Action3(MazaalBossObjectEntity* this); // 0809ABD4 +void MazaalBossObject_Action4(MazaalBossObjectEntity* this); // 0809ABF4 +void MazaalBossObject_Action5(MazaalBossObjectEntity* this); // 0809AC3C +void MazaalBossObject_Action6(MazaalBossObjectEntity* this); // 0809ACA0 +void MazaalBossObject_Action7(MazaalBossObjectEntity* this); // 0809ACCC +void MazaalBossObject_Action8(MazaalBossObjectEntity* this); // 0809ACE8 +void sub_0809AD68(MazaalBossObjectEntity* this); // 0809AD68 +void sub_0809AD8C(MazaalBossObjectEntity* this); // 0809AD8C + +void MazaalBossObject(Entity* thisx) { + static void (*const MazaalBossObject_Actions[])(MazaalBossObjectEntity*) = { + MazaalBossObject_Action0, MazaalBossObject_Action1, MazaalBossObject_Action2, + MazaalBossObject_Action3, MazaalBossObject_Action4, MazaalBossObject_Action5, + MazaalBossObject_Action6, MazaalBossObject_Action7, MazaalBossObject_Action8, + }; + + MazaalBossObject_Actions[thisx->action]((MazaalBossObjectEntity*)thisx); +} + +void MazaalBossObject_Action0(MazaalBossObjectEntity* this) { + Entity* mazaalHead; + + if (CheckFlags(0x31)) { + sub_0809AD68(this); + sub_0809AD8C(this); + DeleteThisEntity(); + } + + mazaalHead = CreateEnemy(MAZAAL_HEAD, 0); + if (mazaalHead == NULL) { + return; + } + + CopyPosition(super, mazaalHead); + super->child = mazaalHead; + + if (gRoomTransition.field_0x38 != 0) { + if (gRoomTransition.field_0x39 != 0) { + DeleteThisEntity(); + } + + super->action = MAZAAL_BOSS_OBJECT_ACTION_7; + super->spriteSettings.draw = 0; + gRoomControls.camera_target = super; + sub_080809D4(); + } else { + super->action = MAZAAL_BOSS_OBJECT_ACTION_1; + super->actionDelay = 30; + super->frameIndex = gRoomTransition.field_0x38; + super->spritePriority.b0 = 7; + super->spriteOffsetY = 0x20; + + this->cutsceneBeh = StartCutscene(super, script_Object89Mazaal); + } +} + +void MazaalBossObject_Action1(MazaalBossObjectEntity* this) { + ExecuteScriptForEntity(super, NULL); +} + +void MazaalBossObject_Action2(MazaalBossObjectEntity* this) { + if (--super->actionDelay == 0) { + super->action = MAZAAL_BOSS_OBJECT_ACTION_3; + super->actionDelay = 120; + gRoomControls.camera_target = super->child; + } +} + +void MazaalBossObject_Action3(MazaalBossObjectEntity* this) { + if (--super->actionDelay == 0) { + super->action = MAZAAL_BOSS_OBJECT_ACTION_4; + super->actionDelay = 90; + super->child->subAction = 1; + } +} + +void MazaalBossObject_Action4(MazaalBossObjectEntity* this) { + if (super->child->subAction > 2) { + if (--super->actionDelay == 0) { + super->action = MAZAAL_BOSS_OBJECT_ACTION_5; + super->actionDelay = 8; + super->field_0xf = 0; + super->spriteRendering.alphaBlend = BLDALPHA_BLEND(1, 0); + + gScreen.controls.layerFXControl = + BLDCNT_TGT2_BG3 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG0 | BLDCNT_EFFECT_BLEND; + gScreen.controls.alphaBlend = BLDALPHA_BLEND(0x10, 0); + } + } +} + +void MazaalBossObject_Action5(MazaalBossObjectEntity* this) { + u32 tmp; + + if (--super->actionDelay == 0) { + super->actionDelay = 8; + + tmp = ++super->field_0xf; + tmp &= 0xFF; + gScreen.controls.alphaBlend = BLDALPHA_BLEND((0x10 - tmp) & 0xFF, tmp); + + if (super->field_0xf > 15) { + super->spriteRendering.alphaBlend = BLDALPHA_BLEND(4, 0); + gScreen.controls.layerFXControl = 0; + super->action = MAZAAL_BOSS_OBJECT_ACTION_6; + super->actionDelay = 15; + super->spriteSettings.draw = 0; + } + } +} + +void MazaalBossObject_Action6(MazaalBossObjectEntity* this) { + if (--super->actionDelay == 0) { + super->child->subAction = 6; + gRoomTransition.field_0x38 = 0xF1; + + DeleteEntity(super); + } +} + +void MazaalBossObject_Action7(MazaalBossObjectEntity* this) { + if (super->child->actionDelay == 1) { + super->action = MAZAAL_BOSS_OBJECT_ACTION_8; + super->subAction = 0; + super->actionDelay = 180; + } +} + +void MazaalBossObject_Action8(MazaalBossObjectEntity* this) { + switch (super->subAction) { + default: + if (--super->actionDelay == 0) { + super->actionDelay = 90; + super->subAction = 1; + SoundReq(SFX_SECRET_BIG); + SetFlag(0x31); + sub_0809AD8C(this); + } + break; + case 1: + if (--super->actionDelay == 0) { + super->actionDelay = 120; + super->subAction = 2; + sub_0809AD68(this); + } + break; + case 2: + if (--super->actionDelay == 0) { + gRoomControls.camera_target = &gNewPlayerEntity.base; + gPlayerState.controlMode = CONTROL_1; + DeleteThisEntity(); + } + break; + } +} + +void sub_0809AD68(MazaalBossObjectEntity* this) { + LoadRoomEntityList(GetCurrentRoomProperty(super->type)); + if (GetInventoryValue(ITEM_OCARINA) != 0) { + LoadRoomEntityList(GetCurrentRoomProperty(super->type2)); + } +} + +void sub_0809AD8C(MazaalBossObjectEntity* this) { + Entity* archway = CreateObject(ARCHWAY, 0x22, 0); + + if (archway != NULL) { + archway->x.HALF.HI = gRoomControls.origin_x + 0xB8; + archway->y.HALF.HI = gRoomControls.origin_y + 8; + } +} diff --git a/src/object/minecart.c b/src/object/minecart.c index ddd5d8f1..608c7e51 100644 --- a/src/object/minecart.c +++ b/src/object/minecart.c @@ -1,67 +1,82 @@ +#define NENT_DEPRECATED #include "object.h" #include "functions.h" #include "hitbox.h" -extern u32 sub_08091DDC(Entity*); +typedef struct { + Entity base; + u8 filler[0x1C]; + struct_030010EC* minecartData; +} MinecartEntity; + extern u32 sub_08007DD6(u32, u32); extern void sub_08017744(Entity*); -extern void sub_08091C0C(Entity*); -extern void (*const gUnk_081223A8[])(Entity*); +u32 sub_08091DDC(MinecartEntity*); +void sub_080916EC(MinecartEntity*); +void sub_080917DC(MinecartEntity*); +void sub_080918A4(MinecartEntity*); +void sub_080919AC(MinecartEntity*); +void sub_08091C0C(MinecartEntity*); +void sub_08091C98(MinecartEntity*); +void sub_08091CC8(MinecartEntity*); +void sub_08091D90(MinecartEntity*); -extern const s8 gUnk_081223C8[]; extern const u32 gUnk_081223D8[]; void Minecart(Entity* this) { - gUnk_081223A8[this->action](this); + static void (*const actionFuncs[])(MinecartEntity*) = { + sub_080916EC, sub_080917DC, sub_080918A4, sub_080919AC, sub_08091C0C, sub_08091C98, sub_08091CC8, sub_08091D90, + }; + actionFuncs[this->action]((MinecartEntity*)this); this->bitfield = 0; } -void sub_080916EC(Entity* this) { - struct_030010EC* unk = &gRoomTransition.minecart_data[this->actionDelay]; +void sub_080916EC(MinecartEntity* this) { + struct_030010EC* unk = &gRoomTransition.minecart_data[super->actionDelay]; - *(struct_030010EC**)&this->cutsceneBeh.HWORD = unk; - if ((gRoomControls.room != unk->field_0x4) || (gPlayerState.flags & PL_IN_MINECART) != 0) { + this->minecartData = unk; + if ((gRoomControls.room != unk->room) || (gPlayerState.flags & PL_IN_MINECART) != 0) { DeleteThisEntity(); } - this->x.HALF.HI = gRoomControls.origin_x + ((unk->field_0x0 & 0x3f) << 4) + 8; - this->y.HALF.HI = gRoomControls.origin_y + ((unk->field_0x0 & 0xfc << 4) >> 2) + 8; - this->animationState = unk->field_0x5; - this->type2 = unk->field_0x6; - this->action = 1; - this->hitbox = (Hitbox*)&gUnk_080FD310; - COLLISION_ON(this); - this->hitType = 1; - this->field_0x3c = 0x47; - this->hurtType = 0x44; - this->flags2 = 0x80; - this->direction = DirectionFromAnimationState(this->animationState); - this->speed = 0x700; - this->spritePriority.b1 = 3; - InitAnimationForceUpdate(this, this->type2 + 4 + this->animationState); - SetTile(0x4022, COORD_TO_TILE(this), this->collisionLayer); + super->x.HALF.HI = gRoomControls.origin_x + ((unk->tilePos & 0x3f) << 4) + 8; + super->y.HALF.HI = gRoomControls.origin_y + ((unk->tilePos & 0xfc << 4) >> 2) + 8; + super->animationState = unk->animationState; + super->type2 = unk->field_0x6; + super->action = 1; + super->hitbox = (Hitbox*)&gUnk_080FD310; + COLLISION_ON(super); + super->hitType = 1; + super->field_0x3c = 0x47; + super->hurtType = 0x44; + super->flags2 = 0x80; + super->direction = DirectionFromAnimationState(super->animationState); + super->speed = 0x700; + super->spritePriority.b1 = 3; + InitAnimationForceUpdate(super, super->type2 + 4 + super->animationState); + SetTile(0x4022, COORD_TO_TILE(super), super->collisionLayer); } -void sub_080917DC(Entity* this) { - if ((this->bitfield & 0x7f) == 0x1d) { - this->zVelocity = Q_16_16(2.625); - this->action = 7; - InitAnimationForceUpdate(this, this->type2 + 4 + this->animationState); +void sub_080917DC(MinecartEntity* this) { + if ((super->bitfield & 0x7f) == 0x1d) { + super->zVelocity = Q_16_16(2.625); + super->action = 7; + InitAnimationForceUpdate(super, super->type2 + 4 + super->animationState); SoundReq(SFX_13B); } else { - if (sub_0800445C(this) != 0) { + if (sub_0800445C(super) != 0) { if (!((gPlayerState.flags & (PL_MINISH | PL_ROLLING)) || gPlayerState.field_0x1c || gPlayerState.heldObject || gPlayerState.jump_status)) { - this->actionDelay++; + super->actionDelay++; } else { - this->actionDelay = 0; + super->actionDelay = 0; } } else { - this->actionDelay = 0; + super->actionDelay = 0; } - if (this->type2 == 0) { - if (this->actionDelay > 8) { - this->action++; + if (super->type2 == 0) { + if (super->actionDelay > 8) { + super->action++; gPlayerState.jump_status = 0x81; gPlayerState.flags |= PL_ENTER_MINECART; gPlayerEntity.zVelocity = Q_16_16(2.0); @@ -72,100 +87,102 @@ void sub_080917DC(Entity* this) { SoundReq(SFX_PLY_JUMP); } } else { - this->actionDelay = 0; + super->actionDelay = 0; } } } -void sub_080918A4(Entity* this) { - if (EntityInRectRadius(this, &gPlayerEntity, 2, 2) != 0) { - gPlayerEntity.x.HALF.HI = this->x.HALF.HI; - gPlayerEntity.y.HALF.HI = this->y.HALF.HI; +void sub_080918A4(MinecartEntity* this) { + if (EntityInRectRadius(super, &gPlayerEntity, 2, 2) != 0) { + gPlayerEntity.x.HALF.HI = super->x.HALF.HI; + gPlayerEntity.y.HALF.HI = super->y.HALF.HI; if (gPlayerEntity.z.HALF.HI > -0x10) { if (gPlayerEntity.zVelocity >= 0) { return; } - gPlayerEntity.animationState = this->animationState << 1; + gPlayerEntity.animationState = super->animationState << 1; gPlayerState.flags = (gPlayerState.flags ^ PL_ENTER_MINECART) | PL_IN_MINECART; - this->action++; - this->field_0xf = 1; - this->flags |= ENT_PERSIST; - this->hitType = 0x97; - this->field_0x3c = (gPlayerEntity.field_0x3c + 1) | 0x20; - this->flags2 = gPlayerEntity.flags2; - this->hurtType = 0x18; - this->damage = 8; - sub_0801766C(this); - RestorePrevTileEntity(COORD_TO_TILE(this), this->collisionLayer); + super->action++; + super->field_0xf = 1; + super->flags |= ENT_PERSIST; + super->hitType = 0x97; + super->field_0x3c = (gPlayerEntity.field_0x3c + 1) | 0x20; + super->flags2 = gPlayerEntity.flags2; + super->hurtType = 0x18; + super->damage = 8; + sub_0801766C(super); + RestorePrevTileEntity(COORD_TO_TILE(super), super->collisionLayer); SoundReq(SFX_137); } } else { - gPlayerEntity.direction = GetFacingDirection(&gPlayerEntity, this); + gPlayerEntity.direction = GetFacingDirection(&gPlayerEntity, super); } if (gPlayerEntity.zVelocity < 0) { - gPlayerEntity.spritePriority.b0 = this->spritePriority.b0 - 1; + gPlayerEntity.spritePriority.b0 = super->spritePriority.b0 - 1; } } -void sub_080919AC(Entity* this) { +void sub_080919AC(MinecartEntity* this) { + static const s8 gUnk_081223C8[] = { 0, -7, 7, 0, 0, 7, -7, 0 }; + u32 iVar2; u32 uVar3; gRoomControls.unk5 = 7; if ((gPlayerState.flags & PL_IN_MINECART) == 0) { - this->action = 1; + super->action = 1; return; } if ((gPlayerEntity.frame & 0xf) == 0) { - COLLISION_OFF(this); - CopyPosition(this, &gPlayerEntity); + COLLISION_OFF(super); + CopyPosition(super, &gPlayerEntity); if ((gPlayerEntity.frame & 0xf0) == 0x10) { - this->spriteOffsetY = 1; + super->spriteOffsetY = 1; } else { - this->spriteOffsetY = 0; + super->spriteOffsetY = 0; } } else { - COLLISION_ON(this); + COLLISION_ON(super); gPlayerEntity.speed = 0; - LinearMoveUpdate(this); - CopyPosition(this, &gPlayerEntity); - gPlayerEntity.spritePriority.b0 = this->spritePriority.b0 - 1; + LinearMoveUpdate(super); + CopyPosition(super, &gPlayerEntity); + gPlayerEntity.spritePriority.b0 = super->spritePriority.b0 - 1; if (!sub_08091DDC(this)) { if ((gRoomTransition.frameCount & 0xf) == 0) { SoundReq(SFX_138); } - if (--this->field_0xf == 0xff) { + if (--super->field_0xf == 0xff) { SoundReq(SFX_PLY_VO7); - this->field_0xf = 0x3c; + super->field_0xf = 0x3c; } - uVar3 = GetRelativeCollisionTile(this, gUnk_081223C8[this->animationState * 2], - gUnk_081223C8[this->animationState * 2 + 1]); - iVar2 = sub_08007DD6(uVar3, gUnk_081223D8[this->animationState]); + uVar3 = GetRelativeCollisionTile(super, gUnk_081223C8[super->animationState * 2], + gUnk_081223C8[super->animationState * 2 + 1]); + iVar2 = sub_08007DD6(uVar3, gUnk_081223D8[super->animationState]); if (iVar2 == 0) { - this->direction = DirectionTurnAround(this->direction); - this->animationState = AnimationStateFlip90(this->animationState); + super->direction = DirectionTurnAround(super->direction); + super->animationState = AnimationStateFlip90(super->animationState); } else { switch (uVar3) { case 0x64: - this->flags &= ~ENT_PERSIST; - this->hitType = 1; - this->field_0x3c = 0x47; - this->hurtType = 0x44; - this->flags2 = 0x80; - this->action = 6; - sub_08017744(this); + super->flags &= ~ENT_PERSIST; + super->hitType = 1; + super->field_0x3c = 0x47; + super->hurtType = 0x44; + super->flags2 = 0x80; + super->action = 6; + sub_08017744(super); gPlayerState.jump_status = 0x41; gPlayerState.flags = (gPlayerState.flags ^ PL_IN_MINECART) | PL_ENTER_MINECART; gPlayerEntity.zVelocity = Q_16_16(2.0); gPlayerEntity.speed = 0x200; - gPlayerEntity.animationState = this->animationState << 1; - gPlayerEntity.direction = this->direction; + gPlayerEntity.animationState = super->animationState << 1; + gPlayerEntity.direction = super->direction; gPlayerEntity.flags |= PL_MINISH; - sub_08004168(this); - InitAnimationForceUpdate(this, this->animationState + 0xc); + sub_08004168(super); + InitAnimationForceUpdate(super, super->animationState + 0xc); SoundReq(SFX_PLY_VO4); SoundReq(SFX_139); return; @@ -177,21 +194,135 @@ void sub_080919AC(Entity* this) { case 0x6d: case 0x6e: case 0x6f: - if (uVar3 == GetTileUnderEntity(this)) { + if (uVar3 == GetTileUnderEntity(super)) { sub_08091C0C(this); - gPlayerEntity.animationState = this->animationState << 1; + gPlayerEntity.animationState = super->animationState << 1; return; } break; } } - gPlayerEntity.animationState = this->animationState << 1; - if (this->animIndex == this->animationState) { - UpdateAnimationSingleFrame(this); + gPlayerEntity.animationState = super->animationState << 1; + if (super->animIndex == super->animationState) { + UpdateAnimationSingleFrame(super); } else { - InitAnimationForceUpdate(this, this->animationState); + InitAnimationForceUpdate(super, super->animationState); } } } } + +void sub_08091C0C(MinecartEntity* this) { + sub_08004168(super); + CopyPosition(super, &gPlayerEntity); + switch (GetTileUnderEntity(super)) { + case 0x67: + if (super->direction == DirectionWest) { + super->direction = DirectionNorth; + super->animationState = 0; + } else { + super->direction = DirectionEast; + super->animationState = 1; + } + break; + case 0x68: + if (super->direction == DirectionEast) { + super->direction = DirectionSouth; + super->animationState = 2; + } else { + super->direction = DirectionWest; + super->animationState = 3; + } + break; + case 0x69: + if (super->direction == DirectionEast) { + super->direction = DirectionNorth; + super->animationState = 0; + } else { + super->direction = DirectionWest; + super->animationState = 3; + } + break; + case 0x6a: + if (super->direction == DirectionWest) { + super->direction = DirectionSouth; + super->animationState = 2; + } else { + super->direction = DirectionEast; + super->animationState = 1; + } + break; + default: + super->action = 3; + return; + } + + super->action = 3; + gPlayerEntity.animationState = super->animationState << 1; +} + +void sub_08091C98(MinecartEntity* this) { + LinearMoveUpdate(super); + CopyPosition(super, &gPlayerEntity); + if (gRoomControls.reload_flags == 0) { + super->action = 3; + super->speed = 0x700; + gRoomControls.camera_target = &gPlayerEntity; + } +} + +void sub_08091CC8(MinecartEntity* this) { + struct_030010EC* minecartData; + + if (gPlayerState.jump_status == 0) { + super->action = 1; + super->direction = DirectionTurnAround(super->direction); + super->animationState ^= 2; + gPlayerState.flags ^= PL_ENTER_MINECART; + minecartData = this->minecartData; + minecartData->tilePos = COORD_TO_TILE(super); + minecartData->room = gRoomControls.room; + minecartData->animationState = super->animationState; + InitAnimationForceUpdate(super, super->animationState + 0x10); + SetTile(0x4022, COORD_TO_TILE(super), super->collisionLayer); + } else { + UpdateAnimationSingleFrame(super); + gPlayerEntity.spritePriority.b0 = super->spritePriority.b0 - 1; + } +} + +void sub_08091D90(MinecartEntity* this) { + if (super->zVelocity < 0) { + UpdateAnimationSingleFrame(super); + } + if (((super->frame & 0x7f) == 0) && GravityUpdate(super, 0x2000) == 0) { + super->type2 ^= 4; + super->action = 1; + this->minecartData->field_0x6 = super->type2; + SoundReq(SFX_13C); + } +} + +bool32 sub_08091DDC(MinecartEntity* this) { + static const s8 gUnk_081223D0[] = { 0, -8, 8, 0, 0, 8, -8, 0 }; + if ((sub_080B1AF0(super, gUnk_081223D0[super->animationState * 2], gUnk_081223D0[super->animationState * 2 + 1]) == + 0xff) && + (sub_0807BD14(&gPlayerEntity, super->animationState))) { + super->updatePriority = 6; + super->action = 5; + switch (super->direction) { + case 0: + case 8: + case 0x10: + case 0x18: + super->speed = 0xa0; + break; + } + gPlayerEntity.direction = super->direction; + gRoomControls.camera_target = super; + return 1; + } else { + return 0; + } +} diff --git a/src/object/object49.c b/src/object/object49.c index 1b74b298..4eca5e6e 100644 --- a/src/object/object49.c +++ b/src/object/object49.c @@ -195,7 +195,7 @@ void sub_0808F3DC(Entity* this) { if (this->type == 5 && (this->frame & 1)) { Entity* entity = CreateObjectWithParent(this->child, 0x49, 8, 0); - if (entity) { + if (entity != NULL) { entity->parent = this->parent; entity->child = this->parent->parent; } @@ -262,19 +262,19 @@ void sub_0808F554(Entity* this) { void sub_0808F5EC(Entity* this) { Entity* entity = CreateObjectWithParent(this->child, 0x49, 5, 0); - if (entity) { + if (entity != NULL) { entity->parent = this; entity->child = this->child; } entity = CreateObjectWithParent(this->child, 0x49, 6, 0); - if (entity) { + if (entity != NULL) { entity->parent = this; entity->child = this->child; } entity = CreateObjectWithParent(this->child, 0x49, 7, 0); - if (entity) { + if (entity != NULL) { entity->parent = this; entity->child = this->child; } diff --git a/src/object/object96.c b/src/object/object96.c new file mode 100644 index 00000000..2ffac509 --- /dev/null +++ b/src/object/object96.c @@ -0,0 +1,181 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "player.h" +#include "asm.h" +#include "functions.h" +#include "sound.h" +#include "item.h" +#include "flags.h" +#include "effects.h" + +typedef struct _struct_gUnk_08123FB0 { + void (*const funcEnt)(Entity*); + bool32 (*const func)(Entity*, const struct _struct_gUnk_08123FB0*); + s8 unk08; + s8 unk09; + u8 unk0a; + u8 unk0b; + u8 unk0c; + u8 type; + u8 unk0e; + u8 unk0f; + s32 zVelocity; + u32 unk14; + s16 speed; + s16 y; + u16 flag; + u8 actionDelay; + u8 unk1f; +} struct_gUnk_08123FB0; + +static_assert(sizeof(struct_gUnk_08123FB0) == 0x20); + +void sub_0809D91C(Entity*); +bool32 sub_0809D93C(Entity*, const struct_gUnk_08123FB0*); +void Object96_Init(Entity*, const struct_gUnk_08123FB0*); +void Object96_Action1(Entity*, const struct_gUnk_08123FB0*); +void Object96_Action2(Entity*, const struct_gUnk_08123FB0*); +void Object96_Action3(Entity*, const struct_gUnk_08123FB0*); + +static const struct_gUnk_08123FB0 gUnk_08123FB0[] = { + { sub_0809D91C, sub_0809D93C, 0, 0, 0x30, 0x30, 0x1, 0x3c, 0x3c, 0x13, 0x10000, 0x1800, 0x60, 0x40, 0x4021, 0x1, + 0x0 }, + { sub_0809D91C, NULL, 0, 0, 0, 0, 0, 0x63, 0x63, 0x10, 0, 0x1800, 0, 0x18, +#if defined(JP) || defined(DEMO_JP) || defined(EU) + 0xCD, +#else + 0xd0, +#endif + 0, 0 }, + { sub_0809D91C, NULL, 0, 0, 0, 0, 0, 0x3c, 0x3c, 0xf, 0x10000, 0x1800, 0x60, 0x40, 0x4021, 0x1, 0x0 }, + { sub_0809D91C, NULL, 0, 0, 0, 0, 0, 0x3c, 0x3c, 0x2, 0x10000, 0x1800, 0x140, 0x40, 0x4021, 0x1, 0x0 }, + { sub_0809D91C, NULL, 0, 0, 0, 0, 0x0, 0x3c, 0x3c, 0xd, 0x10000, 0x1800, 0x60, 0x40, 0x4021, 0x1, 0x0 }, + { sub_0809D91C, NULL, 0, 0, 0, 0, 0x0, 0x3c, 0x3c, 0x1a, 0x10000, 0x1800, 0x100, 0x40, 0x4021, 0x1, 0x0 }, + { sub_0809D91C, NULL, 0, 0, 0, 0, 0x0, 0x3c, 0x3c, 0x13, 0x10000, 0x1800, 0x60, 0x40, 0x4021, 0x1, 0x0 }, + { NULL, NULL, 0, 0, 0, 0, 0x0, 0x5c, 0x5c, 0x81, 0, 0x1800, 0x100, 0x20, 0x0, 0x1, 0x0 }, +}; + +void Object96(Entity* this) { + static void (*const actionFuncs[])(Entity*, const struct_gUnk_08123FB0*) = { + Object96_Init, + Object96_Action1, + Object96_Action2, + Object96_Action3, + }; + actionFuncs[this->action](this, &gUnk_08123FB0[this->type]); +} + +void Object96_Init(Entity* this, const struct_gUnk_08123FB0* param_2) { + u32 type; + u32 dir; + + this->action++; + this->collisionLayer = 2; + this->spriteRendering.b3 = 1; + this->zVelocity = param_2->zVelocity; + this->direction = param_2->unk0f; + this->speed = param_2->speed; + this->y.HALF.HI -= param_2->y; + this->z.WORD = 0; + this->actionDelay = param_2->actionDelay; + if ((this->direction & 0x80)) { + dir = this->direction; + if (dir == 0x81) { + this->direction = (((gPlayerEntity.animationState * 4 + (Random() & 3)) - 2) & 0x1f) ^ 0x10; + } + } + UpdateSpriteForCollisionLayer(this); + type = this->type; + sub_08080CB4(this); + this->type = type; +} + +void Object96_Action1(Entity* this, const struct_gUnk_08123FB0* param_2) { + u32 type; + s32 iVar3; + + iVar3 = 1; + if (param_2->func != NULL) { + iVar3 = param_2->func(this, param_2); + } + if (iVar3 != 0) { + this->action++; + this->y.HALF.HI += param_2->y; + this->z.HALF.HI -= param_2->y; + } + type = this->type; + this->type = param_2->type; + sub_08080CB4(this); + this->type = type; +} + +void Object96_Action2(Entity* this, const struct_gUnk_08123FB0* param_2) { + u8 type; + + LinearMoveUpdate(this); + if (sub_080044EC(this, param_2->unk14) < 2) { + if (this->actionDelay) { + this->actionDelay--; + this->zVelocity = param_2->unk14 << 3; + } else { + this->action++; + this->collisionLayer = gPlayerEntity.collisionLayer; + UpdateSpriteForCollisionLayer(this); + if (param_2->funcEnt != NULL) { + param_2->funcEnt(this); + } + } + SoundReq(SFX_RUPEE_BOUNCE); + } + type = this->type; + this->type = param_2->type; + sub_08080CB4(this); + this->type = type; +} + +void Object96_Action3(Entity* this, const struct_gUnk_08123FB0* param_2) { + u8 type; + + if (gPlayerState.flags & 0x80) { + sub_0800445C(this); + } else { + if (IsCollidingPlayer(this)) { + CreateItemEntity(param_2->type, this->type2, 0); + if (param_2->flag) { + SetFlag(param_2->flag); + } + DeleteThisEntity(); + } + } + type = this->type; + this->type = param_2->type; + sub_08080CB4(this); + this->type = type; +} + +void sub_0809D91C(Entity* this) { + Entity* fxEnt; + + fxEnt = CreateFx(this, FX_DASH, 0); + if (fxEnt != NULL) { + SortEntityBelow(this, fxEnt); + } + SoundReq(SFX_SECRET); +} + +bool32 sub_0809D93C(Entity* this, const struct_gUnk_08123FB0* param_2) { + u32 uVar1; + + if (gPlayerEntity.action == 6 && ((param_2->unk0c >> gPlayerEntity.animationState & 1) != 0)) { + uVar1 = (gPlayerEntity.x.HALF.HI - this->x.HALF.HI) + param_2->unk08 + param_2->unk0a; + if (param_2->unk0a * 2 <= (u16)uVar1) { + return 0; + } + + uVar1 = (gPlayerEntity.y.HALF.HI - (this->y.HALF.HI + param_2->y)) + param_2->unk09 + param_2->unk0b; + if (param_2->unk0b * 2 > (u16)uVar1) { + return 1; + } + } + return 0; +} diff --git a/src/object/object98.c b/src/object/object98.c new file mode 100644 index 00000000..798836dc --- /dev/null +++ b/src/object/object98.c @@ -0,0 +1,68 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "projectile.h" +#include "room.h" +#include "functions.h" + +typedef struct { + Entity base; + u8 filler[0xC]; + u16 unk74; + u16 unk76; + u8 filler2[0x6]; + u8 unk7e; +} Object98Entity; + +void sub_0809E360(Object98Entity*); +void sub_0809E3E4(Object98Entity*); + +void Object98(Entity* this) { + static void (*const actionFuncs[])(Object98Entity*) = { + sub_0809E360, + sub_0809E3E4, + }; + + actionFuncs[this->action]((Object98Entity*)this); +} + +void sub_0809E360(Object98Entity* this) { + u32 bVar1; + Entity* projEnt; + u32 index; + + if (8 < super->actionDelay) { + super->actionDelay = 8; + } + + if (0x48 - super->actionDelay > gEntCount) { + for (index = 0; index < super->actionDelay; index++) { + projEnt = CreateProjectile(GURUGURU_BAR_PROJECTILE); + projEnt->actionDelay = 14 + 12 * index; + projEnt->parent = super; + } + + super->action = 1; + bVar1 = this->unk7e; + this->unk76 = bVar1 << 8; + super->animationState = bVar1 << 6; + SetDefaultPriority(super, 0); + if (super->type != 0) { + super->child = (Entity*)GetCurrentRoomProperty(super->type); + sub_080A2CC0(super, (u16**)&super->child, &this->unk74); + } + } +} + +void sub_0809E3E4(Object98Entity* this) { + this->unk76 += super->type2; + super->animationState = this->unk76 >> 2; + if (super->type != 0) { + if ((super->direction & 0x80) == 0) { + LinearMoveUpdate(super); + } + + if (--this->unk74 == 0) { + sub_080A2CC0(super, (u16**)&super->child, &this->unk74); + } + } +} diff --git a/src/object/object99.c b/src/object/object99.c new file mode 100644 index 00000000..e8bf6a33 --- /dev/null +++ b/src/object/object99.c @@ -0,0 +1,39 @@ +#include "entity.h" +#include "coord.h" + +void Object99(Entity* this) { + Entity* parent; + + parent = this->parent; + if (parent->next == NULL) { + DeleteThisEntity(); + } + + if (this->action == 0) { + this->action = 1; + this->field_0x76.HALF.LO = parent->animationState; + this->field_0x74.HALF.LO = this->spriteOffsetX; + this->field_0x74.HALF.HI = this->spriteOffsetY; + InitializeAnimation(this, this->animationState); + } + + if (parent->animationState != this->field_0x76.HALF.LO) { + DeleteThisEntity(); + } + this->spriteSettings.draw = parent->spriteSettings.draw; + CopyPositionAndSpriteOffset(parent, this); + this->spriteOffsetX += this->field_0x74.HALF.LO; + this->spriteOffsetY += this->field_0x74.HALF.HI; + if (this->animationState != 2) { + this->y.HALF.HI++; + this->spriteOffsetY--; + } else { + this->y.HALF.HI--; + this->spriteOffsetY++; + } + + GetNextFrame(this); + if (this->frame & 0x80) { + DeleteThisEntity(); + } +} diff --git a/src/object/objectA6.c b/src/object/objectA6.c new file mode 100644 index 00000000..fc77a54e --- /dev/null +++ b/src/object/objectA6.c @@ -0,0 +1,51 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "flags.h" +#include "hitbox.h" +#include "effects.h" + +typedef struct { + Entity base; + u8 filler[0x1E]; + u16 objFlags; +} ObjectA6Entity; + +void sub_0809F920(ObjectA6Entity*); +void sub_0809F964(ObjectA6Entity*); + +void ObjectA6(Entity* this) { + static void (*const actionFuncs[])(ObjectA6Entity*) = { + sub_0809F920, + sub_0809F964, + }; + + actionFuncs[this->action]((ObjectA6Entity*)this); +} + +void sub_0809F920(ObjectA6Entity* this) { + if (CheckFlags(this->objFlags)) { + DeleteThisEntity(); + } + + super->action = 1; + COLLISION_ON(super); + super->field_0x3c = 7; + super->hurtType = 0x48; + super->hitType = 1; + super->flags2 = 2; + super->hitbox = (Hitbox*)&gHitbox_0; +} + +void sub_0809F964(ObjectA6Entity* this) { + Entity* fxEnt; + + if (super->bitfield == 0xa1) { + fxEnt = CreateFx(super, FX_MAGIC_STORM, 0); + if (fxEnt != NULL) { + fxEnt->spritePriority.b0 = 3; + fxEnt->spriteOffsetY = -5; + } + SetFlag(this->objFlags); + DeleteThisEntity(); + } +} diff --git a/src/object/objectA9.c b/src/object/objectA9.c new file mode 100644 index 00000000..6d9981ba --- /dev/null +++ b/src/object/objectA9.c @@ -0,0 +1,37 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "sound.h" + +void sub_0809FEF8(Entity*); +void sub_0809FF28(Entity*); + +void ObjectA9(Entity* this) { + static void (*const actionFuncs[])(Entity*) = { + sub_0809FEF8, + sub_0809FF28, + DeleteEntity, + }; + + actionFuncs[this->action]((Entity*)this); +} + +void sub_0809FEF8(Entity* this) { + static const u8 typeAnimationStates[] = { 0x2, 0x0, 0x43, 0x0 }; + static const u16 typeSounds[] = { SFX_124, SFX_197, SFX_11D, SFX_NONE }; + this->action = 1; + InitializeAnimation(this, typeAnimationStates[this->type]); + SoundReq(typeSounds[this->type]); +} + +void sub_0809FF28(Entity* this) { + Entity* pEVar1; + + GetNextFrame(this); + if (this->frame & 0x80) { + this->action = 2; + pEVar1 = this->parent; + pEVar1->flags = this->actionDelay; + pEVar1->spriteSettings.draw = this->field_0xf; + ((GenericEntity*)pEVar1)->field_0x6c.HALF.HI &= 0xef; + } +} diff --git a/src/object/objectAB.c b/src/object/objectAB.c new file mode 100644 index 00000000..767c5238 --- /dev/null +++ b/src/object/objectAB.c @@ -0,0 +1,59 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "flags.h" +#include "asm.h" +#include "player.h" +#include "coord.h" + +extern void sub_0805B390(u32); + +void ObjectAB_Init(Entity*); +void ObjectAB_Action1(Entity*); +void ObjectAB_Action2(Entity*); +void sub_080A0190(Entity*); + +void ObjectAB(Entity* this) { + static void (*const actionFuncs[])(Entity*) = { + ObjectAB_Init, + ObjectAB_Action1, + ObjectAB_Action2, + }; + + actionFuncs[this->action]((Entity*)this); +} + +void ObjectAB_Init(Entity* this) { + this->action++; + this->collisionLayer = 1; + this->spriteRendering.b3 = 3; + this->spritePriority.b0 = 7; + this->subAction = 0; + InitializeAnimation(this, 0); +} + +void ObjectAB_Action1(Entity* this) { + if (CheckRoomFlag(0)) { + GetNextFrame(this); + if (this->frame & 0x80) { + this->action++; + } + } +} + +void ObjectAB_Action2(Entity* this) { + if (CheckRoomFlag(1)) { + sub_080A0190(this); + RequestPriorityDuration(this, 0x1e); + if (EntityInRectRadius(this, &gPlayerEntity, 0x10, 0x10)) { + sub_0805B390(0x37); + } + } +} + +void sub_080A0190(Entity* this) { + this->subAction = 1; + CopyPosition(this, &gPlayerEntity); + gPlayerState.queued_action = 3; + gPlayerState.field_0x38 = 0; + gPlayerState.flags |= PL_PIT_IS_EXIT; +} diff --git a/src/object/objectAD.c b/src/object/objectAD.c new file mode 100644 index 00000000..ca73277e --- /dev/null +++ b/src/object/objectAD.c @@ -0,0 +1,54 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "functions.h" +#include "screen.h" + +void sub_080A04A4(Entity*); +void sub_080A04E0(Entity*); +void sub_080A04E8(); + +void ObjectAD(Entity* this) { + static void (*const actionFuncs[])(Entity*) = { + sub_080A04A4, + sub_080A04E0, + }; + + actionFuncs[this->action]((Entity*)this); +} + +void sub_080A04A4(Entity* this) { + this->action = 1; + this->frameIndex = 4; + this->actionDelay = 0; + this->spriteRendering.b3 = 3; + this->spritePriority.b0 = 7; + this->z.WORD = 0; + this->spriteRendering.alphaBlend = 1; + sub_080A04E8(); +} + +void sub_080A04E0(Entity* this) { + sub_080A04E8(); +} + +void sub_080A04E8(Entity* this) { + int iVar2; + u32 uVar3; + + iVar2 = (this->parent->z.HALF.HI < 0 ? -this->parent->z.HALF.HI : this->parent->z.HALF.HI) + 0x100; + SetAffineInfo(this, iVar2, iVar2, 0); + iVar2 = ((0x1c0 - iVar2) * 10) / iVar2; + if (this->parent->type == 0x41) { + uVar3 = iVar2 * 2; + if (0xc < uVar3) { + uVar3 = 0xc; + } + iVar2 = (0x10 - iVar2) * 0x100; + iVar2 |= uVar3; + iVar2 &= 0xffff; + } else { + iVar2 |= (0x10 - iVar2) * 0x100; + iVar2 &= 0xffff; + } + gScreen.controls.alphaBlend = iVar2; +} diff --git a/src/object/objectB.c b/src/object/objectB.c index f0cfc4e5..fbf4ef50 100644 --- a/src/object/objectB.c +++ b/src/object/objectB.c @@ -124,7 +124,7 @@ void ObjectB_Action2(ObjectBEntity* this) { break; } MessageFromTarget(messageIndex); - gMessage.field_0x10 = super->type2; + gMessage.rupees = super->type2; } } } diff --git a/src/object/objectB4.c b/src/object/objectB4.c new file mode 100644 index 00000000..90c3b287 --- /dev/null +++ b/src/object/objectB4.c @@ -0,0 +1,135 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "menu.h" +#include "coord.h" +#include "object.h" + +extern void sub_0806FB00(Entity*, u32, u32, u32); +extern bool32 sub_0806FB38(Entity*); + +void ObjectB4_Type0(Entity*); +void ObjectB4_Type1(Entity*); +void ObjectB4_Type2(Entity*); +void ObjectB4_Type3(Entity*); + +const u16 gUnk_08124B10[] = { 0x40, 0x58, 0x68, 0x80, 0x94, 0xA8, 0xB0, 0x0 }; + +void ObjectB4(Entity* this) { + static void (*const typeFuncs[])(Entity*) = { + ObjectB4_Type0, + ObjectB4_Type1, + ObjectB4_Type2, + ObjectB4_Type3, + }; + + typeFuncs[this->type]((Entity*)this); +} + +void ObjectB4_Type0(Entity* this) { + Entity* pEVar3; + + switch (this->action) { + case 0: + this->action = 1; + this->spriteSettings.draw = 2; + this->frameIndex = 9; + this->actionDelay = 8; + this->field_0xf = 0; + this->spriteRendering.b3 = 1; + this->spritePriority.b0 = 4; + this->spriteOrientation.flipY = 1; + sub_0806FB00(this, 0xbf, 0x48, 0x1e); + break; + case 1: + if ((this->field_0xf < 7) && (--this->actionDelay == 0)) { + this->actionDelay = 1; + pEVar3 = CreateObject(OBJECT_B4, 1, this->field_0xf); + if (pEVar3 != NULL) { + CopyPosition(this, pEVar3); + pEVar3->y.HALF.HI = 0x68; + SortEntityBelow(this, pEVar3); + } + this->field_0xf++; + } + + if (sub_0806FB38(this) || (1 < gMenu.menuType)) { + this->x.HALF.HI = 0xbf; + this->y.HALF.HI = 0x48; + this->frameIndex = 10; + this->action = 2; + while (this->field_0xf < 7) { + pEVar3 = CreateObject(OBJECT_B4, 1, this->field_0xf); + if (pEVar3 != NULL) { + CopyPosition(this, pEVar3); + pEVar3->y.HALF.HI = 0x68; + SortEntityBelow(this, pEVar3); + } + this->field_0xf++; + } + + pEVar3 = CreateObject(OBJECT_B4, 2, 0); + if (pEVar3 != NULL) { + pEVar3->x.HALF.HI = 0xc4; + pEVar3->y.HALF.HI = 0x2c; + SortEntityAbove(this, pEVar3); + } + + pEVar3 = CreateObject(OBJECT_B4, 3, 0); + if (pEVar3 != NULL) { + pEVar3->x.HALF.HI = 0xb4; + pEVar3->y.HALF.HI = 0x19; + SortEntityAbove(this, pEVar3); + } + } + } +} + +void ObjectB4_Type1(Entity* this) { + switch (this->action) { + case 0: + this->action = 1; + this->spriteSettings.draw = 2; + this->frameIndex = this->type2 + 2; + sub_0806FB00(this, gUnk_08124B10[this->type2], 0x68, 0x14); + break; + case 1: + if (sub_0806FB38(this) || 1 < gMenu.menuType) { + this->x.HALF.HI = gUnk_08124B10[this->type2]; + this->y.HALF.HI = 0x68; + this->spritePriority.b0 = 7 - this->type2; + this->action = 2; + } + break; + } +} + +void ObjectB4_Type2(Entity* this) { + static const u8 gUnk_08124B30[] = { 9, 10, 11, 12, 11, 10, 9, -1 }; + if (this->action == 0) { + this->action = 1; + this->spriteSettings.draw = 2; + this->spriteRendering.b3 = 1; + this->spritePriority.b0 = 0; + this->spriteOrientation.flipY = 1; + this->frameIndex = 11; + this->actionDelay = (Random() & 0x3f) + 0x40; + this->field_0xf = 0; + } + + if (--this->actionDelay == 0) { + this->actionDelay = 4; + this->frameIndex = gUnk_08124B30[this->field_0xf++] + 2; + if (gUnk_08124B30[this->field_0xf] == 0xff) { + this->actionDelay = (Random() & 0x3f) + 0x40; + this->field_0xf = 0; + } + } +} + +void ObjectB4_Type3(Entity* this) { + if (this->action == 0) { + this->action = 1; + this->spriteSettings.draw = 2; + this->frameIndex = 15; + } +} diff --git a/src/object/objectBlockingStairs.c b/src/object/objectBlockingStairs.c new file mode 100644 index 00000000..f9aa6a1b --- /dev/null +++ b/src/object/objectBlockingStairs.c @@ -0,0 +1,350 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "flags.h" +#include "sound.h" +#include "functions.h" +#include "asm.h" +#include "object.h" +#include "effects.h" + +typedef struct { + Entity base; + u8 filler[0x10]; + u16 tilePos; + u8 unk7a; + u8 unk7b; + u8 filler2[0xA]; + u16 objFlags; +} ObjectBlockingStairsEntity; + +extern const Hitbox gUnk_080FD288; + +void ObjectBlockingStairs_Init(ObjectBlockingStairsEntity*); +void ObjectBlockingStairs_Action1(ObjectBlockingStairsEntity*); +void ObjectBlockingStairs_Action2(ObjectBlockingStairsEntity*); +void ObjectBlockingStairs_Action3(ObjectBlockingStairsEntity*); +void sub_080932A8(ObjectBlockingStairsEntity*); +void sub_08093248(ObjectBlockingStairsEntity*); +void sub_08093280(ObjectBlockingStairsEntity*); +void sub_08093334(ObjectBlockingStairsEntity*); +void sub_08093364(ObjectBlockingStairsEntity*); +void ObjectBlockingStairs_Action4(ObjectBlockingStairsEntity*); +u32 sub_080932D8(u32); +void sub_080931A4(ObjectBlockingStairsEntity*, u32); + +void ObjectBlockingStairs(Entity* this) { + static void (*const actionFuncs[])(ObjectBlockingStairsEntity*) = { + ObjectBlockingStairs_Init, ObjectBlockingStairs_Action1, ObjectBlockingStairs_Action2, + ObjectBlockingStairs_Action3, ObjectBlockingStairs_Action4, + }; + + actionFuncs[this->action]((ObjectBlockingStairsEntity*)this); +} + +void ObjectBlockingStairs_Init(ObjectBlockingStairsEntity* this) { + int iVar1; + u32 uVar2; + + switch (sub_080932D8(super->type)) { + case 1: + super->action = 4; + super->x.HALF.HI -= 0x20; + uVar2 = 2; + break; + case 2: + super->action = 4; + super->x.HALF.HI += 0x20; + uVar2 = 3; + break; + default: + super->action = 1; + super->speed = 0x80; + super->field_0x16 = 1; + super->actionDelay = 0; + super->field_0xf = 0; + this->unk7a = 0x20; + this->unk7b = 0x80; + if (super->type == 0) { + super->hitbox = (Hitbox*)&gUnk_080FD288; + } + uVar2 = 0; + if ((this->objFlags) && !CheckFlags(this->objFlags)) { + uVar2 = 1; + } + break; + } + + sub_080931A4(this, uVar2); +} + +void ObjectBlockingStairs_Action1(ObjectBlockingStairsEntity* this) { + u32 tileType; + int xDist; + Entity* ent; + + xDist = (int)gPlayerEntity.x.HALF.HI - super->x.HALF.HI; + + if (this->objFlags) { + if (!CheckFlags(this->objFlags)) { + return; + } + if (this->unk7a != 0) { + sub_080932A8(this); + return; + } + } + + if ((this->unk7b & 0x3f) == 0) { + this->unk7b |= 0xf; + sub_080931A4(this, 0); + if (xDist < 0) { + this->unk7b |= 0x40; + } + } + + if (this->unk7b & 0x40) { + tileType = (u32)GetTileType(this->tilePos - 1, super->collisionLayer); + } else { + tileType = (u32)GetTileType(this->tilePos + 1, super->collisionLayer); + } + + switch (tileType) { + case 0x4030: + case 0x4031: + super->action = 3; + super->direction = Direction8FromAnimationState(gPlayerEntity.animationState); + super->speed = 0x80; + super->actionDelay = 0x40; + RequestPriorityDuration(super, 0x50); + EnqueueSFX(SFX_10F); + sub_08093248(this); + return; + } + + if ((gPlayerEntity.animationState & 2) == 0) { + return; + } + RegisterCarryEntity(super); + + if (this->unk7b & 0x80) { + this->unk7b &= ~0x80; + if ((this->unk7b & 0x40) != 0) { + SetTile(0x402c, this->tilePos - 1, super->collisionLayer); + SetTile(0x403d, this->tilePos + 1, super->collisionLayer); + } else { + SetTile(0x403d, this->tilePos - 1, super->collisionLayer); + SetTile(0x402d, this->tilePos + 1, super->collisionLayer); + } + } else if (this->unk7b & 0x40) { + if (xDist >= 5) { + this->unk7b &= ~(0x40 | 0x80); + SetTile(0x403d, this->tilePos - 1, super->collisionLayer); + SetTile(0x402d, this->tilePos + 1, super->collisionLayer); + } + } else { + if (-xDist > 4) { + this->unk7b |= 0x40; + SetTile(0x402c, this->tilePos - 1, super->collisionLayer); + SetTile(0x403d, this->tilePos + 1, super->collisionLayer); + } + } +} + +void ObjectBlockingStairs_Action2(ObjectBlockingStairsEntity* this) { + if (super->actionDelay) { + sub_08093280(this); + } else { + if (gPlayerState.heldObject == 0x12) { + if ((gPlayerEntity.frame & 2) != 0 && ++super->field_0xf > 8) { + gPlayerState.queued_action = 16; + gPlayerState.field_0x38 = 0x40; + gPlayerState.flags |= PL_BUSY; + gPlayerEntity.x.HALF.LO = 0; + gPlayerEntity.y.HALF.LO = 0; + super->direction = (gPlayerEntity.animationState ^ 4) << 2; + super->actionDelay = 0x40; + EnqueueSFX(SFX_10F); + sub_08093248(this); + } + } else if (super->subAction == 6) { + super->action = 1; + super->field_0xf = 0; + } + } +} + +void ObjectBlockingStairs_Action3(ObjectBlockingStairsEntity* this) { + sub_0800445C(super); + LinearMoveUpdate(super); + if (--super->actionDelay == 0) { + sub_08093334(this); + } + sub_08093364(this); +} + +void ObjectBlockingStairs_Action4(ObjectBlockingStairsEntity* this) { +} + +void sub_080931A4(ObjectBlockingStairsEntity* this, u32 param_2) { + static const u16 gUnk_08122850[] = { 0x4027, 0x4023, 0x4028, 0x402c, 0x402b, 0x402d, 0x4029, 0x4026, 0x402a }; + static const u16 gUnk_08122862[] = { 0x4027, 0x4023, 0x4028, 0x4024, 0x4022, 0x4025, 0x4029, 0x4026, 0x402a }; + static const u16 gUnk_08122874[] = { 0x4027, 0x4023, 0x4023, 0x4024, 0x4022, 0x4022, 0x4029, 0x4026, 0x4026 }; + static const u16 gUnk_08122886[] = { 0x4023, 0x4023, 0x4028, 0x4022, 0x4022, 0x4025, 0x4026, 0x4026, 0x402a }; + + u32 collisionLayer; + const u16* pTileTypes; + u32 index; + u32 tilePos; + int iVar5; + + this->tilePos = COORD_TO_TILE(super); + tilePos = this->tilePos - 0x40; + collisionLayer = super->collisionLayer; + + switch (param_2) { + case 1: + pTileTypes = gUnk_08122862; + break; + case 2: + pTileTypes = gUnk_08122874; + break; + case 3: + pTileTypes = gUnk_08122886; + break; + default: + case 0: + pTileTypes = gUnk_08122850; + break; + } + + for (index = 0, iVar5 = 0; index < 9; index++) { + u32 pos = tilePos + iVar5 + index - 1; + SetTile(pTileTypes[index], pos, collisionLayer); + switch (index) { + case 2: + iVar5 = 0x3d; + break; + case 5: + iVar5 = 0x7a; + break; + } + } +} + +void sub_08093248(ObjectBlockingStairsEntity* this) { + u32 collisionLayer; + u32 tilePos; + u32 index; + int iVar4; + + tilePos = this->tilePos - 0x40; + collisionLayer = super->collisionLayer; + for (index = 0, iVar4 = 0; index < 9; index++) { + sub_0807BA8C(tilePos + iVar4 + index - 1, collisionLayer); + switch (index) { + case 2: + iVar4 = 0x3d; + break; + case 5: + iVar4 = 0x7a; + break; + } + } +} + +void sub_08093280(ObjectBlockingStairsEntity* this) { + sub_0800445C(super); + LinearMoveUpdate(super); + if (--super->actionDelay == 0) { + sub_08093334(this); + } + sub_08093364(this); +} + +void sub_080932A8(ObjectBlockingStairsEntity* this) { + this->unk7a--; + switch (this->unk7a & 3) { + case 1: + super->spriteOffsetX = 1; + break; + case 3: + super->spriteOffsetX = -1; + break; + default: + super->spriteOffsetX = 0; + break; + } +} + +typedef struct { + u32 flagBank; + u16 unk4; + u16 unk6; +} struct_gUnk_08122898; + +const struct_gUnk_08122898 gUnk_08122898[] = { + { 0x200, 0xa1, 0xa2 }, + { 0x8c0, 0x6f, 0x70 }, +}; + +u32 sub_080932D8(u32 param_1) { + const struct_gUnk_08122898* ptr = gUnk_08122898 + param_1; + + if (CheckLocalFlagByBank(ptr->flagBank, ptr->unk4)) { + return 1; + } else { + if (CheckLocalFlagByBank(ptr->flagBank, ptr->unk6)) { + return 2; + } else { + return 0; + } + } +} + +void sub_08093308(u32 param_1, u32 param_2) { + const struct_gUnk_08122898* ptr = gUnk_08122898 + param_1; + if (param_2 == 1) { + SetLocalFlagByBank(ptr->flagBank, ptr->unk4); + } else if (param_2 == 2) { + SetLocalFlagByBank(ptr->flagBank, ptr->unk6); + } +} + +void sub_08093334(ObjectBlockingStairsEntity* this) { + u32 uVar1; + + super->action = 4; + if (super->direction & 0x10) { + uVar1 = 1; + } else { + uVar1 = 2; + } + sub_080931A4(this, uVar1 + 1); + sub_08093308(super->type, uVar1); + EnqueueSFX(SFX_SECRET); +} + +void sub_08093364(ObjectBlockingStairsEntity* this) { + s32 sVar1; + Entity* dashEffectEnt; + + if ((super->actionDelay & 3) == 0) { + dashEffectEnt = CreateObject(SPECIAL_FX, FX_DASH, 0); + if (dashEffectEnt != NULL) { + dashEffectEnt->parent = super; + CopyPosition(super, dashEffectEnt); + if (super->direction & 0x10) { + dashEffectEnt->x.HALF.HI += 0x12; + } else { + dashEffectEnt->x.HALF.HI -= 0x12; + } + + sVar1 = dashEffectEnt->y.HALF.HI; + if (super->actionDelay & 8) { + dashEffectEnt->y.HALF.HI = sVar1 + 8; + } else { + dashEffectEnt->y.HALF.HI = sVar1 - 8; + } + } + } +} diff --git a/src/object/picoBloom.c b/src/object/picoBloom.c new file mode 100644 index 00000000..de912b8a --- /dev/null +++ b/src/object/picoBloom.c @@ -0,0 +1,47 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "asm.h" +#include "sound.h" + +void PicoBloom_Init(Entity*); +void PicoBloom_Action1(Entity*); +void PicoBloom_Action2(Entity*); + +void PicoBloom(Entity* this) { + static void (*const actionFuncs[])(Entity*) = { + PicoBloom_Init, + PicoBloom_Action1, + PicoBloom_Action2, + }; + + actionFuncs[this->action](this); +} + +void PicoBloom_Init(Entity* this) { + static const u8 typeAnimationStates[] = { 3, 0, 3, 3, 3, 3 }; + u32 nextAction; + + nextAction = this->type2; + if (nextAction != 1) { + nextAction = 2; + } + this->action = nextAction; + this->actionDelay = (Random() & 0x7f) + 0x7f; + this->collisionLayer = 1; + UpdateSpriteForCollisionLayer(this); + InitializeAnimation(this, typeAnimationStates[this->type] + this->type2); +} + +void PicoBloom_Action1(Entity* this) { + if (--this->actionDelay == 0) { + this->action++; + } +} + +void PicoBloom_Action2(Entity* this) { + GetNextFrame(this); + if (this->frame & 1) { + this->frame &= ~1; + EnqueueSFX(SFX_21B); + } +} diff --git a/src/object/playerClone.c b/src/object/playerClone.c index 4de97df9..3e7eadab 100644 --- a/src/object/playerClone.c +++ b/src/object/playerClone.c @@ -1,5 +1,6 @@ #define NENT_DEPRECATED #include "entity.h" +#include "collision.h" #include "room.h" #include "asm.h" #include "sound.h" @@ -49,7 +50,12 @@ void PlayerClone_Init(PlayerCloneEntity* this) { SoundReq(SFX_112); } -const u16 PlayerCloneCollisions[] = { 0x2206, 0x6044, 0x4460, 0x622 }; +const u16 PlayerCloneCollisions[] = { + COL_NORTH_FULL | COL_WEST_SOUTH | COL_EAST_SOUTH, + COL_NORTH_EAST | COL_SOUTH_EAST | COL_EAST_FULL, + COL_SOUTH_FULL | COL_WEST_NORTH | COL_EAST_NORTH, + COL_NORTH_WEST | COL_SOUTH_WEST | COL_WEST_FULL, +}; void PlayerClone_Action1(PlayerCloneEntity* this) { static const Hitbox PlayerCloneHitbox = { 0, -3, { 5, 3, 3, 5 }, 6, 6 }; @@ -104,7 +110,8 @@ void PlayerClone_Action2(PlayerCloneEntity* this) { super->y.HALF.HI = gPlayerEntity.y.HALF.HI + this->unk7a; sub_08084CAC(this); sub_080085B0(super); - if ((super->collisions & 0x6666) != 0x6666) { + if ((super->collisions & (COL_NORTH_FULL | COL_SOUTH_FULL | COL_EAST_FULL | COL_WEST_FULL)) != + (COL_NORTH_FULL | COL_SOUTH_FULL | COL_EAST_FULL | COL_WEST_FULL)) { for (index = 0; index <= 3; index++) { if (PlayerCloneCollisions[index] == (PlayerCloneCollisions[index] & super->collisions)) { break; diff --git a/src/object/pot.c b/src/object/pot.c index 22ee8ce0..a11c6d4d 100644 --- a/src/object/pot.c +++ b/src/object/pot.c @@ -283,7 +283,7 @@ u32 sub_0808288C(Entity* this, u32 form, u32 arg2, u32 arg3) { break; default: entity = CreateObjectWithParent(this, GROUND_ITEM, form, arg2); - if (entity) { + if (entity != NULL) { if (arg3 == 2) { entity->actionDelay = 5; entity->field_0x86.HWORD = this->field_0x86.HWORD; diff --git a/src/object/smallIceBlock.c b/src/object/smallIceBlock.c index 1b821625..e9689baf 100644 --- a/src/object/smallIceBlock.c +++ b/src/object/smallIceBlock.c @@ -7,6 +7,7 @@ #define NENT_DEPRECATED #include "global.h" +#include "collision.h" #include "object.h" #include "functions.h" #include "hitbox.h" @@ -204,7 +205,7 @@ bool32 sub_0809953C(SmallIceBlockEntity* this) { uVar3 = sub_0800442E(super); if (uVar3 != 0) { - return 0; + return FALSE; } ProcessMovement2(super); sub_0800445C(super); @@ -216,17 +217,17 @@ bool32 sub_0809953C(SmallIceBlockEntity* this) { } switch (super->direction >> 3) { case 0: - if ((super->collisions & 0xe) == 0) { - return 0; + if ((super->collisions & COL_NORTH_ANY) == COL_NONE) { + return FALSE; } if ((u32)(super->y.HALF.HI & 0xf) - 7 < 3) { super->y.HALF.HI = (super->y.HALF.HI & 0xfff0) + 8; - return 1; + return TRUE; } sub_0809969C(this); break; case 1: - if ((super->collisions & 0xe000) == 0) { + if ((super->collisions & COL_EAST_ANY) == COL_NONE) { return FALSE; } if ((u32)(super->x.HALF.HI & 0xf) - 7 < 3) { @@ -236,7 +237,7 @@ bool32 sub_0809953C(SmallIceBlockEntity* this) { sub_0809969C(this); break; case 2: - if ((super->collisions & 0xe0) == 0) { + if ((super->collisions & COL_SOUTH_ANY) == COL_NONE) { return FALSE; } if ((u32)(super->y.HALF.HI & 0xf) - 7 < 3) { @@ -246,7 +247,7 @@ bool32 sub_0809953C(SmallIceBlockEntity* this) { sub_0809969C(this); break; default: - if ((super->collisions & 0xe00) != 0) { + if ((super->collisions & COL_WEST_ANY) != COL_NONE) { if ((u32)(super->x.HALF.HI & 0xf) - 7 < 3) { super->x.HALF.HI = (super->x.HALF.HI & 0xfff0) + 8; return TRUE; diff --git a/src/object/specialFx.c b/src/object/specialFx.c index c5262d9c..dc51b4c4 100644 --- a/src/object/specialFx.c +++ b/src/object/specialFx.c @@ -144,6 +144,7 @@ void sub_080844E0(SpecialFxObject* this) { static const u8 gUnk_0811FAC8[] = { 0x03, 0x37, 0x38, 0x39 }; static const u8 gUnk_0811FACC[] = { 0x17, 0x3e, 0x3f, 0x40 }; const struct_0811F960* ptr; + super->action = 1; super->flags &= ~0x80; super->spriteSettings.draw = 1; @@ -219,7 +220,7 @@ void sub_08084680(SpecialFxObject* this) { } void sub_08084694(SpecialFxObject* this) { - if (!super->parent || !super->parent->next) { + if ((super->parent == NULL) || (super->parent->next == NULL)) { DeleteThisEntity(); } GetNextFrame(super); @@ -253,12 +254,15 @@ void sub_080846B0(SpecialFxObject* this) { void sub_0808471C(SpecialFxObject* this) { static const s8 gUnk_0811FB08[] = { -8, -8, 8, -8, -8, 8, 8, 8 }; + GetNextFrame(super); if (super->frame & ANIM_DONE) { u32 i; + for (i = 0; i < 4; i++) { Entity* fx = CreateFx(super, 0x24, 0); - if (fx) { + + if (fx != NULL) { const s8* ptr = &gUnk_0811FB08[2 * i]; fx->x.HALF.HI += ptr[0]; fx->y.HALF.HI += ptr[1]; @@ -280,7 +284,7 @@ void sub_08084784(SpecialFxObject* this) { void sub_08084798(SpecialFxObject* this) { GetNextFrame(super); - if ((super->frame & ANIM_DONE) || !super->child->next) { + if ((super->frame & ANIM_DONE) || (super->child->next == NULL)) { DeleteThisEntity(); } } diff --git a/src/objectUtils.c b/src/objectUtils.c index 6fdbe902..c4a93c17 100644 --- a/src/objectUtils.c +++ b/src/objectUtils.c @@ -264,7 +264,7 @@ void CreateSparkle(Entity* entity) { } } -NONMATCH("asm/non_matching/objectUtils/sub_080A2BE4.inc", void sub_080A2BE4(Entity* this, u32 param_2)) { +NONMATCH("asm/non_matching/objectUtils/sub_080A2BE4.inc", void sub_080A2BE4(Entity* this, bool32 param_2)) { s16 oldValue; s32 diff; u16 newValue; diff --git a/src/player.c b/src/player.c index d39d30ba..ace9b023 100644 --- a/src/player.c +++ b/src/player.c @@ -6,6 +6,7 @@ */ #include "global.h" +#include "collision.h" #include "asm.h" #include "sound.h" #include "entity.h" @@ -3018,7 +3019,7 @@ static void sub_080739EC(Entity* this) { if ((gPlayerState.jump_status & 0xC0) != 0) { gPlayerState.field_0xd = this->direction; if (gPlayerState.jump_status & 0x80) - this->collisions = 0; + this->collisions = COL_NONE; v = GRAVITY_RATE; } else { if ((u16)sub_0806F854(this, 0, -12)) { @@ -3414,7 +3415,7 @@ void SurfaceAction_7(Entity* this) { void SurfaceAction_MinishDoorFront(Entity* this) { if ((this->y.HALF.HI & 0xF) <= 0xD) { - this->collisions = 0x6600; + this->collisions = COL_EAST_FULL | COL_WEST_FULL; hide(this); } else { EnablePlayerDraw(this); @@ -3423,7 +3424,7 @@ void SurfaceAction_MinishDoorFront(Entity* this) { void SurfaceAction_MinishDoorBack(Entity* this) { if ((this->y.HALF.HI & 0xF) > 1) { - this->collisions = 0x6600; + this->collisions = COL_EAST_FULL | COL_WEST_FULL; hide(this); } else { EnablePlayerDraw(this); @@ -3432,7 +3433,7 @@ void SurfaceAction_MinishDoorBack(Entity* this) { void SurfaceAction_A(Entity* this) { if ((this->x.HALF.HI & 0xF) < 12) { - this->collisions = 0x66; + this->collisions = COL_NORTH_FULL | COL_SOUTH_FULL; hide(this); } else { EnablePlayerDraw(this); @@ -3441,7 +3442,7 @@ void SurfaceAction_A(Entity* this) { void SurfaceAction_B(Entity* this) { if ((this->x.HALF.HI & 0xF) > 4) { - this->collisions = 0x66; + this->collisions = COL_NORTH_FULL | COL_SOUTH_FULL; hide(this); } else { EnablePlayerDraw(this); diff --git a/src/projectile/arrowProjectile.c b/src/projectile/arrowProjectile.c index 91567d8b..755ee6f8 100644 --- a/src/projectile/arrowProjectile.c +++ b/src/projectile/arrowProjectile.c @@ -1,4 +1,5 @@ #include "entity.h" +#include "collision.h" #include "enemy.h" #include "functions.h" #include "object.h" @@ -66,7 +67,7 @@ void ArrowProjectile_Action1(Entity* this) { } void ArrowProjectile_Action2(Entity* this) { - if (this->collisions != 0) { + if (this->collisions != COL_NONE) { this->action = 3; COLLISION_OFF(this); this->actionDelay = 0x20; diff --git a/src/projectile/boneProjectile.c b/src/projectile/boneProjectile.c index 3f9858a9..429a94c9 100644 --- a/src/projectile/boneProjectile.c +++ b/src/projectile/boneProjectile.c @@ -1,4 +1,5 @@ #include "entity.h" +#include "collision.h" #include "enemy.h" #include "functions.h" @@ -25,15 +26,15 @@ void sub_080A81C4(Entity* this) { void BoneProjectile_Init(Entity* this) { this->action = 1; - this->actionDelay = 0x3c; - this->z.HALF.HI = 0xfffe; + this->actionDelay = 60; + this->z.HALF.HI = -2; InitializeAnimation(this, 0); } void BoneProjectile_Action1(Entity* this) { GetNextFrame(this); ProcessMovement3(this); - if (this->collisions == 0) { + if (this->collisions == COL_NONE) { if (IsProjectileOffScreen(this)) { DeleteEntity(this); } else { diff --git a/src/projectile/cannonballProjectile.c b/src/projectile/cannonballProjectile.c index acf5ccd7..18e79a67 100644 --- a/src/projectile/cannonballProjectile.c +++ b/src/projectile/cannonballProjectile.c @@ -1,4 +1,5 @@ #include "entity.h" +#include "collision.h" #include "enemy.h" #include "functions.h" @@ -49,7 +50,7 @@ void CannonballProjectile_Action1(Entity* this) { void CannonballProjectile_Action2(Entity* this) { GetNextFrame(this); ProcessMovement3(this); - if ((sub_080AB634(this) == 0) && (this->collisions != 0)) { + if ((sub_080AB634(this) == 0) && (this->collisions != COL_NONE)) { CreateFx(this, FX_DEATH, 0); DeleteThisEntity(); } diff --git a/src/projectile/dekuSeedProjectile.c b/src/projectile/dekuSeedProjectile.c index 94eb1e59..86fce52a 100644 --- a/src/projectile/dekuSeedProjectile.c +++ b/src/projectile/dekuSeedProjectile.c @@ -91,7 +91,7 @@ void DekuSeedProjectile_Action2(Entity* this) { COLLISION_ON(this); } } else { - sub_0800417E(this, (u32)this->collisions); + sub_0800417E(this, this->collisions); sub_08016AD2(this); InitializeAnimation(this, 0x19); sub_080A86A0(this); diff --git a/src/projectile/lakituCloudProjectile.c b/src/projectile/lakituCloudProjectile.c index f66dd20e..a766f97b 100644 --- a/src/projectile/lakituCloudProjectile.c +++ b/src/projectile/lakituCloudProjectile.c @@ -24,7 +24,7 @@ void nullsub_539(Entity* this) { } void sub_080A9CF0(Entity* this) { - if (sub_0806F520() == 0) { + if (!sub_0806F520(this)) { CreateFx(this, FX_DEATH, 0); DeleteThisEntity(); } diff --git a/src/projectile/lakituLightning.c b/src/projectile/lakituLightning.c index 1f366e0f..171be05c 100644 --- a/src/projectile/lakituLightning.c +++ b/src/projectile/lakituLightning.c @@ -1,4 +1,5 @@ #include "entity.h" +#include "collision.h" #include "enemy.h" #include "functions.h" @@ -32,7 +33,7 @@ void LakituLightning_Init(Entity* this) { void LakituLightning_Action1(Entity* this) { GetNextFrame(this); ProcessMovement3(this); - if ((this->collisions != 0) || (--this->actionDelay == 0)) { + if ((this->collisions != COL_NONE) || (--this->actionDelay == 0)) { CreateFx(this, FX_BLUE_EFC, 0); DeleteThisEntity(); } diff --git a/src/projectile/moblinSpear.c b/src/projectile/moblinSpear.c index 9d84ccbf..039eaa1d 100644 --- a/src/projectile/moblinSpear.c +++ b/src/projectile/moblinSpear.c @@ -9,16 +9,23 @@ typedef struct { u8 height; } HitboxChange; -extern void (*const MoblinSpear_Functions[])(Entity*); -extern void (*const MoblinSpear_Actions[])(Entity*); - -extern const HitboxChange gUnk_0812966C[]; +void MoblinSpear_OnTick(Entity* this); +void sub_080A832C(Entity* this); +void MoblinSpear_Init(Entity* this); +void MoblinSpear_Action1(Entity* this); void MoblinSpear(Entity* this) { + static void (*const MoblinSpear_Functions[])(Entity*) = { + MoblinSpear_OnTick, sub_080A832C, DeleteEntity, DeleteEntity, DeleteEntity, + }; MoblinSpear_Functions[GetNextFunction(this)](this); } void MoblinSpear_OnTick(Entity* this) { + static void (*const MoblinSpear_Actions[])(Entity*) = { + MoblinSpear_Init, + MoblinSpear_Action1, + }; MoblinSpear_Actions[this->action](this); } @@ -50,6 +57,16 @@ void MoblinSpear_Init(Entity* this) { } void MoblinSpear_Action1(Entity* this) { + static const HitboxChange gUnk_0812966C[] = { + { 6, 11, 2, 4 }, { -12, 2, 3, 3 }, { -13, -15, 1, 2 }, { 5, 12, 1, 3 }, { 7, 10, 1, 2 }, + { 8, 9, 1, 3 }, { 7, 10, 1, 2 }, { -22, 1, 4, 2 }, { -12, 1, 3, 2 }, { -6, 2, 4, 2 }, + { -12, 1, 3, 2 }, { -1, -19, 1, 1 }, { -4, -19, 1, 1 }, { -4, -20, 1, 1 }, { -4, -19, 1, 1 }, + { 6, 9, 1, 2 }, { 6, 10, 1, 2 }, { 6, 9, 1, 2 }, { 6, 10, 1, 2 }, { -29, -11, 3, 2 }, + { -29, -9, 3, 2 }, { -29, -11, 3, 2 }, { -29, -9, 3, 2 }, { -5, -25, 1, 2 }, { -5, -24, 1, 2 }, + { -5, -25, 1, 2 }, { -5, -24, 1, 2 }, { 7, 12, 1, 2 }, { 7, 11, 1, 2 }, { -12, 3, 3, 1 }, + { -12, 2, 3, 1 }, { -13, -16, 1, 2 }, { -13, -15, 1, 2 }, + }; + u8 frames; Entity* parent; u32 tmp; @@ -86,20 +103,3 @@ void MoblinSpear_Action1(Entity* this) { } } } - -void (*const MoblinSpear_Functions[])(Entity*) = { - MoblinSpear_OnTick, sub_080A832C, DeleteEntity, DeleteEntity, DeleteEntity, -}; -void (*const MoblinSpear_Actions[])(Entity*) = { - MoblinSpear_Init, - MoblinSpear_Action1, -}; - -const HitboxChange gUnk_0812966C[] = { - { 6, 11, 2, 4 }, { -12, 2, 3, 3 }, { -13, -15, 1, 2 }, { 5, 12, 1, 3 }, { 7, 10, 1, 2 }, { 8, 9, 1, 3 }, - { 7, 10, 1, 2 }, { -22, 1, 4, 2 }, { -12, 1, 3, 2 }, { -6, 2, 4, 2 }, { -12, 1, 3, 2 }, { -1, -19, 1, 1 }, - { -4, -19, 1, 1 }, { -4, -20, 1, 1 }, { -4, -19, 1, 1 }, { 6, 9, 1, 2 }, { 6, 10, 1, 2 }, { 6, 9, 1, 2 }, - { 6, 10, 1, 2 }, { -29, -11, 3, 2 }, { -29, -9, 3, 2 }, { -29, -11, 3, 2 }, { -29, -9, 3, 2 }, { -5, -25, 1, 2 }, - { -5, -24, 1, 2 }, { -5, -25, 1, 2 }, { -5, -24, 1, 2 }, { 7, 12, 1, 2 }, { 7, 11, 1, 2 }, { -12, 3, 3, 1 }, - { -12, 2, 3, 1 }, { -13, -16, 1, 2 }, { -13, -15, 1, 2 }, -}; diff --git a/src/projectile/octorokBossProjectile.c b/src/projectile/octorokBossProjectile.c index 659f748c..54ac6c32 100644 --- a/src/projectile/octorokBossProjectile.c +++ b/src/projectile/octorokBossProjectile.c @@ -1,4 +1,5 @@ #include "entity.h" +#include "collision.h" #include "enemy.h" #include "functions.h" #include "projectile.h" @@ -114,10 +115,10 @@ void OctorokBossProjectile_Action1(Entity* this) { this->field_0x78.HWORD--; LinearMoveAngle(this, this->speed, this->direction); CalculateEntityTileCollisions(this, this->direction >> 3, 0); - if ((this->collisions & 0xee00) != 0) { + if ((this->collisions & (COL_WEST_ANY | COL_EAST_ANY)) != COL_NONE) { this->direction = -this->direction; } - if ((this->collisions & 0xee) != 0) { + if ((this->collisions & (COL_NORTH_ANY | COL_SOUTH_ANY)) != COL_NONE) { this->direction = -this->direction ^ 0x80; } if (this->direction == this->field_0xf) { @@ -151,7 +152,7 @@ void OctorokBossProjectile_Action1(Entity* this) { GetNextFrame(this); if (GravityUpdate(this, 0x1800) != 0) { CalculateEntityTileCollisions(this, this->direction >> 3, 0); - if (this->collisions == 0) { + if (this->collisions == COL_NONE) { LinearMoveAngle(this, (s32)this->speed, (u32)this->direction); } else { OctorokBossProjectile_Action2(this); diff --git a/src/projectile/spiderWeb.c b/src/projectile/spiderWeb.c index acfaeac7..52df2d19 100644 --- a/src/projectile/spiderWeb.c +++ b/src/projectile/spiderWeb.c @@ -9,51 +9,61 @@ typedef struct { u8 direction; } PACKED Struct_0812A074; -extern void (*const SpiderWeb_Functions[])(Entity*); -extern void (*const SpiderWeb_Actions[])(Entity*); -extern const u8 gUnk_0812A03C[]; -extern const Hitbox* const gUnk_0812A04C[]; -extern void (*const SpiderWeb_SubActions[])(Entity*); -extern const s8 gUnk_0812A064[]; -extern const s8 gUnk_0812A06C[]; -extern const Struct_0812A074 gUnk_0812A074[]; -extern const u16 gUnk_0812A084[]; - +void SpiderWeb_OnTick(Entity*); void sub_080AA6C0(Entity*); void sub_080AAAA8(Entity*); void sub_080AAA68(Entity*); void sub_080AA9E0(Entity*); +void sub_080AA78C(Entity*); +void SpiderWeb_Init(Entity*); +void SpiderWeb_Action1(Entity*); +void SpiderWeb_Action2(Entity*); +void SpiderWeb_Action3(Entity*); +void SpiderWeb_SubAction0(Entity*); +void SpiderWeb_SubAction1(Entity*); void SpiderWeb(Entity* this) { + static void (*const SpiderWeb_Functions[])(Entity*) = { + SpiderWeb_OnTick, sub_080AA6C0, DeleteEntity, DeleteEntity, DeleteEntity, sub_080AA78C, + }; SpiderWeb_Functions[GetNextFunction(this)](this); } void SpiderWeb_OnTick(Entity* this) { + static void (*const SpiderWeb_Actions[])(Entity*) = { + SpiderWeb_Init, + SpiderWeb_Action1, + SpiderWeb_Action2, + SpiderWeb_Action3, + }; SpiderWeb_Actions[this->action](this); } void sub_080AA6C0(Entity* this) { + static const s8 typeSpritOffsets[] = { + -8, -4, 6, 1, 4, -11, -3, 3, -7, -3, 6, 4, -4, -11, 3, 3, + }; Entity* object; if (this->bitfield == 0x87) { this->action = 3; - this->actionDelay = 0x5a; + this->actionDelay = 90; COLLISION_OFF(this); InitAnimationForceUpdate(this, this->type + 0x10); object = CreateObject(OBJECT_2A, 3, 0); if (object != NULL) { object->type2 = 0x5a; object->spritePriority.b0 = 3; - object->spriteOffsetX = gUnk_0812A03C[this->type * 4]; - object->spriteOffsetY = gUnk_0812A03C[this->type * 4 + 1]; + object->spriteOffsetX = typeSpritOffsets[this->type * 4]; + object->spriteOffsetY = typeSpritOffsets[this->type * 4 + 1]; object->parent = this; } object = CreateObject(OBJECT_2A, 3, 0); if (object != NULL) { object->type2 = 0x5a; object->spritePriority.b0 = 3; - object->spriteOffsetX = gUnk_0812A03C[this->type * 4 + 2]; - object->spriteOffsetY = gUnk_0812A03C[this->type * 4 + 3]; + object->spriteOffsetX = typeSpritOffsets[this->type * 4 + 2]; + object->spriteOffsetY = typeSpritOffsets[this->type * 4 + 3]; object->parent = this; } } else { @@ -79,10 +89,10 @@ void sub_080AA78C(Entity* this) { this->subAction = 1; InitAnimationForceUpdate(this, animationState + 8); } - if (sub_0806F520(this) != 0) { + if (sub_0806F520(this)) { UpdateAnimationSingleFrame(this); if ((this->frame & 0x10) != 0) { - this->frame &= 0xef; + this->frame &= ~0x10; EnqueueSFX(SFX_100); } if ((this->frame & ANIM_DONE) != 0) { @@ -98,13 +108,19 @@ void sub_080AA78C(Entity* this) { } void SpiderWeb_Init(Entity* this) { + static const Hitbox* const typeHitboxes[] = { + &gUnk_080FD41C, + &gUnk_080FD424, + &gUnk_080FD42C, + &gUnk_080FD434, + }; if (CheckFlags(this->field_0x86.HWORD) != 0) { DeleteThisEntity(); } this->action = 1; this->field_0x1c = 1; this->field_0x16 = 1; - this->hitbox = (Hitbox*)gUnk_0812A04C[this->type]; + this->hitbox = (Hitbox*)typeHitboxes[this->type]; this->cutsceneBeh.HALF.LO = 0; InitAnimationForceUpdate(this, this->type); sub_080AAA68(this); @@ -118,11 +134,18 @@ void SpiderWeb_Action1(Entity* this) { } void SpiderWeb_Action2(Entity* this) { + static void (*const SpiderWeb_SubActions[])(Entity*) = { + SpiderWeb_SubAction0, + SpiderWeb_SubAction1, + }; sub_0806FBB4(this); SpiderWeb_SubActions[this->subAction - 5](this); } void SpiderWeb_SubAction0(Entity* this) { + static const s8 gUnk_0812A064[] = { 0, 17, -15, 4, 0, -11, 15, 4 }; + static const s8 gUnk_0812A06C[] = { 0, 2, -2, 0, 0, -2, 2, 0 }; + u32 tmp; u16 x; u16 y; @@ -169,6 +192,8 @@ void SpiderWeb_Action3(Entity* this) { } void sub_080AA9E0(Entity* this) { + static const Struct_0812A074 gUnk_0812A074[] = { { 4, 0 }, { 5, 16 }, { 3, 8 }, { 5, 24 }, + { 3, 16 }, { 5, 0 }, { 3, 24 }, { 5, 8 } }; s32 diff; const Struct_0812A074* ptr; @@ -200,7 +225,8 @@ void sub_080AA9E0(Entity* this) { } void sub_080AAA68(Entity* this) { - SetTile(gUnk_0812A084[this->type], TILE(this->x.HALF.HI, this->y.HALF.HI), this->collisionLayer); + static const u16 typeTiles[] = { 16419, 16421, 16422, 16420 }; + SetTile(typeTiles[this->type], TILE(this->x.HALF.HI, this->y.HALF.HI), this->collisionLayer); } void sub_080AAAA8(Entity* this) { @@ -208,32 +234,3 @@ void sub_080AAAA8(Entity* this) { RestorePrevTileEntity(TILE(this->x.HALF.HI, this->y.HALF.HI), this->collisionLayer); DeleteThisEntity(); } - -void (*const SpiderWeb_Functions[])(Entity*) = { - SpiderWeb_OnTick, sub_080AA6C0, DeleteEntity, DeleteEntity, DeleteEntity, sub_080AA78C, -}; -void (*const SpiderWeb_Actions[])(Entity*) = { - SpiderWeb_Init, - SpiderWeb_Action1, - SpiderWeb_Action2, - SpiderWeb_Action3, -}; -const u8 gUnk_0812A03C[] = { - 248, 252, 6, 1, 4, 245, 253, 3, 249, 253, 6, 4, 252, 245, 3, 3, -}; - -const Hitbox* const gUnk_0812A04C[] = { - &gUnk_080FD41C, - &gUnk_080FD424, - &gUnk_080FD42C, - &gUnk_080FD434, -}; -void (*const SpiderWeb_SubActions[])(Entity*) = { - SpiderWeb_SubAction0, - SpiderWeb_SubAction1, -}; -const s8 gUnk_0812A064[] = { 0, 17, -15, 4, 0, -11, 15, 4 }; -const s8 gUnk_0812A06C[] = { 0, 2, -2, 0, 0, -2, 2, 0 }; -const Struct_0812A074 gUnk_0812A074[] = { { 4, 0 }, { 5, 16 }, { 3, 8 }, { 5, 24 }, - { 3, 16 }, { 5, 0 }, { 3, 24 }, { 5, 8 } }; -const u16 gUnk_0812A084[] = { 16419, 16421, 16422, 16420 }; diff --git a/src/projectile/stalfosProjectile.c b/src/projectile/stalfosProjectile.c index 841a68e3..3f8f679d 100644 --- a/src/projectile/stalfosProjectile.c +++ b/src/projectile/stalfosProjectile.c @@ -38,7 +38,7 @@ void sub_080A9A34(Entity* this) { } void sub_080A9A64(Entity* this) { - if ((this->subAction < 3) && (sub_0806F520(this) == 0)) { + if ((this->subAction < 3) && !sub_0806F520(this)) { sub_080A9BA8(this); } StalfosProjectile_SubActions[this->subAction](this); diff --git a/src/projectile/torchTrapProjectile.c b/src/projectile/torchTrapProjectile.c index 5ff167c0..38503e89 100644 --- a/src/projectile/torchTrapProjectile.c +++ b/src/projectile/torchTrapProjectile.c @@ -1,4 +1,5 @@ #include "entity.h" +#include "collision.h" #include "enemy.h" #include "functions.h" @@ -39,7 +40,7 @@ void TorchTrapProjectile_Action1(Entity* this) { void TorchTrapProjectile_Action2(Entity* this) { GetNextFrame(this); ProcessMovement3(this); - if (this->collisions != 0) { + if (this->collisions != COL_NONE) { DeleteThisEntity(); } if (IsProjectileOffScreen(this)) { diff --git a/src/projectile/v1DarkMagicProjectile.c b/src/projectile/v1DarkMagicProjectile.c index aeca2aa3..8131c3d7 100644 --- a/src/projectile/v1DarkMagicProjectile.c +++ b/src/projectile/v1DarkMagicProjectile.c @@ -87,7 +87,7 @@ void sub_080AACE0(Entity* this) { } void sub_080AAD70(Entity* this) { - if (sub_0806F520() == 0) { + if (!sub_0806F520(this)) { this->health = 0; } V1DarkMagicProjectile_SubActions[this->subAction](this); diff --git a/src/projectile/v2Projectile.c b/src/projectile/v2Projectile.c index 3733945d..e2c86b53 100644 --- a/src/projectile/v2Projectile.c +++ b/src/projectile/v2Projectile.c @@ -62,7 +62,7 @@ void sub_080ABBF4(Entity* this) { } void sub_080ABC54(Entity* this) { - if (sub_0806F520() == 0) { + if (!sub_0806F520(this)) { CreateFx(this, FX_DEATH, 0); DeleteThisEntity(); } diff --git a/src/projectile/v3ElectricProjectile.c b/src/projectile/v3ElectricProjectile.c index c52258cd..77308f1e 100644 --- a/src/projectile/v3ElectricProjectile.c +++ b/src/projectile/v3ElectricProjectile.c @@ -1,4 +1,5 @@ #include "entity.h" +#include "collision.h" #include "enemy.h" #include "player.h" #include "coord.h" @@ -96,7 +97,7 @@ void V3ElectricProjectile_Action2(Entity* this) { this->z.HALF.HI += 3; } ProcessMovement3(this); - if (this->collisions != 0) { + if (this->collisions != COL_NONE) { DeleteThisEntity(); } GetNextFrame(this); diff --git a/src/projectile/v3HandProjectile.c b/src/projectile/v3HandProjectile.c index 4d4c55bf..ce11e1ef 100644 --- a/src/projectile/v3HandProjectile.c +++ b/src/projectile/v3HandProjectile.c @@ -1,4 +1,5 @@ #include "entity.h" +#include "collision.h" #include "enemy.h" #include "player.h" #include "functions.h" @@ -20,7 +21,7 @@ void V3HandProjectile_OnTick(Entity* this) { this->z.HALF.HI += 2; } ProcessMovement3(this); - if (this->collisions != 0) { + if (this->collisions != COL_NONE) { DeleteThisEntity(); } GetNextFrame(this); diff --git a/src/projectile/v3TennisBallProjectile.c b/src/projectile/v3TennisBallProjectile.c index 455f67af..c487be01 100644 --- a/src/projectile/v3TennisBallProjectile.c +++ b/src/projectile/v3TennisBallProjectile.c @@ -1,4 +1,5 @@ #include "entity.h" +#include "collision.h" #include "enemy.h" #include "functions.h" @@ -62,7 +63,7 @@ void V3TennisBallProjectile_Action1(Entity* this) { void V3TennisBallProjectile_Action2(Entity* this) { ProcessMovement3(this); - if (this->collisions != 0) { + if (this->collisions != COL_NONE) { DeleteThisEntity(); } GetNextFrame(this); @@ -78,28 +79,28 @@ bool32 sub_080ACB40(Entity* this) { Entity* tmp = ((Entity**)(r1_grandparent->myHeap))[7]->child; if (tmp != this && child == tmp->child) { - return 0; + return FALSE; } tmp = ((Entity**)(r1_grandparent->myHeap))[8]->child; if (tmp != this && child == tmp->child) { - return 0; + return FALSE; } tmp = ((Entity**)(r1_grandparent->myHeap))[9]->child; if (tmp != this && child == tmp->child) { - return 0; + return FALSE; } tmp = ((Entity**)(r1_grandparent->myHeap))[10]->child; if (tmp != this && child == tmp->child) { - return 0; + return FALSE; } - return 1; + return TRUE; } void sub_080ACB90(Entity* this) { diff --git a/src/projectile/winder.c b/src/projectile/winder.c index ae1cb901..d15ce8a0 100644 --- a/src/projectile/winder.c +++ b/src/projectile/winder.c @@ -1,118 +1,133 @@ +#define NENT_DEPRECATED +#include "collision.h" #include "entity.h" #include "asm.h" #include "functions.h" #include "common.h" #include "projectile.h" +#include "projectile/winder.h" -extern void (*const Winder_Actions[])(Entity*); extern s16 gUnk_080B4488[]; -static const u8 gUnk_0812A6BC[]; -static const u16 gUnk_0812A6C4[]; -void sub_080AB9DC(Entity*); -bool32 sub_080AB9FC(Entity* this, u32 param_1); +typedef enum { + /* 0 */ WINDER_TYPE_HEAD, + /* 4 */ WINDER_TYPE_TAIL = 4, +} WinderType; -void Winder(Entity* this) { - Winder_Actions[this->action](this); - sub_080AB9DC(this); +void Winder_Init(WinderEntity* this); +void Winder_Move(WinderEntity* this); + +void Winder_SetPositions(WinderEntity*); +bool32 Winder_CheckForRailings(WinderEntity* this, u32 dir); + +void Winder(Entity* thisx) { + static void (*const Winder_Actions[])(WinderEntity*) = { + Winder_Init, + Winder_Move, + }; + WinderEntity* this = (WinderEntity*)thisx; + + Winder_Actions[super->action](this); + Winder_SetPositions(this); } -void Winder_Init(Entity* this) { - Entity* entity; - u16* puVar3; - s32 index; - - this->action += 1; - this->speed = 0x140; - this->z.WORD = 0; - if (this->type == 0) { - this->direction = Random() & 0x18; - this->parent = this; +void Winder_Init(WinderEntity* this) { + Entity* nextSegment; + u16* posPtr; + s32 i; + + super->action++; + super->speed = 0x140; + super->z.WORD = 0; + if (super->type == 0) { + super->direction = Random() & 0x18; + super->parent = super; } - InitializeAnimation(this, 0); - if (this->type < 4) { - entity = CreateProjectile(WINDER); - entity->type = this->type + 1; - entity->parent = this->parent; - entity->child = this; - CopyPosition(this, entity); + InitializeAnimation(super, 0); + if (super->type < WINDER_TYPE_TAIL) { + nextSegment = CreateProjectile(WINDER); + nextSegment->type = super->type + 1; + nextSegment->parent = super->parent; + nextSegment->child = super; + CopyPosition(super, nextSegment); } - puVar3 = &this->field_0x68.HWORD; - for (index = 7; index >= 0; --index) { - *puVar3 = this->x.HALF.HI; - puVar3 += 1; - *puVar3 = this->y.HALF.HI; - puVar3 += 1; + posPtr = this->positions; + for (i = 0; i < WINDER_NUM_SEGMENTS; i++) { + *posPtr++ = super->x.HALF.HI; + *posPtr++ = super->y.HALF.HI; } } -void sub_080AB950(Entity* this) { - if (this->type == 0) { +void Winder_Move(WinderEntity* this) { + static const u8 nextDirections[][2] = { + { DirectionEast, DirectionWest }, + { DirectionNorth, DirectionSouth }, + { DirectionEast, DirectionWest }, + { DirectionNorth, DirectionSouth }, + }; + static const u16 collisionChecks[] = { COL_NORTH_ANY, COL_EAST_ANY, COL_SOUTH_ANY, COL_WEST_ANY }; + + if (super->type == WINDER_TYPE_HEAD) { u8 dir; - ProcessMovement0(this); - dir = this->direction >> 3; - if (((gUnk_0812A6C4)[dir] & this->collisions) || sub_080AB9FC(this, this->direction)) { - this->direction = gUnk_0812A6BC[(Random() & 0x1) + (dir << 1)]; + + ProcessMovement0(super); + + dir = super->direction >> 3; + if ((collisionChecks[dir] & super->collisions) || Winder_CheckForRailings(this, super->direction)) { + super->direction = nextDirections[dir][Random() & 0x1]; } } else { - Entity* child; + WinderEntity* child; - if (this->parent == NULL) { + if (super->parent == NULL) { DeleteThisEntity(); } - if (this->parent->next == NULL) { + if (super->parent->next == NULL) { DeleteThisEntity(); } - child = this->child; - if (child && child->next) { - this->x.HALF.HI = child->field_0x68.HWORD; - this->y.HALF.HI = child->field_0x6a.HWORD; + child = (WinderEntity*)super->child; + if ((child != NULL) && (child->base.next != NULL)) { + super->x.HALF.HI = child->positions[0]; + super->y.HALF.HI = child->positions[1]; } else { DeleteThisEntity(); } } - GetNextFrame(this); + GetNextFrame(super); } -void sub_080AB9DC(Entity* this) { - MemCopy(&this->field_0x6c, &this->field_0x68, 0x1c); - this->cutsceneBeh.HWORD = this->x.HALF.HI; - this->field_0x86.HWORD = this->y.HALF.HI; +void Winder_SetPositions(WinderEntity* this) { + //! @bug Undefined behaviour for source and destination to overlap in a memcpy. In this case it is okay because the + //! copy will always be sequential, incremental and in chunks of <= 4 bytes, so it will copy the contents of + //! positions[0] and positions[1] to positions[2] and positions[3], then that of positions[2] and positions[3] to + //! positions[4] and positions[5], and so on. A safer way to do this would be a manual loop as in Winder_Move. + MemCopy(&this->positions[2], &this->positions[0], sizeof(u16) * (ARRAY_COUNT(this->positions) - 2)); + + this->positions[2 * (WINDER_NUM_SEGMENTS - 1)] = super->x.HALF.HI; + this->positions[2 * (WINDER_NUM_SEGMENTS - 1) + 1] = super->y.HALF.HI; } -bool32 sub_080AB9FC(Entity* this, u32 dir) { +bool32 Winder_CheckForRailings(WinderEntity* this, u32 dir) { + u32 tile; u32 val; - LayerStruct* layer = GetLayerByIndex(this->collisionLayer); - u32 tmp; - val = (((this->x.HALF.HI - gRoomControls.origin_x) >> 4) & 0x3f) | - ((((this->y.HALF.HI - gRoomControls.origin_y) >> 4) & 0x3f) << 6); - val += gUnk_080B4488[dir >> 3]; - tmp = layer->collisionData[val]; - if (tmp <= 0x1f) { - return 0; + LayerStruct* layer = GetLayerByIndex(super->collisionLayer); + u32 collisionData; + + tile = TILE(super->x.HALF.HI, super->y.HALF.HI); + tile += gUnk_080B4488[dir >> 3]; + collisionData = layer->collisionData[tile]; + + if (collisionData <= 0x1F) { + return FALSE; } - if (tmp > 0x3f) { - return 0; + if (collisionData > 0x3F) { + return FALSE; } - return 1; + return TRUE; } - -void (*const Winder_Actions[])(Entity*) = { - Winder_Init, - sub_080AB950, -}; -const u8 gUnk_0812A6BC[] = { - 8, 24, 0, 16, 8, 24, 0, 16, -}; -const u16 gUnk_0812A6C4[] = { - 0xe, - 0xe000, - 0xe0, - 0xe00, -}; @@ -68,7 +68,7 @@ NONMATCH("asm/non_matching/LoadRoomEntity.inc", Entity* LoadRoomEntity(EntityDat if (kind == 9) return v5; sub_0804AF0C(v5, dat); - if (!v5->next) + if (v5->next == NULL) return v5; if ((dat->kind & 0x10) == 0) { if ((dat->kind & 0x20) != 0) { diff --git a/src/roomInit.c b/src/roomInit.c index d0136ac0..709cbcff 100644 --- a/src/roomInit.c +++ b/src/roomInit.c @@ -177,69 +177,69 @@ void sub_unk1_CrenelMinishPaths_MelarisMine(void) { sub_080580B0(34); } -u32 sub_unk3_MinishPaths1_ToMinishVillage(void) { +u32 sub_unk3_MinishPaths_ToMinishVillage(void) { return 1; } -void sub_StateChange_MinishPaths1_ToMinishVillage(void) { +void sub_StateChange_MinishPaths_ToMinishVillage(void) { sub_080575C8(30); } -void sub_unk1_MinishPaths1_ToMinishVillage(void) { +void sub_unk1_MinishPaths_ToMinishVillage(void) { sub_080575C8(30); } -u32 sub_unk3_MinishPaths1_CastorWilds(void) { +u32 sub_unk3_MinishPaths_CastorWilds(void) { return 1; } -void sub_StateChange_MinishPaths1_CastorWilds(void) { +void sub_StateChange_MinishPaths_CastorWilds(void) { sub_080575C8(33); } -void sub_unk1_MinishPaths1_CastorWilds(void) { +void sub_unk1_MinishPaths_CastorWilds(void) { sub_080575C8(33); } -u32 sub_unk3_MinishPaths1_HyruleTown(void) { +u32 sub_unk3_MinishPaths_HyruleTown(void) { return 1; } -void sub_StateChange_MinishPaths1_HyruleTown(void) { +void sub_StateChange_MinishPaths_HyruleTown(void) { sub_080575C8(31); } -void sub_unk1_MinishPaths1_HyruleTown(void) { +void sub_unk1_MinishPaths_HyruleTown(void) { sub_080575C8(31); } -u32 sub_unk3_MinishPaths1_LonLonRanch(void) { +u32 sub_unk3_MinishPaths_LonLonRanch(void) { return 1; } -void sub_StateChange_MinishPaths1_LonLonRanch(void) { +void sub_StateChange_MinishPaths_LonLonRanch(void) { sub_080575C8(32); } -void sub_unk1_MinishPaths1_LonLonRanch(void) { +void sub_unk1_MinishPaths_LonLonRanch(void) { sub_080575C8(32); } -u32 sub_unk3_MinishPaths1_MayorsCabin(void) { +u32 sub_unk3_MinishPaths_MayorsCabin(void) { return 1; } -extern EntityData Entities_MinishPaths1_MayorsCabin_gUnk_080D6138; +extern EntityData Entities_MinishPaths_MayorsCabin_gUnk_080D6138; -void sub_StateChange_MinishPaths1_MayorsCabin(void) { +void sub_StateChange_MinishPaths_MayorsCabin(void) { sub_080575C8(0x20); if (gPlayerEntity.y.HALF.HI - gRoomControls.origin_y > 0x40) - LoadRoomEntityList(&Entities_MinishPaths1_MayorsCabin_gUnk_080D6138); + LoadRoomEntityList(&Entities_MinishPaths_MayorsCabin_gUnk_080D6138); } -void sub_unk1_MinishPaths1_MayorsCabin(void) { +void sub_unk1_MinishPaths_MayorsCabin(void) { sub_080575C8(32); } @@ -921,11 +921,11 @@ u32 sub_unk3_Dojos_ToScarblade(void) { void sub_StateChange_Dojos_ToScarblade(void) { } -u32 sub_unk3_GoronCave_StairsToCave(void) { +u32 sub_unk3_GoronCave_Stairs(void) { return 1; } -void sub_StateChange_GoronCave_StairsToCave(void) { +void sub_StateChange_GoronCave_Stairs(void) { } u32 sub_unk3_GoronCave_Main(void) { @@ -1515,11 +1515,11 @@ void sub_StateChange_MinishHouseInteriors_HyruleFieldSouthwest(void) { sub_0801AFE4(); } -u32 sub_unk3_MinishHouseInteriors_HyruleFieldOutsideLinksHouse(void) { +u32 sub_unk3_MinishHouseInteriors_SouthHyruleField(void) { return 1; } -void sub_StateChange_MinishHouseInteriors_HyruleFieldOutsideLinksHouse(void) { +void sub_StateChange_MinishHouseInteriors_SouthHyruleField(void) { sub_0801AFE4(); } @@ -1891,13 +1891,13 @@ u32 sub_unk3_MinishCracks_5(void) { void sub_StateChange_MinishCracks_5(void) { } -u32 sub_unk3_MinishCracks_CastleWildsBowHole(void) { +u32 sub_unk3_MinishCracks_CastorWildsBow(void) { return 1; } extern EntityData gUnk_080DCB10; -void sub_StateChange_MinishCracks_CastleWildsBowHole(void) { +void sub_StateChange_MinishCracks_CastorWildsBow(void) { if (!GetInventoryValue(ITEM_BOW)) { LoadRoomEntityList(&gUnk_080DCB10); } @@ -3174,18 +3174,18 @@ void sub_StateChange_RoyalCrypt_Entrance(void) { } } -u32 sub_unk3_PalaceOfWinds_0(void) { +u32 sub_unk3_PalaceOfWinds_GyorgTornado(void) { return 1; } -extern EntityData gUnk_additional_9_PalaceOfWinds_0; +extern EntityData gUnk_additional_9_PalaceOfWinds_GyorgTornado; extern EntityData gUnk_080E72C4; -extern EntityData gUnk_additional_8_PalaceOfWinds_0; +extern EntityData gUnk_additional_8_PalaceOfWinds_GyorgTornado; -void sub_StateChange_PalaceOfWinds_0(void) { +void sub_StateChange_PalaceOfWinds_GyorgTornado(void) { Manager19_Main(NULL); if (CheckGlobalFlag(LV5_CLEAR)) { - LoadRoomEntityList(&gUnk_additional_9_PalaceOfWinds_0); + LoadRoomEntityList(&gUnk_additional_9_PalaceOfWinds_GyorgTornado); } if (!CheckLocalFlag(0x7b)) { LoadRoomEntityList(&gUnk_080E72C4); @@ -3193,402 +3193,402 @@ void sub_StateChange_PalaceOfWinds_0(void) { SetGlobalFlag(LV5_CLEAR); if (!GetInventoryValue(ITEM_WIND_ELEMENT)) { SetPlayerControl(3); - LoadRoomEntityList(&gUnk_additional_8_PalaceOfWinds_0); + LoadRoomEntityList(&gUnk_additional_8_PalaceOfWinds_GyorgTornado); gArea.bgm = gArea.queued_bgm; SoundReq(SONG_STOP_BGM); } } } -u32 sub_unk3_PalaceOfWinds_1(void) { +u32 sub_unk3_PalaceOfWinds_BossKey(void) { return 1; } -void sub_StateChange_PalaceOfWinds_1(void) { +void sub_StateChange_PalaceOfWinds_BossKey(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_2(void) { +u32 sub_unk3_PalaceOfWinds_BeforeBallAndChainSoldiers(void) { return 1; } -void sub_StateChange_PalaceOfWinds_2(void) { +void sub_StateChange_PalaceOfWinds_BeforeBallAndChainSoldiers(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_3(void) { +u32 sub_unk3_PalaceOfWinds_GyorgBossDoor(void) { return 1; } -void sub_StateChange_PalaceOfWinds_3(void) { +void sub_StateChange_PalaceOfWinds_GyorgBossDoor(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_4(void) { +u32 sub_unk3_PalaceOfWinds_EastChestFromGyorgBossDoor(void) { return 1; } -void sub_StateChange_PalaceOfWinds_4(void) { +void sub_StateChange_PalaceOfWinds_EastChestFromGyorgBossDoor(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_5(void) { +u32 sub_unk3_PalaceOfWinds_MoblinAndWizzrobeFight(void) { return 1; } -void sub_StateChange_PalaceOfWinds_5(void) { +void sub_StateChange_PalaceOfWinds_MoblinAndWizzrobeFight(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_6(void) { +u32 sub_unk3_PalaceOfWinds_FourButtonStalfos(void) { return 1; } -void sub_StateChange_PalaceOfWinds_6(void) { +void sub_StateChange_PalaceOfWinds_FourButtonStalfos(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_7(void) { +u32 sub_unk3_PalaceOfWinds_FanAndKeyToBossKey(void) { return 1; } -void sub_StateChange_PalaceOfWinds_7(void) { +void sub_StateChange_PalaceOfWinds_FanAndKeyToBossKey(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_8(void) { +u32 sub_unk3_PalaceOfWinds_BallAndChainSoldiers(void) { return 1; } -void sub_StateChange_PalaceOfWinds_8(void) { +void sub_StateChange_PalaceOfWinds_BallAndChainSoldiers(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_9(void) { +u32 sub_unk3_PalaceOfWinds_BombarossaPath(void) { return 1; } -void sub_StateChange_PalaceOfWinds_9(void) { +void sub_StateChange_PalaceOfWinds_BombarossaPath(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_10(void) { +u32 sub_unk3_PalaceOfWinds_HoleToDarknut(void) { return 1; } -void sub_StateChange_PalaceOfWinds_10(void) { +void sub_StateChange_PalaceOfWinds_HoleToDarknut(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_11(void) { +u32 sub_unk3_PalaceOfWinds_ToBombarossaPath(void) { return 1; } -void sub_StateChange_PalaceOfWinds_11(void) { +void sub_StateChange_PalaceOfWinds_ToBombarossaPath(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_12(void) { +u32 sub_unk3_PalaceOfWinds_DarknutMiniboss(void) { return 1; } -void sub_StateChange_PalaceOfWinds_12(void) { +void sub_StateChange_PalaceOfWinds_DarknutMiniboss(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_13(void) { +u32 sub_unk3_PalaceOfWinds_BombWallInside(void) { return 1; } -void sub_StateChange_PalaceOfWinds_13(void) { +void sub_StateChange_PalaceOfWinds_BombWallInside(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_14(void) { +u32 sub_unk3_PalaceOfWinds_BombWallOutside(void) { return 1; } -void sub_StateChange_PalaceOfWinds_14(void) { +void sub_StateChange_PalaceOfWinds_BombWallOutside(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_15(void) { +u32 sub_unk3_PalaceOfWinds_CloudJumps(void) { return 1; } -void sub_StateChange_PalaceOfWinds_15(void) { +void sub_StateChange_PalaceOfWinds_CloudJumps(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_16(void) { +u32 sub_unk3_PalaceOfWinds_BlockMazeToBossDoor(void) { return 1; } -void sub_StateChange_PalaceOfWinds_16(void) { +void sub_StateChange_PalaceOfWinds_BlockMazeToBossDoor(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_17(void) { +u32 sub_unk3_PalaceOfWinds_CrackedFloorLakitu(void) { return 1; } -void sub_StateChange_PalaceOfWinds_17(void) { +void sub_StateChange_PalaceOfWinds_CrackedFloorLakitu(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_18(void) { +u32 sub_unk3_PalaceOfWinds_HeartPieceBridge(void) { return 1; } -void sub_StateChange_PalaceOfWinds_18(void) { +void sub_StateChange_PalaceOfWinds_HeartPieceBridge(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_19(void) { +u32 sub_unk3_PalaceOfWinds_FanBridge(void) { return 1; } -void sub_StateChange_PalaceOfWinds_19(void) { +void sub_StateChange_PalaceOfWinds_FanBridge(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_20(void) { +u32 sub_unk3_PalaceOfWinds_ToFanBridge(void) { return 1; } -void sub_StateChange_PalaceOfWinds_20(void) { +void sub_StateChange_PalaceOfWinds_ToFanBridge(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_21(void) { +u32 sub_unk3_PalaceOfWinds_RedWarpHall(void) { return 1; } -void sub_StateChange_PalaceOfWinds_21(void) { +void sub_StateChange_PalaceOfWinds_RedWarpHall(void) { } -u32 sub_unk3_PalaceOfWinds_22(void) { +u32 sub_unk3_PalaceOfWinds_PlatformCloneRide(void) { return 1; } -void sub_StateChange_PalaceOfWinds_22(void) { +void sub_StateChange_PalaceOfWinds_PlatformCloneRide(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_23(void) { +u32 sub_unk3_PalaceOfWinds_PitCornerAfterKey(void) { return 1; } -void sub_StateChange_PalaceOfWinds_23(void) { +void sub_StateChange_PalaceOfWinds_PitCornerAfterKey(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_24(void) { +u32 sub_unk3_PalaceOfWinds_CrowRide(void) { return 1; } -void sub_StateChange_PalaceOfWinds_24(void) { +void sub_StateChange_PalaceOfWinds_CrowRide(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_25(void) { +u32 sub_unk3_PalaceOfWinds_GratePlatformRide(void) { return 1; } -void sub_StateChange_PalaceOfWinds_25(void) { +void sub_StateChange_PalaceOfWinds_GratePlatformRide(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_26(void) { +u32 sub_unk3_PalaceOfWinds_PotPush(void) { return 1; } -void sub_StateChange_PalaceOfWinds_26(void) { +void sub_StateChange_PalaceOfWinds_PotPush(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_27(void) { +u32 sub_unk3_PalaceOfWinds_FloormasterLever(void) { return 1; } -void sub_StateChange_PalaceOfWinds_27(void) { +void sub_StateChange_PalaceOfWinds_FloormasterLever(void) { } -u32 sub_unk3_PalaceOfWinds_28(void) { +u32 sub_unk3_PalaceOfWinds_Map(void) { return 1; } -void sub_StateChange_PalaceOfWinds_28(void) { +void sub_StateChange_PalaceOfWinds_Map(void) { } -u32 sub_unk3_PalaceOfWinds_29(void) { +u32 sub_unk3_PalaceOfWinds_CornerToMap(void) { return 1; } -void sub_StateChange_PalaceOfWinds_29(void) { +void sub_StateChange_PalaceOfWinds_CornerToMap(void) { } -u32 sub_unk3_PalaceOfWinds_30(void) { +u32 sub_unk3_PalaceOfWinds_StairsAfterFloormaster(void) { return 1; } -void sub_StateChange_PalaceOfWinds_30(void) { +void sub_StateChange_PalaceOfWinds_StairsAfterFloormaster(void) { } -u32 sub_unk3_PalaceOfWinds_31(void) { +u32 sub_unk3_PalaceOfWinds_HoleToKinstoneWizzrobe(void) { return 1; } -void sub_StateChange_PalaceOfWinds_31(void) { +void sub_StateChange_PalaceOfWinds_HoleToKinstoneWizzrobe(void) { } -u32 sub_unk3_PalaceOfWinds_32(void) { +u32 sub_unk3_PalaceOfWinds_KeyArrowButton(void) { return 1; } -void sub_StateChange_PalaceOfWinds_32(void) { +void sub_StateChange_PalaceOfWinds_KeyArrowButton(void) { } -u32 sub_unk3_PalaceOfWinds_33(void) { +u32 sub_unk3_PalaceOfWinds_GratesTo3F(void) { return 1; } -void sub_StateChange_PalaceOfWinds_33(void) { +void sub_StateChange_PalaceOfWinds_GratesTo3F(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_34(void) { +u32 sub_unk3_PalaceOfWinds_SpinyFight(void) { return 1; } -void sub_StateChange_PalaceOfWinds_34(void) { +void sub_StateChange_PalaceOfWinds_SpinyFight(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_35(void) { +u32 sub_unk3_PalaceOfWinds_PeahatSwitch(void) { return 1; } -void sub_StateChange_PalaceOfWinds_35(void) { +void sub_StateChange_PalaceOfWinds_PeahatSwitch(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_36(void) { +u32 sub_unk3_PalaceOfWinds_WhirlwindBombarossa(void) { return 1; } -void sub_StateChange_PalaceOfWinds_36(void) { +void sub_StateChange_PalaceOfWinds_WhirlwindBombarossa(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_37(void) { +u32 sub_unk3_PalaceOfWinds_DoorToStalfosFirebar(void) { return 1; } -void sub_StateChange_PalaceOfWinds_37(void) { +void sub_StateChange_PalaceOfWinds_DoorToStalfosFirebar(void) { } -u32 sub_unk3_PalaceOfWinds_38(void) { +u32 sub_unk3_PalaceOfWinds_StalfosFireborHole(void) { return 1; } -void sub_StateChange_PalaceOfWinds_38(void) { +void sub_StateChange_PalaceOfWinds_StalfosFireborHole(void) { } -u32 sub_unk3_PalaceOfWinds_39(void) { +u32 sub_unk3_PalaceOfWinds_ShortcutDoorButtons(void) { return 1; } -void sub_StateChange_PalaceOfWinds_39(void) { +void sub_StateChange_PalaceOfWinds_ShortcutDoorButtons(void) { } -u32 sub_unk3_PalaceOfWinds_40(void) { +u32 sub_unk3_PalaceOfWinds_ToPeahatSwitch(void) { return 1; } -void sub_StateChange_PalaceOfWinds_40(void) { +void sub_StateChange_PalaceOfWinds_ToPeahatSwitch(void) { } -u32 sub_unk3_PalaceOfWinds_41(void) { +u32 sub_unk3_PalaceOfWinds_KinstoneWizzrobeFight(void) { return 1; } -void sub_StateChange_PalaceOfWinds_41(void) { +void sub_StateChange_PalaceOfWinds_KinstoneWizzrobeFight(void) { } -u32 sub_unk3_PalaceOfWinds_42(void) { +u32 sub_unk3_PalaceOfWinds_GibdoStairs(void) { return 1; } -void sub_StateChange_PalaceOfWinds_42(void) { +void sub_StateChange_PalaceOfWinds_GibdoStairs(void) { } -u32 sub_unk3_PalaceOfWinds_43(void) { +u32 sub_unk3_PalaceOfWinds_SpikeBarSmallKey(void) { return 1; } -void sub_StateChange_PalaceOfWinds_43(void) { +void sub_StateChange_PalaceOfWinds_SpikeBarSmallKey(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_44(void) { +u32 sub_unk3_PalaceOfWinds_RocCape(void) { return 1; } extern EntityData gUnk_080EA09C; -void sub_StateChange_PalaceOfWinds_44(void) { +void sub_StateChange_PalaceOfWinds_RocCape(void) { Manager19_Main(NULL); if (!CheckLocalFlag(0x70)) { LoadRoomEntityList(&gUnk_080EA09C); } } -u32 sub_unk3_PalaceOfWinds_45(void) { +u32 sub_unk3_PalaceOfWinds_FireBarGrates(void) { return 1; } -void sub_StateChange_PalaceOfWinds_45(void) { +void sub_StateChange_PalaceOfWinds_FireBarGrates(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_46(void) { +u32 sub_unk3_PalaceOfWinds_PlatformRideBombarossas(void) { return 1; } -void sub_StateChange_PalaceOfWinds_46(void) { +void sub_StateChange_PalaceOfWinds_PlatformRideBombarossas(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_47(void) { +u32 sub_unk3_PalaceOfWinds_BridgeAfterDarknut(void) { return 1; } -void sub_StateChange_PalaceOfWinds_47(void) { +void sub_StateChange_PalaceOfWinds_BridgeAfterDarknut(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_48(void) { +u32 sub_unk3_PalaceOfWinds_BridgeSwitchesCloneBlock(void) { return 1; } -void sub_StateChange_PalaceOfWinds_48(void) { +void sub_StateChange_PalaceOfWinds_BridgeSwitchesCloneBlock(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_49(void) { +u32 sub_unk3_PalaceOfWinds_EntranceRoom(void) { return 1; } -void sub_StateChange_PalaceOfWinds_49(void) { +void sub_StateChange_PalaceOfWinds_EntranceRoom(void) { Manager19_Main(NULL); } -u32 sub_unk3_PalaceOfWinds_50(void) { +u32 sub_unk3_PalaceOfWinds_DarkCompassHall(void) { return 1; } -void sub_StateChange_PalaceOfWinds_50(void) { +void sub_StateChange_PalaceOfWinds_DarkCompassHall(void) { } u32 sub_unk3_PalaceOfWindsBoss_Main(void) { @@ -3779,7 +3779,7 @@ void sub_StateChange_Dojos_ToGrimblade6(void) { extern u32 gUnk_080EB604; extern u32 gUnk_080EB5D4; -u32 sub_unk3_DarkHyruleCastle_0(void) { +u32 sub_unk3_DarkHyruleCastle_1FEntrance(void) { if (CheckGlobalFlag(ENDING)) { gRoomVars.field_0x6c[0] = &gUnk_080EB604; gRoomVars.field_0x6c[2] = 0; @@ -3796,7 +3796,7 @@ u32 sub_unk3_DarkHyruleCastle_0(void) { return 1; } -void sub_StateChange_DarkHyruleCastle_0(void) { +void sub_StateChange_DarkHyruleCastle_1FEntrance(void) { if (CheckGlobalFlag(ENDING)) { gArea.queued_bgm = gArea.bgm; } @@ -3816,42 +3816,42 @@ static void sub_0804D9B0(void) { gArea.queued_bgm = gArea.bgm; } -u32 sub_unk3_DarkHyruleCastle_1(void) { +u32 sub_unk3_DarkHyruleCastle_3FTopLeftTower(void) { return 1; } void sub_StateChange_Dojos_ToGrimblade7(void) { } -u32 sub_unk3_DarkHyruleCastle_2(void) { +u32 sub_unk3_DarkHyruleCastle_3FTopRightTower(void) { return 1; } void sub_StateChange_Dojos_ToGrimblade8(void) { } -u32 sub_unk3_DarkHyruleCastle_3(void) { +u32 sub_unk3_DarkHyruleCastle_3FBottomLeftTower(void) { return 1; } void sub_StateChange_Dojos_ToGrimblade9(void) { } -u32 sub_unk3_DarkHyruleCastle_4(void) { +u32 sub_unk3_DarkHyruleCastle_3FBottomRightTower(void) { return 1; } void sub_StateChange_Dojos_ToSplitblade0(void) { } -u32 sub_unk3_DarkHyruleCastle_5(void) { +u32 sub_unk3_DarkHyruleCastle_3FKeatonHallToVaati(void) { return 1; } void sub_StateChange_Dojos_ToSplitblade1(void) { } -u32 sub_unk3_DarkHyruleCastle_6(void) { +u32 sub_unk3_DarkHyruleCastle_3FTripleDarknut(void) { if (!CheckLocalFlag(0x77)) { gRoomVars.field_0x6c[0] = 0; gRoomVars.field_0x6c[2] = 0; @@ -3863,7 +3863,7 @@ extern EntityData gUnk_080EB9F4; extern EntityData gUnk_080EBAA4; extern EntityData gUnk_080EBAF4; -void sub_StateChange_DarkHyruleCastle_6(void) { +void sub_StateChange_DarkHyruleCastle_3FTripleDarknut(void) { if (!CheckLocalFlag(0x77)) { LoadRoomEntityList(&gUnk_080EB9F4); } else { @@ -3878,173 +3878,173 @@ void sub_StateChange_DarkHyruleCastle_6(void) { } } -u32 sub_unk3_DarkHyruleCastle_7(void) { +u32 sub_unk3_DarkHyruleCastle_2FTopLeftTower(void) { return 1; } void sub_StateChange_Dojos_ToSplitblade2(void) { } -u32 sub_unk3_DarkHyruleCastle_8(void) { +u32 sub_unk3_DarkHyruleCastle_2FTopLeftCorner(void) { return 1; } void sub_StateChange_Dojos_ToSplitblade3(void) { } -u32 sub_unk3_DarkHyruleCastle_9(void) { +u32 sub_unk3_DarkHyruleCastle_2FBossKey(void) { return 1; } void sub_StateChange_Dojos_ToSplitblade4(void) { } -u32 sub_unk3_DarkHyruleCastle_10(void) { +u32 sub_unk3_DarkHyruleCastle_2FBlueWarp(void) { return 1; } void sub_StateChange_Dojos_ToSplitblade5(void) { } -u32 sub_unk3_DarkHyruleCastle_11(void) { +u32 sub_unk3_DarkHyruleCastle_2FTopRightCornerGhini(void) { return 1; } void sub_StateChange_Dojos_ToSplitblade6(void) { } -u32 sub_unk3_DarkHyruleCastle_12(void) { +u32 sub_unk3_DarkHyruleCastle_2FTopRightCornerTorches(void) { return 1; } void sub_StateChange_Dojos_ToSplitblade7(void) { } -u32 sub_unk3_DarkHyruleCastle_13(void) { +u32 sub_unk3_DarkHyruleCastle_2FTopRightTower(void) { return 1; } void sub_StateChange_Dojos_ToSplitblade8(void) { } -u32 sub_unk3_DarkHyruleCastle_14(void) { +u32 sub_unk3_DarkHyruleCastle_2FTopLeftDarknut(void) { return 1; } extern EntityData gUnk_080EC2CC; -void sub_StateChange_DarkHyruleCastle_14(void) { +void sub_StateChange_DarkHyruleCastle_2FTopLeftDarknut(void) { if (CheckLocalFlag(0x86) && !CheckLocalFlag(0x4c)) { LoadRoomEntityList(&gUnk_080EC2CC); } } -u32 sub_unk3_DarkHyruleCastle_15(void) { +u32 sub_unk3_DarkHyruleCastle_2FSparks(void) { return 1; } void sub_StateChange_Dojos_ToSplitblade9(void) { } -u32 sub_unk3_DarkHyruleCastle_16(void) { +u32 sub_unk3_DarkHyruleCastle_2FTopRightDarknuts(void) { return 1; } extern EntityData gUnk_080EC4E8; -void sub_StateChange_DarkHyruleCastle_16(void) { +void sub_StateChange_DarkHyruleCastle_2FTopRightDarknuts(void) { if (CheckLocalFlag(0x86) && !CheckLocalFlag(0x4d)) { LoadRoomEntityList(&gUnk_080EC4E8); } } -u32 sub_unk3_DarkHyruleCastle_17(void) { +u32 sub_unk3_DarkHyruleCastle_2FLeft(void) { return 1; } void sub_StateChange_Dojos_ToGreatblade0(void) { } -u32 sub_unk3_DarkHyruleCastle_18(void) { +u32 sub_unk3_DarkHyruleCastle_2FRight(void) { return 1; } void sub_StateChange_Dojos_ToGreatblade1(void) { } -u32 sub_unk3_DarkHyruleCastle_19(void) { +u32 sub_unk3_DarkHyruleCastle_2FBottomLeftDarknuts(void) { return 1; } extern EntityData gUnk_080EC820; -void sub_StateChange_DarkHyruleCastle_19(void) { +void sub_StateChange_DarkHyruleCastle_2FBottomLeftDarknuts(void) { if (CheckLocalFlag(0x86) && !CheckLocalFlag(0x53)) { LoadRoomEntityList(&gUnk_080EC820); } } -u32 sub_unk3_DarkHyruleCastle_20(void) { +u32 sub_unk3_DarkHyruleCastle_2FBossDoor(void) { return 1; } void sub_StateChange_Dojos_ToGreatblade2(void) { } -u32 sub_unk3_DarkHyruleCastle_21(void) { +u32 sub_unk3_DarkHyruleCastle_2FBottomRightDarknut(void) { return 1; } extern EntityData gUnk_080ECA60; -void sub_StateChange_DarkHyruleCastle_21(void) { +void sub_StateChange_DarkHyruleCastle_2FBottomRightDarknut(void) { if (CheckLocalFlag(0x86) && !CheckLocalFlag(0x56)) { LoadRoomEntityList(&gUnk_080ECA60); } } -u32 sub_unk3_DarkHyruleCastle_22(void) { +u32 sub_unk3_DarkHyruleCastle_2FBottomLeftCornerPuzzle(void) { return 1; } void sub_StateChange_Dojos_ToGreatblade3(void) { } -u32 sub_unk3_DarkHyruleCastle_23(void) { +u32 sub_unk3_DarkHyruleCastle_2FEntrance(void) { return 1; } void sub_StateChange_Dojos_ToGreatblade4(void) { } -u32 sub_unk3_DarkHyruleCastle_24(void) { +u32 sub_unk3_DarkHyruleCastle_2FBottomLeftCorner(void) { return 1; } void sub_StateChange_Dojos_ToGreatblade5(void) { } -u32 sub_unk3_DarkHyruleCastle_25(void) { +u32 sub_unk3_DarkHyruleCastle_2FBottomLeftTower(void) { return 1; } void sub_StateChange_Dojos_ToGreatblade6(void) { } -u32 sub_unk3_DarkHyruleCastle_26(void) { +u32 sub_unk3_DarkHyruleCastle_2FBottomLeftGhini(void) { return 1; } void sub_StateChange_Dojos_ToGreatblade7(void) { } -u32 sub_unk3_DarkHyruleCastle_27(void) { +u32 sub_unk3_DarkHyruleCastle_3FTopRightTower7(void) { return 1; } void sub_StateChange_Dojos_ToGreatblade8(void) { } -u32 sub_unk3_DarkHyruleCastle_28(void) { +u32 sub_unk3_DarkHyruleCastle_B1Entrance(void) { if (CheckLocalFlag(0x79)) { gRoomVars.field_0x6c[2] = 0; } @@ -4053,7 +4053,7 @@ u32 sub_unk3_DarkHyruleCastle_28(void) { extern EntityData gUnk_080ECFCC; -void sub_StateChange_DarkHyruleCastle_28(void) { +void sub_StateChange_DarkHyruleCastle_B1Entrance(void) { if (CheckLocalFlag(0x79)) { sub_0807BB98(0x90, 1, 1, 5); LoadRoomEntityList(&gUnk_080ECFCC); @@ -4061,14 +4061,14 @@ void sub_StateChange_DarkHyruleCastle_28(void) { } } -u32 sub_unk3_DarkHyruleCastle_29(void) { +u32 sub_unk3_DarkHyruleCastle_2FBottomRightTower(void) { return 1; } void sub_StateChange_Dojos_ToGreatblade9(void) { } -u32 sub_unk3_DarkHyruleCastle_30(void) { +u32 sub_unk3_DarkHyruleCastle_1FTopLeftTower(void) { return 1; } @@ -4077,7 +4077,7 @@ void sub_StateChange_Dojos_ToScarblade0(void) { extern u32 gUnk_080ED1E4; -u32 sub_unk3_DarkHyruleCastle_31(void) { +u32 sub_unk3_DarkHyruleCastle_1FThroneRoom(void) { if (CheckGlobalFlag(ENDING)) { gRoomVars.field_0x6c[0] = &gUnk_080ED1E4; gRoomVars.field_0x6c[2] = 0; @@ -4085,160 +4085,160 @@ u32 sub_unk3_DarkHyruleCastle_31(void) { return 1; } -void sub_StateChange_DarkHyruleCastle_31(void) { +void sub_StateChange_DarkHyruleCastle_1FThroneRoom(void) { if (CheckGlobalFlag(ENDING)) { gArea.queued_bgm = gArea.bgm; } } -u32 sub_unk3_DarkHyruleCastle_32(void) { +u32 sub_unk3_DarkHyruleCastle_1FCompass(void) { return 1; } void sub_StateChange_Dojos_ToScarblade1(void) { } -u32 sub_unk3_DarkHyruleCastle_33(void) { +u32 sub_unk3_DarkHyruleCastle_1FTopRightTower(void) { return 1; } void sub_StateChange_Dojos_ToScarblade2(void) { } -u32 sub_unk3_DarkHyruleCastle_34(void) { +u32 sub_unk3_DarkHyruleCastle_1FBeforeThrone(void) { return 1; } void sub_StateChange_Dojos_ToScarblade3(void) { } -u32 sub_unk3_DarkHyruleCastle_35(void) { +u32 sub_unk3_DarkHyruleCastle_1FLoopTopLeft(void) { return 1; } void sub_StateChange_Dojos_ToScarblade4(void) { } -u32 sub_unk3_DarkHyruleCastle_36(void) { +u32 sub_unk3_DarkHyruleCastle_1FLoopTop(void) { return 1; } void sub_StateChange_Dojos_ToScarblade5(void) { } -u32 sub_unk3_DarkHyruleCastle_37(void) { +u32 sub_unk3_DarkHyruleCastle_1FLoopTopRight(void) { return 1; } void sub_StateChange_Dojos_ToScarblade6(void) { } -u32 sub_unk3_DarkHyruleCastle_38(void) { +u32 sub_unk3_DarkHyruleCastle_1FLoopLeft(void) { return 1; } void sub_StateChange_Dojos_ToScarblade7(void) { } -u32 sub_unk3_DarkHyruleCastle_39(void) { +u32 sub_unk3_DarkHyruleCastle_1FLoopRight(void) { return 1; } void sub_StateChange_Dojos_ToScarblade8(void) { } -u32 sub_unk3_DarkHyruleCastle_40(void) { +u32 sub_unk3_DarkHyruleCastle_1FLoopBottomLeft(void) { return 1; } void sub_StateChange_Dojos_ToScarblade9(void) { } -u32 sub_unk3_DarkHyruleCastle_41(void) { +u32 sub_unk3_DarkHyruleCastle_1FLoopBottom(void) { return 1; } -void sub_StateChange_GoronCave_StairsToCave0(void) { +void sub_StateChange_GoronCave_Stairs0(void) { } -u32 sub_unk3_DarkHyruleCastle_42(void) { +u32 sub_unk3_DarkHyruleCastle_1FLoopBottomRight(void) { return 1; } -void sub_StateChange_GoronCave_StairsToCave1(void) { +void sub_StateChange_GoronCave_Stairs1(void) { } -u32 sub_unk3_DarkHyruleCastle_43(void) { +u32 sub_unk3_DarkHyruleCastle_1FBottomLeftTower(void) { return 1; } -void sub_StateChange_GoronCave_StairsToCave2(void) { +void sub_StateChange_GoronCave_Stairs2(void) { } -u32 sub_unk3_DarkHyruleCastle_44(void) { +u32 sub_unk3_DarkHyruleCastle_1FBottomRightTower(void) { return 1; } -void sub_StateChange_GoronCave_StairsToCave3(void) { +void sub_StateChange_GoronCave_Stairs3(void) { } -u32 sub_unk3_DarkHyruleCastle_45(void) { +u32 sub_unk3_DarkHyruleCastle_B1BelowThrone(void) { return 1; } -void sub_StateChange_GoronCave_StairsToCave4(void) { +void sub_StateChange_GoronCave_Stairs4(void) { } -u32 sub_unk3_DarkHyruleCastle_46(void) { +u32 sub_unk3_DarkHyruleCastle_B1BelowCompass(void) { return 1; } -void sub_StateChange_GoronCave_StairsToCave5(void) { +void sub_StateChange_GoronCave_Stairs5(void) { } -u32 sub_unk3_DarkHyruleCastle_47(void) { +u32 sub_unk3_DarkHyruleCastle_B1BeforeThrone(void) { return 1; } -void sub_StateChange_GoronCave_StairsToCave6(void) { +void sub_StateChange_GoronCave_Stairs6(void) { } -u32 sub_unk3_DarkHyruleCastle_48(void) { +u32 sub_unk3_DarkHyruleCastle_B1ToPrison(void) { return 1; } -void sub_StateChange_GoronCave_StairsToCave7(void) { +void sub_StateChange_GoronCave_Stairs7(void) { } -u32 sub_unk3_DarkHyruleCastle_49(void) { +u32 sub_unk3_DarkHyruleCastle_B1BombWall(void) { return 1; } -void sub_StateChange_GoronCave_StairsToCave8(void) { +void sub_StateChange_GoronCave_Stairs8(void) { } -u32 sub_unk3_DarkHyruleCastle_50(void) { +u32 sub_unk3_DarkHyruleCastle_B1Keatons(void) { return 1; } -void sub_StateChange_GoronCave_StairsToCave9(void) { +void sub_StateChange_GoronCave_Stairs9(void) { } -u32 sub_unk3_DarkHyruleCastle_51(void) { +u32 sub_unk3_DarkHyruleCastle_B1ToPrisonFirebar(void) { return 1; } void sub_StateChange_Ruins_Beanstalk0(void) { } -u32 sub_unk3_DarkHyruleCastle_52(void) { +u32 sub_unk3_DarkHyruleCastle_B1Cannons(void) { return 1; } void sub_StateChange_Ruins_Beanstalk1(void) { } -u32 sub_unk3_DarkHyruleCastle_53(void) { +u32 sub_unk3_DarkHyruleCastle_B1Left(void) { if (CheckLocalFlag(0x79)) { gRoomVars.field_0x6c[2] = 0; gRoomVars.field_0x6c[0] = 0; @@ -4248,7 +4248,7 @@ u32 sub_unk3_DarkHyruleCastle_53(void) { extern EntityData gUnk_080EE314; -void sub_StateChange_DarkHyruleCastle_53(void) { +void sub_StateChange_DarkHyruleCastle_B1Left(void) { if (CheckLocalFlag(0x79)) { sub_0807BB98(3, 2, 5, 1); LoadRoomEntityList(&gUnk_080EE314); @@ -4256,14 +4256,14 @@ void sub_StateChange_DarkHyruleCastle_53(void) { } } -u32 sub_unk3_DarkHyruleCastle_54(void) { +u32 sub_unk3_DarkHyruleCastle_B1Right(void) { return 1; } void sub_StateChange_Ruins_Beanstalk2(void) { } -u32 sub_unk3_DarkHyruleCastle_55(void) { +u32 sub_unk3_DarkHyruleCastle_B1Map(void) { if (CheckLocalFlag(0x79)) { gRoomVars.field_0x6c[2] = 0; } @@ -4272,7 +4272,7 @@ u32 sub_unk3_DarkHyruleCastle_55(void) { extern EntityData gUnk_080EE5DC; -void sub_StateChange_DarkHyruleCastle_55(void) { +void sub_StateChange_DarkHyruleCastle_B1Map(void) { if (CheckLocalFlag(0x79)) { sub_0807BB98(0x392, 2, 2, 5); LoadRoomEntityList(&gUnk_080EE5DC); @@ -4280,26 +4280,26 @@ void sub_StateChange_DarkHyruleCastle_55(void) { } } -u32 sub_unk3_DarkHyruleCastle_56(void) { +u32 sub_unk3_DarkHyruleCastle_B2ToPrison(void) { return 1; } void sub_StateChange_Ruins_Beanstalk3(void) { } -u32 sub_unk3_DarkHyruleCastle_57(void) { +u32 sub_unk3_DarkHyruleCastle_B2Prison(void) { return 1; } extern EntityData gUnk_080EE71C; -void sub_StateChange_DarkHyruleCastle_57(void) { +void sub_StateChange_DarkHyruleCastle_B2Prison(void) { if (CheckLocalFlag(1)) { LoadRoomEntityList(&gUnk_080EE71C); } } -u32 sub_unk3_DarkHyruleCastle_58(void) { +u32 sub_unk3_DarkHyruleCastle_B2Dropdown(void) { return 1; } @@ -4950,13 +4950,13 @@ void sub_StateChange_HouseInteriors2_Dampe(void) { } } -u32 sub_unk3_HouseInteriors2_Stockwell(void) { +u32 sub_unk3_HouseInteriors2_StockwellLakeHouse(void) { return 1; } extern EntityData gUnk_080F30CC; -void sub_StateChange_HouseInteriors2_Stockwell(void) { +void sub_StateChange_HouseInteriors2_StockwellLakeHouse(void) { if ((GetInventoryValue(ITEM_QST_DOGFOOD) == 1) && !CheckGlobalFlag(BIN_DOGFOOD) && (gPlayerState.flags & PL_MINISH) == 0) { LoadRoomEntityList(&gUnk_080F30CC); @@ -5053,13 +5053,13 @@ u32 sub_unk3_HouseInteriors4_FarmHouse(void) { void sub_StateChange_Ruins_LadderToTektites0(void) { } -u32 sub_unk3_HouseInteriors4_Mayor(void) { +u32 sub_unk3_HouseInteriors4_MayorLakeCabin(void) { return 1; } extern EntityData gUnk_080F3A48; -void sub_StateChange_HouseInteriors4_Mayor(void) { +void sub_StateChange_HouseInteriors4_MayorLakeCabin(void) { if (!GetInventoryValue(ITEM_FLIPPERS) && CheckGlobalFlag(MIZUKAKI_START) && !GetInventoryValue(ITEM_QST_BOOK3)) { LoadRoomEntityList(&gUnk_080F3A48); } @@ -5703,7 +5703,7 @@ void sub_StateChange_HyruleField_WesternWoodSouth(void) { Manager18_Main(0); } -u32 sub_unk3_HyruleField_LinksHouseExterior(void) { +u32 sub_unk3_HyruleField_SouthHyruleField(void) { #if defined(JP) || defined(EU) || defined(DEMO_JP) if (!CheckLocalFlag(0x6b)) { #else @@ -5719,7 +5719,7 @@ extern EntityData gUnk_080F70A8; extern EntityData gUnk_080F70D8; extern EntityData gUnk_080F7088; -void sub_StateChange_HyruleField_LinksHouseExterior(void) { +void sub_StateChange_HyruleField_SouthHyruleField(void) { Manager18_Main(NULL); #if defined(JP) || defined(EU) || defined(DEMO_JP) if (!CheckLocalFlag(0x6b)) { @@ -5740,31 +5740,31 @@ void sub_StateChange_HyruleField_LinksHouseExterior(void) { } } -void sub_unk1_HyruleField_LinksHouseExterior(void) { +void sub_unk1_HyruleField_SouthHyruleField(void) { if ((gSave.windcrests & 0x40000000) == 0) { LoadRoomEntityList(&gUnk_080F70D8); } } -u32 sub_unk3_HyruleField_FromMinishWoods(void) { +u32 sub_unk3_HyruleField_EasternHillsSouth(void) { return 1; } -void sub_StateChange_HyruleField_FromMinishWoods(void) { +void sub_StateChange_HyruleField_EasternHillsSouth(void) { Manager18_Main(NULL); } -u32 sub_unk3_HyruleField_FromMinishWoodsNorth(void) { +u32 sub_unk3_HyruleField_EasternHillsCenter(void) { return 1; } -void sub_StateChange_HyruleField_FromMinishWoodsNorth(void) { +void sub_StateChange_HyruleField_EasternHillsCenter(void) { Manager18_Main(NULL); } extern u32 gUnk_080F7680; -u32 sub_unk3_HyruleField_Farmers(void) { +u32 sub_unk3_HyruleField_EasternHillsNorth(void) { if (GetInventoryValue(ITEM_GUST_JAR) && !GetInventoryValue(ITEM_PACCI_CANE)) { gRoomVars.field_0x6c[2] = &gUnk_080F7680; } @@ -5774,7 +5774,7 @@ u32 sub_unk3_HyruleField_Farmers(void) { extern EntityData gUnk_080F7500; extern EntityData gUnk_080F7550; -void sub_StateChange_HyruleField_Farmers(void) { +void sub_StateChange_HyruleField_EasternHillsNorth(void) { Manager18_Main(NULL); if (gSave.global_progress > 3) { LoadRoomEntityList(&gUnk_080F7500); @@ -6030,26 +6030,26 @@ void sub_0804F9C8(void) { RestorePrevTileEntity(0x4d9, 1); } -u32 sub_unk3_HyruleField_OutsideCastleWest(void) { +u32 sub_unk3_HyruleField_TrilbyHighlands(void) { return 1; } extern EntityData gUnk_080F806C; -void sub_StateChange_HyruleField_OutsideCastleWest(void) { +void sub_StateChange_HyruleField_TrilbyHighlands(void) { Manager18_Main(NULL); if ((gSave.global_progress > 3) && CheckGlobalFlag(TINGLE_TALK1ST)) { LoadRoomEntityList(&gUnk_080F806C); } } -u32 sub_unk3_HyruleField_TrilbyHighlands(void) { +u32 sub_unk3_HyruleField_WesternWoodsNorth(void) { return 1; } extern EntityData gUnk_080F82E0; -void sub_StateChange_HyruleField_TrilbyHighlands(void) { +void sub_StateChange_HyruleField_WesternWoodsNorth(void) { Manager18_Main(NULL); #if defined(JP) || defined(EU) || defined(DEMO_JP) if (CheckGlobalFlag(LV2_CLEAR) && GetInventoryValue(ITEM_RED_SWORD) && !CheckLocalFlag(0x9b)) { @@ -6060,13 +6060,13 @@ void sub_StateChange_HyruleField_TrilbyHighlands(void) { } } -u32 sub_unk3_HyruleField_PercysHouse(void) { +u32 sub_unk3_HyruleField_WesternWoodsCenter(void) { return 1; } extern EntityData gUnk_080F8430; -void sub_StateChange_HyruleField_PercysHouse(void) { +void sub_StateChange_HyruleField_WesternWoodsCenter(void) { Manager18_Main(NULL); if (CheckKinstoneFused(0x21) && !CheckLocalFlagByBank(0x200, 0x42)) { LoadRoomEntityList(&gUnk_080F8430); @@ -6133,25 +6133,25 @@ u32 sub_unk3_Caves_6(void) { void sub_StateChange_Caves_6(void) { } -u32 sub_unk3_Caves_KeeseChest(void) { +u32 sub_unk3_Caves_TrilbyKeeseChest(void) { return 1; } -void sub_StateChange_Caves_KeeseChest(void) { +void sub_StateChange_Caves_TrilbyKeeseChest(void) { } -u32 sub_unk3_Caves_FairyFountainTrilbyHighlands(void) { +u32 sub_unk3_Caves_TrilbyFairyFountain(void) { return 1; } -void sub_StateChange_Caves_FairyFountainTrilbyHighlands(void) { +void sub_StateChange_Caves_TrilbyFairyFountain(void) { } -u32 sub_unk3_Caves_FairyFountainLinksHouse(void) { +u32 sub_unk3_Caves_SouthHyruleFieldFairyFountain(void) { return 1; } -void sub_StateChange_Caves_FairyFountainLinksHouse(void) { +void sub_StateChange_Caves_SouthHyruleFieldFairyFountain(void) { } u32 sub_unk3_Caves_A(void) { @@ -6204,31 +6204,31 @@ u32 sub_unk3_Caves_LonLonRanchWallet(void) { void sub_StateChange_Caves_LonLonRanchWallet(void) { } -u32 sub_unk3_Caves_RupeeLinksHouse(void) { +u32 sub_unk3_Caves_SouthHyruleFieldRupee(void) { return 1; } -void sub_StateChange_Caves_RupeeLinksHouse(void) { +void sub_StateChange_Caves_SouthHyruleFieldRupee(void) { } -u32 sub_unk3_Caves_RupeeTrilbyHighlands(void) { +u32 sub_unk3_Caves_TrilbyRupee(void) { return 1; } -void sub_StateChange_Caves_RupeeTrilbyHighlands(void) { +void sub_StateChange_Caves_TrilbyRupee(void) { } -u32 sub_unk3_Caves_FairyFountainMoleMitts(void) { +u32 sub_unk3_Caves_TrilbyMittsFairyFountain(void) { return 1; } -void sub_StateChange_Caves_FairyFountainMoleMitts(void) { +void sub_StateChange_Caves_TrilbyMittsFairyFountain(void) { } -u32 sub_unk3_Caves_KeeseChestSoutheastHyrule(void) { +u32 sub_unk3_Caves_HillsKeeseChest(void) { return 1; } -void sub_StateChange_Caves_KeeseChestSoutheastHyrule(void) { +void sub_StateChange_Caves_HillsKeeseChest(void) { } u32 sub_unk3_Caves_BottleBusinessScrub(void) { @@ -6245,11 +6245,11 @@ u32 sub_unk3_Caves_HeartPieceHallway(void) { void sub_StateChange_Caves_HeartPieceHallway(void) { } -u32 sub_unk3_Caves_FairyFountainBoomerang(void) { +u32 sub_unk3_Caves_NorthHyruleFieldFairyFountain(void) { return 1; } -void sub_StateChange_Caves_FairyFountainBoomerang(void) { +void sub_StateChange_Caves_NorthHyruleFieldFairyFountain(void) { } u32 sub_unk3_Caves_KinstoneBusinessScrub(void) { @@ -6542,11 +6542,11 @@ u32 sub_unk3_TreeInteriors_HeartPiece(void) { void sub_StateChange_TreeInteriors_HeartPiece(void) { } -u32 sub_unk3_TreeInteriors_StairsToBladeBrother(void) { +u32 sub_unk3_TreeInteriors_Waveblade(void) { return 1; } -void sub_StateChange_TreeInteriors_StairsToBladeBrother(void) { +void sub_StateChange_TreeInteriors_Waveblade(void) { } u32 sub_unk3_TreeInteriors_14(void) { @@ -6584,25 +6584,25 @@ u32 sub_unk3_TreeInteriors_BoomerangSoutheast(void) { void sub_StateChange_TreeInteriors_BoomerangSoutheast(void) { } -u32 sub_unk3_TreeInteriors_HeartPieceSouthwestField(void) { +u32 sub_unk3_TreeInteriors_WesternWoodsHeartPiece(void) { return 1; } -void sub_StateChange_TreeInteriors_HeartPieceSouthwestField(void) { +void sub_StateChange_TreeInteriors_WesternWoodsHeartPiece(void) { } -u32 sub_unk3_TreeInteriors_StairsToFairyFountain(void) { +u32 sub_unk3_TreeInteriors_NorthHyruleFieldFairyFountain(void) { return 1; } -void sub_StateChange_TreeInteriors_StairsToFairyFountain(void) { +void sub_StateChange_TreeInteriors_NorthHyruleFieldFairyFountain(void) { } -u32 sub_unk3_TreeInteriors_StairsToWalletFairy(void) { +u32 sub_unk3_TreeInteriors_MinishWoodsGreatFairy(void) { return 1; } -void sub_StateChange_TreeInteriors_StairsToWalletFairy(void) { +void sub_StateChange_TreeInteriors_MinishWoodsGreatFairy(void) { } u32 sub_unk3_TreeInteriors_1C(void) { @@ -6612,11 +6612,11 @@ u32 sub_unk3_TreeInteriors_1C(void) { void sub_StateChange_TreeInteriors_1C(void) { } -u32 sub_unk3_TreeInteriors_StairsToBusinessScrub(void) { +u32 sub_unk3_TreeInteriors_MinishWoodsBusinessScrub(void) { return 1; } -void sub_StateChange_TreeInteriors_StairsToBusinessScrub(void) { +void sub_StateChange_TreeInteriors_MinishWoodsBusinessScrub(void) { } u32 sub_unk3_TreeInteriors_1E(void) { @@ -6626,11 +6626,11 @@ u32 sub_unk3_TreeInteriors_1E(void) { void sub_StateChange_TreeInteriors_1E(void) { } -u32 sub_unk3_TreeInteriors_1F(void) { +u32 sub_unk3_TreeInteriors_UnusedHeartContainer(void) { return 1; } -void sub_StateChange_TreeInteriors_1F(void) { +void sub_StateChange_TreeInteriors_UnusedHeartContainer(void) { } extern u32 gUnk_080FAD48; @@ -6793,11 +6793,11 @@ u32 sub_unk3_CrenelCaves_MushroomKeese(void) { void sub_StateChange_CrenelCaves_MushroomKeese(void) { } -u32 sub_unk3_CrenelCaves_LadderToGreenWater(void) { +u32 sub_unk3_CrenelCaves_LadderToSpringWater(void) { return 1; } -void sub_StateChange_CrenelCaves_LadderToGreenWater(void) { +void sub_StateChange_CrenelCaves_LadderToSpringWater(void) { } u32 sub_unk3_CrenelCaves_BombBusinessScrub(void) { diff --git a/src/script.c b/src/script.c index a6a4e36c..1bdf1468 100644 --- a/src/script.c +++ b/src/script.c @@ -349,7 +349,7 @@ void ExecuteScriptForEntity(Entity* entity, void (*postScriptCallback)(Entity*, } else { HandlePostScriptActions(entity, *piVar1); } - if (!entity->next) { + if (entity->next == NULL) { DeleteThisEntity(); } } @@ -1884,7 +1884,7 @@ void sub_0807F78C(Entity* entity, ScriptExecutionContext* context) { msg = GetSaleItemConfirmMessageID(item); price = GetItemPrice(item); MessageNoOverlap(msg, entity); - gMessage.field_0x10 = (u16)price; + gMessage.rupees = (u16)price; } void sub_0807F7C4(Entity* entity, ScriptExecutionContext* context) { @@ -1929,7 +1929,7 @@ void sub_0807F854(Entity* entity, ScriptExecutionContext* context) { switch (idx) { case 0: case 1: - gMessage.field_0x10 = value; + gMessage.rupees = value; break; case 2: gMessage.field_0x14 = value; diff --git a/src/scroll.c b/src/scroll.c index e751a412..ba5986e4 100644 --- a/src/scroll.c +++ b/src/scroll.c @@ -7,23 +7,58 @@ #include "asm.h" #include "common.h" #include "fileselect.h" +#include "screen.h" extern void sub_08080BC4(void); +extern void sub_080197D4(const void*); +extern void sub_0807C8B0(u8*, u32, u32); +extern void sub_0801AB08(u8*, u8*); +extern void sub_0807C810(); +extern void DeleteSleepingEntities(void); +extern void sub_0807BBE4(); +extern void sub_0807BC84(); +extern void sub_0805E248(); extern u8 gUpdateVisibleTiles; - -extern void (*const gUnk_0811E768[])(RoomControls*); - +extern u16 gUnk_0200B640; +extern u32** gUnk_08109194[]; +extern u8 gMapDataTop[]; +extern u8 gMapDataBottom[]; +extern u8 gUnk_02022830[]; +extern u8 gUnk_020246B0[]; + +void sub_0807FC64(RoomControls*); void sub_0807FC7C(RoomControls*); -void sub_080805F8(void); - -extern void (*const gUnk_0811E780[])(RoomControls*); - -extern void (*const gUnk_0811E794[])(RoomControls*); +void sub_0807FDB0(RoomControls*); +void sub_0807FEF0(RoomControls*); +void sub_0807FF54(RoomControls*); +void sub_0807FDC8(RoomControls*); +void sub_0807FDE4(RoomControls*); +void sub_0807FDF8(RoomControls*); +void sub_0807FEC8(RoomControls*); +void sub_0807FF08(RoomControls*); +void sub_0807FF1C(RoomControls*); + +void sub_0807FF6C(RoomControls*); +void sub_0807FFE4(RoomControls*); +void sub_08080040(RoomControls*); +void sub_08080108(RoomControls*); +void sub_08080198(RoomControls*); +void sub_080801BC(RoomControls*); +void UpdateIsDiggingCave(void); +u32 sub_080803D0(); +u32 sub_08080278(); +void sub_08080C80(u32*); +void sub_08080368(); +void sub_08080B60(u8*); extern u8 gMapDataTopSpecial[]; void UpdateScroll(void) { + static void (*const gUnk_0811E768[])(RoomControls*) = { + sub_0807FC64, sub_0807FC7C, sub_0807FDB0, NULL, sub_0807FEF0, sub_0807FF54, + }; + gRoomControls.scroll_flags &= 0xfb; gUnk_0811E768[gRoomControls.unk3](&gRoomControls); } @@ -33,12 +68,17 @@ void sub_0807FC64(RoomControls* controls) { controls->reload_flags = 0; controls->unk5 = 4; sub_0807FC7C(controls); - sub_080805F8(); + UpdateIsDiggingCave(); } ASM_FUNC("asm/non_matching/scroll/sub_0807FC7C.inc", void sub_0807FC7C(RoomControls* controls)) void sub_0807FDB0(RoomControls* controls) { + static void (*const gUnk_0811E780[])(RoomControls*) = { + sub_0807FDC8, + sub_0807FDE4, + sub_0807FDF8, + }; gUnk_0811E780[controls->unk4](controls); } @@ -55,17 +95,70 @@ void sub_0807FDE4(RoomControls* controls) { gUpdateVisibleTiles = 2; } -ASM_FUNC("asm/non_matching/scroll/sub_0807FDF8.inc", void sub_0807FDF8()) +void sub_0807FDF8(RoomControls* controls) { + u32 bVar1; + Entity* pEVar2; + int iVar3; + + gUpdateVisibleTiles = 2; + controls->filler2[0]++; + switch (controls->scroll_direction) { + case 0: + controls->scroll_y -= 4; + pEVar2 = controls->camera_target; + if (pEVar2 == &gPlayerEntity) { + pEVar2->y.WORD = gPlayerEntity.y.WORD - 0x6000; + } + if (controls->filler2[0] == 0x28) { + sub_0807FEC8(controls); + } + break; + case 1: + controls->scroll_x = controls->scroll_x + 4; + if (controls->camera_target == &gPlayerEntity) { + gPlayerEntity.x.WORD += 0x4000; + } + if (controls->filler2[0] == 0x3c) { + sub_0807FEC8(controls); + } + break; + case 2: + controls->scroll_y = controls->scroll_y + 4; + pEVar2 = controls->camera_target; + if (pEVar2 == &gPlayerEntity) { + pEVar2->y.WORD = gPlayerEntity.y.WORD + 0x6000; + } + if (controls->filler2[0] == 0x28) { + sub_0807FEC8(controls); + } + break; + case 3: + controls->scroll_x -= 4; + if (controls->camera_target == &gPlayerEntity) { + gPlayerEntity.x.WORD -= 0x4000; + } + if (controls->filler2[0] == 0x3c) { + sub_0807FEC8(controls); + } + break; + } + + controls->shake_duration = 0; + sub_08080BC4(); +} void sub_0807FEC8(RoomControls* this) { this->unk3 = 0; - MemFill32(0xffffffff, gPlayerState.path_memory, 0x40); + MemFill32(0xffffffff, gPlayerState.path_memory, sizeof(gPlayerState.path_memory)); gPlayerState.startPosX = this->camera_target->x.HALF.HI; gPlayerState.startPosY = this->camera_target->y.HALF.HI; } void sub_0807FEF0(RoomControls* controls) { - extern void (*const gUnk_0811E78C[])(RoomControls*); + static void (*const gUnk_0811E78C[])(RoomControls*) = { + sub_0807FF08, + sub_0807FF1C, + }; gUnk_0811E78C[controls->unk4](controls); } @@ -86,16 +179,95 @@ void sub_0807FF1C(RoomControls* controls) { } void sub_0807FF54(RoomControls* controls) { + static void (*const gUnk_0811E794[])(RoomControls*) = { + sub_0807FF6C, sub_0807FFE4, sub_08080040, sub_08080108, sub_08080198, sub_080801BC, + }; gUnk_0811E794[controls->unk4](controls); } -ASM_FUNC("asm/non_matching/scroll/sub_0807FF6C.inc", void sub_0807FF6C()) +void sub_0807FF6C(RoomControls* controls) { + controls->unk4 = 1; + gScreen.lcd.displayControl |= DISPCNT_WIN1_ON; + gScreen.controls.windowInsideControl = (u8)gScreen.controls.windowInsideControl | 0x1700; + gScreen.controls.windowOutsideControl = (gScreen.controls.windowOutsideControl & 0xff00) | 7; + gScreen.controls.window1HorizontalDimensions = 0xf0; + gScreen.controls.window1VerticalDimensions = 0xf0; + ResetPlayer(); + ResetPlayerAnimationAndAction(); + if (gUnk_03004030.isDiggingCave) { + gPlayerEntity.animationState = 4; + } else { + gPlayerEntity.animationState = 0; + } + sub_080809D4(); +} -ASM_FUNC("asm/non_matching/scroll/sub_0807FFE4.inc", void sub_0807FFE4()) +void sub_0807FFE4(RoomControls* controls) { + controls->unk4 = 2; + controls->filler2[0] = sub_080803D0() + 6; + gUnk_0200B640 = sub_08080278(); + sub_080197D4(*gUnk_08109194[gUnk_03004030.unk_00->unk_03]); + sub_0807C8B0(gMapDataTop, controls->width >> 4, controls->height >> 4); + sub_0801AB08(gMapDataTopSpecial, gMapDataTop - 4); +} -ASM_FUNC("asm/non_matching/scroll/sub_08080040.inc", void sub_08080040()) +void sub_08080040(RoomControls* controls) { + int iVar2; + int iVar3; + int uVar5; + int uVar6; + int iVar7; + int temp; + + controls->filler2[0] -= 6; + controls->filler2[1] = (controls->filler2[0] << 1) / 3; + if (0x2a < controls->filler2[0]) { + iVar2 = controls->camera_target->x.HALF.HI - controls->scroll_x; + uVar6 = (iVar2 - controls->filler2[0]) + 8; + if (uVar6 < 0) { + uVar6 = 0; + } + iVar7 = iVar2 + controls->filler2[0] - 8; + if (0xf0 < iVar7) { + iVar7 = 0xf0; + } + temp = controls->camera_target->y.HALF.HI - controls->scroll_y; + uVar5 = (temp - controls->filler2[1]) + 8; + if (uVar5 < 0) { + uVar5 = 0; + } + iVar3 = temp + controls->filler2[1] - 8; + if (0xa0 < iVar3) { + iVar3 = 0xa0; + } + gScreen.controls.window1HorizontalDimensions = ((uVar6 & 0xff) << 8) | (iVar7 & 0xff); + gScreen.controls.window1VerticalDimensions = ((uVar5 & 0xff) << 8) | (iVar3 & 0xff); + } + if (controls->filler2[0] == 0) { + controls->unk4 = 3; + DeleteSleepingEntities(); + sub_0807C810(); + sub_08080C80(*(gUnk_08109194[gUnk_03004030.unk_00->unk_03] + 1)); + } else { + gUpdateVisibleTiles = 4; + } +} -ASM_FUNC("asm/non_matching/scroll/sub_08080108.inc", void sub_08080108()) +void sub_08080108(RoomControls* controls) { + controls->unk4 = 4; + MemCopy(gMapDataBottom, gMapDataBottom + 0x3000, 0x2000); + MemCopy(gMapDataTop, gMapDataTop + 0x3000, 0x2000); + sub_08080368(); + gUnk_02034480.unk_00 = gUnk_0200B640; + MemCopy(gUnk_02022830, gUnk_020246B0, 0x1800); + sub_08080B60(gMapDataBottom - 4); + sub_08080B60(gMapDataTop - 4); + sub_0807BBE4(); + sub_0807BC84(); + sub_0805E248(); + sub_0801AB08((u8*)&gMapDataBottomSpecial, gMapDataBottom - 4); + sub_0801AB08(gMapDataTopSpecial, gMapDataTop - 4); +} void sub_08080198(RoomControls* controls) { controls->unk4 = 5; @@ -103,35 +275,79 @@ void sub_08080198(RoomControls* controls) { LoadRoom(); CallRoomProp5And7(); gUpdateVisibleTiles = 0; - sub_080805F8(); + UpdateIsDiggingCave(); } -ASM_FUNC("asm/non_matching/scroll/sub_080801BC.inc", void sub_080801BC()) +void sub_080801BC(RoomControls* controls) { + int iVar2; + int iVar3; + int uVar5; + int uVar6; + int iVar7; + int temp; + + controls->filler2[0] += 6; + controls->filler2[1] = (controls->filler2[0] << 1) / 3; + if (0x1e < controls->filler2[0]) { + iVar2 = controls->camera_target->x.HALF.HI - controls->scroll_x; + uVar6 = (iVar2 - controls->filler2[0]); + if (uVar6 < 0) { + uVar6 = 0; + } + iVar7 = iVar2 + controls->filler2[0]; + if (0xf0 < iVar7) { + iVar7 = 0xf0; + } + temp = controls->camera_target->y.HALF.HI - controls->scroll_y; + uVar5 = (temp - controls->filler2[1]); + if (uVar5 < 0) { + uVar5 = 0; + } + iVar3 = temp + controls->filler2[1]; + if (0xa0 < iVar3) { + iVar3 = 0xa0; + } + gScreen.controls.window1HorizontalDimensions = ((uVar6 & 0xff) << 8) | (iVar7 & 0xff); + gScreen.controls.window1VerticalDimensions = ((uVar5 & 0xff) << 8) | (iVar3 & 0xff); + } + if (controls->filler2[2] == 0) { + controls->unk3 = 0; + controls->reload_flags = 0; + ResetSystemPriority(); + gScreen.lcd.displayControl &= ~DISPCNT_WIN1_ON; + gScreen.controls.windowInsideControl &= 0xff; + gScreen.controls.windowOutsideControl &= 0xff00; + } else { + gUpdateVisibleTiles = 4; + controls->filler2[2] = 0; + } +} -ASM_FUNC("asm/non_matching/scroll/sub_08080278.inc", void sub_08080278()) +ASM_FUNC("asm/non_matching/scroll/sub_08080278.inc", u32 sub_08080278()) ASM_FUNC("asm/non_matching/scroll/sub_08080368.inc", void sub_08080368()) -ASM_FUNC("asm/non_matching/scroll/sub_080803D0.inc", void sub_080803D0()) +ASM_FUNC("asm/non_matching/scroll/sub_080803D0.inc", u32 sub_080803D0()) -void sub_080805F8(void) { +void UpdateIsDiggingCave(void) { switch (gRoomControls.area) { - case 0xc: - case 0x0f: - case 0x13: - case 0x14: - case 0x16: - case 0x17: - case 0x19: - gUnk_03004030.unk_08 = 1; + case AREA_LAKE_WOODS_CAVE: + case AREA_HYRULE_DIG_CAVES: + case AREA_DIG_CAVES: + case AREA_CRENEL_DIG_CAVE: + case AREA_VEIL_FALLS_DIG_CAVE: + case AREA_CASTOR_WILDS_DIG_CAVE: + case AREA_HYLIA_DIG_CAVES: + gUnk_03004030.isDiggingCave = 1; return; } - gUnk_03004030.unk_08 = 0; + gUnk_03004030.isDiggingCave = 0; } void ClearTilemaps(void) { + // Is gRoomControls 4 bytes bigger? MemClear(&gRoomControls, 0x38); - MemClear(&gUnk_03004030, 0xc); + MemClear(&gUnk_03004030, sizeof(gUnk_03004030)); gRoomControls.filler3 = 0xffff; gUnk_03004030.unk_0a = 0xff; gUnk_02034480.unk_00 = 0; @@ -265,10 +481,10 @@ void sub_080809D4(void) { ASM_FUNC("asm/non_matching/scroll/UpdateDoorTransition.inc", void UpdateDoorTransition()) -ASM_FUNC("asm/non_matching/scroll/sub_08080B60.inc", void sub_08080B60()) +ASM_FUNC("asm/non_matching/scroll/sub_08080B60.inc", void sub_08080B60(u8* param_1)) ASM_FUNC("asm/non_matching/scroll/sub_08080BC4.inc", void sub_08080BC4()) -ASM_FUNC("asm/non_matching/scroll/sub_08080C80.inc", void sub_08080C80()) +ASM_FUNC("asm/non_matching/scroll/sub_08080C80.inc", void sub_08080C80(u32* param_1)) ASM_FUNC("asm/non_matching/scroll/sub_08080CB4.inc", void sub_08080CB4(Entity* a)) diff --git a/src/staffroll.c b/src/staffroll.c new file mode 100644 index 00000000..2a9077b4 --- /dev/null +++ b/src/staffroll.c @@ -0,0 +1,326 @@ +#include "global.h" +#include "room.h" +#include "main.h" +#include "save.h" +#include "flags.h" +#include "fileselect.h" +#include "screen.h" +#include "common.h" +#include "menu.h" +#include "game.h" +#include "subtask.h" + +typedef struct { + /*0x00*/ Menu base; + s16 unk_10; + u16 unk_12; + u16 unk_14; + u8 unk_16; + u8 unk_17; + u8 unk_18; + u8 unk_19; + u8 bgmMusicStarted; + u8 unk_1b[0x14]; + u8 unk_2f; +} StaffrollMenu; +#define gStaffrollMenu (*(StaffrollMenu*)&gMenu) + +const Font gUnk_08127280 = { + (u16*)0x02021f72, (void*)0x0600c400, gTextGfxBuffer, 0, 61472, 240, 0, 0, 0, 0, 0, 5, 0, 1, 0 +}; +const Font gUnk_08127298 = { + (u16*)0x02021f90, (void*)0x0600c400, gTextGfxBuffer, 0, 61472, 240, 0, 0, 0, 0, 0, 5, 0, 1, 0 +}; +const Font gUnk_081272B0 = { + (u16*)0x0202204e, (void*)0x0600c400, gTextGfxBuffer, 0, 61472, 240, 1, 0, 0, 0, 0, 5, 0, 1, 0 +}; +const Font gUnk_081272C8 = { + (u16*)0x020222ce, (void*)0x0600c400, gTextGfxBuffer, 0, 61472, 240, 1, 0, 0, 0, 0, 5, 0, 1, 0 +}; + +const Font* const gUnk_081272E0[] = { + &gUnk_08127280, + &gUnk_08127298, + &gUnk_081272B0, + &gUnk_081272C8, +}; + +// TODO figure out structure of gStaffrollMenu.base.field_0xc +extern u8 gUnk_081272F0[]; +extern u8 gUnk_08127644[]; +extern u8 gUnk_08127998[]; +extern const u8 gUnk_08127CEC[]; +extern void (*const gUnk_08127D00[])(void); +extern void (*const gUnk_08127D10[])(void); + +void sub_080A3954(void); + +void StaffrollTask(void) { + gRoomTransition.frameCount += 1; + gUnk_08127D00[gMain.state](); +} + +void StaffrollTask_State0(void) { + gSave.unk6 = 1; + SetGlobalFlag(GAMECLEAR); + gMain.state = 1; + gStaffrollMenu.base.menuType = 0; + gStaffrollMenu.base.transitionTimer = 0xb4; + gStaffrollMenu.unk_16 = 5; + gStaffrollMenu.unk_17 = 4; + gStaffrollMenu.bgmMusicStarted = 0; + if (gSaveHeader->language >= 2) { + gStaffrollMenu.base.field_0xc = gUnk_08127998; + } else { + if (gSaveHeader->language == 1) { + gStaffrollMenu.base.field_0xc = gUnk_08127644; + } else { + gStaffrollMenu.base.field_0xc = gUnk_081272F0; + } + } + DispReset(0); + LoadPaletteGroup(0xb); + LoadPaletteGroup(0xc); + SetColor(0, 0); + gScreen.lcd.displayControl = 0x640; + gScreen.controls.layerFXControl = 0x2442; + gScreen.controls.alphaBlend = 0x1000; + gScreen.bg1.control = 0x1e4d; + gScreen.bg2.control = 0x1dc3; + InitSoundPlayingInfo(); + ResetSystemPriority(); + SetFade(5, 0x100); +} + +void StaffrollTask_State1(void) { + gUnk_08127D10[gMenu.menuType](); +} + +void StaffrollTask_State1MenuType0(void) { + gMenu.transitionTimer -= 1; + if (gMenu.transitionTimer == 0) { + sub_080A3954(); + } +} + +void StaffrollTask_State1MenuType1(void) { + if (gFadeControl.active == 0) { + const u8* ptr = &gUnk_08127CEC[gStaffrollMenu.unk_10 * 2]; + LoadPaletteGroup(ptr[0]); + LoadGfxGroup(ptr[1]); + MemClear(&gBG1Buffer, 0x800); + gScreen.bg1.updated = 1; + gScreen.bg2.xOffset = gStaffrollMenu.unk_12; + gScreen.controls.alphaBlend = 0x1000; + gStaffrollMenu.base.menuType = 0; + if (gStaffrollMenu.bgmMusicStarted == 0) { + gStaffrollMenu.bgmMusicStarted = 1; + SoundReq(BGM_CREDITS); + } + SetFade(4, 8); + } +} + +void StaffrollTask_State1MenuType2(void) { + u8 tmp; + switch (gStaffrollMenu.base.overlayType) { + case 0: + MemClear(&gBG1Buffer, 0x800); + sub_0805F46C(gStaffrollMenu.unk_10, (Font*)gUnk_081272E0[gStaffrollMenu.unk_19]); + gScreen.bg1.updated = 1; + gStaffrollMenu.base.overlayType++; + gStaffrollMenu.unk_18 = 0; + break; + case 1: + if (gFadeControl.active != 0) { + return; + } + if ((gRoomTransition.frameCount & 1) != 0) { + return; + } + tmp = ++gStaffrollMenu.unk_18; + gScreen.controls.alphaBlend = (0x10 - tmp) * 0x100 | tmp; + if (gStaffrollMenu.unk_18 >= 0x10) { + gStaffrollMenu.base.overlayType++; + } + break; + case 2: + gStaffrollMenu.base.transitionTimer--; + if (gStaffrollMenu.base.transitionTimer == 0) { + gStaffrollMenu.base.overlayType++; + } + break; + case 3: + if ((gRoomTransition.frameCount & 1) != 0) { + return; + } + tmp = --gStaffrollMenu.unk_18; + gScreen.controls.alphaBlend = (0x10 - tmp) * 0x100 | tmp; + if (gStaffrollMenu.unk_18 == 0) { + gStaffrollMenu.base.overlayType++; + } + break; + default: + if (gFadeControl.active == 0) { + gFadeControl.mask = 0xffffffff; + sub_080A3954(); + } + break; + } +} + +void StaffrollTask_State1MenuType3(void) { + gMenu.transitionTimer--; + if (gMenu.transitionTimer == 0) { + sub_080A3954(); + SetFade(5, 8); + } +} + +void StaffrollTask_State1MenuType4(void) { + gFadeControl.mask = 0xffff7fff; + SetFade(5, 4); + SetFadeProgress(gMenu.transitionTimer); + sub_080A3954(); +} + +void StaffrollTask_State1MenuType5(void) { + SetFade(4, 4); + SetFadeProgress(gMenu.transitionTimer); + sub_080A3954(); +} + +void StaffrollTask_State1MenuType6(void) { + if (gFadeControl.active == 0) { + MemClear(&gBG1Buffer, 0x800); + gScreen.bg1.updated = 1; + MemClear(&gBG2Buffer, 0x800); + gScreen.bg2.updated = 1; + gScreen.controls.alphaBlend = 0x1000; + gMenu.menuType = 0; + SetFade(4, 8); + } +} + +void StaffrollTask_State1MenuType7(void) { + if (gFadeControl.active == 0) { + SetFade(7, 8); + gMain.state = 2; + } +} + +void sub_080A3954(void) { + u16* puVar1; + u16* puVar2; + u16* puVar3; + u8* pbVar4; + + puVar1 = (u16*)(gStaffrollMenu.base.field_0xc + 6); + puVar2 = (u16*)(gStaffrollMenu.base.field_0xc + 8); + puVar3 = (u16*)(gStaffrollMenu.base.field_0xc + 10); + pbVar4 = gStaffrollMenu.base.field_0xc + 1; + gStaffrollMenu.base.menuType = *gStaffrollMenu.base.field_0xc; + gStaffrollMenu.base.overlayType = 0; + gStaffrollMenu.unk_10 = *puVar1; + gStaffrollMenu.base.transitionTimer = *(u16*)(gStaffrollMenu.base.field_0xc + 4); + gStaffrollMenu.unk_12 = *puVar2; + gStaffrollMenu.unk_14 = *puVar3; + gStaffrollMenu.unk_19 = *pbVar4; + gStaffrollMenu.base.field_0xc += 0xc; +} + +void StaffrollTask_State3(void) { + if (gFadeControl.active == 0) { + DoSoftReset(); + } +} + +void StaffrollTask_State2(void) { + SaveResult saveResult; + u32 choice; + u32 tmp; + switch (gStaffrollMenu.base.overlayType) { + case 0: + gStaffrollMenu.base.overlayType = 1; + gStaffrollMenu.base.transitionTimer = 0x1e; + gStaffrollMenu.base.field_0x3 = 0; + DispReset(1); + InitSoundPlayingInfo(); + sub_080A4D34(); + LoadPaletteGroup(10); + SetColor(0, 0); + LoadGfxGroup(4); + MemClear((void*)VRAM, 0x20); + SetPopupState(0, 0); + gScreen.lcd.displayControl |= 0x600; + gScreen.bg1.control = 0x1c01; + gScreen.bg2.control = 0x1d05; + gScreen.bg2.updated = 1; + SetFade(4, 8); + break; + case 1: + if (gFadeControl.active == 0) { + if (gStaffrollMenu.base.transitionTimer != 0) { + gStaffrollMenu.base.transitionTimer--; + } else { + choice = gStaffrollMenu.base.field_0x3; + switch (gInput.newKeys) { + case 0x40: + choice = 0; + break; + case 0x80: + choice = 1; + break; + case 1: + if (choice != 0) { + tmp = 4; + } else { + CreateDialogBox(8, 0); + tmp = 2; + } + gStaffrollMenu.base.overlayType = tmp; + gStaffrollMenu.base.transitionTimer = 0x3c; + SoundReq(SFX_TEXTBOX_SELECT); + break; + } + if (gStaffrollMenu.base.field_0x3 != choice) { + gStaffrollMenu.base.field_0x3 = choice; + SetPopupState(0, choice); + SoundReq(SFX_TEXTBOX_CHOICE); + } + } + } + break; + case 2: + saveResult = HandleSave(0); + gStaffrollMenu.base.field_0x0 = saveResult; + switch (saveResult) { + case SAVE_OK: + gStaffrollMenu.base.overlayType = 4; + break; + case SAVE_ERROR: + gStaffrollMenu.base.transitionTimer = 0x3c; + CreateDialogBox(9, 0); + gStaffrollMenu.base.overlayType = 3; + break; + } + break; + case 3: + if (gStaffrollMenu.base.transitionTimer != 0) { + gStaffrollMenu.base.transitionTimer--; + } else { + if ((gInput.newKeys & 0xb) != 0) { + gStaffrollMenu.base.overlayType = 1; + } + } + break; + case 4: + default: + gScreen.lcd.displayControl &= 0xfdff; + sub_08050384(); + SetFade(7, 8); + gMain.state = 3; + gStaffrollMenu.base.overlayType = 0; + break; + } +} diff --git a/src/subtask2.c b/src/subtask2.c index 47542862..f27faf5e 100644 --- a/src/subtask2.c +++ b/src/subtask2.c @@ -11,8 +11,6 @@ #include "main.h" #include "message.h" -extern void CreateDialogBox(u32, u32); - extern u8 gUnk_08128D38[]; extern u8 gUnk_08128D43[]; @@ -4,6 +4,8 @@ #include "functions.h" #include "asm.h" #include "enemy.h" +#include "message.h" +#include "fileselect.h" extern u16 gUnk_081092D4; extern u8 gUnk_081094CE; @@ -17,6 +19,8 @@ typedef struct { extern VStruct gUnk_0810942E[]; extern u32 gUnk_0810926C[]; +extern u32* Translations[]; +extern u32 gUnk_08109244; typedef struct { u8 unk0; @@ -24,6 +28,599 @@ typedef struct { } UStruct; void sub_0805F820(WStruct* r0, u32* r1); +bool32 sub_0805EF40(Token* tok, const u8*); +void sub_0805F440(Token*, u8*); +u32 sub_0805F6A4(Token*, WStruct*); +u32 GetCharacter(Token* tok); +u32 GetFontStrWith(Token*, u32); +int sub_0805F67C(short*, int, int); +void sub_0805F918(u32, u32, void*); +bool32 sub_0805F5CC(Font*, Token*, WStruct*); +void sub_0805EEB4(Token*, u32); +u32 sub_0805EF8C(Token*); +u32 sub_0805EFB4(Token*); +u32 sub_0805F9A0(u32); + +typedef struct { + u16 unk0; + s8 unk2; + s8 unk3; + u8 filler[0x4]; + u16 unk8[4]; + u16 unk10[4]; +} struct_gUnk_02034330; + +extern struct_gUnk_02034330 gUnk_02034330; +extern WStruct gUnk_02036540[4]; +extern u32* gUnk_08109248[]; +extern u8* gUnk_08109230[]; +extern u32* gTranslations[]; +extern u32 gUnk_08109244; + +void sub_0805EEB4(Token* token, u32 textIndex) { + u32 langIndex; + u32* puVar2; + u8* puVar5; + int iVar3; + u32 uVar4; + u32 uVar6; + u32 uVar7; + + token->textIndex = (u16)textIndex; + langIndex = gSaveHeader->language; + if (((1 < langIndex) && (textIndex >> 8 == 1)) && (textIndex < 0x119)) { + langIndex = 3; + } + puVar2 = gTranslations[langIndex]; + iVar3 = puVar2[(u8)(textIndex >> 8)]; + puVar2 = (u32*)((int)puVar2 + iVar3); + iVar3 = puVar2[(u8)textIndex]; + uVar6 = *(gTranslations[langIndex]) >> 2; + uVar7 = *puVar2 >> 2; + uVar4 = 0; + if (((token->textIndex >> 8) >= uVar6) || ((u8)token->textIndex >= uVar7)) { + uVar4 = 1; + } else { + if (*(char*)((int)puVar2 + iVar3) == 0) { + uVar4 = 2; + } + } + switch (uVar4) { + case 1: + case 2: + puVar2 = &gUnk_08109244; + iVar3 = 0; + break; + } + puVar2 = (u32*)((int)puVar2 + iVar3); + sub_0805EF40(token, (u8*)puVar2); +} + +bool32 sub_0805EF40(Token* token, const u8* param_2) { + if (token->unk00 != 0) { + if (6 < token->unk01) { + return 0; + } + token->unk01++; + } + token->buf[token->unk01] = param_2; + token->unk00 = 1; + return 1; +} + +u32 sub_0805EF8C(Token* token) { + if (token->unk00 == 0) { + return 0; + } + return (token->buf[token->unk01]++)[0]; +} + +u32 sub_0805EFB4(Token* token) { + u32 rv = token->unk01; + + if (token->unk01 != 0) { + token->unk01--; + } else { + token->unk00 = 0; + } + return rv; +} + +u32 GetCharacter(Token* token) { + u32 uVar3; + u32 code; + u32 uVar6; + u8** ppuVar7; + int iVar8; + + do { + code = sub_0805EF8C(token); + token->code = (u8)code; + iVar8 = 0; + switch (code) { + case 0: + iVar8 = sub_0805EFB4(token); + code = 0; + break; + case 1: + uVar6 = sub_0805EF8C(token); + token->param = (u16)uVar6; + code = 6; + if (uVar6 < 0xb) { + code = 5; + } + break; + case 2: + uVar3 = sub_0805EF8C(token); + token->param = uVar3; + code = 7; + break; + case 3: + uVar6 = sub_0805EF8C(token) << 8; + uVar6 += sub_0805EF8C(token); + token->param = uVar6; + code = 8; + break; + case 4: + uVar6 = sub_0805EF8C(token); + switch (uVar6) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 0xb: + case 0xc: + case 0xd: + case 0xe: + case 0xf: + code = 9; + break; + case 0x10: + uVar6 = sub_0805EF8C(token); + code = 10; + break; + case 0x11: + code = 2; + break; + case 0x12: + code = 3; + break; + case 0x13: + code = 4; + break; + case 0x14: + case 0x15: + code = 0xb; + // This is a comparison to 0 but couldn't make it do the bit trick + uVar6 = (-(uVar6 ^ 0x14) | (uVar6 ^ 0x14)) >> 0x1f; + } + token->param = (u16)uVar6; + break; + case 5: + uVar6 = sub_0805EF8C(token); + if (uVar6 == 0xff) { + uVar6 = 0; + } else { + uVar6 <<= 8; + uVar6 += sub_0805EF8C(token); + } + token->_6 = uVar6; + code = 0xc; + break; + case 6: + uVar6 = sub_0805EF8C(token); + switch (uVar6) { + case 0 ... 4: + ppuVar7 = (u8**)token->_c; + if (ppuVar7 == NULL) { + ppuVar7 = gUnk_08109230; + } + sub_0805EF40(token, ppuVar7[uVar6]); + break; + case 5: + uVar6 = sub_0805EF8C(token) << 8; + uVar6 += sub_0805EF8C(token); + sub_0805EEB4(token, uVar6); + break; + default: + break; + } + iVar8 = 1; + break; + case 7: + uVar6 = sub_0805EF8C(token) << 8; + uVar6 += sub_0805EF8C(token); + token->unk00 = 0; + token->unk01 = 0; + sub_0805EEB4(token, uVar6); + iVar8 = 1; + break; + case 8: + uVar3 = sub_0805EF8C(token); + token->param = uVar3; + code = 0xd; + break; + case 9: + uVar3 = sub_0805EF8C(token); + token->param = uVar3; + code = 0xe; + break; + case 10: + code = 1; + break; + case 0xb: + code = sub_0805EF8C(token); + code |= 0x400; + break; + case 0xc: + code = sub_0805EF8C(token); + code |= 0x700; + break; + case 0xd: + code = sub_0805EF8C(token); + code |= 0x500; + break; + case 0xe: + code = sub_0805EF8C(token); + code |= 0x600; + break; + case 0xf: + code = sub_0805EF8C(token); + code |= 0x300; + break; + default: + code += 0x100; + break; + } + } while (iVar8); + + if (code >> 8 != 0) { + switch (token->unk05) { + case 0: + break; + case 1: + code = sub_0805F9A0(code); + break; + } + token->extended = (u16)code; + } + return code; +} + +u32* sub_0805F25C(u32 param_1) { + u32 uVar1; + + uVar1 = param_1 >> 8 & 0xf; + param_1 = param_1 & 0xff; + switch (uVar1) { + case 0: + case 1: + if (0x7f < param_1 && gSaveHeader->language != 0) { + param_1 = param_1 - 0x80; + uVar1 = 2; + } + break; + case 2: + case 3: + case 4: + break; + case 5: + case 6: + case 7: + case 8: + param_1 = param_1 << 1; + break; + } + return gUnk_08109248[uVar1] + param_1 * 0x10; +} + +WStruct* sub_0805F2C8(void) { + u32 uVar2; + + for (uVar2 = 0; uVar2 < ARRAY_COUNT(gUnk_02036540); uVar2++) { + if ((gUnk_02036540[uVar2].unk00) == 0) { + MemClear(&gUnk_02036540[uVar2], sizeof(WStruct)); + gUnk_02036540[uVar2].unk00 = 1; + return &gUnk_02036540[uVar2]; + } + } + + return NULL; +} + +void sub_0805F300(WStruct* param_1) { + u32 uVar2; + + for (uVar2 = 0; uVar2 < ARRAY_COUNT(gUnk_02036540); uVar2++) { + if (&gUnk_02036540[uVar2] == param_1) { + MemClear(&gUnk_02036540[uVar2], sizeof(WStruct)); + return; + } + } +} + +u32 GetFontStrWith(Token* param_1, u32 param_2) { + u32 character; + u32* puVar2; + u32 uVar3; + u32 uVar4; + u16 uVar5; + u32 rv; + u32 r9; + Token token; + int local_28; + int local_24; + + MemCopy(param_1, &token, sizeof(Token)); + local_24 = 0; + local_28 = 0; + rv = 0; + uVar5 = 0; + do { + uVar4 = 0; + r9 = 1; + while (r9) { + character = GetCharacter(&token); + switch (character) { + case 0xc: + uVar4 += 8; + break; + case 0xb: + uVar5 = token.param; + break; + case 0: + case 1: + r9 = 0; + break; + case 2 ... 10: + case 0xd: + case 0xe: + break; + default: + if (uVar5 == 0) { + puVar2 = (u32*)sub_0805F25C(character); + if (4 < character >> 8) { + uVar3 = sub_0805F7A0(puVar2[0x10]); + uVar4 += (uVar3 >> 8); + } + uVar3 = sub_0805F7A0(*puVar2); + uVar4 += (uVar3 >> 8); + } else if (character >> 8 >= 5) { + uVar4 += 0x10; + } else { + uVar4 += 8; + } + if (token.unk05 == 1 && uVar4 > 1) { + uVar4--; + } + } + } + if (uVar4 > rv) { + rv = uVar4; + } + if (uVar4 != 0) { + local_28++; + } else { + local_24++; + } + } while ((param_2 != 0) && (character != 0)); + + if (param_2 != 0) { + return local_24 << 0x18 | local_28 << 0x10 | rv; + } + return rv; +} + +void sub_0805F440(Token* param_1, u8* param_2) { + MemClear(param_1, sizeof(Token)); + if ((u32)param_2 >= 0x10000) { + sub_0805EF40(param_1, param_2); + } else { + sub_0805EEB4(param_1, (u32)param_2); + } +} + +u32 sub_0805F46C(u32 param_1, Font* param_2) { + u32 uVar1; + WStruct* pWVar4; + u32 uVar5; + u16* puVar6; + u32 uVar7; + u32 uVar8; + u16* puVar9; + u32 iVar10; + Token token; + Font font; + u32 fontStr; + u32 temp2; + u32 temp3; + + pWVar4 = sub_0805F2C8(); + if (pWVar4 != NULL) { + MemCopy(param_2, &font, sizeof(Font)); + sub_0805F440(&token, (u8*)param_1); + token.unk05 = font.stylized & 3; + pWVar4->unk04 = font.stylized; + pWVar4->unk4 = font.width; + pWVar4->unk8 = font.buffer_loc; + pWVar4->charColor = font._15; + pWVar4->bgColor = font.fill_type; + if (font.draw_border) { + sub_0805F918(font.border_type, font.fill_type, font.gfx_dest); + font.gfx_dest = (void*)((int)font.gfx_dest + 0xe0); + fontStr = GetFontStrWith(&token, 1); + iVar10 = (fontStr >> 0x18) * (u32)font._16 + ((u8)((int)fontStr >> 0x10) << 1); + uVar8 = (u16)fontStr; + temp3 = uVar8; + if (font.width < (s32)temp3) { + temp3 = font.width; + } + uVar8 = (temp3 + 7); + temp2 = ~7; + uVar8 = font.sm_border ? uVar8 & temp2 : font.width; + + puVar9 = font.dest; + font.dest += 0x20; + + if (font.right_align) { + uVar8 = (uVar8 + 0xf) & ~0xf; + puVar9 -= (uVar8 >> 4) + 1; + } else { + font.dest += 1; + } + uVar8 = uVar8 >> 3; + param_1 = font.gfx_src; + DispMessageFrame(puVar9, uVar8, iVar10, param_1); + puVar9 = puVar9 + 1; + font.gfx_src = font.gfx_src + 7; + param_1 = font.gfx_src - 1; + while (iVar10-- > 0) { + puVar9 += 0x20; + puVar6 = puVar9; + for (uVar5 = uVar8; (int)uVar5-- > 0;) { + *puVar6++ = param_1; + } + } + } + MemClear(&gUnk_02034330, sizeof(gUnk_02034330)); + while ((s16)sub_0805F5CC(&font, &token, pWVar4) != 0) {} + sub_0805F300(pWVar4); + } + return 0; +} + +bool32 sub_0805F5CC(Font* param_1, Token* param_2, WStruct* param_3) { + u16 uVar2; + u32 uVar3; + int iVar4; + u16* puVar5; + u32 fontStr; + + uVar3 = sub_0805F8F8(param_1->fill_type); + MemFill32(uVar3, param_1->buffer_loc, ((param_1->width + 7) & 0x1f8) << 3); + fontStr = GetFontStrWith(param_2, 0); + param_3->unk6 = param_1->right_align ? ((8 - ((fontStr + 1) >> 1)) & 7) : 0; + + puVar5 = (u16*)sub_0805F6A4(param_2, param_3); + if (puVar5) { + iVar4 = (int)(param_3->unk6 + 7) / 8; + puVar5 = param_1->dest; + if (param_1->right_align) { + puVar5 -= (iVar4 + 1U) >> 1; + } + param_1->gfx_src = sub_0805F67C(puVar5, param_1->gfx_src, iVar4); + param_1->dest += 0x40; + iVar4 *= 0x40; + MemCopy(param_1->buffer_loc, param_1->gfx_dest, iVar4); + param_1->gfx_dest = (void*)((int)param_1->gfx_dest + iVar4); + } else { + if (param_2->code == 10) { + param_1->dest += param_1->_16 * 0x20; + } + } + return param_2->code > 0; +} + +int sub_0805F67C(short* param_1, int param_2, int param_3) { + for (param_3--; param_3 != -1; param_3--) { + param_1[0] = param_2++; + param_1[0x20] = param_2++; + param_1++; + } + return param_2; +} + +u32 sub_0805F6A4(Token* param_1, WStruct* param_2) { + u32 uVar1; + u32 uVar3; + int iVar4; + u32 r7; + + iVar4 = 0; + r7 = 1; + do { + uVar1 = GetCharacter(param_1); + r7 = 1; + switch (uVar1) { + case 7: + if (param_1->param < 0xe) { + param_2->charColor = param_1->param; + } + break; + case 0: + case 1: + r7 = 0; + break; + case 2: + case 3: + case 4: + case 5: + case 6: + case 8: + case 9: + case 10: + case 0xd: + case 0xe: + break; + + case 0xc: + uVar3 = gUnk_02034330.unk2; + if (uVar3 < 4) { + gUnk_02034330.unk2 = uVar3 + 1; + gUnk_02034330.unk10[uVar3] = param_1->_6; + gUnk_02034330.unk8[uVar3] = param_2->unk6; + } + param_2->unk6 += 8; + iVar4 += 8; + break; + case 0xb: + param_2->unk1 = param_1->param; + break; + default: + iVar4 += sub_0805F7DC(uVar1, param_2); + if ((param_1->unk05 == 1) && (1 < param_2->unk6)) { + iVar4--; + param_2->unk6 = param_2->unk6 - 1; + } + break; + } + } while (r7); + + return iVar4; +} + +u32 sub_0805F76C(u8* param_1, WStruct* param_2) { + u32 uVar1; + Token local_38; + + sub_0805F440(&local_38, param_1); + local_38.unk05 = param_2->unk04 & 3; + uVar1 = sub_0805F6A4(&local_38, param_2); + return uVar1; +} + +u32 sub_0805F7A0(u32 param_1) { + u32 uVar1; + u32 uVar2; + u32 uVar3; + + uVar1 = 0xf; + for (uVar2 = 0; uVar2 < 8; uVar2++) { + if (uVar1 != (param_1 & uVar1)) + break; + uVar1 <<= 4; + } + for (uVar3 = uVar2; (uVar2 < 8 && (uVar1 != (param_1 & uVar1))); uVar1 <<= 4, uVar2++) {} + uVar2 -= uVar3; + return (uVar2 << 8) | uVar3; +} u32 sub_0805F7DC(u32 r0, WStruct* r1) { u32 temp; @@ -59,6 +656,7 @@ void sub_0805F820(WStruct* r0, u32* r1) { u8* temp; void* temp2; VStruct* temp3; + u32 temp4; if (r0->unk4 - r0->unk6 > 0) { sub_08002724(r1, &gUnk_02036A58); @@ -81,11 +679,12 @@ void sub_0805F820(WStruct* r0, u32* r1) { puVar8 = &gUnk_02036A58 + uVar6; temp2 = r0->unk8; - temp = gUnk_0810942E[r0->unk3].filler0[r0->unk2 * 2]; + temp = gUnk_0810942E[r0->bgColor].filler0[r0->charColor * 2]; uVar7 = r0->unk6; r0->unk6 += uVar3; - if (r0->unk0 / 16 != 1) { + temp4 = r0->unk04; + if (temp4 != 1) { while (uVar3-- > 0) { sub_080026C4(puVar8, temp2, temp, uVar7); puVar8++; diff --git a/src/title.c b/src/title.c index f9c63410..3329f80e 100644 --- a/src/title.c +++ b/src/title.c @@ -79,7 +79,7 @@ static const SaveFile gDemoSave = { .name = "\x97\x7f\xdd", .saved_status = { .area_next = AREA_DEEPWOOD_SHRINE, - .room_next = 0xb, + .room_next = ROOM_DEEPWOOD_SHRINE_ENTRANCE, .start_pos_x = 0xa8, .start_pos_y = 0xc8, .layer = 1, @@ -124,7 +124,7 @@ void DrawUIElements(void) { } } -NONMATCH("asm/non_matching/ui/sub_0801C25C.inc", void sub_0801C25C(void)) { +void sub_0801C25C(void) { u32 uVar1; s32 index; u8 tmp; @@ -133,8 +133,8 @@ NONMATCH("asm/non_matching/ui/sub_0801C25C.inc", void sub_0801C25C(void)) { for (index = 0; index < MAX_UI_ELEMENTS; index++) { element = &gUnk_0200AF00.elements[index]; if (((element->used) == 1) && ((element->unk_0_1) == 1)) { - // TODO wrong bitfield access here - if (element->unk_0_2 == 1) { + u8 temp = element->unk_0_2; + if (temp == 1) { element->unk_0_2 = 2; DmaSet(3, element->firstTile, element->unk_1a * 0x20 + 0x6010000, element->numTiles << 3 | 0x84000000); } @@ -151,7 +151,6 @@ NONMATCH("asm/non_matching/ui/sub_0801C25C.inc", void sub_0801C25C(void)) { sub_0801C2F0(0x126, tmp); } } -END_NONMATCH ASM_FUNC("asm/non_matching/ui/sub_0801C2F0.inc", void sub_0801C2F0(u32 a, u32 b)) @@ -354,7 +353,7 @@ u32 sub_0801CC80(UIElement* element) { ASM_FUNC("asm/non_matching/ui/ItemUIElement.inc", void ItemUIElement()) -NONMATCH("asm/non_matching/ui/TextUIElement.inc", void TextUIElement(UIElement* element)) { +void TextUIElement(UIElement* element) { UIElement* buttonUIElement; u32 tmp; extern struct_0200AF00* ptr; @@ -362,25 +361,27 @@ NONMATCH("asm/non_matching/ui/TextUIElement.inc", void TextUIElement(UIElement* UIElement* ptr2; if (element->type2 == 9) { - if (gUnk_0200AF00.unk_2f == 0) { + tmp = gUnk_0200AF00.unk_2f; + if (tmp == 0) { switch (gArea.field_0x18) { case 2: - tmp1 = 0xb; + tmp = 0xb; break; case 3: - tmp1 = 0xa; + tmp = 0xa; break; default: - tmp1 = gUnk_0200AF00.unk_2c; + tmp = gUnk_0200AF00.unk_2c; break; } - gUnk_0200AF00.unk_32 = tmp1; } + gUnk_0200AF00.unk_32 = tmp; } tmp = gUnk_0200AF00.unk_30[element->buttonElementId]; element->unk_0_1 = 0; if (tmp != 0) { - sub_0801CAFC(element, tmp + gUnk_080C9044[((SaveHeader*)0x2000000)->language]); + tmp += gUnk_080C9044[((SaveHeader*)0x2000000)->language]; + sub_0801CAFC(element, tmp); buttonUIElement = FindUIElement(element->buttonElementId); if (buttonUIElement != NULL) { element->x = buttonUIElement->x; @@ -389,7 +390,6 @@ NONMATCH("asm/non_matching/ui/TextUIElement.inc", void TextUIElement(UIElement* } } } -END_NONMATCH UIElement* FindUIElement(u32 type) { UIElement* element; |
