diff --git a/include/d/d_s_open.h b/include/d/d_s_open.h index 0539cf6c5..b0799c2e1 100644 --- a/include/d/d_s_open.h +++ b/include/d/d_s_open.h @@ -5,7 +5,7 @@ #include "f_op/f_op_scene.h" class J2DScreen; - +class J2DTextBox; class dScnOpen_message_c { public: @@ -26,7 +26,18 @@ public: /* 0x004 */ JKRExpHeap* exp_heap; /* 0x008 */ dScnOpen_message_c* m_message; /* 0x00C */ J2DScreen* m_Screen; - /* 0x010 */ u8 pad[0x2a0]; + /* 0x010 */ J2DPane* d1; + /* 0x014 */ J2DPane* d2; + /* 0x018 */ J2DPane* d3; + /* 0x01C */ J2DPane* d4; + /* 0x020 */ J2DPane* d42; + /* 0x024 */ J2DPane* d5; + /* 0x028 */ J2DPane* d6; + /* 0x02C */ J2DPane* mak1; + /* 0x030 */ J2DPane* mak2; + /* 0x034 */ J2DTextBox* tx1; + /* 0x038 */ J2DTextBox* tx2; + /* 0x03C */ u8 pad[0x2B0 - 0x03C]; /* 0x2B0 */ s32 field_0x2b0; /* 0x010 */ u8 pad2[0x014]; }; diff --git a/include/d/d_salvage.h b/include/d/d_salvage.h index e630c35c7..a68d722f1 100644 --- a/include/d/d_salvage.h +++ b/include/d/d_salvage.h @@ -6,6 +6,26 @@ class JPABaseEmitter; class fopAc_ac_c; +struct dSalvage_info_c { + /* 0x00 */ cXyz mPos; + /* 0x0C */ cXyz mScale; + /* 0x18 */ f32 mR; + /* 0x1C */ f32 mH; + /* 0x20 */ s32 mSwitchNo; + /* 0x24 */ JPABaseEmitter* mEmtr; + /* 0x28 */ f32 mDistance; + /* 0x2C */ s8 mRoomNo; + /* 0x2D */ u8 mSaveNo; + /* 0x2E */ u8 mType; + /* 0x2F */ u8 mKind; + /* 0x30 */ u8 mItemNo; + /* 0x31 */ u8 mFlag; + /* 0x32 */ u8 field_0x32; + /* 0x33 */ u8 mNowAlpha; + /* 0x34 */ u8 mDrawMode; + /* 0x35 */ u8 field_0x35; +}; + class dSalvage_control_c { public: void init(); @@ -15,27 +35,38 @@ public: void init_one(int); void init_one_sub(int); void calcDistanceXZ(); - void getPos(int); - void getPosP(int); - void getScale(int); - void getR(int); - void getH(int); - void getRoomNo(int); - void getItemNo(int); - void getSwitchNo(int); - void getSaveNo(int); - void getType(int); - void getKind(int); - void getDistance(int); - void getAlphaPtr(int); - void getDrawMode(int); - void checkRegist(int); - void checkUsed(int); + cXyz getPos(int); + cXyz* getPosP(int); + cXyz getScale(int); + f32 getR(int); + f32 getH(int); + u8 getRoomNo(int); + u8 getItemNo(int); + s32 getSwitchNo(int); + u8 getSaveNo(int); + u8 getType(int); + u8 getKind(int); + f32 getDistance(int); + u8* getAlphaPtr(int); + u8 getDrawMode(int); + BOOL checkRegist(int); + bool checkUsed(int); void setPos(int, cXyz); void setFlag(int, u8); void clrFlag(int, u8); void setNowAlpha(int, u8); void setDrawMode(int, int); + +public: + enum { + MAX_SEA = 128, + MAX_ROOM = 32, + MAX_TOTAL = MAX_ROOM + MAX_SEA, + }; + + /* 0x00 */ u8 mSeaNum; + /* 0x01 */ u8 mRoomNum; + /* 0x04 */ dSalvage_info_c mInfo[MAX_TOTAL]; }; #endif /* D_SALVAGE_H */ diff --git a/src/d/d_s_open_sub.cpp b/src/d/d_s_open_sub.cpp index 8898ff36a..5a1bf5917 100644 --- a/src/d/d_s_open_sub.cpp +++ b/src/d/d_s_open_sub.cpp @@ -4,7 +4,12 @@ // #include "d/d_s_open.h" -#include "dolphin/types.h" +#include "d/d_com_inf_game.h" +#include "f_op/f_op_msg_mng.h" +#include "JSystem/J2DGraph/J2DScreen.h" +#include "JSystem/J2DGraph/J2DTextBox.h" +#include "JSystem/JKernel/JKRExpHeap.h" +#include "JSystem/JUtility/JUTAssert.h" /* 80232EFC-8023334C .text set_message__18dScnOpen_message_cFUli */ void dScnOpen_message_c::set_message(u32, int) { @@ -29,6 +34,28 @@ dScnOpen_message_c::~dScnOpen_message_c() { /* 80233698-80233B0C .text __ct__15dScnOpen_proc_cFv */ dScnOpen_proc_c::dScnOpen_proc_c() { /* Nonmatching */ + exp_heap = fopMsgM_createExpHeap(0x20000); + JUT_ASSERT(0xe2, exp_heap != 0); + JKRHeap* oldHeap = mDoExt_setCurrentHeap(exp_heap); + m_Screen = new J2DScreen(); + JUT_ASSERT(0xe7, m_Screen != 0); + m_message = new dScnOpen_message_c(exp_heap); + JUT_ASSERT(0xe9, m_message != 0); + dRes_info_c* resInfo = dComIfG_getObjectResInfo("Opening"); + JUT_ASSERT(0xeb, resInfo != 0); + m_Screen->set("Opening.blo", resInfo->getArchive()); + d1 = m_Screen->search('\0\0d1'); + d2 = m_Screen->search('\0\0d2'); + d3 = m_Screen->search('\0\0d3'); + d4 = m_Screen->search('\0\0d4'); + d42 = m_Screen->search('\0d42'); + d5 = m_Screen->search('\0\0d5'); + d6 = m_Screen->search('\0\0d6'); + mak1 = m_Screen->search('mak1'); + mak2 = m_Screen->search('mak2'); + tx1 = (J2DTextBox*)m_Screen->search('\0tx1'); + tx2 = (J2DTextBox*)m_Screen->search('\0tx2'); + tx1->move(tx1->mBounds.i.x, 376.0f); } /* 80233B0C-80233BE4 .text __dt__15dScnOpen_proc_cFv */ @@ -48,5 +75,5 @@ void dScnOpen_proc_c::proc_draw() { /* 80234550-80234570 .text draw__15dScnOpen_proc_cFv */ void dScnOpen_proc_c::draw() { - /* Nonmatching */ + proc_draw(); } diff --git a/src/d/d_salvage.cpp b/src/d/d_salvage.cpp index 6795e7471..a0d711609 100644 --- a/src/d/d_salvage.cpp +++ b/src/d/d_salvage.cpp @@ -4,143 +4,291 @@ // #include "d/d_salvage.h" +#include "d/d_com_inf_game.h" +#include "d/actor/d_a_salvage.h" + +// maybe belongs in d_a_salvage.h? +namespace daSalvage_prm { + // 0011c008 000010 80121748 4 getKindCmapNo__13daSalvage_prmFP10fopAc_ac_c d_salvage.o + // 0011c058 00000c 80121798 4 getSwitchNo__13daSalvage_prmFP10fopAc_ac_c d_salvage.o + // 0011c064 000030 801217a4 4 getRoomNo__13daSalvage_prmFP10fopAc_ac_c d_salvage.o + // 0011c094 000030 801217d4 4 getSvNo__13daSalvage_prmFP10fopAc_ac_c d_salvage.o + // 0011c0c4 000030 80121804 4 getType__13daSalvage_prmFP10fopAc_ac_c d_salvage.o + // 0011c0f4 000030 80121834 4 getItemNo__13daSalvage_prmFP10fopAc_ac_c d_salvage.o + // 0011c124 000030 80121864 4 getKind__13daSalvage_prmFP10fopAc_ac_c d_salvage.o + + inline u8 getKindCmapNo(fopAc_ac_c* pact) { return pact->home.angle.z & 0x03; } + inline s32 getSwitchNo(fopAc_ac_c* pact) { return pact->home.angle.z & 0xFF; } + inline u8 getRoomNo(fopAc_ac_c* pact) { return fopAcM_GetParam(pact) >> 12; } + inline u8 getSvNo(fopAc_ac_c* pact) { return fopAcM_GetParam(pact) >> 20; } + inline u8 getType(fopAc_ac_c* pact) { return fopAcM_GetParam(pact) & 0x0F; } + inline u8 getItemNo(fopAc_ac_c* pact) { return fopAcM_GetParam(pact) >> 4; } + inline u8 getKind(fopAc_ac_c* pact) { return fopAcM_GetParam(pact) >> 28; } +}; /* 800CC734-800CC76C .text init__18dSalvage_control_cFv */ void dSalvage_control_c::init() { - /* Nonmatching */ + for (s32 i = 0; i < (s32)ARRAY_SIZE(mInfo); i++) { + mInfo[i].mRoomNo = -1; + mInfo[i].mEmtr = NULL; + } + mSeaNum = 0; + mRoomNum = 0; } /* 800CC76C-800CC7C4 .text init_end__18dSalvage_control_cFv */ void dSalvage_control_c::init_end() { - /* Nonmatching */ + for (s32 i = 0; i < (s32)ARRAY_SIZE(mInfo); i++) + init_one_sub(i); + mSeaNum = 0; + mRoomNum = 0; } /* 800CC7C4-800CCB70 .text entry__18dSalvage_control_cFP10fopAc_ac_cP14JPABaseEmitter */ -void dSalvage_control_c::entry(fopAc_ac_c*, JPABaseEmitter*) { +void dSalvage_control_c::entry(fopAc_ac_c* pact, JPABaseEmitter* emtr) { /* Nonmatching */ + JUT_ASSERT(0x8b, pact != 0); + s8 roomNo = fopAcM_GetRoomNo(pact); + u8 kind = daSalvage_prm::getKind(pact); + u8 itemNo = daSalvage_prm::getItemNo(pact); + u8 type = daSalvage_prm::getType(pact); + u8 saveNo = daSalvage_prm::getSvNo(pact); + s8 cmapNo = daSalvage_prm::getRoomNo(pact); + s32 switchNo = daSalvage_prm::getSwitchNo(pact); + s32 no; + + bool invalid = false; + if (roomNo != 0) { + no = mRoomNum + MAX_SEA; + cmapNo = roomNo; + if (mRoomNum > MAX_ROOM) + invalid = true; + } else { + no = mSeaNum; + if (mSeaNum > MAX_SEA) + invalid = true; + } + + if (cmapNo <= 0 || cmapNo > 64) + invalid = true; + + if (kind == 2 || kind == 3) { + if (saveNo > 15) + invalid = true; + } else if (kind == 0) { + if (saveNo <= 0 || saveNo > 128) + invalid = true; + } + if (kind == 2 && switchNo == 0xFF) + invalid = true; + + if (invalid) + return; + + mInfo[no].mFlag = 0; + mInfo[no].mFlag &= ~1; + switch (kind) { + case 0: + if (dComIfGs_isCompleteCollectMap(cmapNo)) + return; + if (daSalvage_prm::getKindCmapNo(pact) != dComIfGs_getRandomSalvagePoint()) + return; + mInfo[no].mFlag |= 1; + break; + case 2: + if (!fopAcM_isSwitch(pact, switchNo)) + mInfo[no].mFlag |= 1; + case 3: + if (cmapNo != 31 && dComIfGs_isOceanSvBit(cmapNo, saveNo)) + return; + break; + case 4: + if (cmapNo != 31 && dComIfGs_isOceanSvBit(cmapNo, saveNo)) + return; + if (!dKy_daynight_check()) + mInfo[no].mFlag |= 1; + break; + case 6: + if (dKy_moon_type_chk() || dComIfGs_isEventBit(daSalvage_c::m_savelabel[saveNo])) + mInfo[no].mFlag |= 1; + break; + } + + mInfo[no].mRoomNo = roomNo; + mInfo[no].mPos = pact->current.pos; + mInfo[no].mScale = pact->mScale; + mInfo[no].mSaveNo = saveNo; + mInfo[no].mType = type; + mInfo[no].mKind = kind; + mInfo[no].mItemNo = itemNo; + mInfo[no].mSwitchNo = switchNo; + mInfo[no].mEmtr = emtr; + + switch (kind) { + case 0: + mInfo[no].mH = pact->mScale.y * 1000.0f; + mInfo[no].mR = pact->mScale.x * 500.0f; + break; + case 5: + mInfo[no].mH = pact->mScale.y * 1000.0f; + mInfo[no].mR = pact->mScale.x * 700.0f; + break; + default: + mInfo[no].mH = pact->mScale.y * 500.0f; + mInfo[no].mR = pact->mScale.x * 400.0f; + break; + } + + if (roomNo != 0) + mRoomNum++; + else + mSeaNum++; } /* 800CCB70-800CCBC4 .text init_room__18dSalvage_control_cFSc */ -void dSalvage_control_c::init_room(s8) { - /* Nonmatching */ +void dSalvage_control_c::init_room(s8 roomNo) { + for (s32 i = MAX_SEA; i < (s32)ARRAY_SIZE(mInfo); i++) + init_one_sub(i); + mRoomNum = 0; } /* 800CCBC4-800CCC20 .text init_one__18dSalvage_control_cFi */ -void dSalvage_control_c::init_one(int) { - /* Nonmatching */ +void dSalvage_control_c::init_one(int no) { + init_one_sub(no); + if (no < MAX_SEA) + mSeaNum--; + else + mRoomNum--; } /* 800CCC20-800CCCA8 .text init_one_sub__18dSalvage_control_cFi */ -void dSalvage_control_c::init_one_sub(int) { - /* Nonmatching */ +void dSalvage_control_c::init_one_sub(int no) { + JPABaseEmitter* emtr = mInfo[no].mEmtr; + if (emtr != NULL) + emtr->becomeInvalidEmitter(); + mInfo[no].mRoomNo = -1; + mInfo[no].mPos = cXyz::Zero; + mInfo[no].mScale = cXyz::Zero; + mInfo[no].mSaveNo = 0; + mInfo[no].mType = 0; + mInfo[no].mItemNo = 0; + mInfo[no].mSwitchNo = 0; + mInfo[no].mEmtr = NULL; + mInfo[no].mFlag = 0; } /* 800CCCA8-800CCDAC .text calcDistanceXZ__18dSalvage_control_cFv */ void dSalvage_control_c::calcDistanceXZ() { - /* Nonmatching */ + fopAc_ac_c* player = dComIfGp_getPlayer(0); + for (s32 i = 0; i < (s32)ARRAY_SIZE(mInfo); i++) { + if (!checkRegist(i)) + continue; + + mInfo[i].mDistance = (player->current.pos - mInfo[i].mPos).absXZ(); + } } /* 800CCDAC-800CCDD0 .text getPos__18dSalvage_control_cFi */ -void dSalvage_control_c::getPos(int) { - /* Nonmatching */ +cXyz dSalvage_control_c::getPos(int no) { + return mInfo[no].mPos; } /* 800CCDD0-800CCDE4 .text getPosP__18dSalvage_control_cFi */ -void dSalvage_control_c::getPosP(int) { - /* Nonmatching */ +cXyz* dSalvage_control_c::getPosP(int no) { + return &mInfo[no].mPos; } /* 800CCDE4-800CCE08 .text getScale__18dSalvage_control_cFi */ -void dSalvage_control_c::getScale(int) { - /* Nonmatching */ +cXyz dSalvage_control_c::getScale(int no) { + return mInfo[no].mScale; } /* 800CCE08-800CCE18 .text getR__18dSalvage_control_cFi */ -void dSalvage_control_c::getR(int) { - /* Nonmatching */ +f32 dSalvage_control_c::getR(int no) { + return mInfo[no].mR; } /* 800CCE18-800CCE28 .text getH__18dSalvage_control_cFi */ -void dSalvage_control_c::getH(int) { - /* Nonmatching */ +f32 dSalvage_control_c::getH(int no) { + return mInfo[no].mH; } /* 800CCE28-800CCE38 .text getRoomNo__18dSalvage_control_cFi */ -void dSalvage_control_c::getRoomNo(int) { - /* Nonmatching */ +u8 dSalvage_control_c::getRoomNo(int no) { + return mInfo[no].mRoomNo; } /* 800CCE38-800CCE48 .text getItemNo__18dSalvage_control_cFi */ -void dSalvage_control_c::getItemNo(int) { - /* Nonmatching */ +u8 dSalvage_control_c::getItemNo(int no) { + return mInfo[no].mItemNo; } /* 800CCE48-800CCE58 .text getSwitchNo__18dSalvage_control_cFi */ -void dSalvage_control_c::getSwitchNo(int) { - /* Nonmatching */ +s32 dSalvage_control_c::getSwitchNo(int no) { + return mInfo[no].mSwitchNo; } /* 800CCE58-800CCE68 .text getSaveNo__18dSalvage_control_cFi */ -void dSalvage_control_c::getSaveNo(int) { - /* Nonmatching */ +u8 dSalvage_control_c::getSaveNo(int no) { + return mInfo[no].mSaveNo; } /* 800CCE68-800CCE78 .text getType__18dSalvage_control_cFi */ -void dSalvage_control_c::getType(int) { - /* Nonmatching */ +u8 dSalvage_control_c::getType(int no) { + return mInfo[no].mType; } /* 800CCE78-800CCE88 .text getKind__18dSalvage_control_cFi */ -void dSalvage_control_c::getKind(int) { - /* Nonmatching */ +u8 dSalvage_control_c::getKind(int no) { + return mInfo[no].mKind; } /* 800CCE88-800CCE98 .text getDistance__18dSalvage_control_cFi */ -void dSalvage_control_c::getDistance(int) { - /* Nonmatching */ +f32 dSalvage_control_c::getDistance(int no) { + return mInfo[no].mDistance; } /* 800CCE98-800CCEAC .text getAlphaPtr__18dSalvage_control_cFi */ -void dSalvage_control_c::getAlphaPtr(int) { - /* Nonmatching */ +u8* dSalvage_control_c::getAlphaPtr(int no) { + return &mInfo[no].mNowAlpha; } /* 800CCEAC-800CCEBC .text getDrawMode__18dSalvage_control_cFi */ -void dSalvage_control_c::getDrawMode(int) { - /* Nonmatching */ +u8 dSalvage_control_c::getDrawMode(int no) { + return mInfo[no].mNowAlpha; // ??? } /* 800CCEBC-800CCEDC .text checkRegist__18dSalvage_control_cFi */ -void dSalvage_control_c::checkRegist(int) { +BOOL dSalvage_control_c::checkRegist(int no) { /* Nonmatching */ } /* 800CCEDC-800CCEF8 .text checkUsed__18dSalvage_control_cFi */ -void dSalvage_control_c::checkUsed(int) { - /* Nonmatching */ +bool dSalvage_control_c::checkUsed(int no) { + return !(mInfo[no].mFlag & 1); } /* 800CCEF8-800CCF1C .text setPos__18dSalvage_control_cFi4cXyz */ -void dSalvage_control_c::setPos(int, cXyz) { - /* Nonmatching */ +void dSalvage_control_c::setPos(int no, cXyz pos) { + mInfo[no].mPos = pos; } /* 800CCF1C-800CCF34 .text setFlag__18dSalvage_control_cFiUc */ -void dSalvage_control_c::setFlag(int, u8) { - /* Nonmatching */ +void dSalvage_control_c::setFlag(int no, u8 v) { + mInfo[no].mFlag |= v; } /* 800CCF34-800CCF4C .text clrFlag__18dSalvage_control_cFiUc */ -void dSalvage_control_c::clrFlag(int, u8) { - /* Nonmatching */ +void dSalvage_control_c::clrFlag(int no, u8 v) { + mInfo[no].mFlag &= ~v; } /* 800CCF4C-800CCF5C .text setNowAlpha__18dSalvage_control_cFiUc */ -void dSalvage_control_c::setNowAlpha(int, u8) { - /* Nonmatching */ +void dSalvage_control_c::setNowAlpha(int no, u8 v) { + mInfo[no].mNowAlpha = v; } /* 800CCF5C-800CCF6C .text setDrawMode__18dSalvage_control_cFii */ -void dSalvage_control_c::setDrawMode(int, int) { - /* Nonmatching */ +void dSalvage_control_c::setDrawMode(int no, int v) { + mInfo[no].mDrawMode = v; }