summaryrefslogtreecommitdiff
path: root/src/d/lyt/msg_window
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2025-04-02 00:57:49 +0200
committerrobojumper <robojumper@gmail.com>2025-04-07 22:12:36 +0200
commit5e2343afb79863394f5f1487d70cd3492305963e (patch)
treecfbc5f4bb6784e203e7f84a3ca41bdc8141ba2fe /src/d/lyt/msg_window
parenta337ae752a4aa67b423baee3d28fb6ae9a28c5be (diff)
d_lyt_msg_window_stone OK
Diffstat (limited to 'src/d/lyt/msg_window')
-rw-r--r--src/d/lyt/msg_window/d_lyt_msg_window_stone.cpp195
1 files changed, 195 insertions, 0 deletions
diff --git a/src/d/lyt/msg_window/d_lyt_msg_window_stone.cpp b/src/d/lyt/msg_window/d_lyt_msg_window_stone.cpp
new file mode 100644
index 00000000..b21936ff
--- /dev/null
+++ b/src/d/lyt/msg_window/d_lyt_msg_window_stone.cpp
@@ -0,0 +1,195 @@
+#include "d/lyt/msg_window/d_lyt_msg_window_stone.h"
+
+#include "common.h"
+#include "d/d_tag_processor.h"
+#include "d/lyt/d2d.h"
+#include "d/lyt/d_textbox.h"
+#include "nw4r/lyt/lyt_group.h"
+#include "nw4r/lyt/lyt_pane.h"
+#include "s/s_State.hpp"
+
+STATE_DEFINE(dLytMsgWindowStone_c, Invisible);
+STATE_DEFINE(dLytMsgWindowStone_c, In);
+STATE_DEFINE(dLytMsgWindowStone_c, Visible);
+STATE_DEFINE(dLytMsgWindowStone_c, Out);
+
+static const d2d::LytBrlanMapping brlanMap[] = {
+ { "sekibanWindow_00_in.brlan", "G_inOut_00"},
+ {"sekibanWindow_00_loop.brlan", "G_loop_00"},
+ { "sekibanWindow_00_out.brlan", "G_inOut_00"},
+};
+
+#define SEKIBAN_ANIM_IN 0
+#define SEKIBAN_ANIM_LOOP 1
+#define SEKIBAN_ANIM_OUT 2
+
+#define SEKIBAN_NUM_ANIMS 3
+
+static const char *sPanes[] = {
+ "N_aBtn_00",
+ "N_inOut_00",
+};
+
+static const char *sTextBoxes[] = {
+ "T_message_00",
+ "T_messageS_00",
+ "T_messageS_01",
+};
+
+static const char *sGroupName = "G_ref_00";
+
+bool dLytMsgWindowStone_c::build(void *unk, d2d::ResAccIf_c *resAcc, dTagProcessor_c *tagProcessor) {
+ mLyt.setResAcc(resAcc);
+ mLyt.build("sekibanWindow_00.brlyt", nullptr);
+ mLyt.setPriority(0x8A);
+
+ for (int i = 0; i < SEKIBAN_NUM_ANIMS; i++) {
+ mAnm[i].init(brlanMap[i].mFile, resAcc, mLyt.getLayout(), brlanMap[i].mName);
+ mAnm[i].bind(false);
+ mAnm[i].setAnimEnable(false);
+ }
+
+ mAnm[SEKIBAN_ANIM_LOOP].setAnimEnable(true);
+ mAnm[SEKIBAN_ANIM_OUT].setAnimEnable(true);
+ mAnm[SEKIBAN_ANIM_OUT].setToEnd();
+ mLyt.calc();
+ mAnm[SEKIBAN_ANIM_OUT].setAnimEnable(false);
+
+ for (int i = 0; i < 2; i++) {
+ mpPanes[i] = mLyt.findPane(sPanes[i]);
+ }
+
+ for (int i = 0; i < 3; i++) {
+ mpTextboxes[i] = mLyt.getTextBox(sTextBoxes[i]);
+ mpTextboxes[i]->SetTextPositionH(0);
+ mpTextboxes[i]->SetTextPositionV(0);
+ }
+
+ mpTextboxes[1]->set0x1F6(1);
+ mpTextboxes[2]->set0x1F6(1);
+
+ for (int i = 0; i < 1; i++) {
+ mNodes[i].mpLytPane = &mCommon;
+ mCommon.build(resAcc);
+ mSubpaneList.PushBack(&mNodes[i]);
+ }
+
+ if (mLyt.getLayout()->GetGroupContainer() != nullptr) {
+ nw4r::lyt::Group *g = mLyt.getLayout()->GetGroupContainer()->FindGroupByName(sGroupName);
+ if (g != nullptr) {
+ d2d::dSubPane::linkMeters(g, &mSubpaneList);
+ }
+ }
+
+ mpPanes[1]->SetVisible(true);
+ mLyt.calc();
+ mpPanes[1]->SetVisible(false);
+ mpTagProcessor = tagProcessor;
+ mStateMgr.changeState(StateID_Invisible);
+ return true;
+}
+
+bool dLytMsgWindowStone_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++) {
+ mNodes[i].mpLytPane->remove();
+ }
+ mCommon.remove();
+ for (int i = 0; i < SEKIBAN_NUM_ANIMS; i++) {
+ mAnm[i].remove();
+ }
+ return true;
+}
+
+void dLytMsgWindowStone_c::initializeState_Invisible() {
+ mCommon.resetToInvisble();
+}
+void dLytMsgWindowStone_c::executeState_Invisible() {
+ if (mShouldBeOpen) {
+ mStateMgr.changeState(StateID_In);
+ }
+}
+void dLytMsgWindowStone_c::finalizeState_Invisible() {}
+
+void dLytMsgWindowStone_c::initializeState_In() {
+ mAnm[SEKIBAN_ANIM_IN].setAnimEnable(true);
+ mAnm[SEKIBAN_ANIM_IN].setFrame(0.0f);
+}
+void dLytMsgWindowStone_c::executeState_In() {
+ if (mAnm[SEKIBAN_ANIM_IN].isEndReached()) {
+ mAnm[SEKIBAN_ANIM_IN].setAnimEnable(false);
+ mStateMgr.changeState(StateID_Visible);
+ }
+}
+void dLytMsgWindowStone_c::finalizeState_In() {}
+
+void dLytMsgWindowStone_c::initializeState_Visible() {}
+void dLytMsgWindowStone_c::executeState_Visible() {
+ if (!mShouldBeOpen) {
+ mStateMgr.changeState(StateID_Out);
+ }
+}
+void dLytMsgWindowStone_c::finalizeState_Visible() {}
+
+void dLytMsgWindowStone_c::initializeState_Out() {
+ mAnm[SEKIBAN_ANIM_OUT].setAnimEnable(true);
+ mAnm[SEKIBAN_ANIM_OUT].setFrame(0.0f);
+}
+void dLytMsgWindowStone_c::executeState_Out() {
+ if (mAnm[SEKIBAN_ANIM_OUT].isEndReached()) {
+ mAnm[SEKIBAN_ANIM_OUT].setAnimEnable(false);
+ mStateMgr.changeState(StateID_Invisible);
+ }
+}
+void dLytMsgWindowStone_c::finalizeState_Out() {}
+
+bool dLytMsgWindowStone_c::execute() {
+ mStateMgr.executeState();
+ for (int i = 0; i < SEKIBAN_NUM_ANIMS; i++) {
+ if (mAnm[i].isEnabled()) {
+ mAnm[i].play();
+ }
+ }
+ mLyt.calc();
+ for (int i = 0; i < 1; i++) {
+ mNodes[i].mpLytPane->execute();
+ }
+ return true;
+}
+
+void dLytMsgWindowStone_c::draw() {
+ mLyt.draw();
+}
+
+void dLytMsgWindowStone_c::open() {
+ mShouldBeOpen = true;
+}
+
+bool dLytMsgWindowStone_c::isOpening() const {
+ return !(*mStateMgr.getStateID() == StateID_In);
+}
+
+void dLytMsgWindowStone_c::close() {
+ mShouldBeOpen = false;
+}
+
+bool dLytMsgWindowStone_c::isClosing() const {
+ return !(*mStateMgr.getStateID() == StateID_Out);
+}
+
+bool dLytMsgWindowStone_c::setText(const wchar_t *text) {
+ mpTextboxes[0]->SetTagProcessor(mpTagProcessor);
+ mpTextboxes[1]->SetTagProcessor(mpTagProcessor);
+ mpTextboxes[2]->SetTagProcessor(mpTagProcessor);
+ mpTextboxes[0]->fn_800AF540(text, mpTagProcessor, 0);
+ mpTextboxes[1]->fn_800AF540(text, mpTagProcessor, 0);
+ mpTextboxes[2]->fn_800AF540(text, mpTagProcessor, 0);
+ return true;
+}