Files
ss/src/d/lyt/d_lyt_area_caption.cpp
T
2025-04-21 21:51:06 +02:00

400 lines
11 KiB
C++

#include "d/lyt/d_lyt_area_caption.h"
#include "d/d_message.h"
#include "d/d_pad.h"
#include "d/d_sc_game.h"
#include "d/d_stage_mgr.h"
#include "d/lyt/d_textbox.h"
#include "d/lyt/meter/d_lyt_meter.h"
#include "toBeSorted/arc_managers/layout_arc_manager.h"
#include "toBeSorted/event_manager.h"
STATE_DEFINE(dLytAreaCaptionParts_c, Wait);
STATE_DEFINE(dLytAreaCaptionParts_c, Start);
STATE_DEFINE(dLytAreaCaptionParts_c, Out);
static const d2d::LytBrlanMapping brlanMap1[] = {
{ "areaCaption_00_start.brlan", "G__start_00"},
{ "areaCaption_00_type.brlan", "G_type_00"},
{"areaCaption_00_textLine.brlan", "G_textLine_00"},
{ "", ""},
};
static const d2d::LytBrlanMapping brlanMap2[] = {
{ "areaCaption_01_start.brlan", "G__start_00"},
{ "areaCaption_01_type.brlan", "G_type_00"},
{"areaCaption_01_textLine.brlan", "G_textLine_00"},
{ "areaCaption_01_out.brlan", "G_inOut_00"},
};
#define AREA_CAPTION_ANIM_START 0
#define AREA_CAPTION_ANIM_TYPE 1
#define AREA_CAPTION_ANIM_TEXTLINE 2
#define AREA_CAPTION_ANIM_OUT 3
#define AREA_CAPTION_NUM_ANIMS 4
static const char *captionBoxes[] = {
"T_caption_00",
"T_captionS_00",
"T_captionS_01",
};
dLytAreaCaption_c *dLytAreaCaption_c::sInstance;
bool dLytAreaCaptionParts_c::init(int first) {
void *data = LayoutArcManager::GetInstance()->getLoadedData("DoButton");
mResAcc.attach(data, "");
mLyt.setResAcc(&mResAcc);
mFirst = first;
if (mFirst != 0) {
mLyt.build("areaCaption_00.brlyt", nullptr);
for (int i = 0; i < AREA_CAPTION_NUM_ANIMS; i++) {
if (brlanMap1[i].mFile[0] == '\0') {
mAnmCtrlInUse[i] = false;
} else {
mAnmGroups[i].init(brlanMap1[i].mFile, &mResAcc, mLyt.getLayout(), brlanMap1[i].mName);
mAnmGroups[i].bind(false);
mAnmGroups[i].setAnimEnable(false);
mAnmCtrlInUse[i] = true;
}
}
} else {
mLyt.build("areaCaption_01.brlyt", nullptr);
mLyt.setPriority(0x8A);
for (int i = 0; i < AREA_CAPTION_NUM_ANIMS; i++) {
if (brlanMap2[i].mFile[0] == '\0') {
mAnmCtrlInUse[i] = false;
} else {
mAnmGroups[i].init(brlanMap2[i].mFile, &mResAcc, mLyt.getLayout(), brlanMap2[i].mName);
mAnmGroups[i].bind(false);
mAnmGroups[i].setAnimEnable(false);
mAnmCtrlInUse[i] = true;
}
}
}
for (int i = 0; i < 3; i++) {
mTextBoxes[i] = mLyt.getTextBox(captionBoxes[i]);
}
field_0x54C = false;
field_0x54D = false;
mStateMgr.changeState(StateID_Wait);
mLyt.calc();
return true;
}
bool dLytAreaCaptionParts_c::remove() {
for (int i = 0; i < AREA_CAPTION_NUM_ANIMS; i++) {
if (mAnmCtrlInUse[i]) {
mAnmGroups[i].unbind();
mAnmGroups[i].remove();
}
}
mResAcc.detach();
return true;
}
bool dLytAreaCaptionParts_c::update() {
mStateMgr.executeState();
if (*mStateMgr.getStateID() != StateID_Wait) {
for (int i = 0; i < AREA_CAPTION_NUM_ANIMS; i++) {
if (mAnmCtrlInUse[i] && mAnmGroups[i].isEnabled()) {
mAnmGroups[i].play();
}
}
mLyt.calc();
}
return true;
}
bool dLytAreaCaptionParts_c::draw() {
mLyt.addToDrawList();
return true;
}
void dLytAreaCaptionParts_c::setTextIfWaiting(const char *text) {
if (*mStateMgr.getStateID() == StateID_Wait) {
mTextBoxes[0]->setMessageWithGlobalTextProcessor2(text, nullptr);
mTextBoxes[1]->setMessageWithGlobalTextProcessor2(text, nullptr);
mTextBoxes[2]->setMessageWithGlobalTextProcessor2(text, nullptr);
field_0x54C = true;
}
}
void dLytAreaCaptionParts_c::check() {
if (*mStateMgr.getStateID() == StateID_Start) {
field_0x54D = true;
}
}
void dLytAreaCaptionParts_c::initializeState_Wait() {}
void dLytAreaCaptionParts_c::executeState_Wait() {
if (field_0x54C) {
field_0x54C = false;
s32 typeFrame = 0;
if (dStageMgr_c::GetInstance()->isSTIFbyte4_2or3or4()) {
typeFrame = 1;
} else if (dStageMgr_c::GetInstance()->isSTIFbyte4_5or6()) {
typeFrame = 2;
} else if (dStageMgr_c::GetInstance()->isSTIFbyte4_7or8or9or10or11()) {
typeFrame = 3;
} else if (dStageMgr_c::GetInstance()->isSTIFbyte4_1()) {
typeFrame = 4;
} else if (dStageMgr_c::GetInstance()->isSTIFbyte4_0()) {
typeFrame = 5;
}
if (!mFirst && dScGame_c::currentSpawnInfo.getTrial() == SpawnInfo::TRIAL) {
typeFrame = 6;
}
s32 numLines = mTextBoxes[0]->calcTextLines(mTextBoxes[0]->GetString(), dMessage_c::getGlobalTagProcessor());
f32 textFrame = 0.0f;
if (numLines > 1) {
textFrame = 1.0f;
}
if (!mFirst) {
mLyt.findPane("N_inOut_00")->SetVisible(true);
}
mAnmGroups[AREA_CAPTION_ANIM_TYPE].setFrame(typeFrame);
mAnmGroups[AREA_CAPTION_ANIM_TYPE].setAnimEnable(true);
mAnmGroups[AREA_CAPTION_ANIM_TEXTLINE].setAnimEnable(true);
mAnmGroups[AREA_CAPTION_ANIM_TEXTLINE].setFrame(textFrame);
mLyt.calc();
mAnmGroups[AREA_CAPTION_ANIM_TYPE].setAnimEnable(false);
mAnmGroups[AREA_CAPTION_ANIM_TEXTLINE].setAnimEnable(false);
mAnmGroups[AREA_CAPTION_ANIM_START].setAnimEnable(true);
mAnmGroups[AREA_CAPTION_ANIM_START].setFrame(0.0f);
mStateMgr.changeState(StateID_Start);
}
}
void dLytAreaCaptionParts_c::finalizeState_Wait() {}
void dLytAreaCaptionParts_c::initializeState_Start() {
if (mFirst == 0) {
dLytAreaCaption_c::setVisible(true);
dLytMeter_c::GetInstance()->setAreaCaptionOverrideVisibility(false);
dLytMeter_c::GetMain()->setGanbariGaugeHiddenByAreaCaption(true);
}
}
void dLytAreaCaptionParts_c::executeState_Start() {
if (mAnmGroups[AREA_CAPTION_ANIM_START].isEndReached()) {
mAnmGroups[AREA_CAPTION_ANIM_START].setAnimEnable(false);
if (!mFirst) {
dLytAreaCaption_c::setVisible(false);
dLytMeter_c::GetInstance()->setAreaCaptionOverrideVisibility(true);
}
mStateMgr.changeState(StateID_Wait);
} else {
if (shouldImmediatelyDismiss()) {
field_0x54D = false;
if (mFirst) {
mAnmGroups[AREA_CAPTION_ANIM_START].setFrame(0.0f);
mLyt.calc();
mAnmGroups[AREA_CAPTION_ANIM_START].setAnimEnable(false);
mStateMgr.changeState(StateID_Wait);
} else {
mAnmGroups[AREA_CAPTION_ANIM_OUT].setAnimEnable(true);
mAnmGroups[AREA_CAPTION_ANIM_OUT].setFrame(0.0f);
mStateMgr.changeState(StateID_Out);
dLytAreaCaption_c::setVisible(false);
dLytMeter_c::GetInstance()->setAreaCaptionOverrideVisibility(true);
}
}
}
}
void dLytAreaCaptionParts_c::finalizeState_Start() {}
void dLytAreaCaptionParts_c::initializeState_Out() {}
void dLytAreaCaptionParts_c::executeState_Out() {
if (mAnmGroups[AREA_CAPTION_ANIM_OUT].isEndReached()) {
mAnmGroups[AREA_CAPTION_ANIM_OUT].setAnimEnable(false);
if (!mFirst) {
dLytAreaCaption_c::setVisible(false);
dLytMeter_c::GetInstance()->setAreaCaptionOverrideVisibility(true);
}
mStateMgr.changeState(StateID_Wait);
}
}
void dLytAreaCaptionParts_c::finalizeState_Out() {}
bool dLytAreaCaptionParts_c::shouldImmediatelyDismiss() const {
if (mFirst) {
return field_0x54D;
}
if (field_0x54D) {
return true;
}
if (dPad::checkButtonBPressed()) {
return true;
}
if (dLytMeter_c::GetInstance()->checkAllFlags(METER_BTN_C) && dPad::checkButtonCPressed()) {
return true;
}
if (dLytMeter_c::GetInstance()->checkAllFlags(METER_BTN_PLUS) && dPad::checkButtonPlusPressed()) {
return true;
}
if (dPad::checkButtonMinusPressed()) {
return true;
}
if (dLytMeter_c::GetInstance()->checkAllFlags(METER_BTN_1) && dPad::checkButton1Pressed()) {
return true;
}
if (dLytMeter_c::GetInstance()->checkAllFlags(METER_BTN_2) && dPad::checkButton2Pressed()) {
return true;
}
if (dPad::checkButtonDpadUpPressed()) {
return true;
}
if (dLytMeter_c::GetInstance()->checkAllFlags(METER_BTN_CROSS_DOWN) && dPad::checkButtonDpadDownPressed()) {
return true;
}
if (dLytMeter_c::GetInstance()->checkAllFlags(METER_BTN_CROSS_LEFT) && dPad::checkButtonDpadLeftPressed()) {
return true;
}
if (dLytMeter_c::GetInstance()->checkAllFlags(METER_BTN_CROSS_RIGHT) && dPad::checkButtonDpadRightPressed()) {
return true;
}
if (EventManager::eventRelatedStateFlags_shift0x11_1()) {
return true;
}
return false;
}
bool dLytAreaCaption_c::create() {
new dLytAreaCaption_c();
if (dLytAreaCaption_c::sInstance == nullptr) {
return false;
}
sInstance->init();
return true;
}
bool dLytAreaCaption_c::remove() {
if (sInstance != nullptr) {
sInstance->deinit();
delete sInstance;
sInstance = nullptr;
}
return true;
}
bool dLytAreaCaption_c::update() {
if (sInstance != nullptr) {
sInstance->doUpdate();
}
return true;
}
bool dLytAreaCaption_c::draw() {
if (sInstance != nullptr) {
sInstance->doDraw();
}
return true;
}
void dLytAreaCaption_c::setTextIfWaiting(const char *text) {
if (sInstance != nullptr) {
sInstance->doSetTextIfWaiting(text);
}
}
void dLytAreaCaption_c::setArea(int id) {
if (sInstance != nullptr) {
sInstance->doSetArea(id);
}
}
void dLytAreaCaption_c::check() {
if (sInstance != nullptr) {
sInstance->doCheck();
}
}
void dLytAreaCaption_c::setVisible(bool arg) {
if (sInstance != nullptr) {
sInstance->mVisible = arg;
}
}
bool dLytAreaCaption_c::getVisible() {
if (sInstance != nullptr) {
return sInstance->mVisible;
}
return 0;
}
bool dLytAreaCaption_c::init() {
int first = 1;
for (int i = 0; i < 2; i++) {
mParts[i].init(first);
first = 0;
}
mPartToDraw = 0;
mVisible = false;
return true;
}
bool dLytAreaCaption_c::deinit() {
for (int i = 0; i < 2; i++) {
mParts[i].remove();
}
return true;
}
bool dLytAreaCaption_c::doUpdate() {
for (int i = 0; i < 2; i++) {
mParts[i].update();
}
return true;
}
bool dLytAreaCaption_c::doDraw() {
for (int i = 0; i < 2; i++) {
if (i == mPartToDraw) {
mParts[i].draw();
}
}
return true;
}
void dLytAreaCaption_c::doSetTextIfWaiting(const char *text) {
mPartToDraw = 0;
for (int i = 0; i < 2; i++) {
mParts[i].setTextIfWaiting(text);
}
}
void dLytAreaCaption_c::doSetArea(int id) {
mPartToDraw = 1;
SizedString<16> str;
str.sprintf("MAP_%02d", id);
for (int i = 0; i < 2; i++) {
mParts[i].setTextIfWaiting(str);
}
}
void dLytAreaCaption_c::doCheck() {
for (int i = 0; i < 2; i++) {
mParts[i].check();
}
}