diff options
| author | robojumper <robojumper@gmail.com> | 2025-08-03 22:08:11 +0200 |
|---|---|---|
| committer | robojumper <robojumper@gmail.com> | 2025-09-13 10:13:14 +0200 |
| commit | 66a653a2f64cb4e0bded89246fd5d384aeac226f (patch) | |
| tree | 9ff8e499797bb166a2583f3ae3fa8334fe832c57 /src/d/lyt/d_lyt_pause_text.cpp | |
| parent | 90866457f1222fe62445b19cd75b96db5339d92b (diff) | |
d_lyt_pause_text OK
Diffstat (limited to 'src/d/lyt/d_lyt_pause_text.cpp')
| -rw-r--r-- | src/d/lyt/d_lyt_pause_text.cpp | 454 |
1 files changed, 454 insertions, 0 deletions
diff --git a/src/d/lyt/d_lyt_pause_text.cpp b/src/d/lyt/d_lyt_pause_text.cpp new file mode 100644 index 00000000..7550e801 --- /dev/null +++ b/src/d/lyt/d_lyt_pause_text.cpp @@ -0,0 +1,454 @@ +#include "d/lyt/d_lyt_pause_text.h" + +#include "common.h" +#include "d/a/d_a_item.h" +#include "d/a/d_a_itembase.h" +#include "d/d_message.h" +#include "d/flag/itemflag_manager.h" +#include "d/flag/storyflag_manager.h" +#include "d/lyt/d2d.h" +#include "d/lyt/d_lyt_pause.h" +#include "d/lyt/d_lyt_util_items.h" +#include "d/lyt/d_textbox.h" +#include "nw4r/lyt/lyt_group.h" +#include "sized_string.h" +#include "toBeSorted/arc_managers/layout_arc_manager.h" + +STATE_DEFINE(dLytPauseText_c, None); +STATE_DEFINE(dLytPauseText_c, In); +STATE_DEFINE(dLytPauseText_c, Wait); +STATE_DEFINE(dLytPauseText_c, Out); + +static const d2d::LytBrlanMapping brlanMap[] = { + { "iconText_00_in.brlan", "G_inOut_00"}, + {"iconText_00_loop.brlan", "G_loop_00"}, + { "iconText_00_out.brlan", "G_inOut_00"}, +}; + +#define PAUSE_TEXT_ANIM_IN 0 +#define PAUSE_TEXT_ANIM_LOOP 1 +#define PAUSE_TEXT_ANIM_OUT 2 + +#define PAUSE_TEXT_NUM_ANIMS 3 + +static const char *sGroupName = "G_ref_00"; + +dLytPauseText_c::dLytPauseText_c() : mStateMgr(*this) {} + +bool dLytPauseText_c::build() { + d2d::ResAccIf_c *resAcc = dLytPauseMgr_c::GetInstance()->getResAcc1(); + mLyt.setResAcc(resAcc); + mLyt.build("iconText_00.brlyt", nullptr); + mLyt.setPriority(0x86); + + for (int i = 0; i < PAUSE_TEXT_NUM_ANIMS; i++) { + mAnm[i].init(brlanMap[i].mFile, resAcc, mLyt.getLayout(), brlanMap[i].mName); + } + + void *data = LayoutArcManager::GetInstance()->getLoadedData("System2D"); + mResAcc.attach(data, ""); + + mSubpanes[0].mpLytPane = &mABtn; + for (int i = 0; i < 1; i++) { + mSubpanes[i].mpLytPane->build(&mResAcc); + mSubpaneList.PushBack(&mSubpanes[i]); + } + + if (mLyt.getLayout()->GetGroupContainer() != nullptr) { + nw4r::lyt::Group *g = mLyt.getLayout()->GetGroupContainer()->FindGroupByName(sGroupName); + if (g != nullptr) { + d2d::dSubPane::linkMeters(g, &mSubpaneList); + } + } + + mLineSpace = mLyt.getTextBox("T_text_00")->GetLineSpace(); + mStateMgr.changeState(StateID_None); + + return true; +} + +bool dLytPauseText_c::remove() { + mLyt.unbindAnims(); + + for (d2d::SubPaneList::Iterator it = mSubpaneList.GetBeginIter(); it != mSubpaneList.GetEndIter(); ++it) { + d2d::dSubPane *subPane = it->mpLytPane; + if (subPane != nullptr) { + nw4r::lyt::Pane *parent = subPane->getPane()->GetParent(); + parent->RemoveChild(subPane->getPane()); + } + } + + for (int i = 0; i < 1; i++) { + mSubpanes[i].mpLytPane->remove(); + } + for (int i = 0; i < PAUSE_TEXT_NUM_ANIMS; i++) { + mAnm[i].remove(); + } + + mResAcc.detach(); + + return true; +} + +bool dLytPauseText_c::execute() { + mStateMgr.executeState(); + for (int i = 0; i < 1; i++) { + mSubpanes[i].mpLytPane->execute(); + } + mLyt.calc(); + return true; +} + +bool dLytPauseText_c::draw() { + if (field_0x6D8 == true) { + mLyt.addToDrawList(); + } + return true; +} + +void dLytPauseText_c::requestIn() { + mInRequest = true; +} + +void dLytPauseText_c::requestOut() { + mOutRequest = true; +} + +void dLytPauseText_c::initializeState_None() { + mLyt.unbindAnims(); + field_0x6D7 = false; + mInRequest = false; + mOutRequest = false; + field_0x6D8 = false; + mStep = 0; + mABtn.resetToInvisble(); + updateText(); +} +void dLytPauseText_c::executeState_None() { + if (mInRequest == true) { + mInRequest = false; + mStateMgr.changeState(StateID_In); + } +} +void dLytPauseText_c::finalizeState_None() {} + +void dLytPauseText_c::initializeState_In() { + updateText(); + startAnim(PAUSE_TEXT_ANIM_IN); + startAnim(PAUSE_TEXT_ANIM_LOOP); + mABtn.requestIn(); + field_0x6D8 = true; +} +void dLytPauseText_c::executeState_In() { + d2d::AnmGroup_c &anm = mAnm[PAUSE_TEXT_ANIM_IN]; + if (anm.isEndReached() == true) { + mStateMgr.changeState(StateID_Wait); + mAnm[PAUSE_TEXT_ANIM_LOOP].play(); + } else { + anm.play(); + mAnm[PAUSE_TEXT_ANIM_LOOP].play(); + } +} +void dLytPauseText_c::finalizeState_In() {} + +void dLytPauseText_c::initializeState_Wait() { + field_0x6D7 = true; +} +void dLytPauseText_c::executeState_Wait() { + mAnm[PAUSE_TEXT_ANIM_LOOP].play(); + field_0x6D7 = false; + if (mOutRequest == true && mABtn.requestOut(false)) { + mOutRequest = false; + mStateMgr.changeState(StateID_Out); + } +} +void dLytPauseText_c::finalizeState_Wait() {} + +void dLytPauseText_c::initializeState_Out() { + stopAnim(PAUSE_TEXT_ANIM_IN); + startAnim(PAUSE_TEXT_ANIM_OUT); + mStep = 0; +} +void dLytPauseText_c::executeState_Out() { + d2d::AnmGroup_c &anm = mAnm[PAUSE_TEXT_ANIM_OUT]; + switch (mStep) { + case 0: { + if (mABtn.isDoneOut()) { + mStep = 1; + } + return; + } + case 1: { + if (anm.isEndReached() == true) { + mStep = 2; + field_0x6D7 = true; + } + break; + } + case 2: { + mStateMgr.changeState(StateID_None); + return; + } + } + anm.play(); + mAnm[PAUSE_TEXT_ANIM_LOOP].play(); +} +void dLytPauseText_c::finalizeState_Out() {} + +void dLytPauseText_c::startAnim(int idx) { + d2d::AnmGroup_c &anm = mAnm[idx]; + anm.bind(false); + anm.setFrame(0.0f); +} + +void dLytPauseText_c::stopAnim(int idx) { + d2d::AnmGroup_c &anm = mAnm[idx]; + anm.unbind(); +} + +void dLytPauseText_c::updateText() { +// "planned implementation" +#define TODO_TEXT (L"実装予定") + dTextBox_c *text0 = mLyt.getTextBox("T_text_00"); + dTextBox_c *text0S = mLyt.getTextBox("T_textS_00"); + dTextBox_c *name0 = mLyt.getTextBox("T_name_00"); + dTextBox_c *name0S = mLyt.getTextBox("T_nameS_00"); + + const wchar_t *text = getCurrentPausePopupName(); + if (text != nullptr) { + name0->setTextWithGlobalTextProcessor(text); + name0S->setTextWithGlobalTextProcessor(text); + } else { + name0->setTextWithGlobalTextProcessor(TODO_TEXT); + name0S->setTextWithGlobalTextProcessor(TODO_TEXT); + } + + if (isCurrentItemWallet() && dMessage_c::getGlobalTagProcessor() != nullptr) { + dMessage_c::getGlobalTagProcessor()->setNumericArg0(dAcItem_c::getCurrentWalletCapacity()); + } + + text = getCurrentPausePopupCaption(); + calcTextLines(text0, text); + if (text != nullptr) { + if (mNumTextLines == 1) { + text0->SetLineSpace(0.0f); + text0S->SetLineSpace(0.0f); + } else { + text0->SetLineSpace(mLineSpace); + text0S->SetLineSpace(mLineSpace); + } + text0->setTextWithGlobalTextProcessor(text); + text0S->setTextWithGlobalTextProcessor(text); + } else { + text0->setTextWithGlobalTextProcessor(TODO_TEXT); + text0S->setTextWithGlobalTextProcessor(TODO_TEXT); + } + +#undef TODO_TEXT +} + +const char *dLytPauseText_c::getCurrentPauseLabel(SizedString<32> &buf) { + // This is for the title - it's used by a different component (dLytPauseInfo_c) + const char *result = nullptr; + dLytPauseMgr_c::SelectionType_e selectionType = dLytPauseMgr_c::GetInstance()->getCurrentSelectionType(); + s32 id = dLytPauseMgr_c::GetInstance()->getCurrentSelectionId(); + + switch (selectionType) { + case dLytPauseMgr_c::SELECT_DOWSING: { + getDowsingLabel(id, buf); + if (buf.len() != 0) { + result = buf; + } + break; + } + case dLytPauseMgr_c::SELECT_CATEGORY: { + getPauseCategoryLabel(id, buf); + if (buf.len() != 0) { + result = buf; + } + break; + } + case dLytPauseMgr_c::SELECT_ITEM: { + switch (id) { + case ITEM_TRI_COURAGE: + case ITEM_TRI_POWER: + case ITEM_TRI_WISDOM: id = ITEM_COMPLETE_TRIFORCE; break; + } + getItemLabel(id, buf); + if (buf.len() != 0) { + result = buf; + } + break; + } + case dLytPauseMgr_c::SELECT_FIRE: { + buf.empty(); + buf.sprintf("NAME_FIRE_%03d", id); + result = buf; + break; + } + case dLytPauseMgr_c::SELECT_RING: { + buf.empty(); + buf.sprintf("SUB_RING_%02d", id); + result = buf; + break; + } + default: + getItemLabel(id, buf); + if (buf.len() != 0) { + result = buf; + } + break; + } + + return result; +} + +const wchar_t *dLytPauseText_c::getCurrentPausePopupName() { + dLytPauseMgr_c::SelectionType_e selectionType = dLytPauseMgr_c::GetInstance()->getCurrentSelectionType(); + s32 id = dLytPauseMgr_c::GetInstance()->getCurrentSelectionId(); + + switch (selectionType) { + case dLytPauseMgr_c::SELECT_DOWSING: return getDowsingText(id); + case dLytPauseMgr_c::SELECT_ITEM: + switch (id) { + case ITEM_TRI_COURAGE: + case ITEM_TRI_POWER: + case ITEM_TRI_WISDOM: return dMessage_c::getTextMessageByLabel("NAME_ITEM_005", true, nullptr, 0); + default: return getItemText(id); + } + case dLytPauseMgr_c::SELECT_CATEGORY: return getPauseCategoryText(id); + case dLytPauseMgr_c::SELECT_FIRE: { + SizedString<32> buf; + buf.sprintf("NAME_FIRE_%03d", id); + return dMessage_c::getTextMessageByLabel(buf, true, nullptr, 0); + } + default: return getItemText(id); + } +} + +const wchar_t *dLytPauseText_c::getCurrentPausePopupCaption() { + // TODO - bunch of unresolved IDs here + dLytPauseMgr_c::SelectionType_e selectionType = dLytPauseMgr_c::GetInstance()->getCurrentSelectionType(); + + if (dLytPauseMgr_c::GetInstance()->getField_0x0841()) { + // "It has been stolen by monsters! You've got to get it back." + return dMessage_c::getTextMessageByLabel("CAPTION_ITEM_STOLEN", true, nullptr, 0); + } + + s32 id = dLytPauseMgr_c::GetInstance()->getCurrentSelectionId(); + + switch (selectionType) { + case dLytPauseMgr_c::SELECT_DOWSING: { + if (id == 12) { + if (ItemflagManager::sInstance->getFlagDirect(502) == 80) { + // "You've collected all the Gratitude Crystals. There are none left for your sword to react to." + return dMessage_c::getTextMessageByLabel("CAPTION_DOWSING_012_02", true, nullptr, 0); + } else { + // "Use your dowsing ability to detect the Gratitude Crystals that the demon Batreaux wants to see." + return dMessage_c::getTextMessageByLabel("CAPTION_DOWSING_012", true, nullptr, 0); + } + } else if (id == 14) { + if (StoryflagManager::sInstance->getCounterOrFlag(1087) == 27) { + // "You've activated all of the Goddess Cubes. There are none left for your sword to react to." + return dMessage_c::getTextMessageByLabel("CAPTION_DOWSING_014_02", true, nullptr, 0); + } else { + // "Use your dowsing ability to detect Goddess Cubes and their corresponding treasure chests in the + // sky above." + return dMessage_c::getTextMessageByLabel("CAPTION_DOWSING_014", true, nullptr, 0); + } + } else { + SizedString<32> buf; + buf.sprintf("CAPTION_DOWSING_%03d", id); + return dMessage_c::getTextMessageByLabel(buf, true, nullptr, 0); + } + } + case dLytPauseMgr_c::SELECT_ITEM: { + if (id == ITEM_TRI_COURAGE || id == ITEM_TRI_POWER || id == ITEM_TRI_WISDOM) { + if (id == ITEM_TRI_COURAGE) { + return dMessage_c::getTextMessageByLabel("CAPTION_ITEM_005", true, nullptr, 0); + } else if (id == ITEM_TRI_POWER) { + return dMessage_c::getTextMessageByLabel("CAPTION_ITEM_005_02", true, nullptr, 0); + } else { + return dMessage_c::getTextMessageByLabel("CAPTION_ITEM_005_03", true, nullptr, 0); + } + } else if (id == ITEM_HEART_PIECE) { + if (dAcItem_c::getHeartContainerHealthCount() == 24) { + // "You've collected all the Pieces of Heart." + return dMessage_c::getTextMessageByLabel("CAPTION_ITEM_094_02", true, nullptr, 0); + } else { + return getCaptionItemText(id); + } + } else { + return getCaptionItemText(id); + } + } + case dLytPauseMgr_c::SELECT_FIRE: { + SizedString<32> buf; + buf.sprintf("CAPTION_FIRE_%03d", id); + return dMessage_c::getTextMessageByLabel(buf, true, nullptr, 0); + } + default: { + if (id == ITEM_CAWLIN_LETTER) { + if (StoryflagManager::sInstance->getFlag(552) || StoryflagManager::sInstance->getFlag(555)) { + // "A heartfelt letter from Cawlin that you were able to somewhat successfully deliver..." + return dMessage_c::getTextMessageByLabel("CAPTION_ITEM_158_02", true, nullptr, 0); + } else { + return getCaptionItemText(id); + } + } else if (id == ITEM_BEEDLE_INSECT_CAGE) { + if (StoryflagManager::sInstance->getFlag(477)) { + // "Formerly contained Beedle's beloved insect. You successfully returned it to its owner." + return dMessage_c::getTextMessageByLabel("CAPTION_ITEM_159_02", true, nullptr, 0); + } else { + return getCaptionItemText(id); + } + } else if (id == ITEM_RATTLE) { + if (StoryflagManager::sInstance->getFlag(387)) { + // "This toy belongs to the baby of Bertie, who runs the Potion Shop. You've successfully returned it to its owner." + return dMessage_c::getTextMessageByLabel("CAPTION_ITEM_160_02", true, nullptr, 0); + } else { + return getCaptionItemText(id); + } + } else if (id == ITEM_1_CRYSTAL) { + if (StoryflagManager::sInstance->getFlag(360)) { + // "Crystallized gratitude from the people of the land. This power of thankfulness turned Batreaux into a human." + return dMessage_c::getTextMessageByLabel("CAPTION_ITEM_048_02", true, nullptr, 0); + } else { + return getCaptionItemText(id); + } + } else { + return getCaptionItemText(id); + } + } + } +} + +void dLytPauseText_c::calcTextLines(dTextBox_c *textBox, const wchar_t *text) { + if (text != nullptr) { + mNumTextLines = textBox->calcTextLines(text, dMessage_c::getGlobalTagProcessor()); + } else { + mNumTextLines = 2; + } +} + +bool dLytPauseText_c::isCurrentItemWallet() const { + dLytPauseMgr_c::SelectionType_e selectionType = dLytPauseMgr_c::GetInstance()->getCurrentSelectionType(); + if (dLytPauseMgr_c::GetInstance()->getField_0x0841()) { + return false; + } + + s32 id = dLytPauseMgr_c::GetInstance()->getCurrentSelectionId(); + + if (selectionType != dLytPauseMgr_c::SELECT_ITEM) { + return false; + } + + switch (id) { + case ITEM_UNK_107: + case ITEM_MEDIUM_WALLET: + case ITEM_BIG_WALLET: + case ITEM_GIANT_WALLET: + case ITEM_TYCOON_WALLET: return true; + default: return false; + } +} |
