diff --git a/extern/aurora b/extern/aurora index 8a2b80ecb1..1bd972429e 160000 --- a/extern/aurora +++ b/extern/aurora @@ -1 +1 @@ -Subproject commit 8a2b80ecb104625319c2818fd6d752bab8617679 +Subproject commit 1bd972429ebba4e486012b1acd08d4d7580eb917 diff --git a/include/d/actor/d_a_mirror.h b/include/d/actor/d_a_mirror.h index 06c5603899..e2f9a51e30 100644 --- a/include/d/actor/d_a_mirror.h +++ b/include/d/actor/d_a_mirror.h @@ -27,6 +27,7 @@ public: /* 0x17C */ cXyz mViewScale; #if TARGET_PC bool mbReset = false; + bool mbHadEntry = false; #endif }; diff --git a/include/d/d_menu_dmap.h b/include/d/d_menu_dmap.h index e50c533654..81baea1446 100644 --- a/include/d/d_menu_dmap.h +++ b/include/d/d_menu_dmap.h @@ -91,6 +91,10 @@ public: void calcCursor(); void drawCursor(); + #if TARGET_PC + void dMapBgWide(); + #endif + void setDPDFloorSelCurPos(s8 i_pos) { field_0xdd6 = i_pos; } f32 getMapWidth() { return mMapWidth; } diff --git a/include/d/d_menu_fmap2D.h b/include/d/d_menu_fmap2D.h index 9b237f2771..d0152f0229 100644 --- a/include/d/d_menu_fmap2D.h +++ b/include/d/d_menu_fmap2D.h @@ -81,6 +81,10 @@ public: void calcDrawPriority(); void setArrowPosAxis(f32, f32); + #if TARGET_PC + void fMapBackWide(); + #endif + virtual void draw(); virtual ~dMenu_Fmap2DBack_c(); @@ -330,6 +334,10 @@ public: void setHIO(bool); bool isWarpAccept(); + #if TARGET_PC + void fMapTopWide(); + #endif + virtual void draw(); virtual ~dMenu_Fmap2DTop_c(); diff --git a/include/d/d_msg_object.h b/include/d/d_msg_object.h index b55ea73904..d2ac4ecb2a 100644 --- a/include/d/d_msg_object.h +++ b/include/d/d_msg_object.h @@ -67,6 +67,9 @@ public: bool isStaffMessage(); bool isSaveMessage(); bool isTalkMessage(); +#if TARGET_PC + bool isShopItemMessage(); +#endif const char* getSmellName(); const char* getPortalName(); const char* getBombName(); diff --git a/libs/JSystem/include/JSystem/JParticle/JPABaseShape.h b/libs/JSystem/include/JSystem/JParticle/JPABaseShape.h index d348859ebe..795a5a2628 100644 --- a/libs/JSystem/include/JSystem/JParticle/JPABaseShape.h +++ b/libs/JSystem/include/JSystem/JParticle/JPABaseShape.h @@ -207,4 +207,11 @@ void JPARegistAlphaEnv(JPAEmitterWorkData*, JPABaseParticle*); void JPARegistPrmAlpha(JPAEmitterWorkData*, JPABaseParticle*); void JPARegistPrmAlphaEnv(JPAEmitterWorkData*, JPABaseParticle*); +#if TARGET_PC +void JPAInterpBillboard(JPAEmitterWorkData*, JPABaseParticle*); +void JPAInterpRotBillboard(JPAEmitterWorkData*, JPABaseParticle*); +void JPAInterpDirection(JPAEmitterWorkData*, JPABaseParticle*); +void JPAInterpRotDirection(JPAEmitterWorkData*, JPABaseParticle*); +#endif + #endif /* JPABASESHAPE_H */ diff --git a/libs/JSystem/include/JSystem/JParticle/JPAParticle.h b/libs/JSystem/include/JSystem/JParticle/JPAParticle.h index 842f293286..c864a5cd4a 100644 --- a/libs/JSystem/include/JSystem/JParticle/JPAParticle.h +++ b/libs/JSystem/include/JSystem/JParticle/JPAParticle.h @@ -24,6 +24,9 @@ public: void init_c(JPAEmitterWorkData*, JPABaseParticle*); bool calc_p(JPAEmitterWorkData*); bool calc_c(JPAEmitterWorkData*); +#if TARGET_PC + void interp(JPAEmitterWorkData*, void const* drawFunc); +#endif bool canCreateChild(JPAEmitterWorkData*); f32 getWidth(JPABaseEmitter const*) const; f32 getHeight(JPABaseEmitter const*) const; diff --git a/libs/JSystem/src/JAudio2/JASHeapCtrl.cpp b/libs/JSystem/src/JAudio2/JASHeapCtrl.cpp index 45568cc29a..e3722e3726 100644 --- a/libs/JSystem/src/JAudio2/JASHeapCtrl.cpp +++ b/libs/JSystem/src/JAudio2/JASHeapCtrl.cpp @@ -302,7 +302,6 @@ void JASKernel::setupRootHeap(JKRSolidHeap* heap, u32 size) { JKRHEAP_NAME(sSystemHeap, "JASKernel::sSystemHeap"); JUT_ASSERT(787, sSystemHeap); sCommandHeap = JKR_NEW_ARGS (heap, 0) JASMemChunkPool<1024, JASThreadingModel::ObjectLevelLockable>; - JKRHEAP_NAME(sSystemHeap, "JASKernel::sCommandHeap"); JUT_ASSERT(790, sCommandHeap); JASDram = heap; } diff --git a/libs/JSystem/src/JAudio2/JAUSectionHeap.cpp b/libs/JSystem/src/JAudio2/JAUSectionHeap.cpp index e1f45de1ae..cc94097712 100644 --- a/libs/JSystem/src/JAudio2/JAUSectionHeap.cpp +++ b/libs/JSystem/src/JAudio2/JAUSectionHeap.cpp @@ -442,6 +442,7 @@ static JAUSectionHeap* JAUNewSectionHeap(JKRSolidHeap* heap, bool param_1) { JAUSectionHeap* JAUNewSectionHeap(bool param_0) { s32 freeSize = JASDram->getFreeSize(); JKRSolidHeap* sectionHeap = JKRCreateSolidHeap(freeSize, JASDram, true); + JKRHEAP_NAME(sectionHeap, "sectionHeap"); JUT_ASSERT(821, sectionHeap); return JAUNewSectionHeap(sectionHeap, param_0); } diff --git a/libs/JSystem/src/JParticle/JPABaseShape.cpp b/libs/JSystem/src/JParticle/JPABaseShape.cpp index 178606a687..ff346984cd 100644 --- a/libs/JSystem/src/JParticle/JPABaseShape.cpp +++ b/libs/JSystem/src/JParticle/JPABaseShape.cpp @@ -9,6 +9,9 @@ #include #include +#if TARGET_PC +#include "dusk/frame_interpolation.h" +#endif #include "tracy/Tracy.hpp" void JPASetPointSize(JPAEmitterWorkData* work) { @@ -418,50 +421,95 @@ static projectionFunc p_prj[3] = { loadPrjAnm, }; -void JPADrawBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) { - if (param_1->checkStatus(JPAPtclStts_Invisible)) { +#if TARGET_PC +void JPAInterpBillboard(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { + Mtx ptclPosMtx; + MTXTrans(ptclPosMtx, ptcl->mPosition.x, ptcl->mPosition.y, ptcl->mPosition.z); + dusk::frame_interp::record_final_mtx(ptclPosMtx, ptcl); +} + +void JPAInterpRotBillboard(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { + Mtx ptclPosMtx; + f32 sinRot = JMASSin(ptcl->mRotateAngle); + f32 cosRot = JMASCos(ptcl->mRotateAngle); + MTXTrans(ptclPosMtx, ptcl->mPosition.x, ptcl->mPosition.y, ptcl->mPosition.z); + ptclPosMtx[0][0] = cosRot; + ptclPosMtx[0][1] = -sinRot; + ptclPosMtx[1][0] = sinRot; + ptclPosMtx[1][1] = cosRot; + dusk::frame_interp::record_final_mtx(ptclPosMtx, ptcl); +} +#endif + +void JPADrawBillboard(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { + if (ptcl->checkStatus(JPAPtclStts_Invisible)) { return; } - JGeometry::TVec3 local_48; - MTXMultVec(work->mPosCamMtx, ¶m_1->mPosition, &local_48); - Mtx local_38; - local_38[0][0] = work->mGlobalPtclScl.x * param_1->mParticleScaleX; - local_38[0][3] = local_48.x; - local_38[1][1] = work->mGlobalPtclScl.y * param_1->mParticleScaleY; - local_38[1][3] = local_48.y; - local_38[2][2] = 1.0f; - local_38[2][3] = local_48.z; - local_38[0][1] = local_38[0][2] = local_38[1][0] = local_38[1][2] = local_38[2][0] = local_38[2][1] = 0.0f; - GXLoadPosMtxImm(local_38, 0); - p_prj[work->mPrjType](work, local_38); + JGeometry::TVec3 pos; +#if TARGET_PC + Mtx ptclPosMtx; + if (dusk::frame_interp::lookup_replacement(ptcl, ptclPosMtx)) { + pos.set(ptclPosMtx[0][3], ptclPosMtx[1][3], ptclPosMtx[2][3]); + MTXMultVec(work->mPosCamMtx, &pos, &pos); + } else +#endif + { + MTXMultVec(work->mPosCamMtx, &ptcl->mPosition, &pos); + } + Mtx posMtx; + posMtx[0][0] = work->mGlobalPtclScl.x * ptcl->mParticleScaleX; + posMtx[0][3] = pos.x; + posMtx[1][1] = work->mGlobalPtclScl.y * ptcl->mParticleScaleY; + posMtx[1][3] = pos.y; + posMtx[2][2] = 1.0f; + posMtx[2][3] = pos.z; + posMtx[0][1] = posMtx[0][2] = posMtx[1][0] = posMtx[1][2] = posMtx[2][0] = posMtx[2][1] = 0.0f; + GXLoadPosMtxImm(posMtx, GX_PNMTX0); + p_prj[work->mPrjType](work, posMtx); GXCallDisplayList(jpa_dl, sizeof(jpa_dl)); } -void JPADrawRotBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) { - if (param_1->checkStatus(JPAPtclStts_Invisible)) { +void JPADrawRotBillboard(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { + if (ptcl->checkStatus(JPAPtclStts_Invisible)) { return; } - JGeometry::TVec3 local_48; - MTXMultVec(work->mPosCamMtx, ¶m_1->mPosition, &local_48); - f32 sinRot = JMASSin(param_1->mRotateAngle); - f32 cosRot = JMASCos(param_1->mRotateAngle); - f32 particleX = work->mGlobalPtclScl.x * param_1->mParticleScaleX; - f32 particleY = work->mGlobalPtclScl.y * param_1->mParticleScaleY; + if (work->mpRes->getUsrIdx() == 0x89d7) { + int a = 0; + } - Mtx local_38; - local_38[0][0] = cosRot * particleX; - local_38[0][1] = -sinRot * particleY; - local_38[0][3] = local_48.x; - local_38[1][0] = sinRot * particleX; - local_38[1][1] = cosRot * particleY; - local_38[1][3] = local_48.y; - local_38[2][2] = 1.0f; - local_38[2][3] = local_48.z; - local_38[0][2] = local_38[1][2] = local_38[2][0] = local_38[2][1] = 0.0f; - GXLoadPosMtxImm(local_38, 0); - p_prj[work->mPrjType](work, local_38); + JGeometry::TVec3 pos; + f32 sinRot, cosRot; +#if TARGET_PC + Mtx ptclPosMtx; + MTXTrans(ptclPosMtx, ptcl->mPosition.x, ptcl->mPosition.y, ptcl->mPosition.z); + if (dusk::frame_interp::lookup_replacement(ptcl, ptclPosMtx)) { + pos.set(ptclPosMtx[0][3], ptclPosMtx[1][3], ptclPosMtx[2][3]); + sinRot = ptclPosMtx[1][0]; + cosRot = ptclPosMtx[0][0]; + MTXMultVec(work->mPosCamMtx, &pos, &pos); + } else +#endif + { + MTXMultVec(work->mPosCamMtx, &ptcl->mPosition, &pos); + sinRot = JMASSin(ptcl->mRotateAngle); + cosRot = JMASCos(ptcl->mRotateAngle); + } + f32 particleX = work->mGlobalPtclScl.x * ptcl->mParticleScaleX; + f32 particleY = work->mGlobalPtclScl.y * ptcl->mParticleScaleY; + Mtx posMtx; + posMtx[0][0] = cosRot * particleX; + posMtx[0][1] = -sinRot * particleY; + posMtx[0][3] = pos.x; + posMtx[1][0] = sinRot * particleX; + posMtx[1][1] = cosRot * particleY; + posMtx[1][3] = pos.y; + posMtx[2][2] = 1.0f; + posMtx[2][3] = pos.z; + posMtx[0][2] = posMtx[1][2] = posMtx[2][0] = posMtx[2][1] = 0.0f; + GXLoadPosMtxImm(posMtx, GX_PNMTX0); + p_prj[work->mPrjType](work, posMtx); GXCallDisplayList(jpa_dl, sizeof(jpa_dl)); } @@ -484,7 +532,7 @@ void JPADrawYBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) { local_38[2][2] = work->mYBBCamMtx[2][2]; local_38[2][3] = local_48.z; local_38[0][1] = local_38[0][2] = local_38[1][0] = local_38[2][0] = 0.0f; - GXLoadPosMtxImm(local_38, 0); + GXLoadPosMtxImm(local_38, GX_PNMTX0); p_prj[work->mPrjType](work, local_38); GXCallDisplayList(jpa_dl, sizeof(jpa_dl)); } @@ -517,7 +565,7 @@ void JPADrawRotYBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) { local_38[2][1] = local_94 * fVar1; local_38[2][2] = local_90; local_38[2][3] = local_48.z; - GXLoadPosMtxImm(local_38, 0); + GXLoadPosMtxImm(local_38, GX_PNMTX0); p_prj[work->mPrjType](work, local_38); GXCallDisplayList(jpa_dl, sizeof(jpa_dl)); } @@ -681,103 +729,197 @@ static u8* p_dl[2] = { jpa_dl_x, }; -void JPADrawDirection(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) { - if (param_1->checkStatus(JPAPtclStts_Invisible)) { +#if TARGET_PC +void JPAInterpDirection(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { + JGeometry::TVec3 axisY; + JGeometry::TVec3 axisZ; + p_direction[work->mDirType](work, ptcl, &axisY); + + if (axisY.isZero()) { return; } - ZoneScoped; + axisY.normalize(); + axisZ.cross(ptcl->mBaseAxis, axisY); - JGeometry::TVec3 local_6c; - JGeometry::TVec3 local_78; - p_direction[param_0->mDirType](param_0, param_1, &local_6c); - - if (local_6c.isZero()) { + if (axisZ.isZero()) { return; } - local_6c.normalize(); - local_78.cross(param_1->mBaseAxis, local_6c); - - if (local_78.isZero()) { - return; - } - - local_78.normalize(); - param_1->mBaseAxis.cross(local_6c, local_78); - param_1->mBaseAxis.normalize(); - Mtx local_60; - f32 fVar1 = param_0->mGlobalPtclScl.x * param_1->mParticleScaleX; - f32 fVar2 = param_0->mGlobalPtclScl.y * param_1->mParticleScaleY; - local_60[0][0] = param_1->mBaseAxis.x; - local_60[0][1] = local_6c.x; - local_60[0][2] = local_78.x; - local_60[0][3] = param_1->mPosition.x; - local_60[1][0] = param_1->mBaseAxis.y; - local_60[1][1] = local_6c.y; - local_60[1][2] = local_78.y; - local_60[1][3] = param_1->mPosition.y; - local_60[2][0] = param_1->mBaseAxis.z; - local_60[2][1] = local_6c.z; - local_60[2][2] = local_78.z; - local_60[2][3] = param_1->mPosition.z; - p_plane[param_0->mPlaneType](local_60, fVar1, fVar2); - MTXConcat(param_0->mPosCamMtx, local_60, local_60); - GXLoadPosMtxImm(local_60, 0); - p_prj[param_0->mPrjType](param_0, local_60); - GXCallDisplayList(p_dl[param_0->mDLType], sizeof(jpa_dl)); + axisZ.normalize(); + ptcl->mBaseAxis.cross(axisY, axisZ); + ptcl->mBaseAxis.normalize(); + Mtx posMtx; + f32 scaleX = work->mGlobalPtclScl.x * ptcl->mParticleScaleX; + f32 scaleY = work->mGlobalPtclScl.y * ptcl->mParticleScaleY; + posMtx[0][0] = ptcl->mBaseAxis.x; + posMtx[0][1] = axisY.x; + posMtx[0][2] = axisZ.x; + posMtx[0][3] = ptcl->mPosition.x; + posMtx[1][0] = ptcl->mBaseAxis.y; + posMtx[1][1] = axisY.y; + posMtx[1][2] = axisZ.y; + posMtx[1][3] = ptcl->mPosition.y; + posMtx[2][0] = ptcl->mBaseAxis.z; + posMtx[2][1] = axisY.z; + posMtx[2][2] = axisZ.z; + posMtx[2][3] = ptcl->mPosition.z; + p_plane[work->mPlaneType](posMtx, scaleX, scaleY); + dusk::frame_interp::record_final_mtx(posMtx, ptcl); } -void JPADrawRotDirection(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) { - if (param_1->checkStatus(JPAPtclStts_Invisible)) { +void JPAInterpRotDirection(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { + f32 sinRot = JMASSin(ptcl->mRotateAngle); + f32 cosRot = JMASCos(ptcl->mRotateAngle); + JGeometry::TVec3 axisY; + JGeometry::TVec3 axisZ; + p_direction[work->mDirType](work, ptcl, &axisY); + + if (axisY.isZero()) { + return; + } + + axisY.normalize(); + axisZ.cross(ptcl->mBaseAxis, axisY); + + if (axisZ.isZero()) { + return; + } + + axisZ.normalize(); + ptcl->mBaseAxis.cross(axisY, axisZ); + ptcl->mBaseAxis.normalize(); + f32 scaleX = work->mGlobalPtclScl.x * ptcl->mParticleScaleX; + f32 scaleY = work->mGlobalPtclScl.y * ptcl->mParticleScaleY; + Mtx mtx1; + Mtx mtx2; + p_rot[work->mRotType](sinRot, cosRot, mtx1); + p_plane[work->mPlaneType](mtx1, scaleX, scaleY); + mtx2[0][0] = ptcl->mBaseAxis.x; + mtx2[0][1] = axisY.x; + mtx2[0][2] = axisZ.x; + mtx2[0][3] = ptcl->mPosition.x; + mtx2[1][0] = ptcl->mBaseAxis.y; + mtx2[1][1] = axisY.y; + mtx2[1][2] = axisZ.y; + mtx2[1][3] = ptcl->mPosition.y; + mtx2[2][0] = ptcl->mBaseAxis.z; + mtx2[2][1] = axisY.z; + mtx2[2][2] = axisZ.z; + mtx2[2][3] = ptcl->mPosition.z; + MTXConcat(mtx2, mtx1, mtx1); + dusk::frame_interp::record_final_mtx(mtx1, ptcl); +} +#endif + +void JPADrawDirection(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { + if (ptcl->checkStatus(JPAPtclStts_Invisible)) { return; } ZoneScoped; - f32 sinRot = JMASSin(param_1->mRotateAngle); - f32 cosRot = JMASCos(param_1->mRotateAngle); - JGeometry::TVec3 local_6c; - JGeometry::TVec3 local_78; - p_direction[param_0->mDirType](param_0, param_1, &local_6c); + Mtx posMtx; +#if TARGET_PC + if (!dusk::frame_interp::lookup_replacement(ptcl, posMtx)) +#endif + { + JGeometry::TVec3 axisY; + JGeometry::TVec3 axisZ; + p_direction[work->mDirType](work, ptcl, &axisY); - if (local_6c.isZero()) { + if (axisY.isZero()) { + return; + } + + axisY.normalize(); + axisZ.cross(ptcl->mBaseAxis, axisY); + + if (axisZ.isZero()) { + return; + } + + axisZ.normalize(); + ptcl->mBaseAxis.cross(axisY, axisZ); + ptcl->mBaseAxis.normalize(); + f32 scaleX = work->mGlobalPtclScl.x * ptcl->mParticleScaleX; + f32 scaleY = work->mGlobalPtclScl.y * ptcl->mParticleScaleY; + posMtx[0][0] = ptcl->mBaseAxis.x; + posMtx[0][1] = axisY.x; + posMtx[0][2] = axisZ.x; + posMtx[0][3] = ptcl->mPosition.x; + posMtx[1][0] = ptcl->mBaseAxis.y; + posMtx[1][1] = axisY.y; + posMtx[1][2] = axisZ.y; + posMtx[1][3] = ptcl->mPosition.y; + posMtx[2][0] = ptcl->mBaseAxis.z; + posMtx[2][1] = axisY.z; + posMtx[2][2] = axisZ.z; + posMtx[2][3] = ptcl->mPosition.z; + p_plane[work->mPlaneType](posMtx, scaleX, scaleY); + } + + MTXConcat(work->mPosCamMtx, posMtx, posMtx); + GXLoadPosMtxImm(posMtx, GX_PNMTX0); + p_prj[work->mPrjType](work, posMtx); + GXCallDisplayList(p_dl[work->mDLType], sizeof(jpa_dl)); +} + +void JPADrawRotDirection(JPAEmitterWorkData* work, JPABaseParticle* ptcl) { + if (ptcl->checkStatus(JPAPtclStts_Invisible)) { return; } - local_6c.normalize(); - local_78.cross(param_1->mBaseAxis, local_6c); + ZoneScoped; - if (local_78.isZero()) { - return; + Mtx mtx1; + Mtx mtx2; +#if TARGET_PC + if (!dusk::frame_interp::lookup_replacement(ptcl, mtx1)) +#endif + { + f32 sinRot = JMASSin(ptcl->mRotateAngle); + f32 cosRot = JMASCos(ptcl->mRotateAngle); + JGeometry::TVec3 axisY; + JGeometry::TVec3 axisZ; + p_direction[work->mDirType](work, ptcl, &axisY); + + if (axisY.isZero()) { + return; + } + + axisY.normalize(); + axisZ.cross(ptcl->mBaseAxis, axisY); + + if (axisZ.isZero()) { + return; + } + + axisZ.normalize(); + ptcl->mBaseAxis.cross(axisY, axisZ); + ptcl->mBaseAxis.normalize(); + f32 scaleX = work->mGlobalPtclScl.x * ptcl->mParticleScaleX; + f32 scaleY = work->mGlobalPtclScl.y * ptcl->mParticleScaleY; + p_rot[work->mRotType](sinRot, cosRot, mtx1); + p_plane[work->mPlaneType](mtx1, scaleX, scaleY); + mtx2[0][0] = ptcl->mBaseAxis.x; + mtx2[0][1] = axisY.x; + mtx2[0][2] = axisZ.x; + mtx2[0][3] = ptcl->mPosition.x; + mtx2[1][0] = ptcl->mBaseAxis.y; + mtx2[1][1] = axisY.y; + mtx2[1][2] = axisZ.y; + mtx2[1][3] = ptcl->mPosition.y; + mtx2[2][0] = ptcl->mBaseAxis.z; + mtx2[2][1] = axisY.z; + mtx2[2][2] = axisZ.z; + mtx2[2][3] = ptcl->mPosition.z; + MTXConcat(mtx2, mtx1, mtx1); } - - local_78.normalize(); - param_1->mBaseAxis.cross(local_6c, local_78); - param_1->mBaseAxis.normalize(); - f32 particleX = param_0->mGlobalPtclScl.x * param_1->mParticleScaleX; - f32 particleY = param_0->mGlobalPtclScl.y * param_1->mParticleScaleY; - Mtx auStack_80; - Mtx local_60; - p_rot[param_0->mRotType](sinRot, cosRot, auStack_80); - p_plane[param_0->mPlaneType](auStack_80, particleX, particleY); - local_60[0][0] = param_1->mBaseAxis.x; - local_60[0][1] = local_6c.x; - local_60[0][2] = local_78.x; - local_60[0][3] = param_1->mPosition.x; - local_60[1][0] = param_1->mBaseAxis.y; - local_60[1][1] = local_6c.y; - local_60[1][2] = local_78.y; - local_60[1][3] = param_1->mPosition.y; - local_60[2][0] = param_1->mBaseAxis.z; - local_60[2][1] = local_6c.z; - local_60[2][2] = local_78.z; - local_60[2][3] = param_1->mPosition.z; - MTXConcat(local_60, auStack_80, auStack_80); - MTXConcat(param_0->mPosCamMtx, auStack_80, local_60); - GXLoadPosMtxImm(local_60, 0); - p_prj[param_0->mPrjType](param_0, local_60); - GXCallDisplayList(p_dl[param_0->mDLType], sizeof(jpa_dl)); + MTXConcat(work->mPosCamMtx, mtx1, mtx2); + GXLoadPosMtxImm(mtx2, GX_PNMTX0); + p_prj[work->mPrjType](work, mtx2); + GXCallDisplayList(p_dl[work->mDLType], sizeof(jpa_dl)); } void JPADrawDBillboard(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) { diff --git a/libs/JSystem/src/JParticle/JPAParticle.cpp b/libs/JSystem/src/JParticle/JPAParticle.cpp index a9294e0b4e..e75cb260d0 100644 --- a/libs/JSystem/src/JParticle/JPAParticle.cpp +++ b/libs/JSystem/src/JParticle/JPAParticle.cpp @@ -204,6 +204,24 @@ void JPABaseParticle::init_c(JPAEmitterWorkData* work, JPABaseParticle* parent) mTexAnmIdx = 0; } +#if TARGET_PC +void JPABaseParticle::interp(JPAEmitterWorkData* work, void const* drawFunc) { + // don't interpolate the first frame + if (mAge == 0) + return; + + if (drawFunc == JPADrawBillboard) { + JPAInterpBillboard(work, this); + } else if (drawFunc == JPADrawRotBillboard) { + JPAInterpRotBillboard(work, this); + } else if (drawFunc == JPADrawDirection) { + JPAInterpDirection(work, this); + } else if (drawFunc == JPADrawRotDirection) { + JPAInterpRotDirection(work, this); + } +} +#endif + bool JPABaseParticle::calc_p(JPAEmitterWorkData* work) { if (++mAge >= mLifeTime) { return true; @@ -247,6 +265,17 @@ bool JPABaseParticle::calc_p(JPAEmitterWorkData* work) { mOffsetPosition.y + mLocalPosition.y * work->mPublicScale.y, mOffsetPosition.z + mLocalPosition.z * work->mPublicScale.z); +#if TARGET_PC + JPABaseShape* pBsp = work->mpRes->getBsp(); + work->mGlobalPtclScl.x = work->mpEmtr->mGlobalPScl.x * pBsp->getBaseSizeX(); + work->mGlobalPtclScl.y = work->mpEmtr->mGlobalPScl.y * pBsp->getBaseSizeY(); + work->mDirType = pBsp->getDirType(); + work->mRotType = pBsp->getRotType(); + work->mDLType = pBsp->getType() == 4 || pBsp->getType() == 8; + work->mPlaneType = work->mDLType ? 2 : pBsp->getBasePlaneType(); + interp(work, (void const*)work->mpRes->mpDrawParticleFuncList[0]); +#endif + return false; } @@ -289,6 +318,23 @@ bool JPABaseParticle::calc_c(JPAEmitterWorkData* work) { mOffsetPosition.y + mLocalPosition.y * work->mPublicScale.y, mOffsetPosition.z + mLocalPosition.z * work->mPublicScale.z); +#if TARGET_PC + JPABaseShape* pBsp = work->mpRes->getBsp(); + JPAChildShape* pCsp = work->mpRes->getCsp(); + if (pCsp->isScaleInherited()) { + work->mGlobalPtclScl.x = work->mpEmtr->mGlobalPScl.x * pBsp->getBaseSizeX(); + work->mGlobalPtclScl.y = work->mpEmtr->mGlobalPScl.y * pBsp->getBaseSizeY(); + } else { + work->mGlobalPtclScl.x = work->mpEmtr->mGlobalPScl.x * pCsp->getScaleX(); + work->mGlobalPtclScl.y = work->mpEmtr->mGlobalPScl.y * pCsp->getScaleY(); + } + work->mDirType = pCsp->getDirType(); + work->mRotType = pCsp->getRotType(); + work->mDLType = pCsp->getType() == 4 || pCsp->getType() == 8; + work->mPlaneType = work->mDLType ? 2 : pCsp->getBasePlaneType(); + interp(work, (void const*)work->mpRes->mpDrawParticleChildFuncList[0]); +#endif + return false; } diff --git a/src/d/actor/d_a_alink.cpp b/src/d/actor/d_a_alink.cpp index 28c979bab4..e14f598487 100644 --- a/src/d/actor/d_a_alink.cpp +++ b/src/d/actor/d_a_alink.cpp @@ -4962,13 +4962,16 @@ int daAlink_c::create() { setArcName(checkWolf()); setOriginalHeap(&mpArcHeap, 0xA2800); + JKRHEAP_NAME(mpArcHeap, "Alink ArcHeap"); if (dComIfG_resLoad(&mPhaseReq, mArcName, mpArcHeap) != cPhs_COMPLEATE_e) { return cPhs_INIT_e; } setShieldArcName(); setOriginalHeap(&mpShieldArcHeap, 0x7000); - if (dComIfG_resLoad(&mShieldPhaseReq, mShieldArcName, mpShieldArcHeap) != cPhs_COMPLEATE_e) { + JKRHEAP_NAME(mpShieldArcHeap, "Alink ShieldArcHeap"); + if (dComIfG_resLoad(&mShieldPhaseReq, mShieldArcName, mpShieldArcHeap) != cPhs_COMPLEATE_e) + { return cPhs_INIT_e; } diff --git a/src/d/actor/d_a_alink_hook.inc b/src/d/actor/d_a_alink_hook.inc index d152190161..73049af08b 100644 --- a/src/d/actor/d_a_alink_hook.inc +++ b/src/d/actor/d_a_alink_hook.inc @@ -18,6 +18,10 @@ enum { }; void daAlink_c::hsChainShape_c::draw() { + if (dusk::getSettings().game.superClawshot) { + return; + } + static const int dummy = 0; daAlink_c* alink = (daAlink_c*)getUserArea(); diff --git a/src/d/actor/d_a_alink_swindow.inc b/src/d/actor/d_a_alink_swindow.inc index 81c7a1ca18..4f651e16e2 100644 --- a/src/d/actor/d_a_alink_swindow.inc +++ b/src/d/actor/d_a_alink_swindow.inc @@ -46,7 +46,6 @@ void daAlink_c::setOriginalHeap(JKRExpHeap** i_ppheap, u32 i_size) { JKRHeap* parent = mDoExt_getGameHeap(); JKRExpHeap* heap = JKRExpHeap::create(size + (var_r29 + var_r28), parent, true); - JKRHEAP_NAME(heap, "Alink original"); *i_ppheap = heap; } } diff --git a/src/d/actor/d_a_mirror.cpp b/src/d/actor/d_a_mirror.cpp index 86ef4314f3..5c5218328e 100644 --- a/src/d/actor/d_a_mirror.cpp +++ b/src/d/actor/d_a_mirror.cpp @@ -40,6 +40,7 @@ dMirror_packet_c::dMirror_packet_c() { void dMirror_packet_c::reset() { #if TARGET_PC mbReset = true; + mbHadEntry = false; #else mModelCount = 0; #endif @@ -84,11 +85,21 @@ void dMirror_packet_c::calcMinMax() { } int dMirror_packet_c::entryModel(J3DModel* i_model) { +#if TARGET_PC + if (mbReset) { + mModelCount = 0; + mbReset = false; + } +#endif + if (mModelCount >= 0x40) { return 0; } mModels[mModelCount++] = i_model; +#if TARGET_PC + mbHadEntry = true; +#endif return 1; } @@ -592,13 +603,6 @@ int daMirror_c::execute() { return 1; } -#if TARGET_PC - if (mPacket.mbReset) { - mPacket.mModelCount = 0; - mPacket.mbReset = false; - } -#endif - daPy_py_c* player = daPy_getLinkPlayerActorClass(); JUT_ASSERT(0, player != NULL); @@ -624,6 +628,12 @@ int daMirror_c::draw() { mDoExt_modelUpdateDL(mpModel); } +#if TARGET_PC + if (mPacket.mbReset && !mPacket.mbHadEntry) { + mPacket.mModelCount = 0; + } + mPacket.mbHadEntry = true; +#endif dComIfGd_getOpaListBG()->entryImm(&mPacket, 0); return 1; } diff --git a/src/d/actor/d_a_obj_balloon.cpp b/src/d/actor/d_a_obj_balloon.cpp index 4425483bef..d857a569ba 100644 --- a/src/d/actor/d_a_obj_balloon.cpp +++ b/src/d/actor/d_a_obj_balloon.cpp @@ -62,6 +62,16 @@ void daObj_Balloon_c::saveBestScore() { dComIfGp_setMessageCountNumber(m_balloon_score); } +#if TARGET_PC +static void minigameReset() { + // !@bug d_a_obj_balloon.rel unload used to zero these file-statics; with static linking they dangle across scenes. + m_combo_type = 0xFFFFFFFF; + m_combo_count = 0; + m_combo_next_score = 0; + m_balloon_score = 0; +} +#endif + static u8 hio_set; static daObj_Balloon_HIO_c l_HIO; @@ -205,13 +215,6 @@ int daObj_Balloon_c::_delete() { Z2GetAudioMgr()->seStop(Z2SE_OBJ_WATERMILL_ROUND, 0); if (mHIOInit) { hio_set = false; -#ifdef TARGET_PC - // !@bug d_a_obj_balloon.rel unload used to zero these file-statics; with static linking they dangle across scenes. - m_combo_type = 0xFFFFFFFF; - m_combo_count = 0; - m_combo_next_score = 0; - m_balloon_score = 0; -#endif } return 1; } @@ -253,6 +256,7 @@ int daObj_Balloon_c::create() { } if (!hio_set) { + IF_DUSK(minigameReset()); mHIOInit = true; hio_set = true; l_HIO.field_0x04 = -1; diff --git a/src/d/d_camera.cpp b/src/d/d_camera.cpp index 09ed30d9f7..96ffdf97d3 100644 --- a/src/d/d_camera.cpp +++ b/src/d/d_camera.cpp @@ -1487,7 +1487,7 @@ void dCamera_c::CalcTrimSize() { mTrimHeight += -mTrimHeight * 0.25f; break; case 2: -#if WIDESCREEN_SUPPORT +#if !TARGET_PC && WIDESCREEN_SUPPORT if (mDoGph_gInf_c::isWide() && mDoGph_gInf_c::isWideZoom()) { mTrimHeight += (16.0f - mTrimHeight) * 0.25f; break; @@ -11154,12 +11154,25 @@ static int camera_draw(camera_process_class* i_this) { } #endif - int trim_height = body->TrimHeight(); - #if TARGET_PC + auto trim_height = body->TrimHeight(); + + if (mDoGph_gInf_c::isWideZoom()) { + const auto target_ar = FB_WIDTH / (FB_HEIGHT - trim_height * 2.0f); + const auto current_ar = mDoGph_gInf_c::m_safeWidthF / mDoGph_gInf_c::m_safeHeightF; + + if (current_ar < target_ar) { + trim_height = FB_HEIGHT / 2.0f * (1.0f - current_ar / target_ar); + } else { + trim_height = 0.0f; + } + } + trim_height *= viewport->height / FB_HEIGHT; window->setScissor(0.0f, trim_height, viewport->width, viewport->height - trim_height * 2.0f); #else + int trim_height = body->TrimHeight(); + window->setScissor(0.0f, trim_height, FB_WIDTH, FB_HEIGHT - trim_height * 2.0f); #endif diff --git a/src/d/d_drawlist.cpp b/src/d/d_drawlist.cpp index 373791f994..1f16b2f655 100644 --- a/src/d/d_drawlist.cpp +++ b/src/d/d_drawlist.cpp @@ -22,6 +22,10 @@ #include "dusk/frame_interpolation.h" #include "dusk/gx_helper.h" #include "dusk/logging.h" + +static const void* getInterpKey(const void* base, int idx) { + return reinterpret_cast(reinterpret_cast(base) ^ idx); +} #endif class dDlst_2Dm_c { @@ -1062,7 +1066,15 @@ void dDlst_shadowReal_c::reset() { } void dDlst_shadowReal_c::imageDraw(Mtx param_0) { - GXSetProjection(mRenderProjMtx, GX_ORTHOGRAPHIC); +#ifdef TARGET_PC + Mtx render_proj_mtx; + if (dusk::frame_interp::lookup_replacement(getInterpKey(mpModels[0], 2), render_proj_mtx)) { + GXSetProjection(render_proj_mtx, GX_ORTHOGRAPHIC); + } else +#endif + { + GXSetProjection(mRenderProjMtx, GX_ORTHOGRAPHIC); + } JUT_ASSERT(1916, mModelNum); J3DModelData* model_data; J3DModel** models = mpModels; @@ -1075,7 +1087,15 @@ void dDlst_shadowReal_c::imageDraw(Mtx param_0) { for (u16 j = 0; j < model_data->getShapeNum(); j++) { if (!model_data->getShapeNodePointer(j)->checkFlag(1)) { shape_pkt = (*models)->getShapePacket(j); - shape_pkt->setBaseMtxPtr(&mViewMtx); +#ifdef TARGET_PC + Mtx view_mtx; + if (dusk::frame_interp::lookup_replacement(getInterpKey(mpModels[0], 1), view_mtx)) { + shape_pkt->setBaseMtxPtr(&view_mtx); + } else +#endif + { + shape_pkt->setBaseMtxPtr(&mViewMtx); + } shape_pkt->drawFast(); shape_pkt->setBaseMtxPtr((Mtx*)param_0); } @@ -1096,7 +1116,18 @@ void dDlst_shadowReal_c::draw() { GXSetVtxDesc(GX_VA_POS, GX_DIRECT); GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); GXSetCurrentMtx(GX_PNMTX0); - GXLoadTexMtxImm(mReceiverProjMtx, GX_TEXMTX0, GX_MTX3x4); +#ifdef TARGET_PC + Mtx view_mtx, recv_proj_mtx; + const auto have_view_mtx = dusk::frame_interp::lookup_replacement(getInterpKey(mpModels[0], 1), view_mtx); + const auto have_recv_proj_mtx = dusk::frame_interp::lookup_replacement(getInterpKey(mpModels[0], 3), recv_proj_mtx); + if (have_view_mtx && have_recv_proj_mtx) { + cMtx_concat(recv_proj_mtx, view_mtx, recv_proj_mtx); + GXLoadTexMtxImm(recv_proj_mtx, GX_TEXMTX0, GX_MTX3x4); + } else +#endif + { + GXLoadTexMtxImm(mReceiverProjMtx, GX_TEXMTX0, GX_MTX3x4); + } mShadowRealPoly.draw(); } @@ -1253,6 +1284,13 @@ u8 dDlst_shadowReal_c::setShadowRealMtx(cXyz* param_0, cXyz* param_1, f32 param_ cMtx_lookAt(mViewMtx, &local_64, param_1, 0); C_MTXOrtho(mRenderProjMtx, param_2, -param_2, -param_2, param_2, 1.0f, 10000.0f); C_MTXLightOrtho(mReceiverProjMtx, param_2, -param_2, -param_2, param_2, 0.5f, -0.5f, 0.5f, 0.5f); + +#ifdef TARGET_PC + const auto keybase = mpModels[0]; + dusk::frame_interp::record_final_mtx(mViewMtx, getInterpKey(keybase, 1)); + dusk::frame_interp::record_final_mtx(mRenderProjMtx, getInterpKey(keybase, 2)); + dusk::frame_interp::record_final_mtx(mReceiverProjMtx, getInterpKey(keybase, 3)); +#endif cMtx_concat(mReceiverProjMtx, mViewMtx, mReceiverProjMtx); return r29; } @@ -1277,6 +1315,10 @@ u32 dDlst_shadowReal_c::set(u32 i_key, J3DModel* i_model, cXyz* param_2, f32 par } } +#ifdef TARGET_PC + // provide a stable key for interpolation + mpModels[0] = i_model; +#endif field_0x1 = setShadowRealMtx(&sp60, param_2, param_3, param_4, param_7, param_5); if (!field_0x1) { @@ -1370,12 +1412,6 @@ void dDlst_shadowSimple_c::draw() { GXCallDisplayList(l_shadowVolumeDL, 0x40); } -#if TARGET_PC -static const void* getInterpKey(const void* base, int idx) { - return reinterpret_cast(reinterpret_cast(base) ^ idx); -} -#endif - void dDlst_shadowSimple_c::set(cXyz* param_0, f32 param_1, f32 param_2, cXyz* param_3, s16 param_4, f32 param_5, TGXTexObj* param_6) { if (param_5 < 0.0f) { diff --git a/src/d/d_map_path.cpp b/src/d/d_map_path.cpp index f94cdc9475..eca620ef98 100644 --- a/src/d/d_map_path.cpp +++ b/src/d/d_map_path.cpp @@ -16,6 +16,7 @@ #ifdef TARGET_PC constexpr u16 kMapResolutionMultiplier = 4; +constexpr u16 kMapCircleSize = 16 * kMapResolutionMultiplier; #endif void dMpath_n::dTexObjAggregate_c::create() { @@ -32,6 +33,48 @@ void dMpath_n::dTexObjAggregate_c::create() { JUT_ASSERT(74, image->magFilter == GX_NEAR); mDoLib_setResTimgObj(image, mp_texObj[lp1], 0, NULL); } + +#if TARGET_PC + auto hqCircle = JKR_NEW TGXTexObj(); + + static bool hqCircleDrawn = false; + static u8 hqCircleData[kMapCircleSize * kMapCircleSize]; + + if (!hqCircleDrawn) { + const auto center = kMapCircleSize / 2.0f; + const auto radiusSq = center * center; + const auto blocksAcross = kMapCircleSize >> 3; + const auto totalPixels = sizeof(hqCircleData); + + for (size_t i = 0; i < totalPixels; i++) { + // 8x4 block swizzling for I8 + const auto blockIdx = i >> 5; + const auto localIdx = i & 31; + + const auto blockY = blockIdx / blocksAcross; + const auto blockX = blockIdx % blocksAcross; + + const auto localY = localIdx >> 3; + const auto localX = localIdx & 7; + + const auto x = (blockX << 3) + localX; + const auto y = (blockY << 2) + localY; + + const auto dx = (x + 0.5f) - center; + const auto dy = (y + 0.5f) - center; + + // the original texture is in I4 format and uses 1 to indicate if inside the circle + // so we scale to I8 range: 255 / 15 = 17 + hqCircleData[i] = (dx * dx + dy * dy < radiusSq) ? 17 : 0; + } + hqCircleDrawn = true; + } + + GXInitTexObj(hqCircle, hqCircleData, kMapCircleSize, kMapCircleSize, GX_TF_I8, GX_CLAMP, + GX_CLAMP, GX_FALSE); + GXInitTexObjLOD(hqCircle, GX_NEAR, GX_NEAR, 0.0f, 0.0f, 0.0f, GX_FALSE, GX_FALSE, GX_ANISO_1); + mp_texObj[6] = hqCircle; +#endif } void dMpath_n::dTexObjAggregate_c::remove() { diff --git a/src/d/d_menu_dmap.cpp b/src/d/d_menu_dmap.cpp index bb557efdac..8ef7fadd4b 100644 --- a/src/d/d_menu_dmap.cpp +++ b/src/d/d_menu_dmap.cpp @@ -856,7 +856,46 @@ void dMenu_DmapBg_c::decGoldFrameAlphaRate() { setGoldFrameAlphaRate(rate); } +void dMenu_DmapBg_c::dMapBgWide() { + // Scale Base HUD + mBaseScreen->scale(mDoGph_gInf_c::hudAspectScaleUp, 1.0f); + mBaseScreen->translate(mDoGph_gInf_c::getSafeMinXF(), 0.0f); + + // Boss Key, Compass & Map icons + mBaseScreen->search(MULTI_CHAR('key_n'))->scale(mDoGph_gInf_c::hudAspectScaleDown, 1.0f); + mBaseScreen->search(MULTI_CHAR('con_n'))->scale(mDoGph_gInf_c::hudAspectScaleDown, 1.0f); + mBaseScreen->search(MULTI_CHAR('map_n'))->scale(mDoGph_gInf_c::hudAspectScaleDown, 1.0f); + + // Text Header + mBaseScreen->search(MULTI_CHAR('t_t00'))->scale(mDoGph_gInf_c::hudAspectScaleDown, 1.0f); + mBaseScreen->search(MULTI_CHAR('f_t_00'))->scale(mDoGph_gInf_c::hudAspectScaleDown, 1.0f); + + // C Button + mBaseScreen->search(MULTI_CHAR('c_btn2'))->scale(mDoGph_gInf_c::hudAspectScaleDown, 1.0f); + + // Scale Buttons HUD + mButtonScreen->scale(mDoGph_gInf_c::hudAspectScaleUp, 1.0f); + mButtonScreen->translate(mDoGph_gInf_c::getSafeMinXF(), 0.0f); + + // Buttons + mButtonScreen->search(MULTI_CHAR('cont_n'))->scale(mDoGph_gInf_c::hudAspectScaleDown, 1.0f); + + // C Button + mButtonScreen->search(MULTI_CHAR('c_btn'))->scale(mDoGph_gInf_c::hudAspectScaleDown, 1.0f); + mButtonScreen->search(MULTI_CHAR('c_text_s'))->scale(mDoGph_gInf_c::hudAspectScaleDown, 1.0f); + mButtonScreen->search(MULTI_CHAR('c_text'))->scale(mDoGph_gInf_c::hudAspectScaleDown, 1.0f); + mButtonScreen->search(MULTI_CHAR('f_text_s'))->scale(mDoGph_gInf_c::hudAspectScaleDown, 1.0f); + mButtonScreen->search(MULTI_CHAR('f_text'))->scale(mDoGph_gInf_c::hudAspectScaleDown, 1.0f); + + // Decorations + mButtonScreen->search(MULTI_CHAR('kazari_n'))->scale(mDoGph_gInf_c::hudAspectScaleDown, 1.0f); +} + void dMenu_DmapBg_c::draw() { + #if TARGET_PC + dMapBgWide(); + #endif + u32 scissor_left; u32 scissor_top; u32 scissor_width; diff --git a/src/d/d_menu_fmap2D.cpp b/src/d/d_menu_fmap2D.cpp index 8692156daf..f01ef2a10d 100644 --- a/src/d/d_menu_fmap2D.cpp +++ b/src/d/d_menu_fmap2D.cpp @@ -20,6 +20,15 @@ #include "dusk/frame_interpolation.h" #include +#if TARGET_PC +void dMenu_Fmap2DBack_c::fMapBackWide() { + mpBaseScreen->scale(mDoGph_gInf_c::hudAspectScaleUp, 1.0f); + mpBaseScreen->translate(mDoGph_gInf_c::getSafeMinXF(), 0.0f); + mpBackScreen->scale(mDoGph_gInf_c::hudAspectScaleUp, 1.0f); + mpBackScreen->translate(mDoGph_gInf_c::getSafeMinXF(), 0.0f); +} +#endif + dMenu_Fmap2DBack_c::dMenu_Fmap2DBack_c() { dMeter2Info_setMapDrugFlag(0); @@ -267,6 +276,10 @@ dMenu_Fmap2DBack_c::~dMenu_Fmap2DBack_c() { } void dMenu_Fmap2DBack_c::draw() { + #if TARGET_PC + fMapBackWide(); + #endif + calcBlink(); J2DGrafContext* grafPort = dComIfGp_getCurrentGrafPort(); @@ -1199,7 +1212,7 @@ f32 dMenu_Fmap2DBack_c::getMapScissorAreaSizeX() { } f32 dMenu_Fmap2DBack_c::getMapScissorAreaSizeRealX() { -#if PLATFORM_GCN && !TARGET_PC +#if PLATFORM_GCN return getMapScissorAreaSizeX(); #else return getMapScissorAreaSizeX() * mDoGph_gInf_c::getScale(); @@ -2179,6 +2192,17 @@ void dMenu_Fmap2DBack_c::setArrowPosAxis(f32 i_posX, f32 i_posZ) { control_ypos = 0.0f; } +#if TARGET_PC +void dMenu_Fmap2DTop_c::fMapTopWide() { + mpTitleScreen->search(MULTI_CHAR('spot0_n'))->scale(mDoGph_gInf_c::hudAspectScaleUp, 1.0f); + mpTitleScreen->search(MULTI_CHAR('spot2_n'))->scale(mDoGph_gInf_c::hudAspectScaleUp, 1.0f); + mpTitleScreen->search(MULTI_CHAR('name_n'))->translate(mDoGph_gInf_c::ScaleHUDXLeft(-243.0f), -169.0f); + mpTitleScreen->search(MULTI_CHAR('sub_n_n'))->translate(mDoGph_gInf_c::ScaleHUDXLeft(-80.0f), -154.0f); + mpTitleScreen->search(MULTI_CHAR('btn_i_n'))->translate(mDoGph_gInf_c::ScaleHUDXLeft(-241.0f), 177.0f); + mpTitleScreen->search(MULTI_CHAR('cont_n'))->translate(mDoGph_gInf_c::ScaleHUDXRight(515.0f), 83.0f); +} +#endif + dMenu_Fmap2DTop_c::dMenu_Fmap2DTop_c(JKRExpHeap* i_heap, STControl* i_stick) { mpHeap = i_heap; mTransX = 0.0f; @@ -2572,6 +2596,10 @@ void dMenu_Fmap2DTop_c::setAllAlphaRate(f32 i_rate, bool i_init) { } void dMenu_Fmap2DTop_c::draw() { + #if TARGET_PC + fMapTopWide(); + #endif + u32 scissor_left, scissor_top, scissor_width, scissor_height; J2DOrthoGraph* ctx = static_cast(dComIfGp_getCurrentGrafPort()); ctx->setup2D(); diff --git a/src/d/d_menu_letter.cpp b/src/d/d_menu_letter.cpp index a0155ef6b4..589b2553c0 100644 --- a/src/d/d_menu_letter.cpp +++ b/src/d/d_menu_letter.cpp @@ -17,6 +17,10 @@ #include "d/d_msg_scrn_arrow.h" #include "d/d_lib.h" +#ifdef TARGET_PC +#include "dusk/achievements.h" +#endif + #if VERSION == VERSION_GCN_JPN #define D_MENU_LETTER_LINE_MAX 9 #else @@ -514,6 +518,10 @@ void dMenu_Letter_c::read_open_init() { setAButtonString(0); setBButtonString(0); mpBlackTex->setAlpha(0); + + #ifdef TARGET_PC + dusk::AchievementSystem::get().signal("open_letter"); + #endif } void dMenu_Letter_c::read_open_move() { diff --git a/src/d/d_meter_HIO.cpp b/src/d/d_meter_HIO.cpp index 2df28b2655..584a2852f6 100644 --- a/src/d/d_meter_HIO.cpp +++ b/src/d/d_meter_HIO.cpp @@ -2306,6 +2306,10 @@ void dMeter_drawHIO_c::updateOnWide() { // River Canoe Minigame g_drawHIO.mMiniGame.mCounterPosX[1] = mDoGph_gInf_c::ScaleHUDXRight(g_drawHIO.mMiniGame.mCounterPosX[1]); g_drawHIO.mMiniGame.mIconPosX[1] = mDoGph_gInf_c::ScaleHUDXRight(g_drawHIO.mMiniGame.mIconPosX[1]); + + // Bulblin Count in Hidden Village + g_drawHIO.mMiniGame.mCounterPosX[2] = mDoGph_gInf_c::ScaleHUDXRight(g_drawHIO.mMiniGame.mCounterPosX[2]); + g_drawHIO.mMiniGame.mIconPosX[2] = mDoGph_gInf_c::ScaleHUDXRight(g_drawHIO.mMiniGame.mIconPosX[2]); #endif } diff --git a/src/d/d_msg_class.cpp b/src/d/d_msg_class.cpp index 4040eb0d7f..fab6906ee0 100644 --- a/src/d/d_msg_class.cpp +++ b/src/d/d_msg_class.cpp @@ -1987,13 +1987,6 @@ bool jmessage_tSequenceProcessor::do_isReady() { } #endif -#if TARGET_PC - if (dusk::getSettings().game.instantText && mDoCPd_c::getHoldB(0)) { - field_0xb2 = 1; - pReference->setSendTimer(0); - } -#endif - if (dComIfGp_checkMesgBgm()) { bool isItemMusicPlaying = true; if (mDoAud_checkPlayingSubBgmFlag() != Z2BGM_ITEM_GET && @@ -2066,7 +2059,7 @@ bool jmessage_tSequenceProcessor::do_isReady() { case 0: case 5: case 6: - if (mDoCPd_c::getTrigA(PAD_1) || field_0xb2 != 0) { + if (mDoCPd_c::getTrigA(PAD_1) || field_0xb2 != 0 IF_DUSK(|| (dusk::getSettings().game.instantText && mDoCPd_c::getHoldB(0)))) { field_0xa4 = 0; pReference->onBatchFlag(); pReference->setCharCnt(D_MSG_CLASS_CHAR_CNT_MAX); diff --git a/src/d/d_msg_object.cpp b/src/d/d_msg_object.cpp index ae0e3d8427..00dfc6626e 100644 --- a/src/d/d_msg_object.cpp +++ b/src/d/d_msg_object.cpp @@ -32,6 +32,9 @@ #if TARGET_PC #include "dusk/settings.h" +#include +#include +#include #endif static void dMsgObject_addFundRaising(s16 param_0); @@ -1594,7 +1597,7 @@ u8 dMsgObject_c::isSend() { return 2; } } else { - if (IF_DUSK((dusk::getSettings().game.instantText && mDoCPd_c::getHoldB(0)) ||) + if (IF_DUSK((dusk::getSettings().game.instantText && mDoCPd_c::getHoldB(0) && !isShopItemMessage()) ||) mDoCPd_c::getTrigA(0) != 0 || mDoCPd_c::getTrigB(0) != 0) { return 2; } @@ -1866,6 +1869,40 @@ bool dMsgObject_c::isTalkMessage() { return true; } +#if TARGET_PC +bool dMsgObject_c::isShopItemMessage() { + + // Probably a better way to do this than just listing every message id, but this works for now + // Note: Keep contents sorted so we can use binary search + const auto shopMsgIds = std::to_array>({ + {}, + // zel_01.bmg - Seras Shop + {7001, 7003, 7004, 7005, 7006, 7007, 7008, 7009, 7010, 7013, 7014, 7022, 7023, 7028, 7029, + 7044, 7045, 7053}, + // zel_02.bmg - Kakariko Shops + {5251, 5253, 5254, 5256, 5258, 5259, 5653, 5654, 5656, 5660, 5661, 5664, 5665, 5697, 5698, + 5699, 5803, 5804, 5806, 5810, 5811, 5812, 5814, 5821, 5823, 5824, 5987, 5988, 5989, 5990, + 5991, 5992, 5993, 5994, 5995, 5996, 5997, 5998, 5999}, + // zel_03.bmg - Death Mountain Shop + {5303, 5304, 5306, 5310, 5311, 5314, 5315, 5322, 5323, 5324, 5496, 5497, 5498, 5499}, + // zel_04.bmg - Castle Town Shops + {5407, 5408, 5409, 5410, 5411, 5412, 5413, 5414, 5415, 5416, 5417, 5418, 5419, 5420, 5431, + 5432, 5433, 5434, 5435, 5436, 5437, 5438, 5439, 5440, 5441, 5444, 5449, 5450, 5451, 5452, + 5462}, + // zel_05.bmg - Oocca Shop + {9428, 9429, 9430, 9431, 9432, 9437, 9443, 9448, 9449, 9451, 9459} + }); + + u16 id = mMessageID; + s16 group = dMsgObject_getGroupID(); + if (group < shopMsgIds.size()) { + return std::ranges::binary_search(shopMsgIds[group], id); + } + return false; + +} +#endif + const char* dMsgObject_c::getSmellName() { JMSMesgInfo_c* info_header_p = (JMSMesgInfo_c*)((char*)mpMsgRes + 0x20); char* data_ptr = (char*)info_header_p + info_header_p->header.size; diff --git a/src/dusk/achievements.cpp b/src/dusk/achievements.cpp index e0730447d5..26a302678e 100644 --- a/src/dusk/achievements.cpp +++ b/src/dusk/achievements.cpp @@ -335,18 +335,13 @@ std::vector AchievementSystem::makeEntries() { false, 0, 0, false }, [](Achievement& a, json&) { - static int titleNoDemoFrames = 0; if (fopAcM_SearchByName(fpcNm_TITLE_e) == nullptr) { - titleNoDemoFrames = 0; return; } - const auto* link = static_cast(daPy_getPlayerActorClass()); - if (link != nullptr && dDemo_c::getMode() == 0) { - if (++titleNoDemoFrames >= 60) { + const auto* player = static_cast(daPy_getPlayerActorClass()); + + if (player != nullptr && player->mDemo.getDemoMode() == 1) { a.progress = 1; - } - } else { - titleNoDemoFrames = 0; } }, {} @@ -413,6 +408,41 @@ std::vector AchievementSystem::makeEntries() { } }, {} + }, + { + { + "email_me", + "Email Me", + "Read a letter during the Dark Beast Ganon fight.", + AchievementCategory::Misc, + false, 0, 0, false + }, + [](Achievement& a, json&) { + void* dbgExists = fopAcM_SearchByName(fpcNm_B_MGN_e); + if (dbgExists && AchievementSystem::get().hasSignal("open_letter")) { + a.progress = 1; + } + }, + {} + }, + { + { + "heavy-hitter", + "Heavy Hitter", + "Wear the Iron Boots during the end credits.", + AchievementCategory::Misc, + false, 0, 0, false + }, + [](Achievement& a, json&) { + const auto* link = static_cast(daPy_getPlayerActorClass()); + if (link == nullptr || link->mProcID != daAlink_c::PROC_GANON_FINISH) { + return; + } + if (daPy_getPlayerActorClass()->checkEquipHeavyBoots()) { + a.progress = 1; + } + }, + {} } }; } diff --git a/src/dusk/imgui/ImGuiEventFlags.hpp b/src/dusk/imgui/ImGuiEventFlags.hpp index 694336da03..9928690b9b 100644 --- a/src/dusk/imgui/ImGuiEventFlags.hpp +++ b/src/dusk/imgui/ImGuiEventFlags.hpp @@ -3,6 +3,9 @@ #include #include +#include +#include +#include struct duskImguiEventFlagEntry { uint8_t byteIndex; @@ -839,4 +842,2555 @@ inline const MultiBitEventFlag duskImguiSwappedU16Events[] = { { 0xfd, "Rupees owed to Trill" }, }; +struct EventAreaFlags +{ + uint8_t byteIndex; + uint8_t bitIndex; + uint16_t flagID; + std::string description; +}; + +inline EventAreaFlags eventAreaFlagsAG[] = +{ + { 0x00, 0x80, 0x0080, "Ooccoo Map Flag" }, + { 0x00, 0x40, 0x0040, "fourth small chest epic spinner room" }, + { 0x00, 0x20, 0x0020, "third small chest epic spinner room" }, + { 0x00, 0x10, 0x0010, "first small chest epic spinner room" }, + { 0x00, 0x08, 0x0008, "second small chest epic spinner room" }, + { 0x00, 0x04, 0x0004, "PoH first big chest epic spinner room" }, + { 0x00, 0x02, 0x0002, "small chest first west room" }, + { 0x00, 0x01, 0x0001, "small key big chest elevator room B1" }, + { 0x01, 0x80, 0x0180, "small key big chest first room" }, + { 0x01, 0x20, 0x0120, "small key small chest fouth east room" }, + { 0x01, 0x10, 0x0110, "big key chest" }, + { 0x01, 0x08, 0x0108, "PoH right big chest main room" }, + { 0x01, 0x04, 0x0104, "map left big chest main room" }, + { 0x01, 0x02, 0x0102, "west small chest in second west room" }, + { 0x01, 0x01, 0x0101, "north east small chest in second west room" }, + { 0x02, 0x08, 0x0208, "Spinner big chest" }, + { 0x03, 0x40, 0x0340, "small key small chest first east room B1" }, + { 0x03, 0x20, 0x0320, "small key big chest second east room 2F" }, + { 0x03, 0x10, 0x0310, "compass big chest second east room 2F" }, + { 0x03, 0x08, 0x0308, "big chest first west room" }, + { 0x08, 0x80, 0x0880, "killed second poe (triggers flame getting lit cs)" }, + { 0x08, 0x40, 0x0840, "killed first poe" }, + { 0x08, 0x08, 0x0808, "open gate to spinner in mini-boss room cs" }, + { 0x08, 0x04, 0x0804, "unlock exit in mini-boss room (despawns mini-boss)" }, + { 0x08, 0x01, 0x0801, "unlocked boss door" }, + { 0x09, 0x10, 0x0910, "started pulling chain in second east room 1F (stays set)" }, + { 0x09, 0x04, 0x0904, "stairs to lower east room appeared in main room" }, + { 0x09, 0x02, 0x0902, "risen tracks on pillar before boss" }, + { 0x09, 0x01, 0x0901, "unlocked door in second west room" }, + { 0x0A, 0x10, 0x0A10, "killed second poe (duplicate)" }, + { 0x0A, 0x02, 0x0A02, "Tiny bugs spawn in first room small key area (duplicate)" }, + { 0x0A, 0x01, 0x0A01, "Tiny bugs spawn in first room small key area" }, + { 0x0B, 0x80, 0x0B80, "stairs to lower west room appeared in main room cs" }, + { 0x0B, 0x20, 0x0B20, "turn walls in third room 2B cs" }, + { 0x0B, 0x10, 0x0B10, "turn walls in third room 2B" }, + { 0x0B, 0x08, 0x0B08, "open gates in first room" }, + { 0x0B, 0x04, 0x0B04, "open gates in first room cs" }, + { 0x0B, 0x01, 0x0B01, "Stallord Phase 2" }, + { 0x0C, 0x80, 0x0C80, "killed third poe (triggers flame getting lit cs)" }, + { 0x0C, 0x40, 0x0C40, "Main Hall Dig Spot" }, + { 0x0C, 0x01, 0x0C01, "turned walls in first east room (stays set)" }, + { 0x0D, 0x02, 0x0D02, "turned slab in first east room B1 (stays set)" }, + { 0x0E, 0x10, 0x0E10, "Intro Cutscene" }, + { 0x0F, 0x80, 0x0F80, "unlocked door in second east room 2F" }, + { 0x0F, 0x40, 0x0F40, "open poe door once all poe flames are present (removes poe bodies)" }, + { 0x0F, 0x20, 0x0F20, "poe flame top left present" }, + { 0x0F, 0x10, 0x0F10, "poe flame bottom right present" }, + { 0x0F, 0x08, 0x0F08, "poe flame top right present" }, + { 0x0F, 0x04, 0x0F04, "poe flame bottom left present" }, + { 0x0F, 0x02, 0x0F02, "killed fourth poe (triggers flame getting lit cs)" }, + { 0x0F, 0x01, 0x0F01, "flame from third poe leaving lantern cs" }, + { 0x10, 0x40, 0x1040, "killed third poe (duplicate)" }, + { 0x10, 0x20, 0x1020, "flame from second poe leaving lantern cs" }, + { 0x10, 0x10, 0x1010, "open walls in third east room" }, + { 0x10, 0x08, 0x1008, "unlocked door in elevator room 2B" }, + { 0x10, 0x04, 0x1004, "unlocked door in first room" }, + { 0x10, 0x02, 0x1002, "killed stalfos in second west room" }, + { 0x11, 0x80, 0x1180, "killed gibdo in first east room B1" }, + { 0x11, 0x20, 0x1120, "reach boss door (unset once you enter)" }, + { 0x11, 0x04, 0x1104, "killed third poe (duplicate)" }, + { 0x11, 0x02, 0x1102, "unlock door in second room" }, + { 0x11, 0x01, 0x1101, "lit right torch in second room" }, + { 0x12, 0x80, 0x1280, "lit left torch in second room" }, + { 0x12, 0x40, 0x1240, "close spinner slot for walls in third room 2B" }, + { 0x12, 0x20, 0x1220, "unlocked door in first east room 1F" }, + { 0x12, 0x08, 0x1208, "risen tracks on pillar before boss cs" }, + { 0x12, 0x04, 0x1204, "pushed block in first west room" }, + { 0x12, 0x01, 0x1201, "taken down the cube in the second east room 1F" }, + { 0x13, 0x80, 0x1380, "placed cube at the right spot in the second east room 1F" }, + { 0x13, 0x40, 0x1340, "unlock door in fouth east room" }, + { 0x13, 0x20, 0x1320, "close poe door (unsets after lighting torches)" }, + { 0x13, 0x08, 0x1308, "main room poes taking flames cs" }, + { 0x14, 0x10, 0x1410, "explored first room" }, + { 0x14, 0x08, 0x1408, "open exit door in boss room" }, + { 0x15, 0x80, 0x1580, "Midna Text after defeating boss" }, + { 0x15, 0x08, 0x1508, "killed first stalfos in room before mini-boss" }, + { 0x15, 0x04, 0x1504, "killed second stalfos in room before mini-boss" }, + { 0x15, 0x02, 0x1502, "killed third stalfos in room before mini-boss" }, + { 0x15, 0x01, 0x1501, "extend platform to exit in boss room" }, + { 0x16, 0x80, 0x1680, "open gate to spinner in mini-boss room cs" }, + { 0x16, 0x40, 0x1640, "open gate to spinner in mini-boss room" }, + { 0x16, 0x10, 0x1610, "open wall in third west room cs (unset once you leave)" }, + { 0x16, 0x08, 0x1608, "pulled chain in main room" }, + { 0x16, 0x04, 0x1604, "pulled the chain in first room (triggers cs)" }, + { 0x16, 0x02, 0x1602, "open wall in third west room" }, + { 0x17, 0x40, 0x1740, "killed gibdos in third east room" }, + { 0x17, 0x20, 0x1720, "Ooccoo Rescued" }, + { 0x17, 0x10, 0x1710, "opened gates in room before mini-boss" }, + { 0x17, 0x08, 0x1708, "killed fourth poe (duplicate)" }, + { 0x17, 0x02, 0x1702, "dig spot in third east room" }, + { 0x17, 0x01, 0x1701, "Spinner big chest (set after)" }, +}; + +inline EventAreaFlags eventAreaFlagsCastleTown[] = +{ + { 0x03, 0x02, 0x0302, "small chest on doctor's balcony" }, + { 0x06, 0x10, 0x0610, "tear of light next to Telma's bar" }, + { 0x08, 0x80, 0x0880, "killed poe in Jovani's house (set if you dig into the house)" }, + { 0x08, 0x04, 0x0804, "explored 3nd room Jovani-Sewers " }, + { 0x08, 0x02, 0x0802, "explored 2nd room Jovani-Sewers " }, + { 0x08, 0x01, 0x0801, "?" }, + { 0x09, 0x80, 0x0980, "?" }, + { 0x09, 0x40, 0x0940, "?" }, + { 0x09, 0x20, 0x0920, "?" }, + { 0x09, 0x02, 0x0902, "intro cs twlight" }, + { 0x09, 0x01, 0x0901, "midna text after listening to Telma and Ilia spirits during twilight" }, + { 0x0A, 0x80, 0x0A80, "midna breaking castle barrier cs" }, + { 0x0A, 0x20, 0x0A20, "warp you to Lanayru spring (trigger twilight end)" }, + { 0x0A, 0x10, 0x0A10, "fan girl text next to star tent" }, + { 0x0A, 0x04, 0x0A04, "star tent intro cs" }, + { 0x0A, 0x02, 0x0A02, "invisible wall behind doctor gone" }, + { 0x0A, 0x01, 0x0A01, "?" }, + { 0x0B, 0x80, 0x0B80, "water is back in town (twilight)" }, + { 0x0B, 0x40, 0x0B40, "explored east alley that leads south" }, + { 0x0B, 0x20, 0x0B20, "star tent has double clawshot mini-game" }, + { 0x0B, 0x10, 0x0B10, "explored area with star tent" }, + { 0x0B, 0x08, 0x0B08, "explored alley with entrance to Jovani's house" }, + { 0x0B, 0x04, 0x0B04, "explored alley with entrance to agitha's house" }, + { 0x0B, 0x02, 0x0B02, "explored area with entrance to Telma's bar" }, + { 0x0B, 0x01, 0x0B01, "STAR 1 Completed" }, + { 0x0D, 0x04, 0x0D04, "map marker hero's shade" }, + { 0x0E, 0x10, 0x0E10, "malo mart posters on shop" }, + { 0x0E, 0x08, 0x0E08, "magic armor bought malo mart" }, + { 0x0E, 0x04, 0x0E04, "?" }, + { 0x0E, 0x02, 0x0E02, "enter Telma's bar from top intro cs" }, + { 0x0E, 0x01, 0x0E01, "first right door to castle pushed once (default)" }, + { 0x0F, 0x80, 0x0F80, "first left door to castle pushed once (default)" }, + { 0x0F, 0x40, 0x0F40, "first right door to castle pushed twice" }, + { 0x0F, 0x20, 0x0F20, "first right door to castle half closed" }, + { 0x0F, 0x10, 0x0F10, "first left door to castle closed" }, + { 0x0F, 0x08, 0x0F08, "first left door to castle pushed twice" }, + { 0x0F, 0x04, 0x0F04, "Jovani's house intro cs" }, + { 0x0F, 0x02, 0x0F02, "Jovani text after killing poe" }, + { 0x0F, 0x01, 0x0F01, "open path to sewers (Jovani's house)" }, + { 0x10, 0x80, 0x1080, "?" }, + { 0x16, 0x80, 0x1680, "killed light bug next to Telma's bar" }, + { 0x17, 0x08, 0x1708, "Gengle free (Jovani's house)" }, + { 0x17, 0x04, 0x1704, "Midna opens map to look for the last light bug" }, +}; + +inline EventAreaFlags eventAreaFlagsCitS[] = +{ + { 0x00, 0x08, 0x0008, "south east underwater big chest outside shop" }, + { 0x00, 0x04, 0x0004, "big chest east wing second room 2F" }, + { 0x00, 0x02, 0x0002, "big chest west wing main room 2F" }, + { 0x00, 0x01, 0x0001, "small chest main room 4F outside" }, + { 0x01, 0x80, 0x0180, "small chest west wing north room 2F" }, + { 0x01, 0x40, 0x0140, "center small chest west wing main room 1F" }, + { 0x01, 0x20, 0x0120, "small chest west wing main room B1" }, + { 0x01, 0x10, 0x0110, "north east small chest west wing main room 1F" }, + { 0x01, 0x08, 0x0108, "small chest east wing second room 1F" }, + { 0x01, 0x04, 0x0104, "small chest east wing second room 2F" }, + { 0x01, 0x02, 0x0102, "big chest ouside north wing" }, + { 0x02, 0x80, 0x0280, "small chest west wing main room 3F" }, + { 0x02, 0x40, 0x0240, "small chest main room 3F inside" }, + { 0x02, 0x20, 0x0220, "big key chest" }, + { 0x02, 0x10, 0x0210, "big chest main room 4F outside" }, + { 0x02, 0x08, 0x0208, "small chest west wing main room 2F" }, + { 0x02, 0x02, 0x0202, "PoH big chest west wing main room 3F" }, + { 0x03, 0x80, 0x0380, "small chest west wing north room 3F" }, + { 0x03, 0x40, 0x0340, "PoH big chest west wing north room 2F" }, + { 0x03, 0x20, 0x0320, "small key big chest west wing main room 1F" }, + { 0x03, 0x10, 0x0310, "compass big chest east wing first room B1" }, + { 0x03, 0x08, 0x0308, "south west underwater big chest outside shop" }, + { 0x03, 0x04, 0x0304, "map big chest east wing fourth room 1F" }, + { 0x03, 0x01, 0x0301, "double clawshot big chest east wing fifth room B3" }, + { 0x08, 0x80, 0x0880, "turn on wind in east wing second room 2F" }, + { 0x08, 0x40, 0x0840, "open gate in east wing second room 2F" }, + { 0x08, 0x20, 0x0820, "explored west wing main room 1F (unset if you enter main room)" }, + { 0x08, 0x10, 0x0810, "explored east wing first room 1F (unset if you enter main room)" }, + { 0x08, 0x04, 0x0804, "killed big baba west wing north room 1F" }, + { 0x08, 0x02, 0x0802, "double clawshot big chest east wing fifth room B3 (set after)" }, + { 0x08, 0x01, 0x0801, "west bridge broken" }, + { 0x09, 0x80, 0x0980, "east wing fifth room B3 intro cs" }, + { 0x09, 0x40, 0x0940, "open gate in east wing third room 2F" }, + { 0x09, 0x20, 0x0920, "spawn baba serpants under east bridge" }, + { 0x09, 0x08, 0x0908, "extended east bridge (spinner slot needs to be closed)" }, + { 0x09, 0x04, 0x0904, "extended west bridge (spinner slot needs to be closed)" }, + { 0x09, 0x02, 0x0902, "small key big chest west wing main room 1F (set after)" }, + { 0x0A, 0x80, 0x0A80, "explored main room 1F" }, + { 0x0A, 0x20, 0x0A20, "turn on wind in east wing third room 2F" }, + { 0x0A, 0x10, 0x0A10, "open door in east wing third room 1F" }, + { 0x0A, 0x04, 0x0A04, "fan on ceiling of main room active" }, + { 0x0A, 0x02, 0x0A02, "open gate in east wing fourth room 1F" }, + { 0x0B, 0x80, 0x0B80, "unlock boss door" }, + { 0x0B, 0x40, 0x0B40, "unlock east bridge door 1F" }, + { 0x0B, 0x08, 0x0B08, "east bridge extended (close east spinner slot)" }, + { 0x0B, 0x04, 0x0B04, "west bridge extended (close west spinner slot)" }, + { 0x0B, 0x02, 0x0B02, "open gate outside shop" }, + { 0x0C, 0x08, 0x0C08, "north wing main room intro cs" }, + { 0x0C, 0x04, 0x0C04, "east wing fourth room 2F intro cs" }, + { 0x0C, 0x02, 0x0C02, "went beyond first gate outside shop intro cs" }, + { 0x0C, 0x01, 0x0C01, "Intro CS" }, + { 0x0D, 0x80, 0x0D80, "killed left dynalfos in east wing third room 1F" }, + { 0x0D, 0x40, 0x0D40, "killed right dynalfos in east wing third room 1F" }, + { 0x0D, 0x20, 0x0D20, "?" }, + { 0x0D, 0x10, 0x0D10, "west bridge destroyed cs (triggered when you have a key)" }, + { 0x0D, 0x08, 0x0D08, "killed helmasaurus in main room 1F" }, + { 0x0D, 0x04, 0x0D04, "west bridge extented cs" }, + { 0x0D, 0x02, 0x0D02, "east bridge extented cs" }, + { 0x0E, 0x01, 0x0E01, "small key big chest west wing main room 1F (set after)" }, + { 0x0F, 0x80, 0x0F80, "exited dungeon with midna warp" }, + { 0x0F, 0x40, 0x0F40, "exited dungeon with midna warp" }, + { 0x0F, 0x20, 0x0F20, "save promt after boss" }, + { 0x0F, 0x10, 0x0F10, "open gate in west wing main room B2" }, + { 0x0F, 0x08, 0x0F08, "killed left aeralfos in north wing main room 1F" }, + { 0x0F, 0x04, 0x0F04, "killed right aeralfos in north wing main room 1F" }, + { 0x0F, 0x02, 0x0F02, "open gate in east wing fifth room B3" }, + { 0x0F, 0x01, 0x0F01, "stop fan in east wing fifth room B3" }, + { 0x10, 0x80, 0x1080, "killed third baba serpant under east bridge" }, + { 0x10, 0x10, 0x1010, "killed third tile worm in east wing second room 1F" }, + { 0x10, 0x08, 0x1008, "killed second tile worm in east wing second room 1F" }, + { 0x10, 0x04, 0x1004, "killed first tile worm in east wing second room 1F" }, + { 0x11, 0x20, 0x1120, "killed poe in main room 4F outside" }, + { 0x11, 0x10, 0x1110, "killed poe in west wing main room 2F" }, + { 0x12, 0x20, 0x1220, "small key big chest west wing main room 1F (set after)" }, + { 0x12, 0x02, 0x1202, "latched on to first pillar in east wing first room B2" }, + { 0x13, 0x40, 0x1340, "open door in east wing fifth room B3" }, + { 0x13, 0x10, 0x1310, "?" }, + { 0x15, 0x10, 0x1510, "activate north path fan " }, + { 0x17, 0x40, 0x1740, "killed east dynalfos in main room 3F outside" }, + { 0x17, 0x20, 0x1720, "killed north dynalfos in main room 3F outside" }, + { 0x17, 0x10, 0x1710, "killed dynalfos in west wing north room 3F" }, + { 0x17, 0x08, 0x1708, "killed first baba serpent in path to east spinner slot" }, + { 0x17, 0x04, 0x1704, "killed second baba serpent in path to east spinner slot" }, + { 0x17, 0x02, 0x1702, "killed first baba serpant under east bridge" }, + { 0x17, 0x01, 0x1701, "killed second baba serpant under east bridge" }, +}; + +inline EventAreaFlags eventAreaFlagsCoO[] = +{ + { 0x03, 0x01, 0x0301, "big chest Lanayru Ice Puzzle" }, + { 0x04, 0x80, 0x0480, "big chest right right right path Eldin Long Cave" }, + { 0x04, 0x40, 0x0440, "big chest right right left right path Eldin Long Cave" }, + { 0x04, 0x20, 0x0420, "small chest left right path Eldin Long Cave" }, + //{ 0x08, 0x80, 0x0880, "position of block 1 puzzle 2 Lanayru Ice Puzzle" }, + //{ 0x08, 0x40, 0x0840, "position of block 1 puzzle 2 Lanayru Ice Puzzle" }, + //{ 0x08, 0x20, 0x0820, "position of block 1 puzzle 2 Lanayru Ice Puzzle" }, + //{ 0x08, 0x10, 0x0810, "position of block 1 puzzle 2 Lanayru Ice Puzzle" }, + //{ 0x08, 0x08, 0x0808, "position of block 2 puzzle 2 Lanayru Ice Puzzle" }, + //{ 0x08, 0x04, 0x0804, "position of block 2 puzzle 2 Lanayru Ice Puzzle" }, + //{ 0x08, 0x02, 0x0802, "position of block 2 puzzle 2 Lanayru Ice Puzzle" }, + //{ 0x08, 0x01, 0x0801, "position of block 2 puzzle 2 Lanayru Ice Puzzle" }, + //{ 0x09, 0x80, 0x0980, "position of block 3 puzzle 2 Lanayru Ice Puzzle" }, + //{ 0x09, 0x40, 0x0940, "position of block 3 puzzle 2 Lanayru Ice Puzzle" }, + //{ 0x09, 0x20, 0x0920, "position of block 3 puzzle 2 Lanayru Ice Puzzle" }, + //{ 0x09, 0x10, 0x0910, "position of block 3 puzzle 2 Lanayru Ice Puzzle" }, + //{ 0x09, 0x04, 0x0904, "position of block 1 puzzle 1 Lanayru Ice Puzzle" }, + //{ 0x09, 0x02, 0x0902, "position of block 1 puzzle 1 Lanayru Ice Puzzle" }, + //{ 0x09, 0x01, 0x0901, "position of block 1 puzzle 1 Lanayru Ice Puzzle" }, + //{ 0x0A, 0x80, 0x0A80, "position of block 1 puzzle 1 Lanayru Ice Puzzle" }, + //{ 0x0A, 0x20, 0x0A20, "position of block 2 puzzle 1 Lanayru Ice Puzzle" }, + //{ 0x0A, 0x10, 0x0A10, "position of block 2 puzzle 1 Lanayru Ice Puzzle" }, + //{ 0x0A, 0x08, 0x0A08, "position of block 2 puzzle 1 Lanayru Ice Puzzle" }, + //{ 0x0A, 0x04, 0x0A04, "position of block 2 puzzle 1 Lanayru Ice Puzzle" }, + //{ 0x0B, 0x08, 0x0B08, "position of block 3 puzzle 1 Lanayru Ice Puzzle" }, + //{ 0x0B, 0x04, 0x0B04, "position of block 3 puzzle 1 Lanayru Ice Puzzle" }, + //{ 0x0B, 0x02, 0x0B02, "position of block 3 puzzle 1 Lanayru Ice Puzzle" }, + //{ 0x0B, 0x01, 0x0B01, "position of block 3 puzzle 1 Lanayru Ice Puzzle" }, + { 0x0D, 0x10, 0x0D10, "broke right ice blocking first doorway in Lanayru Ice Puzzle" }, + { 0x0D, 0x08, 0x0D08, "broke left ice blocking first doorway in Lanayru Ice Puzzle" }, + { 0x0D, 0x04, 0x0D04, "open fourth gate in Lanayru Ice Puzzle" }, + { 0x0D, 0x02, 0x0D02, "open third gate in Lanayru Ice Puzzle" }, + { 0x0D, 0x01, 0x0D01, "open second gate in Lanayru Ice Puzzle" }, + { 0x0E, 0x80, 0x0E80, "open first gate in Lanayru Ice Puzzle" }, + //{ 0x0E, 0x40, 0x0E40, "position of block 1 puzzle 3 Lanayru Ice Puzzle" }, + //{ 0x0E, 0x20, 0x0E20, "position of block 1 puzzle 3 Lanayru Ice Puzzle" }, + //{ 0x0E, 0x10, 0x0E10, "position of block 1 puzzle 3 Lanayru Ice Puzzle" }, + //{ 0x0E, 0x08, 0x0E08, "position of block 1 puzzle 3 Lanayru Ice Puzzle" }, + //{ 0x0E, 0x04, 0x0E04, "position of block 1 puzzle 3 Lanayru Ice Puzzle" }, + //{ 0x0E, 0x02, 0x0E02, "position of block 2 puzzle 3 Lanayru Ice Puzzle" }, + //{ 0x0E, 0x01, 0x0E01, "position of block 2 puzzle 3 Lanayru Ice Puzzle" }, + //{ 0x0F, 0x80, 0x0F80, "position of block 2 puzzle 3 Lanayru Ice Puzzle" }, + //{ 0x0F, 0x40, 0x0F40, "position of block 2 puzzle 3 Lanayru Ice Puzzle" }, + //{ 0x0F, 0x20, 0x0F20, "position of block 2 puzzle 3 Lanayru Ice Puzzle" }, + //{ 0x0F, 0x10, 0x0F10, "position of block 3 puzzle 3 Lanayru Ice Puzzle" }, + //{ 0x0F, 0x08, 0x0F08, "position of block 3 puzzle 3 Lanayru Ice Puzzle" }, + //{ 0x0F, 0x04, 0x0F04, "position of block 3 puzzle 3 Lanayru Ice Puzzle" }, + //{ 0x0F, 0x02, 0x0F02, "position of block 3 puzzle 3 Lanayru Ice Puzzle" }, + //{ 0x0F, 0x01, 0x0F01, "position of block 3 puzzle 3 Lanayru Ice Puzzle" }, + { 0x10, 0x80, 0x1080, "spawn big chest right right left right path Eldin Long Cave" }, + { 0x10, 0x40, 0x1040, "lit torch 3 (right right right path) Eldin Long Cave" }, + { 0x13, 0x80, 0x1380, "killed poe on floor 44 in Cave of Ordeals" }, + { 0x13, 0x40, 0x1340, "killed poe on floor 33 in Cave of Ordeals" }, + { 0x13, 0x20, 0x1320, "killed poe on floor 17 in Cave of Ordeals" }, + { 0x13, 0x08, 0x1308, "Cave of Ordeals intro cs" }, + { 0x13, 0x04, 0x1304, "obtained fairy's tears (if unset, you can get it even if you already have some) (also spawns that extra darknut on floor 49)" }, + { 0x13, 0x02, 0x1302, "open floor 1 door in Cave of Ordeals cs" }, + { 0x13, 0x01, 0x1301, "broke ice on floor 21 in Cave of Ordeals" }, + { 0x14, 0x40, 0x1440, "explored section 2 right right left right path Eldin Long Cave" }, + { 0x14, 0x20, 0x1420, "explored section 1 right right left right path Eldin Long Cave" }, + { 0x14, 0x10, 0x1410, "explored section 2 right right left left path Eldin Long Cave" }, + { 0x14, 0x08, 0x1408, "explored section 1 right right left left path Eldin Long Cave" }, + { 0x14, 0x04, 0x1404, "explored section 3 right right left path Eldin Long Cave" }, + { 0x14, 0x02, 0x1402, "explored section 2 right right left path Eldin Long Cave" }, + { 0x14, 0x01, 0x1401, "explored section 1 right right left path Eldin Long Cave" }, + { 0x15, 0x80, 0x1580, "explored section 2 right right right path Eldin Long Cave" }, + { 0x15, 0x40, 0x1540, "explored section 1 right right right path Eldin Long Cave" }, + { 0x15, 0x20, 0x1520, "explored section 3 right right path Eldin Long Cave" }, + { 0x15, 0x10, 0x1510, "explored section 2 right right path Eldin Long Cave" }, + { 0x15, 0x08, 0x1508, "explored section 1 right right path Eldin Long Cave" }, + { 0x15, 0x04, 0x1504, "explored section 1 right left path Eldin Long Cave" }, + { 0x15, 0x02, 0x1502, "explored section 6 right path Eldin Long Cave" }, + { 0x15, 0x01, 0x1501, "explored section 5 right path Eldin Long Cave" }, + { 0x16, 0x80, 0x1680, "explored section 4 right path Eldin Long Cave" }, + { 0x16, 0x40, 0x1640, "explored section 3 right path Eldin Long Cave" }, + { 0x16, 0x20, 0x1620, "explored section 2 right path Eldin Long Cave" }, + { 0x16, 0x10, 0x1610, "explored section 1 right path Eldin Long Cave" }, + { 0x16, 0x08, 0x1608, "explored section 2 left right path Eldin Long Cave" }, + { 0x16, 0x04, 0x1604, "explored section 1 right right path Eldin Long Cave" }, + { 0x16, 0x02, 0x1602, "explored section 2 left left path Eldin Long Cave" }, + { 0x16, 0x01, 0x1601, "explored section 1 right right path Eldin Long Cave" }, + { 0x17, 0x80, 0x1780, "explored section 2 left path Eldin Long Cave" }, + { 0x17, 0x40, 0x1740, "explored section 1 right path Eldin Long Cave" }, + { 0x17, 0x20, 0x1720, "explored section 2 Eldin Long Cave" }, + { 0x17, 0x10, 0x1710, "explored section 1 Eldin Long Cave" }, + { 0x17, 0x08, 0x1708, "lit torch 2 (right path) Eldin Long Cave" }, + { 0x17, 0x04, 0x1704, "lit left torch right right left right path Eldin Long Cave" }, + { 0x17, 0x02, 0x1702, "lit right torch right right left right path Eldin Long Cave" }, + { 0x17, 0x01, 0x1701, "killed poe right right left left path Eldin Long Cave" }, +}; + +inline EventAreaFlags eventAreaFlagsEldin[] = +{ + { 0x00, 0x01, 0x0001, "Big chest from torches graveyard" }, + { 0x01, 0x80, 0x0180, "Small chest in the inn" }, + { 0x01, 0x40, 0x0140, "PoH big chest death mountain archer alcove" }, + { 0x01, 0x20, 0x0120, "PoH big chest underwater behind spring" }, + { 0x01, 0x10, 0x0110, "Big chest next to watch tower" }, + { 0x01, 0x04, 0x0104, "?" }, + { 0x01, 0x02, 0x0102, "Big chest watch house" }, + { 0x01, 0x01, 0x0101, "tear of light death mountain hot spring water" }, + { 0x02, 0x80, 0x0280, "tear of light next to howling stone death mountain " }, + { 0x02, 0x40, 0x0240, "tear of light death mountain base" }, + { 0x02, 0x10, 0x0210, "tear of light sancuary basement" }, + { 0x02, 0x08, 0x0208, "tear of light Barnes storage house" }, + { 0x02, 0x04, 0x0204, "tear of light watch tower" }, + { 0x02, 0x02, 0x0202, "tear of light at Malo mart" }, + { 0x02, 0x01, 0x0201, "tear of light inn fire room" }, + { 0x03, 0x80, 0x0380, "tear of light Barnes shop" }, + { 0x03, 0x40, 0x0340, "tear of light graveyard" }, + { 0x03, 0x20, 0x0320, "tear of light Barnes storage house" }, + { 0x03, 0x10, 0x0310, "tear of light Barnes storage house" }, + { 0x03, 0x08, 0x0308, "tear of light sancuary basement" }, + { 0x03, 0x04, 0x0304, "tear of light sancuary basement" }, + { 0x03, 0x02, 0x0302, "tear of light ant house" }, + { 0x03, 0x01, 0x0301, "tear of light inn back room" }, + { 0x08, 0x80, 0x0880, "Kakariko Village Portal" }, + { 0x08, 0x40, 0x0840, "kakariko shadow beasts barrier appears (unset after fight)" }, + { 0x08, 0x20, 0x0820, "DM big rock fell" }, + { 0x08, 0x10, 0x0810, "done midna jumps 4 death mountain (hot spring water)" }, + { 0x08, 0x08, 0x0808, "done midna jumps 3 death mountain (1st floor)" }, + { 0x08, 0x04, 0x0804, "killed death mountain shadow beasts cs (unset later?)" }, + { 0x08, 0x01, 0x0801, "done midna jumps 1 death mountain (entrance)" }, + { 0x09, 0x80, 0x0980, "Malo mart has banners inside" }, + { 0x09, 0x40, 0x0940, "DM proper human intro CS (Map marker GM)" }, + { 0x09, 0x20, 0x0920, "Death Mountain Portal" }, + { 0x09, 0x10, 0x0910, "death mountain dark beasts barrier appears" }, + { 0x09, 0x08, 0x0908, "?" }, + { 0x09, 0x04, 0x0904, "?" }, + { 0x09, 0x02, 0x0902, "killed HV bublins (unset when cats spawn)" }, + { 0x09, 0x01, 0x0901, "killed light bug death mountain hot spring water" }, + { 0x0A, 0x80, 0x0A80, "killed light bug next to howling stone death mountain " }, + { 0x0A, 0x40, 0x0A40, "killed light bug death mountain base" }, + { 0x0A, 0x20, 0x0A20, "trigger twilight end cs (vessel of light filled) (Hot Spring Water Present on map)" }, + { 0x0A, 0x10, 0x0A10, "killed light bug sancuary basement" }, + { 0x0A, 0x04, 0x0A04, "killed light bug watch tower" }, + { 0x0A, 0x02, 0x0A02, "killed light bug malo mart" }, + { 0x0A, 0x01, 0x0A01, "killed light bug inn fire room" }, + { 0x0B, 0x80, 0x0B80, "killed light bug Barnes shop" }, + { 0x0B, 0x40, 0x0B40, "killed light bug graveyard" }, + { 0x0B, 0x08, 0x0B08, "killed light bug sancuary basement" }, + { 0x0B, 0x04, 0x0B04, "killed light bug sancuary basement" }, + { 0x0B, 0x02, 0x0B02, "killed light bug ant house" }, + { 0x0B, 0x01, 0x0B01, "killed light bug inn bedroom" }, + { 0x0C, 0x80, 0x0C80, "saw light bug enter Barnes storage house twilight cs" }, + { 0x0C, 0x40, 0x0C40, "malo mart sells hawkeye (moves potion to the right) (set when starting bow mini-game)" }, + { 0x0C, 0x20, 0x0C20, "malo mart sells arrows" }, + { 0x0C, 0x10, 0x0C10, "broke sanctuary roof patch during twilight (duplicate)" }, + { 0x0C, 0x08, 0x0C08, "box moved ant house (spawns light bug)" }, + { 0x0C, 0x04, 0x0C04, "Unknown crashes if rocks are pushed" }, + { 0x0C, 0x02, 0x0C02, "malo mart hylian shield bought" }, + { 0x0C, 0x01, 0x0C01, "ant house explored" }, + { 0x0D, 0x80, 0x0D80, "entered sanctuary from roof during twilight" }, + { 0x0D, 0x40, 0x0D40, "enter Barnes shop through the window in twilight cs" }, + { 0x0D, 0x20, 0x0D20, "light bug comes out of box in ant house cs" }, + { 0x0D, 0x10, 0x0D10, "spawn PoH cat mini game hidden village" }, + { 0x0D, 0x08, 0x0D08, "malo mart hawkeye sold out (needs to be set for arrows to show up)" }, + { 0x0D, 0x04, 0x0D04, "lit all torches in sanctuary twilight (opens basment)" }, + { 0x0D, 0x02, 0x0D02, "light bug in inn fireplace jumps out cs" }, + { 0x0D, 0x01, 0x0D01, "lit inn fireplace" }, + { 0x0E, 0x80, 0x0E80, "knocked down dresser in Barnes shop twilight cs" }, + { 0x0E, 0x40, 0x0E40, "?" }, + { 0x0E, 0x20, 0x0E20, "? (malo mart explored)" }, + { 0x0E, 0x10, 0x0E10, "lit west torch in sanctuary twilight" }, + { 0x0E, 0x08, 0x0E08, "lit north east torch in sanctuary twilight" }, + { 0x0E, 0x04, 0x0E04, "lit east torch in sanctuary twilight" }, + { 0x0E, 0x02, 0x0E02, "lit north west torch in sanctuary twilight" }, + { 0x0F, 0x80, 0x0F80, "broke ant house roof patch (duplicate)" }, + { 0x0F, 0x40, 0x0F40, "moved death mountain rock to exit" }, + { 0x0F, 0x20, 0x0F20, "Eldin spirit talks to Link after getting kakariko Portal cs" }, + { 0x0F, 0x10, 0x0F10, "broke ant house roof patch" }, + { 0x0F, 0x08, 0x0F08, "broke window of Barnes shop twilight" }, + { 0x0F, 0x04, 0x0F04, "broke sanctuary roof patch during twilight" }, + { 0x0F, 0x02, 0x0F02, "Renado talks to Link after trying to go up death mountain trail" }, + { 0x0F, 0x01, 0x0F01, "killed kakariko shadow beasts cs" }, + { 0x10, 0x80, 0x1080, "Killed poe watch tower" }, + { 0x10, 0x40, 0x1040, "Killed poe Barnes storage house" }, + { 0x10, 0x20, 0x1020, "blown up rock underwater to lake hylia from graveward" }, + { 0x10, 0x10, 0x1010, "Graveyard intro cs" }, + { 0x10, 0x08, 0x1008, "explored zora tombstone area" }, + { 0x10, 0x04, 0x1004, "broke floor patch in graveyard during twilight" }, + { 0x10, 0x02, 0x1002, "Killed poe death mountain" }, + { 0x10, 0x01, 0x1001, "Killed poe graveyard center" }, + { 0x11, 0x80, 0x1180, "Killed poe graveyard tombstone" }, + { 0x11, 0x40, 0x1140, "gorons in kakariko hot spring water gone" }, + { 0x11, 0x20, 0x1120, "Map Marker Sanctuary" }, + { 0x11, 0x08, 0x1108, "Midna text after DM big rock fell" }, + { 0x11, 0x04, 0x1104, "done midna jumps 2 death mountain (base floor)" }, + { 0x11, 0x02, 0x1102, "death mountain proper intro cs twilight" }, + { 0x11, 0x01, 0x1101, "moved death mountain rock to hot spring water" }, + { 0x12, 0x80, 0x1280, "sanctuary basement canon room explored" }, + { 0x12, 0x40, 0x1240, "done Midna jumps in sanctuary basement" }, + { 0x12, 0x20, 0x1220, "Midna text before Midna jumps in sanctuary basement" }, + { 0x12, 0x10, 0x1210, "sanctuary twilight cs" }, + { 0x12, 0x08, 0x1208, "killed right shadow bulblin inside inn twilight" }, + { 0x12, 0x04, 0x1204, "killed left shadow bulblin inside inn twilight" }, + { 0x12, 0x02, 0x1202, "killed top shadow bulblin inside inn twilight" }, + { 0x12, 0x01, 0x1201, "enter central room of inn during twilight cs" }, + { 0x13, 0x80, 0x1380, "sanctuary basement hallway to canon explored" }, + { 0x13, 0x40, 0x1340, "Malo mart shield on counter (requires reload)" }, + { 0x13, 0x20, 0x1320, "Kakariko intro cs" }, + { 0x13, 0x10, 0x1310, "blown up rocks on kakariko cliff PoH" }, + { 0x13, 0x08, 0x1308, "Blown up rock to secret passage to back of spring (updates map)" }, + { 0x13, 0x04, 0x1304, "Barnes storage house not blown up (unset once you enter) (twilight)" }, + { 0x13, 0x02, 0x1302, "Barnes storage house blew up cs (also changes map)" }, + { 0x13, 0x01, 0x1301, "Killed poe hidden village" }, + { 0x14, 0x80, 0x1480, "Midna text after sanctuary twilight cs" }, + { 0x14, 0x20, 0x1420, "light bug comes out of dresser in Barnes shop twilight" }, + { 0x14, 0x10, 0x1410, "GM save prompt" }, + { 0x14, 0x08, 0x1408, "Barnes sells Bombs" }, + { 0x14, 0x04, 0x1404, "midna text after shad leaves canon room" }, + { 0x14, 0x02, 0x1402, "Hero's shade map marker" }, + { 0x14, 0x01, 0x1401, "done midna jumps to top of sanctuary (also unlocks it)" }, + { 0x15, 0x80, 0x1580, "blown up rock underwater behind spring" }, + { 0x15, 0x40, 0x1540, "malo mart sells red potion on right slot" }, + { 0x15, 0x20, 0x1520, "beat bow mini-game" }, + { 0x15, 0x10, 0x1510, "malo mart sells red potion on left slot (default)" }, + { 0x15, 0x08, 0x1508, "explored bedroom in the inn" }, + { 0x15, 0x04, 0x1504, "explored central room in the inn" }, + { 0x15, 0x02, 0x1502, "blown up right rock underwater zora tombstone area" }, + { 0x15, 0x01, 0x1501, "midna text after charging dominion rod" }, + { 0x16, 0x80, 0x1680, "Goron lets you enter elevator in sumo hall" }, + { 0x16, 0x40, 0x1640, "Midna text after blowing up Barnes storage house" }, + { 0x16, 0x20, 0x1620, "hit third target in bow mini-game" }, + { 0x16, 0x10, 0x1610, "saved Colin cs (malo mart now open)" }, + { 0x16, 0x04, 0x1604, "Midna text after meeting the kids after twilight" }, + { 0x16, 0x02, 0x1602, "Started Rutela escort" }, + { 0x16, 0x01, 0x1601, "hit second target in bow mini-game" }, + { 0x17, 0x80, 0x1780, "hit first target in bow mini-game" }, + { 0x17, 0x40, 0x1740, "rock to zora tombstone gone + Barnes sells water bombs" }, + { 0x17, 0x20, 0x1720, "Followed Rutela to graveyard" }, + { 0x17, 0x10, 0x1710, "death mountain path intro cs twilight" }, + { 0x17, 0x08, 0x1708, "owl statue possessed cs (sanctuary basement)" }, + { 0x17, 0x04, 0x1704, "done midna jumps ant house (also unlocks it)" }, + { 0x17, 0x02, 0x1702, "Impaz in her house (hidden village)" }, + { 0x17, 0x01, 0x1701, "can't transform in hidden village (if bit 2 is set you can)" }, + { 0x1A, 0x40, 0x1A40, "picked up rupees from right rock underwater zora tombstone area" }, + { 0x1A, 0x20, 0x1A20, "picked up rupees from rock underwater behind spring" }, + { 0x1A, 0x10, 0x1A10, "Free standing PoH kakariko cliff" }, + { 0x1A, 0x08, 0x1A08, "Free standing PoH cat mini game hidden village" }, + { 0x1A, 0x04, 0x1A04, "picked up silver rupee from bell above sanctuary" }, + { 0x1A, 0x02, 0x1A02, "picked up yellow rupee in box secret passage to spring" }, + { 0x1A, 0x01, 0x1A01, "picked up blue rupee in box secret passage to spring" }, + { 0x1B, 0x80, 0x1B80, "picked up yellow rupee in box next to kakariko hot spring water" }, + { 0x1B, 0x40, 0x1B40, "picked up yellow rupee behind dresser inn bedroom" }, + { 0x1B, 0x20, 0x1B20, "picked up red rupee in box on platform above ant house" }, + { 0x1B, 0x10, 0x1B10, "picked up blue rupee behind dresser inn 2nd floor" }, + { 0x1B, 0x08, 0x1B08, "picked up yellow rupee 1 on leadge of top of death montain" }, + { 0x1B, 0x04, 0x1B04, "picked up yellow rupee 2 on leadge of top of death montain" }, + { 0x1B, 0x02, 0x1B02, "picked up yellow rupee 3 on leadge of top of death montain" }, + { 0x1B, 0x01, 0x1B01, "picked up rupee in death montain in rock below pipe (need BaC and rang)" }, +}; + +inline EventAreaFlags eventAreaFlagsFaron[] = +{ + { 0x00, 0x80, 0x0080, "small chest in lantern cave" }, + { 0x00, 0x40, 0x0040, "HP Chest Coro-Mist shortcut" }, + { 0x00, 0x20, 0x0020, "big chest mist area" }, + { 0x00, 0x10, 0x0010, "small chest mist area trunk" }, + { 0x00, 0x08, 0x0008, "small chest mist area next to key cave" }, + { 0x00, 0x04, 0x0004, "PoH chest key cave" }, + { 0x00, 0x01, 0x0001, "Small key cave key chest" }, + { 0x01, 0x80, 0x0180, "Dig Tear #1" }, + { 0x01, 0x20, 0x0120, "Final Tear #1" }, + { 0x01, 0x10, 0x0110, "Final Tear #2" }, + { 0x01, 0x04, 0x0104, "Wall Tear #1 (Mist Area)" }, + { 0x01, 0x02, 0x0102, "Wall Tear #2 (Mist Area)" }, + { 0x02, 0x40, 0x0240, "Tree Tear #1" }, + { 0x02, 0x20, 0x0220, "Tree Tear #2" }, + { 0x02, 0x10, 0x0210, "Tree Tear #3" }, + { 0x02, 0x08, 0x0208, "Gate Tear #1" }, + { 0x02, 0x02, 0x0202, "Coro Tear #1 (inside)" }, + { 0x02, 0x01, 0x0201, "Dig Tear #2" }, + { 0x03, 0x40, 0x0340, "Tear #2" }, + { 0x03, 0x20, 0x0320, "Gate Tear #2" }, + { 0x03, 0x10, 0x0310, "Coro Tear #2 (inside)" }, + { 0x03, 0x02, 0x0302, "Tear #1" }, + { 0x03, 0x01, 0x0301, "Coro Tear (outisde)" }, + { 0x04, 0x80, 0x0480, "Yellow Rupee Chest (N-Faron)" }, + { 0x08, 0x80, 0x0880, "explored east section of mist area after midna jump 1 twilight (gets unset)" }, + { 0x08, 0x40, 0x0840, "explored section with south entrance of mist area (gets unset)" }, + { 0x08, 0x10, 0x0810, "went up east section of mist area after midna jump 1 twilight" }, + { 0x08, 0x08, 0x0808, "S Faron warp twilight fences fall cs" }, + { 0x08, 0x04, 0x0804, "Sky character under owl statue" }, + { 0x08, 0x02, 0x0802, "midna jump 1 mist area (duplicate)" }, + { 0x08, 0x01, 0x0801, "unlock midna jump 1 mist area" }, + { 0x09, 0x80, 0x0980, "Coro spirits talk after killing light bugs in his house" }, + { 0x09, 0x40, 0x0940, "midna jump to Coro's house" }, + { 0x09, 0x20, 0x0920, "Map marker owl statue" }, + { 0x09, 0x10, 0x0910, "opened mist area gate to N faron" }, + { 0x09, 0x08, 0x0908, "lit torch 2 in lantern cave" }, + { 0x09, 0x04, 0x0904, "Talked to Midna next to the deku babas before Coro" }, + { 0x09, 0x02, 0x0902, "Rescued Monkey from Puppets" }, + { 0x09, 0x01, 0x0901, "dug behind Coro gate in twilight" }, + { 0x0A, 0x80, 0x0A80, "took Midna back s warp fight" }, + { 0x0A, 0x40, 0x0A40, "S warp shadow beast revive cs" }, + { 0x0A, 0x20, 0x0A20, "trigger twilight end cs (vessel of light filled)" }, + { 0x0A, 0x10, 0x0A10, "unlocked Coro gate" }, + { 0x0A, 0x08, 0x0A08, "Explored path to sacred grove" }, + { 0x0A, 0x04, 0x0A04, "burned cobweb in front of forest temple" }, + { 0x0A, 0x02, 0x0A02, "see spirit in front of FT twilight cs" }, + { 0x0A, 0x01, 0x0A01, "enter twilight cs" }, + { 0x0B, 0x40, 0x0B40, "talked to the light spirit in twilight" }, + { 0x0B, 0x20, 0x0B20, "saw light bugs dig underground mist area exit twilight" }, + { 0x0B, 0x10, 0x0B10, "Blown up rock next to Coro" }, + { 0x0B, 0x08, 0x0B08, "n warp fight fences appear cs" }, + { 0x0B, 0x04, 0x0B04, "North Faron Portal" }, + { 0x0B, 0x02, 0x0B02, "FT save prompt" }, + { 0x0C, 0x80, 0x0C80, "got lantern back after monkey follow" }, + { 0x0C, 0x40, 0x0C40, "saw light bugs move inside Coro's house cs" }, + { 0x0C, 0x20, 0x0C20, "in monkey follow (gets unset afterwards)" }, + { 0x0C, 0x10, 0x0C10, "Trill lets you shop" }, + { 0x0C, 0x04, 0x0C04, "killed left bokoblin before Trill after twilight" }, + { 0x0C, 0x02, 0x0C02, "killed right bokoblin before Trill after twilight" }, + { 0x0C, 0x01, 0x0C01, "explored section 6 in lantern cave" }, + { 0x0D, 0x80, 0x0D80, "explored section 5 in lantern cave" }, + { 0x0D, 0x40, 0x0D40, "explored section 4 in lantern cave" }, + { 0x0D, 0x20, 0x0D20, "explored section 3 in lantern cave" }, + { 0x0D, 0x10, 0x0D10, "explored section 2 in lantern cave" }, + { 0x0D, 0x08, 0x0D08, "explored section 1 in lantern cave" }, + { 0x0D, 0x04, 0x0D04, "got Coro key from Coro" }, + { 0x0D, 0x02, 0x0D02, "?" }, + { 0x0D, 0x01, 0x0D01, "killed right bokoblin next to Talo's cage" }, + { 0x0E, 0x80, 0x0E80, "killed left bokoblin next to Talo's cage" }, + { 0x0E, 0x40, 0x0E40, "broke Talo's cage" }, + { 0x0E, 0x20, 0x0E20, "killed both bokoblins next to Talo's cage" }, + { 0x0E, 0x08, 0x0E08, "enter Faron intro cs" }, + { 0x0E, 0x04, 0x0E04, "lit Coro's soup" }, + { 0x0E, 0x02, 0x0E02, "saved Talo cs" }, + { 0x0E, 0x01, 0x0E01, "see light spirit from far away in twilight cs" }, + { 0x0F, 0x80, 0x0F80, "enter mist area twilight cs" }, + { 0x0F, 0x40, 0x0F40, "found Talo's stick (child chase)" }, + { 0x0F, 0x20, 0x0F20, "explored top of east slope mist area twilight" }, + { 0x0F, 0x10, 0x0F10, "talked to Coro spirit before killing bugs" }, + { 0x0F, 0x08, 0x0F08, "entered mist area as human" }, + { 0x0F, 0x04, 0x0F04, "Talked to midna before talking to Coro spirit" }, + { 0x0F, 0x02, 0x0F02, "explored section with north exit of mist area (gets unset)" }, + { 0x0F, 0x01, 0x0F01, "saw light bugs on trunk mist area (gets unset)" }, + { 0x10, 0x80, 0x1080, "Map marker Rusl" }, + { 0x10, 0x40, 0x1040, "lit torch 1 in lantern cave" }, + { 0x10, 0x20, 0x1020, "Killed poe mist area" }, + { 0x10, 0x10, 0x1010, "spawn PoH chest key cave" }, + { 0x10, 0x08, 0x1008, "lit right torch in key cave" }, + { 0x10, 0x04, 0x1004, "lit left torch in key cave" }, + { 0x10, 0x02, 0x1002, "explored section 15 in lantern cave" }, + { 0x10, 0x01, 0x1001, "add mist area mist to mini-map" }, + { 0x11, 0x80, 0x1180, "explored section 14 in lantern cave" }, + { 0x11, 0x40, 0x1140, "explored section 13 in lantern cave" }, + { 0x11, 0x20, 0x1120, "explored section 12 in lantern cave" }, + { 0x11, 0x10, 0x1110, "explored section 11 in lantern cave" }, + { 0x11, 0x08, 0x1108, "explored section 10 in lantern cave" }, + { 0x11, 0x04, 0x1104, "explored section 9 in lantern cave" }, + { 0x11, 0x02, 0x1102, "explored section 3 of branching path in lantern cave" }, + { 0x11, 0x01, 0x1101, "explored section 8 in lantern cave" }, + { 0x12, 0x80, 0x1280, "explored section 7 in lantern cave" }, + { 0x12, 0x20, 0x1220, "Midna text before jumping to Lost Woods" }, + { 0x12, 0x10, 0x1210, "killed light bug outside Coro's house (duplicate)" }, + { 0x12, 0x08, 0x1208, "saw light bug run behind Coro gate" }, + { 0x12, 0x04, 0x1204, "Midna text warp to N faron for bridge" }, + { 0x12, 0x02, 0x1202, "saw first 2 light bugs run away from you" }, + { 0x12, 0x01, 0x1201, "S warp shadow beasts are spawned" }, + { 0x13, 0x80, 0x1380, "South Faron Portal" }, + { 0x13, 0x40, 0x1340, "explored section 2 of branching path in lantern cave" }, + { 0x13, 0x20, 0x1320, "killed right bokoblin in front of FT after twilight" }, + { 0x13, 0x10, 0x1310, "killed left bokoblin in front of FT after twilight" }, + { 0x13, 0x08, 0x1308, "explored section 1 of branching path in lantern cave" }, + { 0x13, 0x01, 0x1301, "S warp shadow beasts killed" }, + { 0x14, 0x80, 0x1480, "lit torch 4 in lantern cave" }, + { 0x14, 0x40, 0x1440, "killed light bug mist area north exit" }, + { 0x14, 0x20, 0x1420, "did midna jump 2 mist area" }, + { 0x14, 0x10, 0x1410, "killed light bug mist area north exit" }, + { 0x14, 0x08, 0x1408, "explored section 4 of branching path in lantern cave" }, + { 0x14, 0x04, 0x1404, "killed light bug in front of Forest Temple" }, + { 0x14, 0x02, 0x1402, "killed light bug in front of Forest Temple" }, + { 0x14, 0x01, 0x1401, "killed both light bugs in front of FT cs (map marker FT)" }, + { 0x15, 0x80, 0x1580, "killed light bug mist area south entrance" }, + { 0x15, 0x40, 0x1540, "killed light bug mist area south entrance" }, + { 0x15, 0x20, 0x1520, "did midna jump 5 mist area" }, + { 0x15, 0x10, 0x1510, "did midna jump 3 mist area" }, + { 0x15, 0x08, 0x1508, "killed light bug mist area trunk" }, + { 0x15, 0x04, 0x1504, "killed light bug mist area trunk" }, + { 0x15, 0x02, 0x1502, "killed light bug mist area trunk" }, + { 0x15, 0x01, 0x1501, "killed light bug between latern cave and gate" }, + { 0x16, 0x80, 0x1680, "map marker Talo (only during child save)" }, + { 0x16, 0x40, 0x1640, "killed light bug outside Coro's house" }, + { 0x16, 0x20, 0x1620, "Map marker key cave (only during child save)" }, + { 0x16, 0x10, 0x1610, "remove map marker key cave" }, + { 0x16, 0x08, 0x1608, "did midna jump 4 mist area" }, + { 0x16, 0x04, 0x1604, "killed light bug hallway to Coro (closer to spring)" }, + { 0x16, 0x02, 0x1602, "killed light bug between latern cave and gate" }, + { 0x16, 0x01, 0x1601, "killed both light bugs in Coro's house cs" }, + { 0x17, 0x80, 0x1780, "killed light bug inside Coro's house" }, + { 0x17, 0x40, 0x1740, "killed light bug inside Coro's house" }, + { 0x17, 0x20, 0x1720, "killed light bug hallway to Coro (closer to Coro)" }, + { 0x17, 0x10, 0x1710, "did midna jump 6 mist area" }, + { 0x17, 0x08, 0x1708, "explored east section of mist area after midna jump 1 twilight (gets unset)" }, + { 0x17, 0x04, 0x1704, "lit torch 3 in lantern cave" }, + { 0x17, 0x02, 0x1702, "burned cobweb 2 in lantern cave" }, + { 0x17, 0x01, 0x1701, "burned cobweb 1 in lantern cave" }, + { 0x1B, 0x01, 0x1B01, "picked up rupees from rock next to Coro" }, +}; + +inline EventAreaFlags eventAreaFlagsFishingPond[] = +{ + { 0x1B, 0x01, 0x1B01, "free standing PoH" }, +}; + +inline EventAreaFlags eventAreaFlagsFT[] = +{ + { 0x00, 0x80, 0x0080, "PoH big chest behind Deku Like" }, + { 0x00, 0x04, 0x0004, "big chest underwater Tiny Cave" }, + { 0x00, 0x02, 0x0002, "small key big chest on pillar tile worm room" }, + { 0x00, 0x01, 0x0001, "Small Chest tile worm room" }, + { 0x01, 0x10, 0x0110, "big chest compass main room" }, + { 0x01, 0x08, 0x0108, "PoH big chest behind stairs tile worm room" }, + { 0x01, 0x02, 0x0102, "saved monkey in front of big pit" }, + { 0x02, 0x80, 0x0280, "saved monkey in boomerang bombling room" }, + { 0x02, 0x20, 0x0220, "saved monkey in tile worm room" }, + { 0x02, 0x10, 0x0210, "saved monkey in big baba room" }, + { 0x02, 0x08, 0x0208, "saved 2nd monkey" }, + { 0x02, 0x04, 0x0204, "first Monkey saved" }, + { 0x02, 0x02, 0x0202, "Small Chest 2nd Monkey room" }, + { 0x03, 0x80, 0x0380, "small chest first room" }, + { 0x03, 0x40, 0x0340, "Big Baba key acquired" }, + { 0x03, 0x10, 0x0310, "small key big chest in single wind bridge room" }, + { 0x03, 0x04, 0x0304, "small key big chest in boomerang bombling room" }, + { 0x03, 0x02, 0x0302, "Big Chest in broken stairs room" }, + { 0x06, 0x01, 0x0601, "Ooccoo map marker" }, + { 0x07, 0x80, 0x0780, "big chest with map main room" }, + { 0x07, 0x40, 0x0740, "Big Key Chest" }, + { 0x07, 0x20, 0x0720, "small chest behind bombable wall main room" }, + { 0x07, 0x04, 0x0704, "Outside Monkey saved" }, + { 0x07, 0x02, 0x0702, "saved monkey in spider cave room" }, + { 0x08, 0x40, 0x0840, "Midna Boomerang text seen" }, + { 0x08, 0x20, 0x0820, "midna text after bridge before Ook broken" }, + { 0x08, 0x08, 0x0808, "Big Baba killed cutscene (still spawned)" }, + { 0x08, 0x02, 0x0802, "hit totem of 2nd monkey once cs" }, + { 0x08, 0x01, 0x0801, "Midna first monkey text end" }, + { 0x09, 0x80, 0x0980, "Boss Door opened" }, + { 0x09, 0x40, 0x0940, "bridge before Ook broken" }, + { 0x09, 0x20, 0x0920, "burned cob web big key room" }, + { 0x09, 0x10, 0x0910, "bridge 2nd monkey room broken" }, + { 0x09, 0x02, 0x0902, "Compass Chest knocked down" }, + { 0x0A, 0x80, 0x0A80, "Monkey freed in spider room" }, + { 0x0A, 0x08, 0x0A08, "unlocked door to 2nd monkey room" }, + { 0x0A, 0x04, 0x0A04, "broke cage of 2nd monkey cs" }, + { 0x0A, 0x02, 0x0A02, "bokoblins see you in single wind bridge room cs" }, + { 0x0A, 0x01, 0x0A01, "turned wind bridge in single wind bridge room cs" }, + { 0x0B, 0x80, 0x0B80, "Unlock Windbridge East Door" }, + { 0x0B, 0x10, 0x0B10, "Girl Monkey helps Link" }, + { 0x0C, 0x40, 0x0C40, "opened cage of monkey in big baba room" }, + { 0x0C, 0x20, 0x0C20, "killed higher bokoblin in room before boss" }, + { 0x0C, 0x10, 0x0C10, "killed lower bokoblin in room before boss" }, + { 0x0C, 0x02, 0x0C02, "blown up rock to Ooccoo" }, + { 0x0D, 0x80, 0x0D80, "blown up rock blocking tile worm room" }, + { 0x0D, 0x40, 0x0D40, "blown up main room bombable wall" }, + //{ 0x0D, 0x20, 0x0D20, "small key big chest tile worm room position" }, + //{ 0x0D, 0x10, 0x0D10, "small key big chest tile worm room position" }, + //{ 0x0D, 0x08, 0x0D08, "small key big chest tile worm room position" }, + //{ 0x0D, 0x04, 0x0D04, "small key big chest tile worm room position" }, + { 0x0D, 0x02, 0x0D02, "Staircase rises main room" }, + { 0x0E, 0x20, 0x0E20, "tile worm room intro cs" }, + { 0x0E, 0x08, 0x0E08, "opened cage of monkey in tile worm room" }, + { 0x0E, 0x04, 0x0E04, "gate to big key opened" }, + { 0x0E, 0x02, 0x0E02, "2nd Monkey room intro cs" }, + { 0x0F, 0x80, 0x0F80, "lit bottom right torch main room" }, + { 0x0F, 0x40, 0x0F40, "lit bottom left torch main room" }, + { 0x0F, 0x20, 0x0F20, "lit upper right torch main room" }, + { 0x0F, 0x10, 0x0F10, "lit upper left torch main room" }, + { 0x0F, 0x08, 0x0F08, "big baba room intro cs" }, + { 0x0F, 0x04, 0x0F04, "enter room before boss Midna text" }, + { 0x0F, 0x02, 0x0F02, "Midna text after saveing a monkey after Ook" }, + { 0x0F, 0x01, 0x0F01, "Small Bridge breaks scene seen" }, + { 0x10, 0x10, 0x1010, "enter southwest door outside intro cs" }, + { 0x10, 0x04, 0x1004, "Midna text after compass" }, + { 0x10, 0x02, 0x1002, "boomerang obtained" }, + { 0x10, 0x01, 0x1001, "burned west cob web main room" }, + { 0x11, 0x08, 0x1108, "5th monkey added to room before boss" }, + { 0x11, 0x04, 0x1104, "4 Monkeys in main room cutscene" }, + { 0x11, 0x02, 0x1102, "turned wind bridge in single wind bridge room" }, + { 0x11, 0x01, 0x1101, "Monkeys regroup in Main Room" }, + { 0x12, 0x80, 0x1280, "4 Monkeys gather in Main Room" }, + { 0x12, 0x40, 0x1240, "blown up 1st rock in boomeang bombling room" }, + { 0x12, 0x10, 0x1210, "Ooccoo Freed" }, + { 0x12, 0x01, 0x1201, "2nd Monkey Bokoblins Killed" }, + { 0x13, 0x80, 0x1380, "Midna first Monkey text prompt (makes vines climbable)" }, + { 0x13, 0x40, 0x1340, "killed big baba cs" }, + { 0x13, 0x08, 0x1308, "?" }, + { 0x13, 0x04, 0x1304, "?" }, + { 0x13, 0x02, 0x1302, "Diababa killed" }, + { 0x13, 0x01, 0x1301, "Diababa Phase 2 (unset post kill)" }, + { 0x14, 0x20, 0x1420, "broke bridge over water that leads to big key" }, + { 0x14, 0x04, 0x1404, "monkeys form a rope in room before boss cs" }, + { 0x14, 0x02, 0x1402, "monkeys start to form a rope in room before boss" }, + { 0x15, 0x80, 0x1580, "All Monkeys form rope" }, + { 0x15, 0x40, 0x1540, "Ook exit door opened" }, + { 0x15, 0x20, 0x1520, "opened gate to monkey in broken stairs room" }, + { 0x15, 0x08, 0x1508, "blown up 2nd rock in boomerang bombling room" }, + { 0x15, 0x02, 0x1502, "saved 5th monkey cs" }, + { 0x15, 0x01, 0x1501, "killed bokoblin next to first monkey" }, + { 0x16, 0x20, 0x1620, "see locked monkey post Ook" }, + { 0x16, 0x10, 0x1610, "Ook defeated" }, + { 0x16, 0x08, 0x1608, "monkeys form a rope in room before boss cs" }, + { 0x16, 0x04, 0x1604, "Staircase rising cutscene for 4th Monkey" }, + { 0x16, 0x02, 0x1602, "Intro Cutscene" }, + { 0x16, 0x01, 0x1601, "2nd Monkey Pillar scene" }, + { 0x17, 0x80, 0x1780, "enter room before boss intro cs" }, + { 0x17, 0x40, 0x1740, "turned mill for the first time in Ook room cs" }, + { 0x17, 0x20, 0x1720, "big chest compass main room (set after)" }, + { 0x17, 0x01, 0x1701, "hit totem of 2nd monkey once" }, + { 0x1B, 0x10, 0x1B10, "picked up red rupee from deku like in spider room" }, +}; + +inline EventAreaFlags eventAreaFlagsGerudoDesert[] = +{ + { 0x02, 0x80, 0x0280, "big chest next to Arbiter's Grounds" }, + { 0x02, 0x20, 0x0220, "small chest next to camp entrance" }, + { 0x02, 0x08, 0x0208, "small chest on pillar weat of entrance to desert" }, + { 0x02, 0x04, 0x0204, "small chest under tower of left bulblin outside camp" }, + { 0x02, 0x02, 0x0202, "small chest under tower of right bulblin outside camp" }, + { 0x02, 0x01, 0x0201, "small chest next to fire outside camp" }, + { 0x03, 0x80, 0x0380, "small chest island north of cave of ordeals" }, + { 0x03, 0x40, 0x0340, "small chest east canyon" }, + { 0x03, 0x20, 0x0320, "small chest next to pillar in the middle of the messa" }, + { 0x03, 0x08, 0x0308, "small chest behind 2 breakable walls (the west one)" }, + { 0x03, 0x04, 0x0304, "small chest behind 2 breakable walls (the east one)" }, + { 0x03, 0x02, 0x0302, "big chest owl statue" }, + { 0x03, 0x01, 0x0301, "big chest in south secret path" }, + { 0x04, 0x80, 0x0480, "both small chests and key in camp (each one sets it)" }, + { 0x08, 0x80, 0x0880, "?" }, + { 0x08, 0x40, 0x0840, "?" }, + { 0x08, 0x20, 0x0820, "explored island north of cave of ordeals" }, + { 0x08, 0x10, 0x0810, "explored part 9 of bulblin camp (KB battle area)" }, + { 0x08, 0x08, 0x0808, "explored part 8 of bulblin camp" }, + { 0x08, 0x04, 0x0804, "explored part 7 of bulblin camp" }, + { 0x08, 0x02, 0x0802, "explored part 6 of bulblin camp" }, + { 0x08, 0x01, 0x0801, "explored part 5 of bulblin camp" }, + { 0x09, 0x80, 0x0980, "Desert Intro CS (PoT)" }, + { 0x09, 0x20, 0x0920, "Gerudo Messa Portal" }, + { 0x09, 0x08, 0x0908, "explored part 2 of bulblin camp" }, + { 0x09, 0x04, 0x0904, "explored part 4 of bulblin camp" }, + { 0x09, 0x02, 0x0902, "explored part 3 of bulblin camp" }, + { 0x09, 0x01, 0x0901, "?" }, + { 0x0A, 0x40, 0x0A40, "explored south secret path to big chest" }, + { 0x0A, 0x10, 0x0A10, "Mirror chamber intro cs" }, + { 0x0A, 0x04, 0x0A04, "save prompt after beating Arbiter's Grounds" }, + { 0x0A, 0x02, 0x0A02, "killed archer bulblin on bore outside camp" }, + { 0x0A, 0x01, 0x0A01, "killed rider bulblin on bore outside camp" }, + { 0x0B, 0x80, 0x0B80, "killed lone bulblin on bore outside camp" }, + { 0x0B, 0x40, 0x0B40, "killed bulblin on left tower outside camp" }, + { 0x0B, 0x20, 0x0B20, "killed bulblin on right tower outside camp" }, + { 0x0B, 0x10, 0x0B10, "watched outside AG cutscene after bublin camp" }, + { 0x0B, 0x04, 0x0B04, "destroyed fire outside camp" }, + { 0x0B, 0x02, 0x0B02, "destroyed bore meat in camp" }, + { 0x0D, 0x08, 0x0D08, "killed poe next to entrance to camp" }, + { 0x0D, 0x04, 0x0D04, "Hero's Shade map marker" }, + { 0x0D, 0x02, 0x0D02, "spawn big chest next to Arbiter's Grounds" }, + { 0x0D, 0x01, 0x0D01, "lit right torch for big chest next to Arbiter's Grounds entrance" }, + { 0x0E, 0x80, 0x0E80, "lit left torch for big chest next to Arbiter's Grounds entrance" }, + { 0x0E, 0x20, 0x0E20, "explored area with Arbiter's Gounds entrance" }, + { 0x0E, 0x02, 0x0E02, "mirror light stairs appear" }, + { 0x0E, 0x01, 0x0E01, "Mirror Chamber Portal" }, + { 0x0F, 0x04, 0x0F04, "sky character under owl statue" }, + { 0x0F, 0x02, 0x0F02, "map marker owl statue" }, + { 0x0F, 0x01, 0x0F01, "Mirror Raised Cutscene Flag (Places Boar at desert entrance)" }, + { 0x10, 0x40, 0x1040, "broke left wall that prevents access to east small chest (set once pieces despawn)" }, + { 0x10, 0x20, 0x1020, "killed poe next to cave of ordeals" }, + { 0x10, 0x10, 0x1010, "killed poe south of desert entrance" }, + { 0x10, 0x08, 0x1008, "killed poe on elevated platform with grotto (messa)" }, + { 0x10, 0x04, 0x1004, "killed poe next to Arbiter's Grounds entrance" }, + { 0x10, 0x02, 0x1002, "destroyed tower of right bulbin outside camp" }, + { 0x10, 0x01, 0x1001, "destroyed tower of left bulbin outside camp" }, + { 0x11, 0x20, 0x1120, "broke first right wall to camp (set once pieces despawn)" }, + { 0x11, 0x10, 0x1110, "broke first middle wall to camp (set once pieces despawn)" }, + { 0x11, 0x08, 0x1108, "broke first left wall to camp (set once pieces despawn)" }, + { 0x11, 0x04, 0x1104, "broke second right wall to camp (set once pieces despawn)" }, + { 0x11, 0x02, 0x1102, "broke second left wall to camp (set once pieces despawn)" }, + { 0x12, 0x10, 0x1210, "explored elavated section with poe over grotto" }, + { 0x13, 0x40, 0x1340, "Desert Intro CS" }, + { 0x14, 0x80, 0x1480, "started climbing stairs to mirror chamber" }, + { 0x14, 0x40, 0x1440, "exit Arbiters Grounds to go to mirror chamber" }, + { 0x14, 0x02, 0x1402, "map marker palace of twilight (explored mirror chamber)" }, + { 0x14, 0x01, 0x1401, "killed poe in bulblin camp" }, + { 0x17, 0x08, 0x1708, "broke right wall that prevents access to east small chest (set once pieces despawn)" }, + { 0x17, 0x04, 0x1704, "broke left wall that prevents access to west small chest (set once pieces despawn)" }, + { 0x17, 0x02, 0x1702, "broke right wall that prevents access to west small chest (set once pieces despawn)" }, + { 0x18, 0x80, 0x1880, "free standing PoH bore meat bulblin camp" }, +}; + +inline EventAreaFlags eventAreaFlagsGM[] = +{ + { 0x00, 0x40, 0x0040, "big chest main room top floor" }, + { 0x00, 0x10, 0x0010, "small chest next to switch in toadpoli room" }, + { 0x00, 0x08, 0x0008, "small chest first room" }, + { 0x00, 0x04, 0x0004, "big chest elder 3 room" }, + { 0x00, 0x02, 0x0002, "small chest elder 2 room" }, + { 0x00, 0x01, 0x0001, "small chest elder 1 room" }, + { 0x01, 0x40, 0x0140, "Ooccoo Map Flag" }, + { 0x01, 0x20, 0x0120, "big chest underwater outside room" }, + { 0x01, 0x10, 0x0110, "PoH big chest room 3" }, + { 0x01, 0x02, 0x0102, "map big chest elder 1 room" }, + { 0x01, 0x01, 0x0101, "small key underwater big chest toadpoli room" }, + { 0x02, 0x80, 0x0280, "small key small chest outside room" }, + { 0x02, 0x40, 0x0240, "big chest outside room clawshot" }, + { 0x02, 0x20, 0x0220, "small chest room leading to elder 2" }, + { 0x02, 0x10, 0x0210, "compass big chest" }, + { 0x02, 0x08, 0x0208, "small key big chest main room bottom floor" }, + { 0x02, 0x02, 0x0202, "PoH big chest toadpoli room (the one after the gate)" }, + { 0x03, 0x40, 0x0340, "big chest bow" }, + { 0x08, 0x10, 0x0810, "cut rope of door outside room cs" }, + { 0x08, 0x08, 0x0808, "pressed second button main room floor 2 cs" }, + { 0x08, 0x04, 0x0804, "pressed third button in first room cs" }, + { 0x08, 0x02, 0x0802, "pressed second button in first room cs" }, + { 0x08, 0x01, 0x0801, "cut rope of door in toadpoli room cs" }, + { 0x09, 0x80, 0x0980, "unlocked boss door" }, + { 0x09, 0x20, 0x0920, "pressed first button main room floor 2 cs" }, + { 0x09, 0x10, 0x0910, "killed beamos outside room" }, + { 0x0A, 0x40, 0x0A40, "unlock mini-boss doors" }, + { 0x0A, 0x08, 0x0A08, "pressed button outside room" }, + { 0x0A, 0x04, 0x0A04, "cut rope of door in room before boss" }, + { 0x0A, 0x02, 0x0A02, "cut rope of door in toadpoli room" }, + { 0x0A, 0x01, 0x0A01, "cut rope of door in bow room" }, + { 0x0B, 0x20, 0x0B20, "cut rope of door at top floor of main room" }, + { 0x0B, 0x10, 0x0B10, "pressed first button main room floor 2" }, + { 0x0B, 0x08, 0x0B08, "reach west locked door in main room bottom floor" }, + { 0x0B, 0x04, 0x0B04, "lowered platform to open gate in first room (read only)" }, + { 0x0C, 0x80, 0x0C80, "unlocked north door in toadpoli room" }, + { 0x0C, 0x40, 0x0C40, "pressed second button main room floor 2" }, + { 0x0C, 0x20, 0x0C20, "unlock west locked door in main room bottom floor" }, + { 0x0C, 0x08, 0x0C08, "killed right beamos in toadpoli room" }, + { 0x0C, 0x04, 0x0C04, "killed left beamos in toadpoli room" }, + { 0x0D, 0x80, 0x0D80, "pressed button outside room cs" }, + { 0x0D, 0x40, 0x0D40, "pressed button at top floor of main room" }, + { 0x0D, 0x08, 0x0D08, "unlocked east door outside room" }, + { 0x0D, 0x01, 0x0D01, "broke underwater wood barrier outside room" }, + { 0x0E, 0x80, 0x0E80, "replace tektites with toadpolis in toadpoli room (set after obtaining bow)" }, + { 0x0E, 0x20, 0x0E20, "main room intro cs" }, + { 0x0E, 0x10, 0x0E10, "main room intro cs" }, + { 0x0E, 0x08, 0x0E08, "broke second wood barrier in outside room" }, + { 0x0E, 0x04, 0x0E04, "broke first wood barrier in outside room" }, + { 0x0E, 0x02, 0x0E02, "Oocco Freed" }, + { 0x0E, 0x01, 0x0E01, "elder 2 lets you climb ladder in his room" }, + { 0x0F, 0x80, 0x0F80, "elder 1 lets you climb ladder in his room" }, + { 0x0F, 0x40, 0x0F40, "pulled beamos outside room" }, + { 0x0F, 0x20, 0x0F20, "outside room intro cs" }, + { 0x0F, 0x10, 0x0F10, "outside room getting shot at after mini-boss cs" }, + { 0x0F, 0x08, 0x0F08, "outside room getting shot at after mini-boss cs" }, + { 0x0F, 0x04, 0x0F04, "outside room intro cs" }, + { 0x10, 0x80, 0x1080, "room after bow intro cs" }, + { 0x10, 0x40, 0x1040, "pulled beamos outside room cs" }, + { 0x10, 0x20, 0x1020, "activate first force field in toadpoli room" }, + { 0x10, 0x10, 0x1010, "pressed first button in toadpoli room cs" }, + { 0x10, 0x08, 0x1008, "open gate in toadpoli room cs" }, + { 0x10, 0x04, 0x1004, "pressed second button in toadpoli room cs" }, + { 0x10, 0x02, 0x1002, "activate second force field in toadpoli room" }, + { 0x10, 0x01, 0x1001, "room before elder 1 intro cs" }, + { 0x11, 0x80, 0x1180, "room before elder 1 intro cs" }, + { 0x11, 0x20, 0x1120, "intro cs" }, + { 0x11, 0x10, 0x1110, "pressed first button in first room cs" }, + { 0x11, 0x08, 0x1108, "open gate in first room cs" }, + { 0x11, 0x04, 0x1104, "pressed button in room after bow" }, + { 0x11, 0x02, 0x1102, "hit switch in room after bow" }, + { 0x11, 0x01, 0x1101, "press button room 3" }, + { 0x12, 0x80, 0x1280, "killed south-east beamos bow room" }, + { 0x12, 0x40, 0x1240, "killed south-west beamos bow room" }, + { 0x12, 0x20, 0x1220, "killed west beamos bow room" }, + { 0x12, 0x10, 0x1210, "killed north-east beamos bow room" }, + { 0x12, 0x08, 0x1208, "killed north-west beamos bow room" }, + { 0x12, 0x04, 0x1204, "killed east beamos bow room" }, + { 0x12, 0x02, 0x1202, "killed south beamos bow room" }, + { 0x12, 0x01, 0x1201, "pulled south-east beamos bow room" }, + { 0x13, 0x80, 0x1380, "pulled south-west beamos bow room" }, + { 0x13, 0x40, 0x1340, "pulled west beamos bow room" }, + { 0x13, 0x08, 0x1308, "pulled east beamos bow room" }, + { 0x13, 0x04, 0x1304, "pulled south beamos bow room" }, + { 0x13, 0x02, 0x1302, "pressed first button in toadpoli room" }, + { 0x13, 0x01, 0x1301, "pressed second button in toadpoli room" }, + { 0x15, 0x01, 0x1501, "reached area past pullable wall in room 3 (first in path to elder 1)" }, + { 0x16, 0x10, 0x1610, "reached bottom of water in room before elder 1" }, + { 0x16, 0x08, 0x1608, "reached area past pullable wall in room 3 (first in path to elder 1)" }, + { 0x16, 0x04, 0x1604, "knocked down fence in room after bow" }, + { 0x16, 0x02, 0x1602, "pullable wall in room 3 closed itself" }, + { 0x17, 0x80, 0x1780, "outside room killed leader bulblin archer" }, + { 0x17, 0x20, 0x1720, "cut rope of door outside room" }, + { 0x17, 0x10, 0x1710, "pressed unerwater button in room before elder" }, + { 0x17, 0x08, 0x1708, "main room floor 2 intro cs" }, + { 0x17, 0x04, 0x1704, "main room floor 2 intro cs" }, + { 0x17, 0x02, 0x1702, "hit switch in room after bow cs" }, + { 0x17, 0x01, 0x1701, "room after bow intro cs" }, +}; + +inline EventAreaFlags eventAreaFlagsGrotto[] = +{ + { 0x01, 0x20, 0x0120, "big chest grotto 5-4" }, + { 0x01, 0x08, 0x0108, "big chest grotto 4-3" }, + { 0x01, 0x04, 0x0104, "left small chest grotto 2-0" }, + { 0x01, 0x02, 0x0102, "right small chest grotto 2-0" }, + { 0x01, 0x01, 0x0101, "small chest grotto 5-3" }, + { 0x02, 0x80, 0x0280, "big chest grotto 4-2" }, + { 0x02, 0x40, 0x0240, "big chest grotto 3-0" }, + { 0x02, 0x20, 0x0220, "south small chest grotto 2-1" }, + { 0x02, 0x10, 0x0210, "east small chest grotto 2-1" }, + { 0x02, 0x08, 0x0208, "north small chest grotto 2-1" }, + { 0x02, 0x04, 0x0204, "small chest grotto 1-1" }, + { 0x02, 0x01, 0x0201, "big chest grotto 4-1" }, + { 0x03, 0x80, 0x0380, "big chest grotto 1-2" }, + { 0x03, 0x40, 0x0340, "big chest grotto 1-1" }, + { 0x03, 0x20, 0x0320, "big chest grotto 5-2" }, + { 0x03, 0x10, 0x0310, "big chest grotto 4-0" }, + { 0x03, 0x08, 0x0308, "big chest grotto 2-2" }, + { 0x03, 0x04, 0x0304, "big chest grotto 2-0" }, + { 0x03, 0x02, 0x0302, "big chest grotto 5-0" }, + { 0x03, 0x01, 0x0301, "big chest grotto 1-0" }, + { 0x08, 0x80, 0x0880, "lit right torch grotto 1-1" }, + { 0x08, 0x40, 0x0840, "lit left torch grotto 1-1" }, + { 0x08, 0x20, 0x0820, "killed red chu-chu grotto 3-3" }, + { 0x08, 0x10, 0x0810, "killed chu-chu grotto 3-2" }, + { 0x08, 0x08, 0x0808, "killed blue chu-chu grotto 3-1" }, + { 0x08, 0x04, 0x0804, "killed chu-chu grotto 2-0" }, + { 0x08, 0x02, 0x0802, "killed chu-chu grotto 1-2" }, + { 0x08, 0x01, 0x0801, "killed right freezard grotto 4-2" }, + { 0x09, 0x80, 0x0980, "broke ice wall 1 grotto 4-2" }, + { 0x09, 0x40, 0x0940, "killed chu-chu grotto 1-1" }, + { 0x09, 0x20, 0x0920, "killed all enemies grotto 5-4 (spawm chest)" }, + { 0x09, 0x10, 0x0910, "killed left freezard grotto 4-2" }, + { 0x09, 0x08, 0x0908, "killed blue chu-chu grotto 3-3" }, + { 0x09, 0x04, 0x0904, "broke ice wall 2 grotto 4-2" }, + { 0x09, 0x02, 0x0902, "broke ice wall 4 grotto 4-2" }, + { 0x09, 0x01, 0x0901, "killed poe in the back entrance grotto 3-0" }, + { 0x0A, 0x80, 0x0A80, "killed poe next to entrance grotto 3-0" }, + { 0x0A, 0x40, 0x0A40, "broke ice wall 3 grotto 4-2" }, + { 0x0A, 0x20, 0x0A20, "broke ice wall 6 grotto 4-2" }, + { 0x0A, 0x10, 0x0A10, "broke ice wall 5 grotto 4-2" }, + { 0x0A, 0x08, 0x0A08, "killed middle poe grotto 1-3" }, + { 0x0A, 0x04, 0x0A04, "killed right poe grotto 1-3" }, + { 0x0A, 0x02, 0x0A02, "spawn big chest grotto 1-1" }, + { 0x0A, 0x01, 0x0A01, "killed all enemies grotto 4-1 (spawm chest)" }, + { 0x0B, 0x80, 0x0B80, "killed middle freezard grotto 4-2" }, + { 0x0B, 0x40, 0x0B40, "blown up rocks in grotto 3-2" }, + { 0x0B, 0x20, 0x0B20, "killed all enemies grotto 5-2 (spawm chest)" }, + { 0x0B, 0x10, 0x0B10, "killed all enemies grotto 4-0 (spawm chest)" }, + { 0x0B, 0x08, 0x0B08, "killed all enemies grotto 2-2 (spawm chest)" }, + { 0x0B, 0x04, 0x0B04, "killed all enemies grotto 2-0 (spawm chest)" }, + { 0x0B, 0x02, 0x0B02, "killed all enemies grotto 5-0 (spawm chest)" }, + { 0x0B, 0x01, 0x0B01, "killed all enemies grotto 1-0 (spawm chest)" }, + { 0x0E, 0x10, 0x0E10, "spawn big chest grotto 4-3" }, + { 0x0E, 0x08, 0x0E08, "lit torch 3 grotto 4-3" }, + { 0x0E, 0x04, 0x0E04, "lit torch 2 grotto 4-3" }, + { 0x0E, 0x02, 0x0E02, "lit torch 1 grotto 4-3" }, + { 0x0E, 0x01, 0x0E01, "spawn big chest grotto 3-0" }, + { 0x0F, 0x80, 0x0F80, "lit right torch grotto 3-0" }, + { 0x0F, 0x40, 0x0F40, "lit middle torch grotto 3-0" }, + { 0x0F, 0x20, 0x0F20, "lit left torch grotto 3-0" }, + { 0x0F, 0x10, 0x0F10, "spawn big chest grotto 1-2" }, + { 0x0F, 0x08, 0x0F08, "lit middle torch grotto 1-2" }, + { 0x0F, 0x04, 0x0F04, "lit right torch grotto 1-2" }, + { 0x0F, 0x02, 0x0F02, "lit left torch grotto 1-2" }, + { 0x1A, 0x02, 0x1A02, "picked up yellow rupee from pot grotto 1-2" }, + { 0x1A, 0x01, 0x1A01, "picked up blue rupee from pot grotto 1-2" }, + { 0x1B, 0x80, 0x1B80, "picked up blue rupee from pot grotto 1-2" }, + { 0x1B, 0x40, 0x1B40, "picked up blue rupee from pot grotto 1-2" }, + { 0x1B, 0x20, 0x1B20, "picked up blue rupee from pot grotto 1-2" }, + { 0x1B, 0x10, 0x1B10, "picked up blue rupee from pot grotto 1-2" }, + { 0x1B, 0x08, 0x1B08, "picked up blue rupee from pot grotto 1-2" }, + { 0x1B, 0x04, 0x1B04, "picked up yellow rupee from pot grotto 1-2" }, + { 0x1B, 0x02, 0x1B02, "picked up red rupee from pot grotto 1-2" }, + { 0x1B, 0x01, 0x1B01, "picked up red rupee from pot grotto 1-2" }, +}; + +inline EventAreaFlags eventAreaFlagsHC[] = +{ + { 0x00, 0x40, 0x0040, "big chest behind first gate in graveyard" }, + { 0x00, 0x20, 0x0020, "second small chest treasure room" }, + { 0x00, 0x10, 0x0010, "eighth small chest treasure room" }, + { 0x00, 0x08, 0x0008, "seventh small chest treasure room" }, + { 0x00, 0x04, 0x0004, "sixth small chest treasure room" }, + { 0x00, 0x02, 0x0002, "big chest north room 2F" }, + { 0x01, 0x80, 0x0180, "fourth small chest treasure room" }, + { 0x01, 0x40, 0x0140, "fifth small chest treasure room" }, + { 0x01, 0x20, 0x0120, "third small chest treasure room" }, + { 0x01, 0x08, 0x0108, "fifth big chest treasure room" }, + { 0x01, 0x04, 0x0104, "fourth big chest treasure room" }, + { 0x01, 0x02, 0x0102, "third big chest treasure room" }, + { 0x01, 0x01, 0x0101, "second big chest treasure room" }, + { 0x02, 0x80, 0x0280, "first big chest treasure room" }, + { 0x02, 0x20, 0x0220, "north west big chest center room 2F" }, + { 0x02, 0x08, 0x0208, "small chest east garden" }, + { 0x02, 0x02, 0x0202, "north small chest west garden" }, + { 0x02, 0x01, 0x0201, "compass north east big chest center room 2F" }, + { 0x03, 0x80, 0x0380, "small key big chest behind third gate in graveyard" }, + { 0x03, 0x20, 0x0320, "center small chest west garden" }, + { 0x03, 0x10, 0x0310, "map big chest east garden" }, + { 0x03, 0x08, 0x0308, "king bulblin small key" }, + { 0x03, 0x04, 0x0304, "south west big chest center room 2F" }, + { 0x03, 0x02, 0x0302, "small key big chest outside 2F" }, + { 0x03, 0x01, 0x0301, "big key chest" }, + { 0x07, 0x08, 0x0708, "first small chest treasure room" }, + { 0x07, 0x04, 0x0704, "east small chest behind first gate in graveyard" }, + { 0x07, 0x02, 0x0702, "west small chest behind first gate in graveyard" }, + { 0x08, 0x10, 0x0810, "killed darknut in north room 2F (spawn big chest)" }, + { 0x08, 0x08, 0x0808, "reach end of specter maze 3F" }, + { 0x08, 0x04, 0x0804, "darknut 4F intro cs part 2" }, + { 0x08, 0x02, 0x0802, "darknut 4F intro cs part 1" }, + { 0x08, 0x01, 0x0801, "cut painting in north east room 2F cs" }, + { 0x09, 0x80, 0x0980, "cut painting in north east room 2F cs" }, + { 0x09, 0x40, 0x0940, "killed all enemies in center room 1F cs 1/2" }, + { 0x09, 0x20, 0x0920, "spawn north east big chest center room 2F" }, + { 0x09, 0x10, 0x0910, "killed lizalfos garding big key chest" }, + { 0x09, 0x08, 0x0908, "open third gate in graveyard cs" }, + { 0x09, 0x04, 0x0904, "blown up rock in graveyard" }, + { 0x09, 0x02, 0x0902, "lit torch behind first gate in graveyard (stops rain)" }, + { 0x09, 0x01, 0x0901, "graveyard intro cs" }, + { 0x0A, 0x80, 0x0A80, "open second gate in graveyard cs" }, + { 0x0A, 0x40, 0x0A40, "open first gate in graveyard cs" }, + { 0x0A, 0x20, 0x0A20, "open third gate in graveyard" }, + { 0x0A, 0x10, 0x0A10, "open first gate in graveyard" }, + { 0x0A, 0x04, 0x0A04, "open second gate in graveyard" }, + { 0x0B, 0x01, 0x0B01, "defeated dark beast Ganon" }, + { 0x0C, 0x40, 0x0C40, "cut first left painting in north west room 2F" }, + { 0x0C, 0x20, 0x0C20, "cut second left painting in north west room 2F" }, + { 0x0C, 0x10, 0x0C10, "cut third left painting in north west room 2F" }, + { 0x0C, 0x02, 0x0C02, "killed all enemies in center room 1F" }, + { 0x0D, 0x80, 0x0D80, "despawn yellow magic walls in center room 1F" }, + { 0x0D, 0x40, 0x0D40, "spawn yellow magic walls in center room 1F" }, + { 0x0D, 0x20, 0x0D20, "outside 4F intro cs" }, + { 0x0D, 0x10, 0x0D10, "outside 4F intro cs" }, + { 0x0D, 0x08, 0x0D08, "killed all east bokoblins in south garden" }, + { 0x0D, 0x04, 0x0D04, "killed all west bokoblins in south garden" }, + { 0x0D, 0x01, 0x0D01, "east room 2F intro cs" }, + { 0x0E, 0x80, 0x0E80, "east room 2F intro cs" }, + { 0x0E, 0x10, 0x0E10, "killed right lezalfos in north west room 2F" }, + { 0x0E, 0x08, 0x0E08, "killed left lezalfos in north west room 2F" }, + { 0x0E, 0x01, 0x0E01, "midna text at the end of east garden (talk about wall)" }, + { 0x0F, 0x80, 0x0F80, "explored graveyard" }, + { 0x10, 0x80, 0x1080, "killed both lizalfos in 4F (removes yellow magic barrior)" }, + { 0x10, 0x40, 0x1040, "killed both lizalfos in 3F (removes yellow magic barrior)" }, + { 0x10, 0x20, 0x1020, "south garden intro cs" }, + { 0x10, 0x02, 0x1002, "Midna text prompt after king bulblin" }, + { 0x10, 0x01, 0x1001, "killed all bokoblins in west garden" }, + { 0x11, 0x80, 0x1180, "prevent all torches form extinguishing north east room 2F" }, + { 0x11, 0x40, 0x1140, "unlock door in north east room 2F cs" }, + { 0x11, 0x10, 0x1110, "open second gate in west garden" }, + { 0x11, 0x08, 0x1108, "east garden intro cs" }, + { 0x11, 0x04, 0x1104, "east garden intro cs" }, + { 0x11, 0x02, 0x1102, "open gate in east garden" }, + { 0x11, 0x01, 0x1101, "open gate in east garden cs" }, + { 0x12, 0x80, 0x1280, "unlock door in north east room 2F" }, + { 0x12, 0x40, 0x1240, "lit all torches correctly in north east room 2F" }, + { 0x12, 0x20, 0x1220, "lit all torches correctly in north east room 2F cs" }, + { 0x12, 0x10, 0x1210, "unlock door outside 3F" }, + { 0x12, 0x08, 0x1208, "open gate to big key chest" }, + { 0x12, 0x04, 0x1204, "killed arealfos outside 2F" }, + { 0x12, 0x01, 0x1201, "killed all enemies in center room 1F cs 1/2" }, + { 0x13, 0x40, 0x1340, "Double Darknut room intro cs" }, + { 0x13, 0x08, 0x1308, "spawn north west big chest center room 2F" }, + { 0x13, 0x04, 0x1304, "west room 2F intro cs" }, + { 0x13, 0x02, 0x1302, "cut right painting in north west room 2F" }, + { 0x14, 0x40, 0x1440, "unlock boss door" }, + { 0x14, 0x10, 0x1410, "unlock door in south garden" }, + { 0x14, 0x08, 0x1408, "midna text seen after small key in graveyard" }, + { 0x14, 0x04, 0x1404, "midna text promt after small key in graveyard" }, + { 0x14, 0x02, 0x1402, "Midna text seen after king bulblin" }, + { 0x14, 0x01, 0x1401, "north west room 2F intro cs" }, + { 0x15, 0x40, 0x1540, "cut painting in north east room 2F" }, + { 0x15, 0x08, 0x1508, "second gate in west garden stops moving" }, + { 0x15, 0x04, 0x1504, "open second gate in west garden cs" }, + { 0x15, 0x01, 0x1501, "killed dynalfos in east room 2F (unlocks doors)" }, + { 0x16, 0x80, 0x1680, "unlock treasure room door 4F" }, + { 0x16, 0x04, 0x1604, "killed darknuts in west room 2F (unlocks doors)" }, + { 0x16, 0x02, 0x1602, "reach big chest in north room 2F" }, + { 0x16, 0x01, 0x1601, "lit south east torch north room 2F for the first time cs" }, + { 0x17, 0x80, 0x1780, "lit north east torch north room 2F for the first time cs" }, + { 0x17, 0x10, 0x1710, "unlock door in north west room 2F" }, + { 0x17, 0x01, 0x1701, "killed darknut 4F (removes yellow magic barrier)" }, +}; + +inline EventAreaFlags eventAreaFlagsHyruleField[] = +{ + { 0x02, 0x80, 0x0280, "Big chest owl statue hylia bridge" }, + { 0x02, 0x40, 0x0240, "Big chest spinner south of castle town" }, + { 0x02, 0x20, 0x0220, "Big chest double clawshot south of castle town" }, + { 0x02, 0x10, 0x0210, "Big chest tight rope south of castle town" }, + { 0x02, 0x08, 0x0208, "Big chest owl statue next to castle town" }, + { 0x02, 0x04, 0x0204, "Big chest on hylia bridge" }, + { 0x02, 0x02, 0x0202, "Big chest next to poe past hylia bridge" }, + { 0x02, 0x01, 0x0201, "Big chest spinner tracks (Lanayru)" }, + { 0x03, 0x80, 0x0380, "Big chest underwater Lanayru field" }, + { 0x03, 0x40, 0x0340, "Big chest under bridge faron field" }, + { 0x03, 0x20, 0x0320, "PoH big chest double clawshot Eldin gorge" }, + { 0x03, 0x10, 0x0310, "Big chest Eldin gorge owl statue" }, + { 0x03, 0x08, 0x0308, "PoH big chest owl statue Eldin bridge" }, + { 0x03, 0x04, 0x0304, "PoH big chest leage Eldin field after kakariko" }, + { 0x03, 0x02, 0x0302, "Map marker Telma carrage past hylia bridge" }, + { 0x03, 0x01, 0x0301, "Map marker Telma carrage west of castle town" }, + { 0x08, 0x80, 0x0880, "Lanayru field intro cs twilight" }, + { 0x08, 0x20, 0x0820, "blown up rock blocking Eldin long cave" }, + { 0x08, 0x10, 0x0810, "Hidden village path open" }, + { 0x08, 0x08, 0x0808, "East Castle Town Bridge Flag" }, + { 0x08, 0x04, 0x0804, "blown up rocks blocking path to zora's domain" }, + { 0x08, 0x01, 0x0801, "Midna pulls up the map to show you can warp" }, + { 0x09, 0x80, 0x0980, "midna text Eldin gorge bridge gone" }, + { 0x09, 0x40, 0x0940, "exit flight by foul after lanayru twilight cleared" }, + { 0x09, 0x20, 0x0920, "Kakariko Gorge Portal" }, + { 0x09, 0x10, 0x0910, "spawn barriers Eldin gorge dark beasts (unset once killed)" }, + { 0x09, 0x08, 0x0908, "bridge of Eldin placed (cs)" }, + { 0x09, 0x04, 0x0904, "Eldin bridge getting stolen cs trigger" }, + { 0x09, 0x02, 0x0902, "blown up rocks past Eldin bridge that lead to Lanayru" }, + { 0x09, 0x01, 0x0901, "see gorge gate cs" }, + { 0x0A, 0x80, 0x0A80, "blown up rocks to spinner tracks (Lanayru field side)" }, + { 0x0A, 0x40, 0x0A40, "blown up rocks to spinner tracks (hylia bridge side)" }, + { 0x0A, 0x20, 0x0A20, "entered Lanayru twilight cs" }, + { 0x0A, 0x10, 0x0A10, "entered Eldin twilight cs" }, + { 0x0A, 0x08, 0x0A08, "killed left shadow bulblin behind gorge gate twilight" }, + { 0x0A, 0x04, 0x0A04, "killed right shadow bulblin behind gorge gate twilight" }, + { 0x0A, 0x02, 0x0A02, "jumped over gorge fence after obtaining Epona" }, + { 0x0B, 0x80, 0x0B80, "Lanayru Main Feild has water on map" }, + { 0x0B, 0x40, 0x0B40, "seeing Lanayru twilight from up close cs" }, + { 0x0B, 0x20, 0x0B20, "seeing Eldin twilight from up close cs" }, + { 0x0B, 0x10, 0x0B10, "spawn dark beasts castle town portal (stays set)" }, + { 0x0B, 0x08, 0x0B08, "Castle Town Portal" }, + { 0x0B, 0x04, 0x0B04, "?" }, + { 0x0B, 0x01, 0x0B01, "blown up rocks from Eldin gorge to Eldin field" }, + { 0x0C, 0x80, 0x0C80, "blown up second rock to poe past hylia bridge" }, + { 0x0C, 0x20, 0x0C20, "Epona is accessible to Link (without calling her) (after lanayru twilight)" }, + { 0x0C, 0x08, 0x0C08, "killed poe past hylia bridge" }, + { 0x0C, 0x04, 0x0C04, "killed poe Eldin gorge" }, + { 0x0C, 0x02, 0x0C02, "killed poe faron field" }, + { 0x0D, 0x80, 0x0D80, "Midna text after warping gorge bridge back" }, + { 0x0D, 0x40, 0x0D40, "?" }, + { 0x0D, 0x10, 0x0D10, "spinner path next to hidden village explored" }, + { 0x0D, 0x08, 0x0D08, "killed poe Lanayru field" }, + { 0x0D, 0x02, 0x0D02, "enter field west of castle town from the east" }, + { 0x0D, 0x01, 0x0D01, "killed poe south of castle town" }, + { 0x0E, 0x80, 0x0E80, "bridge of Hylia intro cs twilight" }, + { 0x0E, 0x40, 0x0E40, "blown up rock blocking ice cave Lanayru field" }, + { 0x0E, 0x20, 0x0E20, "faron field intro cs" }, + { 0x0E, 0x10, 0x0E10, "blown up rock on leadge Eldin field after kakariko" }, + { 0x0E, 0x08, 0x0E08, "blown up first rock to poe past hylia bridge" }, + { 0x0E, 0x04, 0x0E04, "Hero's shade map marker (south castle town)" }, + { 0x0E, 0x02, 0x0E02, "Hero's shade map marker (west castle town)" }, + { 0x0E, 0x01, 0x0E01, "enter bridge east of castle town" }, + { 0x0F, 0x80, 0x0F80, "enter field south of castle town" }, + { 0x0F, 0x40, 0x0F40, "enter field west of castle town from the north" }, + { 0x0F, 0x20, 0x0F20, "?" }, + { 0x0F, 0x10, 0x0F10, "open path from faron field to south of castle town" }, + { 0x0F, 0x08, 0x0F08, "Midna text after Lanayru field twilight cs" }, + { 0x0F, 0x04, 0x0F04, "blown up rocks Eldin field after kakariko" }, + { 0x0F, 0x02, 0x0F02, "Eldin gorge bridge placed cs" }, + { 0x0F, 0x01, 0x0F01, "see Ilia's bag from far away" }, + { 0x10, 0x01, 0x1001, "Zora rivver boat path on map (Eldin)" }, + { 0x11, 0x80, 0x1180, "Sky letter next to castle town" }, + { 0x11, 0x40, 0x1140, "Map marker owl stature next to castle town" }, + { 0x11, 0x20, 0x1120, "Sky letter hylia bridge" }, + { 0x11, 0x10, 0x1110, "Map marker owl stature Hylia bridge" }, + { 0x11, 0x08, 0x1108, "Sky letter Eldin bridge" }, + { 0x11, 0x04, 0x1104, "Map marker owl stature Eldin bridge" }, + { 0x11, 0x02, 0x1102, "Sky letter Eldin gorge" }, + { 0x11, 0x01, 0x1101, "Map marker owl stature Eldin gorge" }, + { 0x12, 0x10, 0x1210, "blown up northern rock in field west of castle town" }, + { 0x12, 0x08, 0x1208, "blown up most northern rock in field west of castle town" }, + { 0x12, 0x04, 0x1204, "blown up rock south of castle town" }, + { 0x12, 0x02, 0x1202, "killed poe next to owl statue next to castle town" }, + { 0x13, 0x80, 0x1380, "killed poe east of castle town" }, + { 0x13, 0x10, 0x1310, "?" }, + { 0x13, 0x08, 0x1308, "?" }, + { 0x13, 0x04, 0x1304, "Epona isn't accessible to Link (without calling her) (after lanayru twilight)" }, + { 0x13, 0x02, 0x1302, "?" }, + { 0x13, 0x01, 0x1301, "Map marker hidden village" }, + { 0x14, 0x80, 0x1480, "blown up southern rock underwater Lanayru field" }, + { 0x14, 0x40, 0x1440, "blown up northern rock underwater Lanayru field" }, + { 0x14, 0x20, 0x1420, "blown up eastern rock Lanayru field " }, + { 0x14, 0x10, 0x1410, "blown up rock next to hylia bridge owl statue" }, + { 0x14, 0x08, 0x1408, "blown up rock closest to faron after hylia bridge" }, + { 0x14, 0x04, 0x1404, "blown up rock next to free standing PoH Elding gorge" }, + { 0x14, 0x01, 0x1401, "blown up rock next to Eldin gorge owl statue" }, + { 0x15, 0x80, 0x1580, "blown up rock past Eldin bridge" }, + { 0x16, 0x20, 0x1620, "Midna text after getting Ilia's scent" }, + { 0x16, 0x10, 0x1610, "Midna text after entering Lanayru twilight" }, + { 0x16, 0x08, 0x1608, "Midna text when seeing Lanayru twilight from far away" }, + { 0x16, 0x04, 0x1604, "Midna text after getting Youth's scent" }, + { 0x16, 0x02, 0x1602, "Midna text after entering Eldin twilight" }, + { 0x16, 0x01, 0x1601, "Midna text when seeing Eldin twilight from far away" }, + { 0x17, 0x80, 0x1780, "got Ilia's scent cs" }, + { 0x17, 0x40, 0x1740, "got youth's scent cs" }, + { 0x17, 0x20, 0x1720, "Epona can't cross Eldin bridge (set when stolen, unset when fixed)" }, + { 0x17, 0x10, 0x1710, "see broken wooden sword from far away cs" }, + { 0x17, 0x08, 0x1708, "Bridge of Eldin Portal" }, + { 0x1A, 0x80, 0x1A80, "picked up rupees from rock past Eldin bridge" }, + { 0x1A, 0x40, 0x1A40, "picked up rupees from rock next to free standing PoH Elding gorge" }, + { 0x1A, 0x20, 0x1A20, "picked up rupees from rock next to Eldin gorge owl statue" }, + { 0x1A, 0x10, 0x1A10, "picked up rupees from rock closest to faron after hylia bridge" }, + { 0x1A, 0x08, 0x1A08, "picked up rupees from rock next to hylia bridge owl statue" }, + { 0x1A, 0x04, 0x1A04, "picked up rupees from rocks to spinner tracks (hylia bridge side)" }, + { 0x1A, 0x02, 0x1A02, "picked up rupees from rocks to spinner tracks (Lanayru field side)" }, + { 0x1A, 0x01, 0x1A01, "picked up rupees from eastern rock Lanayru field " }, + { 0x1B, 0x80, 0x1B80, "picked up rupees from northern rock underwater Lanayru field" }, + { 0x1B, 0x40, 0x1B40, "picked up rupees from southern rock underwater Lanayru field" }, + { 0x1B, 0x20, 0x1B20, "picked up rupees from northern rock in field west of castle town" }, + { 0x1B, 0x10, 0x1B10, "picked up rupees from most northern rock in field west of castle town" }, + { 0x1B, 0x08, 0x1B08, "picked up rupees from rock south of castle town" }, + { 0x1B, 0x04, 0x1B04, "free standing PoH Elding gorge" }, + { 0x1B, 0x02, 0x1B02, "free standing PoH faron field" }, + { 0x1B, 0x01, 0x1B01, "free standing PoH goron Eldin field" }, +}; + +inline EventAreaFlags eventAreaFlagsLanayru[] = +{ + { 0x00, 0x40, 0x0040, "small chest next to mother and child iles zora's domain" }, + { 0x00, 0x20, 0x0020, "big chest fountain back room" }, + { 0x00, 0x10, 0x0010, "left small chest fountain back room" }, + { 0x00, 0x08, 0x0008, "right small chest fountain back room" }, + { 0x00, 0x04, 0x0004, "small chest midna jumps zora's domain" }, + { 0x01, 0x10, 0x0110, "west big chest zora's domain throne room" }, + { 0x01, 0x08, 0x0108, "east big chest zora's domain throne room" }, + { 0x02, 0x10, 0x0210, "small chest large underwater pillar in fountain" }, + { 0x02, 0x04, 0x0204, "small chest small underwater pillar in fountain" }, + { 0x02, 0x01, 0x0201, "small chest floor 3 flight by foul" }, + { 0x03, 0x80, 0x0380, "small chest floor 2 flight by foul" }, + { 0x03, 0x40, 0x0340, "big chest right pillar in front of fountain Lake Hylia" }, + { 0x03, 0x20, 0x0320, "big chest underwater next to Lake Hylia warp" }, + { 0x03, 0x10, 0x0310, "east big chest fountain" }, + { 0x03, 0x08, 0x0308, "west big chest fountain" }, + { 0x03, 0x04, 0x0304, "big chest floor 4 flight by foul" }, + { 0x03, 0x02, 0x0302, "small chest left pillar in front of fountain Lae Hylia" }, + { 0x03, 0x01, 0x0301, "big chest floor 5 flight by foul" }, + { 0x04, 0x40, 0x0440, "tear of light throne room zora's domain" }, + { 0x04, 0x20, 0x0420, "first tear of light flying" }, + { 0x04, 0x10, 0x0410, "tear of light midna jumps zora's domain" }, + { 0x04, 0x08, 0x0408, "tear of light on top of water zora's domain" }, + { 0x04, 0x04, 0x0404, "third tear of light flying" }, + { 0x04, 0x02, 0x0402, "fourth tear of light flying" }, + { 0x05, 0x80, 0x0580, "tear of light next to Iza's shop" }, + { 0x05, 0x40, 0x0540, "second tear of light flying" }, + { 0x05, 0x20, 0x0520, "final tear of light" }, + { 0x05, 0x04, 0x0504, "tear of light behind of Fyer's canon" }, + { 0x05, 0x02, 0x0502, "tear of light island east of Lake Hylia" }, + { 0x05, 0x01, 0x0501, "tear of light southmost island Lake Hylia" }, + { 0x06, 0x80, 0x0680, "tear of light next to fountain Lake Hylia" }, + { 0x06, 0x40, 0x0640, "tear of light on top of water zora's domain" }, + { 0x06, 0x20, 0x0620, "tear of light next to mother and child iles zora's domain" }, + { 0x08, 0x80, 0x0880, "see frozen zora spirits in domain twilight" }, + { 0x08, 0x40, 0x0840, "Lake hylia intro cs twilight" }, + { 0x08, 0x20, 0x0820, "blown up underwater rock in center of fountain" }, + { 0x08, 0x10, 0x0810, "the two zoras in upper zora river went down stream (twilight)" }, + { 0x08, 0x08, 0x0808, "saw light bug come out next to Iza spirit cs" }, + { 0x08, 0x02, 0x0802, "blown up rock to Lake hylia long cave" }, + { 0x08, 0x01, 0x0801, "spawned UZR portal fight barriers" }, + { 0x09, 0x80, 0x0980, "opened Upper Zora's River Portal cs" }, + { 0x09, 0x40, 0x0940, "talked to Iza before UZR portal" }, + { 0x09, 0x20, 0x0920, "Upper Zora's River Portal" }, + { 0x09, 0x10, 0x0910, "spawn big chest fountain back room" }, + { 0x09, 0x08, 0x0908, "lit left torch fountain back room" }, + { 0x09, 0x04, 0x0904, "lit right torch fountain back room" }, + { 0x09, 0x02, 0x0902, "seeing Twilight Bloat with sense cs" }, + { 0x09, 0x01, 0x0901, "Twilight Bloat comes out of water cs" }, + { 0x0A, 0x80, 0x0A80, "seeing Twilit Bloat move from far away cs" }, + { 0x0A, 0x40, 0x0A40, "Save Prompt after Lakebed (if disabled, triggers MDH after Lakebed)" }, + { 0x0A, 0x20, 0x0A20, "twilight end cs trigger (also map marker Lakebed Temple)" }, + { 0x0A, 0x10, 0x0A10, "obtained vessel of light (unset after twilight)" }, + { 0x0A, 0x08, 0x0A08, "spawn dark beasts Lake Hylia (unset once killed)" }, + { 0x0A, 0x04, 0x0A04, "Lake Hylia Portal" }, + { 0x0A, 0x02, 0x0A02, "Zora's river intro cs during twilight (flying with bird)" }, + { 0x0A, 0x01, 0x0A01, "midna text promt saying you can call down Kargarok to fly" }, + { 0x0B, 0x80, 0x0B80, "Rutella cs in domain twilight" }, + { 0x0B, 0x40, 0x0B40, "Zora river boat path on map" }, + { 0x0B, 0x20, 0x0B20, "entered Twilight Bloat arena (unset once killed)" }, + { 0x0B, 0x10, 0x0B10, "explored entrance to snowpeak" }, + { 0x0B, 0x08, 0x0B08, "got PoH flight by foul" }, + { 0x0B, 0x04, 0x0B04, "Zora's Domain Portal" }, + { 0x0B, 0x02, 0x0B02, "spawn barriers Zora's domain dark beasts fight" }, + { 0x0B, 0x01, 0x0B01, "Zora's domain intro cs twilight (frozen)" }, + { 0x0C, 0x08, 0x0C08, "blown up south underwater rock zora's domain " }, + { 0x0C, 0x04, 0x0C04, "blown up north underwater rock zora's domain" }, + { 0x0C, 0x02, 0x0C02, "blown up underwater rock in back of fountain" }, + { 0x0C, 0x01, 0x0C01, "Midna text after landing in Lake hylia twilight" }, + { 0x0D, 0x80, 0x0D80, "Iza text after Upper Zora's River Portal" }, + { 0x0D, 0x40, 0x0D40, "can now exit from the sides of zora's domain inside (set during domain outside cs after melting it)" }, + { 0x0D, 0x20, 0x0D20, "Midna text after domain outside cs after melting it" }, + { 0x0D, 0x10, 0x0D10, "domain outside cs after melting it" }, + { 0x0D, 0x08, 0x0D08, "map marker Auru" }, + { 0x0D, 0x04, 0x0D04, "Upper zora's river intro cs during twilight" }, + { 0x0D, 0x02, 0x0D02, "Midna text after leaving lake hylia after Lanayru twilight" }, + { 0x0D, 0x01, 0x0D01, "Zora's domain waterfall is going fast (during twilight only) (unset when you come back to Lake hylia)" }, + { 0x0E, 0x80, 0x0E80, "blown up rock blocking lakebed entrance cs" }, + { 0x0E, 0x40, 0x0E40, "opened stream next to lakebed entance" }, + { 0x0E, 0x20, 0x0E20, "Midna text after arriving at upper zora's river twilight" }, + { 0x0E, 0x10, 0x0E10, "melted zora's domain (Lake Hylia water on map (top part))" }, + { 0x0E, 0x08, 0x0E08, "twilight end cs watched" }, + { 0x0E, 0x04, 0x0E04, "map marker Snowpeak" }, + { 0x0E, 0x01, 0x0E01, "Midna text after coming back to lake after filling it (twilight)" }, + { 0x0F, 0x80, 0x0F80, "blown up rock blocking lakebed entrance" }, + { 0x0F, 0x40, 0x0F40, "went down the fast water in zora's domain (void out) (unset after twilight)" }, + { 0x0F, 0x20, 0x0F20, "Lake hylia filled twilight intro cs (domain water level normal)" }, + { 0x0F, 0x10, 0x0F10, "blown up first rock to throne room zora's domain" }, + { 0x0F, 0x08, 0x0F08, "Midna text prompt to tell you to look under the ice in zora's domain twilight" }, + { 0x0F, 0x04, 0x0F04, "Midna text before midna jumps fozen zora's domain twilight" }, + { 0x0F, 0x02, 0x0F02, "Midna text before midna jumps melted zora's domain twilight" }, + { 0x0F, 0x01, 0x0F01, "Midna text after melting domain (water everywhere on map)" }, + { 0x10, 0x80, 0x1080, "blown up underwater rock zora river town path" }, + { 0x10, 0x40, 0x1040, "spawn west big chest zora's domain throne room" }, + { 0x10, 0x20, 0x1020, "spawn east big chest zora's domain throne room" }, + { 0x10, 0x10, 0x1010, "lit east torch zora's domain throne room" }, + { 0x10, 0x08, 0x1008, "extingushed north torch zora's domain throne room" }, + { 0x10, 0x04, 0x1004, "lit west torch zora's domain throne room" }, + { 0x10, 0x02, 0x1002, "blown up west underwater rock Lakebed area" }, + { 0x10, 0x01, 0x1001, "blown up south underwater rock Lakebed area" }, + { 0x11, 0x80, 0x1180, "saw the two zora spirits from far away in upper zora river cs (twilight)" }, + { 0x11, 0x40, 0x1140, "saw light bug moving after exiting lanayru spring" }, + { 0x11, 0x20, 0x1120, "went down zora's river with bird during twilight" }, + { 0x11, 0x10, 0x1110, "blown up underwater rock zora river lake path" }, + { 0x11, 0x08, 0x1108, "midna text after seeing the frozen zoras in domain twilight" }, + { 0x11, 0x02, 0x1102, "paid Fyer to launch you to the flight by foul platform (unset once you enter the canon)" }, + { 0x11, 0x01, 0x1101, "blown up north underwater rock throne room zora's domain" }, + { 0x12, 0x80, 0x1280, "Lanayru spring map marker" }, + { 0x12, 0x40, 0x1240, "Midna Text after frozen zora's domain twilight intro cs" }, + { 0x12, 0x20, 0x1220, "killed poe underneath flight by foul" }, + { 0x12, 0x10, 0x1210, "killed poe next to watch tower to desert" }, + { 0x12, 0x08, 0x1208, "killed poe east of lake Hylia" }, + { 0x12, 0x04, 0x1204, "killed poe next to mother and chile iles Zora's Domain" }, + { 0x12, 0x02, 0x1202, "killed poe midna jumps Zora's Domain" }, + { 0x12, 0x01, 0x1201, "killed poe in Upper Zora's River" }, + { 0x13, 0x80, 0x1380, "killed poe on flight by foul prizes" }, + { 0x13, 0x40, 0x1340, "killed poe next to fountain Lake Hylia" }, + { 0x13, 0x20, 0x1320, "blew up rock in Iza's house" }, + { 0x13, 0x10, 0x1310, "Iza text after blowing the rocks inside her house" }, + { 0x13, 0x01, 0x1301, "blew up rock in Iza's house cs" }, + { 0x14, 0x40, 0x1440, "killed light bug throne room zora's domain" }, + { 0x14, 0x20, 0x1420, "killed first light bug flying" }, + { 0x14, 0x10, 0x1410, "killed light bug midna jumps zora's domain" }, + { 0x14, 0x08, 0x1408, "killed light bug on top of water zora's domain" }, + { 0x14, 0x04, 0x1404, "killed third light bug flying" }, + { 0x14, 0x02, 0x1402, "killed fourth light bug flying" }, + { 0x14, 0x01, 0x1401, "killed light bug behind of Fyer's canon" }, + { 0x15, 0x80, 0x1580, "killed light bug next to Iza's shop" }, + { 0x15, 0x40, 0x1540, "killed second light bug flying" }, + { 0x15, 0x20, 0x1520, "killed final light bug (Twilight Bloat)" }, + { 0x15, 0x10, 0x1510, "killed light bug island east of Lake Hylia" }, + { 0x15, 0x02, 0x1502, "killed light bug next to mother and child iles zora's domain" }, + { 0x15, 0x01, 0x1501, "?" }, + { 0x16, 0x80, 0x1680, "Watched CS of Ooccoo running to Sky Cannon" }, + { 0x16, 0x40, 0x1640, "killed light bug on top of water zora's domain" }, + { 0x16, 0x20, 0x1620, "killed light bug southmost island Lake Hylia" }, + { 0x16, 0x10, 0x1610, "killed light bug next to fountain Lake Hylia" }, + { 0x16, 0x02, 0x1602, "talked to light spirit during twilight" }, + { 0x16, 0x01, 0x1601, "went up zora's river after melting domain in twilight" }, + { 0x17, 0x80, 0x1780, "blown up rock zora river on land" }, + { 0x17, 0x40, 0x1740, "went up zora's river after melting domain in twilight (also set when failing to do so)" }, + { 0x17, 0x20, 0x1720, "blown up second rock to throne room zora's domain" }, + { 0x17, 0x10, 0x1710, "?" }, + { 0x17, 0x02, 0x1702, "Midna text after Zora's domain portal" }, + { 0x17, 0x01, 0x1701, "blown up underwater rock zora river middle" }, + { 0x18, 0x08, 0x1808, "picked up rupees from south underwater rock Lakebed area" }, + { 0x18, 0x04, 0x1804, "picked up rupees from west underwater rock Lakebed area" }, + { 0x18, 0x02, 0x1802, "picked up green rupees domain midna jumps twilight" }, + { 0x18, 0x01, 0x1801, "picked up fourth green rupee domain midna jumps twilight" }, + { 0x19, 0x80, 0x1980, "picked up third blue rupee midna jumps zora's domain" }, + { 0x19, 0x40, 0x1940, "picked up second blue rupee midna jumps zora's domain" }, + { 0x19, 0x20, 0x1920, "picked up first blue rupee midna jumps zora's domain" }, + { 0x19, 0x10, 0x1910, "picked up rupees from rock zora river on land" }, + { 0x19, 0x08, 0x1908, "picked up rupees from underwater rock zora river lake path" }, + { 0x19, 0x04, 0x1904, "picked up rupees from underwater rock zora river town path" }, + { 0x19, 0x02, 0x1902, "picked up rupees from underwater rock zora river middle" }, + { 0x19, 0x01, 0x1901, "picked up rupees from underwater rock back fountain" }, + { 0x1A, 0x80, 0x1A80, "picked up rupees from underwater rock center fountain" }, + { 0x1A, 0x40, 0x1A40, "picked up rupees from south underwater rock zora's domain " }, + { 0x1A, 0x20, 0x1A20, "picked up rupees from north underwater rock zora's domain" }, + { 0x1A, 0x10, 0x1A10, "picked up rupees from first rock to throne room zora's domain" }, + { 0x1A, 0x08, 0x1A08, "picked up rupees from second rock to throne room zora's domain" }, + { 0x1A, 0x04, 0x1A04, "picked up east blue rupees behind underwater bridge throne room zora's domain" }, + { 0x1A, 0x02, 0x1A02, "picked up west blue rupees behind underwater bridge throne room zora's domain" }, + { 0x1A, 0x01, 0x1A01, "picked up south yellow rupee unerwater throne room zora's domain" }, + { 0x1B, 0x80, 0x1B80, "picked up north yellow rupee unerwater throne room zora's domain" }, + { 0x1B, 0x40, 0x1B40, "picked up east yellow rupee unerwater throne room zora's domain" }, + { 0x1B, 0x20, 0x1B20, "picked up yellow rupee above north underwater rock throne room zora's domain" }, + { 0x1B, 0x10, 0x1B10, "picked up first yellow rupee midna jumps zora's domain" }, + { 0x1B, 0x08, 0x1B08, "picked up second yellow rupee midna jumps zora's domain" }, + { 0x1B, 0x02, 0x1B02, "picked up yellow rupee from broken pillar lakebed area" }, + { 0x1B, 0x01, 0x1B01, "picked up yellow rupee from broken pillar lakebed area" }, +}; + +inline EventAreaFlags eventAreaFlagsLBT[] = +{ + { 0x00, 0x40, 0x0040, "small chest first west room 1F" }, + { 0x00, 0x20, 0x0020, "south small chest first room" }, + { 0x00, 0x10, 0x0010, "west small chest first room" }, + { 0x00, 0x08, 0x0008, "small chest second east room 4F" }, + { 0x00, 0x02, 0x0002, "underwater big chest in first west room 2F" }, + { 0x00, 0x01, 0x0001, "small chest first east room 2F" }, + { 0x01, 0x40, 0x0140, "Ooccoo Map Flag" }, + { 0x01, 0x20, 0x0120, "small chest second west room 4F" }, + { 0x01, 0x10, 0x0110, "compass big chest second west room 4F" }, + { 0x01, 0x08, 0x0108, "center small chest first west room 2F" }, + { 0x01, 0x04, 0x0104, "small chest in room before big key" }, + { 0x01, 0x02, 0x0102, "map big chest main room 1F" }, + { 0x01, 0x01, 0x0101, "big chest under boss door main room B1" }, + { 0x02, 0x80, 0x0280, "south underwater big chest in room before mini-boss" }, + { 0x02, 0x40, 0x0240, "north underwater big chest in room before mini-boss" }, + { 0x02, 0x20, 0x0220, "north west big chest first west room 2F" }, + { 0x02, 0x10, 0x0210, "big key chest" }, + { 0x02, 0x08, 0x0208, "big chest second east room 4F" }, + { 0x02, 0x04, 0x0204, "small key big chest first east room 2F" }, + { 0x02, 0x01, 0x0201, "PoH big chest behind gate in first east room 1F" }, + { 0x03, 0x80, 0x0380, "south small chest in first west room 2F" }, + { 0x03, 0x40, 0x0340, "small key big chest first east room 1F" }, + { 0x03, 0x20, 0x0320, "PoH big chest main room 2F" }, + { 0x03, 0x08, 0x0308, "small chest second room" }, + { 0x03, 0x04, 0x0304, "small key big chest room before mini-boss" }, + { 0x03, 0x02, 0x0302, "small chest main room 1F" }, + { 0x03, 0x01, 0x0301, "clawshot big chest mini-boss room" }, + { 0x08, 0x80, 0x0880, "raised water in first east room 1F" }, + { 0x08, 0x40, 0x0840, "water flowing into first east room 1F cs" }, + { 0x08, 0x20, 0x0820, "?" }, + { 0x08, 0x02, 0x0802, "Midna Stalactite text second room" }, + { 0x09, 0x80, 0x0980, "water flowing into first east room 1F" }, + { 0x09, 0x20, 0x0920, "west water flowing into stairs in main room" }, + { 0x09, 0x10, 0x0910, "east water flowing into stairs in main room" }, + { 0x09, 0x08, 0x0908, "water flowing into east wing 1F" }, + { 0x09, 0x04, 0x0904, "water flowing into west wing 1F" }, + { 0x09, 0x02, 0x0902, "water in main room raised twice" }, + { 0x09, 0x01, 0x0901, "water in main room raised once" }, + { 0x0A, 0x80, 0x0A80, "west water not flowing into stairs in main room" }, + { 0x0A, 0x40, 0x0A40, "east water not flowing into stairs in main room" }, + { 0x0A, 0x20, 0x0A20, "west water is flowing into main room" }, + { 0x0A, 0x10, 0x0A10, "staircase top is west main room" }, + { 0x0A, 0x08, 0x0A08, "staircase top is east main room" }, + { 0x0A, 0x04, 0x0A04, "east water is flowing into main room" }, + { 0x0A, 0x02, 0x0A02, "let water flow out of room west wing 2F" }, + { 0x0A, 0x01, 0x0A01, "let water flow out of room east wing 2F" }, + { 0x0B, 0x10, 0x0B10, "spawn clawshot big chest" }, + { 0x0B, 0x08, 0x0B08, "set staircase top is east main room" }, + { 0x0B, 0x04, 0x0B04, "set staircase top is north main room" }, + { 0x0B, 0x02, 0x0B02, "set staircase top is west main room" }, + { 0x0B, 0x01, 0x0B01, "set staircase top is south main room (default)" }, + { 0x0D, 0x40, 0x0D40, "PoH big chest behind gate in first east room 1F (set after)" }, + { 0x0D, 0x20, 0x0D20, "horizontal wheel is turning in first east room" }, + { 0x0D, 0x10, 0x0D10, "unlock east door main room 2F" }, + { 0x0D, 0x08, 0x0D08, "vertical wheel is turning in first east room 2F" }, + { 0x0D, 0x04, 0x0D04, "small key big chest first east room 1F (set after)" }, + { 0x0D, 0x02, 0x0D02, "east wing water switch 4F" }, + { 0x0D, 0x01, 0x0D01, "west wing water switch 4F" }, + { 0x0E, 0x04, 0x0E04, "opened north gate first east room 2F" }, + { 0x0E, 0x01, 0x0E01, "opened gate in first room" }, + { 0x0F, 0x80, 0x0F80, "blown up second rock in room before big key" }, + { 0x0F, 0x40, 0x0F40, "blown up first rock in room before big key" }, + { 0x0F, 0x10, 0x0F10, "unlocked door in second east room 2F" }, + { 0x0F, 0x08, 0x0F08, "unlocked door in room before mini-boss" }, + { 0x0F, 0x02, 0x0F02, "horizontal wheel is turning in first east room cs" }, + { 0x0F, 0x01, 0x0F01, "horizontal wheels turning in first west room" }, + { 0x10, 0x80, 0x1080, "killed lizalfos in south hallway to main room 2F" }, + { 0x10, 0x40, 0x1040, "killed lizalfos behind gate in first east room 1F " }, + { 0x10, 0x04, 0x1004, "blown up rock in room before mini-boss" }, + { 0x11, 0x80, 0x1180, "Ooccoo Freed" }, + { 0x11, 0x20, 0x1120, "unlocked boss door" }, + { 0x11, 0x10, 0x1110, "a stalactite fell in second room (other than the first one)" }, + { 0x11, 0x04, 0x1104, "stalactite fell in first west room 2F" }, + { 0x11, 0x02, 0x1102, "stalactite falls by itself in second room" }, + { 0x11, 0x01, 0x1101, "left stalactite fell in first east room 2F" }, + { 0x12, 0x80, 0x1280, "right stalactite fell in first east room 2F" }, + { 0x12, 0x40, 0x1240, "blown up rock in first east room 2F" }, + { 0x12, 0x20, 0x1220, "south stalactite fell in first east room 1F" }, + { 0x12, 0x10, 0x1210, "north stalactite fell in first east room 1F" }, + { 0x12, 0x08, 0x1208, "south-east stalactite fell second room" }, + { 0x12, 0x04, 0x1204, "north east stalactite fell in second room" }, + { 0x12, 0x02, 0x1202, "south Stalactite fell second room" }, + { 0x12, 0x01, 0x1201, "north west stalactite fell in second room" }, + { 0x13, 0x80, 0x1380, "south west stalactile fell in second room" }, + { 0x13, 0x20, 0x1320, "killed first shell blade in room before big key" }, + { 0x13, 0x10, 0x1310, "killed second shell blade in room before big key" }, + { 0x13, 0x04, 0x1304, "opened north gate in first west room 2F" }, + { 0x13, 0x02, 0x1302, "opened south gate in first west room 2F" }, + { 0x13, 0x01, 0x1301, "opened gates in mini-boss room" }, + { 0x14, 0x10, 0x1410, "explore main room" }, + { 0x14, 0x04, 0x1404, "main room intro cs" }, + { 0x14, 0x02, 0x1402, "south Hallway to Main room intro cs" }, + { 0x14, 0x01, 0x1401, "first room intro cs" }, + { 0x15, 0x20, 0x1520, "move staircase main room cs" }, + { 0x15, 0x08, 0x1508, "west water flowing into staircase main room cs" }, + { 0x15, 0x04, 0x1504, "east water flowing into staircase main room cs" }, + { 0x15, 0x02, 0x1502, "water in main room raised rwice cs" }, + { 0x15, 0x01, 0x1501, "west water is flowing into main room cs" }, + { 0x16, 0x80, 0x1680, "water in main room raised once cs" }, + { 0x16, 0x40, 0x1640, "east water is flowing into main room cs" }, + { 0x16, 0x20, 0x1620, "big key chest (set after)" }, + { 0x16, 0x10, 0x1610, "compass big chest second west room 4F (set after)" }, + { 0x16, 0x08, 0x1608, "bubble worm cs second east room 2F" }, + { 0x16, 0x01, 0x1601, "enter/exit mini-boss room from 1F door (spawns enemies in room before)" }, + { 0x17, 0x04, 0x1704, "killed right lizalfos in first west room 2F" }, + { 0x17, 0x02, 0x1702, "killed left lizalfos in first west room 2F" }, + { 0x17, 0x01, 0x1701, "killed lizalfos in first east room 2F" }, +}; + +inline EventAreaFlags eventAreaFlagsLHLC[] = +{ + { 0x02, 0x40, 0x0240, "big chest room 5 lake hylia long cave" }, + { 0x02, 0x20, 0x0220, "east big chest room 10 Lake Hylia Long Cave" }, + { 0x02, 0x10, 0x0210, "north small chest room 9 Lake Hylia Long Cave" }, + { 0x02, 0x08, 0x0208, "east small chest room 8 Lake Hylia Long Cave" }, + { 0x02, 0x04, 0x0204, "north small chest room 6 Lake hylia Long Cave" }, + { 0x02, 0x02, 0x0202, "south small chest room 7 Lake Hylia Long Cave" }, + { 0x02, 0x01, 0x0201, "north small chest room 5 Lake hylia Long Cave" }, + { 0x03, 0x80, 0x0380, "north small chest room 4 Lake Hylia Long Cave" }, + { 0x03, 0x40, 0x0340, "west small chest room 2 Lake hylia Long Cave" }, + { 0x03, 0x20, 0x0320, "west big chest room 7 Lake Hylia Long Cave" }, + { 0x03, 0x10, 0x0310, "north big chest room 8 Lake Hylia Long Cave" }, + { 0x03, 0x08, 0x0308, "big chest room 11 lake hylia long cave" }, + { 0x03, 0x04, 0x0304, "north small chest room 1 Lake hylia Long Cave" }, + { 0x03, 0x02, 0x0302, "west small chest room 1 Lake hylia Long Cave" }, + { 0x03, 0x01, 0x0301, "east small chest room 3 Lake Hylia Long Cave" }, + { 0x04, 0x80, 0x0480, "small chest Goron Stock Cave" }, + { 0x04, 0x40, 0x0440, "big chest in front of exit Goron Stock Cave" }, + { 0x04, 0x20, 0x0420, "big chest spawned form torches Goron Stock Cave" }, + { 0x08, 0x80, 0x0880, "explored section 18 Lake hylia Long Cave" }, + { 0x08, 0x40, 0x0840, "explored section 15 Lake hylia Long Cave" }, + { 0x08, 0x20, 0x0820, "explored section 12 Lake hylia Long Cave" }, + { 0x08, 0x10, 0x0810, "explored section 11 Lake hylia Long Cave" }, + { 0x08, 0x08, 0x0808, "explored section 9 Lake hylia Long Cave" }, + { 0x08, 0x04, 0x0804, "explored section 6 Lake hylia Long Cave" }, + { 0x08, 0x02, 0x0802, "explored section 4 Lake hylia Long Cave" }, + { 0x08, 0x01, 0x0801, "explored section 27 (room 11) Lake hylia Long Cave" }, + { 0x09, 0x80, 0x0980, "explored section 24 (room 10) Lake hylia Long Cave" }, + { 0x09, 0x40, 0x0940, "explored section 23 (room 9) Lake hylia Long Cave" }, + { 0x09, 0x20, 0x0920, "explored section 22 Lake hylia Long Cave" }, + { 0x09, 0x10, 0x0910, "explored east area room 8 Lake hylia Long Cave" }, + { 0x09, 0x08, 0x0908, "explored north area room 8 Lake hylia Long Cave" }, + { 0x09, 0x04, 0x0904, "explored section 21 (room 8) Lake hylia Long Cave" }, + { 0x09, 0x02, 0x0902, "explored section 17 Lake hylia Long Cave" }, + { 0x09, 0x01, 0x0901, "explored south area room 7 Lake hylia Long Cave" }, + { 0x0A, 0x80, 0x0A80, "explored west area room 7 Lake hylia Long Cave" }, + { 0x0A, 0x40, 0x0A40, "explored section 16 (room 7) Lake hylia Long Cave" }, + { 0x0A, 0x20, 0x0A20, "explored section 14 Lake hylia Long Cave" }, + { 0x0A, 0x10, 0x0A10, "explored north area room 6 Lake hylia Long Cave" }, + { 0x0A, 0x08, 0x0A08, "explored section 13 (room 6) Lake hylia Long Cave" }, + { 0x0A, 0x04, 0x0A04, "explored section 10 (room 5) Lake hylia Long Cave" }, + { 0x0A, 0x02, 0x0A02, "explored section 8 Lake hylia Long Cave" }, + { 0x0A, 0x01, 0x0A01, "explored north area room 4 Lake hylia Long Cave" }, + { 0x0B, 0x80, 0x0B80, "explored section 7 (room 4) Lake hylia Long Cave" }, + { 0x0B, 0x40, 0x0B40, "explored section 5 (room 3) Lake hylia Long Cave" }, + { 0x0B, 0x20, 0x0B20, "explored section 3 (room 2) Lake hylia Long Cave" }, + { 0x0B, 0x10, 0x0B10, "explored section 2 Lake hylia Long Cave" }, + { 0x0B, 0x08, 0x0B08, "explored north area room 1 Lake hylia Long Cave" }, + { 0x0B, 0x04, 0x0B04, "explored west area room 1 Lake hylia Long Cave" }, + { 0x0B, 0x02, 0x0B02, "explored section 1 (room 1) Lake hylia Long Cave" }, + { 0x0C, 0x80, 0x0C80, "blown up north rock room 7 Lake hylia long cave" }, + { 0x0C, 0x10, 0x0C10, "blown up north rock room 3 Lake hylia long cave" }, + { 0x0C, 0x04, 0x0C04, "blown up north rock room 4 Lake hylia long cave" }, + { 0x0C, 0x01, 0x0C01, "blown up south rock room 8 Lake hylia long cave" }, + { 0x0D, 0x40, 0x0D40, "blown up east rock room 6 Lake Hylia Long Cave" }, + { 0x0D, 0x20, 0x0D20, "blown up west rock room 6 Lake Hylia Long Cave" }, + { 0x0D, 0x04, 0x0D04, "blown up north rock room 5 Lake Hylia Long Cave" }, + { 0x0D, 0x02, 0x0D02, "blown up north rock room 9 Lake Hylia Long Cave" }, + { 0x0D, 0x01, 0x0D01, "blown up east rock room 3 Lake hylia long cave" }, + { 0x0E, 0x80, 0x0E80, "lit right torch room 5 lake hylia long cave" }, + { 0x0E, 0x40, 0x0E40, "lit left torch room 5 lake hylia long cave" }, + { 0x0E, 0x20, 0x0E20, "spawn big chest room 11 lake hylia long cave" }, + { 0x0E, 0x10, 0x0E10, "lit right torch room 11 Lake Hylia Long Cave" }, + { 0x0E, 0x08, 0x0E08, "lit left torch room 11 Lake Hylia Long Cave" }, + { 0x0E, 0x04, 0x0E04, "explored south area room 11 Lake hylia Long Cave" }, + { 0x0E, 0x02, 0x0E02, "explored east area room 10 Lake hylia Long Cave" }, + { 0x0E, 0x01, 0x0E01, "explored north area room 9 Lake hylia Long Cave" }, + { 0x0F, 0x80, 0x0F80, "explored east area room 6 Lake hylia Long Cave" }, + { 0x0F, 0x40, 0x0F40, "explored north area room 5 Lake hylia Long Cave" }, + { 0x0F, 0x20, 0x0F20, "explored east area room 3 Lake hylia Long Cave" }, + { 0x0F, 0x10, 0x0F10, "explored west area room 2 Lake hylia Long Cave" }, + { 0x0F, 0x08, 0x0F08, "explored section 25 Lake hylia Long Cave" }, + { 0x0F, 0x04, 0x0F04, "explored section 26 Lake hylia Long Cave" }, + { 0x0F, 0x02, 0x0F02, "explored section 20 Lake hylia Long Cave" }, + { 0x0F, 0x01, 0x0F01, "explored section 19 Lake hylia Long Cave" }, + { 0x10, 0x80, 0x1080, "killed poe in room 11 Lake Hylia Long Cave" }, + { 0x10, 0x40, 0x1040, "killed poe in room 3 Lake Hylia Long Cave" }, + { 0x10, 0x20, 0x1020, "killed poe in room 8 Lake Hylia Long Cave" }, + { 0x10, 0x04, 0x1004, "lit torch 9 (room 7) Lake hylia Long Cave" }, + { 0x10, 0x01, 0x1001, "lit torch 5 (room 4) Lake hylia Long Cave" }, + { 0x11, 0x40, 0x1140, "lit torch 3 (room 2) Lake hylia Long Cave" }, + { 0x11, 0x20, 0x1120, "lit torch 2 (room 1) Lake hylia Long Cave" }, + { 0x11, 0x08, 0x1108, "lit torch 12 (room 10) Lake hylia Long Cave" }, + { 0x11, 0x04, 0x1104, "lit torch 10 (room 8) Lake hylia Long Cave" }, + { 0x11, 0x02, 0x1102, "spawn big chest room 5 lake hylia long cave" }, + { 0x11, 0x01, 0x1101, "lit torch 4 (room 3) Lake hylia Long Cave" }, + { 0x12, 0x80, 0x1280, "blown up east rock room 9 Lake hylia long cave" }, + { 0x12, 0x40, 0x1240, "blown up west rock room 2 Lake hylia Long Cave" }, + { 0x12, 0x20, 0x1220, "blown up east rock room 2 Lake hylia Long Cave" }, + { 0x12, 0x10, 0x1210, "blown up north rock room 6 Lake hylia Long Cave" }, + { 0x12, 0x08, 0x1208, "blown up west rock room 5 Lake hylia Long Cave" }, + { 0x12, 0x04, 0x1204, "blown up east rock room 8 Lake Hylia Long Cave" }, + { 0x12, 0x02, 0x1202, "blown up east rock room 10 Lake Hylia Long Cave" }, + { 0x12, 0x01, 0x1201, "blown up north rock room 8 Lake hylia Long Cave" }, + { 0x13, 0x80, 0x1380, "blown up west rock room 7 Lake hylia Long Cave" }, + { 0x13, 0x40, 0x1340, "blown up south rock room 7 Lake hylia Long Cave" }, + { 0x13, 0x20, 0x1320, "blown up south rock room 10 Lake hylia Long Cave" }, + { 0x13, 0x10, 0x1310, "blown up west rock room 4 Lake hylia Long Cave" }, + { 0x13, 0x08, 0x1308, "blown up west rock room 1 Lake hylia Long Cave" }, + { 0x13, 0x04, 0x1304, "blown up north rock room 1 Lake hylia Long Cave" }, + { 0x13, 0x02, 0x1302, "blown up east rock room 1 Lake hylia Long Cave" }, + { 0x14, 0x80, 0x1480, "spawn big chest bottom floor Goron Stock Cave" }, + { 0x14, 0x40, 0x1440, "lit right torch bottom floor Goron Stock Cave" }, + { 0x14, 0x20, 0x1420, "lit left torch bottom floor Goron Stock Cave" }, +}; + +inline EventAreaFlags eventAreaFlagsOrdon[] = +{ + { 0x03, 0x10, 0x0310, "wooden sword big chest" }, + { 0x03, 0x04, 0x0304, "iron boots big chest" }, + { 0x03, 0x02, 0x0302, "Big chest link's basement" }, + { 0x08, 0x80, 0x0880, "despawn Bo and Jaggle after scaring them away (wolf night)" }, + { 0x08, 0x40, 0x0840, "scare away Bo and Jaggle after hearing them (wolf night)" }, + { 0x08, 0x20, 0x0820, "started sword training" }, + { 0x08, 0x10, 0x0810, "obtained wooden sword" }, + { 0x08, 0x08, 0x0808, "midna text after getting ordon shield (spawns sword)" }, + { 0x08, 0x04, 0x0804, "got ordon shield (will despawn it if set)" }, + { 0x08, 0x02, 0x0802, "midna text after getting ordon sword" }, + { 0x08, 0x01, 0x0801, "got ordon sword" }, + { 0x09, 0x80, 0x0980, "exit shield house as wolf cs" }, + { 0x09, 0x40, 0x0940, "Goats 2" }, + { 0x09, 0x20, 0x0920, "day 3 intro cs (spawn in ranch)" }, + { 0x09, 0x08, 0x0908, "knocked down bee's nest day 2 cs" }, + { 0x09, 0x04, 0x0904, "? (wolf in village night)" }, + { 0x09, 0x02, 0x0902, "Ranch first time CS" }, + { 0x0A, 0x80, 0x0A80, "Rusl moving during wolf night" }, + { 0x0A, 0x40, 0x0A40, "killed spider on top of Link's house" }, + { 0x0A, 0x20, 0x0A20, "spawn 2 spiders around Link,s house (day 2) (set after buying slingshot)" }, + { 0x0A, 0x10, 0x0A10, "Ilia spring CS watched" }, + { 0x0A, 0x08, 0x0A08, "Ilia spring CS started" }, + { 0x0A, 0x04, 0x0A04, "Ordon Village first time CS" }, + { 0x0A, 0x02, 0x0A02, "Ilia spring CS Trigger" }, + { 0x0A, 0x01, 0x0A01, "killed spider on ladder to link's house" }, + { 0x0B, 0x80, 0x0B80, "Epona being in spring" }, + { 0x0B, 0x20, 0x0B20, "finished slingshot training" }, + { 0x0B, 0x10, 0x0B10, "Entered spring Area first time" }, + { 0x0B, 0x08, 0x0B08, "Intro CS watched" }, + { 0x0B, 0x02, 0x0B02, "finished sword training" }, + { 0x0C, 0x80, 0x0C80, "killed bulblin ordon woods" }, + { 0x0C, 0x40, 0x0C40, "killed second bulblin Link's house" }, + { 0x0C, 0x20, 0x0C20, "killed first bulblin Link's house" }, + { 0x0C, 0x10, 0x0C10, "spawn wooden sword big chest" }, + { 0x0C, 0x08, 0x0C08, "Day 2 intro CS" }, + { 0x0C, 0x04, 0x0C04, "talked to owl as wolf for the first time" }, + { 0x0C, 0x02, 0x0C02, "Goats 1" }, + { 0x0C, 0x01, 0x0C01, "set after getting ordon shield" }, + { 0x0D, 0x80, 0x0D80, "approach faron twilight to enter it with midna cs" }, + { 0x0D, 0x20, 0x0D20, "spawn shadow beast" }, + { 0x0D, 0x10, 0x0D10, "Ordon Spring Portal" }, + { 0x0D, 0x08, 0x0D08, "hear Bo and Jaggle talk about shield from far away (wolf night)" }, + { 0x0D, 0x02, 0x0D02, "entered shield house as wolf cs" }, + { 0x0D, 0x01, 0x0D01, "ordon shield fell down cs" }, + { 0x0E, 0x80, 0x0E80, "midna text leaving spring" }, + { 0x0E, 0x20, 0x0E20, "started midna jump to ordon shield inside house" }, + { 0x0E, 0x08, 0x0E08, "Hanch started attacking (unlocks midna jump to top of shop)" }, + { 0x0E, 0x04, 0x0E04, "midna cs after hearing Bo and Jaggle talk about shield" }, + { 0x0E, 0x02, 0x0E02, "day 3 Fado intro text" }, + { 0x0F, 0x80, 0x0F80, "Allows Link to stop goat in Village" }, + { 0x0F, 0x20, 0x0F20, "started midna jumps to top of shop" }, + { 0x0F, 0x08, 0x0F08, "midna text before doing jumps to top of shop" }, + { 0x0F, 0x04, 0x0F04, "Rusl talking to his wife cs (wolf night)" }, + { 0x0F, 0x02, 0x0F02, "unlock midna jumps to shield house" }, + { 0x0F, 0x01, 0x0F01, "scared Hanch" }, + { 0x12, 0x02, 0x1202, "torch next to Hanch is lit (wolf night)" }, + { 0x12, 0x01, 0x1201, "? (wolf in village night)" }, + { 0x13, 0x80, 0x1380, "iron boots big chest (duplicate)" }, + { 0x13, 0x40, 0x1340, "spawn iron boots chest in Bo's house" }, + { 0x13, 0x20, 0x1320, "brigthen up area under Hanch after getting spoted" }, + { 0x13, 0x10, 0x1310, "set after midna text after getting ordon shield" }, + { 0x13, 0x08, 0x1308, "Hanch spoted you cs (wolf night)" }, + { 0x13, 0x04, 0x1304, "randomly set during wolf night (often during Hanch part)" }, + { 0x13, 0x02, 0x1302, "Hero's shade map marker" }, + { 0x13, 0x01, 0x1301, "Ordon day 1 (save promt)" }, + { 0x14, 0x80, 0x1480, "set after midna text after getting ordon sword" }, + { 0x14, 0x01, 0x1401, "Jump to eagle grass next to Jaggle day 2 (removes Jaggle text)" }, + { 0x15, 0x10, 0x1510, "did midna jumps to top of shop" }, + { 0x16, 0x01, 0x1601, "King Bulblin cs" }, + { 0x17, 0x80, 0x1780, "enter village as wolf intro cs" }, + { 0x17, 0x20, 0x1720, "explored area with link's house (wolf)" }, + { 0x19, 0x80, 0x1980, "picked up yellow rupee on top of Hanch's house" }, + { 0x19, 0x40, 0x1940, "picked up green rupee in grass in front of Bo's house" }, + { 0x19, 0x20, 0x1920, "picked up green rupees in pond next to Rusl's house (day 2)" }, + { 0x19, 0x10, 0x1910, "picked up purple rupee behind Jaggle's house" }, + { 0x19, 0x01, 0x1901, "picked up green rupee in the back of the grass to the right of Link's house" }, + { 0x1A, 0x80, 0x1A80, "picked up green rupee in grass right of gate to village " }, + { 0x1A, 0x40, 0x1A40, "picked up green rupee next to rock in the grass to the right of Link's house" }, + { 0x1A, 0x20, 0x1A20, "picked up green rupee in grass to the right of Link's house" }, + { 0x1A, 0x10, 0x1A10, "picked up first green rupee in crawl space" }, + { 0x1A, 0x08, 0x1A08, "picked up yellow rupee on top of Bo's house" }, + { 0x1A, 0x02, 0x1A02, "picked up blue rupee on top of Hanch's house" }, + { 0x1A, 0x01, 0x1A01, "Picked up Orange Rupee by Rusl's house" }, + { 0x1B, 0x80, 0x1B80, "picked up green rupees on top of Hanch's house (day 2)" }, + { 0x1B, 0x40, 0x1B40, "picked up green rupees on top of Bo's house (day 2)" }, + { 0x1B, 0x08, 0x1B08, "Picked up Ordon Sword" }, + { 0x1B, 0x04, 0x1B04, "picked up green rupee under bridge (day 2)" }, + { 0x1B, 0x02, 0x1B02, "picked up yellow rupees on top of Rusl's house" }, + { 0x1B, 0x01, 0x1B01, "picked up yellow rupee on cliff next to Bo's house" }, +}; + +inline EventAreaFlags eventAreaFlagsPoT[] = +{ + { 0x00, 0x40, 0x0040, "PoH hidden big chest west room 1" }, + { 0x00, 0x20, 0x0020, "north west small chest east room 2" }, + { 0x00, 0x10, 0x0010, "north east small chest east room 2" }, + { 0x00, 0x08, 0x0008, "west small chest east room 1" }, + { 0x00, 0x04, 0x0004, "small key big chest north room 3" }, + { 0x00, 0x02, 0x0002, "south higher big chest west room 2" }, + { 0x00, 0x01, 0x0001, "small key big chest north room 2" }, + { 0x01, 0x80, 0x0180, "big key chest" }, + { 0x01, 0x40, 0x0140, "small key big chest north room 1" }, + { 0x02, 0x08, 0x0208, "placed west sol" }, + { 0x02, 0x04, 0x0204, "placed east sol" }, + { 0x03, 0x80, 0x0380, "small key east big chest east room 2" }, + { 0x03, 0x40, 0x0340, "small key north east big chest east room 1" }, + { 0x03, 0x20, 0x0320, "small key north big chest west room 2" }, + { 0x03, 0x10, 0x0310, "small key big chest west room 1" }, + { 0x03, 0x08, 0x0308, "compass lower south big chest west room 2" }, + { 0x03, 0x01, 0x0301, "PoH east big chest east room 1" }, + { 0x07, 0x10, 0x0710, "north west small chest east room 1" }, + { 0x07, 0x02, 0x0702, "map west big chest east room 2" }, + { 0x08, 0x10, 0x0810, "spawn south fence in east room 3" }, + { 0x08, 0x08, 0x0808, "spawn north fence in east room 3" }, + { 0x08, 0x04, 0x0804, "spawn south fence in west room 3" }, + { 0x08, 0x02, 0x0802, "spawn north fence in west room 3" }, + { 0x09, 0x80, 0x0980, "spawn in main room from midna warp" }, + { 0x09, 0x40, 0x0940, "save prompt after boss" }, + { 0x09, 0x20, 0x0920, "killed east phantom Zant (unlocks door)" }, + { 0x09, 0x10, 0x0910, "killed west phantom Zant (unlocks door)" }, + { 0x09, 0x04, 0x0904, "Phantom Zant 1 CS" }, + { 0x09, 0x02, 0x0902, "?" }, + { 0x09, 0x01, 0x0901, "?" }, + { 0x0A, 0x40, 0x0A40, "killed all Zant heads in east room 2 (spawn big chest)" }, + { 0x0A, 0x20, 0x0A20, "killed Zant head in east room 1 (spawn chest)" }, + { 0x0A, 0x10, 0x0A10, "killed Zant head in west room 2 (spawn 2 big chests)" }, + { 0x0A, 0x08, 0x0A08, "killed Zant head in west room 1 (spawn chest)" }, + { 0x0A, 0x02, 0x0A02, "unlock boss door" }, + { 0x0A, 0x01, 0x0A01, "unlock door in north room 3" }, + { 0x0B, 0x80, 0x0B80, "unlock door in east room 2" }, + { 0x0B, 0x40, 0x0B40, "unlock door in west room 2" }, + { 0x0B, 0x02, 0x0B02, "intro cs" }, + { 0x0B, 0x01, 0x0B01, "?" }, + { 0x0C, 0x80, 0x0C80, "get light master sword cs" }, + { 0x0C, 0x40, 0x0C40, "? (main room)" }, + { 0x0C, 0x20, 0x0C20, "? (main room)" }, + { 0x0C, 0x10, 0x0C10, "Watched CS of platform to east wing being activated" }, + { 0x0C, 0x08, 0x0C08, "Platform to east wing is active" }, + { 0x0C, 0x04, 0x0C04, "Midna text when west sol is placed" }, + { 0x0C, 0x02, 0x0C02, "Midna text when west hand steals sol" }, + { 0x0D, 0x80, 0x0D80, "killed south west Zant head in east room 2" }, + { 0x0D, 0x40, 0x0D40, "killed south east Zant head in east room 2" }, + { 0x0D, 0x20, 0x0D20, "killed center Zant head in east room 2" }, + { 0x0D, 0x10, 0x0D10, "killed first Zant head in east room 2" }, + { 0x0D, 0x08, 0x0D08, "unlock door in north room 2" }, + { 0x0D, 0x04, 0x0D04, "killed dark beasts in north room 3" }, + { 0x0D, 0x02, 0x0D02, "crossed black fog waterfall main room" }, + { 0x0D, 0x01, 0x0D01, "midna text black fog west room 1" }, + { 0x0E, 0x80, 0x0E80, "Midna text finding west sol" }, + { 0x0E, 0x40, 0x0E40, "midna text black fog waterfall main room" }, + { 0x0E, 0x20, 0x0E20, "midna text when seeing a civilian seen" }, + { 0x0E, 0x10, 0x0E10, "midna text after warping back to main room after boss" }, + { 0x0E, 0x02, 0x0E02, "killed second Zant head in north room 3 (spawn big chest)" }, + { 0x0E, 0x01, 0x0E01, "killed first Zant head in north room 3 (spawn head 2)" }, + { 0x0F, 0x80, 0x0F80, "midna text promt when seeing a civilian" }, + { 0x0F, 0x40, 0x0F40, "midna text after light master sword" }, + { 0x0F, 0x20, 0x0F20, "unlock door in north room 1" }, + { 0x0F, 0x10, 0x0F10, "unlock door in east room 1" }, + { 0x0F, 0x08, 0x0F08, "unlock door in west room 1" }, + { 0x10, 0x80, 0x1080, "killed south Zant head in north room 1 (wave 1)" }, + { 0x10, 0x40, 0x1040, "killed center Zant head in north room 1 (wave 1)" }, + { 0x10, 0x20, 0x1020, "killed north west Zant head in north room 1 (wave 1)" }, + { 0x10, 0x10, 0x1010, "killed north east Zant head in north room 1 (wave 1)" }, + { 0x10, 0x08, 0x1008, "?" }, + { 0x10, 0x04, 0x1004, "?" }, + { 0x10, 0x01, 0x1001, "? (main room)" }, + { 0x11, 0x80, 0x1180, "Heal Twili citizen outside west wing" }, + { 0x11, 0x40, 0x1140, "? (main room)" }, + { 0x11, 0x20, 0x1120, "Heal Twili near PoT entrance" }, + { 0x11, 0x10, 0x1110, "Heal Twili citizen outside east wing" }, + { 0x11, 0x08, 0x1108, "Heal Twili citizen next to west sol" }, + { 0x11, 0x04, 0x1104, "Heal Twili citizen next to east sol" }, + { 0x11, 0x02, 0x1102, "Heal Twili citizen north of Light Sword" }, + { 0x11, 0x01, 0x1101, "Heal Twili citizen near fog waterfall" }, + { 0x12, 0x08, 0x1208, "Opened Big Key Chest (causes fence to fall in room before Zant)" }, + { 0x12, 0x04, 0x1204, "Midna text after re-entering west wing after sol stolen" }, + { 0x12, 0x02, 0x1202, "remove fog in north room 4" }, + { 0x13, 0x40, 0x1340, "remove fog and spawn stairs in north room 1" }, + { 0x13, 0x20, 0x1320, "placed east sol in north room 1" }, + { 0x13, 0x10, 0x1310, "placed west sol in north room 1" }, + { 0x13, 0x02, 0x1302, "midna intro text" }, + { 0x15, 0x40, 0x1540, "killed all wave 4 Zant heads in north room 2 (spawn big chest)" }, + { 0x15, 0x20, 0x1520, "killed east Zant head north room 2 (wave 4)" }, + { 0x15, 0x10, 0x1510, "killed west Zant head north room 2 (wave 4)" }, + { 0x15, 0x08, 0x1508, "killed Zant head wave 3 in north room 2 (spawn wave 4)" }, + { 0x15, 0x04, 0x1504, "killed all wave 2 Zant heads in north room 2 (spawn wave 3)" }, + { 0x15, 0x02, 0x1502, "killed west Zant head north room 2 (wave 2)" }, + { 0x15, 0x01, 0x1501, "killed east Zant head north room 2 (wave 2)" }, + { 0x16, 0x80, 0x1680, "killed middle Zant head north room 2 (wave 2)" }, + { 0x16, 0x40, 0x1640, "killed first Zant head north room 2 (spawn wave 2)" }, + { 0x16, 0x10, 0x1610, "Watched east wing second room stairs CS" }, + { 0x16, 0x01, 0x1601, "?" }, + { 0x17, 0x80, 0x1780, "?" }, + { 0x17, 0x40, 0x1740, "killed dark beasts in east room 2" }, + { 0x17, 0x20, 0x1720, "spawn fog in east room 3" }, + { 0x17, 0x10, 0x1710, "spawn fog in west room 3" }, + { 0x17, 0x08, 0x1708, "killed all wave 2 Zant heads in north room 1 (spawn big chest)" }, + { 0x17, 0x04, 0x1704, "killed north west Zant head north room 1 (wave 2)" }, + { 0x17, 0x02, 0x1702, "killed north east Zant head north room 1 (wave 2)" }, + { 0x17, 0x01, 0x1701, "killed all wave 1 Zant heads in north room 1 (spawn wave 2)" }, + { 0x1B, 0x01, 0x1B01, "heart container" }, +}; + +inline EventAreaFlags eventAreaFlagsSacredGrove[] = +{ + { 0x03, 0x08, 0x0308, "Big chest lost woods 2 torches" }, + { 0x03, 0x04, 0x0304, "Big chest spinner in skull kid wolf battle area" }, + { 0x03, 0x02, 0x0302, "PoH big chest temple of time (past)" }, + { 0x08, 0x80, 0x0880, "lit left torch chest lost woods" }, + { 0x08, 0x40, 0x0840, "killed poe temple of time (past)" }, + { 0x08, 0x20, 0x0820, "midna text after pushing block human" }, + { 0x08, 0x10, 0x0810, "cs after pushing block human" }, + { 0x08, 0x08, 0x0808, "intro cs lost woods" }, + { 0x08, 0x02, 0x0802, "?" }, + { 0x08, 0x01, 0x0801, "?" }, + { 0x09, 0x80, 0x0980, "explored section after window before dungeon (includes map marker for dungeon)" }, + { 0x09, 0x40, 0x0940, "stairs to temple of time area near (dungeon)" }, + { 0x09, 0x20, 0x0920, "strike MS into pedestal in past" }, + { 0x09, 0x10, 0x0910, "window and stairs to dungeon work properly" }, + { 0x09, 0x02, 0x0902, "killed poe lost woods water" }, + { 0x09, 0x01, 0x0901, "killed poe in skull kid wolf battle area" }, + { 0x0A, 0x80, 0x0A80, "killed poe in master sword area (present)" }, + { 0x0A, 0x10, 0x0A10, "skull kid wolf battle area explored" }, + { 0x0B, 0x80, 0x0B80, "temple of time (present) main room explored" }, + { 0x0B, 0x40, 0x0B40, "temple of time (past) main room explored" }, + { 0x0B, 0x20, 0x0B20, "blown up rock in skull kid wolf battle area" }, + { 0x0B, 0x10, 0x0B10, "block pushed human" }, + { 0x0B, 0x04, 0x0B04, "Master Sword Puzzle Complete" }, + { 0x0B, 0x02, 0x0B02, "Master sword area explored" }, + { 0x0B, 0x01, 0x0B01, "Temple of time (present) human entrence explored" }, + { 0x0F, 0x02, 0x0F02, "spawn big chest lost woods 2 torches" }, + { 0x0F, 0x01, 0x0F01, "lit right torch chest lost woods" }, + { 0x16, 0x20, 0x1620, "Master Sword Pulled (does not despawn)" }, + { 0x16, 0x10, 0x1610, "Blocks entrance to Woods (auto-set upon re-entering Grove before Skull Kid 2" }, + { 0x16, 0x08, 0x1608, "Lost woods skull kid human chase (unset once done)" }, + { 0x16, 0x02, 0x1602, "skull kid human defeated" }, + { 0x16, 0x01, 0x1601, "lost woods turns to day after skull kid fight human" }, + { 0x17, 0x80, 0x1780, "Skull Kid Appears (set automatically)" }, + { 0x17, 0x40, 0x1740, "Transition to day after Skull Kid" }, + { 0x17, 0x20, 0x1720, "dark beasts spawned" }, + { 0x17, 0x10, 0x1710, "Sacred Grove Portal (removes statue blocking door of time (to past)" }, +}; + +inline EventAreaFlags eventAreaFlagsSewer[] = +{ + { 0x00, 0x80, 0x0080, "0" }, + { 0x00, 0x40, 0x0040, "1" }, + { 0x00, 0x20, 0x0020, "2" }, + { 0x00, 0x10, 0x0010, "3" }, + { 0x00, 0x08, 0x0008, "4" }, + { 0x00, 0x04, 0x0004, "5" }, + { 0x00, 0x02, 0x0002, "6" }, + { 0x00, 0x01, 0x0001, "7" }, + { 0x01, 0x80, 0x0180, "8" }, + { 0x01, 0x40, 0x0140, "9" }, + { 0x01, 0x20, 0x0120, "10" }, + { 0x01, 0x10, 0x0110, "11" }, + { 0x01, 0x08, 0x0108, "12" }, + { 0x01, 0x04, 0x0104, "13" }, + { 0x01, 0x02, 0x0102, "14" }, + { 0x01, 0x01, 0x0101, "15" }, + { 0x02, 0x80, 0x0280, "16" }, + { 0x02, 0x40, 0x0240, "17" }, + { 0x02, 0x20, 0x0220, "18" }, + { 0x02, 0x10, 0x0210, "19" }, + { 0x02, 0x08, 0x0208, "20" }, + { 0x08, 0x80, 0x0880, "twilight final cs" }, + { 0x08, 0x40, 0x0840, "Zelda cs twilight" }, + { 0x08, 0x20, 0x0820, "midna text after first gate sewers (how to fight)" }, + { 0x08, 0x10, 0x0810, "midna text after exiting to rooftops (twilight)" }, + { 0x08, 0x08, 0x0808, "wake up in jail cs" }, + { 0x08, 0x04, 0x0804, "midna promt to use sense to see gard (entrance to sewers)" }, + { 0x08, 0x02, 0x0802, "pushed box outside (MDH)" }, + { 0x08, 0x01, 0x0801, "pulled lever of first water gate in sewers" }, + { 0x09, 0x80, 0x0980, "dug up blue rupee after crawl space (sewers) (twilight)" }, + { 0x09, 0x40, 0x0940, "second water gate in sewers cs (unset afterwards)" }, + { 0x09, 0x20, 0x0920, "first water gate in sewers cs (unset afterwards)" }, + { 0x09, 0x10, 0x0910, "midna cs after diging out of jail" }, + { 0x09, 0x08, 0x0908, "midna intro cs" }, + { 0x09, 0x04, 0x0904, "waited long enough in jail" }, + { 0x09, 0x02, 0x0902, "broke fragile floor first jump of stairway (unlocks first midna jump)" }, + { 0x09, 0x01, 0x0901, "started midna jumps 3 stairway" }, + { 0x0A, 0x80, 0x0A80, "started midna jumps 2 stairway" }, + { 0x0A, 0x40, 0x0A40, "zelda tower intro cs" }, + { 0x0A, 0x20, 0x0A20, "midna went to the other side of the fence in sewers" }, + { 0x0A, 0x10, 0x0A10, "started midna jumps on rooftops" }, + { 0x0A, 0x08, 0x0A08, "started midna jumps 4 stairway (top to door)" }, + { 0x0A, 0x04, 0x0A04, "broke box inside Link's cell" }, + { 0x0A, 0x02, 0x0A02, "did midna jumps 1 stairway (broke small platform)" }, + { 0x0A, 0x01, 0x0A01, "outside top door intro cs" }, + { 0x0B, 0x80, 0x0B80, "broke fire in Zelda's room" }, + { 0x0B, 0x40, 0x0B40, "midna rejoinded link after crawl space" }, + { 0x0B, 0x20, 0x0B20, "went to the other side of the fence in sewers cs" }, + { 0x0B, 0x10, 0x0B10, "top of stairway intro cs" }, + { 0x0B, 0x08, 0x0B08, "stairway intro cs" }, + { 0x0B, 0x04, 0x0B04, "read midna promt to open door" }, + { 0x0B, 0x02, 0x0B02, "opened door in cell next to Link's" }, + { 0x0B, 0x01, 0x0B01, "dug out of Link's cell" }, + { 0x0D, 0x80, 0x0D80, "killed first bulblin outside (MDH)" }, + { 0x0D, 0x20, 0x0D20, "killed second bulblin outside (MDH)" }, + { 0x0D, 0x04, 0x0D04, "killed bulblin at top of stairway (on the patform) (MDH)" }, + { 0x0E, 0x80, 0x0E80, "killed fourth bulblin in stairway (MDH)" }, + { 0x0E, 0x20, 0x0E20, "killed third bulblin in stairway (MDH)" }, + { 0x0E, 0x04, 0x0E04, "killed second bulblin in stairway (MDH)" }, + { 0x0E, 0x02, 0x0E02, "killed first bulblin in stairway (MDH)" }, + { 0x0F, 0x20, 0x0F20, "talked to midna after using sense on first rooftop gard" }, + { 0x0F, 0x10, 0x0F10, "midna text when approching first rooftop gard" }, + { 0x0F, 0x08, 0x0F08, "listened to first gard in sewers" }, + { 0x0F, 0x04, 0x0F04, "saw first rooftop gard with sense" }, + { 0x0F, 0x02, 0x0F02, "saw first gard in sewers" }, + { 0x0F, 0x01, 0x0F01, "midna cs after diging out of jail" }, + { 0x1B, 0x08, 0x1B08, "picked up green rupee in box in secret passge next to fence (sewers) (twilight)" }, + { 0x1B, 0x04, 0x1B04, "picked up blue rupee in box in left secret way (sewers) (twilight)" }, + { 0x1B, 0x02, 0x1B02, "picked up purple rupee in boxes (first windy bridge) (MDH)" }, + { 0x1B, 0x01, 0x1B01, "picked up yellow rupee in Zelda's fire" }, +}; + +inline EventAreaFlags eventAreaFlagsSnowpeak[] = +{ + { 0x03, 0x01, 0x0301, "Big chest transition cave" }, + { 0x08, 0x40, 0x0840, "montain top explored" }, + { 0x08, 0x20, 0x0820, "Map marker Ashei" }, + { 0x08, 0x04, 0x0804, "montain top cs (pan towards tree)" }, + { 0x08, 0x02, 0x0802, "Post SPR Save Prompt" }, + { 0x09, 0x80, 0x0980, "?" }, + { 0x09, 0x40, 0x0940, "?" }, + { 0x09, 0x20, 0x0920, "Snowpeak top portal" }, + { 0x0B, 0x08, 0x0B08, "explored second section up montain" }, + { 0x0B, 0x04, 0x0B04, "explored first section up montain" }, + { 0x0B, 0x02, 0x0B02, "Midna text in front of SPR" }, + { 0x0B, 0x01, 0x0B01, "intro cs" }, + { 0x0D, 0x10, 0x0D10, "spawn big chest transition cave" }, + { 0x0D, 0x08, 0x0D08, "lit left torch transition cave" }, + { 0x0D, 0x04, 0x0D04, "lit right torch transition cave" }, + { 0x0F, 0x08, 0x0F08, "snow fell down next to howling stone" }, + { 0x14, 0x80, 0x1480, "killed poe transition cave" }, + { 0x14, 0x40, 0x1440, "killed poe next to snowpeak ruins" }, + { 0x14, 0x20, 0x1420, "killed first poe up the montain" }, + { 0x14, 0x10, 0x1410, "killed second poe next to lone tree on cliff" }, + { 0x14, 0x08, 0x1408, "killed third poe near 2 trees before howling stone" }, +}; + +inline EventAreaFlags eventAreaFlagsSPR[] = +{ + { 0x00, 0x02, 0x0002, "PoH big chest under broken ceiling" }, + { 0x01, 0x80, 0x0180, "left small chest behind armor in first room" }, + { 0x01, 0x40, 0x0140, "right small chest behind armor in first room" }, + { 0x01, 0x20, 0x0120, "PoH big chest in first room 2F" }, + { 0x01, 0x10, 0x0110, "west small chest behind ice in north west room" }, + { 0x01, 0x08, 0x0108, "east small chest behind ice in north west room" }, + { 0x01, 0x04, 0x0104, "small key small chest pumpkin room" }, + { 0x01, 0x01, 0x0101, "Ooccoo" }, + { 0x02, 0x80, 0x0280, "south east small chest in courtyard" }, + { 0x02, 0x40, 0x0240, "small key buried east small chest in courtyard" }, + { 0x02, 0x20, 0x0220, "small key buried west small chest in courtyard" }, + { 0x02, 0x08, 0x0208, "big key chest" }, + { 0x02, 0x04, 0x0204, "pumpkin big chest" }, + { 0x03, 0x80, 0x0380, "small key big chest in compass room 2F" }, + { 0x03, 0x40, 0x0340, "cheese big chest" }, + { 0x03, 0x08, 0x0308, "south small chest behind ice in courtyard" }, + { 0x03, 0x04, 0x0304, "compass big chest" }, + { 0x03, 0x02, 0x0302, "small chest compass room 1F" }, + //{ 0x08, 0x80, 0x0880, "position of second block in ice puzzle room" }, + //{ 0x08, 0x40, 0x0840, "position of second block in ice puzzle room" }, + //{ 0x08, 0x20, 0x0820, "position of second block in ice puzzle room" }, + //{ 0x08, 0x10, 0x0810, "position of second block in ice puzzle room" }, + //{ 0x08, 0x08, 0x0808, "position of second block in ice puzzle room" }, + //{ 0x08, 0x04, 0x0804, "position of third block in ice puzzle room (frozen one)" }, + //{ 0x08, 0x02, 0x0802, "position of third block in ice puzzle room (frozen one)" }, + //{ 0x08, 0x01, 0x0801, "position of third block in ice puzzle room (frozen one)" }, + //{ 0x09, 0x80, 0x0980, "position of third block in ice puzzle room (frozen one)" }, + //{ 0x09, 0x40, 0x0940, "position of third block in ice puzzle room (frozen one)" }, + { 0x09, 0x20, 0x0920, "killed poe in armor in first room" }, + { 0x09, 0x08, 0x0908, "unlock west living room door" }, + { 0x09, 0x04, 0x0904, "unlock north living room door" }, + { 0x09, 0x02, 0x0902, "lowered ball transport (west hallway-freezard)" }, + { 0x09, 0x01, 0x0901, "lowered ball transport (courtyard 2F)" }, + { 0x0A, 0x80, 0x0A80, "dug first time west buried small chest in courtyard" }, + { 0x0A, 0x40, 0x0A40, "lowered ball transport (west hallway-courtyard)" }, + { 0x0A, 0x20, 0x0A20, "dug second time west buried small chest in courtyard" }, + { 0x0A, 0x10, 0x0A10, "talked to Yeta for the first time (gives map)" }, + { 0x0A, 0x04, 0x0A04, "destroyed ice in courtyard 2F" }, + { 0x0A, 0x02, 0x0A02, "Yeta enters bedroom cs (in courtyard)" }, + { 0x0A, 0x01, 0x0A01, "unlock bedroom door" }, + { 0x0B, 0x80, 0x0B80, "enter courtyard" }, + { 0x0B, 0x20, 0x0B20, "compass big chest (set after)" }, + { 0x0B, 0x10, 0x0B10, "broke ice in pumpkin room 2F" }, + { 0x0B, 0x08, 0x0B08, "dug up east small chest in courtyard" }, + { 0x0B, 0x04, 0x0B04, "open west door 2F in ice puzzle room" }, + { 0x0B, 0x02, 0x0B02, "open west door 1F in ice puzzle room" }, + { 0x0C, 0x80, 0x0C80, "destroyed first left armor in first room" }, + { 0x0C, 0x40, 0x0C40, "destroyed second left armor in first room" }, + { 0x0C, 0x20, 0x0C20, "destroyed third left armor in first room" }, + //{ 0x0C, 0x08, 0x0C08, "canon in north west room orientation" }, + //{ 0x0C, 0x04, 0x0C04, "canon in north west room orientation" }, + { 0x0C, 0x02, 0x0C02, "killed freezard in courtyard 1F" }, + { 0x0C, 0x01, 0x0C01, "explored compass room" }, + { 0x0D, 0x80, 0x0D80, "killed first freezard in cage" }, + { 0x0D, 0x40, 0x0D40, "killed freezard in courtyard 2F" }, + { 0x0D, 0x20, 0x0D20, "killed west freezard in room above livng room (2F)" }, + { 0x0D, 0x10, 0x0D10, "killed north freezard in room above livng room (2F)" }, + { 0x0D, 0x08, 0x0D08, "broke ice in first room 2F" }, + { 0x0D, 0x04, 0x0D04, "destroyed ice on block in ice puzzle room" }, + { 0x0D, 0x01, 0x0D01, "unlock door in south east room 2F" }, + { 0x0E, 0x80, 0x0E80, "unlocked door to first room in freezard cage room" }, + { 0x0E, 0x20, 0x0E20, "unlock doors in room before pumpkin" }, + { 0x0E, 0x10, 0x0E10, "unlock door in east outside hallway" }, + { 0x0E, 0x08, 0x0E08, "unlock west door in courtyard" }, + { 0x0E, 0x04, 0x0E04, "explored courtyard 1F" }, + { 0x0E, 0x02, 0x0E02, "explored room above ice puzzle (2F)" }, + { 0x0E, 0x01, 0x0E01, "explored room above pumpkin (2F)" }, + { 0x0F, 0x80, 0x0F80, "puched left block in room above living room (2F)" }, + { 0x0F, 0x40, 0x0F40, "puched right block in room above living room (2F)" }, + { 0x0F, 0x20, 0x0F20, "2nd floor block pushed down in ice puzzle room" }, + //{ 0x0F, 0x10, 0x0F10, "position of first block in ice puzzle room" }, + //{ 0x0F, 0x08, 0x0F08, "position of first block in ice puzzle room" }, + //{ 0x0F, 0x04, 0x0F04, "position of first block in ice puzzle room" }, + //{ 0x0F, 0x02, 0x0F02, "position of first block in ice puzzle room" }, + //{ 0x0F, 0x01, 0x0F01, "position of first block in ice puzzle room" }, + { 0x10, 0x80, 0x1080, "Picked up B&C" }, + { 0x10, 0x40, 0x1040, "?" }, + { 0x10, 0x20, 0x1020, "Yeta lets you open door to kitchen" }, + { 0x10, 0x10, 0x1010, "north west room 1F intro cs" }, + { 0x10, 0x08, 0x1008, "Midna big key text prompt" }, + { 0x10, 0x02, 0x1002, "pumpkin room ambush cs trigger" }, + //{ 0x10, 0x01, 0x1001, "courtyard 2F canon orientation" }, + //{ 0x11, 0x80, 0x1180, "courtyard 2F canon orientation" }, + //{ 0x11, 0x40, 0x1140, "courtyard 1F canon orientation" }, + //{ 0x11, 0x20, 0x1120, "courtyard 1F canon orientation" }, + { 0x11, 0x02, 0x1102, "unlock mini-boss doors" }, + { 0x11, 0x01, 0x1101, "pushed block in west outside hallway" }, + { 0x12, 0x40, 0x1240, "unlock doors in pumpkin room" }, + { 0x12, 0x20, 0x1220, "explored path to bedroom 2F & 3F" }, + { 0x12, 0x10, 0x1210, "killed second freezard in cage" }, + { 0x12, 0x08, 0x1208, "explored west outside hallway 2F (canon)" }, + { 0x12, 0x04, 0x1204, "unlock door to big key in big key room" }, + //{ 0x12, 0x02, 0x1202, "freezard cage canon orientation" }, + //{ 0x12, 0x01, 0x1201, "freezard cage canon orientation" }, + { 0x13, 0x40, 0x1340, "killed chilfos in pumpkin room (unlock south door)" }, + { 0x13, 0x20, 0x1320, "?" }, + { 0x13, 0x10, 0x1310, "killed chilfos in big key room" }, + { 0x13, 0x08, 0x1308, "broke center ice in Ice puzzle room" }, + { 0x13, 0x04, 0x1304, "broke first right armor in first room" }, + { 0x13, 0x02, 0x1302, "broke second right armor in first room (spawns poe)" }, + { 0x13, 0x01, 0x1301, "broke third right armor in first room" }, + { 0x14, 0x80, 0x1480, "killed poe in south east room 2F" }, + { 0x14, 0x40, 0x1440, "Midna big key text seen" }, + { 0x14, 0x10, 0x1410, "explored east outside hallway 2F " }, + { 0x14, 0x08, 0x1408, "explored west outside hallway 1F (canonballs)" }, + { 0x14, 0x04, 0x1404, "explored room above living room (2F)" }, + { 0x14, 0x02, 0x1402, "explored freezard in cages room 2F" }, + { 0x14, 0x01, 0x1401, "Intro Cutscene" }, + { 0x15, 0x80, 0x1580, "unlock west door in pumpkin room" }, + { 0x15, 0x40, 0x1540, "destroyed first right armor in cheese room" }, + { 0x15, 0x20, 0x1520, "freezard in cage cs" }, + { 0x15, 0x08, 0x1508, "courtyard intro cs" }, + { 0x15, 0x04, 0x1504, "killed poe in center of first room" }, + { 0x15, 0x02, 0x1502, "pumpkin room intro cs" }, + { 0x15, 0x01, 0x1501, "?" }, + { 0x16, 0x80, 0x1680, "?" }, + { 0x16, 0x40, 0x1640, "Yeta points to kitchen cs" }, + { 0x16, 0x20, 0x1620, "Midna Cheese text prompt" }, + { 0x16, 0x10, 0x1610, "Midna Cheese text seen" }, + { 0x16, 0x08, 0x1608, "Midna pumpkin text seen" }, + { 0x16, 0x04, 0x1604, "Darkhammer (unsets after defeat)" }, + { 0x16, 0x02, 0x1602, "Midna pumpkin text prompt" }, + { 0x16, 0x01, 0x1601, "unlock exit door in big key room" }, + { 0x17, 0x80, 0x1780, "map marker bedroom key" }, + { 0x17, 0x40, 0x1740, "map marker ordon cheese" }, + { 0x17, 0x20, 0x1720, "map marker ordon pumpkin" }, + { 0x17, 0x10, 0x1710, "Blizzeta Cutscene" }, + { 0x17, 0x08, 0x1708, "broke first ice south door in north west room 1F" }, + { 0x17, 0x04, 0x1704, "broke second ice south door in north west room 1F" }, + { 0x17, 0x02, 0x1702, "broke third ice south door in north west room 1F" }, + { 0x17, 0x01, 0x1701, "broke ice wall in compass room 2F" }, +}; + +inline EventAreaFlags eventAreaFlagsToT[] = +{ + { 0x00, 0x80, 0x0080, "map marker statue in room 2" }, + { 0x00, 0x40, 0x0040, "map marker statue will spawn in room 2" }, + { 0x00, 0x20, 0x0020, "map marker statue in room 3" }, + { 0x00, 0x10, 0x0010, "map marker statue will spawn in room 3" }, + { 0x00, 0x08, 0x0008, "map marker statue in room 4" }, + { 0x00, 0x04, 0x0004, "map marker statue will spawn in room 4" }, + { 0x00, 0x02, 0x0002, "map marker statue in room 5" }, + { 0x00, 0x01, 0x0001, "map marker statue will spawn in room 5" }, + { 0x01, 0x80, 0x0180, "map marker statue in room 6" }, + { 0x01, 0x40, 0x0140, "map marker statue will spawn in room 6" }, + { 0x01, 0x20, 0x0120, "map marker statue in room 7" }, + { 0x01, 0x10, 0x0110, "map marker statue will spawn in room 7" }, + { 0x02, 0x10, 0x0210, "PoH big chest room 4" }, + { 0x02, 0x02, 0x0202, "small key big chest room 6 7F" }, + { 0x02, 0x01, 0x0201, "big key chest" }, + { 0x03, 0x40, 0x0340, "compass big chest room 4" }, + { 0x03, 0x20, 0x0320, "PoH big chest south room 5F" }, + { 0x03, 0x10, 0x0310, "small key big chest south room 5F" }, + { 0x03, 0x04, 0x0304, "small chest room 2 2F" }, + { 0x03, 0x02, 0x0302, "map big chest room 2 3F" }, + { 0x03, 0x01, 0x0301, "dominion rod big chest" }, + { 0x04, 0x80, 0x0480, "Ooccoo" }, + { 0x05, 0x01, 0x0501, "small chest big key room" }, + { 0x06, 0x80, 0x0680, "small chest room 5 7F" }, + { 0x06, 0x40, 0x0640, "south small chest south room 5F" }, + { 0x06, 0x20, 0x0620, "small chest room 2 3F" }, + { 0x06, 0x10, 0x0610, "big chest room 5 6F" }, + { 0x06, 0x08, 0x0608, "big chest room 6 8F" }, + { 0x06, 0x02, 0x0602, "small key big chest room 1" }, + { 0x07, 0x02, 0x0702, "map marker statue in room 1" }, + { 0x07, 0x01, 0x0701, "map marker statue will spawn in room 1" }, + { 0x08, 0x80, 0x0880, "Midna text asking to look at missing statue room 1" }, + { 0x08, 0x40, 0x0840, "Midna text after looking at missing statue room 1" }, + { 0x08, 0x20, 0x0820, "unlock door in room 6 8F" }, + { 0x08, 0x10, 0x0810, "unlock door in room 3 5F (spawn baby and young gohmas in south room 5F)" }, + { 0x08, 0x08, 0x0808, "unlock door in room 1" }, + { 0x08, 0x04, 0x0804, "dominion rod big chest (set after)" }, + { 0x08, 0x02, 0x0802, "killed poe in room 3 3F" }, + { 0x08, 0x01, 0x0801, "killed poe in room 5 7F" }, + { 0x09, 0x20, 0x0920, "intro cs" }, + { 0x09, 0x10, 0x0910, "scale intro cs room 5 6F" }, + { 0x09, 0x08, 0x0908, "change balance of scale for the first time cs" }, + { 0x09, 0x04, 0x0904, "change balance of scale for the first time" }, + { 0x0A, 0x80, 0x0A80, "entered room 7" }, + { 0x0A, 0x40, 0x0A40, "spawn west big chest in south room 5F" }, + { 0x0A, 0x08, 0x0A08, "statue getting possessed for the first time cs" }, + { 0x0B, 0x40, 0x0B40, "deactivate statue slot in room 1 (opens door and deactivates statue)" }, + { 0x0B, 0x20, 0x0B20, "deactivate bell in room 2 (required to spawn in room 1)" }, + { 0x0B, 0x10, 0x0B10, "deactivate bell in room 3 (required to spawn in room 2)" }, + { 0x0B, 0x08, 0x0B08, "deactivate bell in room 4 (required to spawn in room 3)" }, + { 0x0B, 0x04, 0x0B04, "deactivate bell in room 5 (required to spawn in room 4)" }, + { 0x0B, 0x02, 0x0B02, "deactivate bell in room 6 (required to spawn in room 5)" }, + { 0x0B, 0x01, 0x0B01, "deactivate bell in room 7 (required to spawn in room 6)" }, + { 0x0C, 0x80, 0x0C80, "unlock door in south room 5F" }, + { 0x0C, 0x40, 0x0C40, "killed armos in room 2 3F (spawn big chest)" }, + { 0x0C, 0x20, 0x0C20, "killed armos in big key room (unlocks door)" }, + { 0x0C, 0x10, 0x0C10, "lit both torches in room 1 (unset if you leave) (spawn big chest)" }, + { 0x0C, 0x04, 0x0C04, "broke gate in room 2 3F" }, + { 0x0C, 0x02, 0x0C02, "broke fouth gate in room 2 2F" }, + { 0x0C, 0x01, 0x0C01, "broke first gate in room 2 2F" }, + { 0x0D, 0x80, 0x0D80, "broke third gate in room 2 2F" }, + { 0x0D, 0x40, 0x0D40, "broke second gate in room 2 2F" }, + { 0x0D, 0x20, 0x0D20, "broke second sliding door in room 4 4F" }, + { 0x0D, 0x10, 0x0D10, "broke third sliding door in room 4 5F" }, + { 0x0D, 0x08, 0x0D08, "broke second sliding door in room 4 5F" }, + { 0x0D, 0x04, 0x0D04, "broke first sliding door in room 4 5F" }, + { 0x0D, 0x02, 0x0D02, "broke first sliding door in room 4 4F" }, + { 0x0D, 0x01, 0x0D01, "broke first beamos in room before boss" }, + { 0x0E, 0x80, 0x0E80, "broke left beamos in room before boss" }, + { 0x0E, 0x40, 0x0E40, "broke right beamos in room before boss" }, + { 0x0E, 0x20, 0x0E20, "broke beamos in room 6 7F" }, + { 0x0E, 0x10, 0x0E10, "broke first beamos in room 4 4F" }, + { 0x0E, 0x08, 0x0E08, "broke second beamos in room 4 4F" }, + { 0x0E, 0x04, 0x0E04, "broke beamos in room 3 3F" }, + { 0x0E, 0x01, 0x0E01, "broke gate to bell in room 3 3F" }, + { 0x0F, 0x80, 0x0F80, "broke gate to poe in room 3 3F" }, + { 0x0F, 0x40, 0x0F40, "broke gate in room 6 8F" }, + { 0x0F, 0x20, 0x0F20, "open door to poe in room 3 3F" }, + { 0x0F, 0x10, 0x0F10, "spawn baby gohmas in beamos room 3 3F" }, + { 0x0F, 0x08, 0x0F08, "broke gate in room 6 8F cs" }, + { 0x0F, 0x01, 0x0F01, "unlock boss door" }, + { 0x10, 0x80, 0x1080, "open big door in room 1 cs part 2" }, + { 0x10, 0x40, 0x1040, "open big door in room 1 cs part 1" }, + { 0x10, 0x10, 0x1010, "killed a baby gohma in room 6 8F" }, + { 0x10, 0x08, 0x1008, "killed a baby gohma in room 6 8F" }, + { 0x10, 0x04, 0x1004, "killed a baby gohma in room 6 8F" }, + { 0x10, 0x02, 0x1002, "killed a baby gohma in room 6 8F" }, + { 0x10, 0x01, 0x1001, "killed a baby gohma in room 6 8F" }, + { 0x11, 0x80, 0x1180, "killed a baby gohma in room 6 8F" }, + { 0x11, 0x40, 0x1140, "killed a baby gohma in room 6 8F" }, + { 0x11, 0x20, 0x1120, "killed a baby gohma in room 6 8F" }, + { 0x11, 0x10, 0x1110, "killed a baby gohma in room 6 8F" }, + { 0x11, 0x08, 0x1108, "killed a baby gohma in room 6 8F" }, + { 0x11, 0x04, 0x1104, "killed a baby gohma in room 6 8F" }, + { 0x11, 0x02, 0x1102, "killed a baby gohma in room 6 8F" }, + { 0x12, 0x80, 0x1280, "pressed button in room 1 (or 6 8F) for the first time cs" }, + { 0x12, 0x40, 0x1240, "pressed button in room 6 7F for the first time cs" }, + { 0x12, 0x20, 0x1220, "killed both armos in room 6 8F (opens gate)" }, + { 0x12, 0x08, 0x1208, "pressed buttons in room 3 5F for the first time cs" }, + { 0x12, 0x04, 0x1204, "pressed buttons in room 2 3F for the first time cs" }, + { 0x12, 0x02, 0x1202, "pressed button in room 2 2F for the first time cs" }, + { 0x13, 0x40, 0x1340, "open gate to dominion rod in room 7" }, + { 0x13, 0x20, 0x1320, "statue spawning out of bell in room 1 cs trigger" }, + { 0x13, 0x10, 0x1310, "statue spawning out of bell in room 1 cs" }, + { 0x13, 0x08, 0x1308, "killed all baby gohmas in room 6 8F (spawn big chest)" }, + { 0x13, 0x04, 0x1304, "killed all enemies in room 5 6F (spawn big chest)" }, + { 0x13, 0x02, 0x1302, "killed west armos in south room 5F" }, + { 0x13, 0x01, 0x1301, "killed east armos in south room 5F" }, + { 0x14, 0x40, 0x1440, "unlock door in room 7" }, + { 0x14, 0x20, 0x1420, "statue getting in bell in room 7 cs first part" }, + { 0x14, 0x10, 0x1410, "statue getting in bell in room 7 cs second part" }, + { 0x14, 0x08, 0x1408, "statue getting in bell in room 7 cs trigger" }, + { 0x14, 0x04, 0x1404, "open gate to dominion rod in room 7 cs" }, + { 0x14, 0x02, 0x1402, "statue spawn out of bell in room 6" }, + { 0x14, 0x01, 0x1401, "statue spawning out of bell in room 6 cs trigger" }, + { 0x15, 0x80, 0x1580, "statue spawning out of bell in room 6 cs part 1" }, + { 0x15, 0x40, 0x1540, "statue getting in bell in room 6 cs trigger" }, + { 0x15, 0x20, 0x1520, "statue getting in bell in room 6 cs" }, + { 0x15, 0x10, 0x1510, "statue spawning out of bell in room 5 cs trigger" }, + { 0x15, 0x08, 0x1508, "statue spawning out of bell in room 5 cs" }, + { 0x15, 0x04, 0x1504, "statue getting in bell in room 5 cs trigger" }, + { 0x15, 0x02, 0x1502, "statue getting in bell in room 5 cs" }, + { 0x15, 0x01, 0x1501, "statue spawning out of bell in room 4 cs trigger" }, + { 0x16, 0x80, 0x1680, "statue spawning out of bell in room 4 cs" }, + { 0x16, 0x40, 0x1640, "statue getting in bell in room 4 cs trigger" }, + { 0x16, 0x20, 0x1620, "statue getting in bell in room 4 cs" }, + { 0x16, 0x10, 0x1610, "statue spawning out of bell in room 3 cs trigger" }, + { 0x16, 0x08, 0x1608, "statue spawning out of bell in room 3 cs" }, + { 0x16, 0x04, 0x1604, "statue getting in bell in room 3 cs trigger" }, + { 0x16, 0x02, 0x1602, "statue getting in bell in room 3 cs" }, + { 0x16, 0x01, 0x1601, "statue spawning out of bell in room 2 cs trigger" }, + { 0x17, 0x80, 0x1780, "statue spawning out of bell in room 2 cs" }, + { 0x17, 0x40, 0x1740, "statue getting in bell in room 2 cs trigger" }, + { 0x17, 0x20, 0x1720, "statue getting in bell in room 2 cs" }, + { 0x17, 0x10, 0x1710, "deactivate spawning bell in room 7" }, + { 0x17, 0x08, 0x1708, "big door in room 1 opens" }, + { 0x17, 0x04, 0x1704, "open big door in room 1 cs part 2 trigger" }, + { 0x17, 0x02, 0x1702, "open big door in room 1 cs part 1 trigger" }, + { 0x17, 0x01, 0x1701, "statue placed in slot in room 1" }, +}; + +struct MultiByteAreaFlag +{ + // flags treated as bool, shift left after checking bool + const char* name; + uint16_t highOrderflag; + uint16_t lowOrderflag; + std::map enumValues; +}; +constexpr uint16_t AREA_FLAG_NONE = 0; + +inline MultiByteAreaFlag ForestTempleMultiByteFlags[] = +{ + { + "Worm Room position", + 0x0D3C, AREA_FLAG_NONE, + { + { 0x0, "On Totem", }, + { 0x8, "North", }, + { 0x7, "North North East", }, + { 0x6, "North East", }, + { 0x5, "East North East", }, + { 0x4, "East", }, + { 0x3, "East South East", }, + { 0x2, "South South East", }, + { 0x1, "South", }, + { 0xF, "South South West", }, + { 0xE, "South West", }, + { 0xD, "West South West", }, + { 0xC, "West", }, + { 0xA, "West North West", }, + { 0xB, "North West", }, + { 0x9, "North North West", }, + }, + } +}; + +inline const std::map _SPRIceBlockPuzzleLocations = +{ + { 0x00, "N/A" }, + { 0x0C, "(-2, 2)" }, + { 0x0B, "(-1, 2)" }, + { 0x0A, "( 0, 2)" }, + { 0x09, "( 1, 2)" }, + { 0x08, "( 2, 2)" }, + + { 0x0D, "(-2, 1)" }, + { 0x14, "(-1, 1)" }, + { 0x15, "( 0, 1)" }, + { 0x16, "( 1, 1)" }, + { 0x07, "( 2, 1)" }, + + { 0x0E, "(-2, 0)" }, + { 0x13, "(-1, 0)" }, + { 0x1A, "( 0, 0)" }, + { 0x17, "( 1, 0)" }, + { 0x06, "( 2, 0)" }, + + { 0x0F, "(-2, -1)" }, + { 0x12, "(-1, -1)" }, + { 0x19, "( 0, -1)" }, + { 0x18, "( 1, -1)" }, + { 0x05, "( 2, -1)" }, + + { 0x10, "(-2, -2)" }, + { 0x11, "(-1, -2)" }, + { 0x02, "( 0, -2)" }, + { 0x03, "( 1, -2)" }, + { 0x04, "( 2, -2)" }, + + { 0x01, "( 0, -3)" }, +}; + +inline MultiByteAreaFlag SPRMultiByteFlags[] = { + { + "Courtyard First Floor Cannon", + 0x1160, AREA_FLAG_NONE, + { + { 1, "North" }, + { 0, "South" }, + { 2, "East" }, + { 3, "West" } + }, + }, + { + "Courtyard Second Floor Cannon", + 0x1001, 0x1180, + { + { 3, "North East" }, + { 0, "South East" }, + { 2, "South West" }, + { 1, "North West" }, + }, + }, + { + "Freezard Cage Room Cannon", + 0x1203, AREA_FLAG_NONE, + { + { 0, "North" }, + { 2, "East" }, + { 1, "South" }, + { 3, "West" }, + }, + }, + { + "North West Room Cannon", + 0x0C0C, AREA_FLAG_NONE, + { + { 3, "North" }, + { 0, "East" }, + { 2, "South" }, + { 1, "West" }, + }, + }, + { + "Ice Block 1 Location", + 0x0F1F, AREA_FLAG_NONE, + _SPRIceBlockPuzzleLocations + }, + { + "Ice Block 2 Location", + 0x08F8, AREA_FLAG_NONE, + _SPRIceBlockPuzzleLocations + }, + { + "Ice Block 3 Location", + 0x0807, 0x09C0, + _SPRIceBlockPuzzleLocations + } +}; + +inline const std::map _CoOBlockPuzzle1Locations = { + { 0x00, "N/A" }, + { 0x0B, "(-1, 2)" }, + { 0x0C, "( 0, 2)" }, + { 0x01, "( 1, 2)" }, + + { 0x0A, "(-1, 1)" }, + { 0x0D, "( 0, 1)" }, + { 0x02, "( 1, 1)" }, + + { 0x09, "(-1, 0)" }, + { 0x0E, "( 0, 0)" }, + { 0x03, "( 1, 0)" }, + + { 0x08, "(-1, -1)" }, + { 0x0F, "( 0, -1)" }, + { 0x04, "( 1, -1)" }, + + { 0x07, "(-1, -2)" }, + { 0x06, "( 0, -2)" }, + { 0x05, "( 1, -2)" }, +}; + +inline const std::map _CoOBlockPuzzle2Locations = { + { 0x00, "N/A" }, + { 0x01, "(-1, 2)" }, + { 0x02, "( 0, 2)" }, + { 0x03, "( 1, 2)" }, + + { 0x0C, "(-1, 1)" }, + { 0x0D, "( 0, 1)" }, + { 0x04, "( 1, 1)" }, + { 0x05, "( 2, 1)" }, + + { 0x0B, "(-1, 0)" }, + { 0x0E, "( 0, 0)" }, + { 0x0F, "( 1, 0)" }, + { 0x06, "( 2, 0)" }, + + { 0x0A, "(-1, -1)" }, + { 0x09, "( 0, -1)" }, + { 0x08, "( 1, -1)" }, + { 0x07, "( 2, -1)" }, +}; + +inline const std::map _CoOBlockPuzzle3Locations = { + { 0x00, "N/A" }, + { 0x01, "(-2, 2)" }, + { 0x02, "(-1, 2)" }, + { 0x03, "( 0, 2)" }, + { 0x04, "( 1, 2)" }, + { 0x05, "( 2, 2)" }, + + { 0x10, "(-2, 1)" }, + { 0x11, "(-1, 1)" }, + { 0x12, "( 0, 1)" }, + { 0x13, "( 1, 1)" }, + { 0x06, "( 2, 1)" }, + + { 0x0F, "(-2, 0)" }, + { 0x18, "(-1, 0)" }, + { 0x19, "( 0, 0)" }, + { 0x14, "( 1, 0)" }, + { 0x07, "( 2, 0)" }, + + { 0x0E, "(-2, -1)" }, + { 0x17, "(-1, -1)" }, + { 0x16, "( 0, -1)" }, + { 0x15, "( 1, -1)" }, + { 0x08, "( 2, -1)" }, + + { 0x0D, "(-2, -2)" }, + { 0x0C, "(-1, -2)" }, + { 0x0B, "( 0, -2)" }, + { 0x0A, "( 1, -2)" }, + { 0x09, "( 2, -2)" }, +}; + +inline MultiByteAreaFlag CoOMultiByteFlags[] = { + { + "Puzzle 1 Block 1 Location", + 0x0907, 0x0A80, + _CoOBlockPuzzle1Locations + }, + { + "Puzzle 1 Block 2 Location", + 0x0A3C, AREA_FLAG_NONE, + _CoOBlockPuzzle1Locations + }, + { + "Puzzle 1 Block 3 Location", + 0x0B0F, AREA_FLAG_NONE, + _CoOBlockPuzzle1Locations + }, + { + "Puzzle 2 Block 1 Location", + 0x08F0, AREA_FLAG_NONE, + _CoOBlockPuzzle2Locations + }, + { + "Puzzle 2 Block 2 Location", + 0x080F, AREA_FLAG_NONE, + _CoOBlockPuzzle2Locations + }, + { + "Puzzle 2 Block 3 Location", + 0x09F0, AREA_FLAG_NONE, + _CoOBlockPuzzle2Locations + }, + { + "Puzzle 3 Block 1 Location", + 0x0E7C, AREA_FLAG_NONE, + _CoOBlockPuzzle3Locations + }, + { + "Puzzle 3 Block 2 Location", + 0x0E03, 0x0FE0, + _CoOBlockPuzzle3Locations + }, + { + "Puzzle 3 Block 3 Location", + 0x0F1F, AREA_FLAG_NONE, + _CoOBlockPuzzle3Locations + } +}; + +struct AreaFlagIter { + std::span bitFlags; + std::span multibyteFlags; +}; + +inline std::map imguiAreaFlagLookup = +{ + { 0x00, AreaFlagIter{ eventAreaFlagsOrdon, {} } }, + { 0x01, AreaFlagIter{ eventAreaFlagsSewer, {} } }, + { 0x02, AreaFlagIter{ eventAreaFlagsFaron, {} } }, + { 0x03, AreaFlagIter{ eventAreaFlagsEldin, {} } }, + { 0x04, AreaFlagIter{ eventAreaFlagsLanayru, {} } }, + // 5 unused + { 0x06, AreaFlagIter{ eventAreaFlagsHyruleField, {} } }, + { 0x07, AreaFlagIter{ eventAreaFlagsSacredGrove, {} } }, + { 0x08, AreaFlagIter{ eventAreaFlagsSnowpeak, {} } }, + { 0x09, AreaFlagIter{ eventAreaFlagsCastleTown, {} } }, + { 0x0A, AreaFlagIter{ eventAreaFlagsGerudoDesert, {} } }, + { 0x0B, AreaFlagIter{ eventAreaFlagsFishingPond, {} } }, + // C-F unused + { 0x10, AreaFlagIter{ eventAreaFlagsFT, ForestTempleMultiByteFlags } }, + { 0x11, AreaFlagIter{ eventAreaFlagsGM, {} } }, + { 0x12, AreaFlagIter{ eventAreaFlagsLBT, {} } }, + { 0x13, AreaFlagIter{ eventAreaFlagsAG, {} } }, + { 0x14, AreaFlagIter{ eventAreaFlagsSPR, SPRMultiByteFlags } }, + { 0x15, AreaFlagIter{ eventAreaFlagsToT, {} } }, + { 0x16, AreaFlagIter{ eventAreaFlagsCitS, {} } }, + { 0x17, AreaFlagIter{ eventAreaFlagsPoT, {} } }, + { 0x18, AreaFlagIter{ eventAreaFlagsHC, {} } }, + { 0x19, AreaFlagIter{ eventAreaFlagsCoO, CoOMultiByteFlags } }, + { 0x1A, AreaFlagIter{ eventAreaFlagsLHLC, {} } }, + { 0x1B, AreaFlagIter{ eventAreaFlagsGrotto, {} } }, +}; + #endif // !DUSK_IMGUI_EVENTFLAGS_HPP \ No newline at end of file diff --git a/src/dusk/imgui/ImGuiHeapOverlay.cpp b/src/dusk/imgui/ImGuiHeapOverlay.cpp index 577db12fc1..a63ce4cfbe 100644 --- a/src/dusk/imgui/ImGuiHeapOverlay.cpp +++ b/src/dusk/imgui/ImGuiHeapOverlay.cpp @@ -180,9 +180,9 @@ namespace dusk { void ShowHeapDetailed(JKRHeap* heap, OpenHeapData& data, bool& open) { char title[128]; const char* name = data.Safe ? heap->getName() : "INVALID"; - snprintf(title, sizeof(title), "Heap %s##%p", heap->getName(), static_cast(heap)); + snprintf(title, sizeof(title), "Heap %s##%p", name, static_cast(heap)); - if (!ImGui::Begin(name, &open)) { + if (!ImGui::Begin(title, &open)) { ImGui::End(); return; } @@ -195,7 +195,7 @@ namespace dusk { heap->lock(); - ImGui::Text("Name: %s", heap->getName()); + ImGui::Text("Name: %s", name); const auto size = BytesToString(heap->getSize()); const auto freeSize = BytesToString(heap->getFreeSize()); ImGui::Text("Size: %08X (%s), free: %08X (%s)", heap->getSize(), size.c_str(), heap->getFreeSize(), freeSize.c_str()); diff --git a/src/dusk/imgui/ImGuiSaveEditor.cpp b/src/dusk/imgui/ImGuiSaveEditor.cpp index cc89d37275..016bdae7e5 100644 --- a/src/dusk/imgui/ImGuiSaveEditor.cpp +++ b/src/dusk/imgui/ImGuiSaveEditor.cpp @@ -13,6 +13,7 @@ #include "d/actor/d_a_player.h" #include +#include namespace dusk { enum ItemType { @@ -1295,8 +1296,33 @@ namespace dusk { membit.offDungeonItem(flag); } } + + static void genCommonAreaFlags(dSv_memBit_c& membit) { + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 10.0f); - void genMembitFlags(const char* id, dSv_memBit_c& membit) { + genDungeonItemCheckbox(membit, "Got Map", dSv_memBit_c::MAP); + ImGui::SameLine(230.0f); + genDungeonItemCheckbox(membit, "Got Compass", dSv_memBit_c::COMPASS); + + genDungeonItemCheckbox(membit, "Got Boss Key", dSv_memBit_c::BOSS_KEY); + ImGui::SameLine(230.0f); + genDungeonItemCheckbox(membit, "Saw Boss Demo", dSv_memBit_c::STAGE_BOSS_DEMO); + + genDungeonItemCheckbox(membit, "Got Heart Container", dSv_memBit_c::STAGE_LIFE); + ImGui::SameLine(230.0f); + genDungeonItemCheckbox(membit, "Defeated Boss", dSv_memBit_c::STAGE_BOSS_ENEMY); + + genDungeonItemCheckbox(membit, "Defeated Miniboss", dSv_memBit_c::STAGE_BOSS_ENEMY_2); + ImGui::SameLine(230.0f); + genDungeonItemCheckbox(membit, "Got Ooccoo", dSv_memBit_c::OOCCOO_NOTE); + + int keyTemp = membit.getKeyNum(); + if (ImGui::SliderInt("Keys", &keyTemp, 0, 5)) { + membit.setKeyNum(keyTemp); + } + } + + static void genMembitFlags(const char* id, dSv_memBit_c& membit) { ImGuiBeginGroupPanel("Chest", { 100, 100 }); for (int j = 0; j < 2; j++) { drawFlagList(fmt::format("##_tbox{}", j).c_str(), membit.mTbox[j]); @@ -1322,29 +1348,10 @@ namespace dusk { drawFlagList(fmt::format("##_item{}", j).c_str(), membit.mItem[j]); } ImGuiEndGroupPanel(); + ImVec2 post_item_custor = ImGui::GetCursorPos(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 10.0f); - - genDungeonItemCheckbox(membit, "Got Map", dSv_memBit_c::MAP); - ImGui::SameLine(230.0f); - genDungeonItemCheckbox(membit, "Got Compass", dSv_memBit_c::COMPASS); - - genDungeonItemCheckbox(membit, "Got Boss Key", dSv_memBit_c::BOSS_KEY); - ImGui::SameLine(230.0f); - genDungeonItemCheckbox(membit, "Saw Boss Demo", dSv_memBit_c::STAGE_BOSS_DEMO); - - genDungeonItemCheckbox(membit, "Got Heart Container", dSv_memBit_c::STAGE_LIFE); - ImGui::SameLine(230.0f); - genDungeonItemCheckbox(membit, "Defeated Boss", dSv_memBit_c::STAGE_BOSS_ENEMY); - - genDungeonItemCheckbox(membit, "Defeated Miniboss", dSv_memBit_c::STAGE_BOSS_ENEMY_2); - ImGui::SameLine(230.0f); - genDungeonItemCheckbox(membit, "Got Ooccoo", dSv_memBit_c::OOCCOO_NOTE); - - int keyTemp = membit.getKeyNum(); - if (ImGui::SliderInt("Keys", &keyTemp, 0, 5)) { - membit.setKeyNum(keyTemp); - } + ImGui::SetCursorPos({post_item_custor.x, post_switch_cursor.y}); + // genCommonAreaFlags(membit); } template @@ -1392,74 +1399,326 @@ namespace dusk { } } - void ImGuiSaveEditor::drawFlagsTab() { - if (ImGui::TreeNode("Current Region Flags")) { - dSv_memBit_c& membit = g_dComIfG_gameInfo.info.mMemory.mBit; - genMembitFlags("##TempSceneFlags", membit); + + static void genAreaFlagTable(uint8_t areaIndex, dSv_memBit_c& membit) { + constexpr auto makeMask = [](uint8_t size) -> uint16_t { return (1 << size) - 1; }; + constexpr auto getByteIndexFromFlag = [](uint16_t f) -> uint8_t { return f >> 8; }; + constexpr auto getBitMaskFromFlag = [](uint16_t f) -> uint8_t { return f & 0xff; }; + constexpr auto getValueSize = [getBitMaskFromFlag](uint16_t f) -> uint8_t { + return std::popcount(getBitMaskFromFlag(f)); + }; + + constexpr auto makeEventFlag = [](uint8_t byteIndex, uint8_t bitIndices) -> uint16_t { + return (byteIndex << 8) | bitIndices; + }; - stage_stag_info_class* pstag = dComIfGp_getStageStagInfo(); - if (pstag != nullptr) { - int stageNo = dStage_stagInfo_GetSaveTbl(pstag); - if (ImGui::Button("Save##SaveTempFlags")) { - dComIfGs_putSave(stageNo); + const auto eventFlagToAreaFlag = [&](uint16_t areaFlag) -> int { + auto byteInd = getByteIndexFromFlag(areaFlag); + constexpr size_t areaIndexSize = 5; + // if we're looking at 0x580, that would be byte 5, and check if 0x80 is set on that byte + // the event flags are structured differently than area flags + // B is byte index, b is the flag mask to check + // event flags are BBBBBBBB bbbbbbbb + // for area flags, they check bitIndex, not mask, i is index + // also area uses u32 index, not byte index + // area flags are BBBiiiii + // so we need to convert from bit mask to index + // also our byte index has to become a u32 index + + // dividing byte index by sizeof(u32) gets us the u32 index + // but in big endian, the first byte is the highest order byte of the u32 + // so we skip 24 bytes for the first byte, 16 for the second, etc + // essentially (3 - (x % 4)), reversing the modulus, 0=3, 1=2 + auto bitsToSkip = 8 * ((sizeof(u32) - 1) - (byteInd % sizeof(u32))); + return ((byteInd / sizeof(u32)) << areaIndexSize) | ((std::countr_zero(areaFlag) + bitsToSkip) & makeMask(areaIndexSize)); + }; + + constexpr uint8_t validTbox = sizeof(membit.mTbox); + constexpr uint8_t validSwitch = validTbox + sizeof(membit.mSwitch); + constexpr uint8_t validItem = validSwitch + sizeof(membit.mItem); + constexpr uint16_t tboxConvert = 0; + constexpr uint16_t switchConvert = sizeof(membit.mTbox) << 8; + constexpr uint16_t itemConvert = switchConvert + (sizeof(membit.mItem) << 8); + + const auto LoadFlag = [&](uint16_t flag) -> bool { + const auto byteIndex = getByteIndexFromFlag(flag); + + if (byteIndex < validTbox) { + return membit.isTbox(eventFlagToAreaFlag(flag - tboxConvert)); + } else if (byteIndex < validSwitch) { + return membit.isSwitch(eventFlagToAreaFlag(flag - switchConvert)); + } else if (byteIndex < validItem) { + return membit.isItem(eventFlagToAreaFlag(flag - itemConvert)); + } + return false; + }; + + const auto SetFlag = [&](uint16_t flag, bool set) -> void { + const auto byteIndex = getByteIndexFromFlag(flag); + if (set) { + if (byteIndex < validTbox) { + membit.onTbox(eventFlagToAreaFlag(flag - tboxConvert)); + } else if (byteIndex < validSwitch) { + membit.onSwitch(eventFlagToAreaFlag(flag - switchConvert)); + } else if (byteIndex < validItem) { + membit.onItem(eventFlagToAreaFlag(flag - itemConvert)); } - - ImGui::SameLine(); - - if (ImGui::Button("Load##LoadSaveFlags")) { - dComIfGs_getSave(stageNo); + } else { + if (byteIndex < validTbox) { + membit.offTbox(eventFlagToAreaFlag(flag - tboxConvert)); + } else if (byteIndex < validSwitch) { + membit.offSwitch(eventFlagToAreaFlag(flag - switchConvert)); + } else if (byteIndex < validItem) { + membit.offItem(eventFlagToAreaFlag(flag - itemConvert)); } } + }; + const auto LoadMultiByteFlag = [&](uint16_t flag) -> uint8_t { + const auto bitInds = getBitMaskFromFlag(flag); + const auto byteIndex = getByteIndexFromFlag(flag); + + const uint16_t startingMask = std::bit_floor(bitInds); + uint8_t val = 0; + for (uint16_t bitIndexMask = startingMask; (bitInds & bitIndexMask) != 0; + bitIndexMask >>= 1) + { + val <<= 1; + if (LoadFlag(makeEventFlag(byteIndex, bitInds & bitIndexMask))) { + val |= 1; + } + } + return val; + }; + + const auto SetMultiByteFlag = [&](uint16_t flag, uint8_t val) -> void { + const auto bitInds = getBitMaskFromFlag(flag); + const auto byteIndex = getByteIndexFromFlag(flag); + + const uint16_t startingMask = std::bit_floor(bitInds); + uint16_t valueMask = 1 << (getValueSize(flag) - 1); + + for (uint16_t bitIndexMask = startingMask; (bitInds & bitIndexMask) != 0; + bitIndexMask >>= 1, valueMask >>= 1) + { + SetFlag(makeEventFlag(byteIndex, bitInds & bitIndexMask), (val & valueMask) != 0); + } + }; + + const auto LoadSpreadMultiByte = [&](uint16_t high, uint16_t low) -> uint8_t { + if (low == AREA_FLAG_NONE) + return LoadMultiByteFlag(high); + return (LoadMultiByteFlag(high) << getValueSize(low)) | LoadMultiByteFlag(low); + }; + + const auto SetSpreadMultiByte = [&](uint16_t high, uint16_t low, uint8_t value) -> void { + if (low == AREA_FLAG_NONE) + return SetMultiByteFlag(high, value); + const auto lowerSize = getValueSize(low); + SetMultiByteFlag(high, value >> lowerSize); + SetMultiByteFlag(low, value & makeMask(lowerSize)); + }; + + auto iter = imguiAreaFlagLookup.find(areaIndex); + if (iter == imguiAreaFlagLookup.end()) return; + + auto& areaFlags = iter->second; + + static ImGuiTextFilter filter; + filter.Draw(); // Search bar + + ImVec2 flagTableSize = {700, 400}; + if (ImGui::BeginTable("Area Flags", 3, + ImGuiTableFlags_ScrollY | ImGuiTableFlags_ScrollX | + ImGuiTableFlags_Sortable, + flagTableSize)) + { + ImGui::TableSetupScrollFreeze(0, 1); + constexpr int COLUMN_FLAG = 0, COLUMN_BIT = 1, COLUMN_DESC = 2; + ImGui::TableSetupColumn("Flag"); + ImGui::TableSetupColumn("Byte:Bit"); + ImGui::TableSetupColumn("Description"); + ImGui::TableHeadersRow(); + + // if we're sorting by whether the flag is set or not, + // we want to re-sort whenever a flag updates, which means every frame cuz we don't + // know when it changes. otherwise only re-sort when the sort is dirty + if (auto* sort = ImGui::TableGetSortSpecs(); + sort != nullptr && sort->SpecsCount > 0 && + (sort->SpecsDirty || sort->Specs[0].ColumnIndex == COLUMN_FLAG)) + { + const auto column = sort->Specs[0].ColumnIndex; + const auto direction = sort->Specs[0].SortDirection; + + // if we're sorting by flags, do special sort, regular sort is bad for sorting + // bools it can swap values that are the same, and that causes constant + // reordering + if (column == COLUMN_FLAG) { + if (direction == ImGuiSortDirection_Ascending) { + sortByFlags(std::begin(areaFlags.bitFlags), std::end(areaFlags.bitFlags), + LoadFlag); + } else { + sortByFlags(std::rbegin(areaFlags.bitFlags), std::rend(areaFlags.bitFlags), + LoadFlag); + } + } else { + const auto cmp = [column](const EventAreaFlags& l, + const EventAreaFlags& r) -> bool { + switch (column) { + case COLUMN_DESC: + return l.description < r.description; + case COLUMN_BIT: + return l.flagID < r.flagID; + } + return false; + }; + + if (direction == ImGuiSortDirection_Ascending) { + std::sort(std::begin(areaFlags.bitFlags), std::end(areaFlags.bitFlags), + cmp); + } else { + std::sort(std::rbegin(areaFlags.bitFlags), std::rend(areaFlags.bitFlags), + cmp); + } + } + + sort->SpecsDirty = false; + } + + for (const auto& e : areaFlags.bitFlags) { + std::string formattedBitLocation = + fmt::format("{0:02X}:{1:02X}", e.byteIndex, e.bitIndex); + + if (!filter.PassFilter(e.description.c_str()) && + !filter.PassFilter(formattedBitLocation.c_str())) + { + continue; + } + + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + bool flag = LoadFlag(e.flagID); + if (ImGui::Checkbox(fmt::format("##_unused_area_flag_{}", e.flagID).c_str(), &flag)) { + SetFlag(e.flagID, flag); + } + + ImGui::TableNextColumn(); + ImGui::TextUnformatted(formattedBitLocation.c_str()); + ImGui::TableNextColumn(); + ImGui::TextUnformatted(e.description.c_str()); + } + ImGui::EndTable(); + } + + for (const auto& multiByteFlag : areaFlags.multibyteFlags) { + auto flagValue = LoadSpreadMultiByte(multiByteFlag.highOrderflag, multiByteFlag.lowOrderflag); + + const char* currentVal = "UNKNOWN"; + + auto enumValIter = multiByteFlag.enumValues.find(flagValue); + if (enumValIter != multiByteFlag.enumValues.end()) { + currentVal = enumValIter->second; + } + + if (ImGui::BeginCombo(multiByteFlag.name, currentVal)) { + for (const auto& [val, name] : multiByteFlag.enumValues) { + if (ImGui::Selectable(name)) { + SetSpreadMultiByte(multiByteFlag.highOrderflag, multiByteFlag.lowOrderflag, val); + } + } + ImGui::EndCombo(); + } + } + + genCommonAreaFlags(membit); + } + + static void drawCurrentRegionFlags() + { + dSv_memBit_c& membit = g_dComIfG_gameInfo.info.mMemory.mBit; + auto* stageData = dComIfGp_getStageStagInfo(); + if (!stageData) + return; + uint8_t stageIndex = dStage_stagInfo_GetSaveTbl(stageData); + + genAreaFlagTable(stageIndex, membit); + + if (ImGui::TreeNode("Flag Matrix")) { + genMembitFlags("##TempSceneFlags", membit); + ImGui::TreePop(); + } + + stage_stag_info_class* pstag = dComIfGp_getStageStagInfo(); + if (pstag != nullptr) { + int stageNo = dStage_stagInfo_GetSaveTbl(pstag); + if (ImGui::Button("Save##SaveTempFlags")) { + dComIfGs_putSave(stageNo); + } + + ImGui::SameLine(); + + if (ImGui::Button("Load##LoadSaveFlags")) { + dComIfGs_getSave(stageNo); + } + } + } + + void ImGuiSaveEditor::drawFlagsTab() { + if (ImGui::TreeNode("Current Region Flags")) { + drawCurrentRegionFlags(); ImGui::TreePop(); } if (ImGui::TreeNode("Region Saved Flags")) { - static std::array regionNames = { - "Ordon", - "Hyrule Sewers", - "Faron", - "Eldin", - "Lanayru", - "Reserved", - "Hyrule Field", - "Sacred Grove", - "Snowpeak", - "Castle Town", - "Gerudo Desert", - "Fishing Pond", - "Reserved", - "Reserved", - "Reserved", - "Reserved", - "Forest Temple", - "Goron Mines", - "Lakebed Temple", - "Arbiter's Grounds", - "Snowpeak Ruins", - "Temple of Time", - "City in the Sky", - "Palace of Twilight", - "Hyrule Castle", - "Caves", - "Grottos", + static const std::map regionNames = { + { 0x00, "Ordon" }, + { 0x01, "Hyrule Sewers" }, + { 0x02, "Faron" }, + { 0x03, "Eldin" }, + { 0x04, "Lanayru" }, + { 0x06, "Hyrule Field" }, + { 0x07, "Sacred Grove" }, + { 0x08, "Snowpeak" }, + { 0x09, "Castle Town" }, + { 0x0A, "Gerudo Desert" }, + { 0x0B, "Fishing Pond" }, + { 0x10, "Forest Temple" }, + { 0x11, "Goron Mines" }, + { 0x12, "Lakebed Temple" }, + { 0x13, "Arbiter's Grounds" }, + { 0x14, "Snowpeak Ruins" }, + { 0x15, "Temple of Time" }, + { 0x16, "City in the Sky" }, + { 0x17, "Palace of Twilight" }, + { 0x18, "Hyrule Castle" }, + { 0x19, "Caves" }, + { 0x1A, "Lake Hylia Long Cave"}, + { 0x1B, "Grottos" } }; - if (ImGui::BeginCombo("Region", regionNames[m_selectedRegion])) { - for (int i = 0; i < regionNames.size(); i++) { - if (strcmp(regionNames[i], "Reserved") == 0) continue; + if (m_selectedRegion.name == nullptr) + { + const auto& firstRegion = *regionNames.find(0); + m_selectedRegion = { firstRegion.first, firstRegion.second }; + } - if (ImGui::Selectable(regionNames[i])) { - m_selectedRegion = i; + if (ImGui::BeginCombo("Region", m_selectedRegion.name)) { + for (const auto& [id, name] : regionNames) { + if (ImGui::Selectable(name)) { + m_selectedRegion = {id, name}; } } - ImGui::EndCombo(); } - dSv_memBit_c* membit = &dComIfGs_getSaveData()->mSave[m_selectedRegion].mBit; - if (membit != nullptr) { - genMembitFlags("##SaveSceneFlags", *membit); + dSv_memBit_c& membit = dComIfGs_getSaveData()->mSave[m_selectedRegion.id].mBit; + + genAreaFlagTable(m_selectedRegion.id, membit); + + if (ImGui::TreeNode("Flag Matrix")) { + genMembitFlags("##SaveSceneFlags", membit); + + ImGui::TreePop(); } ImGui::TreePop(); @@ -1530,7 +1789,9 @@ namespace dusk { } for (const auto& e : duskImguiEventFlags) { - if (!filter.PassFilter((e.location + "\n" + e.description + "\n" + e.flagName).c_str())) + if (!filter.PassFilter(e.location.c_str()) && + !filter.PassFilter(e.description.c_str()) && + !filter.PassFilter(e.flagName.c_str())) { continue; } diff --git a/src/dusk/imgui/ImGuiSaveEditor.hpp b/src/dusk/imgui/ImGuiSaveEditor.hpp index dc7c122079..a18262862f 100644 --- a/src/dusk/imgui/ImGuiSaveEditor.hpp +++ b/src/dusk/imgui/ImGuiSaveEditor.hpp @@ -21,7 +21,10 @@ namespace dusk { void drawConfigTab(); private: - int m_selectedRegion = 0; + struct { + uint8_t id; + const char* name; + } m_selectedRegion = {0, nullptr}; }; } diff --git a/src/m_Do/m_Do_graphic.cpp b/src/m_Do/m_Do_graphic.cpp index 425d1e25fe..9bd6e5e327 100644 --- a/src/m_Do/m_Do_graphic.cpp +++ b/src/m_Do/m_Do_graphic.cpp @@ -2146,6 +2146,7 @@ int mDoGph_Painter() { // FRAME INTERP NOTE: Call setViewMtx earlier so that it's interpolated in time for draw_info to use it j3dSys.setViewMtx(camera_p->view.viewMtx); JPADrawInfo draw_info(j3dSys.getViewMtx(), camera_p->view.fovy, camera_p->view.aspect); + mDoGph_gInf_c::setWideZoomLightProjection(draw_info.mPrjMtx); #else JPADrawInfo draw_info(camera_p->view.viewMtx, camera_p->view.fovy, camera_p->view.aspect); #endif diff --git a/src/m_Do/m_Do_machine.cpp b/src/m_Do/m_Do_machine.cpp index 6b186a77e6..240484380c 100644 --- a/src/m_Do/m_Do_machine.cpp +++ b/src/m_Do/m_Do_machine.cpp @@ -999,6 +999,7 @@ int mDoMch_Create() { JKRDvdRipper::setSZSBufferSize(0x4000); #if TARGET_PC JKRHeap* dvdHeap = JKRCreateExpHeap(0x10000, NULL, false); + JKRHEAP_NAME(dvdHeap, "dvdHeap"); assert(dvdHeap != NULL); JKRDvdRipper::setHeap(dvdHeap); #endif