[Scummvm-git-logs] scummvm master -> 95cf7abc32e18d7a9f20c616e86d86264a592fa0
mgerhardy
noreply at scummvm.org
Tue Jan 2 10:27:23 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:
95cf7abc32 TWINE: reverted parts of 0517e015fc7 to fix bug #14776
Commit: 95cf7abc32e18d7a9f20c616e86d86264a592fa0
https://github.com/scummvm/scummvm/commit/95cf7abc32e18d7a9f20c616e86d86264a592fa0
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2024-01-02T11:27:17+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