diff options
| author | robojumper <robojumper@gmail.com> | 2025-04-02 13:36:11 +0200 |
|---|---|---|
| committer | robojumper <robojumper@gmail.com> | 2025-04-07 22:12:36 +0200 |
| commit | 4e88b4aec785bd1468bbe4716941e2681a8387e9 (patch) | |
| tree | adefd6c54b75b790a3553a2364e62e6fd5b0c96d /src | |
| parent | 5e2343afb79863394f5f1487d70cd3492305963e (diff) | |
auto_caption, auto_explain largely matching
Diffstat (limited to 'src')
| -rw-r--r-- | src/d/d_tag_processor.cpp | 14 | ||||
| -rw-r--r-- | src/d/lyt/d_lyt_auto_caption.cpp | 176 | ||||
| -rw-r--r-- | src/d/lyt/d_lyt_auto_explain.cpp | 169 | ||||
| -rw-r--r-- | src/d/lyt/msg_window/d_lyt_msg_window_stone.cpp | 10 | ||||
| -rw-r--r-- | src/d/lyt/msg_window/d_lyt_msg_window_wood.cpp | 10 |
5 files changed, 362 insertions, 17 deletions
diff --git a/src/d/d_tag_processor.cpp b/src/d/d_tag_processor.cpp index 5d3fcd6f..cb7bf2e7 100644 --- a/src/d/d_tag_processor.cpp +++ b/src/d/d_tag_processor.cpp @@ -407,12 +407,12 @@ void dTagProcessor_c::eventFlowTextProcessingRelated( } } else { if (textBox != nullptr) { - if (c == 10) { + if (c == '\n') { *writePtr = c; src++; writePtr++; mCommandInsert++; - s32 i10 = getNumLines(field_0x90C); + s32 i10 = getMaxNumLines(field_0x90C); if (mCommandInsert % i10 == 0) { float1 = fn_800B8040(0, field_0x90C); float1 *= textBox->getMyScale(); @@ -628,11 +628,11 @@ void dTagProcessor_c::fn_800B4FF0(nw4r::ut::Rect *rect, nw4r::ut::PrintContext<w int arg = ptr[0]; nw4r::lyt::Size textBoxSize = field_0x004->GetSize(); nw4r::lyt::Size fontSize = field_0x004->GetFontSize(); - int i1 = getNumLines(field_0x90C); + int i1 = getMaxNumLines(field_0x90C); if (arg % i1 == 0 && field_0x90C != 31 && field_0x90C != 8) { int u = 0; int v = 0; - for (int i = arg; i < arg + getNumLines(field_0x90C) && i < 0x32; i++) { + for (int i = arg; i < arg + getMaxNumLines(field_0x90C) && i < 0x32; i++) { f32 f6 = getFloat(i); if (f6 > 0.0f) { v++; @@ -650,7 +650,7 @@ void dTagProcessor_c::fn_800B4FF0(nw4r::ut::Rect *rect, nw4r::ut::PrintContext<w // completely hidden in the Ghidra decompiler, apparently // because the results aren't used? - if (u < getNumLines(field_0x90C)) { + if (u < getMaxNumLines(field_0x90C)) { f32 w1 = fontSize.width * 0.5f; f32 h1 = fontSize.height * 0.5f; if (!(w1 < UnkTextThing::getField0x758())) { @@ -660,7 +660,7 @@ void dTagProcessor_c::fn_800B4FF0(nw4r::ut::Rect *rect, nw4r::ut::PrintContext<w h1 = UnkTextThing::getField0x758(); } - f32 f7 = (fontSize.height + field_0x004->GetLineSpace()) * 0.5f * (getNumLines(field_0x90C) - v); + f32 f7 = (fontSize.height + field_0x004->GetLineSpace()) * 0.5f * (getMaxNumLines(field_0x90C) - v); field_0x814 = ctx->writer->GetCursorY(); field_0x818 = ctx->y; field_0xEE4 = 1; @@ -983,7 +983,7 @@ f32 dTagProcessor_c::fn_800B8040(s8 factor, u32 windowType) { } } -s32 dTagProcessor_c::getNumLines(s32 arg) { +s32 dTagProcessor_c::getMaxNumLines(s32 arg) { if (arg >= 6 && arg < 8) { return 4; } else if (arg == 9) { diff --git a/src/d/lyt/d_lyt_auto_caption.cpp b/src/d/lyt/d_lyt_auto_caption.cpp new file mode 100644 index 00000000..ec5ba34b --- /dev/null +++ b/src/d/lyt/d_lyt_auto_caption.cpp @@ -0,0 +1,176 @@ +#include "d/lyt/d_lyt_auto_caption.h" + +#include "common.h" +#include "d/d_tag_processor.h" +#include "d/lyt/d2d.h" +#include "d/lyt/d_textbox.h" +#include "s/s_State.hpp" + +STATE_DEFINE(dLytAutoCaption_c, Invisible); +STATE_DEFINE(dLytAutoCaption_c, In); +STATE_DEFINE(dLytAutoCaption_c, OutputText); +STATE_DEFINE(dLytAutoCaption_c, Out); + +static const d2d::LytBrlanMapping brlanMap[] = { + { "autoCaption_00_in.brlan", "G_inOut_00"}, + { "autoCaption_00_out.brlan", "G_inOut_00"}, + { "autoCaption_00_loop.brlan", "G_loop_00"}, + {"autoCaption_00_textLine.brlan", "G_textLine_00"}, +}; + +#define AUTO_CAPTION_ANIM_IN 0 +#define AUTO_CAPTION_ANIM_OUT 1 +#define AUTO_CAPTION_ANIM_LOOP 2 +#define AUTO_CAPTION_ANIM_TEXTLINE 3 + +#define AUTO_CAPTION_NUM_ANIMS 4 + +static const char *sPanes[] = { + "N_inOutAll_00", +}; + +static const char *sTextBoxes[] = { + "T_textBox_00", + "T_textBoxS_00", +}; + +static const char *sGroupName = "G_ref_00"; + +void dLytAutoCaption_c::initializeState_Invisible() {} +void dLytAutoCaption_c::executeState_Invisible() { + if (mShouldBeOpen) { + mStateMgr.changeState(StateID_In); + } +} +void dLytAutoCaption_c::finalizeState_Invisible() {} + +void dLytAutoCaption_c::initializeState_In() { + s32 unk = mpTextboxes[0]->fn_800AF6B0(mpTextboxes[0]->GetString(), mpTagProcessor); + f32 lineWidth = mpTextboxes[0]->GetLineWidth(nullptr); + f32 frame = 0.0f; + if (lineWidth <= 226.0f) { + if (unk > 1) { + frame = 1.0f; + } + } else if (unk > 1) { + frame = 3.0f; + } else { + frame = 2.0f; + } + + mAnm[AUTO_CAPTION_ANIM_TEXTLINE].setAnimEnable(true); + mAnm[AUTO_CAPTION_ANIM_TEXTLINE].setFrame(frame); + mLyt.calc(); + mAnm[AUTO_CAPTION_ANIM_TEXTLINE].setAnimEnable(false); + + mAnm[AUTO_CAPTION_ANIM_IN].setAnimEnable(true); + mAnm[AUTO_CAPTION_ANIM_IN].setFrame(0.0f); +} +void dLytAutoCaption_c::executeState_In() { + if (mAnm[AUTO_CAPTION_ANIM_IN].isEndReached()) { + mAnm[AUTO_CAPTION_ANIM_IN].setAnimEnable(false); + mStateMgr.changeState(StateID_OutputText); + } +} +void dLytAutoCaption_c::finalizeState_In() {} + +void dLytAutoCaption_c::initializeState_OutputText() {} +void dLytAutoCaption_c::executeState_OutputText() { + if (!mShouldBeOpen) { + mStateMgr.changeState(StateID_Out); + } +} +void dLytAutoCaption_c::finalizeState_OutputText() {} + +void dLytAutoCaption_c::initializeState_Out() { + mAnm[AUTO_CAPTION_ANIM_OUT].setAnimEnable(true); + mAnm[AUTO_CAPTION_ANIM_OUT].setFrame(0.0f); +} +void dLytAutoCaption_c::executeState_Out() { + if (mAnm[AUTO_CAPTION_ANIM_OUT].isEndReached()) { + mAnm[AUTO_CAPTION_ANIM_OUT].setAnimEnable(false); + mStateMgr.changeState(StateID_Invisible); + } +} +void dLytAutoCaption_c::finalizeState_Out() {} + +bool dLytAutoCaption_c::build(d2d::ResAccIf_c *resAcc1, d2d::ResAccIf_c *resAcc, dTagProcessor_c *tagProcessor) { + mLyt.setResAcc(resAcc1); + mLyt.build("autoCaption_00.brlyt", nullptr); + mLyt.setPriority(0x8A); + + for (int i = 0; i < AUTO_CAPTION_NUM_ANIMS; i++) { + mAnm[i].init(brlanMap[i].mFile, resAcc1, mLyt.getLayout(), brlanMap[i].mName); + mAnm[i].bind(false); + mAnm[i].setAnimEnable(false); + } + + mpPane = mLyt.findPane(sPanes[0]); + + for (int i = 0; i < 2; i++) { + mpTextboxes[i] = mLyt.getTextBox(sTextBoxes[i]); + } + + mpTagProcessor = tagProcessor; + mShouldBeOpen = false; + + mAnm[AUTO_CAPTION_ANIM_LOOP].setAnimEnable(true); + mAnm[AUTO_CAPTION_ANIM_OUT].setAnimEnable(true); + mAnm[AUTO_CAPTION_ANIM_OUT].setToEnd(); + mLyt.calc(); + mAnm[AUTO_CAPTION_ANIM_OUT].setAnimEnable(false); + + mStateMgr.changeState(StateID_Invisible); + return true; +} + +bool dLytAutoCaption_c::remove() { + for (int i = 0; i < AUTO_CAPTION_NUM_ANIMS; i++) { + mAnm[i].remove(); + } + return true; +} + +bool dLytAutoCaption_c::execute() { + mStateMgr.executeState(); + for (int i = 0; i < AUTO_CAPTION_NUM_ANIMS; i++) { + if (mAnm[i].isEnabled()) { + mAnm[i].play(); + } + } + mLyt.calc(); + return true; +} + +void dLytAutoCaption_c::draw() { + mLyt.draw(); +} + +void dLytAutoCaption_c::open() { + mShouldBeOpen = true; +} + +bool dLytAutoCaption_c::isOpening() const { + return !(*mStateMgr.getStateID() == StateID_In); +} + +void dLytAutoCaption_c::close() { + mShouldBeOpen = false; +} + +bool dLytAutoCaption_c::isClosing() const { + return !(*mStateMgr.getStateID() == StateID_Out); +} + +bool dLytAutoCaption_c::setText(const wchar_t *text) { + mpTextboxes[0]->SetTagProcessor(mpTagProcessor); + mpTextboxes[1]->SetTagProcessor(mpTagProcessor); + mpTextboxes[0]->fn_800AF930(text); + mpTextboxes[1]->fn_800AF930(text); + return true; +} + +bool dLytAutoCaption_c::checkSomethingMeter() { + // TODO - too many dependencies on dLytMeter + return false; +} diff --git a/src/d/lyt/d_lyt_auto_explain.cpp b/src/d/lyt/d_lyt_auto_explain.cpp new file mode 100644 index 00000000..b6fb15df --- /dev/null +++ b/src/d/lyt/d_lyt_auto_explain.cpp @@ -0,0 +1,169 @@ +#include "d/lyt/d_lyt_auto_explain.h" + +#include "common.h" +#include "d/d_tag_processor.h" +#include "d/lyt/d2d.h" +#include "d/lyt/d_textbox.h" +#include "s/s_State.hpp" + +STATE_DEFINE(dLytAutoExplain_c, Invisible); +STATE_DEFINE(dLytAutoExplain_c, In); +STATE_DEFINE(dLytAutoExplain_c, OutputText); +STATE_DEFINE(dLytAutoExplain_c, Out); + +static const d2d::LytBrlanMapping brlanMap[] = { + { "autoMessage_00_in.brlan", "G_inOut_00"}, + { "autoMessage_00_out.brlan", "G_inOut_00"}, + {"autoMessage_00_line.brlan", "G_line_00"}, +}; + +#define AUTO_EXPLAIN_ANIM_IN 0 +#define AUTO_EXPLAIN_ANIM_OUT 1 +#define AUTO_EXPLAIN_ANIM_TEXTLINE 2 + +#define AUTO_EXPLAIN_NUM_ANIMS 3 + +static const char *sPanes[] = { + "N_inOutAll_00", +}; + +static const char *sTextBoxes[] = { + "T_autoMsg_00", + "T_autoMsgS_00", +}; + +static const char *sGroupName = "G_ref_00"; + +void dLytAutoExplain_c::initializeState_Invisible() {} +void dLytAutoExplain_c::executeState_Invisible() { + if (mShouldBeOpen) { + mStateMgr.changeState(StateID_In); + } +} +void dLytAutoExplain_c::finalizeState_Invisible() {} + +extern "C" u8 fn_80054F30(); + +void dLytAutoExplain_c::initializeState_In() { + int numLines = mpTagProcessor->getNumLinesMaybe() - 1; + if (fn_80054F30() != 0 && numLines == 3) { + numLines = 2; + } + + mAnm[AUTO_EXPLAIN_ANIM_TEXTLINE].setAnimEnable(true); + mAnm[AUTO_EXPLAIN_ANIM_TEXTLINE].setFrame(numLines); + mLyt.calc(); + mAnm[AUTO_EXPLAIN_ANIM_TEXTLINE].setAnimEnable(false); + + mAnm[AUTO_EXPLAIN_ANIM_IN].setAnimEnable(true); + mAnm[AUTO_EXPLAIN_ANIM_IN].setFrame(0.0f); +} +void dLytAutoExplain_c::executeState_In() { + if (mAnm[AUTO_EXPLAIN_ANIM_IN].isEndReached()) { + mAnm[AUTO_EXPLAIN_ANIM_IN].setAnimEnable(false); + mStateMgr.changeState(StateID_OutputText); + } +} +void dLytAutoExplain_c::finalizeState_In() {} + +void dLytAutoExplain_c::initializeState_OutputText() {} +void dLytAutoExplain_c::executeState_OutputText() { + if (!mShouldBeOpen) { + mStateMgr.changeState(StateID_Out); + } +} +void dLytAutoExplain_c::finalizeState_OutputText() {} + +void dLytAutoExplain_c::initializeState_Out() { + mAnm[AUTO_EXPLAIN_ANIM_OUT].setAnimEnable(true); + mAnm[AUTO_EXPLAIN_ANIM_OUT].setFrame(0.0f); +} +void dLytAutoExplain_c::executeState_Out() { + if (mAnm[AUTO_EXPLAIN_ANIM_OUT].isEndReached()) { + mAnm[AUTO_EXPLAIN_ANIM_OUT].setAnimEnable(false); + mStateMgr.changeState(StateID_Invisible); + } +} +void dLytAutoExplain_c::finalizeState_Out() {} + +bool dLytAutoExplain_c::build(d2d::ResAccIf_c *resAcc1, d2d::ResAccIf_c *resAcc, dTagProcessor_c *tagProcessor) { + mLyt.setResAcc(resAcc1); + mLyt.build("autoMessage_00.brlyt", nullptr); + mLyt.setPriority(0x8A); + + for (int i = 0; i < AUTO_EXPLAIN_NUM_ANIMS; i++) { + mAnm[i].init(brlanMap[i].mFile, resAcc1, mLyt.getLayout(), brlanMap[i].mName); + mAnm[i].bind(false); + mAnm[i].setAnimEnable(false); + } + + mpPane = mLyt.findPane(sPanes[0]); + + for (int i = 0; i < 2; i++) { + mpTextboxes[i] = mLyt.getTextBox(sTextBoxes[i]); + mpTextboxes[i]->SetTextPositionH(0); + // mpTextboxes[i]->SetTextPositionV(0); + } + + mpTagProcessor = tagProcessor; + mShouldBeOpen = false; + + mAnm[AUTO_EXPLAIN_ANIM_OUT].setAnimEnable(true); + mAnm[AUTO_EXPLAIN_ANIM_OUT].setToEnd(); + mLyt.calc(); + mAnm[AUTO_EXPLAIN_ANIM_OUT].setAnimEnable(false); + + mStateMgr.changeState(StateID_Invisible); + return true; +} + +bool dLytAutoExplain_c::remove() { + for (int i = 0; i < AUTO_EXPLAIN_NUM_ANIMS; i++) { + mAnm[i].remove(); + } + return true; +} + +bool dLytAutoExplain_c::execute() { + mStateMgr.executeState(); + for (int i = 0; i < AUTO_EXPLAIN_NUM_ANIMS; i++) { + if (mAnm[i].isEnabled()) { + mAnm[i].play(); + } + } + mLyt.calc(); + return true; +} + +void dLytAutoExplain_c::draw() { + mLyt.draw(); +} + +void dLytAutoExplain_c::open() { + mShouldBeOpen = true; +} + +bool dLytAutoExplain_c::isOpening() const { + return !(*mStateMgr.getStateID() == StateID_In); +} + +void dLytAutoExplain_c::close() { + mShouldBeOpen = false; +} + +bool dLytAutoExplain_c::isClosing() const { + return !(*mStateMgr.getStateID() == StateID_Out); +} + +bool dLytAutoExplain_c::setText(const wchar_t *text) { + mpTextboxes[0]->SetTagProcessor(mpTagProcessor); + mpTextboxes[1]->SetTagProcessor(mpTagProcessor); + mpTextboxes[0]->fn_800AF540(text, mpTagProcessor, 0); + mpTextboxes[1]->fn_800AF540(text, mpTagProcessor, 0); + return true; +} + +bool dLytAutoExplain_c::checkSomethingMeter() { + // TODO - too many dependencies on dLytMeter + return false; +} 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 index b21936ff..ed0ad31e 100644 --- a/src/d/lyt/msg_window/d_lyt_msg_window_stone.cpp +++ b/src/d/lyt/msg_window/d_lyt_msg_window_stone.cpp @@ -38,7 +38,7 @@ static const char *sTextBoxes[] = { static const char *sGroupName = "G_ref_00"; -bool dLytMsgWindowStone_c::build(void *unk, d2d::ResAccIf_c *resAcc, dTagProcessor_c *tagProcessor) { +bool dLytMsgWindowStone_c::build(d2d::ResAccIf_c *resAcc1, d2d::ResAccIf_c *resAcc, dTagProcessor_c *tagProcessor) { mLyt.setResAcc(resAcc); mLyt.build("sekibanWindow_00.brlyt", nullptr); mLyt.setPriority(0x8A); @@ -69,8 +69,8 @@ bool dLytMsgWindowStone_c::build(void *unk, d2d::ResAccIf_c *resAcc, dTagProcess mpTextboxes[2]->set0x1F6(1); for (int i = 0; i < 1; i++) { - mNodes[i].mpLytPane = &mCommon; - mCommon.build(resAcc); + mNodes[i].mpLytPane = &mBtn; + mBtn.build(resAcc); mSubpaneList.PushBack(&mNodes[i]); } @@ -101,7 +101,7 @@ bool dLytMsgWindowStone_c::remove() { for (int i = 0; i < 1; i++) { mNodes[i].mpLytPane->remove(); } - mCommon.remove(); + mBtn.remove(); for (int i = 0; i < SEKIBAN_NUM_ANIMS; i++) { mAnm[i].remove(); } @@ -109,7 +109,7 @@ bool dLytMsgWindowStone_c::remove() { } void dLytMsgWindowStone_c::initializeState_Invisible() { - mCommon.resetToInvisble(); + mBtn.resetToInvisble(); } void dLytMsgWindowStone_c::executeState_Invisible() { if (mShouldBeOpen) { diff --git a/src/d/lyt/msg_window/d_lyt_msg_window_wood.cpp b/src/d/lyt/msg_window/d_lyt_msg_window_wood.cpp index 765a0e0b..3724adbb 100644 --- a/src/d/lyt/msg_window/d_lyt_msg_window_wood.cpp +++ b/src/d/lyt/msg_window/d_lyt_msg_window_wood.cpp @@ -37,7 +37,7 @@ static const char *sTextBoxes[] = { static const char *sGroupName = "G_ref_00"; -bool dLytMsgWindowWood_c::build(void *unk, d2d::ResAccIf_c *resAcc, dTagProcessor_c *tagProcessor) { +bool dLytMsgWindowWood_c::build(d2d::ResAccIf_c *resAcc1, d2d::ResAccIf_c *resAcc, dTagProcessor_c *tagProcessor) { mLyt.setResAcc(resAcc); mLyt.build("kanbanWindow_00.brlyt", nullptr); mLyt.setPriority(0x8A); @@ -67,8 +67,8 @@ bool dLytMsgWindowWood_c::build(void *unk, d2d::ResAccIf_c *resAcc, dTagProcesso mpTextboxes[1]->set0x1F6(1); for (int i = 0; i < 1; i++) { - mNodes[i].mpLytPane = &mCommon; - mCommon.build(resAcc); + mNodes[i].mpLytPane = &mBtn; + mBtn.build(resAcc); mSubpaneList.PushBack(&mNodes[i]); } @@ -99,7 +99,7 @@ bool dLytMsgWindowWood_c::remove() { for (int i = 0; i < 1; i++) { mNodes[i].mpLytPane->remove(); } - mCommon.remove(); + mBtn.remove(); for (int i = 0; i < KANBAN_NUM_ANIMS; i++) { mAnm[i].remove(); } @@ -107,7 +107,7 @@ bool dLytMsgWindowWood_c::remove() { } void dLytMsgWindowWood_c::initializeState_Invisible() { - mCommon.resetToInvisble(); + mBtn.resetToInvisble(); } void dLytMsgWindowWood_c::executeState_Invisible() { if (mShouldBeOpen) { |
