diff options
| author | robojumper <robojumper@gmail.com> | 2025-12-26 23:43:00 +0100 |
|---|---|---|
| committer | robojumper <robojumper@gmail.com> | 2026-01-24 11:10:35 +0100 |
| commit | baae144a6ec2f8e2bb9ca69f0dd6e75836c3c140 (patch) | |
| tree | a0ab73c4029fc0cd2f249e38d2314ee1e3963e04 /src/d/lyt | |
| parent | cffba79e3f0600d54dea3bdbb0506e2fc1c54199 (diff) | |
d_lyt_shop 91%
Diffstat (limited to 'src/d/lyt')
| -rw-r--r-- | src/d/lyt/d_lyt_shop.cpp | 1909 |
1 files changed, 1909 insertions, 0 deletions
diff --git a/src/d/lyt/d_lyt_shop.cpp b/src/d/lyt/d_lyt_shop.cpp new file mode 100644 index 00000000..6fa15ee0 --- /dev/null +++ b/src/d/lyt/d_lyt_shop.cpp @@ -0,0 +1,1909 @@ +#include "d/lyt/d_lyt_shop.h" + +#include "common.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_cs_game.h" +#include "d/d_cursor_hit_check.h" +#include "d/d_message.h" +#include "d/d_pad.h" +#include "d/d_pad_nav.h" +#include "d/d_rumble.h" +#include "d/lyt/d2d.h" +#include "d/lyt/d_lyt_common_icon_item.h" +#include "d/lyt/d_lyt_common_icon_item_maps.h" +#include "d/lyt/d_lyt_common_icon_material.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 "f/f_profile.h" +#include "m/m_pad.h" +#include "nw4r/lyt/lyt_group.h" +#include "nw4r/types_nw4r.h" +#include "sized_string.h" +#include "toBeSorted/arc_managers/layout_arc_manager.h" +#include "toBeSorted/counters/counter.h" + +#include <cwchar> + +struct ShopUpgradeMaterialCost { + /* 0x0 */ s16 itemId; + /* 0x2 */ s16 amount; +}; + +struct ShopUpgradeCosts { + /* 0x0 */ s16 newItemId; + /* 0x2 */ s16 oldItemId; + /* 0x4 */ s16 price; + /* 0x6 */ ShopUpgradeMaterialCost matCosts[4]; +}; + +struct ShopUpgradeItemData { + /* 0x0 */ s32 itemId; + /* 0x4 */ bool canBeUpgraded; +}; + +static const ShopUpgradeCosts sGearUpgrades[] = { + { ITEM_BANDED_SHIELD, + ITEM_WOODEN_SHIELD, 30, + { + {ITEM_AMBER_RELIC, 2}, + {ITEM_MONSTER_CLAW, 1}, + {ITEM_JELLY_BLOB, 1}, + {-1, -1}, + }}, + { ITEM_BRACED_SHIELD, + ITEM_BANDED_SHIELD, 50, + { + {ITEM_AMBER_RELIC, 3}, + {ITEM_MONSTER_CLAW, 2}, + {ITEM_TUMBLE_WEED, 2}, + {ITEM_ORNAMENTAL_SKULL, 1}, + }}, + { ITEM_REINFORCED_SHIELD, + ITEM_IRON_SHIELD, 50, + { + {ITEM_ELDIN_ORE, 2}, + {ITEM_MONSTER_CLAW, 2}, + {ITEM_ORNAMENTAL_SKULL, 2}, + {-1, -1}, + }}, + { ITEM_FORTIFIED_SHIELD, + ITEM_REINFORCED_SHIELD, 100, + { + {ITEM_ELDIN_ORE, 3}, + {ITEM_MONSTER_CLAW, 3}, + {ITEM_TUMBLE_WEED, 3}, + {ITEM_BLUE_BIRD_FEATHER, 1}, + }}, + { ITEM_DIVINE_SHIELD, + ITEM_SACRED_SHIELD, 100, + { + {ITEM_DUSK_RELIC, 1}, + {ITEM_BIRD_FEATHER, 2}, + {ITEM_ORNAMENTAL_SKULL, 3}, + {-1, -1}, + }}, + { ITEM_GODDESS_SHIELD, + ITEM_DIVINE_SHIELD, 150, + { + {ITEM_DUSK_RELIC, 4}, + {ITEM_BIRD_FEATHER, 3}, + {ITEM_MONSTER_HORN, 3}, + {ITEM_BLUE_BIRD_FEATHER, 1}, + }}, + { ITEM_MIGHTY_SCATTERSHOT, + ITEM_SLINGSHOT, 50, + { + {ITEM_DUSK_RELIC, 2}, + {ITEM_AMBER_RELIC, 2}, + {ITEM_JELLY_BLOB, 3}, + {-1, -1}, + }}, + { ITEM_QUICK_BEETLE, + ITEM_HOOK_BEETLE, 50, + { + {ITEM_ANCIENT_FLOWER, 2}, + {ITEM_HORNET_LARVAE, 2}, + {ITEM_GOLDEN_SKULL, 1}, + {-1, -1}, + }}, + { ITEM_TOUGH_BEETLE, + ITEM_QUICK_BEETLE, 50, + { + {ITEM_ANCIENT_FLOWER, 3}, + {ITEM_AMBER_RELIC, 4}, + {ITEM_BLUE_BIRD_FEATHER, 1}, + {ITEM_GODDESS_PLUME, 1}, + }}, + { ITEM_IRON_BOW, + ITEM_BOW, 50, + { + {ITEM_TUMBLE_WEED, 3}, + {ITEM_EVIL_CRYSTAL, 1}, + {ITEM_MONSTER_CLAW, 3}, + {ITEM_ELDIN_ORE, 2}, + }}, + { ITEM_SACRED_BOW, + ITEM_IRON_BOW, 100, + { + {ITEM_TUMBLE_WEED, 5}, + {ITEM_EVIL_CRYSTAL, 2}, + {ITEM_LIZARD_TAIL, 3}, + {ITEM_GODDESS_PLUME, 1}, + }}, + {ITEM_MEDIUM_SEED_SATCHEL, + ITEM_SMALL_SEED_SATCHEL, 50, + { + {ITEM_AMBER_RELIC, 4}, + {ITEM_MONSTER_CLAW, 3}, + {ITEM_ORNAMENTAL_SKULL, 3}, + {-1, -1}, + }}, + { ITEM_LARGE_SEED_SATCHEL, + ITEM_MEDIUM_SEED_SATCHEL, 100, + { + {ITEM_AMBER_RELIC, 5}, + {ITEM_MONSTER_CLAW, 3}, + {ITEM_GOLDEN_SKULL, 1}, + {ITEM_BLUE_BIRD_FEATHER, 1}, + }}, + { ITEM_MEDIUM_QUIVER, + ITEM_SMALL_QUIVER, 50, + { + {ITEM_MONSTER_HORN, 3}, + {ITEM_DUSK_RELIC, 3}, + {ITEM_AMBER_RELIC, 5}, + {-1, -1}, + }}, + { ITEM_LARGE_QUIVER, + ITEM_MEDIUM_QUIVER, 100, + { + {ITEM_MONSTER_HORN, 2}, + {ITEM_DUSK_RELIC, 3}, + {ITEM_GOLDEN_SKULL, 1}, + {ITEM_GODDESS_PLUME, 1}, + }}, + { ITEM_MEDIUM_BOMB_BAG, + ITEM_SMALL_BOMB_BAG, 50, + { + {ITEM_LIZARD_TAIL, 1}, + {ITEM_ORNAMENTAL_SKULL, 3}, + {ITEM_BLUE_BIRD_FEATHER, 1}, + {-1, -1}, + }}, + { ITEM_LARGE_BOMB_BAG, + ITEM_MEDIUM_BOMB_BAG, 100, + { + {ITEM_LIZARD_TAIL, 3}, + {ITEM_JELLY_BLOB, 4}, + {ITEM_HORNET_LARVAE, 2}, + {ITEM_GOLDEN_SKULL, 1}, + }}, + { ITEM_BIG_BUG_NET, + ITEM_BUG_NET, 100, + { + {ITEM_TUMBLE_WEED, 3}, + {ITEM_ANCIENT_FLOWER, 2}, + {ITEM_EVIL_CRYSTAL, 1}, + {-1, -1}, + }}, +}; + +static const ShopUpgradeCosts sPotionUpgrades[] = { + { ITEM_HEART_POTION_PLUS, + ITEM_HEART_POTION, 20, + { + {ITEM_BLESSED_BUTTERFLY, 3}, + {ITEM_WOODLAND_RHINO_BEETLE, 1}, + {ITEM_VOLCANIC_LADYBUG, 1}, + {-1, -1}, + }}, + { ITEM_HEART_POTION_PLUS_PLUS, + ITEM_HEART_POTION_PLUS, 30, + { + {ITEM_BLESSED_BUTTERFLY, 3}, + {ITEM_DEKU_HORNET, 3}, + {ITEM_SAND_CICADA, 1}, + {ITEM_ELDIN_ROLLER, 1}, + }}, + { ITEM_AIR_POTION_PLUS, + ITEM_AIR_POTION, 20, + { + {ITEM_SKY_STAG_BEETLE, 2}, + {ITEM_SKYLOFT_MANTIS, 2}, + {ITEM_LANAYRU_ANT, 2}, + {-1, -1}, + }}, + { ITEM_STAMINA_POTION_PLUS, + ITEM_STAMINA_POTION, 20, + { + {ITEM_VOLCANIC_LADYBUG, 3}, + {ITEM_SKY_STAG_BEETLE, 2}, + {ITEM_GERUDO_DRAGONFLY, 2}, + {ITEM_FARON_GRASSHOPPER, 1}, + }}, + { ITEM_REVITALIZING_POTION_PLUS, + ITEM_REVITALIZING_POTION, 20, + { + {ITEM_WOODLAND_RHINO_BEETLE, 2}, + {ITEM_SKYLOFT_MANTIS, 2}, + {ITEM_DEKU_HORNET, 3}, + {-1, -1}, + }}, + {ITEM_REVITALIZING_POTION_PLUS_PLUS, + ITEM_REVITALIZING_POTION_PLUS, 30, + { + {ITEM_WOODLAND_RHINO_BEETLE, 2}, + {ITEM_LANAYRU_ANT, 3}, + {ITEM_GERUDO_DRAGONFLY, 1}, + {ITEM_SAND_CICADA, 1}, + }}, + { ITEM_GUARDIAN_POTION_PLUS, + ITEM_GUARDIAN_POTION, 40, + { + {ITEM_FARON_GRASSHOPPER, 1}, + {ITEM_ELDIN_ROLLER, 2}, + {ITEM_BLESSED_BUTTERFLY, 3}, + {ITEM_STARRY_FIREFLY, 3}, + }}, +}; + +static const ShopUpgradeItemData sItemData[] = { + { ITEM_BUG_NET, true}, + { ITEM_BIG_BUG_NET, false}, + { ITEM_SLINGSHOT, true}, + { ITEM_MIGHTY_SCATTERSHOT, false}, + { ITEM_HOOK_BEETLE, true}, + { ITEM_QUICK_BEETLE, true}, + { ITEM_TOUGH_BEETLE, false}, + { ITEM_BOW, true}, + { ITEM_IRON_BOW, true}, + { ITEM_SACRED_BOW, false}, + { ITEM_WOODEN_SHIELD, true}, + { ITEM_BANDED_SHIELD, true}, + { ITEM_BRACED_SHIELD, false}, + { ITEM_IRON_SHIELD, true}, + { ITEM_REINFORCED_SHIELD, true}, + { ITEM_FORTIFIED_SHIELD, false}, + { ITEM_SACRED_SHIELD, true}, + { ITEM_DIVINE_SHIELD, true}, + { ITEM_GODDESS_SHIELD, false}, + { ITEM_SMALL_SEED_SATCHEL, true}, + { ITEM_MEDIUM_SEED_SATCHEL, true}, + { ITEM_LARGE_SEED_SATCHEL, false}, + { ITEM_SMALL_BOMB_BAG, true}, + { ITEM_MEDIUM_BOMB_BAG, true}, + { ITEM_LARGE_BOMB_BAG, false}, + { ITEM_SMALL_QUIVER, true}, + { ITEM_MEDIUM_QUIVER, true}, + { ITEM_LARGE_QUIVER, false}, + { ITEM_HEART_POTION, true}, + { ITEM_HEART_POTION_PLUS, true}, + { ITEM_HEART_POTION_PLUS_PLUS, false}, + { ITEM_AIR_POTION, true}, + { ITEM_AIR_POTION_PLUS, false}, + { ITEM_STAMINA_POTION, true}, + { ITEM_STAMINA_POTION_PLUS, false}, + { ITEM_REVITALIZING_POTION, true}, + { ITEM_REVITALIZING_POTION_PLUS, true}, + {ITEM_REVITALIZING_POTION_PLUS_PLUS, false}, + { ITEM_GUARDIAN_POTION, true}, + { ITEM_GUARDIAN_POTION_PLUS, false}, + { ITEM_FARON_GRASSHOPPER, false}, + { ITEM_WOODLAND_RHINO_BEETLE, false}, + { ITEM_DEKU_HORNET, false}, + { ITEM_SKYLOFT_MANTIS, false}, + { ITEM_VOLCANIC_LADYBUG, false}, + { ITEM_BLESSED_BUTTERFLY, false}, + { ITEM_LANAYRU_ANT, false}, + { ITEM_SAND_CICADA, false}, + { ITEM_GERUDO_DRAGONFLY, false}, + { ITEM_ELDIN_ROLLER, false}, + { ITEM_SKY_STAG_BEETLE, false}, + { ITEM_STARRY_FIREFLY, false}, + { ITEM_HORNET_LARVAE, false}, + { ITEM_BIRD_FEATHER, false}, + { ITEM_TUMBLE_WEED, false}, + { ITEM_LIZARD_TAIL, false}, + { ITEM_ELDIN_ORE, false}, + { ITEM_ANCIENT_FLOWER, false}, + { ITEM_AMBER_RELIC, false}, + { ITEM_DUSK_RELIC, false}, + { ITEM_JELLY_BLOB, false}, + { ITEM_MONSTER_CLAW, false}, + { ITEM_MONSTER_HORN, false}, + { ITEM_ORNAMENTAL_SKULL, false}, + { ITEM_EVIL_CRYSTAL, false}, + { ITEM_BLUE_BIRD_FEATHER, false}, + { ITEM_GOLDEN_SKULL, false}, + { ITEM_GODDESS_PLUME, false}, +}; + +// clang-format off +static const s32 sLytIconMapping[68] = { + LYT_CMN_ItemBugnet, + LYT_CMN_ItemBigBugnet, + LYT_CMN_ItemSlingshot, + LYT_CMN_ItemScattershot, + LYT_CMN_ItemHookBeetle, + LYT_CMN_ItemQuickBeetle, + LYT_CMN_ItemToughBeetle, + LYT_CMN_ItemBow, + LYT_CMN_ItemIronBow, + LYT_CMN_ItemSacredBow, + LYT_CMN_PouchShieldWoodA, + LYT_CMN_PouchShieldWoodB, + LYT_CMN_PouchShieldWoodC, + LYT_CMN_PouchShieldIronA, + LYT_CMN_PouchShieldIronB, + LYT_CMN_PouchShieldIronC, + LYT_CMN_PouchShieldHolyA, + LYT_CMN_PouchShieldHolyB, + LYT_CMN_PouchShieldHolyC, + LYT_CMN_PouchSeedSatchelSmall, + LYT_CMN_PouchSeedSatchelMed, + LYT_CMN_PouchSeedSatchelBig, + LYT_CMN_PouchBombBagSmall, + LYT_CMN_PouchBombBagMed, + LYT_CMN_PouchBombBagBig, + LYT_CMN_PouchQuiverSmall, + LYT_CMN_PouchQuiverMed, + LYT_CMN_PouchQuiverBig, + LYT_CMN_PouchPotionHealth, + LYT_CMN_PouchPotionHealthPlus, + LYT_CMN_PouchPotionHealthPlusPlusFull, + LYT_CMN_PouchPotionAir, + LYT_CMN_PouchPotionAirPlus, + LYT_CMN_PouchPotionStamina, + LYT_CMN_PouchPotionStaminaPlus, + LYT_CMN_PouchPotionRepair, + LYT_CMN_PouchPotionRepairPlus, + LYT_CMN_PouchPotionRepairPlusPlusFull, + LYT_CMN_PouchPotionGuardian, + LYT_CMN_PouchPotionGuardianPlus, + LYT_CMN_BugFaronGrasshopper, + LYT_CMN_BugWoodlandRhinoBetle, + LYT_CMN_BugDekuHornet, + LYT_CMN_BugSkyloftMantis, + LYT_CMN_BugVolcanicLadyBug, + LYT_CMN_BugBlessedButterfly, + LYT_CMN_BugLanayruAnt, + LYT_CMN_BugSandCicada, + LYT_CMN_BugGerudoDragonfly, + LYT_CMN_BugEldinRoller, + LYT_CMN_BugSkyStagBeetle, + LYT_CMN_BugStarryFirefly, + LYT_CMN_HORNET_LARVAE, + LYT_CMN_BIRD_FEATHER, + LYT_CMN_TUMBLEWEED, + LYT_CMN_LIZALFOS_TAIL, + LYT_CMN_ELDIN_ORE, + LYT_CMN_ANCIENT_FLOWER, + LYT_CMN_AMBER_RELIC, + LYT_CMN_DUSK_RELOC, + LYT_CMN_JELLY_BLOB, + LYT_CMN_MONSTER_CLAW, + LYT_CMN_MONSTER_HORN, + LYT_CMN_ORNAMENTAL_SKULL, + LYT_CMN_EVIL_CRYSTAL, + LYT_CMN_BLUE_BIRD_FEATHER, + LYT_CMN_GOLDEN_SKULL, + LYT_CMN_GODDESS_PLUME, +}; +// clang-format on + +STATE_DEFINE(dLytShopMain_c, ModeNone); +STATE_DEFINE(dLytShopMain_c, ModeSelectIn); +STATE_DEFINE(dLytShopMain_c, ModeSelectCheck); +STATE_DEFINE(dLytShopMain_c, ModeSelectOut); +STATE_DEFINE(dLytShopMain_c, ModeOutIn); +STATE_DEFINE(dLytShopMain_c, ModeMaterialCheck); +STATE_DEFINE(dLytShopMain_c, ModeOut); +STATE_DEFINE(dLytShopMain_c, ModeInOut); + +static const char *sLytNames[] = { + "itemSelect_00.brlyt", + "materialCheck_00.brlyt", + "shopInfo_00.brlyt", +}; + +static const d2d::LytBrlanMapping brlanMapItemSelect[] = { + { "itemSelect_00_in.brlan", "G_inOut_00"}, + { "itemSelect_00_btnOnOff.brlan", "G_btn_00"}, + { "itemSelect_00_btnOnOff.brlan", "G_onOffB_00"}, + { "itemSelect_00_btnLoop.brlan", "G_btnLoop_00"}, + { "itemSelect_00_btnDecide.brlan", "G_btn_00"}, + { "itemSelect_00_out.brlan", "G_inOut_00"}, + { "itemSelect_00_loop.brlan", "G_loop_00"}, + { "itemSelect_00_btnCancel.brlan", "G_btnCancel_00"}, + {"itemSelect_00_shopChange.brlan", "G_change_00"}, +}; + +static const d2d::LytBrlanMapping brlanMapMaterialCheck[] = { + { "materialCheck_00_in.brlan", "G_inOut_00"}, + { "materialCheck_00_out.brlan", "G_inOut_00"}, + { "materialCheck_00_btnOnOff.brlan", "G_btn_00"}, + { "materialCheck_00_btnOnOff.brlan", "G_btn_01"}, + { "materialCheck_00_btnOnOff.brlan", "G_onOffB_00"}, + { "materialCheck_00_btnDecide.brlan", "G_btn_00"}, + { "materialCheck_00_btnDecide.brlan", "G_btn_01"}, + { "materialCheck_00_btnLoop.brlan", "G_btnLoop_00"}, + { "materialCheck_00_btnLoop.brlan", "G_btnLoop_01"}, + { "materialCheck_00_loop.brlan", "G_loop_00"}, + { "materialCheck_00_keta.brlan", "G_keta_00"}, + { "materialCheck_00_itemFlag.brlan", "G_itemFlag_00"}, + { "materialCheck_00_itemFlag.brlan", "G_itemFlag_01"}, + { "materialCheck_00_itemFlag.brlan", "G_itemFlag_02"}, + { "materialCheck_00_itemFlag.brlan", "G_itemFlag_03"}, + {"materialCheck_00_itemNumber.brlan", "G_itemNumber_00"}, + { "materialCheck_00_btnCancel.brlan", "G_btnCancel_00"}, + {"materialCheck_00_shopChange.brlan", "G_change_00"}, +}; + +static const d2d::LytBrlanMapping brlanMapShopInfo[] = { + { "shopInfo_00_in.brlan", "G_inOut_00"}, + {"shopInfo_00_out.brlan", "G_inOut_00"}, +}; + +static const char *sItemSelectBoundings[] = { + "B_item_00", "B_item_01", "B_item_02", "B_item_03", "B_item_04", "B_item_05", "B_item_06", + "B_item_07", "B_item_08", "B_item_09", "B_item_10", "B_item_11", "B_choices_00", +}; + +static const char *sMaterialCheckChoiceBoundings[] = { + "B_choices_00", + "B_choices_01", +}; + +#define SHOP_MATERIAL_CHECK_CHOICE_NUM_BOUNDINGS 2 + +#define SHOP_LYT_ITEM_SELECT 0 +#define SHOP_LYT_MATERIAL_CHECK 1 +#define SHOP_LYT_SHOP_INFO 2 + +#define SHOP_NUM_LYTS 3 + +#define SHOP_ITEM_SELECT_NUM_ANIMS 9 +#define SHOP_MATERIAL_NUM_ANIMS 18 +#define SHOP_SHOP_INFO_NUM_ANIMS 2 + +#define SHOP_ITEM_SELECT_BOUNDING_ITEM_OFFSET 0 +#define SHOP_ITEM_SELECT_BOUNDING_CHOICES 12 + +#define SHOP_ITEM_SELECT_NUM_BOUNDINGS 13 + +void dLytShopMain_c::initializeState_ModeNone() {} +void dLytShopMain_c::executeState_ModeNone() { + mIsIdle = true; +} +void dLytShopMain_c::finalizeState_ModeNone() {} + +void dLytShopMain_c::initializeState_ModeSelectIn() {} +void dLytShopMain_c::executeState_ModeSelectIn() { + if (mAnmItemSelect[0].isEndReached() && mAnmShopInfo[0].isEndReached()) { + mAnmItemSelect[0].setAnimEnable(false); + mAnmShopInfo[0].setAnimEnable(false); + + for (int i = 0; i < NUM_ITEMS; i++) { + mpItemBoundings[i + SHOP_ITEM_SELECT_BOUNDING_ITEM_OFFSET]->SetVisible(false); + } + dCsBase_c::GetInstance()->setVisible(true); + mPhase = PHASE_SELECT_ITEM; + mIsIdle = true; + } +} +void dLytShopMain_c::finalizeState_ModeSelectIn() {} + +void dLytShopMain_c::initializeState_ModeSelectCheck() { + mCurrentNavTarget = -12; + field_0x116DD = false; + field_0x116DE = false; + field_0x11700 = false; +} +void dLytShopMain_c::executeState_ModeSelectCheck() { + if (dPad::getDownTrigB()) { + field_0x116DD = true; + fn_802A5CA0(false); + mIsIdle = true; + } else if (dPad::getDownTrigA() && mCurrentNavTarget >= 0 && + (mCurrentNavTarget < mItemCount || mCurrentNavTarget == 12)) { + if (mCurrentNavTarget == 12) { + field_0x116DD = true; + } + mIsIdle = true; + } else { + handleNavigation(); + } + + if (mIsIdle) { + dPadNav::setNavEnabled(false, false); + } +} +void dLytShopMain_c::finalizeState_ModeSelectCheck() {} + +void dLytShopMain_c::initializeState_ModeSelectOut() {} +void dLytShopMain_c::executeState_ModeSelectOut() { + if (field_0x116DD) { + if (mAnmItemSelect[4].isEndReached()) { + mUpgradeIdx = 0; + mItemCount = 0; + if (mCurrentNavTarget == 12) { + mAnmItemSelect[1].setAnimEnable(false); + } + mCurrentNavTarget = -13; + mIsIdle = true; + } + } else { + if (mBWheelOrPouchItemIcons[mCurrentNavTarget + 12].isDoneDeciding()) { + mUpgradeIdx = mItemUpgradeIdxes[mCurrentNavTarget]; + mIsIdle = true; + } + } +} +void dLytShopMain_c::finalizeState_ModeSelectOut() {} + +void dLytShopMain_c::initializeState_ModeOutIn() {} +void dLytShopMain_c::executeState_ModeOutIn() { + if (mStateStep == 0) { + bool b = false; + if (field_0x116DD) { + if (mAnmItemSelect[4].isEndReached()) { + mAnmItemSelect[4].setAnimEnable(false); + b = true; + } + } else { + s32 offset = mItemKinds[mCurrentNavTarget] == dLytCommonIconItem_c::B_WHEEL ? 0 : 12; + if (mBWheelOrPouchItemIcons[mCurrentNavTarget + offset].isDoneDeciding()) { + b = true; + mUpgradeIdx = mItemUpgradeIdxes[mCurrentNavTarget]; + } + } + + if (b) { + mAnmItemSelect[5].setAnimEnable(true); + mAnmItemSelect[5].setFrame(0.0f); + mAnmItemSelect[1].setAnimEnable(true); + mAnmItemSelect[1].setFrame(0.0f); + mAnmItemSelect[3].setAnimEnable(true); + mAnmItemSelect[3].setFrame(0.0f); + mLyts[SHOP_LYT_ITEM_SELECT].calc(); + mAnmItemSelect[1].setAnimEnable(false); + mAnmItemSelect[3].setAnimEnable(false); + + mAnmMaterialCheck[0].setAnimEnable(true); + mAnmMaterialCheck[0].setFrame(0.0f); + mAnmMaterialCheck[16].setAnimEnable(true); + mAnmMaterialCheck[16].setFrame(1.0f); + + updateShopStuffMaybe(); + + f32 f; + if (mService != SERVICE_POTION_INFUSE) { + f = 0.0f; + if (mService == SERVICE_GEAR_UPGRADE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RC_P2_APPEAR); + } + } else { + f = 1.0f; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_MDS_P2_APPEAR); + } + + mAnmMaterialCheck[17].setAnimEnable(true); + mAnmMaterialCheck[17].setFrame(f); + mLyts[SHOP_LYT_MATERIAL_CHECK].calc(); + mAnmMaterialCheck[17].setAnimEnable(false); + mStateStep = 1; + } + } else { + if (mAnmItemSelect[5].isEndReached() && mAnmMaterialCheck[0].isEndReached()) { + mAnmItemSelect[5].setAnimEnable(false); + mAnmMaterialCheck[0].setAnimEnable(false); + + s32 offset = mItemKinds[mCurrentNavTarget] == dLytCommonIconItem_c::B_WHEEL ? 0 : 12; + mBWheelOrPouchItemIcons[mCurrentNavTarget + offset].setOff(); + + mPhase = PHASE_MATERIAL_CHECK; + mCurrentNavTarget = mCurrentNavTarget - 12; + dPadNav::setNavEnabled(true, false); + mIsIdle = true; + } + } +} +void dLytShopMain_c::finalizeState_ModeOutIn() {} + +void dLytShopMain_c::initializeState_ModeMaterialCheck() { + mCurrentNavTarget = -2; + field_0x116DD = false; + field_0x116DE = false; +} +void dLytShopMain_c::executeState_ModeMaterialCheck() { + if (dPad::getDownTrigB()) { + if (field_0x116DE) { + mAnmMaterialCheck[3].setBackwardsOnce(); + } + field_0x116DD = true; + fn_802A5CA0(false); + mIsIdle = true; + } else if (dPad::getDownTrigA() && mCurrentNavTarget >= 0) { + if (mCurrentNavTarget != 0) { + dCsBase_c::GetInstance()->setVisible(false); + } + mIsIdle = true; + } else { + handleNavigation(); + } + + if (mIsIdle) { + dPadNav::setNavEnabled(false, false); + } +} +void dLytShopMain_c::finalizeState_ModeMaterialCheck() {} + +void dLytShopMain_c::initializeState_ModeOut() {} +void dLytShopMain_c::executeState_ModeOut() { + if (mStateStep == 0) { + if (mAnmMaterialCheck[6].isEndReached()) { + mAnmMaterialCheck[6].setAnimEnable(false); + mAnmMaterialCheck[1].setAnimEnable(true); + mAnmMaterialCheck[1].setFrame(0.0f); + mAnmMaterialCheck[3].setAnimEnable(true); + mAnmMaterialCheck[3].setFrame(0.0f); + mLyts[SHOP_LYT_MATERIAL_CHECK].calc(); + mAnmMaterialCheck[3].setAnimEnable(false); + + mAnmShopInfo[1].setAnimEnable(true); + mAnmShopInfo[1].setFrame(0.0f); + mLyts[SHOP_LYT_SHOP_INFO].calc(); + dCsBase_c::GetInstance()->setVisible(false); + mStateStep = 1; + } + } else { + if (mAnmMaterialCheck[1].isEndReached()) { + mAnmMaterialCheck[1].setAnimEnable(false); + mAnmShopInfo[1].setAnimEnable(false); + fn_802A5BD0(); + mIsIdle = true; + } + } +} +void dLytShopMain_c::finalizeState_ModeOut() {} + +void dLytShopMain_c::initializeState_ModeInOut() {} +void dLytShopMain_c::executeState_ModeInOut() { + if (mStateStep == 0) { + if (mAnmMaterialCheck[5].isEndReached()) { + mAnmMaterialCheck[5].setAnimEnable(false); + + mAnmItemSelect[0].setAnimEnable(true); + mAnmItemSelect[0].setFrame(0.0f); + mLyts[SHOP_LYT_ITEM_SELECT].calc(); + + mAnmMaterialCheck[1].setAnimEnable(true); + mAnmMaterialCheck[1].setFrame(0.0f); + mAnmMaterialCheck[2].setAnimEnable(true); + mAnmMaterialCheck[2].setFrame(0.0f); + mAnmMaterialCheck[3].setAnimEnable(true); + mAnmMaterialCheck[3].setFrame(0.0f); + mAnmMaterialCheck[7].setAnimEnable(true); + mAnmMaterialCheck[7].setFrame(0.0f); + mAnmMaterialCheck[8].setAnimEnable(true); + mAnmMaterialCheck[8].setFrame(0.0f); + mLyts[SHOP_LYT_MATERIAL_CHECK].calc(); + mAnmMaterialCheck[2].setAnimEnable(false); + mAnmMaterialCheck[3].setAnimEnable(false); + mAnmMaterialCheck[7].setAnimEnable(false); + mAnmMaterialCheck[8].setAnimEnable(false); + + if (mService == SERVICE_POTION_INFUSE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_MDS_P1_APPEAR); + } else if (mService == SERVICE_GEAR_UPGRADE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RC_P1_APPEAR); + } + + fn_802A5CA0(true); + mStateStep = 1; + } + } else { + if (mAnmItemSelect[0].isEndReached() && mAnmMaterialCheck[1].isEndReached()) { + mAnmItemSelect[0].setAnimEnable(false); + mAnmMaterialCheck[1].setAnimEnable(false); + fn_802A5BD0(); + mPhase = PHASE_SELECT_ITEM; + dPadNav::setNavEnabled(true, false); + mIsIdle = true; + } + } +} +void dLytShopMain_c::finalizeState_ModeInOut() {} + +dLytShopMain_c::dLytShopMain_c() : mStateMgr(*this) {} + +bool dLytShopMain_c::build(d2d::ResAccIf_c *resAcc) { + for (int i = 0; i < SHOP_NUM_LYTS; i++) { + // TODO instruction swap, maybe will resolve itself? + mLyts[i].setResAcc(resAcc); + mLyts[i].build(sLytNames[i], nullptr); + } + + for (int i = 0; i < SHOP_ITEM_SELECT_NUM_ANIMS; i++) { + mAnmItemSelect[i].init( + brlanMapItemSelect[i].mFile, resAcc, mLyts[SHOP_LYT_ITEM_SELECT].getLayout(), brlanMapItemSelect[i].mName + ); + mAnmItemSelect[i].bind(false); + mAnmItemSelect[i].setAnimEnable(false); + } + + for (int i = 0; i < SHOP_MATERIAL_NUM_ANIMS; i++) { + mAnmMaterialCheck[i].init( + brlanMapMaterialCheck[i].mFile, resAcc, mLyts[SHOP_LYT_MATERIAL_CHECK].getLayout(), + brlanMapMaterialCheck[i].mName + ); + mAnmMaterialCheck[i].bind(false); + mAnmMaterialCheck[i].setAnimEnable(false); + } + + for (int i = 0; i < SHOP_SHOP_INFO_NUM_ANIMS; i++) { + mAnmShopInfo[i].init( + brlanMapShopInfo[i].mFile, resAcc, mLyts[SHOP_LYT_SHOP_INFO].getLayout(), brlanMapShopInfo[i].mName + ); + mAnmShopInfo[i].bind(false); + mAnmShopInfo[i].setAnimEnable(false); + } + + for (int i = 0; i < SHOP_ITEM_SELECT_NUM_BOUNDINGS; i++) { + mpItemBoundings[i] = mLyts[SHOP_LYT_ITEM_SELECT].findBounding(sItemSelectBoundings[i]); + } + + for (int i = 0; i < SHOP_MATERIAL_CHECK_CHOICE_NUM_BOUNDINGS; i++) { + mpMaterialCheckChoiceBoundings[i] = + mLyts[SHOP_LYT_MATERIAL_CHECK].findBounding(sMaterialCheckChoiceBoundings[i]); + } + + for (int i = 0; i < NUM_ITEMS; i++) { + mItemPouchSlots[i] = -1; + } + + buildSubpanes(); + + mAnmItemSelect[0].setAnimEnable(true); + mAnmItemSelect[0].setFrame(mAnmItemSelect[0].getLastFrame()); + mAnmItemSelect[6].setAnimEnable(true); + mAnmItemSelect[6].setFrame(0.0f); + mLyts[SHOP_LYT_ITEM_SELECT].calc(); + mAnmItemSelect[0].setAnimEnable(false); + + mAnmItemSelect[3].setForwardLoop(); + mAnmMaterialCheck[7].setForwardLoop(); + mAnmMaterialCheck[8].setForwardLoop(); + + mAnmMaterialCheck[0].setAnimEnable(true); + mAnmMaterialCheck[0].setFrame(0.0f); + mAnmMaterialCheck[7].setAnimEnable(true); + mAnmMaterialCheck[7].setFrame(0.0f); + mAnmMaterialCheck[8].setAnimEnable(true); + mAnmMaterialCheck[8].setFrame(0.0f); + mAnmMaterialCheck[9].setAnimEnable(true); + mAnmMaterialCheck[9].setFrame(0.0f); + mLyts[SHOP_LYT_MATERIAL_CHECK].calc(); + mAnmMaterialCheck[0].setAnimEnable(false); + + mAnmShopInfo[0].setAnimEnable(true); + mAnmShopInfo[0].setFrame(0.0f); + mLyts[SHOP_LYT_SHOP_INFO].calc(); + mAnmShopInfo[0].setAnimEnable(false); + + mCsHitChecks[0].init(mLyts[SHOP_LYT_ITEM_SELECT].getLayout()->GetRootPane(), 1, 0, 0); + mCsHitChecks[1].init(mLyts[SHOP_LYT_MATERIAL_CHECK].getLayout()->GetRootPane(), 1, 0, 0); + + dCsMgr_c::GetInstance()->registCursorTarget(&mCsHitChecks[0]); + dCsMgr_c::GetInstance()->registCursorTarget(&mCsHitChecks[1]); + + dCsBase_c::GetInstance()->setCursorStickTargetPane(mpItemBoundings[0]); + + setModeNone(); + field_0x116DD = false; + field_0x116DE = false; + mUpgradeLoaded = false; + mPrevPointerVisible = true; + + fn_802A5CA0(true); + + mPhase = PHASE_SELECT_ITEM; + mCurrentNavTarget = -12; + mStateStep = 0; + mUpgradeIdx = 0; + mItemCount = 0; + mUpgradeCostCount = 0; + field_0x11700 = 0; + + return true; +} + +bool dLytShopMain_c::execute() { + mCsHitChecks[mPhase].resetCachedHitboxes(); + mCsHitChecks[mPhase].execute(); + mStateMgr.executeState(); + + for (int i = 0; i < mItemCount; i++) { + if (mItemKinds[i] == dLytCommonIconItem_c::B_WHEEL) { + mBWheelOrPouchNodes[i].mpLytPane->execute(); + } else { + mBWheelOrPouchNodes[i + 12].mpLytPane->execute(); + } + } + + if (mUpgradeLoaded) { + for (int i = 0; i < mUpgradeCostCount; i++) { + if (i < 2) { + if (field_0x11770[i] == 0) { + mUpgradeNodes[i].mpLytPane->execute(); + } else { + mUpgradeNodes[i + 6].mpLytPane->execute(); + } + } else if (field_0x11770[i] == 0) { + mUpgradeNodes[i + 6].mpLytPane->execute(); + } else { + mUpgradeNodes[i].mpLytPane->execute(); + } + } + } + + for (int i = 0; i < 7; i++) { + if (mAnmItemSelect[i].isEnabled()) { + mAnmItemSelect[i].play(); + if (i == 1) { + f32 frame; + if (!field_0x116E1 || mAnmItemSelect[i].getFrame() == mAnmItemSelect[i].getLastFrame()) { + frame = 0.0f; + } else { + frame = 1.0f; + } + mAnmItemSelect[7].setAnimEnable(true); + mAnmItemSelect[7].setFrame(frame); + mLyts[SHOP_LYT_ITEM_SELECT].calc(); + mAnmItemSelect[7].setAnimEnable(false); + } + } + } + + for (int i = 0; i < 10; i++) { + if (mAnmMaterialCheck[i].isEnabled()) { + mAnmMaterialCheck[i].play(); + if (i == 2) { + f32 frame; + if (!field_0x116E1 || mAnmMaterialCheck[i].getFrame() == mAnmMaterialCheck[i].getLastFrame()) { + frame = 0.0f; + } else { + frame = 1.0f; + } + mAnmMaterialCheck[16].setAnimEnable(true); + mAnmMaterialCheck[16].setFrame(frame); + mLyts[SHOP_LYT_MATERIAL_CHECK].calc(); + mAnmMaterialCheck[16].setAnimEnable(false); + } + } + } + + for (int i = 0; i < 2; i++) { + if (mAnmShopInfo[i].isEnabled()) { + mAnmShopInfo[i].play(); + } + } + + for (int i = 0; i < SHOP_NUM_LYTS; i++) { + mLyts[i].calc(); + } + + mPrevPointerVisible = dPadNav::isPointerVisible(); + + return true; +} + +bool dLytShopMain_c::draw() { + for (int i = 0; i < SHOP_NUM_LYTS; i++) { + mLyts[i].addToDrawList(); + } + return true; +} + +bool dLytShopMain_c::remove() { + dCsMgr_c::GetInstance()->unregistCursorTarget(&mCsHitChecks[0]); + dCsMgr_c::GetInstance()->unregistCursorTarget(&mCsHitChecks[1]); + + // Okay this one does need temps to avoid regswaps, the others probably should use temps too for consistency + d2d::SubPaneList::Iterator it = mItemList.GetBeginIter(); + d2d::SubPaneList::Iterator end = mItemList.GetEndIter(); + for (; it != end; ++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 < 24; i++) { + mBWheelOrPouchNodes[i].mpLytPane->remove(); + } + + it = mUpgradeList.GetBeginIter(); + end = mUpgradeList.GetEndIter(); + for (; it != end; ++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 < 12; i++) { + mUpgradeNodes[i].mpLytPane->remove(); + } + + mUpgradeLoaded = false; + + for (int i = 0; i < SHOP_NUM_LYTS; i++) { + mLyts[i].unbindAnims(); + } + + for (int i = 0; i < SHOP_ITEM_SELECT_NUM_ANIMS; i++) { + mAnmItemSelect[i].remove(); + } + + for (int i = 0; i < SHOP_MATERIAL_NUM_ANIMS; i++) { + mAnmMaterialCheck[i].remove(); + } + + for (int i = 0; i < SHOP_SHOP_INFO_NUM_ANIMS; i++) { + mAnmShopInfo[i].remove(); + } + + return true; +} + +void dLytShopMain_c::setModeNone() { + mStateMgr.changeState(StateID_ModeNone); + mIsIdle = false; +} + +void dLytShopMain_c::setModeSelectIn() { + // TODO: wat + if (dCsBase_c::GetInstance()->isVisible()) { + dCsBase_c::GetInstance()->setVisible(true); + } + + f32 frame = mService != SERVICE_POTION_INFUSE ? 0.0f : 1.0f; + + mAnmItemSelect[8].setAnimEnable(true); + mAnmItemSelect[8].setFrame(frame); + mAnmItemSelect[0].setAnimEnable(true); + mAnmItemSelect[7].setAnimEnable(true); + mAnmItemSelect[7].setFrame(1.0f); + mAnmItemSelect[3].setAnimEnable(true); + mAnmItemSelect[3].setFrame(0.0f); + mLyts[SHOP_LYT_ITEM_SELECT].calc(); + mAnmItemSelect[8].setAnimEnable(false); + + mAnmShopInfo[0].setAnimEnable(true); + mAnmShopInfo[0].setFrame(0.0f); + mLyts[SHOP_LYT_SHOP_INFO].calc(); + + mStateMgr.changeState(StateID_ModeSelectIn); + mIsIdle = false; +} + +void dLytShopMain_c::setModeSelectCheck() { + mStateMgr.changeState(StateID_ModeSelectCheck); + mIsIdle = false; +} + +void dLytShopMain_c::setModeSelectOut() { + mStateStep = 0; + if (field_0x116DD) { + mAnmItemSelect[4].setAnimEnable(true); + mAnmItemSelect[4].setFrame(0.0f); + mLyts[SHOP_LYT_ITEM_SELECT].calc(); + } else { + mBWheelOrPouchItemIcons[mCurrentNavTarget + 12].startConfirm(); + field_0x11700 = mCurrentNavTarget; + } + dCsBase_c::GetInstance()->setVisible(false); + dPadNav::setNavEnabled(false, false); + mStateMgr.changeState(StateID_ModeSelectOut); + mIsIdle = false; +} + +void dLytShopMain_c::setModeOutIn() { + if (field_0x116DD) { + mStateStep = 0; + mAnmItemSelect[4].setAnimEnable(true); + mAnmItemSelect[4].setFrame(0.0f); + mLyts[SHOP_LYT_ITEM_SELECT].calc(); + } else { + s32 offset = mItemKinds[mCurrentNavTarget] == dLytCommonIconItem_c::B_WHEEL ? 0 : 12; + mStateStep = 0; + mBWheelOrPouchItemIcons[mCurrentNavTarget + offset].startConfirm(); + if (mCurrentNavTarget < 12) { + field_0x11700 = mCurrentNavTarget; + } else { + field_0x11700 = mCurrentNavTarget - 12; + } + } + mStateMgr.changeState(StateID_ModeSelectOut); + mIsIdle = false; +} + +void dLytShopMain_c::setModeMaterialCheck() { + dMessage_c::getInstance()->setField_0x2FC(-1); + mStateMgr.changeState(StateID_ModeMaterialCheck); + mIsIdle = false; +} + +void dLytShopMain_c::setModeOut() { + mStateStep = 0; + mAnmMaterialCheck[6].setAnimEnable(true); + mAnmMaterialCheck[6].setFrame(0.0f); + mLyts[SHOP_LYT_MATERIAL_CHECK].calc(); + mStateMgr.changeState(StateID_ModeMaterialCheck); + mIsIdle = false; +} + +void dLytShopMain_c::setModeInOut() { + mStateStep = 0; + mAnmMaterialCheck[5].setAnimEnable(true); + mAnmMaterialCheck[5].setFrame(0.0f); + mLyts[SHOP_LYT_MATERIAL_CHECK].calc(); + dMessage_c::getInstance()->setField_0x2FC(-2); + dLytMeter_c::setRupyField_0x8AC(0); + mStateMgr.changeState(StateID_ModeInOut); + mIsIdle = false; +} + +static const char *sGroupName = "G_ref_00"; + +void dLytShopMain_c::buildSubpanes() { + void *data = LayoutArcManager::GetInstance()->getLoadedData("DoButton"); + d2d::ResAccIf_c resAcc; + resAcc.attach(data, ""); + + for (int i = 0; i < (int)ARRAY_LENGTH(mBWheelOrPouchItemIcons); i++) { + mBWheelOrPouchNodes[i].mpLytPane = &mBWheelOrPouchItemIcons[i]; + if (i < 12) { + mBWheelOrPouchItemIcons[i].build(&resAcc, dLytCommonIconItem_c::B_WHEEL); + } else { + mBWheelOrPouchItemIcons[i].build(&resAcc, dLytCommonIconItem_c::POUCH); + } + mItemList.PushBack(&mBWheelOrPouchNodes[i]); + } + + nw4r::lyt::GroupContainer *container = mLyts[SHOP_LYT_ITEM_SELECT].getLayout()->GetGroupContainer(); + if (container != nullptr) { + nw4r::lyt::Group *g = container->FindGroupByName(sGroupName); + if (g != nullptr) { + d2d::dSubPane::linkMeters(g, &mItemList); + } + } + + for (int i = 0; i < (int)ARRAY_LENGTH(mBWheelOrPouchNodes); i++) { + mBWheelOrPouchNodes[i].mpPane->SetVisible(false); + } + + buildMaterialCheckIcons(&resAcc, dLytCommonIconItem_c::B_WHEEL); + buildMaterialCheckIcons(&resAcc, dLytCommonIconItem_c::POUCH); + + container = mLyts[SHOP_LYT_MATERIAL_CHECK].getLayout()->GetGroupContainer(); + if (container != nullptr) { + nw4r::lyt::Group *g = container->FindGroupByName(sGroupName); + if (g != nullptr) { + d2d::dSubPane::linkMeters(g, &mUpgradeList); + } + } + + for (int i = 0; i < (int)ARRAY_LENGTH(mUpgradeNodes); i++) { + mUpgradeNodes[i].mpPane->SetVisible(false); + } +} + +void dLytShopMain_c::prepareRemodelStoreStuff(s32 service) { + mService = service; + mItemCount = 0; + + s32 textVariant; + dTextBox_c *box1, *box2; + box1 = mLyts[SHOP_LYT_MATERIAL_CHECK].getTextBox("T_text_03"); + box2 = mLyts[SHOP_LYT_MATERIAL_CHECK].getTextBox("T_textS_03"); + + s32 offset1; + s32 offset2; + if (mService != SERVICE_POTION_INFUSE) { + // "Upgrade" + offset1 = 0; + offset2 = 28; + textVariant = 0; + } else { + // "Infuse" + offset1 = 28; + offset2 = 68; + textVariant = 1; + } + mLyts[SHOP_LYT_MATERIAL_CHECK].loadTextVariant(box1, textVariant); + mLyts[SHOP_LYT_MATERIAL_CHECK].loadTextVariant(box2, textVariant); + + for (int i = 0; i < (int)ARRAY_LENGTH(mItemUpgradeIdxes); i++) { + mItemUpgradeIdxes[i] = -1; + } + + s32 idx = 0; + if (mService == SERVICE_GEAR_UPGRADE && offset1 < 10) { + // Upgrade-able B-Wheel items (4) + static const s32 skips[] = {2, 2, 3, 3}; + for (int i = 0; i < 4; i++) { + bool show; + s32 itemTier = getItemTier(i); + if (itemTier == 0) { + show = false; + } else { + idx = offset1 + itemTier - 1; + show = sItemData[idx].canBeUpgraded; + if (show) { + // TODO change arg type to u16 + show = dAcItem_c::checkFlag((u16)sItemData[idx].itemId); + } + } + if (show) { + addItemToDisplayed(idx, dLytCommonIconItem_c::B_WHEEL, -1); + } + offset1 += skips[i]; + } + } + + if (mService == SERVICE_SHIELD_REPAIR) { + for (int i = 0; i < 8; i++) { + s32 pouchItemId = getPouchItemIdForIndex(i, false); + s32 val = getPouchShieldDurability2(i, false); + if (val >= 0 && getEvenMoreShieldStuff(i, false) > val) { + for (int i = 10; i < 19; i++) { + if (sItemData[i].itemId == pouchItemId) { + idx = i; + break; + } + } + addItemToDisplayed(idx, dLytCommonIconItem_c::POUCH, i); + } + } + } else { + // infusable or upgradeable pouch items + for (int i = 0; i < 8; i++) { + s32 pouchItemId = getPouchItemIdForIndex(i, false); + bool show = false; + for (int j = offset1; j < offset2; j++) { + if (sItemData[j].itemId == pouchItemId) { + show = sItemData[j].canBeUpgraded; + idx = j; + break; + } + } + + if (show) { + addItemToDisplayed(idx, dLytCommonIconItem_c::POUCH, i); + } + } + } + + for (int i = 0; i < 12; i++) { + if (i < mItemCount) { + if (mItemKinds[i] == dLytCommonIconItem_c::B_WHEEL) { + mBWheelOrPouchNodes[i].mpPane->SetVisible(true); + mBWheelOrPouchNodes[i + 12].mpPane->SetVisible(false); + mBWheelOrPouchItemIcons[i + 12].setVisible(false); + } else { + mBWheelOrPouchNodes[i].mpPane->SetVisible(false); + mBWheelOrPouchItemIcons[i].setVisible(false); + mBWheelOrPouchNodes[i + 12].mpPane->SetVisible(true); + } + } else { + mBWheelOrPouchNodes[i].mpPane->SetVisible(false); + mBWheelOrPouchItemIcons[i].setVisible(false); + mBWheelOrPouchNodes[i + 12].mpPane->SetVisible(false); + mBWheelOrPouchItemIcons[i + 12].setVisible(false); + } + } +} + +void dLytShopMain_c::addItemToDisplayed(s32 itemIdx, s32 itemKind, s32 pouchSlot) { + mItemKinds[mItemCount] = itemKind; + s32 iconIdx; + if (itemKind == dLytCommonIconItem_c::B_WHEEL) { + iconIdx = mItemCount; + } else { + iconIdx = mItemCount + 12; + } + + mBWheelOrPouchItemIcons[iconIdx].setUnk(true); + mBWheelOrPouchItemIcons[iconIdx].setHasNumber(false); + mBWheelOrPouchItemIcons[iconIdx].setItem(sLytIconMapping[itemIdx]); + + s32 id = sItemData[itemIdx].itemId; + bool found = false; + int i = 0; + if (mService != SERVICE_POTION_INFUSE) { + for (; i < (int)ARRAY_LENGTH(sGearUpgrades); i++) { + if (sGearUpgrades[i].oldItemId == id) { + found = true; + break; + } + } + } else { + for (; i < (int)ARRAY_LENGTH(sPotionUpgrades); i++) { + if (sPotionUpgrades[i].oldItemId == id) { + found = true; + break; + } + } + } + + if (found) { + mItemUpgradeIdxes[mItemCount] = i; + } + + f32 durability = getPouchShieldDurability(pouchSlot, false); + if (durability >= 0.0f) { + mBWheelOrPouchItemIcons[iconIdx].setShieldDurability(durability); + } + mItemPouchSlots[mItemCount] = pouchSlot; + mItemCount++; +} + +void dLytShopMain_c::buildMaterialCheckIcons(d2d::ResAccIf_c *resAcc, u8 variant) { + u8 costVariant; + s32 upgradeItemIconOffset, upgradeMatIconOffset, nodeOffset; + if (variant == dLytCommonIconItem_c::B_WHEEL) { + costVariant = dLytCommonIconMaterial_c::TREASURE; + upgradeItemIconOffset = 0; + upgradeMatIconOffset = 0; + nodeOffset = 0; + } else { + costVariant = dLytCommonIconMaterial_c::BUG; + upgradeItemIconOffset = 2; + upgradeMatIconOffset = 4; + nodeOffset = 6; + } + + s32 run = nodeOffset; + + // base item + mUpgradeNodes[run].mpLytPane = &mUpgradePreviewIcons[upgradeItemIconOffset]; + mUpgradePreviewIcons[upgradeItemIconOffset].build(resAcc, variant); + mUpgradeList.PushBack(&mUpgradeNodes[run]); + + upgradeItemIconOffset++; + run++; + // new item + mUpgradeNodes[run].mpLytPane = &mUpgradePreviewIcons[upgradeItemIconOffset]; + mUpgradePreviewIcons[upgradeItemIconOffset].build(resAcc, variant); + mUpgradeList.PushBack(&mUpgradeNodes[run]); + + // upgrade costs + for (int i = 0; i < 4; i++) { + mUpgradeNodes[nodeOffset + i + 2].mpLytPane = &mUpgradeCostIcons[upgradeMatIconOffset + i]; + mUpgradeCostIcons[upgradeMatIconOffset + i].build(resAcc, costVariant); + mUpgradeList.PushBack(&mUpgradeNodes[nodeOffset + i + 2]); + } +} + +s32 dLytShopMain_c::getItemTier(s32 i) { + if (i == 0) { + return dAcPy_c::GetLink()->getCurrentBugNetType(); + } else if (i == 1) { + return dAcPy_c::GetLink()->getCurrentSlingshotType(); + } else if (i == 2) { + s32 ty = dAcPy_c::GetLink()->getCurrentBeetleType() - 1; + if (ty < 0) { + ty = 0; + } + return ty; + } else { + return dAcPy_c::GetLink()->getCurrentBowType(); + } +} + +void dLytShopMain_c::handleNavigation() { + dCursorHitCheck_c *d = dCsBase_c::GetInstance()->getHitCheck(); + s32 nextTarget; + bool selectIcon = false; + s32 i1, i2; + if (mPhase == PHASE_SELECT_ITEM) { + i1 = 13; + i2 = 1; + for (int i = 0; i < NUM_ITEMS; i++) { + mpItemBoundings[i + SHOP_ITEM_SELECT_BOUNDING_ITEM_OFFSET]->SetVisible(false); + } + } else { + i1 = 2; + i2 = 2; + } + + bool pointerVisible = dPadNav::isPointerVisible(); + if (mPhase == PHASE_SELECT_ITEM) { + if (pointerVisible) { + for (nextTarget = 0; nextTarget < mItemCount; nextTarget++) { + s32 iconIdx; + if (mItemKinds[nextTarget] == dLytCommonIconItem_c::B_WHEEL) { + iconIdx = nextTarget; + } else { + iconIdx = nextTarget + 12; + } + if (mBWheelOrPouchItemIcons[iconIdx].isCursorOver()) { + selectIcon = true; + mUpgradeIdx = mItemUpgradeIdxes[nextTarget]; + break; + } + } + } else { + if (dPadNav::getFSStickNavDirection() != dPadNav::FS_STICK_NONE) { + nextTarget = mCurrentNavTarget; + if (nextTarget < 0 || mPrevPointerVisible) { + if (nextTarget == -13) { + nextTarget = 12; + } else if (nextTarget < 0) { + nextTarget += 12; + } + dCsBase_c::GetInstance()->setCursorStickTargetPane(mpItemBoundings[nextTarget]); + selectIcon = true; + } else { + switch (checkNav()) { + case dPadNav::FS_STICK_UP: + selectIcon = true; + nextTarget = mCurrentNavTarget - 6; + break; + case dPadNav::FS_STICK_UP_RIGHT: + selectIcon = true; + nextTarget = mCurrentNavTarget - 5; + break; + case dPadNav::FS_STICK_RIGHT: + selectIcon = true; + nextTarget = mCurrentNavTarget + 1; + break; + case dPadNav::FS_STICK_DOWN_RIGHT: + selectIcon = true; + nextTarget = mCurrentNavTarget + 7; + break; + case dPadNav::FS_STICK_DOWN: + selectIcon = true; + nextTarget = mCurrentNavTarget + 6; + break; + case dPadNav::FS_STICK_DOWN_LEFT: + selectIcon = true; + nextTarget = mCurrentNavTarget + 5; + break; + case dPadNav::FS_STICK_LEFT: + selectIcon = true; + nextTarget = mCurrentNavTarget - 1; + break; + case dPadNav::FS_STICK_UP_LEFT: + selectIcon = true; + nextTarget = mCurrentNavTarget - 7; + break; + default: + selectIcon = true; + nextTarget = mCurrentNavTarget; + break; + } + if (nextTarget >= 12) { + nextTarget = 12; + } + dCsBase_c::GetInstance()->setCursorStickTargetPane(mpItemBoundings[nextTarget]); + } + } else if (mCurrentNavTarget >= 0) { + selectIcon = true; + nextTarget = mCurrentNavTarget; + } + } + } else { + if (!pointerVisible) { + if (mPrevPointerVisible) { + // Sorry what? Why is dPadNav not good enough here? + if (dPad::ex_c::getInstance()->getFSStickTrig(0x1) || dPad::ex_c::getInstance()->getFSStickTrig(0x10)) { + // up/down + dPadNav::setNavEnabled(true, false); + if (mCurrentNavTarget >= 0) { + nextTarget = mCurrentNavTarget; + selectIcon = true; + } + } else { + if (dPad::ex_c::getInstance()->getFSStickTrig(0x80) || + dPad::ex_c::getInstance()->getFSStickTrig(0x40) || + dPad::ex_c::getInstance()->getFSStickTrig(0x20)) { + // right + nextTarget = 1; + } else { + // left + nextTarget = 0; + } + dCsBase_c::GetInstance()->setCursorStickTargetPane(mpMaterialCheckChoiceBoundings[nextTarget]); + selectIcon = true; + } + } else { + switch (dPadNav::getFSStickNavDirection()) { + case 2: + case 3: + case 4: + nextTarget = 1; + dCsBase_c::GetInstance()->setCursorStickTargetPane(mpMaterialCheckChoiceBoundings[1]); + selectIcon = true; + break; + case 6: + case 7: + case 8: + nextTarget = 0; + dCsBase_c::GetInstance()->setCursorStickTargetPane(mpMaterialCheckChoiceBoundings[0]); + selectIcon = true; + break; + default: nextTarget = mCurrentNavTarget; selectIcon = true; + } + } + } + } + + if (!selectIcon && pointerVisible) { + if (d != nullptr && d->getType() == 'lyt ') { + for (nextTarget = 0; nextTarget < i1; nextTarget++) { + nw4r::lyt::Bounding *b; + if (mPhase == 0) { + b = mpItemBoundings[12]; + nextTarget = 12; + } else { + b = mpMaterialCheckChoiceBoundings[nextTarget]; + } + if (static_cast<dCursorHitCheckLyt_c *>(d)->getHitPane() == b) { + selectIcon = true; + break; + } + } + } + } + + if (selectIcon) { + if (mCurrentNavTarget != nextTarget) { + if (mCurrentNavTarget >= 0) { + if (mPhase == PHASE_SELECT_ITEM) { + if (mCurrentNavTarget == 12) { + mAnmItemSelect[i2].setBackwardsOnce(); + mAnmItemSelect[2].setBackwardsOnce(); + field_0x116DD = false; + } else if (mItemKinds[mCurrentNavTarget] == dLytCommonIconItem_c::B_WHEEL) { + mBWheelOrPouchItemIcons[mCurrentNavTarget].setOff(); + } else { + mBWheelOrPouchItemIcons[mCurrentNavTarget + 12].setOff(); + } + } else { + mAnmMaterialCheck[i2 + mCurrentNavTarget].setBackwardsOnce(); + if (mCurrentNavTarget == 0) { + mAnmMaterialCheck[4].setBackwardsOnce(); + } + } + } + + if (mPhase == PHASE_SELECT_ITEM) { + if (nextTarget == 12) { + mAnmItemSelect[i2].setAnimEnable(true); + mAnmItemSelect[i2].setFrame(0.0f); + mAnmItemSelect[i2].setForwardOnce(); + mAnmItemSelect[2].setForwardOnce(); + field_0x116DD = true; + if (mService == SERVICE_POTION_INFUSE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_MDS_P1_POINT_BACK); + } else if (mService == SERVICE_GEAR_UPGRADE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RC_P1_POINT_BACK); + } else { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RP_POINT_BACK); + } + } else { + if (mItemKinds[nextTarget] == dLytCommonIconItem_c::B_WHEEL) { + mBWheelOrPouchItemIcons[nextTarget].setOn(); + } else { + mBWheelOrPouchItemIcons[nextTarget + 12].setOn(); + } + if (mService == SERVICE_POTION_INFUSE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_MDS_P1_POINT_ITEM); + } else if (mService == SERVICE_GEAR_UPGRADE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RC_P1_POINT_ITEM); + } else { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RP_POINT_ITEM); + } + } + } else { + mAnmMaterialCheck[i2 + nextTarget].setAnimEnable(true); + mAnmMaterialCheck[i2 + nextTarget].setFrame(0.0f); + mAnmMaterialCheck[i2 + nextTarget].setForwardOnce(); + if (nextTarget == 0) { + mAnmMaterialCheck[4].setForwardOnce(); + } + + if (nextTarget == 0) { + field_0x116DD = true; + field_0x116DE = false; + if (mService == SERVICE_POTION_INFUSE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_MDS_P2_POINT_BACK); + } else if (mService == SERVICE_GEAR_UPGRADE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RC_P2_POINT_BACK); + } + } else if (nextTarget == 1) { + field_0x116DE = true; + field_0x116DD = false; + if (mService == SERVICE_POTION_INFUSE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_MDS_P2_POINT_BLEND); + } else if (mService == SERVICE_GEAR_UPGRADE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RC_P2_POINT_RECONST); + } + } + } + mCurrentNavTarget = nextTarget; + dRumble_c::start(dRumble_c::sRumblePreset1, dRumble_c::FLAG_SLOT0); + } + } else { + if (mCurrentNavTarget >= 0) { + if (mPhase == PHASE_SELECT_ITEM) { + if (mCurrentNavTarget == 12) { + mAnmItemSelect[i2].setBackwardsOnce(); + mCurrentNavTarget = -13; + } else { + if (mItemKinds[mCurrentNavTarget] == dLytCommonIconItem_c::B_WHEEL) { + mBWheelOrPouchItemIcons[mCurrentNavTarget].setOff(); + } else { + mBWheelOrPouchItemIcons[mCurrentNavTarget + 12].setOff(); + } + mCurrentNavTarget -= 12; + } + } else { + mAnmMaterialCheck[i2 + mCurrentNavTarget].setBackwardsOnce(); + mCurrentNavTarget -= 2; + } + field_0x116DD = false; + field_0x116DE = false; + } + } +} + +void dLytShopMain_c::updateShopStuffMaybe() { + // TODO - Nonmatching. Probably equivalent. + + SizedString<64> buf; + ShopUpgradeCosts costs; + if (mService != SERVICE_POTION_INFUSE) { + costs = sGearUpgrades[mUpgradeIdx]; + } else { + costs = sPotionUpgrades[mUpgradeIdx]; + } + + showShopLytMaybe(); + showPriceMaybe(costs.price); + + s32 someFrame = 0; + + s32 a1 = fn_802A4490(costs.oldItemId); + s32 a2 = fn_802A4500(a1); + s32 a3 = fn_802A5760(a2); + field_0x11770[0] = a2; + mUpgradePreviewIcons[a3].setUnk(false); + mUpgradePreviewIcons[a3].setHasNumber(false); + mUpgradePreviewIcons[a3].setItem(sLytIconMapping[a1]); + mUpgradePreviewIcons[a3].setShieldOnOff(false); + + if (field_0x11770[0] == 0) { + mUpgradeNodes[0].mpPane->SetVisible(true); + } else { + mUpgradeNodes[6].mpPane->SetVisible(true); + } + + a1 = fn_802A4490(costs.newItemId); + a2 = fn_802A4500(a1); + a3 = fn_802A5760(a2); + field_0x11770[1] = a2; + mUpgradePreviewIcons[a3 + 1].setUnk(false); + mUpgradePreviewIcons[a3 + 1].setHasNumber(false); + mUpgradePreviewIcons[a3 + 1].setItem(sLytIconMapping[a1]); + mUpgradePreviewIcons[a3 + 1].setShieldOnOff(false); + + if (field_0x11770[1] == 0) { + mUpgradeNodes[1].mpPane->SetVisible(true); + } else { + mUpgradeNodes[7].mpPane->SetVisible(true); + } + + mUpgradeCostCount = 2; + + // REGSWAPS start here. + // Actual code: loop variables r18-r23, text boxes r14,r24-r28 + // Generated code: loop variables r23-r28, text boxes r14,r18-r22 + + dTextBox_c *b1, *b2, *b3, *b4, *b5, *b6; + + for (int i = 0; i < 4; i++) { + s32 i1 = i * 3 + 2; + s32 i2 = i * 2; + s32 i3 = i2 + 1; + + buf.sprintf("T_message_%02d", i1); + b1 = mLyts[SHOP_LYT_MATERIAL_CHECK].getTextBox(buf); + buf.sprintf("T_materialNum_%02d", i2); + b2 = mLyts[SHOP_LYT_MATERIAL_CHECK].getTextBox(buf); + buf.sprintf("T_materialNum_%02d", i3); + b3 = mLyts[SHOP_LYT_MATERIAL_CHECK].getTextBox(buf); + buf.sprintf("T_messageS_%02d", i1); + b4 = mLyts[SHOP_LYT_MATERIAL_CHECK].getTextBox(buf); + buf.sprintf("T_matNumS_%02d", i2); + b5 = mLyts[SHOP_LYT_MATERIAL_CHECK].getTextBox(buf); + buf.sprintf("T_matNumS_%02d", i3); + b6 = mLyts[SHOP_LYT_MATERIAL_CHECK].getTextBox(buf); + + mAnmMaterialCheck[i + 11].setAnimEnable(true); + + static wchar_t sBuf[5]; + for (int j = 0; j < (int)ARRAY_LENGTH(sBuf); j++) { + sBuf[j] = L'\0'; + } + if (costs.matCosts[i].itemId < 0) { + b1->setTextWithGlobalTextProcessor(sBuf, nullptr); + b2->setTextWithGlobalTextProcessor(sBuf, nullptr); + b3->setTextWithGlobalTextProcessor(sBuf, nullptr); + b4->setTextWithGlobalTextProcessor(sBuf, nullptr); + b5->setTextWithGlobalTextProcessor(sBuf, nullptr); + b6->setTextWithGlobalTextProcessor(sBuf, nullptr); + + someFrame = 1; + mUpgradeNodes[i + 2].mpPane->SetVisible(false); + mUpgradeNodes[i + 8].mpPane->SetVisible(false); + } else { + // TODO check if we can avoid this cast... + // getItemText has a bunch of other users as well + const wchar_t *text = getItemText((u16)costs.matCosts[i].itemId); + b1->setTextWithGlobalTextProcessor(text); + b4->setTextWithGlobalTextProcessor(text); + + s32 amt = costs.matCosts[i].amount; + (void)calcNumDigits(amt); + swprintf(sBuf, ARRAY_LENGTH(sBuf), L"%d", amt); + b2->setTextWithGlobalTextProcessor(sBuf, nullptr); + b5->setTextWithGlobalTextProcessor(sBuf, nullptr); + + for (int j = 0; j < (int)ARRAY_LENGTH(sBuf); j++) { + sBuf[j] = L'\0'; + } + + // TODO ?????????? + s32 counterIdx = costs.matCosts[i].itemId >= ITEM_HORNET_LARVAE ? + costs.matCosts[i].itemId - ITEM_UNK_139 : + costs.matCosts[i].itemId - ITEM_SMALL_QUIVER; + + // Probably some register weirdness around here + bool shadow = !dAcItem_c::checkFlag((u16)costs.matCosts[i].itemId); + s32 counter = getCounterByIndex(counterIdx); + (void)calcNumDigits(counter); + swprintf(sBuf, ARRAY_LENGTH(sBuf), L"%d", amt); + b3->setTextWithGlobalTextProcessor(sBuf, nullptr); + b6->setTextWithGlobalTextProcessor(sBuf, nullptr); + + if (counter != 0 && counter >= costs.matCosts[i].amount) { + mAnmMaterialCheck[i + 11].setFrame(0.0f); + } else { + mAnmMaterialCheck[i + 11].setFrame(1.0f); + } + + a1 = fn_802A4490(costs.matCosts[i].itemId); + a2 = fn_802A4500(a1); + a3 = fn_802A5780(a2); + field_0x11770[mUpgradeCostCount] = a2; + mUpgradeCostIcons[a3 + i].setBg(false); + mUpgradeCostIcons[a3 + i].setHasNumber(false); + mUpgradeCostIcons[a3 + i].setShadow(shadow); + mUpgradeCostIcons[a3 + i].setItem(sLytIconMapping[a1]); + + if (field_0x11770[mUpgradeCostCount] == 0) { + mUpgradeNodes[i + 2].mpPane->SetVisible(false); + mUpgradeNodes[i + 8].mpPane->SetVisible(true); + } else { + mUpgradeNodes[i + 2].mpPane->SetVisible(true); + mUpgradeNodes[i + 8].mpPane->SetVisible(false); + } + mUpgradeCostCount++; + } + } + + mAnmMaterialCheck[15].setAnimEnable(true); + mAnmMaterialCheck[15].setFrame(someFrame); + mUpgradeLoaded = true; +} + +s32 dLytShopMain_c::calcNumDigits(s32 value) { + int cmp = 1000; + int i = 4; + for (; i > 1; i--) { + if (value >= cmp) { + break; + } + cmp /= 10; + } + return i; +} + +STATE_DEFINE(dLytShop_c, None); +STATE_DEFINE(dLytShop_c, SelectIn); +STATE_DEFINE(dLytShop_c, SelectCheck); +STATE_DEFINE(dLytShop_c, SelectOut); +STATE_DEFINE(dLytShop_c, OutIn); +STATE_DEFINE(dLytShop_c, MaterialCheck); +STATE_DEFINE(dLytShop_c, Out); +STATE_DEFINE(dLytShop_c, InOut); +STATE_DEFINE(dLytShop_c, End); + +void dLytShop_c::initializeState_None() {} +void dLytShop_c::executeState_None() { + if (mInRequest) { + mMain.setModeSelectIn(); + mStateMgr.changeState(StateID_SelectIn); + mInRequest = false; + } +} +void dLytShop_c::finalizeState_None() {} + +void dLytShop_c::initializeState_SelectIn() {} +void dLytShop_c::executeState_SelectIn() { + if (mMain.isIdle()) { + dPadNav::setNavEnabled(true, false); + mMain.setModeSelectCheck(); + mStateMgr.changeState(StateID_SelectCheck); + } +} +void dLytShop_c::finalizeState_SelectIn() {} + +void dLytShop_c::initializeState_SelectCheck() {} +void dLytShop_c::executeState_SelectCheck() { + if (mMain.isIdle()) { + s32 service = mMain.getService(); + if (mMain.getField_0x116DD()) { + mMain.setModeSelectOut(); + mStateMgr.changeState(StateID_SelectOut); + + if (service == dLytShopMain_c::SERVICE_POTION_INFUSE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_MDS_P1_SELECT_BACK); + } else if (service == dLytShopMain_c::SERVICE_GEAR_UPGRADE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RC_P1_SELECT_BACK); + } else { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RP_SELECT_BACK); + } + } else if (service == dLytShopMain_c::SERVICE_SHIELD_REPAIR) { + mMain.setModeSelectOut(); + mStateMgr.changeState(StateID_SelectOut); + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RP_SELECT_ITEM); + } else { + mMain.setModeOutIn(); + mStateMgr.changeState(StateID_OutIn); + if (service == dLytShopMain_c::SERVICE_POTION_INFUSE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_MDS_P1_SELECT_ITEM); + } else if (service == dLytShopMain_c::SERVICE_GEAR_UPGRADE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RC_P1_SELECT_ITEM); + } + } + } +} +void dLytShop_c::finalizeState_SelectCheck() {} + +void dLytShop_c::initializeState_SelectOut() {} +void dLytShop_c::executeState_SelectOut() { + if (mMain.isIdle()) { + mIsMovingOut = true; + mMain.setModeNone(); + mStateMgr.changeState(StateID_End); + } +} +void dLytShop_c::finalizeState_SelectOut() {} + +void dLytShop_c::initializeState_OutIn() {} +void dLytShop_c::executeState_OutIn() { + if (mMain.isIdle()) { + mMain.setModeMaterialCheck(); + mStateMgr.changeState(StateID_MaterialCheck); + } +} +void dLytShop_c::finalizeState_OutIn() {} + +void dLytShop_c::initializeState_MaterialCheck() {} +void dLytShop_c::executeState_MaterialCheck() { + if (mMain.isIdle()) { + s32 service = mMain.getService(); + if (mMain.getField_0x116DD()) { + mMain.setModeInOut(); + mStateMgr.changeState(StateID_InOut); + + if (service == dLytShopMain_c::SERVICE_POTION_INFUSE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_MDS_P2_SELECT_BACK); + } else if (service == dLytShopMain_c::SERVICE_GEAR_UPGRADE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RC_P2_SELECT_BACK); + } + } else if (mMain.getField_0x116DE()) { + mMain.setModeOut(); + mStateMgr.changeState(StateID_Out); + if (service == dLytShopMain_c::SERVICE_POTION_INFUSE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_MDS_P2_SELECT_BLEND); + } else if (service == dLytShopMain_c::SERVICE_GEAR_UPGRADE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RC_P2_SELECT_RECONST); + } + } else { + mMain.retry(); + } + } +} +void dLytShop_c::finalizeState_MaterialCheck() {} + +void dLytShop_c::initializeState_Out() {} +void dLytShop_c::executeState_Out() { + if (mMain.isIdle()) { + mMain.setModeNone(); + mStateMgr.changeState(StateID_End); + } +} +void dLytShop_c::finalizeState_Out() {} + +void dLytShop_c::initializeState_InOut() {} +void dLytShop_c::executeState_InOut() { + if (mMain.isIdle()) { + mMain.setModeSelectCheck(); + mStateMgr.changeState(StateID_SelectCheck); + } +} +void dLytShop_c::finalizeState_InOut() {} + +void dLytShop_c::initializeState_End() {} +void dLytShop_c::executeState_End() {} +void dLytShop_c::finalizeState_End() {} + +SPECIAL_BASE_PROFILE(LYT_SHOP, dLytShop_c, fProfile::LYT_SHOP, 0x2B8, 0); + +bool dLytShop_c::build() { + void *data = LayoutArcManager::GetInstance()->getLoadedData("Shop"); + mResAcc.attach(data, ""); + mMain.build(&mResAcc); + return true; +} + +int dLytShop_c::create() { + sInstance = this; + allocateLytWork1Heap("dLytShop_c::m_allocator", false); + mStateMgr.changeState(StateID_None); + mInRequest = false; + mIsMovingOut = false; + return SUCCEEDED; +} + +int dLytShop_c::execute() { + if (*mStateMgr.getStateID() != StateID_None) { + if (dPad::getDownTrigDown()) { + dPad::ex_c::getInstance()->centerCursor(mPad::getCurrentCoreID(), true); + } + if (dCsBase_c::GetInstance()->isVisible()) { + dCsGame_c::GetInstance()->pointerDefSet(); + } + mMain.execute(); + } + mStateMgr.executeState(); + return SUCCEEDED; +} + +int dLytShop_c::draw() { + if (*mStateMgr.getStateID() != StateID_None || mIsMovingOut) { + mMain.draw(); + } + return SUCCEEDED; +} + +int dLytShop_c::doDelete() { + mMain.remove(); + mResAcc.detach(); + sInstance = nullptr; + return SUCCEEDED; +} |
