#include "c/c_math.h" #include "m/m_pad.h" #define NEED_DIRECT_FRAMECTRL_ACCESS #include "c/c_lib.h" #include "common.h" #include "d/a/d_a_player.h" #include "d/a/obj/d_a_obj_tbox.h" #include "d/d_base.h" #include "d/d_cs_base.h" #include "d/d_cs_game.h" #include "d/d_cursor_hit_check.h" #include "d/d_d2d.h" #include "d/d_fader.h" #include "d/d_message.h" #include "d/d_pad.h" #include "d/d_pad_nav.h" #include "d/d_player.h" #include "d/d_rumble.h" #include "d/d_sc_game.h" #include "d/d_stage.h" #include "d/d_stage_mgr.h" #include "d/flag/sceneflag_manager.h" #include "d/flag/storyflag_manager.h" #include "d/lyt/d2d.h" #include "d/lyt/d_lyt_control_game.h" #include "d/lyt/d_lyt_map.h" #include "d/lyt/d_lyt_map_global.h" #include "d/lyt/d_lyt_unknowns.h" #include "d/lyt/d_textbox.h" #include "d/lyt/d_window.h" #include "d/lyt/meter/d_lyt_meter.h" #include "d/lyt/msg_window/d_lyt_msg_window.h" #include "d/snd/d_snd_small_effect_mgr.h" #include "egg/core/eggColorFader.h" #include "f/f_base.h" #include "f/f_manager.h" #include "f/f_profile_name.h" #include "m/m_vec.h" #include "m/m_video.h" #include "nw4r/lyt/lyt_bounding.h" #include "nw4r/lyt/lyt_group.h" #include "nw4r/lyt/lyt_pane.h" #include "nw4r/lyt/lyt_types.h" #include "s/s_StateInterfaces.hpp" #include "sized_string.h" #include "toBeSorted/arc_managers/layout_arc_manager.h" #include "toBeSorted/d_beacon.h" #include "toBeSorted/event_manager.h" struct dLytMap_HIO_c { dLytMap_HIO_c(); virtual ~dLytMap_HIO_c(); /* 0x04 */ f32 field_0x04; /* 0x08 */ f32 field_0x08; /* 0x0C */ f32 mFootstepsScale; /* 0x10 */ f32 field_0x10; /* 0x14 */ f32 field_0x14; /* 0x18 */ u8 field_0x18; /* 0x19 */ u8 field_0x19; /* 0x1A */ u8 field_0x1A; /* 0x1B */ u8 field_0x1B; /* 0x1C */ u8 field_0x1C; /* 0x1D */ u8 field_0x1D; /* 0x1E */ u8 field_0x1E; /* 0x1F */ u8 field_0x1F; /* 0x20 */ u8 field_0x20; /* 0x21 */ u8 field_0x21; /* 0x22 */ u8 field_0x22; /* 0x23 */ u8 field_0x23; /* 0x24 */ u8 field_0x24; /* 0x25 */ u8 field_0x25; /* 0x26 */ u8 field_0x26; /* 0x27 */ u8 field_0x27; /* 0x28 */ u8 field_0x28; /* 0x29 */ u8 field_0x29; /* 0x2A */ u8 mFootstepsAlpha; /* 0x2B */ u8 field_0x2B; /* 0x2C */ f32 field_0x2C; f32 getField_0x04() const { return field_0x04; } }; dLytMap_HIO_c sHio; dLytMap_HIO_c::dLytMap_HIO_c() { field_0x04 = -10.0f; field_0x10 = 14.0f; field_0x14 = 32.0f; field_0x18 = 0; field_0x19 = 0xFF; field_0x1A = 0xF; field_0x1B = 0x12; field_0x1C = 9; field_0x2C = 0.0f; field_0x1D = 0x2D; field_0x1E = 0x2D; field_0x1F = 0x1E; field_0x20 = 0x17; field_0x21 = 0x5A; field_0x22 = 0x2D; field_0x23 = 0x2D; field_0x24 = 0x35; field_0x25 = 0x2D; field_0x26 = 0x5A; field_0x27 = 0x2D; field_0x28 = 0x5A; field_0x29 = 0x5; field_0x08 = 10.0f; mFootstepsScale = 0.4f; mFootstepsAlpha = 0x80; field_0x2B = 10; } dLytMap_HIO_c::~dLytMap_HIO_c() {} inline mVec3_c vec2ToVec3XY(const mVec2_c &v) { return mVec3_c(v.x, v.y, 0.0f); } void dMapFootPrintsQueue_c::init() { int j = ARRAY_LENGTH(mEntries) - 1; for (int i = 0; i < (int)ARRAY_LENGTH(mEntries); i++) { mEntries[i].position.set(0.0f, 0.0f, 0.0f); mEntries[i].pNext = &mEntries[j]; mEntries[j].pPrev = &mEntries[i]; j = i; } mpFirst = &mEntries[0]; mpLast = &mEntries[0]; mCount = 0; } void dMapFootPrintsQueue_c::addStep(const mVec3_c &pos, const mAng &rot) { mpLast->position = pos; mpLast->rotation = rot; if (mpFirst == mpLast && mCount == ARRAY_LENGTH(mEntries)) { mpFirst = mpFirst->pPrev; } mpLast = mpLast->pPrev; if (mCount < ARRAY_LENGTH(mEntries)) { mCount++; } } dMapFootPrintEntry *dMapFootPrintsQueue_c::getFirst() const { if (mCount == 0) { return nullptr; } return mpLast->pNext; } dMapFootPrintEntry *dMapFootPrintsQueue_c::getNext(const dMapFootPrintEntry *it) const { dMapFootPrintEntry *ret = nullptr; if (it != mpFirst) { ret = it->pNext; } return ret; } void dMapFootPrintsMgr_c::execute() { dAcPy_c *link = getLinkPtr(); const mVec3_c &linkPos = link->mPosition; if (mQueue.isEmpty()) { mQueue.addStep(linkPos, link->mRotation.y); } else { mVec3_c lastPos = mQueue.getFirst()->position; mVec3_c diff = mVec3_c(linkPos - lastPos); f32 absXZ = diff.squareMagXZ(); mAng rot = diff.atan2sX_Z(); if (absXZ >= mMinStepDistanceSq) { mQueue.addStep(linkPos, rot); } } } dLytMapFootPrints_c::dLytMapFootPrints_c(dLytMapGlobal_c *global) : mpGlobal(global), mpPane(nullptr), field_0xA0(0.0f), mMaxNumSteps(ARRAY_LENGTH(mFootprintPositions)), mCurrentNumSteps(0), field_0x198(0.0f), field_0x19C(0.0f), mVisible(false) { for (int i = 0; i < (int)ARRAY_LENGTH(mFootprintPositions); i++) { mFootprintPositions[i].set(0.0f, 0.0f); } } dLytMapGlobal_c *dLytMapFootPrints_c::getGlobal() const { return mpGlobal; } bool dLytMapFootPrints_c::build(d2d::ResAccIf_c *resAcc) { mLyt.setResAcc(resAcc); mLyt.build("footPrint_00.brlyt", nullptr); nw4r::lyt::Pane *root = mLyt.getLayout()->GetRootPane(); root->SetVisible(false); root->SetAlpha(0); root->SetInfluencedAlpha(true); mpPane = mLyt.findPane("P_all_01"); mLyt.calc(); field_0xA0 = 1.0f; return true; } bool dLytMapFootPrints_c::remove() { return true; } bool dLytMapFootPrints_c::execute() { dLytMapGlobal_c *global = getGlobal(); u8 globalAlpha = global->getAlpha(); nw4r::lyt::Pane *root = mLyt.getLayout()->GetRootPane(); if (globalAlpha != 0) { root->SetVisible(true); root->SetAlpha(globalAlpha); } else { root->SetVisible(false); root->SetAlpha(0); } const dMapFootPrintsQueue_c *queue = dLytControlGame_c::getInstance()->getFootprintsQueue(); mVec2_c playerPos; global->projectOntoMap(playerPos, global->getPlayerPos()); mMaxNumSteps = sHio.field_0x2B; const dMapFootPrintEntry *it = queue->getFirst(); int i = 0; for (; it != nullptr; it = queue->getNext(it)) { mVec2_c footstepPos; global->projectOntoMap(footstepPos, it->position); mVec2_c diff; diff = footstepPos - playerPos; f32 dist = diff.length(); for (f32 step = dist / global->getField_0x44(); step >= sHio.field_0x08 / field_0x198; step /= global->getField_0x44()) { f32 tmp = (sHio.field_0x08 / field_0x198) / step; mVec2_c v = mVec2_c((footstepPos - playerPos) * tmp + playerPos); mFootprintPositions[i] = v; if (++i >= mMaxNumSteps) { break; } playerPos = v; diff = footstepPos - playerPos; step = diff.length(); } if (i >= mMaxNumSteps) { break; } } mCurrentNumSteps = i; return true; } void dLytMapFootPrints_c::draw() { if (!mVisible) { return; } dLytMapGlobal_c *global = getGlobal(); u8 globalAlpha = global->getAlpha(); if (globalAlpha == 0) { return; } // TODO - GPR regswap between pane and mFootprintPositions[i] nw4r::lyt::Pane *pane = mLyt.getLayout()->GetRootPane(); f32 scale = field_0x19C * sHio.mFootstepsScale; mVec2_c scaleV = mVec2_c(scale, scale); mpPane->SetScale(scaleV); f32 globalAlphaF = globalAlpha; for (int i = 0; i < mCurrentNumSteps; i++) { mVec2_c pos = mVec2_c(global->getField_0x20() + mFootprintPositions[i]); pane->SetTranslate(vec2ToVec3XY(pos)); // TODO - FPR regswaps, maybe fewer temps would work f32 constantAlpha = sHio.mFootstepsAlpha / 255.0f; f32 alpha = globalAlphaF * field_0x19C; int range = mMaxNumSteps; f32 fadingFactor = ((f32)(range - i) / (f32)range); pane->SetAlpha(alpha * fadingFactor * constantAlpha); pane->CalculateMtx(mLyt.getDrawInfo()); pane->Draw(mLyt.getDrawInfo()); } } void dLytMapPutIcon_c::build(d2d::ResAccIf_c *resAcc) { mLyt.setResAcc(resAcc); mLyt.build("mapPutIcon_00.brlyt", nullptr); mVisible = true; mLyt.calc(); } void dLytMapPutIcon_c::remove() { // no-op } void dLytMapPutIcon_c::execute() { mLyt.calc(); } void dLytMapPutIcon_c::draw() { if (mVisible) { mLyt.draw(); } } void dLytMapPutIcon_c::setPosition(const mVec2_c &pos) { mVec3_c pos3 = vec2ToVec3XY(mVec2_c(pos)); mLyt.getLayout()->GetRootPane()->SetTranslate(pos3); } void dLytMapPutIcon_c::setScale(f32 scale) { mLyt.getLayout()->GetRootPane()->SetScale(mVec2_c(scale, scale)); } STATE_DEFINE(dLytMapPinIcon_c, Wait); STATE_DEFINE(dLytMapPinIcon_c, ToSelect); STATE_DEFINE(dLytMapPinIcon_c, Select); STATE_DEFINE(dLytMapPinIcon_c, ToUnselect); STATE_DEFINE(dLytMapPinIcon_c, Remove); STATE_DEFINE(dLytMapPinIconAggregate_c, Wait); STATE_DEFINE(dLytMapPinIconAggregate_c, Select); STATE_DEFINE(dLytMapPinIconAggregate_c, Remove); STATE_DEFINE(dLytMapFloorBtn_c, Wait); STATE_DEFINE(dLytMapFloorBtn_c, ToSelect); STATE_DEFINE(dLytMapFloorBtn_c, Select); STATE_DEFINE(dLytMapFloorBtn_c, ToWait); STATE_DEFINE(dLytMapFloorBtn_c, ToDecide); STATE_DEFINE(dLytMapFloorBtn_c, Decide); STATE_DEFINE(dLytMapFloorBtn_c, ToSelectInDecide); STATE_DEFINE(dLytMapFloorBtn_c, SelectInDecide); STATE_DEFINE(dLytMapFloorBtn_c, DecideToSelectInDecide); STATE_DEFINE(dLytMapFloorBtnMgr_c, Invisible); STATE_DEFINE(dLytMapFloorBtnMgr_c, Wait); nw4r::ut::Color sMapFaderColor(0xFF, 0xFF, 0xFF, 0xFF); STATE_DEFINE(dLytMapPopupInfo_c, Invisible); STATE_DEFINE(dLytMapPopupInfo_c, In); STATE_DEFINE(dLytMapPopupInfo_c, Wait); STATE_DEFINE(dLytMapPopupInfo_c, WaitInvalid); STATE_DEFINE(dLytMapPopupInfo_c, Out); STATE_DEFINE(dLytMapSavePopupAction_c, Invisible); STATE_DEFINE(dLytMapSavePopupAction_c, In); STATE_DEFINE(dLytMapSavePopupAction_c, Wait); STATE_DEFINE(dLytMapSavePopupAction_c, Out); STATE_DEFINE(dLytMapSaveCaption_c, Invisible); STATE_DEFINE(dLytMapSaveCaption_c, In); STATE_DEFINE(dLytMapSaveCaption_c, Wait); STATE_DEFINE(dLytMapSaveCaption_c, Out); STATE_DEFINE(dLytMapSaveObj_c, Wait); STATE_DEFINE(dLytMapSaveObj_c, ToSelect); STATE_DEFINE(dLytMapSaveObj_c, Select); STATE_DEFINE(dLytMapSaveObj_c, ToWait); STATE_DEFINE(dLytMapSaveObj_c, Decide); STATE_DEFINE(dLytMapMain_c, Invisible); STATE_DEFINE(dLytMapMain_c, RenderingWait); STATE_DEFINE(dLytMapMain_c, In); STATE_DEFINE(dLytMapMain_c, Active); STATE_DEFINE(dLytMapMain_c, Out); STATE_DEFINE(dLytMapMain_c, FloorChange); STATE_DEFINE(dLytMapMain_c, ChgMapUpDirection); STATE_DEFINE(dLytMapMain_c, ChgDispAreaMode_Map); STATE_DEFINE(dLytMapMain_c, ChgDispAreaMode_MapRot); STATE_DEFINE(dLytMapMain_c, ChgDispAreaMode_WA); STATE_DEFINE(dLytMapMain_c, ChgDispAreaMode_CsrRot); STATE_DEFINE(dLytMapMain_c, ResetPos); STATE_DEFINE(dLytMapMain_c, ResetPosWithFloorChange); STATE_DEFINE(dLytMapMain_c, EventSwBankSmall_Step1); STATE_DEFINE(dLytMapMain_c, EventSwBankSmall_Step2); STATE_DEFINE(dLytMapMain_c, EventSwBankSmall_Step3); STATE_DEFINE(dLytMapMain_c, EventMapIntro_Step1); STATE_DEFINE(dLytMapMain_c, EventMapIntro_Step2); STATE_DEFINE(dLytMapMain_c, EventMapIntro_Step3); STATE_DEFINE(dLytMapMain_c, EventMapIntro_Step4); STATE_DEFINE(dLytMapMain_c, EventDungeonMapGet_Step1); STATE_DEFINE(dLytMapMain_c, EventDungeonMapGet_Step2); STATE_DEFINE(dLytMapMain_c, EventDungeonMapGet_Step3); STATE_DEFINE(dLytMapMain_c, EventFieldMapChange_Step1); STATE_DEFINE(dLytMapMain_c, EventFieldMapChange_Step2); STATE_DEFINE(dLytMapMain_c, EventFieldMapChange_Step3); STATE_DEFINE(dLytMapMain_c, EventFieldMapChange_Step4); STATE_DEFINE(dLytMapMain_c, EventForestMapChange_Step1); STATE_DEFINE(dLytMapMain_c, EventForestMapChange_Step2); STATE_DEFINE(dLytMapMain_c, EventForestMapChange_Step3); STATE_DEFINE(dLytMapMain_c, EventSignalAdd_Step1); STATE_DEFINE(dLytMapMain_c, EventSignalAdd_Step2); STATE_DEFINE(dLytMapMain_c, EventSignalAdd_Step3); STATE_DEFINE(dLytMapMain_c, EventGoddessCube_Step1); STATE_DEFINE(dLytMapMain_c, EventGoddessCube_Step2); STATE_DEFINE(dLytMapMain_c, EventGoddessCube_Step3); STATE_DEFINE(dLytMapMain_c, EventSaveObjMsgWindow); STATE_DEFINE(dLytMapMain_c, EventSaveObjSelect); STATE_DEFINE(dLytMapMain_c, EventSaveObjConfirmMsgWindow); STATE_DEFINE(dLytMapMain_c, EventSaveObjDecide); dLytMapFader_c::dLytMapFader_c() : mFader( 0.0f, 0.0f, mVideo::m_video->pRenderMode->fbWidth, mVideo::m_video->pRenderMode->efbHeight, sMapFaderColor, EGG::ColorFader::STATUS_PREPARE_OUT ) {} dLytMapFader_c::~dLytMapFader_c() {} void dLytMapFader_c::calc() { mFader.calc(); } void dLytMapFader_c::draw() { mFader.draw(); } #define LYT_MAP_PIN_ICON_ANIM_SCALE 0 #define LYT_MAP_PIN_ICON_ANIM_ERASE 1 #define LYT_MAP_PIN_ICON_ANIM_LOOP 2 #define LYT_MAP_PIN_ICON_NUM_ANIMS 3 void dLytMapPinIcon_c::initializeState_Wait() { mLyt.calc(); } void dLytMapPinIcon_c::executeState_Wait() { bool keepGoing = false; if (field_0x1D0 != nullptr) { keepGoing = !field_0x1D0->field_0x04; } if (!keepGoing) { return; } if (!mIsSet) { return; } if (field_0x1BC == 0) { return; } mStateMgr.changeState(StateID_ToSelect); } void dLytMapPinIcon_c::finalizeState_Wait() {} void dLytMapPinIcon_c::initializeState_ToSelect() { d2d::AnmGroup_c *m = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_ERASE]; m->bind(false); m->setFrame(0.0f); } void dLytMapPinIcon_c::executeState_ToSelect() { mStateMgr.changeState(StateID_Select); } void dLytMapPinIcon_c::finalizeState_ToSelect() { field_0x1D0->field_0x04 = true; } void dLytMapPinIcon_c::initializeState_Select() {} void dLytMapPinIcon_c::executeState_Select() { if (field_0x1D0->field_0x05 && dPad::getDownTrigC()) { removeBeacon(); field_0x1D0->field_0x04 = false; d2d::AnmGroup_c *m = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_ERASE]; if (m->isBound()) { m->unbind(); } dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_BEACON_REMOVE); mStateMgr.changeState(StateID_Remove); return; } if (field_0x1BC == 0) { d2d::AnmGroup_c *m = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_ERASE]; m->bind(false); m->setFrame(0.0f); mLyt.calc(); m->unbind(); mStateMgr.changeState(StateID_ToUnselect); } else { d2d::AnmGroup_c *m = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_ERASE]; if (m->isBound()) { m->play(); } } } void dLytMapPinIcon_c::finalizeState_Select() {} void dLytMapPinIcon_c::initializeState_ToUnselect() {} void dLytMapPinIcon_c::executeState_ToUnselect() { mStateMgr.changeState(StateID_Wait); } void dLytMapPinIcon_c::finalizeState_ToUnselect() { field_0x1D0->field_0x04 = false; } void dLytMapPinIcon_c::initializeState_Remove() {} void dLytMapPinIcon_c::executeState_Remove() { mStateMgr.changeState(StateID_Wait); } void dLytMapPinIcon_c::finalizeState_Remove() {} void dLytMapPinIcon_c::updatePosition() { dLytMapGlobal_c *global = getGlobal(); if (mIsSet) { mVec2_c pos2d; global->projectOntoMap(pos2d, mPosition); pos2d += global->getField_0x20(); mVec3_c translate3d = vec2ToVec3XY(pos2d); mLyt.getLayout()->GetRootPane()->SetTranslate(translate3d); } bool vis = mIsSet; mLyt.getLayout()->GetRootPane()->SetVisible(mIsSet); if (mpBounding != nullptr) { mpBounding->SetVisible(vis); } mLyt.getLayout()->GetRootPane()->SetAlpha(global->getAlpha()); mLyt.getLayout()->GetRootPane()->SetInfluencedAlpha(true); mLyt.calc(); } void dLytMapPinIcon_c::checkPointedAt() { field_0x1BC = 0; dCursorHitCheck_c *chk = dCsGame_c::GetInstance()->getCursorHit(); if (chk != nullptr && chk->getType() == 'lyt ' && static_cast(chk)->getHitPane() == mpBounding) { field_0x1BC = 1; } } void dLytMapPinIcon_c::setPosition(const mVec3_c &pos) { d2d::AnmGroup_c *anm; mPosition = pos; dLytMapGlobal_c *global = getGlobal(); mVec2_c pos2d; global->projectOntoMap(pos2d, pos); pos2d += global->getField_0x20(); mVec3_c translate3d = vec2ToVec3XY(mVec2_c(pos2d)); mLyt.getLayout()->GetRootPane()->SetTranslate(translate3d); mLyt.getLayout()->GetRootPane()->SetVisible(true); anm = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_ERASE]; anm->bind(false); anm->setFrame(0.0f); mLyt.calc(); anm->unbind(); mIsSet = true; } void dLytMapPinIcon_c::removeBeacon() { mIsSet = false; if (mpBounding != nullptr) { mpBounding->SetVisible(false); } setBeaconPosition(nullptr, mIndex); } dLytMapPinIcon_c::~dLytMapPinIcon_c() { if (dCsMgr_c::GetInstance()->isRegist(&mCsHitCheck)) { dCsMgr_c::GetInstance()->unregistCursorTarget(&mCsHitCheck); } } dLytMapGlobal_c *dLytMapPinIcon_c::getGlobal() const { return dLytMapGlobal_c::GetInstance(); } static const d2d::LytBrlanMapping sMapPinIconBrlanMap[] = { {"mapPutIcon_00_scale.brlan", "G_scale_00"}, {"mapPutIcon_00_erase.brlan", "G_scale_00"}, { "mapPutIcon_00_loop.brlan", "G_loop_00"}, }; bool dLytMapPinIcon_c::build(d2d::ResAccIf_c *resAcc) { mLyt.setResAcc(resAcc); mLyt.build("mapPutIcon_00.brlyt", nullptr); d2d::AnmGroup_c *pAnmGroups = mAnmGroups; for (int i = 0; i < LYT_MAP_PIN_ICON_NUM_ANIMS; i++) { pAnmGroups[i].init(sMapPinIconBrlanMap[i].mFile, resAcc, mLyt.getLayout(), sMapPinIconBrlanMap[i].mName); pAnmGroups[i].bind(false); pAnmGroups[i].setFrame(0.0f); } mLyt.calc(); for (int i = 0; i < LYT_MAP_PIN_ICON_NUM_ANIMS; i++) { pAnmGroups[i].unbind(); } mpBounding = mLyt.findBounding("B_mark_00"); mCsHitCheck.init(mpBounding, 2, 1, 0); dCsMgr_c::GetInstance()->registCursorTarget(&mCsHitCheck); mAnmGroups[LYT_MAP_PIN_ICON_ANIM_SCALE].bind(false); mAnmGroups[LYT_MAP_PIN_ICON_ANIM_LOOP].bind(false); mLyt.calc(); mStateMgr.changeState(StateID_Wait); field_0x1BC = 0; mIsSet = false; mLoopFrame = 0; return true; } bool dLytMapPinIcon_c::remove() { dCsMgr_c::GetInstance()->unregistCursorTarget(&mCsHitCheck); for (int i = 0; i < LYT_MAP_PIN_ICON_NUM_ANIMS; i++) { mAnmGroups[i].remove(); } return true; } void dLytMapPinIcon_c::setScale(f32 scale) { // TODO - probably inlines f32 frame = mAnmGroups[LYT_MAP_PIN_ICON_ANIM_SCALE].getLastFrame(); d2d::AnmGroup_c *grp = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_SCALE]; grp->setFrame(scale * frame); mLyt.calc(); } bool dLytMapPinIcon_c::execute() { checkPointedAt(); mStateMgr.executeState(); field_0x1BC = 0; d2d::AnmGroup_c *grp = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_LOOP]; grp->setFrame(mLoopFrame); // TODO - probably inlines dLytMapGlobal_c *global = getGlobal(); f32 frame = mAnmGroups[LYT_MAP_PIN_ICON_ANIM_SCALE].getLastFrame(); grp = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_SCALE]; f32 tmp = global->getZoomFrame(); grp->setFrame(tmp * frame); mLyt.calc(); mCsHitCheck.resetCachedHitboxes(); mCsHitCheck.execute(); return true; } bool dLytMapPinIcon_c::draw() { mLyt.draw(); return true; } void dLytMapPinIconAggregate_c::initializeState_Wait() {} void dLytMapPinIconAggregate_c::executeState_Wait() { for (int i = 0; i < 5; i++) { if (mPins[i].isSelect()) { mStateMgr.changeState(StateID_Select); } } } void dLytMapPinIconAggregate_c::finalizeState_Wait() {} void dLytMapPinIconAggregate_c::initializeState_Select() {} void dLytMapPinIconAggregate_c::executeState_Select() { bool anyRemove = false; for (int i = 0; i < 5; i++) { if (mPins[i].isRemove()) { mStateMgr.changeState(StateID_Remove); anyRemove = true; // a bit convoluted, an early return would've done the trick break; } } if (!anyRemove) { bool allSelect = true; for (int i = 0; i < 5; i++) { if (mPins[i].isSelect()) { allSelect = false; break; } } if (allSelect) { mStateMgr.changeState(StateID_Wait); } } } void dLytMapPinIconAggregate_c::finalizeState_Select() {} void dLytMapPinIconAggregate_c::initializeState_Remove() {} void dLytMapPinIconAggregate_c::executeState_Remove() { field_0x9A0->field_0x04 = false; mStateMgr.changeState(StateID_Wait); } void dLytMapPinIconAggregate_c::finalizeState_Remove() {} bool dLytMapPinIconAggregate_c::findNewBeaconId(s32 *pOutId) { bool ret = false; for (s32 idx = 0; idx < getMaxBeaconCount(); idx++) { s32 existingIndex = mPins[idx].mIndex; if (!mPins[idx].mIsSet) { // If we have an unused id, use that *pOutId = idx; ret = true; break; } // Otherwise use the lowest id ("oldest beacon"?) if (existingIndex < *pOutId) { *pOutId = existingIndex; } } return ret; } void dLytMapPinIconAggregate_c::setScale(f32 scale) { for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { mPins[idx].setScale(scale); } } void dLytMapPinIconAggregate_c::updatePosition() { for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { mPins[idx].updatePosition(); } } void dLytMapPinIconAggregate_c::setUnk(LytMap0x80520B5C *unk) { field_0x9A0 = unk; for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { mPins[idx].field_0x1D0 = unk; } } bool dLytMapPinIconAggregate_c::setPosition(s32 index, const mVec3_c &position) { bool ret = false; for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { if (mPins[idx].mIndex == index) { mPins[idx].setPosition(position); ret = true; break; } } return ret; } void dLytMapPinIconAggregate_c::unsetAll() { for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { mPins[idx].mIsSet = false; } } u32 dLytMapPinIconAggregate_c::getNumSetPins() const { s32 num = 0; for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { if (mPins[idx].mIsSet) { num++; } } return num; } bool dLytMapPinIconAggregate_c::build(d2d::ResAccIf_c *resAcc) { for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { mPins[idx].build(resAcc); } mLoopFrame = 0; mLoopFrameMax = mPins[0].mAnmGroups[LYT_MAP_PIN_ICON_ANIM_LOOP].getAnimDuration(); mStateMgr.changeState(StateID_Wait); return true; } bool dLytMapPinIconAggregate_c::remove() { for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { mPins[idx].remove(); } return true; } bool dLytMapPinIconAggregate_c::execute() { mLoopFrame++; if (mLoopFrame > mLoopFrameMax) { mLoopFrame = 0; } for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { mPins[idx].mLoopFrame = mLoopFrame; mPins[idx].execute(); } mStateMgr.executeState(); return true; } bool dLytMapPinIconAggregate_c::draw() { for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { mPins[idx].draw(); } return true; } void dLytMapFloorBtn_c::init() { mStateMgr.changeState(StateID_Wait); } void dLytMapFloorBtn_c::execute() { mStateMgr.executeState(); } void dLytMapFloorBtn_c::directlyDecide() { if (mpAnmGroups->mOnOff.isBound()) { mpAnmGroups->mOnOff.unbind(); } if (mpAnmGroups->mDecide.isBound()) { mpAnmGroups->mDecide.unbind(); } mpAnmGroups->mOnOffLight.bind(false); mpAnmGroups->mOnOffLight.setToEnd(); mpOwnerLyt->calc(); mpAnmGroups->mOnOffLight.unbind(); } void dLytMapFloorBtn_c::directlyUndecide() { if (mpAnmGroups->mOnOffLight.isBound()) { mpAnmGroups->mOnOffLight.unbind(); } if (mpAnmGroups->mDecide.isBound()) { mpAnmGroups->mDecide.unbind(); } mpAnmGroups->mOnOff.bind(false); mpAnmGroups->mOnOff.setFrame(0.0f); mpOwnerLyt->calc(); mpAnmGroups->mOnOff.unbind(); } void dLytMapFloorBtn_c::initializeState_Wait() {} void dLytMapFloorBtn_c::executeState_Wait() { if (mSelected) { dRumble_c::start(dRumble_c::sRumblePreset1, dRumble_c::FLAG_SLOT0); mpAnmGroups->mOnOff.bind(false); mpAnmGroups->mOnOff.setFrame(0.0f); dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_POINT_FLOOR); mStateMgr.changeState(StateID_ToSelect); } } void dLytMapFloorBtn_c::finalizeState_Wait() {} void dLytMapFloorBtn_c::initializeState_ToSelect() {} void dLytMapFloorBtn_c::executeState_ToSelect() { if (mpAnmGroups->mOnOff.isEndReached()) { mpOwnerLyt->calc(); mpAnmGroups->mOnOff.unbind(); mStateMgr.changeState(StateID_Select); } } void dLytMapFloorBtn_c::finalizeState_ToSelect() {} void dLytMapFloorBtn_c::initializeState_Select() {} void dLytMapFloorBtn_c::executeState_Select() { if (!mSelected) { mpAnmGroups->mOnOff.bind(false); mpAnmGroups->mOnOff.setBackward(); mpAnmGroups->mOnOff.setToStart(); mStateMgr.changeState(StateID_ToWait); } else if (mDecided) { mpAnmGroups->mDecide.bind(false); mpAnmGroups->mDecide.setFrame(0.0f); dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_POINT_SELECT_FLOOR); mStateMgr.changeState(StateID_ToSelectInDecide); } } void dLytMapFloorBtn_c::finalizeState_Select() {} void dLytMapFloorBtn_c::initializeState_ToWait() {} void dLytMapFloorBtn_c::executeState_ToWait() { if (mpAnmGroups->mOnOff.isStop2()) { mpOwnerLyt->calc(); mpAnmGroups->mOnOff.unbind(); mStateMgr.changeState(StateID_Wait); } } void dLytMapFloorBtn_c::finalizeState_ToWait() {} void dLytMapFloorBtn_c::initializeState_ToSelectInDecide() {} void dLytMapFloorBtn_c::executeState_ToSelectInDecide() { if (mpAnmGroups->mDecide.isStop2()) { mpOwnerLyt->calc(); mpAnmGroups->mDecide.unbind(); mStateMgr.changeState(StateID_SelectInDecide); } } void dLytMapFloorBtn_c::finalizeState_ToSelectInDecide() {} void dLytMapFloorBtn_c::initializeState_SelectInDecide() {} void dLytMapFloorBtn_c::executeState_SelectInDecide() { if (!mSelected) { mpAnmGroups->mOnOffLight.bind(false); mpAnmGroups->mOnOffLight.setToStart(); mStateMgr.changeState(StateID_ToDecide); } } void dLytMapFloorBtn_c::finalizeState_SelectInDecide() {} void dLytMapFloorBtn_c::initializeState_ToDecide() {} void dLytMapFloorBtn_c::executeState_ToDecide() { if (mpAnmGroups->mOnOffLight.isStop2()) { mpAnmGroups->mOnOffLight.unbind(); mpOwnerLyt->calc(); mStateMgr.changeState(StateID_Decide); } } void dLytMapFloorBtn_c::finalizeState_ToDecide() {} void dLytMapFloorBtn_c::initializeState_Decide() {} void dLytMapFloorBtn_c::executeState_Decide() { if (mSelected) { mpAnmGroups->mOnOffLight.bind(false); mpAnmGroups->mOnOffLight.setBackward(); mpAnmGroups->mOnOffLight.setToStart(); dRumble_c::start(dRumble_c::sRumblePreset1, dRumble_c::FLAG_SLOT0); dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_POINT_FLOOR); mStateMgr.changeState(StateID_DecideToSelectInDecide); } else if (!mDecided) { mpAnmGroups->mOnOff.bind(false); mpAnmGroups->mOnOff.setFrame(0.0f); mpOwnerLyt->getLayout()->Animate(0); mpOwnerLyt->calc(); mpAnmGroups->mOnOff.unbind(); mStateMgr.changeState(StateID_Wait); } } void dLytMapFloorBtn_c::finalizeState_Decide() {} void dLytMapFloorBtn_c::initializeState_DecideToSelectInDecide() {} void dLytMapFloorBtn_c::executeState_DecideToSelectInDecide() { if (mpAnmGroups->mOnOffLight.isStop2()) { mpOwnerLyt->calc(); mpAnmGroups->mOnOffLight.unbind(); mStateMgr.changeState(StateID_SelectInDecide); } } void dLytMapFloorBtn_c::finalizeState_DecideToSelectInDecide() {} static const char *sFloorBtnBoundings[] = { "B_choices_00", "B_choices_01", "B_choices_02", "B_choices_03", }; static const char *sFloorBtnText[] = { "T_text_00", "T_text_01", "T_text_02", "T_text_03", }; static const char *sFloorBtnTextS[] = { "T_textS_00", "T_textS_01", "T_textS_02", "T_textS_03", }; static const d2d::LytBrlanMapping brlanMapFloorBtnMgr[] = { {"mapFloorBtn_00_btnV.brlan", "G_btnV_00"}, }; #define MAP_FLOOR_BTN_MGR_ANIM_BTNV 0 #define MAP_FLOOR_BTN_MGR_NUM_ANIMS 1 static const char *brlanListFloorBtn[] = { "mapFloorBtn_00_btnLoop.brlan", "mapFloorBtn_00_btnOnOffNormal.brlan", "mapFloorBtn_00_btnDecideNormal.brlan", "mapFloorBtn_00_btnOnOffLight.brlan", }; static const char *groupListFloorBtn[][4] = { {"G_btnLoop_00", "G_btn_00", "G_btn_00", "G_btn_00"}, {"G_btnLoop_01", "G_btn_01", "G_btn_01", "G_btn_01"}, {"G_btnLoop_02", "G_btn_02", "G_btn_02", "G_btn_02"}, {"G_btnLoop_03", "G_btn_03", "G_btn_03", "G_btn_03"}, }; #define MAP_FLOOR_BTN_MGR_NUM_BTNS 4 bool dLytMapFloorBtnMgr_c::build(d2d::ResAccIf_c *resAcc) { mLyt.setResAcc(resAcc); mLyt.build("mapFloorBtn_00.brlyt", nullptr); for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_ANIMS; i++) { mAnmGroups[i].init(brlanMapFloorBtnMgr[i].mFile, resAcc, mLyt.getLayout(), brlanMapFloorBtnMgr[i].mName); } for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { mBtnGroups[i].mLoop.init(brlanListFloorBtn[0], resAcc, mLyt.getLayout(), groupListFloorBtn[i][0]); mBtnGroups[i].mOnOff.init(brlanListFloorBtn[1], resAcc, mLyt.getLayout(), groupListFloorBtn[i][1]); mBtnGroups[i].mDecide.init(brlanListFloorBtn[2], resAcc, mLyt.getLayout(), groupListFloorBtn[i][2]); mBtnGroups[i].mOnOffLight.init(brlanListFloorBtn[3], resAcc, mLyt.getLayout(), groupListFloorBtn[i][3]); } nw4r::lyt::Bounding *bounding; for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { bounding = mLyt.findBounding(sFloorBtnBoundings[i]); mFloorBtns[i].init(); mFloorBtns[i].mpBounding = bounding; bounding->SetVisible(false); mCsHitChecks[i].init(bounding, 0x2, 0, 0); dCsMgr_c::GetInstance()->registCursorTarget(&mCsHitChecks[i]); } mpPane = mLyt.findPane("N_all_00"); mpPane->SetInfluencedAlpha(true); for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { mFloorBtns[i].mpOwnerLyt = &mLyt; mFloorBtns[i].mpAnmGroups = &mBtnGroups[i]; } for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { mBtnGroups[i].mOnOff.bind(false); mBtnGroups[i].mOnOff.setFrame(0.0f); } mLyt.getLayout()->Animate(0); for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { mBtnGroups[i].mOnOff.unbind(); } for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { mBtnGroups[i].mLoop.bind(false); } mLyt.calc(); for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { mCsHitChecks[i].resetCachedHitboxes(); mCsHitChecks[i].execute(); } mPointerVisible = false; mPrevPointerVisible = false; for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { mFloorBtns[i].mSelected = false; } mStateMgr.changeState(StateID_Invisible); return true; } bool dLytMapFloorBtnMgr_c::remove() { for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { dCsMgr_c::GetInstance()->unregistCursorTarget(&mCsHitChecks[i]); } for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { mBtnGroups[i].mOnOff.remove(); mBtnGroups[i].mLoop.remove(); mBtnGroups[i].mDecide.remove(); mBtnGroups[i].mOnOffLight.remove(); } // not removing our own anm group... dPadNav::setNavEnabled(false, false); return true; } bool dLytMapFloorBtnMgr_c::execute() { field_0x70C = 4; if (*mStateMgr.getStateID() != StateID_Invisible) { if (mPointerVisible) { for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { mFloorBtns[i].execute(); } mStateMgr.executeState(); } else { // Determine the currently active floor s32 activeBtn = 0; s32 direction = dPadNav::getFSStickNavDirection(); if (mPointerVisible != mPrevPointerVisible) { // We just turned off pointing, so make the decided button the selected one too for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { if (mFloorBtns[i].mDecided) { activeBtn = i; } } } else { // Normal handling - pointing off, selected button stays selected for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { if (mFloorBtns[i].mSelected) { activeBtn = i; } } } // Handle navigation if (activeBtn > 0 && (direction == dPadNav::FS_STICK_UP || direction == dPadNav::FS_STICK_UP_RIGHT || direction == dPadNav::FS_STICK_UP_LEFT)) { activeBtn--; } if (activeBtn < mNumFloors - 1 && (direction == dPadNav::FS_STICK_DOWN || direction == dPadNav::FS_STICK_DOWN_RIGHT || direction == dPadNav::FS_STICK_DOWN_LEFT)) { activeBtn++; } for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { if (i == activeBtn) { mFloorBtns[i].mSelected = true; if (dCsBase_c::GetInstance() != nullptr) { dCsBase_c::GetInstance()->setCursorStickTargetPane(mFloorBtns[i].mpBounding); } } else { mFloorBtns[i].mSelected = false; } } for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { mFloorBtns[i].execute(); } } for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { mBtnGroups[i].mLoop.play(); if (mBtnGroups[i].mOnOff.isBound()) { mBtnGroups[i].mOnOff.play(); } if (mBtnGroups[i].mDecide.isBound()) { mBtnGroups[i].mDecide.play(); } if (mBtnGroups[i].mOnOffLight.isBound()) { mBtnGroups[i].mOnOffLight.play(); } } } mLyt.calc(); for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { mCsHitChecks[i].resetCachedHitboxes(); mCsHitChecks[i].execute(); } return true; } void dLytMapFloorBtnMgr_c::checkPointedAtBtn() { mPrevPointerVisible = mPointerVisible; mPointerVisible = dPadNav::isPointerVisible(); if (mForceNoNav) { dPadNav::stopFSStickNav(); mPointerVisible = true; } if (mPointerVisible) { for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { mFloorBtns[i].mSelected = false; } dCursorHitCheck_c *chk = dCsGame_c::GetInstance()->getCursorHit(); if (chk != nullptr && chk->getType() == 'lyt ') { for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { if (chk == &mCsHitChecks[i]) { mFloorBtns[i].mSelected = true; } } } } } s32 dLytMapFloorBtnMgr_c::getPointedAtBtnIdx() const { s32 idx = -1; for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { if (mFloorBtns[i].mSelected) { idx = i; break; } } return idx; } bool dLytMapFloorBtnMgr_c::isUsingPointerNav() const { return mPointerVisible; } void dLytMapFloorBtnMgr_c::resetFloor(s32 newFloorBtn) { mFloorBtns[mSelectedBtnIdx].mDecided = false; mFloorBtns[mSelectedBtnIdx].directlyUndecide(); mFloorBtns[mSelectedBtnIdx].mStateMgr.changeState(dLytMapFloorBtn_c::StateID_Wait); mFloorBtns[newFloorBtn].mDecided = true; mFloorBtns[newFloorBtn].directlyDecide(); mFloorBtns[newFloorBtn].mStateMgr.changeState(dLytMapFloorBtn_c::StateID_Decide); mSelectedBtnIdx = newFloorBtn; } void dLytMapFloorBtnMgr_c::decideSelectedFloor() { for (int i = 0; i < mNumFloors; i++) { if (mFloorBtns[i].mSelected) { if (i != mSelectedBtnIdx) { mFloorBtns[mSelectedBtnIdx].mDecided = false; mFloorBtns[i].mDecided = true; } mSelectedBtnIdx = i; } } } bool dLytMapFloorBtnMgr_c::canDecideFloor() const { bool ret = false; s32 idx = getPointedAtBtnIdx(); if (idx >= 0) { // When pointing at a button that is thus selected but not yet decided, // we can decide on that button if it's not busy animating... if (!mFloorBtns[idx].mDecided) { if (mFloorBtns[idx].mStateMgr.isState(dLytMapFloorBtn_c::StateID_Select)) { bool busy = mFloorBtns[idx].mpAnmGroups->mOnOff.isBound() || mFloorBtns[idx].mpAnmGroups->mDecide.isBound() || mFloorBtns[idx].mpAnmGroups->mOnOffLight.isBound(); if (!busy) { ret = true; } } } } for (int i = 0; i < mNumFloors; i++) { // But if any other button is animating and in a changing state, also forbid if (i != idx) { bool busy = mFloorBtns[i].mpAnmGroups->mOnOff.isBound() || mFloorBtns[i].mpAnmGroups->mDecide.isBound() || mFloorBtns[i].mpAnmGroups->mOnOffLight.isBound(); if (busy) { if (!mFloorBtns[i].mStateMgr.isState(dLytMapFloorBtn_c::StateID_Wait) && !mFloorBtns[i].mStateMgr.isState(dLytMapFloorBtn_c::StateID_Decide)) { ret = false; break; } } } } return ret; } s32 dLytMapFloorBtnMgr_c::getCurrentFloor() const { s32 ret = -1; for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { if (mFloorBtns[i].mDecided) { ret = i; } } return mBaseFloorOffset - ret; } // What it says on the tin static const char *sFloorBtnLabels[] = { "FLOOR_F3", "FLOOR_F2", "FLOOR_F1", "FLOOR_B1", "FLOOR_B2", "FLOOR_B3", }; void dLytMapFloorBtnMgr_c::init(s32 numFloors, s32 baseFloorOffset, s32 selectedFloor) { mNumFloors = numFloors; mBaseFloorOffset = baseFloorOffset; for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { bool visible = i < mNumFloors && mNumFloors >= 2; mLyt.findPane(sFloorBtnBoundings[i])->SetVisible(visible); } if (mNumFloors >= 2) { mLyt.getLayout()->GetRootPane()->SetVisible(true); mAnmGroups[0].bind(false); mAnmGroups[0].setFrame(mNumFloors - 2); for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { bool visible = i < mNumFloors && mNumFloors >= 2; mLyt.findPane(sFloorBtnBoundings[i])->SetVisible(visible); if (visible) { int labelIdx = (2 - mBaseFloorOffset) + i; dTextBox_c *textBox = mLyt.getTextBox(sFloorBtnText[i]); textBox->setMessageWithGlobalTextProcessor2(sFloorBtnLabels[labelIdx], nullptr); textBox = mLyt.getTextBox(sFloorBtnTextS[i]); textBox->setMessageWithGlobalTextProcessor2(sFloorBtnLabels[labelIdx], nullptr); } } // Floor buttons are descending but selectedFloor is ascending s32 tmp = -(selectedFloor - baseFloorOffset); mSelectedBtnIdx = tmp; mFloorBtns[tmp].mDecided = true; mFloorBtns[tmp].mStateMgr.changeState(dLytMapFloorBtn_c::StateID_Decide); // TODO probably an inline d2d::AnmGroup_c &anm = mBtnGroups[tmp].mOnOffLight; anm.bind(false); mBtnGroups[tmp].mOnOffLight.setToEnd(); mLyt.getLayout()->Animate(0); mLyt.calc(); anm.unbind(); if (mAnmGroups[0].bind(false)) { mAnmGroups[0].unbind(); } } else { mLyt.getLayout()->GetRootPane()->SetVisible(false); } } void dLytMapFloorBtnMgr_c::initializeState_Invisible() {} void dLytMapFloorBtnMgr_c::executeState_Invisible() {} void dLytMapFloorBtnMgr_c::finalizeState_Invisible() {} void dLytMapFloorBtnMgr_c::initializeState_Wait() {} void dLytMapFloorBtnMgr_c::executeState_Wait() {} void dLytMapFloorBtnMgr_c::finalizeState_Wait() {} dLytMapFloorBtnMgr_c::~dLytMapFloorBtnMgr_c() { for (int i = 0; i < 4; i++) { if (dCsMgr_c::GetInstance()->isRegist(&mCsHitChecks[i])) { dCsMgr_c::GetInstance()->unregistCursorTarget(&mCsHitChecks[i]); } } dPadNav::setNavEnabled(false, false); } #define MAP_POPUP_INFO_ANIM_IN 0 #define MAP_POPUP_INFO_ANIM_OUT 1 #define MAP_POPUP_INFO_ANIM_INPUT 2 #define MAP_POPUP_INFO_NUM_ANIMS 3 void dLytMapPopupInfo_c::initializeState_Invisible() {} void dLytMapPopupInfo_c::executeState_Invisible() {} void dLytMapPopupInfo_c::finalizeState_Invisible() {} void dLytMapPopupInfo_c::initializeState_In() { mAnmGroups[MAP_POPUP_INFO_ANIM_IN].bind(false); } void dLytMapPopupInfo_c::executeState_In() { if (mAnmGroups[MAP_POPUP_INFO_ANIM_IN].isEndReached()) { mLyt.calc(); mAnmGroups[MAP_POPUP_INFO_ANIM_IN].unbind(); mStateMgr.changeState(StateID_Wait); } } void dLytMapPopupInfo_c::finalizeState_In() {} void dLytMapPopupInfo_c::initializeState_Wait() {} void dLytMapPopupInfo_c::executeState_Wait() { if (dLytMsgWindow_c::getInstance()->isVisible()) { mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].bind(false); mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].setForward(); mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].setToStart(); mStateMgr.changeState(StateID_WaitInvalid); } else if (mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].isStop2()) { mLyt.calc(); mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].unbind(); } } void dLytMapPopupInfo_c::finalizeState_Wait() {} void dLytMapPopupInfo_c::initializeState_WaitInvalid() {} void dLytMapPopupInfo_c::executeState_WaitInvalid() { if (!dLytMsgWindow_c::getInstance()->isVisible()) { mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].bind(false); mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].setBackward(); mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].setToStart(); mStateMgr.changeState(StateID_Wait); } else if (mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].isStop2()) { mLyt.calc(); mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].unbind(); } } void dLytMapPopupInfo_c::finalizeState_WaitInvalid() {} void dLytMapPopupInfo_c::initializeState_Out() { mAnmGroups[MAP_POPUP_INFO_ANIM_OUT].bind(false); } void dLytMapPopupInfo_c::executeState_Out() { if (mAnmGroups[MAP_POPUP_INFO_ANIM_OUT].isEndReached()) { mLyt.calc(); mAnmGroups[MAP_POPUP_INFO_ANIM_OUT].unbind(); } } void dLytMapPopupInfo_c::finalizeState_Out() {} static const d2d::LytBrlanMapping sMapPopupInfoBrlanMap[] = { { "mapPopupInfo_00_in.brlan", "G_inOut_00"}, { "mapPopupInfo_00_out.brlan", "G_inOut_00"}, {"mapPopupInfo_00_inPut.brlan", "G_input_00"}, }; void dLytMapPopupInfo_c::build(d2d::ResAccIf_c *resAcc) { mLyt.setResAcc(resAcc); mLyt.build("mapPopupInfo_00.brlyt", nullptr); for (int i = 0; i < MAP_POPUP_INFO_NUM_ANIMS; i++) { mAnmGroups[i].init(sMapPopupInfoBrlanMap[i].mFile, resAcc, mLyt.getLayout(), sMapPopupInfoBrlanMap[i].mName); } mStateMgr.changeState(StateID_Invisible); } void dLytMapPopupInfo_c::remove() { for (int i = 0; i < MAP_POPUP_INFO_NUM_ANIMS; i++) { mAnmGroups[i].remove(); } } void dLytMapPopupInfo_c::execute() { mStateMgr.executeState(); mLyt.calc(); for (int i = 0; i < MAP_POPUP_INFO_NUM_ANIMS; i++) { if (mAnmGroups[i].isBound()) { mAnmGroups[i].play(); } } } void dLytMapPopupInfo_c::draw() { mLyt.draw(); } #define MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT 0 #define MAP_SAVE_POPUP_ACTION_ANIM_INPUT 1 #define MAP_SAVE_POPUP_ACTION_NUM_ANIMS 2 void dLytMapSavePopupAction_c::initializeState_Invisible() {} void dLytMapSavePopupAction_c::executeState_Invisible() { if (mInRequest) { mStateMgr.changeState(StateID_In); } } void dLytMapSavePopupAction_c::finalizeState_Invisible() {} void dLytMapSavePopupAction_c::initializeState_In() { // TODO - explain why this seems unnecessarily complicated mpAnmGroupInOut->bind(false); mpAnmGroupInOut->setForward(); mpAnmGroupInOut->setToStart(); mInOutFrame = mpAnmGroupInOut->getFrame(); mpAnmGroupInOut->unbind(); } void dLytMapSavePopupAction_c::executeState_In() { // TODO - explain why this seems unnecessarily complicated mpAnmGroupInOut->bind(false); mpAnmGroupInOut->setFrame(mInOutFrame); mpAnmGroupInOut->play(); if (mpAnmGroupInOut->isEndReached()) { mStateMgr.changeState(StateID_Wait); } mInOutFrame = mpAnmGroupInOut->getFrame(); mpAnmGroupInOut->unbind(); } void dLytMapSavePopupAction_c::finalizeState_In() {} void dLytMapSavePopupAction_c::initializeState_Wait() {} void dLytMapSavePopupAction_c::executeState_Wait() { if (!mInRequest) { mStateMgr.changeState(StateID_Out); } } void dLytMapSavePopupAction_c::finalizeState_Wait() {} void dLytMapSavePopupAction_c::initializeState_Out() { // TODO - explain why this seems unnecessarily complicated mpAnmGroupInOut->bind(false); mpAnmGroupInOut->setBackward(); mpAnmGroupInOut->setToStart(); mInOutFrame = mpAnmGroupInOut->getFrame(); mpAnmGroupInOut->unbind(); } void dLytMapSavePopupAction_c::executeState_Out() { // TODO - explain why this seems unnecessarily complicated mpAnmGroupInOut->bind(false); mpAnmGroupInOut->setBackward(); mpAnmGroupInOut->setFrame(mInOutFrame); mpAnmGroupInOut->play(); if (mpAnmGroupInOut->isStop2()) { mStateMgr.changeState(StateID_Wait); } mInOutFrame = mpAnmGroupInOut->getFrame(); mpAnmGroupInOut->unbind(); } void dLytMapSavePopupAction_c::finalizeState_Out() {} void dLytMapSavePopupAction_c::execute() { mStateMgr.executeState(); } void dLytMapSavePopupAction_c::init(d2d::AnmGroup_c *pGroups) { mpAnmGroupInOut = &pGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT]; mpAnmGroupInput = &pGroups[MAP_SAVE_POPUP_ACTION_ANIM_INPUT]; } void dLytMapSavePopupAction_c::hide() { mpAnmGroupInOut->bind(false); mpAnmGroupInOut->setFrame(0.0f); mpAnmGroupInOut->unbind(); mStateMgr.changeState(StateID_Invisible); } static const d2d::LytBrlanMapping sMapSavePopupActionBrlanMap[] = { {"mapPopup_00_inOut.brlan", "G_inOut_00"}, {"mapPopup_00_scale.brlan", "G_scale_00"}, }; void dLytMapSavePopup_c::build(d2d::ResAccIf_c *resAcc) { mLyt.setResAcc(resAcc); mLyt.build("mapPopup_00.brlyt", nullptr); for (int i = 0; i < MAP_SAVE_POPUP_ACTION_NUM_ANIMS; i++) { mAnmGroups[i].init( sMapSavePopupActionBrlanMap[i].mFile, resAcc, mLyt.getLayout(), sMapSavePopupActionBrlanMap[i].mName ); } for (int i = 0; i < (int)ARRAY_LENGTH(mActions); i++) { mActions[i].init(mAnmGroups); mActions[i].mStateMgr.changeState(dLytMapSavePopupAction_c::StateID_Invisible); } } void dLytMapSavePopup_c::remove() { for (int i = 0; i < MAP_SAVE_POPUP_ACTION_NUM_ANIMS; i++) { mAnmGroups[i].remove(); } } void dLytMapSavePopup_c::execute() { for (int i = 0; i < mStatueNum; i++) { mActions[i].mInRequest = mCurrentlyInStatue == i; } for (int i = 0; i < mStatueNum; i++) { mActions[i].execute(); } } void dLytMapSavePopup_c::draw() { nw4r::lyt::Bounding *pBounding; f32 scaleX = mLyt.getDrawInfo().GetLocationAdjustScale().x; nw4r::lyt::Pane *rootPane = mLyt.getLayout()->GetRootPane(); for (int i = 0; i < mStatueNum; i++) { const sStateIDIf_c *stateID = mActions[i].mStateMgr.getStateID(); if (*stateID != dLytMapSavePopupAction_c::StateID_Invisible) { pBounding = mpStatueBoundings[i]; mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_INPUT].bind(false); mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_INPUT].setFrame(30.0f); const dMapSaveObjDefinition *def = dLytMap_c::GetInstance()->getSaveObjDefinition(i); f32 width = setStatueLabel(def->statueLabel); f32 allScaleX = mLyt.findPane("N_all_00")->GetScale().x; // TODO fadds regswap f32 x = pBounding->GetGlobalMtx()._03 + (0.5f * width * allScaleX * scaleX) + sHio.field_0x04; f32 y = pBounding->GetGlobalMtx()._13; mVec2_c translate2d(x, y); mVec3_c translate = vec2ToVec3XY(translate2d); rootPane->SetTranslate(translate); if (*stateID == dLytMapSavePopupAction_c::StateID_In) { mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].bind(false); mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].setFrame(mActions[i].mInOutFrame); mLyt.calc(); mLyt.draw(); mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].unbind(); } else if (*stateID == dLytMapSavePopupAction_c::StateID_Wait) { mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].bind(false); mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].setToEnd(); mLyt.calc(); mLyt.draw(); mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].unbind(); } else if (*stateID == dLytMapSavePopupAction_c::StateID_Out) { mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].bind(false); mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].setBackward(); mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].setFrame(mActions[i].mInOutFrame); mLyt.calc(); mLyt.draw(); mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].unbind(); } mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_INPUT].unbind(); } } } void dLytMapSavePopup_c::set(nw4r::lyt::Bounding **pStatueBoundings, s32 count) { mpStatueBoundings = pStatueBoundings; mStatueNum = count; } f32 dLytMapSavePopup_c::setStatueLabel(const char *label) { static const char *sTPopupS = "T_popupS_00"; static const char *sTPopup = "T_popup_00"; static const char *sBg = "W_bgP_00"; dTextBox_c *textBox; textBox = mLyt.getTextBox(sTPopupS); textBox->setMessageWithGlobalTextProcessor2(label, nullptr); textBox->GetLineWidth(nullptr); textBox = mLyt.getTextBox(sTPopup); textBox->setMessageWithGlobalTextProcessor2(label, nullptr); dWindow_c *w = mLyt.getWindow(sBg); w->UpdateSize(textBox, 60.0f); return w->GetSize().width; } void dLytMapSavePopup_c::hide(s32 statueIdx) { mActions[statueIdx].hide(); } #define MAP_SAVE_CAPTION_ANIM_TYPE 0 #define MAP_SAVE_CAPTION_ANIM_TEXTLINE 1 #define MAP_SAVE_CAPTION_ANIM_IN 2 #define MAP_SAVE_CAPTION_ANIM_LOOP 3 #define MAP_SAVE_CAPTION_ANIM_OUT 4 #define MAP_SAVE_CAPTION_NUM_ANIMS 5 void dLytMapSaveCaption_c::initializeState_Invisible() {} void dLytMapSaveCaption_c::executeState_Invisible() {} void dLytMapSaveCaption_c::finalizeState_Invisible() {} void dLytMapSaveCaption_c::initializeState_In() { mAnmGroups[MAP_SAVE_CAPTION_ANIM_IN].bind(false); mAnmGroups[MAP_SAVE_CAPTION_ANIM_IN].setFrame(0.0f); mAnmGroups[MAP_SAVE_CAPTION_ANIM_LOOP].bind(false); mAnmGroups[MAP_SAVE_CAPTION_ANIM_LOOP].setFrame(0.0f); mLyt.getLayout()->Animate(0); mLyt.calc(); mAnmGroups[MAP_SAVE_CAPTION_ANIM_LOOP].unbind(); } void dLytMapSaveCaption_c::executeState_In() { if (mAnmGroups[MAP_SAVE_CAPTION_ANIM_IN].isEndReached()) { mAnmGroups[MAP_SAVE_CAPTION_ANIM_LOOP].bind(false); mLyt.calc(); mAnmGroups[MAP_SAVE_CAPTION_ANIM_IN].unbind(); mStateMgr.changeState(StateID_In); } } void dLytMapSaveCaption_c::finalizeState_In() {} void dLytMapSaveCaption_c::initializeState_Wait() {} void dLytMapSaveCaption_c::executeState_Wait() {} void dLytMapSaveCaption_c::finalizeState_Wait() {} void dLytMapSaveCaption_c::initializeState_Out() { mAnmGroups[MAP_SAVE_CAPTION_ANIM_OUT].bind(false); mAnmGroups[MAP_SAVE_CAPTION_ANIM_OUT].setFrame(0.0f); } void dLytMapSaveCaption_c::executeState_Out() { if (mAnmGroups[MAP_SAVE_CAPTION_ANIM_OUT].isEndReached()) { mLyt.calc(); mAnmGroups[MAP_SAVE_CAPTION_ANIM_OUT].unbind(); mAnmGroups[MAP_SAVE_CAPTION_ANIM_LOOP].unbind(); mStateMgr.changeState(StateID_Invisible); } } void dLytMapSaveCaption_c::finalizeState_Out() {} static const d2d::LytBrlanMapping sMapSaveCaptionBrlanMap[] = { { "mapSaveCaption_00_type.brlan", "G_type_00"}, {"mapSaveCaption_00_textLine.brlan", "G_textLine_00"}, { "mapSaveCaption_00_in.brlan", "G__inOut_00"}, { "mapSaveCaption_00_loop.brlan", "G_loop_00"}, { "mapSaveCaption_00_out.brlan", "G__inOut_00"}, }; void dLytMapSaveCaption_c::build(d2d::ResAccIf_c *resAcc) { mLyt.setResAcc(resAcc); mLyt.build("mapSaveCaption_00.brlyt", nullptr); for (int i = 0; i < MAP_SAVE_CAPTION_NUM_ANIMS; i++) { mAnmGroups[i].init( sMapSaveCaptionBrlanMap[i].mFile, resAcc, mLyt.getLayout(), sMapSaveCaptionBrlanMap[i].mName ); } mStateMgr.changeState(StateID_Invisible); } void dLytMapSaveCaption_c::remove() { for (int i = 0; i < MAP_SAVE_CAPTION_NUM_ANIMS; i++) { mAnmGroups[i].remove(); } } void dLytMapSaveCaption_c::execute() { mStateMgr.executeState(); for (int i = 0; i < MAP_SAVE_CAPTION_NUM_ANIMS; i++) { if (mAnmGroups[i].isBound()) { mAnmGroups[i].play(); } } mLyt.calc(); } void dLytMapSaveCaption_c::draw() { if (*mStateMgr.getStateID() != StateID_Invisible) { mLyt.draw(); } } void dLytMapSaveCaption_c::setType(s32 type) { mAnmGroups[MAP_SAVE_CAPTION_ANIM_TYPE].bind(false); mAnmGroups[MAP_SAVE_CAPTION_ANIM_TYPE].setFrame(type); mLyt.getLayout()->Animate(0); mLyt.calc(); mAnmGroups[MAP_SAVE_CAPTION_ANIM_TYPE].unbind(); } void dLytMapSaveCaption_c::setLabel(const char *label) { mLyt.getTextBox("T_captionS_00")->setMessageWithGlobalTextProcessor2(label, nullptr); mLyt.getTextBox("T_caption_00")->setMessageWithGlobalTextProcessor2(label, nullptr); // ok const char *tmp = "T_captionS_00"; dTextBox_c *box = mLyt.getTextBox(tmp); // Setting message twice... box->setMessageWithGlobalTextProcessor2(label, nullptr); f32 width = box->GetLineWidth(nullptr); const wchar_t *text = dMessage_c::getTextMessageByLabel(label, true, nullptr, 0); s32 lines = box->calcTextLines(text, dMessage_c::getGlobalTagProcessor()); mAnmGroups[MAP_SAVE_CAPTION_ANIM_TEXTLINE].bind(false); if (width < 226.0f) { if (lines == 1) { mAnmGroups[MAP_SAVE_CAPTION_ANIM_TEXTLINE].setFrame(0.0f); } else { mAnmGroups[MAP_SAVE_CAPTION_ANIM_TEXTLINE].setFrame(1.0f); } } else { if (lines == 1) { mAnmGroups[MAP_SAVE_CAPTION_ANIM_TEXTLINE].setFrame(2.0f); } else { mAnmGroups[MAP_SAVE_CAPTION_ANIM_TEXTLINE].setFrame(3.0f); } } mLyt.getLayout()->Animate(0); mLyt.calc(); mAnmGroups[MAP_SAVE_CAPTION_ANIM_TEXTLINE].unbind(); } #define MAP_SAVE_OBJ_ANIM_ON_OFF 0 #define MAP_SAVE_OBJ_ANIM_DECIDE 1 #define MAP_SAVE_OBJ_ANIM_LOOP 2 #define MAP_SAVE_OBJ_NUM_ANIMS 3 void dLytMapSaveObj_c::initializeState_Wait() {} void dLytMapSaveObj_c::executeState_Wait() { if (mSelectRequest) { mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].bind(false); mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].setForward(); mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].setFrame(0.0f); mStateMgr.changeState(StateID_ToSelect); } } void dLytMapSaveObj_c::finalizeState_Wait() {} void dLytMapSaveObj_c::initializeState_ToSelect() {} void dLytMapSaveObj_c::executeState_ToSelect() { if (mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].isEndReached()) { dRumble_c::start(dRumble_c::sRumblePreset1, dRumble_c::FLAG_SLOT0); dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_POINT_START_POINT); mLyt.calc(); mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].unbind(); mStateMgr.changeState(StateID_Select); } if (mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].isBound()) { mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].play(); } } void dLytMapSaveObj_c::finalizeState_ToSelect() {} void dLytMapSaveObj_c::initializeState_Select() {} void dLytMapSaveObj_c::executeState_Select() { if (!mSelectRequest) { mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].bind(false); mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].setBackward(); mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].setToStart(); mDecideRequest = false; mStateMgr.changeState(StateID_ToWait); } else if (mDecideRequest) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_DECIDE_START_POINT); mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].bind(false); mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].setFrame(0.0f); mStateMgr.changeState(StateID_Decide); } } void dLytMapSaveObj_c::finalizeState_Select() {} void dLytMapSaveObj_c::initializeState_ToWait() {} void dLytMapSaveObj_c::executeState_ToWait() { if (mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].isStop2()) { mLyt.calc(); mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].unbind(); mStateMgr.changeState(StateID_Select); } if (mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].isBound()) { mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].play(); } } void dLytMapSaveObj_c::finalizeState_ToWait() {} void dLytMapSaveObj_c::initializeState_Decide() {} void dLytMapSaveObj_c::executeState_Decide() { if (mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].isEndReached()) { mLyt.calc(); mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].unbind(); mDecideFinished = true; } if (mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].isBound()) { mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].play(); } } void dLytMapSaveObj_c::finalizeState_Decide() {} void dLytMapSaveObj_c::setPosition(const mVec3_c &position) { mLyt.getLayout()->GetRootPane()->SetTranslate(position); } void dLytMapSaveObj_c::setAlpha(u8 alpha) { mLyt.getLayout()->GetRootPane()->SetAlpha(alpha); } void dLytMapSaveObj_c::init() { mSelectRequest = false; mDecideRequest = false; mDecideFinished = false; mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].bind(false); mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].setFrame(0.0f); mLyt.calc(); mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].unbind(); mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].setFrame(0.0f); mAnmGroups[MAP_SAVE_OBJ_ANIM_LOOP].bind(false); mStateMgr.changeState(StateID_Wait); } static const d2d::LytBrlanMapping sMapSaveObjBrlanMap[] = { { "mapSaveObj_00_saveObjOnOff.brlan", "G_saveBtn_00"}, {"mapSaveObj_00_saveObjDecide.brlan", "G_saveBtn_00"}, { "mapSaveObj_00_saveObjLoop.brlan", "G_saveBtnLoop_00"}, }; void dLytMapSaveObj_c::build(d2d::ResAccIf_c *resAcc) { mLyt.setResAcc(resAcc); mLyt.build("mapSaveObj_00.brlyt", nullptr); for (int i = 0; i < MAP_SAVE_OBJ_NUM_ANIMS; i++) { mAnmGroups[i].init(sMapSaveObjBrlanMap[i].mFile, resAcc, mLyt.getLayout(), sMapSaveObjBrlanMap[i].mName); } mLyt.getLayout()->GetRootPane()->SetInfluencedAlpha(true); mAnmGroups[MAP_SAVE_CAPTION_ANIM_IN].bind(false); mAnmGroups[MAP_SAVE_CAPTION_ANIM_IN].setFrame(0.0f); mLyt.calc(); mStateMgr.changeState(StateID_Wait); } void dLytMapSaveObj_c::remove() { for (int i = 0; i < MAP_SAVE_OBJ_NUM_ANIMS; i++) { mAnmGroups[i].remove(); } } void dLytMapSaveObj_c::execute() { mStateMgr.executeState(); if (mAnmGroups[MAP_SAVE_OBJ_ANIM_LOOP].isBound()) { mAnmGroups[MAP_SAVE_OBJ_ANIM_LOOP].play(); } } void dLytMapSaveObj_c::draw() { nw4r::lyt::Pane *root = mLyt.getLayout()->GetRootPane(); // @bug calc should be in execute... mLyt.calc(); root->Draw(mLyt.getDrawInfo()); } #pragma dont_inline on dLytMapMain_c::dLytMapMain_c() : mStateMgr(*this), mFlowMgr(&mFlow), mFloorBtnMgr(&mGlobal), mFootPrints(&mGlobal), mAreaGroup(0), mMapUpDirectionAfterZoomToDetail(true), field_0x8C93(0), mMapEvent(MAP_EVENT_NONE), mNextMapEvent(MAP_EVENT_NONE), field_0x8CAC(0), field_0x8D38(0.0f, 0.0f), field_0x8D40(1.0f), field_0x8D44(0), field_0x8D46(0), field_0x8D48(0), field_0x8D4C(0.0f), field_0x8D50(0.0f), field_0x8D58(0), field_0x8D5C(1), field_0x8D60(0), field_0x8D64(0), field_0x8D68(0), field_0x8D6A(0), field_0x8D6B(0), mpRegionPane1(nullptr), mpRegionPane2(nullptr), field_0x8DB0(0), mNavEnabled(false), mDrawScaleFrame(false), mDisplayedBeaconCount(0), mShowIslandNames(false), field_0x8DBD(0), field_0x8DBE(0), field_0x8DBF(0), field_0x8DC0(-1), field_0x8DC4(0) { field_0x8D78 = 0.0f; field_0x8D7C = 0.0f; field_0x8D80 = 0.0f; field_0x8D84 = 0.0f; field_0x8D88 = 0.0f; } #pragma dont_inline reset dLytMapMain_c::~dLytMapMain_c() { for (int i = 0; i < (int)ARRAY_LENGTH(mHitChecks); i++) { if (dCsMgr_c::GetInstance()->isRegist(&mHitChecks[i])) { dCsMgr_c::GetInstance()->unregistCursorTarget(&mHitChecks[i]); } } } dLytMapGlobal_c *dLytMapMain_c::getGlobal() { return &mGlobal; } dMapSavedData dLytMapMain_c::sSavedMapData = { { {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, }, false }; const dMapSavedData dLytMapMain_c::sDefaultMapData = { { {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, }, false }; static const char *const sTextboxLabelMapping[][2] = { { "T_sNameS_00", "MAP_00"}, { "T_sName_00", "MAP_00"}, { "T_pNameS_00", "MAP_01"}, { "T_pName_00", "MAP_01"}, { "T_pNameS_01", "MAP_01"}, { "T_fNameS_00", "MAP_02"}, { "T_fName_00", "MAP_02"}, { "T_fNameS_01", "MAP_02"}, { "T_nFnameS_00", "MAP_03"}, { "T_nFname_00", "MAP_03"}, { "T_nFnameS_01", "MAP_03"}, { "T_lNameS_00", "MAP_04"}, { "T_lName_00", "MAP_04"}, { "T_lNameS_01", "MAP_04"}, { "T_sVnameS_00", "MAP_05"}, { "T_sVname_00", "MAP_05"}, { "T_sVnameS_01", "MAP_05"}, { "T_nVnameS_00", "MAP_06"}, { "T_nVname_00", "MAP_06"}, { "T_nVnameS_01", "MAP_06"}, { "T_dNameS_01", "MAP_08"}, { "T_dName_01", "MAP_08"}, { "T_dNameS_00", "MAP_08"}, { "T_dNameS_02", "MAP_07"}, { "T_dName_02", "MAP_07"}, { "T_dNameS_03", "MAP_07"}, { "T_gNameS_01", "MAP_10"}, { "T_gName_01", "MAP_10"}, { "T_gNameS_04", "MAP_10"}, { "T_gNameS_00", "MAP_09"}, { "T_gName_00", "MAP_09"}, { "T_gNameS_03", "MAP_09"}, { "T_gNameS_02", "MAP_40"}, { "T_gName_02", "MAP_40"}, { "T_gNameS_05", "MAP_40"}, { "T_lastDs_00", "MAP_17"}, { "T_lastD_00", "MAP_17"}, { "T_pampkinNS_00", "MAP_27"}, { "T_pampkinN_00", "MAP_27"}, { "T_teryNS_00", "MAP_28"}, { "T_teryN_00", "MAP_28"}, { "T_tikurinNS_00", "MAP_29"}, { "T_tikurinN_00", "MAP_29"}, { "T_musiNS_00", "MAP_31"}, { "T_musiN_00", "MAP_31"}, { "T_utaNS_00", "MAP_30"}, { "T_utaN_00", "MAP_30"}, { "T_ruretouNS_00", "MAP_26"}, { "T_ruretouN_00", "MAP_26"}, { "T_toForestS_00", "MAP_58"}, { "T_toForest_00", "MAP_58"}, {"T_toVolcanoS_00", "MAP_59"}, { "T_toVolcano_00", "MAP_59"}, { "T_toDesertS_00", "MAP_60"}, { "T_toDesert_00", "MAP_60"}, { "T_fD1s_00", "MAP_11"}, { "T_fD1_00", "MAP_11"}, { "T_fD2s_00", "MAP_14"}, { "T_fD2_00", "MAP_14"}, { "T_vD2s_00", "MAP_16"}, { "T_vD2_00", "MAP_16"}, { "T_vD1s_00", "MAP_12"}, { "T_vD1_00", "MAP_12"}, { "T_dD1s_00", "MAP_13"}, { "T_dD1_00", "MAP_13"}, { "T_dD2s_00", "MAP_15"}, { "T_dD2_00", "MAP_15"}, { "T_lastDs_00", "MAP_17"}, { "T_lastD_00", "MAP_17"}, }; static const char *sHyliasRealmMapLabel = "MAP_64"; void dLytMapMain_c::loadTextboxes() { bool hyliasRealm = dScGame_c::isCurrentStage("F403") || dScGame_c::isCurrentStage("F404"); for (int i = 0; i < (int)ARRAY_LENGTH(sTextboxLabelMapping); i++) { dTextBox_c *box = mLyt.getTextBox(sTextboxLabelMapping[i][0]); if (hyliasRealm && (i == 2 || i == 3 || i == 4)) { // Replace "Sealed Grounds" with "Hylia's Realm" box->setMessageWithGlobalTextProcessor2(sHyliasRealmMapLabel, nullptr); } else { box->setMessageWithGlobalTextProcessor2(sTextboxLabelMapping[i][1], nullptr); } } } static const d2d::LytBrlanMapping sMapMainBrlanMap[] = { { "map_00_in.brlan", "G_inOut_00"}, { "map_00_titleOnOff.brlan", "G_titleOnOff_00"}, { "map_00_nOnOff.brlan", "G_nOnOff_00"}, { "map_00_mapV.brlan", "G_mapV_00"}, { "map_00_worldState.brlan", "G_worldState"}, { "map_00_player2patten.brlan", "G_2Pattern_00"}, { "map_00_rotate.brlan", "G_rotate_00"}, { "map_00_out.brlan", "G_inOut_00"}, { "map_00_mapDraw.brlan", "G_plainC_00"}, { "map_00_mapDraw.brlan", "G_forestC_00"}, { "map_00_mapDraw.brlan", "G_nForestC_00"}, { "map_00_mapDraw.brlan", "G_sVolcanoC_00"}, { "map_00_mapDraw.brlan", "G_mineC_00"}, { "map_00_mapDraw.brlan", "G_desertC_00"}, { "map_00_mapDraw.brlan", "G_lakeC_00"}, { "map_00_mapDraw.brlan", "G_glenC_00"}, { "map_00_mapDraw.brlan", "G_seaC_00"}, { "map_00_mapDraw.brlan", "G_nVolcanoC_00"}, { "map_00_mapDraw.brlan", "G_glenC_01"}, { "map_00_skyLoftUpDown.brlan", "G_skyloftUD_00"}, {"map_00_LinkPositionLight.brlan", "G_linkPointL_00"}, { "map_00_mapZinForest.brlan", "G_ZoomInOut_00"}, { "map_00_zoomWakuIn.brlan", "G_zoomWaku_00"}, { "map_00_zoomWakuOut.brlan", "G_zoomWaku_00"}, { "map_00_mapZoutForest.brlan", "G_ZoomInOut_00"}, { "map_00_mapZinPlant.brlan", "G_ZoomInOut_00"}, { "map_00_mapZaOutPlant.brlan", "G_ZoomInOut_00"}, { "map_00_mapZaInPlant.brlan", "G_ZoomInOut_00"}, { "map_00_mapZoutPlant.brlan", "G_ZoomInOut_00"}, { "map_00_mapZinDesert.brlan", "G_ZoomInOut_00"}, { "map_00_mapZoutDesert.brlan", "G_ZoomInOut_00"}, { "map_00_mapZinVolcano.brlan", "G_ZoomInOut_00"}, { "map_00_mapZoutVolcano.brlan", "G_ZoomInOut_00"}, { "map_00_mapZaOutForest.brlan", "G_ZoomInOut_00"}, { "map_00_mapZaOutDesert.brlan", "G_ZoomInOut_00"}, { "map_00_mapZaOutVolcano.brlan", "G_ZoomInOut_00"}, { "map_00_mapZaInForest.brlan", "G_ZoomInOut_00"}, { "map_00_mapZaInDesert.brlan", "G_ZoomInOut_00"}, { "map_00_mapZaInVolcano.brlan", "G_ZoomInOut_00"}, { "map_00_mapZaInSkyMap.brlan", "G_ZoomInOut_00"}, { "map_00_mapZaOutSkyMap.brlan", "G_ZoomInOut_00"}, { "map_00_mapZaInSkyMap2.brlan", "G_ZoomInOut_00"}, { "map_00_mapZaOutSkyMap2.brlan", "G_ZoomInOut_00"}, { "map_00_mapZaInSkyCorse.brlan", "G_ZoomInOut_00"}, { "map_00_mapZaOutSkyCorse.brlan", "G_ZoomInOut_00"}, { "map_00_sunRote.brlan", "G_sun_00"}, { "map_00_inNoCam.brlan", "G_inOut_00"}, { "map_00_outNoCam.brlan", "G_inOut_00"}, { "map_00_cloudLoop.brlan", "G_cloudLoop_00"}, { "map_00_lightLoop.brlan", "G_lightLoop_00"}, { "map_00_nushiLoop.brlan", "G_nushiLoop_00"}, { "map_00_type.brlan", "G_type_00"}, { "map_00_kumoPattern.brlan", "G_kumoPattern_00"}, { "map_00_titleLine.brlan", "G_textLine_00"}, }; #define MAP_MAIN_ANIM_IN 0 #define MAP_MAIN_ANIM_TITLE_ON_OFF 1 #define MAP_MAIN_ANIM_N_ON_OFF 2 #define MAP_MAIN_ANIM_MAP_V 3 #define MAP_MAIN_ANIM_WORLD_STATE 4 #define MAP_MAIN_ANIM_PLAYER_2_PATTERN 5 #define MAP_MAIN_ANIM_ROTATE 6 #define MAP_MAIN_ANIM_OUT 7 #define MAP_MAIN_ANIM_DRAW_PLAIN 8 #define MAP_MAIN_ANIM_DRAW_FOREST 9 #define MAP_MAIN_ANIM_DRAW_N_FOREST 10 #define MAP_MAIN_ANIM_DRAW_S_VOLCANO 11 #define MAP_MAIN_ANIM_DRAW_MINE 12 #define MAP_MAIN_ANIM_DRAW_DESERT 13 #define MAP_MAIN_ANIM_DRAW_LAKE 14 #define MAP_MAIN_ANIM_DRAW_GLEN_00 15 #define MAP_MAIN_ANIM_DRAW_SEA 16 #define MAP_MAIN_ANIM_DRAW_N_VOLCANO 17 #define MAP_MAIN_ANIM_DRAW_GLEN_01 18 #define MAP_MAIN_ANIM_SKYLOFT_UP_DOWN 19 #define MAP_MAIN_ANIM_LINK_POSITION_LIGHT 20 #define MAP_MAIN_ANIM_MAP_Z_IN_FOREST 21 #define MAP_MAIN_ANIM_MAP_Z_WAKU_IN 22 #define MAP_MAIN_ANIM_MAP_Z_IN_PLANT 25 #define MAP_MAIN_ANIM_MAP_ZA_IN_PLANT 27 #define MAP_MAIN_ANIM_MAP_Z_IN_DESERT 29 #define MAP_MAIN_ANIM_MAP_Z_IN_VOLCANO 31 #define MAP_MAIN_ANIM_MAP_ZA_IN_FOREST 36 #define MAP_MAIN_ANIM_MAP_ZA_IN_DESERT 37 #define MAP_MAIN_ANIM_MAP_ZA_IN_VOLCANO 38 #define MAP_MAIN_ANIM_MAP_ZA_IN_SKY_MAP_2 41 #define MAP_MAIN_ANIM_MAP_ZA_OUT_SKY_COURSE 44 #define MAP_MAIN_ANIM_SUN_ROTE 45 #define MAP_MAIN_ANIM_IN_NO_CAM 46 #define MAP_MAIN_ANIM_OUT_NO_CAM 47 #define MAP_MAIN_ANIM_CLOUD_LOOP 48 #define MAP_MAIN_ANIM_LIGHT_LOOP 49 #define MAP_MAIN_ANIM_NUSHI_LOOP 50 #define MAP_MAIN_ANIM_TYPE 51 #define MAP_MAIN_ANIM_KUMO_PATTERN 52 #define MAP_MAIN_ANIM_TITE_LINE 53 #define MAP_MAIN_NUM_ANIMS 54 static const char *sGroupName = "G_ref_00"; static const char *sBoundingNames[] = { "B_noroshi_00", "B_houkoul_00", "B_remoCon_00", "B_nunchaku_00", "B_tittle_00", "B_saveIcon_00", "B_saveIcon_01", "B_saveIcon_02", "B_saveIcon_03", "B_saveIcon_04", "B_saveIcon_05", "B_saveIcon_06", "B_saveIcon_07", "B_saveIcon_08", "B_saveIcon_28", "B_saveIcon_10", "B_saveIcon_11", "B_saveIcon_12", "B_saveIcon_13", "B_saveIcon_14", "B_saveIcon_15", "B_saveIcon_16", "B_saveIcon_17", "B_saveIcon_18", "B_saveIcon_19", "B_saveIcon_20", "B_saveIcon_21", "B_saveIcon_22", "B_saveIcon_23", "B_saveIcon_24", "B_saveIcon_25", "B_saveIcon_26", "B_saveIcon_27", }; #define MAP_MAIN_NUM_BOUNDINGS_NORMAL 5 #define MAP_MAIN_OFFSET_BOUNDINGS_SAVEICON 5 #define MAP_MAIN_NUM_BOUNDINGS_SAVEICON 28 #define MAP_MAIN_NUM_BOUNDINGS 33 static const char *sPaneNames[] = { "N_pName_00", "N_fName_00", "N_nFname_00", "N_sVname_00", "N_dName_02", "N_dName_00", "N_lName_00", "N_gName_02", "N_gName_01", "N_nVname_00", "N_gName_00", }; static const char *sDungeonPaneNames[] = { "N_fD1_00", "N_vD1_00", "N_dD1_00", "N_fD2_00", "N_dD2_00", "N_vD2_00", "N_lastD_00", }; static const char *sDungeonPicNames[] = { "P_fD1_00", "P_vD1_00", "P_dD1_00", "P_fD2_00", "P_dD2_00", "P_vD2_00", "P_lastD_00", }; static const char *sPriorityGroupNames[] = { "G_priority_00", "G_priority_02", }; void dLytMapMain_c::build() { field_0x8DBF = 0; field_0x8DB0 = 0; if (dScGame_c::isCurrentStage("F102")) { // awesome but unnecessary field_0x8DB0 = 0; } dStage_c::GetInstance()->fn_801B3F20(); d2d::ResAccIf_c *resAcc = dLytMap_c::getResAcc(); mLyt.setResAcc(resAcc); mLyt.build("map_00.brlyt", nullptr); getGlobal()->setField_0x28(mLyt.getDrawInfo().GetLocationAdjustScale()); for (int i = 0; i < MAP_MAIN_NUM_ANIMS; i++) { mAnmGroups[i].init(sMapMainBrlanMap[i].mFile, resAcc, mLyt.getLayout(), sMapMainBrlanMap[i].mName); } mFloorBtnMgr.build(resAcc); mSubpane.mpLytPane = &mFloorBtnMgr; mSubpaneList.PushBack(&mSubpane); d2d::dSubPane::linkMeters(mLyt.getLayout()->GetGroupContainer()->FindGroupByName(sGroupName), &mSubpaneList); mFootPrints.build(resAcc); mMarkers.build(resAcc); mPinIconAggregate.build(resAcc); mPutIcon.build(resAcc); for (int i = 0; i < (int)ARRAY_LENGTH(mSaveObjs); i++) { mSaveObjs[i].build(resAcc); } mSaveCaption.build(resAcc); mSavePopup.build(resAcc); mPopupInfo.build(resAcc); mAnmGroups[MAP_MAIN_ANIM_IN].bind(false); mAnmGroups[MAP_MAIN_ANIM_IN].setToEnd(); mLyt.calc(); for (int i = 0; i < (int)ARRAY_LENGTH(sBoundingNames); i++) { nw4r::lyt::Bounding *b = mLyt.findBounding(sBoundingNames[i]); b->SetVisible(false); // TODO - bird statues if (i >= 5 && i < 15) { mpSaveObjBoundingsFaron[i - 5] = b; } else if (i >= 15 && i < 21) { mpSaveObjBoundingsEldin[i - 15] = b; } else if (i >= 21 && i < 33) { mpSaveObjBoundingsLanayru[i - 21] = b; } mHitChecks[i].init(b, 0x02, 2, 0); dCsMgr_c::GetInstance()->registCursorTarget(&mHitChecks[i]); } for (int i = 0; i < (int)ARRAY_LENGTH(sBoundingNames); i++) { mHitChecks[i].resetCachedHitboxes(); mHitChecks[i].execute(); } mpMapBounding = mLyt.findBounding("B_map_00"); nw4r::lyt::Size t(1.0f, 1.0f); mpMapBounding->SetSize(t); mVec3_c boundingPos = mpMapBounding->GetTranslate(); mVec2_c boundingPos2 = mVec2_c(boundingPos.x, boundingPos.y); dLytMapGlobal_c *global = getGlobal(); global->setField_0x20(boundingPos2); mMapCapture.setPicture(mLyt.findPicture("P_map_00")); nw4r::lyt::Pane *limitBounding = mLyt.findPane("B_limit_00"); const nw4r::lyt::Size &sz = limitBounding->GetSize(); field_0x8D30.x = sz.width - 1.0f; field_0x8D30.y = sz.height - 1.0f; field_0x8D38.x = sz.width; field_0x8D38.y = sz.height; field_0x8D38.x *= mLyt.getDrawInfo().GetLocationAdjustScale().x; mpAllPane = mLyt.findPane("N_all_00"); mpNoroshiPane = mLyt.findPane("N_noroshi_00"); mpScaleFramePane = mLyt.findPane("N_scaleFlame_00"); mpWakuWindow = mLyt.getWindow("W_waku_01"); for (int i = 0; i < (int)ARRAY_LENGTH(sPaneNames); i++) { if (sPaneNames[i] != nullptr) { mpPanes[i] = mLyt.findPane(sPaneNames[i]); } else { mpPanes[i] = nullptr; } } for (int i = 0; i < (int)ARRAY_LENGTH(sDungeonPaneNames); i++) { if (sDungeonPaneNames[i] != nullptr) { mpDungeonPanes[i] = mLyt.findPane(sDungeonPaneNames[i]); } else { mpDungeonPanes[i] = nullptr; } if (sDungeonPicNames[i] != nullptr) { mpDungeonPics[i] = mLyt.findPane(sDungeonPicNames[i]); } else { mpDungeonPics[i] = nullptr; } } mpNumberTextBox = mLyt.getTextBox("T_number_00"); mpNumberTextBoxS = mLyt.getTextBox("T_numberS_00"); mpZoomInOutPane = mLyt.findPane("N_zoomInOut_00"); for (int i = 0; i < (int)ARRAY_LENGTH(sPriorityGroupNames); i++) { mpPriorityGroups[i] = mLyt.findGroupByName(sPriorityGroupNames[i]); } mMarkers.setField_0x6F4(boundingPos2); mPinIconAggregate.setUnk(&field_0xF1C); mpPaneBgAll01 = mLyt.findPane("N_mapBgAll_01"); mpPaneBgAll02 = mLyt.findPane("N_mapBgAll_02"); mpPaneAll01 = mLyt.findPane("N_mapAll_01"); mpPaneAll02 = mLyt.findPane("N_mapAll_02"); field_0x8928.x = mpPaneBgAll01->GetGlobalMtx()._03; field_0x8928.y = mpPaneBgAll01->GetGlobalMtx()._13; mpPaneRotate00 = mLyt.findPane("N_rotateP_00"); mpPaneRotate01 = mLyt.findPane("N_rotateP_01"); nw4r::lyt::Pane *bgAll = mLyt.findPane("N_mapBgAll_00"); mVec2_c v1(bgAll->GetGlobalMtx()._03, bgAll->GetGlobalMtx()._13); mVec2_c tmp = v1 - global->getField_0x20(); global->setField_0x0C(tmp); field_0x8C88 = mAnmGroups[MAP_MAIN_ANIM_IN].getFrameCtrl()->mEndFrame - 1.0f; mAnmGroups[MAP_MAIN_ANIM_IN].unbind(); mAnmGroups[MAP_MAIN_ANIM_OUT].bind(false); field_0x8C8C = mAnmGroups[MAP_MAIN_ANIM_OUT].getLastFrame(); mAnmGroups[MAP_MAIN_ANIM_OUT].unbind(); field_0x8CAC = 0; mDisplayedBeaconCount = getMaxBeaconCount(); mStateMgr.changeState(StateID_Invisible); getGlobal()->setFloor(0); mNavEnabled = false; field_0x8D58 = 0; field_0x8D5C = 1; field_0x8D60 = 0; field_0x8D64 = 0; fn_80143300(); } void dLytMapMain_c::loadStageProperties() { mAreaGroup = getAreaGroup(dStageMgr_c::GetInstance()->getSTIFArea()); mRoomType = getRoomType(); // Yes, it does need to be written this way, otherwise the catch-all else // branch is collapsed with the other ones. if (mRoomType == ROOMTYPE_FIELD) { mCurrentMapMode = dLytMapGlobal_c::MAPMODE_ZOOM; return; } if (mRoomType == ROOMTYPE_DUNGEON) { mCurrentMapMode = dLytMapGlobal_c::MAPMODE_STAGE; return; } if (mRoomType == ROOMTYPE_SKYLOFT) { mCurrentMapMode = dLytMapGlobal_c::MAPMODE_STAGE; return; } if (mRoomType == ROOMTYPE_BOSS_HOUSE) { mCurrentMapMode = dLytMapGlobal_c::MAPMODE_STAGE; return; } mCurrentMapMode = dLytMapGlobal_c::MAPMODE_STAGE; } void dLytMapMain_c::setupStage() { loadStageProperties(); if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) { mLyt.findPane("N_skyloft_00")->SetVisible(false); } mAnmGroups[MAP_MAIN_ANIM_PLAYER_2_PATTERN].bind(false); if (dAcPy_c::getCurrentTunicType() == 1) { mAnmGroups[MAP_MAIN_ANIM_PLAYER_2_PATTERN].setFrame(1.0f); } else { mAnmGroups[MAP_MAIN_ANIM_PLAYER_2_PATTERN].setFrame(0.0f); } if (mRoomType == ROOMTYPE_SKYLOFT || (mAreaGroup == AREAGROUP_SKY && (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR || mRoomType == ROOMTYPE_DUNGEON))) { mAnmGroups[MAP_MAIN_ANIM_SUN_ROTE].bind(false); } s32 type = 0; mAnmGroups[MAP_MAIN_ANIM_TYPE].bind(false); if (dScGame_c::currentSpawnInfo.getTrial() == SpawnInfo::TRIAL) { type = 8; } else if (mAreaGroup == AREAGROUP_FARON || mAreaGroup == AREAGROUP_SEALED_GROUNDS) { if (dStageMgr_c::GetInstance()->getSTIFArea() == dStageMgr_c::STIF_AREA_SEALED_GROUNDS) { type = 7; } else if (mRoomType == ROOMTYPE_FIELD) { type = 1; } else { type = 2; } } else if (mAreaGroup == AREAGROUP_ELDIN) { if (mRoomType == ROOMTYPE_FIELD) { type = 3; } else { type = 4; } } else if (mAreaGroup == AREAGROUP_LANAYRU) { if (mRoomType == ROOMTYPE_FIELD) { type = 5; } else { type = 6; } } else if (mAreaGroup == AREAGROUP_SKY) { if (dStageMgr_c::GetInstance()->getSTIFRoomType() == dStageMgr_c::STIF_ROOMTYPE_DUNGEON) { type = 11; } else { // TODO - probably an enum but this matches too type = 9; if (dScGame_c::currentSpawnInfo.getTimeOfDay() == SpawnInfo::NIGHT) { type = 10; } } } mAnmGroups[MAP_MAIN_ANIM_TYPE].setFrame(type); mLyt.calc(); mAnmGroups[MAP_MAIN_ANIM_TYPE].unbind(); field_0x8C7C = 0.0f; field_0x8C80 = 0.0f; mAnmGroups[MAP_MAIN_ANIM_IN].bind(false); mAnmGroups[MAP_MAIN_ANIM_IN].setFrame(0.0f); mAnmGroups[MAP_MAIN_ANIM_MAP_V].bind(false); fn_801431E0(); mLyt.calc(); mAnmGroups[MAP_MAIN_ANIM_MAP_V].unbind(); mAnmGroups[MAP_MAIN_ANIM_IN].unbind(); if (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR) { mLyt.findPane("N_houkoul_00")->SetVisible(false); } if (mMapEvent != MAP_EVENT_SAVE_OBJ_MSG_WINDOW) { loadTextboxes(); } fn_8013AD50(); } void dLytMapMain_c::remove() { for (int i = 0; i < (int)ARRAY_LENGTH(mHitChecks); i++) { dCsMgr_c::GetInstance()->unregistCursorTarget(&mHitChecks[i]); } for (d2d::SubPaneList::Iterator it = mSubpaneList.GetBeginIter(); it != mSubpaneList.GetEndIter(); ++it) { d2d::dSubPane *subPane = it->mpLytPane; if (subPane != nullptr) { nw4r::lyt::Pane *parent = subPane->getPane()->GetParent(); parent->RemoveChild(subPane->getPane()); } } mPopupInfo.remove(); mSavePopup.remove(); mSaveCaption.remove(); for (int i = 0; i < (int)ARRAY_LENGTH(mSaveObjs); i++) { mSaveObjs[i].remove(); } mFloorBtnMgr.remove(); mFootPrints.remove(); mMarkers.remove(); mPinIconAggregate.remove(); mPutIcon.remove(); for (int i = 0; i < MAP_MAIN_NUM_ANIMS; i++) { mAnmGroups[i].remove(); } dStage_c::GetInstance()->fn_801B3F30(); } void dLytMapMain_c::execute() { if ((*mStateMgr.getStateID() == StateID_Invisible)) { return; } if ((*mStateMgr.getStateID() == StateID_RenderingWait)) { mStateMgr.executeState(); mMapCapture.execute(); return; } field_0xF1C.field_0x05 = 0; dLytMapGlobal_c *global = getGlobal(); mDrawScaleFrame = false; mPointerOnMap = false; mPointerCanPlaceBeacon = false; checkCursorPointedAtMap(); if (dPad::getDownTrigDown() && canCenterCursor(mCurrentMapMode) && canCenterCursor(mNextMapMode)) { dPad::ex_c::getInstance()->centerCursor(mPad::getCurrentCoreID(), true); } if (mRoomType == ROOMTYPE_DUNGEON && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { mFloorBtnMgr.setForceNoNav(true); } else { mFloorBtnMgr.setForceNoNav(false); } mFloorBtnMgr.checkPointedAtBtn(); mStateMgr.executeState(); if (*mStateMgr.getStateID() != StateID_ResetPosWithFloorChange) { mFloorBtnMgr.execute(); } s32 beaconId = -1; field_0x8DBD = false; if (canCenterCursor1(mCurrentMapMode) && canCenterCursor1(mNextMapMode) && canPlaceBeacons(mCurrentMapMode) && canPlaceBeacons(mNextMapMode)) { bool exhaustedPins = mPinIconAggregate.getNumSetPins() >= getMaxBeaconCount(); if (!exhaustedPins && mPointerCanPlaceBeacon && *mPinIconAggregate.mStateMgr.getStateID() != dLytMapPinIconAggregate_c::StateID_Select && isPointingAtMainMap()) { mPinIconAggregate.findNewBeaconId(&beaconId); if (beaconId >= 0) { field_0x8DBD = true; } } } if (field_0x8DBD) { mPutIcon.setPosition(dCsGame_c::GetInstance()->getCursorIf()->getCursorPos()); mPutIcon.setScale(1.0f); mPutIcon.setVisible(true); } else { mPutIcon.setVisible(false); } static SizedWString<0x20> buf; buf.sprintf(L"%ld", (mDisplayedBeaconCount - mPinIconAggregate.getNumSetPins()) % 10); mpNumberTextBox->setTextWithGlobalTextProcessor(buf, nullptr); mpNumberTextBoxS->setTextWithGlobalTextProcessor(buf, nullptr); if (canChangeFloor(mCurrentMapMode) && canChangeFloor(mNextMapMode)) { const sStateIDIf_c *state = mStateMgr.getStateID(); if (*state != StateID_FloorChange && *state != StateID_RenderingWait && *state != StateID_ResetPosWithFloorChange) { mMapCapture.renderRequest(); } } mMapCapture.execute(); fn_80143360(); global->setCurrentMapMode(mCurrentMapMode); global->setNextMapMode(mNextMapMode); mFootPrints.setVisible(shouldDrawFootprints()); f32 f1 = 1.0f; if (mRoomType != ROOMTYPE_BOSS_HOUSE && mRoomType != ROOMTYPE_SKYFIELD_INTERIOR) { // why does everyone clamp things differently ??? f32 tmp = global->getField_0x58(); if (tmp < 0.0f) { tmp = 0.0f; } else if (tmp > 1.0f) { tmp = 1.0f; } f1 = tmp; } f32 f2 = fn_80142D90(dLytMapGlobal_c::MAPMODE_ZOOM); if (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR) { f2 = fn_80142D90(dLytMapGlobal_c::MAPMODE_STAGE); } mFootPrints.setField_0x198(f2); mFootPrints.setField_0x19C(f1); mFootPrints.execute(); setCursorType(); if (canCenterCursor1(mCurrentMapMode) && canCenterCursor1(mNextMapMode) && (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { global->setField_0x4D(1); } else { global->setField_0x4D(0); } if (mMapEvent == MAP_EVENT_DUNGEON_MAP_GET || mMapEvent == MAP_EVENT_FIELD_MAP_CHANGE_5 || mMapEvent == MAP_EVENT_FOREST_MAP_CHANGE || mMapEvent == MAP_EVENT_SW_BANK_SMALL) { clearButtonMessages(); } else { setButtonMessages(mCurrentMapMode, mMapUpDirection, mNextMapMode, mNextMapUpDirection); } if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY && mAnmGroups[MAP_MAIN_ANIM_SUN_ROTE].isBound()) { mAnmGroups[MAP_MAIN_ANIM_SUN_ROTE].play(); } if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { if (mAnmGroups[MAP_MAIN_ANIM_LIGHT_LOOP].isBound()) { mAnmGroups[MAP_MAIN_ANIM_LIGHT_LOOP].play(); } mAnmGroups[MAP_MAIN_ANIM_SKYLOFT_UP_DOWN].play(); } switch (mCurrentMapMode) { case dLytMapGlobal_c::MAPMODE_PROVINCE: { if (mpRegionPane1 != nullptr) { mpRegionPane1->SetVisible(true); } if (mpRegionPane2 != nullptr) { mpRegionPane2->SetVisible(true); } if (mAnmGroups[MAP_MAIN_ANIM_LINK_POSITION_LIGHT].isBound()) { mAnmGroups[MAP_MAIN_ANIM_LINK_POSITION_LIGHT].play(); } break; } case dLytMapGlobal_c::MAPMODE_WORLD: { if (mpRegionPane1 != nullptr) { mpRegionPane1->SetVisible(false); } if (mpRegionPane2 != nullptr) { mpRegionPane2->SetVisible(false); } break; } } if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) { if (mAnmGroups[MAP_MAIN_ANIM_CLOUD_LOOP].isBound()) { mAnmGroups[MAP_MAIN_ANIM_CLOUD_LOOP].play(); } if (mAnmGroups[MAP_MAIN_ANIM_NUSHI_LOOP].isBound()) { mAnmGroups[MAP_MAIN_ANIM_NUSHI_LOOP].play(); } } if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) { bool visible = mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || mNextMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE; setSaveObjsVisible(visible); mPopupInfo.executeState_Invisible(); } mSaveCaption.execute(); mPutIcon.execute(); mLyt.calc(); u8 alpha = 0; if (mpAllPane->IsVisible()) { alpha = mpAllPane->GetAlpha(); } global->setAlpha(alpha); fn_80143300(); mPinIconAggregate.setScale(global->getZoomFrame()); mMarkers.execute(); if (mNextMapEvent == MAP_EVENT_FIELD_MAP_CHANGE_5 || mNextMapEvent == MAP_EVENT_FIELD_MAP_CHANGE_8) { mStateMgr.changeState(StateID_EventFieldMapChange_Step1); mMapEvent = mNextMapEvent; mNextMapEvent = 0; } mMaxBeaconCount = 0; } void dLytMapMain_c::draw() { if (!field_0x8DBF) { return; } dLytMapGlobal_c *global = getGlobal(); fn_80143120(1); mLyt.draw(); if (shouldDrawFootprints() && field_0x8D58 == global->getFloor()) { mFootPrints.draw(); } if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM || mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { mMarkers.draw(); } if (mRoomType != ROOMTYPE_BOSS_HOUSE && mRoomType != ROOMTYPE_SKYFIELD_INTERIOR && mMapEvent != MAP_EVENT_SW_BANK_SMALL) { mPinIconAggregate.draw(); } fn_80143120(0); if ((mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) && (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM)) { mpZoomInOutPane->SetVisible(false); } else { mpZoomInOutPane->SetVisible(true); } mpScaleFramePane->SetVisible(mDrawScaleFrame ? true : false); mLyt.getLayout()->GetRootPane()->Draw(mLyt.getDrawInfo()); if ((mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || mNextMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) && mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) { fn_80138D80(); } fn_80143120(-2); mMarkers.drawPopups(); mPutIcon.draw(); if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) { mPopupInfo.draw(); } if (*mStateMgr.getStateID() == StateID_EventSaveObjSelect) { mSavePopup.draw(); } mSaveCaption.draw(); } s32 dLytMapMain_c::getSelectedSaveObjIdx() const { bool has = false; s32 start; s32 end; if (mAreaGroup == AREAGROUP_FARON) { start = 5; end = 14; has = true; } else if (mAreaGroup == AREAGROUP_ELDIN) { start = 15; end = 20; has = true; } else if (mAreaGroup == AREAGROUP_LANAYRU) { start = 21; end = 32; has = true; } if (!has) { // @bug this should probably return -1 but it doesn't matter return 0; } s32 idx = -1; dCursorHitCheck_c *d = dCsGame_c::GetInstance()->getCursorHit(); if (d != nullptr && d->getType() == 'lyt ') { for (int i = start; i <= end; i++) { if (d == &mHitChecks[i]) { idx = i - start; break; } } } return idx; } bool dLytMapMain_c::isPaneVisible(nw4r::lyt::Pane *pane) const { bool ret = true; while (pane != nullptr) { if (!pane->IsVisible() || pane->GetAlpha() == 0) { ret = false; break; } pane = pane->GetParent(); } return ret; } void dLytMapMain_c::setSaveObjsVisible(bool visible) { nw4r::lyt::Pane *p; nw4r::lyt::Bounding **ptrs = mpCurrentSaveObjBoundings; for (int i = 0; i < mNumSaveObjs; i++) { p = ptrs[i]; if (visible) { // This makes like no sense - the isPaneVisible check ensures // that the pane is already visible when we enter the branch... if (p != nullptr && p != nullptr && isPaneVisible(p)) { p->SetVisible(true); } } else { p->SetVisible(false); } } } void dLytMapMain_c::setSaveObjPanePtrs() { nw4r::lyt::Bounding **p = nullptr; u32 count = 0; if (mSurfaceProvince == SURFACE_PROVINCE_FARON) { p = mpSaveObjBoundingsFaron; count = ARRAY_LENGTH(mpSaveObjBoundingsFaron); } else if (mSurfaceProvince == SURFACE_PROVINCE_ELDIN) { p = mpSaveObjBoundingsEldin; count = ARRAY_LENGTH(mpSaveObjBoundingsEldin); } else if (mSurfaceProvince == SURFACE_PROVINCE_LANAYRU) { p = mpSaveObjBoundingsLanayru; count = ARRAY_LENGTH(mpSaveObjBoundingsLanayru); } mNumSaveObjs = count; mpCurrentSaveObjBoundings = p; mSavePopup.set(mpCurrentSaveObjBoundings, mNumSaveObjs); } void dLytMapMain_c::initSaveObjs() { nw4r::lyt::Bounding **ptrs = mpCurrentSaveObjBoundings; nw4r::lyt::Bounding *p; for (u32 i = 0; i < mNumSaveObjs; i++) { p = *ptrs; if (p->IsVisible()) { mVec3_c pos(p->GetGlobalMtx()._03, p->GetGlobalMtx()._13, 0.0f); mSaveObjs[i].setPosition(pos); mSaveObjs[i].setAlpha(p->GetGlobalAlpha()); mSaveObjs[i].draw(); } ptrs++; } } void dLytMapMain_c::saveUnkMapData() { dMapSavedDataEntry &data = sSavedMapData.entries[mRoomType]; data.field_0x06 = 1; data.mapMode = mCurrentMapMode; data.mapUpDirection = mMapUpDirection; data.mapUpDirectionAfterZoomToDetail = mMapUpDirectionAfterZoomToDetail; sSavedMapData.showIslandNames = mShowIslandNames; } void dLytMapMain_c::initUnkMapData() { for (int i = 0; i < 6; i++) { sSavedMapData.entries[i].field_0x06 = sDefaultMapData.entries[i].field_0x06; sSavedMapData.entries[i].mapMode = sDefaultMapData.entries[i].mapMode; sSavedMapData.entries[i].mapUpDirection = sDefaultMapData.entries[i].mapUpDirection; sSavedMapData.entries[i].mapUpDirectionAfterZoomToDetail = sDefaultMapData.entries[i].mapUpDirectionAfterZoomToDetail; } sSavedMapData.showIslandNames = sDefaultMapData.showIslandNames; } void dLytMapMain_c::loadUnkMapData() { mCurrentMapMode = sSavedMapData.entries[mRoomType].mapMode; mMapUpDirection = sSavedMapData.entries[mRoomType].mapUpDirection; mMapUpDirectionAfterZoomToDetail = sSavedMapData.entries[mRoomType].mapUpDirectionAfterZoomToDetail; mShowIslandNames = sSavedMapData.showIslandNames; } void dLytMapMain_c::clearButtonMessages() { // @bug this clears flags 16k times for (int i = 0; i <= METER_BTN_0x4000; i++) { dLytMeter_c::GetInstance()->clearFlags(i); } } void dLytMapMain_c::setButtonMessages( s32 currentMapMode, bool currentUpDirection, s32 nextMapMode, bool nextUpDirection ) { LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_NONE); LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_C, LytDoButtonRelated::ACT_IE_NONE); LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_Z, LytDoButtonRelated::ACT_IE_NONE); LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_BG, LytDoButtonRelated::ACT_IE_NONE); LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_NONE); if (canCenterCursor(currentMapMode) || canCenterCursor(nextMapMode)) { dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_DOWN); LytDoButtonRelated::setCrossDown(LytDoButtonRelated::ACT_IE_ETC_CENTER, true); } // TODO - some of these parts directly access members instead of using function args... // TODO - canCenterCursor1 looks like an inline that somehow failed to get inlined (it's emitted right after this // function...) if (canCenterCursor1(mCurrentMapMode) && canCenterCursor1(mNextMapMode) && canPlaceBeacons(mCurrentMapMode) && canPlaceBeacons(mNextMapMode)) { if (field_0x8DBD && *mPinIconAggregate.mStateMgr.getStateID() != dLytMapPinIconAggregate_c::StateID_Select) { dLytMeter_c::GetInstance()->setFlags(METER_BTN_C); LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_C, LytDoButtonRelated::ACT_IE_ETC_ADD_BEACON); } else if (*mPinIconAggregate.mStateMgr.getStateID() == dLytMapPinIconAggregate_c::StateID_Select) { dLytMeter_c::GetInstance()->setFlags(METER_BTN_C); LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_C, LytDoButtonRelated::ACT_IE_ETC_REMOVE_BEACON); } else if (!(*mStateMgr.getStateID() == StateID_In) && !(*mStateMgr.getStateID() == StateID_Out)) { dLytMeter_c::GetInstance()->setFlags(METER_BTN_NUN_STK); LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_NONE); } } if (canZoomOut(currentMapMode) && canZoomOut(nextMapMode)) { if ((mRoomType == ROOMTYPE_FIELD && currentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) || (mRoomType == ROOMTYPE_SKYLOFT && currentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) || (mRoomType == ROOMTYPE_SKYFIELD && currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) || (mRoomType == ROOMTYPE_BOSS_HOUSE && currentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) || (mRoomType == ROOMTYPE_SKYFIELD_INTERIOR && currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) || (mRoomType == ROOMTYPE_DUNGEON && currentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE)) { dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_LEFT); LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_CROSS_L, LytDoButtonRelated::ACT_IE_ETC_WORLD_MAP); } else { dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_LEFT); LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_CROSS_L, LytDoButtonRelated::ACT_IE_ETC_ZOOM_OUT); if (currentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { dLytMeter_c::GetInstance()->setFlags(METER_BTN_NUN_STK); LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_ETC_ZOOM_OUT); } } } if (canZoomIn(currentMapMode) && canZoomIn(nextMapMode)) { dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_RIGHT); LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_CROSS_R, LytDoButtonRelated::ACT_IE_ETC_ZOOM_IN); if (currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && nextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { dLytMeter_c::GetInstance()->setFlags(METER_BTN_NUN_STK); LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_ETC_ZOOM_IN); } } // Directly accessing members instead of using function args... if (needsNav(mCurrentMapMode) && needsNav(mNextMapMode)) { dLytMeter_c::GetInstance()->setFlags(METER_BTN_NUN_STK); dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000); LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_ETC_SELECT_FLOOR); if (mFloorBtnMgr.hasPointedAtABtnIdx() && mFloorBtnMgr.canDecideFloor()) { LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_ETC_DISPLAY); } } if (canChangeUpDirection(currentMapMode, currentUpDirection) && canChangeUpDirection(nextMapMode, nextUpDirection)) { dLytMeter_c::GetInstance()->setFlags(METER_BTN_Z); if (!currentUpDirection) { LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_Z, LytDoButtonRelated::ACT_IE_ETC_ROTATE_MAP); } else { LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_Z, LytDoButtonRelated::ACT_IE_ETC_ROTATE_MAP_2); } } switch (mRoomType) { case ROOMTYPE_SKYLOFT: { if (currentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_UP); LytDoButtonRelated::setCrossTop(LytDoButtonRelated::ACT_IE_ETC_CURRENT_LOCATION, true); dLytMeter_c::GetInstance()->setFlags(METER_BTN_Z); dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000); LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_ETC_SCROLL); dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x4000); } else if (currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { if (canResetPosition(mCurrentMapMode, mMapUpDirection)) { dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000); LytDoButtonRelated::set( LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_ETC_SCROLL ); } else { dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000); LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_NONE); } dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x4000); } break; } case ROOMTYPE_FIELD: case ROOMTYPE_SKYFIELD: { if (currentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_UP); LytDoButtonRelated::setCrossTop(LytDoButtonRelated::ACT_IE_ETC_CURRENT_LOCATION, true); dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000); LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_ETC_SCROLL); dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x4000); } else if (currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { if (canResetPosition(mCurrentMapMode, mMapUpDirection)) { dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_UP); LytDoButtonRelated::setCrossTop(LytDoButtonRelated::ACT_IE_ETC_CURRENT_LOCATION, true); dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000); LytDoButtonRelated::set( LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_ETC_SCROLL ); } else { dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000); LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_NONE); } dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x4000); } if (mRoomType == ROOMTYPE_SKYFIELD && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { dLytMeter_c::GetInstance()->setFlags(METER_BTN_Z); if (mShowIslandNames) { LytDoButtonRelated::set( LytDoButtonRelated::DO_BUTTON_Z, LytDoButtonRelated::ACT_IE_ETC_HIDE_ISLAND_NAME ); } else { LytDoButtonRelated::set( LytDoButtonRelated::DO_BUTTON_Z, LytDoButtonRelated::ACT_IE_ETC_SHOW_ISLAND_NAME ); } } break; } case ROOMTYPE_DUNGEON: { if (currentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_UP); LytDoButtonRelated::setCrossTop(LytDoButtonRelated::ACT_IE_ETC_CURRENT_LOCATION, true); dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000); LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_ETC_SCROLL); if (needsNav(mCurrentMapMode) && needsNav(mNextMapMode) && mFloorBtnMgr.hasPointedAtABtnIdx()) { if (mFloorBtnMgr.canDecideFloor()) { LytDoButtonRelated::set( LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_ETC_DISPLAY ); } else { LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_NONE); } } dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x4000); } else if (currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { if (needsNav(mCurrentMapMode) && needsNav(mNextMapMode) && mFloorBtnMgr.hasPointedAtABtnIdx()) { if (mFloorBtnMgr.canDecideFloor()) { LytDoButtonRelated::set( LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_ETC_DISPLAY ); } else { LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_NONE); } } } break; } } } void dLytMapMain_c::setCursorType() { if (canCenterCursor1(mCurrentMapMode) && canCenterCursor1(mNextMapMode)) { if ((mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW || ((mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_DUNGEON) && mPointerOnMap)) || (mPointerCanPlaceBeacon && isPointingAtMainMap()) || (*mPinIconAggregate.mStateMgr.getStateID() == dLytMapPinIconAggregate_c::StateID_Select) || (needsNav(mCurrentMapMode) && needsNav(mNextMapMode) && mFloorBtnMgr.hasPointedAtABtnIdx())) { dCsGame_c::GetInstance()->pointerDefSet(); } else { dCsGame_c::GetInstance()->pointerCatSet(); } } } void dLytMapMain_c::calculateBoundingWorldHitboxes() { dLytMapGlobal_c *global = getGlobal(); f32 sc = global->getField_0x28().x; f32 f1 = field_0x8D40 * global->getField_0x44(); f32 f2 = f1 * sc; mAng rot = global->getField_0x56(); for (int i = 0; i <= MAP_MAIN_NUM_BOUNDINGS_NORMAL - 1; i++) { mVec3_c v1; mVec3_c v2; f32 v1x = (f32)mHitChecks[i].getBoundingData()->mMinX; f32 v2x = (f32)mHitChecks[i].getBoundingData()->mMaxX; f32 v1z = (f32)mHitChecks[i].getBoundingData()->mMaxY; f32 v2z = (f32)mHitChecks[i].getBoundingData()->mMinY; v1.x = v1x / f2; v1.y = 0.0f; v1.z = -v1z / f1; v2.x = v2x / f2; v2.y = 0.0f; v2.z = -v2z / f1; v1.rotY(rot); v2.rotY(rot); // Looks like this is manually unprojecting the UI element // hitbox corners? s16 v = rot.mVal; if (v == 0) { // 0° rotation mBoundingWorldBounds[i].min.x = field_0x8CC4.x + v1.x; mBoundingWorldBounds[i].min.y = 0.0f; mBoundingWorldBounds[i].min.z = field_0x8CC4.z + v1.z; mBoundingWorldBounds[i].max.x = field_0x8CC4.x + v2.x; mBoundingWorldBounds[i].max.y = 0.0f; mBoundingWorldBounds[i].max.z = field_0x8CC4.z + v2.z; } else if (v == 0x4000) { // 90° rotation mBoundingWorldBounds[i].min.x = field_0x8CC4.x + v1.x; mBoundingWorldBounds[i].min.y = 0.0f; mBoundingWorldBounds[i].min.z = field_0x8CC4.z + v2.z; mBoundingWorldBounds[i].max.x = field_0x8CC4.x + v2.x; mBoundingWorldBounds[i].max.y = 0.0f; mBoundingWorldBounds[i].max.z = field_0x8CC4.z + v1.z; } else if (v == -0x8000) { // 180° rotation mBoundingWorldBounds[i].min.x = field_0x8CC4.x + v2.x; mBoundingWorldBounds[i].min.y = 0.0f; mBoundingWorldBounds[i].min.z = field_0x8CC4.z + v2.z; mBoundingWorldBounds[i].max.x = field_0x8CC4.x + v1.x; mBoundingWorldBounds[i].max.y = 0.0f; mBoundingWorldBounds[i].max.z = field_0x8CC4.z + v1.z; } } } void dLytMapMain_c::initializeState_Invisible() {} void dLytMapMain_c::executeState_Invisible() {} void dLytMapMain_c::finalizeState_Invisible() {} void dLytMapMain_c::initializeState_RenderingWait() {} void dLytMapMain_c::executeState_RenderingWait() {} void dLytMapMain_c::finalizeState_RenderingWait() {} struct dLytMapStoryflagPaneMapping { /* 0x00 */ s32 storyFlag; /* 0x04 */ const char *paneName; }; static const dLytMapStoryflagPaneMapping sStoryflagPaneMap[] = { { STORYFLAG_FARON_PILLAR_OPENED, "N_forestP_00"}, { STORYFLAG_ELDIN_PILLAR_OPENED, "N_volcanoP_00"}, { STORYFLAG_LANAYRU_PILLAR_OPENED, "N_desertP_00"}, { STORYFLAG_FARON_DISCOVERED, "N_toForest_00"}, { STORYFLAG_ELDIN_DISCOVERED, "N_toVolcano_00"}, { STORYFLAG_LANAYRU_DISCOVERED, "N_toDesert_00"}, { STORYFLAG_ISLE_OF_SONGS_DISCOVERED, "N_utaN_00"}, {STORYFLAG_FUN_FUN_ISLAND_DISCOVERED, "N_ruretouN_00"}, { STORYFLAG_LUMPY_PUMPKIN_DISCOVERED, "N_pampkinN_00"}, { STORYFLAG_BEEDLE_ISLAND_DISCOVERED, "N_teryN_00"}, { STORYFLAG_BAMBOO_ISLAND_DISCOVERED, "N_tikurinN_00"}, { STORYFLAG_BUG_HAVEN_DISCOVERED, "N_musiN_00"}, { STORYFLAG_ISLE_OF_SONGS_DISCOVERED, "N_utaI_00"}, {STORYFLAG_FUN_FUN_ISLAND_DISCOVERED, "N_ruretouI_00"}, { STORYFLAG_LUMPY_PUMPKIN_DISCOVERED, "N_pampkinI_00"}, { STORYFLAG_BEEDLE_ISLAND_DISCOVERED, "N_teryI_00"}, { STORYFLAG_BAMBOO_ISLAND_DISCOVERED, "N_tikurinI_00"}, { STORYFLAG_BUG_HAVEN_DISCOVERED, "N_musiI_00"}, {STORYFLAG_BILOCYCTE_FIGHT_TRIGGERED, "N_nushi_00"}, }; // 255 is a placeholder for "no flag", despite it corresponding to an actual story flag... static const s32 sFlagsRenameMe[] = { 255, STORYFLAG_FARON_PILLAR_OPENED, STORYFLAG_ELDIN_PILLAR_OPENED, STORYFLAG_LANAYRU_PILLAR_OPENED, STORYFLAG_THUNDERHEAD_ENTERED }; // Not sure what the second number means static const s32 sFlags2RenameMe[][2] = { { STORYFLAG_FARON_DISCOVERED, 5}, { STORYFLAG_FARON_WOODS_DISCOVERED, 2}, { STORYFLAG_DEEP_WOODS_DISCOVERED, 2}, { STORYFLAG_ELDIN_DISCOVERED, 3}, { STORYFLAG_LANAYRU_DISCOVERED, 4}, {STORYFLAG_LANAYRU_DESERT_DISCOVERED, 4}, { STORYFLAG_LAKE_FLORIA_DISCOVERED, 2}, { STORYFLAG_LANAYRU_CAVES_DISCOVERED, 4}, {STORYFLAG_ANCIENT_HARBOR_DISCOVERED, 4}, {STORYFLAG_VOLCANO_SUMMIT_DISCOVERED, 3}, { STORYFLAG_LANAYRU_GORGE_DISCOVERED, 4}, }; static const s32 sDungeonDiscoveredFlags[] = { STORYFLAG_SKYVIEW_DISCOVERED, STORYFLAG_EARTH_TEMPLE_DISCOVERED, STORYFLAG_LMF_DISCOVERED, STORYFLAG_ANCIENT_CISTERN_DISCOVERED, STORYFLAG_SANDSHIP_DISCOVERED, STORYFLAG_FIRE_SANCTUARY_DISCOVERED, STORYFLAG_SKY_KEEP_DISCOVERED, }; static const char *sAreaPicNamesL[] = { "P_plainL_00", "P_forestL_00", "P_nForestL_00", "P_sVolcanoL_00", "P_mineL_00", "P_desertL_00", "P_lakeL_00", "P_glenL_00", "P_seaL_00", "P_nVolcanoL_00", "P_skyloftL_00", "P_glenL_01", }; static const char *sAreaPicNamesLink[] = { "P_plainLink_00", "P_forestLink_00", "P_nForestLink_00", "P_sVolLink_00", "P_mineLink_00", "P_desertLink_00", "P_lakeLink_00", "P_glenLink_00", "P_seaLink_00", "P_nVolLink_00", "P_skyloftLink_00", "P_glenLink_01", }; #define MAP_MAIN_AREA_PIC_PLAIN 0 #define MAP_MAIN_AREA_PIC_FOREST 1 #define MAP_MAIN_AREA_PIC_N_FOREST 2 #define MAP_MAIN_AREA_PIC_S_VOLCANO 3 #define MAP_MAIN_AREA_PIC_MINE 4 #define MAP_MAIN_AREA_PIC_DESERT 5 #define MAP_MAIN_AREA_PIC_LACE 6 #define MAP_MAIN_AREA_PIC_GLEN_00 7 #define MAP_MAIN_AREA_PIC_SEA 8 #define MAP_MAIN_AREA_PIC_N_VOLCANO 9 #define MAP_MAIN_AREA_PIC_SKYLOFT 10 #define MAP_MAIN_AREA_PIC_GLEN_01 11 #define MAP_MAIN_NUM_AREA_PICS 12 void dLytMapMain_c::setupFlags() { if (mMapEvent == MAP_EVENT_DUNGEON_MAP_GET || mMapEvent == MAP_EVENT_FOREST_MAP_CHANGE) { field_0x8DBE = 0; } else { field_0x8DBE = -1; } field_0x8D6B = 0; field_0x8D6A = 0; mpAllPane->SetVisible(true); s32 currentRegion; switch (dStageMgr_c::GetInstance()->getSTIFArea()) { default: currentRegion = MAP_MAIN_AREA_PIC_SKYLOFT; break; case dStageMgr_c::STIF_AREA_SEALED_GROUNDS: currentRegion = MAP_MAIN_AREA_PIC_PLAIN; break; case dStageMgr_c::STIF_AREA_FARON_WOODS: currentRegion = MAP_MAIN_AREA_PIC_FOREST; break; case dStageMgr_c::STIF_AREA_DEEP_WOODS: currentRegion = MAP_MAIN_AREA_PIC_N_FOREST; break; case dStageMgr_c::STIF_AREA_LAKE_FLORIA: currentRegion = MAP_MAIN_AREA_PIC_LACE; break; case dStageMgr_c::STIF_AREA_VOLCANO_SOUTH: currentRegion = MAP_MAIN_AREA_PIC_S_VOLCANO; break; case dStageMgr_c::STIF_AREA_VOLCANO_NORTH: currentRegion = MAP_MAIN_AREA_PIC_N_VOLCANO; break; case dStageMgr_c::STIF_AREA_LANAYRU_MINE: currentRegion = MAP_MAIN_AREA_PIC_MINE; break; case dStageMgr_c::STIF_AREA_LANAYRU_DESERT: currentRegion = MAP_MAIN_AREA_PIC_DESERT; break; case dStageMgr_c::STIF_AREA_LANAYRU_SAND_SEA: currentRegion = MAP_MAIN_AREA_PIC_SEA; break; case dStageMgr_c::STIF_AREA_LANAYRU_CAVES: currentRegion = MAP_MAIN_AREA_PIC_GLEN_00; break; case dStageMgr_c::STIF_AREA_LANAYRU_GORGE: currentRegion = MAP_MAIN_AREA_PIC_GLEN_01; break; } // TODO - regswap between i and ok for (int i = 0; i < (int)ARRAY_LENGTH(sStoryflagPaneMap); i++) { nw4r::lyt::Pane *p = mLyt.findPane(sStoryflagPaneMap[i].paneName); bool ok = StoryflagManager::sInstance->getFlag(sStoryflagPaneMap[i].storyFlag) != 0; if (i >= 0 && i < 6 && (dScGame_c::isCurrentStage("F403") || dScGame_c::isCurrentStage("F404"))) { // If we're in the past, light pillars aren't a thing ok = false; } if (ok) { p->SetVisible(true); } else { p->SetVisible(false); } } if (StoryflagManager::sInstance->getFlag(STORYFLAG_BILOCYCTE_FIGHT_TRIGGERED)) { mAnmGroups[MAP_MAIN_ANIM_NUSHI_LOOP].bind(false); } mAnmGroups[MAP_MAIN_ANIM_KUMO_PATTERN].bind(false); f32 titleLineFrame = 4.0f; // TODO - lots of regswaps for (int i = ARRAY_LENGTH(sFlagsRenameMe) - 1; i >= 0; i--) { s32 flag = sFlagsRenameMe[i]; // This might be an inline... bool doBreak = true; bool flagSet = flag != 255 && StoryflagManager::sInstance->getCounterOrFlag(flag); if (!flagSet && flag != 255) { doBreak = false; } if (doBreak) { break; } titleLineFrame -= 1.0f; } mAnmGroups[MAP_MAIN_ANIM_KUMO_PATTERN].setFrame(titleLineFrame); mAnmGroups[MAP_MAIN_ANIM_MAP_V].bind(false); if (mRoomType == ROOMTYPE_DUNGEON || mRoomType == ROOMTYPE_BOSS_HOUSE) { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { mAnmGroups[MAP_MAIN_ANIM_MAP_V].setFrame(3.0f); } if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { mAnmGroups[MAP_MAIN_ANIM_MAP_V].setFrame(2.0f); } } field_0x8880[0] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_PLAIN]; field_0x8880[1] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_FOREST]; field_0x8880[2] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_N_FOREST]; field_0x8880[3] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_S_VOLCANO]; field_0x8880[4] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_MINE]; field_0x8880[5] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_DESERT]; field_0x8880[6] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_LAKE]; field_0x8880[7] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_GLEN_01]; field_0x8880[8] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_SEA]; field_0x8880[9] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_N_VOLCANO]; field_0x8880[10] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_GLEN_00]; for (int i = 0; i < (int)ARRAY_LENGTH(field_0x8880); i++) { if (field_0x8880[i] != nullptr) { field_0x8880[i]->bind(false); field_0x8880[i]->setToEnd(); } } for (int i = 0; i < (int)ARRAY_LENGTH(mpPanes); i++) { if (mpPanes[i] != nullptr) { mpPanes[i]->SetVisible(true); } } field_0x88AC = -1; for (int i = ARRAY_LENGTH(sFlags2RenameMe) - 1; i >= 0; i--) { s32 flag = sFlags2RenameMe[i][0]; bool flagSet = flag != 255 && StoryflagManager::sInstance->getCounterOrFlag(flag); if (flagSet) { field_0x88AC = i; break; } if (mpPanes[i] != nullptr) { mpPanes[i]->SetVisible(false); } if (field_0x8880[i] != nullptr) { field_0x8880[i]->setFrame(0.0f); } } if (mMapEvent == MAP_EVENT_MAP_INTRO) { if (field_0x88AC < 0) { field_0x88AC = 0; } if (field_0x88AC >= 0) { if (mpPanes[field_0x88AC] != nullptr) { mpPanes[field_0x88AC]->SetVisible(true); } if (field_0x8880[field_0x88AC] != nullptr) { field_0x8880[field_0x88AC]->setFrame(0.0f); } } } for (int i = 0; i < (int)ARRAY_LENGTH(sDungeonDiscoveredFlags); i++) { if (mpDungeonPanes[i] != nullptr) { mpDungeonPanes[i]->SetVisible(true); } if (mpDungeonPics[i] != nullptr) { mpDungeonPics[i]->SetVisible(true); } } for (int i = ARRAY_LENGTH(sDungeonDiscoveredFlags) - 1; i >= 0; i--) { s32 flag = sDungeonDiscoveredFlags[i]; bool flagSet = flag != 255 && StoryflagManager::sInstance->getCounterOrFlag(flag); if (flagSet) { break; } if (mpDungeonPanes[i] != nullptr) { mpDungeonPanes[i]->SetVisible(false); } if (mpDungeonPics[i] != nullptr) { mpDungeonPics[i]->SetVisible(false); } } if (StoryflagManager::sInstance->getCounterOrFlag(STORYFLAG_TRIFORCE_COMPLETE) && !dScGame_c::isCurrentStage("F403") && !dScGame_c::isCurrentStage("F404")) { if (mpDungeonPanes[6] != nullptr) { mpDungeonPanes[6]->SetVisible(false); } if (mpDungeonPics[6] != nullptr) { mpDungeonPics[6]->SetVisible(false); } } mAnmGroups[MAP_MAIN_ANIM_WORLD_STATE].bind(false); if (StoryflagManager::sInstance->getCounterOrFlag(STORYFLAG_TRIFORCE_COMPLETE) && !dScGame_c::isCurrentStage("F403") && !dScGame_c::isCurrentStage("F404")) { mAnmGroups[MAP_MAIN_ANIM_WORLD_STATE].setFrame(1.0f); } else { mAnmGroups[MAP_MAIN_ANIM_WORLD_STATE].setFrame(0.0f); } mLyt.getLayout()->Animate(0); mLyt.calc(); if (mAnmGroups[MAP_MAIN_ANIM_WORLD_STATE].isBound()) { mAnmGroups[MAP_MAIN_ANIM_WORLD_STATE].unbind(); } for (int i = 0; i < 11; i++) { if (field_0x8880[i] != nullptr) { field_0x8880[i]->unbind(); } } mAnmGroups[MAP_MAIN_ANIM_LINK_POSITION_LIGHT].bind(false); mAnmGroups[MAP_MAIN_ANIM_ROTATE].bind(false); d2d::AnmGroup_c *grpZIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_Z_IN_FOREST]; d2d::AnmGroup_c *grpZAIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_ZA_IN_FOREST]; d2d::AnmGroup_c *grpZWakuIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_Z_WAKU_IN]; if (mAreaGroup == AREAGROUP_SEALED_GROUNDS) { grpZIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_Z_IN_PLANT]; grpZAIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_ZA_IN_PLANT]; } else if (mAreaGroup == AREAGROUP_ELDIN) { grpZIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_Z_IN_VOLCANO]; grpZAIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_ZA_IN_VOLCANO]; } else if (mAreaGroup == AREAGROUP_LANAYRU) { grpZIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_Z_IN_DESERT]; grpZAIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_ZA_IN_DESERT]; } if (mRoomType == ROOMTYPE_SKYLOFT || (mAreaGroup == AREAGROUP_SKY && (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_DUNGEON))) { grpZIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_ZA_IN_SKY_MAP_2]; grpZAIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_ZA_OUT_SKY_COURSE]; } mAnmGroups[MAP_MAIN_ANIM_SKYLOFT_UP_DOWN].bind(false); mAnmGroups[MAP_MAIN_ANIM_CLOUD_LOOP].bind(false); mAnmGroups[MAP_MAIN_ANIM_LIGHT_LOOP].bind(false); if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { grpZAIn->bind(false); grpZAIn->setFrame(0.0f); grpZWakuIn->bind(false); grpZWakuIn->setToEnd(); } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) { grpZAIn->bind(false); grpZAIn->setToEnd(); // no group1->bind(false) ? grpZIn->setToEnd(); grpZWakuIn->bind(false); grpZWakuIn->setFrame(0.0f); } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) { grpZIn->bind(false); grpZIn->setFrame(0.0f); grpZWakuIn->bind(false); grpZWakuIn->setFrame(0.0f); } if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { mAnmGroups[MAP_MAIN_ANIM_ROTATE].setFrame(0.0f); } else { mAnmGroups[MAP_MAIN_ANIM_ROTATE].setToEnd(); } if (mMapEvent == MAP_EVENT_SW_BANK_SMALL) { mAnmGroups[MAP_MAIN_ANIM_N_ON_OFF].bind(false); mAnmGroups[MAP_MAIN_ANIM_N_ON_OFF].setToEnd(); } else { mAnmGroups[MAP_MAIN_ANIM_N_ON_OFF].bind(false); mAnmGroups[MAP_MAIN_ANIM_TITLE_ON_OFF].bind(false); if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { mAnmGroups[MAP_MAIN_ANIM_N_ON_OFF].setFrame(0.0f); mAnmGroups[MAP_MAIN_ANIM_TITLE_ON_OFF].setToEnd(); } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) { mAnmGroups[MAP_MAIN_ANIM_N_ON_OFF].setToEnd(); mAnmGroups[MAP_MAIN_ANIM_TITLE_ON_OFF].setFrame(0.0f); } } mAnmGroups[MAP_MAIN_ANIM_TITE_LINE].bind(false); mAnmGroups[MAP_MAIN_ANIM_TITE_LINE].setFrame(field_0x8D54 - 1); mLyt.getLayout()->Animate(0); mLyt.calc(); mAnmGroups[MAP_MAIN_ANIM_TITE_LINE].unbind(); if (mAnmGroups[MAP_MAIN_ANIM_N_ON_OFF].isBound()) { mAnmGroups[MAP_MAIN_ANIM_N_ON_OFF].unbind(); } if (mAnmGroups[MAP_MAIN_ANIM_TITLE_ON_OFF].isBound()) { mAnmGroups[MAP_MAIN_ANIM_TITLE_ON_OFF].unbind(); } if (grpZIn->isBound()) { grpZIn->unbind(); } if (grpZAIn->isBound()) { grpZAIn->unbind(); } if (grpZWakuIn->isBound()) { grpZWakuIn->unbind(); } mAnmGroups[MAP_MAIN_ANIM_ROTATE].unbind(); mpAllPane->SetVisible(false); if (mAnmGroups[MAP_MAIN_ANIM_KUMO_PATTERN].isBound()) { mAnmGroups[MAP_MAIN_ANIM_KUMO_PATTERN].unbind(); } getGlobal()->setAlpha(0); // we had JUST set this to invisible... mpAllPane->SetVisible(true); mpRegionPane1 = nullptr; for (int i = 0; i < MAP_MAIN_NUM_AREA_PICS; i++) { nw4r::lyt::Pane *p1 = mLyt.findPane(sAreaPicNamesL[i]); nw4r::lyt::Pane *p2 = mLyt.findPane(sAreaPicNamesLink[i]); if (i == currentRegion) { p1->SetVisible(true); p2->SetVisible(true); mpRegionPane1 = p1; // TODO - was this meant to be p2? mpRegionPane2 = p1; } else { p1->SetVisible(false); p2->SetVisible(false); } } if (mRoomType == ROOMTYPE_SKYFIELD || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR) { mLyt.findPane("P_skyloftLink_00")->SetVisible(false); } if (canPlaceBeacons(mCurrentMapMode) && canPlaceBeacons(mNextMapMode)) { mPutIcon.setVisible(true); mpNoroshiPane->SetVisible(true); } else { mpNoroshiPane->SetVisible(false); mPutIcon.setVisible(false); } if (mRoomType == ROOMTYPE_SKYFIELD) { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { mMarkers.setIslandNamesOn(mShowIslandNames); } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { mMarkers.setIslandNamesOn(false); } } } void dLytMapMain_c::initializeState_In() {} void dLytMapMain_c::executeState_In() { field_0x8DBF = 1; dLytMapGlobal_c *global = getGlobal(); // TODO this should explain most of mMapEvent } void dLytMapMain_c::finalizeState_In() {} s32 dLytMapMain_c::getAreaGroup(s32 stifArea) const { s32 ret = AREAGROUP_MAX; if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) { switch (mSurfaceProvince) { case SURFACE_PROVINCE_FARON: ret = AREAGROUP_FARON; break; case SURFACE_PROVINCE_ELDIN: ret = AREAGROUP_ELDIN; break; case SURFACE_PROVINCE_LANAYRU: ret = AREAGROUP_LANAYRU; break; } } else { switch (stifArea) { case dStageMgr_c::STIF_AREA_SKY: ret = AREAGROUP_SKY; break; case dStageMgr_c::STIF_AREA_SEALED_GROUNDS: ret = AREAGROUP_SEALED_GROUNDS; break; case dStageMgr_c::STIF_AREA_FARON_WOODS: case dStageMgr_c::STIF_AREA_DEEP_WOODS: case dStageMgr_c::STIF_AREA_LAKE_FLORIA: ret = AREAGROUP_FARON; break; case dStageMgr_c::STIF_AREA_VOLCANO_SOUTH: case dStageMgr_c::STIF_AREA_VOLCANO_NORTH: ret = AREAGROUP_ELDIN; break; case dStageMgr_c::STIF_AREA_LANAYRU_MINE: case dStageMgr_c::STIF_AREA_LANAYRU_DESERT: case dStageMgr_c::STIF_AREA_LANAYRU_SAND_SEA: case dStageMgr_c::STIF_AREA_LANAYRU_CAVES: case dStageMgr_c::STIF_AREA_LANAYRU_GORGE: ret = AREAGROUP_LANAYRU; break; } } return ret; } s32 dLytMapMain_c::getRoomType() const { s32 ret = ROOMTYPE_FIELD; s32 stifRoomType = dStageMgr_c::GetInstance()->getSTIFRoomType(); if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) { ret = ROOMTYPE_FIELD; } if (dScGame_c::isCurrentStage("F011r") || (dScGame_c::isCurrentStage("F002r") && dScGame_c::currentSpawnInfo.isNight()) || dScGame_c::isCurrentStage("F010r") || dScGame_c::isCurrentStage("F019r")) { ret = ROOMTYPE_SKYFIELD_INTERIOR; } else if (stifRoomType == dStageMgr_c::STIF_ROOMTYPE_FIELD) { ret = ROOMTYPE_FIELD; } else if (stifRoomType == dStageMgr_c::STIF_ROOMTYPE_DUNGEON) { ret = ROOMTYPE_DUNGEON; } else if (stifRoomType == dStageMgr_c::STIF_ROOMTYPE_SKYLOFT) { ret = ROOMTYPE_SKYLOFT; } else if (stifRoomType == dStageMgr_c::STIF_ROOMTYPE_BOSS_HOUSE) { ret = ROOMTYPE_BOSS_HOUSE; } else if (stifRoomType == dStageMgr_c::STIF_ROOMTYPE_SKYFIELD) { ret = ROOMTYPE_SKYFIELD; } return ret; } void dLytMapMain_c::zoomIn() { if (mRoomType == ROOMTYPE_SKYLOFT || (mAreaGroup == AREAGROUP_SKY && (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_DUNGEON))) { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) { if (dPad::getDownTrigRight()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_AREA); mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD_SKY; mStateMgr.changeState(StateID_ChgDispAreaMode_WA); } } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) { if (dPad::getDownTrigRight()) { mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_COURSE); mStateMgr.changeState(StateID_ChgDispAreaMode_WA); } } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { if (dPad::getDownTrigRight() || dPad::getDownTrigA()) { mNextMapUpDirection = mMapUpDirectionAfterZoomToDetail; mNextMapMode = dLytMapGlobal_c::MAPMODE_ZOOM; dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_DETAIL); if (mPointerOnMap && (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { mStateMgr.changeState(StateID_ChgDispAreaMode_CsrRot); } else { mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); } } } } else if (mRoomType == ROOMTYPE_SKYFIELD || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR) { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) { if (dPad::getDownTrigRight()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_COURSE); mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; mStateMgr.changeState(StateID_ChgDispAreaMode_WA); } } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { if (dPad::getDownTrigRight()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_COURSE); mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; mStateMgr.changeState(StateID_ChgDispAreaMode_WA); } } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { if (dPad::getDownTrigRight() || dPad::getDownTrigA()) { mNextMapUpDirection = mMapUpDirectionAfterZoomToDetail; mNextMapMode = dLytMapGlobal_c::MAPMODE_ZOOM; dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_DETAIL); if (mPointerOnMap && (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { mStateMgr.changeState(StateID_ChgDispAreaMode_CsrRot); } else { mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); } } } } else if (mRoomType == ROOMTYPE_FIELD) { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) { if (dPad::getDownTrigRight()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_AREA); mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE; mStateMgr.changeState(StateID_ChgDispAreaMode_WA); } } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { if (dPad::getDownTrigRight()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_COURSE); mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; mStateMgr.changeState(StateID_ChgDispAreaMode_WA); } } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { if (dPad::getDownTrigRight() || dPad::getDownTrigA()) { mNextMapUpDirection = mMapUpDirectionAfterZoomToDetail; mNextMapMode = dLytMapGlobal_c::MAPMODE_ZOOM; dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_DETAIL); if (mPointerOnMap && (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { mStateMgr.changeState(StateID_ChgDispAreaMode_CsrRot); } else { mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); } } } } else if (mRoomType == ROOMTYPE_DUNGEON) { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) { if (dPad::getDownTrigRight()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_AREA); mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE; mStateMgr.changeState(StateID_ChgDispAreaMode_WA); } } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { if (dPad::getDownTrigRight()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_COURSE); mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; mStateMgr.changeState(StateID_ChgDispAreaMode_WA); } } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { if (dPad::getDownTrigRight() || (!mFloorBtnMgr.hasPointedAtABtnIdx() && dPad::getDownTrigA())) { mNextMapUpDirection = mMapUpDirectionAfterZoomToDetail; mNextMapMode = dLytMapGlobal_c::MAPMODE_ZOOM; dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_DETAIL); if (mPointerOnMap && (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { mStateMgr.changeState(StateID_ChgDispAreaMode_CsrRot); } else { mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); } } } } else if (mRoomType == ROOMTYPE_BOSS_HOUSE) { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) { if (dPad::getDownTrigRight()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_AREA); mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE; mStateMgr.changeState(StateID_ChgDispAreaMode_WA); } } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { if (dPad::getDownTrigRight()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_COURSE); mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; mStateMgr.changeState(StateID_ChgDispAreaMode_WA); } } } } void dLytMapMain_c::zoomOut() { if (mRoomType == ROOMTYPE_SKYLOFT || (mAreaGroup == AREAGROUP_SKY && (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_DUNGEON))) { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) { if (dPad::getDownTrigLeft()) { mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD; dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD); mStateMgr.changeState(StateID_ChgDispAreaMode_WA); } } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { if (dPad::getDownTrigLeft()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_AREA); mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD_SKY; mStateMgr.changeState(StateID_ChgDispAreaMode_WA); } } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { if (dPad::getDownTrigLeft() || dPad::getDownTrigA()) { mMapUpDirectionAfterZoomToDetail = mMapUpDirection; mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; mNextMapUpDirection = true; dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_COURSE); mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); } } } else if (mRoomType == ROOMTYPE_SKYFIELD || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR) { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { if (dPad::getDownTrigLeft()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD); mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD; mStateMgr.changeState(StateID_ChgDispAreaMode_WA); } } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { if (dPad::getDownTrigLeft()) { mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD; dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD); mStateMgr.changeState(StateID_ChgDispAreaMode_WA); } } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { if (dPad::getDownTrigLeft() || dPad::getDownTrigA()) { mMapUpDirectionAfterZoomToDetail = mMapUpDirection; mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; mNextMapUpDirection = true; dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_COURSE); mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); } } } else if (mRoomType == ROOMTYPE_FIELD) { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { if (dPad::getDownTrigLeft()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD); mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD; mStateMgr.changeState(StateID_ChgDispAreaMode_WA); } } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { if (dPad::getDownTrigLeft()) { mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE; dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_AREA); mStateMgr.changeState(StateID_ChgDispAreaMode_WA); } } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { if (dPad::getDownTrigLeft() || dPad::getDownTrigA()) { mMapUpDirectionAfterZoomToDetail = mMapUpDirection; mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; mNextMapUpDirection = true; dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_COURSE); mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); } } } else if (mRoomType == ROOMTYPE_DUNGEON) { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { if (dPad::getDownTrigLeft()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD); mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD; mStateMgr.changeState(StateID_ChgDispAreaMode_WA); } } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { if (dPad::getDownTrigLeft()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_AREA); mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE; mStateMgr.changeState(StateID_ChgDispAreaMode_WA); } } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { if (dPad::getDownTrigLeft() || (!mFloorBtnMgr.hasPointedAtABtnIdx() && dPad::getDownTrigA())) { mMapUpDirectionAfterZoomToDetail = mMapUpDirection; mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; mNextMapUpDirection = true; dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_COURSE); mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); } } } else if (mRoomType == ROOMTYPE_BOSS_HOUSE) { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { if (dPad::getDownTrigLeft()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD); mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD; mStateMgr.changeState(StateID_ChgDispAreaMode_WA); } } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { if (dPad::getDownTrigLeft()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_AREA); mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE; mStateMgr.changeState(StateID_ChgDispAreaMode_WA); } } } } void dLytMapMain_c::initializeState_Active() {} void dLytMapMain_c::executeState_Active() { dLytMapGlobal_c *global = getGlobal(); if (dMessage_c::getInstance()->getField_0x328()) { return; } if (mRoomType == ROOMTYPE_SKYFIELD && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE && dPad::getDownTrigZ()) { if (mShowIslandNames) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ISLAND_NAME_OFF); } else { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ISLAND_NAME_ON); } mShowIslandNames = !mShowIslandNames; mMarkers.setIslandNamesOn(mShowIslandNames); } checkScroll(); if (needsNav(mCurrentMapMode) && needsNav(mNextMapMode)) { if (!mNavEnabled) { dPadNav::setNavEnabled(true, false); mNavEnabled = true; } if (mFloorBtnMgr.canDecideFloor() && dPad::getDownTrigA()) { mFloorBtnMgr.decideSelectedFloor(); field_0x8C64 = mFloorBtnMgr.getCurrentFloor(); global->setFloor(field_0x8C64); mStateMgr.changeState(StateID_FloorChange); } } else { if (mNavEnabled) { dPadNav::setNavEnabled(false, false); mNavEnabled = false; } } if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE && canZoomIn(dLytMapGlobal_c::MAPMODE_STAGE)) { if (mPointerOnMap && (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { // Can zoom in around cursor, use the cursor pos getGlobal()->unprojectFromMap(field_0x8CF4, dCsGame_c::GetInstance()->getCursorIf()->getCursorPos()); f32 tmp = fn_80142D90(dLytMapGlobal_c::MAPMODE_STAGE); fn_8013FB70(field_0x8CF4, getGlobal()->getField_0x44() / tmp); mDrawScaleFrame = true; } else { // Cannot zoom in around cursor, use the player pos f32 tmp = fn_80142D90(dLytMapGlobal_c::MAPMODE_STAGE); f32 val = getGlobal()->getField_0x44() / tmp; fn_8013FB70(getGlobal()->getPlayerPos(), val); mDrawScaleFrame = true; } } if (field_0x8DBD && *mPinIconAggregate.mStateMgr.getStateID() != dLytMapPinIconAggregate_c::StateID_Select && dPad::getDownTrigC() && mPointerCanPlaceBeacon) { s32 id = -1; mPinIconAggregate.findNewBeaconId(&id); if (id >= 0) { mVec3_c pos3d; dLytMapGlobal_c *global = getGlobal(); global->unprojectFromMap(pos3d, dCsGame_c::GetInstance()->getCursorIf()->getCursorPos()); mPinIconAggregate.setPosition(id, pos3d); setBeaconPositionChecked(&pos3d, id); dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_BEACON_SET); } } else if ((dPad::getDownTrigLeft() && canZoomOut(mCurrentMapMode)) || (dPad::getDownTrigA() && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && canZoomOut(mCurrentMapMode) )) { zoomOut(); } else if ((dPad::getDownTrigRight() && canZoomIn(mCurrentMapMode)) || (dPad::getDownTrigA() && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && canZoomIn(mCurrentMapMode) )) { zoomIn(); } else if ((mRoomType == ROOMTYPE_FIELD || mRoomType == ROOMTYPE_DUNGEON || mRoomType == ROOMTYPE_SKYLOFT || mRoomType == ROOMTYPE_SKYFIELD) && canResetPosition(mCurrentMapMode, mMapUpDirection) && dPad::getDownTrigUp()) { mVec3_c pos; fn_80142F00(pos, mCurrentMapMode, mMapUpDirection, global->getMapRotationCenter(), global->getField_0x56()); f32 distSq = global->getMapScroll().squareDistanceToXZ(pos); if (field_0x8D58 != global->getFloor()) { mFloorBtnMgr.resetFloor(-(field_0x8D58 - field_0x8D60)); global->setFloor(field_0x8D58); mStateMgr.changeState(StateID_ResetPosWithFloorChange); } else if (distSq >= 1.0f) { mStateMgr.changeState(StateID_ResetPos); } else { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_RESET_NOT_MOVE); } } else if (canChangeUpDirection(mCurrentMapMode, mMapUpDirection) && dPad::getDownTrigZ()) { mStateMgr.changeState(StateID_ChgMapUpDirection); } if ((mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) || (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM)) { field_0xF1C.field_0x05 = true; } mPinIconAggregate.execute(); for (int idx = 0; idx < (int)ARRAY_LENGTH(mHitChecks); idx++) { mHitChecks[idx].resetCachedHitboxes(); mHitChecks[idx].execute(); } } void dLytMapMain_c::finalizeState_Active() { mDrawScaleFrame = false; } void dLytMapMain_c::initializeState_Out() { if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) { mPopupInfo.mStateMgr.changeState(StateID_Out); } dLytMeter_c::GetInstance()->setMeterField_0x13750(0); if (field_0x8CAD || mMapEvent == MAP_EVENT_MAP_INTRO) { mpOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_OUT]; } else { mpOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_OUT_NO_CAM]; } mpOutAnmGroup->bind(false); mpOutAnmGroup->setFrame(0.0f); field_0x8C8C = mpOutAnmGroup->getLastFrame(); if (fn_80141530()) { dBase_c::s_NextExecuteControlFlags &= ~dBase_c::BASE_PROP_0x10; } dPadNav::setNavEnabled(false, false); } void dLytMapMain_c::executeState_Out() { if (mpOutAnmGroup->isEndReached()) { bool specialMode = isSomeFieldEq0Or1Or7Or9Or11(); // Kind of a weird way to write `specialMode || ... != 3 ` if ((specialMode && dScGame_c::getCamera(0)->getField_0xDA8() != 3) || !specialMode) { dBase_c::s_NextExecuteControlFlags &= ~dBase_c::BASE_PROP_0x10; mLyt.calc(); mpOutAnmGroup->unbind(); field_0x8DBF = 0; mStateMgr.changeState(StateID_Invisible); } } if (mpOutAnmGroup->isBound()) { mpOutAnmGroup->play(); } } void dLytMapMain_c::finalizeState_Out() {} void dLytMapMain_c::initializeState_FloorChange() { mMapCapture.renderRequest(); } void dLytMapMain_c::executeState_FloorChange() { if (!mMapCapture.isBusyRendering()) { mStateMgr.changeState(StateID_Active); dPadNav::stopFSStickNav(); } } void dLytMapMain_c::finalizeState_FloorChange() {} void dLytMapMain_c::initializeState_ChgMapUpDirection() { mNextMapUpDirection = !mMapUpDirection; field_0x8D44 = getGlobal()->getMapRotation(); if (mMapEvent == MAP_EVENT_MAP_INTRO) { field_0x8D46 = dAcPy_c::GetLink()->mRotation.y + mAng(0x8000); mNextMapUpDirection = false; } else { fn_80142D10(mCurrentMapMode, mNextMapUpDirection, field_0x8D46); } (void)getGlobal(); dLytMapGlobal_c *global = getGlobal(); mPlayerPos = global->getPlayerPos(); mVec2_c v(0.0f, 0.0f); global->unprojectFromMap(mMapScroll, v, field_0x8D44); global->setMapRotationCenter(mPlayerPos); const mVec3_c ¢er = global->getMapRotationCenter(); fn_80143060(mPlayerPos, mPlayerPos, center, field_0x8D46); fn_80143060(mMapScroll, mMapScroll, center, field_0x8D44); global->setMapScroll(mMapScroll); field_0x8C70 = 0; dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_CHANGE_DIRECT); } void dLytMapMain_c::executeState_ChgMapUpDirection() { if (mMapEvent == MAP_EVENT_MAP_INTRO && field_0x8D6A) { fn_80140B90(); } else { dLytMapGlobal_c *global = getGlobal(); f32 factor = cLib::easeOut((f32)field_0x8C70 / sHio.field_0x1B, 2.0f); // Lerps // TODO stack and reg swaps global->setMapRotation(factor * mAng(field_0x8D46 - field_0x8D44) + field_0x8D44); mVec3_c actualPos = (mPlayerPos - mMapScroll) * factor + mMapScroll; global->setMapScroll(actualPos); if (field_0x8C70 >= sHio.field_0x1B) { mLyt.calc(); mMapUpDirection = mNextMapUpDirection; if (mMapEvent == MAP_EVENT_MAP_INTRO) { mStateMgr.changeState(StateID_EventMapIntro_Step4); } else { mStateMgr.changeState(StateID_Active); } } else { field_0x8C70++; } if (mMapEvent == MAP_EVENT_MAP_INTRO) { EventManager::execute(); } } } void dLytMapMain_c::finalizeState_ChgMapUpDirection() {} void dLytMapMain_c::initializeState_ChgDispAreaMode_MapRot() { dLytMapGlobal_c *global = getGlobal(); mMapScroll = global->getMapScroll(); field_0x8D50 = global->getField_0x44(); field_0x8D44 = global->getMapRotation(); field_0x8D4C = fn_80142D90(mNextMapMode); if (mMapEvent == MAP_EVENT_MAP_INTRO) { field_0x8D46 = dAcPy_c::GetLink()->mRotation.y + mAng(0x8000); mNextMapUpDirection = false; } else { mNextMapUpDirection = fn_80142D10(mNextMapMode, mNextMapUpDirection, field_0x8D46); } fn_80142F00(mPlayerPos, mNextMapMode, mNextMapUpDirection, global->getMapRotationCenter(), global->getField_0x56()); field_0x8C70 = 0; if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { global->setZoomFrame(1.0f); global->setField_0x58(field_0x8D50 / field_0x8D4C); } else { global->setZoomFrame(0.0f); global->setField_0x58(1.0f); } if (mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && !mNextMapUpDirection) { mVec2_c v(0.0f, 0.0f); global->unprojectFromMap(mMapScroll, v, field_0x8D44); mVec3_c v2 = mPlayerPos; global->setMapRotationCenter(v2); dLytMapGlobal_c *global2 = getGlobal(); const mVec3_c ¢er = global2->getMapRotationCenter(); fn_80143060(mPlayerPos, v2, center, field_0x8D46); mVec3_c v3 = mMapScroll; fn_80143060(mMapScroll, v3, center, field_0x8D44); mVec3_c v4 = mMapScroll; global2->setMapScroll(v4); } else { mVec2_c v(0.0f, 0.0f); global->unprojectFromMap(mMapScroll, v, field_0x8D44); if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { mPlayerPos = field_0x8CC4; } else { mPlayerPos = global->getPlayerPos(); } global->setMapRotationCenter(mMapScroll); mVec3_c v2 = mPlayerPos; dLytMapGlobal_c *global2 = getGlobal(); const mVec3_c ¢er = global2->getMapRotationCenter(); fn_80143060(mPlayerPos, v2, center, field_0x8D46); mVec3_c v3 = mMapScroll; fn_80143060(mMapScroll, v3, center, field_0x8D44); mVec3_c v4 = mMapScroll; global2->setMapScroll(v4); } mAnmGroups[MAP_MAIN_ANIM_ROTATE].bind(false); if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { mAnmGroups[MAP_MAIN_ANIM_ROTATE].setFrame(0.0f); } else { mAnmGroups[MAP_MAIN_ANIM_ROTATE].setToEnd(); } if (mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { mMarkers.setIslandNamesOn(false); } if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { mMarkers.setIslandNamesOn(mShowIslandNames); } if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { mVec2_c v(global->getField_0x20().x, global->getField_0x20().y); global->unprojectFromMap(field_0x8CF4, v); } } void dLytMapMain_c::executeState_ChgDispAreaMode_MapRot() { if (mMapEvent == MAP_EVENT_MAP_INTRO && field_0x8D6A) { fn_80140B90(); } else { dLytMapGlobal_c *global = getGlobal(); f32 f1 = (f32)field_0x8C70 / sHio.field_0x1B; f32 factor = cLib::easeInOut(f1, 2.0f); f32 f2, f3; if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { f32 ratio = field_0x8D50 / field_0x8D4C; f1 = 1.0f - f1; f2 = ratio + (1.0f - ratio) * factor; f3 = 1.0f - factor; } else { f32 ratio = field_0x8D4C / field_0x8D50; f2 = ratio + (1.0f - ratio) * (1.0f - factor); f3 = factor; } global->setZoomFrame(f1); global->setField_0x58(f2); // TODO - there is tons of dead code here // Lerps f32 f4 = field_0x8D50 + factor * (field_0x8D4C - field_0x8D50); global->setField_0x44(f4); // TODO stack and reg swaps global->setMapRotation(factor * mAng(field_0x8D46 - field_0x8D44) + field_0x8D44); mVec3_c actualPos; if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { actualPos = (mPlayerPos - mMapScroll) * (1.0f - factor) * (1.0f / (f4 / field_0x8D50)) + mMapScroll; } else { actualPos = (mPlayerPos - mMapScroll) * (1.0f - factor) * (1.0f / (f4 / field_0x8D50)) + mMapScroll; } global->setMapScroll(actualPos); if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { fn_8013FB70(field_0x8CF4, f4 / field_0x8D50); mDrawScaleFrame = true; } // TODO dead code f32 length = mAnmGroups[MAP_MAIN_ANIM_ROTATE].getLastFrame(); mAnmGroups[MAP_MAIN_ANIM_ROTATE].setFrame(length - f3 * length); if (field_0x8C70 >= sHio.field_0x1C) { if (mMapEvent == MAP_EVENT_MAP_INTRO && field_0x0108 > 0) { field_0x0108--; } else { mDrawScaleFrame = false; if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { mAnmGroups[MAP_MAIN_ANIM_ROTATE].setToEnd(); } else { mAnmGroups[MAP_MAIN_ANIM_ROTATE].setFrame(0.0f); } mLyt.calc(); mAnmGroups[MAP_MAIN_ANIM_ROTATE].unbind(); mDrawScaleFrame = false; mMapUpDirection = mNextMapUpDirection; global->setMapRotation(field_0x8D46); global->setField_0x44(field_0x8D4C); global->setMapScroll(mPlayerPos); if (mMapEvent == MAP_EVENT_MAP_INTRO) { mStateMgr.changeState(StateID_EventMapIntro_Step4); } else { mStateMgr.changeState(StateID_Active); mCurrentMapMode = mNextMapMode; } } } else { field_0x8C70++; } if (mMapEvent == MAP_EVENT_MAP_INTRO) { EventManager::execute(); } } } void dLytMapMain_c::finalizeState_ChgDispAreaMode_MapRot() {} void dLytMapMain_c::initializeState_ChgDispAreaMode_Map() {} void dLytMapMain_c::executeState_ChgDispAreaMode_Map() { // Won't attempt this until the dead code in executeState_ChgDispAreaMode_MapRot is solved } void dLytMapMain_c::finalizeState_ChgDispAreaMode_Map() {} void dLytMapMain_c::initializeState_ChgDispAreaMode_WA() {} void dLytMapMain_c::executeState_ChgDispAreaMode_WA() {} void dLytMapMain_c::finalizeState_ChgDispAreaMode_WA() {} void dLytMapMain_c::initializeState_ChgDispAreaMode_CsrRot() {} void dLytMapMain_c::executeState_ChgDispAreaMode_CsrRot() {} void dLytMapMain_c::finalizeState_ChgDispAreaMode_CsrRot() {} void dLytMapMain_c::initializeState_ResetPos() { dLytMapGlobal_c *global = getGlobal(); field_0x8C70 = 0; mMapScroll = global->getMapScroll(); fn_80142F00(mPlayerPos, mCurrentMapMode, mMapUpDirection, global->getMapRotationCenter(), global->getField_0x56()); field_0x8C70 = 0; dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_RESET_START); } void dLytMapMain_c::executeState_ResetPos() { dLytMapGlobal_c *global = getGlobal(); f32 factor = cLib::easeOut((f32)field_0x8C70 / sHio.field_0x1A, 2.0f); mVec3_c pos = (mPlayerPos - mMapScroll) * factor + mMapScroll; global->setMapScroll(pos); dSndSmallEffectMgr_c::GetInstance()->holdSound(SE_S_MAP_RESET_LV); if (field_0x8C70 >= sHio.field_0x1A) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_RESET_END); mStateMgr.changeState(StateID_Active); } else { field_0x8C70++; } } void dLytMapMain_c::finalizeState_ResetPos() {} void dLytMapMain_c::initializeState_ResetPosWithFloorChange() { dPadNav::stopFSStickNav(); mMapCapture.renderRequest(); } void dLytMapMain_c::executeState_ResetPosWithFloorChange() { if (mMapCapture.isBusyRendering()) { return; } dLytMapGlobal_c *global = getGlobal(); mVec3_c pos; fn_80142F00(pos, mCurrentMapMode, mMapUpDirection, global->getMapRotationCenter(), global->getField_0x56()); if (global->getMapScroll().squareDistanceToXZ(pos) >= 1.0f) { mStateMgr.changeState(StateID_ResetPos); } else { mStateMgr.changeState(StateID_Active); } } void dLytMapMain_c::finalizeState_ResetPosWithFloorChange() {} void dLytMapMain_c::initializeState_EventSwBankSmall_Step1() { mEventTimer = sHio.field_0x1D; field_0x8CB4 = 0; } void dLytMapMain_c::executeState_EventSwBankSmall_Step1() { if (mEventTimer != 0) { mEventTimer--; return; } mMarkers.setField_0x0703(1); mStateMgr.changeState(StateID_EventSwBankSmall_Step2); } void dLytMapMain_c::finalizeState_EventSwBankSmall_Step1() {} void dLytMapMain_c::initializeState_EventSwBankSmall_Step2() { mEventTimer = mMarkers.getField_0x0704(); } void dLytMapMain_c::executeState_EventSwBankSmall_Step2() { if (mEventTimer != 0) { mEventTimer--; return; } mStateMgr.changeState(StateID_EventSwBankSmall_Step3); } void dLytMapMain_c::finalizeState_EventSwBankSmall_Step2() {} void dLytMapMain_c::initializeState_EventSwBankSmall_Step3() { mEventTimer = sHio.field_0x1E; } void dLytMapMain_c::executeState_EventSwBankSmall_Step3() { if (mEventTimer != 0) { mEventTimer--; return; } field_0x8D6B = 1; } void dLytMapMain_c::finalizeState_EventSwBankSmall_Step3() {} void dLytMapMain_c::initializeState_EventMapIntro_Step1() { mEventTimer = sHio.field_0x1F; } void dLytMapMain_c::executeState_EventMapIntro_Step1() { if (field_0x8D6A) { fn_80140B90(); return; } if (mEventTimer != 0) { mEventTimer--; } else { mStateMgr.changeState(StateID_EventMapIntro_Step2); } EventManager::execute(); } void dLytMapMain_c::finalizeState_EventMapIntro_Step1() {} void dLytMapMain_c::initializeState_EventMapIntro_Step2() { if (field_0x8880[field_0x88AC] != nullptr) { field_0x8880[field_0x88AC]->bind(false); field_0x8880[field_0x88AC]->setFrame(0.0f); mLyt.calc(); dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_WORLD_EXTEND); } } void dLytMapMain_c::executeState_EventMapIntro_Step2() { if (field_0x8D6A) { fn_80140B90(); return; } if (field_0x8880[field_0x88AC] != nullptr) { if (field_0x8880[field_0x88AC]->isEndReached()) { field_0x8880[field_0x88AC]->unbind(); mStateMgr.changeState(StateID_EventMapIntro_Step3); } else { field_0x8880[field_0x88AC]->play(); } } else { mStateMgr.changeState(StateID_EventMapIntro_Step3); } EventManager::execute(); } void dLytMapMain_c::finalizeState_EventMapIntro_Step2() {} void dLytMapMain_c::initializeState_EventMapIntro_Step3() { mEventTimer = 0; } void dLytMapMain_c::executeState_EventMapIntro_Step3() { if (field_0x8D6A) { fn_80140B90(); return; } if (mEventTimer != 0) { mEventTimer--; } else { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_AREA); mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE; field_0x0108 = sHio.field_0x20; mStateMgr.changeState(StateID_ChgDispAreaMode_WA); } EventManager::execute(); } void dLytMapMain_c::finalizeState_EventMapIntro_Step3() {} void dLytMapMain_c::initializeState_EventMapIntro_Step4() { mEventTimer = sHio.field_0x21; } void dLytMapMain_c::executeState_EventMapIntro_Step4() { if (field_0x8D6A) { fn_80140B90(); return; } if (mEventTimer != 0) { mEventTimer--; } else { field_0x8D6B = 1; } EventManager::execute(); } void dLytMapMain_c::finalizeState_EventMapIntro_Step4() {} void dLytMapMain_c::fn_80140B90() { mAnmGroups[MAP_MAIN_ANIM_OUT].bind(false); mAnmGroups[MAP_MAIN_ANIM_OUT].setToEnd(); mLyt.calc(); mAnmGroups[MAP_MAIN_ANIM_OUT].unbind(); dBase_c::s_NextExecuteControlFlags &= ~dBase_c::BASE_PROP_0x10; dBase_c::s_DrawControlFlags &= ~dBase_c::BASE_PROP_0x10; dScGame_c::getCamera(0)->doFn_80093360(); dScGame_c::getCamera(0)->fn_8019E430(); mStateMgr.changeState(StateID_Invisible); } void dLytMapMain_c::initializeState_EventDungeonMapGet_Step1() { mEventTimer = sHio.field_0x22; } void dLytMapMain_c::executeState_EventDungeonMapGet_Step1() { if (mEventTimer != 0) { mEventTimer--; } else { mStateMgr.changeState(StateID_EventDungeonMapGet_Step2); } } void dLytMapMain_c::finalizeState_EventDungeonMapGet_Step1() {} void dLytMapMain_c::initializeState_EventDungeonMapGet_Step2() { mEventTimer = sHio.field_0x23; field_0x8CB4 = sHio.field_0x24; field_0x8CB8 = mMarkers.getField_0x0704(); field_0x8DBE = 0; dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_EXTEND); } void dLytMapMain_c::executeState_EventDungeonMapGet_Step2() { dLytMapGlobal_c *global = getGlobal(); if (mEventTimer != 0 || field_0x8CB4 != 0 || field_0x8CB8 != 0) { if (mEventTimer != 0) { mEventTimer--; } u8 u1 = (1.0f - (f32)mEventTimer / sHio.field_0x23) * 255.0f; global->setField_0x4F(u1); field_0x8DBE = u1; if (field_0x8CB4 != 0) { field_0x8CB4--; } else { mMarkers.setField_0x0702(1); if (field_0x8CB8 != 0) { field_0x8CB8--; } } } else { global->setField_0x4C(0); mStateMgr.changeState(StateID_EventDungeonMapGet_Step3); } } void dLytMapMain_c::finalizeState_EventDungeonMapGet_Step2() {} void dLytMapMain_c::initializeState_EventDungeonMapGet_Step3() { mEventTimer = sHio.field_0x25; } void dLytMapMain_c::executeState_EventDungeonMapGet_Step3() { if (mEventTimer != 0) { mEventTimer--; } else { field_0x8D6B = 1; } } void dLytMapMain_c::finalizeState_EventDungeonMapGet_Step3() {} void dLytMapMain_c::initializeState_EventFieldMapChange_Step1() { mEventTimer = sHio.field_0x26; } void dLytMapMain_c::executeState_EventFieldMapChange_Step1() { if (mEventTimer != 0) { mEventTimer--; } else { mStateMgr.changeState(StateID_EventFieldMapChange_Step2); } } void dLytMapMain_c::finalizeState_EventFieldMapChange_Step1() {} void dLytMapMain_c::initializeState_EventFieldMapChange_Step2() { mEventTimer = sHio.field_0x27; field_0x8DBE = 0; dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_EXTEND); } void dLytMapMain_c::executeState_EventFieldMapChange_Step2() { dStage_c *stage = dStage_c::GetInstance(); u32 duration = sHio.field_0x27; if (mEventTimer != 0) { u8 u1 = (f32)(duration - mEventTimer) / (f32)duration * 255.0f; stage->getMapRelated()->setField_0x1E8(u1); mEventTimer--; } else { stage->getMapRelated()->setField_0x1E8(0); stage->getMapRelated()->setField_0x1EF(1); mStateMgr.changeState(StateID_EventFieldMapChange_Step3); } } void dLytMapMain_c::finalizeState_EventFieldMapChange_Step2() {} void dLytMapMain_c::initializeState_EventFieldMapChange_Step3() { mEventTimer = sHio.field_0x28; } void dLytMapMain_c::executeState_EventFieldMapChange_Step3() { if (mEventTimer != 0) { mEventTimer--; } else if (mMapEvent == MAP_EVENT_FIELD_MAP_CHANGE_8) { mStateMgr.changeState(StateID_Active); } else { mStateMgr.changeState(StateID_EventFieldMapChange_Step4); } } void dLytMapMain_c::finalizeState_EventFieldMapChange_Step3() {} void dLytMapMain_c::initializeState_EventFieldMapChange_Step4() {} void dLytMapMain_c::executeState_EventFieldMapChange_Step4() {} void dLytMapMain_c::finalizeState_EventFieldMapChange_Step4() {} void dLytMapMain_c::initializeState_EventForestMapChange_Step1() { mEventTimer = sHio.field_0x22; } void dLytMapMain_c::executeState_EventForestMapChange_Step1() { if (mEventTimer != 0) { mEventTimer--; } else { mStateMgr.changeState(StateID_EventForestMapChange_Step2); } } void dLytMapMain_c::finalizeState_EventForestMapChange_Step1() {} void dLytMapMain_c::initializeState_EventForestMapChange_Step2() { mEventTimer = sHio.field_0x23; field_0x8CB4 = sHio.field_0x24; field_0x8CB8 = mMarkers.getField_0x0704(); dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_EXTEND); field_0x8DBE = 0; } void dLytMapMain_c::executeState_EventForestMapChange_Step2() { dLytMapGlobal_c *global = getGlobal(); if (mEventTimer != 0 || field_0x8CB4 != 0 || field_0x8CB8 != 0) { if (mEventTimer != 0) { mEventTimer--; } u8 u1 = (1.0f - (f32)mEventTimer / sHio.field_0x23) * 255.0f; global->setField_0x4F(u1); field_0x8DBE = u1; if (field_0x8CB4 != 0) { field_0x8CB4--; } else { mMarkers.setField_0x0702(1); if (field_0x8CB8 != 0) { field_0x8CB8--; } } } else { global->setField_0x4C(0); mStateMgr.changeState(StateID_EventForestMapChange_Step3); } } void dLytMapMain_c::finalizeState_EventForestMapChange_Step2() {} void dLytMapMain_c::initializeState_EventForestMapChange_Step3() { mEventTimer = sHio.field_0x25; } void dLytMapMain_c::executeState_EventForestMapChange_Step3() { if (mEventTimer != 0) { mEventTimer--; } else { field_0x8D6B = 1; } } void dLytMapMain_c::finalizeState_EventForestMapChange_Step3() {} void dLytMapMain_c::initializeState_EventSignalAdd_Step1() {} void dLytMapMain_c::executeState_EventSignalAdd_Step1() { if (mDisplayedBeaconCount != getMaxBeaconCount()) { mStateMgr.changeState(StateID_EventSignalAdd_Step2); } } void dLytMapMain_c::finalizeState_EventSignalAdd_Step1() {} void dLytMapMain_c::initializeState_EventSignalAdd_Step2() { mEventTimer = sHio.field_0x29; } void dLytMapMain_c::executeState_EventSignalAdd_Step2() { if (mDisplayedBeaconCount == getMaxBeaconCount()) { mStateMgr.changeState(StateID_EventSignalAdd_Step3); } else if (--mEventTimer == 0) { mEventTimer = sHio.field_0x29; mDisplayedBeaconCount++; dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_BEACON_COUNT_UP); } } void dLytMapMain_c::finalizeState_EventSignalAdd_Step2() {} void dLytMapMain_c::initializeState_EventSignalAdd_Step3() { mEventTimer = sHio.field_0x25; } void dLytMapMain_c::executeState_EventSignalAdd_Step3() { if (mEventTimer != 0) { mEventTimer--; } else { mStateMgr.changeState(StateID_Active); } } void dLytMapMain_c::finalizeState_EventSignalAdd_Step3() {} bool dLytMapMain_c::fn_80141530() const { return EventManager::isInEvent() && mMapEvent != MAP_EVENT_11; } dAcTbox_c *dLytMapMain_c::findGoddessChestForStoryflag(s32 flag) const { dAcTbox_c *ret = nullptr; fBase_c *it = nullptr; while ((it = fManager_c::searchBaseByGroupType(fBase_c::ACTOR, it)) != nullptr) { if (it->mProfileName == fProfile::TBOX) { dAcTbox_c *box = static_cast(it); if (box->getVariant() == dAcTbox_c::GODDESS) { u16 boxFlag = box->getParams2Lower(); if (flag == boxFlag) { ret = box; break; } } } } return ret; } void dLytMapMain_c::initializeState_EventGoddessCube_Step1() { mEventTimer = 30; } void dLytMapMain_c::executeState_EventGoddessCube_Step1() { if (mEventTimer != 0) { mEventTimer--; } if (mEventTimer == 0) { mStateMgr.changeState(StateID_Active); } } void dLytMapMain_c::finalizeState_EventGoddessCube_Step1() { mEventTimer = 50; } void dLytMapMain_c::initializeState_EventGoddessCube_Step2() {} void dLytMapMain_c::executeState_EventGoddessCube_Step2() {} void dLytMapMain_c::finalizeState_EventGoddessCube_Step2() {} void dLytMapMain_c::initializeState_EventGoddessCube_Step3() {} void dLytMapMain_c::executeState_EventGoddessCube_Step3() { mStateMgr.changeState(StateID_Active); } void dLytMapMain_c::finalizeState_EventGoddessCube_Step3() {} bool dLytMapMain_c::checkStoryflag(s32 flag) const { return StoryflagManager::sInstance->getFlag(flag); } void dLytMapMain_c::initializeState_EventSaveObjMsgWindow() { if (mSurfaceProvince == SURFACE_PROVINCE_FARON && checkStoryflag(STORYFLAG_LEVIAS_FIGHT_DEFEATED) && !checkStoryflag(STORYFLAG_FLOODED_FARON_WOODS_DISCOVERED)) { // "A report, Master. An unusual phenomenon is taking place in Faron Woods, making it impossible to descend // directly into them at the moment." mFlowMgr.triggerEntryPoint(4, 18, 0, 0); } else { // "It is possible to descend to a specific..." / "Point to your preferred descent area..." mFlowMgr.triggerEntryPoint(4, 19, 0, 0); } } void dLytMapMain_c::executeState_EventSaveObjMsgWindow() { if (mFlowMgr.checkFinished()) { mStateMgr.changeState(StateID_EventSaveObjSelect); } } void dLytMapMain_c::finalizeState_EventSaveObjMsgWindow() {} enum dLytMapSaveObjFlagKind { SAVE_OBJ_FLAG_KIND_SCENEFLAG = 0, SAVE_OBJ_FLAG_KIND_STORYFLAG = 1, }; struct dLytMapSaveObjFlagDefinition { /* 0x00 */ dLytMapSaveObjFlagKind flagType; // I wanted designated initializers but MWCC doesn't have them... /* 0x04 */ union { struct { /* 0x04 */ u16 flagArea; /* 0x06 */ u16 sceneFlag; }; struct { /* 0x04 */ s16 storyFlag; /* 0x06 */ u16 _padding; }; }; }; static const dLytMapSaveObjFlagDefinition sSaveObjFlagsFaron[] = { {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 10, 31}, {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_800}, {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_801}, {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_802}, {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_803}, {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 1, 104}, {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 1, 103}, {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 2, 32}, {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 2, 33}, {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_FARON_DISCOVERED}, }; static const dLytMapSaveObjFlagDefinition sSaveObjFlagsEldin[] = { {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_804}, {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_805}, {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_806}, {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_807}, {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 5, 101}, {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 15, 114}, }; static const dLytMapSaveObjFlagDefinition sSaveObjFlagsLanayru[] = { {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 68}, {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 66}, {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 51}, {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 67}, {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 2}, {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 77}, {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 78}, {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 8, 10}, {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 8, 28}, {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 8, 85}, {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 8, 84}, {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 9, 12}, }; void dLytMapMain_c::displaySaveObjs() { for (int i = 0; i < mNumSaveObjs; i++) { mSaveObjs[i].init(); } s32 numFlags = ARRAY_LENGTH(sSaveObjFlagsFaron); nw4r::lyt::Bounding **pBoundings = mpSaveObjBoundingsFaron; const dLytMapSaveObjFlagDefinition *flagSet = sSaveObjFlagsFaron; switch (mSurfaceProvince) { case SURFACE_PROVINCE_ELDIN: { pBoundings = mpSaveObjBoundingsEldin; flagSet = sSaveObjFlagsEldin; numFlags = ARRAY_LENGTH(sSaveObjFlagsEldin); break; } case SURFACE_PROVINCE_LANAYRU: { pBoundings = mpSaveObjBoundingsLanayru; flagSet = sSaveObjFlagsLanayru; numFlags = ARRAY_LENGTH(sSaveObjFlagsLanayru); break; } } bool isInFaronSothMode = false; bool isInFaronFloodedMode = false; if (mSurfaceProvince == SURFACE_PROVINCE_FARON) { if (checkStoryflag(STORYFLAG_LEVIAS_FIGHT_DEFEATED) && !checkStoryflag(STORYFLAG_FLOODED_FARON_WOODS_DISCOVERED)) { isInFaronSothMode = true; } else if (checkStoryflag(STORYFLAG_FLOODED_FARON_WOODS_DISCOVERED) && !checkStoryflag(STORYFLAG_WATER_DRAGON_SOTH_PART)) { isInFaronFloodedMode = true; } } for (int i = 0; i < numFlags; i++) { bool visible = false; if (isInFaronSothMode) { if (i == 0 || i == 9) { visible = true; } } else if (isInFaronFloodedMode) { if (i == 0 || i == 4 || i == 9) { visible = true; } } else if (flagSet[i].flagType == SAVE_OBJ_FLAG_KIND_SCENEFLAG) { visible = SceneflagManager::sInstance->checkSceneflagGlobal(flagSet[i].flagArea, flagSet[i].sceneFlag); } else if (flagSet[i].flagType == SAVE_OBJ_FLAG_KIND_STORYFLAG) { visible = checkStoryflag(flagSet[i].storyFlag); } // TODO - SetVisible clrlwi pBoundings[i]->SetVisible(visible); } } void dLytMapMain_c::initializeState_EventSaveObjSelect() {} void dLytMapMain_c::executeState_EventSaveObjSelect() { mSavePopup.setCurrentStatue(-1); s32 currentSelected = getSelectedSaveObjIdx(); bool anyDecide = false; for (int i = 0; i < mNumSaveObjs; i++) { if (mSaveObjs[i].mStateMgr.isState(dLytMapSaveObj_c::StateID_Decide)) { anyDecide = true; } } for (int i = 0; i < mNumSaveObjs; i++) { mSaveObjs[i].mSelectRequest = false; if (currentSelected == i && !anyDecide) { mSaveObjs[i].mSelectRequest = true; if (!mSaveObjs[i].mDecideRequest) { mSavePopup.setCurrentStatue(i); } } mSaveObjs[i].execute(); bool select = false; if (mSaveObjs[i].mSelectRequest) { if (*mSaveObjs[i].mStateMgr.getStateID() == dLytMapSaveObj_c::StateID_Select) { select = true; } } if (select && dPad::getDownTrigA()) { mSaveObjs[i].mDecideRequest = true; mSavePopup.setCurrentStatue(-1); mSavePopup.hide(i); } } field_0x8DC0 = currentSelected; bool found = false; s32 statueIdx = 0; for (int i = 0; i < mNumSaveObjs; i++) { if (mSaveObjs[i].mDecideFinished) { found = true; statueIdx = i; break; } } if (found) { const dMapSaveObjDefinition *def = getSaveObjDefinition(mSurfaceProvince, statueIdx); mSaveCaption.setLabel(def->statueLabel); mSaveCaption.setType(def->type); mSaveCaption.mStateMgr.changeState(dLytMapSaveCaption_c::StateID_In); mStateMgr.changeState(StateID_EventSaveObjConfirmMsgWindow); } else { mSavePopup.execute(); } for (int i = 0; i < (int)ARRAY_LENGTH(mHitChecks); i++) { mHitChecks[i].resetCachedHitboxes(); mHitChecks[i].execute(); } } void dLytMapMain_c::finalizeState_EventSaveObjSelect() {} static const dMapSaveObjDefinition sFaronSaveObjs[] = { { "F400", 0, 0, 10, 4, "SAVEOBJ_NAME_00"}, { "F100", 0, 0, 50, 1, "SAVEOBJ_NAME_01"}, { "F100", 0, 0, 51, 1, "SAVEOBJ_NAME_02"}, { "F100", 0, 0, 52, 1, "SAVEOBJ_NAME_03"}, { "F100", 0, 0, 53, 1, "SAVEOBJ_NAME_04"}, { "F101", 0, 0, 13, 1, "SAVEOBJ_NAME_05"}, { "F101", 0, 0, 14, 1, "SAVEOBJ_NAME_06"}, { "F102", 3, 0, 2, 1, "SAVEOBJ_NAME_07"}, {"F102_1", 0, 0, 5, 1, "SAVEOBJ_NAME_08"}, { "F401", 1, 0, 8, 4, "SAVEOBJ_NAME_28"}, }; static const dMapSaveObjDefinition sFloodedFaronSaveObj = {"F103", 0, 0, 9, 1, "SAVEOBJ_NAME_09"}; static const dMapSaveObjDefinition sFaronLoweredGoddessStatueSaveObj = {"F406", 1, 0, 5, 4, "SAVEOBJ_NAME_29"}; static const dMapSaveObjDefinition sEldinSaveObjs[] = { { "F200", 0, 0, 2, 2, "SAVEOBJ_NAME_10"}, { "F200", 2, 0, 6, 2, "SAVEOBJ_NAME_11"}, { "F200", 2, 0, 7, 2, "SAVEOBJ_NAME_12"}, { "F200", 4, 0, 7, 2, "SAVEOBJ_NAME_13"}, {"F201_3", 0, 0, 3, 2, "SAVEOBJ_NAME_14"}, { "D201", 10, 0, 2, 2, "SAVEOBJ_NAME_15"}, }; static const dMapSaveObjDefinition sLanayruSaveObjs[] = { {"F300_1", 0, 0, 2, 3, "SAVEOBJ_NAME_16"}, { "F300", 0, 0, 15, 3, "SAVEOBJ_NAME_17"}, { "F300", 0, 0, 16, 3, "SAVEOBJ_NAME_18"}, { "F300", 0, 0, 17, 3, "SAVEOBJ_NAME_19"}, { "F300", 0, 0, 18, 3, "SAVEOBJ_NAME_20"}, {"F300_4", 0, 0, 16, 3, "SAVEOBJ_NAME_21"}, {"F300_4", 0, 0, 17, 3, "SAVEOBJ_NAME_22"}, { "F301", 0, 0, 10, 3, "SAVEOBJ_NAME_23"}, {"F301_3", 0, 0, 10, 3, "SAVEOBJ_NAME_24"}, {"F301_4", 0, 0, 10, 3, "SAVEOBJ_NAME_25"}, {"F301_6", 0, 0, 10, 3, "SAVEOBJ_NAME_26"}, { "F302", 0, 0, 12, 3, "SAVEOBJ_NAME_27"}, }; const dMapSaveObjDefinition *dLytMapMain_c::getSaveObjDefinition(s32 province, s32 index) const { const dMapSaveObjDefinition *ret = nullptr; switch (province) { case SURFACE_PROVINCE_FARON: { if (index == 4 && checkStoryflag(STORYFLAG_FLOODED_FARON_WOODS_DISCOVERED) && !checkStoryflag(STORYFLAG_WATER_DRAGON_SOTH_PART)) { ret = &sFloodedFaronSaveObj; } else if (index == 9 && checkStoryflag(STORYFLAG_GODDESS_STATUE_FALLEN)) { ret = &sFaronLoweredGoddessStatueSaveObj; } else { ret = &sFaronSaveObjs[index]; } break; } case SURFACE_PROVINCE_ELDIN: { ret = &sEldinSaveObjs[index]; break; } case SURFACE_PROVINCE_LANAYRU: { ret = &sLanayruSaveObjs[index]; break; } } return ret; } void dLytMapMain_c::initializeState_EventSaveObjConfirmMsgWindow() { // "Descend into this area? [1]Yes.[2-]No." mFlowMgr.triggerEntryPoint(4, 17, 0, 0); } void dLytMapMain_c::executeState_EventSaveObjConfirmMsgWindow() { if (!mFlowMgr.checkFinished()) { return; } if (dLytMsgWindow_c::getInstance()->getTextOptionSelection() == 0) { // confirm dBase_c::s_NextExecuteControlFlags &= ~dBase_c::BASE_PROP_0x10; dBase_c::s_DrawControlFlags &= ~dBase_c::BASE_PROP_0x10; s32 idx = 0; s32 statueIdx = -1; for (int i = 0; i < mNumSaveObjs; i++) { if (mSaveObjs[i].mDecideFinished) { statueIdx = i; break; } } const dMapSaveObjDefinition *def = getSaveObjDefinition(mSurfaceProvince, statueIdx); dScGame_c::GetInstance()->triggerEntrance( def->stageName, def->room, def->layer, def->entrance, SpawnInfo::RETAIN_TOD, SpawnInfo::RETAIN_TRIAL, dFader_c::FADER_GREY ); dScGame_c::GetInstance()->setTargetingScreenPrio(0x8B); dLytMap_c::GetInstance()->fn_80143A30(); mStateMgr.changeState(StateID_EventSaveObjDecide); mSaveCaption.mStateMgr.changeState(dLytMapSaveCaption_c::StateID_Out); } else { // cancel for (int i = 0; i < mNumSaveObjs; i++) { mSaveObjs[i].init(); } mStateMgr.changeState(StateID_EventSaveObjSelect); mSaveCaption.mStateMgr.changeState(dLytMapSaveCaption_c::StateID_Out); } } void dLytMapMain_c::finalizeState_EventSaveObjConfirmMsgWindow() {} void dLytMapMain_c::initializeState_EventSaveObjDecide() {} void dLytMapMain_c::executeState_EventSaveObjDecide() {} void dLytMapMain_c::finalizeState_EventSaveObjDecide() {} void dLytMapMain_c::checkCursorPointedAtMap() { const mVec2_c *pos2d; dLytMapGlobal_c *global = getGlobal(); bool pointerOnMap = true; bool canPlaceBeacon = true; pos2d = &dCsGame_c::GetInstance()->getCursorIf()->getCursorPos(); mVec3_c pos3d(0.0f, 0.0f, 0.0f); global->unprojectFromMap(pos3d, *pos2d, global->getMapRotation()); f32 tmp = global->getField_0x28().x * 368.0f; f32 nTmp = -tmp; if (pos2d->x > tmp || pos2d->x < nTmp || pos2d->y > 209.0f || pos2d->y < -193.0f) { // Pointer off screen? pointerOnMap = false; canPlaceBeacon = false; } if (pointerOnMap && (pos3d.x < field_0x8930.x || pos3d.x > field_0x893C.x || pos3d.z < field_0x8930.z || pos3d.z > field_0x893C.z)) { // Pointer too close to the edge? canPlaceBeacon = false; } if (pointerOnMap) { for (int i = 0; i < MAP_MAIN_NUM_BOUNDINGS_NORMAL; i++) { if (pos3d.x >= mBoundingWorldBounds[i].min.x && pos3d.x <= mBoundingWorldBounds[i].max.x && pos3d.z >= mBoundingWorldBounds[i].min.z && pos3d.z <= mBoundingWorldBounds[i].max.z) { // Cannot place beacon when hovering over UI element (remocon, ...) canPlaceBeacon = false; break; } } } mPointerOnMap = pointerOnMap; mPointerCanPlaceBeacon = canPlaceBeacon; } void dLytMap_c::build() { d2d::setLytAllocator(); void *data = LayoutArcManager::GetInstance()->getLoadedData("Map2D"); mResAcc.attach(data, ""); mMapMain.build(); m2d::setLytAllocator(); mMapMain.setPriority(0x86); // TODO there's another thing here at 0x91C0 }