[Scummvm-git-logs] scummvm master -> 3ddd5aecc905a6d410453e05d912c0d0bb04879f

mduggan noreply at scummvm.org
Thu Jul 13 10:43:37 UTC 2023


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:
3ddd5aecc9 TETRAEDGE: Correctly use head offsets in Syberia 2


Commit: 3ddd5aecc905a6d410453e05d912c0d0bb04879f
    https://github.com/scummvm/scummvm/commit/3ddd5aecc905a6d410453e05d912c0d0bb04879f
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-07-13T19:42:26+09:00

Commit Message:
TETRAEDGE: Correctly use head offsets in Syberia 2

This fixes bug #14540

Changed paths:
    engines/tetraedge/game/character.cpp
    engines/tetraedge/game/character.h
    engines/tetraedge/game/in_game_scene.cpp
    engines/tetraedge/game/lua_binds.cpp


diff --git a/engines/tetraedge/game/character.cpp b/engines/tetraedge/game/character.cpp
index ccfff6fa3da..05741293574 100644
--- a/engines/tetraedge/game/character.cpp
+++ b/engines/tetraedge/game/character.cpp
@@ -70,7 +70,7 @@ _recallageY(true), _walkToFlag(false), _walkCurveEnd(0.0f), _walkCurveLast(0.0f)
 _walkCurveLen(0.0f), _walkCurveIncrement(0.0f), _walkEndAnimG(false), _walkTotalFrames(0),
 _walkCurveNextLength(0.0f), _walkedLength(0.0f), _walkLoopAnimLen(0.0f), _walkEndGAnimLen(0.0f),
 _walkStartAnimLen(0.0f), _walkStartAnimFrameCount(0), _walkLoopAnimFrameCount(0),
-_walkEndGAnimFrameCount(0), _hasAnchor(false), _charLookingAtFloat(0.0f) {
+_walkEndGAnimFrameCount(0), _hasAnchor(false), _charLookingAtOffset(0.0f) {
 	_curModelAnim.setDeleteFn(&TeModelAnimation::deleteLaterStatic);
 }
 
diff --git a/engines/tetraedge/game/character.h b/engines/tetraedge/game/character.h
index 68cdad9d33b..9c63b80ce87 100644
--- a/engines/tetraedge/game/character.h
+++ b/engines/tetraedge/game/character.h
@@ -169,7 +169,8 @@ public:
 	bool needsSomeUpdate() const { return _needsSomeUpdate; }
 	void setNeedsSomeUpdate(bool val) { _needsSomeUpdate = val; }
 	void setCharLookingAt(Character *other) { _charLookingAt = other; }
-	void setCharLookingAtFloat(float f) { _charLookingAtFloat = f; }
+	void setCharLookingAtOffset(float val) { _charLookingAtOffset = val; }
+	float charLookingAtOffset() const { return _charLookingAtOffset; }
 	const TeVector3f32 &positionCharacter() const { return _positionCharacter; }
 	void setPositionCharacter(const TeVector3f32 &val) { _positionCharacter = val; }
 	bool positionFlag() const { return _positionFlag; }
@@ -211,7 +212,7 @@ private:
 	Common::String _animSound;
 
 	Character *_charLookingAt;
-	float _charLookingAtFloat; // TODO: what is this?
+	float _charLookingAtOffset; // Only used in Syberia 2
 
 	uint _animSoundOffset;
 
diff --git a/engines/tetraedge/game/in_game_scene.cpp b/engines/tetraedge/game/in_game_scene.cpp
index cdce5a89cf7..7ce9cf00156 100644
--- a/engines/tetraedge/game/in_game_scene.cpp
+++ b/engines/tetraedge/game/in_game_scene.cpp
@@ -1682,9 +1682,19 @@ void InGameScene::update() {
 			}
 		}
 		if (_character->charLookingAt()) {
-			TeVector3f32 targetpos = _character->charLookingAt()->_model->position();
-			if (g_engine->gameType() == TetraedgeEngine::kSyberia2)
-				targetpos = targetpos * _character->lastHeadBoneTrans();
+			Character *targetc = _character->charLookingAt();
+			TeVector3f32 targetpos;
+			if (g_engine->gameType() == TetraedgeEngine::kSyberia)
+				targetpos = targetc->_model->position();
+			else
+				targetpos = targetc->_model->worldTransformationMatrix() * targetc->lastHeadBoneTrans();
+
+			//
+			// Note: The below general code for NPCs is different in Syberia 2,
+			// and uses c->charLookingAtOffset(), but the player look-at code
+			// is the same in both games and always adds 17 for "tall" characters.
+			//
+
 			if (_character->lookingAtTallThing())
 				targetpos.y() += 17;
 			TeVector2f32 headRot(getHeadHorizontalRotation(_character, targetpos),
@@ -1699,13 +1709,15 @@ void InGameScene::update() {
 		}
 	}
 	for (Character *c : _characters) {
-		if (c->charLookingAt()) {
-			TeVector3f32 targetpos = c->charLookingAt()->_model->position();
+		Character *targetc = c->charLookingAt();
+		if (targetc) {
+			TeVector3f32 targetpos;
 			if (g_engine->gameType() == TetraedgeEngine::kSyberia) {
+				targetpos = targetc->_model->position();
 				if (c->lookingAtTallThing())
 					targetpos.y() += 17;
 			} else {
-				targetpos = targetpos * c->lastHeadBoneTrans();
+				targetpos = targetc->_model->worldTransformationMatrix() * targetc->lastHeadBoneTrans();
 			}
 			TeVector2f32 headRot(getHeadHorizontalRotation(c, targetpos),
 					getHeadVerticalRotation(c, targetpos));
@@ -1714,6 +1726,12 @@ void InGameScene::update() {
 				headRot.setX((float)M_PI_2);
 			else if (hangle < -90)
 				headRot.setX((float)-M_PI_2);
+
+			if (g_engine->gameType() == TetraedgeEngine::kSyberia2) {
+				if (c->lookingAtTallThing())
+					headRot.setY(headRot.getY() + c->charLookingAtOffset());
+			}
+
 			c->setHeadRotation(headRot);
 			c->setHasAnchor(true);
 		}
diff --git a/engines/tetraedge/game/lua_binds.cpp b/engines/tetraedge/game/lua_binds.cpp
index 5cfcce60c00..80e299cb580 100644
--- a/engines/tetraedge/game/lua_binds.cpp
+++ b/engines/tetraedge/game/lua_binds.cpp
@@ -1766,10 +1766,7 @@ static void SetCharacterLookChar(const Common::String &charname, const Common::S
 		return;
 	}
 	character->setLookingAtTallThing(tall);
-
-	if (f != 0.0)
-		warning("TODO: Use float param %f in SetCharacterLookChar", f);
-	character->setCharLookingAtFloat(f);
+	character->setCharLookingAtOffset(f);
 
 	if (destname.empty()) {
 		character->setCharLookingAt(nullptr);




More information about the Scummvm-git-logs mailing list