[Scummvm-git-logs] scummvm master -> 6e5a81b419cedeb7695a231fe2337c69a7e72840

mgerhardy martin.gerhardy at gmail.com
Sat Oct 31 07:40:39 UTC 2020


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

Summary:
95dcec879d TWINE: fixed typo
18feb699eb TWINE: move script endian safe parsing
1f8ea6f9d5 TWINE: fixed playing voices
6e5a81b419 TWINE: converted error hqr related error into warning


Commit: 95dcec879d6c9b4e52a77987f0023a6be019f6cd
    https://github.com/scummvm/scummvm/commit/95dcec879d6c9b4e52a77987f0023a6be019f6cd
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-31T08:30:16+01:00

Commit Message:
TWINE: fixed typo

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


diff --git a/engines/twine/gamestate.cpp b/engines/twine/gamestate.cpp
index dd77e5d682..2f58233da7 100644
--- a/engines/twine/gamestate.cpp
+++ b/engines/twine/gamestate.cpp
@@ -311,7 +311,7 @@ void GameState::processFoundItem(int32 item) {
 	const int32 boxBottomRightX = _engine->_renderer->projPosX + 65;
 	const int32 boxBottomRightY = _engine->_renderer->projPosY + 65;
 
-	_engine->_sound->playSample(Samples::BitItemFound);
+	_engine->_sound->playSample(Samples::BigItemFound);
 
 	// process vox play
 	_engine->_music->stopMusic();
diff --git a/engines/twine/sound.h b/engines/twine/sound.h
index cd753ad9b2..fddbf48d95 100644
--- a/engines/twine/sound.h
+++ b/engines/twine/sound.h
@@ -37,7 +37,7 @@ enum _Samples {
 	SoldierHit = 4,
 	ItemPopup = 11,
 	Explode = 37,
-	BitItemFound = 41,
+	BigItemFound = 41,
 	TaskCompleted = 41,
 	Hit = 86,
 	ItemFound = 97,


Commit: 18feb699eb6b5c5c7bd97834af2004edaef97057
    https://github.com/scummvm/scummvm/commit/18feb699eb6b5c5c7bd97834af2004edaef97057
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-31T08:34:33+01:00

Commit Message:
TWINE: move script endian safe parsing

Changed paths:
    engines/twine/script_move_v1.cpp


diff --git a/engines/twine/script_move_v1.cpp b/engines/twine/script_move_v1.cpp
index acb688012c..4fcb390e71 100644
--- a/engines/twine/script_move_v1.cpp
+++ b/engines/twine/script_move_v1.cpp
@@ -29,25 +29,36 @@
 #include "twine/redraw.h"
 #include "twine/renderer.h"
 #include "twine/scene.h"
+#include "common/memstream.h"
 #include "twine/sound.h"
 #include "twine/twine.h"
 
 namespace TwinE {
 
-static uint8 *scriptPtr = nullptr;
-static int32 scriptPosition = 0;
 static int32 numRepeatSample = 1;
 
 struct ScriptContext {
 	int32 actorIdx;
 	ActorStruct *actor;
+	Common::MemorySeekableReadWriteStream stream;
+
+	ScriptContext(int32 _actorIdx, ActorStruct *_actor) : actorIdx(_actorIdx), actor(_actor), stream(actor->moveScript, actor->moveScriptSize) {
+		assert(actor->positionInMoveScript >= 0);
+		stream.skip(actor->positionInMoveScript);
+	}
+
+	void undo(int32 bytes) {
+		assert(bytes >= 0);
+		// the additional 1 byte is for the opcode
+		stream.rewind(bytes + 1);
+	}
 };
 
 /** Returns:
 	   -1 - Need implementation
 		0 - Completed
 		1 - Break script */
-typedef int32 ScriptMoveFunc(TwinEEngine *engine, ScriptContext& ctx);
+typedef int32 ScriptMoveFunc(TwinEEngine *engine, ScriptContext &ctx);
 
 struct ScriptMoveFunction {
 	const char *name;
@@ -58,39 +69,36 @@ struct ScriptMoveFunction {
 	{ name, func }
 
 /*0x00*/
-static int32 mEND(TwinEEngine *engine, ScriptContext& ctx) {
+static int32 mEND(TwinEEngine *engine, ScriptContext &ctx) {
 	ctx.actor->positionInMoveScript = -1;
 	return 1;
 }
 
 /*0x01*/
-static int32 mNOP(TwinEEngine *engine, ScriptContext& ctx) {
+static int32 mNOP(TwinEEngine *engine, ScriptContext &ctx) {
 	return 0;
 }
 
 /*0x02*/
-static int32 mBODY(TwinEEngine *engine, ScriptContext& ctx) {
-	int32 bodyIdx = *(scriptPtr);
+static int32 mBODY(TwinEEngine *engine, ScriptContext &ctx) {
+	int32 bodyIdx = ctx.stream.readByte();
 	engine->_actor->initModelActor(bodyIdx, ctx.actorIdx);
-	ctx.actor->positionInMoveScript++;
 	return 0;
 }
 
 /*0x03*/
-static int32 mANIM(TwinEEngine *engine, ScriptContext& ctx) {
-	AnimationTypes animIdx = (AnimationTypes) * (scriptPtr++);
+static int32 mANIM(TwinEEngine *engine, ScriptContext &ctx) {
+	AnimationTypes animIdx = (AnimationTypes)ctx.stream.readByte();
 	if (engine->_animations->initAnim(animIdx, 0, 0, ctx.actorIdx)) {
-		ctx.actor->positionInMoveScript++;
 		return 0;
 	}
-	ctx.actor->positionInMoveScript = scriptPosition;
+	ctx.undo(1);
 	return 1;
 }
 
 /*0x04*/
-static int32 mGOTO_POINT(TwinEEngine *engine, ScriptContext& ctx) {
-	ctx.actor->positionInMoveScript++;
-	engine->_scene->currentScriptValue = *(scriptPtr);
+static int32 mGOTO_POINT(TwinEEngine *engine, ScriptContext &ctx) {
+	engine->_scene->currentScriptValue = ctx.stream.readByte();
 
 	const ScenePoint &sp = engine->_scene->sceneTracks[engine->_scene->currentScriptValue];
 	engine->_renderer->destX = sp.x;
@@ -106,7 +114,7 @@ static int32 mGOTO_POINT(TwinEEngine *engine, ScriptContext& ctx) {
 	}
 
 	if (engine->_movements->targetActorDistance > 500) {
-		ctx.actor->positionInMoveScript -= 2;
+		ctx.undo(1);
 		return 1;
 	}
 
@@ -114,9 +122,9 @@ static int32 mGOTO_POINT(TwinEEngine *engine, ScriptContext& ctx) {
 }
 
 /*0x05*/
-static int32 mWAIT_ANIM(TwinEEngine *engine, ScriptContext& ctx) {
+static int32 mWAIT_ANIM(TwinEEngine *engine, ScriptContext &ctx) {
 	if (!ctx.actor->dynamicFlags.bAnimEnded) {
-		ctx.actor->positionInMoveScript--;
+		ctx.undo(0);
 	} else {
 		engine->_movements->clearRealAngle(ctx.actor);
 	}
@@ -124,18 +132,18 @@ static int32 mWAIT_ANIM(TwinEEngine *engine, ScriptContext& ctx) {
 }
 
 /*0x06*/
-static int32 mLOOP(TwinEEngine *engine, ScriptContext& ctx) {
+static int32 mLOOP(TwinEEngine *engine, ScriptContext &ctx) {
 	// TODO
 	return -1;
 }
 
 /*0x07*/
-static int32 mANGLE(TwinEEngine *engine, ScriptContext& ctx) {
-	ctx.actor->positionInMoveScript += 2;
+static int32 mANGLE(TwinEEngine *engine, ScriptContext &ctx) {
+	const int16 angle = ctx.stream.readSint16LE();
 	if (ctx.actor->staticFlags.bIsSpriteActor) {
 		return 0;
 	}
-	engine->_scene->currentScriptValue = *((int16 *)scriptPtr);
+	engine->_scene->currentScriptValue = angle;
 	if (ctx.actor->move.numOfStep == 0) {
 		engine->_movements->moveActor(ctx.actor->angle, engine->_scene->currentScriptValue, ctx.actor->speed, &ctx.actor->move);
 	}
@@ -143,14 +151,13 @@ static int32 mANGLE(TwinEEngine *engine, ScriptContext& ctx) {
 		engine->_movements->clearRealAngle(ctx.actor);
 		return 0;
 	}
-	ctx.actor->positionInMoveScript -= 3;
+	ctx.undo(2);
 	return 1;
 }
 
 /*0x08*/
-static int32 mPOS_POINT(TwinEEngine *engine, ScriptContext& ctx) {
-	ctx.actor->positionInMoveScript++;
-	engine->_scene->currentScriptValue = *(scriptPtr);
+static int32 mPOS_POINT(TwinEEngine *engine, ScriptContext &ctx) {
+	engine->_scene->currentScriptValue = ctx.stream.readByte();
 
 	const ScenePoint &sp = engine->_scene->sceneTracks[engine->_scene->currentScriptValue];
 	engine->_renderer->destX = sp.x;
@@ -169,29 +176,27 @@ static int32 mPOS_POINT(TwinEEngine *engine, ScriptContext& ctx) {
 }
 
 /*0x09*/
-static int32 mLABEL(TwinEEngine *engine, ScriptContext& ctx) {
-	ctx.actor->labelIdx = *(scriptPtr);
-	ctx.actor->positionInMoveScript++;
-	ctx.actor->currentLabelPtr = ctx.actor->positionInMoveScript - 2;
+static int32 mLABEL(TwinEEngine *engine, ScriptContext &ctx) {
+	ctx.actor->labelIdx = ctx.stream.readByte();
+	ctx.actor->currentLabelPtr = ctx.stream.pos() - 2;
 	return 0;
 }
 
 /*0x0A*/
-static int32 mGOTO(TwinEEngine *engine, ScriptContext& ctx) {
-	ctx.actor->positionInMoveScript = *((int16 *)scriptPtr);
+static int32 mGOTO(TwinEEngine *engine, ScriptContext &ctx) {
+	ctx.stream.seek(ctx.stream.readSint16LE());
 	return 0;
 }
 
 /*0x0B*/
-static int32 mSTOP(TwinEEngine *engine, ScriptContext& ctx) {
+static int32 mSTOP(TwinEEngine *engine, ScriptContext &ctx) {
 	ctx.actor->positionInMoveScript = -1;
 	return 1;
 }
 
 /*0x0C*/
-static int32 mGOTO_SYM_POINT(TwinEEngine *engine, ScriptContext& ctx) {
-	ctx.actor->positionInMoveScript++;
-	engine->_scene->currentScriptValue = *(scriptPtr);
+static int32 mGOTO_SYM_POINT(TwinEEngine *engine, ScriptContext &ctx) {
+	engine->_scene->currentScriptValue = ctx.stream.readByte();
 
 	const ScenePoint &sp = engine->_scene->sceneTracks[engine->_scene->currentScriptValue];
 	engine->_renderer->destX = sp.x;
@@ -207,7 +212,7 @@ static int32 mGOTO_SYM_POINT(TwinEEngine *engine, ScriptContext& ctx) {
 	}
 
 	if (engine->_movements->targetActorDistance > 500) {
-		ctx.actor->positionInMoveScript -= 2;
+		ctx.undo(1);
 		return 1;
 	}
 
@@ -215,53 +220,47 @@ static int32 mGOTO_SYM_POINT(TwinEEngine *engine, ScriptContext& ctx) {
 }
 
 /*0x0D*/
-static int32 mWAIT_NUM_ANIM(TwinEEngine *engine, ScriptContext& ctx) {
-	ctx.actor->positionInMoveScript += 2;
-
-	bool abortMove = 0;
+static int32 mWAIT_NUM_ANIM(TwinEEngine *engine, ScriptContext &ctx) {
+	bool abortMove = false;
+	const int32 animRepeats = ctx.stream.readByte();
+	int32 animPos = ctx.stream.readByte();
 	if (ctx.actor->dynamicFlags.bAnimEnded) {
-		int32 animPos, animRepeats;
-
-		animRepeats = *(scriptPtr);
-		animPos = *(scriptPtr + 1);
-
 		animPos++;
 
 		if (animPos == animRepeats) {
 			animPos = 0;
 		} else {
-			abortMove = 1;
+			abortMove = true;
 		}
 
-		*(scriptPtr + 1) = animPos;
+		ctx.stream.rewind(1);
+		ctx.stream.writeByte(animPos);
 	} else {
-		abortMove = 1;
+		abortMove = true;
 	}
 
-	if (abortMove == 1) {
-		ctx.actor->positionInMoveScript -= 3;
+	if (abortMove) {
+		ctx.undo(2);
 	}
 
 	return abortMove;
 }
 
 /*0x0E*/
-static int32 mSAMPLE(TwinEEngine *engine, ScriptContext& ctx) {
-	int32 sampleIdx = *((int16 *)scriptPtr);
+static int32 mSAMPLE(TwinEEngine *engine, ScriptContext &ctx) {
+	int32 sampleIdx = ctx.stream.readSint16LE();
 	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, ScriptContext& ctx) {
-	ctx.actor->positionInMoveScript++;
-
+static int32 mGOTO_POINT_3D(TwinEEngine *engine, ScriptContext &ctx) {
+	const int32 trackId = ctx.stream.readByte();
 	if (!ctx.actor->staticFlags.bIsSpriteActor) {
 		return 0;
 	}
 
-	engine->_scene->currentScriptValue = *(scriptPtr);
+	engine->_scene->currentScriptValue = trackId;
 
 	const ScenePoint &sp = engine->_scene->sceneTracks[engine->_scene->currentScriptValue];
 	engine->_renderer->destX = sp.x;
@@ -272,7 +271,7 @@ static int32 mGOTO_POINT_3D(TwinEEngine *engine, ScriptContext& ctx) {
 	ctx.actor->animType = engine->_movements->getAngleAndSetTargetActorDistance(ctx.actor->y, 0, sp.y, engine->_movements->targetActorDistance);
 
 	if (engine->_movements->targetActorDistance > 100) {
-		ctx.actor->positionInMoveScript -= 2;
+		ctx.undo(1);
 		return 1;
 	}
 	ctx.actor->x = sp.x;
@@ -283,9 +282,8 @@ static int32 mGOTO_POINT_3D(TwinEEngine *engine, ScriptContext& ctx) {
 }
 
 /*0x10*/
-static int32 mSPEED(TwinEEngine *engine, ScriptContext& ctx) {
-	ctx.actor->positionInMoveScript += 2;
-	ctx.actor->speed = *((int16 *)scriptPtr);
+static int32 mSPEED(TwinEEngine *engine, ScriptContext &ctx) {
+	ctx.actor->speed = ctx.stream.readSint16LE();
 
 	if (ctx.actor->staticFlags.bIsSpriteActor) {
 		engine->_movements->setActorAngle(0, ctx.actor->speed, 50, &ctx.actor->move);
@@ -295,10 +293,8 @@ static int32 mSPEED(TwinEEngine *engine, ScriptContext& ctx) {
 }
 
 /*0x11*/
-static int32 mBACKGROUND(TwinEEngine *engine, ScriptContext& ctx) {
-	ctx.actor->positionInMoveScript++;
-
-	if (*scriptPtr != 0) {
+static int32 mBACKGROUND(TwinEEngine *engine, ScriptContext &ctx) {
+	if (ctx.stream.readByte() != 0) {
 		if (!ctx.actor->staticFlags.bIsBackgrounded) {
 			ctx.actor->staticFlags.bIsBackgrounded = 1;
 			if (ctx.actor->dynamicFlags.bIsVisible) {
@@ -318,37 +314,36 @@ static int32 mBACKGROUND(TwinEEngine *engine, ScriptContext& ctx) {
 }
 
 /*0x12*/
-static int32 mWAIT_NUM_SECOND(TwinEEngine *engine, ScriptContext& ctx) {
-	ctx.actor->positionInMoveScript += 5;
-
-	const int32 numSeconds = *(scriptPtr++);
-	int32 currentTime = *((int32 *)scriptPtr);
+static int32 mWAIT_NUM_SECOND(TwinEEngine *engine, ScriptContext &ctx) {
+	const int32 numSeconds = ctx.stream.readByte();
+	int32 currentTime = ctx.stream.readSint32LE();
 
 	if (currentTime == 0) {
 		currentTime = engine->lbaTime + numSeconds * 50;
-		*((int32 *)scriptPtr) = currentTime;
+		ctx.stream.rewind(4);
+		ctx.stream.writeSint32LE(currentTime);
 	}
 
 	if (engine->lbaTime < currentTime) {
-		ctx.actor->positionInMoveScript -= 6;
+		ctx.undo(5);
 		return 1;
-	} else {
-		*((int32 *)scriptPtr) = 0;
 	}
 
+	ctx.stream.rewind(4);
+	ctx.stream.writeSint32LE(0);
+
 	return 0;
 }
 
 /*0x13*/
-static int32 mNO_BODY(TwinEEngine *engine, ScriptContext& ctx) {
+static int32 mNO_BODY(TwinEEngine *engine, ScriptContext &ctx) {
 	engine->_actor->initModelActor(-1, ctx.actorIdx);
 	return 0;
 }
 
 /*0x14*/
-static int32 mBETA(TwinEEngine *engine, ScriptContext& ctx) {
-	const int16 beta = *((int16 *)scriptPtr);
-	ctx.actor->positionInMoveScript += 2;
+static int32 mBETA(TwinEEngine *engine, ScriptContext &ctx) {
+	const int16 beta = ctx.stream.readSint16LE();
 
 	ctx.actor->angle = beta;
 
@@ -360,11 +355,11 @@ static int32 mBETA(TwinEEngine *engine, ScriptContext& ctx) {
 }
 
 /*0x15*/
-static int32 mOPEN_LEFT(TwinEEngine *engine, ScriptContext& ctx) {
-	ctx.actor->positionInMoveScript += 2;
+static int32 mOPEN_LEFT(TwinEEngine *engine, ScriptContext &ctx) {
+	const int16 doorStatus = ctx.stream.readSint16LE();
 	if (ctx.actor->staticFlags.bIsSpriteActor && ctx.actor->staticFlags.bUsesClipping) {
 		ctx.actor->angle = 0x300;
-		ctx.actor->doorStatus = *((int16 *)scriptPtr);
+		ctx.actor->doorStatus = doorStatus;
 		ctx.actor->dynamicFlags.bIsSpriteMoving = 1;
 		ctx.actor->speed = 1000;
 		engine->_movements->setActorAngle(0, 1000, 50, &ctx.actor->move);
@@ -373,11 +368,11 @@ static int32 mOPEN_LEFT(TwinEEngine *engine, ScriptContext& ctx) {
 }
 
 /*0x16*/
-static int32 mOPEN_RIGHT(TwinEEngine *engine, ScriptContext& ctx) {
-	ctx.actor->positionInMoveScript += 2;
+static int32 mOPEN_RIGHT(TwinEEngine *engine, ScriptContext &ctx) {
+	const int16 doorStatus = ctx.stream.readSint16LE();
 	if (ctx.actor->staticFlags.bIsSpriteActor && ctx.actor->staticFlags.bUsesClipping) {
 		ctx.actor->angle = 0x100;
-		ctx.actor->doorStatus = *((int16 *)scriptPtr);
+		ctx.actor->doorStatus = doorStatus;
 		ctx.actor->dynamicFlags.bIsSpriteMoving = 1;
 		ctx.actor->speed = 1000;
 		engine->_movements->setActorAngle(0, 1000, 50, &ctx.actor->move);
@@ -386,11 +381,11 @@ static int32 mOPEN_RIGHT(TwinEEngine *engine, ScriptContext& ctx) {
 }
 
 /*0x17*/
-static int32 mOPEN_UP(TwinEEngine *engine, ScriptContext& ctx) {
-	ctx.actor->positionInMoveScript += 2;
+static int32 mOPEN_UP(TwinEEngine *engine, ScriptContext &ctx) {
+	const int16 doorStatus = ctx.stream.readSint16LE();
 	if (ctx.actor->staticFlags.bIsSpriteActor && ctx.actor->staticFlags.bUsesClipping) {
 		ctx.actor->angle = 0x200;
-		ctx.actor->doorStatus = *((int16 *)scriptPtr);
+		ctx.actor->doorStatus = doorStatus;
 		ctx.actor->dynamicFlags.bIsSpriteMoving = 1;
 		ctx.actor->speed = 1000;
 		engine->_movements->setActorAngle(0, 1000, 50, &ctx.actor->move);
@@ -399,11 +394,11 @@ static int32 mOPEN_UP(TwinEEngine *engine, ScriptContext& ctx) {
 }
 
 /*0x18*/
-static int32 mOPEN_DOWN(TwinEEngine *engine, ScriptContext& ctx) {
-	ctx.actor->positionInMoveScript += 2;
+static int32 mOPEN_DOWN(TwinEEngine *engine, ScriptContext &ctx) {
+	const int16 doorStatus = ctx.stream.readSint16LE();
 	if (ctx.actor->staticFlags.bIsSpriteActor && ctx.actor->staticFlags.bUsesClipping) {
 		ctx.actor->angle = 0;
-		ctx.actor->doorStatus = *((int16 *)scriptPtr);
+		ctx.actor->doorStatus = doorStatus;
 		ctx.actor->dynamicFlags.bIsSpriteMoving = 1;
 		ctx.actor->speed = 1000;
 		engine->_movements->setActorAngle(0, 1000, 50, &ctx.actor->move);
@@ -412,7 +407,7 @@ static int32 mOPEN_DOWN(TwinEEngine *engine, ScriptContext& ctx) {
 }
 
 /*0x19*/
-static int32 mCLOSE(TwinEEngine *engine, ScriptContext& ctx) {
+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;
@@ -423,10 +418,10 @@ static int32 mCLOSE(TwinEEngine *engine, ScriptContext& ctx) {
 }
 
 /*0x1A*/
-static int32 mWAIT_DOOR(TwinEEngine *engine, ScriptContext& ctx) {
+static int32 mWAIT_DOOR(TwinEEngine *engine, ScriptContext &ctx) {
 	if (ctx.actor->staticFlags.bIsSpriteActor && ctx.actor->staticFlags.bUsesClipping) {
 		if (ctx.actor->speed) {
-			ctx.actor->positionInMoveScript--;
+			ctx.undo(0);
 			return 1;
 		}
 	}
@@ -434,105 +429,106 @@ static int32 mWAIT_DOOR(TwinEEngine *engine, ScriptContext& ctx) {
 }
 
 /*0x1B*/
-static int32 mSAMPLE_RND(TwinEEngine *engine, ScriptContext& ctx) {
+static int32 mSAMPLE_RND(TwinEEngine *engine, ScriptContext &ctx) {
 	int32 freq = engine->getRandomNumber(2048) + 2048;
-	int32 sampleIdx = *((int16 *)scriptPtr);
+	int32 sampleIdx = ctx.stream.readSint16LE();
 	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, ScriptContext& ctx) {
-	int32 sampleIdx = *((int16 *)scriptPtr);
+static int32 mSAMPLE_ALWAYS(TwinEEngine *engine, ScriptContext &ctx) {
+	int32 sampleIdx = ctx.stream.readSint16LE();
 	if (!engine->_sound->isSamplePlaying(sampleIdx)) { // if its not playing
 		engine->_sound->playSample(sampleIdx, 0x1000, -1, ctx.actor->x, ctx.actor->y, ctx.actor->z, ctx.actorIdx);
 	}
-	ctx.actor->positionInMoveScript += 2;
 	return 0;
 }
 
 /*0x1D*/
-static int32 mSAMPLE_STOP(TwinEEngine *engine, ScriptContext& ctx) {
-	int32 sampleIdx = *((int16 *)scriptPtr);
+static int32 mSAMPLE_STOP(TwinEEngine *engine, ScriptContext &ctx) {
+	int32 sampleIdx = ctx.stream.readSint16LE();
 	engine->_sound->stopSample(sampleIdx);
-	ctx.actor->positionInMoveScript += 2;
 	return 0;
 }
 
 /*0x1E*/
-static int32 mPLAY_FLA(TwinEEngine *engine, ScriptContext& ctx) {
+static int32 mPLAY_FLA(TwinEEngine *engine, ScriptContext &ctx) {
 	// TODO
 	return -1;
 }
 
 /*0x1F*/
-static int32 mREPEAT_SAMPLE(TwinEEngine *engine, ScriptContext& ctx) {
-	numRepeatSample = *((int16 *)scriptPtr);
-	ctx.actor->positionInMoveScript += 2;
+static int32 mREPEAT_SAMPLE(TwinEEngine *engine, ScriptContext &ctx) {
+	numRepeatSample = ctx.stream.readSint16LE();
 	return 0;
 }
 
 /*0x20*/
-static int32 mSIMPLE_SAMPLE(TwinEEngine *engine, ScriptContext& ctx) {
-	int32 sampleIdx = *((int16 *)scriptPtr);
+static int32 mSIMPLE_SAMPLE(TwinEEngine *engine, ScriptContext &ctx) {
+	int32 sampleIdx = ctx.stream.readSint16LE();
 	engine->_sound->playSample(sampleIdx, 0x1000, numRepeatSample, ctx.actor->x, ctx.actor->y, ctx.actor->z, ctx.actorIdx);
 	numRepeatSample = 1;
-	ctx.actor->positionInMoveScript += 2;
 	return 0;
 }
 
 /*0x21*/
-static int32 mFACE_HERO(TwinEEngine *engine, ScriptContext& ctx) {
-	ctx.actor->positionInMoveScript += 2;
+static int32 mFACE_HERO(TwinEEngine *engine, ScriptContext &ctx) {
+	const int16 angle = ctx.stream.readSint16LE();
 	if (ctx.actor->staticFlags.bIsSpriteActor) {
 		return 0;
 	}
-	engine->_scene->currentScriptValue = *((int16 *)scriptPtr);
+	engine->_scene->currentScriptValue = angle;
 	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;
+		ctx.stream.rewind(2);
+		ctx.stream.writeSint16LE(engine->_scene->currentScriptValue);
 	}
 
 	if (ctx.actor->angle != engine->_scene->currentScriptValue) {
-		ctx.actor->positionInMoveScript -= 3;
+		ctx.undo(2);
 		return 1;
 	}
 	engine->_movements->clearRealAngle(ctx.actor);
-	*((int16 *)scriptPtr) = -1;
+	ctx.stream.rewind(2);
+	ctx.stream.writeSint16LE(-1);
 	return 0;
 }
 
 /*0x22*/
-static int32 mANGLE_RND(TwinEEngine *engine, ScriptContext& ctx) {
-	ctx.actor->positionInMoveScript += 4;
+static int32 mANGLE_RND(TwinEEngine *engine, ScriptContext &ctx) {
+	const int16 val1 = ctx.stream.readSint16LE();
+	const int16 val2 = ctx.stream.readSint16LE();
 	if (ctx.actor->staticFlags.bIsSpriteActor) {
 		return 0;
 	}
-	engine->_scene->currentScriptValue = *((int16 *)scriptPtr + 2);
+
+	engine->_scene->currentScriptValue = val2;
 
 	if (engine->_scene->currentScriptValue == -1 && ctx.actor->move.numOfStep == 0) {
 		if (engine->getRandomNumber() & 1) {
-			engine->_scene->currentScriptValue = *((int16 *)scriptPtr);
+			engine->_scene->currentScriptValue = val1;
 			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);
+			engine->_scene->currentScriptValue = val1;
 			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(ctx.actor->angle, engine->_scene->currentScriptValue, ctx.actor->speed, &ctx.actor->move);
-		*((int16 *)scriptPtr + 2) = engine->_scene->currentScriptValue;
+		ctx.stream.rewind(2);
+		ctx.stream.writeSint16LE(engine->_scene->currentScriptValue);
 	}
 
 	if (ctx.actor->angle != engine->_scene->currentScriptValue) {
-		ctx.actor->positionInMoveScript -= 5;
+		ctx.stream.rewind(4);
 		return 1;
 	}
 	engine->_movements->clearRealAngle(ctx.actor);
-	*((int16 *)scriptPtr + 2) = -1;
+	ctx.stream.rewind(2);
+	ctx.stream.writeSint16LE(-1);
 	return 0;
 }
 
@@ -574,8 +570,6 @@ static const ScriptMoveFunction function_map[] = {
     /*0x22*/ MAPFUNC("ANGLE_RND", mANGLE_RND)};
 
 ScriptMove::ScriptMove(TwinEEngine *engine) : _engine(engine) {
-	scriptPtr = nullptr;
-	scriptPosition = 0;
 	numRepeatSample = 1;
 }
 
@@ -585,25 +579,22 @@ void ScriptMove::processMoveScript(int32 actorIdx) {
 
 	int32 end = -2;
 
-	ScriptContext ctx{actorIdx, actor};
+	ScriptContext ctx(actorIdx, actor);
 	do {
-		scriptPosition = actor->positionInMoveScript;
-		// TODO: use Common::MemoryReadStream for the script parsing
-		scriptPtr = actor->moveScript + actor->positionInMoveScript;
-		int32 scriptOpcode = *(scriptPtr++);
-
-		actor->positionInMoveScript++;
-
-		if (scriptOpcode >= 0 && scriptOpcode < ARRAYSIZE(function_map)) {
+		const byte scriptOpcode = ctx.stream.readByte();
+		if (scriptOpcode < ARRAYSIZE(function_map)) {
 			end = function_map[scriptOpcode].function(_engine, ctx);
 		} else {
-			error("Actor %d with wrong offset/opcode - Offset: %d (opcode: %i)", actorIdx, actor->positionInLifeScript, scriptOpcode);
+			error("Actor %d with wrong offset/opcode - Offset: %d (opcode: %u)", actorIdx, ctx.stream.pos() - 1, scriptOpcode);
 		}
 
-		if (end < 0) { // show error message
+		if (end < 0) {
 			warning("Actor %d Life script [%s] not implemented", actorIdx, function_map[scriptOpcode].name);
 		}
 	} while (end != 1);
+	if (ctx.actor->positionInMoveScript != -1) {
+		actor->positionInMoveScript = ctx.stream.pos();
+	}
 }
 
 } // namespace TwinE


Commit: 1f8ea6f9d5a1f4e1d2e0fae0c2d2278631f282c9
    https://github.com/scummvm/scummvm/commit/1f8ea6f9d5a1f4e1d2e0fae0c2d2278631f282c9
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-31T08:38:50+01:00

Commit Message:
TWINE: fixed playing voices

Changed paths:
    engines/twine/sound.cpp


diff --git a/engines/twine/sound.cpp b/engines/twine/sound.cpp
index 34f4dd16ed..ef185193a3 100644
--- a/engines/twine/sound.cpp
+++ b/engines/twine/sound.cpp
@@ -61,6 +61,7 @@ void Sound::playFlaSample(int32 index, int32 frequency, int32 repeat, int32 x, i
 
 	int channelIdx = getFreeSampleChannelIndex();
 	if (channelIdx == -1) {
+		warning("Failed to play fla sample for index: %i - no free channel", index);
 		return;
 	}
 
@@ -81,6 +82,7 @@ void Sound::playSample(int32 index, int32 frequency, int32 repeat, int32 x, int3
 
 	int channelIdx = getFreeSampleChannelIndex();
 	if (channelIdx == -1) {
+		warning("Failed to play sample for index: %i - no free channel", index);
 		return;
 	}
 
@@ -101,7 +103,7 @@ void Sound::playVoxSample(int32 index) {
 	}
 
 	int channelIdx = getFreeSampleChannelIndex();
-	if (channelIdx != -1) {
+	if (channelIdx == -1) {
 		warning("Failed to play vox sample for index: %i - no free channel", index);
 		return;
 	}


Commit: 6e5a81b419cedeb7695a231fe2337c69a7e72840
    https://github.com/scummvm/scummvm/commit/6e5a81b419cedeb7695a231fe2337c69a7e72840
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-10-31T08:39:58+01:00

Commit Message:
TWINE: converted error hqr related error into warning

Changed paths:
    engines/twine/hqr.cpp


diff --git a/engines/twine/hqr.cpp b/engines/twine/hqr.cpp
index d33560bb00..9ddb51d699 100644
--- a/engines/twine/hqr.cpp
+++ b/engines/twine/hqr.cpp
@@ -164,7 +164,8 @@ int32 entrySize(const char *filename, int32 index) {
 
 	Common::File file;
 	if (!file.open(filename)) {
-		error("HQR: Could not open %s", filename);
+		warning("HQR: Could not open %s", filename);
+		return 0;
 	}
 
 	uint32 headerSize;




More information about the Scummvm-git-logs mailing list