Add game mode tracking

This commit is contained in:
Alexander Batalov 2022-12-06 17:22:30 +03:00
parent 90da2164f2
commit dc90beb696
12 changed files with 128 additions and 0 deletions

View File

@ -297,6 +297,8 @@ int _automapDisplayMap(int map)
// 0x41B8BC
void automapShow(bool isInGame, bool isUsingScanner)
{
ScopedGameMode gm(GameMode::kAutomap);
int frmIds[AUTOMAP_FRM_COUNT];
memcpy(frmIds, gAutomapFrmIds, sizeof(gAutomapFrmIds));

View File

@ -790,6 +790,8 @@ static std::vector<TownReputationEntry> gCustomTownReputationEntries;
// 0x431DF8
int characterEditorShow(bool isCreationMode)
{
ScopedGameMode gm(!isCreationMode ? GameMode::kEditor : 0);
char* messageListItemText;
char line1[128];
char line2[128];

View File

@ -3131,6 +3131,8 @@ void _combat_turn_run()
// 0x4227F4
static int _combat_input()
{
ScopedGameMode gm(GameMode::kPlayerTurn);
while ((gCombatState & COMBAT_STATE_0x02) != 0) {
sharedFpsLimiter.mark();
@ -3369,6 +3371,8 @@ static bool _combat_should_end()
// 0x422D2C
void _combat(STRUCT_664980* attack)
{
ScopedGameMode gm(GameMode::kCombat);
if (attack == NULL
|| (attack->attacker == NULL || attack->attacker->elevation == gElevation)
|| (attack->defender == NULL || attack->defender->elevation == gElevation)) {

View File

@ -1151,6 +1151,8 @@ static void gameFreeGlobalVars()
// 0x443F74
static void showHelp()
{
ScopedGameMode gm(GameMode::kHelp);
bool isoWasEnabled = isoDisable();
gameMouseObjectsHide();
@ -1437,4 +1439,34 @@ int gameShowDeathDialog(const char* message)
return rc;
}
int GameMode::currentGameMode = 0;
void GameMode::enterGameMode(int gameMode)
{
currentGameMode |= gameMode;
debugPrint("Entering game mode: %d", gameMode);
}
void GameMode::exitGameMode(int gameMode)
{
currentGameMode &= ~gameMode;
debugPrint("Exiting game mode: %d", gameMode);
}
bool GameMode::isInGameMode(int gameMode)
{
return (currentGameMode & gameMode) != 0;
}
ScopedGameMode::ScopedGameMode(int gameMode)
{
this->gameMode = gameMode;
GameMode::enterGameMode(gameMode);
}
ScopedGameMode::~ScopedGameMode()
{
GameMode::exitGameMode(gameMode);
}
} // namespace fallout

View File

@ -41,6 +41,52 @@ int showQuitConfirmationDialog();
int gameShowDeathDialog(const char* message);
class GameMode
{
public:
enum Flags
{
kWorldmap = 0x1,
kDialog = 0x4,
kOptions = 0x8,
kSaveGame = 0x10,
kLoadGame = 0x20,
kCombat = 0x40,
kPreferences = 0x80,
kHelp = 0x100,
kEditor = 0x200,
kPipboy = 0x400,
kPlayerTurn = 0x800,
kInventory = 0x1000,
kAutomap = 0x2000,
kSkilldex = 0x4000,
kUseOn = 0x8000,
kLoot = 0x10000,
kBarter = 0x20000,
kHero = 0x40000,
kDialogReview = 0x80000,
kCounter = 0x100000,
kSpecial = 0x80000000,
};
static void enterGameMode(int gameMode);
static void exitGameMode(int gameMode);
static bool isInGameMode(int gameMode);
static int getCurrentGameMode() { return currentGameMode; }
private:
static int currentGameMode;
};
class ScopedGameMode {
public:
ScopedGameMode(int gameMode);
~ScopedGameMode();
private:
int gameMode;
};
} // namespace fallout
#endif /* GAME_H */

View File

@ -922,6 +922,8 @@ int _gdialogInitFromScript(int headFid, int reaction)
_gdDialogWentOff = true;
GameMode::enterGameMode(GameMode::kDialog);
return 0;
}
@ -947,7 +949,11 @@ int _gdialogExitFromScript()
_tile_scroll_to(gGameDialogOldCenterTile, 2);
}
GameMode::exitGameMode(GameMode::kDialog);
GameMode::enterGameMode(GameMode::kSpecial);
_gdDestroyHeadWindow();
GameMode::exitGameMode(GameMode::kSpecial);
// CE: Fix Barter button.
gameDialogRedButtonsExit();
@ -1189,10 +1195,14 @@ void _gdialogUpdatePartyStatus()
// NOTE: Uninline.
gdHide();
GameMode::enterGameMode(GameMode::kSpecial);
_gdialog_window_destroy();
gGameDialogSpeakerIsPartyMember = isPartyMember;
GameMode::exitGameMode(GameMode::kSpecial);
_gdialog_window_create();
// NOTE: Uninline.
@ -1430,6 +1440,8 @@ int gameDialogReviewWindowFree(int* win)
// 0x445CA0
int gameDialogShowReview()
{
ScopedGameMode gm(GameMode::kDialogReview);
int win;
if (gameDialogReviewWindowInit(&win) == -1) {
@ -1871,6 +1883,9 @@ int _gdProcess()
} else {
if (_dialogue_switch_mode == 3) {
_dialogue_state = 4;
GameMode::exitGameMode(GameMode::kSpecial);
inventoryOpenTrade(gGameDialogWindow, gGameDialogSpeaker, _peon_table_obj, _barterer_table_obj, gGameDialogBarterModifier);
_gdialog_barter_cleanup_tables();
@ -2745,6 +2760,9 @@ void gameDialogTicker()
case 2:
_loop_cnt = -1;
_dialogue_switch_mode = 3;
GameMode::enterGameMode(GameMode::kSpecial);
_gdialog_window_destroy();
_gdialog_barter_create_win();
break;

View File

@ -548,6 +548,8 @@ void inventoryOpen()
}
}
ScopedGameMode gm(GameMode::kInventory);
if (inventoryCommonInit() == -1) {
return;
}
@ -2618,6 +2620,8 @@ static void _adjust_fid()
// 0x4717E4
void inventoryOpenUseItemOn(Object* a1)
{
ScopedGameMode gm(GameMode::kUseOn);
if (inventoryCommonInit() == -1) {
return;
}
@ -4044,6 +4048,8 @@ int inventoryOpenLooting(Object* a1, Object* a2)
return 0;
}
ScopedGameMode gm(GameMode::kLoot);
if (FID_TYPE(a2->fid) == OBJ_TYPE_CRITTER) {
if (_critter_flag_check(a2->pid, CRITTER_NO_STEAL)) {
// You can't find anything to take from that.
@ -5018,6 +5024,8 @@ static void inventoryWindowRenderInnerInventories(int win, Object* a2, Object* a
// 0x4757F0
void inventoryOpenTrade(int win, Object* a2, Object* a3, Object* a4, int a5)
{
ScopedGameMode gm(GameMode::kBarter);
_barter_mod = a5;
if (inventoryCommonInit() == -1) {
@ -5568,6 +5576,8 @@ static void _draw_amount(int value, int inventoryWindowType)
// 0x47688C
static int inventoryQuantitySelect(int inventoryWindowType, Object* item, int max)
{
ScopedGameMode gm(GameMode::kCounter);
inventoryQuantityWindowInit(inventoryWindowType, item);
int value;

View File

@ -350,6 +350,8 @@ void _ResetLoadSave()
// 0x47B88C
int lsgSaveGame(int mode)
{
ScopedGameMode gm(GameMode::kSaveGame);
MessageListItem messageListItem;
_ls_error_code = 0;
@ -854,6 +856,8 @@ static int _QuickSnapShot()
// 0x47C640
int lsgLoadGame(int mode)
{
ScopedGameMode gm(GameMode::kLoadGame);
MessageListItem messageListItem;
const char* body[] = {

View File

@ -462,6 +462,8 @@ int showOptions()
// 0x48FC50
int showOptionsWithInitialKeyCode(int initialKeyCode)
{
ScopedGameMode gm(GameMode::kOptions);
if (optionsWindowInit() == -1) {
debugPrint("\nOPTION MENU: Error loading option dialog data!\n");
return -1;
@ -1699,6 +1701,8 @@ static int preferencesWindowFree()
// 0x490798
static int _do_prefscreen()
{
ScopedGameMode gm(GameMode::kPreferences);
if (preferencesWindowInit() == -1) {
debugPrint("\nPREFERENCE MENU: Error loading preference dialog data!\n");
return -1;

View File

@ -406,6 +406,8 @@ int pipboyOpen(int intent)
return 0;
}
ScopedGameMode gm(GameMode::kPipboy);
intent = pipboyWindowInit(intent);
if (intent == -1) {
return -1;

View File

@ -109,6 +109,8 @@ static FrmImage _skilldexFrmImages[SKILLDEX_FRM_COUNT];
// 0x4ABFD0
int skilldexOpen()
{
ScopedGameMode gm(GameMode::kSkilldex);
if (skilldexWindowInit() == -1) {
debugPrint("\n ** Error loading skilldex dialog data! **\n");
return -1;

View File

@ -2958,6 +2958,8 @@ void wmWorldMap()
// 0x4BFE10
static int wmWorldMapFunc(int a1)
{
ScopedGameMode gm(GameMode::kWorldmap);
if (wmInterfaceInit() == -1) {
wmInterfaceExit();
return -1;