[Scummvm-git-logs] scummvm branch-2-8 -> 6302b367aca247a6b9b9cd4164926990558144ce

mgerhardy noreply at scummvm.org
Tue Jan 2 10:27:48 UTC 2024


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

Summary:
6302b367ac TWINE: reverted parts of 0517e015fc7 to fix bug #14776


Commit: 6302b367aca247a6b9b9cd4164926990558144ce
    https://github.com/scummvm/scummvm/commit/6302b367aca247a6b9b9cd4164926990558144ce
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2024-01-02T11:27:26+01:00

Commit Message:
TWINE: reverted parts of 0517e015fc7 to fix bug #14776

See https://bugs.scummvm.org/ticket/14776 for more details

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


diff --git a/engines/twine/scene/animations.cpp b/engines/twine/scene/animations.cpp
index 9c4cfcd9308..54f16f63d82 100644
--- a/engines/twine/scene/animations.cpp
+++ b/engines/twine/scene/animations.cpp
@@ -467,9 +467,9 @@ void Animations::doAnim(int32 actorIdx) {
 		return;
 	}
 
-	const IVec3 oldPos = actor->_oldPos;
+	const IVec3 &oldPos = actor->_oldPos;
 
-	IVec3 processActor = actor->_processActor;
+	IVec3 &processActor = actor->_processActor;
 	if (actor->_staticFlags.bIsSpriteActor) {
 		if (actor->_strengthOfHit) {
 			actor->_dynamicFlags.bIsHitting = 1;
@@ -635,7 +635,7 @@ void Animations::doAnim(int32 actorIdx) {
 		processActor -= standOnActor->_oldPos;
 		processActor += standOnActor->posObj();
 
-		if (!collision->checkZvOnZv(processActor, actorIdx, actor->_carryBy)) {
+		if (!collision->checkZvOnZv(actorIdx, actor->_carryBy)) {
 			actor->_carryBy = -1; // no longer standing on other actor
 		}
 	}
@@ -647,7 +647,7 @@ void Animations::doAnim(int32 actorIdx) {
 	}
 
 	// actor collisions with bricks
-	int32 col1 = 0;
+	uint32 col1 = 0; 	/** Cause damage in current processed actor */
 	if (actor->_staticFlags.bComputeCollisionWithBricks) {
 		ShapeType col = _engine->_grid->worldColBrick(oldPos);
 
@@ -661,30 +661,31 @@ void Animations::doAnim(int32 actorIdx) {
 		}
 
 		if (actor->_staticFlags.bComputeCollisionWithObj) {
-			collision->checkObjCol(processActor, oldPos, actorIdx);
+			collision->checkObjCol(actorIdx);
 		}
 
 		if (actor->_carryBy != -1 && actor->_dynamicFlags.bIsFalling) {
-			collision->receptionObj(processActor, actorIdx);
+			collision->receptionObj(actorIdx);
 		}
 
 		collision->setCollisionPos(processActor);
 
 		if (IS_HERO(actorIdx) && !actor->_staticFlags.bComputeLowCollision) {
 			// check hero collisions with bricks
-			col1 |= collision->doCornerReajustTwinkel(actor, processActor, oldPos, actor->_boundingBox.mins.x, actor->_boundingBox.mins.y, actor->_boundingBox.mins.z, 1);
-			col1 |= collision->doCornerReajustTwinkel(actor, processActor, oldPos, actor->_boundingBox.maxs.x, actor->_boundingBox.mins.y, actor->_boundingBox.mins.z, 2);
-			col1 |= collision->doCornerReajustTwinkel(actor, processActor, oldPos, actor->_boundingBox.maxs.x, actor->_boundingBox.mins.y, actor->_boundingBox.maxs.z, 4);
-			col1 |= collision->doCornerReajustTwinkel(actor, processActor, oldPos, actor->_boundingBox.mins.x, actor->_boundingBox.mins.y, actor->_boundingBox.maxs.z, 8);
+			col1 |= collision->doCornerReajustTwinkel(actor, actor->_boundingBox.mins.x, actor->_boundingBox.mins.y, actor->_boundingBox.mins.z, 1);
+			col1 |= collision->doCornerReajustTwinkel(actor, actor->_boundingBox.maxs.x, actor->_boundingBox.mins.y, actor->_boundingBox.mins.z, 2);
+			col1 |= collision->doCornerReajustTwinkel(actor, actor->_boundingBox.maxs.x, actor->_boundingBox.mins.y, actor->_boundingBox.maxs.z, 4);
+			col1 |= collision->doCornerReajustTwinkel(actor, actor->_boundingBox.mins.x, actor->_boundingBox.mins.y, actor->_boundingBox.maxs.z, 8);
 		} else {
 			// TODO: hack to fix tank-not-moving bug https://bugs.scummvm.org/ticket/13177
 			// remove processActorSave
 			const IVec3 processActorSave = processActor;
+
 			// check other actors collisions with bricks
-			col1 |= collision->doCornerReajust(processActor, oldPos, actor->_boundingBox.mins.x, actor->_boundingBox.mins.y, actor->_boundingBox.mins.z, 1);
-			col1 |= collision->doCornerReajust(processActor, oldPos, actor->_boundingBox.maxs.x, actor->_boundingBox.mins.y, actor->_boundingBox.mins.z, 2);
-			col1 |= collision->doCornerReajust(processActor, oldPos, actor->_boundingBox.maxs.x, actor->_boundingBox.mins.y, actor->_boundingBox.maxs.z, 4);
-			col1 |= collision->doCornerReajust(processActor, oldPos, actor->_boundingBox.mins.x, actor->_boundingBox.mins.y, actor->_boundingBox.maxs.z, 8);
+			col1 |= collision->doCornerReajust(actor, actor->_boundingBox.mins.x, actor->_boundingBox.mins.y, actor->_boundingBox.mins.z, 1);
+			col1 |= collision->doCornerReajust(actor, actor->_boundingBox.maxs.x, actor->_boundingBox.mins.y, actor->_boundingBox.mins.z, 2);
+			col1 |= collision->doCornerReajust(actor, actor->_boundingBox.maxs.x, actor->_boundingBox.mins.y, actor->_boundingBox.maxs.z, 4);
+			col1 |= collision->doCornerReajust(actor, actor->_boundingBox.mins.x, actor->_boundingBox.mins.y, actor->_boundingBox.maxs.z, 8);
 			// TODO: hack to fix tank-not-moving bug https://bugs.scummvm.org/ticket/13177
 			if (actorIdx == 1 && _engine->_scene->_currentSceneIdx == LBA1SceneId::Hamalayi_Mountains_2nd_fighting_scene) {
 				processActor = processActorSave;
@@ -718,7 +719,7 @@ void Animations::doAnim(int32 actorIdx) {
 		if (col != ShapeType::kNone) {
 			if (col == ShapeType::kSolid) {
 				if (actor->_dynamicFlags.bIsFalling) {
-					collision->receptionObj(processActor, actorIdx);
+					collision->receptionObj(actorIdx);
 					processActor.y = (collision->_collision.y * SIZE_BRICK_Y) + SIZE_BRICK_Y;
 				} else {
 					if (IS_HERO(actorIdx) && _engine->_actor->_heroBehaviour == HeroBehaviourType::kAthletic && actor->_genAnim == AnimationTypes::kForward && _engine->_cfgfile.WallCollision) { // avoid wall hit damage
@@ -741,7 +742,7 @@ void Animations::doAnim(int32 actorIdx) {
 				}
 			} else {
 				if (actor->_dynamicFlags.bIsFalling) {
-					collision->receptionObj(processActor, actorIdx);
+					collision->receptionObj(actorIdx);
 				}
 
 				collision->reajustPos(processActor, col);
@@ -754,7 +755,7 @@ void Animations::doAnim(int32 actorIdx) {
 
 				if (col != ShapeType::kNone) {
 					if (actor->_dynamicFlags.bIsFalling) {
-						collision->receptionObj(processActor, actorIdx);
+						collision->receptionObj(actorIdx);
 					}
 
 					collision->reajustPos(processActor, col);
@@ -791,7 +792,7 @@ void Animations::doAnim(int32 actorIdx) {
 		}
 	} else {
 		if (actor->_staticFlags.bComputeCollisionWithObj) {
-			collision->checkObjCol(processActor, oldPos, actorIdx);
+			collision->checkObjCol(actorIdx);
 		}
 	}
 
diff --git a/engines/twine/scene/collision.cpp b/engines/twine/scene/collision.cpp
index d081008c1ed..1c72fb1a704 100644
--- a/engines/twine/scene/collision.cpp
+++ b/engines/twine/scene/collision.cpp
@@ -40,10 +40,11 @@ namespace TwinE {
 Collision::Collision(TwinEEngine *engine) : _engine(engine) {
 }
 
-bool Collision::checkZvOnZv(const IVec3 &processActor, int32 actorIdx1, int32 actorIdx2) const {
+bool Collision::checkZvOnZv(int32 actorIdx1, int32 actorIdx2) const {
 	const ActorStruct *actor1 = _engine->_scene->getActor(actorIdx1);
 	const ActorStruct *actor2 = _engine->_scene->getActor(actorIdx2);
 
+	const IVec3 &processActor = actor1->_processActor;
 	const IVec3 &mins1 = processActor + actor1->_boundingBox.mins;
 	const IVec3 &maxs1 = processActor + actor1->_boundingBox.maxs;
 
@@ -182,7 +183,7 @@ void Collision::reajustPos(IVec3 &processActor, ShapeType brickShape) const {
 	}
 }
 
-void Collision::handlePushing(IVec3 &processActor, const IVec3 &oldPos, const IVec3 &minsTest, const IVec3 &maxsTest, ActorStruct *ptrobj, ActorStruct *ptrobjt) {
+void Collision::handlePushing(IVec3 &processActor, const IVec3 &minsTest, const IVec3 &maxsTest, ActorStruct *ptrobj, ActorStruct *ptrobjt) {
 	const int32 newAngle = _engine->_movements->getAngle(processActor, ptrobjt->posObj());
 
 	// protect against chain reactions
@@ -226,7 +227,7 @@ void Collision::handlePushing(IVec3 &processActor, const IVec3 &oldPos, const IV
 		}
 	} else if (!ptrobj->_dynamicFlags.bIsFalling) {
 		// refuse pos
-		processActor = oldPos;
+		processActor = ptrobj->_oldPos;
 	}
 }
 
@@ -276,9 +277,10 @@ bool Collision::checkValidObjPos(int32 actorIdx) {
 	return true;
 }
 
-int32 Collision::checkObjCol(IVec3 &processActor, const IVec3 &oldPos, int32 actorIdx) {
+int32 Collision::checkObjCol(int32 actorIdx) {
 	ActorStruct *ptrobj = _engine->_scene->getActor(actorIdx);
 
+	IVec3 &processActor = ptrobj->_processActor;
 	IVec3 mins = processActor + ptrobj->_boundingBox.mins;
 	IVec3 maxs = processActor + ptrobj->_boundingBox.maxs;
 
@@ -301,7 +303,7 @@ int32 Collision::checkObjCol(IVec3 &processActor, const IVec3 &oldPos, int32 act
 						processActor.y = maxsTest.y - ptrobj->_boundingBox.mins.y + 1;
 						ptrobj->_carryBy = a;
 						continue;
-					} else if (checkZvOnZv(processActor, actorIdx, a)) {
+					} else if (checkZvOnZv(actorIdx, a)) {
 						// I walk on a carrier
 						processActor.y = maxsTest.y - ptrobj->_boundingBox.mins.y + 1;
 						ptrobj->_carryBy = a;
@@ -309,11 +311,11 @@ int32 Collision::checkObjCol(IVec3 &processActor, const IVec3 &oldPos, int32 act
 					}
 				} else {
 					// I step on someone
-					if (checkZvOnZv(processActor, actorIdx, a)) {
+					if (checkZvOnZv(actorIdx, a)) {
 						_engine->_actor->hitObj(actorIdx, a, 1, -1);
 					}
 				}
-				handlePushing(processActor, oldPos, minsTest, maxsTest, ptrobj, ptrobjt);
+				handlePushing(processActor, minsTest, maxsTest, ptrobj, ptrobjt);
 			}
 		}
 	}
@@ -333,7 +335,7 @@ int32 Collision::checkObjCol(IVec3 &processActor, const IVec3 &oldPos, int32 act
 			const ActorStruct *actorTest = _engine->_scene->getActor(a);
 
 			// avoid current processed actor
-			if (a != actorIdx && actorTest->_body != -1 && !ptrobj->_staticFlags.bIsHidden && actorTest->_carryBy != actorIdx) {
+			if (a != actorIdx && actorTest->_body != -1 && !actorTest->_staticFlags.bIsHidden && actorTest->_carryBy != actorIdx) {
 				const IVec3 minsTest = actorTest->posObj() + actorTest->_boundingBox.mins;
 				const IVec3 maxsTest = actorTest->posObj() + actorTest->_boundingBox.maxs;
 				if (mins.x < maxsTest.x && maxs.x > minsTest.x && mins.y < maxsTest.y && maxs.y > minsTest.y && mins.z < maxsTest.z && maxs.z > minsTest.z) {
@@ -351,9 +353,11 @@ void Collision::setCollisionPos(const IVec3 &pos) {
 	_processCollision = pos;
 }
 
-int32 Collision::doCornerReajustTwinkel(const ActorStruct *actor, IVec3 &processActor, const IVec3 &oldPos, int32 x, int32 y, int32 z, int32 damageMask) {
+uint32 Collision::doCornerReajustTwinkel(ActorStruct *actor, int32 x, int32 y, int32 z, int32 damageMask) {
+	IVec3 &processActor = actor->_processActor;
+	const IVec3 &oldPos = actor->_oldPos;
 	ShapeType orgcol = _engine->_grid->worldColBrick(processActor);
-	int32 _col1 = 0;
+	uint32 _col1 = 0;
 
 	processActor.x += x;
 	processActor.y += y;
@@ -380,9 +384,11 @@ int32 Collision::doCornerReajustTwinkel(const ActorStruct *actor, IVec3 &process
 	return _col1;
 }
 
-int32 Collision::doCornerReajust(IVec3 &processActor, const IVec3 &oldPos, int32 x, int32 y, int32 z, int32 damageMask) {
+uint32 Collision::doCornerReajust(ActorStruct *actor, int32 x, int32 y, int32 z, int32 damageMask) {
+	IVec3 &processActor = actor->_processActor;
+	const IVec3 &previousActor = actor->_oldPos;
 	ShapeType orgcol = _engine->_grid->worldColBrick(processActor);
-	int32 _col1 = 0;
+	uint32 _col1 = 0;
 
 	processActor.x += x;
 	processActor.y += y;
@@ -394,12 +400,12 @@ int32 Collision::doCornerReajust(IVec3 &processActor, const IVec3 &oldPos, int32
 
 		if (col == ShapeType::kSolid) {
 			_col1 |= damageMask;
-			if (_engine->_grid->worldColBrick(processActor.x, processActor.y, oldPos.z + z) == ShapeType::kSolid) {
-				if (_engine->_grid->worldColBrick(x + oldPos.x, processActor.y, processActor.z) != ShapeType::kSolid) {
-					_processCollision.x = oldPos.x;
+			if (_engine->_grid->worldColBrick(processActor.x, processActor.y, previousActor.z + z) == ShapeType::kSolid) {
+				if (_engine->_grid->worldColBrick(x + previousActor.x, processActor.y, processActor.z) != ShapeType::kSolid) {
+					_processCollision.x = previousActor.x;
 				}
 			} else {
-				_processCollision.z = oldPos.z;
+				_processCollision.z = previousActor.z;
 			}
 		}
 	}
@@ -408,9 +414,10 @@ int32 Collision::doCornerReajust(IVec3 &processActor, const IVec3 &oldPos, int32
 	return _col1;
 }
 
-void Collision::receptionObj(const IVec3 &processActor, int actorIdx) {
+void Collision::receptionObj(int actorIdx) {
 	ActorStruct *actor = _engine->_scene->getActor(actorIdx);
 	if (IS_HERO(actorIdx)) {
+		const IVec3 &processActor = actor->_processActor;
 		const int32 fall = _engine->_scene->_startYFalling - processActor.y;
 
 		if (fall >= SIZE_BRICK_Y * 8) {
diff --git a/engines/twine/scene/collision.h b/engines/twine/scene/collision.h
index 975e65b682b..f1413dcc360 100644
--- a/engines/twine/scene/collision.h
+++ b/engines/twine/scene/collision.h
@@ -35,7 +35,7 @@ class Collision {
 private:
 	TwinEEngine *_engine;
 
-	void handlePushing(IVec3 &processActor, const IVec3 &oldPos, const IVec3 &minsTest, const IVec3 &maxsTest, ActorStruct *actor, ActorStruct *actorTest);
+	void handlePushing(IVec3 &processActor, const IVec3 &minsTest, const IVec3 &maxsTest, ActorStruct *actor, ActorStruct *actorTest);
 
 	/** Actor collision coordinate */
 	IVec3 _processCollision; // SaveNxw, SaveNyw, SaveNzw
@@ -49,7 +49,7 @@ public:
 	 * @param actorIdx1 Actor 1 index
 	 * @param actorIdx2 Actor 2 index
 	 */
-	bool checkZvOnZv(const IVec3 &processActor, int32 actorIdx1, int32 actorIdx2) const;
+	bool checkZvOnZv(int32 actorIdx1, int32 actorIdx2) const;
 
 	int32 boundRuleThree(int32 start, int32 end, int32 maxDelay, int32 delay) const;
 
@@ -63,7 +63,7 @@ public:
 	 * Check collision with actors
 	 * @param actorIx Current process actor index
 	 */
-	int32 checkObjCol(IVec3 &processActor, const IVec3 &oldPos, int32 actorIdx);
+	int32 checkObjCol(int32 actorIdx);
 	bool checkValidObjPos(int32 actorIdx);
 
 	void setCollisionPos(const IVec3 &pos);
@@ -74,7 +74,7 @@ public:
 	 * @param z Hero Z coordinate
 	 * @param damageMask Cause damage mask
 	 */
-	int32 doCornerReajustTwinkel(const ActorStruct *actor, IVec3 &processActor, const IVec3 &oldPos, int32 x, int32 y, int32 z, int32 damageMask);
+	uint32 doCornerReajustTwinkel(ActorStruct *actor, int32 x, int32 y, int32 z, int32 damageMask);
 
 	/**
 	 * Check other actor collision with bricks
@@ -83,10 +83,10 @@ public:
 	 * @param z Actor Z coordinate
 	 * @param damageMask Cause damage mask
 	 */
-	int32 doCornerReajust(IVec3 &processActor, const IVec3 &oldPos, int32 x, int32 y, int32 z, int32 damageMask);
+	uint32 doCornerReajust(ActorStruct *actor, int32 x, int32 y, int32 z, int32 damageMask);
 
 	/** Make actor to stop falling */
-	void receptionObj(const IVec3 &processActor, int actorIdx);
+	void receptionObj(int actorIdx);
 
 	/**
 	 * Check extra collision with actors




More information about the Scummvm-git-logs mailing list