Merge pull request #65 from Istador/pr-gravity-toggle

don't close the H&S menu after toggling the gravity button
This commit is contained in:
CraftyBoss 2024-06-25 16:15:10 -07:00 committed by GitHub
commit b2d444b2b9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 66 additions and 58 deletions

View File

@ -48,10 +48,10 @@ class StageSceneStateServerConfig : public al::HostStateBase<al::Scene>, public
void endSubMenu();
private:
inline void subMenuStart();
inline void subMenuUpdate();
inline void subMenuRefresh();
al::MessageSystem* mMsgSystem = nullptr;
FooterParts* mFooterParts = nullptr;
GameDataHolder* mGameDataHolder = nullptr;
@ -76,6 +76,9 @@ class StageSceneStateServerConfig : public al::HostStateBase<al::Scene>, public
sead::SafeArray<GameModeEntry, GameModeConfigMenuFactory::getMenuCount()> mGamemodeConfigMenus;
GameModeEntry *mGamemodeConfigMenu = nullptr;
inline void activateInput();
inline void deactivateInput();
bool mIsDecideConfig = false;
};

View File

@ -4,11 +4,17 @@
class GameModeConfigMenu {
public:
enum UpdateAction {
NOOP,
CLOSE,
REFRESH,
};
GameModeConfigMenu() = default;
virtual void initMenu(const al::LayoutInitInfo &initInfo) {return;}
virtual bool updateMenu(int selectIndex) {return false;}
virtual UpdateAction updateMenu(int selectIndex) {return UpdateAction::NOOP;}
virtual const sead::WFixedSafeString<0x200>* getStringData() {return nullptr;}

View File

@ -10,12 +10,11 @@ public:
void initMenu(const al::LayoutInitInfo &initInfo) override;
const sead::WFixedSafeString<0x200>* getStringData() override;
bool updateMenu(int selectIndex) override;
GameModeConfigMenu::UpdateAction updateMenu(int selectIndex) override;
const int getMenuSize() override { return mItemCount; }
private:
static constexpr int mItemCount = 1;
sead::SafeArray<sead::WFixedSafeString<0x200>, mItemCount>* gravityOn = nullptr;
sead::SafeArray<sead::WFixedSafeString<0x200>, mItemCount>* gravityOff = nullptr;
sead::SafeArray<sead::WFixedSafeString<0x200>, mItemCount>* mItems = nullptr;
};

View File

@ -6,49 +6,42 @@
#include "server/Client.hpp"
HideAndSeekConfigMenu::HideAndSeekConfigMenu() : GameModeConfigMenu() {
gravityOn = new sead::SafeArray<sead::WFixedSafeString<0x200>, mItemCount>();
gravityOn->mBuffer[0].copy(u"Toggle H&S Gravity (ON)");
gravityOff = new sead::SafeArray<sead::WFixedSafeString<0x200>, mItemCount>();
gravityOff->mBuffer[0].copy(u"Toggle H&S Gravity (OFF)");
mItems = new sead::SafeArray<sead::WFixedSafeString<0x200>, mItemCount>();
mItems->mBuffer[0].copy(u"Toggle H&S Gravity (OFF)"); // TBD
}
void HideAndSeekConfigMenu::initMenu(const al::LayoutInitInfo &initInfo) {
}
void HideAndSeekConfigMenu::initMenu(const al::LayoutInitInfo &initInfo) {}
const sead::WFixedSafeString<0x200>* HideAndSeekConfigMenu::getStringData() {
HideAndSeekInfo *curMode = GameModeManager::instance()->getInfo<HideAndSeekInfo>();
return (
mItems->mBuffer[0].copy(
GameModeManager::instance()->isMode(GameMode::HIDEANDSEEK)
&& curMode != nullptr
&& curMode->mIsUseGravity
? gravityOn->mBuffer
: gravityOff->mBuffer
? u"Toggle H&S Gravity (ON) "
: u"Toggle H&S Gravity (OFF)"
);
return mItems->mBuffer;
}
bool HideAndSeekConfigMenu::updateMenu(int selectIndex) {
HideAndSeekInfo *curMode = GameModeManager::instance()->getInfo<HideAndSeekInfo>();
GameModeConfigMenu::UpdateAction HideAndSeekConfigMenu::updateMenu(int selectIndex) {
Logger::log("Setting Gravity Mode.\n");
if (!curMode) {
Logger::log("Unable to Load Mode info!\n");
return true;
}
switch (selectIndex) {
case 0: {
HideAndSeekInfo *curMode = GameModeManager::instance()->getInfo<HideAndSeekInfo>();
if (!curMode) {
Logger::log("Unable to Load Mode info!\n");
return UpdateAction::NOOP;
}
if (GameModeManager::instance()->isMode(GameMode::HIDEANDSEEK)) {
curMode->mIsUseGravity = !curMode->mIsUseGravity;
return UpdateAction::REFRESH;
}
return true;
return UpdateAction::NOOP;
}
default:
Logger::log("Failed to interpret Index!\n");
return false;
return UpdateAction::NOOP;
}
}

View File

@ -136,15 +136,7 @@ al::MessageSystem* StageSceneStateServerConfig::getMessageSystem(void) const {
void StageSceneStateServerConfig::exeMainMenu() {
if (al::isFirstStep(this)) {
mInput->reset();
mCurrentList->activate();
mCurrentList->appearCursor();
mIsDecideConfig = false;
activateInput();
}
mInput->update();
@ -163,10 +155,7 @@ void StageSceneStateServerConfig::exeMainMenu() {
}
if (rs::isTriggerUiDecide(mHost)) {
al::startHitReaction(mCurrentMenu, "決定", 0);
mCurrentList->endCursor();
mCurrentList->decide();
mIsDecideConfig = true;
deactivateInput();
}
if (mIsDecideConfig && mCurrentList->isDecideEnd()) {
@ -248,20 +237,27 @@ void StageSceneStateServerConfig::exeGamemodeConfig() {
subMenuUpdate();
if (mIsDecideConfig && mCurrentList->isDecideEnd()) {
if (mGamemodeConfigMenu->mMenu->updateMenu(mCurrentList->mCurSelected)) {
endSubMenu();
GameModeConfigMenu::UpdateAction action = mGamemodeConfigMenu->mMenu->updateMenu(mCurrentList->mCurSelected);
switch (action) {
case GameModeConfigMenu::UpdateAction::CLOSE:
endSubMenu();
break;
case GameModeConfigMenu::UpdateAction::REFRESH:
subMenuRefresh();
break;
case GameModeConfigMenu::UpdateAction::NOOP:
activateInput();
break;
}
}
}
void StageSceneStateServerConfig::exeGamemodeSelect() {
if (al::isFirstStep(this)) {
mCurrentList = mModeSelectList;
mCurrentMenu = mModeSelect;
subMenuStart();
}
subMenuUpdate();
@ -274,7 +270,6 @@ void StageSceneStateServerConfig::exeGamemodeSelect() {
}
void StageSceneStateServerConfig::exeSaveData() {
if (al::isFirstStep(this)) {
SaveDataAccessFunction::startSaveDataWrite(mGameDataHolder);
}
@ -303,15 +298,9 @@ void StageSceneStateServerConfig::subMenuStart() {
mCurrentMenu->kill();
mInput->reset();
mCurrentList->activate();
mCurrentList->appearCursor();
activateInput();
mCurrentMenu->startAppear("Appear");
mIsDecideConfig = false;
}
void StageSceneStateServerConfig::subMenuUpdate() {
@ -332,13 +321,31 @@ void StageSceneStateServerConfig::subMenuUpdate() {
}
if (rs::isTriggerUiDecide(mHost)) {
al::startHitReaction(mCurrentMenu, "決定", 0);
mCurrentList->endCursor();
mCurrentList->decide();
mIsDecideConfig = true;
deactivateInput();
}
}
void StageSceneStateServerConfig::subMenuRefresh() {
mGamemodeConfigMenu = &mGamemodeConfigMenus[GameModeManager::instance()->getGameMode()];
mGamemodeConfigMenu->mList->initDataNoResetSelected(mGamemodeConfigMenu->mMenu->getMenuSize());
mGamemodeConfigMenu->mList->addStringData(mGamemodeConfigMenu->mMenu->getStringData(), "TxtContent");
mGamemodeConfigMenu->mList->updateParts();
activateInput();
}
void StageSceneStateServerConfig::activateInput() {
mInput->reset();
mCurrentList->activate();
mCurrentList->appearCursor();
mIsDecideConfig = false;
}
void StageSceneStateServerConfig::deactivateInput() {
al::startHitReaction(mCurrentMenu, "決定", 0);
mCurrentList->endCursor();
mCurrentList->decide();
mIsDecideConfig = true;
}
namespace {
NERVE_IMPL(StageSceneStateServerConfig, MainMenu)