mirror of
https://github.com/zeldaret/ss
synced 2026-09-12 12:25:34 -04:00
d_lyt_simple_window OK
This commit is contained in:
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user