[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