Files
ss/src/d/lyt/d_lyt_help.cpp
T
2025-08-15 22:02:53 +02:00

543 lines
15 KiB
C++

#include "d/lyt/d_lyt_help.h"
#include "common.h"
#include "d/d_d2d.h"
#include "d/d_pad.h"
#include "d/lyt/meter/d_lyt_meter.h"
#include "d/snd/d_snd_player_mgr.h"
#include "m/m2d.h"
#include "sized_string.h"
#include "toBeSorted/arc_managers/layout_arc_manager.h"
STATE_DEFINE(dLytHelpMain_c, ModeNone);
STATE_DEFINE(dLytHelpMain_c, ModeIn);
STATE_DEFINE(dLytHelpMain_c, ModeWait);
STATE_DEFINE(dLytHelpMain_c, ModeOut);
STATE_DEFINE(dLytHelpMain_c, ModeEnd);
STATE_DEFINE(dLytHelp_c, None);
STATE_DEFINE(dLytHelp_c, In);
STATE_DEFINE(dLytHelp_c, Wait);
STATE_DEFINE(dLytHelp_c, Out);
STATE_DEFINE(dLytHelp_c, End);
static const d2d::LytBrlanMapping brlanMap[] = {
{ "helpMode_02_in.brlan", "G_inOut"},
{ "helpMode_02_out.brlan", "G_inOut"},
{"helpMode_02_loopBg.brlan", "G_loopBg_00"},
};
#define HELP_MAIN_ANIM_IN 0
#define HELP_MAIN_ANIM_OUT 1
#define HELP_MAIN_ANIM_LOOP_BG 2
#define HELP_MAIN_NUM_ANIMS 3
static const char *sTextBoxNamesTitleS[] = {
"T_orExTitleS_00",
"T_orExTitleS_01",
"T_orExTitleS_02",
};
static const char *sTextBoxNamesTitle[] = {
"T_orExTitle_00",
"T_orExTitle_01",
"T_orExTitle_02",
};
static const char *sTextBoxNamesS[] = {
"T_orExS_00",
"T_orExS_01",
"T_orExS_02",
};
static const char *sTextBoxNames[] = {
"T_orEx_00",
"T_orEx_01",
"T_orEx_02",
};
#define HELP_ANIM_NUM_PANES 3
dLytHelp_c *dLytHelp_c::sInstance;
void dLytHelpMain_c::initializeState_ModeNone() {}
void dLytHelpMain_c::executeState_ModeNone() {
mIsIdle = true;
}
void dLytHelpMain_c::finalizeState_ModeNone() {}
void dLytHelpMain_c::initializeState_ModeIn() {}
void dLytHelpMain_c::executeState_ModeIn() {
if (mAnm[HELP_MAIN_ANIM_IN].isEndReached()) {
mAnm[HELP_MAIN_ANIM_IN].setAnimEnable(false);
mIsIdle = true;
}
}
void dLytHelpMain_c::finalizeState_ModeIn() {}
void dLytHelpMain_c::initializeState_ModeWait() {}
void dLytHelpMain_c::executeState_ModeWait() {
mIsIdle = true;
}
void dLytHelpMain_c::finalizeState_ModeWait() {}
void dLytHelpMain_c::initializeState_ModeOut() {}
void dLytHelpMain_c::executeState_ModeOut() {
if (field_0x1CC == 0) {
if (mAnm[HELP_MAIN_ANIM_OUT].isEndReached()) {
mAnm[HELP_MAIN_ANIM_LOOP_BG].setAnimEnable(false);
mAnm[HELP_MAIN_ANIM_OUT].setAnimEnable(false);
field_0x1CC = 1;
}
} else {
mIsIdle = true;
}
}
void dLytHelpMain_c::finalizeState_ModeOut() {}
void dLytHelpMain_c::initializeState_ModeEnd() {}
void dLytHelpMain_c::executeState_ModeEnd() {
mIsIdle = true;
}
void dLytHelpMain_c::finalizeState_ModeEnd() {}
dLytHelpMain_c::dLytHelpMain_c() : mStateMgr(*this) {}
bool dLytHelpMain_c::build(d2d::ResAccIf_c *resAcc) {
mLyt.setResAcc(resAcc);
mLyt.build("helpMode_02.brlyt", nullptr);
mLyt.setPriority(0x8A);
for (int i = 0; i < HELP_MAIN_NUM_ANIMS; i++) {
mAnm[i].init(brlanMap[i].mFile, resAcc, mLyt.getLayout(), brlanMap[i].mName);
mAnm[i].bind(false);
mAnm[i].setAnimEnable(false);
}
for (int i = 0; i < HELP_ANIM_NUM_PANES; i++) {
mpTextBoxesTitleS[i] = mLyt.getTextBox(sTextBoxNamesTitleS[i]);
mpTextBoxesTitle[i] = mLyt.getTextBox(sTextBoxNamesTitle[i]);
mpTextBoxesS[i] = mLyt.getTextBox(sTextBoxNamesS[i]);
mpTextBoxes[i] = mLyt.getTextBox(sTextBoxNames[i]);
}
mAnm[HELP_MAIN_ANIM_IN].setAnimEnable(true);
mAnm[HELP_MAIN_ANIM_IN].setFrame(0.0f);
mAnm[HELP_MAIN_ANIM_LOOP_BG].setAnimEnable(true);
mAnm[HELP_MAIN_ANIM_LOOP_BG].setFrame(0.0f);
mLyt.calc();
mAnm[HELP_MAIN_ANIM_IN].setAnimEnable(false);
mAnm[HELP_MAIN_ANIM_OUT].setAnimEnable(false);
modeRequestNone();
field_0x1C8 = 0;
field_0x1CC = 0;
return true;
}
bool dLytHelpMain_c::remove() {
mLyt.unbindAnims();
for (int i = 0; i < HELP_MAIN_NUM_ANIMS; i++) {
mAnm[i].remove();
}
return true;
}
void dLytHelpMain_c::modeRequestIn(s32 textIndex) {
mTextIndex = textIndex;
setText(textIndex);
mAnm[HELP_MAIN_ANIM_IN].setAnimEnable(true);
mAnm[HELP_MAIN_ANIM_IN].setFrame(0.0f);
mLyt.calc();
mStateMgr.changeState(StateID_ModeIn);
mIsIdle = false;
}
void dLytHelpMain_c::modeRequestWait() {
mAnm[HELP_MAIN_ANIM_IN].setAnimEnable(false);
mStateMgr.changeState(StateID_ModeWait);
mIsIdle = false;
}
void dLytHelpMain_c::modeRequestOut() {
mAnm[HELP_MAIN_ANIM_OUT].setAnimEnable(true);
mAnm[HELP_MAIN_ANIM_OUT].setFrame(0.0f);
mLyt.calc();
field_0x1CC = 0;
mStateMgr.changeState(StateID_ModeOut);
mIsIdle = false;
}
void dLytHelpMain_c::modeRequestEnd() {
mStateMgr.changeState(StateID_ModeEnd);
mIsIdle = false;
}
void dLytHelpMain_c::modeRequestNone() {
mStateMgr.changeState(StateID_ModeNone);
mIsIdle = false;
}
static const char *sHelpTextKeys[] = {
"NORMAL", "NORMAL_Z", "SWORD", "SWORD_LV1", "SWORD_LV1", "DOWSING", "SCOOP_LV2",
"SWIM_LV0", "SWIM_LV1", "PACHINKO", "PACHINKO", "BEATLE", "BEATLE_HOOK", "BEATLE_HOOK",
"BOMB_BAG", "VACUUM", "BUTTERFLY_NET", "BOW", "BOW", "WHIP", "HOOK",
"PICK_UP", "HARP", "SHIELD", "DIVING", "DIVING", "PARASHAWL", "BIRD",
"BIRD", "BOTTLE", "LOOK", "LOOK", "CLIMB", "TIGHTROPE", "HANG_TIGHTROPE",
"SWING", "SWING", "SWING", "CRAWLING", "NORMAL", "BOSSKEY", "TROLLEY",
"BOAT", "BALANCEBALL", "SLIDER", "DRAWING", "PANEL", "SIT", "CATAPULT",
"LADDER", "BIGSWORD", "GISIKI", "PUMPKIN", "SIREN", "MINI_DIVING", "MINI_MINE",
"MINI_TAKE", "MINI_INSECT", "MINI_CLAY",
};
// TODO - fakematch
#pragma push
#pragma ppc_iro_level 2
void dLytHelpMain_c::setText(s32 textIndex) {
if (textIndex >= 59) {
return;
}
SizedString<64> label;
if (mTextIndex != textIndex) {
mTextIndex = textIndex;
}
for (int i = 0; i < 3; i++) {
s32 textSuffix = i + 1;
bool bUseCaption2 = false;
bool bUseTitle2 = false;
switch (mTextIndex) {
case 4: {
// SWORD_LV1 dupe
if (i == 2) {
bUseCaption2 = true;
}
break;
}
case 36: {
// SWING dupe 1
if (i == 0) {
bUseCaption2 = true;
} else if (i == 2) {
textSuffix = 4;
}
break;
}
case 37: {
// SWING dupe 2
if (i == 2) {
textSuffix = 4;
}
break;
}
case 13: {
// BEATLE_HOOK dupe
if (i == 1) {
textSuffix = 3;
bUseCaption2 = true;
} else if (i == 2) {
textSuffix = 4;
}
break;
}
case 10: {
// PACHINKO dupe
if (i == 1) {
bUseCaption2 = true;
}
break;
}
case 39: {
// NORMAL dupe
if (i >= 1) {
bUseCaption2 = true;
}
break;
}
case 25: {
// DIVING dupe
if (i == 2) {
bUseCaption2 = true;
}
break;
}
case 28: {
// BIRD dupe
if (i == 1) {
bUseCaption2 = true;
bUseTitle2 = true;
}
break;
}
case 31: {
// LOOK dupe
if (i == 2) {
textSuffix = 4;
}
break;
}
case 18: {
// BOW dupe
bUseCaption2 = true;
bUseTitle2 = true;
break;
}
}
if (!bUseTitle2) {
label.sprintf("HLP_%s_%02d", sHelpTextKeys[textIndex], textSuffix);
} else {
label.sprintf("HLP_%s_%02d_2", sHelpTextKeys[textIndex], textSuffix);
}
mpTextBoxesTitleS[i]->setMessageWithGlobalTextProcessor2(label, nullptr);
mpTextBoxesTitle[i]->setMessageWithGlobalTextProcessor2(label, nullptr);
if (!bUseCaption2) {
label.sprintf("CPT_%s_%02d", sHelpTextKeys[textIndex], textSuffix);
} else {
label.sprintf("CPT_%s_%02d_2", sHelpTextKeys[textIndex], textSuffix);
}
mpTextBoxesS[i]->setMessageWithGlobalTextProcessor2(label, nullptr);
mpTextBoxes[i]->setMessageWithGlobalTextProcessor2(label, nullptr);
}
}
#pragma pop
bool dLytHelpMain_c::execute() {
mStateMgr.executeState();
for (int i = 0; i < HELP_MAIN_NUM_ANIMS; i++) {
if (mAnm[i].isEnabled()) {
mAnm[i].play();
}
}
mLyt.calc();
return true;
}
bool dLytHelpMain_c::draw() {
mLyt.addToDrawList();
return true;
}
void dLytHelp_c::initializeState_None() {}
void dLytHelp_c::executeState_None() {
if (field_0x3C0 == true) {
dSndPlayerMgr_c::GetInstance()->enterHelp();
mpMain->modeRequestIn(mTextIndex);
dLytMeter_c::GetInstance()->setHelpOpen(true);
mStateMgr.changeState(StateID_In);
field_0x3C0 = false;
}
}
void dLytHelp_c::finalizeState_None() {}
void dLytHelp_c::initializeState_In() {}
void dLytHelp_c::executeState_In() {
if (mpMain->isIdle()) {
field_0x3C2 = true;
mpMain->modeRequestWait();
mStateMgr.changeState(StateID_Wait);
field_0x3C8 = 0;
}
}
void dLytHelp_c::finalizeState_In() {}
void dLytHelp_c::initializeState_Wait() {}
void dLytHelp_c::executeState_Wait() {
if (dPad::getDownTrig2() || dPad::getDownTrigMinus() || dPad::getDownTrigB() || field_0x3C1) {
mpMain->modeRequestOut();
dSndPlayerMgr_c::GetInstance()->leaveHelp();
dLytMeter_c::GetInstance()->setHelpOpen(false);
mStateMgr.changeState(StateID_Out);
}
}
void dLytHelp_c::finalizeState_Wait() {}
void dLytHelp_c::initializeState_Out() {}
void dLytHelp_c::executeState_Out() {
if (mpMain->isIdle()) {
mTextIndex = -1;
mpMain->modeRequestEnd();
mStateMgr.changeState(StateID_End);
}
}
void dLytHelp_c::finalizeState_Out() {}
void dLytHelp_c::initializeState_End() {}
void dLytHelp_c::executeState_End() {}
void dLytHelp_c::finalizeState_End() {}
bool dLytHelp_c::setText(s32 textIndex) {
if (*mStateMgr.getStateID() == StateID_None) {
field_0x3C0 = true;
field_0x3C1 = false;
if (textIndex <= ARRAY_LENGTH(sHelpTextKeys) - 1) {
mTextIndex = textIndex;
} else {
mTextIndex = 0;
}
return true;
} else {
return false;
}
}
void dLytHelp_c::changeText(s32 textIndex) {
bool instantSwitch = false;
if (*mStateMgr.getStateID() != StateID_None || mTextIndex >= 0) {
switch (mTextIndex) {
case 0:
/* NORMAL */
if (textIndex == 1) {
mTextIndex = 1;
instantSwitch = true;
} else if (textIndex == 39) {
mTextIndex = 39;
instantSwitch = true;
}
break;
case 1:
/* NORMAL_Z */
if (textIndex == 0) {
mTextIndex = 0;
instantSwitch = true;
}
break;
case 2:
case 3:
case 4:
/* SWORD / _LV1 */
if (textIndex == 23) {
mTextIndex = 23;
instantSwitch = true;
}
break;
case 11:
/* BEATLE */
if (textIndex == 12) {
mTextIndex = 12;
instantSwitch = true;
} else if (textIndex == 13) {
mTextIndex = 13;
instantSwitch = true;
}
break;
case 12:
case 13:
/* BEATLE / _HOOK */
if (textIndex == 11) {
mTextIndex = 11;
instantSwitch = true;
}
break;
case 23:
/* SHIELD */
if (textIndex == 2) {
mTextIndex = 2;
instantSwitch = true;
} else if (textIndex == 3) {
mTextIndex = 3;
instantSwitch = true;
} else if (textIndex == 4) {
mTextIndex = 4;
instantSwitch = true;
}
break;
case 27:
if (textIndex == 28) {
mTextIndex = 28;
instantSwitch = true;
}
break;
case 33:
if (textIndex == 34) {
mTextIndex = 34;
instantSwitch = true;
}
break;
case 34:
if (textIndex == 33) {
mTextIndex = 33;
instantSwitch = true;
}
break;
case 35:
if (textIndex == 37) {
mTextIndex = 37;
instantSwitch = true;
}
break;
case 37:
if (textIndex == 35) {
mTextIndex = 35;
instantSwitch = true;
}
break;
case 39:
if (textIndex == 0) {
mTextIndex = 0;
instantSwitch = true;
}
break;
}
}
if (instantSwitch) {
mpMain->setText(mTextIndex);
} else if (mTextIndex != textIndex) {
mTextIndex = textIndex;
field_0x3C1 = true;
}
}
bool dLytHelp_c::build() {
d2d::setLytAllocator();
void *data = LayoutArcManager::GetInstance()->getLoadedData("MenuHelp");
mResAcc.attach(data, "");
mpMain = new dLytHelpMain_c();
mpMain->build(&mResAcc);
mStateMgr.changeState(StateID_None);
field_0x3C0 = false;
field_0x3C1 = false;
field_0x3C2 = false;
mTextIndex = -1;
field_0x3C8 = 0;
m2d::setLytAllocator();
return true;
}
bool dLytHelp_c::remove() {
d2d::setLytAllocator();
mpMain->remove();
delete mpMain;
mpMain = nullptr;
mResAcc.detach();
m2d::setLytAllocator();
return true;
}
bool dLytHelp_c::execute() {
if (*mStateMgr.getStateID() != StateID_None) {
mpMain->execute();
}
mStateMgr.executeState();
return true;
}
void dLytHelp_c::draw() {
if (*mStateMgr.getStateID() != StateID_None) {
mpMain->draw();
}
}