[Scummvm-git-logs] scummvm master -> b79554f742f68b709b8a1a5fe16ab60ec0e87a4f

aquadran aquadran at gmail.com
Sat Mar 13 18:20:29 UTC 2021


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
b79554f742 ICB: Reworked some global constructors


Commit: b79554f742f68b709b8a1a5fe16ab60ec0e87a4f
    https://github.com/scummvm/scummvm/commit/b79554f742f68b709b8a1a5fe16ab60ec0e87a4f
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2021-03-13T19:20:24+01:00

Commit Message:
ICB: Reworked some global constructors

Changed paths:
    engines/icb/cluster_manager_pc.cpp
    engines/icb/common/ptr_util.cpp
    engines/icb/common/ptr_util.h
    engines/icb/common/px_scriptengine.cpp
    engines/icb/common/px_scriptengine.h
    engines/icb/game_script.cpp
    engines/icb/global_vars.cpp
    engines/icb/mission.cpp
    engines/icb/mission_functions.cpp
    engines/icb/options_manager_pc.cpp
    engines/icb/p4_pc.cpp
    engines/icb/player.cpp
    engines/icb/timer_func.cpp


diff --git a/engines/icb/cluster_manager_pc.cpp b/engines/icb/cluster_manager_pc.cpp
index 1c6708b918..c0bd5021d5 100644
--- a/engines/icb/cluster_manager_pc.cpp
+++ b/engines/icb/cluster_manager_pc.cpp
@@ -176,7 +176,7 @@ char *ClusterManager::GetCDRoot(void) {
 
 int32 ClusterManager::WhichCD(MISSION_ID mission) {
 	// All demos exist on one CD only
-	int32 demo = g_globalScriptVariables.GetVariable("demo");
+	int32 demo = g_globalScriptVariables->GetVariable("demo");
 	if (demo != 0)
 		return 1;
 
diff --git a/engines/icb/common/ptr_util.cpp b/engines/icb/common/ptr_util.cpp
index 03fccf215a..341d6b3a36 100644
--- a/engines/icb/common/ptr_util.cpp
+++ b/engines/icb/common/ptr_util.cpp
@@ -26,23 +26,18 @@
  */
 
 #include "engines/icb/common/px_common.h"
+#include "engines/icb/common/ptr_util.h"
 
 #include "common/array.h"
 
 namespace ICB {
 
+Common::Array<PointerReference> *g_ptrArray;
+
 namespace MemoryUtil {
 
 const int32 PTR_ARRAY_MAX(1024);
 
-// map pointers to 32-bit references (bottom 32-bits of address)
-struct PointerReference {
-	uint32 ref;
-	uint8 *ptr;
-};
-
-Common::Array<PointerReference> ptrArray;
-
 uint32 encodePtr(uint8 *ptr) {
 	PointerReference ptrRef;
 
@@ -51,7 +46,7 @@ uint32 encodePtr(uint8 *ptr) {
 	ptrRef.ptr = ptr;
 
 	// find free slot
-	for (Common::Array<PointerReference>::iterator it = ptrArray.begin(); it < ptrArray.end(); it++) {
+	for (Common::Array<PointerReference>::iterator it = g_ptrArray->begin(); it < g_ptrArray->end(); it++) {
 		if (it->ref == 0) {
 			*it = ptrRef; // store
 			return ptrRef.ref;
@@ -59,9 +54,9 @@ uint32 encodePtr(uint8 *ptr) {
 	}
 
 	// append
-	ptrArray.push_back(ptrRef);
+	g_ptrArray->push_back(ptrRef);
 
-	if (ptrArray.size() >= (uint)PTR_ARRAY_MAX) {
+	if (g_ptrArray->size() >= (uint)PTR_ARRAY_MAX) {
 		error("MemoryUtil::encodePtr(): too many pointers (MAX = %u)\n", PTR_ARRAY_MAX);
 	}
 
@@ -73,7 +68,7 @@ uint8 *resolvePtr(uint32 ref) {
 		return NULL;
 
 	// do a linear search
-	for (Common::Array<PointerReference>::iterator it = ptrArray.begin(); it < ptrArray.end(); it++) {
+	for (Common::Array<PointerReference>::iterator it = g_ptrArray->begin(); it < g_ptrArray->end(); it++) {
 		if (it->ref == ref) {
 			uint8 *ptr = it->ptr;
 
@@ -90,7 +85,7 @@ uint8 *resolvePtr(uint32 ref) {
 	return NULL;
 }
 
-void clearAllPtrs(void) { ptrArray.clear(); }
+void clearAllPtrs(void) { g_ptrArray->clear(); }
 }
 
 } // End of namespace ICB
diff --git a/engines/icb/common/ptr_util.h b/engines/icb/common/ptr_util.h
index fec07eb000..c87810ce53 100644
--- a/engines/icb/common/ptr_util.h
+++ b/engines/icb/common/ptr_util.h
@@ -30,8 +30,18 @@
 
 #include "engines/icb/common/px_common.h"
 
+#include "common/array.h"
+
 namespace ICB {
 
+// map pointers to 32-bit references (bottom 32-bits of address)
+struct PointerReference {
+	uint32 ref;
+	uint8 *ptr;
+};
+
+extern Common::Array<PointerReference> *g_ptrArray;
+
 namespace MemoryUtil {
 
 uint32 encodePtr(uint8 *ptr);
diff --git a/engines/icb/common/px_scriptengine.cpp b/engines/icb/common/px_scriptengine.cpp
index f8c24be1e3..8dc4487153 100644
--- a/engines/icb/common/px_scriptengine.cpp
+++ b/engines/icb/common/px_scriptengine.cpp
@@ -36,7 +36,7 @@ namespace ICB {
 
 const char *playerString = "player";
 
-CpxGlobalScriptVariables g_globalScriptVariables;
+CpxGlobalScriptVariables *g_globalScriptVariables;
 
 // Information for the script program stack
 #define STACK_SIZE 10  // The size of the stack
@@ -217,7 +217,7 @@ scriptInterpreterReturnCodes RunScript(const char *&scriptData, // A pointer to
 
 		case CP_PUSH_GLOBAL_VAR32: {
 			Fetch32(parameter1);                                          // hash of global
-			parameter2 = g_globalScriptVariables.GetVariable(parameter1); // value of global
+			parameter2 = g_globalScriptVariables->GetVariable(parameter1); // value of global
 			PushOnStack(parameter2);                                      // push on stack
 			                                                              // printf("push global 0x%08x = %d",parameter1,parameter2);
 		} break;
@@ -225,7 +225,7 @@ scriptInterpreterReturnCodes RunScript(const char *&scriptData, // A pointer to
 		case CP_POP_GLOBAL_VAR32: {
 			Fetch32(parameter1);                                         // hash of global
 			PopOffStack(parameter2);                                     // value from stack
-			g_globalScriptVariables.SetVariable(parameter1, parameter2); // set value
+			g_globalScriptVariables->SetVariable(parameter1, parameter2); // set value
 			                                                             // printf("pop global 0x%08x = %d",parameter1,parameter2);
 		} break;
 
diff --git a/engines/icb/common/px_scriptengine.h b/engines/icb/common/px_scriptengine.h
index ac1cb1bdfb..321ff7f90b 100644
--- a/engines/icb/common/px_scriptengine.h
+++ b/engines/icb/common/px_scriptengine.h
@@ -50,7 +50,7 @@ scriptInterpreterReturnCodes RunScript(const char *&scriptData, // A pointer to
 
 void SetScriptDebugging(bool8 f); // Set script debugging flag
 
-extern CpxGlobalScriptVariables g_globalScriptVariables;
+extern CpxGlobalScriptVariables *g_globalScriptVariables;
 
 #define CP_END_SCRIPT 0               // Terminate a script
 #define CP_PUSH_INT32 1               // Push a number on to the stack
diff --git a/engines/icb/game_script.cpp b/engines/icb/game_script.cpp
index d08ff4b702..5979ad45f3 100644
--- a/engines/icb/game_script.cpp
+++ b/engines/icb/game_script.cpp
@@ -96,9 +96,9 @@ void _game_script::Run_to_bookmark(const char *name) {
 	char p1[ENGINE_STRING_LEN];
 
 	// reset program counter (but keep demo flag!)
-	int32 demo = g_globalScriptVariables.GetVariable("demo");
+	int32 demo = g_globalScriptVariables->GetVariable("demo");
 	Restart_game_script();
-	g_globalScriptVariables.SetVariable("demo", demo);
+	g_globalScriptVariables->SetVariable("demo", demo);
 
 	// now loop through gamescript...
 	while (1) {
@@ -231,7 +231,7 @@ void _game_script::Process_game_script() {
 		Fetch_next_param(p1);
 		Fetch_next_param(p2);
 		Fetch_next_line();
-		g_globalScriptVariables.SetVariable(p1, (atoi(p2)));
+		g_globalScriptVariables->SetVariable(p1, (atoi(p2)));
 		break;
 
 	case 'R': // restart
diff --git a/engines/icb/global_vars.cpp b/engines/icb/global_vars.cpp
index 60d09a3da2..42017994f7 100644
--- a/engines/icb/global_vars.cpp
+++ b/engines/icb/global_vars.cpp
@@ -47,6 +47,8 @@
 #include "engines/icb/gfx/rlp_api.h"
 #include "engines/icb/common/px_capri_maths_pc.h"
 #include "engines/icb/common/px_capri_maths.h"
+#include "engines/icb/common/ptr_util.h"
+#include "engines/icb/sound.h"
 
 namespace ICB {
 
@@ -116,7 +118,7 @@ void Init_globals() {
 			i = atoi(value);
 
 			Tdebug("globals.txt", "found var [%s] set to [%s, %d]", input, value, i);
-			g_globalScriptVariables.InitVariable(input, i);
+			g_globalScriptVariables->InitVariable(input, i);
 
 			nVars++;
 		} while (index < (len - 1));
@@ -127,12 +129,14 @@ void Init_globals() {
 
 	// Right all done
 	// So sort the globals so they can be searched quicker !
-	g_globalScriptVariables.SortVariables();
+	g_globalScriptVariables->SortVariables();
 
 	Tdebug("globals.txt", "Found %d global variables", nVars);
 }
 
 void CreateGlobalObjects() {
+	g_ptrArray = new Common::Array<PointerReference>();
+	g_globalScriptVariables = new CpxGlobalScriptVariables;
 	g_theSequenceManager = new MovieManager;
 	g_while_u_wait_SequenceManager = new MovieManager;
 	g_personalSequenceManager = new MovieManager;
@@ -172,6 +176,8 @@ void CreateGlobalObjects() {
 }
 
 void DestroyGlobalObjects() {
+	delete g_ptrArray;
+	delete g_globalScriptVariables;
 	delete g_theSequenceManager;
 	delete g_while_u_wait_SequenceManager;
 	delete g_personalSequenceManager;
diff --git a/engines/icb/mission.cpp b/engines/icb/mission.cpp
index e119b43466..761993c7f9 100644
--- a/engines/icb/mission.cpp
+++ b/engines/icb/mission.cpp
@@ -385,7 +385,7 @@ uint32 _mission::Game_cycle() {
 	session->Process_conveyors(); // conveyor belts
 
 	// Update global timer by a tick
-	g_globalScriptVariables.SetVariable("missionelapsedtime", g_globalScriptVariables.GetVariable("missionelapsedtime") + 1);
+	g_globalScriptVariables->SetVariable("missionelapsedtime", g_globalScriptVariables->GetVariable("missionelapsedtime") + 1);
 
 	// call the camera director which will pick a view depending upon the player objects position
 	session->Camera_director();
@@ -633,14 +633,14 @@ void _mission::Save_game_position(const char *filename, const char *slot_label,
 	stream->write((const char *)Fetch_tiny_session_name(), avalue);
 
 	// now write the globals out
-	atinyvalue = (uint8)g_globalScriptVariables.GetNoItems();
+	atinyvalue = (uint8)g_globalScriptVariables->GetNoItems();
 	Tdebug("save_restore.txt", " %d globals", atinyvalue);
 	stream->writeByte(atinyvalue);
 
 	for (j = 0; j < atinyvalue; j++) {
-		avalue = (int32)g_globalScriptVariables.GetVariable(g_globalScriptVariables[j].hash, 0, 0);
+		avalue = (int32)g_globalScriptVariables->GetVariable((*g_globalScriptVariables)[j].hash, 0, 0);
 		stream->writeSint32LE(avalue);
-		Tdebug("save_restore.txt", "  %d 0x%08x = %d", j, g_globalScriptVariables[j].hash, avalue);
+		Tdebug("save_restore.txt", "  %d 0x%08x = %d", j, (*g_globalScriptVariables)[j].hash, avalue);
 	}
 
 	// get the icon information
@@ -961,14 +961,14 @@ __load_result Load_game(const char *filename) {
 	// number of globals
 	atinyvalue = stream->readByte();
 	Tdebug("save_restore.txt", " %d globals", atinyvalue);
-	if (atinyvalue != (uint8)g_globalScriptVariables.GetNoItems()) {
+	if (atinyvalue != (uint8)g_globalScriptVariables->GetNoItems()) {
 		Tdebug("save_restore.txt", " globals mismatch");
 		return __GLOBAL_MISMATCH;
 	}
 
 	for (j = 0; j < atinyvalue; j++) {
 		avalue = stream->readSint32LE();
-		g_globalScriptVariables.SetVariable(g_globalScriptVariables[j].hash, avalue);
+		g_globalScriptVariables->SetVariable((*g_globalScriptVariables)[j].hash, avalue);
 		Tdebug("save_restore.txt", "  %d = %d", j, avalue);
 	}
 
diff --git a/engines/icb/mission_functions.cpp b/engines/icb/mission_functions.cpp
index 5b37d53566..f5da100d23 100644
--- a/engines/icb/mission_functions.cpp
+++ b/engines/icb/mission_functions.cpp
@@ -40,21 +40,21 @@
 namespace ICB {
 
 int32 LoadMission(int32 m, void * /*usr*/) {
-	int32 demo = g_globalScriptVariables.GetVariable("demo");
+	int32 demo = g_globalScriptVariables->GetVariable("demo");
 	Init_globals(); // reload the global vars for the new mission
-	g_globalScriptVariables.SetVariable("missionelapsedtime", 0);
+	g_globalScriptVariables->SetVariable("missionelapsedtime", 0);
 
 	// On mission 8 (m=7?) then set a global variable to say we are on mission 8 and not on mission 9
 	if (m == 7) {
-		g_globalScriptVariables.SetVariable("mission9", 0);
+		g_globalScriptVariables->SetVariable("mission9", 0);
 	}
 	// On mission 9 (m=8?) then set a global variable to say we are on mission 9 and not on mission 8
 	if (m == 8) {
-		g_globalScriptVariables.SetVariable("mission9", 1);
+		g_globalScriptVariables->SetVariable("mission9", 1);
 	}
 
 	// update the demo flag status
-	g_globalScriptVariables.SetVariable("demo", demo);
+	g_globalScriptVariables->SetVariable("demo", demo);
 
 	// Purge the res_man's to prevent them getting confused
 	rs_anims->Res_purge_all();
@@ -110,7 +110,7 @@ int32 FindMissionNumber(const char *mission) {
 		if (scumm_stricmp(g_mission_names[m], mission) == 0) {
 			// Mission 8-9 special case check
 			if (m == 6) {
-				if (g_globalScriptVariables.GetVariable("mission9") == 1)
+				if (g_globalScriptVariables->GetVariable("mission9") == 1)
 					m = 7;
 			}
 
diff --git a/engines/icb/options_manager_pc.cpp b/engines/icb/options_manager_pc.cpp
index 468d4a3cbb..69dda6d844 100644
--- a/engines/icb/options_manager_pc.cpp
+++ b/engines/icb/options_manager_pc.cpp
@@ -678,7 +678,7 @@ void OptionsManager::StartGameOverOptions() {
 		g_missionNumber = 7;
 		break;
 	case '8':
-		if (g_globalScriptVariables.GetVariable("mission9") == 0)
+		if (g_globalScriptVariables->GetVariable("mission9") == 0)
 			g_missionNumber = 8;
 		else
 			g_missionNumber = 9;
@@ -953,7 +953,7 @@ void OptionsManager::StartMainOptions(void) {
 	MakeAllSurfii();
 
 	// Need to ensure that that global timer variable is set to zero
-	g_globalScriptVariables.SetVariable("missionelapsedtime", 0);
+	g_globalScriptVariables->SetVariable("missionelapsedtime", 0);
 
 	// Initial selection
 	m_M_TOP_selected = _NEWGAME;
@@ -1027,7 +1027,7 @@ void OptionsManager::InitialiseInGameOptions(void) {
 		strncpy(m_defaultSlotName, GetTextFromReference(HashString("opt_mainlandbase")), MAX_LABEL_LENGTH - 1);
 		break;
 	case '8':
-		if (g_globalScriptVariables.GetVariable("mission9") == 0)
+		if (g_globalScriptVariables->GetVariable("mission9") == 0)
 			strncpy(m_defaultSlotName, GetTextFromReference(HashString("opt_islandbase")), MAX_LABEL_LENGTH - 1);
 		else
 			strncpy(m_defaultSlotName, GetTextFromReference(HashString("opt_escape")), MAX_LABEL_LENGTH - 1);
@@ -1044,7 +1044,7 @@ void OptionsManager::InitialiseInGameOptions(void) {
 	m_defaultSlotName[MAX_LABEL_LENGTH - 1] = 0;
 
 	// Get number of game ticks at ~12fps
-	int32 ticks = g_globalScriptVariables.GetVariable("missionelapsedtime");
+	int32 ticks = g_globalScriptVariables->GetVariable("missionelapsedtime");
 
 	// Convert to seconds played
 	m_timePlayed = (uint32)((float)ticks / 12.0f);
@@ -1868,7 +1868,7 @@ void OptionsManager::MoveSelected(bool8 _down_) {
 
 	int32 currentlySelected;
 
-	int32 demo = g_globalScriptVariables.GetVariable("demo");
+	int32 demo = g_globalScriptVariables->GetVariable("demo");
 
 	ResetTitleScreenTimeout();
 
@@ -3230,20 +3230,20 @@ void OptionsManager::DoChoice() {
 
 			// Mission 8-9 special cases
 			if (g_missionNumber == 7) {
-				g_globalScriptVariables.SetVariable("mission9", 0);
+				g_globalScriptVariables->SetVariable("mission9", 0);
 			}
 			if (g_missionNumber == 8) {
-				g_globalScriptVariables.SetVariable("mission9", 1);
+				g_globalScriptVariables->SetVariable("mission9", 1);
 			}
 
 			// Need to preserve global timer variable
 			int32 tv;
-			tv = g_globalScriptVariables.GetVariable("missionelapsedtime");
+			tv = g_globalScriptVariables->GetVariable("missionelapsedtime");
 
 			// Use this function and then quit
 			RestartMission();
 
-			g_globalScriptVariables.SetVariable("missionelapsedtime", tv);
+			g_globalScriptVariables->SetVariable("missionelapsedtime", tv);
 
 			m_thatsEnoughTa = TRUE8;
 			break;
@@ -3917,7 +3917,7 @@ void OptionsManager::DrawPlaySelectScreen(uint32 surface_id) {
 	const char *msg = NULL;
 
 	// Some of this is disabled for demos
-	int32 demo = g_globalScriptVariables.GetVariable("demo");
+	int32 demo = g_globalScriptVariables->GetVariable("demo");
 
 	uint8 *ad = surface_manager->Lock_surface(surface_id);
 	uint32 pitch = surface_manager->Get_pitch(surface_id);
diff --git a/engines/icb/p4_pc.cpp b/engines/icb/p4_pc.cpp
index e304d44d20..7aec12f00a 100644
--- a/engines/icb/p4_pc.cpp
+++ b/engines/icb/p4_pc.cpp
@@ -235,8 +235,8 @@ void InitEngine(const char *lpCmdLine) {
 	// init global variables
 	Zdebug("Init_globals");
 	Init_globals();
-	g_globalScriptVariables.SetVariable("missionelapsedtime", 0);
-	g_globalScriptVariables.SetVariable("demo", 0);
+	g_globalScriptVariables->SetVariable("missionelapsedtime", 0);
+	g_globalScriptVariables->SetVariable("demo", 0);
 	Zdebug("~Init_globals");
 
 	// ok, see if the special gameScript is present
diff --git a/engines/icb/player.cpp b/engines/icb/player.cpp
index 9b49b10dba..ee4dee9cae 100644
--- a/engines/icb/player.cpp
+++ b/engines/icb/player.cpp
@@ -3164,7 +3164,7 @@ void _game_session::Restart_player() {
 }
 
 uint32 _player::GetBulletsPerClip() {
-	uint32 bull_per_clip = g_globalScriptVariables.GetVariable("bullets_per_clip");
+	uint32 bull_per_clip = g_globalScriptVariables->GetVariable("bullets_per_clip");
 	return bull_per_clip;
 }
 
diff --git a/engines/icb/timer_func.cpp b/engines/icb/timer_func.cpp
index b63dd6f256..afaab3c9ff 100644
--- a/engines/icb/timer_func.cpp
+++ b/engines/icb/timer_func.cpp
@@ -189,7 +189,7 @@ void DrawTimer() {
 
 	int32 mins, secs, cycles, totalSecs, hs, danger;
 
-	cycles = g_globalScriptVariables.GetVariable(timerVariable);
+	cycles = g_globalScriptVariables->GetVariable(timerVariable);
 
 	totalSecs = cycles / timerMultiplier;
 
@@ -230,7 +230,7 @@ mcodeFunctionReturnCodes fn_activate_timer(int32 &, int32 *params) {
 	timerVariable = HashString(timer_name);
 
 	// test variable exists...
-	int32 test = g_globalScriptVariables.FindVariable(timerVariable);
+	int32 test = g_globalScriptVariables->FindVariable(timerVariable);
 	if (test == -1) {
 		Fatal_error("No global variable %s which fn_activate_timer() has been told to follow!", timer_name);
 	}




More information about the Scummvm-git-logs mailing list