diff --git a/include/d/d_map.h b/include/d/d_map.h index 0c91de6c3..516a10724 100644 --- a/include/d/d_map.h +++ b/include/d/d_map.h @@ -3,6 +3,7 @@ #include "d/d_drawlist.h" #include "JSystem/JUtility/JUTAssert.h" +#include "d/d_stage.h" struct ResTIMG; struct dmap_dmap_tlut_s; @@ -329,6 +330,17 @@ public: void setFloorTextureOne(u8); void init(s16, s16, s16, s16, s16, s16, s16, s16, s16, u8, u8, u8, u8, u8); virtual void draw(); + +public: + /* 0x004 */ u8 field_0x4[0x2A4 - 0x4]; + /* 0x2A4 */ JKRArchive* field_0x2A4; + /* 0x2A8 */ u8 field_0x2A8[0x35C - 0x2A8]; + /* 0x35C */ s16 field_0x35C; + /* 0x35E */ s16 field_0x35E; + /* 0x360 */ u8 field_0x360[0x364 - 0x360]; + /* 0x364 */ s16 field_0x364; + /* 0x366 */ s16 field_0x366; + /* 0x368 */ u8 field_0x368[0x368 + 0x2B8 - 0x368]; }; enum { @@ -515,6 +527,10 @@ public: static dMap_RoomInfo_c* mNowRoomInfoP; }; +BOOL dMap_GetTopBottomFloorNo(dStage_dt_c* stag, u8* bottom_p, u8* top_p); +u8 dMap_GetFloorNoForDmap(dStage_dt_c* stag, int param_2, f32 param_3); +u8 dMap_GetFloorNo(dStage_dt_c*, f32); + inline void dMap_drawPoint(u8 param_1, f32 param_2, f32 param_3, f32 param_4, s8 param_5, s16 param_6, u8 param_7, u8 param_8, u8 param_9) { dMap_c::drawPointSingle(param_1, param_2, param_3, param_4, param_5, param_6, param_7, param_8, param_9); } diff --git a/include/d/d_menu_dmap.h b/include/d/d_menu_dmap.h index 9dd12c4c5..aca30cfec 100644 --- a/include/d/d_menu_dmap.h +++ b/include/d/d_menu_dmap.h @@ -65,7 +65,7 @@ public: void itemScale(); void floorInit(); void mapMove(); - void mapOffsetY(); + f32 mapOffsetY(); void itemnameMove(); void dnameSet(); void itemnameSet(); @@ -145,36 +145,36 @@ public: /* 0x1DB0 */ char* mTxtNote[2]; /* 0x1DB8 */ char* mTxtDummy[2]; /* 0x1DC0 */ char field_0x1DC0[0x1DCC - 0x1DC0]; - /* 0x1DCC */ f32 field_0x1DCC[4]; - /* 0x1DDC */ f32 field_0x1DDC[4]; - /* 0x1DEC */ f32 field_0x1DEC[4]; - /* 0x1DFC */ f32 field_0x1DFC[4]; + /* 0x1DCC */ f32 mCarOfsX[4]; + /* 0x1DDC */ f32 mCarOfsY[4]; + /* 0x1DEC */ f32 mCarFloorOfsX[4]; + /* 0x1DFC */ f32 mCarFloorOfsY[4]; /* 0x1E0C */ s16 field_0x1E0C; - /* 0x1E0E */ s16 field_0x1E0E; - /* 0x1E10 */ s16 field_0x1E10; - /* 0x1E12 */ s16 field_0x1E12; - /* 0x1E14 */ s16 field_0x1E14; - /* 0x1E16 */ u16 field_0x1E16; - /* 0x1E18 */ s16 field_0x1E18; - /* 0x1E1A */ s16 field_0x1E1A; - /* 0x1E1C */ s16 field_0x1E1C; - /* 0x1E1E */ u16 field_0x1E1E; - /* 0x1E20 */ s16 field_0x1E20; - /* 0x1E22 */ s16 field_0x1E22; - /* 0x1E24 */ s16 field_0x1E24; - /* 0x1E26 */ s16 field_0x1E26; - /* 0x1E28 */ s16 field_0x1E28; - /* 0x1E2A */ s16 field_0x1E2A; - /* 0x1E2C */ s16 field_0x1E2C; - /* 0x1E2E */ u8 field_0x1E2E; + /* 0x1E0E */ s16 mMapDrawOffsetY; + /* 0x1E10 */ s16 mCurFloorMapY; + /* 0x1E12 */ s16 mFloorListOffsetY; + /* 0x1E14 */ s16 mBossFloorListOffsetY; + /* 0x1E16 */ s16 mMpmkPosX; + /* 0x1E18 */ s16 mMpmkPosY; + /* 0x1E1A */ s16 mMpmkSizeX; + /* 0x1E1C */ s16 mMpmkSizeY; + /* 0x1E1E */ s16 mMpp1PosX; + /* 0x1E20 */ s16 mMpp1PosY; + /* 0x1E22 */ s16 mMpp1SizeX; + /* 0x1E24 */ s16 mMpp1SizeY; + /* 0x1E26 */ s16 mMppGapY; + /* 0x1E28 */ s16 mLnkTimer2; + /* 0x1E2A */ s16 mLnkTimer1; + /* 0x1E2C */ s16 mBossEyeTimer; + /* 0x1E2E */ u8 mSelectItem; /* 0x1E2F */ u8 mCurFloor; /* 0x1E30 */ u8 mBossFloor; /* 0x1E31 */ u8 mTopFloor; /* 0x1E32 */ u8 mBottomFloor; - /* 0x1E33 */ u8 field_0x1E33; - /* 0x1E34 */ bool field_0x1E34; + /* 0x1E33 */ bool mLnkTexFlip2; + /* 0x1E34 */ bool mLnkTexFlip1; /* 0x1E35 */ bool field_0x1E35; - /* 0x1E36 */ u8 field_0x1E36; + /* 0x1E36 */ u8 mBossEyeState; /* 0x1E37 */ u8 pad; }; // Size: 0x1E38 diff --git a/include/d/d_stage.h b/include/d/d_stage.h index dfda316ec..cd55e37fb 100644 --- a/include/d/d_stage.h +++ b/include/d/d_stage.h @@ -999,6 +999,9 @@ struct FuncTable { dStage_Func function; }; + +dStage_KeepDoorInfo * dStage_GetKeepDoorInfo(); + s8 dStage_roomRead_dt_c_GetReverbStage(roomRead_class&, int); int dStage_mapInfo_GetOceanZ(stage_map_info_class*); int dStage_mapInfo_GetOceanX(stage_map_info_class*); diff --git a/src/d/d_map.cpp b/src/d/d_map.cpp index 53b045788..13faef716 100644 --- a/src/d/d_map.cpp +++ b/src/d/d_map.cpp @@ -292,7 +292,7 @@ dStage_FloorInfo_dt_c* dMap_GetFloorInfoDtPFromFloorNo(dStage_FloorInfo_c* floor } /* 80045AEC-80045C24 .text dMap_GetFloorNoForDmap__FP11dStage_dt_cif */ -int dMap_GetFloorNoForDmap(dStage_dt_c* stag, int param_2, f32 param_3) { +u8 dMap_GetFloorNoForDmap(dStage_dt_c* stag, int param_2, f32 param_3) { dStage_FloorInfo_c* floor = stag->getFloorInfo(); int floorNo = Floor_1F; dStage_FloorInfo_dt_c* floorData = dMap_GetFloorInfoDtP(floor, param_3); diff --git a/src/d/d_menu_dmap.cpp b/src/d/d_menu_dmap.cpp index fa02dce43..a788c4351 100644 --- a/src/d/d_menu_dmap.cpp +++ b/src/d/d_menu_dmap.cpp @@ -4,6 +4,7 @@ // #include "d/dolzel.h" // IWYU pragma: keep +#include "d/d_map.h" #include "d/d_menu_dmap.h" #include "d/d_stage.h" #include "f_op/f_op_msg_mng.h" @@ -258,20 +259,20 @@ void dMenu_Dmap_c::screenSet() { mMskPane.mInitAlpha = 0x82; mMsk0Pane.mInitAlpha = 0x82; - field_0x1E16 = mpmk.mPosCenterOrig.x; - field_0x1E18 = mpmk.mPosCenterOrig.y; - field_0x1E1A = mpmk.mSizeOrig.x; - field_0x1E1C = mpmk.mSizeOrig.y; - field_0x1E1E = mpp1pane.mPosCenterOrig.x; - field_0x1E20 = mpp1pane.mPosCenterOrig.y; - field_0x1E22 = mpp1pane.mSizeOrig.x; - field_0x1E24 = mpp1pane.mSizeOrig.y; + mMpmkPosX = mpmk.mPosCenterOrig.x; + mMpmkPosY = mpmk.mPosCenterOrig.y; + mMpmkSizeX = mpmk.mSizeOrig.x; + mMpmkSizeY = mpmk.mSizeOrig.y; + mMpp1PosX = mpp1pane.mPosCenterOrig.x; + mMpp1PosY = mpp1pane.mPosCenterOrig.y; + mMpp1SizeX = mpp1pane.mSizeOrig.x; + mMpp1SizeY = mpp1pane.mSizeOrig.y; J2DPane* p2 = scrn->search('mpp2'); f32 h = p2->getHeight(); p2 = scrn->search('mpp2'); J2DPane* p1 = scrn->search('mpp1'); - field_0x1E26 = p1->mBounds.i.y - (p2->mBounds.i.y + h); + mMppGapY = p1->mBounds.i.y - (p2->mBounds.i.y + h); } /* 801A92D4-801A9364 .text dMap_isBossDoor__FP21stage_tgsc_data_class */ @@ -291,7 +292,109 @@ BOOL dMap_isBossDoor(stage_tgsc_data_class* i_stage) { /* 801A9364-801A98EC .text initialize__12dMenu_Dmap_cFv */ void dMenu_Dmap_c::initialize() { - /* Nonmatching */ + f32 yPos = dComIfGp_getPlayer(0)->current.pos.y; + mNm00Pane.mUserArea = 0; + mCurFloor = dMap_GetFloorNo(&dComIfGp_getStage(), yPos + mapOffsetY()); + mBossFloor = 0xFF; + + dStage_KeepDoorInfo* doorInfo = dStage_GetKeepDoorInfo(); + stage_tgsc_data_class* tgsc = doorInfo->mDrTgData; + for (int i = 0; i < doorInfo->num; tgsc++, i++) { + if (dMap_isBossDoor(tgsc)) { + mBossFloor = dMap_GetFloorNo(&dComIfGp_getStage(), tgsc->base.position.y); + } + } + + dMap_GetTopBottomFloorNo(&dComIfGp_getStage(), &mTopFloor, &mBottomFloor); + int stayNo = dComIfGp_roomControl_getStayNo(); + u8 floorNo = dMap_GetFloorNoForDmap(&dComIfGp_getStage(), stayNo, yPos + mapOffsetY()); + dmap_c->init(mMpmkPosX, mMpmkPosY, mMpmkSizeX, mMpmkSizeY, + mMpp1PosX, mMpp1PosY, mMpp1SizeX, mMpp1SizeY, mMppGapY, + mTopFloor, mBottomFloor, stayNo, floorNo, 0xFF); + mCurFloorMapY = mMpp1PosY + (mCurFloor - 0x80) * (mMpp1SizeY + mMppGapY); + mMapDrawOffsetY = 0x1E0; + mFloorListOffsetY = (mFbPanes[0].mPosCenterOrig.y - mFbPanes[1].mPosCenterOrig.y) * (mBottomFloor - mCurFloor); + if (mBossFloor != 0xFF) { + mBossFloorListOffsetY = (mFbPanes[0].mPosCenterOrig.y - mFbPanes[1].mPosCenterOrig.y) * (mBottomFloor - mBossFloor); + } else { + mBossFloorListOffsetY = 0; + } + + s16 y = mMpmkPosY + mMapDrawOffsetY; + dMap_Dmap_c* dmap = dmap_c; + dmap->field_0x35C = mMpmkPosX; + dmap->field_0x35E = y; + + y = mCurFloorMapY + mMapDrawOffsetY; + dmap = dmap_c; + dmap->field_0x364 = mMpp1PosX; + dmap->field_0x366 = y; + + for (int i = 0; i < (mTopFloor - mBottomFloor + 1); i++) { + J2DPane* pane = mFlPanes[i].pane; + changeFloorTexture(pane, mBottomFloor - 0x76 + i); + } + + mLnkTimer2 = cM_rndF(100.0f) + 100.0f; + mLnkTimer1 = cM_rndF(50.0f) + 100.0f; + mLnkTexFlip2 = false; + mLnkTexFlip1 = false; + mLnkPanes[1].mUserArea = 0; + mLnkPanes[2].mUserArea = 0; + mBossPane.mUserArea = 100; + mBos2Pane.mUserArea = cM_rndF(200.0f) + 300.0f; + mBossEyeState = 0; + mBossEyeTimer = ((int)(cM_rndF(18.0f) + 40.0f)) << 1; + + f32 scale = 0.5f; + mCarOfsX[0] = -(mItPanes[0].mSizeOrig.x) * scale; + mCarOfsY[0] = (mItPanes[0].mSizeOrig.y) * scale; + mCarOfsX[1] = (mItPanes[0].mSizeOrig.x) * scale; + mCarOfsY[1] = (mItPanes[0].mSizeOrig.y) * scale; + mCarOfsX[2] = -(mItPanes[0].mSizeOrig.x) * scale; + mCarOfsY[2] = -(mItPanes[0].mSizeOrig.y) * scale; + mCarOfsX[3] = (mItPanes[0].mSizeOrig.x) * scale; + mCarOfsY[3] = -(mItPanes[0].mSizeOrig.y) * scale; + + mCarFloorOfsX[0] = -(mFbPanes[0].mSizeOrig.x) * scale; + mCarFloorOfsY[0] = (mFbPanes[0].mSizeOrig.y) * scale; + mCarFloorOfsX[1] = (mFbPanes[0].mSizeOrig.x) * scale; + mCarFloorOfsY[1] = (mFbPanes[0].mSizeOrig.y) * scale; + mCarFloorOfsX[2] = -(mFbPanes[0].mSizeOrig.x) * scale; + mCarFloorOfsY[2] = -(mFbPanes[0].mSizeOrig.y) * scale; + mCarFloorOfsX[3] = (mFbPanes[0].mSizeOrig.x) * scale; + mCarFloorOfsY[3] = -(mFbPanes[0].mSizeOrig.y) * scale; + + floorInit(); + itemScale(); + if (!dComIfGs_isDungeonItemMap()) { + mItPanes[0].pane->hide(); + mIkPanes[0].pane->hide(); + mIpPanes[0].pane->hide(); + } + if (!dComIfGs_isDungeonItemBossKey()) { + mItPanes[1].pane->hide(); + mIkPanes[1].pane->hide(); + mIpPanes[1].pane->hide(); + } + if (!dComIfGs_isDungeonItemCompass()) { + mItPanes[2].pane->hide(); + mIkPanes[2].pane->hide(); + mIpPanes[2].pane->hide(); + } + if (!dComIfGs_isDungeonItemCompass() || mBossFloor == 0xFF) { + mBossPane.pane->hide(); + } + noteInit(); + if ((mSelectItem == 0 && dComIfGs_isDungeonItemMap()) || + (mSelectItem == 1 && dComIfGs_isDungeonItemBossKey()) || + (mSelectItem == 2 && dComIfGs_isDungeonItemCompass()) + ) { + dComIfGp_setDoStatusForce(dActStts_INFO_e); + } else { + dComIfGp_setDoStatusForce(dActStts_BLANK_e); + dComIfGp_setDoStatus(dActStts_BLANK_e); + } } /* 801A98EC-801AAE10 .text treasureSet__12dMenu_Dmap_cFv */ @@ -375,8 +478,9 @@ void dMenu_Dmap_c::mapMove() { } /* 801AD000-801AD130 .text mapOffsetY__12dMenu_Dmap_cFv */ -void dMenu_Dmap_c::mapOffsetY() { +f32 dMenu_Dmap_c::mapOffsetY() { /* Nonmatching */ + return 0.0f; } /* 801AD130-801AD1A8 .text itemnameMove__12dMenu_Dmap_cFv */