summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2025-04-02 13:36:11 +0200
committerrobojumper <robojumper@gmail.com>2025-04-07 22:12:36 +0200
commit4e88b4aec785bd1468bbe4716941e2681a8387e9 (patch)
treeadefd6c54b75b790a3553a2364e62e6fd5b0c96d /src
parent5e2343afb79863394f5f1487d70cd3492305963e (diff)
auto_caption, auto_explain largely matching
Diffstat (limited to 'src')
-rw-r--r--src/d/d_tag_processor.cpp14
-rw-r--r--src/d/lyt/d_lyt_auto_caption.cpp176
-rw-r--r--src/d/lyt/d_lyt_auto_explain.cpp169
-rw-r--r--src/d/lyt/msg_window/d_lyt_msg_window_stone.cpp10
-rw-r--r--src/d/lyt/msg_window/d_lyt_msg_window_wood.cpp10
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) {