Merge pull request #290 from robojumper/d_lyt_deposit

d_lyt_deposit OK
This commit is contained in:
robojumper
2026-01-24 11:10:18 +01:00
committed by GitHub
20 changed files with 4403 additions and 486 deletions
@@ -4,8 +4,8 @@
#ifdef __cplusplus
namespace std {
using ::mbstowcs;
using ::mbtowc;
// using ::mbstowcs;
// using ::mbtowc;
using ::swprintf;
using ::vswprintf;
using ::wcscat;
@@ -14,7 +14,7 @@ using ::wcscmp;
using ::wcscpy;
using ::wcslen;
using ::wcsncpy;
using ::wcstombs;
// using ::wcstombs;
} // namespace std
#endif
+22 -19
View File
@@ -4,6 +4,7 @@
#include "d/d_cursor_hit_check.h"
#include "d/d_pad_nav.h"
#include "d/snd/d_snd_small_effect_mgr.h"
#include "m/m_vec.h"
#include "rvl/MTX/mtx.h"
#include "toBeSorted/arc_managers/layout_arc_manager.h"
@@ -76,7 +77,7 @@ bool dLytCommonArrow_c::execute() {
mLytBase.calc();
mCsHitCheck.resetCachedHitboxes();
mCsHitCheck.execute();
field_0x6BC = field_0x6B8;
mLastActiveArrow = mActiveArrow;
return true;
}
@@ -96,8 +97,10 @@ void dLytCommonArrow_c::setState(s32 state) {
}
}
void dLytCommonArrow_c::setTranslate(const Vec *arg) {
nw4r::math::VEC3 v(*arg);
void dLytCommonArrow_c::setTranslate(const mVec2_c *arg) {
nw4r::math::VEC3 v;
v.x = arg->x;
v.y = arg->y;
v.z = 0.0f;
mLytBase.getLayout()->GetRootPane()->SetTranslate(v);
}
@@ -118,9 +121,9 @@ bool dLytCommonArrow_c::requestOut() {
return true;
}
bool dLytCommonArrow_c::fn_80168760() {
if (field_0x6C0 == ARROW_NONE && field_0x6B8 != ARROW_NONE) {
field_0x6C0 = field_0x6B8;
bool dLytCommonArrow_c::triggerArrowPress() {
if (mTriggeredArrow == ARROW_NONE && mActiveArrow != ARROW_NONE) {
mTriggeredArrow = mActiveArrow;
return true;
}
return false;
@@ -177,9 +180,9 @@ void dLytCommonArrow_c::initializeState_None() {
mIsChangingState = false;
mVisible = false;
mPointedAtArrow = ARROW_NONE;
field_0x6B8 = ARROW_NONE;
field_0x6BC = ARROW_NONE;
field_0x6C0 = ARROW_NONE;
mActiveArrow = ARROW_NONE;
mLastActiveArrow = ARROW_NONE;
mTriggeredArrow = ARROW_NONE;
mTimer = 0;
displayElement(ANIM_IN, 0.0f);
mBackwards = true;
@@ -238,11 +241,11 @@ void dLytCommonArrow_c::executeState_Wait() {
}
checkPointAtPane();
if (field_0x6B8 == ARROW_LEFT) {
if (mActiveArrow == ARROW_LEFT) {
d2d::AnmGroup_c &g = mAnmGroups[ANIM_ONOFF_L];
g.play();
tickDown(&mAnmGroups[ANIM_ONOFF_R]);
} else if (field_0x6B8 == ARROW_RIGHT) {
} else if (mActiveArrow == ARROW_RIGHT) {
d2d::AnmGroup_c &g = mAnmGroups[ANIM_ONOFF_R];
g.play();
tickDown(&mAnmGroups[ANIM_ONOFF_L]);
@@ -260,9 +263,9 @@ void dLytCommonArrow_c::executeState_Wait() {
switch (mTimer) {
case 0:
if (field_0x6C0 != ARROW_NONE) {
displayElement(field_0x6C0 + ANIM_DECIDE_OFFSET, 0.0f);
if (field_0x6C0 == 0) {
if (mTriggeredArrow != ARROW_NONE) {
displayElement(mTriggeredArrow + ANIM_DECIDE_OFFSET, 0.0f);
if (mTriggeredArrow == ARROW_LEFT) {
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_SELECT_TURN_PAGE_LEFT);
} else {
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_SELECT_TURN_PAGE_RIGHT);
@@ -271,7 +274,7 @@ void dLytCommonArrow_c::executeState_Wait() {
}
break;
case 1: {
d2d::AnmGroup_c &g = mAnmGroups[field_0x6C0 + ANIM_DECIDE_OFFSET];
d2d::AnmGroup_c &g = mAnmGroups[mTriggeredArrow + ANIM_DECIDE_OFFSET];
if (g.isEndReached() == true) {
mTimer++;
mIsChangingState = true;
@@ -279,15 +282,15 @@ void dLytCommonArrow_c::executeState_Wait() {
g.play();
} break;
case 2:
unbindAt(field_0x6C0 + ANIM_DECIDE_OFFSET);
unbindAt(mTriggeredArrow + ANIM_DECIDE_OFFSET);
mTimer = 0;
mIsChangingState = false;
field_0x6C0 = ARROW_NONE;
mTriggeredArrow = ARROW_NONE;
break;
}
if (field_0x6BC != field_0x6B8 && field_0x6B8 != ARROW_NONE) {
if (field_0x6B8 == ARROW_LEFT) {
if (mLastActiveArrow != mActiveArrow && mActiveArrow != ARROW_NONE) {
if (mActiveArrow == ARROW_LEFT) {
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_POINT_TURN_PAGE_LEFT);
} else {
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_POINT_TURN_PAGE_RIGHT);
File diff suppressed because it is too large Load Diff
+205
View File
@@ -0,0 +1,205 @@
#include "d/lyt/d_lyt_deposit_box_cursor.h"
#include "common.h"
#include "d/d_cs_base.h"
#include "d/d_pad_nav.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_util_items.h"
#include "m/m_vec.h"
#include "nw4r/lyt/lyt_group.h"
#include "nw4r/lyt/lyt_pane.h"
#include "nw4r/math/math_types.h"
#include "toBeSorted/arc_managers/layout_arc_manager.h"
static const d2d::LytBrlanMapping brlanMap[] = {
{ "depositBoxCursor_00_loop.brlan", "G_loop_00"},
{"depositBoxCursor_00_stickCursor.brlan", "G_stickCursor_00"},
};
#define DEPOSIT_BOX_CURSOR_ANIM_LOOP 0
#define DEPOSIT_BOX_CURSOR_ANIM_STICK_CURSOR 1
#define DEPOSIT_BOX_CURSOR_NUM_ANIMS 2
bool dLytDepositBoxCursor_c::build(d2d::ResAccIf_c *resAcc) {
mLyt.setResAcc(resAcc);
mLyt.build("depositBoxCursor_00.brlyt", nullptr);
mLyt.setPriority(0x88);
for (int i = 0; i < DEPOSIT_BOX_CURSOR_NUM_ANIMS; i++) {
mAnm[i].init(brlanMap[i].mFile, resAcc, mLyt.getLayout(), brlanMap[i].mName);
mAnm[i].bind(false);
mAnm[i].setAnimEnable(false);
}
mAnm[DEPOSIT_BOX_CURSOR_ANIM_LOOP].setAnimEnable(true);
mAnm[DEPOSIT_BOX_CURSOR_ANIM_LOOP].setFrame(0.0f);
mLyt.calc();
mpStickCursorPane = mLyt.findPane("N_stickCursor_00");
mpGetIconPane = mLyt.findPane("N_getIcon_00");
initIcon();
mIsVisible = false;
mIsSellMode = false;
return true;
}
bool dLytDepositBoxCursor_c::execute() {
realizeNav();
mAnm[DEPOSIT_BOX_CURSOR_ANIM_LOOP].play();
if (mIsVisible) {
mNode.mpLytPane->execute();
}
mLyt.calc();
return true;
}
bool dLytDepositBoxCursor_c::draw() {
if (mIsVisible) {
mLyt.addToDrawList();
}
return true;
}
bool dLytDepositBoxCursor_c::remove() {
for (d2d::SubPaneList::Iterator it = mSubpaneList.GetBeginIter(); it != mSubpaneList.GetEndIter(); ++it) {
d2d::dSubPane *subPane = it->mpLytPane;
if (subPane != nullptr) {
nw4r::lyt::Pane *parent = subPane->getPane()->GetParent();
parent->RemoveChild(subPane->getPane());
}
}
mNode.mpLytPane->remove();
mLyt.unbindAnims();
for (int i = 0; i < DEPOSIT_BOX_CURSOR_NUM_ANIMS; i++) {
mAnm[i].remove();
}
return true;
}
static const char *sGroupName = "G_ref_00";
void dLytDepositBoxCursor_c::initIcon() {
void *data = LayoutArcManager::GetInstance()->getLoadedData("DoButton");
d2d::ResAccIf_c resAcc;
resAcc.attach(data, "");
mNode.mpLytPane = &mIcon;
mIcon.build(&resAcc, dLytCommonIconItem_c::POUCH);
mSubpaneList.PushBack(&mNode);
if (mLyt.getLayout()->GetGroupContainer() != nullptr) {
nw4r::lyt::Group *g = mLyt.getLayout()->GetGroupContainer()->FindGroupByName(sGroupName);
if (g != nullptr) {
d2d::dSubPane::linkMeters(g, &mSubpaneList);
}
}
mIcon.setUnk(false);
mIcon.setHasNumber(false);
mIcon.setNumber(0);
mIcon.setVisible(false);
mNode.mpPane->SetVisible(false);
}
void dLytDepositBoxCursor_c::realizeNav() {
s32 s;
if (mSlot < 0) {
s = mAnm[DEPOSIT_BOX_CURSOR_ANIM_STICK_CURSOR].getLastFrame();
} else if (dPadNav::isPointerVisible()) {
s = 4;
} else if (mItem == LYT_CMN_PouchPotionHealthPlusPlusHalf) {
s = 5;
} else if (mIsSellMode) {
s = 6;
} else if (mItemLocation == LOC_POUCH) {
// Flip the cursor for pouch slot 0 so that it's not above the screen edge
s = mSlot == 0 ? 1 : 0;
if (mItem == LYT_CMN_PouchBlank4) {
s += 2;
}
} else if (mItem == LYT_CMN_PouchBlank4) {
s = 2;
} else {
s = 0;
}
mVec3_c v;
if (dPadNav::isPointerVisible()) {
mVec2_c pos = dCsBase_c::GetInstance()->getCursorIf()->getCursorPos();
v.set(pos.x, pos.y + 15.0f, 0.0f);
} else {
nw4r::math::MTX34 mtx = dCsBase_c::GetInstance()->getCursorStickAllPane()->GetGlobalMtx();
v.set(mtx._03, mtx._13, 0.0f);
}
mpStickCursorPane->SetTranslate(v);
mAnm[DEPOSIT_BOX_CURSOR_ANIM_STICK_CURSOR].setAnimEnable(true);
mAnm[DEPOSIT_BOX_CURSOR_ANIM_STICK_CURSOR].setFrame(s);
mLyt.calc();
mAnm[DEPOSIT_BOX_CURSOR_ANIM_STICK_CURSOR].setAnimEnable(false);
}
void dLytDepositBoxCursor_c::init(s32 location, s32 slot, s32 item, bool isSell) {
mItemLocation = location;
mIsSellMode = isSell;
s32 number;
f32 durability;
u8 color;
if (mItemLocation == LOC_POUCH) {
number = getPouchItemAmount(slot, false);
durability = getPouchShieldDurability(slot, false);
color = getPouchItemNumberColor(slot, false);
mSlot = slot;
} else {
number = getDepositItemAmount(slot);
durability = getDepositShieldDurability(slot);
color = getDepositItemNumberColor(slot);
mSlot = slot % NUM_ICONS_PER_PAGE;
}
if (number < 0) {
mIcon.setHasNumber(false);
} else {
mIcon.setHasNumber(true);
mIcon.setNumber(number);
}
mIcon.setUnk(false);
mIcon.setItem(item);
if (color != 3) {
mIcon.setNumberColor(color);
}
if (durability >= 0.0f) {
mIcon.setShieldDurability(durability);
}
mNode.mpPane->SetVisible(true);
mItem = LYT_CMN_PouchBlank4;
realizeNav();
mIsVisible = true;
}
void dLytDepositBoxCursor_c::updateSlot(s32 location, s32 slot, s32 item, bool isSell) {
mItem = item;
mItemLocation = location;
mIsSellMode = isSell;
if (mItemLocation == LOC_POUCH) {
mSlot = slot;
} else {
mSlot = slot % NUM_ICONS_PER_PAGE;
}
}
void dLytDepositBoxCursor_c::activateSell() {
mIsSellMode = true;
realizeNav();
}
+683
View File
@@ -0,0 +1,683 @@
#include "d/lyt/d_lyt_deposit_stock.h"
#include "d/d_cs_base.h"
#include "d/d_pad_nav.h"
#include "d/d_rumble.h"
#include "d/lyt/d2d.h"
#include "d/lyt/d_lyt_common_arrow.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_util_items.h"
#include "d/snd/d_snd_small_effect_mgr.h"
#include "d/snd/d_snd_wzsound.h"
#include "nw4r/lyt/lyt_group.h"
#include "toBeSorted/arc_managers/layout_arc_manager.h"
#include "toBeSorted/file_manager.h"
STATE_DEFINE(dLytDepositStock_c, None);
void dLytDepositStock_c::initializeState_None() {}
void dLytDepositStock_c::executeState_None() {
mIsIdle = true;
}
void dLytDepositStock_c::finalizeState_None() {}
static const d2d::LytBrlanMapping brlanMap[] = {
{ "depositBoxBg_00_flash.brlan", "G_flash_00"},
{ "depositBoxBg_00_flash.brlan", "G_flash_01"},
{ "depositBoxBg_00_flash.brlan", "G_flash_02"},
{ "depositBoxBg_00_flash.brlan", "G_flash_03"},
{ "depositBoxBg_00_flash.brlan", "G_flash_04"},
{ "depositBoxBg_00_flash.brlan", "G_flash_05"},
{ "depositBoxBg_00_flash.brlan", "G_flash_06"},
{ "depositBoxBg_00_flash.brlan", "G_flash_07"},
{ "depositBoxBg_00_flash.brlan", "G_flash_08"},
{ "depositBoxBg_00_flash.brlan", "G_flash_09"},
{ "depositBoxBg_00_flash.brlan", "G_flash_10"},
{ "depositBoxBg_00_flash.brlan", "G_flash_11"},
{ "depositBoxBg_00_loop.brlan", "G_loop_00"},
{"depositBoxBg_00_haveBox.brlan", "G_poach_00"},
{"depositBoxBg_00_haveBox.brlan", "G_poach_01"},
{"depositBoxBg_00_haveBox.brlan", "G_poach_02"},
{"depositBoxBg_00_haveBox.brlan", "G_poach_03"},
{"depositBoxBg_00_haveBox.brlan", "G_poach_04"},
{"depositBoxBg_00_haveBox.brlan", "G_poach_05"},
{"depositBoxBg_00_haveBox.brlan", "G_poach_06"},
{"depositBoxBg_00_haveBox.brlan", "G_poach_07"},
{"depositBoxBg_00_haveBox.brlan", "G_poach_08"},
{"depositBoxBg_00_haveBox.brlan", "G_poach_09"},
{"depositBoxBg_00_haveBox.brlan", "G_poach_10"},
{"depositBoxBg_00_haveBox.brlan", "G_poach_11"},
};
#define DEPOSIT_STOCK_ANIM_FLASH_OFFSET 0
#define DEPOSIT_STOCK_ANIM_LOOP 12
#define DEPOSIT_STOCK_ANIM_HAVE_BOX_OFFSET 13
#define DEPOSIT_STOCK_NUM_ANIMS 25
bool dLytDepositStock_c::build(d2d::ResAccIf_c *resAcc) {
mLyt.setResAcc(resAcc);
mLyt.build("depositBoxBg_00.brlyt", nullptr);
for (int i = 0; i < DEPOSIT_STOCK_NUM_ANIMS; i++) {
mAnm[i].init(brlanMap[i].mFile, resAcc, mLyt.getLayout(), brlanMap[i].mName);
mAnm[i].bind(false);
mAnm[i].setAnimEnable(false);
}
int i;
for (i = 0; i < DEPOSIT_STOCK_NUM_ANIMS; i++) {
if (i < DEPOSIT_STOCK_ANIM_FLASH_OFFSET + NUM_ICONS_PER_PAGE) {
mAnm[i].setAnimEnable(true);
mAnm[i].setToEnd();
} else {
mAnm[i].setAnimEnable(true);
mAnm[i].setFrame(0.0f);
}
}
mLyt.calc();
for (i = 0; i < DEPOSIT_STOCK_NUM_ANIMS; i++) {
if (i != DEPOSIT_STOCK_ANIM_LOOP) {
mAnm[i].setAnimEnable(false);
}
}
initIcons();
mStateMgr.changeState(StateID_None);
mCurrentNavTarget = -12;
mSelectedItemId = -1;
mPickedUpIdx = -1;
mIsSellBlocked = false;
mIsSortBlocked = false;
mPreventCancellingSelection = false;
mPrevPointerVisible = true;
mPickedUpItemOnThisPage = false;
mArrowDirection = dLytCommonArrow_c::ARROW_NONE;
mIsModePouch = false;
mIsModeSell = false;
mIsModeSort = false;
mIsModeFinish = false;
mSavedArrowDirection = dLytCommonArrow_c::ARROW_NONE;
navigateToItem();
return true;
}
bool dLytDepositStock_c::execute() {
for (int i = 0; i < mNumSlots; i++) {
mNodes[i].mpLytPane->execute();
}
if (mIsMainStock) {
mStateMgr.executeState();
}
for (int i = 0; i < DEPOSIT_STOCK_ANIM_LOOP + 1; i++) {
if (mAnm[i].isEnabled()) {
if (i < NUM_ICONS_PER_PAGE && mAnm[i].isStop()) {
mAnm[i].setAnimEnable(false);
}
mAnm[i].play();
}
}
mLyt.calc();
mPrevPointerVisible = dPadNav::isPointerVisible();
return true;
}
bool dLytDepositStock_c::remove() {
for (d2d::SubPaneList::Iterator it = mSubpaneList.GetBeginIter(); it != mSubpaneList.GetEndIter(); ++it) {
d2d::dSubPane *subPane = it->mpLytPane;
if (subPane != nullptr) {
nw4r::lyt::Pane *parent = subPane->getPane()->GetParent();
parent->RemoveChild(subPane->getPane());
}
}
for (int i = 0; i < NUM_ICONS_PER_PAGE; i++) {
mNodes[i].mpLytPane->remove();
}
mLyt.unbindAnims();
for (int i = 0; i < DEPOSIT_STOCK_NUM_ANIMS; i++) {
mAnm[i].remove();
}
return true;
}
static const char *sGroupName = "G_ref_00";
void dLytDepositStock_c::initIcons() {
void *data = LayoutArcManager::GetInstance()->getLoadedData("DoButton");
d2d::ResAccIf_c resAcc;
resAcc.attach(data, "");
for (int i = 0; i < NUM_ICONS_PER_PAGE; i++) {
mNodes[i].mpLytPane = &mIcons[i];
mIcons[i].build(&resAcc, dLytCommonIconItem_c::POUCH);
mSubpaneList.PushBack(&mNodes[i]);
}
if (mLyt.getLayout()->GetGroupContainer() != nullptr) {
nw4r::lyt::Group *g = mLyt.getLayout()->GetGroupContainer()->FindGroupByName(sGroupName);
if (g != nullptr) {
d2d::dSubPane::linkMeters(g, &mSubpaneList);
}
}
for (int i = 0; i < mNumSlots; i++) {
mNodes[i].mpPane->SetVisible(false);
}
}
void dLytDepositStock_c::loadItems(s32 hiddenSlot) {
s32 slot = mItemPage * NUM_ICONS_PER_PAGE;
mNumSlots = 0;
mPickedUpItemOnThisPage = false;
for (int i = 0; i < NUM_ICONS_PER_PAGE; i++) {
mIcons[i].reset();
mItemIds[i] = getDepositItemForSlot(slot);
f32 f = 0.0f;
if (mItemIds[i] != LYT_CMN_PouchBlank4 && slot != hiddenSlot) {
f = 1.0f;
}
loadIcon(i);
mIcons[i].setVisible(false);
if (slot == hiddenSlot) {
mNodes[i].mpPane->SetVisible(false);
} else {
mNodes[i].mpPane->SetVisible(true);
}
mAnm[i + DEPOSIT_STOCK_ANIM_HAVE_BOX_OFFSET].setAnimEnable(true);
mAnm[i + DEPOSIT_STOCK_ANIM_HAVE_BOX_OFFSET].setFrame(f);
mLyt.calc();
mAnm[i + DEPOSIT_STOCK_ANIM_HAVE_BOX_OFFSET].setAnimEnable(false);
slot++;
mNumSlots++;
}
}
void dLytDepositStock_c::loadIcon(s32 idx) {
s32 slot = idx + mItemPage * NUM_ICONS_PER_PAGE;
s32 number = getDepositItemAmount(slot);
mIcons[idx].setUnk(false);
if (number < 0) {
mIcons[idx].setHasNumber(false);
} else {
mIcons[idx].setHasNumber(true);
mIcons[idx].setNumber(number);
}
mIcons[idx].setItem(mItemIds[idx]);
u8 color = getDepositItemNumberColor(slot);
if (color != 3) {
mIcons[idx].setNumberColor(color);
}
f32 durability = getDepositShieldDurability(slot);
if (durability >= 0.0f) {
mIcons[idx].setShieldDurability(durability);
}
}
void dLytDepositStock_c::nextPage(bool preventCancellingSelection) {
mItemPage++;
if (mItemPage >= NUM_PAGES) {
mItemPage = 0;
}
mPreventCancellingSelection = preventCancellingSelection;
}
void dLytDepositStock_c::prevPage(bool preventCancellingSelection) {
if (mItemPage != 0) {
mItemPage--;
} else {
mItemPage = NUM_PAGES - 1;
}
mPreventCancellingSelection = preventCancellingSelection;
}
void dLytDepositStock_c::fn_80156530(bool unk) {
for (int i = 0; i < NUM_ICONS_PER_PAGE; i++) {
mIcons[i].setVisible(unk);
}
if (!mPreventCancellingSelection) {
if (mCurrentNavTarget >= 0) {
mAnm[mCurrentNavTarget + DEPOSIT_STOCK_ANIM_FLASH_OFFSET].setAnimEnable(true);
mSelectedItemId = -1;
}
mCurrentNavTarget = -10;
}
mPreventCancellingSelection = false;
mIsModePouch = false;
mIsModeSell = false;
if (!mIsModeSort) {
// okay
mIsModeSort = false;
}
mIsModeFinish = false;
if (mArrowDirection >= dLytCommonArrow_c::ARROW_NONE) {
handleSpecialNavMode();
}
}
void dLytDepositStock_c::handleNavOrPoint() {
bool selectIcon = false;
s32 nextTarget = 0;
if (dPadNav::isPointerVisible()) {
for (nextTarget = 0; nextTarget < NUM_ICONS_PER_PAGE; nextTarget++) {
if (mIcons[nextTarget].isCursorOver()) {
selectIcon = true;
saveArrowDirection();
break;
}
}
} else {
s32 dir = checkNav();
if (!isNavModeItem()) {
handleSpecialNavMode();
} else if (!mIsModePouch && !mIsModeSell && !mIsModeSort && !mIsModeFinish && mSavedArrowDirection >= 2) {
s32 target = mCurrentNavTarget;
if (target < 0 || mPrevPointerVisible) {
if (dir != dPadNav::FS_STICK_NONE || dCsBase_c::GetInstance()->isCursorStickVisible()) {
if (target < 0) {
target += NUM_ICONS_PER_PAGE;
}
selectIcon = true;
nextTarget = target;
}
} else {
switch (dir) {
case dPadNav::FS_STICK_UP:
if (target < 6) {
navigateToPouch();
} else {
nextTarget = target - 6;
selectIcon = true;
}
break;
case dPadNav::FS_STICK_UP_RIGHT:
nextTarget = target - 5;
selectIcon = true;
break;
case dPadNav::FS_STICK_RIGHT:
if (target % 6 == 5) {
navigateToArrow(dLytCommonArrow_c::ARROW_RIGHT);
saveArrowDirection();
dRumble_c::start(dRumble_c::sRumblePreset1, dRumble_c::FLAG_SLOT0);
} else {
nextTarget = target + 1;
selectIcon = true;
}
break;
case dPadNav::FS_STICK_DOWN_RIGHT:
nextTarget = target + 7;
selectIcon = true;
break;
case dPadNav::FS_STICK_DOWN:
if (target >= 10) {
navigateToSort();
} else if (target >= 6 && target <= 7) {
navigateToSell();
} else {
nextTarget = target + 6;
selectIcon = true;
}
break;
case dPadNav::FS_STICK_DOWN_LEFT:
nextTarget = target + 5;
selectIcon = true;
break;
case dPadNav::FS_STICK_LEFT:
if (target % 6 == 0) {
navigateToArrow(dLytCommonArrow_c::ARROW_LEFT);
saveArrowDirection();
dRumble_c::start(dRumble_c::sRumblePreset1, dRumble_c::FLAG_SLOT0);
} else {
nextTarget = target - 1;
selectIcon = true;
}
break;
case dPadNav::FS_STICK_UP_LEFT:
nextTarget = target - 7;
selectIcon = true;
break;
default:
nextTarget = target;
selectIcon = true;
break;
}
}
}
}
if (selectIcon) {
mSavedArrowDirection = dLytCommonArrow_c::ARROW_NONE;
if (mCurrentNavTarget != nextTarget) {
if (mCurrentNavTarget >= 0) {
mIcons[mCurrentNavTarget].setOff();
mAnm[mCurrentNavTarget + DEPOSIT_STOCK_ANIM_FLASH_OFFSET].setAnimEnable(true);
}
if (mItemIds[nextTarget] != LYT_CMN_PouchBlank4 &&
mItemIds[nextTarget] != LYT_CMN_PouchPotionHealthPlusPlusHalf) {
mIcons[nextTarget].setOn();
mSelectedItemId = FileManager::sInstance->getItemCheckItem(nextTarget + mItemPage * NUM_ICONS_PER_PAGE);
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_STK_STOCK_POINT_ITEM);
} else {
mSelectedItemId = -1;
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_STK_STOCK_POINT_EMPTY);
}
s32 anmIdx = nextTarget + DEPOSIT_STOCK_ANIM_FLASH_OFFSET;
mAnm[anmIdx].setAnimEnable(true);
mAnm[anmIdx].setFrame(0.0f);
mLyt.calc();
mAnm[anmIdx].setAnimEnable(false);
dRumble_c::start(dRumble_c::sRumblePreset1, dRumble_c::FLAG_SLOT0);
mCurrentNavTarget = nextTarget;
mIsModeSell = false;
mIsModeSort = false;
mIsModeFinish = false;
navigateToItem();
}
mNavMode = 0;
} else {
navigateOffIcon();
}
}
void dLytDepositStock_c::navigateOffIcon() {
if (mCurrentNavTarget >= 0) {
// TODO why LYT_CMN_PouchPotionHealthPlusPlusHalf
if (mItemIds[mCurrentNavTarget] != LYT_CMN_PouchBlank4 &&
mItemIds[mCurrentNavTarget] != LYT_CMN_PouchPotionHealthPlusPlusHalf) {
mIcons[mCurrentNavTarget].setOff();
mSelectedItemId = -1;
}
mAnm[mCurrentNavTarget + DEPOSIT_STOCK_ANIM_FLASH_OFFSET].setAnimEnable(true);
mCurrentNavTarget -= NUM_ICONS_PER_PAGE;
}
}
s32 dLytDepositStock_c::checkNav() {
// Note: Navigating UP when in the first row means switching from stock to pouch
s32 target = mCurrentNavTarget;
s32 direction = dPadNav::getFSStickNavDirection();
if (target >= 0) {
switch (direction) {
case dPadNav::FS_STICK_UP_RIGHT:
if (target == 11) {
direction = dPadNav::FS_STICK_UP;
} else if (target < 6) {
if (target < 4) {
direction = dPadNav::FS_STICK_UP;
} else if (target == 5) {
direction = dPadNav::FS_STICK_NONE;
} else {
direction = dPadNav::FS_STICK_RIGHT;
}
}
break;
case dPadNav::FS_STICK_DOWN_RIGHT:
if (target == 5) {
direction = dPadNav::FS_STICK_DOWN;
} else if (target >= 6) {
if (target >= 10) {
if (mIsSortBlocked) {
if (target == 11) {
direction = dPadNav::FS_STICK_NONE;
} else {
direction = dPadNav::FS_STICK_RIGHT;
}
} else {
direction = dPadNav::FS_STICK_DOWN;
}
} else {
direction = dPadNav::FS_STICK_RIGHT;
}
}
break;
case dPadNav::FS_STICK_DOWN:
if (target >= 6) {
if (target < 8) {
if (mIsSellBlocked) {
direction = dPadNav::FS_STICK_NONE;
}
} else if (target >= 10) {
if (mIsSortBlocked) {
direction = dPadNav::FS_STICK_NONE;
}
} else {
direction = dPadNav::FS_STICK_NONE;
}
}
break;
case dPadNav::FS_STICK_DOWN_LEFT:
if (target == 0 || target == 11) {
if (target == 11 && mIsSortBlocked) {
direction = dPadNav::FS_STICK_LEFT;
} else {
direction = dPadNav::FS_STICK_DOWN;
}
} else if (target >= 6) {
if (target <= 7) {
if (mIsSellBlocked) {
if (target == 6) {
direction = dPadNav::FS_STICK_NONE;
} else {
direction = dPadNav::FS_STICK_LEFT;
}
} else {
direction = dPadNav::FS_STICK_DOWN;
}
} else if (target == 11) {
if (mIsSortBlocked) {
direction = dPadNav::FS_STICK_NONE;
} else {
direction = dPadNav::FS_STICK_DOWN;
}
} else {
direction = dPadNav::FS_STICK_LEFT;
}
}
break;
case dPadNav::FS_STICK_UP_LEFT:
if (target == 6) {
direction = dPadNav::FS_STICK_UP;
} else if (target < 6) {
if (target == 0) {
direction = dPadNav::FS_STICK_NONE;
} else if (target == 1) {
direction = dPadNav::FS_STICK_LEFT;
} else {
direction = dPadNav::FS_STICK_UP;
}
}
break;
}
}
return direction;
}
s32 dLytDepositStock_c::getCurrentSlot() const {
return mCurrentNavTarget + mItemPage * NUM_ICONS_PER_PAGE;
}
void dLytDepositStock_c::setItem(s32 idx, s32 item) {
mItemIds[idx] = item;
realizeItem(idx);
mIcons[idx].setOn();
mPickedUpItemOnThisPage = false;
}
void dLytDepositStock_c::realizeItem(s32 idx) {
f32 frame = 0.0f;
if (mItemIds[idx] != LYT_CMN_PouchBlank4) {
frame = 1.0f;
}
loadIcon(idx);
mIcons[idx].setVisible(true);
s32 anmIdx = idx + DEPOSIT_STOCK_ANIM_HAVE_BOX_OFFSET;
mAnm[anmIdx].setAnimEnable(true);
mAnm[anmIdx].setFrame(frame);
mLyt.calc();
mAnm[anmIdx].setAnimEnable(false);
}
void dLytDepositStock_c::selectNavTarget(s32 idx) {
if (idx < NUM_ICONS_PER_PAGE) {
if (mCurrentNavTarget >= 0) {
mAnm[mCurrentNavTarget + DEPOSIT_STOCK_ANIM_FLASH_OFFSET].setAnimEnable(true);
}
mCurrentNavTarget = idx;
if (mCurrentNavTarget >= 0) {
mAnm[mCurrentNavTarget + DEPOSIT_STOCK_ANIM_FLASH_OFFSET].setAnimEnable(true);
mAnm[mCurrentNavTarget + DEPOSIT_STOCK_ANIM_FLASH_OFFSET].setFrame(0.0f);
mLyt.calc();
mAnm[mCurrentNavTarget + DEPOSIT_STOCK_ANIM_FLASH_OFFSET].setAnimEnable(false);
dRumble_c::start(dRumble_c::sRumblePreset1, dRumble_c::FLAG_SLOT0);
}
}
}
void dLytDepositStock_c::pickUpOrPlaceItem(s32 slot, bool place) {
s32 page = slot / NUM_ICONS_PER_PAGE;
s32 idx = slot % NUM_ICONS_PER_PAGE;
if (place) {
mNodes[idx].mpPane->SetVisible(place);
}
if (mItemPage != page) {
if (place) {
mPickedUpItemOnThisPage = false;
}
} else {
s32 item = mItemIds[idx];
f32 frame;
if (place) {
// TODO why LYT_CMN_PouchPotionHealthPlusPlusHalf
if (item != LYT_CMN_PouchPotionHealthPlusPlusHalf && item != LYT_CMN_PouchBlank4) {
frame = 1.0f;
if (mPickedUpItemOnThisPage) {
s32 otherIdx = mPickedUpIdx % NUM_ICONS_PER_PAGE;
mIcons[idx].setItem(mItemIds[otherIdx]);
mPickedUpItemOnThisPage = false;
}
} else {
frame = 0.0f;
}
mPickedUpIdx = -1;
} else {
mPickedUpIdx = slot;
frame = 0.0f;
mPickedUpItemOnThisPage = true;
mIcons[idx].setOff();
mIcons[idx].setHasNumber(false);
mIcons[idx].setItem(LYT_CMN_PouchBlank4);
}
s32 anmIdx = idx + DEPOSIT_STOCK_ANIM_HAVE_BOX_OFFSET;
mAnm[anmIdx].setAnimEnable(true);
mAnm[anmIdx].setFrame(frame);
mLyt.calc();
mAnm[anmIdx].setAnimEnable(false);
}
}
void dLytDepositStock_c::navigateToPouch() {
mIsModePouch = true;
mSavedArrowDirection = dLytCommonArrow_c::ARROW_NONE;
}
void dLytDepositStock_c::navigateToSell() {
if (!mIsModeSell) {
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_STK_POINT_SELL);
}
mIsModeSell = true;
mNavMode = NAV_SELL;
mSavedArrowDirection = dLytCommonArrow_c::ARROW_NONE;
}
void dLytDepositStock_c::navigateToSort() {
if (!mIsModeSort) {
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_STK_STOCK_POINT_TRIM);
}
mIsModeSort = true;
mNavMode = NAV_SORT;
mSavedArrowDirection = dLytCommonArrow_c::ARROW_NONE;
}
void dLytDepositStock_c::navigateToFinish() {
if (!mIsModeFinish) {
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_STK_POINT_DECIDE);
}
mIsModeFinish = true;
mNavMode = NAV_FINISH;
mSavedArrowDirection = dLytCommonArrow_c::ARROW_NONE;
}
void dLytDepositStock_c::saveArrowDirection() {
mSavedArrowDirection = mArrowDirection;
}
void dLytDepositStock_c::navigateToArrow(s32 arrowDirection) {
mArrowDirection = arrowDirection;
if (mArrowDirection < dLytCommonArrow_c::ARROW_NONE) {
mNavMode = NAV_ARROW;
}
}
s32 dLytDepositStock_c::restoreArrowDirection() {
if (mSavedArrowDirection < dLytCommonArrow_c::ARROW_NONE && mArrowDirection >= dLytCommonArrow_c::ARROW_NONE) {
navigateToArrow(mSavedArrowDirection);
}
return mArrowDirection;
}
void dLytDepositStock_c::navigateToItem() {
mNavMode = NAV_ITEM;
}
void dLytDepositStock_c::handleSpecialNavMode() {
switch (mNavMode) {
case NAV_SELL: navigateToSell(); break;
case NAV_SORT: navigateToSort(); break;
case NAV_FINISH: navigateToFinish(); break;
case NAV_ARROW:
if (mArrowDirection < dLytCommonArrow_c::ARROW_NONE) {
saveArrowDirection();
}
break;
}
}
bool dLytDepositStock_c::isNavModeItem() const {
return mNavMode == NAV_ITEM;
}
+4 -4
View File
@@ -290,7 +290,7 @@ void dLytPauseMain_c::executeState_Wait() {
mRingToggleRequest = false;
mStateMgr.changeState(StateID_Ring);
}
mpArrow->unk();
mpArrow->setActiveArrow(mpArrow->getPointedAtArrow());
}
}
void dLytPauseMain_c::finalizeState_Wait() {}
@@ -874,7 +874,7 @@ nw4r::lyt::Bounding *dLytPauseMgr_c::getArrowBounding(int idx) const {
}
void dLytPauseMgr_c::setSelectedArrowBounding(int idx) {
mMain.getArrow()->setField_0x6B8(idx);
mMain.getArrow()->setActiveArrow(idx);
}
void dLytPauseMgr_c::setSelection(dLytPauseMgr_c::SelectionType_e type, u16 id, bool restricted) {
@@ -957,8 +957,8 @@ bool dLytPauseMgr_c::checkChangeDisp() {
}
nav = true;
}
s32 arrowPane = mMain.getArrow()->getField_0x6B8();
if (arrowPane != dLytCommonArrow_c::ARROW_NONE && dPad::getDownTrigA() && mMain.getArrow()->fn_80168760()) {
s32 arrowPane = mMain.getArrow()->getActiveArrow();
if (arrowPane != dLytCommonArrow_c::ARROW_NONE && dPad::getDownTrigA() && mMain.getArrow()->triggerArrowPress()) {
if (arrowPane == dLytCommonArrow_c::ARROW_LEFT) {
mIsNavLeft = true;
} else {
+11 -6
View File
@@ -10,6 +10,7 @@
#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"
@@ -427,8 +428,8 @@ bool dLytPauseDisp00_c::build() {
}
}
mpBoundings[PAUSE_DISP_00_BOUNDING_ARROW_LEFT] = pauseMgr->getArrowBounding(0);
mpBoundings[PAUSE_DISP_00_BOUNDING_ARROW_RIGHT] = pauseMgr->getArrowBounding(1);
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) {
@@ -1252,6 +1253,7 @@ void dLytPauseDisp00_c::setupInventoryWheel() {
}
u32 item = getPouchItemForSlot(i, true);
// TODO why LYT_CMN_PouchPotionHealthPlusPlusHalf
if (item != LYT_CMN_PouchPotionHealthPlusPlusHalf) {
if (isPouchBocoburinLocked()) {
icon->setBocoburinLocked(true);
@@ -1259,7 +1261,7 @@ void dLytPauseDisp00_c::setupInventoryWheel() {
}
haveFrame = 1.0f;
icon->setItem(item);
f32 durability = getShieldDurability(i, true);
f32 durability = getPouchShieldDurability(i, true);
if (durability >= 0.0f) {
icon->setShieldDurability(durability);
}
@@ -1575,6 +1577,7 @@ void dLytPauseDisp00_c::setupRingIcons(s32 tab) {
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;
}
@@ -2008,9 +2011,11 @@ bool dLytPauseDisp00_c::isPointingAtRingIcon() {
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 I hate vectors
mVec2_c pos(v.x, v.y);
if (pos.squareDistanceTo(csPos) < radiusSq) {
// TODO maybe fake
mVec2_c pos2 = mVec2_c(v.x, v.y);
mVec2_c dist = pos2;
dist -= csPos;
if (dist.squaredLength() < radiusSq) {
ret = true;
}
+5 -5
View File
@@ -339,8 +339,8 @@ void dLytMeterMinusBtn_c::initializeState_MenuSelectingIn() {
mItemIcons[i].setItem(field_0x4E98[i]);
}
if (getShieldDurability(i, true) >= 0.0f) {
mItemIcons[i].setShieldDurability(getShieldDurability(i, true));
if (getPouchShieldDurability(i, true) >= 0.0f) {
mItemIcons[i].setShieldDurability(getPouchShieldDurability(i, true));
if (i == convertFilePouchSlot(FileManager::GetInstance()->getShieldPouchSlot())) {
mItemIcons[i].setShieldOnOff(false);
} else {
@@ -574,8 +574,8 @@ void dLytMeterMinusBtn_c::initializeState_DemoMove() {
mItemIcons[i].setItem(field_0x4E98[i]);
}
if (getShieldDurability(i, true) >= 0.0f) {
mItemIcons[i].setShieldDurability(getShieldDurability(i, true));
if (getPouchShieldDurability(i, true) >= 0.0f) {
mItemIcons[i].setShieldDurability(getPouchShieldDurability(i, true));
if (i == convertFilePouchSlot(FileManager::GetInstance()->getShieldPouchSlot())) {
mItemIcons[i].setShieldOnOff(false);
} else {
@@ -1086,7 +1086,7 @@ void dLytMeterMinusBtn_c::setItemText(s32 item) {
void dLytMeterMinusBtn_c::realizeShieldDurability() {
for (int i = 0; i < MINUS_BTN_NUM_ITEMS; i++) {
if (field_0x4EBB[i] != 0) {
mItemIcons[i].setShieldDurability(getShieldDurability(i, true));
mItemIcons[i].setShieldDurability(getPouchShieldDurability(i, true));
}
}
}