Files
dusklight/src/dusk/game_mode.cpp
T
2026-08-19 22:58:43 -06:00

98 lines
3.2 KiB
C++

#include "dusk/game_mode.hpp"
#include "JSystem/JUtility/JUTGamePad.h"
#include "aurora/lib/logging.hpp"
#include "dusk/config.hpp"
#include "dusk/ui/prelaunch.hpp"
#include "m_Do/m_Do_MemCard.h"
namespace dusk::gamemode {
namespace {
aurora::Module Log("dusk::gamemode");
}
GameModeManager g_GameModeManager;
GameModeManager::GameModeManager() {
GameMode vanilla{kVanillaGameModeId, "Vanilla"};
mRegisteredGameModes.emplace(vanilla.getId(), std::move(vanilla));
mCurrentGameModeId = kVanillaGameModeId;
}
void GameModeManager::setGameModeToPrevious() {
// Restore the previously selected game mode if still registered.
GameModeId id = getSettings().game.lastSelectedGameModeId;
if (!mRegisteredGameModes.contains(id)) {
setCurrentGameMode(kVanillaGameModeId);
return;
}
setCurrentGameMode(id);
}
void GameModeManager::registerGameMode(const GameMode& gameMode) {
if (gameMode.getId().empty()) {
Log.fatal("No game mode ID specified in GameModeManager::registerGameMode");
}
if (gameMode.getFullName().empty()) {
Log.fatal("No display name specified for game mode {}", gameMode.getId());
}
if (mRegisteredGameModes.contains(gameMode.getId())) {
Log.warn("Attempting to re-register existing game mode {}", gameMode.getId());
return;
}
mRegisteredGameModes.emplace(gameMode.getId(), gameMode);
ui::Prelaunch::refresh_menu_buttons();
}
void GameModeManager::unregisterGameMode(const GameModeId& gameModeId) {
const auto& it = mRegisteredGameModes.find(gameModeId);
if (it == mRegisteredGameModes.end()) {
Log.warn("Attempting to unregister unknown game mode {}", gameModeId);
return;
}
if (mCurrentGameModeId == gameModeId) {
// Reset to prelaunch before unloading callbacks belonging to the active mod.
ui::prelaunch_state().returnToPrelaunchOnReset = true;
JUTGamePad::C3ButtonReset::sResetSwitchPushing = true;
setCurrentGameMode(kVanillaGameModeId);
}
mRegisteredGameModes.erase(it);
ui::Prelaunch::refresh_menu_buttons();
}
bool GameModeManager::setCurrentGameMode(const GameModeId& id) {
if (mCurrentGameModeId == id) {
return true;
}
if (!mRegisteredGameModes.contains(id)) {
Log.warn("Attempting to configure unknown game mode {}", id);
return false;
}
const GameMode* currentGameMode = getCurrentGameMode();
if (currentGameMode) {
currentGameMode->invokeOnDeactivatedFunction();
}
mCurrentGameModeId = id;
currentGameMode = getCurrentGameMode();
if (currentGameMode) {
mDoMemCd_SetFileName(currentGameMode->getSaveName());
if (!currentGameMode->invokeOnActivatedFunction()) {
mCurrentGameModeId = kVanillaGameModeId;
currentGameMode = getCurrentGameMode();
mDoMemCd_SetFileName(currentGameMode->getSaveName());
currentGameMode->invokeOnActivatedFunction();
getSettings().game.lastSelectedGameModeId.setValue(kVanillaGameModeId);
config::save();
return false;
}
}
getSettings().game.lastSelectedGameModeId.setValue(id);
config::save();
return true;
}
} // namespace dusk::gamemode