mirror of
https://github.com/zeldaret/ss
synced 2026-06-25 01:32:01 -04:00
1274 lines
42 KiB
C++
1274 lines
42 KiB
C++
#include "d/lyt/meter/d_lyt_meter_dowsing.h"
|
|
|
|
#include "common.h"
|
|
#include "d/flag/storyflag_manager.h"
|
|
#include "d/lyt/d_lyt_area_caption.h"
|
|
#include "d/lyt/d_lyt_common_icon_item_maps.h"
|
|
#include "d/lyt/d_lyt_control_game.h"
|
|
#include "d/lyt/d_lyt_do_button.h"
|
|
#include "d/lyt/d_lyt_unknowns.h"
|
|
#include "d/lyt/d_lyt_util_items.h"
|
|
#include "d/lyt/d_window.h"
|
|
#include "d/lyt/meter/d_lyt_meter.h"
|
|
#include "d/snd/d_snd_small_effect_mgr.h"
|
|
#include "m/m_vec.h"
|
|
#include "nw4r/lyt/lyt_group.h"
|
|
#include "nw4r/math/math_types.h"
|
|
#include "sized_string.h"
|
|
#include "toBeSorted/d_emitter.h"
|
|
#include "toBeSorted/dowsing_target.h"
|
|
#include "toBeSorted/file_manager.h"
|
|
|
|
STATE_DEFINE(dLytMeterDowsingMenuIcon_c, Wait);
|
|
STATE_DEFINE(dLytMeterDowsingMenuIcon_c, On);
|
|
STATE_DEFINE(dLytMeterDowsingMenuIcon_c, Select);
|
|
STATE_DEFINE(dLytMeterDowsingMenuIcon_c, Off);
|
|
|
|
STATE_DEFINE(dLytMeterDowsingBlink_c, Wait);
|
|
STATE_DEFINE(dLytMeterDowsingBlink_c, On);
|
|
STATE_DEFINE(dLytMeterDowsingBlink_c, Select);
|
|
STATE_DEFINE(dLytMeterDowsingBlink_c, Off);
|
|
|
|
STATE_DEFINE(dLytMeterDowsingInput_c, Wait);
|
|
STATE_DEFINE(dLytMeterDowsingInput_c, On);
|
|
STATE_DEFINE(dLytMeterDowsingInput_c, Select);
|
|
STATE_DEFINE(dLytMeterDowsingInput_c, Off);
|
|
|
|
STATE_DEFINE(dLytMeterDowsingText_c, Wait);
|
|
STATE_DEFINE(dLytMeterDowsingText_c, On);
|
|
STATE_DEFINE(dLytMeterDowsingText_c, Select);
|
|
STATE_DEFINE(dLytMeterDowsingText_c, Off);
|
|
|
|
STATE_DEFINE(dLytMeterDowsing_c, Invisible);
|
|
STATE_DEFINE(dLytMeterDowsing_c, Wait);
|
|
STATE_DEFINE(dLytMeterDowsing_c, MenuSelectingIn);
|
|
STATE_DEFINE(dLytMeterDowsing_c, MenuSelecting);
|
|
STATE_DEFINE(dLytMeterDowsing_c, MenuSelectingOut);
|
|
STATE_DEFINE(dLytMeterDowsing_c, Reset);
|
|
STATE_DEFINE(dLytMeterDowsing_c, ToUse);
|
|
STATE_DEFINE(dLytMeterDowsing_c, ToUnuse);
|
|
STATE_DEFINE(dLytMeterDowsing_c, Unuse);
|
|
STATE_DEFINE(dLytMeterDowsing_c, DemoMove);
|
|
STATE_DEFINE(dLytMeterDowsing_c, DemoOut);
|
|
|
|
void dLytMeterDowsingMenuIcon_c::initializeState_Wait() {}
|
|
void dLytMeterDowsingMenuIcon_c::executeState_Wait() {
|
|
if (mShouldBeSelect != 0) {
|
|
mpAnm->setForwardOnce();
|
|
mpAnm->setFrame(0.0f);
|
|
mpAnm->setAnimEnable(true);
|
|
mStateMgr.changeState(StateID_On);
|
|
}
|
|
}
|
|
void dLytMeterDowsingMenuIcon_c::finalizeState_Wait() {}
|
|
|
|
void dLytMeterDowsingMenuIcon_c::initializeState_On() {}
|
|
void dLytMeterDowsingMenuIcon_c::executeState_On() {
|
|
if (mpAnm->isEndReached()) {
|
|
mpAnm->setAnimEnable(false);
|
|
mStateMgr.changeState(StateID_Select);
|
|
}
|
|
|
|
if (mpAnm->isEnabled()) {
|
|
mpAnm->play();
|
|
}
|
|
}
|
|
void dLytMeterDowsingMenuIcon_c::finalizeState_On() {}
|
|
|
|
void dLytMeterDowsingMenuIcon_c::initializeState_Select() {}
|
|
void dLytMeterDowsingMenuIcon_c::executeState_Select() {
|
|
mpAnm->setBackwardsOnce();
|
|
mpAnm->setToStart();
|
|
mpAnm->setAnimEnable(true);
|
|
if (mShouldBeSelect == 0) {
|
|
mStateMgr.changeState(StateID_Off);
|
|
}
|
|
}
|
|
void dLytMeterDowsingMenuIcon_c::finalizeState_Select() {}
|
|
|
|
void dLytMeterDowsingMenuIcon_c::initializeState_Off() {}
|
|
void dLytMeterDowsingMenuIcon_c::executeState_Off() {
|
|
if (mpAnm->isStop2()) {
|
|
mpAnm->setAnimEnable(false);
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
|
|
if (mpAnm->isEnabled()) {
|
|
mpAnm->play();
|
|
}
|
|
}
|
|
void dLytMeterDowsingMenuIcon_c::finalizeState_Off() {}
|
|
|
|
void dLytMeterDowsingMenuIcon_c::init() {
|
|
mShouldBeSelect = 0;
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
|
|
void dLytMeterDowsingMenuIcon_c::execute() {
|
|
mStateMgr.executeState();
|
|
}
|
|
|
|
void dLytMeterDowsingMenuIcon_c::reset() {
|
|
mShouldBeSelect = 0;
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
|
|
void dLytMeterDowsingBlink_c::initializeState_Wait() {}
|
|
void dLytMeterDowsingBlink_c::executeState_Wait() {
|
|
if (mShouldBeSelect != 0) {
|
|
mpAnm->setForwardOnce();
|
|
mpAnm->setFrame(0.0f);
|
|
mpAnm->setAnimEnable(true);
|
|
mStateMgr.changeState(StateID_On);
|
|
}
|
|
}
|
|
void dLytMeterDowsingBlink_c::finalizeState_Wait() {}
|
|
|
|
void dLytMeterDowsingBlink_c::initializeState_On() {}
|
|
void dLytMeterDowsingBlink_c::executeState_On() {
|
|
if (mpAnm->isEndReached()) {
|
|
mpAnm->setAnimEnable(false);
|
|
mStateMgr.changeState(StateID_Select);
|
|
}
|
|
|
|
if (mpAnm->isEnabled()) {
|
|
mpAnm->play();
|
|
}
|
|
}
|
|
void dLytMeterDowsingBlink_c::finalizeState_On() {}
|
|
|
|
void dLytMeterDowsingBlink_c::initializeState_Select() {}
|
|
void dLytMeterDowsingBlink_c::executeState_Select() {
|
|
if (mShouldBeSelect == 0) {
|
|
mpAnm->setBackwardsOnce();
|
|
mpAnm->setToStart();
|
|
mpAnm->setAnimEnable(true);
|
|
mStateMgr.changeState(StateID_Off);
|
|
}
|
|
}
|
|
void dLytMeterDowsingBlink_c::finalizeState_Select() {}
|
|
|
|
void dLytMeterDowsingBlink_c::initializeState_Off() {}
|
|
void dLytMeterDowsingBlink_c::executeState_Off() {
|
|
if (mpAnm->isStop2()) {
|
|
mpAnm->setAnimEnable(false);
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
|
|
if (mpAnm->isEnabled()) {
|
|
mpAnm->play();
|
|
}
|
|
}
|
|
void dLytMeterDowsingBlink_c::finalizeState_Off() {}
|
|
|
|
void dLytMeterDowsingBlink_c::init() {
|
|
mShouldBeSelect = 0;
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
|
|
void dLytMeterDowsingBlink_c::execute() {
|
|
mStateMgr.executeState();
|
|
}
|
|
|
|
void dLytMeterDowsingInput_c::initializeState_Wait() {}
|
|
void dLytMeterDowsingInput_c::executeState_Wait() {
|
|
if (mShouldBeSelect != 0) {
|
|
mpAnm->setBackwardsOnce();
|
|
mpAnm->setToStart();
|
|
mpAnm->setAnimEnable(true);
|
|
mStateMgr.changeState(StateID_On);
|
|
}
|
|
}
|
|
void dLytMeterDowsingInput_c::finalizeState_Wait() {}
|
|
|
|
void dLytMeterDowsingInput_c::initializeState_On() {}
|
|
void dLytMeterDowsingInput_c::executeState_On() {
|
|
if (mpAnm->isStop2()) {
|
|
mpAnm->setAnimEnable(false);
|
|
mStateMgr.changeState(StateID_Select);
|
|
}
|
|
|
|
if (mpAnm->isEnabled()) {
|
|
mpAnm->play();
|
|
}
|
|
}
|
|
void dLytMeterDowsingInput_c::finalizeState_On() {}
|
|
|
|
void dLytMeterDowsingInput_c::initializeState_Select() {}
|
|
void dLytMeterDowsingInput_c::executeState_Select() {
|
|
if (mShouldBeSelect == 0) {
|
|
mpAnm->setForwardOnce();
|
|
mpAnm->setToStart();
|
|
mpAnm->setAnimEnable(true);
|
|
mStateMgr.changeState(StateID_Off);
|
|
}
|
|
}
|
|
void dLytMeterDowsingInput_c::finalizeState_Select() {}
|
|
|
|
void dLytMeterDowsingInput_c::initializeState_Off() {}
|
|
void dLytMeterDowsingInput_c::executeState_Off() {
|
|
if (mpAnm->isStop2()) {
|
|
mpAnm->setAnimEnable(false);
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
|
|
if (mpAnm->isEnabled()) {
|
|
mpAnm->play();
|
|
}
|
|
}
|
|
void dLytMeterDowsingInput_c::finalizeState_Off() {}
|
|
|
|
void dLytMeterDowsingInput_c::init() {
|
|
mShouldBeSelect = 0;
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
|
|
void dLytMeterDowsingInput_c::execute() {
|
|
mStateMgr.executeState();
|
|
}
|
|
|
|
void dLytMeterDowsingText_c::initializeState_Wait() {}
|
|
void dLytMeterDowsingText_c::executeState_Wait() {
|
|
if (mShouldBeSelect != 0) {
|
|
mpAnm->setForwardOnce();
|
|
mpAnm->setFrame(0.0f);
|
|
mpAnm->setAnimEnable(true);
|
|
mStateMgr.changeState(StateID_On);
|
|
}
|
|
}
|
|
void dLytMeterDowsingText_c::finalizeState_Wait() {}
|
|
|
|
void dLytMeterDowsingText_c::initializeState_On() {}
|
|
void dLytMeterDowsingText_c::executeState_On() {
|
|
if (mpAnm->isEndReached()) {
|
|
mpAnm->setAnimEnable(false);
|
|
mStateMgr.changeState(StateID_Select);
|
|
}
|
|
|
|
if (mpAnm->isEnabled()) {
|
|
mpAnm->play();
|
|
}
|
|
}
|
|
void dLytMeterDowsingText_c::finalizeState_On() {}
|
|
|
|
void dLytMeterDowsingText_c::initializeState_Select() {}
|
|
void dLytMeterDowsingText_c::executeState_Select() {
|
|
if (mShouldBeSelect == 0) {
|
|
mpAnm->setBackwardsOnce();
|
|
mpAnm->setToStart();
|
|
mpAnm->setAnimEnable(true);
|
|
mStateMgr.changeState(StateID_Off);
|
|
}
|
|
}
|
|
void dLytMeterDowsingText_c::finalizeState_Select() {}
|
|
|
|
void dLytMeterDowsingText_c::initializeState_Off() {}
|
|
void dLytMeterDowsingText_c::executeState_Off() {
|
|
if (mpAnm->isStop2()) {
|
|
mpAnm->setAnimEnable(false);
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
|
|
if (mpAnm->isEnabled()) {
|
|
mpAnm->play();
|
|
}
|
|
}
|
|
void dLytMeterDowsingText_c::finalizeState_Off() {}
|
|
|
|
void dLytMeterDowsingText_c::init() {
|
|
mShouldBeSelect = 0;
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
|
|
void dLytMeterDowsingText_c::execute() {
|
|
mStateMgr.executeState();
|
|
}
|
|
|
|
static const char *sPaneNames[] = {
|
|
"N_itemArrow_00", "N_arrowHand_00", "N_bBtn_00", "N_A_00", "N_B_00", "N_C_00",
|
|
"N_D_00", "N_E_00", "N_F_00", "N_G_00", "N_H_00", "N_iconA_00",
|
|
"N_iconB_00", "N_iconC_00", "N_iconD_00", "N_iconE_00", "N_iconF_00", "N_iconG_00",
|
|
"N_iconH_00", "N_btnBg_01", "N_input_00", "N_input_01",
|
|
};
|
|
|
|
#define DOWSING_PANE_ITEM_ARROW 0
|
|
#define DOWSING_PANE_ARROW_HAND 1
|
|
#define DOWSING_PANE_N_BTN_0 2
|
|
#define DOWSING_PANE_ITEM_OFFSET 3
|
|
#define DOWSING_PANE_ICON_OFFSET 11
|
|
#define DOWSING_PANE_BTN_BG_01 19
|
|
#define DOWSING_PANE_INPUT_00 20
|
|
#define DOWSING_PANE_INPUT_01 21
|
|
|
|
#define DOWSING_NUM_PANES 22
|
|
|
|
static const d2d::LytBrlanMapping brlanMap[] = {
|
|
{ "nunBtn_03_in.brlan", "G_inOut_00"},
|
|
{ "nunBtn_03_onOff.brlan", "G_itemA_00"},
|
|
{ "nunBtn_03_onOff.brlan", "G_itemB_00"},
|
|
{ "nunBtn_03_onOff.brlan", "G_itemC_00"},
|
|
{ "nunBtn_03_onOff.brlan", "G_itemD_00"},
|
|
{ "nunBtn_03_onOff.brlan", "G_itemE_00"},
|
|
{ "nunBtn_03_onOff.brlan", "G_itemF_00"},
|
|
{ "nunBtn_03_onOff.brlan", "G_itemG_00"},
|
|
{ "nunBtn_03_onOff.brlan", "G_itemH_00"},
|
|
{ "nunBtn_03_onOff.brlan", "G_text_00"},
|
|
{ "nunBtn_03_onOff.brlan", "G_text_01"},
|
|
{"nunBtn_03_selectOnOff.brlan", "G_selectOnOff_00"},
|
|
{ "nunBtn_03_selectLoop.brlan", "G_selectLoop_00"},
|
|
{ "nunBtn_03_have.brlan", "G_itemA_00"},
|
|
{ "nunBtn_03_have.brlan", "G_itemB_00"},
|
|
{ "nunBtn_03_have.brlan", "G_itemC_00"},
|
|
{ "nunBtn_03_have.brlan", "G_itemD_00"},
|
|
{ "nunBtn_03_have.brlan", "G_itemF_00"},
|
|
{ "nunBtn_03_have.brlan", "G_itemG_00"},
|
|
{ "nunBtn_03_have.brlan", "G_itemH_00"},
|
|
{ "nunBtn_03_itemArrow.brlan", "G_itemArrow_00"},
|
|
{ "nunBtn_03_decide.brlan", "G_decide_00"},
|
|
{ "nunBtn_03_reset.brlan", "G_inOut_00"},
|
|
{ "nunBtn_03_input.brlan", "G_input_00"},
|
|
{ "nunBtn_03_input.brlan", "G_input_01"},
|
|
{ "nunBtn_03_type.brlan", "G_type_00"},
|
|
{ "nunBtn_03_call.brlan", "G_call_00"},
|
|
{ "nunBtn_03_text.brlan", "G_text_02"},
|
|
{ "nunBtn_03_loop.brlan", "G_loop_00"},
|
|
};
|
|
|
|
#define DOWSING_ANIM_IN 0
|
|
#define DOWSING_ANIM_ITEM_ONOFF_OFFSET 1
|
|
#define DOWSING_ANIM_TEXT_ONOFF_OFFSET 9
|
|
#define DOWSING_ANIM_SELECT_ONOFF 11
|
|
#define DOWSING_ANIM_SELECT_LOOP 12
|
|
#define DOWSING_ANIM_HAVE_OFFSET 13
|
|
#define DOWSING_ANIM_ARROW 20
|
|
#define DOWSING_ANIM_DECIDE 21
|
|
#define DOWSING_ANIM_RESET 22
|
|
#define DOWSING_ANIM_INPUT_0 23
|
|
#define DOWSING_ANIM_INPUT_1 24
|
|
#define DOWSING_ANIM_TYPE 25
|
|
#define DOWSING_ANIM_CALL 26
|
|
#define DOWSING_ANIM_TEXT 27
|
|
#define DOWSING_ANIM_LOOP 28
|
|
|
|
#define DOWSING_NUM_ANIMS 29
|
|
|
|
#define DOWSING_NUM_ITEMS 8
|
|
|
|
static const char *sTextboxNames[] = {"T_itemName_00", "T_itemNameS_00", "T_dawsing_00", "T_dawsingS_00"};
|
|
|
|
static const char *sWindowNames[] = {
|
|
"W_bgP_01",
|
|
"W_bgP_02",
|
|
"W_bgP_00",
|
|
};
|
|
|
|
static const char *sGroupName = "G_ref_00";
|
|
|
|
void dLytMeterDowsing_c::initializeState_Invisible() {}
|
|
void dLytMeterDowsing_c::executeState_Invisible() {
|
|
if (getPane()->IsVisible()) {
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
}
|
|
void dLytMeterDowsing_c::finalizeState_Invisible() {
|
|
if (getSelectedDowsingSlot() != DowsingTarget::SLOT_NONE &&
|
|
LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) == 0x52) {
|
|
mAnm[DOWSING_ANIM_DECIDE].setToEnd();
|
|
mAnm[DOWSING_ANIM_DECIDE].setAnimEnable(true);
|
|
mLyt.calc();
|
|
mAnm[DOWSING_ANIM_DECIDE].setAnimEnable(false);
|
|
}
|
|
}
|
|
|
|
void dLytMeterDowsing_c::initializeState_Wait() {
|
|
fn_800FE220();
|
|
}
|
|
void dLytMeterDowsing_c::executeState_Wait() {
|
|
if (field_0x5507 != 0) {
|
|
fn_800FE220();
|
|
field_0x5507 = 0;
|
|
}
|
|
|
|
if (!getPane()->IsVisible()) {
|
|
mStateMgr.changeState(StateID_Invisible);
|
|
} else if (field_0x54F4 == 1) {
|
|
mStateMgr.changeState(StateID_DemoMove);
|
|
} else if (field_0x5505 != 0) {
|
|
mStateMgr.changeState(StateID_MenuSelectingIn);
|
|
} else if (field_0x550A != 0 && (!dLytMeter_c::GetMain()->fn_800D5380(0) || dLytMeter_c::GetMain()->fn_800D5650() ||
|
|
dLytMeter_c::GetMain()->fn_800D5680())) {
|
|
mStateMgr.changeState(StateID_Reset);
|
|
} else if (!dLytMeter_c::GetInstance()->checkAllFlags(METER_BTN_C)) {
|
|
mStateMgr.changeState(StateID_ToUnuse);
|
|
} else if (dLytMeter_c::GetInstance()->getMeterField_0x1377F() != 0 && field_0x550A == 0 &&
|
|
dLytMeter_c::GetMain()->fn_800D5380(0) && !dLytMeter_c::GetMain()->fn_800D5650() &&
|
|
!dLytMeter_c::GetMain()->fn_800D5680() && getSelectedDowsingSlot() != DowsingTarget::SLOT_LOOK &&
|
|
getSelectedDowsingSlot() != DowsingTarget::SLOT_NONE &&
|
|
LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) == 0x52) {
|
|
mAnm[DOWSING_ANIM_IN].setBackwardsOnce();
|
|
mAnm[DOWSING_ANIM_IN].setToEnd2();
|
|
mAnm[DOWSING_ANIM_IN].setAnimEnable(true);
|
|
mAnm[DOWSING_ANIM_DECIDE].setToEnd();
|
|
mAnm[DOWSING_ANIM_DECIDE].setAnimEnable(true);
|
|
mItemIcons[0].setItem(convertToLytIndex(getSelectedDowsingSlot()));
|
|
mLyt.calc();
|
|
mAnm[DOWSING_ANIM_IN].setAnimEnable(false);
|
|
mAnm[DOWSING_ANIM_DECIDE].setAnimEnable(false);
|
|
field_0x550A = 1;
|
|
}
|
|
}
|
|
void dLytMeterDowsing_c::finalizeState_Wait() {}
|
|
|
|
void dLytMeterDowsing_c::initializeState_MenuSelectingIn() {
|
|
mAnm[DOWSING_ANIM_DECIDE].setAnimEnable(true);
|
|
mAnm[DOWSING_ANIM_DECIDE].setFrame(0.0f);
|
|
|
|
for (int i = 0; i < DOWSING_NUM_ITEMS; i++) {
|
|
if (i != 4) {
|
|
// The bottom slot is always enabled?
|
|
mAnm[convertSlotIndexToAnm(i) + DOWSING_ANIM_HAVE_OFFSET].setAnimEnable(true);
|
|
}
|
|
|
|
DowsingTarget::DowsingSlot slot = dowsingSlotForIndex(i);
|
|
if (slot != DowsingTarget::SLOT_NONE && DowsingTarget::hasDowsingInSlot(slot)) {
|
|
mpPanes[i + DOWSING_PANE_ICON_OFFSET]->SetVisible(true);
|
|
if (i != 4) {
|
|
mAnm[convertSlotIndexToAnm(i) + DOWSING_ANIM_HAVE_OFFSET].setFrame(0.0f);
|
|
}
|
|
mItemIcons[i + 1].setItem(getLytIndexForDowsingIndex(i));
|
|
} else {
|
|
mpPanes[i + DOWSING_PANE_ICON_OFFSET]->SetVisible(false);
|
|
if (i != 4) {
|
|
mAnm[convertSlotIndexToAnm(i) + DOWSING_ANIM_HAVE_OFFSET].setFrame(1.0f);
|
|
}
|
|
}
|
|
|
|
mAnm[i + DOWSING_ANIM_ITEM_ONOFF_OFFSET].setForwardOnce();
|
|
mAnm[i + DOWSING_ANIM_ITEM_ONOFF_OFFSET].setAnimEnable(true);
|
|
mAnm[i + DOWSING_ANIM_ITEM_ONOFF_OFFSET].setFrame(0.0f);
|
|
|
|
mIcon[i].reset();
|
|
}
|
|
mAnm[DOWSING_ANIM_IN].setForwardOnce();
|
|
mAnm[DOWSING_ANIM_IN].setFrame(0.0f);
|
|
mAnm[DOWSING_ANIM_IN].setAnimEnable(true);
|
|
if (StoryflagManager::sInstance->getCounterOrFlag(STORYFLAG_UPGRADED_DOWSING)) {
|
|
mAnm[DOWSING_ANIM_TYPE].setFrame(1.0f);
|
|
} else {
|
|
mAnm[DOWSING_ANIM_TYPE].setFrame(0.0f);
|
|
}
|
|
|
|
mLyt.getLayout()->Animate(0);
|
|
mLyt.calc();
|
|
|
|
mAnm[DOWSING_ANIM_DECIDE].setAnimEnable(false);
|
|
|
|
for (int i = 0; i < DOWSING_NUM_ITEMS; i++) {
|
|
if (i != 4) {
|
|
mAnm[convertSlotIndexToAnm(i) + DOWSING_ANIM_HAVE_OFFSET].setAnimEnable(false);
|
|
}
|
|
mAnm[i + DOWSING_ANIM_ITEM_ONOFF_OFFSET].setAnimEnable(false);
|
|
}
|
|
}
|
|
void dLytMeterDowsing_c::executeState_MenuSelectingIn() {
|
|
if (mAnm[DOWSING_ANIM_IN].isEndReached()) {
|
|
mStateMgr.changeState(StateID_MenuSelecting);
|
|
}
|
|
|
|
if (mAnm[DOWSING_ANIM_IN].isEnabled()) {
|
|
mAnm[DOWSING_ANIM_IN].play();
|
|
}
|
|
}
|
|
void dLytMeterDowsing_c::finalizeState_MenuSelectingIn() {
|
|
mAnm[DOWSING_ANIM_IN].setAnimEnable(false);
|
|
}
|
|
|
|
void dLytMeterDowsing_c::initializeState_MenuSelecting() {}
|
|
void dLytMeterDowsing_c::executeState_MenuSelecting() {
|
|
if (field_0x5505 == 0) {
|
|
mStateMgr.changeState(StateID_MenuSelectingOut);
|
|
}
|
|
}
|
|
void dLytMeterDowsing_c::finalizeState_MenuSelecting() {}
|
|
|
|
void dLytMeterDowsing_c::initializeState_MenuSelectingOut() {
|
|
fn_800FE220();
|
|
mAnm[DOWSING_ANIM_IN].setBackwardsOnce();
|
|
mAnm[DOWSING_ANIM_IN].setToStart();
|
|
mAnm[DOWSING_ANIM_IN].setAnimEnable(true);
|
|
field_0x550A = 0;
|
|
if (getSelectedDowsingSlot() != DowsingTarget::SLOT_NONE &&
|
|
LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) == 0x52) {
|
|
if (getSelectedDowsingSlot() != DowsingTarget::SLOT_LOOK) {
|
|
field_0x550A = 1;
|
|
}
|
|
mAnm[DOWSING_ANIM_DECIDE].setAnimEnable(true);
|
|
}
|
|
}
|
|
void dLytMeterDowsing_c::executeState_MenuSelectingOut() {
|
|
if (mAnm[DOWSING_ANIM_IN].isStop2()) {
|
|
mAnm[DOWSING_ANIM_IN].setAnimEnable(false);
|
|
if (mAnm[DOWSING_ANIM_DECIDE].isEnabled()) {
|
|
if (mAnm[DOWSING_ANIM_DECIDE].isEndReached()) {
|
|
mAnm[DOWSING_ANIM_DECIDE].setAnimEnable(false);
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
} else {
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
}
|
|
|
|
if (mAnm[DOWSING_ANIM_IN].isEnabled()) {
|
|
mAnm[DOWSING_ANIM_IN].play();
|
|
}
|
|
|
|
if (mAnm[DOWSING_ANIM_DECIDE].isEnabled()) {
|
|
mAnm[DOWSING_ANIM_DECIDE].play();
|
|
}
|
|
}
|
|
void dLytMeterDowsing_c::finalizeState_MenuSelectingOut() {}
|
|
|
|
void dLytMeterDowsing_c::initializeState_Reset() {
|
|
mAnm[DOWSING_ANIM_RESET].setForwardOnce();
|
|
mAnm[DOWSING_ANIM_RESET].setToStart();
|
|
mAnm[DOWSING_ANIM_RESET].setAnimEnable(true);
|
|
}
|
|
void dLytMeterDowsing_c::executeState_Reset() {
|
|
if (mAnm[DOWSING_ANIM_RESET].isStop2()) {
|
|
field_0x550A = 0;
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
|
|
if (mAnm[DOWSING_ANIM_RESET].isEnabled()) {
|
|
mAnm[DOWSING_ANIM_RESET].play();
|
|
}
|
|
}
|
|
void dLytMeterDowsing_c::finalizeState_Reset() {}
|
|
|
|
void dLytMeterDowsing_c::initializeState_ToUse() {
|
|
mAnm[DOWSING_ANIM_INPUT_0].setBackwardsOnce();
|
|
mAnm[DOWSING_ANIM_INPUT_0].setToStart();
|
|
mAnm[DOWSING_ANIM_INPUT_0].setAnimEnable(true);
|
|
|
|
if (FileManager::GetInstance()->getDowsingSlotIdx() != 8 &&
|
|
LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) == 0x52 && dLytMeter_c::GetMain()->fn_800D5380(0) &&
|
|
!dLytMeter_c::GetMain()->fn_800D5650() && !dLytMeter_c::GetMain()->fn_800D5680()) {
|
|
mAnm[DOWSING_ANIM_RESET].setAnimEnable(true);
|
|
mAnm[DOWSING_ANIM_RESET].setBackwardsOnce();
|
|
mAnm[DOWSING_ANIM_RESET].setToStart();
|
|
}
|
|
}
|
|
void dLytMeterDowsing_c::executeState_ToUse() {
|
|
if (FileManager::GetInstance()->getDowsingSlotIdx() != 8 &&
|
|
LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) == 0x52 && dLytMeter_c::GetMain()->fn_800D5380(0) &&
|
|
!dLytMeter_c::GetMain()->fn_800D5650() && !dLytMeter_c::GetMain()->fn_800D5680()) {
|
|
if (mAnm[DOWSING_ANIM_INPUT_0].isStop2()) {
|
|
if (!mAnm[DOWSING_ANIM_RESET].isEnabled() || mAnm[DOWSING_ANIM_RESET].isStop2()) {
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
}
|
|
} else if (mAnm[DOWSING_ANIM_INPUT_0].isStop2()) {
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
|
|
if (mAnm[DOWSING_ANIM_INPUT_0].isEnabled()) {
|
|
mAnm[DOWSING_ANIM_INPUT_0].play();
|
|
}
|
|
|
|
if (mAnm[DOWSING_ANIM_RESET].isEnabled()) {
|
|
mAnm[DOWSING_ANIM_RESET].play();
|
|
}
|
|
}
|
|
void dLytMeterDowsing_c::finalizeState_ToUse() {
|
|
mAnm[DOWSING_ANIM_RESET].setAnimEnable(false);
|
|
mAnm[DOWSING_ANIM_INPUT_0].setAnimEnable(false);
|
|
}
|
|
|
|
void dLytMeterDowsing_c::initializeState_ToUnuse() {
|
|
mAnm[DOWSING_ANIM_INPUT_0].setForwardOnce();
|
|
if (dLytMeter_c::GetMain()->fn_800D5650()) {
|
|
mAnm[DOWSING_ANIM_INPUT_0].setToEnd2();
|
|
} else {
|
|
mAnm[DOWSING_ANIM_INPUT_0].setToStart();
|
|
}
|
|
mAnm[DOWSING_ANIM_INPUT_0].setAnimEnable(true);
|
|
|
|
if (FileManager::GetInstance()->getDowsingSlotIdx() != 8 &&
|
|
LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) == 0x52 && dLytMeter_c::GetMain()->fn_800D5380(0) &&
|
|
!dLytMeter_c::GetMain()->fn_800D5650() && !dLytMeter_c::GetMain()->fn_800D5680()) {
|
|
mAnm[DOWSING_ANIM_RESET].setAnimEnable(true);
|
|
mAnm[DOWSING_ANIM_RESET].setForwardOnce();
|
|
mAnm[DOWSING_ANIM_RESET].setToStart();
|
|
}
|
|
}
|
|
void dLytMeterDowsing_c::executeState_ToUnuse() {
|
|
if (mAnm[DOWSING_ANIM_INPUT_0].isStop2()) {
|
|
if (!mAnm[DOWSING_ANIM_RESET].isEnabled() || mAnm[DOWSING_ANIM_RESET].isStop2()) {
|
|
mStateMgr.changeState(StateID_Unuse);
|
|
}
|
|
}
|
|
|
|
if (mAnm[DOWSING_ANIM_INPUT_0].isEnabled()) {
|
|
mAnm[DOWSING_ANIM_INPUT_0].play();
|
|
}
|
|
|
|
if (mAnm[DOWSING_ANIM_RESET].isEnabled()) {
|
|
mAnm[DOWSING_ANIM_RESET].play();
|
|
}
|
|
}
|
|
void dLytMeterDowsing_c::finalizeState_ToUnuse() {
|
|
mAnm[DOWSING_ANIM_RESET].setAnimEnable(false);
|
|
mAnm[DOWSING_ANIM_INPUT_0].setAnimEnable(false);
|
|
}
|
|
|
|
void dLytMeterDowsing_c::initializeState_Unuse() {
|
|
field_0x54D8 = 15;
|
|
}
|
|
void dLytMeterDowsing_c::executeState_Unuse() {
|
|
if (field_0x54F4 == 1) {
|
|
mAnm[DOWSING_ANIM_INPUT_0].setAnimEnable(true);
|
|
mAnm[DOWSING_ANIM_INPUT_0].setFrame(0.0f);
|
|
mLyt.calc();
|
|
mAnm[DOWSING_ANIM_INPUT_0].setAnimEnable(false);
|
|
mStateMgr.changeState(StateID_DemoMove);
|
|
} else if (!dLytMeter_c::GetMain()->fn_800D5680() && !dLytMeter_c::GetInstance()->isHelpOpen() &&
|
|
dLytMeter_c::GetInstance()->checkAllFlags(METER_BTN_C)) {
|
|
if (field_0x54D8 <= 0) {
|
|
mStateMgr.changeState(StateID_ToUse);
|
|
} else {
|
|
field_0x54D8--;
|
|
}
|
|
} else {
|
|
field_0x54D8 = 15;
|
|
}
|
|
}
|
|
void dLytMeterDowsing_c::finalizeState_Unuse() {}
|
|
|
|
void dLytMeterDowsing_c::initializeState_DemoMove() {
|
|
field_0x550B = 1;
|
|
mDemoFrame = 0;
|
|
|
|
for (int i = 0; i < DOWSING_NUM_ITEMS; i++) {
|
|
if (i != 4) {
|
|
// The bottom slot is always enabled?
|
|
mAnm[convertSlotIndexToAnm(i) + DOWSING_ANIM_HAVE_OFFSET].setAnimEnable(true);
|
|
}
|
|
|
|
DowsingTarget::DowsingSlot slot = dowsingSlotForIndex(i);
|
|
bool condition = slot != DowsingTarget::SLOT_NONE && DowsingTarget::hasDowsingInSlot(slot);
|
|
if (i == fn_800FE9C0(field_0x54F8)) {
|
|
condition = false;
|
|
}
|
|
if (condition) {
|
|
mpPanes[i + DOWSING_PANE_ICON_OFFSET]->SetVisible(true);
|
|
if (i != 4) {
|
|
mAnm[convertSlotIndexToAnm(i) + DOWSING_ANIM_HAVE_OFFSET].setFrame(0.0f);
|
|
}
|
|
mItemIcons[i + 1].setItem(getLytIndexForDowsingIndex(i));
|
|
} else {
|
|
mpPanes[i + DOWSING_PANE_ICON_OFFSET]->SetVisible(false);
|
|
if (i != 4) {
|
|
mAnm[convertSlotIndexToAnm(i) + DOWSING_ANIM_HAVE_OFFSET].setFrame(1.0f);
|
|
}
|
|
}
|
|
|
|
mAnm[i + DOWSING_ANIM_ITEM_ONOFF_OFFSET].setForwardOnce();
|
|
mAnm[i + DOWSING_ANIM_ITEM_ONOFF_OFFSET].setAnimEnable(true);
|
|
mAnm[i + DOWSING_ANIM_ITEM_ONOFF_OFFSET].setFrame(0.0f);
|
|
|
|
mIcon[i].reset();
|
|
}
|
|
|
|
mAnm[DOWSING_ANIM_IN].setForwardOnce();
|
|
mAnm[DOWSING_ANIM_IN].setToEnd2();
|
|
mAnm[DOWSING_ANIM_IN].setAnimEnable(true);
|
|
|
|
if (StoryflagManager::sInstance->getCounterOrFlag(STORYFLAG_UPGRADED_DOWSING)) {
|
|
mAnm[DOWSING_ANIM_TYPE].setFrame(1.0f);
|
|
} else {
|
|
mAnm[DOWSING_ANIM_TYPE].setFrame(0.0f);
|
|
}
|
|
|
|
mLyt.getLayout()->Animate(0);
|
|
mLyt.calc();
|
|
|
|
mAnm[DOWSING_ANIM_IN].setAnimEnable(false);
|
|
|
|
for (int i = 0; i < DOWSING_NUM_ITEMS; i++) {
|
|
if (i != 4) {
|
|
mAnm[convertSlotIndexToAnm(i) + DOWSING_ANIM_HAVE_OFFSET].setAnimEnable(false);
|
|
}
|
|
mAnm[i + DOWSING_ANIM_ITEM_ONOFF_OFFSET].setAnimEnable(false);
|
|
}
|
|
}
|
|
|
|
void dLytMeterDowsing_c::executeState_DemoMove() {
|
|
mDemoFrame++;
|
|
if (mDemoFrame == 15) {
|
|
if (field_0x54F8 <= 21) {
|
|
s32 i = fn_800FE9C0(field_0x54F8);
|
|
s32 idx = i + DOWSING_PANE_ICON_OFFSET;
|
|
mpPanes[idx]->SetVisible(true);
|
|
mAnm[convertSlotIndexToAnm(i) + DOWSING_ANIM_HAVE_OFFSET].setAnimEnable(true);
|
|
mAnm[convertSlotIndexToAnm(i) + DOWSING_ANIM_HAVE_OFFSET].setFrame(0.0f);
|
|
mItemIcons[i + 1].setItem(getLytIndexForDowsingIndex(i));
|
|
|
|
idx = i + DOWSING_PANE_ITEM_OFFSET;
|
|
nw4r::math::MTX34 mtx = mpPanes[idx]->GetGlobalMtx();
|
|
mVec3_c pos(mtx._03, mtx._13, 0.0f);
|
|
dJEffManager_c::spawnUIEffect(PARTICLE_RESOURCE_ID_MAPPING_970_, pos, nullptr, nullptr, nullptr, nullptr);
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_DOWSING_ADD);
|
|
}
|
|
} else if (mDemoFrame == 16) {
|
|
for (int i = 0; i < DOWSING_NUM_ITEMS; i++) {
|
|
if (i != 4 && mAnm[convertSlotIndexToAnm(i) + DOWSING_ANIM_HAVE_OFFSET].isEnabled()) {
|
|
mAnm[convertSlotIndexToAnm(i) + DOWSING_ANIM_HAVE_OFFSET].setAnimEnable(false);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (mDemoFrame > 80) {
|
|
mDemoFrame = 0;
|
|
mStateMgr.changeState(StateID_DemoOut);
|
|
}
|
|
}
|
|
void dLytMeterDowsing_c::finalizeState_DemoMove() {}
|
|
|
|
void dLytMeterDowsing_c::initializeState_DemoOut() {
|
|
mAnm[DOWSING_ANIM_IN].setBackwardsOnce();
|
|
mAnm[DOWSING_ANIM_IN].setToStart();
|
|
mAnm[DOWSING_ANIM_IN].setAnimEnable(true);
|
|
}
|
|
void dLytMeterDowsing_c::executeState_DemoOut() {
|
|
if (mAnm[DOWSING_ANIM_IN].isStop2()) {
|
|
mAnm[DOWSING_ANIM_IN].setAnimEnable(false);
|
|
field_0x54F4 = 4;
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
if (mAnm[DOWSING_ANIM_IN].isEnabled()) {
|
|
mAnm[DOWSING_ANIM_IN].play();
|
|
}
|
|
}
|
|
void dLytMeterDowsing_c::finalizeState_DemoOut() {}
|
|
|
|
bool dLytMeterDowsing_c::build(d2d::ResAccIf_c *resAcc) {
|
|
mLyt.setResAcc(resAcc);
|
|
mLyt.build("nunBtn_03.brlyt", nullptr);
|
|
|
|
for (int i = 0; i < DOWSING_NUM_PANES; i++) {
|
|
mpPanes[i] = mLyt.findPane(sPaneNames[i]);
|
|
}
|
|
|
|
for (int i = 0; i < DOWSING_NUM_ANIMS; i++) {
|
|
mAnm[i].init(brlanMap[i].mFile, resAcc, mLyt.getLayout(), brlanMap[i].mName);
|
|
mAnm[i].bind(false);
|
|
mAnm[i].setAnimEnable(false);
|
|
}
|
|
|
|
mAnm[DOWSING_ANIM_SELECT_LOOP].setAnimEnable(true);
|
|
mAnm[DOWSING_ANIM_TYPE].setAnimEnable(true);
|
|
|
|
for (int i = 0; i < DOWSING_NUM_ITEMS; i++) {
|
|
mAnm[i + DOWSING_ANIM_ITEM_ONOFF_OFFSET].setFrame(0.0f);
|
|
mIcon[i].setAnm(&mAnm[i + DOWSING_ANIM_ITEM_ONOFF_OFFSET]);
|
|
mIcon[i].init();
|
|
}
|
|
|
|
mBlink.setAnm(&mAnm[DOWSING_ANIM_SELECT_ONOFF]);
|
|
mBlink.init();
|
|
mInput.setAnm(&mAnm[DOWSING_ANIM_INPUT_1]);
|
|
mInput.init();
|
|
|
|
for (int i = 0; i < 2; i++) {
|
|
mText[i].setAnm(&mAnm[i + DOWSING_ANIM_TEXT_ONOFF_OFFSET]);
|
|
mText[i].init();
|
|
}
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
mpTextBoxes[i] = mLyt.getTextBox(sTextboxNames[i]);
|
|
}
|
|
|
|
for (int i = 0; i < 3; i++) {
|
|
mpWindows[i] = mLyt.getWindow(sWindowNames[i]);
|
|
mpSizeBoxes[i] = mLyt.getSizeBoxInWindow(sWindowNames[i]);
|
|
}
|
|
mpWindows[0]->UpdateSize(mpSizeBoxes[0], 32.0f);
|
|
|
|
for (int i = 0; i < 9; i++) {
|
|
mSubpanes[i].mpLytPane = &mItemIcons[i];
|
|
mItemIcons[i].build(resAcc, dLytCommonIconItem_c::DOWSING);
|
|
mSubpaneList.PushBack(&mSubpanes[i]);
|
|
}
|
|
|
|
if (mLyt.getLayout()->GetGroupContainer() != nullptr) {
|
|
nw4r::lyt::Group *g = mLyt.getLayout()->GetGroupContainer()->FindGroupByName(sGroupName);
|
|
if (g != nullptr) {
|
|
linkMeters(g, &mSubpaneList);
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < 9; i++) {
|
|
mItemIcons[i].reset();
|
|
mItemIcons[i].setVisible(false);
|
|
mItemIcons[i].setSize(true);
|
|
}
|
|
|
|
field_0x54E0 = 8;
|
|
|
|
mArrowRotation = 0.0f;
|
|
mArrowLength = 0.0f;
|
|
|
|
mpOwnerPane = nullptr;
|
|
|
|
field_0x54F4 = 0;
|
|
field_0x54F8 = -1;
|
|
mDemoFrame = 0;
|
|
field_0x5500 = 0;
|
|
field_0x54F0 = LytDoButtonRelated::ACT_IE_NONE;
|
|
field_0x54E4 = LytDoButtonRelated::ACT_IE_NONE;
|
|
field_0x54E8 = LytDoButtonRelated::ACT_IE_NONE;
|
|
field_0x54D8 = 15;
|
|
field_0x5505 = 0;
|
|
field_0x54EC = 1;
|
|
field_0x5504 = 0;
|
|
field_0x5508 = 0;
|
|
field_0x5509 = 0;
|
|
field_0x550A = 0;
|
|
|
|
field_0x5506 = getPane()->IsVisible();
|
|
field_0x5507 = 0;
|
|
field_0x550B = 0;
|
|
|
|
mAnm[DOWSING_ANIM_IN].setForwardOnce();
|
|
mAnm[DOWSING_ANIM_IN].setFrame(0.0f);
|
|
mAnm[DOWSING_ANIM_IN].setAnimEnable(true);
|
|
|
|
mAnm[DOWSING_ANIM_CALL].setToEnd();
|
|
mAnm[DOWSING_ANIM_CALL].setAnimEnable(true);
|
|
|
|
mAnm[DOWSING_ANIM_INPUT_1].setForwardOnce();
|
|
mAnm[DOWSING_ANIM_INPUT_1].setToEnd2();
|
|
mAnm[DOWSING_ANIM_INPUT_1].setAnimEnable(true);
|
|
mAnm[DOWSING_ANIM_TEXT].setAnimEnable(true);
|
|
|
|
setMessage(field_0x54E4);
|
|
|
|
mAnm[DOWSING_ANIM_TEXT].setFrame(0.0f);
|
|
|
|
mLyt.calc();
|
|
|
|
mAnm[DOWSING_ANIM_IN].setAnimEnable(false);
|
|
mAnm[DOWSING_ANIM_CALL].setAnimEnable(false);
|
|
mAnm[DOWSING_ANIM_INPUT_1].setAnimEnable(false);
|
|
mAnm[DOWSING_ANIM_LOOP].setAnimEnable(true);
|
|
|
|
mStateMgr.changeState(StateID_Invisible);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool dLytMeterDowsing_c::remove() {
|
|
for (d2d::SubPaneList::Iterator it = mSubpaneList.GetBeginIter(); it != mSubpaneList.GetEndIter(); ++it) {
|
|
if (!it->mpLytPane->LytMeter0x24()) {
|
|
continue;
|
|
}
|
|
// @bug checking nullptr after invoking virtual function on 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 < DOWSING_NUM_ITEMS + 1; i++) {
|
|
mSubpanes[i].mpLytPane->remove();
|
|
}
|
|
|
|
for (int i = 0; i < DOWSING_NUM_ANIMS; i++) {
|
|
mAnm[i].unbind();
|
|
mAnm[i].remove();
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool dLytMeterDowsing_c::execute() {
|
|
if (dLytControlGame_c::getInstance()->isStateNormal()) {
|
|
if (StoryflagManager::sInstance->getCounterOrFlag(STORYFLAG_C_BTN_NOTICE) &&
|
|
LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) != LytDoButtonRelated::ACT_IE_NONE) {
|
|
if (dLytMeter_c::GetMain()->fn_800D5380(0)) {
|
|
field_0x5508 = 0;
|
|
StoryflagManager::sInstance->unsetFlag(STORYFLAG_C_BTN_NOTICE);
|
|
if (getSelectedDowsingSlot() != DowsingTarget::SLOT_NONE) {
|
|
if (LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) ==
|
|
LytDoButtonRelated::ACT_IE_INFO_DOWSE) {
|
|
StoryflagManager::sInstance->unsetFlag(STORYFLAG_DOWSING_NOTICE);
|
|
}
|
|
}
|
|
} else {
|
|
field_0x5508 = 1;
|
|
}
|
|
} else if (StoryflagManager::sInstance->getCounterOrFlag(STORYFLAG_DOWSING_NOTICE) &&
|
|
LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) == LytDoButtonRelated::ACT_IE_INFO_DOWSE) {
|
|
if (field_0x5505 != 0 || field_0x550A != 0) {
|
|
field_0x5508 = 0;
|
|
StoryflagManager::sInstance->unsetFlag(STORYFLAG_DOWSING_NOTICE);
|
|
} else {
|
|
field_0x5508 = 1;
|
|
}
|
|
}
|
|
} else {
|
|
field_0x5508 = 0;
|
|
}
|
|
|
|
bool newVisible = getPane()->IsVisible();
|
|
if (field_0x5506 != newVisible) {
|
|
field_0x5506 = newVisible;
|
|
if (!newVisible) {
|
|
field_0x5507 = 1;
|
|
}
|
|
}
|
|
|
|
if (mpOwnerPane == nullptr) {
|
|
return true;
|
|
}
|
|
|
|
if (!mpOwnerPane->IsVisible()) {
|
|
if (*mStateMgr.getStateID() != StateID_DemoMove && *mStateMgr.getStateID() != StateID_DemoOut &&
|
|
field_0x550B != 0) {
|
|
mpPanes[DOWSING_PANE_INPUT_00]->SetVisible(true);
|
|
mpPanes[DOWSING_PANE_INPUT_01]->SetVisible(true);
|
|
if (mAnm[DOWSING_ANIM_INPUT_0].isEnabled()) {
|
|
mAnm[DOWSING_ANIM_INPUT_0].setFrame(0.0f);
|
|
mLyt.calc();
|
|
mAnm[DOWSING_ANIM_INPUT_0].setAnimEnable(false);
|
|
}
|
|
field_0x550B = 0;
|
|
mStateMgr.changeState(StateID_Reset);
|
|
}
|
|
|
|
if (*mStateMgr.getStateID() == StateID_MenuSelectingIn || *mStateMgr.getStateID() == StateID_MenuSelecting ||
|
|
*mStateMgr.getStateID() == StateID_MenuSelectingOut) {
|
|
mStateMgr.changeState(StateID_Reset);
|
|
}
|
|
|
|
if (*mStateMgr.getStateID() == StateID_Wait) {
|
|
field_0x5507 = 1;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
if (field_0x5506 == 0) {
|
|
return true;
|
|
}
|
|
|
|
fn_800FE110();
|
|
bool state = false;
|
|
s32 action = dLytDobutton_c::getFn0x8010E5E0();
|
|
if (action == 8 || action == 10 || action == 30) {
|
|
LytDoButtonRelated::Act_IE_e action = LytDoButtonRelated::convertDoButton(dLytDobutton_c::getAction());
|
|
if (action >= 0) {
|
|
state = true;
|
|
LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_C, action);
|
|
}
|
|
}
|
|
field_0x54E8 = LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C);
|
|
field_0x54EC = LytDoButtonRelated::getHas(LytDoButtonRelated::DO_BUTTON_C) &&
|
|
dLytMeter_c::GetInstance()->checkAllFlags(METER_BTN_C);
|
|
if (*mStateMgr.getStateID() != StateID_ToUnuse &&
|
|
(dLytMeter_c::GetMain()->getUiMode() == 0 || field_0x54E8 != 0x51)) {
|
|
if (field_0x54E8 != field_0x54E4) {
|
|
if (field_0x5500 != 0) {
|
|
field_0x54E4 = field_0x54E8;
|
|
setMessage(field_0x54E8);
|
|
} else {
|
|
field_0x5500 += 1;
|
|
}
|
|
} else {
|
|
field_0x5500 = 0;
|
|
}
|
|
} else {
|
|
field_0x5500 = 0;
|
|
}
|
|
|
|
mStateMgr.executeState();
|
|
|
|
if (field_0x5504 != state) {
|
|
if (state) {
|
|
mAnm[DOWSING_ANIM_TEXT].setFrame(1.0f);
|
|
} else {
|
|
mAnm[DOWSING_ANIM_TEXT].setFrame(0.0f);
|
|
}
|
|
field_0x5504 = state;
|
|
}
|
|
|
|
if (field_0x5508 != 0) {
|
|
if (field_0x5509 == 0) {
|
|
mAnm[DOWSING_ANIM_CALL].setToEnd();
|
|
mAnm[DOWSING_ANIM_CALL].setAnimEnable(true);
|
|
field_0x5509 = 1;
|
|
}
|
|
if (mAnm[DOWSING_ANIM_CALL].isEnabled()) {
|
|
mAnm[DOWSING_ANIM_CALL].play();
|
|
if (dLytMeter_c::GetInstance()->checkAllFlags(METER_BTN_C) && mAnm[DOWSING_ANIM_CALL].getFrame() == 1.0f) {
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_C_BUTTON_BLINK);
|
|
}
|
|
}
|
|
} else if (field_0x5509 == 1) {
|
|
mAnm[DOWSING_ANIM_CALL].setToEnd();
|
|
} else if (mAnm[DOWSING_ANIM_CALL].isEnabled()) {
|
|
mAnm[DOWSING_ANIM_CALL].setAnimEnable(false);
|
|
}
|
|
|
|
if (field_0x5508 == 0) {
|
|
field_0x5509 = field_0x5508;
|
|
}
|
|
field_0x5508 = 0;
|
|
|
|
for (int i = 0; i < DOWSING_NUM_ITEMS; i++) {
|
|
mIcon[i].execute();
|
|
}
|
|
|
|
if (mLyt.findPane("N_setBtn_00")->IsVisible()) {
|
|
mBlink.execute();
|
|
mInput.execute();
|
|
|
|
if (mAnm[DOWSING_ANIM_INPUT_1].isEnabled()) {
|
|
mLyt.getLayout()->Animate(0);
|
|
mLyt.calc();
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < 2; i++) {
|
|
mText[i].execute();
|
|
}
|
|
|
|
// Rotate the arrow
|
|
mVec3_c t1(0.0f, 0.0f, 0.0f);
|
|
t1.z = mArrowRotation;
|
|
mpPanes[DOWSING_PANE_ITEM_ARROW]->SetRotate(t1);
|
|
// But rotate the button and the pointer back so that
|
|
// they point up
|
|
mVec3_c t2(0.0f, 0.0f, 0.0f);
|
|
t2.z = -mArrowRotation;
|
|
mpPanes[DOWSING_PANE_ARROW_HAND]->SetRotate(t2);
|
|
mpPanes[DOWSING_PANE_N_BTN_0]->SetRotate(t2);
|
|
|
|
f32 frame = mAnm[DOWSING_ANIM_ARROW].getAnimDuration();
|
|
if (mArrowLength < 0.0f) {
|
|
mArrowLength = 0.0f;
|
|
}
|
|
if (mArrowLength > 1.0f) {
|
|
mArrowLength = 1.0f;
|
|
}
|
|
mAnm[DOWSING_ANIM_ARROW].setFrame(frame * mArrowLength);
|
|
mAnm[DOWSING_ANIM_ARROW].setAnimEnable(true);
|
|
|
|
if (mAnm[DOWSING_ANIM_SELECT_LOOP].isEnabled()) {
|
|
mAnm[DOWSING_ANIM_SELECT_LOOP].play();
|
|
}
|
|
|
|
if (mAnm[DOWSING_ANIM_LOOP].isEnabled()) {
|
|
mAnm[DOWSING_ANIM_LOOP].play();
|
|
}
|
|
|
|
for (int i = 0; i < DOWSING_NUM_ITEMS + 1; i++) {
|
|
mSubpanes[i].mpLytPane->execute();
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void dLytMeterDowsing_c::fn_800FE110() {
|
|
bool anySelected = false;
|
|
s32 selectedIdx = -1;
|
|
for (int i = 0; i < DOWSING_NUM_ITEMS; i++) {
|
|
DowsingTarget::DowsingSlot slot = dowsingSlotForIndex(i);
|
|
if (field_0x54E0 == slot && field_0x54F4 == 0 && slot != DowsingTarget::SLOT_NONE &&
|
|
DowsingTarget::hasDowsingInSlot(slot)) {
|
|
mIcon[i].setShouldBeSelect(true);
|
|
anySelected = true;
|
|
selectedIdx = i;
|
|
} else {
|
|
mIcon[i].setShouldBeSelect(false);
|
|
}
|
|
}
|
|
|
|
setItemName(selectedIdx);
|
|
|
|
if (anySelected) {
|
|
mBlink.setShouldBeSelect(true);
|
|
mText[0].setShouldBeSelect(true);
|
|
} else {
|
|
mBlink.setShouldBeSelect(false);
|
|
mText[0].setShouldBeSelect(false);
|
|
}
|
|
|
|
if (dLytMeter_c::GetInstance()->getMeterField_0x1377F() != 0 && field_0x550A == 0) {
|
|
mInput.setShouldBeSelect(true);
|
|
} else {
|
|
mInput.setShouldBeSelect(false);
|
|
}
|
|
}
|
|
|
|
void dLytMeterDowsing_c::fn_800FE220() {
|
|
if (getSelectedDowsingSlot() != DowsingTarget::SLOT_NONE &&
|
|
LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) == LytDoButtonRelated::ACT_IE_INFO_DOWSE &&
|
|
dLytMeter_c::GetMain()->fn_800D5380(0) && !dLytMeter_c::GetMain()->fn_800D5650() &&
|
|
!dLytMeter_c::GetMain()->fn_800D5680()) {
|
|
mAnm[DOWSING_ANIM_RESET].setAnimEnable(true);
|
|
mAnm[DOWSING_ANIM_RESET].setForwardOnce();
|
|
mAnm[DOWSING_ANIM_RESET].setToStart();
|
|
mItemIcons[0].setItem(convertToLytIndex(getSelectedDowsingSlot()));
|
|
mLyt.calc();
|
|
mAnm[DOWSING_ANIM_RESET].setAnimEnable(false);
|
|
mLyt.findPane("N_bBtnText_00")->SetVisible(true);
|
|
mLyt.findPane("N_bBtnText_00")->SetAlpha(255);
|
|
} else {
|
|
mAnm[DOWSING_ANIM_RESET].setAnimEnable(true);
|
|
mAnm[DOWSING_ANIM_RESET].setForwardOnce();
|
|
mAnm[DOWSING_ANIM_RESET].setToEnd2();
|
|
mLyt.calc();
|
|
mAnm[DOWSING_ANIM_RESET].setAnimEnable(false);
|
|
}
|
|
}
|
|
|
|
bool dLytMeterDowsing_c::fn_800FE3C0(s32 arg) {
|
|
if (field_0x54F4 == 0) {
|
|
field_0x54F4 = 1;
|
|
field_0x54F8 = arg;
|
|
mDemoFrame = 0;
|
|
mArrowRotation = 0.0f;
|
|
mArrowLength = 0.0f;
|
|
for (int i = 0; i < DOWSING_NUM_ITEMS; i++) {
|
|
mIcon[i].init();
|
|
}
|
|
mpPanes[DOWSING_PANE_INPUT_00]->SetVisible(false);
|
|
mpPanes[DOWSING_PANE_INPUT_01]->SetVisible(false);
|
|
} else if (field_0x54F4 == 4) {
|
|
field_0x54F4 = 0;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool dLytMeterDowsing_c::fn_800FE490() const {
|
|
return field_0x54F4 != 0;
|
|
}
|
|
|
|
bool dLytMeterDowsing_c::fn_800FE4B0() const {
|
|
if (field_0x5505 != 0 || field_0x54E0 < 8) {
|
|
if (*mStateMgr.getStateID() == StateID_ToUse || *mStateMgr.getStateID() == StateID_Wait) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return *mStateMgr.getStateID() == StateID_MenuSelectingIn || *mStateMgr.getStateID() == StateID_MenuSelecting ||
|
|
*mStateMgr.getStateID() == StateID_MenuSelectingOut;
|
|
}
|
|
|
|
bool dLytMeterDowsing_c::fn_800FE610() {
|
|
if ((!dLytMeter_c::GetMain()->getDowsingNotHiddenByAreaCaption() && !dLytAreaCaption_c::getVisible()) ||
|
|
!getPane()->IsVisible() || dLytMeter_c::GetMain()->fn_800D5680()) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
static const s32 lytIndexes[] = {
|
|
LYT_CMN_DowsingInvalid, LYT_CMN_DowsingTreasure, LYT_CMN_DowsingHeart, LYT_CMN_DowsingGoddessCube,
|
|
LYT_CMN_DowsingLook, LYT_CMN_DowsingGratitudeCrystal, LYT_CMN_DowsingInvalid, LYT_CMN_DowsingRupee,
|
|
};
|
|
|
|
s32 dLytMeterDowsing_c::convertToLytIndex(s32 slot) const {
|
|
if (slot == DowsingTarget::SLOT_STORY_EVENT) {
|
|
return DowsingTarget::getTopDowsingIcon();
|
|
} else if (slot == DowsingTarget::SLOT_QUEST) {
|
|
return DowsingTarget::getLeftDowsingIcon();
|
|
} else {
|
|
for (s32 i = 0; i < DOWSING_NUM_ITEMS; i++) {
|
|
if (slot == dowsingSlotForIndex(i)) {
|
|
return lytIndexes[i];
|
|
}
|
|
}
|
|
return LYT_CMN_DowsingInvalid;
|
|
}
|
|
}
|
|
|
|
u8 dLytMeterDowsing_c::getSelectedDowsingSlot() const {
|
|
if (dLytMeter_c::GetMain()->fn_800D5650()) {
|
|
return DowsingTarget::SLOT_NONE;
|
|
} else {
|
|
return FileManager::GetInstance()->getDowsingSlotIdx();
|
|
}
|
|
}
|
|
|
|
void dLytMeterDowsing_c::setItemName(s32 idx) {
|
|
if (idx >= 0 && field_0x54F4 == 0) {
|
|
mText[1].setShouldBeSelect(true);
|
|
SizedString<32> label;
|
|
label.sprintf("NAME_DOWSING_%03d_R", getDowsingItemIdForIndex(idx));
|
|
mpTextBoxes[0]->setMessageWithGlobalTextProcessor2(label, nullptr);
|
|
mpTextBoxes[1]->setMessageWithGlobalTextProcessor2(label, nullptr);
|
|
mpWindows[1]->UpdateSize(mpSizeBoxes[1], 32.0f);
|
|
} else {
|
|
mText[1].setShouldBeSelect(false);
|
|
}
|
|
}
|
|
|
|
#include "d/lyt/meter/d_lyt_meter_action_table.inc"
|
|
|
|
void dLytMeterDowsing_c::setMessage(s32 id) {
|
|
char buf[11];
|
|
for (int i = 0; i < 11; i++) {
|
|
buf[i] = 0;
|
|
}
|
|
|
|
if (id < LytDoButtonRelated::ACT_IE_NONE) {
|
|
if (id < LytDoButtonRelated::ACT_IE_SEPARATOR) {
|
|
sprintf(buf, "ACT_INFO_%03d", sActIds[id]);
|
|
} else {
|
|
s32 id2 = id - LytDoButtonRelated::ACT_IE_SEPARATOR - 1;
|
|
sprintf(buf, "ACT_ETC_%03d", sActIds[id2]);
|
|
}
|
|
|
|
for (int i = 2; i <= 3; i++) {
|
|
mpTextBoxes[i]->SetVisible(true);
|
|
mpTextBoxes[i]->setMessageWithGlobalTextProcessor2(buf, nullptr);
|
|
}
|
|
mpWindows[2]->SetVisible(true);
|
|
mpWindows[2]->UpdateSize(mpSizeBoxes[2], 32.0f);
|
|
field_0x54F0 = id;
|
|
} else {
|
|
mpTextBoxes[2]->SetVisible(false);
|
|
mpTextBoxes[3]->SetVisible(false);
|
|
mpWindows[2]->SetVisible(false);
|
|
}
|
|
}
|
|
|
|
s32 dLytMeterDowsing_c::convertSlotIndexToAnm(s32 idx) const {
|
|
if (idx > 4) {
|
|
return idx - 1;
|
|
} else {
|
|
return idx;
|
|
}
|
|
}
|
|
|
|
static const s32 unkTable[] = {0, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 6, 6, 6, 6, 1, 5, 7, 3};
|
|
|
|
s32 dLytMeterDowsing_c::fn_800FE9C0(s32 unkId) const {
|
|
return unkTable[unkId];
|
|
}
|
|
|
|
bool dLytMeterDowsing_c::shouldCall() const {
|
|
if (dLytControlGame_c::getInstance()->isStateNormal() &&
|
|
((StoryflagManager::sInstance->getCounterOrFlag(STORYFLAG_C_BTN_NOTICE) &&
|
|
LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) != LytDoButtonRelated::ACT_IE_NONE) ||
|
|
(StoryflagManager::sInstance->getCounterOrFlag(STORYFLAG_DOWSING_NOTICE) &&
|
|
LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) == LytDoButtonRelated::ACT_IE_INFO_DOWSE))) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|