From 33c45e4ae0f10a4b296e520d3691b47bc801ea73 Mon Sep 17 00:00:00 2001
From: Magnus Larsen <golgothasTerror101@gmail.com>
Date: Sat, 10 Jul 2021 08:56:28 -0700
Subject: [PATCH] Fix debug script loader crashing missions

* open_script is now exposed in Script.h, perhaps it should be namespaced
as a static method on CTheScripts? I'm unsure what is preferred.
* I've moved the joypad code out of open_script to prevent buttons held
  down at mission load time from changing the scriptToLoad.
---
 src/control/Script.cpp  | 24 +++++++++++-------------
 src/control/Script.h    |  1 +
 src/control/Script6.cpp |  4 ++++
 3 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/src/control/Script.cpp b/src/control/Script.cpp
index e06acdc3..09891765 100644
--- a/src/control/Script.cpp
+++ b/src/control/Script.cpp
@@ -1771,20 +1771,12 @@ int scriptToLoad = 0;
 
 int open_script()
 {
-	// 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;
 	switch (scriptToLoad) {
-	case 0: return CFileMgr::OpenFile("main.scm", "rb");
-	case 1: return CFileMgr::OpenFile("main_freeroam.scm", "rb");
-	case 2: return CFileMgr::OpenFile("main_d.scm", "rb");
+	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");
 	}
-	return CFileMgr::OpenFile("main.scm", "rb");
+	return CFileMgr::OpenFile("data\\main.scm", "rb");
 }
 #endif
 
@@ -1800,10 +1792,16 @@ void CTheScripts::Init()
 	MissionCleanUp.Init();
 	UpsideDownCars.Init();
 	StuckCars.Init();
-	CFileMgr::SetDir("data");
 #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;
+
 	int mainf = open_script();
 #else
+	CFileMgr::SetDir("data");
 	int mainf = CFileMgr::OpenFile("main.scm", "rb");
 #endif
 	CFileMgr::Read(mainf, (char*)ScriptSpace, SIZE_MAIN_SCRIPT);
diff --git a/src/control/Script.h b/src/control/Script.h
index 5682024b..cefd6747 100644
--- a/src/control/Script.h
+++ b/src/control/Script.h
@@ -591,5 +591,6 @@ void RetryMission(int, int);
 #endif
 
 #ifdef USE_DEBUG_SCRIPT_LOADER
+int open_script();
 extern int scriptToLoad;
 #endif
\ No newline at end of file
diff --git a/src/control/Script6.cpp b/src/control/Script6.cpp
index 31be6987..c9b2b070 100644
--- a/src/control/Script6.cpp
+++ b/src/control/Script6.cpp
@@ -305,7 +305,11 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command)
 		CTimer::Suspend();
 		int offset = CTheScripts::MultiScriptArray[ScriptParams[0]];
 		CFileMgr::ChangeDir("\\");
+#ifdef USE_DEBUG_SCRIPT_LOADER
+		int handle = open_script();
+#else
 		int handle = CFileMgr::OpenFile("data\\main.scm", "rb");
+#endif
 		CFileMgr::Seek(handle, offset, 0);
 		CFileMgr::Read(handle, (const char*)&CTheScripts::ScriptSpace[SIZE_MAIN_SCRIPT], SIZE_MISSION_SCRIPT);
 		CFileMgr::CloseFile(handle);