From 63046894b099598c41096651a9816ee3adc032a4 Mon Sep 17 00:00:00 2001
From: Nikolay Korolev <nickvnuk@gmail.com>
Date: Sun, 8 Aug 2021 16:57:37 +0300
Subject: [PATCH] small refactoring

---
 src/control/Script.cpp          | 54 ++++++++++++++++++---------------
 src/control/Script.h            | 27 ++++++++++++++---
 src/control/Script5.cpp         |  4 +--
 src/control/Script6.cpp         |  8 ++---
 src/control/ScriptDebug.cpp     |  4 +--
 src/core/Frontend.cpp           |  6 ++--
 src/save/GenericGameStorage.cpp |  4 ++-
 src/save/GenericGameStorage.h   |  8 +++++
 8 files changed, 73 insertions(+), 42 deletions(-)

diff --git a/src/control/Script.cpp b/src/control/Script.cpp
index 285b4cb7..bcfc6078 100644
--- a/src/control/Script.cpp
+++ b/src/control/Script.cpp
@@ -17,6 +17,9 @@
 #include "FileMgr.h"
 #include "Frontend.h"
 #include "General.h"
+#ifdef MISSION_REPLAY
+#include "GenericGameStorage.h"
+#endif
 #include "HandlingMgr.h"
 #include "Heli.h"
 #include "Hud.h"
@@ -495,11 +498,12 @@ void CRunningScript::Init()
 }
 
 #ifdef USE_DEBUG_SCRIPT_LOADER
-int scriptToLoad = 0;
+int CTheScripts::ScriptToLoad = 0;
 
-int open_script()
+int CTheScripts::OpenScript()
 {
-	switch (scriptToLoad) {
+	CFileMgr::ChangeDir("\\");
+	switch (ScriptToLoad) {
 	case 0: return CFileMgr::OpenFile("data\\main.scm", "rb");
 	case 1: return CFileMgr::OpenFile("data\\main_freeroam.scm", "rb");
 	case 2: return CFileMgr::OpenFile("data\\main_d.scm", "rb");
@@ -523,11 +527,11 @@ void CTheScripts::Init()
 #ifdef USE_DEBUG_SCRIPT_LOADER
 	// glfwGetKey doesn't work because of CGame::Initialise is blocking
 	CPad::UpdatePads();
-	if(CPad::GetPad(0)->GetChar('G')) scriptToLoad = 0;
-	if(CPad::GetPad(0)->GetChar('R')) scriptToLoad = 1;
-	if(CPad::GetPad(0)->GetChar('D')) scriptToLoad = 2;
+	if(CPad::GetPad(0)->GetChar('G')) ScriptToLoad = 0;
+	if(CPad::GetPad(0)->GetChar('R')) ScriptToLoad = 1;
+	if(CPad::GetPad(0)->GetChar('D')) ScriptToLoad = 2;
 
-	int mainf = open_script();
+	int mainf = OpenScript();
 #else
 	CFileMgr::SetDir("data");
 	int mainf = CFileMgr::OpenFile("main.scm", "rb");
@@ -663,25 +667,25 @@ void CTheScripts::Process()
 #ifdef MISSION_REPLAY
 	static uint32 TimeToWaitTill;
 	switch (AllowMissionReplay) {
-	case 2:
-		AllowMissionReplay = 3;
+	case MISSION_RETRY_STAGE_START_PROCESSING:
+		AllowMissionReplay = MISSION_RETRY_STAGE_WAIT_FOR_DELAY;
 		TimeToWaitTill = CTimer::GetTimeInMilliseconds() + (AddExtraDeathDelay() > 1000 ? 4000 : 2500);
 		break;
-	case 3:
+	case MISSION_RETRY_STAGE_WAIT_FOR_DELAY:
 		if (TimeToWaitTill < CTimer::GetTimeInMilliseconds())
-			AllowMissionReplay = 4;
+			AllowMissionReplay = MISSION_RETRY_STAGE_WAIT_FOR_MENU;
 		break;
-	case 4:
-		AllowMissionReplay = 5;
+	case MISSION_RETRY_STAGE_WAIT_FOR_MENU:
+		AllowMissionReplay = MISSION_RETRY_STAGE_WAIT_FOR_USER;
 		RetryMission(0, 0);
 		break;
-	case 6:
-		AllowMissionReplay = 7;
+	case MISSION_RETRY_STAGE_START_RESTARTING:
+		AllowMissionReplay = MISSION_RETRY_STAGE_WAIT_FOR_TIMER_AFTER_RESTART;
 		TimeToWaitTill = CTimer::GetTimeInMilliseconds() + 500;
 		break;
-	case 7:
+	case MISSION_RETRY_STAGE_WAIT_FOR_TIMER_AFTER_RESTART:
 		if (TimeToWaitTill < CTimer::GetTimeInMilliseconds()) {
-			AllowMissionReplay = 0;
+			AllowMissionReplay = MISSION_RETRY_STAGE_NORMAL;
 			return;
 		}
 		break;
@@ -1298,11 +1302,11 @@ int8 CRunningScript::ProcessCommands0To99(int32 command)
 			CPlayerInfo* pPlayerInfo = &CWorld::Players[CWorld::PlayerInFocus];
 #if 0 // makeing autosave is pointless and is a bit buggy
 			if (pPlayerInfo->m_pPed->GetPedState() != PED_DEAD && pPlayerInfo->m_WBState == WBSTATE_PLAYING && !m_bDeatharrestExecuted)
-				SaveGameForPause(1);
+				SaveGameForPause(SAVE_TYPE_QUICKSAVE);
 #endif
 			oldTargetX = oldTargetY = 0.0f;
-			if (AllowMissionReplay == 1)
-				AllowMissionReplay = 2;
+			if (AllowMissionReplay == MISSION_RETRY_STAGE_WAIT_FOR_SCRIPT_TO_TERMINATE)
+				AllowMissionReplay = MISSION_RETRY_STAGE_START_PROCESSING;
 			// I am fairly sure they forgot to set return value here
 		}
 #endif
@@ -2310,7 +2314,7 @@ int8 CRunningScript::ProcessCommands100To199(int32 command)
 		wchar* key = TheText.Get((char*)&CTheScripts::ScriptSpace[m_nIp]);
 #ifdef MISSION_REPLAY
 		if (strcmp((char*)&CTheScripts::ScriptSpace[m_nIp], "M_FAIL") == 0 && CanAllowMissionReplay())
-			AllowMissionReplay = 1;
+			AllowMissionReplay = MISSION_RETRY_STAGE_WAIT_FOR_SCRIPT_TO_TERMINATE;
 #endif
 		m_nIp += KEY_LENGTH_IN_SCRIPT;
 		CollectParameters(&m_nIp, 2);
@@ -2973,7 +2977,7 @@ int8 CRunningScript::ProcessCommands200To299(int32 command)
 
 bool CRunningScript::CanAllowMissionReplay()
 {
-	if (AllowMissionReplay)
+	if (AllowMissionReplay != MISSION_RETRY_STAGE_NORMAL)
 		return false;
 	if (CStats::LastMissionPassedName[0] == '\0')
 		return false;
@@ -2995,14 +2999,14 @@ uint32 AddExtraDeathDelay()
 
 void RetryMission(int type, int unk)
 {
-	if (type == 0) {
+	if (type == MISSION_RETRY_TYPE_SUGGEST_TO_PLAYER) {
 		doingMissionRetry = true;
 		FrontEndMenuManager.m_nCurrScreen = MENUPAGE_MISSION_RETRY;
 		FrontEndMenuManager.RequestFrontEndStartUp();
 	}
-	else if (type == 2) {
+	else if (type == MISSION_RETRY_TYPE_BEGIN_RESTARTING) {
 		doingMissionRetry = false;
-		AllowMissionReplay = 6;
+		AllowMissionReplay = MISSION_RETRY_STAGE_START_RESTARTING;
 		CTheScripts::MissionCleanUp.Process();
 	}
 }
diff --git a/src/control/Script.h b/src/control/Script.h
index 470de444..7b0f9a2e 100644
--- a/src/control/Script.h
+++ b/src/control/Script.h
@@ -584,6 +584,11 @@ public:
 	static void SwitchToMission(int32 mission);
 #endif
 
+#ifdef USE_DEBUG_SCRIPT_LOADER
+	static int ScriptToLoad;
+	static int OpenScript();
+#endif
+
 #ifdef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT
 	static void LogAfterScriptInitializing();
 	static void LogBeforeScriptProcessing();
@@ -601,9 +606,21 @@ extern bool doingMissionRetry;
 
 uint32 AddExtraDeathDelay();
 void RetryMission(int, int);
-#endif
 
-#ifdef USE_DEBUG_SCRIPT_LOADER
-int open_script();
-extern int scriptToLoad;
-#endif
\ No newline at end of file
+enum {
+	MISSION_RETRY_TYPE_SUGGEST_TO_PLAYER = 0,
+	MISSION_RETRY_TYPE_1,
+	MISSION_RETRY_TYPE_BEGIN_RESTARTING
+};
+
+enum {
+	MISSION_RETRY_STAGE_NORMAL = 0,
+	MISSION_RETRY_STAGE_WAIT_FOR_SCRIPT_TO_TERMINATE,
+	MISSION_RETRY_STAGE_START_PROCESSING,
+	MISSION_RETRY_STAGE_WAIT_FOR_DELAY,
+	MISSION_RETRY_STAGE_WAIT_FOR_MENU,
+	MISSION_RETRY_STAGE_WAIT_FOR_USER,
+	MISSION_RETRY_STAGE_START_RESTARTING,
+	MISSION_RETRY_STAGE_WAIT_FOR_TIMER_AFTER_RESTART,
+};
+#endif
diff --git a/src/control/Script5.cpp b/src/control/Script5.cpp
index 953a1f50..76aa2442 100644
--- a/src/control/Script5.cpp
+++ b/src/control/Script5.cpp
@@ -1239,10 +1239,10 @@ void CRunningScript::DoDeatharrestCheck()
 	if (!pPlayer->IsRestartingAfterDeath() && !pPlayer->IsRestartingAfterArrest() && !CTheScripts::UpsideDownCars.AreAnyCarsUpsideDown())
 		return;
 #ifdef MISSION_REPLAY
-	if (AllowMissionReplay != 0)
+	if (AllowMissionReplay != MISSION_RETRY_STAGE_NORMAL)
 		return;
 	if (CanAllowMissionReplay())
-		AllowMissionReplay = 1;
+		AllowMissionReplay = MISSION_RETRY_STAGE_WAIT_FOR_SCRIPT_TO_TERMINATE;
 #endif
 	script_assert(m_nStackPointer > 0);
 	while (m_nStackPointer > 1)
diff --git a/src/control/Script6.cpp b/src/control/Script6.cpp
index c9b2b070..0a2248f8 100644
--- a/src/control/Script6.cpp
+++ b/src/control/Script6.cpp
@@ -82,8 +82,8 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command)
 	{
 		CollectParameters(&m_nIp, 1);
 #ifdef MISSION_REPLAY
-		AllowMissionReplay = 0;
-		SaveGameForPause(3);
+		AllowMissionReplay = MISSION_RETRY_STAGE_NORMAL;
+		SaveGameForPause(SAVE_TYPE_QUICKSAVE_FOR_MISSION_REPLAY);
 #endif
 		CPlayerInfo* pPlayerInfo = &CWorld::Players[ScriptParams[0]];
 		CPad::GetPad(ScriptParams[0])->SetDisablePlayerControls(PLAYERCONTROL_CUTSCENE);
@@ -304,10 +304,10 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command)
 #endif
 		CTimer::Suspend();
 		int offset = CTheScripts::MultiScriptArray[ScriptParams[0]];
-		CFileMgr::ChangeDir("\\");
 #ifdef USE_DEBUG_SCRIPT_LOADER
-		int handle = open_script();
+		int handle = CTheScripts::OpenScript();
 #else
+		CFileMgr::ChangeDir("\\");
 		int handle = CFileMgr::OpenFile("data\\main.scm", "rb");
 #endif
 		CFileMgr::Seek(handle, offset, 0);
diff --git a/src/control/ScriptDebug.cpp b/src/control/ScriptDebug.cpp
index e9014088..63508217 100644
--- a/src/control/ScriptDebug.cpp
+++ b/src/control/ScriptDebug.cpp
@@ -1423,10 +1423,10 @@ CTheScripts::SwitchToMission(int32 mission)
 #endif
 	CTimer::Suspend();
 	int offset = CTheScripts::MultiScriptArray[mission];
-	CFileMgr::ChangeDir("\\");
 #ifdef USE_DEBUG_SCRIPT_LOADER
-	int handle = open_script();
+	int handle = OpenScript();
 #else
+	CFileMgr::ChangeDir("\\");
 	int handle = CFileMgr::OpenFile("data\\main.scm", "rb");
 #endif
 	CFileMgr::Seek(handle, offset, 0);
diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp
index ecb893b4..e7a15f66 100644
--- a/src/core/Frontend.cpp
+++ b/src/core/Frontend.cpp
@@ -4182,7 +4182,7 @@ CMenuManager::Process(void)
 #endif
 			if (CheckSlotDataValid(m_nCurrSaveSlot)) {
 #ifdef USE_DEBUG_SCRIPT_LOADER
-				scriptToLoad = 0;
+				CTheScripts::ScriptToLoad = 0;
 #endif
 #ifdef PC_PLAYER_CONTROLS
 				TheCamera.m_bUseMouse3rdPerson = m_ControlMethod == CONTROL_STANDARD;
@@ -4312,12 +4312,12 @@ CMenuManager::ProcessButtonPresses(void)
 #ifdef USE_DEBUG_SCRIPT_LOADER
 	if (m_nCurrScreen == MENUPAGE_START_MENU || m_nCurrScreen == MENUPAGE_NEW_GAME || m_nCurrScreen == MENUPAGE_NEW_GAME_RELOAD) {
 		if (CPad::GetPad(0)->GetChar('R')) {
-			scriptToLoad = 1;
+			CTheScripts::ScriptToLoad = 1;
 			DoSettingsBeforeStartingAGame();
 			return;
 		}
 		if (CPad::GetPad(0)->GetChar('D')) {
-			scriptToLoad = 2;
+			CTheScripts::ScriptToLoad = 2;
 			DoSettingsBeforeStartingAGame();
 			return;
 		}
diff --git a/src/save/GenericGameStorage.cpp b/src/save/GenericGameStorage.cpp
index f51f8233..798aeb7e 100644
--- a/src/save/GenericGameStorage.cpp
+++ b/src/save/GenericGameStorage.cpp
@@ -1153,7 +1153,9 @@ void DisplaySaveResult(int unk, char* name)
 
 bool SaveGameForPause(int type)
 {
-	if (AllowMissionReplay != 0 || type != 3 && WaitForSave > CTimer::GetTimeInMilliseconds())
+	if (AllowMissionReplay != MISSION_RETRY_STAGE_NORMAL)
+		return false;
+	if (type != SAVE_TYPE_QUICKSAVE_FOR_MISSION_REPLAY && WaitForSave > CTimer::GetTimeInMilliseconds())
 		return false;
 	WaitForSave = 0;
 	if (gGameState != GS_PLAYING_GAME || CTheScripts::IsPlayerOnAMission() || CStats::LastMissionPassedName[0] == '\0') {
diff --git a/src/save/GenericGameStorage.h b/src/save/GenericGameStorage.h
index b291ddf9..6a5b04fa 100644
--- a/src/save/GenericGameStorage.h
+++ b/src/save/GenericGameStorage.h
@@ -52,4 +52,12 @@ const char TopLineEmptyFile[] = "THIS FILE IS NOT VALID YET";
 extern int8 IsQuickSave; // originally int
 
 bool SaveGameForPause(int);
+
+enum {
+	SAVE_TYPE_NORMAL,
+	SAVE_TYPE_QUICKSAVE,
+	SAVE_TYPE_2,
+	SAVE_TYPE_QUICKSAVE_FOR_MISSION_REPLAY
+};
+
 #endif