summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/d/d_textwindow_unk.cpp4
-rw-r--r--src/d/lyt/d_lyt_control_game.cpp14
-rw-r--r--src/d/lyt/meter/d_lyt_meter.cpp6
-rw-r--r--src/d/lyt/msg_window/d_lyt_msg_window_sword.cpp14
-rw-r--r--src/d/lyt/msg_window/d_lyt_simple_window.cpp795
5 files changed, 821 insertions, 12 deletions
diff --git a/src/d/d_textwindow_unk.cpp b/src/d/d_textwindow_unk.cpp
index 22782a5d..063df1b9 100644
--- a/src/d/d_textwindow_unk.cpp
+++ b/src/d/d_textwindow_unk.cpp
@@ -70,14 +70,14 @@ bool TextWindowUnk::checkEndReached() const {
}
void MsgWindowBlurRelated::build() {
- for (int i = 0; i < 1023; i++) {
+ for (int i = 0; i < TextWindowUnk::BUF_SIZE; i++) {
mData[i].reset();
}
}
void MsgWindowBlurRelated::drawTextBlur(dLytTextLight *thing, mVec2_c size, u8 alpha) {
s8 t = -1;
- for (int i = 0; i < 1023; i++) {
+ for (int i = 0; i < TextWindowUnk::BUF_SIZE; i++) {
if (mData[i].displayTimerMaybe >= 0) {
if (t == -1) {
mData[i].displayTimerMaybe++;
diff --git a/src/d/lyt/d_lyt_control_game.cpp b/src/d/lyt/d_lyt_control_game.cpp
new file mode 100644
index 00000000..23c96f7d
--- /dev/null
+++ b/src/d/lyt/d_lyt_control_game.cpp
@@ -0,0 +1,14 @@
+#include "d/lyt/d_lyt_control_game.h"
+
+#include "common.h"
+#include "f/f_profile_name.h"
+
+SPECIAL_BASE_PROFILE(LYT_CONTROL_GAME, dLytControlGame_c, fProfile::LYT_CONTROL_GAME, 0x9, 96);
+
+dLytControlGame_c::dLytControlGame_c() : mStateMgr(*this), field_0x15C24(0), field_0x15C28(0) {
+ sInstance = this;
+}
+
+dLytControlGame_c::~dLytControlGame_c() {
+ sInstance = nullptr;
+}
diff --git a/src/d/lyt/meter/d_lyt_meter.cpp b/src/d/lyt/meter/d_lyt_meter.cpp
index abfcb738..3d7382b7 100644
--- a/src/d/lyt/meter/d_lyt_meter.cpp
+++ b/src/d/lyt/meter/d_lyt_meter.cpp
@@ -1281,7 +1281,7 @@ void dLytMeterMain_c::checkPaneVisibility() {
MinigameManager::isInMinigameState(MinigameManager::ROLLERCOASTER) || fn_800D56B0() || field_0x1377E)
|| (dLytMeter_c::getField_0x13B66() || fn_800D5420() ||
- (dLytSimpleWindow_c::getInstance() != nullptr && dLytSimpleWindow_c::getInstance()->fn_8012B000()) ||
+ (dLytSimpleWindow_c::getInstance() != nullptr && dLytSimpleWindow_c::getInstance()->isOutputText()) ||
fn_800D5650() || fn_800D5680())) {
mPanesVisible[METER_ANIM_RUPY] = false;
}
@@ -1306,7 +1306,7 @@ void dLytMeterMain_c::checkPaneVisibility() {
field_0x1377E
|| (dLytMeter_c::getField_0x13B66() || fn_800D5420() ||
- (dLytSimpleWindow_c::getInstance() != nullptr && dLytSimpleWindow_c::getInstance()->fn_8012B000()) ||
+ (dLytSimpleWindow_c::getInstance() != nullptr && dLytSimpleWindow_c::getInstance()->isOutputText()) ||
fn_800D5650() || fn_800D5680())) {
mPanesVisible[METER_ANIM_SHIELD] = false;
}
@@ -1333,7 +1333,7 @@ void dLytMeterMain_c::checkPaneVisibility() {
|| (field_0x1377E != 0)
|| (dLytMeter_c::getField_0x13B66() || fn_800D5420() ||
- (dLytSimpleWindow_c::getInstance() != nullptr && dLytSimpleWindow_c::getInstance()->fn_8012B000()) ||
+ (dLytSimpleWindow_c::getInstance() != nullptr && dLytSimpleWindow_c::getInstance()->isOutputText()) ||
fn_800D5650() || fn_800D5680())) {
mPanesVisible[METER_ANIM_HEART] = false;
}
diff --git a/src/d/lyt/msg_window/d_lyt_msg_window_sword.cpp b/src/d/lyt/msg_window/d_lyt_msg_window_sword.cpp
index 27e725f8..16426fc2 100644
--- a/src/d/lyt/msg_window/d_lyt_msg_window_sword.cpp
+++ b/src/d/lyt/msg_window/d_lyt_msg_window_sword.cpp
@@ -4,6 +4,7 @@
#include "d/d_gfx.h"
#include "d/d_tag_processor.h"
#include "d/d_lyt_hio.h"
+#include "d/d_textwindow_unk.h"
#include "d/lyt/d2d.h"
#include "d/lyt/d_textbox.h"
#include "m/m_vec.h"
@@ -96,7 +97,7 @@ bool dLytMsgWindowSword_c::build(d2d::ResAccIf_c *resAcc1, d2d::ResAccIf_c *resA
mSwordText.build(resAcc, mSwordType);
- for (int i = 0; i < 1023; i++) {
+ for (int i = 0; i < TextWindowUnk::BUF_SIZE; i++) {
mCharacterData[i].reset();
mTextBuf[i] = L'\0';
}
@@ -265,7 +266,7 @@ bool dLytMsgWindowSword_c::execute() {
void dLytMsgWindowSword_c::draw() {
mLyt.draw();
- for (int i = 0; i < 1023; i++) {
+ for (int i = 0; i < TextWindowUnk::BUF_SIZE; i++) {
if (mCharacterData[i].displayTimerMaybe >= 0) {
if (!mHasDrawnThisTick) {
mCharacterData[i].displayTimerMaybe += 1;
@@ -313,15 +314,14 @@ bool dLytMsgWindowSword_c::isDoneClosing() const {
}
bool dLytMsgWindowSword_c::setText(const wchar_t *text) {
- int foundIdx = 1023;
- for (int i = 0; i < 1023; i++) {
+ int foundIdx = TextWindowUnk::BUF_SIZE;
+ for (int i = 0; i < TextWindowUnk::BUF_SIZE; i++) {
if (mCharacterData[i].displayTimerMaybe >= 0 && foundIdx > mCharacterData[i].field_0x0C) {
foundIdx = mCharacterData[i].field_0x0C;
}
}
- // How is text bounds-checked here????
- for (int i = 0; i < 1023; i++) {
+ for (int i = 0; i < TextWindowUnk::BUF_SIZE; i++) {
if (i < foundIdx) {
mTextBuf[i] = text[i];
} else {
@@ -333,5 +333,5 @@ bool dLytMsgWindowSword_c::setText(const wchar_t *text) {
mpTextboxes[1]->SetTagProcessor(mpTagProcessor);
mpTextboxes[0]->setTextWithTextProcessor(mTextBuf, mpTagProcessor, 0);
mpTextboxes[1]->setTextWithTextProcessor(mTextBuf, mpTagProcessor, 0);
- return foundIdx == 1023;
+ return foundIdx == TextWindowUnk::BUF_SIZE;
}
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..9991aae7
--- /dev/null
+++ b/src/d/lyt/msg_window/d_lyt_simple_window.cpp
@@ -0,0 +1,795 @@
+#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 < TextWindowUnk::BUF_SIZE; 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 = TextWindowUnk::BUF_SIZE;
+ for (int i = 0; i < TextWindowUnk::BUF_SIZE; i++) {
+ if (mCharData[i].displayTimerMaybe >= 0 && foundIdx > mCharData[i].field_0x0C) {
+ foundIdx = mCharData[i].field_0x0C;
+ }
+ }
+
+ for (int i = 0; i < TextWindowUnk::BUF_SIZE; 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;
+}