[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