auto_caption, auto_explain largely matching

This commit is contained in:
robojumper
2025-04-02 13:36:11 +02:00
parent 5e2343afb7
commit 4e88b4aec7
16 changed files with 584 additions and 122 deletions
+7 -7
View File
@@ -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) {
+176
View File
@@ -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;
}
+169
View File
@@ -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;
}
@@ -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) {
@@ -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) {