[Scummvm-git-logs] scummvm master -> 082985ee82349bc0d1f7a033e2b474fed8eaebef
mgerhardy
martin.gerhardy at gmail.com
Tue Nov 17 18:36:05 UTC 2020
This automated email contains information about 7 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
3d254b4e79 TWINE: reduced scope
4467f467ef TWINE: renamed actor members
36ac253f3f TWINE: improved parsing BonusParameter
5d9ffc23b7 TWINE: renamed scene members
f037bddc53 TWINE: plug memory leaks
fd6d209c38 TWINE: early opt-out in getAllocVoxEntry
082985ee82 TWINE: fixed memory leaks
Commit: 3d254b4e795b599f790dc3387fbe0c0812230a08
https://github.com/scummvm/scummvm/commit/3d254b4e795b599f790dc3387fbe0c0812230a08
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-11-17T19:35:41+01:00
Commit Message:
TWINE: reduced scope
Changed paths:
engines/twine/animations.cpp
diff --git a/engines/twine/animations.cpp b/engines/twine/animations.cpp
index 49b1b11f52..c585a9b367 100644
--- a/engines/twine/animations.cpp
+++ b/engines/twine/animations.cpp
@@ -152,17 +152,17 @@ void Animations::applyAnimStepRotation(uint8 **ptr, int32 bp, int32 bx, const ui
lastAngle &= 0x3FF;
newAngle &= 0x3FF;
- int16 angleDif = newAngle - lastAngle;
+ int16 angleDiff = newAngle - lastAngle;
int16 computedAngle;
- if (angleDif) {
- if (angleDif < -0x200) {
- angleDif += 0x400;
- } else if (angleDif > 0x200) {
- angleDif -= 0x400;
+ if (angleDiff) {
+ if (angleDiff < -0x200) {
+ angleDiff += 0x400;
+ } else if (angleDiff > 0x200) {
+ angleDiff -= 0x400;
}
- computedAngle = lastAngle + (angleDif * bp) / bx;
+ computedAngle = lastAngle + (angleDiff * bp) / bx;
} else {
computedAngle = lastAngle;
}
@@ -462,10 +462,9 @@ void Animations::processAnimActions(int32 actorIdx) {
return;
}
- int32 animPos;
switch (actionType) {
case ACTION_HITTING: {
- animPos = stream.readByte() - 1;
+ int32 animPos = stream.readByte() - 1;
const int8 strength = stream.readByte();
if (animPos == actor->animPosition) {
@@ -475,7 +474,7 @@ void Animations::processAnimActions(int32 actorIdx) {
break;
}
case ACTION_SAMPLE: {
- animPos = stream.readByte();
+ int32 animPos = stream.readByte();
const int16 sampleIdx = stream.readSint16LE();
if (animPos == actor->animPosition) {
@@ -484,7 +483,7 @@ void Animations::processAnimActions(int32 actorIdx) {
break;
}
case ACTION_SAMPLE_FREQ: {
- animPos = stream.readByte();
+ int32 animPos = stream.readByte();
const int16 sampleIdx = stream.readSint16LE();
int16 frequency = stream.readSint16LE();
@@ -495,7 +494,7 @@ void Animations::processAnimActions(int32 actorIdx) {
break;
}
case ACTION_THROW_EXTRA_BONUS: {
- animPos = stream.readByte();
+ int32 animPos = stream.readByte();
const int32 yHeight = stream.readSint16LE();
const int32 sprite = stream.readByte();
const int32 cx = stream.readSint16LE();
@@ -510,7 +509,7 @@ void Animations::processAnimActions(int32 actorIdx) {
break;
}
case ACTION_THROW_MAGIC_BALL: {
- animPos = stream.readByte();
+ int32 animPos = stream.readByte();
const int32 var_8 = stream.readSint16LE();
const int32 dx = stream.readSint16LE();
const int32 var_24 = stream.readSint16LE();
@@ -522,7 +521,7 @@ void Animations::processAnimActions(int32 actorIdx) {
break;
}
case ACTION_SAMPLE_REPEAT: {
- animPos = stream.readByte();
+ int32 animPos = stream.readByte();
const int16 sampleIdx = stream.readSint16LE();
const int16 repeat = stream.readSint16LE();
@@ -531,8 +530,8 @@ void Animations::processAnimActions(int32 actorIdx) {
}
break;
}
- case ACTION_UNKNOWN_6:
- animPos = stream.readByte();
+ case ACTION_UNKNOWN_6: {
+ int32 animPos = stream.readByte();
if (animPos == actor->animPosition) {
//The folowing fetches 7 bytes, but the else block skips only 6 bytes.
// Please check if that's correct.
@@ -547,8 +546,9 @@ void Animations::processAnimActions(int32 actorIdx) {
stream.skip(6);
}
break;
+ }
case ACTION_UNKNOWN_7: {
- animPos = stream.readByte();
+ int32 animPos = stream.readByte();
const int32 yHeight = stream.readSint16LE();
const int32 var_C = stream.readByte();
const int32 dx = stream.readSint16LE();
@@ -563,7 +563,7 @@ void Animations::processAnimActions(int32 actorIdx) {
break;
}
case ACTION_SAMPLE_STOP: {
- animPos = stream.readByte();
+ int32 animPos = stream.readByte();
const int32 sampleIdx = stream.readByte(); //why is it reading a byte but saving it in a 32bit variable?
stream.skip(1); //what is the meaning of this extra byte?
@@ -572,29 +572,32 @@ void Animations::processAnimActions(int32 actorIdx) {
}
break;
}
- case ACTION_SAMPLE_BRICK_1:
- animPos = stream.readByte();
+ case ACTION_SAMPLE_BRICK_1: {
+ int32 animPos = stream.readByte();
if (animPos == actor->animPosition && (actor->brickSound & 0x0F0) != 0x0F0) {
const int16 sampleIdx = (actor->brickSound & 0x0F) + Samples::WalkFloorBegin;
_engine->_sound->playSample(sampleIdx, _engine->getRandomNumber(1000) + 3596, 1, actor->x, actor->y, actor->z, actorIdx);
}
break;
- case ACTION_SAMPLE_BRICK_2:
- animPos = stream.readByte();
+ }
+ case ACTION_SAMPLE_BRICK_2: {
+ int32 animPos = stream.readByte();
if (animPos == actor->animPosition && (actor->brickSound & 0x0F0) != 0x0F0) {
const int16 sampleIdx = (actor->brickSound & 0x0F) + Samples::WalkFloorBegin;
_engine->_sound->playSample(sampleIdx, _engine->getRandomNumber(1000) + 3596, 1, actor->x, actor->y, actor->z, actorIdx);
}
break;
- case ACTION_HERO_HITTING:
- animPos = stream.readByte() - 1;
+ }
+ case ACTION_HERO_HITTING: {
+ int32 animPos = stream.readByte() - 1;
if (animPos == actor->animPosition) {
actor->strengthOfHit = magicLevelStrengthOfHit[_engine->_gameState->magicLevelIdx];
actor->dynamicFlags.bIsHitting = 1;
}
break;
+ }
case ACTION_UNKNOWN_13: {
- animPos = stream.readByte();
+ int32 animPos = stream.readByte();
const int32 distanceX = stream.readSint16LE();
const int32 distanceY = stream.readSint16LE();
const int32 distanceZ = stream.readSint16LE();
@@ -618,7 +621,7 @@ void Animations::processAnimActions(int32 actorIdx) {
break;
}
case ACTION_UNKNOWN_14: {
- animPos = stream.readByte();
+ int32 animPos = stream.readByte();
const int32 distanceX = stream.readSint16LE();
const int32 distanceY = stream.readSint16LE();
const int32 distanceZ = stream.readSint16LE();
@@ -644,7 +647,7 @@ void Animations::processAnimActions(int32 actorIdx) {
break;
}
case ACTION_UNKNOWN_15: {
- animPos = stream.readByte();
+ int32 animPos = stream.readByte();
const int32 distanceX = stream.readSint16LE();
const int32 distanceY = stream.readSint16LE();
const int32 distanceZ = stream.readSint16LE();
Commit: 4467f467ef81fdb72c2e1caf06baaaafbf6b8c76
https://github.com/scummvm/scummvm/commit/4467f467ef81fdb72c2e1caf06baaaafbf6b8c76
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-11-17T19:35:41+01:00
Commit Message:
TWINE: renamed actor members
Changed paths:
engines/twine/actor.cpp
engines/twine/actor.h
engines/twine/movements.cpp
engines/twine/redraw.cpp
engines/twine/scene.cpp
engines/twine/twine.cpp
diff --git a/engines/twine/actor.cpp b/engines/twine/actor.cpp
index 49c20ab90e..7d50d01243 100644
--- a/engines/twine/actor.cpp
+++ b/engines/twine/actor.cpp
@@ -390,10 +390,10 @@ void Actor::resetActor(int16 actorIdx) {
actor->speed = 40;
actor->controlMode = ControlMode::kNoMove;
- actor->info0 = 0;
- actor->info1 = 0;
- actor->info2 = 0;
- actor->info3 = 0;
+ actor->cropLeft = 0;
+ actor->cropTop = 0;
+ actor->cropRight = 0;
+ actor->cropBottom = 0;
actor->setBrickShape(ShapeType::kNone);
actor->collision = -1;
diff --git a/engines/twine/actor.h b/engines/twine/actor.h
index 7bd1e2d0da..d5e57523ad 100644
--- a/engines/twine/actor.h
+++ b/engines/twine/actor.h
@@ -157,10 +157,11 @@ public:
int32 angle = 0;
int32 speed = 0;
ControlMode controlMode = ControlMode::kNoMove;
- int32 info0 = 0; // cropLeft
- int32 info1 = 0; // cropTop
- int32 info2 = 0; // cropRight
- int32 info3 = 0; // cropBottom
+ int32 delayInMillis = 0;
+ int32 cropLeft = 0;
+ int32 cropTop = 0;
+ int32 cropRight = 0;
+ int32 cropBottom = 0;
int32 followedActor = 0; // same as info3
int32 bonusAmount = 0; // field_12
int32 talkColor = 0;
diff --git a/engines/twine/movements.cpp b/engines/twine/movements.cpp
index 44047d5558..e66e774bc9 100644
--- a/engines/twine/movements.cpp
+++ b/engines/twine/movements.cpp
@@ -391,15 +391,15 @@ void Movements::processRandomAction(int actorIdx) {
if (actor->brickCausesDamage()) {
moveActor(actor->angle, (((_engine->getRandomNumber() & 0x100) + (actor->angle - 0x100)) & 0x3FF), actor->speed, &actor->move);
- actor->info0 = _engine->getRandomNumber(300) + _engine->lbaTime + 300;
+ actor->delayInMillis = _engine->getRandomNumber(300) + _engine->lbaTime + 300;
_engine->_animations->initAnim(AnimationTypes::kStanding, 0, AnimationTypes::kAnimInvalid, actorIdx);
}
if (!actor->move.numOfStep) {
_engine->_animations->initAnim(AnimationTypes::kForward, 0, AnimationTypes::kAnimInvalid, actorIdx);
- if (_engine->lbaTime > actor->info0) {
+ if (_engine->lbaTime > actor->delayInMillis) {
moveActor(actor->angle, (((_engine->getRandomNumber() & 0x100) + (actor->angle - 0x100)) & 0x3FF), actor->speed, &actor->move);
- actor->info0 = _engine->getRandomNumber(300) + _engine->lbaTime + 300;
+ actor->delayInMillis = _engine->getRandomNumber(300) + _engine->lbaTime + 300;
}
}
}
diff --git a/engines/twine/redraw.cpp b/engines/twine/redraw.cpp
index 720de77370..929d24bd6b 100644
--- a/engines/twine/redraw.cpp
+++ b/engines/twine/redraw.cpp
@@ -458,7 +458,7 @@ void Redraw::redrawEngineActions(int32 bgRedraw) { // fullRedraw
renderBottom = renderTop + spriteHeight;
if (actor2->staticFlags.bUsesClipping) {
- _engine->_interface->setClip(_engine->_renderer->projPosXScreen + actor2->info0, _engine->_renderer->projPosYScreen + actor2->info1, _engine->_renderer->projPosXScreen + actor2->info2, _engine->_renderer->projPosYScreen + actor2->info3);
+ _engine->_interface->setClip(_engine->_renderer->projPosXScreen + actor2->cropLeft, _engine->_renderer->projPosYScreen + actor2->cropTop, _engine->_renderer->projPosXScreen + actor2->cropRight, _engine->_renderer->projPosYScreen + actor2->cropBottom);
} else {
_engine->_interface->setClip(renderLeft, renderTop, renderRight, renderBottom);
}
diff --git a/engines/twine/scene.cpp b/engines/twine/scene.cpp
index b31dff4938..95bf112da9 100644
--- a/engines/twine/scene.cpp
+++ b/engines/twine/scene.cpp
@@ -171,11 +171,12 @@ bool Scene::loadSceneLBA1() {
act->angle = stream.readUint16LE();
act->speed = stream.readUint16LE();
act->controlMode = (ControlMode)stream.readUint16LE();
- act->info0 = stream.readSint16LE();
- act->info1 = stream.readSint16LE();
- act->info2 = stream.readSint16LE();
- act->info3 = stream.readSint16LE();
- act->followedActor = act->info3;
+ act->cropLeft = stream.readSint16LE();
+ act->delayInMillis = act->cropLeft; // TODO: this might not be needed
+ act->cropTop = stream.readSint16LE();
+ act->cropRight = stream.readSint16LE();
+ act->cropBottom = stream.readSint16LE();
+ act->followedActor = act->cropBottom; // TODO: is this needed? and valid?
act->bonusAmount = stream.readByte();
act->talkColor = stream.readByte();
act->armor = stream.readByte();
diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index 794d1c3925..b417686247 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -556,7 +556,7 @@ int32 TwinEEngine::runGameEngine() { // mainLoopInteration
pinguin->setBrickShape(ShapeType::kNone);
_movements->moveActor(pinguin->angle, pinguin->angle, pinguin->speed, &pinguin->move);
_gameState->gameFlags[InventoryItems::kiPinguin] = 0; // byte_50D89 = 0;
- pinguin->info0 = lbaTime + 1500;
+ pinguin->delayInMillis = lbaTime + 1500;
}
break;
}
Commit: 36ac253f3f75d2ad0a2be681c0dea91d04ec03fd
https://github.com/scummvm/scummvm/commit/36ac253f3f75d2ad0a2be681c0dea91d04ec03fd
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-11-17T19:35:41+01:00
Commit Message:
TWINE: improved parsing BonusParameter
Changed paths:
engines/twine/scene.cpp
engines/twine/scene.h
diff --git a/engines/twine/scene.cpp b/engines/twine/scene.cpp
index 95bf112da9..cf3f1eb210 100644
--- a/engines/twine/scene.cpp
+++ b/engines/twine/scene.cpp
@@ -42,55 +42,85 @@
namespace TwinE {
-void Scene::setActorStaticFlags(int32 actorIdx, uint16 staticFlags) {
+void Scene::setActorStaticFlags(ActorStruct* act, uint16 staticFlags) {
if (staticFlags & 0x1) {
- _sceneActors[actorIdx].staticFlags.bComputeCollisionWithObj = 1;
+ act->staticFlags.bComputeCollisionWithObj = 1;
}
if (staticFlags & 0x2) {
- _sceneActors[actorIdx].staticFlags.bComputeCollisionWithBricks = 1;
+ act->staticFlags.bComputeCollisionWithBricks = 1;
}
if (staticFlags & 0x4) {
- _sceneActors[actorIdx].staticFlags.bIsZonable = 1;
+ act->staticFlags.bIsZonable = 1;
}
if (staticFlags & 0x8) {
- _sceneActors[actorIdx].staticFlags.bUsesClipping = 1;
+ act->staticFlags.bUsesClipping = 1;
}
if (staticFlags & 0x10) {
- _sceneActors[actorIdx].staticFlags.bCanBePushed = 1;
+ act->staticFlags.bCanBePushed = 1;
}
if (staticFlags & 0x20) {
- _sceneActors[actorIdx].staticFlags.bComputeLowCollision = 1;
+ act->staticFlags.bComputeLowCollision = 1;
}
if (staticFlags & 0x40) {
- _sceneActors[actorIdx].staticFlags.bCanDrown = 1;
+ act->staticFlags.bCanDrown = 1;
}
if (staticFlags & 0x80) {
- _sceneActors[actorIdx].staticFlags.bComputeCollisionWithFloor = 1;
+ act->staticFlags.bComputeCollisionWithFloor = 1;
}
if (staticFlags & 0x100) {
- _sceneActors[actorIdx].staticFlags.bUnk0100 = 1;
+ act->staticFlags.bUnk0100 = 1;
}
if (staticFlags & 0x200) {
- _sceneActors[actorIdx].staticFlags.bIsHidden = 1;
+ act->staticFlags.bIsHidden = 1;
}
if (staticFlags & 0x400) {
- _sceneActors[actorIdx].staticFlags.bIsSpriteActor = 1;
+ act->staticFlags.bIsSpriteActor = 1;
}
if (staticFlags & 0x800) {
- _sceneActors[actorIdx].staticFlags.bCanFall = 1;
+ act->staticFlags.bCanFall = 1;
}
if (staticFlags & 0x1000) {
- _sceneActors[actorIdx].staticFlags.bDoesntCastShadow = 1;
+ act->staticFlags.bDoesntCastShadow = 1;
}
if (staticFlags & 0x2000) {
//sceneActors[actorIdx].staticFlags.bIsBackgrounded = 1;
}
if (staticFlags & 0x4000) {
- _sceneActors[actorIdx].staticFlags.bIsCarrierActor = 1;
+ act->staticFlags.bIsCarrierActor = 1;
}
if (staticFlags & 0x8000) {
- _sceneActors[actorIdx].staticFlags.bUseMiniZv = 1;
+ act->staticFlags.bUseMiniZv = 1;
+ }
+}
+
+void Scene::setBonusParameterFlags(ActorStruct* act, uint16 bonusFlags) {
+ if (bonusFlags & 0x1) {
+ act->bonusParameter.unk1 = 1;
+ }
+ if (bonusFlags & 0x2) {
+ act->bonusParameter.unk2 = 1;
+ }
+ if (bonusFlags & 0x4) {
+ act->bonusParameter.unk3 = 1;
+ }
+ if (bonusFlags & 0x8) {
+ act->bonusParameter.unk4 = 1;
+ }
+ if (bonusFlags & 0x10) {
+ act->bonusParameter.kashes = 1;
+ }
+ if (bonusFlags & 0x20) {
+ act->bonusParameter.lifepoints = 1;
+ }
+ if (bonusFlags & 0x40) {
+ act->bonusParameter.magicpoints = 1;
+ }
+ if (bonusFlags & 0x80) {
+ act->bonusParameter.key = 1;
+ }
+ if (bonusFlags & 0x100) {
+ act->bonusParameter.cloverleaf = 1;
}
}
@@ -147,10 +177,9 @@ bool Scene::loadSceneLBA1() {
for (int32 i = 1; i < sceneNumActors; i++) {
_engine->_actor->resetActor(i);
- const uint16 staticFlags = stream.readUint16LE();
- setActorStaticFlags(i, staticFlags);
-
ActorStruct* act = &_sceneActors[i];
+ setActorStaticFlags(act, stream.readUint16LE());
+
act->entity = stream.readUint16LE();
if (!act->staticFlags.bIsSpriteActor) {
@@ -167,7 +196,7 @@ bool Scene::loadSceneLBA1() {
act->z = stream.readUint16LE();
act->collisionZ = act->z;
act->strengthOfHit = stream.readByte();
- *(uint16*)&act->bonusParameter = stream.readUint16LE() & 0xFE;
+ setBonusParameterFlags(act, stream.readUint16LE());
act->angle = stream.readUint16LE();
act->speed = stream.readUint16LE();
act->controlMode = (ControlMode)stream.readUint16LE();
diff --git a/engines/twine/scene.h b/engines/twine/scene.h
index 8f595ca77f..05673eda8d 100644
--- a/engines/twine/scene.h
+++ b/engines/twine/scene.h
@@ -242,7 +242,8 @@ private:
/** Process zone extra bonus */
void processZoneExtraBonus(ZoneStruct *zone);
- void setActorStaticFlags(int32 actorIdx, uint16 staticFlags);
+ void setActorStaticFlags(ActorStruct* act, uint16 staticFlags);
+ void setBonusParameterFlags(ActorStruct* act, uint16 bonusFlags);
bool loadSceneLBA1();
/** Initialize new scene */
bool initScene(int32 index);
Commit: 5d9ffc23b7b857447f5bf101041f1b1282915e10
https://github.com/scummvm/scummvm/commit/5d9ffc23b7b857447f5bf101041f1b1282915e10
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-11-17T19:35:41+01:00
Commit Message:
TWINE: renamed scene members
Changed paths:
engines/twine/actor.cpp
engines/twine/actor.h
engines/twine/scene.cpp
engines/twine/scene.h
diff --git a/engines/twine/actor.cpp b/engines/twine/actor.cpp
index 7d50d01243..18283fcdde 100644
--- a/engines/twine/actor.cpp
+++ b/engines/twine/actor.cpp
@@ -490,11 +490,22 @@ void Actor::processActorExtraBonus(int32 actorIdx) { // GiveExtraBonus
// FIXME add constant for sample index
_engine->_sound->playSample(Samples::ItemPopup, 0x1000, 1, actor->x, actor->y, actor->z, actorIdx);
} else {
- int32 angle = _engine->_movements->getAngleAndSetTargetActorDistance(actor->x, actor->z, _engine->_scene->sceneHero->x, _engine->_scene->sceneHero->z);
+ const int32 angle = _engine->_movements->getAngleAndSetTargetActorDistance(actor->x, actor->z, _engine->_scene->sceneHero->x, _engine->_scene->sceneHero->z);
_engine->_extra->addExtraBonus(actor->x, actor->y + actor->boudingBox.y.topRight, actor->z, 200, angle, bonusSprite, actor->bonusAmount);
// FIXME add constant for sample index
_engine->_sound->playSample(Samples::ItemPopup, 0x1000, 1, actor->x, actor->y + actor->boudingBox.y.topRight, actor->z, actorIdx);
}
}
+void ActorStruct::loadModel(int32 modelIndex) {
+ entity = modelIndex;
+ if (!staticFlags.bIsSpriteActor) {
+ entityDataSize = HQR::getAllocEntry(&entityDataPtr, Resources::HQR_FILE3D_FILE, modelIndex);
+ } else {
+ entityDataSize = 0;
+ free(entityDataPtr);
+ entityDataPtr = nullptr;
+ }
+}
+
} // namespace TwinE
diff --git a/engines/twine/actor.h b/engines/twine/actor.h
index d5e57523ad..cfcd31177d 100644
--- a/engines/twine/actor.h
+++ b/engines/twine/actor.h
@@ -138,6 +138,7 @@ public:
inline void setBrickShape(ShapeType shapeType) { _brickShape = shapeType; _brickCausesDamage = false; }
inline void setBrickCausesDamage() { _brickCausesDamage = true; }
inline bool brickCausesDamage() { return _brickCausesDamage; }
+ void loadModel(int32 modelIndex);
int32 entity = 0; // costumeIndex
int32 body = 0;
diff --git a/engines/twine/scene.cpp b/engines/twine/scene.cpp
index cf3f1eb210..3bfe2091ab 100644
--- a/engines/twine/scene.cpp
+++ b/engines/twine/scene.cpp
@@ -129,7 +129,7 @@ bool Scene::loadSceneLBA1() {
// load scene ambience properties
sceneTextBank = stream.readByte();
- currentGameOverScene = stream.readByte();
+ _currentGameOverScene = stream.readByte();
stream.skip(4);
alphaLight = stream.readUint16LE();
@@ -139,31 +139,31 @@ bool Scene::loadSceneLBA1() {
alphaLight = 896;
betaLight = 950;
- sampleAmbiance[0] = stream.readUint16LE();
- sampleRepeat[0] = stream.readUint16LE();
- sampleRound[0] = stream.readUint16LE();
+ _sampleAmbiance[0] = stream.readUint16LE();
+ _sampleRepeat[0] = stream.readUint16LE();
+ _sampleRound[0] = stream.readUint16LE();
- sampleAmbiance[1] = stream.readUint16LE();
- sampleRepeat[1] = stream.readUint16LE();
- sampleRound[1] = stream.readUint16LE();
+ _sampleAmbiance[1] = stream.readUint16LE();
+ _sampleRepeat[1] = stream.readUint16LE();
+ _sampleRound[1] = stream.readUint16LE();
- sampleAmbiance[2] = stream.readUint16LE();
- sampleRepeat[2] = stream.readUint16LE();
- sampleRound[2] = stream.readUint16LE();
+ _sampleAmbiance[2] = stream.readUint16LE();
+ _sampleRepeat[2] = stream.readUint16LE();
+ _sampleRound[2] = stream.readUint16LE();
- sampleAmbiance[3] = stream.readUint16LE();
- sampleRepeat[3] = stream.readUint16LE();
- sampleRound[3] = stream.readUint16LE();
+ _sampleAmbiance[3] = stream.readUint16LE();
+ _sampleRepeat[3] = stream.readUint16LE();
+ _sampleRound[3] = stream.readUint16LE();
- sampleMinDelay = stream.readUint16LE();
- sampleMinDelayRnd = stream.readUint16LE();
+ _sampleMinDelay = stream.readUint16LE();
+ _sampleMinDelayRnd = stream.readUint16LE();
- sceneMusic = stream.readByte();
+ _sceneMusic = stream.readByte();
// load hero properties
- sceneHeroX = stream.readUint16LE();
- sceneHeroY = stream.readUint16LE();
- sceneHeroZ = stream.readUint16LE();
+ _sceneHeroX = stream.readUint16LE();
+ _sceneHeroY = stream.readUint16LE();
+ _sceneHeroZ = stream.readUint16LE();
sceneHero->moveScriptSize = stream.readUint16LE();
sceneHero->moveScript = currentScene + stream.pos();
@@ -180,11 +180,7 @@ bool Scene::loadSceneLBA1() {
ActorStruct* act = &_sceneActors[i];
setActorStaticFlags(act, stream.readUint16LE());
- act->entity = stream.readUint16LE();
-
- if (!act->staticFlags.bIsSpriteActor) {
- act->entityDataSize = HQR::getAllocEntry(&act->entityDataPtr, Resources::HQR_FILE3D_FILE, act->entity);
- }
+ act->loadModel(stream.readUint16LE());
act->body = stream.readByte();
act->anim = (AnimationTypes) stream.readByte();
@@ -314,15 +310,15 @@ void Scene::changeScene() {
_engine->_grid->initGrid(needChangeScene);
if (heroPositionType == ScenePositionType::kZone) {
- newHeroX = zoneHeroX;
- newHeroY = zoneHeroY;
- newHeroZ = zoneHeroZ;
+ newHeroX = _zoneHeroX;
+ newHeroY = _zoneHeroY;
+ newHeroZ = _zoneHeroZ;
}
if (heroPositionType == ScenePositionType::kScene || heroPositionType == ScenePositionType::kNoPosition) {
- newHeroX = sceneHeroX;
- newHeroY = sceneHeroY;
- newHeroZ = sceneHeroZ;
+ newHeroX = _sceneHeroX;
+ newHeroY = _sceneHeroY;
+ newHeroZ = _sceneHeroZ;
}
sceneHero->x = newHeroX;
@@ -346,7 +342,7 @@ void Scene::changeScene() {
_engine->_gameState->inventoryNumKeys = 0;
_engine->disableScreenRecenter = false;
heroPositionType = ScenePositionType::kNoPosition;
- sampleAmbienceTime = 0;
+ _sampleAmbienceTime = 0;
_engine->_grid->newCameraX = _sceneActors[currentlyFollowedActor].x >> 9;
_engine->_grid->newCameraY = _sceneActors[currentlyFollowedActor].y >> 8;
@@ -365,8 +361,8 @@ void Scene::changeScene() {
_engine->_renderer->setLightVector(alphaLight, betaLight, 0);
- if (sceneMusic != -1) {
- _engine->_music->playTrackMusic(sceneMusic);
+ if (_sceneMusic != -1) {
+ _engine->_music->playTrackMusic(_sceneMusic);
}
}
@@ -377,20 +373,20 @@ ActorStruct *Scene::getActor(int32 actorIdx) {
}
void Scene::initSceneVars() {
- sampleAmbiance[0] = -1;
- sampleAmbiance[1] = -1;
- sampleAmbiance[2] = -1;
- sampleAmbiance[3] = -1;
+ _sampleAmbiance[0] = -1;
+ _sampleAmbiance[1] = -1;
+ _sampleAmbiance[2] = -1;
+ _sampleAmbiance[3] = -1;
- sampleRepeat[0] = 0;
- sampleRepeat[1] = 0;
- sampleRepeat[2] = 0;
- sampleRepeat[3] = 0;
+ _sampleRepeat[0] = 0;
+ _sampleRepeat[1] = 0;
+ _sampleRepeat[2] = 0;
+ _sampleRepeat[3] = 0;
- sampleRound[0] = 0;
- sampleRound[1] = 0;
- sampleRound[2] = 0;
- sampleRound[3] = 0;
+ _sampleRound[0] = 0;
+ _sampleRound[1] = 0;
+ _sampleRound[2] = 0;
+ _sampleRound[3] = 0;
sceneNumActors = 0;
sceneNumZones = 0;
@@ -398,21 +394,21 @@ void Scene::initSceneVars() {
}
void Scene::processEnvironmentSound() {
- if (_engine->lbaTime >= sampleAmbienceTime) {
+ if (_engine->lbaTime >= _sampleAmbienceTime) {
int16 currentAmb = _engine->getRandomNumber(4); // random ambiance
for (int32 s = 0; s < 4; s++) {
- if (!(samplePlayed & (1 << currentAmb))) { // if not already played
- samplePlayed |= (1 << currentAmb); // make sample played
+ if (!(_samplePlayed & (1 << currentAmb))) { // if not already played
+ _samplePlayed |= (1 << currentAmb); // make sample played
- if (samplePlayed == 15) { // reset if all samples played
- samplePlayed = 0;
+ if (_samplePlayed == 15) { // reset if all samples played
+ _samplePlayed = 0;
}
- const int16 sampleIdx = sampleAmbiance[currentAmb];
+ const int16 sampleIdx = _sampleAmbiance[currentAmb];
if (sampleIdx != -1) {
- int16 decal = sampleRound[currentAmb];
- int16 repeat = sampleRepeat[currentAmb];
+ int16 decal = _sampleRound[currentAmb];
+ int16 repeat = _sampleRepeat[currentAmb];
_engine->_sound->playSample(sampleIdx, (4096 + _engine->getRandomNumber(decal) - (decal / 2)), repeat, 110, -1, 110);
break;
@@ -424,7 +420,7 @@ void Scene::processEnvironmentSound() {
}
// compute next ambiance timer
- sampleAmbienceTime = _engine->lbaTime + (_engine->getRandomNumber(sampleMinDelayRnd) + sampleMinDelay) * 50;
+ _sampleAmbienceTime = _engine->lbaTime + (_engine->getRandomNumber(_sampleMinDelayRnd) + _sampleMinDelay) * 50;
}
}
@@ -473,9 +469,9 @@ void Scene::processActorZones(int32 actorIdx) {
case kCube:
if (IS_HERO(actorIdx) && actor->life > 0) {
needChangeScene = zone->infoData.ChangeScene.newSceneIdx;
- zoneHeroX = actor->x - zone->bottomLeft.x + zone->infoData.ChangeScene.x;
- zoneHeroY = actor->y - zone->bottomLeft.y + zone->infoData.ChangeScene.y;
- zoneHeroZ = actor->z - zone->bottomLeft.z + zone->infoData.ChangeScene.z;
+ _zoneHeroX = actor->x - zone->bottomLeft.x + zone->infoData.ChangeScene.x;
+ _zoneHeroY = actor->y - zone->bottomLeft.y + zone->infoData.ChangeScene.y;
+ _zoneHeroZ = actor->z - zone->bottomLeft.z + zone->infoData.ChangeScene.z;
heroPositionType = ScenePositionType::kZone;
}
break;
diff --git a/engines/twine/scene.h b/engines/twine/scene.h
index 05673eda8d..f43ad41a40 100644
--- a/engines/twine/scene.h
+++ b/engines/twine/scene.h
@@ -255,25 +255,25 @@ private:
int32 _currentSceneSize = 0;
/** Timer for the next sample ambience in scene */
- int32 sampleAmbienceTime = 0;
- int16 sampleAmbiance[4] {0};
- int16 sampleRepeat[4] {0};
- int16 sampleRound[4] {0};
- int16 sampleMinDelay = 0;
- int16 sampleMinDelayRnd = 0;
+ int32 _sampleAmbienceTime = 0;
+ int16 _sampleAmbiance[4] {0};
+ int16 _sampleRepeat[4] {0};
+ int16 _sampleRound[4] {0};
+ int16 _sampleMinDelay = 0;
+ int16 _sampleMinDelayRnd = 0;
- int16 samplePlayed = 0;
+ int16 _samplePlayed = 0;
- int16 sceneMusic = 0;
+ int16 _sceneMusic = 0;
- int16 sceneHeroX = 0; // newTwinsenXByScene
- int16 sceneHeroY = 0; // newTwinsenYByScene
- int16 sceneHeroZ = 0; // newTwinsenZByScene
+ int16 _sceneHeroX = 0; // newTwinsenXByScene
+ int16 _sceneHeroY = 0; // newTwinsenYByScene
+ int16 _sceneHeroZ = 0; // newTwinsenZByScene
- int16 zoneHeroX = 0; // newTwinsenXByZone
- int16 zoneHeroY = 0; // newTwinsenYByZone
- int16 zoneHeroZ = 0; // newTwinsenZByZone
- int32 currentGameOverScene = 0;
+ int16 _zoneHeroX = 0; // newTwinsenXByZone
+ int16 _zoneHeroY = 0; // newTwinsenYByZone
+ int16 _zoneHeroZ = 0; // newTwinsenZByZone
+ int32 _currentGameOverScene = 0;
public:
Scene(TwinEEngine *engine) : _engine(engine) {}
Commit: f037bddc533f24ae500096bd34d3f1d061168e63
https://github.com/scummvm/scummvm/commit/f037bddc533f24ae500096bd34d3f1d061168e63
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-11-17T19:35:41+01:00
Commit Message:
TWINE: plug memory leaks
Changed paths:
engines/twine/sound.cpp
engines/twine/sound.h
engines/twine/twine.cpp
diff --git a/engines/twine/sound.cpp b/engines/twine/sound.cpp
index 82a5de14d4..b026b2a7bd 100644
--- a/engines/twine/sound.cpp
+++ b/engines/twine/sound.cpp
@@ -41,6 +41,10 @@ namespace TwinE {
Sound::Sound(TwinEEngine *engine) : _engine(engine) {
}
+Sound::~Sound() {
+ _engine->_system->getMixer()->stopAll();
+}
+
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));
@@ -130,6 +134,7 @@ bool Sound::playSample(int channelIdx, int index, uint8 *sampPtr, int32 sampSize
Audio::SeekableAudioStream *audioStream = Audio::makeVOCStream(stream, DisposeAfterUse::YES);
if (audioStream == nullptr) {
warning("Failed to create audio stream for %s", name);
+ delete stream;
return false;
}
_engine->_system->getMixer()->playStream(soundType, &samplesPlaying[channelIdx], audioStream, index);
diff --git a/engines/twine/sound.h b/engines/twine/sound.h
index fc9d9c1bad..72d3ebfe60 100644
--- a/engines/twine/sound.h
+++ b/engines/twine/sound.h
@@ -71,6 +71,7 @@ private:
public:
Sound(TwinEEngine *engine);
+ ~Sound();
/**
* Play FLA movie samples
diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index b417686247..e971a65b73 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -128,6 +128,7 @@ TwinEEngine::~TwinEEngine() {
delete _interface;
delete _menu;
delete _flaMovies;
+ delete _menuOptions;
delete _music;
delete _redraw;
delete _renderer;
Commit: fd6d209c38406e9b3503c6127ac38389f0e3fee4
https://github.com/scummvm/scummvm/commit/fd6d209c38406e9b3503c6127ac38389f0e3fee4
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-11-17T19:35:41+01:00
Commit Message:
TWINE: early opt-out in getAllocVoxEntry
Changed paths:
engines/twine/hqr.cpp
diff --git a/engines/twine/hqr.cpp b/engines/twine/hqr.cpp
index 63a6277438..b9fde09f68 100644
--- a/engines/twine/hqr.cpp
+++ b/engines/twine/hqr.cpp
@@ -269,10 +269,14 @@ int32 getVoxEntry(uint8 *ptr, const char *filename, int32 index, int32 hiddenInd
int32 getAllocVoxEntry(uint8 **ptr, const char *filename, int32 index, int32 hiddenIndex) {
const int32 size = voxEntrySize(filename, index, hiddenIndex);
+ if (size == 0) {
+ warning("HQR: vox entry with 0 size found for index: %d", index);
+ return 0;
+ }
*ptr = (uint8 *)malloc(size * sizeof(uint8));
if (!*ptr) {
- warning("HQR: unable to allocate entry memory");
+ warning("HQR: unable to allocate entry memory of size %d for index: %d", size, index);
return 0;
}
const int32 entrySize = getVoxEntry(*ptr, filename, index, hiddenIndex);
Commit: 082985ee82349bc0d1f7a033e2b474fed8eaebef
https://github.com/scummvm/scummvm/commit/082985ee82349bc0d1f7a033e2b474fed8eaebef
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-11-17T19:35:41+01:00
Commit Message:
TWINE: fixed memory leaks
Changed paths:
engines/twine/actor.cpp
engines/twine/actor.h
engines/twine/grid.cpp
engines/twine/hqr.cpp
engines/twine/resources.cpp
engines/twine/scene.cpp
engines/twine/scene.h
engines/twine/text.cpp
engines/twine/text.h
diff --git a/engines/twine/actor.cpp b/engines/twine/actor.cpp
index 18283fcdde..82bf875696 100644
--- a/engines/twine/actor.cpp
+++ b/engines/twine/actor.cpp
@@ -43,6 +43,7 @@ Actor::Actor(TwinEEngine *engine) : _engine(engine) {
}
Actor::~Actor() {
+ _engine->_scene->getActor(OWN_ACTOR_SCENE_INDEX)->entityDataPtr = nullptr;
free(heroEntityNORMAL);
free(heroEntityATHLETIC);
free(heroEntityAGGRESSIVE);
@@ -497,6 +498,10 @@ void Actor::processActorExtraBonus(int32 actorIdx) { // GiveExtraBonus
}
}
+ActorStruct::~ActorStruct() {
+ free(entityDataPtr);
+}
+
void ActorStruct::loadModel(int32 modelIndex) {
entity = modelIndex;
if (!staticFlags.bIsSpriteActor) {
diff --git a/engines/twine/actor.h b/engines/twine/actor.h
index cfcd31177d..86d7730755 100644
--- a/engines/twine/actor.h
+++ b/engines/twine/actor.h
@@ -131,6 +131,8 @@ private:
ShapeType _brickShape = ShapeType::kNone; // field_3
bool _brickCausesDamage = false;
public:
+ ~ActorStruct();
+
StaticFlagsStruct staticFlags;
DynamicFlagsStruct dynamicFlags;
diff --git a/engines/twine/grid.cpp b/engines/twine/grid.cpp
index b84dc041fd..040d1047ec 100644
--- a/engines/twine/grid.cpp
+++ b/engines/twine/grid.cpp
@@ -49,6 +49,8 @@ Grid::~Grid() {
for (int32 i = 0; i < ARRAYSIZE(brickTable); i++) {
free(brickTable[i]);
}
+ free(currentGrid);
+ free(currentBll);
}
void Grid::copyGridMask(int32 index, int32 x, int32 y, const Graphics::ManagedSurface& buffer) {
@@ -319,9 +321,6 @@ int32 Grid::loadGridBricks(int32 gridSize) {
if (!brickUsageTable[i]) {
continue;
}
- if (brickTable[i]) {
- free(brickTable[i]);
- }
brickSizeTable[i] = HQR::getAllocEntry(&brickTable[i], Resources::HQR_LBA_BRK_FILE, i);
if (brickSizeTable[i] == 0) {
warning("Failed to load isometric brick index %i", i);
diff --git a/engines/twine/hqr.cpp b/engines/twine/hqr.cpp
index b9fde09f68..ace857b94f 100644
--- a/engines/twine/hqr.cpp
+++ b/engines/twine/hqr.cpp
@@ -198,8 +198,12 @@ int32 numEntries(const char *filename) {
}
int32 getAllocEntry(uint8 **ptr, const char *filename, int32 index) {
+ if (*ptr) {
+ free(*ptr);
+ }
const int32 size = entrySize(filename, index);
if (size <= 0) {
+ *ptr = nullptr;
warning("HQR: failed to get entry for index %i from file: %s", index, filename);
return 0;
}
diff --git a/engines/twine/resources.cpp b/engines/twine/resources.cpp
index f3af058c4a..3dc7aff741 100644
--- a/engines/twine/resources.cpp
+++ b/engines/twine/resources.cpp
@@ -46,11 +46,14 @@ Resources::~Resources() {
free(fontPtr);
free(spriteShadowPtr);
free(spriteBoundingBoxPtr);
+ free(_engine->_screens->mainPalette);
}
void Resources::initPalettes() {
// Init standard palette
- HQR::getAllocEntry(&_engine->_screens->mainPalette, Resources::HQR_RESS_FILE, RESSHQR_MAINPAL);
+ if (HQR::getAllocEntry(&_engine->_screens->mainPalette, Resources::HQR_RESS_FILE, RESSHQR_MAINPAL) == 0) {
+ error("Failed to load main palette");
+ }
_engine->_screens->convertPalToRGBA(_engine->_screens->mainPalette, _engine->_screens->mainPaletteRGBA);
memcpy(_engine->_screens->palette, _engine->_screens->mainPalette, NUMOFCOLORS * 3);
diff --git a/engines/twine/scene.cpp b/engines/twine/scene.cpp
index 3bfe2091ab..61fa22f426 100644
--- a/engines/twine/scene.cpp
+++ b/engines/twine/scene.cpp
@@ -42,6 +42,10 @@
namespace TwinE {
+Scene::~Scene() {
+ free(currentScene);
+}
+
void Scene::setActorStaticFlags(ActorStruct* act, uint16 staticFlags) {
if (staticFlags & 0x1) {
act->staticFlags.bComputeCollisionWithObj = 1;
diff --git a/engines/twine/scene.h b/engines/twine/scene.h
index f43ad41a40..445eae97a6 100644
--- a/engines/twine/scene.h
+++ b/engines/twine/scene.h
@@ -277,6 +277,7 @@ private:
public:
Scene(TwinEEngine *engine) : _engine(engine) {}
+ ~Scene();
uint8 *currentScene = nullptr;
diff --git a/engines/twine/text.cpp b/engines/twine/text.cpp
index c3076a0499..7cc7d013fb 100644
--- a/engines/twine/text.cpp
+++ b/engines/twine/text.cpp
@@ -45,6 +45,11 @@ namespace TwinE {
#define INDEXOFFSET 0
#define DIALOGSOFFSET 1
+Text::~Text() {
+ free(dialTextPtr);
+ free(dialOrderPtr);
+}
+
void Text::initVoxBank(int32 bankIdx) {
static const char *LanguageSufixTypes[] = {
"sys",
diff --git a/engines/twine/text.h b/engines/twine/text.h
index d2601bd4c2..ee0414beb8 100644
--- a/engines/twine/text.h
+++ b/engines/twine/text.h
@@ -204,6 +204,7 @@ private:
int32 dialTextBoxParam2 = 0; // dialogueBoxParam2
public:
Text(TwinEEngine *engine) : _engine(engine) {}
+ ~Text();
// TODO: refactor all this variables and related functions
int32 printTextVar13 = 0;
More information about the Scummvm-git-logs
mailing list