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

dreammaster dreammaster at scummvm.org
Mon Mar 1 00:41:58 UTC 2021


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

Summary:
c3d96c399c AGS: Move debug.cpp globals to Globals
b6dd902163 AGS: Move script.cpp globals into Globals


Commit: c3d96c399c3c1f7c0d363e73886c70be9bdf80ec
    https://github.com/scummvm/scummvm/commit/c3d96c399c3c1f7c0d363e73886c70be9bdf80ec
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2021-02-28T16:41:48-08:00

Commit Message:
AGS: Move debug.cpp globals to Globals

Changed paths:
    engines/ags/engine/debugging/debug.cpp
    engines/ags/globals.h


diff --git a/engines/ags/engine/debugging/debug.cpp b/engines/ags/engine/debugging/debug.cpp
index b83e60503e..fb9bedf43c 100644
--- a/engines/ags/engine/debugging/debug.cpp
+++ b/engines/ags/engine/debugging/debug.cpp
@@ -341,14 +341,6 @@ bool get_script_position(ScriptPosition &script_pos) {
 	return false;
 }
 
-struct Breakpoint {
-	char scriptName[80];
-	int lineNumber;
-};
-
-std::vector<Breakpoint> breakpoints;
-int numBreakpoints = 0;
-
 bool send_message_to_editor(const char *msg, const char *errorMsg) {
 	String callStack = get_cur_script(25);
 	if (callStack.IsEmpty())
@@ -443,19 +435,19 @@ int check_for_messages_from_editor() {
 			int lineNumber = atoi(msgPtr);
 
 			if (isDelete) {
-				for (i = 0; i < numBreakpoints; i++) {
-					if ((breakpoints[i].lineNumber == lineNumber) &&
-						(strcmp(breakpoints[i].scriptName, scriptNameBuf) == 0)) {
-						numBreakpoints--;
-						breakpoints.erase(breakpoints.begin() + i);
+				for (i = 0; i < _G(numBreakpoints); i++) {
+					if ((_G(breakpoints)[i].lineNumber == lineNumber) &&
+						(strcmp(_G(breakpoints)[i].scriptName, scriptNameBuf) == 0)) {
+						_G(numBreakpoints)--;
+						_G(breakpoints).erase(_G(breakpoints).begin() + i);
 						break;
 					}
 				}
 			} else {
-				breakpoints.push_back(Breakpoint());
-				strcpy(breakpoints[numBreakpoints].scriptName, scriptNameBuf);
-				breakpoints[numBreakpoints].lineNumber = lineNumber;
-				numBreakpoints++;
+				_G(breakpoints).push_back(Globals::Breakpoint());
+				strcpy(_G(breakpoints)[_G(numBreakpoints)].scriptName, scriptNameBuf);
+				_G(breakpoints)[_G(numBreakpoints)].lineNumber = lineNumber;
+				_G(numBreakpoints)++;
 			}
 		} else if (strncmp(msgPtr, "RESUME", 6) == 0) {
 			_G(game_paused_in_debugger) = 0;
@@ -541,9 +533,9 @@ void scriptDebugHook(ccInstance *ccinst, int linenum) {
 
 	const char *scriptName = ccinst->runningInst->instanceof->GetSectionName(ccinst->pc);
 
-	for (int i = 0; i < numBreakpoints; i++) {
-		if ((breakpoints[i].lineNumber == linenum) &&
-			(strcmp(breakpoints[i].scriptName, scriptName) == 0)) {
+	for (int i = 0; i < _G(numBreakpoints); i++) {
+		if ((_G(breakpoints)[i].lineNumber == linenum) &&
+			(strcmp(_G(breakpoints)[i].scriptName, scriptName) == 0)) {
 			break_into_debugger();
 			break;
 		}
diff --git a/engines/ags/globals.h b/engines/ags/globals.h
index 6716594d9a..5be8f69750 100644
--- a/engines/ags/globals.h
+++ b/engines/ags/globals.h
@@ -96,6 +96,14 @@ public:
 	int _break_on_next_script_step = 0;
 	volatile int _game_paused_in_debugger = 0;
 
+	struct Breakpoint {
+		char scriptName[80] = { 0 };
+		int lineNumber = 0;
+	};
+
+	std::vector<Breakpoint> _breakpoints;
+	int _numBreakpoints = 0;
+
 	/**@}*/
 
 


Commit: b6dd9021635541b80f0247e909c513eb24a4761b
    https://github.com/scummvm/scummvm/commit/b6dd9021635541b80f0247e909c513eb24a4761b
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2021-02-28T16:41:48-08:00

Commit Message:
AGS: Move script.cpp globals into Globals

Changed paths:
    engines/ags/ags.cpp
    engines/ags/engine/ac/dialog.cpp
    engines/ags/engine/ac/draw.cpp
    engines/ags/engine/ac/event.cpp
    engines/ags/engine/ac/game.cpp
    engines/ags/engine/ac/gamestate.cpp
    engines/ags/engine/ac/global_dialog.cpp
    engines/ags/engine/ac/global_game.cpp
    engines/ags/engine/ac/global_invwindow.cpp
    engines/ags/engine/ac/global_room.cpp
    engines/ags/engine/ac/gui.cpp
    engines/ags/engine/ac/mouse.cpp
    engines/ags/engine/ac/room.cpp
    engines/ags/engine/ac/system.cpp
    engines/ags/engine/debugging/debug.cpp
    engines/ags/engine/game/game_init.cpp
    engines/ags/engine/game/savegame.cpp
    engines/ags/engine/game/savegame_components.cpp
    engines/ags/engine/main/engine.cpp
    engines/ags/engine/main/engine_setup.cpp
    engines/ags/engine/main/game_file.cpp
    engines/ags/engine/main/game_run.cpp
    engines/ags/engine/main/game_start.cpp
    engines/ags/engine/script/cc_instance.cpp
    engines/ags/engine/script/script.cpp
    engines/ags/engine/script/script.h
    engines/ags/globals.cpp
    engines/ags/globals.h
    engines/ags/plugins/agsplugin.cpp


diff --git a/engines/ags/ags.cpp b/engines/ags/ags.cpp
index ffe3e8fbf5..b37e83d41b 100644
--- a/engines/ags/ags.cpp
+++ b/engines/ags/ags.cpp
@@ -395,12 +395,12 @@ void AGSEngine::setGraphicsMode(size_t w, size_t h) {
 
 bool AGSEngine::canLoadGameStateCurrently() {
 	return !_GP(thisroom).Options.SaveLoadDisabled &&
-		!::AGS3::inside_script && !_GP(play).fast_forward;
+		!_G(inside_script) && !_GP(play).fast_forward;
 }
 
 bool AGSEngine::canSaveGameStateCurrently() {
 	return !_GP(thisroom).Options.SaveLoadDisabled &&
-		!::AGS3::inside_script && !_GP(play).fast_forward;
+		!_G(inside_script) && !_GP(play).fast_forward;
 }
 
 Common::Error AGSEngine::loadGameState(int slot) {
diff --git a/engines/ags/engine/ac/dialog.cpp b/engines/ags/engine/ac/dialog.cpp
index 53c9fe9164..1188711190 100644
--- a/engines/ags/engine/ac/dialog.cpp
+++ b/engines/ags/engine/ac/dialog.cpp
@@ -70,12 +70,8 @@ namespace AGS3 {
 
 using namespace AGS::Shared;
 
-
-
-extern ccInstance *dialogScriptsInst;
 extern int in_new_room;
 extern CharacterInfo *playerchar;
-
 extern AGSPlatformDriver *platform;
 extern int cur_mode, cur_cursor;
 extern IGraphicsDriver *gfxDriver;
@@ -193,11 +189,11 @@ int run_dialog_script(DialogTopic *dtpp, int dialogID, int offse, int optionInde
 	said_speech_line = 0;
 	int result = RUN_DIALOG_STAY;
 
-	if (dialogScriptsInst) {
+	if (_G(dialogScriptsInst)) {
 		char funcName[100];
 		sprintf(funcName, "_run_dialog%d", dialogID);
-		RunTextScriptIParam(dialogScriptsInst, funcName, RuntimeScriptValue().SetInt32(optionIndex));
-		result = dialogScriptsInst->returnValue;
+		RunTextScriptIParam(_G(dialogScriptsInst), funcName, RuntimeScriptValue().SetInt32(optionIndex));
+		result = _G(dialogScriptsInst)->returnValue;
 	} else {
 		// old dialog format
 		if (offse == -1)
@@ -402,8 +398,8 @@ bool get_custom_dialog_options_dimensions(int dlgnum) {
 	ccDialogOptionsRendering.Reset();
 	ccDialogOptionsRendering.dialogID = dlgnum;
 
-	getDialogOptionsDimensionsFunc.params[0].SetDynamicObject(&ccDialogOptionsRendering, &ccDialogOptionsRendering);
-	run_function_on_non_blocking_thread(&getDialogOptionsDimensionsFunc);
+	_GP(getDialogOptionsDimensionsFunc).params[0].SetDynamicObject(&ccDialogOptionsRendering, &ccDialogOptionsRendering);
+	run_function_on_non_blocking_thread(&_GP(getDialogOptionsDimensionsFunc));
 
 	if ((ccDialogOptionsRendering.width > 0) &&
 	        (ccDialogOptionsRendering.height > 0)) {
@@ -646,8 +642,8 @@ void DialogOptions::Redraw() {
 		dialogOptionsRenderingSurface->hasAlphaChannel = ccDialogOptionsRendering.hasAlphaChannel;
 		options_surface_has_alpha = dialogOptionsRenderingSurface->hasAlphaChannel != 0;
 
-		renderDialogOptionsFunc.params[0].SetDynamicObject(&ccDialogOptionsRendering, &ccDialogOptionsRendering);
-		run_function_on_non_blocking_thread(&renderDialogOptionsFunc);
+		_GP(renderDialogOptionsFunc).params[0].SetDynamicObject(&ccDialogOptionsRendering, &ccDialogOptionsRendering);
+		run_function_on_non_blocking_thread(&_GP(renderDialogOptionsFunc));
 
 		if (!ccDialogOptionsRendering.surfaceAccessed)
 			debug_script_warn("dialog_options_get_dimensions was implemented, but no dialog_options_render function drew anything to the surface");
@@ -830,8 +826,8 @@ bool DialogOptions::Run() {
 	}
 
 	if (new_custom_render) {
-		runDialogOptionRepExecFunc.params[0].SetDynamicObject(&ccDialogOptionsRendering, &ccDialogOptionsRendering);
-		run_function_on_non_blocking_thread(&runDialogOptionRepExecFunc);
+		_GP(runDialogOptionRepExecFunc).params[0].SetDynamicObject(&ccDialogOptionsRendering, &ccDialogOptionsRendering);
+		run_function_on_non_blocking_thread(&_GP(runDialogOptionRepExecFunc));
 	}
 
 	int gkey;
@@ -856,9 +852,9 @@ bool DialogOptions::Run() {
 				}
 			}
 		} else if (new_custom_render) {
-			runDialogOptionKeyPressHandlerFunc.params[0].SetDynamicObject(&ccDialogOptionsRendering, &ccDialogOptionsRendering);
-			runDialogOptionKeyPressHandlerFunc.params[1].SetInt32(GetKeyForKeyPressCb(gkey));
-			run_function_on_non_blocking_thread(&runDialogOptionKeyPressHandlerFunc);
+			_GP(runDialogOptionKeyPressHandlerFunc).params[0].SetDynamicObject(&ccDialogOptionsRendering, &ccDialogOptionsRendering);
+			_GP(runDialogOptionKeyPressHandlerFunc).params[1].SetInt32(GetKeyForKeyPressCb(gkey));
+			run_function_on_non_blocking_thread(&_GP(runDialogOptionKeyPressHandlerFunc));
 		}
 		// Allow selection of options by keyboard shortcuts
 		else if (_GP(game).options[OPT_DIALOGNUMBERED] >= kDlgOptKeysOnly &&
@@ -877,10 +873,10 @@ bool DialogOptions::Run() {
 		if ((_G(mousex) >= dirtyx) && (_G(mousey) >= dirtyy) &&
 		        (_G(mousex) < dirtyx + tempScrn->GetWidth()) &&
 		        (_G(mousey) < dirtyy + tempScrn->GetHeight())) {
-			getDialogOptionUnderCursorFunc.params[0].SetDynamicObject(&ccDialogOptionsRendering, &ccDialogOptionsRendering);
-			run_function_on_non_blocking_thread(&getDialogOptionUnderCursorFunc);
+			_GP(getDialogOptionUnderCursorFunc).params[0].SetDynamicObject(&ccDialogOptionsRendering, &ccDialogOptionsRendering);
+			run_function_on_non_blocking_thread(&_GP(getDialogOptionUnderCursorFunc));
 
-			if (!getDialogOptionUnderCursorFunc.atLeastOneImplementationExists)
+			if (!_GP(getDialogOptionUnderCursorFunc).atLeastOneImplementationExists)
 				quit("!The script function dialog_options_get_active is not implemented. It must be present to use a custom dialogue system.");
 
 			mouseison = ccDialogOptionsRendering.activeOptionID;
@@ -918,11 +914,11 @@ bool DialogOptions::Run() {
 	        !_GP(play).IsIgnoringInput()) {
 		if (mouseison < 0 && !new_custom_render) {
 			if (usingCustomRendering) {
-				runDialogOptionMouseClickHandlerFunc.params[0].SetDynamicObject(&ccDialogOptionsRendering, &ccDialogOptionsRendering);
-				runDialogOptionMouseClickHandlerFunc.params[1].SetInt32(mouseButtonPressed + 1);
-				run_function_on_non_blocking_thread(&runDialogOptionMouseClickHandlerFunc);
+				_GP(runDialogOptionMouseClickHandlerFunc).params[0].SetDynamicObject(&ccDialogOptionsRendering, &ccDialogOptionsRendering);
+				_GP(runDialogOptionMouseClickHandlerFunc).params[1].SetInt32(mouseButtonPressed + 1);
+				run_function_on_non_blocking_thread(&_GP(runDialogOptionMouseClickHandlerFunc));
 
-				if (runDialogOptionMouseClickHandlerFunc.atLeastOneImplementationExists) {
+				if (_GP(runDialogOptionMouseClickHandlerFunc).atLeastOneImplementationExists) {
 					Redraw();
 					return true; // continue running loop
 				}
@@ -933,9 +929,9 @@ bool DialogOptions::Run() {
 			// they clicked the text box
 			parserActivated = 1;
 		} else if (new_custom_render) {
-			runDialogOptionMouseClickHandlerFunc.params[0].SetDynamicObject(&ccDialogOptionsRendering, &ccDialogOptionsRendering);
-			runDialogOptionMouseClickHandlerFunc.params[1].SetInt32(mouseButtonPressed + 1);
-			run_function_on_non_blocking_thread(&runDialogOptionMouseClickHandlerFunc);
+			_GP(runDialogOptionMouseClickHandlerFunc).params[0].SetDynamicObject(&ccDialogOptionsRendering, &ccDialogOptionsRendering);
+			_GP(runDialogOptionMouseClickHandlerFunc).params[1].SetInt32(mouseButtonPressed + 1);
+			run_function_on_non_blocking_thread(&_GP(runDialogOptionMouseClickHandlerFunc));
 		} else if (usingCustomRendering) {
 			chose = mouseison;
 			return false; // end dialog options running loop
@@ -947,12 +943,12 @@ bool DialogOptions::Run() {
 
 	if (usingCustomRendering) {
 		if (mouseWheelTurn != 0) {
-			runDialogOptionMouseClickHandlerFunc.params[0].SetDynamicObject(&ccDialogOptionsRendering, &ccDialogOptionsRendering);
-			runDialogOptionMouseClickHandlerFunc.params[1].SetInt32((mouseWheelTurn < 0) ? 9 : 8);
-			run_function_on_non_blocking_thread(&runDialogOptionMouseClickHandlerFunc);
+			_GP(runDialogOptionMouseClickHandlerFunc).params[0].SetDynamicObject(&ccDialogOptionsRendering, &ccDialogOptionsRendering);
+			_GP(runDialogOptionMouseClickHandlerFunc).params[1].SetInt32((mouseWheelTurn < 0) ? 9 : 8);
+			run_function_on_non_blocking_thread(&_GP(runDialogOptionMouseClickHandlerFunc));
 
 			if (!new_custom_render) {
-				if (runDialogOptionMouseClickHandlerFunc.atLeastOneImplementationExists)
+				if (_GP(runDialogOptionMouseClickHandlerFunc).atLeastOneImplementationExists)
 					Redraw();
 				return true; // continue running loop
 			}
diff --git a/engines/ags/engine/ac/draw.cpp b/engines/ags/engine/ac/draw.cpp
index fdd0cf955e..b46bf34ed7 100644
--- a/engines/ags/engine/ac/draw.cpp
+++ b/engines/ags/engine/ac/draw.cpp
@@ -92,7 +92,7 @@ extern GameSetup usetup;
 
 
 extern int convert_16bit_bgr;
-extern ScriptSystem scsystem;
+
 extern AGSPlatformDriver *platform;
 
 extern char noWalkBehindsAtAll;
@@ -697,7 +697,7 @@ void render_to_screen() {
 	construct_engine_overlay();
 
 	// only vsync in full screen mode, it makes things worse in a window
-	gfxDriver->EnableVsyncBeforeRender((scsystem.vsync > 0) && (!scsystem.windowed));
+	gfxDriver->EnableVsyncBeforeRender((_GP(scsystem).vsync > 0) && (!_GP(scsystem).windowed));
 
 	bool succeeded = false;
 	while (!succeeded) {
diff --git a/engines/ags/engine/ac/event.cpp b/engines/ags/engine/ac/event.cpp
index 08a3c15afe..7bc6e14449 100644
--- a/engines/ags/engine/ac/event.cpp
+++ b/engines/ags/engine/ac/event.cpp
@@ -83,8 +83,8 @@ int run_claimable_event(const char *tsname, bool includeRoom, int numParams, con
 	eventClaimed = EVENT_INPROGRESS;
 	int toret;
 
-	if (includeRoom && roominst) {
-		toret = RunScriptFunctionIfExists(roominst, tsname, numParams, params);
+	if (includeRoom && _G(roominst)) {
+		toret = RunScriptFunctionIfExists(_G(roominst), tsname, numParams, params);
 
 		if (eventClaimed == EVENT_CLAIMED) {
 			eventClaimed = eventClaimedOldValue;
@@ -93,8 +93,8 @@ int run_claimable_event(const char *tsname, bool includeRoom, int numParams, con
 	}
 
 	// run script modules
-	for (int kk = 0; kk < numScriptModules; kk++) {
-		toret = RunScriptFunctionIfExists(moduleInst[kk], tsname, numParams, params);
+	for (int kk = 0; kk < _G(numScriptModules); kk++) {
+		toret = RunScriptFunctionIfExists(_GP(moduleInst)[kk], tsname, numParams, params);
 
 		if (eventClaimed == EVENT_CLAIMED) {
 			eventClaimed = eventClaimedOldValue;
diff --git a/engines/ags/engine/ac/game.cpp b/engines/ags/engine/ac/game.cpp
index 9527e8d6f7..3771db6864 100644
--- a/engines/ags/engine/ac/game.cpp
+++ b/engines/ags/engine/ac/game.cpp
@@ -455,8 +455,8 @@ void restore_game_dialog() {
 		DisplayMessage(983);
 		return;
 	}
-	if (inside_script) {
-		curscript->queue_action(ePSARestoreGameDialog, 0, "RestoreGameDialog");
+	if (_G(inside_script)) {
+		_G(curscript)->queue_action(ePSARestoreGameDialog, 0, "RestoreGameDialog");
 		return;
 	}
 	setup_for_dialog();
@@ -472,8 +472,8 @@ void save_game_dialog() {
 		DisplayMessage(983);
 		return;
 	}
-	if (inside_script) {
-		curscript->queue_action(ePSASaveGameDialog, 0, "SaveGameDialog");
+	if (_G(inside_script)) {
+		_G(curscript)->queue_action(ePSASaveGameDialog, 0, "SaveGameDialog");
 		return;
 	}
 	setup_for_dialog();
@@ -495,7 +495,7 @@ void unload_game_file() {
 
 	_GP(play).FreeViewportsAndCameras();
 
-	characterScriptObjNames.clear();
+	_GP(characterScriptObjNames).clear();
 	free(charextra);
 	free(_G(mls));
 	free(actsps);
@@ -504,43 +504,43 @@ void unload_game_file() {
 	free(actspswbbmp);
 	free(actspswbcache);
 
-	if ((gameinst != nullptr) && (gameinst->pc != 0)) {
+	if ((_G(gameinst) != nullptr) && (_G(gameinst)->pc != 0)) {
 		quit("Error: unload_game called while script still running");
 	} else {
-		delete gameinstFork;
-		delete gameinst;
-		gameinstFork = nullptr;
-		gameinst = nullptr;
+		delete _G(gameinstFork);
+		delete _G(gameinst);
+		_G(gameinstFork) = nullptr;
+		_G(gameinst) = nullptr;
 	}
 
-	gamescript.reset();
+	_GP(gamescript).reset();
 
-	if ((dialogScriptsInst != nullptr) && (dialogScriptsInst->pc != 0)) {
+	if ((_G(dialogScriptsInst) != nullptr) && (_G(dialogScriptsInst)->pc != 0)) {
 		quit("Error: unload_game called while dialog script still running");
-	} else if (dialogScriptsInst != nullptr) {
-		delete dialogScriptsInst;
-		dialogScriptsInst = nullptr;
-	}
-
-	dialogScriptsScript.reset();
-
-	for (int i = 0; i < numScriptModules; ++i) {
-		delete moduleInstFork[i];
-		delete moduleInst[i];
-		scriptModules[i].reset();
-	}
-	moduleInstFork.resize(0);
-	moduleInst.resize(0);
-	scriptModules.resize(0);
-	repExecAlways.moduleHasFunction.resize(0);
-	lateRepExecAlways.moduleHasFunction.resize(0);
-	getDialogOptionsDimensionsFunc.moduleHasFunction.resize(0);
-	renderDialogOptionsFunc.moduleHasFunction.resize(0);
-	getDialogOptionUnderCursorFunc.moduleHasFunction.resize(0);
-	runDialogOptionMouseClickHandlerFunc.moduleHasFunction.resize(0);
-	runDialogOptionKeyPressHandlerFunc.moduleHasFunction.resize(0);
-	runDialogOptionRepExecFunc.moduleHasFunction.resize(0);
-	numScriptModules = 0;
+	} else if (_G(dialogScriptsInst) != nullptr) {
+		delete _G(dialogScriptsInst);
+		_G(dialogScriptsInst) = nullptr;
+	}
+
+	_GP(dialogScriptsScript).reset();
+
+	for (int i = 0; i < _G(numScriptModules); ++i) {
+		delete _GP(moduleInstFork)[i];
+		delete _GP(moduleInst)[i];
+		_GP(scriptModules)[i].reset();
+	}
+	_GP(moduleInstFork).resize(0);
+	_GP(moduleInst).resize(0);
+	_GP(scriptModules).resize(0);
+	_GP(repExecAlways).moduleHasFunction.resize(0);
+	_GP(lateRepExecAlways).moduleHasFunction.resize(0);
+	_GP(getDialogOptionsDimensionsFunc).moduleHasFunction.resize(0);
+	_GP(renderDialogOptionsFunc).moduleHasFunction.resize(0);
+	_GP(getDialogOptionUnderCursorFunc).moduleHasFunction.resize(0);
+	_GP(runDialogOptionMouseClickHandlerFunc).moduleHasFunction.resize(0);
+	_GP(runDialogOptionKeyPressHandlerFunc).moduleHasFunction.resize(0);
+	_GP(runDialogOptionRepExecFunc).moduleHasFunction.resize(0);
+	_G(numScriptModules) = 0;
 
 	free(_G(views));
 	_G(views) = nullptr;
@@ -574,7 +574,7 @@ void unload_game_file() {
 		guibg[i] = nullptr;
 	}
 
-	guiScriptObjNames.clear();
+	_GP(guiScriptObjNames).clear();
 	free(guibg);
 	_GP(guis).clear();
 	free(_G(scrGui));
@@ -1007,8 +1007,8 @@ void save_game(int slotn, const char *descript) {
 	// the state of blocked scripts
 	can_run_delayed_command();
 
-	if (inside_script) {
-		strcpy(curscript->postScriptSaveSlotDescription[curscript->queue_action(ePSASaveGame, slotn, "SaveGameSlot")], descript);
+	if (_G(inside_script)) {
+		strcpy(_G(curscript)->postScriptSaveSlotDescription[_G(curscript)->queue_action(ePSASaveGame, slotn, "SaveGameSlot")], descript);
 		return;
 	}
 
@@ -1083,11 +1083,11 @@ HSaveError restore_game_scripts(Stream *in, const PreservedParams &pp, RestoredD
 	r_data.GlobalScript.Data.reset(new char[gdatasize]);
 	in->Read(r_data.GlobalScript.Data.get(), gdatasize);
 
-	if (in->ReadInt32() != numScriptModules) {
+	if (in->ReadInt32() != _G(numScriptModules)) {
 		return new SavegameError(kSvgErr_GameContentAssertion, "Mismatching number of script modules.");
 	}
-	r_data.ScriptModules.resize(numScriptModules);
-	for (int i = 0; i < numScriptModules; ++i) {
+	r_data.ScriptModules.resize(_G(numScriptModules));
+	for (int i = 0; i < _G(numScriptModules); ++i) {
 		size_t module_size = in->ReadInt32();
 		if (pp.ScMdDataSize[i] != (int)module_size) {
 			return new SavegameError(kSvgErr_GameContentAssertion, String::FromFormat("Mismatching size of script module data, module %d.", i));
@@ -1787,7 +1787,7 @@ void display_switch_in() {
 	platform->DisplaySwitchIn();
 	ags_clear_input_buffer();
 	// If auto lock option is set, lock mouse to the game window
-	if (usetup.mouse_auto_lock && scsystem.windowed)
+	if (usetup.mouse_auto_lock && _GP(scsystem).windowed)
 		Mouse::TryLockToWindow();
 }
 
@@ -2278,7 +2278,7 @@ void RegisterStaticObjects() {
 	ccAddExternalStaticObject("gs_globals", &_GP(play).globalvars[0], &GlobalStaticManager);
 	ccAddExternalStaticObject("mouse", &scmouse, &GlobalStaticManager);
 	ccAddExternalStaticObject("palette", &palette[0], &GlobalStaticManager);
-	ccAddExternalStaticObject("system", &scsystem, &GlobalStaticManager);
+	ccAddExternalStaticObject("system", &_GP(scsystem), &GlobalStaticManager);
 	ccAddExternalStaticObject("savegameindex", &_GP(play).filenumbers[0], &GlobalStaticManager);
 }
 
diff --git a/engines/ags/engine/ac/gamestate.cpp b/engines/ags/engine/ac/gamestate.cpp
index 2b79f885cb..d61d476fb0 100644
--- a/engines/ags/engine/ac/gamestate.cpp
+++ b/engines/ags/engine/ac/gamestate.cpp
@@ -47,7 +47,7 @@ using namespace AGS::Engine;
 
 
 extern CharacterInfo *playerchar;
-extern ScriptSystem scsystem;
+
 
 GameState::GameState() {
 	Common::fill(&globalvars[0], &globalvars[MAXGLOBALVARS], 0);
@@ -84,8 +84,8 @@ void GameState::SetAutoRoomViewport(bool on) {
 void GameState::SetMainViewport(const Rect &viewport) {
 	_mainViewport.SetRect(viewport);
 	Mouse::SetGraphicArea();
-	scsystem.viewport_width = game_to_data_coord(_mainViewport.GetRect().GetWidth());
-	scsystem.viewport_height = game_to_data_coord(_mainViewport.GetRect().GetHeight());
+	_GP(scsystem).viewport_width = game_to_data_coord(_mainViewport.GetRect().GetWidth());
+	_GP(scsystem).viewport_height = game_to_data_coord(_mainViewport.GetRect().GetHeight());
 	_mainViewportHasChanged = true;
 }
 
diff --git a/engines/ags/engine/ac/global_dialog.cpp b/engines/ags/engine/ac/global_dialog.cpp
index 23bb9ca938..a75f334b2d 100644
--- a/engines/ags/engine/ac/global_dialog.cpp
+++ b/engines/ags/engine/ac/global_dialog.cpp
@@ -57,8 +57,8 @@ void RunDialog(int tum) {
 
 	get_script_position(last_in_dialog_request_script_pos);
 
-	if (inside_script)
-		curscript->queue_action(ePSARunDialog, tum, "RunDialog");
+	if (_G(inside_script))
+		_G(curscript)->queue_action(ePSARunDialog, tum, "RunDialog");
 	else
 		do_conversation(tum);
 }
diff --git a/engines/ags/engine/ac/global_game.cpp b/engines/ags/engine/ac/global_game.cpp
index c64542222d..d71b1c20e5 100644
--- a/engines/ags/engine/ac/global_game.cpp
+++ b/engines/ags/engine/ac/global_game.cpp
@@ -77,20 +77,14 @@ using namespace AGS::Shared;
 
 #define ALLEGRO_KEYBOARD_HANDLER
 
-
-extern ExecutingScript *curscript;
 extern int displayed_room;
 extern int game_paused;
-
 extern char gamefilenamebuf[200];
 extern GameSetup usetup;
 extern unsigned int load_new_game;
 extern int load_new_game_restore;
-
-
 extern RoomStatus *croom;
 extern int gui_disabled_style;
-
 extern int getloctype_index;
 extern IGraphicsDriver *gfxDriver;
 extern color palette[256];
@@ -111,8 +105,8 @@ void GiveScore(int amnt) {
 
 void restart_game() {
 	can_run_delayed_command();
-	if (inside_script) {
-		curscript->queue_action(ePSARestartGame, 0, "RestartGame");
+	if (_G(inside_script)) {
+		_G(curscript)->queue_action(ePSARestartGame, 0, "RestartGame");
 		return;
 	}
 	try_restore_save(RESTART_POINT_SAVE_GAME_NUMBER);
@@ -123,8 +117,8 @@ void RestoreGameSlot(int slnum) {
 		quit("!RestoreGameSlot: a game cannot be restored from within game_start");
 
 	can_run_delayed_command();
-	if (inside_script) {
-		curscript->queue_action(ePSARestoreGame, slnum, "RestoreGameSlot");
+	if (_G(inside_script)) {
+		_G(curscript)->queue_action(ePSARestoreGame, slnum, "RestoreGameSlot");
 		return;
 	}
 	try_restore_save(slnum);
@@ -258,8 +252,8 @@ int RunAGSGame(const char *newgame, unsigned int mode, int data) {
 		_GP(play).takeover_data = data;
 		load_new_game_restore = -1;
 
-		if (inside_script) {
-			curscript->queue_action(ePSARunAGSGame, mode | RAGMODE_LOADNOW, "RunAGSGame");
+		if (_G(inside_script)) {
+			_G(curscript)->queue_action(ePSARunAGSGame, mode | RAGMODE_LOADNOW, "RunAGSGame");
 			ccInstance::GetCurrentInstance()->Abort();
 		} else
 			load_new_game = mode | RAGMODE_LOADNOW;
@@ -869,7 +863,7 @@ void SetMultitasking(int mode) {
 	}
 
 	// Don't allow background running if full screen
-	if ((mode == 1) && (!scsystem.windowed))
+	if ((mode == 1) && (!_GP(scsystem).windowed))
 		mode = 0;
 
 	if (mode == 0) {
diff --git a/engines/ags/engine/ac/global_invwindow.cpp b/engines/ags/engine/ac/global_invwindow.cpp
index 723c794534..30435ad45e 100644
--- a/engines/ags/engine/ac/global_invwindow.cpp
+++ b/engines/ags/engine/ac/global_invwindow.cpp
@@ -30,11 +30,8 @@
 
 namespace AGS3 {
 
-extern ExecutingScript *curscript;
-
-
 void sc_invscreen() {
-	curscript->queue_action(ePSAInvScreen, 0, "InventoryScreen");
+	_G(curscript)->queue_action(ePSAInvScreen, 0, "InventoryScreen");
 }
 
 void SetInvDimensions(int ww, int hh) {
diff --git a/engines/ags/engine/ac/global_room.cpp b/engines/ags/engine/ac/global_room.cpp
index 00e43cf0c0..b1375f0e3d 100644
--- a/engines/ags/engine/ac/global_room.cpp
+++ b/engines/ags/engine/ac/global_room.cpp
@@ -120,11 +120,11 @@ void NewRoom(int nrnum) {
 	} else if (in_inv_screen) {
 		inv_screen_newroom = nrnum;
 		return;
-	} else if ((inside_script == 0) & (in_graph_script == 0)) {
+	} else if ((_G(inside_script) == 0) & (_G(in_graph_script) == 0)) {
 		new_room(nrnum, playerchar);
 		return;
-	} else if (inside_script) {
-		curscript->queue_action(ePSANewRoom, nrnum, "NewRoom");
+	} else if (_G(inside_script)) {
+		_G(curscript)->queue_action(ePSANewRoom, nrnum, "NewRoom");
 		// we might be within a MoveCharacterBlocking -- the room
 		// change should abort it
 		if ((playerchar->walking > 0) && (playerchar->walking < TURNING_AROUND)) {
@@ -133,7 +133,7 @@ void NewRoom(int nrnum) {
 			_G(mls)[playerchar->walking].direct = 1;
 			StopMoving(_GP(game).playercharacter);
 		}
-	} else if (in_graph_script)
+	} else if (_G(in_graph_script))
 		gs_to_newroom = nrnum;
 }
 
@@ -179,12 +179,12 @@ int HasPlayerBeenInRoom(int roomnum) {
 void CallRoomScript(int value) {
 	can_run_delayed_command();
 
-	if (!inside_script)
+	if (!_G(inside_script))
 		quit("!CallRoomScript: not inside a script???");
 
 	_GP(play).roomscript_finished = 0;
 	RuntimeScriptValue rval_null;
-	curscript->run_another("on_call", kScInstRoom, 1, RuntimeScriptValue().SetInt32(value), rval_null);
+	_G(curscript)->run_another("on_call", kScInstRoom, 1, RuntimeScriptValue().SetInt32(value), rval_null);
 }
 
 int HasBeenToRoom(int roomnum) {
diff --git a/engines/ags/engine/ac/gui.cpp b/engines/ags/engine/ac/gui.cpp
index 93c3e3928b..65d566bc58 100644
--- a/engines/ags/engine/ac/gui.cpp
+++ b/engines/ags/engine/ac/gui.cpp
@@ -64,22 +64,12 @@ namespace AGS3 {
 using namespace AGS::Shared;
 using namespace AGS::Engine;
 
-
 extern GameSetup usetup;
-
 extern int cur_mode, cur_cursor;
-extern ccInstance *gameinst;
-
-
-
 extern Bitmap **guibg;
 extern IDriverDependantBitmap **guibgbmp;
 extern IGraphicsDriver *gfxDriver;
 
-
-
-
-
 int ifacepopped = -1; // currently displayed pop-up GUI (-1 if none)
 int mouse_on_iface = -1; // mouse cursor is over this interface
 int mouse_ifacebut_xoffs = -1, mouse_ifacebut_yoffs = -1;
@@ -363,7 +353,7 @@ void process_interface_click(int ifce, int btn, int mbut) {
 		// otherwise, run interface_click
 		if ((theObj->GetEventCount() > 0) &&
 			(!theObj->EventHandlers[0].IsEmpty()) &&
-			(!gameinst->GetSymbolAddress(theObj->EventHandlers[0]).IsNull())) {
+			(!_G(gameinst)->GetSymbolAddress(theObj->EventHandlers[0]).IsNull())) {
 			// control-specific event handler
 			if (strchr(theObj->GetEventArgs(0), ',') != nullptr)
 				QueueScriptFunction(kScInstGame, theObj->EventHandlers[0], 2,
diff --git a/engines/ags/engine/ac/mouse.cpp b/engines/ags/engine/ac/mouse.cpp
index ed9bd52025..569b236656 100644
--- a/engines/ags/engine/ac/mouse.cpp
+++ b/engines/ags/engine/ac/mouse.cpp
@@ -54,7 +54,7 @@ using namespace AGS::Engine;
 
 
 
-extern ScriptSystem scsystem;
+
 
 extern CharacterInfo *playerchar;
 extern IGraphicsDriver *gfxDriver;
@@ -328,7 +328,7 @@ int IsModeEnabled(int which) {
 void Mouse_EnableControl(bool on) {
 	usetup.mouse_ctrl_enabled = on; // remember setting in config
 
-	bool is_windowed = scsystem.windowed != 0;
+	bool is_windowed = _GP(scsystem).windowed != 0;
 	// Whether mouse movement should be controlled by the engine - this is
 	// determined based on related config option.
 	bool should_control_mouse = usetup.mouse_ctrl_when == kMouseCtrl_Always ||
diff --git a/engines/ags/engine/ac/room.cpp b/engines/ags/engine/ac/room.cpp
index bd5f48898e..020c295977 100644
--- a/engines/ags/engine/ac/room.cpp
+++ b/engines/ags/engine/ac/room.cpp
@@ -74,7 +74,6 @@
 #include "ags/engine/gfx/gfxfilter.h"
 #include "ags/shared/util/math.h"
 #include "ags/engine/media/audio/audio_system.h"
-
 #include "ags/shared/debugging/out.h"
 #include "ags/engine/script/script_api.h"
 #include "ags/engine/script/script_runtime.h"
@@ -92,17 +91,13 @@ extern GameSetup usetup;
 extern RoomStatus *croom;
 extern int displayed_room;
 extern RoomObject *objs;
-extern ccInstance *roominst;
 extern AGSPlatformDriver *platform;
 extern int numevents;
-
-
 extern CharacterExtras *charextra;
 extern int done_es_error;
 extern int our_eip;
 extern Bitmap *walkareabackup, *walkable_areas_temp;
 
-
 extern int in_new_room, new_room_was;  // 1 in new room, 2 first time in new room, 3 loading saved game
 
 extern int in_leaves_screen;
@@ -243,10 +238,10 @@ void convert_room_background_to_game_res() {
 void save_room_data_segment() {
 	croom->FreeScriptData();
 
-	croom->tsdatasize = roominst->globaldatasize;
+	croom->tsdatasize = _G(roominst)->globaldatasize;
 	if (croom->tsdatasize > 0) {
 		croom->tsdata = (char *)malloc(croom->tsdatasize + 10);
-		memcpy(croom->tsdata, &roominst->globaldata[0], croom->tsdatasize);
+		memcpy(croom->tsdata, &_G(roominst)->globaldata[0], croom->tsdatasize);
 	}
 
 }
@@ -281,12 +276,12 @@ void unload_old_room() {
 	}
 
 	if (croom == nullptr) ;
-	else if (roominst != nullptr) {
+	else if (_G(roominst) != nullptr) {
 		save_room_data_segment();
-		delete roominstFork;
-		delete roominst;
-		roominstFork = nullptr;
-		roominst = nullptr;
+		delete _G(roominstFork);
+		delete _G(roominst);
+		_G(roominstFork) = nullptr;
+		_G(roominst) = nullptr;
 	} else croom->tsdatasize = 0;
 	memset(&_GP(play).walkable_areas_on[0], 1, MAX_WALK_AREAS + 1);
 	_GP(play).bg_frame = 0;
@@ -315,10 +310,10 @@ void unload_old_room() {
 
 	for (ff = 0; ff < croom->numobj; ff++) {
 		// un-export the object's script object
-		if (objectScriptObjNames[ff].IsEmpty())
+		if (_G(objectScriptObjNames)[ff].IsEmpty())
 			continue;
 
-		ccRemoveExternalSymbol(objectScriptObjNames[ff]);
+		ccRemoveExternalSymbol(_G(objectScriptObjNames)[ff]);
 	}
 
 	for (ff = 0; ff < MAX_ROOM_HOTSPOTS; ff++) {
@@ -643,15 +638,15 @@ void load_new_room(int newnum, CharacterInfo *forchar) {
 	for (cc = 0; cc < MAX_ROOM_OBJECTS; cc++) {
 		// 64 bit: Using the id instead
 		// _G(scrObj)[cc].obj = &croom->obj[cc];
-		objectScriptObjNames[cc].Free();
+		_G(objectScriptObjNames)[cc].Free();
 	}
 
 	for (cc = 0; cc < croom->numobj; cc++) {
 		// export the object's script object
 		if (_GP(thisroom).Objects[cc].ScriptName.IsEmpty())
 			continue;
-		objectScriptObjNames[cc] = _GP(thisroom).Objects[cc].ScriptName;
-		ccAddExternalDynamicObject(objectScriptObjNames[cc], &_G(scrObj)[cc], &_GP(ccDynamicObject));
+		_G(objectScriptObjNames)[cc] = _GP(thisroom).Objects[cc].ScriptName;
+		ccAddExternalDynamicObject(_G(objectScriptObjNames)[cc], &_G(scrObj)[cc], &_GP(ccDynamicObject));
 	}
 
 	for (cc = 0; cc < MAX_ROOM_HOTSPOTS; cc++) {
@@ -720,14 +715,14 @@ void load_new_room(int newnum, CharacterInfo *forchar) {
 
 	update_polled_stuff_if_runtime();
 
-	roominst = nullptr;
+	_G(roominst) = nullptr;
 	if (debug_flags & DBG_NOSCRIPT) ;
 	else if (_GP(thisroom).CompiledScript != nullptr) {
 		compile_room_script();
 		if (croom->tsdatasize > 0) {
-			if (croom->tsdatasize != roominst->globaldatasize)
+			if (croom->tsdatasize != _G(roominst)->globaldatasize)
 				quit("room script data segment size has changed");
-			memcpy(&roominst->globaldata[0], croom->tsdata, croom->tsdatasize);
+			memcpy(&_G(roominst)->globaldata[0], croom->tsdata, croom->tsdatasize);
 		}
 	}
 	our_eip = 207;
@@ -1003,19 +998,19 @@ void check_new_room() {
 void compile_room_script() {
 	ccError = 0;
 
-	roominst = ccInstance::CreateFromScript(_GP(thisroom).CompiledScript);
+	_G(roominst) = ccInstance::CreateFromScript(_GP(thisroom).CompiledScript);
 
-	if ((ccError != 0) || (roominst == nullptr)) {
+	if ((ccError != 0) || (_G(roominst) == nullptr)) {
 		quitprintf("Unable to create local script: %s", ccErrorString.GetCStr());
 	}
 
-	roominstFork = roominst->Fork();
-	if (roominstFork == nullptr)
+	_G(roominstFork) = _G(roominst)->Fork();
+	if (_G(roominstFork) == nullptr)
 		quitprintf("Unable to create forked room instance: %s", ccErrorString.GetCStr());
 
-	repExecAlways.roomHasFunction = true;
-	lateRepExecAlways.roomHasFunction = true;
-	getDialogOptionsDimensionsFunc.roomHasFunction = true;
+	_GP(repExecAlways).roomHasFunction = true;
+	_GP(lateRepExecAlways).roomHasFunction = true;
+	_GP(getDialogOptionsDimensionsFunc).roomHasFunction = true;
 }
 
 int bg_just_changed = 0;
diff --git a/engines/ags/engine/ac/system.cpp b/engines/ags/engine/ac/system.cpp
index 8cb7e203c5..87ac0f1986 100644
--- a/engines/ags/engine/ac/system.cpp
+++ b/engines/ags/engine/ac/system.cpp
@@ -54,7 +54,7 @@ using namespace AGS::Engine;
 
 extern GameSetup usetup;
 extern ScriptAudioChannel scrAudioChannel[MAX_SOUND_CHANNELS + 1];
-extern ScriptSystem scsystem;
+
 extern IGraphicsDriver *gfxDriver;
 
 extern volatile bool switched_away;
@@ -64,11 +64,11 @@ bool System_HasInputFocus() {
 }
 
 int System_GetColorDepth() {
-	return scsystem.coldepth;
+	return _GP(scsystem).coldepth;
 }
 
 int System_GetOS() {
-	return scsystem.os;
+	return _GP(scsystem).os;
 }
 
 // [IKM] 2014-09-21
@@ -133,20 +133,20 @@ void System_SetNumLock(int newValue) {
 }
 
 int System_GetVsync() {
-	return scsystem.vsync;
+	return _GP(scsystem).vsync;
 }
 
 void System_SetVsync(int newValue) {
 	if (ags_stricmp(gfxDriver->GetDriverID(), "D3D9") != 0)
-		scsystem.vsync = newValue;
+		_GP(scsystem).vsync = newValue;
 }
 
 int System_GetWindowed() {
-	return scsystem.windowed;
+	return _GP(scsystem).windowed;
 }
 
 void System_SetWindowed(int windowed) {
-	if (windowed != scsystem.windowed)
+	if (windowed != _GP(scsystem).windowed)
 		engine_try_switch_windowed_gfxmode();
 }
 
diff --git a/engines/ags/engine/debugging/debug.cpp b/engines/ags/engine/debugging/debug.cpp
index fb9bedf43c..3a66e0c042 100644
--- a/engines/ags/engine/debugging/debug.cpp
+++ b/engines/ags/engine/debugging/debug.cpp
@@ -291,11 +291,11 @@ void debug_script_print(const String &msg, MessageType mt) {
 	ccInstance *curinst = ccInstance::GetCurrentInstance();
 	if (curinst != nullptr) {
 		String scriptname;
-		if (curinst->instanceof == gamescript)
+		if (curinst->instanceof == _GP(gamescript))
 			scriptname = "G ";
 		else if (curinst->instanceof == _GP(thisroom).CompiledScript)
 			scriptname = "R ";
-		else if (curinst->instanceof == dialogScriptsScript)
+		else if (curinst->instanceof == _GP(dialogScriptsScript))
 			scriptname = "D ";
 		else
 			scriptname = "? ";
diff --git a/engines/ags/engine/game/game_init.cpp b/engines/ags/engine/game/game_init.cpp
index 63206a0ada..5277c8b815 100644
--- a/engines/ags/engine/game/game_init.cpp
+++ b/engines/ags/engine/game/game_init.cpp
@@ -79,10 +79,6 @@ extern StaticArray StaticRegionArray;
 extern StaticArray StaticInventoryArray;
 extern StaticArray StaticDialogArray;
 
-extern std::vector<ccInstance *> moduleInst;
-extern std::vector<ccInstance *> moduleInstFork;
-extern std::vector<RuntimeScriptValue> moduleRepExecAddr;
-
 // Old dialog support (defined in ac/dialog)
 extern std::vector< std::shared_ptr<unsigned char> > old_dialog_scripts;
 extern std::vector<String> old_speech_lines;
@@ -138,7 +134,7 @@ void InitAndRegisterAudioObjects() {
 
 // Initializes characters and registers them in the script system
 void InitAndRegisterCharacters() {
-	characterScriptObjNames.resize(_GP(game).numcharacters);
+	_GP(characterScriptObjNames).resize(_GP(game).numcharacters);
 	for (int i = 0; i < _GP(game).numcharacters; ++i) {
 		_GP(game).chars[i].walking = 0;
 		_GP(game).chars[i].animating = 0;
@@ -156,8 +152,8 @@ void InitAndRegisterCharacters() {
 		ccRegisterManagedObject(&_GP(game).chars[i], &_GP(ccDynamicCharacter));
 
 		// export the character's script object
-		characterScriptObjNames[i] = _GP(game).chars[i].scrname;
-		ccAddExternalDynamicObject(characterScriptObjNames[i], &_GP(game).chars[i], &_GP(ccDynamicCharacter));
+		_GP(characterScriptObjNames)[i] = _GP(game).chars[i].scrname;
+		ccAddExternalDynamicObject(_GP(characterScriptObjNames)[i], &_GP(game).chars[i], &_GP(ccDynamicCharacter));
 	}
 }
 
@@ -191,7 +187,7 @@ HError InitAndRegisterGUI() {
 		_G(scrGui)[i].id = -1;
 	}
 
-	guiScriptObjNames.resize(_GP(game).numgui);
+	_GP(guiScriptObjNames).resize(_GP(game).numgui);
 	for (int i = 0; i < _GP(game).numgui; ++i) {
 		// link controls to their parent guis
 		HError err = _GP(guis)[i].RebuildArray();
@@ -201,9 +197,9 @@ HError InitAndRegisterGUI() {
 		export_gui_controls(i);
 		// copy the script name to its own memory location
 		// because ccAddExtSymbol only keeps a reference
-		guiScriptObjNames[i] = _GP(guis)[i].Name;
+		_GP(guiScriptObjNames)[i] = _GP(guis)[i].Name;
 		_G(scrGui)[i].id = i;
-		ccAddExternalDynamicObject(guiScriptObjNames[i], &_G(scrGui)[i], &_GP(ccDynamicGUI));
+		ccAddExternalDynamicObject(_GP(guiScriptObjNames)[i], &_G(scrGui)[i], &_GP(ccDynamicGUI));
 		ccRegisterManagedObject(&_G(scrGui)[i], &_GP(ccDynamicGUI));
 	}
 	return HError::None();
@@ -297,19 +293,19 @@ void LoadFonts(GameDataVersion data_ver) {
 }
 
 void AllocScriptModules() {
-	moduleInst.resize(numScriptModules, nullptr);
-	moduleInstFork.resize(numScriptModules, nullptr);
-	moduleRepExecAddr.resize(numScriptModules);
-	repExecAlways.moduleHasFunction.resize(numScriptModules, true);
-	lateRepExecAlways.moduleHasFunction.resize(numScriptModules, true);
-	getDialogOptionsDimensionsFunc.moduleHasFunction.resize(numScriptModules, true);
-	renderDialogOptionsFunc.moduleHasFunction.resize(numScriptModules, true);
-	getDialogOptionUnderCursorFunc.moduleHasFunction.resize(numScriptModules, true);
-	runDialogOptionMouseClickHandlerFunc.moduleHasFunction.resize(numScriptModules, true);
-	runDialogOptionKeyPressHandlerFunc.moduleHasFunction.resize(numScriptModules, true);
-	runDialogOptionRepExecFunc.moduleHasFunction.resize(numScriptModules, true);
-	for (int i = 0; i < numScriptModules; ++i) {
-		moduleRepExecAddr[i].Invalidate();
+	_GP(moduleInst).resize(_G(numScriptModules), nullptr);
+	_GP(moduleInstFork).resize(_G(numScriptModules), nullptr);
+	_GP(moduleRepExecAddr).resize(_G(numScriptModules));
+	_GP(repExecAlways).moduleHasFunction.resize(_G(numScriptModules), true);
+	_GP(lateRepExecAlways).moduleHasFunction.resize(_G(numScriptModules), true);
+	_GP(getDialogOptionsDimensionsFunc).moduleHasFunction.resize(_G(numScriptModules), true);
+	_GP(renderDialogOptionsFunc).moduleHasFunction.resize(_G(numScriptModules), true);
+	_GP(getDialogOptionUnderCursorFunc).moduleHasFunction.resize(_G(numScriptModules), true);
+	_GP(runDialogOptionMouseClickHandlerFunc).moduleHasFunction.resize(_G(numScriptModules), true);
+	_GP(runDialogOptionKeyPressHandlerFunc).moduleHasFunction.resize(_G(numScriptModules), true);
+	_GP(runDialogOptionRepExecFunc).moduleHasFunction.resize(_G(numScriptModules), true);
+	for (int i = 0; i < _G(numScriptModules); ++i) {
+		_GP(moduleRepExecAddr)[i].Invalidate();
 	}
 }
 
@@ -422,10 +418,10 @@ HGameInitError InitGameState(const LoadedGameEntities &ents, GameDataVersion dat
 	// NOTE: we must do this after plugins, because some plugins may export
 	// script symbols too.
 	//
-	gamescript = ents.GlobalScript;
-	dialogScriptsScript = ents.DialogScript;
-	numScriptModules = ents.ScriptModules.size();
-	scriptModules = ents.ScriptModules;
+	_GP(gamescript) = ents.GlobalScript;
+	_GP(dialogScriptsScript) = ents.DialogScript;
+	_G(numScriptModules) = ents.ScriptModules.size();
+	_GP(scriptModules) = ents.ScriptModules;
 	AllocScriptModules();
 	if (create_global_script())
 		return new GameInitError(kGameInitErr_ScriptLinkFailed, ccErrorString);
diff --git a/engines/ags/engine/game/savegame.cpp b/engines/ags/engine/game/savegame.cpp
index b55f5fc50f..97686959dd 100644
--- a/engines/ags/engine/game/savegame.cpp
+++ b/engines/ags/engine/game/savegame.cpp
@@ -356,29 +356,29 @@ void DoBeforeRestore(PreservedParams &pp) {
 	}
 
 	// preserve script data sizes and cleanup scripts
-	pp.GlScDataSize = gameinst->globaldatasize;
-	delete gameinstFork;
-	delete gameinst;
-	gameinstFork = nullptr;
-	gameinst = nullptr;
-	pp.ScMdDataSize.resize(numScriptModules);
-	for (int i = 0; i < numScriptModules; ++i) {
-		pp.ScMdDataSize[i] = moduleInst[i]->globaldatasize;
-		delete moduleInstFork[i];
-		delete moduleInst[i];
-		moduleInst[i] = nullptr;
+	pp.GlScDataSize = _G(gameinst)->globaldatasize;
+	delete _G(gameinstFork);
+	delete _G(gameinst);
+	_G(gameinstFork) = nullptr;
+	_G(gameinst) = nullptr;
+	pp.ScMdDataSize.resize(_G(numScriptModules));
+	for (int i = 0; i < _G(numScriptModules); ++i) {
+		pp.ScMdDataSize[i] = _GP(moduleInst)[i]->globaldatasize;
+		delete _GP(moduleInstFork)[i];
+		delete _GP(moduleInst)[i];
+		_GP(moduleInst)[i] = nullptr;
 	}
 
 	_GP(play).FreeProperties();
 	_GP(play).FreeViewportsAndCameras();
 
-	delete roominstFork;
-	delete roominst;
-	roominstFork = nullptr;
-	roominst = nullptr;
+	delete _G(roominstFork);
+	delete _G(roominst);
+	_G(roominstFork) = nullptr;
+	_G(roominst) = nullptr;
 
-	delete dialogScriptsInst;
-	dialogScriptsInst = nullptr;
+	delete _G(dialogScriptsInst);
+	_G(dialogScriptsInst) = nullptr;
 
 	resetRoomStatuses();
 	_GP(troom).FreeScriptData();
@@ -468,14 +468,14 @@ HSaveError DoAfterRestore(const PreservedParams &pp, const RestoredData &r_data)
 
 	// read the global data into the newly created script
 	if (r_data.GlobalScript.Data.get())
-		memcpy(gameinst->globaldata, r_data.GlobalScript.Data.get(),
-			Math::Min((size_t)gameinst->globaldatasize, r_data.GlobalScript.Len));
+		memcpy(_G(gameinst)->globaldata, r_data.GlobalScript.Data.get(),
+			Math::Min((size_t)_G(gameinst)->globaldatasize, r_data.GlobalScript.Len));
 
 	// restore the script module data
-	for (int i = 0; i < numScriptModules; ++i) {
+	for (int i = 0; i < _G(numScriptModules); ++i) {
 		if (r_data.ScriptModules[i].Data.get())
-			memcpy(moduleInst[i]->globaldata, r_data.ScriptModules[i].Data.get(),
-				Math::Min((size_t)moduleInst[i]->globaldatasize, r_data.ScriptModules[i].Len));
+			memcpy(_GP(moduleInst)[i]->globaldata, r_data.ScriptModules[i].Data.get(),
+				Math::Min((size_t)_GP(moduleInst)[i]->globaldatasize, r_data.ScriptModules[i].Len));
 	}
 
 	setup_player_character(_GP(game).playercharacter);
@@ -731,7 +731,7 @@ void DoBeforeSave() {
 
 	if (displayed_room >= 0) {
 		// update the current room script's data segment copy
-		if (roominst)
+		if (_G(roominst))
 			save_room_data_segment();
 
 		// Update the saved interaction variable values
diff --git a/engines/ags/engine/game/savegame_components.cpp b/engines/ags/engine/game/savegame_components.cpp
index b3da41f7c0..ffa0b75f45 100644
--- a/engines/ags/engine/game/savegame_components.cpp
+++ b/engines/ags/engine/game/savegame_components.cpp
@@ -808,17 +808,17 @@ HSaveError ReadDynamicSurfaces(PStream in, int32_t cmp_ver, const PreservedParam
 
 HSaveError WriteScriptModules(PStream out) {
 	// write the data segment of the global script
-	int data_len = gameinst->globaldatasize;
+	int data_len = _G(gameinst)->globaldatasize;
 	out->WriteInt32(data_len);
 	if (data_len > 0)
-		out->Write(gameinst->globaldata, data_len);
+		out->Write(_G(gameinst)->globaldata, data_len);
 	// write the script modules data segments
-	out->WriteInt32(numScriptModules);
-	for (int i = 0; i < numScriptModules; ++i) {
-		data_len = moduleInst[i]->globaldatasize;
+	out->WriteInt32(_G(numScriptModules));
+	for (int i = 0; i < _G(numScriptModules); ++i) {
+		data_len = _GP(moduleInst)[i]->globaldatasize;
 		out->WriteInt32(data_len);
 		if (data_len > 0)
-			out->Write(moduleInst[i]->globaldata, data_len);
+			out->Write(_GP(moduleInst)[i]->globaldata, data_len);
 	}
 	return HSaveError::None();
 }
@@ -833,10 +833,10 @@ HSaveError ReadScriptModules(PStream in, int32_t cmp_ver, const PreservedParams
 	r_data.GlobalScript.Data.reset(new char[data_len]);
 	in->Read(r_data.GlobalScript.Data.get(), data_len);
 
-	if (!AssertGameContent(err, in->ReadInt32(), numScriptModules, "Script Modules"))
+	if (!AssertGameContent(err, in->ReadInt32(), _G(numScriptModules), "Script Modules"))
 		return err;
-	r_data.ScriptModules.resize(numScriptModules);
-	for (int i = 0; i < numScriptModules; ++i) {
+	r_data.ScriptModules.resize(_G(numScriptModules));
+	for (int i = 0; i < _G(numScriptModules); ++i) {
 		data_len = in->ReadInt32();
 		if (!AssertGameObjectContent(err, data_len, pp.ScMdDataSize[i], "script module data", "module", i))
 			return err;
diff --git a/engines/ags/engine/main/engine.cpp b/engines/ags/engine/main/engine.cpp
index b7f39d8adb..69863c8a91 100644
--- a/engines/ags/engine/main/engine.cpp
+++ b/engines/ags/engine/main/engine.cpp
@@ -96,7 +96,7 @@ extern int eip_guinum;
 extern int eip_guiobj;
 extern SpeechLipSyncLine *splipsync;
 extern int numLipLines, curLipLine, curLipLinePhoneme;
-extern ScriptSystem scsystem;
+
 extern IGraphicsDriver *gfxDriver;
 extern Bitmap **actsps;
 extern color palette[256];
@@ -901,11 +901,11 @@ void engine_init_game_settings() {
 
 void engine_setup_scsystem_auxiliary() {
 	// ScriptSystem::aci_version is only 10 chars long
-	strncpy(scsystem.aci_version, _G(EngineVersion).LongString, 10);
+	strncpy(_GP(scsystem).aci_version, _G(EngineVersion).LongString, 10);
 	if (usetup.override_script_os >= 0) {
-		scsystem.os = usetup.override_script_os;
+		_GP(scsystem).os = usetup.override_script_os;
 	} else {
-		scsystem.os = platform->GetSystemOSID();
+		_GP(scsystem).os = platform->GetSystemOSID();
 	}
 }
 
diff --git a/engines/ags/engine/main/engine_setup.cpp b/engines/ags/engine/main/engine_setup.cpp
index 55c221a50a..f583d928a5 100644
--- a/engines/ags/engine/main/engine_setup.cpp
+++ b/engines/ags/engine/main/engine_setup.cpp
@@ -51,7 +51,7 @@ using namespace AGS::Shared;
 using namespace AGS::Engine;
 
 
-extern ScriptSystem scsystem;
+
 extern int _places_r, _places_g, _places_b;
 extern IGraphicsDriver *gfxDriver;
 
@@ -123,10 +123,10 @@ void convert_objects_to_data_resolution(GameDataVersion filever) {
 }
 
 void engine_setup_system_gamesize() {
-	scsystem.width = _GP(game).GetGameRes().Width;
-	scsystem.height = _GP(game).GetGameRes().Height;
-	scsystem.viewport_width = game_to_data_coord(_GP(play).GetMainViewport().GetWidth());
-	scsystem.viewport_height = game_to_data_coord(_GP(play).GetMainViewport().GetHeight());
+	_GP(scsystem).width = _GP(game).GetGameRes().Width;
+	_GP(scsystem).height = _GP(game).GetGameRes().Height;
+	_GP(scsystem).viewport_width = game_to_data_coord(_GP(play).GetMainViewport().GetWidth());
+	_GP(scsystem).viewport_height = game_to_data_coord(_GP(play).GetMainViewport().GetHeight());
 }
 
 void engine_init_resolution_settings(const Size game_size) {
@@ -281,7 +281,7 @@ void engine_post_gfxmode_mouse_setup(const DisplayMode &dm, const Size &init_des
 	on_coordinates_scaling_changed();
 
 	// If auto lock option is set, lock mouse to the game window
-	if (usetup.mouse_auto_lock && scsystem.windowed != 0)
+	if (usetup.mouse_auto_lock && _GP(scsystem).windowed != 0)
 		Mouse::TryLockToWindow();
 }
 
@@ -294,16 +294,16 @@ void engine_pre_gfxmode_mouse_cleanup() {
 
 // Fill in scsystem struct with display mode parameters
 void engine_setup_scsystem_screen(const DisplayMode &dm) {
-	scsystem.coldepth = dm.ColorDepth;
-	scsystem.windowed = dm.Windowed;
-	scsystem.vsync = dm.Vsync;
+	_GP(scsystem).coldepth = dm.ColorDepth;
+	_GP(scsystem).windowed = dm.Windowed;
+	_GP(scsystem).vsync = dm.Vsync;
 }
 
 void engine_post_gfxmode_setup(const Size &init_desktop) {
 	DisplayMode dm = gfxDriver->GetDisplayMode();
 	// If color depth has changed (or graphics mode was inited for the
 	// very first time), we also need to recreate bitmaps
-	bool has_driver_changed = scsystem.coldepth != dm.ColorDepth;
+	bool has_driver_changed = _GP(scsystem).coldepth != dm.ColorDepth;
 
 	engine_setup_scsystem_screen(dm);
 	engine_post_gfxmode_driver_setup();
@@ -316,7 +316,7 @@ void engine_post_gfxmode_setup(const Size &init_desktop) {
 	// "windowed" flag to be specified. Find out whether this function
 	// has anything to do with graphics mode at all. It is quite possible
 	// that we may split it into two functions, or remove parameter.
-	platform->PostAllegroInit(scsystem.windowed != 0);
+	platform->PostAllegroInit(_GP(scsystem).windowed != 0);
 
 	video_on_gfxmode_changed();
 	invalidate_screen();
diff --git a/engines/ags/engine/main/game_file.cpp b/engines/ags/engine/main/game_file.cpp
index c17a88e3af..f25f59a9fc 100644
--- a/engines/ags/engine/main/game_file.cpp
+++ b/engines/ags/engine/main/game_file.cpp
@@ -60,14 +60,8 @@ using namespace AGS::Shared;
 using namespace AGS::Engine;
 
 extern int ifacepopped;
-
-
-
 extern DialogTopic *dialog;
-
 extern AGSPlatformDriver *platform;
-extern int numScriptModules;
-
 
 // Test if engine supports extended capabilities required to run the game
 bool test_game_caps(const std::set<String> &caps, std::set<String> &failed_caps) {
diff --git a/engines/ags/engine/main/game_run.cpp b/engines/ags/engine/main/game_run.cpp
index 956ca7a40a..72bd3cbc66 100644
--- a/engines/ags/engine/main/game_run.cpp
+++ b/engines/ags/engine/main/game_run.cpp
@@ -86,8 +86,6 @@ extern int game_paused;
 extern int getloctype_index;
 extern int in_enters_screen, done_es_error;
 extern int in_leaves_screen;
-extern int inside_script, in_graph_script;
-extern int no_blocking_functions;
 extern CharacterInfo *playerchar;
 extern int mouse_ifacebut_xoffs, mouse_ifacebut_yoffs;
 extern int cur_mode;
@@ -136,14 +134,14 @@ static void game_loop_check_problems_at_start() {
 		debug_script_warn("Wait() was used in Player Enters Screen - use Enters Screen After Fadein instead");
 		done_es_error = 1;
 	}
-	if (no_blocking_functions)
+	if (_G(no_blocking_functions))
 		quit("!A blocking function was called from within a non-blocking event such as " REP_EXEC_ALWAYS_NAME);
 }
 
 static void game_loop_check_new_room() {
 	if (in_new_room == 0) {
 		// Run the room and game script repeatedly_execute
-		run_function_on_non_blocking_thread(&repExecAlways);
+		run_function_on_non_blocking_thread(&_GP(repExecAlways));
 		setevent(EV_TEXTSCRIPT, TS_REPEAT);
 		setevent(EV_RUNEVBLOCK, EVB_ROOM, 0, 6);
 	}
@@ -155,7 +153,7 @@ static void game_loop_check_new_room() {
 static void game_loop_do_late_update() {
 	if (in_new_room == 0) {
 		// Run the room and game script late_repeatedly_execute
-		run_function_on_non_blocking_thread(&lateRepExecAlways);
+		run_function_on_non_blocking_thread(&_GP(lateRepExecAlways));
 	}
 }
 
@@ -206,12 +204,12 @@ static int game_loop_check_ground_level_interactions() {
 }
 
 static void lock_mouse_on_click() {
-	if (usetup.mouse_auto_lock && scsystem.windowed)
+	if (usetup.mouse_auto_lock && _GP(scsystem).windowed)
 		Mouse::TryLockToWindow();
 }
 
 static void toggle_mouse_lock() {
-	if (scsystem.windowed) {
+	if (_GP(scsystem).windowed) {
 		if (Mouse::IsLockedToWindow())
 			Mouse::UnlockFromWindow();
 		else
@@ -265,7 +263,7 @@ static void check_mouse_controls() {
 			wasongui = mongu;
 			wasbutdown = mbut + 1;
 		} else setevent(EV_TEXTSCRIPT, TS_MCLICK, mbut + 1);
-		//    else RunTextScriptIParam(gameinst,"on_mouse_click",aa+1);
+		//    else RunTextScriptIParam(_G(gameinst),"on_mouse_click",aa+1);
 	}
 
 	if (mwheelz < 0)
@@ -483,7 +481,7 @@ static void check_keyboard_controls() {
 		return;
 	}
 
-	if (inside_script) {
+	if (_G(inside_script)) {
 		// Don't queue up another keypress if it can't be run instantly
 		debug_script_log("Keypress %d ignored (game blocked)", kgn);
 		return;
@@ -539,7 +537,7 @@ static void check_keyboard_controls() {
 		setevent(EV_TEXTSCRIPT, TS_KEYPRESS, kgn);
 	}
 
-	// RunTextScriptIParam(gameinst,"on_key_press",kgn);
+	// RunTextScriptIParam(_G(gameinst),"on_key_press",kgn);
 }
 
 // check_controls: checks mouse & keyboard interface
diff --git a/engines/ags/engine/main/game_start.cpp b/engines/ags/engine/main/game_start.cpp
index ac7d9eb290..4ea936ba4d 100644
--- a/engines/ags/engine/main/game_start.cpp
+++ b/engines/ags/engine/main/game_start.cpp
@@ -53,9 +53,6 @@ using namespace AGS::Shared;
 using namespace AGS::Engine;
 
 extern int our_eip, displayed_room;
-
-extern std::vector<ccInstance *> moduleInst;
-extern int numScriptModules;
 extern CharacterInfo *playerchar;
 extern int convert_16bit_bgr;
 
@@ -91,10 +88,10 @@ void start_game() {
 	// skip ticks to account for initialisation or a restored _GP(game).
 	skipMissedTicks();
 
-	for (int kk = 0; kk < numScriptModules; kk++)
-		RunTextScript(moduleInst[kk], "game_start");
+	for (int kk = 0; kk < _G(numScriptModules); kk++)
+		RunTextScript(_GP(moduleInst)[kk], "game_start");
 
-	RunTextScript(gameinst, "game_start");
+	RunTextScript(_G(gameinst), "game_start");
 
 	our_eip = -43;
 
diff --git a/engines/ags/engine/script/cc_instance.cpp b/engines/ags/engine/script/cc_instance.cpp
index 3d8fb64f43..9366a8f183 100644
--- a/engines/ags/engine/script/cc_instance.cpp
+++ b/engines/ags/engine/script/cc_instance.cpp
@@ -52,7 +52,7 @@ using namespace AGS::Shared::Memory;
 
 extern ccInstance *loadedInstances[MAX_LOADED_INSTANCES]; // in script/script_runtime
 extern int gameHasBeenRestored; // in ac/game
-extern ExecutingScript *curscript; // in script/script
+ // in script/script
 extern int maxWhileLoops;
 extern new_line_hook_type new_line_hook;
 
diff --git a/engines/ags/engine/script/script.cpp b/engines/ags/engine/script/script.cpp
index defd59ba55..86dba205f5 100644
--- a/engines/ags/engine/script/script.cpp
+++ b/engines/ags/engine/script/script.cpp
@@ -60,46 +60,9 @@ extern RoomObject *objs;
 extern int our_eip;
 extern CharacterInfo *playerchar;
 
-ExecutingScript scripts[MAX_SCRIPT_AT_ONCE];
-ExecutingScript *curscript = nullptr;
-
-PScript gamescript;
-PScript dialogScriptsScript;
-ccInstance *gameinst = nullptr, *roominst = nullptr;
-ccInstance *dialogScriptsInst = nullptr;
-ccInstance *gameinstFork = nullptr, *roominstFork = nullptr;
-
-int num_scripts = 0;
-int post_script_cleanup_stack = 0;
-
-int inside_script = 0, in_graph_script = 0;
-int no_blocking_functions = 0; // set to 1 while in rep_Exec_always
-
-NonBlockingScriptFunction repExecAlways(REP_EXEC_ALWAYS_NAME, 0);
-NonBlockingScriptFunction lateRepExecAlways(LATE_REP_EXEC_ALWAYS_NAME, 0);
-NonBlockingScriptFunction getDialogOptionsDimensionsFunc("dialog_options_get_dimensions", 1);
-NonBlockingScriptFunction renderDialogOptionsFunc("dialog_options_render", 1);
-NonBlockingScriptFunction getDialogOptionUnderCursorFunc("dialog_options_get_active", 1);
-NonBlockingScriptFunction runDialogOptionMouseClickHandlerFunc("dialog_options_mouse_click", 2);
-NonBlockingScriptFunction runDialogOptionKeyPressHandlerFunc("dialog_options_key_press", 2);
-NonBlockingScriptFunction runDialogOptionRepExecFunc("dialog_options_repexec", 1);
-
-ScriptSystem scsystem;
-
-std::vector<PScript> scriptModules;
-std::vector<ccInstance *> moduleInst;
-std::vector<ccInstance *> moduleInstFork;
-std::vector<RuntimeScriptValue> moduleRepExecAddr;
-int numScriptModules = 0;
-
-std::vector<String> characterScriptObjNames;
-String              objectScriptObjNames[MAX_ROOM_OBJECTS];
-std::vector<String> guiScriptObjNames;
-
-
 int run_dialog_request(int parmtr) {
 	_GP(play).stop_dialog_at_end = DIALOG_RUNNING;
-	RunTextScriptIParam(gameinst, "dialog_request", RuntimeScriptValue().SetInt32(parmtr));
+	RunTextScriptIParam(_G(gameinst), "dialog_request", RuntimeScriptValue().SetInt32(parmtr));
 
 	if (_GP(play).stop_dialog_at_end == DIALOG_STOP) {
 		_GP(play).stop_dialog_at_end = DIALOG_NONE;
@@ -129,19 +92,19 @@ void run_function_on_non_blocking_thread(NonBlockingScriptFunction *funcToRun) {
 
 	// run modules
 	// modules need a forkedinst for this to work
-	for (int kk = 0; kk < numScriptModules; kk++) {
-		funcToRun->moduleHasFunction[kk] = DoRunScriptFuncCantBlock(moduleInstFork[kk], funcToRun, funcToRun->moduleHasFunction[kk]);
+	for (int kk = 0; kk < _G(numScriptModules); kk++) {
+		funcToRun->moduleHasFunction[kk] = DoRunScriptFuncCantBlock(_GP(moduleInstFork)[kk], funcToRun, funcToRun->moduleHasFunction[kk]);
 
 		if (room_changes_was != _GP(play).room_changes)
 			return;
 	}
 
-	funcToRun->globalScriptHasFunction = DoRunScriptFuncCantBlock(gameinstFork, funcToRun, funcToRun->globalScriptHasFunction);
+	funcToRun->globalScriptHasFunction = DoRunScriptFuncCantBlock(_G(gameinstFork), funcToRun, funcToRun->globalScriptHasFunction);
 
 	if (room_changes_was != _GP(play).room_changes)
 		return;
 
-	funcToRun->roomHasFunction = DoRunScriptFuncCantBlock(roominstFork, funcToRun, funcToRun->roomHasFunction);
+	funcToRun->roomHasFunction = DoRunScriptFuncCantBlock(_G(roominstFork), funcToRun, funcToRun->roomHasFunction);
 }
 
 //-----------------------------------------------------------
@@ -237,28 +200,28 @@ int run_interaction_script(InteractionScripts *nint, int evnt, int chkAny, int i
 
 int create_global_script() {
 	ccSetOption(SCOPT_AUTOIMPORT, 1);
-	for (int kk = 0; kk < numScriptModules; kk++) {
-		moduleInst[kk] = ccInstance::CreateFromScript(scriptModules[kk]);
-		if (moduleInst[kk] == nullptr)
+	for (int kk = 0; kk < _G(numScriptModules); kk++) {
+		_GP(moduleInst)[kk] = ccInstance::CreateFromScript(_GP(scriptModules)[kk]);
+		if (_GP(moduleInst)[kk] == nullptr)
 			return -3;
 		// create a forked instance for rep_exec_always
-		moduleInstFork[kk] = moduleInst[kk]->Fork();
-		if (moduleInstFork[kk] == nullptr)
+		_GP(moduleInstFork)[kk] = _GP(moduleInst)[kk]->Fork();
+		if (_GP(moduleInstFork)[kk] == nullptr)
 			return -3;
 
-		moduleRepExecAddr[kk] = moduleInst[kk]->GetSymbolAddress(REP_EXEC_NAME);
+		_GP(moduleRepExecAddr)[kk] = _GP(moduleInst)[kk]->GetSymbolAddress(REP_EXEC_NAME);
 	}
-	gameinst = ccInstance::CreateFromScript(gamescript);
-	if (gameinst == nullptr)
+	_G(gameinst) = ccInstance::CreateFromScript(_GP(gamescript));
+	if (_G(gameinst) == nullptr)
 		return -3;
 	// create a forked instance for rep_exec_always
-	gameinstFork = gameinst->Fork();
-	if (gameinstFork == nullptr)
+	_G(gameinstFork) = _G(gameinst)->Fork();
+	if (_G(gameinstFork) == nullptr)
 		return -3;
 
-	if (dialogScriptsScript != nullptr) {
-		dialogScriptsInst = ccInstance::CreateFromScript(dialogScriptsScript);
-		if (dialogScriptsInst == nullptr)
+	if (_GP(dialogScriptsScript) != nullptr) {
+		_G(dialogScriptsInst) = ccInstance::CreateFromScript(_GP(dialogScriptsScript));
+		if (_G(dialogScriptsInst) == nullptr)
 			return -3;
 	}
 
@@ -269,30 +232,30 @@ int create_global_script() {
 void cancel_all_scripts() {
 	int aa;
 
-	for (aa = 0; aa < num_scripts; aa++) {
-		if (scripts[aa].forked)
-			scripts[aa].inst->AbortAndDestroy();
+	for (aa = 0; aa < _G(num_scripts); aa++) {
+		if (_G(scripts)[aa].forked)
+			_G(scripts)[aa].inst->AbortAndDestroy();
 		else
-			scripts[aa].inst->Abort();
-		scripts[aa].numanother = 0;
+			_G(scripts)[aa].inst->Abort();
+		_G(scripts)[aa].numanother = 0;
 	}
-	num_scripts = 0;
-	/*  if (gameinst!=NULL) ->Abort(gameinst);
-	if (roominst!=NULL) ->Abort(roominst);*/
+	_G(num_scripts) = 0;
+	/*  if (_G(gameinst)!=NULL) ->Abort(_G(gameinst));
+	if (_G(roominst)!=NULL) ->Abort(_G(roominst));*/
 }
 
 ccInstance *GetScriptInstanceByType(ScriptInstType sc_inst) {
 	if (sc_inst == kScInstGame)
-		return gameinst;
+		return _G(gameinst);
 	else if (sc_inst == kScInstRoom)
-		return roominst;
+		return _G(roominst);
 	return nullptr;
 }
 
 void QueueScriptFunction(ScriptInstType sc_inst, const char *fn_name, size_t param_count, const RuntimeScriptValue &p1, const RuntimeScriptValue &p2) {
-	if (inside_script)
+	if (_G(inside_script))
 		// queue the script for the run after current script is finished
-		curscript->run_another(fn_name, sc_inst, param_count, p1, p2);
+		_G(curscript)->run_another(fn_name, sc_inst, param_count, p1, p2);
 	else
 		// if no script is currently running, run the requested script right away
 		RunScriptFunction(sc_inst, fn_name, param_count, p1, p2);
@@ -314,7 +277,7 @@ bool DoRunScriptFuncCantBlock(ccInstance *sci, NonBlockingScriptFunction *funcTo
 	if (!hasTheFunc)
 		return (false);
 
-	no_blocking_functions++;
+	_G(no_blocking_functions)++;
 	int result = 0;
 
 	if (funcToRun->numParameters < 3) {
@@ -333,7 +296,7 @@ bool DoRunScriptFuncCantBlock(ccInstance *sci, NonBlockingScriptFunction *funcTo
 	// this might be nested, so don't disrupt blocked scripts
 	ccErrorString = "";
 	ccError = 0;
-	no_blocking_functions--;
+	_G(no_blocking_functions)--;
 	return (hasTheFunc);
 }
 
@@ -350,25 +313,25 @@ int PrepareTextScript(ccInstance *sci, const char **tsname) {
 		ccErrorString = "script is already in execution";
 		return -3;
 	}
-	scripts[num_scripts].init();
-	scripts[num_scripts].inst = sci;
+	_G(scripts)[_G(num_scripts)].init();
+	_G(scripts)[_G(num_scripts)].inst = sci;
 	// CHECKME: this conditional block will never run, because
 	// function would have quit earlier (deprecated functionality?)
 	if (sci->IsBeingRun()) {
-		scripts[num_scripts].inst = sci->Fork();
-		if (scripts[num_scripts].inst == nullptr)
+		_G(scripts)[_G(num_scripts)].inst = sci->Fork();
+		if (_G(scripts)[_G(num_scripts)].inst == nullptr)
 			quit("unable to fork instance for secondary script");
-		scripts[num_scripts].forked = 1;
+		_G(scripts)[_G(num_scripts)].forked = 1;
 	}
-	curscript = &scripts[num_scripts];
-	num_scripts++;
-	if (num_scripts >= MAX_SCRIPT_AT_ONCE)
+	_G(curscript) = &_G(scripts)[_G(num_scripts)];
+	_G(num_scripts)++;
+	if (_G(num_scripts) >= MAX_SCRIPT_AT_ONCE)
 		quit("too many nested text script instances created");
 	// in case script_run_another is the function name, take a backup
 	strncpy(scfunctionname, tsname[0], MAX_FUNCTION_NAME_LEN);
 	tsname[0] = &scfunctionname[0];
 	update_script_mouse_coords();
-	inside_script++;
+	_G(inside_script)++;
 	//  aborted_ip=0;
 	//  abort_executor=0;
 	return 0;
@@ -395,7 +358,7 @@ int RunScriptFunctionIfExists(ccInstance *sci, const char *tsname, int numParam,
 	ccErrorString = "";
 
 	if (numParam < 3) {
-		toret = curscript->inst->CallScriptFunction(tsname, numParam, params);
+		toret = _G(curscript)->inst->CallScriptFunction(tsname, numParam, params);
 	} else
 		quit("Too many parameters to RunScriptFunctionIfExists");
 
@@ -404,14 +367,14 @@ int RunScriptFunctionIfExists(ccInstance *sci, const char *tsname, int numParam,
 		quit_with_script_error(tsname);
 	}
 
-	post_script_cleanup_stack++;
+	_G(post_script_cleanup_stack)++;
 
-	if (post_script_cleanup_stack > 50)
+	if (_G(post_script_cleanup_stack) > 50)
 		quitprintf("!post_script_cleanup call stack exceeded: possible recursive function call? running %s", tsname);
 
 	post_script_cleanup();
 
-	post_script_cleanup_stack--;
+	_G(post_script_cleanup_stack)--;
 
 	// restore cached error state
 	ccError = cachedCcError;
@@ -426,14 +389,14 @@ int RunScriptFunctionIfExists(ccInstance *sci, const char *tsname, int numParam,
 int RunTextScript(ccInstance *sci, const char *tsname) {
 	if (strcmp(tsname, REP_EXEC_NAME) == 0) {
 		// run module rep_execs
-		// FIXME: in theory the function may be already called for moduleInst[i],
+		// FIXME: in theory the function may be already called for _GP(moduleInst)[i],
 		// in which case this should not be executed; need to rearrange the code somehow
 		int room_changes_was = _GP(play).room_changes;
 		int restore_game_count_was = gameHasBeenRestored;
 
-		for (int kk = 0; kk < numScriptModules; kk++) {
-			if (!moduleRepExecAddr[kk].IsNull())
-				RunScriptFunctionIfExists(moduleInst[kk], tsname, 0, nullptr);
+		for (int kk = 0; kk < _G(numScriptModules); kk++) {
+			if (!_GP(moduleRepExecAddr)[kk].IsNull())
+				RunScriptFunctionIfExists(_GP(moduleInst)[kk], tsname, 0, nullptr);
 
 			if ((room_changes_was != _GP(play).room_changes) ||
 				(restore_game_count_was != gameHasBeenRestored))
@@ -442,7 +405,7 @@ int RunTextScript(ccInstance *sci, const char *tsname) {
 	}
 
 	int toret = RunScriptFunctionIfExists(sci, tsname, 0, nullptr);
-	if ((toret == -18) && (sci == roominst)) {
+	if ((toret == -18) && (sci == _G(roominst))) {
 		// functions in room script must exist
 		quitprintf("prepare_script: error %d (%s) trying to run '%s'   (Room %d)", toret, ccErrorString.GetCStr(), tsname, displayed_room);
 	}
@@ -486,7 +449,7 @@ String GetScriptName(ccInstance *sci) {
 	// TODO: check script modules too?
 	if (!sci)
 		return "Not in a script";
-	else if (sci->instanceof == gamescript)
+	else if (sci->instanceof == _GP(gamescript))
 		return "Global script";
 	else if (sci->instanceof == _GP(thisroom).CompiledScript)
 		return String::FromFormat("Room %d script", displayed_room);
@@ -510,16 +473,16 @@ char *make_ts_func_name(const char *base, int iii, int subd) {
 void post_script_cleanup() {
 	// should do any post-script stuff here, like go to new room
 	if (ccError) quit(ccErrorString);
-	ExecutingScript copyof = scripts[num_scripts - 1];
-	if (scripts[num_scripts - 1].forked)
-		delete scripts[num_scripts - 1].inst;
-	num_scripts--;
-	inside_script--;
-
-	if (num_scripts > 0)
-		curscript = &scripts[num_scripts - 1];
+	ExecutingScript copyof = _G(scripts)[_G(num_scripts) - 1];
+	if (_G(scripts)[_G(num_scripts) - 1].forked)
+		delete _G(scripts)[_G(num_scripts) - 1].inst;
+	_G(num_scripts)--;
+	_G(inside_script)--;
+
+	if (_G(num_scripts) > 0)
+		_G(curscript) = &_G(scripts)[_G(num_scripts) - 1];
 	else {
-		curscript = nullptr;
+		_G(curscript) = nullptr;
 	}
 	//  if (abort_executor) user_disabled_data2=aborted_ip;
 
@@ -532,13 +495,13 @@ void post_script_cleanup() {
 		switch (copyof.postScriptActions[ii]) {
 		case ePSANewRoom:
 			// only change rooms when all scripts are done
-			if (num_scripts == 0) {
+			if (_G(num_scripts) == 0) {
 				new_room(thisData, playerchar);
 				// don't allow any pending room scripts from the old room
 				// in run_another to be executed
 				return;
 			} else
-				curscript->queue_action(ePSANewRoom, thisData, "NewRoom");
+				_G(curscript)->queue_action(ePSANewRoom, thisData, "NewRoom");
 			break;
 		case ePSAInvScreen:
 			invscreen();
@@ -881,7 +844,7 @@ int run_interaction_commandlist(InteractionCommandList *nicl, int *timesrun, int
 // check and abort game if the script is currently
 // inside the rep_exec_always function
 void can_run_delayed_command() {
-	if (no_blocking_functions)
+	if (_G(no_blocking_functions))
 		quit("!This command cannot be used within non-blocking events such as " REP_EXEC_ALWAYS_NAME);
 }
 
diff --git a/engines/ags/engine/script/script.h b/engines/ags/engine/script/script.h
index abc5eea914..baf0d269ad 100644
--- a/engines/ags/engine/script/script.h
+++ b/engines/ags/engine/script/script.h
@@ -84,45 +84,6 @@ InteractionVariable *FindGraphicalVariable(const char *varName);
 void    run_unhandled_event(int evnt);
 void    can_run_delayed_command();
 
-
-extern ExecutingScript scripts[MAX_SCRIPT_AT_ONCE];
-extern ExecutingScript *curscript;
-
-extern PScript gamescript;
-extern PScript dialogScriptsScript;
-extern ccInstance *gameinst, *roominst;
-extern ccInstance *dialogScriptsInst;
-extern ccInstance *gameinstFork, *roominstFork;
-
-extern int num_scripts;
-extern int post_script_cleanup_stack;
-
-extern int inside_script, in_graph_script;
-extern int no_blocking_functions; // set to 1 while in rep_Exec_always
-
-extern NonBlockingScriptFunction repExecAlways;
-extern NonBlockingScriptFunction lateRepExecAlways;
-extern NonBlockingScriptFunction getDialogOptionsDimensionsFunc;
-extern NonBlockingScriptFunction renderDialogOptionsFunc;
-extern NonBlockingScriptFunction getDialogOptionUnderCursorFunc;
-extern NonBlockingScriptFunction runDialogOptionMouseClickHandlerFunc;
-extern NonBlockingScriptFunction runDialogOptionKeyPressHandlerFunc;
-extern NonBlockingScriptFunction runDialogOptionRepExecFunc;
-
-extern ScriptSystem scsystem;
-
-extern std::vector<PScript> scriptModules;
-extern std::vector<ccInstance *> moduleInst;
-extern std::vector<ccInstance *> moduleInstFork;
-extern std::vector<RuntimeScriptValue> moduleRepExecAddr;
-extern int numScriptModules;
-
-// TODO: find out if these extra arrays are really necessary. This may be remains from the
-// time when the symbol import table was holding raw pointers to char array.
-extern std::vector<AGS::Shared::String> characterScriptObjNames;
-extern AGS::Shared::String objectScriptObjNames[MAX_ROOM_OBJECTS];
-extern std::vector<AGS::Shared::String> guiScriptObjNames;
-
 } // namespace AGS3
 
 #endif
diff --git a/engines/ags/globals.cpp b/engines/ags/globals.cpp
index d5ea40a1c9..0aa2a9969d 100644
--- a/engines/ags/globals.cpp
+++ b/engines/ags/globals.cpp
@@ -37,12 +37,16 @@
 #include "ags/engine/ac/dynobj/cc_object.h"
 #include "ags/engine/ac/dynobj/cc_audiochannel.h"
 #include "ags/engine/ac/dynobj/cc_audioclip.h"
+#include "ags/engine/ac/dynobj/scriptsystem.h"
 #include "ags/engine/ac/objectcache.h"
 #include "ags/engine/ac/dynobj/scripthotspot.h"
 #include "ags/engine/ac/dynobj/scriptinvitem.h"
 #include "ags/engine/ac/dynobj/scriptobject.h"
 #include "ags/engine/ac/dynobj/scriptregion.h"
 #include "ags/engine/ac/dynobj/scriptstring.h"
+#include "ags/engine/script/executingscript.h"
+#include "ags/engine/script/nonblockingscriptfunction.h"
+#include "ags/engine/script/script.h"
 
 namespace AGS3 {
 
@@ -79,13 +83,36 @@ Globals::Globals() {
 	_scrRegion = new ScriptRegion[MAX_ROOM_REGIONS];
 	_scrInv = new ScriptInvItem[MAX_INV];
 	_objcache = new ObjectCache[MAX_ROOM_OBJECTS];
+
+	// script.cpp
+	_scripts = new ExecutingScript[MAX_SCRIPT_AT_ONCE];
+	_gamescript = new PScript();
+	_dialogScriptsScript = new PScript();
+	_repExecAlways = new NonBlockingScriptFunction(REP_EXEC_ALWAYS_NAME, 0);
+	_lateRepExecAlways = new NonBlockingScriptFunction(LATE_REP_EXEC_ALWAYS_NAME, 0);
+	_getDialogOptionsDimensionsFunc = new NonBlockingScriptFunction("dialog_options_get_dimensions", 1);
+	_renderDialogOptionsFunc = new NonBlockingScriptFunction("dialog_options_render", 1);
+	_getDialogOptionUnderCursorFunc = new NonBlockingScriptFunction("dialog_options_get_active", 1);
+	_runDialogOptionMouseClickHandlerFunc = new NonBlockingScriptFunction("dialog_options_mouse_click", 2);
+	_runDialogOptionKeyPressHandlerFunc = new NonBlockingScriptFunction("dialog_options_key_press", 2);
+	_runDialogOptionRepExecFunc = new NonBlockingScriptFunction("dialog_options_repexec", 1);
+	_scsystem = new ScriptSystem();
+	_scriptModules = new std::vector<PScript>();
+	_moduleInst = new std::vector<ccInstance *>();
+	_moduleInstFork = new std::vector<ccInstance *>();
+	_moduleRepExecAddr = new std::vector<RuntimeScriptValue>();
+	_characterScriptObjNames = new std::vector<String>();
+	_objectScriptObjNames = new String[MAX_ROOM_OBJECTS];
+	_guiScriptObjNames = new std::vector<String>();
 }
 
 Globals::~Globals() {
 	g_globals = nullptr;
 
+	// debug.cpp
 	delete _DbgMgr;
 
+	// game.cpp
 	delete _ccDynamicGUIObject;
 	delete _ccDynamicCharacter;
 	delete _ccDynamicHotspot;
@@ -108,6 +135,27 @@ Globals::~Globals() {
 	delete[] _scrRegion;
 	delete[] _scrInv;
 	delete[] _objcache;
+
+	// script.cpp
+	delete[] _scripts;
+	delete _gamescript;
+	delete _dialogScriptsScript;
+	delete _repExecAlways;
+	delete _lateRepExecAlways;
+	delete _getDialogOptionsDimensionsFunc;
+	delete _renderDialogOptionsFunc;
+	delete _getDialogOptionUnderCursorFunc;
+	delete _runDialogOptionMouseClickHandlerFunc;
+	delete _runDialogOptionKeyPressHandlerFunc;
+	delete _runDialogOptionRepExecFunc;
+	delete _scsystem;
+	delete _scriptModules;
+	delete _moduleInst;
+	delete _moduleInstFork;
+	delete _moduleRepExecAddr;
+	delete _characterScriptObjNames;
+	delete[] _objectScriptObjNames;
+	delete _guiScriptObjNames;
 }
 
 } // namespace AGS3
diff --git a/engines/ags/globals.h b/engines/ags/globals.h
index 5be8f69750..7b9ac0fb0c 100644
--- a/engines/ags/globals.h
+++ b/engines/ags/globals.h
@@ -26,6 +26,7 @@
 #include "ags/shared/util/string.h"
 #include "ags/shared/util/version.h"
 #include "ags/shared/gui/guimain.h"
+#include "ags/shared/script/cc_script.h"
 #include "ags/lib/std/set.h"
 
 namespace AGS3 {
@@ -50,20 +51,25 @@ struct CCDialog;
 struct CCGUI;
 struct CCGUIObject;
 struct CCHotspot;
+struct ccInstance;
 struct CCInventory;
 struct CCObject;
 struct CCRegion;
-struct IAGSEditorDebugger;
+struct ExecutingScript;
 struct GameSetupStruct;
 struct GameState;
+struct IAGSEditorDebugger;
+struct NonBlockingScriptFunction;
 struct RoomStatus;
-struct ScriptString;
-struct ScriptObject;
+struct RuntimeScriptValue;
+struct ScriptDialog;
 struct ScriptGUI;
 struct ScriptHotspot;
-struct ScriptRegion;
 struct ScriptInvItem;
-struct ScriptDialog;
+struct ScriptObject;
+struct ScriptRegion;
+struct ScriptString;
+struct ScriptSystem;
 struct ViewStruct;
 struct CharacterCache;
 struct ObjectCache;
@@ -106,7 +112,6 @@ public:
 
 	/**@}*/
 
-
 	/**
 	 * \defgroup debug globals
 	 * @{
@@ -236,6 +241,51 @@ public:
 
 	 /**@}*/
 
+	/**
+	 * \defgroup script globals
+	 * @{
+	 */
+
+	ExecutingScript *_scripts;
+	ExecutingScript *_curscript = nullptr;
+
+	PScript *_gamescript;
+	PScript *_dialogScriptsScript;
+	ccInstance *_gameinst = nullptr, *_roominst = nullptr;
+	ccInstance *_dialogScriptsInst = nullptr;
+	ccInstance *_gameinstFork = nullptr, *_roominstFork = nullptr;
+
+	int _num_scripts = 0;
+	int _post_script_cleanup_stack = 0;
+
+	int _inside_script = 0, _in_graph_script = 0;
+	int _no_blocking_functions = 0; // set to 1 while in rep_Exec_always
+
+	NonBlockingScriptFunction *_repExecAlways;
+	NonBlockingScriptFunction *_lateRepExecAlways;
+	NonBlockingScriptFunction *_getDialogOptionsDimensionsFunc;
+	NonBlockingScriptFunction *_renderDialogOptionsFunc;
+	NonBlockingScriptFunction *_getDialogOptionUnderCursorFunc;
+	NonBlockingScriptFunction *_runDialogOptionMouseClickHandlerFunc;
+	NonBlockingScriptFunction *_runDialogOptionKeyPressHandlerFunc;
+	NonBlockingScriptFunction *_runDialogOptionRepExecFunc;
+
+	ScriptSystem *_scsystem;
+
+	std::vector<PScript> *_scriptModules;
+	std::vector<ccInstance *> *_moduleInst;
+	std::vector<ccInstance *> *_moduleInstFork;
+	std::vector<RuntimeScriptValue> *_moduleRepExecAddr;
+	int _numScriptModules = 0;
+
+	// TODO: find out if these extra arrays are really necessary. This may be remains from the
+	// time when the symbol import table was holding raw pointers to char array.
+	std::vector<String> *_characterScriptObjNames;
+	String *_objectScriptObjNames;
+	std::vector<String> *_guiScriptObjNames;
+
+	/**@}*/
+
 public:
 	Globals();
 	~Globals();
diff --git a/engines/ags/plugins/agsplugin.cpp b/engines/ags/plugins/agsplugin.cpp
index 9dba73ecb4..af9d95c6b3 100644
--- a/engines/ags/plugins/agsplugin.cpp
+++ b/engines/ags/plugins/agsplugin.cpp
@@ -88,18 +88,10 @@ using namespace AGS::Engine;
 
 extern IGraphicsDriver *gfxDriver;
 extern int displayed_room;
-
-
 extern RoomStatus *croom;
 
-
 extern int game_paused;
 extern GameSetup usetup;
-extern int inside_script;
-extern ccInstance *gameinst, *roominst;
-
-
-
 extern color palette[256];
 extern PluginObjectReader pluginReaders[MAX_PLUGIN_OBJECT_READERS];
 extern int numPluginReaders;
@@ -255,7 +247,7 @@ void IAGSEngine::GetScreenDimensions(int32 *width, int32 *height, int32 *coldept
 	if (height != nullptr)
 		height[0] = _GP(play).GetMainViewport().GetHeight();
 	if (coldepth != nullptr)
-		coldepth[0] = scsystem.coldepth;
+		coldepth[0] = _GP(scsystem).coldepth;
 }
 
 unsigned char **IAGSEngine::GetRawBitmapSurface(BITMAP *bmp) {
@@ -671,12 +663,12 @@ void IAGSEngine::DisableSound() {
 	usetup.audio_backend = 0;
 }
 int IAGSEngine::CanRunScriptFunctionNow() {
-	if (inside_script)
+	if (_G(inside_script))
 		return 0;
 	return 1;
 }
 int IAGSEngine::CallGameScriptFunction(const char *name, int32 globalScript, int32 numArgs, long arg1, long arg2, long arg3) {
-	if (inside_script)
+	if (_G(inside_script))
 		return -300;
 
 	ccInstance *toRun = GetScriptInstanceByType(globalScript ? kScInstGame : kScInstRoom);
@@ -718,7 +710,7 @@ void IAGSEngine::SetSpriteAlphaBlended(int32 slot, int32 isAlphaBlended) {
 }
 
 void IAGSEngine::QueueGameScriptFunction(const char *name, int32 globalScript, int32 numArgs, long arg1, long arg2) {
-	if (!inside_script) {
+	if (!_G(inside_script)) {
 		this->CallGameScriptFunction(name, globalScript, numArgs, arg1, arg2, 0);
 		return;
 	}
@@ -726,7 +718,7 @@ void IAGSEngine::QueueGameScriptFunction(const char *name, int32 globalScript, i
 	if (numArgs < 0 || numArgs > 2)
 		quit("IAGSEngine::QueueGameScriptFunction: invalid number of arguments");
 
-	curscript->run_another(name, globalScript ? kScInstGame : kScInstRoom, numArgs,
+	_G(curscript)->run_another(name, globalScript ? kScInstGame : kScInstRoom, numArgs,
 		RuntimeScriptValue().SetPluginArgument(arg1), RuntimeScriptValue().SetPluginArgument(arg2));
 }
 




More information about the Scummvm-git-logs mailing list