mirror of
https://github.com/zeldaret/ss
synced 2026-09-02 17:53:15 -04:00
2172 lines
79 KiB
C++
2172 lines
79 KiB
C++
#include "d/lyt/d_lyt_pause_disp_00.h"
|
|
|
|
#include "c/c_math.h"
|
|
#include "d/a/d_a_item.h"
|
|
#include "d/a/d_a_itembase.h"
|
|
#include "d/a/d_a_player.h"
|
|
#include "d/d_cs_base.h"
|
|
#include "d/d_pad_nav.h"
|
|
#include "d/d_rumble.h"
|
|
#include "d/flag/itemflag_manager.h"
|
|
#include "d/flag/storyflag_manager.h"
|
|
#include "d/lyt/d2d.h"
|
|
#include "d/lyt/d_lyt_common_arrow.h"
|
|
#include "d/lyt/d_lyt_common_icon_item_maps.h"
|
|
#include "d/lyt/d_lyt_control_game.h"
|
|
#include "d/lyt/d_lyt_pause.h"
|
|
#include "d/lyt/d_lyt_util_items.h"
|
|
#include "d/lyt/d_textbox.h"
|
|
#include "d/lyt/meter/d_lyt_meter.h"
|
|
#include "d/snd/d_snd_small_effect_mgr.h"
|
|
#include "d/snd/d_snd_wzsound.h"
|
|
#include "m/m_vec.h"
|
|
#include "nw4r/lyt/lyt_group.h"
|
|
#include "nw4r/lyt/lyt_pane.h"
|
|
#include "nw4r/lyt/lyt_types.h"
|
|
#include "nw4r/math/math_types.h"
|
|
#include "sized_string.h"
|
|
#include "toBeSorted/counters/counter.h"
|
|
|
|
#include <limits.h>
|
|
|
|
STATE_DEFINE(dLytPauseDisp00_c, None);
|
|
STATE_DEFINE(dLytPauseDisp00_c, In);
|
|
STATE_DEFINE(dLytPauseDisp00_c, Wait);
|
|
STATE_DEFINE(dLytPauseDisp00_c, Select);
|
|
STATE_DEFINE(dLytPauseDisp00_c, Ring);
|
|
STATE_DEFINE(dLytPauseDisp00_c, GetDemo);
|
|
STATE_DEFINE(dLytPauseDisp00_c, Out);
|
|
|
|
// A matrix controlling navigation with the Nunchuk stick.
|
|
// The row index is the currently selected target, and the row contains
|
|
// the list of targets, one entry per stick direction (starting up and going clockwise)
|
|
//
|
|
// If someone was really bored they could probably replace all of these
|
|
// with constants...
|
|
static const u8 sNavTable1[][8] = {
|
|
{0x00, 0x15, 0x15, 0x0F, 0x08, 0x18, 0x24, 0x24},
|
|
{0x12, 0x11, 0x03, 0x1E, 0x1E, 0x1E, 0x20, 0x20},
|
|
{0x13, 0x1C, 0x1B, 0x1F, 0x1F, 0x1E, 0x02, 0x11},
|
|
{0x08, 0x0A, 0x0A, 0x06, 0x06, 0x00, 0x19, 0x18},
|
|
{0x09, 0x21, 0x21, 0x00, 0x07, 0x07, 0x0B, 0x0B},
|
|
{0x0A, 0x0B, 0x07, 0x07, 0x00, 0x00, 0x1F, 0x04},
|
|
{0x0B, 0x05, 0x05, 0x00, 0x00, 0x06, 0x06, 0x0A},
|
|
{0x01, 0x0F, 0x10, 0x0A, 0x0A, 0x04, 0x18, 0x24},
|
|
{0x15, 0x21, 0x21, 0x05, 0x0B, 0x0B, 0x10, 0x0F},
|
|
{0x08, 0x10, 0x0B, 0x07, 0x06, 0x04, 0x04, 0x08},
|
|
{0x09, 0x09, 0x05, 0x05, 0x07, 0x06, 0x0A, 0x10},
|
|
{0x01, 0x0E, 0x0D, 0x10, 0x08, 0x08, 0x18, 0x01},
|
|
{0x15, 0x15, 0x00, 0x09, 0x09, 0x10, 0x0C, 0x0E},
|
|
{0x00, 0x15, 0x0D, 0x0D, 0x10, 0x0C, 0x0C, 0x01},
|
|
{0x01, 0x15, 0x09, 0x09, 0x10, 0x08, 0x08, 0x01},
|
|
{0x0F, 0x09, 0x09, 0x0B, 0x0A, 0x0A, 0x08, 0x08},
|
|
{0x14, 0x14, 0x13, 0x03, 0x02, 0x02, 0x12, 0x14},
|
|
{0x14, 0x14, 0x11, 0x11, 0x02, 0x20, 0x20, 0x20},
|
|
{0x14, 0x22, 0x1D, 0x1C, 0x03, 0x11, 0x11, 0x14},
|
|
{0x00, 0x22, 0x22, 0x13, 0x11, 0x12, 0x12, 0x00},
|
|
{0x00, 0x00, 0x21, 0x21, 0x09, 0x0F, 0x01, 0x01},
|
|
{0x23, 0x24, 0x17, 0x17, 0x1A, 0x1D, 0x1D, 0x22},
|
|
{0x24, 0x01, 0x01, 0x18, 0x18, 0x1B, 0x16, 0x16},
|
|
{0x17, 0x01, 0x08, 0x04, 0x19, 0x19, 0x1C, 0x17},
|
|
{0x18, 0x18, 0x04, 0x06, 0x1A, 0x1A, 0x1A, 0x1D},
|
|
{0x16, 0x19, 0x19, 0x06, 0x00, 0x1F, 0x1B, 0x00},
|
|
{0x1C, 0x17, 0x1A, 0x1A, 0x1A, 0x1F, 0x03, 0x1C},
|
|
{0x1D, 0x1D, 0x18, 0x1B, 0x1B, 0x03, 0x13, 0x13},
|
|
{0x22, 0x16, 0x16, 0x19, 0x1C, 0x1C, 0x13, 0x14},
|
|
{0x02, 0x03, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x02},
|
|
{0x03, 0x1B, 0x06, 0x00, 0x00, 0x1E, 0x1E, 0x03},
|
|
{0x14, 0x12, 0x12, 0x02, 0x02, 0x00, 0x00, 0x00},
|
|
{0x15, 0x00, 0x00, 0x00, 0x05, 0x05, 0x09, 0x15},
|
|
{0x00, 0x23, 0x23, 0x16, 0x1D, 0x13, 0x14, 0x14},
|
|
{0x00, 0x24, 0x24, 0x17, 0x16, 0x1D, 0x22, 0x22},
|
|
{0x00, 0x01, 0x01, 0x08, 0x17, 0x16, 0x23, 0x23},
|
|
{0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D},
|
|
};
|
|
|
|
static const u8 sNavTable2[][8] = {
|
|
{0x00, 0x15, 0x15, 0x0E, 0x0C, 0x18, 0x24, 0x24},
|
|
{0x12, 0x11, 0x03, 0x1E, 0x1E, 0x1E, 0x20, 0x20},
|
|
{0x13, 0x1C, 0x1B, 0x1F, 0x1F, 0x1E, 0x02, 0x11},
|
|
{0x08, 0x0A, 0x0A, 0x06, 0x06, 0x00, 0x19, 0x18},
|
|
{0x09, 0x21, 0x21, 0x00, 0x07, 0x07, 0x0B, 0x0B},
|
|
{0x0A, 0x0B, 0x07, 0x07, 0x00, 0x00, 0x1F, 0x04},
|
|
{0x0B, 0x05, 0x05, 0x00, 0x00, 0x06, 0x06, 0x0A},
|
|
{0x0C, 0x0C, 0x10, 0x0A, 0x0A, 0x04, 0x18, 0x24},
|
|
{0x0D, 0x21, 0x21, 0x05, 0x0B, 0x0B, 0x10, 0x0D},
|
|
{0x08, 0x10, 0x0B, 0x07, 0x06, 0x04, 0x04, 0x08},
|
|
{0x09, 0x09, 0x05, 0x05, 0x07, 0x06, 0x0A, 0x10},
|
|
{0x01, 0x0E, 0x0D, 0x10, 0x08, 0x08, 0x18, 0x01},
|
|
{0x15, 0x15, 0x21, 0x09, 0x09, 0x10, 0x0C, 0x0E},
|
|
{0x01, 0x15, 0x0D, 0x0D, 0x10, 0x0C, 0x0C, 0x01},
|
|
{0x00, 0x15, 0x00, 0x09, 0x10, 0x08, 0x08, 0x01},
|
|
{0x0E, 0x0D, 0x09, 0x0B, 0x0A, 0x0A, 0x08, 0x0C},
|
|
{0x14, 0x14, 0x13, 0x03, 0x02, 0x02, 0x12, 0x14},
|
|
{0x14, 0x14, 0x11, 0x11, 0x02, 0x20, 0x20, 0x20},
|
|
{0x14, 0x22, 0x1D, 0x1C, 0x03, 0x11, 0x11, 0x14},
|
|
{0x00, 0x22, 0x1D, 0x13, 0x11, 0x12, 0x12, 0x00},
|
|
{0x00, 0x00, 0x21, 0x21, 0x0D, 0x0E, 0x01, 0x01},
|
|
{0x23, 0x24, 0x17, 0x17, 0x1A, 0x1D, 0x1D, 0x22},
|
|
{0x24, 0x01, 0x01, 0x18, 0x18, 0x1B, 0x16, 0x16},
|
|
{0x17, 0x01, 0x08, 0x04, 0x19, 0x19, 0x1C, 0x17},
|
|
{0x18, 0x18, 0x04, 0x06, 0x1A, 0x1A, 0x1A, 0x1D},
|
|
{0x16, 0x19, 0x19, 0x06, 0x00, 0x1F, 0x1B, 0x00},
|
|
{0x1C, 0x17, 0x1A, 0x1A, 0x1A, 0x1F, 0x03, 0x1C},
|
|
{0x1D, 0x1D, 0x18, 0x1B, 0x1B, 0x03, 0x13, 0x13},
|
|
{0x22, 0x16, 0x16, 0x19, 0x1C, 0x1C, 0x13, 0x14},
|
|
{0x02, 0x03, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x02},
|
|
{0x03, 0x1B, 0x06, 0x00, 0x00, 0x1E, 0x1E, 0x03},
|
|
{0x14, 0x12, 0x12, 0x02, 0x02, 0x00, 0x00, 0x00},
|
|
{0x15, 0x00, 0x00, 0x00, 0x05, 0x05, 0x09, 0x15},
|
|
{0x00, 0x23, 0x23, 0x16, 0x1D, 0x13, 0x14, 0x14},
|
|
{0x00, 0x24, 0x24, 0x17, 0x16, 0x1D, 0x22, 0x22},
|
|
{0x00, 0x01, 0x01, 0x08, 0x17, 0x16, 0x23, 0x23},
|
|
{0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D},
|
|
};
|
|
|
|
static const d2d::LytBrlanMapping brlanMap[] = {
|
|
{ "pause_00_in.brlan", "G_inOut_00"},
|
|
{ "pause_00_have.brlan", "G_sekiban_00"},
|
|
{ "pause_00_have.brlan", "G_dauzingA_00"},
|
|
{ "pause_00_have.brlan", "G_dauzingB_00"},
|
|
{ "pause_00_have.brlan", "G_dauzingC_00"},
|
|
{ "pause_00_have.brlan", "G_dauzingD_00"},
|
|
{ "pause_00_have.brlan", "G_dauzingE_00"},
|
|
{ "pause_00_have.brlan", "G_dauzingF_00"},
|
|
{ "pause_00_have.brlan", "G_dauzingG_00"},
|
|
{ "pause_00_have.brlan", "G_dauzingH_00"},
|
|
{ "pause_00_have.brlan", "G_itemA_00"},
|
|
{ "pause_00_have.brlan", "G_itemB_00"},
|
|
{ "pause_00_have.brlan", "G_itemC_00"},
|
|
{ "pause_00_have.brlan", "G_itemD_00"},
|
|
{ "pause_00_have.brlan", "G_itemE_00"},
|
|
{ "pause_00_have.brlan", "G_itemF_00"},
|
|
{ "pause_00_have.brlan", "G_itemG_00"},
|
|
{ "pause_00_have.brlan", "G_itemH_00"},
|
|
{ "pause_00_have.brlan", "G_poachA_00"},
|
|
{ "pause_00_have.brlan", "G_poachB_00"},
|
|
{ "pause_00_have.brlan", "G_poachC_00"},
|
|
{ "pause_00_have.brlan", "G_poachD_00"},
|
|
{ "pause_00_have.brlan", "G_poachE_00"},
|
|
{ "pause_00_have.brlan", "G_poachF_00"},
|
|
{ "pause_00_have.brlan", "G_poachG_00"},
|
|
{ "pause_00_have.brlan", "G_poachH_00"},
|
|
{ "pause_00_have.brlan", "G_heart_00"},
|
|
{ "pause_00_have.brlan", "G_saifu_00"},
|
|
{ "pause_00_have.brlan", "G_parashoru_00"},
|
|
{ "pause_00_have.brlan", "G_mogura_00"},
|
|
{ "pause_00_have.brlan", "G_uroko_00"},
|
|
{ "pause_00_have.brlan", "G_ring_00"},
|
|
{ "pause_00_have.brlan", "G_muse_00"},
|
|
{ "pause_00_have.brlan", "G_muse_01"},
|
|
{ "pause_00_have.brlan", "G_muse_02"},
|
|
{ "pause_00_have.brlan", "G_muse_03"},
|
|
{ "pause_00_have.brlan", "G_muse_04"},
|
|
{ "pause_00_have.brlan", "G_muse_05"},
|
|
{ "pause_00_have.brlan", "G_muse_06"},
|
|
{ "pause_00_have.brlan", "G_muse_07"},
|
|
{ "pause_00_have.brlan", "G_musicSet_00"},
|
|
{ "pause_00_have.brlan", "G_harp_00"},
|
|
{ "pause_00_have.brlan", "G_UITypeBtn_00"},
|
|
{ "pause_00_have.brlan", "G_miToTane_00"},
|
|
{ "pause_00_have.brlan", "G_shiren_00"},
|
|
{ "pause_00_have.brlan", "G_force_00"},
|
|
{ "pause_00_have.brlan", "G_force_01"},
|
|
{ "pause_00_have.brlan", "G_force_02"},
|
|
{ "pause_00_have.brlan", "G_forceBg_00"},
|
|
{ "pause_00_onOff.brlan", "G_sekiban_00"},
|
|
{ "pause_00_onOff.brlan", "G_heart_00"},
|
|
{ "pause_00_onOff.brlan", "G_saifu_00"},
|
|
{ "pause_00_onOff.brlan", "G_parashoru_00"},
|
|
{ "pause_00_onOff.brlan", "G_mogura_00"},
|
|
{ "pause_00_onOff.brlan", "G_uroko_00"},
|
|
{ "pause_00_onOff.brlan", "G_ring_00"},
|
|
{ "pause_00_onOff.brlan", "G_muse_00"},
|
|
{ "pause_00_onOff.brlan", "G_muse_01"},
|
|
{ "pause_00_onOff.brlan", "G_muse_02"},
|
|
{ "pause_00_onOff.brlan", "G_muse_03"},
|
|
{ "pause_00_onOff.brlan", "G_muse_04"},
|
|
{ "pause_00_onOff.brlan", "G_muse_05"},
|
|
{ "pause_00_onOff.brlan", "G_muse_06"},
|
|
{ "pause_00_onOff.brlan", "G_muse_07"},
|
|
{ "pause_00_onOff.brlan", "G_harp_00"},
|
|
{ "pause_00_onOff.brlan", "G_sword_00"},
|
|
{ "pause_00_onOff.brlan", "G_dauzingA_00"},
|
|
{ "pause_00_onOff.brlan", "G_dauzingB_00"},
|
|
{ "pause_00_onOff.brlan", "G_dauzingC_00"},
|
|
{ "pause_00_onOff.brlan", "G_dauzingD_00"},
|
|
{ "pause_00_onOff.brlan", "G_dauzingE_00"},
|
|
{ "pause_00_onOff.brlan", "G_dauzingF_00"},
|
|
{ "pause_00_onOff.brlan", "G_dauzingG_00"},
|
|
{ "pause_00_onOff.brlan", "G_dauzingH_00"},
|
|
{ "pause_00_onOff.brlan", "G_itemA_00"},
|
|
{ "pause_00_onOff.brlan", "G_itemB_00"},
|
|
{ "pause_00_onOff.brlan", "G_itemC_00"},
|
|
{ "pause_00_onOff.brlan", "G_itemD_00"},
|
|
{ "pause_00_onOff.brlan", "G_itemE_00"},
|
|
{ "pause_00_onOff.brlan", "G_itemF_00"},
|
|
{ "pause_00_onOff.brlan", "G_itemG_00"},
|
|
{ "pause_00_onOff.brlan", "G_itemH_00"},
|
|
{ "pause_00_onOff.brlan", "G_poachA_00"},
|
|
{ "pause_00_onOff.brlan", "G_poachB_00"},
|
|
{ "pause_00_onOff.brlan", "G_poachC_00"},
|
|
{ "pause_00_onOff.brlan", "G_poachD_00"},
|
|
{ "pause_00_onOff.brlan", "G_poachE_00"},
|
|
{ "pause_00_onOff.brlan", "G_poachF_00"},
|
|
{ "pause_00_onOff.brlan", "G_poachG_00"},
|
|
{ "pause_00_onOff.brlan", "G_poachH_00"},
|
|
{ "pause_00_onOff.brlan", "G_tryForce_00"},
|
|
{ "pause_00_onOff.brlan", "G_shiren_00"},
|
|
{ "pause_00_onOff.brlan", "G_miToTane_00"},
|
|
{ "pause_00_onOff.brlan", "G_text_00"},
|
|
{ "pause_00_onOff.brlan", "G_calibBtn_00"},
|
|
{ "pause_00_bocoburin.brlan", "G_paraBoco_00"},
|
|
{ "pause_00_bocoburin.brlan", "G_moguraBoco_00"},
|
|
{ "pause_00_bocoburin.brlan", "G_urokoBoco_00"},
|
|
{ "pause_00_bocoburin.brlan", "G_harpBoco_00"},
|
|
{ "pause_00_bocoburin.brlan", "G_swordBoco_00"},
|
|
{ "pause_00_itemArrow.brlan", "G_itemArrow_00"},
|
|
{ "pause_00_toPoach.brlan", "G_ringChange_00"},
|
|
{ "pause_00_toSword.brlan", "G_ringChange_00"},
|
|
{ "pause_00_toItem.brlan", "G_ringChange_00"},
|
|
{ "pause_00_sword.brlan", "G_sword_00"},
|
|
{ "pause_00_sekiban.brlan", "G_sekiban_00"},
|
|
{ "pause_00_heart.brlan", "G_heart_00"},
|
|
{ "pause_00_saifu.brlan", "G_saifu_00"},
|
|
{ "pause_00_mogura.brlan", "G_mogura_00"},
|
|
{ "pause_00_out.brlan", "G_inOut_00"},
|
|
{ "pause_00_onOff.brlan", "G_UITypeBtn_00"},
|
|
{ "pause_00_btnDecide.brlan", "G_UITypeBtn_00"},
|
|
{ "pause_00_btnDecide.brlan", "G_calibBtn_00"},
|
|
{ "pause_00_UIType.brlan", "G_UIType_00"},
|
|
{ "pause_00_call.brlan", "G_UITypeCall_00"},
|
|
{ "pause_00_miToTane.brlan", "G_miToTane_00"},
|
|
{ "pause_00_loop.brlan", "G_loop_00"},
|
|
{ "pause_00_scrollRIn.brlan", "G_scroll_00"},
|
|
{"pause_00_scrollROut.brlan", "G_scroll_00"},
|
|
{ "pause_00_scrollLIn.brlan", "G_scroll_00"},
|
|
{"pause_00_scrollLOut.brlan", "G_scroll_00"},
|
|
{ "pause_00_dauzType.brlan", "G_dauzType_00"},
|
|
{ "pause_00_off.brlan", "G_leftTab_00"},
|
|
{ "pause_00_off.brlan", "G_centerTab_00"},
|
|
{ "pause_00_off.brlan", "G_rightTab_00"},
|
|
{ "pause_00_tabV.brlan", "G_tabV_00"},
|
|
};
|
|
|
|
#define PAUSE_DISP_00_ANIM_IN 0
|
|
#define PAUSE_DISP_00_ANIM_HAVE_TABLET 1
|
|
#define PAUSE_DISP_00_ANIM_HAVE_DOWSING_OFFSET 2
|
|
#define PAUSE_DISP_00_ANIM_HAVE_ITEM_OFFSET 10
|
|
#define PAUSE_DISP_00_ANIM_HAVE_POUCH_OFFSET 18
|
|
#define PAUSE_DISP_00_ANIM_HAVE_HEART 26
|
|
#define PAUSE_DISP_00_ANIM_HAVE_POUCH 27
|
|
#define PAUSE_DISP_00_ANIM_HAVE_PARACHUTE 28
|
|
#define PAUSE_DISP_00_ANIM_HAVE_MITTS 29
|
|
#define PAUSE_DISP_00_ANIM_HAVE_SCALE 30
|
|
#define PAUSE_DISP_00_ANIM_HAVE_RING 31
|
|
#define PAUSE_DISP_00_ANIM_HAVE_MUSE_OFFSET 32
|
|
#define PAUSE_DISP_00_ANIM_HAVE_MUSE_PART_OFFSET 36
|
|
#define PAUSE_DISP_00_ANIM_HAVE_MUSE_07 39
|
|
#define PAUSE_DISP_00_ANIM_HAVE_MUSIC_SET 40
|
|
#define PAUSE_DISP_00_ANIM_HAVE_HARP 41
|
|
#define PAUSE_DISP_00_ANIM_HAVE_UITYPE_BTN 42
|
|
#define PAUSE_DISP_00_ANIM_HAVE_MI_TO_TANE 43
|
|
#define PAUSE_DISP_00_ANIM_HAVE_SHIREN 44
|
|
#define PAUSE_DISP_00_ANIM_HAVE_FORCE_OFFSET 45
|
|
#define PAUSE_DISP_00_ANIM_HAVE_FORCE_BG 48
|
|
#define PAUSE_DISP_00_ANIM_ONOFF_TABLET 49
|
|
#define PAUSE_DISP_00_ANIM_ONOFF_HEART 50
|
|
#define PAUSE_DISP_00_ANIM_ONOFF_POUCH 51
|
|
#define PAUSE_DISP_00_ANIM_ONOFF_PARACHUTE 52
|
|
#define PAUSE_DISP_00_ANIM_ONOFF_MITTS 53
|
|
#define PAUSE_DISP_00_ANIM_ONOFF_SCALE 54
|
|
#define PAUSE_DISP_00_ANIM_ONOFF_RING 55
|
|
#define PAUSE_DISP_00_ANIM_ONOFF_MUSE_OFFSET 56
|
|
#define PAUSE_DISP_00_ANIM_ONOFF_HARP 64
|
|
#define PAUSE_DISP_00_ANIM_ONOFF_SWORD 65
|
|
#define PAUSE_DISP_00_ANIM_ONOFF_DOWSING_OFFSET 66
|
|
#define PAUSE_DISP_00_ANIM_ONOFF_ITEM_OFFSET 74
|
|
#define PAUSE_DISP_00_ANIM_ONOFF_POUCH_OFFSET 82
|
|
#define PAUSE_DISP_00_ANIM_ONOFF_TRIFORCE 90
|
|
#define PAUSE_DISP_00_ANIM_ONOFF_SHIREN 91
|
|
#define PAUSE_DISP_00_ANIM_ONOFF_MI_TO_TANE 92
|
|
#define PAUSE_DISP_00_ANIM_ONOFF_TEXT 93
|
|
#define PAUSE_DISP_00_ANIM_ONOFF_CALIB_BTN 94
|
|
#define PAUSE_DISP_00_ANIM_BOCO_PARACHUTE 95
|
|
#define PAUSE_DISP_00_ANIM_BOCO_MITTS 96
|
|
#define PAUSE_DISP_00_ANIM_BOCO_SCALE 97
|
|
#define PAUSE_DISP_00_ANIM_BOCO_HARP 98
|
|
#define PAUSE_DISP_00_ANIM_BOCO_SWORD 99
|
|
#define PAUSE_DISP_00_ANIM_ITEM_ARROW 100
|
|
#define PAUSE_DISP_00_ANIM_RING_TO_POUCH 101
|
|
#define PAUSE_DISP_00_ANIM_RING_TO_SWORD 102
|
|
#define PAUSE_DISP_00_ANIM_RING_TO_ITEM 103
|
|
#define PAUSE_DISP_00_ANIM_SWORD 104
|
|
#define PAUSE_DISP_00_ANIM_TABLETS 105
|
|
#define PAUSE_DISP_00_ANIM_HEART 106
|
|
#define PAUSE_DISP_00_ANIM_POUCH 107
|
|
#define PAUSE_DISP_00_ANIM_MITTS 108
|
|
#define PAUSE_DISP_00_ANIM_OUT 109
|
|
#define PAUSE_DISP_00_ANIM_UI_TYPE_BTN 110
|
|
#define PAUSE_DISP_00_ANIM_DECIDE_UI_TYPE_BTN 111
|
|
#define PAUSE_DISP_00_ANIM_DECIDE_CALIB_BTN 112
|
|
#define PAUSE_DISP_00_ANIM_UI_TYPE 113
|
|
#define PAUSE_DISP_00_ANIM_CALL 114
|
|
#define PAUSE_DISP_00_ANIM_MI_TO_TANE 115
|
|
#define PAUSE_DISP_00_ANIM_LOOP 116
|
|
#define PAUSE_DISP_00_ANIM_SCROLL_R_IN 117
|
|
#define PAUSE_DISP_00_ANIM_SCROLL_R_OUT 118
|
|
#define PAUSE_DISP_00_ANIM_SCROLL_L_IN 119
|
|
#define PAUSE_DISP_00_ANIM_SCROLL_L_OUT 120
|
|
#define PAUSE_DISP_00_ANIM_DOWSING_TYPE 121
|
|
#define PAUSE_DISP_00_ANIM_OFF_LEFT_TAB 122
|
|
#define PAUSE_DISP_00_ANIM_OFF_CENTER_TAB 123
|
|
#define PAUSE_DISP_00_ANIM_OFF_RIGHT_TAB 124
|
|
#define PAUSE_DISP_00_ANIM_TAB_V 125
|
|
|
|
#define PAUSE_DISP_00_NUM_ANIMS 126
|
|
|
|
#define PAUSE_DISP_00_ANIM_RING_BASE PAUSE_DISP_00_ANIM_RING_TO_POUCH
|
|
#define PAUSE_DISP_00_ANIM_ITEM_OFFSET PAUSE_DISP_00_ANIM_ONOFF_DOWSING_OFFSET
|
|
|
|
#define PAUSE_DISP_00_NUM_SUBPANES 24
|
|
|
|
#define navTargetToBounding(n) ((s32)(n - 1))
|
|
#define boundingToNavTarget(n) ((s32)(n + 1))
|
|
|
|
// clang-format off
|
|
static const u8 iconVariants[] = {
|
|
// Wheel
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
// Dowsing
|
|
2, 2, 2, 2, 2, 2, 2, 2,
|
|
// Pouch
|
|
1, 1, 1, 1, 1, 1, 1, 1,
|
|
};
|
|
// clang-format on
|
|
|
|
static const char *sGroupName = "G_ref_00";
|
|
|
|
static const char *sBoundingNames[] = {
|
|
"B_sekiban_00", "B_heart_00", "B_saifu_00", "B_parashoru_00", "B_mogura_00", "B_uroko_00",
|
|
"B_ring_00", "B_muse_00", "B_muse_01", "B_muse_02", "B_muse_03", "B_muse_04",
|
|
"B_muse_05", "B_muse_06", "B_muse_07", "B_harp_00", "B_sword_00", "B_swordFire_00",
|
|
"B_swordFire_01", "B_swordFire_02", "B_shiren_00", "B_ringA_00", "B_ringB_00", "B_ringC_00",
|
|
"B_ringD_00", "B_ringE_00", "B_ringF_00", "B_ringG_00", "B_ringH_00", "B_UIType_00",
|
|
"B_calibBtn_00", "B_calibBtn_00", "B_calibBtn_00", "B_leftTab_00", "B_centerTab_00", "B_rightTab_00",
|
|
"B_calibBtn_00",
|
|
};
|
|
|
|
#define PAUSE_DISP_00_BOUNDING_TABLETS 0
|
|
#define PAUSE_DISP_00_BOUNDING_HEART 1
|
|
#define PAUSE_DISP_00_BOUNDING_POUCH 2
|
|
#define PAUSE_DISP_00_BOUNDING_PARACHUTE 3
|
|
#define PAUSE_DISP_00_BOUNDING_MITTS 4
|
|
#define PAUSE_DISP_00_BOUNDING_SCALE 5
|
|
#define PAUSE_DISP_00_BOUNDING_RING 6
|
|
#define PAUSE_DISP_00_BOUNDING_MUSE_OFFSET 7
|
|
#define PAUSE_DISP_00_BOUNDING_MUSE_07 14
|
|
#define PAUSE_DISP_00_BOUNDING_HARP 15
|
|
#define PAUSE_DISP_00_BOUNDING_SWORD 16
|
|
#define PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET 17
|
|
#define PAUSE_DISP_00_BOUNDING_SHIREN 20
|
|
#define PAUSE_DISP_00_BOUNDING_RING_OFFSET 21
|
|
#define PAUSE_DISP_00_BOUNDING_UI_TYPE 29
|
|
#define PAUSE_DISP_00_BOUNDING_CALIB_BTN_0 30
|
|
#define PAUSE_DISP_00_BOUNDING_ARROW_LEFT 31
|
|
#define PAUSE_DISP_00_BOUNDING_ARROW_RIGHT 32
|
|
#define PAUSE_DISP_00_BOUNDING_LEFT_TAB 33
|
|
#define PAUSE_DISP_00_BOUNDING_CENTER_TAB 34
|
|
#define PAUSE_DISP_00_BOUNDING_RIGHT_TAB 35
|
|
#define PAUSE_DISP_00_BOUNDING_CALIB_BTN_3 36
|
|
|
|
#define PAUSE_DISP_00_BOUNDING_ARROW_OFFSET PAUSE_DISP_00_BOUNDING_ARROW_LEFT
|
|
|
|
#define PAUSE_DISP_00_NUM_BOUNDINGS 37
|
|
|
|
// TODO - constants to maybe move elsewhere
|
|
#define PAUSE_DISP_00_NUM_SONG_PARTS 3
|
|
|
|
#define PAUSE_DISP_00_ICONS_B_WHEEL_OFFSET 0
|
|
#define PAUSE_DISP_00_ICONS_DOWSING_OFFSET 8
|
|
#define PAUSE_DISP_00_ICONS_POUCH_OFFSET 16
|
|
#define PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL 8
|
|
|
|
dLytPauseDisp00_c::dLytPauseDisp00_c() : mStateMgr(*this) {}
|
|
|
|
bool dLytPauseDisp00_c::build() {
|
|
dLytPauseMgr_c *pauseMgr = dLytPauseMgr_c::GetInstance();
|
|
d2d::ResAccIf_c *resAcc = pauseMgr->getResAcc1();
|
|
mLyt.setResAcc(resAcc);
|
|
mLyt.build("pause_00.brlyt", nullptr);
|
|
mLyt.setPriority(0x86);
|
|
|
|
for (int i = 0; i < PAUSE_DISP_00_NUM_ANIMS; i++) {
|
|
mAnm[i].init(brlanMap[i].mFile, resAcc, mLyt.getLayout(), brlanMap[i].mName);
|
|
}
|
|
|
|
resAcc = pauseMgr->getResAcc2();
|
|
|
|
for (int i = 0; i < PAUSE_DISP_00_NUM_SUBPANES; i++) {
|
|
mIcons[i].build(resAcc, iconVariants[i]);
|
|
mSubpanes[i].mpLytPane = &mIcons[i];
|
|
mSubpaneList.PushBack(&mSubpanes[i]);
|
|
}
|
|
|
|
if (mLyt.getLayout()->GetGroupContainer() != nullptr) {
|
|
nw4r::lyt::Group *group = mLyt.getLayout()->GetGroupContainer()->FindGroupByName(sGroupName);
|
|
if (group != nullptr) {
|
|
d2d::dSubPane::linkMeters(group, &mSubpaneList);
|
|
}
|
|
}
|
|
|
|
mCsHitCheck.init(mLyt.getLayout()->GetRootPane(), 1, 0, 0);
|
|
dCsMgr_c::GetInstance()->registCursorTarget(&mCsHitCheck);
|
|
for (int i = 0; i < PAUSE_DISP_00_NUM_BOUNDINGS; i++) {
|
|
if (i != PAUSE_DISP_00_BOUNDING_ARROW_LEFT && i != PAUSE_DISP_00_BOUNDING_ARROW_RIGHT) {
|
|
mpBoundings[i] = mLyt.findBounding(sBoundingNames[i]);
|
|
mpBoundings[i]->SetVisible(true);
|
|
}
|
|
}
|
|
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_ARROW_LEFT] = pauseMgr->getArrowBounding(dLytCommonArrow_c::ARROW_LEFT);
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_ARROW_RIGHT] = pauseMgr->getArrowBounding(dLytCommonArrow_c::ARROW_RIGHT);
|
|
|
|
u8 songLifetreeStatus = getSongLifeTreeStatus();
|
|
if (songLifetreeStatus == SONG_LIFETREE_HAS_SOTH) {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_07, 1.0f);
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSIC_SET, 0.0f);
|
|
} else if (songLifetreeStatus != SONG_LIFETREE_NONE) {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSIC_SET, 1.0f);
|
|
for (int i = 0; i < PAUSE_DISP_00_NUM_SONG_PARTS; i++) {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_PART_OFFSET + i, 1.0f);
|
|
}
|
|
} else {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_07, 0.0f);
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSIC_SET, 0.0f);
|
|
}
|
|
setAnm(PAUSE_DISP_00_ANIM_IN, 0.0f);
|
|
mAnm[PAUSE_DISP_00_ANIM_IN].setFrame(mAnm[PAUSE_DISP_00_ANIM_IN].getAnimDuration());
|
|
|
|
mLyt.calc();
|
|
|
|
stopAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_07);
|
|
stopAnm(PAUSE_DISP_00_ANIM_HAVE_MUSIC_SET);
|
|
stopAnm(PAUSE_DISP_00_ANIM_IN);
|
|
for (int i = 0; i < PAUSE_DISP_00_NUM_SONG_PARTS; i++) {
|
|
stopAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_PART_OFFSET + i);
|
|
}
|
|
|
|
mStateMgr.changeState(StateID_None);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool dLytPauseDisp00_c::remove() {
|
|
dCsMgr_c::GetInstance()->unregistCursorTarget(&mCsHitCheck);
|
|
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 < PAUSE_DISP_00_NUM_SUBPANES; i++) {
|
|
mSubpanes[i].mpLytPane->remove();
|
|
}
|
|
|
|
mLyt.unbindAnims();
|
|
|
|
for (int i = 0; i < PAUSE_DISP_00_NUM_ANIMS; i++) {
|
|
mAnm[i].remove();
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool dLytPauseDisp00_c::execute() {
|
|
dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance();
|
|
mHasSelection = false;
|
|
pause->setField_0x083C(false);
|
|
pause->setField_0x083D(false);
|
|
pause->setField_0x0837(false);
|
|
mStateMgr.executeState();
|
|
executeCall();
|
|
for (int i = 0; i < PAUSE_DISP_00_NUM_SUBPANES; i++) {
|
|
mSubpanes[i].mpLytPane->execute();
|
|
}
|
|
mLyt.calc();
|
|
mCsHitCheck.resetCachedHitboxes();
|
|
mCsHitCheck.execute();
|
|
if (!mStateMgr.getStateID()->isEqual(StateID_None)) {
|
|
mAnm[PAUSE_DISP_00_ANIM_LOOP].play();
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool dLytPauseDisp00_c::draw() {
|
|
if (mIsVisible == true) {
|
|
mLyt.addToDrawList();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void dLytPauseDisp00_c::drawDirectly() {
|
|
mLyt.draw();
|
|
}
|
|
|
|
void dLytPauseDisp00_c::requestIn(bool scroll) {
|
|
mInRequest = true;
|
|
mDoScrollAnim = scroll;
|
|
}
|
|
|
|
void dLytPauseDisp00_c::requestOut(bool scroll) {
|
|
mOutRequest = true;
|
|
mDoScrollAnim = scroll;
|
|
}
|
|
|
|
void dLytPauseDisp00_c::requestSelect() {
|
|
mSelectToggleRequest = true;
|
|
}
|
|
|
|
void dLytPauseDisp00_c::requestRingToggle() {
|
|
mRingToggleRequest = true;
|
|
}
|
|
|
|
void dLytPauseDisp00_c::requestUnselect() {
|
|
mSelectToggleRequest = true;
|
|
}
|
|
|
|
bool dLytPauseDisp00_c::requestSelectGuide() {
|
|
if (mSelectGuideRequest == true) {
|
|
return 0;
|
|
}
|
|
|
|
mSelectGuideRequest = true;
|
|
if (mCallTimerMaybe != 0) {
|
|
mStopCallRequest = true;
|
|
StoryflagManager::sInstance->unsetFlag(STORYFLAG_UI_MODE_NOTICE);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool dLytPauseDisp00_c::requestSelectMpls() {
|
|
if (mSelectMplsRequest == true) {
|
|
return 0;
|
|
}
|
|
|
|
mSelectMplsRequest = true;
|
|
return true;
|
|
}
|
|
|
|
void dLytPauseDisp00_c::initializeState_None() {
|
|
for (int i = 0; i < PAUSE_DISP_00_NUM_ANIMS; i++) {
|
|
mAnm[i].unbind();
|
|
}
|
|
|
|
mIsChangingState = false;
|
|
mInRequest = false;
|
|
mOutRequest = false;
|
|
mIsVisible = false;
|
|
mHasSelection = false;
|
|
mStopCallRequest = false;
|
|
|
|
mCallTimerMaybe = 0;
|
|
mStep = 0;
|
|
mPrevNavTarget = 0;
|
|
mCurrentNavTarget = 0;
|
|
mGetDemoTimer = 0;
|
|
|
|
for (int i = 0; i < PAUSE_DISP_00_NUM_SUBPANES; i++) {
|
|
mIcons[i].reset();
|
|
mIcons[i].setVisible(false);
|
|
}
|
|
|
|
for (int i = 0; i < PAUSE_DISP_00_NUM_BOUNDINGS; i++) {
|
|
mpBoundings[i]->SetVisible(false);
|
|
}
|
|
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_ARROW_LEFT]->SetVisible(true);
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_ARROW_RIGHT]->SetVisible(true);
|
|
|
|
mLyt.findPane("N_itemArrow_00")->SetVisible(false);
|
|
setAnm(PAUSE_DISP_00_ANIM_ITEM_ARROW, 0.0f);
|
|
setAnm(PAUSE_DISP_00_ANIM_RING_BASE + dLytControlGame_c::getInstance()->getPauseDisp00Tab(), 0.0f);
|
|
|
|
StoryflagManager *storyFlagmanager = StoryflagManager::sInstance;
|
|
|
|
// Check which tabs are unlocked
|
|
if (storyFlagmanager->getFlag(STORYFLAG_DOWSING_UNLOCKED)) {
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_LEFT_TAB]->SetVisible(true);
|
|
}
|
|
|
|
if (storyFlagmanager->getFlag(STORYFLAG_POUCH_UNLOCKED)) {
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_CENTER_TAB]->SetVisible(true);
|
|
}
|
|
|
|
if (storyFlagmanager->getFlag(STORYFLAG_B_WHEEL_UNLOCKED)) {
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_RIGHT_TAB]->SetVisible(true);
|
|
}
|
|
|
|
setAnm(PAUSE_DISP_00_ANIM_LOOP, 0.0f);
|
|
mSelectGuideRequest = false;
|
|
mSelectToggleRequest = false;
|
|
mReverseTabChangeAnim = false;
|
|
mRingToggleRequest = false;
|
|
}
|
|
void dLytPauseDisp00_c::executeState_None() {
|
|
if (mInRequest == true) {
|
|
mInRequest = false;
|
|
mStateMgr.changeState(StateID_In);
|
|
}
|
|
}
|
|
void dLytPauseDisp00_c::finalizeState_None() {
|
|
loadRingText(RING_TEXT_INITIAL_TAB);
|
|
}
|
|
|
|
void dLytPauseDisp00_c::initializeState_In() {
|
|
if (mDoScrollAnim == true) {
|
|
dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance();
|
|
setAnm(PAUSE_DISP_00_ANIM_IN, 0.0f);
|
|
mAnm[PAUSE_DISP_00_ANIM_IN].setFrame(mAnm[PAUSE_DISP_00_ANIM_IN].getAnimDuration());
|
|
if (pause->isNavLeft()) {
|
|
setAnm(PAUSE_DISP_00_ANIM_SCROLL_L_IN, 0.0f);
|
|
} else {
|
|
setAnm(PAUSE_DISP_00_ANIM_SCROLL_R_IN, 0.0f);
|
|
}
|
|
|
|
if (pause->getField_0x0840()) {
|
|
if (pause->isNavLeft()) {
|
|
mPrevNavTarget = PAUSE_DISP_00_BOUNDING_ARROW_LEFT + 1;
|
|
} else {
|
|
mPrevNavTarget = PAUSE_DISP_00_BOUNDING_ARROW_RIGHT + 1;
|
|
}
|
|
}
|
|
} else {
|
|
setAnm(PAUSE_DISP_00_ANIM_IN, 0.0f);
|
|
}
|
|
|
|
for (int i = PAUSE_DISP_00_ANIM_ONOFF_TABLET; i < PAUSE_DISP_00_ANIM_ONOFF_CALIB_BTN + 1; i++) {
|
|
setAnm(i, 0.0f);
|
|
}
|
|
mAnm[PAUSE_DISP_00_ANIM_ONOFF_TEXT].setToEnd();
|
|
|
|
setupDisp();
|
|
setupRingIcons(dLytControlGame_c::getInstance()->getPauseDisp00Tab());
|
|
setAnm(PAUSE_DISP_00_ANIM_UI_TYPE_BTN, 0.0f);
|
|
|
|
u8 mode = dLytMeter_c::GetMain()->getUiMode();
|
|
setAnm(PAUSE_DISP_00_ANIM_UI_TYPE, mode);
|
|
StoryflagManager *storyflagManager = StoryflagManager::sInstance;
|
|
if (storyflagManager->getFlag(STORYFLAG_UPGRADED_DOWSING)) {
|
|
setAnm(PAUSE_DISP_00_ANIM_DOWSING_TYPE, 1.0f);
|
|
} else {
|
|
setAnm(PAUSE_DISP_00_ANIM_DOWSING_TYPE, 0.0f);
|
|
}
|
|
|
|
// Control tab visibility
|
|
f32 tabVFrame = 0.0f;
|
|
if (storyflagManager->getFlag(STORYFLAG_POUCH_UNLOCKED)) {
|
|
tabVFrame = 1.0f;
|
|
}
|
|
if (storyflagManager->getFlag(STORYFLAG_DOWSING_UNLOCKED)) {
|
|
tabVFrame = 2.0f;
|
|
}
|
|
if (storyflagManager->getFlag(STORYFLAG_B_WHEEL_UNLOCKED)) {
|
|
tabVFrame = 3.0f;
|
|
}
|
|
|
|
setAnm(PAUSE_DISP_00_ANIM_TAB_V, tabVFrame);
|
|
if (tabVFrame) {
|
|
mLyt.findPane("N_text_00")->SetVisible(true);
|
|
} else {
|
|
mLyt.findPane("N_text_00")->SetVisible(false);
|
|
}
|
|
|
|
mIsVisible = true;
|
|
}
|
|
void dLytPauseDisp00_c::executeState_In() {
|
|
s32 anim = PAUSE_DISP_00_ANIM_IN;
|
|
if (mDoScrollAnim == true) {
|
|
dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance();
|
|
anim = pause->isNavLeft() ? PAUSE_DISP_00_ANIM_SCROLL_L_IN : PAUSE_DISP_00_ANIM_SCROLL_R_IN;
|
|
}
|
|
|
|
d2d::AnmGroup_c &anm = mAnm[anim];
|
|
|
|
if (anm.isEndReached() == true) {
|
|
if (dLytControlGame_c::getInstance()->isPauseDemo()) {
|
|
mStateMgr.changeState(StateID_GetDemo);
|
|
} else {
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
} else {
|
|
anm.play();
|
|
}
|
|
}
|
|
void dLytPauseDisp00_c::finalizeState_In() {
|
|
dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance();
|
|
if (pause->isNavLeft()) {
|
|
stopAnm(PAUSE_DISP_00_ANIM_SCROLL_L_IN);
|
|
} else {
|
|
stopAnm(PAUSE_DISP_00_ANIM_SCROLL_R_IN);
|
|
}
|
|
|
|
mDoScrollAnim = false;
|
|
if (pause->getField_0x083E()) {
|
|
if (!pause->getField_0x0832()) {
|
|
mCurrentNavTarget = PAUSE_DISP_00_BOUNDING_ARROW_RIGHT + 1;
|
|
} else {
|
|
mCurrentNavTarget = PAUSE_DISP_00_BOUNDING_ARROW_LEFT + 1;
|
|
}
|
|
mPrevNavTarget = mCurrentNavTarget;
|
|
}
|
|
}
|
|
|
|
void dLytPauseDisp00_c::initializeState_Wait() {
|
|
mStep = 0;
|
|
mIsChangingState = true;
|
|
}
|
|
void dLytPauseDisp00_c::executeState_Wait() {
|
|
d2d::AnmGroup_c *anm;
|
|
if (mIsChangingState == true) {
|
|
mIsChangingState = false;
|
|
}
|
|
switch (mStep) {
|
|
case 0: {
|
|
if (mOutRequest == true) {
|
|
mOutRequest = false;
|
|
hideItemIcons();
|
|
mStateMgr.changeState(StateID_Out);
|
|
return;
|
|
}
|
|
if (mSelectToggleRequest == true) {
|
|
mStateMgr.changeState(StateID_Select);
|
|
return;
|
|
}
|
|
if (mRingToggleRequest == true) {
|
|
mRingToggleRequest = false;
|
|
mAnm[PAUSE_DISP_00_ANIM_ONOFF_TEXT].setFrame(0.0f);
|
|
mStateMgr.changeState(StateID_Ring);
|
|
return;
|
|
}
|
|
|
|
if (mSelectGuideRequest == true) {
|
|
mStep = 1;
|
|
setAnm(PAUSE_DISP_00_ANIM_DECIDE_UI_TYPE_BTN, 0.0f);
|
|
u8 uiMode = dLytMeter_c::GetMain()->getUiMode();
|
|
f32 frame = uiMode + 1;
|
|
if (frame >= 3.0f) {
|
|
frame = 0.0f;
|
|
}
|
|
mAnm[PAUSE_DISP_00_ANIM_UI_TYPE].setFrame(frame);
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_P1_SELECT_GUIDE);
|
|
} else if (mSelectMplsRequest == true) {
|
|
mStep = 2;
|
|
setAnm(PAUSE_DISP_00_ANIM_DECIDE_CALIB_BTN, 0.0f);
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_P1_SELECT_MPLUS);
|
|
} else if (updateSelection() != 0) {
|
|
mHasSelection = true;
|
|
}
|
|
break;
|
|
}
|
|
case 1: {
|
|
anm = &mAnm[PAUSE_DISP_00_ANIM_DECIDE_UI_TYPE_BTN];
|
|
if (anm->isEndReached() == true) {
|
|
mStep = 0;
|
|
mSelectGuideRequest = false;
|
|
stopAnm(PAUSE_DISP_00_ANIM_DECIDE_UI_TYPE_BTN);
|
|
mIsChangingState = true;
|
|
} else {
|
|
anm->play();
|
|
}
|
|
break;
|
|
}
|
|
case 2: {
|
|
anm = &mAnm[PAUSE_DISP_00_ANIM_DECIDE_CALIB_BTN];
|
|
if (anm->isEndReached() == true) {
|
|
mStep = 0;
|
|
mSelectMplsRequest = false;
|
|
stopAnm(PAUSE_DISP_00_ANIM_DECIDE_CALIB_BTN);
|
|
mIsChangingState = true;
|
|
} else {
|
|
anm->play();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
mAnm[PAUSE_DISP_00_ANIM_ONOFF_TEXT].play();
|
|
}
|
|
void dLytPauseDisp00_c::finalizeState_Wait() {}
|
|
|
|
void dLytPauseDisp00_c::initializeState_Select() {
|
|
// Reminder: item=0, pouch=1, dowsing=2
|
|
|
|
// Subtle detail - the layout has three animations for changing tabs:
|
|
// 1. B-Wheel -> Pouch
|
|
// 2. Pouch -> Dowsing
|
|
// 3. Dowsing -> B-Wheel
|
|
// If we're changing tabs in this order, we can simply play the
|
|
// animation forward. If we're changing tabs in a different order,
|
|
// we need to play the reverse change animation, backwards.
|
|
|
|
// For a given tab index, what's the natural next tab index?
|
|
static const s32 sNaturalTabOrder[] = {
|
|
/* TAB_ITEM -> */ dLytPauseMgr_c::TAB_POUCH,
|
|
/* TAB_POUCH -> */ dLytPauseMgr_c::TAB_DOWSING,
|
|
/* TAB_DOWSING -> */ dLytPauseMgr_c::TAB_ITEM,
|
|
};
|
|
|
|
// For a given tab index, what's the change anim when changing to the natural next tab?
|
|
static const s32 sNaturalTabChangeAnim[] = {
|
|
PAUSE_DISP_00_ANIM_RING_TO_POUCH,
|
|
PAUSE_DISP_00_ANIM_RING_TO_SWORD,
|
|
PAUSE_DISP_00_ANIM_RING_TO_ITEM,
|
|
};
|
|
|
|
// TODO - possibly fakematch, but we need to force a reload.
|
|
// Note that this is part of a .rodata pool, so it
|
|
// must be const and in the same file...
|
|
|
|
// For a given tab index, what's the change anim when changing to the *other* tab,
|
|
// in not-natural order?
|
|
static const volatile s32 sReverseTabChangeAnim[] = {
|
|
// E.g. we're on the item tab, and we're changing to dowsing,
|
|
// so we need to play the dowsing->item animation in reverse.
|
|
PAUSE_DISP_00_ANIM_RING_TO_ITEM,
|
|
PAUSE_DISP_00_ANIM_RING_TO_POUCH,
|
|
PAUSE_DISP_00_ANIM_RING_TO_SWORD,
|
|
};
|
|
|
|
dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance();
|
|
mSelectToggleRequest = false;
|
|
mStep = 0;
|
|
if (pause->getField_0x0838() == true) {
|
|
mStep = 1;
|
|
stopAnm(PAUSE_DISP_00_ANIM_RING_TO_POUCH);
|
|
stopAnm(PAUSE_DISP_00_ANIM_RING_TO_SWORD);
|
|
stopAnm(PAUSE_DISP_00_ANIM_RING_TO_ITEM);
|
|
|
|
s32 oldTab = dLytControlGame_c::getInstance()->getPauseDisp00Tab();
|
|
if (sNaturalTabOrder[oldTab] == pause->getCurrentDisp00Tab()) {
|
|
// Natural
|
|
setAnm(sNaturalTabChangeAnim[oldTab], 0.0f);
|
|
mReverseTabChangeAnim = false;
|
|
} else {
|
|
// Opposite order
|
|
stopAnm(oldTab + PAUSE_DISP_00_ANIM_RING_BASE);
|
|
setAnm(sReverseTabChangeAnim[oldTab], 0.0f);
|
|
mAnm[sReverseTabChangeAnim[oldTab]].setToEnd();
|
|
mReverseTabChangeAnim = true;
|
|
}
|
|
|
|
for (int i = PAUSE_DISP_00_ANIM_ITEM_OFFSET;
|
|
i < PAUSE_DISP_00_ANIM_ITEM_OFFSET + 3 * PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) {
|
|
mAnm[i].setFrame(0.0f);
|
|
}
|
|
}
|
|
mAnm[PAUSE_DISP_00_ANIM_ONOFF_TEXT].setFrame(0.0f);
|
|
}
|
|
void dLytPauseDisp00_c::executeState_Select() {
|
|
static const s32 sReverseTabChangeAnim[] = {
|
|
PAUSE_DISP_00_ANIM_RING_TO_ITEM,
|
|
PAUSE_DISP_00_ANIM_RING_TO_POUCH,
|
|
PAUSE_DISP_00_ANIM_RING_TO_SWORD,
|
|
};
|
|
|
|
// When our normal tab change anim is done (frame == 1.0f),
|
|
// we change to the next anim with frame == 0.0f.
|
|
// Not entirely sure why.
|
|
static const s32 sNextTabChangeAnim[] = {
|
|
// E.g. we're changing from B-Wheel to Pouch. When
|
|
// we're done with that transition
|
|
PAUSE_DISP_00_ANIM_RING_TO_SWORD,
|
|
PAUSE_DISP_00_ANIM_RING_TO_ITEM,
|
|
PAUSE_DISP_00_ANIM_RING_TO_POUCH,
|
|
};
|
|
|
|
switch (mStep) {
|
|
case 0: {
|
|
if (mSelectToggleRequest == true) {
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
break;
|
|
}
|
|
case 1: {
|
|
// TODO Regswaps - maybe enum types, maybe int, maybe the order of these lines...
|
|
s32 controlGameTab = dLytControlGame_c::getInstance()->getPauseDisp00Tab();
|
|
s32 lytPauseTab = dLytPauseMgr_c::GetInstance()->getCurrentDisp00Tab();
|
|
d2d::AnmGroup_c *anm;
|
|
if (mReverseTabChangeAnim) {
|
|
anm = &mAnm[sReverseTabChangeAnim[controlGameTab]];
|
|
if (cM::isZero(anm->getFrame()) == true) {
|
|
setupRingIcons(lytPauseTab);
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
playBackwards(*anm);
|
|
} else {
|
|
anm = &mAnm[controlGameTab + PAUSE_DISP_00_ANIM_RING_BASE];
|
|
if (anm->isEndReached() == true) {
|
|
stopAnm(controlGameTab + PAUSE_DISP_00_ANIM_RING_BASE);
|
|
setAnm(sNextTabChangeAnim[controlGameTab], 0.0f);
|
|
setupRingIcons(lytPauseTab);
|
|
mStateMgr.changeState(StateID_Wait);
|
|
} else {
|
|
anm->play();
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
playOnOffTabAnim();
|
|
}
|
|
void dLytPauseDisp00_c::finalizeState_Select() {
|
|
mSelectToggleRequest = false;
|
|
if (mStep == 0) {
|
|
return;
|
|
}
|
|
loadRingText(RING_TEXT_CURRENT_TAB);
|
|
}
|
|
|
|
void dLytPauseDisp00_c::initializeState_Ring() {
|
|
mStep = 0;
|
|
mLyt.findPane("N_itemArrow_00")->SetVisible(true);
|
|
dAcPy_c::calcItemWheelSelection(true, PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL);
|
|
mPrevNavTarget = 0;
|
|
loadRingText(RING_TEXT_RELEASE_TO_CONFIRM);
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_P1_HOLD_POINTER);
|
|
}
|
|
void dLytPauseDisp00_c::executeState_Ring() {
|
|
dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance();
|
|
f32 rot = dLytPauseMgr_c::sDisp00ArrowRotation;
|
|
f32 len = dLytPauseMgr_c::sDisp00ArrowLength;
|
|
if (len < 0.0f) {
|
|
len = 0.0f;
|
|
}
|
|
if (len > 1.0f) {
|
|
len = 1.0f;
|
|
}
|
|
// Length
|
|
len *= 99.0f;
|
|
mAnm[PAUSE_DISP_00_ANIM_ITEM_ARROW].setFrame(len);
|
|
// Rotate the arrow
|
|
mVec3_c t1(0.0f, 0.0f, 0.0f);
|
|
t1.z = rot;
|
|
mLyt.findPane("N_itemArrow_00")->SetRotate(t1);
|
|
// But rotate the button and the pointer back so that
|
|
// they point up
|
|
t1.z = -t1.z;
|
|
mLyt.findPane("N_arrowHand_00")->SetRotate(t1);
|
|
|
|
if (mSelectToggleRequest == true) {
|
|
mStateMgr.changeState(StateID_Select);
|
|
} else if (mRingToggleRequest == true) {
|
|
mRingToggleRequest = false;
|
|
mStateMgr.changeState(StateID_Wait);
|
|
} else {
|
|
s32 idx = dAcPy_c::calcItemWheelSelection(false, PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL);
|
|
s32 navTarget = 0;
|
|
if (idx == -1) {
|
|
mAnm[PAUSE_DISP_00_ANIM_ONOFF_TEXT].setFrame(0.0f);
|
|
pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false);
|
|
} else {
|
|
mAnm[PAUSE_DISP_00_ANIM_ONOFF_TEXT].play();
|
|
static const u8 sButtonOrder[] = {
|
|
0, 7, 6, 5, 4, 3, 2, 1,
|
|
};
|
|
idx = sButtonOrder[idx];
|
|
|
|
u16 item;
|
|
dLytPauseMgr_c::SelectionType_e selectionType;
|
|
s32 b = PAUSE_DISP_00_BOUNDING_RING_OFFSET + idx;
|
|
if (mpBoundings[b]->IsVisible()) {
|
|
s32 tab = dLytControlGame_c::getInstance()->getPauseDisp00Tab();
|
|
if (tab == dLytPauseMgr_c::TAB_POUCH) {
|
|
item = getPouchItemIdForIndex(idx, true);
|
|
if (item == 0) {
|
|
item = ITEM_POUCH_EXPANSION;
|
|
}
|
|
selectionType = dLytPauseMgr_c::SELECT_POUCH;
|
|
} else if (tab == dLytPauseMgr_c::TAB_DOWSING) {
|
|
item = getDowsingItemIdForIndex(idx);
|
|
selectionType = dLytPauseMgr_c::SELECT_DOWSING;
|
|
} else {
|
|
item = getBWheelItemIdForIndex(idx);
|
|
selectionType = dLytPauseMgr_c::SELECT_BWHEEL;
|
|
}
|
|
pause->setSelection(selectionType, item, false);
|
|
navTarget = idx + 1;
|
|
mCurrentNavTarget = navTarget;
|
|
mHasSelection = true;
|
|
} else {
|
|
idx = -1;
|
|
pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false);
|
|
mAnm[PAUSE_DISP_00_ANIM_ONOFF_TEXT].setFrame(0.0f);
|
|
}
|
|
}
|
|
|
|
if (mPrevNavTarget != navTarget && idx != -1) {
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_P1_POINT_ITEM);
|
|
dRumble_c::start(dRumble_c::sRumblePreset1, 1);
|
|
}
|
|
mPrevNavTarget = navTarget;
|
|
|
|
s32 tab = dLytControlGame_c::getInstance()->getPauseDisp00Tab();
|
|
s32 anmIdx = tab == dLytPauseMgr_c::TAB_POUCH ? PAUSE_DISP_00_ANIM_ONOFF_POUCH_OFFSET :
|
|
tab == dLytPauseMgr_c::TAB_DOWSING ? PAUSE_DISP_00_ANIM_ONOFF_DOWSING_OFFSET :
|
|
PAUSE_DISP_00_ANIM_ONOFF_ITEM_OFFSET;
|
|
|
|
int i;
|
|
d2d::AnmGroup_c *anm = &mAnm[anmIdx];
|
|
for (i = 0; i < PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) {
|
|
if (idx == i) {
|
|
anm->play();
|
|
} else {
|
|
playBackwards(*anm);
|
|
}
|
|
anm++;
|
|
}
|
|
playOnOffTabAnim();
|
|
}
|
|
}
|
|
void dLytPauseDisp00_c::finalizeState_Ring() {
|
|
mLyt.findPane("N_itemArrow_00")->SetVisible(false);
|
|
loadRingText(RING_TEXT_INITIAL_TAB);
|
|
}
|
|
|
|
void dLytPauseDisp00_c::initializeState_GetDemo() {
|
|
mIsChangingState = true;
|
|
mStep = 0;
|
|
mGetDemoTimer = 0;
|
|
}
|
|
void dLytPauseDisp00_c::executeState_GetDemo() {
|
|
switch (mStep) {
|
|
case 0: {
|
|
mIsChangingState = false;
|
|
if (mGetDemoTimer < 2) {
|
|
mGetDemoTimer++;
|
|
} else {
|
|
mGetDemoTimer = 0;
|
|
mStep = 1;
|
|
}
|
|
break;
|
|
}
|
|
case 1: {
|
|
mStep = 2;
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_ITEM_SET_FX);
|
|
nw4r::math::MTX34 mtx = mLyt.findPane("N_saifuAll_00")->GetGlobalMtx();
|
|
nw4r::math::VEC3 v(0.0f, 0.0f, 0.0f);
|
|
MTXMultVec(mtx, v, v);
|
|
mVec3_c v1;
|
|
v1.set(v.x, v.y, v.z);
|
|
dJEffManager_c::spawnUIEffect(PARTICLE_RESOURCE_ID_MAPPING_990_, v1, nullptr, nullptr, nullptr, nullptr);
|
|
break;
|
|
}
|
|
case 2: {
|
|
if (mGetDemoTimer < 35) {
|
|
mGetDemoTimer++;
|
|
} else {
|
|
mGetDemoTimer = 0;
|
|
mStep = 3;
|
|
dTextBox_c *box;
|
|
s32 count = dAcItem_c::getExtraWalletCount();
|
|
box = mLyt.getTextBox("T_rupeeNum_00");
|
|
box->SetVisible(true);
|
|
SizedWString<32> buf;
|
|
buf.sprintf(L"+%d", count * 300);
|
|
box->setTextWithGlobalTextProcessor(buf);
|
|
// Yes, the r is actually there in the Lyt files
|
|
box = mLyt.getTextBox("T_rupeeNumrS_00");
|
|
box->SetVisible(true);
|
|
box->setTextWithGlobalTextProcessor(buf);
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_ITEM_SET_COUNT_UP);
|
|
}
|
|
break;
|
|
}
|
|
case 3: {
|
|
if (mGetDemoTimer < 37) {
|
|
mGetDemoTimer++;
|
|
} else {
|
|
mGetDemoTimer = 0;
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
void dLytPauseDisp00_c::finalizeState_GetDemo() {}
|
|
|
|
void dLytPauseDisp00_c::initializeState_Out() {
|
|
stopAnm(PAUSE_DISP_00_ANIM_IN);
|
|
if (mDoScrollAnim == true) {
|
|
if (dLytPauseMgr_c::GetInstance()->isNavLeft()) {
|
|
setAnm(PAUSE_DISP_00_ANIM_SCROLL_R_OUT, 0.0f);
|
|
} else {
|
|
setAnm(PAUSE_DISP_00_ANIM_SCROLL_L_OUT, 0.0f);
|
|
}
|
|
} else {
|
|
setAnm(PAUSE_DISP_00_ANIM_OUT, 0.0f);
|
|
}
|
|
mStep = 0;
|
|
}
|
|
void dLytPauseDisp00_c::executeState_Out() {
|
|
s32 anim = PAUSE_DISP_00_ANIM_OUT;
|
|
if (mDoScrollAnim == true) {
|
|
anim = dLytPauseMgr_c::GetInstance()->isNavLeft() ? PAUSE_DISP_00_ANIM_SCROLL_R_OUT :
|
|
PAUSE_DISP_00_ANIM_SCROLL_L_OUT;
|
|
}
|
|
|
|
d2d::AnmGroup_c &anm = mAnm[anim];
|
|
|
|
switch (mStep) {
|
|
case 0: {
|
|
if (anm.isEndReached() == true) {
|
|
mStep = 1;
|
|
mIsChangingState = true;
|
|
}
|
|
break;
|
|
}
|
|
case 1: {
|
|
mStateMgr.changeState(StateID_None);
|
|
return;
|
|
}
|
|
}
|
|
|
|
anm.play();
|
|
}
|
|
void dLytPauseDisp00_c::finalizeState_Out() {}
|
|
|
|
void dLytPauseDisp00_c::setAnm(int idx, f32 value) {
|
|
d2d::AnmGroup_c &anm = mAnm[idx];
|
|
anm.bind(false);
|
|
anm.setAnimEnable(true);
|
|
anm.setFrame(value);
|
|
}
|
|
|
|
void dLytPauseDisp00_c::stopAnm(int idx) {
|
|
d2d::AnmGroup_c &anm = mAnm[idx];
|
|
anm.unbind();
|
|
}
|
|
|
|
void dLytPauseDisp00_c::playBackwards(d2d::AnmGroup_c &anm) {
|
|
f32 frame = anm.getFrame();
|
|
if (frame) {
|
|
frame -= 1.0f;
|
|
if (frame <= 0.0f) {
|
|
frame = 0.0f;
|
|
}
|
|
anm.setFrame(frame);
|
|
}
|
|
}
|
|
|
|
void dLytPauseDisp00_c::setupDisp() {
|
|
setupInventoryWheel();
|
|
setupHeartPieces();
|
|
setupWallets();
|
|
setupMitts();
|
|
setupSailcloth();
|
|
setupWaterDragonScale();
|
|
setupFireshieldEarrings();
|
|
setupSongsAndLifeTree();
|
|
setupTabletTriforce();
|
|
setupSword();
|
|
setupStoneOfTrials();
|
|
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_CALIB_BTN_0]->SetVisible(true);
|
|
|
|
dLytCommonIconItem_c *icon;
|
|
icon = &mIcons[PAUSE_DISP_00_ICONS_B_WHEEL_OFFSET];
|
|
for (s32 i = 0; i < PAUSE_DISP_00_NUM_SUBPANES; i++) {
|
|
icon->setVisible(false);
|
|
icon++;
|
|
}
|
|
|
|
if (StoryflagManager::sInstance->getFlag(STORYFLAG_UI_MODE_UNLOCKED)) {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_UITYPE_BTN, 1.0f);
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_UI_TYPE]->SetVisible(true);
|
|
} else {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_UITYPE_BTN, 0.0f);
|
|
}
|
|
|
|
if (StoryflagManager::sInstance->getFlag(STORYFLAG_UI_MODE_NOTICE)) {
|
|
setAnm(PAUSE_DISP_00_ANIM_CALL, 0.0f);
|
|
mCallTimerMaybe = 1;
|
|
}
|
|
}
|
|
|
|
void dLytPauseDisp00_c::setupInventoryWheel() {
|
|
dLytCommonIconItem_c *icon;
|
|
s32 animIndex;
|
|
f32 haveFrame;
|
|
|
|
// B-wheel
|
|
icon = &mIcons[PAUSE_DISP_00_ICONS_B_WHEEL_OFFSET];
|
|
for (s32 i = 0; i < PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) {
|
|
animIndex = i + PAUSE_DISP_00_ANIM_HAVE_ITEM_OFFSET;
|
|
haveFrame = 0.0f;
|
|
icon->setUnk(false);
|
|
if (isBWheelIndexWithNumber(i)) {
|
|
icon->setHasNumber(true);
|
|
icon->setNumber(getNumberForBWheelIndex(i));
|
|
} else {
|
|
icon->setHasNumber(false);
|
|
}
|
|
|
|
if (getItemLevelForBWheelIndex(i) != 0) {
|
|
u8 id = getLytItemIdForBWheelIndex(i);
|
|
if (id != LYT_CMN_ItemInvalid) {
|
|
if (isBWheelIndexBocoburinLocked(i, true)) {
|
|
icon->setBocoburinLocked(true);
|
|
icon->setHasNumber(false);
|
|
}
|
|
haveFrame = 1.0f;
|
|
icon->setItem(id);
|
|
}
|
|
}
|
|
if (isBWheelIndexWithNumber(i)) {
|
|
u8 color = getNumberColorForBWheelIndex(i);
|
|
if (color != LYT_ITEM_COLOR_NONE) {
|
|
icon->setNumberColor(color);
|
|
}
|
|
}
|
|
|
|
setAnm(animIndex, haveFrame);
|
|
icon++;
|
|
}
|
|
|
|
// Pouch
|
|
icon = &mIcons[PAUSE_DISP_00_ICONS_POUCH_OFFSET];
|
|
for (s32 i = 0; i < PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) {
|
|
animIndex = i + PAUSE_DISP_00_ANIM_HAVE_POUCH_OFFSET;
|
|
haveFrame = 0.0f;
|
|
icon->setUnk(false);
|
|
s32 number = getPouchItemAmount(i, true);
|
|
if (number == -1) {
|
|
icon->setHasNumber(false);
|
|
} else {
|
|
icon->setHasNumber(true);
|
|
icon->setNumber(number);
|
|
}
|
|
|
|
u32 item = getPouchItemForSlot(i, true);
|
|
// TODO why LYT_CMN_PouchPotionHealthPlusPlusHalf
|
|
if (item != LYT_CMN_PouchPotionHealthPlusPlusHalf) {
|
|
if (isPouchBocoburinLocked()) {
|
|
icon->setBocoburinLocked(true);
|
|
icon->setHasNumber(false);
|
|
}
|
|
haveFrame = 1.0f;
|
|
icon->setItem(item);
|
|
f32 durability = getPouchShieldDurability(i, true);
|
|
if (durability >= 0.0f) {
|
|
icon->setShieldDurability(durability);
|
|
}
|
|
|
|
u8 color = getPouchItemNumberColor(i, false);
|
|
if (color != LYT_ITEM_COLOR_NONE) {
|
|
icon->setNumberColor(color);
|
|
}
|
|
}
|
|
|
|
setAnm(animIndex, haveFrame);
|
|
icon++;
|
|
}
|
|
|
|
// Dowsing
|
|
icon = &mIcons[PAUSE_DISP_00_ICONS_DOWSING_OFFSET];
|
|
for (s32 i = 0; i < PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) {
|
|
animIndex = i + PAUSE_DISP_00_ANIM_HAVE_DOWSING_OFFSET;
|
|
haveFrame = 0.0f;
|
|
icon->setUnk(false);
|
|
icon->setHasNumber(false);
|
|
|
|
if (hasDowsingInIndex(i)) {
|
|
u32 item = getLytIndexForDowsingIndex(i);
|
|
if (item != LYT_CMN_DowsingInvalid) {
|
|
haveFrame = 1.0f;
|
|
icon->setItem(item);
|
|
}
|
|
}
|
|
|
|
setAnm(animIndex, haveFrame);
|
|
icon++;
|
|
}
|
|
|
|
setAnm(PAUSE_DISP_00_ANIM_OFF_LEFT_TAB, 0.0f);
|
|
mAnm[PAUSE_DISP_00_ANIM_OFF_LEFT_TAB].setToEnd();
|
|
setAnm(PAUSE_DISP_00_ANIM_OFF_CENTER_TAB, 0.0f);
|
|
mAnm[PAUSE_DISP_00_ANIM_OFF_CENTER_TAB].setToEnd();
|
|
setAnm(PAUSE_DISP_00_ANIM_OFF_RIGHT_TAB, 0.0f);
|
|
mAnm[PAUSE_DISP_00_ANIM_OFF_RIGHT_TAB].setToEnd();
|
|
}
|
|
|
|
void dLytPauseDisp00_c::setupHeartPieces() {
|
|
u32 heartPieceCount = getCounterByIndex(8);
|
|
u32 containerCount = dAcItem_c::getHeartContainerHealthCount();
|
|
if (containerCount == 24) {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_HEART, 1.0f);
|
|
setAnm(PAUSE_DISP_00_ANIM_HEART, 3.0f);
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_HEART]->SetVisible(true);
|
|
} else if (heartPieceCount != 0) {
|
|
f32 frame = heartPieceCount;
|
|
frame -= 1.0f;
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_HEART, 1.0f);
|
|
setAnm(PAUSE_DISP_00_ANIM_HEART, frame);
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_HEART]->SetVisible(true);
|
|
} else {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_HEART, 0.0f);
|
|
}
|
|
}
|
|
|
|
void dLytPauseDisp00_c::setupWallets() {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_POUCH, 1.0f);
|
|
f32 frame = 0.0f;
|
|
if (dAcItem_c::checkFlag(ITEM_TYCOON_WALLET)) {
|
|
frame = 4.0f;
|
|
} else if (dAcItem_c::checkFlag(ITEM_GIANT_WALLET)) {
|
|
frame = 3.0f;
|
|
} else if (dAcItem_c::checkFlag(ITEM_BIG_WALLET)) {
|
|
frame = 2.0f;
|
|
} else if (dAcItem_c::checkFlag(ITEM_MEDIUM_WALLET)) {
|
|
frame = 1.0f;
|
|
}
|
|
setAnm(PAUSE_DISP_00_ANIM_POUCH, frame);
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_POUCH]->SetVisible(true);
|
|
s32 walletCount = dAcItem_c::getExtraWalletCount();
|
|
SizedWString<32> buf;
|
|
if (walletCount != 0) {
|
|
bool bVisible = true;
|
|
// Apparently extra wallets are the ONLY thing that can cause
|
|
// the Gear screen to show the demo (dLytControlGame_c::openCollectionScreenDemo),
|
|
// so we don't have to check that an extra wallets are actually what cause the
|
|
// demo.
|
|
if (dLytControlGame_c::getInstance()->isPauseDemo()) {
|
|
walletCount--;
|
|
if (walletCount == 0) {
|
|
bVisible = false;
|
|
}
|
|
}
|
|
dTextBox_c *box;
|
|
box = mLyt.getTextBox("T_rupeeNum_00");
|
|
box->SetVisible(bVisible);
|
|
buf.empty();
|
|
buf.sprintf(L"+%d", walletCount * 300);
|
|
box->setTextWithGlobalTextProcessor(buf);
|
|
box = mLyt.getTextBox("T_rupeeNumrS_00");
|
|
box->SetVisible(bVisible);
|
|
box->setTextWithGlobalTextProcessor(buf);
|
|
} else {
|
|
mLyt.getTextBox("T_rupeeNum_00")->SetVisible(false);
|
|
mLyt.getTextBox("T_rupeeNumrS_00")->SetVisible(false);
|
|
}
|
|
}
|
|
|
|
void dLytPauseDisp00_c::setupMitts() {
|
|
s32 mittsLevel = getCurrentMittsLevel();
|
|
if (mittsLevel != 0) {
|
|
f32 mittsLevelF = 0.0f;
|
|
if (mittsLevel > 1) {
|
|
mittsLevelF = 1.0f;
|
|
}
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_MITTS, 1.0f);
|
|
if (isMittsRestricted() == true) {
|
|
setAnm(PAUSE_DISP_00_ANIM_BOCO_MITTS, 1.0f);
|
|
} else {
|
|
setAnm(PAUSE_DISP_00_ANIM_BOCO_MITTS, 0.0f);
|
|
}
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_MITTS]->SetVisible(true);
|
|
setAnm(PAUSE_DISP_00_ANIM_MITTS, mittsLevelF);
|
|
} else {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_MITTS, 0.0f);
|
|
}
|
|
}
|
|
|
|
void dLytPauseDisp00_c::setupSailcloth() {
|
|
if (hasSailcloth()) {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_PARACHUTE, 1.0f);
|
|
setAnm(PAUSE_DISP_00_ANIM_BOCO_PARACHUTE, 0.0f);
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_PARACHUTE]->SetVisible(true);
|
|
} else {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_PARACHUTE, 0.0f);
|
|
}
|
|
}
|
|
|
|
void dLytPauseDisp00_c::setupWaterDragonScale() {
|
|
if (hasWaterDragonScale()) {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_SCALE, 1.0f);
|
|
if (isWaterDragonScaleRestricted()) {
|
|
setAnm(PAUSE_DISP_00_ANIM_BOCO_SCALE, 1.0f);
|
|
} else {
|
|
setAnm(PAUSE_DISP_00_ANIM_BOCO_SCALE, 0.0f);
|
|
}
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_SCALE]->SetVisible(true);
|
|
} else {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_SCALE, 0.0f);
|
|
}
|
|
}
|
|
|
|
void dLytPauseDisp00_c::setupFireshieldEarrings() {
|
|
if (dAcItem_c::checkFlag(ITEM_FIRESHIELD_EARRINGS)) {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_RING, 1.0f);
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_RING]->SetVisible(true);
|
|
} else {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_RING, 0.0f);
|
|
}
|
|
}
|
|
|
|
void dLytPauseDisp00_c::setupSongsAndLifeTree() {
|
|
if (hasGoddessHarp()) {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_HARP, 1.0f);
|
|
setAnm(PAUSE_DISP_00_ANIM_BOCO_HARP, 0.0f);
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_HARP]->SetVisible(true);
|
|
} else {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_HARP, 0.0f);
|
|
}
|
|
|
|
s32 anm;
|
|
for (int i = 0; i < 4; i++) {
|
|
anm = PAUSE_DISP_00_ANIM_HAVE_MUSE_OFFSET + i;
|
|
if (hasSong(i)) {
|
|
setAnm(anm, 1.0f);
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + i]->SetVisible(true);
|
|
} else {
|
|
setAnm(anm, 0.0f);
|
|
}
|
|
}
|
|
|
|
u8 songLifetreeStatus = getSongLifeTreeStatus();
|
|
if (songLifetreeStatus == SONG_LIFETREE_HAS_SOTH) {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_07, 1.0f);
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSIC_SET, 0.0f);
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_MUSE_07]->SetVisible(true);
|
|
} else if (songLifetreeStatus != SONG_LIFETREE_NONE) {
|
|
for (int i = 0; i < PAUSE_DISP_00_NUM_SONG_PARTS; i++) {
|
|
if (hasSong(i + 4)) {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_PART_OFFSET + i, 1.0f);
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + i + 4]->SetVisible(true);
|
|
if (i == 2) {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_MI_TO_TANE, 0.0f);
|
|
}
|
|
} else {
|
|
if (i == 2) {
|
|
if (dAcItem_c::checkFlag(ITEM_LIFE_TREE_FRUIT)) {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_MI_TO_TANE, 1.0f);
|
|
setAnm(PAUSE_DISP_00_ANIM_MI_TO_TANE, 1.0f);
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + i + 4]->SetVisible(true);
|
|
} else if (dAcItem_c::checkFlag(ITEM_LIFE_TREE_SEED) &&
|
|
ItemflagManager::sInstance->getFlagDirect(497)) {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_MI_TO_TANE, 1.0f);
|
|
setAnm(PAUSE_DISP_00_ANIM_MI_TO_TANE, 0.0f);
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + i + 4]->SetVisible(true);
|
|
} else {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_MI_TO_TANE, 0.0f);
|
|
}
|
|
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_PART_OFFSET + i, 0.0f);
|
|
} else {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_PART_OFFSET + i, 0.0f);
|
|
}
|
|
}
|
|
}
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSIC_SET, 1.0f);
|
|
} else {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_07, 0.0f);
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSIC_SET, 0.0f);
|
|
}
|
|
}
|
|
|
|
void dLytPauseDisp00_c::setupTabletTriforce() {
|
|
static const s32 sTriforceHaveBoundings[] = {
|
|
PAUSE_DISP_00_ANIM_HAVE_FORCE_OFFSET + 1,
|
|
PAUSE_DISP_00_ANIM_HAVE_FORCE_OFFSET + 0,
|
|
PAUSE_DISP_00_ANIM_HAVE_FORCE_OFFSET + 2,
|
|
};
|
|
|
|
s32 count = 0;
|
|
for (int i = 0; i < 3; i++) {
|
|
if (dAcItem_c::checkFlag(getTabletItemIdForIndex(i))) {
|
|
count++;
|
|
}
|
|
}
|
|
|
|
if (count != 0) {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_TABLET, 1.0f);
|
|
setAnm(PAUSE_DISP_00_ANIM_TABLETS, count - 1.0f);
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_TABLETS]->SetVisible(true);
|
|
} else {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_TABLET, 0.0f);
|
|
}
|
|
|
|
count = 0;
|
|
for (int i = 0; i < 3; i++) {
|
|
if (dAcItem_c::checkFlag(getTriforceItemIdForIndex(i))) {
|
|
count++;
|
|
setAnm(sTriforceHaveBoundings[i], 1.0f);
|
|
} else {
|
|
setAnm(sTriforceHaveBoundings[i], 0.0f);
|
|
}
|
|
}
|
|
|
|
if (count != 0) {
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_TABLETS]->SetVisible(true);
|
|
mAnm[PAUSE_DISP_00_ANIM_TABLETS].setFrame(3.0f);
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_FORCE_BG, 1.0f);
|
|
// Hide tablets
|
|
mAnm[PAUSE_DISP_00_ANIM_HAVE_TABLET].setFrame(0.0f);
|
|
} else {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_FORCE_BG, 0.0f);
|
|
}
|
|
}
|
|
|
|
void dLytPauseDisp00_c::setupSword() {
|
|
static const u8 sSwordFireBoundings[] = {
|
|
PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 1,
|
|
PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 0,
|
|
PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 2,
|
|
};
|
|
|
|
static const f32 sSwordFrames[] = {0.0f, 1.0f, 2.0f, 3.0f, 6.0f, 4.0f, 5.0f};
|
|
|
|
s32 currentSwordLevel = getCurrentSwordLevel();
|
|
if (currentSwordLevel != 0) {
|
|
if (isSwordRestrictedBokoBase()) {
|
|
setAnm(PAUSE_DISP_00_ANIM_BOCO_SWORD, 1.0f);
|
|
} else {
|
|
setAnm(PAUSE_DISP_00_ANIM_BOCO_SWORD, 0.0f);
|
|
}
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_SWORD]->SetVisible(true);
|
|
}
|
|
|
|
setAnm(PAUSE_DISP_00_ANIM_SWORD, sSwordFrames[currentSwordLevel]);
|
|
|
|
s32 currentFire = currentSwordLevel - 2;
|
|
if (currentFire < 0) {
|
|
currentFire = 0;
|
|
} else if (currentFire > 3) {
|
|
currentFire = 3;
|
|
}
|
|
|
|
// Note: Funny unrolled loop here, for a loop that's known to never
|
|
// have more than three iterations
|
|
for (int i = 0; i < currentFire; i++) {
|
|
mpBoundings[sSwordFireBoundings[i]]->SetVisible(true);
|
|
}
|
|
}
|
|
|
|
void dLytPauseDisp00_c::setupStoneOfTrials() {
|
|
if (StoryflagManager::sInstance->getFlag(STORYFLAG_STONE_OF_TRIALS_PLACED)) {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_SHIREN, 2.0f);
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_SHIREN]->SetVisible(true);
|
|
} else {
|
|
if (dAcItem_c::checkFlag(ITEM_STONE_OF_TRIALS)) {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_SHIREN, 1.0f);
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_SHIREN]->SetVisible(true);
|
|
} else {
|
|
setAnm(PAUSE_DISP_00_ANIM_HAVE_SHIREN, 0.0f);
|
|
}
|
|
}
|
|
}
|
|
|
|
void dLytPauseDisp00_c::setupRingIcons(s32 tab) {
|
|
switch (tab) {
|
|
case dLytPauseMgr_c::TAB_POUCH: {
|
|
s32 offset = PAUSE_DISP_00_BOUNDING_RING_OFFSET;
|
|
for (int i = 0; i < PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) {
|
|
bool visible = false;
|
|
// TODO why LYT_CMN_PouchPotionHealthPlusPlusHalf
|
|
if (getPouchItemForSlot(i, true) != LYT_CMN_PouchPotionHealthPlusPlusHalf) {
|
|
visible = true;
|
|
}
|
|
mpBoundings[offset]->SetVisible(visible);
|
|
offset++;
|
|
}
|
|
break;
|
|
}
|
|
case dLytPauseMgr_c::TAB_DOWSING: {
|
|
s32 offset = PAUSE_DISP_00_BOUNDING_RING_OFFSET;
|
|
for (int i = 0; i < PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) {
|
|
bool visible = false;
|
|
if (hasDowsingInIndex(i)) {
|
|
visible = true;
|
|
}
|
|
mpBoundings[offset]->SetVisible(visible);
|
|
offset++;
|
|
}
|
|
break;
|
|
}
|
|
case dLytPauseMgr_c::TAB_ITEM:
|
|
default: {
|
|
s32 offset = PAUSE_DISP_00_BOUNDING_RING_OFFSET;
|
|
for (int i = 0; i < PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) {
|
|
bool visible = false;
|
|
if (getItemLevelForBWheelIndex(i) != 0) {
|
|
visible = true;
|
|
}
|
|
mpBoundings[offset]->SetVisible(visible);
|
|
offset++;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
s32 dLytPauseDisp00_c::updateSelection() {
|
|
dLytControlGame_c *lytControl = dLytControlGame_c::getInstance();
|
|
dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance();
|
|
d2d::AnmGroup_c *pAnm;
|
|
int i;
|
|
|
|
if (!pause->isStateWait()) {
|
|
pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false);
|
|
return 0;
|
|
}
|
|
|
|
s32 target = 0;
|
|
if (dPadNav::isPointerVisible()) {
|
|
target = getPointerPane();
|
|
if (target != 0) {
|
|
mCurrentNavTarget = target;
|
|
}
|
|
} else {
|
|
if (mCurrentNavTarget != 0) {
|
|
if (!dPadNav::isPrevPointerVisible()) {
|
|
s32 nav = dPadNav::getFSStickNavDirection();
|
|
if (nav != dPadNav::FS_STICK_NONE) {
|
|
const u8 *directions = sNavTable1[navTargetToBounding(mCurrentNavTarget)];
|
|
s32 newTarget = directions[nav - 1];
|
|
if (getSongLifeTreeStatus() == SONG_LIFETREE_HAS_SOTH_PARTS_OR_SEED) {
|
|
const u8 *directions = sNavTable2[navTargetToBounding(mCurrentNavTarget)];
|
|
newTarget = directions[nav - 1];
|
|
}
|
|
if (newTarget != 0) {
|
|
mCurrentNavTarget = newTarget;
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
mCurrentNavTarget = boundingToNavTarget(PAUSE_DISP_00_BOUNDING_UI_TYPE);
|
|
}
|
|
|
|
if (mCurrentNavTarget != 0) {
|
|
dCsBase_c::GetInstance()->setCursorStickTargetPane(mpBoundings[navTargetToBounding(mCurrentNavTarget)]);
|
|
}
|
|
|
|
target = mCurrentNavTarget;
|
|
}
|
|
|
|
if (target == 0) {
|
|
pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false);
|
|
} else {
|
|
u8 tab;
|
|
switch (navTargetToBounding(target)) {
|
|
case PAUSE_DISP_00_BOUNDING_CALIB_BTN_3:
|
|
pause->setSelection(dLytPauseMgr_c::SELECT_CATEGORY, 5, false);
|
|
break;
|
|
case PAUSE_DISP_00_BOUNDING_CALIB_BTN_0:
|
|
pause->setSelection(dLytPauseMgr_c::SELECT_CATEGORY, 5, false);
|
|
break;
|
|
case PAUSE_DISP_00_BOUNDING_UI_TYPE:
|
|
if (mpBoundings[PAUSE_DISP_00_BOUNDING_UI_TYPE]->IsVisible()) {
|
|
pause->setSelection(dLytPauseMgr_c::SELECT_CATEGORY, 4, false);
|
|
} else {
|
|
pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false);
|
|
}
|
|
break;
|
|
case PAUSE_DISP_00_BOUNDING_ARROW_LEFT:
|
|
case PAUSE_DISP_00_BOUNDING_ARROW_RIGHT:
|
|
pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false);
|
|
pause->setSelectedArrowBounding(navTargetToBounding(target - PAUSE_DISP_00_BOUNDING_ARROW_OFFSET));
|
|
break;
|
|
case PAUSE_DISP_00_BOUNDING_LEFT_TAB: {
|
|
tab = dLytPauseMgr_c::TAB_DOWSING + 1;
|
|
goto anyTab;
|
|
}
|
|
case PAUSE_DISP_00_BOUNDING_CENTER_TAB: {
|
|
tab = dLytPauseMgr_c::TAB_POUCH + 1;
|
|
goto anyTab;
|
|
}
|
|
case PAUSE_DISP_00_BOUNDING_RIGHT_TAB: {
|
|
tab = dLytPauseMgr_c::TAB_ITEM + 1;
|
|
goto anyTab;
|
|
}
|
|
anyTab: {
|
|
pause->setCurrentSelectionTab(tab);
|
|
if (mpBoundings[navTargetToBounding(target)]->IsVisible()) {
|
|
pause->setSelection(dLytPauseMgr_c::SELECT_CATEGORY, tab, false);
|
|
} else {
|
|
pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false);
|
|
}
|
|
static const u8 sTabLookup[] = {
|
|
PAUSE_DISP_00_BOUNDING_RIGHT_TAB,
|
|
PAUSE_DISP_00_BOUNDING_CENTER_TAB,
|
|
PAUSE_DISP_00_BOUNDING_LEFT_TAB,
|
|
};
|
|
u8 pauseTab = pause->getCurrentSelectionTab() - 1;
|
|
if (pauseTab != lytControl->getPauseDisp00Tab() && mpBoundings[sTabLookup[pauseTab]]->IsVisible()) {
|
|
pause->setField_0x0837(true);
|
|
mHasSelection = true;
|
|
}
|
|
break;
|
|
}
|
|
|
|
default: {
|
|
u16 id;
|
|
dLytPauseMgr_c::SelectionType_e selectionType;
|
|
bool locked = false;
|
|
s32 paneIdx = navTargetToBounding(target);
|
|
switch (paneIdx) {
|
|
default: {
|
|
s32 idx = navTargetToBounding(target) - PAUSE_DISP_00_BOUNDING_RING_OFFSET;
|
|
if (lytControl->getPauseDisp00Tab() == dLytPauseMgr_c::TAB_POUCH) {
|
|
id = getPouchItemIdForIndex(idx, true);
|
|
if (id == ITEM_NONE) {
|
|
id = ITEM_POUCH_EXPANSION;
|
|
}
|
|
selectionType = dLytPauseMgr_c::SELECT_POUCH;
|
|
if (isPouchBocoburinLocked()) {
|
|
locked = true;
|
|
}
|
|
} else if (lytControl->getPauseDisp00Tab() == dLytPauseMgr_c::TAB_DOWSING) {
|
|
id = getDowsingItemIdForIndex(idx);
|
|
selectionType = dLytPauseMgr_c::SELECT_DOWSING;
|
|
} else {
|
|
id = getBWheelItemIdForIndex(idx);
|
|
selectionType = dLytPauseMgr_c::SELECT_BWHEEL;
|
|
if (isBWheelIndexBocoburinLocked(idx, true)) {
|
|
locked = true;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 0: {
|
|
id = 2;
|
|
goto anyFire;
|
|
}
|
|
case PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 1: {
|
|
id = 1;
|
|
goto anyFire;
|
|
}
|
|
case PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 2: {
|
|
id = 3;
|
|
goto anyFire;
|
|
}
|
|
anyFire: {
|
|
selectionType = dLytPauseMgr_c::SELECT_FIRE;
|
|
break;
|
|
}
|
|
// yes
|
|
case INT_MIN ... PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET - 1:
|
|
case PAUSE_DISP_00_BOUNDING_SHIREN: {
|
|
id = getPointedItemSpecial(paneIdx, &locked);
|
|
selectionType = dLytPauseMgr_c::SELECT_ITEM;
|
|
break;
|
|
}
|
|
}
|
|
if (!dPadNav::isPrevPointerVisible()) {
|
|
if (!mpBoundings[navTargetToBounding(target)]->IsVisible()) {
|
|
selectionType = dLytPauseMgr_c::SELECT_NONE;
|
|
id = 0;
|
|
}
|
|
}
|
|
pause->setSelection(selectionType, id, locked);
|
|
}
|
|
}
|
|
}
|
|
|
|
// TODO: this part needs to be fixed before we can deal with the regswaps.
|
|
// Part of the `mpBoundings[navTargetToBounding(target)]->IsVisible()` here is kept around
|
|
// until the end of the function where the same call appears.
|
|
pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_TABLET];
|
|
for (i = PAUSE_DISP_00_BOUNDING_TABLETS; i < PAUSE_DISP_00_BOUNDING_HARP; i++) {
|
|
s32 anim = PAUSE_DISP_00_ANIM_ONOFF_TABLET + i;
|
|
if (target != 0 && navTargetToBounding(target) == i && mpBoundings[navTargetToBounding(target)]->IsVisible()) {
|
|
pAnm->play();
|
|
} else {
|
|
playBackwards(*pAnm);
|
|
}
|
|
|
|
if (anim == PAUSE_DISP_00_ANIM_ONOFF_MUSE_OFFSET + 6) {
|
|
d2d::AnmGroup_c *museAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_MI_TO_TANE];
|
|
if (target != 0 && navTargetToBounding(target) == i) {
|
|
museAnm->play();
|
|
} else {
|
|
playBackwards(*museAnm);
|
|
}
|
|
}
|
|
pAnm++;
|
|
}
|
|
|
|
pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_HARP];
|
|
for (i = PAUSE_DISP_00_BOUNDING_HARP; i < PAUSE_DISP_00_BOUNDING_SHIREN + 1; i++) {
|
|
if (target != 0 && navTargetToBounding(target) == i) {
|
|
pAnm->play();
|
|
} else {
|
|
playBackwards(*pAnm);
|
|
}
|
|
pAnm++;
|
|
}
|
|
|
|
pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_SWORD];
|
|
if (target != 0 && navTargetToBounding(target) == PAUSE_DISP_00_BOUNDING_SWORD) {
|
|
pAnm->play();
|
|
} else {
|
|
playBackwards(*pAnm);
|
|
}
|
|
|
|
pAnm = &mAnm[PAUSE_DISP_00_ANIM_UI_TYPE_BTN];
|
|
if (target != 0 && navTargetToBounding(target) == PAUSE_DISP_00_BOUNDING_UI_TYPE) {
|
|
pause->setField_0x083C(true);
|
|
pAnm->play();
|
|
} else {
|
|
playBackwards(*pAnm);
|
|
}
|
|
|
|
pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_CALIB_BTN];
|
|
if (target != 0 && navTargetToBounding(target) == PAUSE_DISP_00_BOUNDING_CALIB_BTN_0) {
|
|
pause->setField_0x083D(true);
|
|
pAnm->play();
|
|
} else {
|
|
playBackwards(*pAnm);
|
|
}
|
|
|
|
pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_TRIFORCE];
|
|
if (target != 0 && navTargetToBounding(target) == PAUSE_DISP_00_BOUNDING_TABLETS &&
|
|
mpBoundings[PAUSE_DISP_00_BOUNDING_TABLETS]->IsVisible()) {
|
|
pAnm->play();
|
|
} else {
|
|
playBackwards(*pAnm);
|
|
}
|
|
|
|
pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_SHIREN];
|
|
if (target != 0 && navTargetToBounding(target) == PAUSE_DISP_00_BOUNDING_SHIREN) {
|
|
pAnm->play();
|
|
} else {
|
|
playBackwards(*pAnm);
|
|
}
|
|
|
|
s32 tab = lytControl->getPauseDisp00Tab();
|
|
s32 anmIdx = tab == dLytPauseMgr_c::TAB_POUCH ? PAUSE_DISP_00_ANIM_ONOFF_POUCH_OFFSET :
|
|
tab == dLytPauseMgr_c::TAB_DOWSING ? PAUSE_DISP_00_ANIM_ONOFF_DOWSING_OFFSET :
|
|
PAUSE_DISP_00_ANIM_ONOFF_ITEM_OFFSET;
|
|
|
|
pAnm = &mAnm[anmIdx];
|
|
for (i = PAUSE_DISP_00_BOUNDING_RING_OFFSET;
|
|
i < PAUSE_DISP_00_BOUNDING_RING_OFFSET + PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) {
|
|
if (target != 0 && navTargetToBounding(target) == i) {
|
|
f32 frame = pAnm->getFrame();
|
|
if (pAnm->getAnimDuration() - 1.0f > frame) {
|
|
pAnm->setFrame(frame + 1.0f);
|
|
}
|
|
} else {
|
|
f32 frame = pAnm->getFrame();
|
|
if (frame) {
|
|
frame -= 1.0f;
|
|
if (frame <= 0.0f) {
|
|
frame = 0.0f;
|
|
}
|
|
pAnm->setFrame(frame);
|
|
}
|
|
}
|
|
pAnm++;
|
|
}
|
|
|
|
s32 tab1 = lytControl->getPauseDisp00Tab();
|
|
playOnOffTabAnim();
|
|
switch (navTargetToBounding(target)) {
|
|
case PAUSE_DISP_00_BOUNDING_LEFT_TAB: {
|
|
if (tab1 != 2) {
|
|
mAnm[PAUSE_DISP_00_ANIM_OFF_LEFT_TAB].setFrame(0.0f);
|
|
}
|
|
break;
|
|
}
|
|
case PAUSE_DISP_00_BOUNDING_CENTER_TAB: {
|
|
if (tab1 != 1) {
|
|
mAnm[PAUSE_DISP_00_ANIM_OFF_CENTER_TAB].setFrame(0.0f);
|
|
}
|
|
break;
|
|
}
|
|
case PAUSE_DISP_00_BOUNDING_RIGHT_TAB: {
|
|
if (tab1 != 0) {
|
|
mAnm[PAUSE_DISP_00_ANIM_OFF_RIGHT_TAB].setFrame(0.0f);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (target == 0 && isPointingAtRingIcon() == true) {
|
|
u16 tab = dLytPauseMgr_c::TAB_ITEM + 1;
|
|
if (lytControl->getPauseDisp00Tab() == dLytPauseMgr_c::TAB_POUCH) {
|
|
tab = dLytPauseMgr_c::TAB_POUCH + 1;
|
|
} else if (lytControl->getPauseDisp00Tab() == dLytPauseMgr_c::TAB_DOWSING) {
|
|
tab = dLytPauseMgr_c::TAB_DOWSING + 1;
|
|
}
|
|
pause->setSelection(dLytPauseMgr_c::SELECT_RING, tab, false);
|
|
}
|
|
|
|
dSndSmallEffectMgr_c *soundMgr = dSndSmallEffectMgr_c::GetInstance();
|
|
if (target != 0 && mPrevNavTarget != target) {
|
|
s32 tab2 = lytControl->getPauseDisp00Tab();
|
|
bool rumble = true;
|
|
switch (navTargetToBounding(target)) {
|
|
case PAUSE_DISP_00_BOUNDING_UI_TYPE: {
|
|
soundMgr->playSound(SE_S_MENU_P1_POINT_GUIDE);
|
|
break;
|
|
}
|
|
case PAUSE_DISP_00_BOUNDING_CALIB_BTN_0: {
|
|
soundMgr->playSound(SE_S_MENU_P1_POINT_MPLUS);
|
|
break;
|
|
}
|
|
case PAUSE_DISP_00_BOUNDING_LEFT_TAB: {
|
|
if (mpBoundings[PAUSE_DISP_00_BOUNDING_LEFT_TAB]->IsVisible()) {
|
|
if (cM::isZero(mAnm[PAUSE_DISP_00_ANIM_OFF_LEFT_TAB].getFrame())) {
|
|
soundMgr->playSound(SE_S_MENU_P1_POINT_C);
|
|
}
|
|
if (tab2 == dLytPauseMgr_c::TAB_DOWSING) {
|
|
rumble = false;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case PAUSE_DISP_00_BOUNDING_CENTER_TAB: {
|
|
if (mpBoundings[PAUSE_DISP_00_BOUNDING_CENTER_TAB]->IsVisible()) {
|
|
if (cM::isZero(mAnm[PAUSE_DISP_00_ANIM_OFF_CENTER_TAB].getFrame())) {
|
|
soundMgr->playSound(SE_S_MENU_P1_POINT_MINUS);
|
|
}
|
|
if (tab2 == dLytPauseMgr_c::TAB_POUCH) {
|
|
rumble = false;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case PAUSE_DISP_00_BOUNDING_RIGHT_TAB: {
|
|
if (mpBoundings[PAUSE_DISP_00_BOUNDING_RIGHT_TAB]->IsVisible()) {
|
|
if (cM::isZero(mAnm[PAUSE_DISP_00_ANIM_OFF_RIGHT_TAB].getFrame())) {
|
|
soundMgr->playSound(SE_S_MENU_P1_POINT_B);
|
|
}
|
|
if (tab2 == dLytPauseMgr_c::TAB_ITEM) {
|
|
rumble = false;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case PAUSE_DISP_00_BOUNDING_CALIB_BTN_3: {
|
|
soundMgr->playSound(SE_S_MENU_P1_POINT_TOGGLE);
|
|
break;
|
|
}
|
|
// yes
|
|
case INT_MIN ... PAUSE_DISP_00_BOUNDING_UI_TYPE - 1: {
|
|
soundMgr->playSound(SE_S_MENU_P1_POINT_ITEM);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (rumble == true) {
|
|
dRumble_c::start(dRumble_c::sRumblePreset1, 1);
|
|
}
|
|
}
|
|
|
|
mPrevNavTarget = target;
|
|
if (target != 0 && navTargetToBounding(target) != PAUSE_DISP_00_BOUNDING_CALIB_BTN_3 &&
|
|
!dPadNav::isPointerVisible() && !mpBoundings[navTargetToBounding(target)]->IsVisible()) {
|
|
target = 0;
|
|
}
|
|
|
|
if (navTargetToBounding(target) >= PAUSE_DISP_00_BOUNDING_ARROW_LEFT &&
|
|
navTargetToBounding(target) <= PAUSE_DISP_00_BOUNDING_RIGHT_TAB) {
|
|
target = 0;
|
|
}
|
|
|
|
return target;
|
|
}
|
|
|
|
s32 dLytPauseDisp00_c::getPointerPane() const {
|
|
int idx = 0;
|
|
dCursorHitCheck_c *d = dCsBase_c::GetInstance()->getHitCheck();
|
|
if (d != nullptr && d->getType() == 'lyt ') {
|
|
for (int i = 0; i < PAUSE_DISP_00_NUM_BOUNDINGS - 1; i++) {
|
|
if (static_cast<dCursorHitCheckLyt_c *>(d)->getHitPane() == mpBoundings[i]) {
|
|
idx = i + 1;
|
|
// missed optimization:
|
|
// break;
|
|
}
|
|
}
|
|
}
|
|
return idx;
|
|
}
|
|
|
|
bool dLytPauseDisp00_c::isPointingAtRingIcon() {
|
|
if (!mLyt.findPane("N_text_00")->IsVisible()) {
|
|
return false;
|
|
}
|
|
|
|
bool ret = false;
|
|
nw4r::lyt::Size sz = mLyt.findPane("N_ringIcon_00")->GetSize();
|
|
f32 radiusSq = sz.width * 0.5f;
|
|
radiusSq *= radiusSq;
|
|
mVec2_c csPos = dCsBase_c::GetInstance()->getCursorIf()->getCursorPos();
|
|
nw4r::math::MTX34 mtx = mLyt.findPane("N_ringIcon_00")->GetGlobalMtx();
|
|
nw4r::math::VEC3 v(0.0f, 0.0f, 0.0f);
|
|
MTXMultVec(mtx, v, v);
|
|
// TODO maybe fake
|
|
mVec2_c pos2 = mVec2_c(v.x, v.y);
|
|
mVec2_c dist = pos2;
|
|
dist -= csPos;
|
|
if (dist.squaredLength() < radiusSq) {
|
|
ret = true;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
void dLytPauseDisp00_c::hideItemIcons() {
|
|
for (int i = 0; i < PAUSE_DISP_00_NUM_SUBPANES; i++) {
|
|
mIcons[i].setOff();
|
|
mIcons[i].setVisible(false);
|
|
}
|
|
}
|
|
|
|
u16 dLytPauseDisp00_c::getPointedItemSpecial(s32 paneIdx, bool *pLocked) {
|
|
u16 id = 0;
|
|
switch (paneIdx) {
|
|
case PAUSE_DISP_00_BOUNDING_TABLETS: {
|
|
s32 count = 0;
|
|
for (int i = 0; i < 3; i++) {
|
|
if (dAcItem_c::checkFlag(getTabletItemIdForIndex(i))) {
|
|
count++;
|
|
}
|
|
}
|
|
if (count != 0) {
|
|
count--;
|
|
}
|
|
id = getTabletItemIdForIndex(count);
|
|
count = 0;
|
|
for (int i = 0; i < 3; i++) {
|
|
if (dAcItem_c::checkFlag(getTriforceItemIdForIndex(i))) {
|
|
count++;
|
|
}
|
|
}
|
|
if (count != 0) {
|
|
id = getTriforceItemIdForIndex(count - 1);
|
|
}
|
|
break;
|
|
}
|
|
case PAUSE_DISP_00_BOUNDING_HEART: {
|
|
id = getCurrentHeartPieceItemId();
|
|
break;
|
|
}
|
|
case PAUSE_DISP_00_BOUNDING_POUCH: {
|
|
id = getCurrentWalletItemId();
|
|
break;
|
|
}
|
|
case PAUSE_DISP_00_BOUNDING_PARACHUTE: {
|
|
id = getCurrentSailclothItemId();
|
|
break;
|
|
}
|
|
case PAUSE_DISP_00_BOUNDING_MITTS: {
|
|
id = getCurrentMittsItemId();
|
|
if (isMittsRestricted() == true) {
|
|
*pLocked = true;
|
|
}
|
|
break;
|
|
}
|
|
case PAUSE_DISP_00_BOUNDING_SCALE: {
|
|
id = getCurrentWaterDragonScaleItemId();
|
|
if (isWaterDragonScaleRestricted()) {
|
|
*pLocked = true;
|
|
}
|
|
break;
|
|
}
|
|
case PAUSE_DISP_00_BOUNDING_RING: {
|
|
id = getCurrentEarringsItemId();
|
|
break;
|
|
}
|
|
case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET ... PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 7: {
|
|
s32 song = paneIdx - PAUSE_DISP_00_BOUNDING_MUSE_OFFSET;
|
|
if (paneIdx == PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 6) {
|
|
if (StoryflagManager::sInstance->getFlag(STORYFLAG_THUNDER_DRAGON_SONG)) {
|
|
id = getSongItemIdForIndex(song);
|
|
} else if (dAcItem_c::checkFlag(ITEM_LIFE_TREE_FRUIT)) {
|
|
id = ITEM_LIFE_TREE_FRUIT;
|
|
} else if (dAcItem_c::checkFlag(ITEM_LIFE_TREE_SEED)) {
|
|
id = ITEM_LIFE_TREE_SEED;
|
|
}
|
|
} else {
|
|
id = getSongItemIdForIndex(song);
|
|
}
|
|
} break;
|
|
case PAUSE_DISP_00_BOUNDING_HARP: {
|
|
id = getCurrentGoddessHarpItemId();
|
|
if (isHarpRestrictedBokoBase()) {
|
|
*pLocked = true;
|
|
}
|
|
break;
|
|
}
|
|
case PAUSE_DISP_00_BOUNDING_SWORD: {
|
|
id = getCurrentSwordItemId();
|
|
if (isSwordRestrictedBokoBase()) {
|
|
*pLocked = true;
|
|
}
|
|
break;
|
|
}
|
|
case PAUSE_DISP_00_BOUNDING_SHIREN: {
|
|
id = ITEM_STONE_OF_TRIALS;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return id;
|
|
}
|
|
|
|
void dLytPauseDisp00_c::executeCall() {
|
|
if (mCallTimerMaybe == 1) {
|
|
d2d::AnmGroup_c &anm = mAnm[PAUSE_DISP_00_ANIM_CALL];
|
|
if (cM::isZero(anm.getFrame()) == true) {
|
|
if (mStopCallRequest == true) {
|
|
mStopCallRequest = false;
|
|
mCallTimerMaybe = 0;
|
|
stopAnm(PAUSE_DISP_00_ANIM_CALL);
|
|
} else {
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_PLAY_GUIDE_BUTTON_BLINK);
|
|
}
|
|
}
|
|
anm.play();
|
|
}
|
|
}
|
|
|
|
void dLytPauseDisp00_c::playOnOffTabAnim() {
|
|
d2d::AnmGroup_c *anm = &mAnm[PAUSE_DISP_00_ANIM_OFF_LEFT_TAB];
|
|
for (int i = 0; i < 3; i++) {
|
|
anm->play();
|
|
anm++;
|
|
}
|
|
}
|
|
|
|
void dLytPauseDisp00_c::loadRingText(u32 cmd) {
|
|
if (cmd == RING_TEXT_RELEASE_TO_CONFIRM) {
|
|
// "Release to confirm."
|
|
mLyt.loadTextVariant("T_decide_00", 0);
|
|
mLyt.loadTextVariant("T_decideS_00", 0);
|
|
} else {
|
|
s32 msgIdx = 1;
|
|
s32 tab = dLytControlGame_c::getInstance()->getPauseDisp00Tab();
|
|
if (cmd == RING_TEXT_CURRENT_TAB) {
|
|
tab = dLytPauseMgr_c::GetInstance()->getCurrentDisp00Tab();
|
|
}
|
|
if (tab == dLytPauseMgr_c::TAB_POUCH) {
|
|
msgIdx = 2;
|
|
} else if (tab == dLytPauseMgr_c::TAB_DOWSING) {
|
|
msgIdx = 3;
|
|
}
|
|
// "Items"/"Pouch"/"Dowsing"
|
|
mLyt.loadTextVariant("T_decide_00", msgIdx);
|
|
mLyt.loadTextVariant("T_decideS_00", msgIdx);
|
|
}
|
|
|
|
dWindow_c *window = mLyt.getWindow("W_bgP_01");
|
|
window->UpdateSize(mLyt.getSizeBoxInWindow("W_bgP_01"), 32.0f);
|
|
}
|