diff options
| author | robojumper <robojumper@gmail.com> | 2025-05-01 15:11:11 +0200 |
|---|---|---|
| committer | robojumper <robojumper@gmail.com> | 2025-05-02 20:32:04 +0200 |
| commit | b148d141a0f49fc20fb61e5472951f4ddb4176cd (patch) | |
| tree | d1c11a4dea3f40986430d37a82708953ebd5fb97 /src/d/lyt/d_lyt_save_msg_window.cpp | |
| parent | 594bc67d676e944980054b104368e02617428a85 (diff) | |
save_manager OK
Diffstat (limited to 'src/d/lyt/d_lyt_save_msg_window.cpp')
| -rw-r--r-- | src/d/lyt/d_lyt_save_msg_window.cpp | 392 |
1 files changed, 392 insertions, 0 deletions
diff --git a/src/d/lyt/d_lyt_save_msg_window.cpp b/src/d/lyt/d_lyt_save_msg_window.cpp new file mode 100644 index 00000000..cc8fd0f0 --- /dev/null +++ b/src/d/lyt/d_lyt_save_msg_window.cpp @@ -0,0 +1,392 @@ +#include "d/lyt/d_lyt_save_msg_window.h" + +#include "common.h" +#include "d/d_message.h" +#include "d/d_tag_processor.h" +#include "d/lyt/d2d.h" +#include "nw4r/lyt/lyt_group.h" +#include "sized_string.h" +#include "toBeSorted/arc_managers/layout_arc_manager.h" + +STATE_DEFINE(dLytSaveMsgWindow_c, Init); +STATE_DEFINE(dLytSaveMsgWindow_c, In); +STATE_DEFINE(dLytSaveMsgWindow_c, Wait); +STATE_DEFINE(dLytSaveMsgWindow_c, Out); + +dLytSaveMsgWindow_c::dLytSaveMsgWindow_c() : mStateMgr(*this, sStateID::null) { + resetProperties(); +} + +static const d2d::LytBrlanMapping brlanMap[] = { + { "save_00_in.brlan", "G_inOut_00"}, + { "save_00_in.brlan", "G_inOut_01"}, + { "save_00_bgV.brlan", "G_bgV_00"}, + { "save_00_textV.brlan", "G_textV_00"}, + {"save_00_winPosition.brlan", "G_winPosition_00"}, + { "save_00_out.brlan", "G_inOut_00"}, + { "save_00_out.brlan", "G_inOut_01"}, + { "save_00_textIn.brlan", "G_textInOut_00"}, + { "save_00_textOut.brlan", "G_textInOut_00"}, +}; + +#define SAVE_ANIM_IN_0 0 +#define SAVE_ANIM_IN_1 1 +#define SAVE_ANIM_BG_V 2 +#define SAVE_ANIM_TEXT_V 3 +#define SAVE_ANIM_WIN_POSITION 4 +#define SAVE_ANIM_OUT_0 5 +#define SAVE_ANIM_OUT_1 6 +#define SAVE_ANIM_TEXT_IN 7 +#define SAVE_ANIM_TEXT_OUT 8 + +#define SAVE_NUM_ANIMS 9 + +static const char *sGroupName = "G_ref_00"; + +bool dLytSaveMsgWindow_c::build(bool arg) { + void *data = LayoutArcManager::GetInstance()->getLoadedData("System2D"); + mResAcc.attach(data, ""); + mLyt.build("save_00.brlyt", &mResAcc); + + for (int i = 0; i < SAVE_NUM_ANIMS; i++) { + mAnm[i].init(brlanMap[i].mFile, &mResAcc, mLyt.getLayout(), brlanMap[i].mName); + } + + mLyt.setPriority(0x8A); + + for (int i = 0; i < 1; i++) { + mSubpanes[i].mpLytPane = &mBtn; + mBtn.build(&mResAcc); + mSubpaneList.PushBack(&mSubpanes[i]); + } + + if (mLyt.getLayout()->GetGroupContainer() != nullptr) { + nw4r::lyt::Group *g = mLyt.getLayout()->GetGroupContainer()->FindGroupByName(sGroupName); + if (g != nullptr) { + d2d::dSubPane::linkMeters(g, &mSubpaneList); + } + } + + mBtn.setField_0x9C4(1); + if (arg) { + mBtn.setField_0x99C(1); + } + mBtn.setField_0x9A0(1); + + mStateMgr.changeState(StateID_Init); + mLineSpace = mLyt.getTextBox("T_text_00")->GetLineSpace(); + field_0x10DC = 1; + return true; +} + +bool dLytSaveMsgWindow_c::remove() { + 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()); + } + } + + for (int i = 0; i < 1; i++) { + mSubpanes[i].mpLytPane->remove(); + } + mLyt.unbindAnims(); + for (int i = 0; i < SAVE_NUM_ANIMS; i++) { + mAnm[i].remove(); + } + mResAcc.detach(); + return true; +} + +bool dLytSaveMsgWindow_c::execute() { + for (int i = 0; i < 1; i++) { + mSubpanes[i].mpLytPane->execute(); + } + mStateMgr.executeState(); + mLyt.calc(); + return true; +} + +bool dLytSaveMsgWindow_c::draw() { + if (field_0x10D8 != 1) { + return true; + } + mLyt.addToDrawList(); + return true; +} + +bool dLytSaveMsgWindow_c::drawNow() { + if (field_0x10D8 != 1) { + return true; + } + mLyt.draw(); + return true; +} + +void dLytSaveMsgWindow_c::reset() { + resetProperties(); + mStateMgr.changeState(StateID_Init); +} + +bool dLytSaveMsgWindow_c::setProperties(const char *message, s32 a1, s32 a2, u8 a3) { + mLabel = message; + field_0x10B0 = a1; + field_0x10B4 = a2; + field_0x10DD = a3; + field_0x10DA = 1; + mNumLines = 1; + field_0x10B8 = 0; + mSaveobjId = -1; + return true; +} + +bool dLytSaveMsgWindow_c::checkIsWait() { + if (*mStateMgr.getStateID() == StateID_Wait) { + field_0x10DB = 1; + return true; + } + return false; +} + +void dLytSaveMsgWindow_c::initializeState_Init() { + resetProperties(); + for (int i = 0; i < SAVE_NUM_ANIMS; i++) { + mAnm[i].unbind(); + } +} +void dLytSaveMsgWindow_c::executeState_Init() { + if (field_0x10DA != 1) { + return; + } + field_0x10DA = 0; + mStateMgr.changeState(StateID_In); +} +void dLytSaveMsgWindow_c::finalizeState_Init() {} + +void dLytSaveMsgWindow_c::initializeState_In() { + field_0x10D8 = 1; + if (field_0x10B8 == 1) { + setAnmFrame(SAVE_ANIM_TEXT_IN, 0.0f); + } else { + setAnmFrame(SAVE_ANIM_IN_0, 0.0f); + setAnmFrame(SAVE_ANIM_IN_1, 0.0f); + } + setupSaveTextMaybe(); + f32 bgV = 0.0f; + if (field_0x10DD == 1) { + bgV = 1.0f; + } + setAnmFrame(SAVE_ANIM_BG_V, bgV); + f32 textV = 0.0f; + if (mNumLines != 1) { + textV = 1.0f; + } + setAnmFrame(SAVE_ANIM_TEXT_V, textV); + setAnmFrame(SAVE_ANIM_WIN_POSITION, field_0x10B4); + field_0x10DC = 0; +} +void dLytSaveMsgWindow_c::executeState_In() { + if (field_0x10C0 != 0) { + return; + } + s32 group = SAVE_ANIM_IN_0; + if (field_0x10B8 == 1) { + group = SAVE_ANIM_TEXT_IN; + } + d2d::AnmGroup_c &grp = mAnm[group]; + if (grp.isEndReached() == true) { + updateSaveTextMaybe(); + mStateMgr.changeState(StateID_Wait); + } + grp.play(); + if (field_0x10B8 != 1) { + mAnm[SAVE_ANIM_IN_1].play(); + } +} +void dLytSaveMsgWindow_c::finalizeState_In() { + if (field_0x10B8 == 1) { + unbindAnm(SAVE_ANIM_TEXT_IN); + } else { + unbindAnm(SAVE_ANIM_IN_0); + unbindAnm(SAVE_ANIM_IN_1); + } +} + +void dLytSaveMsgWindow_c::initializeState_Wait() { + if (field_0x10B0 == 0) { + field_0x10C0 = 10; + } else { + field_0x10C0 = 0; + } +} +void dLytSaveMsgWindow_c::executeState_Wait() { + if (field_0x10C0 == 0) { + field_0x10C4 = mBtn.getField_0x9B4(); + field_0x10C8 = mBtn.getField_0x9B0(); + } + if (field_0x10DB == 1) { + field_0x10DB = 0; + mStateMgr.changeState(StateID_Out); + } + if (field_0x10DA == 1) { + field_0x10DA = 0; + field_0x10C4 = -1; + field_0x10C8 = -1; + mStateMgr.changeState(StateID_In); + } +} +void dLytSaveMsgWindow_c::finalizeState_Wait() {} + +void dLytSaveMsgWindow_c::initializeState_Out() { + field_0x10C0 = 0; + if (field_0x10BC == 1) { + setAnmFrame(SAVE_ANIM_TEXT_OUT, 0.0f); + } else if (field_0x10BC == 2) { + setAnmFrame(SAVE_ANIM_OUT_1, 0.0f); + } else { + setAnmFrame(SAVE_ANIM_OUT_0, 0.0f); + setAnmFrame(SAVE_ANIM_OUT_1, 0.0f); + } +} +void dLytSaveMsgWindow_c::executeState_Out() { + s32 group = SAVE_ANIM_OUT_0; + if (field_0x10BC == 1) { + group = SAVE_ANIM_TEXT_OUT; + } else if (field_0x10BC == 2) { + group = SAVE_ANIM_OUT_1; + } + d2d::AnmGroup_c &grp = mAnm[group]; + switch (field_0x10C0) { + case 0: + if (grp.isEndReached() == true) { + mWillFinishOut = 1; + field_0x10C0 = 1; + } + break; + case 1: + if (field_0x10BC == 1) { + mStateMgr.changeState(StateID_Wait); + } else { + mStateMgr.changeState(StateID_Init); + } + return; + } + + grp.play(); + if (field_0x10BC == 0) { + mAnm[SAVE_ANIM_OUT_1].play(); + } +} +void dLytSaveMsgWindow_c::finalizeState_Out() { + if (mBtn.getField_0x9A4() == 0) { + mLyt.findPane("N_messageBtn_00")->SetVisible(false); + } + mWillFinishOut = 0; + if (field_0x10BC == 1) { + unbindAnm(SAVE_ANIM_TEXT_OUT); + } else if (field_0x10BC == 2) { + unbindAnm(SAVE_ANIM_OUT_1); + } else { + unbindAnm(SAVE_ANIM_OUT_0); + unbindAnm(SAVE_ANIM_OUT_1); + } +} + +void dLytSaveMsgWindow_c::resetProperties() { + field_0x10D8 = 0; + mWillFinishOut = 0; + field_0x10DA = 0; + field_0x10DB = 0; + field_0x10C4 = -1; + field_0x10C8 = -1; + field_0x10C0 = 0; + field_0x10B0 = 4; + field_0x10B4 = 4; + field_0x10B8 = 0; + field_0x10BC = 0; + mSaveobjId = -1; +} + +void dLytSaveMsgWindow_c::setAnmFrame(s32 group, f32 frame) { + d2d::AnmGroup_c &anm = mAnm[group]; + anm.bind(false); + anm.setAnimEnable(true); + anm.setFrame(frame); +} + +void dLytSaveMsgWindow_c::unbindAnm(s32 group) { + d2d::AnmGroup_c &anm = mAnm[group]; + anm.unbind(); +} + +void dLytSaveMsgWindow_c::updateSaveTextMaybe() { + // Redundant check, this is also checked internally + if (field_0x10B0 != 0) { + updateSaveText(); + } +} + +void dLytSaveMsgWindow_c::setupSaveTextMaybe() { + const wchar_t *text = dMessage_c::getTextMessageByLabel(mLabel, true, nullptr, 0); + dTextBox_c *box = mLyt.getTextBox("T_text_00"); + dTagProcessor_c *tagProcessor = dMessage_c::getGlobalTagProcessor(); + if (mSaveobjId != -1) { + SizedString<32> name; + if (mSaveobjId == 0xFF) { + name = "SAVEOBJ_NAME_UNKNOWN"; + } else { + name.sprintf("SAVEOBJ_NAME_%02d", mSaveobjId); + } + + if (tagProcessor != nullptr) { + const wchar_t *objMsg = dMessage_c::getTextMessageByLabel(name, true, nullptr, 0); + if (objMsg != nullptr) { + tagProcessor->setStringArg(objMsg, 0); + } + } + } + mNumLines = box->calcTextLines(text, tagProcessor); + if (mNumLines == 1) { + box->SetLineSpace(0.0f); + } else { + box->SetLineSpace(mLineSpace); + } + box->setTextWithGlobalTextProcessor(text); + dTextBox_c *boxShadow = mLyt.getTextBox("T_textS_00"); + if (mNumLines == 1) { + boxShadow->SetLineSpace(0.0f); + } else { + boxShadow->SetLineSpace(mLineSpace); + } + boxShadow->setTextWithGlobalTextProcessor(text); + mLyt.findPane("N_messageBtn_00")->SetVisible(false); +} + +void dLytSaveMsgWindow_c::updateSaveText() { + if (field_0x10B0 == 0) { + return; + } + mLyt.findPane("N_messageBtn_00")->SetVisible(true); + s32 numOptions = 2; + if (field_0x10B0 == 2) { + numOptions = 3; + } else if (field_0x10B0 == 3) { + numOptions = 4; + } + for (s32 i = 0; i < numOptions; i++) { + const wchar_t *text = dMessage_c::getGlobalTagProcessor()->getBuf(i); + mBtn.getSelectTextBox(i, 0)->setTextWithGlobalTextProcessor(text); + mBtn.getSelectTextBox(i, 1)->setTextWithGlobalTextProcessor(text); + } + + if (field_0x10B0 != 0) { + mBtn.setTagProcessor(dMessage_c::getGlobalTagProcessor()); + static const u32 sInts[] = {0, 2, 3, 4}; + u32 unkInt = sInts[field_0x10B0]; + s32 f = dMessage_c::getGlobalTagProcessor()->getField_0x828(); + mBtn.setField_0x9BC(f); + mBtn.setField_0x990(f); + mBtn.fn_8011E5D0(unkInt, true); + } +} |
