[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