// clang-format off #include "common.h" #include "d/d_sc_game.h" #include "d/d_sc_title.h" #include "d/lyt/d_lyt_area_caption.h" #include "d/lyt/d_lyt_meter_configuration.h" #include "d/lyt/d_window.h" #include "d/lyt/meter/d_lyt_meter.h" #include "toBeSorted/stage_manager.h" #include "toBeSorted/arc_managers/layout_arc_manager.h" // clang-format on static dLytMeterConfiguration_c sConf; STATE_DEFINE(dLytMeter1Button_c, Wait); STATE_DEFINE(dLytMeter1Button_c, ToUse); STATE_DEFINE(dLytMeter1Button_c, ToUnuse); STATE_DEFINE(dLytMeter1Button_c, Unuse); STATE_DEFINE(dLytMeter2Button_c, Wait); STATE_DEFINE(dLytMeter2Button_c, ToUse); STATE_DEFINE(dLytMeter2Button_c, ToUnuse); STATE_DEFINE(dLytMeter2Button_c, Unuse); STATE_DEFINE(dLytMeterParts_c, Invisible); STATE_DEFINE(dLytMeterParts_c, In); STATE_DEFINE(dLytMeterParts_c, Visible); STATE_DEFINE(dLytMeterParts_c, Out); void dLytMeter1Button_c::initializeState_Wait() {} void dLytMeter1Button_c::executeState_Wait() { if (dLytMeterContainer_c::sInstance->isButtonFlag(0x80)) { return; } mStateMgr.changeState(StateID_ToUnuse); } void dLytMeter1Button_c::finalizeState_Wait() {} void dLytMeter1Button_c::initializeState_ToUse() { mAnmGroups[0].playBackwardsOnce(); mAnmGroups[0].setAnimEnable(true); } void dLytMeter1Button_c::executeState_ToUse() { if (mAnmGroups[0].isStop2()) { mStateMgr.changeState(StateID_Wait); } if (mAnmGroups[0].isFlag2()) { mAnmGroups[0].play(); } } void dLytMeter1Button_c::finalizeState_ToUse() { mAnmGroups[0].setAnimEnable(false); } void dLytMeter1Button_c::initializeState_ToUnuse() { mAnmGroups[0].playLoop(); mAnmGroups[0].setAnimEnable(true); } void dLytMeter1Button_c::executeState_ToUnuse() { if (mAnmGroups[0].isStop2()) { mStateMgr.changeState(StateID_Unuse); } if (mAnmGroups[0].isFlag2()) { mAnmGroups[0].play(); } } void dLytMeter1Button_c::finalizeState_ToUnuse() { mAnmGroups[0].setAnimEnable(false); } void dLytMeter1Button_c::initializeState_Unuse() { field_0x1A4 = 15; } void dLytMeter1Button_c::executeState_Unuse() { if (dLytMeterContainer_c::sInstance->isButtonFlag(0x80)) { if (!(field_0x1A4 > 0)) { mStateMgr.changeState(StateID_ToUse); return; } field_0x1A4 -= 1; } else { field_0x1A4 = 15; } } void dLytMeter1Button_c::finalizeState_Unuse() {} static const d2d::LytBrlanMapping btn1BrlanMap[] = { {"remoConBtn_04_input.brlan", "G_input_00"}, { "remoConBtn_04_call.brlan", "G_call_00"}, { "remoConBtn_04_loop.brlan", "G_loop_00"}, }; static char *sWindowName1 = "W_bgP_00"; bool dLytMeter1Button_c::build(d2d::ResAccIf_c *resAcc) { mLyt.setResAcc(resAcc); mLyt.build("remoConBtn_04.brlyt", nullptr); for (int i = 0; i < 3; i++) { mAnmGroups[i].init(btn1BrlanMap[i].mFile, resAcc, mLyt.getLayout(), btn1BrlanMap[i].mName); mAnmGroups[i].setDirection(false); mAnmGroups[i].setAnimEnable(false); } // TODO mLyt.fn_800AB9A0(mLyt.getTextBox("T_sabBtnS_00"), nullptr); mLyt.fn_800AB9A0(mLyt.getTextBox("T_sabBtn_00"), nullptr); mpWindow = mLyt.getWindow(sWindowName1); mpTextbox = mLyt.getSizeBoxInWindow(sWindowName1); mpWindow->UpdateSize(mpTextbox, 32.0f); field_0x1A4 = 15; field_0x1AC = 0; field_0x1AD = 0; field_0x1A8 = 0; mAnmGroups[1].setToEnd(); mAnmGroups[1].setAnimEnable(true); mAnmGroups[2].setAnimEnable(true); mLyt.calc(); mAnmGroups[1].setAnimEnable(false); mStateMgr.changeState(StateID_Wait); return true; } bool dLytMeter1Button_c::remove() { for (int i = 0; i < 3; i++) { mAnmGroups[i].unbind(); mAnmGroups[i].afterUnbind(); } return true; } bool dLytMeter1Button_c::LytMeter0x14() { if (*mStateMgr.getStateID() == StateID_ToUnuse) { // TODO } else { mStateMgr.executeState(); } } void dLytMeter2Button_c::initializeState_Wait() {} void dLytMeter2Button_c::executeState_Wait() { if (dLytMeterContainer_c::sInstance->isButtonFlag(0x100)) { return; } mStateMgr.changeState(StateID_ToUnuse); } void dLytMeter2Button_c::finalizeState_Wait() {} void dLytMeter2Button_c::initializeState_ToUse() { mAnmGroups[0].playBackwardsOnce(); mAnmGroups[0].setAnimEnable(true); } void dLytMeter2Button_c::executeState_ToUse() { if (mAnmGroups[0].isStop2()) { mStateMgr.changeState(StateID_Wait); } if (mAnmGroups[0].isFlag2()) { mAnmGroups[0].play(); } } void dLytMeter2Button_c::finalizeState_ToUse() { mAnmGroups[0].setAnimEnable(false); } void dLytMeter2Button_c::initializeState_ToUnuse() { mAnmGroups[0].playLoop(); mAnmGroups[0].setAnimEnable(true); } void dLytMeter2Button_c::executeState_ToUnuse() { if (mAnmGroups[0].isStop2()) { mStateMgr.changeState(StateID_Unuse); } if (mAnmGroups[0].isFlag2()) { mAnmGroups[0].play(); } } void dLytMeter2Button_c::finalizeState_ToUnuse() { mAnmGroups[0].setAnimEnable(false); } void dLytMeter2Button_c::initializeState_Unuse() { field_0x1A4 = 15; } void dLytMeter2Button_c::executeState_Unuse() { if (dLytMeterContainer_c::sInstance->isButtonFlag(0x100)) { if (!(field_0x1A4 > 0)) { mStateMgr.changeState(StateID_ToUse); return; } field_0x1A4 -= 1; } else { field_0x1A4 = 15; } } void dLytMeter2Button_c::finalizeState_Unuse() {} static const d2d::LytBrlanMapping btn2BrlanMap[] = { {"remoConBtn_05_input.brlan", "G_input_00"}, { "remoConBtn_05_call.brlan", "G_call_00"}, { "remoConBtn_05_loop.brlan", "G_loop_00"}, }; static char *sWindowName2 = "W_bgP_00"; bool dLytMeter2Button_c::build(d2d::ResAccIf_c *resAcc) { mLyt.setResAcc(resAcc); mLyt.build("remoConBtn_05.brlyt", nullptr); for (int i = 0; i < 3; i++) { mAnmGroups[i].init(btn2BrlanMap[i].mFile, resAcc, mLyt.getLayout(), btn2BrlanMap[i].mName); mAnmGroups[i].setDirection(false); mAnmGroups[i].setAnimEnable(false); } mpWindow = mLyt.getWindow(sWindowName2); mpTextbox = mLyt.getSizeBoxInWindow(sWindowName2); mpWindow->UpdateSize(mpTextbox, 32.0f); field_0x1A4 = 15; field_0x1AC = 0; field_0x1AD = 0; field_0x1A8 = 0; mAnmGroups[1].setToEnd(); mAnmGroups[1].setAnimEnable(true); mAnmGroups[2].setAnimEnable(true); mLyt.calc(); mAnmGroups[1].setAnimEnable(false); mStateMgr.changeState(StateID_Wait); return true; } bool dLytMeter2Button_c::remove() { for (int i = 0; i < 3; i++) { mAnmGroups[i].unbind(); mAnmGroups[i].afterUnbind(); } return true; } bool dLytMeter2Button_c::LytMeter0x14() { if (*mStateMgr.getStateID() == StateID_ToUnuse) { // TODO } else { mStateMgr.executeState(); } } void dLytMeterParts_c::initializeState_Invisible() {} void dLytMeterParts_c::executeState_Invisible() {} void dLytMeterParts_c::finalizeState_Invisible() {} void dLytMeterParts_c::initializeState_In() {} void dLytMeterParts_c::executeState_In() {} void dLytMeterParts_c::finalizeState_In() {} void dLytMeterParts_c::initializeState_Visible() {} void dLytMeterParts_c::executeState_Visible() {} void dLytMeterParts_c::finalizeState_Visible() {} void dLytMeterParts_c::initializeState_Out() {} void dLytMeterParts_c::executeState_Out() {} void dLytMeterParts_c::finalizeState_Out() {} void floats() { 32.0f; 1.0f; 0.0f; int x = 0; f32 f = x; } void floats2() { 5.0f; 3.0f; } #pragma dont_inline on dLytMeter_c::dLytMeter_c() {} #pragma dont_inline reset extern "C" void fn_800D97E0(int i); extern "C" void fn_800D9800(int i); extern "C" void fn_801B2D10(void *); extern "C" void *GLOBAL_MESSAGE_RELATED_CONTEXT; static const d2d::LytBrlanMapping meterBrlanMap[] = { { "basicPosition_00_in.brlan", "G_remoConBtn_00"}, { "basicPosition_00_in.brlan", "G_remoConBtn_01"}, { "basicPosition_00_in.brlan", "G_remoConBtn_02"}, { "basicPosition_00_in.brlan", "G_remoConBtn_03"}, { "basicPosition_00_in.brlan", "G_remoConBtn_04"}, { "basicPosition_00_in.brlan", "G_remoConBtn_05"}, { "basicPosition_00_in.brlan", "G_remoConBtn_06"}, { "basicPosition_00_in.brlan", "G_remoConBg_00"}, { "basicPosition_00_in.brlan", "G_nunBtn_03"}, { "basicPosition_00_in.brlan", "G_nunBtn_01"}, { "basicPosition_00_in.brlan", "G_nunBtn_02"}, { "basicPosition_00_in.brlan", "G_nunBg_00"}, { "basicPosition_00_in.brlan", "G_shield_00"}, { "basicPosition_00_in.brlan", "G_rupy_00"}, { "basicPosition_00_in.brlan", "G_heart_00"}, { "basicPosition_00_in.brlan", "G_ganbari_00"}, { "basicPosition_00_out.brlan", "G_remoConBtn_00"}, { "basicPosition_00_out.brlan", "G_remoConBtn_01"}, { "basicPosition_00_out.brlan", "G_remoConBtn_02"}, { "basicPosition_00_out.brlan", "G_remoConBtn_03"}, { "basicPosition_00_out.brlan", "G_remoConBtn_04"}, { "basicPosition_00_out.brlan", "G_remoConBtn_05"}, { "basicPosition_00_out.brlan", "G_remoConBtn_06"}, { "basicPosition_00_out.brlan", "G_remoConBg_00"}, { "basicPosition_00_out.brlan", "G_nunBtn_03"}, { "basicPosition_00_out.brlan", "G_nunBtn_01"}, { "basicPosition_00_out.brlan", "G_nunBtn_02"}, { "basicPosition_00_out.brlan", "G_nunBg_00"}, { "basicPosition_00_out.brlan", "G_shield_00"}, { "basicPosition_00_out.brlan", "G_rupy_00"}, { "basicPosition_00_out.brlan", "G_heart_00"}, { "basicPosition_00_out.brlan", "G_ganbari_00"}, { "basicPosition_00_position.brlan", "G_position_00"}, {"basicPosition_00_rupyPosition.brlan", "G_rupyPosi_00"}, }; bool dLytMeter_c::build(d2d::ResAccIf_c *resAcc) { mLyt.setResAcc(resAcc); mLyt.build("basicPosition_00.brlyt", nullptr); mLyt.setPriority(0x8A); for (int i = 0; i < 34; i++) { mAnmGroups[i].init(meterBrlanMap[i].mFile, resAcc, mLyt.getLayout(), meterBrlanMap[i].mName); mAnmGroups[i].setDirection(false); mAnmGroups[i].setAnimEnable(false); } // in G_remoConBtn_06, out G_remoConBtn_06 mABtn.setContainerGroups(&mAnmGroups[6], &mAnmGroups[22]); // out G_shield_00 mShield.setContainerGroup(&mAnmGroups[28]); if (dScTitle_c::sInstance == nullptr) { mp1Button = new dLytMeter1Button_c(); mp2Button = new dLytMeter2Button_c(); } else { mp1Button = nullptr; mp2Button = nullptr; } mNodes[0].mpLytPane = &mGanbariGauge; mNodes[1].mpLytPane = &mRupy; mNodes[2].mpLytPane = &mItemSelect; mNodes[3].mpLytPane = &mCrossBtn; mNodes[4].mpLytPane = &mPlusBtn; mNodes[5].mpLytPane = &mMinusBtn; mNodes[6].mpLytPane = &mABtn; mNodes[7].mpLytPane = &mDowsing; mNodes[8].mpLytPane = &mZBtn; mNodes[9].mpLytPane = &mNunStk; mNodes[10].mpLytPane = &mRemoCon; mNodes[11].mpLytPane = &mNunBg; mNodes[12].mpLytPane = &mHeart; mNodes[13].mpLytPane = &mShield; mNodes[14].mpLytPane = mp1Button; mNodes[15].mpLytPane = mp2Button; mPosArray1[0] = mLyt.findPane("N_shield_00")->GetTranslate(); mPosArray1[1] = mLyt.findPane("N_shield_01")->GetTranslate(); mPos1 = mPosArray1[0]; mPos2 = mPosArray1[1]; mLyt.findPane("N_rupyAll_00")->SetVisible(true); mAnmGroups[33].setAnimEnable(true); // Advance through some anim's keyframes and store positions in mPosArray2 for (int i = 0; i < 7; i++) { mAnmGroups[33].setFrame(i); mLyt.calc(); mPosArray2[i] = mLyt.findPane("N_rupy_00")->GetTranslate(); } mAnmGroups[33].setAnimEnable(false); mLyt.findPane("N_rupyAll_00")->SetVisible(false); for (int i = 0; i < 16; i++) { if (mNodes[i].mpLytPane != nullptr) { mNodes[i].mpLytPane->build(resAcc); mMeters.PushBack(&mNodes[i]); } } if (isSilentRealm()) { void *sirenData = LayoutArcManager::sInstance->getLoadedData("Siren"); mResAcc.attach(sirenData, ""); mpTimer = new dLytMeterTimer_c(); mpTimerPart1 = new LytMeterTimerPart1_c(); mpTimerPart2 = new LytMeterTimerPart2_c(); mpTimerPart1->build(&mResAcc); mpTimerPart2->build(&mResAcc); mpTimer->build(); } else { mpTimer = nullptr; mpTimerPart1 = nullptr; mpTimerPart2 = nullptr; } if (dScTitle_c::sInstance == nullptr && dStageMgr_c::GetInstance()->isAreaTypeSky()) { mpSkyGauge = new dLytSkyGauge_c(); mpSkyGauge->build(resAcc); mpBirdGauge = new dLytBirdGauge_c(); mpBirdGauge->build(resAcc); } else { mpSkyGauge = nullptr; mpBirdGauge = nullptr; } if (dScGame_c::currentSpawnInfo.stageName == "F401") { mpBossGauge = new dLytBossGauge_c(); mpBossGauge->build(); } else { mpBossGauge = nullptr; } if (dScGame_c::isCurrentStage("F200") || dScGame_c::isCurrentStage("F210") || dScGame_c::isCurrentStage("F211")) { mpKakeraKey = new dLytMeterKakeraKey_c(); mpKakeraKey->build(resAcc); } else { mpKakeraKey = nullptr; } if (!dStageMgr_c::GetInstance()->isAreaTypeDungeon() || dScGame_c::currentSpawnInfo.stageName == "F100_1" || dScGame_c::currentSpawnInfo.stageName == "F103_1") { mpBossKey = nullptr; } else { mpBossKey = new dLytMeterBossKey_c(); mpBossKey->build(resAcc); } if (dStageMgr_c::GetInstance()->isAreaTypeDungeon() && (!(dScGame_c::currentSpawnInfo.stageName == "F100_1") && !(dScGame_c::currentSpawnInfo.stageName == "F103_1")) || dScGame_c::currentSpawnInfo.stageName == "F302" || dScGame_c::currentSpawnInfo.stageName == "F302") { mpSmallKey = new dLytMeterSmallKey_c(); mpSmallKey->build(resAcc); } else { mpSmallKey = nullptr; } if (dScTitle_c::sInstance != nullptr) { mpDrink = nullptr; } else { mpDrink = new dLytMeterDrink_c(); mpDrink->build(resAcc); } return true; } bool dLytMeter_c::remove() { for (int i = 0; i < 34; i++) { mAnmGroups[i].afterUnbind(); } for (d2d::SubPaneList::Iterator it = mMeters.GetBeginIter(); it != mMeters.GetEndIter(); ++it) { d2d::dSubPane *m = it->mpLytPane; if (m != nullptr) { m->getPane()->GetParent()->RemoveChild(m->getPane()); } } for (int i = 0; i < 16; i++) { if (mNodes[i].mpLytPane != nullptr) { mNodes[i].mpLytPane->remove(); } } if (mp1Button != nullptr) { delete mp1Button; mp1Button = nullptr; } if (mp2Button != nullptr) { delete mp2Button; mp2Button = nullptr; } if (mpTimerPart1 != nullptr) { mpTimerPart1->remove(); delete mpTimerPart1; mpTimerPart1 = nullptr; } if (mpTimerPart2 != nullptr) { mpTimerPart2->remove(); delete mpTimerPart2; mpTimerPart2 = nullptr; } if (mpTimer != nullptr) { mpTimer->remove(); delete mpTimer; mpTimer = nullptr; // WHY IS THIS HERE??? mResAcc.detach(); } if (mpSkyGauge != nullptr) { mpSkyGauge->remove(); delete mpSkyGauge; mpSkyGauge = nullptr; } if (mpBirdGauge != nullptr) { mpBirdGauge->remove(); delete mpBirdGauge; mpBirdGauge = nullptr; } if (mpBossGauge != nullptr) { mpBossGauge->remove(); delete mpBossGauge; mpBossGauge = nullptr; } if (mpKakeraKey != nullptr) { mpKakeraKey->remove(); delete mpKakeraKey; mpKakeraKey = nullptr; } if (mpBossKey != nullptr) { mpBossKey->remove(); delete mpBossKey; mpBossKey = nullptr; } if (mpSmallKey != nullptr) { mpSmallKey->remove(); delete mpSmallKey; mpSmallKey = nullptr; } if (mpDrink != nullptr) { mpDrink->remove(); delete mpDrink; mpDrink = nullptr; } return true; } bool dLytMeter_c::draw() { mLyt.addToDrawList(); if (mpTimerPart1 != nullptr) { mpTimerPart1->getLyt()->addToDrawList(); } if (mpTimerPart2 != nullptr) { mpTimerPart2->getLyt()->addToDrawList(); } if (mpSkyGauge != nullptr) { mpSkyGauge->getLyt()->addToDrawList(); } if (mpBirdGauge != nullptr) { mpBirdGauge->getLyt()->addToDrawList(); } if (mpBossGauge != nullptr) { mpBossGauge->draw(); } if (mpKakeraKey != nullptr) { mpKakeraKey->draw(); } if (mpBossKey != nullptr) { mpBossKey->draw(); } if (mpSmallKey != nullptr) { mpSmallKey->draw(); } if (mpDrink != nullptr) { mpDrink->draw(); } return true; } dLytMeterContainer_c::dLytMeterContainer_c() { sInstance = this; } bool dLytMeterContainer_c::build() { void *data = LayoutArcManager::sInstance->getLoadedData("DoButton"); mResAcc.attach(data, ""); if (dScTitle_c::sInstance != nullptr) { mpEventSkip = nullptr; } else { mpEventSkip = new dLytMeterEventSkip_c(); } if (mpEventSkip != nullptr) { mpEventSkip->build(&mResAcc); } dLytAreaCaption_c::create(); mMeter.build(&mResAcc); if (dScTitle_c::sInstance != nullptr) { mpDoButton = nullptr; mpDoButtonRelated = nullptr; mpBirdRelated = nullptr; } else { mpDoButton = new dLytDobutton_c(); mpDoButtonRelated = new LytDoButtonRelated(); mpBirdRelated = new LytBirdButtonRelated(); } if (mpDoButton != nullptr) { mpDoButton->init(&mResAcc); } if (mpDoButtonRelated != nullptr) { mpDoButtonRelated->build(&mResAcc); } if (mpBirdRelated != nullptr) { mpBirdRelated->build(&mResAcc); } fn_800D97E0(0xb); fn_800D9800(1); fn_801B2D10(GLOBAL_MESSAGE_RELATED_CONTEXT); return true; } bool dLytMeterContainer_c::remove() { if (mpDoButton != nullptr) { mpDoButton->remove(); delete mpDoButton; mpDoButton = nullptr; } if (mpDoButtonRelated != nullptr) { mpDoButtonRelated->remove(); delete mpDoButtonRelated; mpDoButtonRelated = nullptr; } mMeter.remove(); if (mpEventSkip != nullptr) { mpEventSkip->remove(); delete mpEventSkip; mpEventSkip = nullptr; } if (mpBirdRelated != nullptr) { mpBirdRelated->remove(); delete mpBirdRelated; mpBirdRelated = nullptr; } dLytAreaCaption_c::remove(); mResAcc.detach(); return true; } bool dLytMeterContainer_c::draw() { if (mVisible) { mMeter.draw(); if (mMeter.field_0x13750 != 3) { if (mpEventSkip != nullptr) { mpEventSkip->draw(); } dLytAreaCaption_c::draw(); if (mpDoButton != nullptr) { mpDoButton->draw(); } if (mpBirdRelated != nullptr) { mpBirdRelated->draw(); } } } return true; }