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

mgerhardy martin.gerhardy at gmail.com
Fri Oct 30 16:23:20 UTC 2020


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

Summary:
07d9af7259 TWINE: HQRDepack doesn't need the engine pointer
ef9fc9f64a TWINE: hide data structures
d583ad076a TWINE: one abort action to cancel the whole intro loop
7646fcc7b3 TWINE: reduced debug level
d5d4118470 TWINE: allow to abort fullscreen text intro
9a850283ba TWINE: fixed assert in copyBlockPhys
09721f2aac TWINE: removed TWINE_PLAY_INTROS define
e98df188f1 TWINE: converted to boolean
8340c196e5 TWINE: added ScriptContext
bd4fa2e708 TWINE: cleanup in move script
01dc17647a TWINE: replaced magic number
02409852aa TWINE: replaced magic number
526a63610c TWINE: added give_key debug command
e181baf0e6 TWINE: activate some of the scummvm features
f9fa523c62 TWINE: changed engine init message
dba162cae0 TWINE: reduced scope
d72a0ed1f3 TWINE: removed unused method
a9aa2dba5d TWINE: stop all running samples for a new game


Commit: 07d9af7259e5f75635d094210f24272d80b9c01a
    https://github.com/scummvm/scummvm/commit/07d9af7259e5f75635d094210f24272d80b9c01a
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00

Commit Message:
TWINE: HQRDepack doesn't need the engine pointer

Changed paths:
    engines/twine/hqrdepack.cpp
    engines/twine/hqrdepack.h
    engines/twine/twine.cpp


diff --git a/engines/twine/hqrdepack.cpp b/engines/twine/hqrdepack.cpp
index c9c3369c63..f6b99c6349 100644
--- a/engines/twine/hqrdepack.cpp
+++ b/engines/twine/hqrdepack.cpp
@@ -28,8 +28,6 @@
 
 namespace TwinE {
 
-HQRDepack::HQRDepack(TwinEEngine *engine) : _engine(engine) {}
-
 #define wrap(cmd) if ((cmd) == 0) { warning("Failed to execute " #cmd ); return 0; }
 
 void HQRDepack::hqrDecompressEntry(uint8 *dst, uint8 *src, int32 decompsize, int32 mode) {
diff --git a/engines/twine/hqrdepack.h b/engines/twine/hqrdepack.h
index 0ee512b097..9eb837c917 100644
--- a/engines/twine/hqrdepack.h
+++ b/engines/twine/hqrdepack.h
@@ -36,8 +36,6 @@ class TwinEEngine;
  */
 class HQRDepack {
 private:
-	TwinEEngine *_engine;
-
 	/**
 	 * Get a HQR entry pointer
 	 * @param filename HQR file name
@@ -63,8 +61,6 @@ private:
 	void hqrDecompressEntry(uint8 *dst, uint8 *src, int32 decompsize, int32 mode);
 
 public:
-	HQRDepack(TwinEEngine *engine);
-
 	/**
 	 * Get a HQR entry pointer
 	 * @param ptr pointer to save the entry
diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index 88036a3a6c..7e9033059a 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -85,7 +85,7 @@ TwinEEngine::TwinEEngine(OSystem *system, Common::Language language, uint32 flag
 	_gameState = new GameState(this);
 	_grid = new Grid(this);
 	_movements = new Movements(this);
-	_hqrdepack = new HQRDepack(this);
+	_hqrdepack = new HQRDepack();
 	_interface = new Interface(this);
 	_menu = new Menu(this);
 	_flaMovies = new FlaMovies(this);


Commit: ef9fc9f64a6c1a084c5718bac29ab32d3fe7a877
    https://github.com/scummvm/scummvm/commit/ef9fc9f64a6c1a084c5718bac29ab32d3fe7a877
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00

Commit Message:
TWINE: hide data structures

Changed paths:
    engines/twine/flamovies.cpp
    engines/twine/flamovies.h


diff --git a/engines/twine/flamovies.cpp b/engines/twine/flamovies.cpp
index 703c0067dc..e95177d496 100644
--- a/engines/twine/flamovies.cpp
+++ b/engines/twine/flamovies.cpp
@@ -32,6 +32,32 @@
 
 namespace TwinE {
 
+/** FLA Frame Opcode types */
+enum FlaFrameOpcode {
+	kLoadPalette = 0,
+	kFade = 1,
+	kPlaySample = 2,
+	kStopSample = 4,
+	kDeltaFrame = 5,
+	kKeyFrame = 7
+};
+
+/** FLA movie sample structure */
+struct FLASampleStruct {
+	/** Number os samples */
+	int16 sampleNum = 0;
+	/** Sample frequency */
+	int16 freq = 0;
+	/** Numbers of time to repeat */
+	int16 repeat = 0;
+	/** Dummy variable */
+	int8 dummy = 0;
+	/** Unknown x */
+	uint8 x = 0;
+	/** Unknown y */
+	uint8 y = 0;
+};
+
 /** FLA movie extension */
 #define FLA_EXT ".fla"
 
@@ -264,10 +290,7 @@ void FlaMovies::playFlaMovie(const char *flaName) {
 	samplesInFla = file.readUint16LE();
 	file.skip(2);
 
-	for (int32 i = 0; i < samplesInFla; i++) {
-		flaSampleTable[i] = file.readSint16LE();
-		file.skip(2);
-	}
+	file.skip(4 * samplesInFla);
 
 	if (!strcmp((const char *)flaHeaderData.version, "V1.3")) {
 		int32 currentFrame = 0;
diff --git a/engines/twine/flamovies.h b/engines/twine/flamovies.h
index 3cc00b30ab..c2d3e692d2 100644
--- a/engines/twine/flamovies.h
+++ b/engines/twine/flamovies.h
@@ -59,32 +59,6 @@ struct FLAFrameDataStruct {
 	int32 frameVar0 = 0;
 };
 
-/** FLA movie sample structure */
-struct FLASampleStruct {
-	/** Number os samples */
-	int16 sampleNum = 0;
-	/** Sample frequency */
-	int16 freq = 0;
-	/** Numbers of time to repeat */
-	int16 repeat = 0;
-	/** Dummy variable */
-	int8 dummy = 0;
-	/** Unknown x */
-	uint8 x = 0;
-	/** Unknown y */
-	uint8 y = 0;
-};
-
-/** FLA Frame Opcode types */
-enum FlaFrameOpcode {
-	kLoadPalette = 0,
-	kFade = 1,
-	kPlaySample = 2,
-	kStopSample = 4,
-	kDeltaFrame = 5,
-	kKeyFrame = 7
-};
-
 class TwinEEngine;
 
 class FlaMovies {
@@ -98,8 +72,9 @@ private:
 	/** Auxiliar FLA fade out variable to count frames between the fade */
 	int32 fadeOutFrames = 0;
 
-	/** FLA movie sample auxiliar table */
-	int32 flaSampleTable[100] {0};
+	/** FLA movie file buffer */
+	uint8 flaBuffer[FLASCREEN_WIDTH * FLASCREEN_HEIGHT] {0};
+
 	/** Number of samples in FLA movie */
 	int32 samplesInFla = 0;
 	/** FLA movie header data */
@@ -120,9 +95,6 @@ private:
 public:
 	FlaMovies(TwinEEngine *engine);
 
-	/** FLA movie file buffer */
-	uint8 flaBuffer[FLASCREEN_WIDTH * FLASCREEN_HEIGHT] {0};
-
 	/**
 	 * Play FLA movies
 	 * @param flaName FLA movie name


Commit: d583ad076a4480f0d30129e2fd8563209ae54b39
    https://github.com/scummvm/scummvm/commit/d583ad076a4480f0d30129e2fd8563209ae54b39
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00

Commit Message:
TWINE: one abort action to cancel the whole intro loop

Changed paths:
    engines/twine/screens.cpp
    engines/twine/screens.h
    engines/twine/twine.cpp
    engines/twine/twine.h


diff --git a/engines/twine/screens.cpp b/engines/twine/screens.cpp
index 83d211fed0..cf54cffa4a 100644
--- a/engines/twine/screens.cpp
+++ b/engines/twine/screens.cpp
@@ -30,11 +30,14 @@
 
 namespace TwinE {
 
-void Screens::adelineLogo() {
+bool Screens::adelineLogo() {
 	_engine->_music->playMidiMusic(31);
 
-	loadImageDelay(RESSHQR_ADELINEIMG, 7);
+	if (loadImageDelay(RESSHQR_ADELINEIMG, 7)) {
+		return true;
+	}
 	palCustom = true;
+	return false;
 }
 
 void Screens::loadMenuImage(bool fade_in) {
@@ -88,10 +91,14 @@ void Screens::loadImage(int32 index, bool fade_in) {
 	palCustom = true;
 }
 
-void Screens::loadImageDelay(int32 index, int32 time) {
+bool Screens::loadImageDelay(int32 index, int32 seconds) {
 	loadImage(index);
-	_engine->delaySkip(1000 * time);
+	if (_engine->delaySkip(1000 * seconds)) {
+		adjustPalette(0, 0, 0, paletteRGBACustom, 100);
+		return true;
+	}
 	fadeOut(paletteRGBACustom);
+	return false;
 }
 
 void Screens::fadeIn(uint32 *pal) {
diff --git a/engines/twine/screens.h b/engines/twine/screens.h
index 7707a0de31..b73bce29e9 100644
--- a/engines/twine/screens.h
+++ b/engines/twine/screens.h
@@ -66,7 +66,7 @@ public:
 	uint32 mainPaletteRGBA[NUMOFCOLORS]{0};
 
 	/** Load and display Adeline Logo */
-	void adelineLogo();
+	bool adelineLogo();
 
 	void convertPalToRGBA(const uint8 *in, uint32 *out);
 
@@ -89,9 +89,9 @@ public:
 	/**
 	 * Load and display a particulary image on \a RESS.HQR file with cross fade effect and delay
 	 * @param index \a RESS.HQR entry index (starting from 0)
-	 * @param time number of seconds to delay
+	 * @param seconds number of seconds to delay
 	 */
-	void loadImageDelay(int32 index, int32 time);
+	bool loadImageDelay(int32 index, int32 seconds);
 
 	/**
 	 * Fade image in
diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index 7e9033059a..8fca8ab0ee 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -299,28 +299,34 @@ void TwinEEngine::initEngine() {
 #if TWINE_PLAY_INTROS
 	_input->enableKeyMap(cutsceneKeyMapId);
 	// Display company logo
-	_screens->adelineLogo();
+	bool abort = false;
+	abort |= _screens->adelineLogo();
 
 	// verify game version screens
-	if (cfgfile.Version == EUROPE_VERSION) {
+	if (!abort && cfgfile.Version == EUROPE_VERSION) {
 		// Little Big Adventure screen
-		_screens->loadImageDelay(RESSHQR_LBAIMG, 3);
-		// Electronic Arts Logo
-		_screens->loadImageDelay(RESSHQR_EAIMG, 2);
-	} else if (cfgfile.Version == USA_VERSION) {
+		abort |= _screens->loadImageDelay(RESSHQR_LBAIMG, 3);
+		if (!abort) {
+			// Electronic Arts Logo
+			abort |= _screens->loadImageDelay(RESSHQR_EAIMG, 2);
+		}
+	} else if (!abort && cfgfile.Version == USA_VERSION) {
 		// Relentless screen
-		_screens->loadImageDelay(RESSHQR_RELLENTIMG, 3);
-		// Electronic Arts Logo
-		_screens->loadImageDelay(RESSHQR_EAIMG, 2);
-	} else if (cfgfile.Version == MODIFICATION_VERSION) {
+		abort |= _screens->loadImageDelay(RESSHQR_RELLENTIMG, 3);
+		if (!abort) {
+			// Electronic Arts Logo
+			abort |= _screens->loadImageDelay(RESSHQR_EAIMG, 2);
+		}
+	} else if (!abort && cfgfile.Version == MODIFICATION_VERSION) {
 		// Modification screen
-		_screens->loadImageDelay(RESSHQR_RELLENTIMG, 2);
+		abort |= _screens->loadImageDelay(RESSHQR_RELLENTIMG, 2);
 	}
 
-	_flaMovies->playFlaMovie(FLA_DRAGON3);
-#else
-	_input->enableKeyMap(uiKeyMapId);
+	if (!abort) {
+		_flaMovies->playFlaMovie(FLA_DRAGON3);
+	}
 #endif
+	_input->enableKeyMap(uiKeyMapId);
 
 	_screens->loadMenuImage();
 }
@@ -830,21 +836,22 @@ bool TwinEEngine::gameEngineLoop() { // mainLoop
 	return false;
 }
 
-void TwinEEngine::delaySkip(uint32 time) {
+bool TwinEEngine::delaySkip(uint32 time) {
 	uint32 startTicks = _system->getMillis();
 	uint32 stopTicks = 0;
 	do {
 		readKeys();
 		if (_input->toggleAbortAction()) {
-			break;
+			return true;
 		}
 		if (shouldQuit()) {
-			break;
+			return true;
 		}
 		stopTicks = _system->getMillis() - startTicks;
 		_system->delayMillis(1);
 		//lbaTime++;
 	} while (stopTicks <= time);
+	return false;
 }
 
 void TwinEEngine::setPalette(const uint32 *palette) {
diff --git a/engines/twine/twine.h b/engines/twine/twine.h
index ec1f35ee8b..986b556d17 100644
--- a/engines/twine/twine.h
+++ b/engines/twine/twine.h
@@ -269,7 +269,7 @@ public:
 	 * Deplay certain seconds till proceed - Can also Skip this delay
 	 * @param time time in seconds to delay
 	 */
-	void delaySkip(uint32 time);
+	bool delaySkip(uint32 time);
 
 	/**
 	 * Set a new palette in the SDL screen buffer


Commit: 7646fcc7b39e12b7b84482402f155ec02f71440c
    https://github.com/scummvm/scummvm/commit/7646fcc7b39e12b7b84482402f155ec02f71440c
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00

Commit Message:
TWINE: reduced debug level

Changed paths:
    engines/twine/screens.cpp


diff --git a/engines/twine/screens.cpp b/engines/twine/screens.cpp
index cf54cffa4a..b1da7253bf 100644
--- a/engines/twine/screens.cpp
+++ b/engines/twine/screens.cpp
@@ -79,7 +79,7 @@ void Screens::loadImage(int32 index, bool fade_in) {
 		warning("Failed to load image with index %i", index);
 		return;
 	}
-	debug("Load image: %i", index);
+	debug(0, "Load image: %i", index);
 	copyScreen(_engine->workVideoBuffer, _engine->frontVideoBuffer);
 	loadCustomPalette(index + 1);
 	if (fade_in) {


Commit: d5d41184708c09ad53ac60fd407cd5931a4e661b
    https://github.com/scummvm/scummvm/commit/d5d41184708c09ad53ac60fd407cd5931a4e661b
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00

Commit Message:
TWINE: allow to abort fullscreen text intro

Changed paths:
    engines/twine/menuoptions.cpp
    engines/twine/text.cpp
    engines/twine/text.h


diff --git a/engines/twine/menuoptions.cpp b/engines/twine/menuoptions.cpp
index 220f9f9ced..5010b9893f 100644
--- a/engines/twine/menuoptions.cpp
+++ b/engines/twine/menuoptions.cpp
@@ -60,23 +60,28 @@ void MenuOptions::newGame() {
 	_engine->_text->textClipFull();
 	_engine->_text->setFontCrossColor(15);
 
-	_engine->_text->drawTextFullscreen(150);
+	bool aborted = _engine->_text->drawTextFullscreen(150);
 
 	// intro screen 2
-	_engine->_screens->loadImage(RESSHQR_INTROSCREEN2IMG);
-	_engine->_text->drawTextFullscreen(151);
-
-	_engine->_screens->loadImage(RESSHQR_INTROSCREEN3IMG);
-	_engine->_text->drawTextFullscreen(152);
+	if (!aborted) {
+		_engine->_screens->loadImage(RESSHQR_INTROSCREEN2IMG);
+		aborted |= _engine->_text->drawTextFullscreen(151);
 
+		if (!aborted) {
+			_engine->_screens->loadImage(RESSHQR_INTROSCREEN3IMG);
+			aborted |= _engine->_text->drawTextFullscreen(152);
+		}
+	}
 	_engine->cfgfile.FlagDisplayText = tmpFlagDisplayText;
 
 	_engine->_screens->fadeToBlack(_engine->_screens->paletteRGBACustom);
 	_engine->_screens->clearScreen();
 	_engine->flip();
 
-	// _engine->_music->playMidiMusic(1);
-	_engine->_flaMovies->playFlaMovie(FLA_INTROD);
+	if (!aborted) {
+		// _engine->_music->playMidiMusic(1);
+		_engine->_flaMovies->playFlaMovie(FLA_INTROD);
+	}
 #endif
 
 	_engine->_text->textClipSmall();
diff --git a/engines/twine/text.cpp b/engines/twine/text.cpp
index 8771c28455..417b46602c 100644
--- a/engines/twine/text.cpp
+++ b/engines/twine/text.cpp
@@ -577,7 +577,7 @@ int Text::printText10() {
 }
 
 // TODO: refactor this code
-void Text::drawTextFullscreen(int32 index) {
+bool Text::drawTextFullscreen(int32 index) {
 	ScopedKeyMap scopedKeyMap(_engine, cutsceneKeyMapId);
 
 	_engine->_interface->saveClip();
@@ -587,13 +587,15 @@ void Text::drawTextFullscreen(int32 index) {
 	// get right VOX entry index
 	initVoxToPlay(index);
 
+	bool aborted = false;
+
 	// if we don't display text, than still plays vox file
 	if (_engine->cfgfile.FlagDisplayText) {
 		initText(index);
 		initDialogueBox();
 
 		int32 printedText;
-		do {
+		for (;;) {
 			_engine->readKeys();
 			printedText = printText10();
 			playVox(currDialTextEntry);
@@ -602,11 +604,12 @@ void Text::drawTextFullscreen(int32 index) {
 				break;
 			}
 
-			if (_engine->shouldQuit()) {
+			if (_engine->shouldQuit() || _engine->_input->toggleAbortAction()) {
+				aborted = true;
 				break;
 			}
 			_engine->_system->delayMillis(1);
-		} while (!_engine->_input->toggleAbortAction());
+		}
 		hasHiddenVox = false;
 
 		stopVox(currDialTextEntry);
@@ -615,24 +618,23 @@ void Text::drawTextFullscreen(int32 index) {
 
 		if (printedText != 0) {
 			_engine->_interface->loadClip();
-			return;
+			return aborted;
 		}
 
 		// wait displaying text
-		do {
+		for (;;) {
 			_engine->readKeys();
-			if (_engine->shouldQuit()) {
+			if (_engine->shouldQuit() || _engine->_input->toggleAbortAction()) {
+				aborted = true;
 				break;
 			}
 			_engine->_system->delayMillis(1);
-		} while (!_engine->_input->toggleAbortAction());
+		}
 	} else { // RECHECK THIS
 		while (playVox(currDialTextEntry)) {
 			_engine->readKeys();
-			if (_engine->shouldQuit()) {
-				break;
-			}
-			if (_engine->_input->toggleAbortAction()) {
+			if (_engine->shouldQuit() || _engine->_input->toggleAbortAction()) {
+				aborted = true;
 				break;
 			}
 			_engine->_system->delayMillis(1);
@@ -644,6 +646,7 @@ void Text::drawTextFullscreen(int32 index) {
 	stopVox(currDialTextEntry);
 
 	_engine->_interface->loadClip();
+	return aborted;
 }
 
 void Text::setFontParameters(int32 spaceBetween, int32 charSpace) {
diff --git a/engines/twine/text.h b/engines/twine/text.h
index c29963ee60..e66760bd3e 100644
--- a/engines/twine/text.h
+++ b/engines/twine/text.h
@@ -165,7 +165,7 @@ public:
 	 */
 	void drawText(int32 x, int32 y, const char *dialogue);
 
-	void drawTextFullscreen(int32 index);
+	bool drawTextFullscreen(int32 index);
 
 	/**
 	 * Gets dialogue text width size


Commit: 9a850283ba459c7589a9af0995ca487c110fb2e5
    https://github.com/scummvm/scummvm/commit/9a850283ba459c7589a9af0995ca487c110fb2e5
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00

Commit Message:
TWINE: fixed assert in copyBlockPhys

Changed paths:
    engines/twine/twine.cpp


diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index 8fca8ab0ee..c63a94d9a5 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -877,11 +877,17 @@ void TwinEEngine::flip() {
 void TwinEEngine::copyBlockPhys(int32 left, int32 top, int32 right, int32 bottom) {
 	assert(left <= right);
 	assert(top <= bottom);
-	const int32 width = right - left + 1;
-	const int32 height = bottom - top + 1;
+	int32 width = right - left + 1;
+	int32 height = bottom - top + 1;
 	if (width <= 0 || height <= 0) {
 		return;
 	}
+	if (width > SCREEN_WIDTH) {
+		width = SCREEN_WIDTH;
+	}
+	if (height > SCREEN_HEIGHT) {
+		height = SCREEN_HEIGHT;
+	}
 	g_system->copyRectToScreen(frontVideoBuffer.getBasePtr(left, top), frontVideoBuffer.pitch, left, top, width, height);
 	g_system->updateScreen();
 }


Commit: 09721f2aac612e59873f01de63e1fff3f439931c
    https://github.com/scummvm/scummvm/commit/09721f2aac612e59873f01de63e1fff3f439931c
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00

Commit Message:
TWINE: removed TWINE_PLAY_INTROS define

Changed paths:
    engines/twine/menuoptions.cpp
    engines/twine/twine.cpp
    engines/twine/twine.h


diff --git a/engines/twine/menuoptions.cpp b/engines/twine/menuoptions.cpp
index 5010b9893f..8b23ed3432 100644
--- a/engines/twine/menuoptions.cpp
+++ b/engines/twine/menuoptions.cpp
@@ -46,7 +46,6 @@ static const char allowedCharIndex[] = " ABCDEFGHIJKLM.NOPQRSTUVWXYZ-abcdefghijk
 void MenuOptions::newGame() {
 	_engine->_music->stopMusic();
 
-#if TWINE_PLAY_INTROS
 	int32 tmpFlagDisplayText = _engine->cfgfile.FlagDisplayText;
 	_engine->cfgfile.FlagDisplayText = true;
 
@@ -82,7 +81,6 @@ void MenuOptions::newGame() {
 		// _engine->_music->playMidiMusic(1);
 		_engine->_flaMovies->playFlaMovie(FLA_INTROD);
 	}
-#endif
 
 	_engine->_text->textClipSmall();
 	_engine->_screens->clearScreen();
diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index c63a94d9a5..f076f9d346 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -296,7 +296,6 @@ void TwinEEngine::initEngine() {
 	// Check if LBA CD-Rom is on drive
 	_music->initCdrom();
 
-#if TWINE_PLAY_INTROS
 	_input->enableKeyMap(cutsceneKeyMapId);
 	// Display company logo
 	bool abort = false;
@@ -325,7 +324,6 @@ void TwinEEngine::initEngine() {
 	if (!abort) {
 		_flaMovies->playFlaMovie(FLA_DRAGON3);
 	}
-#endif
 	_input->enableKeyMap(uiKeyMapId);
 
 	_screens->loadMenuImage();
diff --git a/engines/twine/twine.h b/engines/twine/twine.h
index 986b556d17..35f2288bb1 100644
--- a/engines/twine/twine.h
+++ b/engines/twine/twine.h
@@ -60,8 +60,6 @@ namespace TwinE {
 /** Number of colors used in the game */
 #define NUMOFCOLORS 256
 
-#define TWINE_PLAY_INTROS 1
-
 static const struct TwinELanguage {
 	const char *name;
 	const char *id;


Commit: e98df188f156d9f5e1204874faa37ff985b0fe61
    https://github.com/scummvm/scummvm/commit/e98df188f156d9f5e1204874faa37ff985b0fe61
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00

Commit Message:
TWINE: converted to boolean

Changed paths:
    engines/twine/scene.cpp
    engines/twine/twine.cpp
    engines/twine/twine.h


diff --git a/engines/twine/scene.cpp b/engines/twine/scene.cpp
index 2074181a2d..7c25ba8fe9 100644
--- a/engines/twine/scene.cpp
+++ b/engines/twine/scene.cpp
@@ -314,7 +314,7 @@ void Scene::changeScene() {
 	}
 
 	_engine->_gameState->inventoryNumKeys = 0;
-	_engine->disableScreenRecenter = 0;
+	_engine->disableScreenRecenter = false;
 	heroPositionType = ScenePositionType::kNoPosition;
 	sampleAmbienceTime = 0;
 
@@ -445,7 +445,7 @@ void Scene::processActorZones(int32 actorIdx) {
 				break;
 			case kCamera:
 				if (currentlyFollowedActor == actorIdx) {
-					_engine->disableScreenRecenter = 1;
+					_engine->disableScreenRecenter = true;
 					if (_engine->_grid->newCameraX != zone->infoData.CameraView.x || _engine->_grid->newCameraY != zone->infoData.CameraView.y || _engine->_grid->newCameraZ != zone->infoData.CameraView.z) {
 						_engine->_grid->newCameraX = zone->infoData.CameraView.x;
 						_engine->_grid->newCameraY = zone->infoData.CameraView.y;
diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index f076f9d346..0dbaadffbe 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -625,7 +625,7 @@ int32 TwinEEngine::runGameEngine() { // mainLoopInteration
 	}
 
 	_movements->setActorAngle(0, -256, 5, &loopMovePtr);
-	disableScreenRecenter = 0;
+	disableScreenRecenter = false;
 
 	_scene->processEnvironmentSound();
 
@@ -812,7 +812,7 @@ int32 TwinEEngine::runGameEngine() { // mainLoopInteration
 	return 0;
 }
 
-bool TwinEEngine::gameEngineLoop() { // mainLoop
+bool TwinEEngine::gameEngineLoop() {
 	_redraw->reqBgRedraw = true;
 	_screens->lockPalette = true;
 	_movements->setActorAngle(0, -256, 5, &loopMovePtr);
diff --git a/engines/twine/twine.h b/engines/twine/twine.h
index 35f2288bb1..2abf1e1725 100644
--- a/engines/twine/twine.h
+++ b/engines/twine/twine.h
@@ -246,7 +246,7 @@ public:
 	int32 loopActorStep = 0;
 
 	/** Disable screen recenter */
-	int16 disableScreenRecenter = 0;
+	bool disableScreenRecenter = false;
 
 	int32 zoomScreen = 0;
 


Commit: 8340c196e52bc0b429179bdbd2010721a2210a0e
    https://github.com/scummvm/scummvm/commit/8340c196e52bc0b429179bdbd2010721a2210a0e
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00

Commit Message:
TWINE: added ScriptContext

Changed paths:
    engines/twine/script_life_v1.cpp
    engines/twine/script_move_v1.cpp


diff --git a/engines/twine/script_life_v1.cpp b/engines/twine/script_life_v1.cpp
index 3c637e87c0..492c17fa50 100644
--- a/engines/twine/script_life_v1.cpp
+++ b/engines/twine/script_life_v1.cpp
@@ -50,11 +50,16 @@ static uint8 *opcodePtr; // local opcode script pointer
 static int32 drawVar1;
 static char textStr[256]; // string
 
+struct ScriptContext {
+	int32 actorIdx;
+	ActorStruct *actor;
+};
+
 /** Returns:
 	   -1 - Need implementation
 		0 - Completed
 		1 - Break script */
-typedef int32 ScriptLifeFunc(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor);
+typedef int32 ScriptLifeFunc(TwinEEngine *engine, ScriptContext& ctx);
 
 struct ScriptLifeFunction {
 	const char *name;
@@ -112,16 +117,16 @@ enum LifeScriptConditions {
 	   -1 - Need implementation
 		1 - Condition value size (1 byte)
 		2 - Condition value size (2 byes) */
-static int32 processLifeConditions(TwinEEngine *engine, ActorStruct *actor) {
+static int32 processLifeConditions(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 conditionValueSize = 1;
 	int32 conditionOpcode = *(scriptPtr++);
 
 	switch (conditionOpcode) {
 	case kcCOL:
-		if (actor->life <= 0) {
+		if (ctx.actor->life <= 0) {
 			engine->_scene->currentScriptValue = -1;
 		} else {
-			engine->_scene->currentScriptValue = actor->collision;
+			engine->_scene->currentScriptValue = ctx.actor->collision;
 		}
 		break;
 	case kcCOL_OBJ: {
@@ -138,11 +143,11 @@ static int32 processLifeConditions(TwinEEngine *engine, ActorStruct *actor) {
 		conditionValueSize = 2;
 		ActorStruct *otherActor = engine->_scene->getActor(actorIdx);
 		if (!otherActor->dynamicFlags.bIsDead) {
-			if (ABS(actor->y - otherActor->y) >= 1500) {
+			if (ABS(ctx.actor->y - otherActor->y) >= 1500) {
 				engine->_scene->currentScriptValue = MAX_TARGET_ACTOR_DISTANCE;
 			} else {
 				// Returns int32, so we check for integer overflow
-				int32 distance = engine->_movements->getDistance2D(actor->x, actor->z, otherActor->x, otherActor->z);
+				int32 distance = engine->_movements->getDistance2D(ctx.actor->x, ctx.actor->z, otherActor->x, otherActor->z);
 				if (ABS(distance) > MAX_TARGET_ACTOR_DISTANCE) {
 					engine->_scene->currentScriptValue = MAX_TARGET_ACTOR_DISTANCE;
 				} else {
@@ -155,7 +160,7 @@ static int32 processLifeConditions(TwinEEngine *engine, ActorStruct *actor) {
 		break;
 	}
 	case kcZONE:
-		engine->_scene->currentScriptValue = actor->zone;
+		engine->_scene->currentScriptValue = ctx.actor->zone;
 		break;
 	case kcZONE_OBJ: {
 		int32 actorIdx = *(scriptPtr++);
@@ -163,7 +168,7 @@ static int32 processLifeConditions(TwinEEngine *engine, ActorStruct *actor) {
 		break;
 	}
 	case kcBODY:
-		engine->_scene->currentScriptValue = actor->body;
+		engine->_scene->currentScriptValue = ctx.actor->body;
 		break;
 	case kcBODY_OBJ: {
 		int32 actorIdx = *(scriptPtr++);
@@ -171,7 +176,7 @@ static int32 processLifeConditions(TwinEEngine *engine, ActorStruct *actor) {
 		break;
 	}
 	case kcANIM:
-		engine->_scene->currentScriptValue = actor->anim;
+		engine->_scene->currentScriptValue = ctx.actor->anim;
 		break;
 	case kcANIM_OBJ: {
 		int32 actorIdx = *(scriptPtr++);
@@ -179,7 +184,7 @@ static int32 processLifeConditions(TwinEEngine *engine, ActorStruct *actor) {
 		break;
 	}
 	case kcL_TRACK:
-		engine->_scene->currentScriptValue = actor->labelIdx;
+		engine->_scene->currentScriptValue = ctx.actor->labelIdx;
 		break;
 	case kcL_TRACK_OBJ: {
 		int32 actorIdx = *(scriptPtr++);
@@ -199,8 +204,8 @@ static int32 processLifeConditions(TwinEEngine *engine, ActorStruct *actor) {
 		conditionValueSize = 2;
 
 		if (!targetActor->dynamicFlags.bIsDead) {
-			if (ABS(targetActor->y - actor->y) < 1500) {
-				newAngle = engine->_movements->getAngleAndSetTargetActorDistance(actor->x, actor->z, targetActor->x, targetActor->z);
+			if (ABS(targetActor->y - ctx.actor->y) < 1500) {
+				newAngle = engine->_movements->getAngleAndSetTargetActorDistance(ctx.actor->x, ctx.actor->z, targetActor->x, targetActor->z);
 				if (ABS(engine->_movements->targetActorDistance) > MAX_TARGET_ACTOR_DISTANCE) {
 					engine->_movements->targetActorDistance = MAX_TARGET_ACTOR_DISTANCE;
 				}
@@ -211,7 +216,7 @@ static int32 processLifeConditions(TwinEEngine *engine, ActorStruct *actor) {
 			if (!targetActorIdx) {
 				int32 heroAngle;
 
-				heroAngle = actor->angle + 0x480 - newAngle + 0x400;
+				heroAngle = ctx.actor->angle + 0x480 - newAngle + 0x400;
 				heroAngle &= 0x3FF;
 
 				if (ABS(heroAngle) > 0x100) {
@@ -223,7 +228,7 @@ static int32 processLifeConditions(TwinEEngine *engine, ActorStruct *actor) {
 				if (engine->_actor->heroBehaviour == kDiscrete) {
 					int32 heroAngle;
 
-					heroAngle = actor->angle + 0x480 - newAngle + 0x400;
+					heroAngle = ctx.actor->angle + 0x480 - newAngle + 0x400;
 					heroAngle &= 0x3FF;
 
 					if (ABS(heroAngle) > 0x100) {
@@ -240,7 +245,7 @@ static int32 processLifeConditions(TwinEEngine *engine, ActorStruct *actor) {
 		}
 	} break;
 	case kcHIT_BY:
-		engine->_scene->currentScriptValue = actor->hitBy;
+		engine->_scene->currentScriptValue = ctx.actor->hitBy;
 		break;
 	case kcACTION:
 		engine->_scene->currentScriptValue = engine->_movements->heroAction ? 1 : 0;
@@ -260,7 +265,7 @@ static int32 processLifeConditions(TwinEEngine *engine, ActorStruct *actor) {
 		break;
 	}
 	case kcLIFE_POINT:
-		engine->_scene->currentScriptValue = actor->life;
+		engine->_scene->currentScriptValue = ctx.actor->life;
 		break;
 	case kcLIFE_POINT_OBJ: {
 		int32 actorIdx = *(scriptPtr++);
@@ -291,7 +296,7 @@ static int32 processLifeConditions(TwinEEngine *engine, ActorStruct *actor) {
 
 		if (!targetActor->dynamicFlags.bIsDead) {
 			// Returns int32, so we check for integer overflow
-			int32 distance = engine->_movements->getDistance3D(actor->x, actor->y, actor->z, targetActor->x, targetActor->y, targetActor->z);
+			int32 distance = engine->_movements->getDistance3D(ctx.actor->x, ctx.actor->y, ctx.actor->z, targetActor->x, targetActor->y, targetActor->z);
 			if (ABS(distance) > MAX_TARGET_ACTOR_DISTANCE) {
 				engine->_scene->currentScriptValue = MAX_TARGET_ACTOR_DISTANCE;
 			} else {
@@ -335,7 +340,7 @@ static int32 processLifeConditions(TwinEEngine *engine, ActorStruct *actor) {
 		engine->_scene->currentScriptValue = engine->_gameState->inventoryNumGas;
 		break;
 	case kcCARRIED_BY:
-		engine->_scene->currentScriptValue = actor->standOn;
+		engine->_scene->currentScriptValue = ctx.actor->standOn;
 		break;
 	case kcCDROM:
 		engine->_scene->currentScriptValue = 1;
@@ -408,67 +413,67 @@ static int32 processLifeOperators(TwinEEngine *engine, int32 valueSize) {
 /** Life script command definitions */
 
 /* For unused opcodes */
-static int32 lEMPTY(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lEMPTY(TwinEEngine *engine, ScriptContext& ctx) {
 	return 0;
 }
 
 /*0x00*/
-static int32 lEND(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	actor->positionInLifeScript = -1;
+static int32 lEND(TwinEEngine *engine, ScriptContext& ctx) {
+	ctx.actor->positionInLifeScript = -1;
 	return 1; // break script
 }
 
 /*0x01*/
-static int32 lNOP(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lNOP(TwinEEngine *engine, ScriptContext& ctx) {
 	scriptPtr++;
 	return 0;
 }
 
 /*0x02*/
-static int32 lSNIF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	const int32 valueSize = processLifeConditions(engine, actor);
+static int32 lSNIF(TwinEEngine *engine, ScriptContext& ctx) {
+	const int32 valueSize = processLifeConditions(engine, ctx);
 	if (!processLifeOperators(engine, valueSize)) {
 		*opcodePtr = 0x0D; // SWIF
 	}
-	scriptPtr = actor->lifeScript + *((int16 *)scriptPtr); // condition offset
+	scriptPtr = ctx.actor->lifeScript + *((int16 *)scriptPtr); // condition offset
 	return 0;
 }
 
 /*0x03*/
-static int32 lOFFSET(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	scriptPtr = actor->lifeScript + *((int16 *)scriptPtr); // offset
+static int32 lOFFSET(TwinEEngine *engine, ScriptContext& ctx) {
+	scriptPtr = ctx.actor->lifeScript + *((int16 *)scriptPtr); // offset
 	return 0;
 }
 
 /*0x04*/
-static int32 lNEVERIF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	int32 valueSize = processLifeConditions(engine, actor);
+static int32 lNEVERIF(TwinEEngine *engine, ScriptContext& ctx) {
+	int32 valueSize = processLifeConditions(engine, ctx);
 	processLifeOperators(engine, valueSize);
-	scriptPtr = actor->lifeScript + *((int16 *)scriptPtr); // condition offset
+	scriptPtr = ctx.actor->lifeScript + *((int16 *)scriptPtr); // condition offset
 	return 0;
 }
 
 /*0x06*/
-static int32 lNO_IF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lNO_IF(TwinEEngine *engine, ScriptContext& ctx) {
 	return 0;
 }
 
 /*0x0A*/
-static int32 lLABEL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lLABEL(TwinEEngine *engine, ScriptContext& ctx) {
 	scriptPtr++;
 	return 0;
 }
 
 /*0x0B*/
-static int32 lRETURN(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lRETURN(TwinEEngine *engine, ScriptContext& ctx) {
 	return 1; // break script
 }
 
 /*0x0C*/
-static int32 lIF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	int32 valueSize = processLifeConditions(engine, actor);
+static int32 lIF(TwinEEngine *engine, ScriptContext& ctx) {
+	int32 valueSize = processLifeConditions(engine, ctx);
 	if (!processLifeOperators(engine, valueSize)) {
-		scriptPtr = actor->lifeScript + *((int16 *)scriptPtr); // condition offset
+		scriptPtr = ctx.actor->lifeScript + *((int16 *)scriptPtr); // condition offset
 	} else {
 		scriptPtr += 2;
 	}
@@ -477,10 +482,10 @@ static int32 lIF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
 }
 
 /*0x0D*/
-static int32 lSWIF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	int32 valueSize = processLifeConditions(engine, actor);
+static int32 lSWIF(TwinEEngine *engine, ScriptContext& ctx) {
+	int32 valueSize = processLifeConditions(engine, ctx);
 	if (!processLifeOperators(engine, valueSize)) {
-		scriptPtr = actor->lifeScript + *((int16 *)scriptPtr); // condition offset
+		scriptPtr = ctx.actor->lifeScript + *((int16 *)scriptPtr); // condition offset
 	} else {
 		scriptPtr += 2;
 		*opcodePtr = 0x02; // SNIF
@@ -490,10 +495,10 @@ static int32 lSWIF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
 }
 
 /*0x0E*/
-static int32 lONEIF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	int32 valueSize = processLifeConditions(engine, actor);
+static int32 lONEIF(TwinEEngine *engine, ScriptContext& ctx) {
+	int32 valueSize = processLifeConditions(engine, ctx);
 	if (!processLifeOperators(engine, valueSize)) {
-		scriptPtr = actor->lifeScript + *((int16 *)scriptPtr); // condition offset
+		scriptPtr = ctx.actor->lifeScript + *((int16 *)scriptPtr); // condition offset
 	} else {
 		scriptPtr += 2;
 		*opcodePtr = 0x04; // NEVERIF
@@ -503,21 +508,21 @@ static int32 lONEIF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
 }
 
 /*0x0F*/
-static int32 lELSE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	scriptPtr = actor->lifeScript + *((int16 *)scriptPtr); // offset
+static int32 lELSE(TwinEEngine *engine, ScriptContext& ctx) {
+	scriptPtr = ctx.actor->lifeScript + *((int16 *)scriptPtr); // offset
 	return 0;
 }
 
 /*0x11*/
-static int32 lBODY(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lBODY(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 bodyIdx = *(scriptPtr);
-	engine->_actor->initModelActor(bodyIdx, actorIdx);
+	engine->_actor->initModelActor(bodyIdx, ctx.actorIdx);
 	scriptPtr++;
 	return 0;
 }
 
 /*0x12*/
-static int32 lBODY_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lBODY_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 otherActorIdx = *(scriptPtr++);
 	int32 otherBodyIdx = *(scriptPtr++);
 	engine->_actor->initModelActor(otherBodyIdx, otherActorIdx);
@@ -525,14 +530,14 @@ static int32 lBODY_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor)
 }
 
 /*0x13*/
-static int32 lANIM(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lANIM(TwinEEngine *engine, ScriptContext& ctx) {
 	AnimationTypes animIdx = (AnimationTypes)*(scriptPtr++);
-	engine->_animations->initAnim(animIdx, 0, 0, actorIdx);
+	engine->_animations->initAnim(animIdx, 0, 0, ctx.actorIdx);
 	return 0;
 }
 
 /*0x14*/
-static int32 lANIM_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lANIM_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 otherActorIdx = *(scriptPtr++);
 	AnimationTypes otherAnimIdx = (AnimationTypes)*(scriptPtr++);
 	engine->_animations->initAnim(otherAnimIdx, 0, 0, otherActorIdx);
@@ -540,14 +545,14 @@ static int32 lANIM_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor)
 }
 
 /*0x15*/
-static int32 lSET_LIFE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	actor->positionInLifeScript = *((int16 *)scriptPtr); // offset
+static int32 lSET_LIFE(TwinEEngine *engine, ScriptContext& ctx) {
+	ctx.actor->positionInLifeScript = *((int16 *)scriptPtr); // offset
 	scriptPtr += 2;
 	return 0;
 }
 
 /*0x16*/
-static int32 lSET_LIFE_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_LIFE_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 otherActorIdx = *(scriptPtr++);
 	engine->_scene->getActor(otherActorIdx)->positionInLifeScript = *((int16 *)scriptPtr); // offset
 	scriptPtr += 2;
@@ -555,14 +560,14 @@ static int32 lSET_LIFE_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *act
 }
 
 /*0x17*/
-static int32 lSET_TRACK(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	actor->positionInMoveScript = *((int16 *)scriptPtr); // offset
+static int32 lSET_TRACK(TwinEEngine *engine, ScriptContext& ctx) {
+	ctx.actor->positionInMoveScript = *((int16 *)scriptPtr); // offset
 	scriptPtr += 2;
 	return 0;
 }
 
 /*0x18*/
-static int32 lSET_TRACK_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_TRACK_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 otherActorIdx = *(scriptPtr++);
 	engine->_scene->getActor(otherActorIdx)->positionInMoveScript = *((int16 *)scriptPtr); // offset
 	scriptPtr += 2;
@@ -570,16 +575,16 @@ static int32 lSET_TRACK_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *ac
 }
 
 /*0x19*/
-static int32 lMESSAGE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lMESSAGE(TwinEEngine *engine, ScriptContext& ctx) {
 	const int32 textIdx = *((int16 *)scriptPtr);
 	scriptPtr += 2;
 
 	engine->freezeTime();
 	if (engine->_text->showDialogueBubble) {
-		engine->_redraw->drawBubble(actorIdx);
+		engine->_redraw->drawBubble(ctx.actorIdx);
 	}
-	engine->_text->setFontCrossColor(actor->talkColor);
-	engine->_scene->talkingActor = actorIdx;
+	engine->_text->setFontCrossColor(ctx.actor->talkColor);
+	engine->_scene->talkingActor = ctx.actorIdx;
 	engine->_text->drawTextFullscreen(textIdx);
 	engine->unfreezeTime();
 	engine->_redraw->redrawEngineActions(1);
@@ -588,26 +593,26 @@ static int32 lMESSAGE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
 }
 
 /*0x1A*/
-static int32 lFALLABLE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lFALLABLE(TwinEEngine *engine, ScriptContext& ctx) {
 	const int32 flag = *(scriptPtr++);
-	actor->staticFlags.bCanFall = flag & 1;
+	ctx.actor->staticFlags.bCanFall = flag & 1;
 	return 0;
 }
 
 /*0x1B*/
-static int32 lSET_DIRMODE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_DIRMODE(TwinEEngine *engine, ScriptContext& ctx) {
 	const int32 controlMode = *(scriptPtr++);
 
-	actor->controlMode = (ControlMode)controlMode;
-	if (actor->controlMode == ControlMode::kFollow) {
-		actor->followedActor = *(scriptPtr++);
+	ctx.actor->controlMode = (ControlMode)controlMode;
+	if (ctx.actor->controlMode == ControlMode::kFollow) {
+		ctx.actor->followedActor = *(scriptPtr++);
 	}
 
 	return 0;
 }
 
 /*0x1C*/
-static int32 lSET_DIRMODE_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_DIRMODE_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
 	const int32 otherActorIdx = *(scriptPtr++);
 	const int32 controlMode = *(scriptPtr++);
 
@@ -621,7 +626,7 @@ static int32 lSET_DIRMODE_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *
 }
 
 /*0x1D*/
-static int32 lCAM_FOLLOW(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lCAM_FOLLOW(TwinEEngine *engine, ScriptContext& ctx) {
 	const int32 followedActorIdx = *(scriptPtr++);
 
 	if (engine->_scene->currentlyFollowedActor != followedActorIdx) {
@@ -638,7 +643,7 @@ static int32 lCAM_FOLLOW(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor
 }
 
 /*0x1E*/
-static int32 lSET_BEHAVIOUR(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_BEHAVIOUR(TwinEEngine *engine, ScriptContext& ctx) {
 	const int32 behavior = *(scriptPtr++);
 
 	engine->_animations->initAnim(kStanding, 0, 255, 0);
@@ -648,7 +653,7 @@ static int32 lSET_BEHAVIOUR(TwinEEngine *engine, int32 actorIdx, ActorStruct *ac
 }
 
 /*0x1F*/
-static int32 lSET_FLAG_CUBE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_FLAG_CUBE(TwinEEngine *engine, ScriptContext& ctx) {
 	const int32 flagIdx = *(scriptPtr++);
 	const int32 flagValue = *(scriptPtr++);
 
@@ -658,20 +663,20 @@ static int32 lSET_FLAG_CUBE(TwinEEngine *engine, int32 actorIdx, ActorStruct *ac
 }
 
 /*0x20*/
-static int32 lCOMPORTEMENT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lCOMPORTEMENT(TwinEEngine *engine, ScriptContext& ctx) {
 	scriptPtr++;
 	return 0;
 }
 
 /*0x21*/
-static int32 lSET_COMPORTEMENT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	actor->positionInLifeScript = *((int16 *)scriptPtr);
+static int32 lSET_COMPORTEMENT(TwinEEngine *engine, ScriptContext& ctx) {
+	ctx.actor->positionInLifeScript = *((int16 *)scriptPtr);
 	scriptPtr += 2;
 	return 0;
 }
 
 /*0x22*/
-static int32 lSET_COMPORTEMENT_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_COMPORTEMENT_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
 	const int32 otherActorIdx = *(scriptPtr++);
 
 	engine->_scene->getActor(otherActorIdx)->positionInLifeScript = *((int16 *)scriptPtr);
@@ -681,12 +686,12 @@ static int32 lSET_COMPORTEMENT_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStr
 }
 
 /*0x23*/
-static int32 lEND_COMPORTEMENT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lEND_COMPORTEMENT(TwinEEngine *engine, ScriptContext& ctx) {
 	return 1; // break
 }
 
 /*0x24*/
-static int32 lSET_FLAG_GAME(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_FLAG_GAME(TwinEEngine *engine, ScriptContext& ctx) {
 	const int32 flagIdx = *(scriptPtr++);
 	const int32 flagValue = *(scriptPtr++);
 
@@ -696,7 +701,7 @@ static int32 lSET_FLAG_GAME(TwinEEngine *engine, int32 actorIdx, ActorStruct *ac
 }
 
 /*0x25*/
-static int32 lKILL_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lKILL_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
 	const int32 otherActorIdx = *(scriptPtr++);
 
 	engine->_actor->processActorCarrier(otherActorIdx);
@@ -710,18 +715,18 @@ static int32 lKILL_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor)
 }
 
 /*0x26*/
-static int32 lSUICIDE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	engine->_actor->processActorCarrier(actorIdx);
-	actor->dynamicFlags.bIsDead = 1;
-	actor->entity = -1;
-	actor->zone = -1;
-	actor->life = 0;
+static int32 lSUICIDE(TwinEEngine *engine, ScriptContext& ctx) {
+	engine->_actor->processActorCarrier(ctx.actorIdx);
+	ctx.actor->dynamicFlags.bIsDead = 1;
+	ctx.actor->entity = -1;
+	ctx.actor->zone = -1;
+	ctx.actor->life = 0;
 
 	return 0;
 }
 
 /*0x27*/
-static int32 lUSE_ONE_LITTLE_KEY(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lUSE_ONE_LITTLE_KEY(TwinEEngine *engine, ScriptContext& ctx) {
 	engine->_gameState->inventoryNumKeys--;
 
 	if (engine->_gameState->inventoryNumKeys < 0) {
@@ -734,9 +739,9 @@ static int32 lUSE_ONE_LITTLE_KEY(TwinEEngine *engine, int32 actorIdx, ActorStruc
 }
 
 /*0x28*/
-static int32 lGIVE_GOLD_PIECES(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lGIVE_GOLD_PIECES(TwinEEngine *engine, ScriptContext& ctx) {
 	int16 oldNumKashes = engine->_gameState->inventoryNumKashes;
-	int16 hideRange = 0;
+	bool hideRange = false;
 	int16 kashes = *((int16 *)scriptPtr);
 	scriptPtr += 2;
 
@@ -753,7 +758,7 @@ static int32 lGIVE_GOLD_PIECES(TwinEEngine *engine, int32 actorIdx, ActorStruct
 			overlay->info0 = engine->_collision->getAverageValue(overlay->info1, overlay->info0, 100, overlay->lifeTime - engine->lbaTime - 50);
 			overlay->info1 = engine->_gameState->inventoryNumKashes;
 			overlay->lifeTime = engine->lbaTime + 150;
-			hideRange = 1;
+			hideRange = true;
 			break;
 		}
 	}
@@ -766,26 +771,26 @@ static int32 lGIVE_GOLD_PIECES(TwinEEngine *engine, int32 actorIdx, ActorStruct
 }
 
 /*0x29*/
-static int32 lEND_LIFE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	actor->positionInLifeScript = -1;
+static int32 lEND_LIFE(TwinEEngine *engine, ScriptContext& ctx) {
+	ctx.actor->positionInLifeScript = -1;
 	return 1; // break;
 }
 
 /*0x2A*/
-static int32 lSTOP_L_TRACK(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	actor->pausedTrackPtr = actor->currentLabelPtr;
-	actor->positionInMoveScript = -1;
+static int32 lSTOP_L_TRACK(TwinEEngine *engine, ScriptContext& ctx) {
+	ctx.actor->pausedTrackPtr = ctx.actor->currentLabelPtr;
+	ctx.actor->positionInMoveScript = -1;
 	return 0;
 }
 
 /*0x2B*/
-static int32 lRESTORE_L_TRACK(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	actor->positionInMoveScript = actor->pausedTrackPtr;
+static int32 lRESTORE_L_TRACK(TwinEEngine *engine, ScriptContext& ctx) {
+	ctx.actor->positionInMoveScript = ctx.actor->pausedTrackPtr;
 	return 0;
 }
 
 /*0x2C*/
-static int32 lMESSAGE_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lMESSAGE_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
 	const int32 otherActorIdx = *(scriptPtr++);
 	const int32 textIdx = *((int16 *)scriptPtr);
 	scriptPtr += 2;
@@ -804,13 +809,13 @@ static int32 lMESSAGE_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *acto
 }
 
 /*0x2D*/
-static int32 lINC_CHAPTER(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lINC_CHAPTER(TwinEEngine *engine, ScriptContext& ctx) {
 	engine->_gameState->gameChapter++;
 	return 0;
 }
 
 /*0x2E*/
-static int32 lFOUND_OBJECT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lFOUND_OBJECT(TwinEEngine *engine, ScriptContext& ctx) {
 	const int32 item = *(scriptPtr++);
 
 	engine->freezeTime();
@@ -822,74 +827,74 @@ static int32 lFOUND_OBJECT(TwinEEngine *engine, int32 actorIdx, ActorStruct *act
 }
 
 /*0x2F*/
-static int32 lSET_DOOR_LEFT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_DOOR_LEFT(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 distance = *((int16 *)scriptPtr);
 	scriptPtr += 2;
 
-	actor->angle = 0x300;
-	actor->x = actor->lastX - distance;
-	actor->dynamicFlags.bIsSpriteMoving = 0;
-	actor->speed = 0;
+	ctx.actor->angle = 0x300;
+	ctx.actor->x = ctx.actor->lastX - distance;
+	ctx.actor->dynamicFlags.bIsSpriteMoving = 0;
+	ctx.actor->speed = 0;
 
 	return 0;
 }
 
 /*0x30*/
-static int32 lSET_DOOR_RIGHT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_DOOR_RIGHT(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 distance = *((int16 *)scriptPtr);
 	scriptPtr += 2;
 
-	actor->angle = 0x100;
-	actor->x = actor->lastX + distance;
-	actor->dynamicFlags.bIsSpriteMoving = 0;
-	actor->speed = 0;
+	ctx.actor->angle = 0x100;
+	ctx.actor->x = ctx.actor->lastX + distance;
+	ctx.actor->dynamicFlags.bIsSpriteMoving = 0;
+	ctx.actor->speed = 0;
 
 	return 0;
 }
 
 /*0x31*/
-static int32 lSET_DOOR_UP(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_DOOR_UP(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 distance = *((int16 *)scriptPtr);
 	scriptPtr += 2;
 
-	actor->angle = 0x200;
-	actor->z = actor->lastZ - distance;
-	actor->dynamicFlags.bIsSpriteMoving = 0;
-	actor->speed = 0;
+	ctx.actor->angle = 0x200;
+	ctx.actor->z = ctx.actor->lastZ - distance;
+	ctx.actor->dynamicFlags.bIsSpriteMoving = 0;
+	ctx.actor->speed = 0;
 
 	return 0;
 }
 
 /*0x32*/
-static int32 lSET_DOOR_DOWN(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_DOOR_DOWN(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 distance = *((int16 *)scriptPtr);
 	scriptPtr += 2;
 
-	actor->angle = 0;
-	actor->z = actor->lastZ + distance;
-	actor->dynamicFlags.bIsSpriteMoving = 0;
-	actor->speed = 0;
+	ctx.actor->angle = 0;
+	ctx.actor->z = ctx.actor->lastZ + distance;
+	ctx.actor->dynamicFlags.bIsSpriteMoving = 0;
+	ctx.actor->speed = 0;
 
 	return 0;
 }
 
 /*0x33*/
-static int32 lGIVE_BONUS(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lGIVE_BONUS(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 flag = *(scriptPtr++);
 
-	if (actor->bonusParameter & 0x1F0) {
-		engine->_actor->processActorExtraBonus(actorIdx);
+	if (ctx.actor->bonusParameter & 0x1F0) {
+		engine->_actor->processActorExtraBonus(ctx.actorIdx);
 	}
 
 	if (flag != 0) {
-		actor->bonusParameter |= 1;
+		ctx.actor->bonusParameter |= 1;
 	}
 
 	return 0;
 }
 
 /*0x34*/
-static int32 lCHANGE_CUBE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lCHANGE_CUBE(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 sceneIdx = *(scriptPtr++);
 	engine->_scene->needChangeScene = sceneIdx;
 	engine->_scene->heroPositionType = ScenePositionType::kScene;
@@ -897,37 +902,37 @@ static int32 lCHANGE_CUBE(TwinEEngine *engine, int32 actorIdx, ActorStruct *acto
 }
 
 /*0x35*/
-static int32 lOBJ_COL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lOBJ_COL(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 collision = *(scriptPtr++);
 	if (collision != 0) {
-		actor->staticFlags.bComputeCollisionWithObj = 1;
+		ctx.actor->staticFlags.bComputeCollisionWithObj = 1;
 	} else {
-		actor->staticFlags.bComputeCollisionWithObj = 0;
+		ctx.actor->staticFlags.bComputeCollisionWithObj = 0;
 	}
 	return 0;
 }
 
 /*0x36*/
-static int32 lBRICK_COL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lBRICK_COL(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 collision = *(scriptPtr++);
 
-	actor->staticFlags.bComputeCollisionWithBricks = 0;
-	actor->staticFlags.bComputeLowCollision = 0;
+	ctx.actor->staticFlags.bComputeCollisionWithBricks = 0;
+	ctx.actor->staticFlags.bComputeLowCollision = 0;
 
 	if (collision == 1) {
-		actor->staticFlags.bComputeCollisionWithBricks = 1;
+		ctx.actor->staticFlags.bComputeCollisionWithBricks = 1;
 	} else if (collision == 2) {
-		actor->staticFlags.bComputeCollisionWithBricks = 1;
-		actor->staticFlags.bComputeLowCollision = 1;
+		ctx.actor->staticFlags.bComputeCollisionWithBricks = 1;
+		ctx.actor->staticFlags.bComputeLowCollision = 1;
 	}
 	return 0;
 }
 
 /*0x37*/
-static int32 lOR_IF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	int32 valueSize = processLifeConditions(engine, actor);
+static int32 lOR_IF(TwinEEngine *engine, ScriptContext& ctx) {
+	int32 valueSize = processLifeConditions(engine, ctx);
 	if (processLifeOperators(engine, valueSize)) {
-		scriptPtr = actor->lifeScript + *((int16 *)scriptPtr); // condition offset
+		scriptPtr = ctx.actor->lifeScript + *((int16 *)scriptPtr); // condition offset
 	} else {
 		scriptPtr += 2;
 	}
@@ -936,13 +941,13 @@ static int32 lOR_IF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
 }
 
 /*0x38*/
-static int32 lINVISIBLE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	actor->staticFlags.bIsHidden = *(scriptPtr++);
+static int32 lINVISIBLE(TwinEEngine *engine, ScriptContext& ctx) {
+	ctx.actor->staticFlags.bIsHidden = *(scriptPtr++);
 	return 0;
 }
 
 /*0x39*/
-static int32 lZOOM(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lZOOM(TwinEEngine *engine, ScriptContext& ctx) {
 	engine->zoomScreen = *(scriptPtr++);
 
 	if (engine->zoomScreen && !engine->_redraw->drawInGameTransBox && engine->cfgfile.SceZoom) {
@@ -962,7 +967,7 @@ static int32 lZOOM(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
 }
 
 /*0x3A*/
-static int32 lPOS_POINT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lPOS_POINT(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 trackIdx = *(scriptPtr++);
 
 	const ScenePoint &sp = engine->_scene->sceneTracks[trackIdx];
@@ -970,22 +975,22 @@ static int32 lPOS_POINT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor)
 	engine->_renderer->destY = sp.y;
 	engine->_renderer->destZ = sp.z;
 
-	actor->x = sp.x;
-	actor->y = sp.y;
-	actor->z = sp.z;
+	ctx.actor->x = sp.x;
+	ctx.actor->y = sp.y;
+	ctx.actor->z = sp.z;
 
 	return 0;
 }
 
 /*0x3B*/
-static int32 lSET_MAGIC_LEVEL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_MAGIC_LEVEL(TwinEEngine *engine, ScriptContext& ctx) {
 	engine->_gameState->magicLevelIdx = *(scriptPtr++);
 	engine->_gameState->inventoryMagicPoints = engine->_gameState->magicLevelIdx * 20;
 	return 0;
 }
 
 /*0x3C*/
-static int32 lSUB_MAGIC_POINT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSUB_MAGIC_POINT(TwinEEngine *engine, ScriptContext& ctx) {
 	engine->_gameState->inventoryMagicPoints = *(scriptPtr++);
 	if (engine->_gameState->inventoryMagicPoints < 0) {
 		engine->_gameState->inventoryMagicPoints = 0;
@@ -994,7 +999,7 @@ static int32 lSUB_MAGIC_POINT(TwinEEngine *engine, int32 actorIdx, ActorStruct *
 }
 
 /*0x3D*/
-static int32 lSET_LIFE_POINT_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_LIFE_POINT_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 otherActorIdx = *(scriptPtr++);
 	static int32 lifeValue = *(scriptPtr++);
 
@@ -1004,7 +1009,7 @@ static int32 lSET_LIFE_POINT_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruc
 }
 
 /*0x3E*/
-static int32 lSUB_LIFE_POINT_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSUB_LIFE_POINT_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 otherActorIdx = *(scriptPtr++);
 	static int32 lifeValue = *(scriptPtr++);
 
@@ -1018,15 +1023,15 @@ static int32 lSUB_LIFE_POINT_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruc
 }
 
 /*0x3F*/
-static int32 lHIT_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lHIT_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 otherActorIdx = *(scriptPtr++);
 	int32 strengthOfHit = *(scriptPtr++);
-	engine->_actor->hitActor(actorIdx, otherActorIdx, strengthOfHit, engine->_scene->getActor(otherActorIdx)->angle);
+	engine->_actor->hitActor(ctx.actorIdx, otherActorIdx, strengthOfHit, engine->_scene->getActor(otherActorIdx)->angle);
 	return 0;
 }
 
 /*0x40*/
-static int32 lPLAY_FLA(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lPLAY_FLA(TwinEEngine *engine, ScriptContext& ctx) {
 	const char *movie = (const char *)scriptPtr;
 	int32 nameSize = strlen(movie);
 	scriptPtr += nameSize + 1;
@@ -1040,14 +1045,14 @@ static int32 lPLAY_FLA(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor)
 }
 
 /*0x41*/
-static int32 lPLAY_MIDI(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lPLAY_MIDI(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 midiIdx = *(scriptPtr++);
 	engine->_music->playMidiMusic(midiIdx); // TODO: improve this
 	return 0;
 }
 
 /*0x42*/
-static int32 lINC_CLOVER_BOX(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lINC_CLOVER_BOX(TwinEEngine *engine, ScriptContext& ctx) {
 	if (engine->_gameState->inventoryNumLeafsBox < 10) {
 		engine->_gameState->inventoryNumLeafsBox++;
 	}
@@ -1055,7 +1060,7 @@ static int32 lINC_CLOVER_BOX(TwinEEngine *engine, int32 actorIdx, ActorStruct *a
 }
 
 /*0x43*/
-static int32 lSET_USED_INVENTORY(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_USED_INVENTORY(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 item = *(scriptPtr++);
 	if (item < 24) {
 		engine->_gameState->inventoryFlags[item] = 1;
@@ -1064,7 +1069,7 @@ static int32 lSET_USED_INVENTORY(TwinEEngine *engine, int32 actorIdx, ActorStruc
 }
 
 /*0x44*/
-static int32 lADD_CHOICE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lADD_CHOICE(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 choiceIdx = *((int16 *)scriptPtr);
 	scriptPtr += 2;
 	engine->_gameState->gameChoices[engine->_gameState->numChoices++] = choiceIdx;
@@ -1072,15 +1077,15 @@ static int32 lADD_CHOICE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor
 }
 
 /*0x45*/
-static int32 lASK_CHOICE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lASK_CHOICE(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 choiceIdx = *((int16 *)scriptPtr);
 	scriptPtr += 2;
 
 	engine->freezeTime();
 	if (engine->_text->showDialogueBubble) {
-		engine->_redraw->drawBubble(actorIdx);
+		engine->_redraw->drawBubble(ctx.actorIdx);
 	}
-	engine->_text->setFontCrossColor(actor->talkColor);
+	engine->_text->setFontCrossColor(ctx.actor->talkColor);
 	engine->_gameState->processGameChoices(choiceIdx);
 	engine->_gameState->numChoices = 0;
 	engine->unfreezeTime();
@@ -1090,17 +1095,17 @@ static int32 lASK_CHOICE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor
 }
 
 /*0x46*/
-static int32 lBIG_MESSAGE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lBIG_MESSAGE(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 textIdx = *((int16 *)scriptPtr);
 	scriptPtr += 2;
 
 	engine->freezeTime();
 	engine->_text->textClipFull();
 	if (engine->_text->showDialogueBubble) {
-		engine->_redraw->drawBubble(actorIdx);
+		engine->_redraw->drawBubble(ctx.actorIdx);
 	}
-	engine->_text->setFontCrossColor(actor->talkColor);
-	engine->_scene->talkingActor = actorIdx;
+	engine->_text->setFontCrossColor(ctx.actor->talkColor);
+	engine->_scene->talkingActor = ctx.actorIdx;
 	engine->_text->drawTextFullscreen(textIdx);
 	engine->_text->textClipSmall();
 	engine->unfreezeTime();
@@ -1110,7 +1115,7 @@ static int32 lBIG_MESSAGE(TwinEEngine *engine, int32 actorIdx, ActorStruct *acto
 }
 
 /*0x47*/
-static int32 lINIT_PINGOUIN(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lINIT_PINGOUIN(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 pingouinActor = *(scriptPtr++);
 	engine->_scene->mecaPinguinIdx = pingouinActor;
 	ActorStruct *mecaPinguin = engine->_scene->getActor(pingouinActor);
@@ -1121,7 +1126,7 @@ static int32 lINIT_PINGOUIN(TwinEEngine *engine, int32 actorIdx, ActorStruct *ac
 }
 
 /*0x48*/
-static int32 lSET_HOLO_POS(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_HOLO_POS(TwinEEngine *engine, ScriptContext& ctx) {
 	static int32 location = *(scriptPtr++);
 	engine->_holomap->setHolomapPosition(location);
 	if (engine->_gameState->gameFlags[InventoryItems::kiHolomap]) {
@@ -1132,14 +1137,14 @@ static int32 lSET_HOLO_POS(TwinEEngine *engine, int32 actorIdx, ActorStruct *act
 }
 
 /*0x49*/
-static int32 lCLR_HOLO_POS(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lCLR_HOLO_POS(TwinEEngine *engine, ScriptContext& ctx) {
 	static int32 location = *(scriptPtr++);
 	engine->_holomap->clearHolomapPosition(location);
 	return 0;
 }
 
 /*0x4A*/
-static int32 lADD_FUEL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lADD_FUEL(TwinEEngine *engine, ScriptContext& ctx) {
 	engine->_gameState->inventoryNumGas += *(scriptPtr++);
 	if (engine->_gameState->inventoryNumGas > 100) {
 		engine->_gameState->inventoryNumGas = 100;
@@ -1148,7 +1153,7 @@ static int32 lADD_FUEL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor)
 }
 
 /*0x4B*/
-static int32 lSUB_FUEL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSUB_FUEL(TwinEEngine *engine, ScriptContext& ctx) {
 	engine->_gameState->inventoryNumGas -= *(scriptPtr++);
 	if (engine->_gameState->inventoryNumGas < 0) {
 		engine->_gameState->inventoryNumGas = 0;
@@ -1157,18 +1162,18 @@ static int32 lSUB_FUEL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor)
 }
 
 /*0x4C*/
-static int32 lSET_GRM(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_GRM(TwinEEngine *engine, ScriptContext& ctx) {
 	engine->_grid->cellingGridIdx = *(scriptPtr++);
 	engine->_grid->initCellingGrid(engine->_grid->cellingGridIdx);
 	return 0;
 }
 
 /*0x4D*/
-static int32 lSAY_MESSAGE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSAY_MESSAGE(TwinEEngine *engine, ScriptContext& ctx) {
 	int16 textEntry = *((int16 *)scriptPtr);
 	scriptPtr += 2;
 
-	engine->_redraw->addOverlay(koText, textEntry, 0, 0, actorIdx, koFollowActor, 2);
+	engine->_redraw->addOverlay(koText, textEntry, 0, 0, ctx.actorIdx, koFollowActor, 2);
 
 	engine->freezeTime();
 	engine->_text->initVoxToPlay(textEntry);
@@ -1178,7 +1183,7 @@ static int32 lSAY_MESSAGE(TwinEEngine *engine, int32 actorIdx, ActorStruct *acto
 }
 
 /*04E*/
-static int32 lSAY_MESSAGE_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSAY_MESSAGE_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 otherActorIdx = *(scriptPtr++);
 	int16 textEntry = *((int16 *)scriptPtr);
 	scriptPtr += 2;
@@ -1193,23 +1198,23 @@ static int32 lSAY_MESSAGE_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *
 }
 
 /*0x4F*/
-static int32 lFULL_POINT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lFULL_POINT(TwinEEngine *engine, ScriptContext& ctx) {
 	engine->_scene->sceneHero->life = 50;
 	engine->_gameState->inventoryMagicPoints = engine->_gameState->magicLevelIdx * 20;
 	return 0;
 }
 
 /*0x50*/
-static int32 lBETA(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lBETA(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 newAngle = *((int16 *)scriptPtr);
 	scriptPtr += 2;
-	actor->angle = newAngle;
-	engine->_movements->clearRealAngle(actor);
+	ctx.actor->angle = newAngle;
+	engine->_movements->clearRealAngle(ctx.actor);
 	return 0;
 }
 
 /*0x51*/
-static int32 lGRM_OFF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lGRM_OFF(TwinEEngine *engine, ScriptContext& ctx) {
 	if (engine->_grid->cellingGridIdx != -1) {
 		engine->_grid->useCellingGrid = -1;
 		engine->_grid->cellingGridIdx = -1;
@@ -1221,7 +1226,7 @@ static int32 lGRM_OFF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
 }
 
 /*0x52*/
-static int32 lFADE_PAL_RED(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lFADE_PAL_RED(TwinEEngine *engine, ScriptContext& ctx) {
 	engine->freezeTime();
 	engine->_screens->fadePalRed(engine->_screens->mainPaletteRGBA);
 	engine->_screens->useAlternatePalette = false;
@@ -1230,7 +1235,7 @@ static int32 lFADE_PAL_RED(TwinEEngine *engine, int32 actorIdx, ActorStruct *act
 }
 
 /*0x53*/
-static int32 lFADE_ALARM_RED(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lFADE_ALARM_RED(TwinEEngine *engine, ScriptContext& ctx) {
 	engine->freezeTime();
 	engine->_hqrdepack->hqrGetEntry(engine->_screens->palette, Resources::HQR_RESS_FILE, RESSHQR_ALARMREDPAL);
 	engine->_screens->convertPalToRGBA(engine->_screens->palette, engine->_screens->paletteRGBA);
@@ -1241,7 +1246,7 @@ static int32 lFADE_ALARM_RED(TwinEEngine *engine, int32 actorIdx, ActorStruct *a
 }
 
 /*0x54*/
-static int32 lFADE_ALARM_PAL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lFADE_ALARM_PAL(TwinEEngine *engine, ScriptContext& ctx) {
 	engine->freezeTime();
 	engine->_hqrdepack->hqrGetEntry(engine->_screens->palette, Resources::HQR_RESS_FILE, RESSHQR_ALARMREDPAL);
 	engine->_screens->convertPalToRGBA(engine->_screens->palette, engine->_screens->paletteRGBA);
@@ -1252,7 +1257,7 @@ static int32 lFADE_ALARM_PAL(TwinEEngine *engine, int32 actorIdx, ActorStruct *a
 }
 
 /*0x55*/
-static int32 lFADE_RED_PAL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lFADE_RED_PAL(TwinEEngine *engine, ScriptContext& ctx) {
 	engine->freezeTime();
 	engine->_screens->fadeRedPal(engine->_screens->mainPaletteRGBA);
 	engine->_screens->useAlternatePalette = false;
@@ -1261,7 +1266,7 @@ static int32 lFADE_RED_PAL(TwinEEngine *engine, int32 actorIdx, ActorStruct *act
 }
 
 /*0x56*/
-static int32 lFADE_RED_ALARM(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lFADE_RED_ALARM(TwinEEngine *engine, ScriptContext& ctx) {
 	engine->freezeTime();
 	engine->_hqrdepack->hqrGetEntry(engine->_screens->palette, Resources::HQR_RESS_FILE, RESSHQR_ALARMREDPAL);
 	engine->_screens->convertPalToRGBA(engine->_screens->palette, engine->_screens->paletteRGBA);
@@ -1272,7 +1277,7 @@ static int32 lFADE_RED_ALARM(TwinEEngine *engine, int32 actorIdx, ActorStruct *a
 }
 
 /*0x57*/
-static int32 lFADE_PAL_ALARM(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lFADE_PAL_ALARM(TwinEEngine *engine, ScriptContext& ctx) {
 	engine->freezeTime();
 	engine->_hqrdepack->hqrGetEntry(engine->_screens->palette, Resources::HQR_RESS_FILE, RESSHQR_ALARMREDPAL);
 	engine->_screens->convertPalToRGBA(engine->_screens->palette, engine->_screens->paletteRGBA);
@@ -1283,7 +1288,7 @@ static int32 lFADE_PAL_ALARM(TwinEEngine *engine, int32 actorIdx, ActorStruct *a
 }
 
 /*0x58*/
-static int32 lEXPLODE_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lEXPLODE_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 otherActorIdx = *(scriptPtr++);
 	ActorStruct *otherActor = engine->_scene->getActor(otherActorIdx);
 
@@ -1293,19 +1298,19 @@ static int32 lEXPLODE_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *acto
 }
 
 /*0x59*/
-static int32 lBUBBLE_ON(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lBUBBLE_ON(TwinEEngine *engine, ScriptContext& ctx) {
 	engine->_text->showDialogueBubble = 1;
 	return 0;
 }
 
 /*0x5A*/
-static int32 lBUBBLE_OFF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lBUBBLE_OFF(TwinEEngine *engine, ScriptContext& ctx) {
 	engine->_text->showDialogueBubble = 1;
 	return 0;
 }
 
 /*0x5B*/
-static int32 lASK_CHOICE_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lASK_CHOICE_OBJ(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 otherActorIdx = *(scriptPtr++);
 	int32 choiceIdx = *((int16 *)scriptPtr);
 	scriptPtr += 2;
@@ -1324,7 +1329,7 @@ static int32 lASK_CHOICE_OBJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *a
 }
 
 /*0x5C*/
-static int32 lSET_DARK_PAL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_DARK_PAL(TwinEEngine *engine, ScriptContext& ctx) {
 	engine->freezeTime();
 	engine->_hqrdepack->hqrGetEntry(engine->_screens->palette, Resources::HQR_RESS_FILE, RESSHQR_DARKPAL);
 	if (!engine->_screens->lockPalette) {
@@ -1337,7 +1342,7 @@ static int32 lSET_DARK_PAL(TwinEEngine *engine, int32 actorIdx, ActorStruct *act
 }
 
 /*0x5D*/
-static int32 lSET_NORMAL_PAL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lSET_NORMAL_PAL(TwinEEngine *engine, ScriptContext& ctx) {
 	engine->_screens->useAlternatePalette = false;
 	if (!engine->_screens->lockPalette) {
 		engine->setPalette(engine->_screens->mainPaletteRGBA);
@@ -1346,7 +1351,7 @@ static int32 lSET_NORMAL_PAL(TwinEEngine *engine, int32 actorIdx, ActorStruct *a
 }
 
 /*0x5E*/
-static int32 lMESSAGE_SENDELL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lMESSAGE_SENDELL(TwinEEngine *engine, ScriptContext& ctx) {
 	engine->freezeTime();
 	engine->_screens->fadeToBlack(engine->_screens->paletteRGBA);
 	engine->_screens->loadImage(25);
@@ -1374,24 +1379,24 @@ static int32 lMESSAGE_SENDELL(TwinEEngine *engine, int32 actorIdx, ActorStruct *
 }
 
 /*0x5F*/
-static int32 lANIM_SET(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lANIM_SET(TwinEEngine *engine, ScriptContext& ctx) {
 	AnimationTypes animIdx = (AnimationTypes)*(scriptPtr++);
 
-	actor->anim = kAnimNone;
-	actor->previousAnimIdx = -1;
-	engine->_animations->initAnim(animIdx, 0, 0, actorIdx);
+	ctx.actor->anim = kAnimNone;
+	ctx.actor->previousAnimIdx = -1;
+	engine->_animations->initAnim(animIdx, 0, 0, ctx.actorIdx);
 
 	return 0;
 }
 
 /*0x60*/
-static int32 lHOLOMAP_TRAJ(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lHOLOMAP_TRAJ(TwinEEngine *engine, ScriptContext& ctx) {
 	scriptPtr++; // TODO
 	return -1;
 }
 
 /*0x61*/
-static int32 lGAME_OVER(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lGAME_OVER(TwinEEngine *engine, ScriptContext& ctx) {
 	engine->_scene->sceneHero->dynamicFlags.bAnimEnded = 1;
 	engine->_scene->sceneHero->life = 0;
 	engine->_gameState->inventoryNumLeafs = 0;
@@ -1399,7 +1404,7 @@ static int32 lGAME_OVER(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor)
 }
 
 /*0x62*/
-static int32 lTHE_END(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lTHE_END(TwinEEngine *engine, ScriptContext& ctx) {
 	engine->quitGame = 1;
 	engine->_gameState->inventoryNumLeafs = 0;
 	engine->_scene->sceneHero->life = 50;
@@ -1413,20 +1418,20 @@ static int32 lTHE_END(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
 }
 
 /*0x63*/
-static int32 lMIDI_OFF(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lMIDI_OFF(TwinEEngine *engine, ScriptContext& ctx) {
 	engine->_music->stopMidiMusic();
 	return 0;
 }
 
 /*0x64*/
-static int32 lPLAY_CD_TRACK(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lPLAY_CD_TRACK(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 track = *(scriptPtr++);
 	engine->_music->playTrackMusic(track);
 	return 0;
 }
 
 /*0x65*/
-static int32 lPROJ_ISO(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lPROJ_ISO(TwinEEngine *engine, ScriptContext& ctx) {
 	engine->_renderer->setOrthoProjection(311, 240, 512);
 	engine->_renderer->setBaseTranslation(0, 0, 0);
 	engine->_renderer->setBaseRotation(0, 0, 0);
@@ -1435,7 +1440,7 @@ static int32 lPROJ_ISO(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor)
 }
 
 /*0x66*/
-static int32 lPROJ_3D(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lPROJ_3D(TwinEEngine *engine, ScriptContext& ctx) {
 	engine->_screens->copyScreen(engine->frontVideoBuffer, engine->workVideoBuffer);
 	engine->flip();
 	engine->_scene->changeRoomVar10 = 0;
@@ -1450,7 +1455,7 @@ static int32 lPROJ_3D(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
 }
 
 /*0x67*/
-static int32 lTEXT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lTEXT(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 textIdx = *((int16 *)scriptPtr);
 	scriptPtr += 2;
 
@@ -1478,7 +1483,7 @@ static int32 lTEXT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
 }
 
 /*0x68*/
-static int32 lCLEAR_TEXT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lCLEAR_TEXT(TwinEEngine *engine, ScriptContext& ctx) {
 	drawVar1 = 0;
 	engine->_interface->drawSplittedBox(0, 0, 639, 240, 0);
 	engine->copyBlockPhys(0, 0, 639, 240);
@@ -1486,7 +1491,7 @@ static int32 lCLEAR_TEXT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor
 }
 
 /*0x69*/
-static int32 lBRUTAL_EXIT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 lBRUTAL_EXIT(TwinEEngine *engine, ScriptContext& ctx) {
 	engine->quitGame = 0;
 	return 1; // break
 }
@@ -1613,12 +1618,13 @@ void ScriptLife::processLifeScript(int32 actorIdx) {
 
 	int32 end = -2;
 
+	ScriptContext ctx{actorIdx, actor};
 	do {
 		opcodePtr = scriptPtr;
 		int32 scriptOpcode = *(scriptPtr++);
 
 		if (scriptOpcode >= 0 && scriptOpcode < ARRAYSIZE(function_map)) {
-			end = function_map[scriptOpcode].function(_engine, actorIdx, actor);
+			end = function_map[scriptOpcode].function(_engine, ctx);
 		} else {
 			error("Actor %d with wrong offset/opcode - Offset: %d (opcode: %i)", actorIdx, actor->positionInLifeScript, scriptOpcode);
 		}
diff --git a/engines/twine/script_move_v1.cpp b/engines/twine/script_move_v1.cpp
index d966360bef..58c1e07f06 100644
--- a/engines/twine/script_move_v1.cpp
+++ b/engines/twine/script_move_v1.cpp
@@ -36,14 +36,18 @@ namespace TwinE {
 
 static uint8 *scriptPtr = nullptr;
 static int32 scriptPosition = 0;
-static ActorMoveStruct *move = nullptr;
 static int32 numRepeatSample = 1;
 
+struct ScriptContext {
+	int32 actorIdx;
+	ActorStruct *actor;
+};
+
 /** Returns:
 	   -1 - Need implementation
 		0 - Completed
 		1 - Break script */
-typedef int32 ScriptMoveFunc(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor);
+typedef int32 ScriptMoveFunc(TwinEEngine *engine, ScriptContext& ctx);
 
 struct ScriptMoveFunction {
 	const char *name;
@@ -54,39 +58,39 @@ struct ScriptMoveFunction {
 	{ name, func }
 
 /*0x00*/
-static int32 mEND(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	actor->positionInMoveScript = -1;
+static int32 mEND(TwinEEngine *engine, ScriptContext& ctx) {
+	ctx.actor->positionInMoveScript = -1;
 	return 1;
 }
 
 /*0x01*/
-static int32 mNOP(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 mNOP(TwinEEngine *engine, ScriptContext& ctx) {
 	return 0;
 }
 
 /*0x02*/
-static int32 mBODY(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 mBODY(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 bodyIdx = *(scriptPtr);
-	engine->_actor->initModelActor(bodyIdx, actorIdx);
-	actor->positionInMoveScript++;
+	engine->_actor->initModelActor(bodyIdx, ctx.actorIdx);
+	ctx.actor->positionInMoveScript++;
 	return 0;
 }
 
 /*0x03*/
-static int32 mANIM(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 mANIM(TwinEEngine *engine, ScriptContext& ctx) {
 	AnimationTypes animIdx = (AnimationTypes) * (scriptPtr++);
-	if (engine->_animations->initAnim(animIdx, 0, 0, actorIdx)) {
-		actor->positionInMoveScript++;
+	if (engine->_animations->initAnim(animIdx, 0, 0, ctx.actorIdx)) {
+		ctx.actor->positionInMoveScript++;
 	} else {
-		actor->positionInMoveScript = scriptPosition;
+		ctx.actor->positionInMoveScript = scriptPosition;
 		return 1;
 	}
 	return 0;
 }
 
 /*0x04*/
-static int32 mGOTO_POINT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	actor->positionInMoveScript++;
+static int32 mGOTO_POINT(TwinEEngine *engine, ScriptContext& ctx) {
+	ctx.actor->positionInMoveScript++;
 	engine->_scene->currentScriptValue = *(scriptPtr);
 
 	const ScenePoint &sp = engine->_scene->sceneTracks[engine->_scene->currentScriptValue];
@@ -94,16 +98,16 @@ static int32 mGOTO_POINT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor
 	engine->_renderer->destY = sp.y;
 	engine->_renderer->destZ = sp.z;
 
-	const int32 newAngle = engine->_movements->getAngleAndSetTargetActorDistance(actor->x, actor->z, sp.x, sp.z);
+	const int32 newAngle = engine->_movements->getAngleAndSetTargetActorDistance(ctx.actor->x, ctx.actor->z, sp.x, sp.z);
 
-	if (actor->staticFlags.bIsSpriteActor) {
-		actor->angle = newAngle;
+	if (ctx.actor->staticFlags.bIsSpriteActor) {
+		ctx.actor->angle = newAngle;
 	} else {
-		engine->_movements->moveActor(actor->angle, newAngle, actor->speed, &actor->move);
+		engine->_movements->moveActor(ctx.actor->angle, newAngle, ctx.actor->speed, &ctx.actor->move);
 	}
 
 	if (engine->_movements->targetActorDistance > 500) {
-		actor->positionInMoveScript -= 2;
+		ctx.actor->positionInMoveScript -= 2;
 		return 1;
 	}
 
@@ -111,42 +115,42 @@ static int32 mGOTO_POINT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor
 }
 
 /*0x05*/
-static int32 mWAIT_ANIM(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	if (!actor->dynamicFlags.bAnimEnded) {
-		actor->positionInMoveScript--;
+static int32 mWAIT_ANIM(TwinEEngine *engine, ScriptContext& ctx) {
+	if (!ctx.actor->dynamicFlags.bAnimEnded) {
+		ctx.actor->positionInMoveScript--;
 	} else {
-		engine->_movements->clearRealAngle(actor);
+		engine->_movements->clearRealAngle(ctx.actor);
 	}
 	return 1;
 }
 
 /*0x06*/
-static int32 mLOOP(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 mLOOP(TwinEEngine *engine, ScriptContext& ctx) {
 	// TODO
 	return -1;
 }
 
 /*0x07*/
-static int32 mANGLE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	actor->positionInMoveScript += 2;
-	if (actor->staticFlags.bIsSpriteActor) {
+static int32 mANGLE(TwinEEngine *engine, ScriptContext& ctx) {
+	ctx.actor->positionInMoveScript += 2;
+	if (ctx.actor->staticFlags.bIsSpriteActor) {
 		return 0;
 	}
 	engine->_scene->currentScriptValue = *((int16 *)scriptPtr);
-	if (actor->move.numOfStep == 0) {
-		engine->_movements->moveActor(actor->angle, engine->_scene->currentScriptValue, actor->speed, move);
+	if (ctx.actor->move.numOfStep == 0) {
+		engine->_movements->moveActor(ctx.actor->angle, engine->_scene->currentScriptValue, ctx.actor->speed, move);
 	}
-	if (actor->angle == engine->_scene->currentScriptValue) {
-		engine->_movements->clearRealAngle(actor);
+	if (ctx.actor->angle == engine->_scene->currentScriptValue) {
+		engine->_movements->clearRealAngle(ctx.actor);
 		return 0;
 	}
-	actor->positionInMoveScript -= 3;
+	ctx.actor->positionInMoveScript -= 3;
 	return 1;
 }
 
 /*0x08*/
-static int32 mPOS_POINT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	actor->positionInMoveScript++;
+static int32 mPOS_POINT(TwinEEngine *engine, ScriptContext& ctx) {
+	ctx.actor->positionInMoveScript++;
 	engine->_scene->currentScriptValue = *(scriptPtr);
 
 	const ScenePoint &sp = engine->_scene->sceneTracks[engine->_scene->currentScriptValue];
@@ -154,40 +158,40 @@ static int32 mPOS_POINT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor)
 	engine->_renderer->destY = sp.y;
 	engine->_renderer->destZ = sp.z;
 
-	if (actor->staticFlags.bIsSpriteActor) {
-		actor->speed = 0;
+	if (ctx.actor->staticFlags.bIsSpriteActor) {
+		ctx.actor->speed = 0;
 	}
 
-	actor->x = sp.x;
-	actor->y = sp.y;
-	actor->z = sp.z;
+	ctx.actor->x = sp.x;
+	ctx.actor->y = sp.y;
+	ctx.actor->z = sp.z;
 
 	return 0;
 }
 
 /*0x09*/
-static int32 mLABEL(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	actor->labelIdx = *(scriptPtr);
-	actor->positionInMoveScript++;
-	actor->currentLabelPtr = actor->positionInMoveScript - 2;
+static int32 mLABEL(TwinEEngine *engine, ScriptContext& ctx) {
+	ctx.actor->labelIdx = *(scriptPtr);
+	ctx.actor->positionInMoveScript++;
+	ctx.actor->currentLabelPtr = ctx.actor->positionInMoveScript - 2;
 	return 0;
 }
 
 /*0x0A*/
-static int32 mGOTO(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	actor->positionInMoveScript = *((int16 *)scriptPtr);
+static int32 mGOTO(TwinEEngine *engine, ScriptContext& ctx) {
+	ctx.actor->positionInMoveScript = *((int16 *)scriptPtr);
 	return 0;
 }
 
 /*0x0B*/
-static int32 mSTOP(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	actor->positionInMoveScript = -1;
+static int32 mSTOP(TwinEEngine *engine, ScriptContext& ctx) {
+	ctx.actor->positionInMoveScript = -1;
 	return 1;
 }
 
 /*0x0C*/
-static int32 mGOTO_SYM_POINT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	actor->positionInMoveScript++;
+static int32 mGOTO_SYM_POINT(TwinEEngine *engine, ScriptContext& ctx) {
+	ctx.actor->positionInMoveScript++;
 	engine->_scene->currentScriptValue = *(scriptPtr);
 
 	const ScenePoint &sp = engine->_scene->sceneTracks[engine->_scene->currentScriptValue];
@@ -195,16 +199,16 @@ static int32 mGOTO_SYM_POINT(TwinEEngine *engine, int32 actorIdx, ActorStruct *a
 	engine->_renderer->destY = sp.y;
 	engine->_renderer->destZ = sp.z;
 
-	const int32 newAngle = 0x200 + engine->_movements->getAngleAndSetTargetActorDistance(actor->x, actor->z, sp.x, sp.z);
+	const int32 newAngle = 0x200 + engine->_movements->getAngleAndSetTargetActorDistance(ctx.actor->x, ctx.actor->z, sp.x, sp.z);
 
-	if (actor->staticFlags.bIsSpriteActor) {
-		actor->angle = newAngle;
+	if (ctx.actor->staticFlags.bIsSpriteActor) {
+		ctx.actor->angle = newAngle;
 	} else {
-		engine->_movements->moveActor(actor->angle, newAngle, actor->speed, &actor->move);
+		engine->_movements->moveActor(ctx.actor->angle, newAngle, ctx.actor->speed, &ctx.actor->move);
 	}
 
 	if (engine->_movements->targetActorDistance > 500) {
-		actor->positionInMoveScript -= 2;
+		ctx.actor->positionInMoveScript -= 2;
 		return 1;
 	}
 
@@ -212,11 +216,11 @@ static int32 mGOTO_SYM_POINT(TwinEEngine *engine, int32 actorIdx, ActorStruct *a
 }
 
 /*0x0D*/
-static int32 mWAIT_NUM_ANIM(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	actor->positionInMoveScript += 2;
+static int32 mWAIT_NUM_ANIM(TwinEEngine *engine, ScriptContext& ctx) {
+	ctx.actor->positionInMoveScript += 2;
 
 	bool abortMove = 0;
-	if (actor->dynamicFlags.bAnimEnded) {
+	if (ctx.actor->dynamicFlags.bAnimEnded) {
 		int32 animPos, animRepeats;
 
 		animRepeats = *(scriptPtr);
@@ -236,25 +240,25 @@ static int32 mWAIT_NUM_ANIM(TwinEEngine *engine, int32 actorIdx, ActorStruct *ac
 	}
 
 	if (abortMove == 1) {
-		actor->positionInMoveScript -= 3;
+		ctx.actor->positionInMoveScript -= 3;
 	}
 
 	return abortMove;
 }
 
 /*0x0E*/
-static int32 mSAMPLE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 mSAMPLE(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 sampleIdx = *((int16 *)scriptPtr);
-	engine->_sound->playSample(sampleIdx, 0x1000, 1, actor->x, actor->y, actor->z, actorIdx);
-	actor->positionInMoveScript += 2;
+	engine->_sound->playSample(sampleIdx, 0x1000, 1, ctx.actor->x, ctx.actor->y, ctx.actor->z, ctx.actorIdx);
+	ctx.actor->positionInMoveScript += 2;
 	return 0;
 }
 
 /*0x0F*/
-static int32 mGOTO_POINT_3D(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	actor->positionInMoveScript++;
+static int32 mGOTO_POINT_3D(TwinEEngine *engine, ScriptContext& ctx) {
+	ctx.actor->positionInMoveScript++;
 
-	if (!actor->staticFlags.bIsSpriteActor) {
+	if (!ctx.actor->staticFlags.bIsSpriteActor) {
 		return 0;
 	}
 
@@ -265,48 +269,47 @@ static int32 mGOTO_POINT_3D(TwinEEngine *engine, int32 actorIdx, ActorStruct *ac
 	engine->_renderer->destY = sp.y;
 	engine->_renderer->destZ = sp.z;
 
-	actor->angle = engine->_movements->getAngleAndSetTargetActorDistance(actor->x, actor->z, sp.x, sp.z);
-	actor->animType = engine->_movements->getAngleAndSetTargetActorDistance(actor->y, 0, sp.y, engine->_movements->targetActorDistance);
+	ctx.actor->angle = engine->_movements->getAngleAndSetTargetActorDistance(ctx.actor->x, ctx.actor->z, sp.x, sp.z);
+	ctx.actor->animType = engine->_movements->getAngleAndSetTargetActorDistance(ctx.actor->y, 0, sp.y, engine->_movements->targetActorDistance);
 
 	if (engine->_movements->targetActorDistance > 100) {
-		actor->positionInMoveScript -= 2;
+		ctx.actor->positionInMoveScript -= 2;
 		return 1;
-	} else {
-		actor->x = sp.x;
-		actor->y = sp.y;
-		actor->z = sp.z;
 	}
+	ctx.actor->x = sp.x;
+	ctx.actor->y = sp.y;
+	ctx.actor->z = sp.z;
 
 	return 0;
 }
 
 /*0x10*/
-static int32 mSPEED(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	actor->positionInMoveScript += 2;
-	actor->speed = *((int16 *)scriptPtr);
+static int32 mSPEED(TwinEEngine *engine, ScriptContext& ctx) {
+	ctx.actor->positionInMoveScript += 2;
+	ctx.actor->speed = *((int16 *)scriptPtr);
 
-	if (actor->staticFlags.bIsSpriteActor) {
-		engine->_movements->setActorAngle(0, actor->speed, 50, move);
+	if (ctx.actor->staticFlags.bIsSpriteActor) {
+		engine->_movements->setActorAngle(0, ctx.actor->speed, 50, &ctx.actor->move);
 	}
 
 	return 0;
 }
 
 /*0x11*/
-static int32 mBACKGROUND(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	actor->positionInMoveScript++;
+static int32 mBACKGROUND(TwinEEngine *engine, ScriptContext& ctx) {
+	ctx.actor->positionInMoveScript++;
 
 	if (*scriptPtr != 0) {
-		if (!actor->staticFlags.bIsBackgrounded) {
-			actor->staticFlags.bIsBackgrounded = 1;
-			if (actor->dynamicFlags.bIsVisible) {
+		if (!ctx.actor->staticFlags.bIsBackgrounded) {
+			ctx.actor->staticFlags.bIsBackgrounded = 1;
+			if (ctx.actor->dynamicFlags.bIsVisible) {
 				engine->_redraw->reqBgRedraw = true;
 			}
 		}
 	} else {
-		if (actor->staticFlags.bIsBackgrounded) {
-			actor->staticFlags.bIsBackgrounded = 0;
-			if (actor->dynamicFlags.bIsVisible) {
+		if (ctx.actor->staticFlags.bIsBackgrounded) {
+			ctx.actor->staticFlags.bIsBackgrounded = 0;
+			if (ctx.actor->dynamicFlags.bIsVisible) {
 				engine->_redraw->reqBgRedraw = true;
 			}
 		}
@@ -316,8 +319,8 @@ static int32 mBACKGROUND(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor
 }
 
 /*0x12*/
-static int32 mWAIT_NUM_SECOND(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	actor->positionInMoveScript += 5;
+static int32 mWAIT_NUM_SECOND(TwinEEngine *engine, ScriptContext& ctx) {
+	ctx.actor->positionInMoveScript += 5;
 
 	const int32 numSeconds = *(scriptPtr++);
 	int32 currentTime = *((int32 *)scriptPtr);
@@ -328,7 +331,7 @@ static int32 mWAIT_NUM_SECOND(TwinEEngine *engine, int32 actorIdx, ActorStruct *
 	}
 
 	if (engine->lbaTime < currentTime) {
-		actor->positionInMoveScript -= 6;
+		ctx.actor->positionInMoveScript -= 6;
 		return 1;
 	} else {
 		*((int32 *)scriptPtr) = 0;
@@ -338,93 +341,93 @@ static int32 mWAIT_NUM_SECOND(TwinEEngine *engine, int32 actorIdx, ActorStruct *
 }
 
 /*0x13*/
-static int32 mNO_BODY(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	engine->_actor->initModelActor(-1, actorIdx);
+static int32 mNO_BODY(TwinEEngine *engine, ScriptContext& ctx) {
+	engine->_actor->initModelActor(-1, ctx.actorIdx);
 	return 0;
 }
 
 /*0x14*/
-static int32 mBETA(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 mBETA(TwinEEngine *engine, ScriptContext& ctx) {
 	const int16 beta = *((int16 *)scriptPtr);
-	actor->positionInMoveScript += 2;
+	ctx.actor->positionInMoveScript += 2;
 
-	actor->angle = beta;
+	ctx.actor->angle = beta;
 
-	if (actor->staticFlags.bIsSpriteActor) {
-		engine->_movements->clearRealAngle(actor);
+	if (ctx.actor->staticFlags.bIsSpriteActor) {
+		engine->_movements->clearRealAngle(ctx.actor);
 	}
 
 	return 0;
 }
 
 /*0x15*/
-static int32 mOPEN_LEFT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	actor->positionInMoveScript += 2;
-	if (actor->staticFlags.bIsSpriteActor && actor->staticFlags.bUsesClipping) {
-		actor->angle = 0x300;
-		actor->doorStatus = *((int16 *)scriptPtr);
-		actor->dynamicFlags.bIsSpriteMoving = 1;
-		actor->speed = 1000;
-		engine->_movements->setActorAngle(0, 1000, 50, move);
+static int32 mOPEN_LEFT(TwinEEngine *engine, ScriptContext& ctx) {
+	ctx.actor->positionInMoveScript += 2;
+	if (ctx.actor->staticFlags.bIsSpriteActor && ctx.actor->staticFlags.bUsesClipping) {
+		ctx.actor->angle = 0x300;
+		ctx.actor->doorStatus = *((int16 *)scriptPtr);
+		ctx.actor->dynamicFlags.bIsSpriteMoving = 1;
+		ctx.actor->speed = 1000;
+		engine->_movements->setActorAngle(0, 1000, 50, &ctx.actor->move);
 	}
 	return 0;
 }
 
 /*0x16*/
-static int32 mOPEN_RIGHT(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	actor->positionInMoveScript += 2;
-	if (actor->staticFlags.bIsSpriteActor && actor->staticFlags.bUsesClipping) {
-		actor->angle = 0x100;
-		actor->doorStatus = *((int16 *)scriptPtr);
-		actor->dynamicFlags.bIsSpriteMoving = 1;
-		actor->speed = 1000;
-		engine->_movements->setActorAngle(0, 1000, 50, move);
+static int32 mOPEN_RIGHT(TwinEEngine *engine, ScriptContext& ctx) {
+	ctx.actor->positionInMoveScript += 2;
+	if (ctx.actor->staticFlags.bIsSpriteActor && ctx.actor->staticFlags.bUsesClipping) {
+		ctx.actor->angle = 0x100;
+		ctx.actor->doorStatus = *((int16 *)scriptPtr);
+		ctx.actor->dynamicFlags.bIsSpriteMoving = 1;
+		ctx.actor->speed = 1000;
+		engine->_movements->setActorAngle(0, 1000, 50, &ctx.actor->move);
 	}
 	return 0;
 }
 
 /*0x17*/
-static int32 mOPEN_UP(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	actor->positionInMoveScript += 2;
-	if (actor->staticFlags.bIsSpriteActor && actor->staticFlags.bUsesClipping) {
-		actor->angle = 0x200;
-		actor->doorStatus = *((int16 *)scriptPtr);
-		actor->dynamicFlags.bIsSpriteMoving = 1;
-		actor->speed = 1000;
-		engine->_movements->setActorAngle(0, 1000, 50, move);
+static int32 mOPEN_UP(TwinEEngine *engine, ScriptContext& ctx) {
+	ctx.actor->positionInMoveScript += 2;
+	if (ctx.actor->staticFlags.bIsSpriteActor && ctx.actor->staticFlags.bUsesClipping) {
+		ctx.actor->angle = 0x200;
+		ctx.actor->doorStatus = *((int16 *)scriptPtr);
+		ctx.actor->dynamicFlags.bIsSpriteMoving = 1;
+		ctx.actor->speed = 1000;
+		engine->_movements->setActorAngle(0, 1000, 50, &ctx.actor->move);
 	}
 	return 0;
 }
 
 /*0x18*/
-static int32 mOPEN_DOWN(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	actor->positionInMoveScript += 2;
-	if (actor->staticFlags.bIsSpriteActor && actor->staticFlags.bUsesClipping) {
-		actor->angle = 0;
-		actor->doorStatus = *((int16 *)scriptPtr);
-		actor->dynamicFlags.bIsSpriteMoving = 1;
-		actor->speed = 1000;
-		engine->_movements->setActorAngle(0, 1000, 50, move);
+static int32 mOPEN_DOWN(TwinEEngine *engine, ScriptContext& ctx) {
+	ctx.actor->positionInMoveScript += 2;
+	if (ctx.actor->staticFlags.bIsSpriteActor && ctx.actor->staticFlags.bUsesClipping) {
+		ctx.actor->angle = 0;
+		ctx.actor->doorStatus = *((int16 *)scriptPtr);
+		ctx.actor->dynamicFlags.bIsSpriteMoving = 1;
+		ctx.actor->speed = 1000;
+		engine->_movements->setActorAngle(0, 1000, 50, &ctx.actor->move);
 	}
 	return 0;
 }
 
 /*0x19*/
-static int32 mCLOSE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	if (actor->staticFlags.bIsSpriteActor && actor->staticFlags.bUsesClipping) {
-		actor->doorStatus = 0;
-		actor->dynamicFlags.bIsSpriteMoving = 1;
-		actor->speed = -1000;
-		engine->_movements->setActorAngle(0, -1000, 50, move);
+static int32 mCLOSE(TwinEEngine *engine, ScriptContext& ctx) {
+	if (ctx.actor->staticFlags.bIsSpriteActor && ctx.actor->staticFlags.bUsesClipping) {
+		ctx.actor->doorStatus = 0;
+		ctx.actor->dynamicFlags.bIsSpriteMoving = 1;
+		ctx.actor->speed = -1000;
+		engine->_movements->setActorAngle(0, -1000, 50, &ctx.actor->move);
 	}
 	return 0;
 }
 
 /*0x1A*/
-static int32 mWAIT_DOOR(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	if (actor->staticFlags.bIsSpriteActor && actor->staticFlags.bUsesClipping) {
-		if (actor->speed) {
-			actor->positionInMoveScript--;
+static int32 mWAIT_DOOR(TwinEEngine *engine, ScriptContext& ctx) {
+	if (ctx.actor->staticFlags.bIsSpriteActor && ctx.actor->staticFlags.bUsesClipping) {
+		if (ctx.actor->speed) {
+			ctx.actor->positionInMoveScript--;
 			return 1;
 		}
 	}
@@ -432,107 +435,105 @@ static int32 mWAIT_DOOR(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor)
 }
 
 /*0x1B*/
-static int32 mSAMPLE_RND(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 mSAMPLE_RND(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 freq = engine->getRandomNumber(2048) + 2048;
 	int32 sampleIdx = *((int16 *)scriptPtr);
-	engine->_sound->playSample(sampleIdx, freq, 1, actor->x, actor->y, actor->z, actorIdx);
-	actor->positionInMoveScript += 2;
+	engine->_sound->playSample(sampleIdx, freq, 1, ctx.actor->x, ctx.actor->y, ctx.actor->z, ctx.actorIdx);
+	ctx.actor->positionInMoveScript += 2;
 	return 0;
 }
 
 /*0x1C*/
-static int32 mSAMPLE_ALWAYS(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 mSAMPLE_ALWAYS(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 sampleIdx = *((int16 *)scriptPtr);
 	if (!engine->_sound->isSamplePlaying(sampleIdx)) { // if its not playing
-		engine->_sound->playSample(sampleIdx, 0x1000, -1, actor->x, actor->y, actor->z, actorIdx);
+		engine->_sound->playSample(sampleIdx, 0x1000, -1, ctx.actor->x, ctx.actor->y, ctx.actor->z, ctx.actorIdx);
 	}
-	actor->positionInMoveScript += 2;
+	ctx.actor->positionInMoveScript += 2;
 	return 0;
 }
 
 /*0x1D*/
-static int32 mSAMPLE_STOP(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 mSAMPLE_STOP(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 sampleIdx = *((int16 *)scriptPtr);
 	engine->_sound->stopSample(sampleIdx);
-	actor->positionInMoveScript += 2;
+	ctx.actor->positionInMoveScript += 2;
 	return 0;
 }
 
 /*0x1E*/
-static int32 mPLAY_FLA(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 mPLAY_FLA(TwinEEngine *engine, ScriptContext& ctx) {
 	// TODO
 	return -1;
 }
 
 /*0x1F*/
-static int32 mREPEAT_SAMPLE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 mREPEAT_SAMPLE(TwinEEngine *engine, ScriptContext& ctx) {
 	numRepeatSample = *((int16 *)scriptPtr);
-	actor->positionInMoveScript += 2;
+	ctx.actor->positionInMoveScript += 2;
 	return 0;
 }
 
 /*0x20*/
-static int32 mSIMPLE_SAMPLE(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
+static int32 mSIMPLE_SAMPLE(TwinEEngine *engine, ScriptContext& ctx) {
 	int32 sampleIdx = *((int16 *)scriptPtr);
-	engine->_sound->playSample(sampleIdx, 0x1000, numRepeatSample, actor->x, actor->y, actor->z, actorIdx);
+	engine->_sound->playSample(sampleIdx, 0x1000, numRepeatSample, ctx.actor->x, ctx.actor->y, ctx.actor->z, ctx.actorIdx);
 	numRepeatSample = 1;
-	actor->positionInMoveScript += 2;
+	ctx.actor->positionInMoveScript += 2;
 	return 0;
 }
 
 /*0x21*/
-static int32 mFACE_HERO(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	actor->positionInMoveScript += 2;
-	if (actor->staticFlags.bIsSpriteActor) {
+static int32 mFACE_HERO(TwinEEngine *engine, ScriptContext& ctx) {
+	ctx.actor->positionInMoveScript += 2;
+	if (ctx.actor->staticFlags.bIsSpriteActor) {
 		return 0;
 	}
 	engine->_scene->currentScriptValue = *((int16 *)scriptPtr);
-	if (engine->_scene->currentScriptValue == -1 && actor->move.numOfStep == 0) {
-		engine->_scene->currentScriptValue = engine->_movements->getAngleAndSetTargetActorDistance(actor->x, actor->z, engine->_scene->sceneHero->x, engine->_scene->sceneHero->z);
-		engine->_movements->moveActor(actor->angle, engine->_scene->currentScriptValue, actor->speed, &actor->move);
+	if (engine->_scene->currentScriptValue == -1 && ctx.actor->move.numOfStep == 0) {
+		engine->_scene->currentScriptValue = engine->_movements->getAngleAndSetTargetActorDistance(ctx.actor->x, ctx.actor->z, engine->_scene->sceneHero->x, engine->_scene->sceneHero->z);
+		engine->_movements->moveActor(ctx.actor->angle, engine->_scene->currentScriptValue, ctx.actor->speed, &ctx.actor->move);
 		*((int16 *)scriptPtr) = engine->_scene->currentScriptValue;
 	}
 
-	if (actor->angle != engine->_scene->currentScriptValue) {
-		actor->positionInMoveScript -= 3;
+	if (ctx.actor->angle != engine->_scene->currentScriptValue) {
+		ctx.actor->positionInMoveScript -= 3;
 		return 1;
-	} else {
-		engine->_movements->clearRealAngle(actor);
-		*((int16 *)scriptPtr) = -1;
 	}
+	engine->_movements->clearRealAngle(ctx.actor);
+	*((int16 *)scriptPtr) = -1;
 	return 0;
 }
 
 /*0x22*/
-static int32 mANGLE_RND(TwinEEngine *engine, int32 actorIdx, ActorStruct *actor) {
-	actor->positionInMoveScript += 4;
-	if (actor->staticFlags.bIsSpriteActor) {
+static int32 mANGLE_RND(TwinEEngine *engine, ScriptContext& ctx) {
+	ctx.actor->positionInMoveScript += 4;
+	if (ctx.actor->staticFlags.bIsSpriteActor) {
 		return 0;
 	}
 	engine->_scene->currentScriptValue = *((int16 *)scriptPtr + 2);
 
-	if (engine->_scene->currentScriptValue == -1 && actor->move.numOfStep == 0) {
+	if (engine->_scene->currentScriptValue == -1 && ctx.actor->move.numOfStep == 0) {
 		if (engine->getRandomNumber() & 1) {
 			engine->_scene->currentScriptValue = *((int16 *)scriptPtr);
-			const int32 newAngle = actor->angle + 0x100 + (ABS(engine->_scene->currentScriptValue) >> 1);
+			const int32 newAngle = ctx.actor->angle + 0x100 + (ABS(engine->_scene->currentScriptValue) >> 1);
 			engine->_scene->currentScriptValue = (newAngle - engine->getRandomNumber(engine->_scene->currentScriptValue)) & 0x3FF;
 		} else {
 			engine->_scene->currentScriptValue = *((int16 *)scriptPtr);
-			const int32 newAngle = actor->angle - 0x100 + (ABS(engine->_scene->currentScriptValue) >> 1);
+			const int32 newAngle = ctx.actor->angle - 0x100 + (ABS(engine->_scene->currentScriptValue) >> 1);
 			engine->_scene->currentScriptValue = (newAngle - engine->getRandomNumber(engine->_scene->currentScriptValue)) & 0x3FF;
 		}
 
-		engine->_movements->moveActor(actor->angle, engine->_scene->currentScriptValue, actor->speed, &actor->move);
+		engine->_movements->moveActor(ctx.actor->angle, engine->_scene->currentScriptValue, ctx.actor->speed, &ctx.actor->move);
 		*((int16 *)scriptPtr + 2) = engine->_scene->currentScriptValue;
 	}
 
-	if (actor->angle != engine->_scene->currentScriptValue) {
-		actor->positionInMoveScript -= 5;
+	if (ctx.actor->angle != engine->_scene->currentScriptValue) {
+		ctx.actor->positionInMoveScript -= 5;
 		return 1;
-	} else {
-		engine->_movements->clearRealAngle(actor);
-		*((int16 *)scriptPtr + 2) = -1;
 	}
+	engine->_movements->clearRealAngle(ctx.actor);
+	*((int16 *)scriptPtr + 2) = -1;
 	return 0;
 }
 
@@ -576,17 +577,16 @@ static const ScriptMoveFunction function_map[] = {
 ScriptMove::ScriptMove(TwinEEngine *engine) : _engine(engine) {
 	scriptPtr = nullptr;
 	scriptPosition = 0;
-	move = nullptr;
 	numRepeatSample = 1;
 }
 
 void ScriptMove::processMoveScript(int32 actorIdx) {
 	ActorStruct *actor = _engine->_scene->getActor(actorIdx);
-	move = &actor->move;
 	numRepeatSample = 1;
 
 	int32 end = -2;
 
+	ScriptContext ctx{actorIdx, actor};
 	do {
 		scriptPosition = actor->positionInMoveScript;
 		// TODO: use Common::MemoryReadStream for the script parsing
@@ -596,7 +596,7 @@ void ScriptMove::processMoveScript(int32 actorIdx) {
 		actor->positionInMoveScript++;
 
 		if (scriptOpcode >= 0 && scriptOpcode < ARRAYSIZE(function_map)) {
-			end = function_map[scriptOpcode].function(_engine, actorIdx, actor);
+			end = function_map[scriptOpcode].function(_engine, ctx);
 		} else {
 			error("Actor %d with wrong offset/opcode - Offset: %d (opcode: %i)", actorIdx, actor->positionInLifeScript, scriptOpcode);
 		}


Commit: bd4fa2e7082f0ca9b5e17eed0eb330795916503e
    https://github.com/scummvm/scummvm/commit/bd4fa2e7082f0ca9b5e17eed0eb330795916503e
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00

Commit Message:
TWINE: cleanup in move script

Changed paths:
    engines/twine/animations.cpp
    engines/twine/script_move_v1.cpp


diff --git a/engines/twine/animations.cpp b/engines/twine/animations.cpp
index 8a0a1a420d..9d6e80a366 100644
--- a/engines/twine/animations.cpp
+++ b/engines/twine/animations.cpp
@@ -704,6 +704,7 @@ void Animations::processAnimActions(int32 actorIdx) {
 	}
 }
 
+// TODO: convert to boolean
 int32 Animations::initAnim(AnimationTypes newAnim, int16 animType, uint8 animExtra, int32 actorIdx) {
 	ActorStruct *actor = _engine->_scene->getActor(actorIdx);
 	if (actor->entity == -1) {
diff --git a/engines/twine/script_move_v1.cpp b/engines/twine/script_move_v1.cpp
index 58c1e07f06..acb688012c 100644
--- a/engines/twine/script_move_v1.cpp
+++ b/engines/twine/script_move_v1.cpp
@@ -81,11 +81,10 @@ static int32 mANIM(TwinEEngine *engine, ScriptContext& ctx) {
 	AnimationTypes animIdx = (AnimationTypes) * (scriptPtr++);
 	if (engine->_animations->initAnim(animIdx, 0, 0, ctx.actorIdx)) {
 		ctx.actor->positionInMoveScript++;
-	} else {
-		ctx.actor->positionInMoveScript = scriptPosition;
-		return 1;
+		return 0;
 	}
-	return 0;
+	ctx.actor->positionInMoveScript = scriptPosition;
+	return 1;
 }
 
 /*0x04*/
@@ -138,7 +137,7 @@ static int32 mANGLE(TwinEEngine *engine, ScriptContext& ctx) {
 	}
 	engine->_scene->currentScriptValue = *((int16 *)scriptPtr);
 	if (ctx.actor->move.numOfStep == 0) {
-		engine->_movements->moveActor(ctx.actor->angle, engine->_scene->currentScriptValue, ctx.actor->speed, move);
+		engine->_movements->moveActor(ctx.actor->angle, engine->_scene->currentScriptValue, ctx.actor->speed, &ctx.actor->move);
 	}
 	if (ctx.actor->angle == engine->_scene->currentScriptValue) {
 		engine->_movements->clearRealAngle(ctx.actor);


Commit: 01dc17647a1224d6829e7218d95fb53c65ddf5ab
    https://github.com/scummvm/scummvm/commit/01dc17647a1224d6829e7218d95fb53c65ddf5ab
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00

Commit Message:
TWINE: replaced magic number

but this looks wrong...

Changed paths:
    engines/twine/script_life_v1.cpp


diff --git a/engines/twine/script_life_v1.cpp b/engines/twine/script_life_v1.cpp
index 492c17fa50..983968dedf 100644
--- a/engines/twine/script_life_v1.cpp
+++ b/engines/twine/script_life_v1.cpp
@@ -31,6 +31,7 @@
 #include "twine/holomap.h"
 #include "twine/input.h"
 #include "twine/interface.h"
+#include "twine/menu.h"
 #include "twine/movements.h"
 #include "twine/music.h"
 #include "twine/redraw.h"
@@ -1462,7 +1463,7 @@ static int32 lTEXT(TwinEEngine *engine, ScriptContext& ctx) {
 	if (drawVar1 < 440) {
 		if (engine->cfgfile.Version == USA_VERSION) {
 			if (!textIdx) {
-				textIdx = 16;
+				textIdx = TextId::kSaveSettings;
 			}
 		}
 


Commit: 02409852aab1d846af24920c56dd46aecb4bb2cb
    https://github.com/scummvm/scummvm/commit/02409852aab1d846af24920c56dd46aecb4bb2cb
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00

Commit Message:
TWINE: replaced magic number

Changed paths:
    engines/twine/gamestate.h
    engines/twine/script_life_v1.cpp


diff --git a/engines/twine/gamestate.h b/engines/twine/gamestate.h
index 94496cc5dc..69c988fdcb 100644
--- a/engines/twine/gamestate.h
+++ b/engines/twine/gamestate.h
@@ -62,7 +62,8 @@ enum InventoryItems {
 	kKeypad = 24,
 	kCoffeeCan  = 25,
 	kiBonusList = 26,
-	kiCloverLeaf = 27
+	kiCloverLeaf = 27,
+	MaxInventoryItems = 28
 };
 
 /** Magicball strength*/
diff --git a/engines/twine/script_life_v1.cpp b/engines/twine/script_life_v1.cpp
index 983968dedf..e6e0fafe4b 100644
--- a/engines/twine/script_life_v1.cpp
+++ b/engines/twine/script_life_v1.cpp
@@ -254,7 +254,7 @@ static int32 processLifeConditions(TwinEEngine *engine, ScriptContext& ctx) {
 	case kcFLAG_GAME: {
 		int32 flagIdx = *(scriptPtr++);
 		if (!engine->_gameState->gameFlags[GAMEFLAG_INVENTORY_DISABLED] ||
-		    (engine->_gameState->gameFlags[GAMEFLAG_INVENTORY_DISABLED] && flagIdx >= 28)) {
+		    (engine->_gameState->gameFlags[GAMEFLAG_INVENTORY_DISABLED] && flagIdx >= MaxInventoryItems)) {
 			engine->_scene->currentScriptValue = engine->_gameState->gameFlags[flagIdx];
 		} else {
 			if (flagIdx == GAMEFLAG_INVENTORY_DISABLED) {


Commit: 526a63610c6c4d1df9d2921a09c00617360035ee
    https://github.com/scummvm/scummvm/commit/526a63610c6c4d1df9d2921a09c00617360035ee
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00

Commit Message:
TWINE: added give_key debug command

Changed paths:
    engines/twine/console.cpp
    engines/twine/console.h


diff --git a/engines/twine/console.cpp b/engines/twine/console.cpp
index 788ed8d17e..dd07154124 100644
--- a/engines/twine/console.cpp
+++ b/engines/twine/console.cpp
@@ -30,6 +30,7 @@ namespace TwinE {
 
 TwinEConsole::TwinEConsole(TwinEEngine *engine) : _engine(engine), GUI::Debugger() {
 	registerCmd("give_allitems", WRAP_METHOD(TwinEConsole, doGiveAllItems));
+	registerCmd("give_key", WRAP_METHOD(TwinEConsole, doGiveKey));
 	registerCmd("change_scene", WRAP_METHOD(TwinEConsole, doChangeScene));
 	registerCmd("list_menutext", WRAP_METHOD(TwinEConsole, doListMenuText));
 	registerCmd("toggle_debug", WRAP_METHOD(TwinEConsole, doToggleDebug));
@@ -38,6 +39,15 @@ TwinEConsole::TwinEConsole(TwinEEngine *engine) : _engine(engine), GUI::Debugger
 TwinEConsole::~TwinEConsole() {
 }
 
+bool TwinEConsole::doGiveKey(int argc, const char **argv) {
+	int amount = 1;
+	if (argc >= 1) {
+		amount = atoi(argv[1]);
+	}
+	_engine->_gameState->inventoryNumKeys += amount;
+	return true;
+}
+
 bool TwinEConsole::doToggleDebug(int argc, const char **argv) {
 	if (_engine->cfgfile.Debug) {
 		debug("Disabling debug mode");
diff --git a/engines/twine/console.h b/engines/twine/console.h
index cf8518bc4a..be14df760f 100644
--- a/engines/twine/console.h
+++ b/engines/twine/console.h
@@ -24,6 +24,7 @@
 #define TWINE_CONSOLE_H
 
 #include "gui/debugger.h"
+#include "twine/gamestate.h"
 
 namespace TwinE {
 
@@ -37,6 +38,7 @@ private:
 	bool doChangeScene(int argc, const char **argv);
 	bool doListMenuText(int argc, const char **argv);
 	bool doToggleDebug(int argc, const char **argv);
+	bool doGiveKey(int argc, const char **argv);
 public:
 	TwinEConsole(TwinEEngine *engine);
 	~TwinEConsole() override;


Commit: e181baf0e6c13647f87ce21373578eaae846b407
    https://github.com/scummvm/scummvm/commit/e181baf0e6c13647f87ce21373578eaae846b407
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00

Commit Message:
TWINE: activate some of the scummvm features

Changed paths:
    engines/twine/twine.cpp


diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index 0dbaadffbe..60cae0256b 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -27,13 +27,14 @@
 #include "common/events.h"
 #include "common/keyboard.h"
 #include "common/savefile.h"
+#include "common/scummsys.h"
 #include "common/str.h"
 #include "common/stream.h"
 #include "common/system.h"
 #include "common/textconsole.h"
 #include "common/translation.h"
-#include "engines/util.h"
 #include "engines/metaengine.h"
+#include "engines/util.h"
 #include "graphics/managed_surface.h"
 #include "graphics/palette.h"
 #include "graphics/pixelformat.h"
@@ -174,6 +175,15 @@ Common::Error TwinEEngine::run() {
 }
 
 bool TwinEEngine::hasFeature(EngineFeature f) const {
+	switch (f) {
+	case EngineFeature::kSupportsReturnToLauncher:
+	case EngineFeature::kSupportsLoadingDuringRuntime:
+	case EngineFeature::kSupportsSavingDuringRuntime:
+	case EngineFeature::kSupportsChangingOptionsDuringRuntime:
+		return true;
+	default:
+		break;
+	}
 	return false;
 }
 
@@ -185,21 +195,21 @@ bool TwinEEngine::hasSavedSlots() {
 
 void TwinEEngine::wipeSaveSlot(int slot) {
 	Common::SaveFileManager *saveFileMan = getSaveFileManager();
-	const Common::String& saveFile = getMetaEngine().getSavegameFile(slot, _targetName.c_str());
+	const Common::String &saveFile = getMetaEngine().getSavegameFile(slot, _targetName.c_str());
 	saveFileMan->removeSavefile(saveFile);
 }
 
 bool TwinEEngine::loadSaveSlot(int slot) {
 	Common::SaveFileManager *saveFileMan = getSaveFileManager();
-	const Common::String& saveFile = getMetaEngine().getSavegameFile(slot, _targetName.c_str());
-	Common::InSaveFile* file = saveFileMan->openForLoading(saveFile);
+	const Common::String &saveFile = getMetaEngine().getSavegameFile(slot, _targetName.c_str());
+	Common::InSaveFile *file = saveFileMan->openForLoading(saveFile);
 	return _gameState->loadGame(file);
 }
 
 bool TwinEEngine::saveSlot(int slot) {
 	Common::SaveFileManager *saveFileMan = getSaveFileManager();
-	const Common::String& saveFile = getMetaEngine().getSavegameFile(slot, _targetName.c_str());
-	Common::OutSaveFile* file =  saveFileMan->openForSaving(saveFile);
+	const Common::String &saveFile = getMetaEngine().getSavegameFile(slot, _targetName.c_str());
+	Common::OutSaveFile *file = saveFileMan->openForSaving(saveFile);
 	return _gameState->saveGame(file);
 }
 
@@ -584,7 +594,7 @@ int32 TwinEEngine::runGameEngine() { // mainLoopInteration
 
 		// Recenter Screen
 		if (_input->isActionActive(TwinEActionType::RecenterScreenOnTwinsen) && !disableScreenRecenter) {
-			const ActorStruct* currentlyFollowedActor = _scene->getActor(_scene->currentlyFollowedActor);
+			const ActorStruct *currentlyFollowedActor = _scene->getActor(_scene->currentlyFollowedActor);
 			_grid->newCameraX = currentlyFollowedActor->x >> 9;
 			_grid->newCameraY = currentlyFollowedActor->y >> 8;
 			_grid->newCameraZ = currentlyFollowedActor->z >> 9;


Commit: f9fa523c622f464978539106fc586b4888211d9a
    https://github.com/scummvm/scummvm/commit/f9fa523c622f464978539106fc586b4888211d9a
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00

Commit Message:
TWINE: changed engine init message

Changed paths:
    engines/twine/twine.cpp


diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index 60cae0256b..0db9fae39b 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -138,15 +138,10 @@ TwinEEngine::~TwinEEngine() {
 }
 
 Common::Error TwinEEngine::run() {
-	/** Engine current version */
-	const char *ENGINE_VERSION = "0.2.2";
-
-	// Show engine information
-	debug("TwinEngine v%s", ENGINE_VERSION);
+	debug("Based on TwinEngine v0.2.2");
 	debug("(c)2002 The TwinEngine team.");
 	debug("(c)2020 The ScummVM team.");
 	debug("Refer to the credits for further details.");
-	debug("Released under the terms of the GNU GPL license version 2 (or, at your opinion, any later). See COPYING file.");
 	debug("The original Little Big Adventure game is:");
 	debug("(c)1994 by Adeline Software International, All Rights Reserved.");
 


Commit: dba162cae0c967228dc130b49ba909459ef0873f
    https://github.com/scummvm/scummvm/commit/dba162cae0c967228dc130b49ba909459ef0873f
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00

Commit Message:
TWINE: reduced scope

Changed paths:
    engines/twine/extra.cpp


diff --git a/engines/twine/extra.cpp b/engines/twine/extra.cpp
index 44433020ac..fec4813b24 100644
--- a/engines/twine/extra.cpp
+++ b/engines/twine/extra.cpp
@@ -612,18 +612,16 @@ void Extra::processExtras() {
 			}
 			// process actor target hit
 			if (extra->type & 0x80) {
-				int32 actorIdx, actorIdxAttacked, tmpAngle, angle;
-
-				actorIdxAttacked = extra->lifeTime;
-				actorIdx = extra->actorIdx;
+				int32 actorIdxAttacked = extra->lifeTime;
+				int32 actorIdx = extra->actorIdx;
 
 				const ActorStruct *actor = _engine->_scene->getActor(actorIdxAttacked);
 				currentExtraX = actor->x;
 				currentExtraY = actor->y + 1000;
 				currentExtraZ = actor->z;
 
-				tmpAngle = _engine->_movements->getAngleAndSetTargetActorDistance(extra->x, extra->z, currentExtraX, currentExtraZ);
-				angle = (tmpAngle - extra->angle) & 0x3FF;
+				int32 tmpAngle = _engine->_movements->getAngleAndSetTargetActorDistance(extra->x, extra->z, currentExtraX, currentExtraZ);
+				int32 angle = (tmpAngle - extra->angle) & 0x3FF;
 
 				if (angle > 400 && angle < 600) {
 					if (extra->strengthOfHit) {


Commit: d72a0ed1f3fe116146241de0919443b4e64adb4d
    https://github.com/scummvm/scummvm/commit/d72a0ed1f3fe116146241de0919443b4e64adb4d
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:20:08+01:00

Commit Message:
TWINE: removed unused method

Changed paths:
    engines/twine/sound.cpp
    engines/twine/sound.h


diff --git a/engines/twine/sound.cpp b/engines/twine/sound.cpp
index a8217a6619..c6aaeaad7c 100644
--- a/engines/twine/sound.cpp
+++ b/engines/twine/sound.cpp
@@ -41,17 +41,6 @@ namespace TwinE {
 Sound::Sound(TwinEEngine *engine) : _engine(engine) {
 }
 
-void Sound::sampleVolume(int32 chan, int32 volume) {
-	if (chan == -1) {
-		_engine->_system->getMixer()->setVolumeForSoundType(Audio::Mixer::kPlainSoundType, volume);
-		return;
-	}
-	if (chan < 0 || chan > ARRAYSIZE(samplesPlaying)) {
-		error("Given channel index is out of bounds: %i", chan);
-	}
-	_engine->_system->getMixer()->setChannelVolume(samplesPlaying[chan], volume / 2);
-}
-
 void Sound::setSamplePosition(int32 chan, int32 x, int32 y, int32 z) {
 	int32 distance;
 	distance = ABS(_engine->_movements->getDistance3D(_engine->_grid->newCameraX << 9, _engine->_grid->newCameraY << 8, _engine->_grid->newCameraZ << 9, x, y, z));
diff --git a/engines/twine/sound.h b/engines/twine/sound.h
index 699a071110..eaf3ef1bab 100644
--- a/engines/twine/sound.h
+++ b/engines/twine/sound.h
@@ -52,12 +52,6 @@ public:
 
 	bool isChannelPlaying(int32 channel);
 
-	/**
-	 * Sample volume
-	 * @param channel sample channel
-	 * @param volume sample volume number
-	 */
-	void sampleVolume(int32 channel, int32 volume);
 
 	/**
 	 * Play FLA movie samples


Commit: a9aa2dba5d8122d2ca6be97b75c5648c9f71ad63
    https://github.com/scummvm/scummvm/commit/a9aa2dba5d8122d2ca6be97b75c5648c9f71ad63
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-30T17:22:24+01:00

Commit Message:
TWINE: stop all running samples for a new game

Changed paths:
    engines/twine/menuoptions.cpp


diff --git a/engines/twine/menuoptions.cpp b/engines/twine/menuoptions.cpp
index 8b23ed3432..3f409e42f9 100644
--- a/engines/twine/menuoptions.cpp
+++ b/engines/twine/menuoptions.cpp
@@ -33,6 +33,7 @@
 #include "twine/resources.h"
 #include "twine/scene.h"
 #include "twine/screens.h"
+#include "twine/sound.h"
 #include "twine/text.h"
 #include "twine/twine.h"
 
@@ -45,6 +46,7 @@ static const char allowedCharIndex[] = " ABCDEFGHIJKLM.NOPQRSTUVWXYZ-abcdefghijk
 
 void MenuOptions::newGame() {
 	_engine->_music->stopMusic();
+	_engine->_sound->stopSamples();
 
 	int32 tmpFlagDisplayText = _engine->cfgfile.FlagDisplayText;
 	_engine->cfgfile.FlagDisplayText = true;




More information about the Scummvm-git-logs mailing list