Skip to content

Commit 59f7952

Browse files
committed
Basic support for stage select buttons
1 parent 739579b commit 59f7952

6 files changed

Lines changed: 179 additions & 3 deletions

File tree

include/Sports2/Cmn/Sp2CmnConst.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,30 @@ enum ESport {
2626
ESport_Max
2727
};
2828

29+
/**
30+
* @brief Scene group ID
31+
*/
32+
enum EGroupID {
33+
EGroupID_Cmn = -1, //!< Common
34+
EGroupID_Swf, //!< Swordplay
35+
EGroupID_Jsk, //!< Power Cruising
36+
EGroupID_Arc, //!< Archery
37+
EGroupID_Fld, //!< Frisbee
38+
EGroupID_Bsk, //!< Basketball
39+
EGroupID_Bwl, //!< Bowling
40+
EGroupID_Can, //!< Canoeing
41+
EGroupID_Png, //!< Table Tennis
42+
EGroupID_Wkb, //!< Wakeboarding
43+
EGroupID_Pln, //!< Air Sports
44+
EGroupID_Glf, //!< Golf
45+
EGroupID_Dgl, //!< Frisbee Golf
46+
EGroupID_Bic, //!< Cycling
47+
EGroupID_Omk, //!< Skydiving
48+
EGroupID_Debug, //!< Debug
49+
50+
EGroupID_Max,
51+
};
52+
2953
/**
3054
* @brief Sequence ("category") ID
3155
*/
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#ifndef SPORTS2_MIISELECT_STAGE_SELECT_BTN_INFO_H
2+
#define SPORTS2_MIISELECT_STAGE_SELECT_BTN_INFO_H
3+
#include <Sports2/Sp2Types.h>
4+
5+
namespace Sp2 {
6+
namespace MiiSelect {
7+
8+
class StageSelectBtnInfo {
9+
public:
10+
enum EState { EState_Open, EState_New, EState_Locked };
11+
12+
static const u32 BUTTON_MAX = 7;
13+
14+
public:
15+
void setBtnState(u32 idx, EState state) {
16+
mButtonStates[idx] = state;
17+
}
18+
19+
private:
20+
char _00[0x18];
21+
EState mButtonStates[BUTTON_MAX]; // at 0x18
22+
};
23+
24+
} // namespace MiiSelect
25+
} // namespace Sp2
26+
27+
#endif

include/Sports2/Sp2MiiSelect.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#ifndef SPORTS2_MIISELECT_H
2+
#define SPORTS2_MIISELECT_H
3+
4+
#include <Sports2/MiiSelect/Sp2MiiSelectStageSelectBtnInfo.h>
5+
6+
#endif

src/core/ItemMgr.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,7 @@ void ItemMgr::Clear() {
420420
mJskRingTimerFlag.ResetAll();
421421
mJsk2xRingFlag = false;
422422
mJskFreeTimerFlag.SetDirect(0b1); // Start with one timer
423+
mJskStageFlag.SetDirect(0b1); // Start with one stage
423424

424425
// Canoeing
425426
mCanTimerFlag.SetDirect(0b1); // Start with one timer
@@ -482,7 +483,7 @@ void ItemMgr::Debug() {
482483
mBskVsTimerFlag.Randomize();
483484
mBskVsPassFlag = r.CoinFlip();
484485
mBskVs3ptFlag = r.CoinFlip();
485-
// mBskVsDunkFlag = r.CoinFlip();
486+
mBskVsDunkFlag = r.CoinFlip();
486487

487488
// Table Tennis
488489
mPngSpinFlag = r.CoinFlip();
@@ -513,11 +514,12 @@ void ItemMgr::Debug() {
513514
// Power Cruising
514515
mJskBoostFlag = r.CoinFlip();
515516
mJskRingTimerFlag.Randomize();
516-
// mJsk2xRingFlag = r.CoinFlip();
517+
mJsk2xRingFlag = r.CoinFlip();
517518
mJskFreeTimerFlag.Randomize();
519+
mJskStageFlag.Randomize();
518520

519521
// Canoeing
520-
// mCanTimerFlag.Randomize();
522+
mCanTimerFlag.Randomize();
521523
mCanStageFlag.Randomize();
522524

523525
mCanTimerFlag.SetAll();

src/core/ItemMgr.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,9 @@ class ItemMgr : public kiwi::DynamicSingleton<ItemMgr>,
504504
//! Timer increment (in seconds)
505505
static const u32 JSK_FREE_TIMER_VALUE = 60;
506506

507+
//! Number of stage unlock items
508+
static const u32 JSK_STAGE_COUNT = 6;
509+
507510
bool IsJskBoost() const {
508511
return mJskBoostFlag;
509512
}
@@ -516,6 +519,9 @@ class ItemMgr : public kiwi::DynamicSingleton<ItemMgr>,
516519
u32 GetJskFreeTimerNum() const {
517520
return mJskFreeTimerFlag.Count();
518521
}
522+
bool IsJskStageUnlock(u32 id) const {
523+
return mJskStageFlag.GetBit(id);
524+
}
519525
/**@}*/
520526

521527
/**
@@ -866,6 +872,8 @@ class ItemMgr : public kiwi::DynamicSingleton<ItemMgr>,
866872
bool mJsk2xRingFlag;
867873
//! Free cruising timer items
868874
kiwi::TBitFlag<u32, JSK_FREE_TIMER_COUNT> mJskFreeTimerFlag;
875+
//! Stage items
876+
kiwi::TBitFlag<u32, JSK_STAGE_COUNT> mJskStageFlag;
869877
/**@}*/
870878

871879
/**
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
#include <types.h>
2+
3+
#include "core/ItemMgr.h"
4+
#include "hooks/trampoline.h"
5+
6+
#include <Sports2/Sp2Cmn.h>
7+
#include <Sports2/Sp2MiiSelect.h>
8+
9+
#include <libkiwi.h>
10+
11+
namespace AP {
12+
namespace MiiSelect {
13+
14+
/**
15+
* @brief Overrides a stage select button's state based on the AP item unlocks
16+
*
17+
* @param pBtnInfo Stage select save data info
18+
* @param idx Button index
19+
* @param state Pending button state
20+
*/
21+
void InterceptStageBtnState(Sp2::MiiSelect::StageSelectBtnInfo* pBtnInfo,
22+
u32 idx,
23+
Sp2::MiiSelect::StageSelectBtnInfo::EState state) {
24+
25+
ASSERT(pBtnInfo != nullptr);
26+
27+
// Scene group determines which sport we are dealing with
28+
switch (RP_GET_INSTANCE(Sp2::Cmn::StaticMem)->getSceneGroup()) {
29+
case Sp2::Cmn::EGroupID_Jsk: {
30+
state = ItemMgr::GetInstance().IsJskStageUnlock(idx)
31+
? Sp2::MiiSelect::StageSelectBtnInfo::EState_Open
32+
: Sp2::MiiSelect::StageSelectBtnInfo::EState_Locked;
33+
break;
34+
}
35+
36+
case Sp2::Cmn::EGroupID_Arc: {
37+
state = ItemMgr::GetInstance().IsArcStageUnlock(idx)
38+
? Sp2::MiiSelect::StageSelectBtnInfo::EState_Open
39+
: Sp2::MiiSelect::StageSelectBtnInfo::EState_Locked;
40+
break;
41+
}
42+
43+
case Sp2::Cmn::EGroupID_Can: {
44+
state = ItemMgr::GetInstance().IsCanStageUnlock(idx)
45+
? Sp2::MiiSelect::StageSelectBtnInfo::EState_Open
46+
: Sp2::MiiSelect::StageSelectBtnInfo::EState_Locked;
47+
break;
48+
}
49+
50+
case Sp2::Cmn::EGroupID_Wkb: {
51+
state = ItemMgr::GetInstance().IsWkbStageUnlock(idx)
52+
? Sp2::MiiSelect::StageSelectBtnInfo::EState_Open
53+
: Sp2::MiiSelect::StageSelectBtnInfo::EState_Locked;
54+
break;
55+
}
56+
57+
case Sp2::Cmn::EGroupID_Pln: {
58+
state = ItemMgr::GetInstance().IsPlnStageUnlock(idx)
59+
? Sp2::MiiSelect::StageSelectBtnInfo::EState_Open
60+
: Sp2::MiiSelect::StageSelectBtnInfo::EState_Locked;
61+
break;
62+
}
63+
64+
case Sp2::Cmn::EGroupID_Glf: {
65+
state = ItemMgr::GetInstance().IsGlfStageUnlock(idx)
66+
? Sp2::MiiSelect::StageSelectBtnInfo::EState_Open
67+
: Sp2::MiiSelect::StageSelectBtnInfo::EState_Locked;
68+
break;
69+
}
70+
71+
case Sp2::Cmn::EGroupID_Dgl: {
72+
state = ItemMgr::GetInstance().IsDglStageUnlock(idx)
73+
? Sp2::MiiSelect::StageSelectBtnInfo::EState_Open
74+
: Sp2::MiiSelect::StageSelectBtnInfo::EState_Locked;
75+
break;
76+
}
77+
78+
case Sp2::Cmn::EGroupID_Bic: {
79+
state = ItemMgr::GetInstance().IsBicStageUnlock(idx)
80+
? Sp2::MiiSelect::StageSelectBtnInfo::EState_Open
81+
: Sp2::MiiSelect::StageSelectBtnInfo::EState_Locked;
82+
break;
83+
}
84+
85+
default: {
86+
UNREACHABLE();
87+
break;
88+
}
89+
}
90+
91+
pBtnInfo->setBtnState(idx, state);
92+
}
93+
94+
/**
95+
* @brief InterceptStageBtnState trampoline
96+
*/
97+
TRAMPOLINE_DEF(0x8031bda0, 0x8031bdac) {
98+
// clang-format off
99+
TRAMPOLINE_BEGIN
100+
101+
bl InterceptStageBtnState
102+
103+
TRAMPOLINE_END
104+
blr
105+
// clang-format on
106+
}
107+
108+
} // namespace MiiSelect
109+
} // namespace AP

0 commit comments

Comments
 (0)