summaryrefslogtreecommitdiffstats
path: root/src/control/Script.cpp
diff options
context:
space:
mode:
authoreray orçunus <erayorcunus@gmail.com>2020-06-14 23:26:19 +0200
committereray orçunus <erayorcunus@gmail.com>2020-06-14 23:26:19 +0200
commit2d976827ddf6fb43e64bf34555cf9175f867494b (patch)
tree8225f31e2a57e07ce411ff2b6a4acb55c1307671 /src/control/Script.cpp
parentPeds, mission switcher & fixes (diff)
downloadre3-2d976827ddf6fb43e64bf34555cf9175f867494b.tar
re3-2d976827ddf6fb43e64bf34555cf9175f867494b.tar.gz
re3-2d976827ddf6fb43e64bf34555cf9175f867494b.tar.bz2
re3-2d976827ddf6fb43e64bf34555cf9175f867494b.tar.lz
re3-2d976827ddf6fb43e64bf34555cf9175f867494b.tar.xz
re3-2d976827ddf6fb43e64bf34555cf9175f867494b.tar.zst
re3-2d976827ddf6fb43e64bf34555cf9175f867494b.zip
Diffstat (limited to '')
-rw-r--r--src/control/Script.cpp77
1 files changed, 55 insertions, 22 deletions
diff --git a/src/control/Script.cpp b/src/control/Script.cpp
index 77528b6e..957815fe 100644
--- a/src/control/Script.cpp
+++ b/src/control/Script.cpp
@@ -166,10 +166,6 @@ bool doingMissionRetry;
#endif
-#ifdef MISSION_SWITCHER
-int switchMissionTo = -1;
-#endif
-
const uint32 CRunningScript::nSaveStructSize =
#ifdef COMPATIBLE_SAVES
136;
@@ -889,18 +885,10 @@ void CRunningScript::Process()
int8 CRunningScript::ProcessOneCommand()
{
- int32 command;
-#ifdef MISSION_SWITCHER
- if (switchMissionTo != -1)
- command = COMMAND_LOAD_AND_LAUNCH_MISSION_INTERNAL;
- else
-#endif
- {
- ++CTheScripts::CommandsExecuted;
- command = CTheScripts::Read2BytesFromScript(&m_nIp);
- m_bNotFlag = (command & 0x8000);
- command &= 0x7FFF;
- }
+ ++CTheScripts::CommandsExecuted;
+ int32 command = CTheScripts::Read2BytesFromScript(&m_nIp);
+ m_bNotFlag = (command & 0x8000);
+ command &= 0x7FFF;
if (command < 100)
return ProcessCommands0To99(command);
if (command < 200)
@@ -9143,12 +9131,6 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command)
return 0;
case COMMAND_LOAD_AND_LAUNCH_MISSION_INTERNAL:
{
-#ifdef MISSION_SWITCHER
- if (switchMissionTo != -1) {
- ScriptParams[0] = switchMissionTo;
- switchMissionTo = -1;
- } else
-#endif
CollectParameters(&m_nIp, 1);
if (CTheScripts::NumberOfExclusiveMissionScripts > 0 && ScriptParams[0] <= UINT16_MAX - 2)
@@ -14480,3 +14462,54 @@ void RetryMission(int type, int unk)
}
#endif
+
+#ifdef MISSION_SWITCHER
+void
+CTheScripts::SwitchToMission(int32 mission)
+{
+ for (CRunningScript* pScript = CTheScripts::pActiveScripts; pScript != nil; pScript = pScript->GetNext()) {
+ if (!pScript->m_bIsMissionScript || !pScript->m_bDeatharrestEnabled) {
+ continue;
+ }
+ while (pScript->m_nStackPointer > 0)
+ --pScript->m_nStackPointer;
+
+ pScript->m_nIp = pScript->m_anStack[pScript->m_nStackPointer];
+ *(int32*)&CTheScripts::ScriptSpace[CTheScripts::OnAMissionFlag] = 0;
+ pScript->m_nWakeTime = 0;
+ pScript->m_bDeatharrestExecuted = true;
+
+ while (!pScript->ProcessOneCommand());
+
+ CMessages::ClearMessages();
+ }
+
+ if (CTheScripts::NumberOfExclusiveMissionScripts > 0 && mission <= UINT16_MAX - 2)
+ return;
+
+#ifdef MISSION_REPLAY
+ missionRetryScriptIndex = mission;
+ if (missionRetryScriptIndex == 19)
+ CStats::LastMissionPassedName[0] = '\0';
+#endif
+ CTimer::Suspend();
+ int offset = CTheScripts::MultiScriptArray[mission];
+#ifdef USE_DEBUG_SCRIPT_LOADER
+ CFileMgr::ChangeDir("\\data\\");
+ int handle = CFileMgr::OpenFile(scriptfile, "rb");
+ CFileMgr::ChangeDir("\\");
+#else
+ CFileMgr::ChangeDir("\\");
+ 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);
+ CRunningScript* pMissionScript = CTheScripts::StartNewScript(SIZE_MAIN_SCRIPT);
+ CTimer::Resume();
+ pMissionScript->m_bIsMissionScript = true;
+ pMissionScript->m_bMissionFlag = true;
+ CTheScripts::bAlreadyRunningAMissionScript = true;
+ CGameLogic::ClearShortCut();
+}
+#endif \ No newline at end of file