summaryrefslogtreecommitdiff
path: root/src/d/lyt/msg_window
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2025-11-22 21:03:42 +0100
committerrobojumper <robojumper@gmail.com>2025-11-22 21:05:34 +0100
commit54fc6c4a588d0642afaaabb7e0f26f27231c3af5 (patch)
tree316c3726808d21452d7a29d41740fe49db1a8fd4 /src/d/lyt/msg_window
parentb661da78b52958faffb589955df0453c5b0f6740 (diff)
d_lyt_simple_window OK
Diffstat (limited to 'src/d/lyt/msg_window')
-rw-r--r--src/d/lyt/msg_window/d_lyt_simple_window.cpp796
1 files changed, 796 insertions, 0 deletions
diff --git a/src/d/lyt/msg_window/d_lyt_simple_window.cpp b/src/d/lyt/msg_window/d_lyt_simple_window.cpp
new file mode 100644
index 00000000..67cb522c
--- /dev/null
+++ b/src/d/lyt/msg_window/d_lyt_simple_window.cpp
@@ -0,0 +1,796 @@
+#include "d/lyt/msg_window/d_lyt_simple_window.h"
+
+#include "common.h"
+#include "d/d_lyt_hio.h"
+#include "d/d_message.h"
+#include "d/d_tag_processor.h"
+#include "d/d_textwindow_unk.h"
+#include "d/lyt/d_lyt_control_game.h"
+#include "d/lyt/msg_window/d_lyt_msg_window.h"
+#include "d/lyt/msg_window/d_lyt_msg_window_common.h"
+#include "m/m_vec.h"
+#include "nw4r/lyt/lyt_types.h"
+#include "nw4r/math/math_types.h"
+#include "sized_string.h"
+#include "toBeSorted/arc_managers/layout_arc_manager.h"
+#include "toBeSorted/event_manager.h"
+
+STATE_DEFINE(dLytSimpleWindow_c, Invisible);
+STATE_DEFINE(dLytSimpleWindow_c, In);
+STATE_DEFINE(dLytSimpleWindow_c, OutputText);
+STATE_DEFINE(dLytSimpleWindow_c, Out);
+
+dLytSimpleWindow_c *dLytSimpleWindow_c::sInstance;
+
+bool dLytSimpleWindowSubtype::build(d2d::ResAccIf_c *, dTagProcessor_c *) {
+ return true;
+}
+
+void dLytSimpleWindowSubtype::initializeIn(s32 pos) {
+ // no-op
+}
+
+bool dLytSimpleWindowSubtype::setText(const wchar_t *text) {
+ return true;
+}
+
+static const d2d::LytBrlanMapping brlanMapTalk[] = {
+ { "messageWindow_00_in.brlan", "G_inOut_00"},
+ { "messageWindow_00_out.brlan", "G_inOut_00"},
+ {"messageWindow_00_position.brlan", "G_position_00"},
+ { "messageWindow_00_loop.brlan", "G_loop_00"},
+};
+
+#define SIMPLE_WINDOW_TALK_ANIM_IN 0
+#define SIMPLE_WINDOW_TALK_ANIM_OUT 1
+#define SIMPLE_WINDOW_TALK_ANIM_POSITION 2
+#define SIMPLE_WINDOW_TALK_ANIM_LOOP 3
+
+#define SIMPLE_WINDOW_TALK_NUM_ANIMS 4
+
+static const char *sTalkPaneNames[] = {
+ "N_window_00", "N_message_00", "N_aBtn_00", "N_inOut_00", "N_position_00",
+};
+
+#define SIMPLE_WINDOW_TALK_PANE_WINDOW 0
+#define SIMPLE_WINDOW_TALK_PANE_MESSAGE 1
+#define SIMPLE_WINDOW_TALK_PANE_A_BTN 2
+#define SIMPLE_WINDOW_TALK_PANE_IN_OUT 3
+#define SIMPLE_WINDOW_TALK_PANE_POSITION 4
+
+#define SIMPLE_WINDOW_TALK_NUM_PANES 5
+
+static const char *sTalkTextboxNames[] = {
+ "T_message_00",
+ "T_messageS_00",
+};
+
+#define SIMPLE_WINDOW_TALK_NUM_TEXTBOXES 2
+
+bool dLytSimpleWindowTalk_c::build(d2d::ResAccIf_c *resAcc, dTagProcessor_c *tagProcessor) {
+ mpResAcc = resAcc;
+ mLyt.setResAcc(resAcc);
+ mLyt.build("messageWindow_00.brlyt", nullptr);
+ mLyt.setPriority(0x8A);
+
+ for (int i = 0; i < SIMPLE_WINDOW_TALK_NUM_ANIMS; i++) {
+ mAnm[i].init(brlanMapTalk[i].mFile, mpResAcc, mLyt.getLayout(), brlanMapTalk[i].mName);
+ mAnm[i].bind(false);
+ mAnm[i].setAnimEnable(false);
+ }
+
+ mAnm[SIMPLE_WINDOW_TALK_ANIM_LOOP].setAnimEnable(true);
+
+ mAnm[SIMPLE_WINDOW_TALK_ANIM_OUT].setAnimEnable(true);
+ mAnm[SIMPLE_WINDOW_TALK_ANIM_OUT].setToEnd();
+ mLyt.calc();
+ mAnm[SIMPLE_WINDOW_TALK_ANIM_OUT].setAnimEnable(false);
+
+ for (int i = 0; i < SIMPLE_WINDOW_TALK_NUM_PANES; i++) {
+ mpPanes[i] = mLyt.findPane(sTalkPaneNames[i]);
+ }
+
+ for (int i = 0; i < SIMPLE_WINDOW_TALK_NUM_TEXTBOXES; i++) {
+ mpTextboxes[i] = mLyt.getTextBox(sTalkTextboxNames[i]);
+ mpTextboxes[i]->SetTextPositionH(0);
+ mpTextboxes[i]->SetTextPositionV(0);
+ }
+
+ mpTextboxes[1]->setIsShadow(1);
+ mpTagProcessor = tagProcessor;
+
+ mLightText.build(mpResAcc, dLytTextLight::NORMAL);
+ mBlurRelated.build();
+
+ mpPanes[SIMPLE_WINDOW_TALK_PANE_IN_OUT]->SetVisible(true);
+ mLyt.calc();
+ mpPanes[SIMPLE_WINDOW_TALK_PANE_IN_OUT]->SetVisible(false);
+
+ nw4r::math::MTX34 transform = mpPanes[SIMPLE_WINDOW_TALK_PANE_A_BTN]->GetGlobalMtx();
+ mVec2_c _unused;
+ _unused.x = transform._03;
+ _unused.y = transform._13;
+
+ mOrigPosition.copyFrom(mpPanes[SIMPLE_WINDOW_TALK_PANE_POSITION]->GetTranslate());
+ mPosition.copyFrom(mpPanes[SIMPLE_WINDOW_TALK_PANE_POSITION]->GetTranslate());
+ mOffset.x = mOffset.y = 0.0f;
+
+ return true;
+}
+
+bool dLytSimpleWindowTalk_c::remove() {
+ mLightText.remove();
+ for (int i = 0; i < SIMPLE_WINDOW_TALK_NUM_ANIMS; i++) {
+ mAnm[i].remove();
+ }
+ return true;
+}
+
+bool dLytSimpleWindowTalk_c::execute() {
+ for (int i = 0; i < SIMPLE_WINDOW_TALK_NUM_ANIMS; i++) {
+ if (mAnm[i].isEnabled()) {
+ mAnm[i].play();
+ }
+ }
+ mLyt.calc();
+ return true;
+}
+
+bool dLytSimpleWindowTalk_c::draw() {
+ bool bVis[3];
+ for (int i = 0; i < 3; ++i) {
+ bVis[i] = mpPanes[i]->IsVisible();
+ };
+
+ mpPanes[0]->SetVisible(bVis[0]);
+ mpPanes[1]->SetVisible(false);
+ mpPanes[2]->SetVisible(false);
+
+ mLyt.draw();
+ mBlurRelated.drawTextBlur(&mLightText, mOffset, mpPanes[3]->GetAlpha());
+
+ mpPanes[0]->SetVisible(false);
+ mpPanes[1]->SetVisible(bVis[1]);
+ mpPanes[2]->SetVisible(bVis[2]);
+
+ mLyt.draw();
+
+ for (int i = 0; i < 3; ++i) {
+ mpPanes[i]->SetVisible(bVis[i]);
+ };
+ return true;
+}
+
+void dLytSimpleWindowTalk_c::initializeIn(s32 pos) {
+ mAnm[SIMPLE_WINDOW_TALK_ANIM_IN].setAnimEnable(true);
+ mAnm[SIMPLE_WINDOW_TALK_ANIM_IN].setFrame(0.0f);
+
+ mAnm[SIMPLE_WINDOW_TALK_ANIM_POSITION].setFrame(pos);
+ mAnm[SIMPLE_WINDOW_TALK_ANIM_POSITION].setAnimEnable(true);
+ mLyt.calc();
+ mAnm[SIMPLE_WINDOW_TALK_ANIM_POSITION].setAnimEnable(false);
+
+ mPosition = mOrigPosition;
+ mPosition.y = mpPanes[SIMPLE_WINDOW_TALK_PANE_POSITION]->GetTranslate().y;
+ mpPanes[SIMPLE_WINDOW_TALK_PANE_POSITION]->SetTranslate(mPosition);
+}
+
+bool dLytSimpleWindowTalk_c::isIn() {
+ if (mAnm[SIMPLE_WINDOW_TALK_ANIM_IN].isEndReached()) {
+ mAnm[SIMPLE_WINDOW_TALK_ANIM_IN].setAnimEnable(false);
+ return true;
+ }
+ return false;
+}
+
+void dLytSimpleWindowTalk_c::initializeOutputText() {
+ nw4r::lyt::Size size = getTextBox()->GetSize();
+ nw4r::lyt::Size fontSize = getTextBox()->GetFontSize();
+ nw4r::math::MTX34 transform = getTextBox()->GetGlobalMtx();
+
+ mOffset.x = transform._03 - size.width / 2;
+ mOffset.y = transform._13 + size.height / 2;
+}
+
+void dLytSimpleWindowTalk_c::initializeOut() {
+ mAnm[SIMPLE_WINDOW_TALK_ANIM_OUT].setAnimEnable(true);
+ mAnm[SIMPLE_WINDOW_TALK_ANIM_OUT].setFrame(0.0f);
+}
+
+bool dLytSimpleWindowTalk_c::isOut() {
+ if (mAnm[SIMPLE_WINDOW_TALK_ANIM_OUT].isEndReached()) {
+ mAnm[SIMPLE_WINDOW_TALK_ANIM_OUT].setAnimEnable(false);
+ return true;
+ }
+ return false;
+}
+
+bool dLytSimpleWindowTalk_c::setText(const wchar_t *text) {
+ mpTextboxes[0]->SetTagProcessor(mpTagProcessor);
+ mpTextboxes[1]->SetTagProcessor(mpTagProcessor);
+ mpTextboxes[0]->setTextWithTextProcessor(text, mpTagProcessor, nullptr);
+ mpTextboxes[1]->setTextWithTextProcessor(text, mpTagProcessor, nullptr);
+ return true;
+}
+
+static const d2d::LytBrlanMapping brlanMapSword[] = {
+ { "messageWindow_01_in.brlan", "G_inOut_00"},
+ { "messageWindow_01_out.brlan", "G_inOut_00"},
+ { "messageWindow_01_loop.brlan", "G_loop_00"},
+ { "messageWindow_01_color.brlan", "G_color_00"},
+ {"messageWindow_01_position.brlan", "G_position_00"},
+};
+
+#define SIMPLE_WINDOW_SWORD_ANIM_IN 0
+#define SIMPLE_WINDOW_SWORD_ANIM_OUT 1
+#define SIMPLE_WINDOW_SWORD_ANIM_LOOP 2
+#define SIMPLE_WINDOW_SWORD_ANIM_COLOR 3
+#define SIMPLE_WINDOW_SWORD_ANIM_POSITION 4
+
+#define SIMPLE_WINDOW_SWORD_NUM_ANIMS 5
+
+static const char *sSwordPaneNames[] = {
+ "N_aBtn_00",
+ "N_inOut_00",
+ "N_position_00",
+};
+
+#define SIMPLE_WINDOW_SWORD_PANE_A_BTN 0
+#define SIMPLE_WINDOW_SWORD_PANE_IN_OUT 1
+#define SIMPLE_WINDOW_SWORD_PANE_POSITION 2
+
+#define SIMPLE_WINDOW_SWORD_NUM_PANES 3
+
+static const char *sSwordTextboxNames[] = {
+ "T_message_00",
+ "T_messageS_00",
+};
+
+#define SIMPLE_WINDOW_SWORD_NUM_TEXTBOXES 2
+
+bool dLytSimpleWindowSword_c::build(d2d::ResAccIf_c *resAcc, dTagProcessor_c *tagProcessor) {
+ mpResAcc = resAcc;
+ mLyt.setResAcc(resAcc);
+ mLyt.build("messageWindow_01.brlyt", nullptr);
+ mLyt.setPriority(0x8A);
+
+ for (int i = 0; i < SIMPLE_WINDOW_SWORD_NUM_ANIMS; i++) {
+ mAnm[i].init(brlanMapSword[i].mFile, mpResAcc, mLyt.getLayout(), brlanMapSword[i].mName);
+ mAnm[i].bind(false);
+ mAnm[i].setAnimEnable(false);
+ }
+
+ mAnm[SIMPLE_WINDOW_SWORD_ANIM_LOOP].setAnimEnable(true);
+
+ mAnm[SIMPLE_WINDOW_SWORD_ANIM_OUT].setAnimEnable(true);
+ mAnm[SIMPLE_WINDOW_SWORD_ANIM_OUT].setToEnd();
+ mLyt.calc();
+ mAnm[SIMPLE_WINDOW_SWORD_ANIM_OUT].setAnimEnable(false);
+
+ for (int i = 0; i < SIMPLE_WINDOW_SWORD_NUM_PANES; i++) {
+ mpPanes[i] = mLyt.findPane(sSwordPaneNames[i]);
+ }
+
+ for (int i = 0; i < SIMPLE_WINDOW_SWORD_NUM_TEXTBOXES; i++) {
+ mpTextboxes[i] = mLyt.getTextBox(sSwordTextboxNames[i]);
+ mpTextboxes[i]->SetTextPositionH(0);
+ mpTextboxes[i]->SetTextPositionV(0);
+ }
+
+ mpTextboxes[1]->setIsShadow(1);
+ mpTagProcessor = tagProcessor;
+
+ for (int i = 0; i < (int)ARRAY_LENGTH(mCharData); i++) {
+ mCharData[i].reset();
+ mTextBuf[i] = L'\0';
+ }
+
+ mAnm[SIMPLE_WINDOW_SWORD_ANIM_COLOR].setAnimEnable(true);
+ mAnm[SIMPLE_WINDOW_SWORD_ANIM_COLOR].setFrame(mSwordType);
+ mpPanes[SIMPLE_WINDOW_SWORD_PANE_IN_OUT]->SetVisible(true);
+ mLyt.calc();
+ mpPanes[SIMPLE_WINDOW_SWORD_PANE_IN_OUT]->SetVisible(false);
+ mAnm[SIMPLE_WINDOW_SWORD_ANIM_COLOR].setAnimEnable(false);
+
+ nw4r::math::MTX34 transform = mpPanes[SIMPLE_WINDOW_SWORD_PANE_A_BTN]->GetGlobalMtx();
+ mVec2_c _unused;
+ _unused.x = transform._03;
+ _unused.y = transform._13;
+
+ mOrigPosition.copyFrom(mpPanes[SIMPLE_WINDOW_SWORD_PANE_POSITION]->GetTranslate());
+ mPosition.copyFrom(mpPanes[SIMPLE_WINDOW_SWORD_PANE_POSITION]->GetTranslate());
+ mOffset.x = mOffset.y = 0.0f;
+
+ field_0x5AC8 = 0;
+
+ return true;
+}
+
+bool dLytSimpleWindowSword_c::remove() {
+ for (int i = 0; i < SIMPLE_WINDOW_SWORD_NUM_ANIMS; i++) {
+ mAnm[i].remove();
+ }
+ return true;
+}
+
+bool dLytSimpleWindowSword_c::execute() {
+ for (int i = 0; i < SIMPLE_WINDOW_SWORD_NUM_ANIMS; i++) {
+ if (mAnm[i].isEnabled()) {
+ mAnm[i].play();
+ }
+ }
+ mLyt.calc();
+ field_0x5AC8 = 0;
+ return true;
+}
+
+bool dLytSimpleWindowSword_c::draw() {
+ mLyt.draw();
+ return true;
+}
+
+void dLytSimpleWindowSword_c::initializeIn(s32 pos) {
+ mAnm[SIMPLE_WINDOW_SWORD_ANIM_IN].setAnimEnable(true);
+ mAnm[SIMPLE_WINDOW_SWORD_ANIM_IN].setFrame(0.0f);
+
+ mAnm[SIMPLE_WINDOW_SWORD_ANIM_POSITION].setFrame(pos);
+ mAnm[SIMPLE_WINDOW_SWORD_ANIM_POSITION].setAnimEnable(true);
+ mLyt.calc();
+ mAnm[SIMPLE_WINDOW_SWORD_ANIM_POSITION].setAnimEnable(false);
+
+ mPosition = mOrigPosition;
+ mPosition.y = mpPanes[SIMPLE_WINDOW_SWORD_PANE_POSITION]->GetTranslate().y;
+ mpPanes[SIMPLE_WINDOW_SWORD_PANE_POSITION]->SetTranslate(mPosition);
+}
+
+bool dLytSimpleWindowSword_c::isIn() {
+ if (mAnm[SIMPLE_WINDOW_SWORD_ANIM_IN].isEndReached()) {
+ mAnm[SIMPLE_WINDOW_SWORD_ANIM_IN].setAnimEnable(false);
+ return true;
+ }
+ return false;
+}
+
+void dLytSimpleWindowSword_c::initializeOutputText() {
+ nw4r::lyt::Size size = getTextBox()->GetSize();
+ nw4r::lyt::Size fontSize = getTextBox()->GetFontSize();
+ nw4r::math::MTX34 transform = getTextBox()->GetGlobalMtx();
+ mOffset.x = transform._03 - size.width / 2;
+ mOffset.y = transform._13 + size.height / 2;
+}
+
+void dLytSimpleWindowSword_c::initializeOut() {
+ mAnm[SIMPLE_WINDOW_SWORD_ANIM_OUT].setAnimEnable(true);
+ mAnm[SIMPLE_WINDOW_SWORD_ANIM_OUT].setFrame(0.0f);
+}
+
+bool dLytSimpleWindowSword_c::isOut() {
+ if (mAnm[SIMPLE_WINDOW_SWORD_ANIM_OUT].isEndReached()) {
+ mAnm[SIMPLE_WINDOW_SWORD_ANIM_OUT].setAnimEnable(false);
+ return true;
+ }
+ return false;
+}
+
+bool dLytSimpleWindowSword_c::setText(const wchar_t *text) {
+ int foundIdx = ARRAY_LENGTH(mCharData);
+ for (int i = 0; i < (int)ARRAY_LENGTH(mCharData); i++) {
+ if (mCharData[i].displayTimerMaybe >= 0 && foundIdx > mCharData[i].field_0x0C) {
+ foundIdx = mCharData[i].field_0x0C;
+ }
+ }
+
+ // How is text bounds-checked here????
+ for (int i = 0; i < (int)ARRAY_LENGTH(mCharData); i++) {
+ if (i < foundIdx) {
+ mTextBuf[i] = text[i];
+ } else {
+ mTextBuf[i] = L' ';
+ }
+ }
+
+ mpTextboxes[0]->SetTagProcessor(mpTagProcessor);
+ mpTextboxes[1]->SetTagProcessor(mpTagProcessor);
+ mpTextboxes[0]->setTextWithTextProcessor(text, mpTagProcessor, nullptr);
+ mpTextboxes[1]->setTextWithTextProcessor(text, mpTagProcessor, nullptr);
+ return true;
+}
+
+static const d2d::LytBrlanMapping brlanMapLink[] = {
+ { "linkWindow_00_in.brlan", "G_inOut_00"},
+ { "linkWindow_00_out.brlan", "G_inOut_00"},
+ {"linkWindow_00_position.brlan", "G_position_00"},
+ { "linkWindow_00_loop.brlan", "G_loop_00"},
+};
+
+#define SIMPLE_WINDOW_LINK_ANIM_IN 0
+#define SIMPLE_WINDOW_LINK_ANIM_OUT 1
+#define SIMPLE_WINDOW_LINK_ANIM_POSITION 2
+#define SIMPLE_WINDOW_LINK_ANIM_LOOP 3
+
+#define SIMPLE_WINDOW_LINK_NUM_ANIMS 4
+
+static const char *sLinkPaneNames[] = {
+ "N_window_00", "N_message_00", "N_aBtn_00", "N_inOut_00", "N_position_00",
+};
+
+#define SIMPLE_WINDOW_LINK_PANE_WINDOW 0
+#define SIMPLE_WINDOW_LINK_PANE_MESSAGE 1
+#define SIMPLE_WINDOW_LINK_PANE_A_BTN 2
+#define SIMPLE_WINDOW_LINK_PANE_IN_OUT 3
+#define SIMPLE_WINDOW_LINK_PANE_POSITION 4
+
+#define SIMPLE_WINDOW_LINK_NUM_PANES 5
+
+static const char *sLinkTextboxNames[] = {
+ "T_message_00",
+ "T_messageS_00",
+};
+
+#define SIMPLE_WINDOW_LINK_NUM_TEXTBOXES 2
+
+bool dLytSimpleWindowLink_c::build(d2d::ResAccIf_c *resAcc, dTagProcessor_c *tagProcessor) {
+ mpResAcc = resAcc;
+ mLyt.setResAcc(resAcc);
+ mLyt.build("linkWindow_00.brlyt", nullptr);
+ mLyt.setPriority(0x8A);
+
+ for (int i = 0; i < SIMPLE_WINDOW_LINK_NUM_ANIMS; i++) {
+ mAnm[i].init(brlanMapLink[i].mFile, mpResAcc, mLyt.getLayout(), brlanMapLink[i].mName);
+ mAnm[i].bind(false);
+ mAnm[i].setAnimEnable(false);
+ }
+
+ mAnm[SIMPLE_WINDOW_LINK_ANIM_LOOP].setAnimEnable(true);
+
+ mAnm[SIMPLE_WINDOW_LINK_ANIM_OUT].setAnimEnable(true);
+ mAnm[SIMPLE_WINDOW_LINK_ANIM_OUT].setToEnd();
+ mLyt.calc();
+ mAnm[SIMPLE_WINDOW_LINK_ANIM_OUT].setAnimEnable(false);
+
+ for (int i = 0; i < SIMPLE_WINDOW_LINK_NUM_PANES; i++) {
+ mpPanes[i] = mLyt.findPane(sLinkPaneNames[i]);
+ }
+
+ for (int i = 0; i < SIMPLE_WINDOW_LINK_NUM_TEXTBOXES; i++) {
+ mpTextboxes[i] = mLyt.getTextBox(sLinkTextboxNames[i]);
+ mpTextboxes[i]->SetTextPositionH(0);
+ mpTextboxes[i]->SetTextPositionV(0);
+ }
+
+ mpTextboxes[1]->setIsShadow(1);
+ mpTagProcessor = tagProcessor;
+
+ mLightText.build(mpResAcc, dLytTextLight::NORMAL);
+ mBlurRelated.build();
+
+ mpPanes[SIMPLE_WINDOW_LINK_PANE_IN_OUT]->SetVisible(true);
+ mLyt.calc();
+ mpPanes[SIMPLE_WINDOW_LINK_PANE_IN_OUT]->SetVisible(false);
+
+ nw4r::math::MTX34 transform = mpPanes[SIMPLE_WINDOW_LINK_PANE_A_BTN]->GetGlobalMtx();
+ mVec2_c _unused;
+ _unused.x = transform._03;
+ _unused.y = transform._13;
+
+ mOrigPosition.copyFrom(mpPanes[SIMPLE_WINDOW_LINK_PANE_POSITION]->GetTranslate());
+ mPosition.copyFrom(mpPanes[SIMPLE_WINDOW_LINK_PANE_POSITION]->GetTranslate());
+ mOffset.x = mOffset.y = 0.0f;
+
+ return true;
+}
+
+bool dLytSimpleWindowLink_c::remove() {
+ mLightText.remove();
+ for (int i = 0; i < SIMPLE_WINDOW_LINK_NUM_ANIMS; i++) {
+ mAnm[i].remove();
+ }
+ return true;
+}
+
+bool dLytSimpleWindowLink_c::execute() {
+ for (int i = 0; i < SIMPLE_WINDOW_LINK_NUM_ANIMS; i++) {
+ if (mAnm[i].isEnabled()) {
+ mAnm[i].play();
+ }
+ }
+ mLyt.calc();
+ return true;
+}
+
+bool dLytSimpleWindowLink_c::draw() {
+ bool bVis[3];
+ for (int i = 0; i < 3; ++i) {
+ bVis[i] = mpPanes[i]->IsVisible();
+ };
+
+ mpPanes[0]->SetVisible(bVis[0]);
+ mpPanes[1]->SetVisible(false);
+ mpPanes[2]->SetVisible(false);
+
+ mLyt.draw();
+ mBlurRelated.drawTextBlur(&mLightText, mOffset, mpPanes[3]->GetAlpha());
+
+ mpPanes[0]->SetVisible(false);
+ mpPanes[1]->SetVisible(bVis[1]);
+ mpPanes[2]->SetVisible(bVis[2]);
+
+ mLyt.draw();
+
+ for (int i = 0; i < 3; ++i) {
+ mpPanes[i]->SetVisible(bVis[i]);
+ };
+ return true;
+}
+
+void dLytSimpleWindowLink_c::initializeIn(s32 pos) {
+ mAnm[SIMPLE_WINDOW_LINK_ANIM_IN].setAnimEnable(true);
+ mAnm[SIMPLE_WINDOW_LINK_ANIM_IN].setFrame(0.0f);
+
+ mAnm[SIMPLE_WINDOW_LINK_ANIM_POSITION].setFrame(pos);
+ mAnm[SIMPLE_WINDOW_LINK_ANIM_POSITION].setAnimEnable(true);
+ mLyt.calc();
+ mAnm[SIMPLE_WINDOW_LINK_ANIM_POSITION].setAnimEnable(false);
+
+ mPosition = mOrigPosition;
+ mPosition.y = mpPanes[SIMPLE_WINDOW_LINK_PANE_POSITION]->GetTranslate().y;
+ mpPanes[SIMPLE_WINDOW_LINK_PANE_POSITION]->SetTranslate(mPosition);
+}
+
+bool dLytSimpleWindowLink_c::isIn() {
+ if (mAnm[SIMPLE_WINDOW_LINK_ANIM_IN].isEndReached()) {
+ mAnm[SIMPLE_WINDOW_LINK_ANIM_IN].setAnimEnable(false);
+ return true;
+ }
+ return false;
+}
+
+void dLytSimpleWindowLink_c::initializeOutputText() {
+ nw4r::lyt::Size size = getTextBox()->GetSize();
+ nw4r::lyt::Size fontSize = getTextBox()->GetFontSize();
+ nw4r::math::MTX34 transform = getTextBox()->GetGlobalMtx();
+
+ mOffset.x = transform._03 - size.width / 2;
+ mOffset.y = transform._13 + size.height / 2;
+}
+
+void dLytSimpleWindowLink_c::initializeOut() {
+ mAnm[SIMPLE_WINDOW_LINK_ANIM_OUT].setAnimEnable(true);
+ mAnm[SIMPLE_WINDOW_LINK_ANIM_OUT].setFrame(0.0f);
+}
+
+bool dLytSimpleWindowLink_c::isOut() {
+ if (mAnm[SIMPLE_WINDOW_LINK_ANIM_OUT].isEndReached()) {
+ mAnm[SIMPLE_WINDOW_LINK_ANIM_OUT].setAnimEnable(false);
+ return true;
+ }
+ return false;
+}
+
+bool dLytSimpleWindowLink_c::setText(const wchar_t *text) {
+ mpTextboxes[0]->SetTagProcessor(mpTagProcessor);
+ mpTextboxes[1]->SetTagProcessor(mpTagProcessor);
+ mpTextboxes[0]->setTextWithTextProcessor(text, mpTagProcessor, nullptr);
+ mpTextboxes[1]->setTextWithTextProcessor(text, mpTagProcessor, nullptr);
+ return true;
+}
+
+bool dLytSimpleWindow_c::build() {
+ void *data = LayoutArcManager::GetInstance()->getLoadedData("System2D");
+ mResAcc.attach(data, "");
+ mpTagProcessor = new dTagProcessor_c();
+ mpUnk = new TextWindowUnk(mpTagProcessor);
+
+ mInRequest = false;
+ field_0x3D4 = 0;
+ field_0x3D8 = 0;
+ field_0x3DC = 0;
+ field_0x3E0 = 0;
+ field_0x3E8 = -1;
+ mLabel = "";
+ mTimer = 0;
+ mWaitForEvent = false;
+ mpCurrentWindow = nullptr;
+ mpWindowTalk = nullptr;
+ mpWindowSword = nullptr;
+ mpWindowLink = nullptr;
+
+ mStateMgr.changeState(StateID_Invisible);
+
+ return true;
+}
+
+bool dLytSimpleWindow_c::remove() {
+ if (mpWindowTalk != nullptr) {
+ delete mpWindowTalk;
+ mpWindowTalk = nullptr;
+ }
+ if (mpWindowSword != nullptr) {
+ delete mpWindowSword;
+ mpWindowSword = nullptr;
+ }
+ if (mpWindowLink != nullptr) {
+ delete mpWindowLink;
+ mpWindowLink = nullptr;
+ }
+
+ mpCurrentWindow = nullptr;
+ delete mpUnk;
+ mpUnk = nullptr;
+ delete mpTagProcessor;
+ mpTagProcessor = nullptr;
+
+ mResAcc.detach();
+ return true;
+}
+
+void dLytSimpleWindow_c::initializeState_Invisible() {}
+void dLytSimpleWindow_c::executeState_Invisible() {
+ if (!mInRequest) {
+ return;
+ }
+ mInRequest = false;
+ if (!dMessage_c::isValidTextLabel(mLabel)) {
+ return;
+ }
+
+ const wchar_t *message = dMessage_c::getTextMessageByLabel(mLabel, mpTagProcessor, true, nullptr, 0);
+ if (mpTagProcessor->getMsgWindowSubtype() == dLytMsgWindow_c::MSG_WINDOW_SWORD_FI ||
+ mpTagProcessor->getMsgWindowSubtype() == dLytMsgWindow_c::MSG_WINDOW_SWORD_GHIRAHIM) {
+ mpWindowSword = new dLytSimpleWindowSword_c();
+
+ if (mpTagProcessor->getMsgWindowSubtype() == dLytMsgWindow_c::MSG_WINDOW_SWORD_GHIRAHIM) {
+ mpWindowSword->setSwordType(dLytTextSword::GHIRAHIM);
+ } else {
+ mpWindowSword->setSwordType(dLytTextSword::FI);
+ }
+
+ mpWindowSword->build(&mResAcc, mpTagProcessor);
+ mpCurrentWindow = mpWindowSword;
+ } else if (mpTagProcessor->getMsgWindowSubtype() == dLytMsgWindow_c::MSG_WINDOW_LINK) {
+ mpWindowLink = new dLytSimpleWindowLink_c();
+ mpWindowLink->build(&mResAcc, mpTagProcessor);
+ mpCurrentWindow = mpWindowLink;
+ } else {
+ mpWindowTalk = new dLytSimpleWindowTalk_c();
+ mpWindowTalk->build(&mResAcc, mpTagProcessor);
+ mpCurrentWindow = mpWindowTalk;
+ }
+
+ field_0x42A = mLabel;
+
+ mpUnk->fn_800B2130(field_0x42A, mpCurrentWindow->getTextBox(), mpCurrentWindow->getCharData(), true);
+ mpCurrentWindow->setText(mpUnk->getProcessedText());
+ mStateMgr.changeState(StateID_In);
+}
+void dLytSimpleWindow_c::finalizeState_Invisible() {}
+
+void dLytSimpleWindow_c::initializeState_In() {
+ s32 pos;
+ if (mpTagProcessor->getField_0x90D() == 1) {
+ pos = 0;
+ } else if (mpTagProcessor->getField_0x90D() == 3) {
+ pos = 1;
+ } else {
+ pos = 2;
+ }
+
+ mpCurrentWindow->initializeIn(pos);
+ dLyt_HIO_c::getInstance()->setStr2("");
+}
+void dLytSimpleWindow_c::executeState_In() {
+ if (mpCurrentWindow->isIn()) {
+ mpUnk->textAdvancingRelated(true, true);
+ mpCurrentWindow->setText(mpUnk->getProcessedText());
+ mStateMgr.changeState(StateID_OutputText);
+ }
+}
+void dLytSimpleWindow_c::finalizeState_In() {}
+
+void dLytSimpleWindow_c::initializeState_OutputText() {
+ mpCurrentWindow->initializeOutputText();
+}
+void dLytSimpleWindow_c::executeState_OutputText() {
+ if (mTimer > 0) {
+ mTimer--;
+ }
+
+ if (isInEvent() || !dLytControlGame_c::getInstance()->isStateNormal() || dLytMeter_c::getItemSelect0x75A2() ||
+ dLytMeter_c::getMinusBtnFn800F7600() || dLytMeter_c::getDowsingFn800FE4B0()) {
+ mTimer = 0;
+ mWaitForEvent = false;
+ }
+
+ if (!mWaitForEvent && mTimer <= 0) {
+ mStateMgr.changeState(StateID_Out);
+ }
+}
+void dLytSimpleWindow_c::finalizeState_OutputText() {}
+
+void dLytSimpleWindow_c::initializeState_Out() {
+ mpCurrentWindow->initializeOut();
+ dLyt_HIO_c::getInstance()->setStr2("");
+ dLyt_HIO_c::getInstance()->setStr1("");
+ dLyt_HIO_c::getInstance()->setStr3("");
+}
+void dLytSimpleWindow_c::executeState_Out() {
+ if (mpCurrentWindow->isOut()) {
+ mLabel = "";
+ if (mpWindowTalk != nullptr) {
+ delete mpWindowTalk;
+ mpWindowTalk = nullptr;
+ }
+ if (mpWindowSword != nullptr) {
+ delete mpWindowSword;
+ mpWindowSword = nullptr;
+ }
+ if (mpWindowLink != nullptr) {
+ delete mpWindowLink;
+ mpWindowLink = nullptr;
+ }
+
+ mpCurrentWindow = nullptr;
+ mStateMgr.changeState(StateID_Invisible);
+ }
+}
+void dLytSimpleWindow_c::finalizeState_Out() {}
+
+bool dLytSimpleWindow_c::execute() {
+ mStateMgr.executeState();
+ if (isVisible() && mpCurrentWindow != nullptr) {
+ mpCurrentWindow->execute();
+ }
+ return true;
+}
+
+void dLytSimpleWindow_c::draw() {
+ if (isVisible() && mpCurrentWindow != nullptr) {
+ mpTagProcessor->resetSomeThings();
+ mpCurrentWindow->draw();
+ }
+}
+
+bool dLytSimpleWindow_c::set(const char *label, s32 timer, bool global) {
+ if (!isVisible()) {
+ if (global) {
+ s32 idx = dMessage_c::getMsbtIndexForLabel(label);
+ if (idx < 0) {
+ return false;
+ }
+ dMessage_c::getInstance()->setCurrentTextFileNumber(idx);
+ }
+ mInRequest = true;
+ if (timer >= 0) {
+ mTimer = timer;
+ mWaitForEvent = false;
+ } else {
+ // This is a bit weird, the timer will still be running
+ // here and it'll be checked even when the event has happened
+ // Probably not a problem in practice though
+ mWaitForEvent = true;
+ }
+ mLabel = label;
+ return true;
+ } else {
+ return false;
+ }
+}
+
+bool dLytSimpleWindow_c::isVisible() {
+ return !(*mStateMgr.getStateID() == StateID_Invisible);
+}
+
+bool dLytSimpleWindow_c::isOutputText() {
+ return (*mStateMgr.getStateID() == StateID_OutputText);
+}
+
+bool dLytSimpleWindow_c::isInEvent() {
+ if (EventManager::isInEvent()) {
+ if (EventManager::getCurrentEventName() != nullptr &&
+ strequals(EventManager::getCurrentEventName(), "DefaultStart")) {
+ return false;
+ }
+ return true;
+ }
+ return false;
+}