[Scummvm-git-logs] scummvm master -> 2c5db1e1981b3d9c4a3615c47faf4a3838d1ea1d

mduggan noreply at scummvm.org
Fri Mar 3 08:28:51 UTC 2023


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

Summary:
858a766059 TETRAEDGE: Implement Youki following Kate in Syberia 2
29c4ce24a8 TETRAEDGE: Adjust timer behavior to better match original
6f7892ee38 TETRAEDGE: Fix random lua bind to match original
2ffd7200d1 TETRAEDGE: Remove more callbacks unloading character
ea41054885 TETRAEDGE: Add workaround for typo in config file
f97b8755b1 TETRAEDGE: Use correct data type for flag
a007afd252 TETRAEDGE: Fix potential crash in YoukiManager
b0d705f81d TETRAEDGE: Work around a script typo
8c10b9044c TETRAEDGE: Avoid crashes with invalid data
ede6b2a496 TETRAEDGE: Fix mesh order for particles
a8e33019f5 TETRAEDGE: Work around incorrect camera data
2955b12c27 TETRAEDGE: Work around some invalid position data
2c5db1e198 TETRAEDGE: Don't crash on credits for Syberia 2


Commit: 858a766059fe518e143d166a1aa053074710e6ae
    https://github.com/scummvm/scummvm/commit/858a766059fe518e143d166a1aa053074710e6ae
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-03-03T17:22:34+09:00

Commit Message:
TETRAEDGE: Implement Youki following Kate in Syberia 2

Changed paths:
    engines/tetraedge/game/youki_manager.cpp
    engines/tetraedge/game/youki_manager.h
    engines/tetraedge/te/te_timer.cpp


diff --git a/engines/tetraedge/game/youki_manager.cpp b/engines/tetraedge/game/youki_manager.cpp
index 8db1c4fbbfd..ab5ef52cfa8 100644
--- a/engines/tetraedge/game/youki_manager.cpp
+++ b/engines/tetraedge/game/youki_manager.cpp
@@ -21,27 +21,176 @@
 
 #include "tetraedge/tetraedge.h"
 #include "tetraedge/game/youki_manager.h"
+#include "tetraedge/game/character.h"
+#include "tetraedge/game/game.h"
 
 namespace Tetraedge {
 
-YoukiManager::YoukiManager() : _followKate(false) {
+YoukiManager::YoukiManager() : _followKate(false), _allowUpdate(true),
+	_isAssitAnim(false), _isWalking(false) {
 }
 
 void YoukiManager::reset() {
+	_timer.start();
 	_followKate = false;
+	_allowUpdate = true;
+	_isAssitAnim = false;
+	_isWalking = false;
+	Game *game = g_engine->getGame();
+	Character *youki = game->scene().character("Youki");
+	if (!youki)
+		return;
+
+	youki->_onCharacterAnimFinishedSignal.remove(this, &YoukiManager::onAnimFinished);
+	youki->onFinished().remove(this, &YoukiManager::onMoveFinished);
+	youki->deleteAllCallback();
+	youki->stop();
+	youki->setFreeMoveZone(nullptr);
 }
 
 void YoukiManager::update() {
 	if (g_engine->gameType() != TetraedgeEngine::kSyberia2)
 		return;
-	// TODO: Implement me.
+
+	Game *game = g_engine->getGame();
+	Character *youki = game->scene().character("Youki");
+	if (!youki)
+		return;
+
+	if (_timer.getTimeFromStart() <= 3000000.0 || !_allowUpdate)
+		return;
+
+	if (game->_movePlayerCharacterDisabled)
+		return;
+
+	Character *player = game->scene()._character;
+	if (!player) {
+		warning("YoukiManager::update: Couldn't get player");
+		return;
+	}
+
+	_timer.stop();
+	_timer.start();
+	game->_sceneCharacterVisibleFromLoad = false;
+
+	const TeVector3f32 youkipos = youki->_model->position();
+	const TeVector3f32 playerpos = player->_model->position();
+	const TeVector3f32 dirtoplayer = playerpos - youkipos;
+	if (dirtoplayer.squaredLength() >= 4.0f) {
+		TeVector3f32 destPos = playerpos - dirtoplayer.getNormalized() * 1.5f;
+        TeIntrusivePtr<TeBezierCurve> curve = youki->freeMoveZone()->curve(youkipos, destPos);
+        if (curve) {
+			youki->setCurveStartLocation(TeVector3f32(0, 0, 0));
+			youki->placeOnCurve(curve);
+            youki->setCurveOffset(0);
+			if (dirtoplayer.getSquareMagnitude() >= 25.0f) {
+                youki->walkMode("Jog");
+			} else {
+                youki->walkMode("WalkComp");
+			}
+			youki->setAnimation(youki->walkAnim(Character::WalkPart_Loop), true);
+			youki->walkTo(1.0f, false);
+            _isWalking = true;
+            youki->_onCharacterAnimFinishedSignal.remove(this, &YoukiManager::onAnimFinished);
+            youki->_onCharacterAnimFinishedSignal.add(this, &YoukiManager::onAnimFinished);
+            youki->onFinished().remove(this, &YoukiManager::onMoveFinished);
+            youki->onFinished().add(this, &YoukiManager::onMoveFinished);
+		}
+	}
 }
 
 bool YoukiManager::onAnimFinished(const Common::String &anim) {
+	if (!_followKate)
+		return false;
+
+	Game *game = g_engine->getGame();
+	Character *youki = game->scene().character("Youki");
+	Character *player = game->scene()._character;
+	if (!youki || !player) {
+		warning("YoukiManager::onAnimFinished: Couldn't get both Youki and player");
+		return false;
+	}
+
+	const TeVector3f32 youkipos = youki->_model->position();
+	const TeVector3f32 playerpos = player->_model->position();
+	const TeVector3f32 dirtoplayer = playerpos - youkipos;
+	float squareDistToPlayer = dirtoplayer.squaredLength();
+	if (!_isAssitAnim) {
+		int youkiAnimFrame = youki->_model->anim()->curFrame2();
+		int youkiAnimLastFrame = youki->_model->anim()->lastFrame();
+		if (youkiAnimFrame == youkiAnimLastFrame) {
+			if (squareDistToPlayer <= 4.0) {
+				int randVal = g_engine->getRandomNumber(9);
+				if (randVal < 7) {
+					youki->setAnimation("Youki/y_assit.te3da", false);
+				} else {
+					youki->setAnimation("Youki/y_gratte1.te3da", false);
+				}
+			} else {
+				youki->setAnimation("Youki/y_assit_debout.te3da", false);
+				_isAssitAnim = false;
+			}
+			return false;
+		}
+	}
+
+	if (!_isAssitAnim && !_isWalking) {
+		if (squareDistToPlayer <= 4.0) {
+			int randVal = g_engine->getRandomNumber(9);
+			if (randVal < 3) {
+				youki->setAnimation("Youki/y_assit.te3da", false);
+				_isAssitAnim = true;
+			} else if (randVal < 4) {
+				youki->setAnimation("Youki/y_gratte2.te3da", false);
+			} else if (randVal < 7) {
+				youki->setAnimation("Youki/y_sent2.te3da", false);
+			} else {
+				_allowUpdate = true;
+				youki->setAnimation("Youki/y_att_debout.te3da", false);
+			}
+		} else {
+			_allowUpdate = true;
+			youki->setAnimation("Youki/y_att_debout.te3da", false);
+		}
+	}
 	return false;
 }
 
 bool YoukiManager::onMoveFinished() {
+	if (!_followKate)
+		return false;
+
+	Game *game = g_engine->getGame();
+	Character *youki = game->scene().character("Youki");
+	Character *player = game->scene()._character;
+	if (!youki || !player) {
+		warning("YoukiManager::onMoveFinished: Couldn't get both Youki and player");
+		return false;
+	}
+
+	const TeVector3f32 youkipos = youki->_model->position();
+	const TeVector3f32 playerpos = player->_model->position();
+	const TeVector3f32 dirtoplayer = playerpos - youkipos;
+	if (dirtoplayer.squaredLength() >= 4.0) {
+        _isWalking = false;
+        _allowUpdate = true;
+        youki->setAnimation("Youki/y_att_debout.te3da", false);
+        _timer.setTime(3000000.0);
+	} else {
+		int randVal = g_engine->getRandomNumber(9);
+		_isWalking = false;
+		if (randVal < 3) {
+			_allowUpdate = true;
+			youki->setAnimation("Youki/y_att_debout.te3da", false);
+		} else if (randVal < 6) {
+			_allowUpdate = false;
+			youki->setAnimation("Youki/y_sent2.te3da", false);
+		} else {
+			_allowUpdate = false;
+			youki->setAnimation("Youki/y_assit.te3da", false);
+			_isAssitAnim = true;
+        }
+	}
 	return false;
 }
 
diff --git a/engines/tetraedge/game/youki_manager.h b/engines/tetraedge/game/youki_manager.h
index 65c53a2572b..9bf6c4a35d0 100644
--- a/engines/tetraedge/game/youki_manager.h
+++ b/engines/tetraedge/game/youki_manager.h
@@ -42,6 +42,9 @@ private:
 
 	TeTimer _timer;
 	bool _followKate;
+	bool _allowUpdate;
+	bool _isAssitAnim;
+	bool _isWalking;
 
 };
 
diff --git a/engines/tetraedge/te/te_timer.cpp b/engines/tetraedge/te/te_timer.cpp
index fc53f1b0cbe..92fa24fc10a 100644
--- a/engines/tetraedge/te/te_timer.cpp
+++ b/engines/tetraedge/te/te_timer.cpp
@@ -166,6 +166,13 @@ void TeTimer::pausable(bool ispausable) {
 	}
 }
 
+void TeTimer::setTime(uint64 time) {
+	uint64 result = _realTime - time;
+	_startTimeOffset = result;
+	_startTime = result;
+	_lastTimeElapsed = result;
+}
+
 void TeTimer::setAlarmIn(uint64 offset) {
 	uint64 timeNow = _realTime;
 	if (_stopped)


Commit: 29c4ce24a83413ee2642d3e205098b5835f0e1f9
    https://github.com/scummvm/scummvm/commit/29c4ce24a83413ee2642d3e205098b5835f0e1f9
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-03-03T17:22:34+09:00

Commit Message:
TETRAEDGE: Adjust timer behavior to better match original

Changed paths:
    engines/tetraedge/game/in_game_scene.cpp
    engines/tetraedge/game/in_game_scene.h
    engines/tetraedge/te/te_real_timer.cpp
    engines/tetraedge/te/te_timer.cpp


diff --git a/engines/tetraedge/game/in_game_scene.cpp b/engines/tetraedge/game/in_game_scene.cpp
index 19e9406a19b..68b8b6783d5 100644
--- a/engines/tetraedge/game/in_game_scene.cpp
+++ b/engines/tetraedge/game/in_game_scene.cpp
@@ -66,7 +66,7 @@ const float InGameScene::DEPTH_MAX_FLAKE = 0.1f;
 
 
 InGameScene::InGameScene() : _character(nullptr), _charactersShadow(nullptr),
-_shadowLightNo(-1), _waitTime(-1.0f), _shadowColor(0, 0, 0, 0x80), _shadowFov(20.0f),
+_shadowLightNo(-1), _waitTime(-1.0), _shadowColor(0, 0, 0, 0x80), _shadowFov(20.0f),
 _shadowFarPlane(1000), _shadowNearPlane(1), _maskAlpha(false),
 _verticalScrollTime(1000000.0f), _verticalScrollPlaying(false) {
 }
@@ -1706,7 +1706,7 @@ void InGameScene::update() {
 	TeScene::update();
 	_youkiManager.update();
 
-	float waitTime = _waitTimeTimer.timeFromLastTimeElapsed();
+	uint64 waitTime = _waitTimeTimer.timeFromLastTimeElapsed();
 	if (_waitTime != -1.0 && waitTime > _waitTime) {
 		_waitTime = -1.0;
 		_waitTimeTimer.stop();
diff --git a/engines/tetraedge/game/in_game_scene.h b/engines/tetraedge/game/in_game_scene.h
index 4b8b4200159..a13f11c1916 100644
--- a/engines/tetraedge/game/in_game_scene.h
+++ b/engines/tetraedge/game/in_game_scene.h
@@ -267,7 +267,7 @@ public:
 	Common::Array<TeRectBlocker> &rectBlockers() { return _rectBlockers; }
 	Common::Array<TeBlocker> &blockers() { return _blockers; }
 	Common::Array<Object3D *> object3Ds() { return _object3Ds; }
-	void setWaitTime(float usecs) { _waitTime = usecs; }
+	void setWaitTime(double usecs) { _waitTime = usecs; }
 	TeTimer &waitTimeTimer() { return _waitTimeTimer; }
 	Common::Array<Common::SharedPtr<TeLight>> &lights() { return _lights; }
 	Common::Array<TeIntrusivePtr<TeParticle>> &particles() { return _particles; }
@@ -288,7 +288,7 @@ private:
 	float _shadowNearPlane;
 	float _shadowFov;
 
-	float _waitTime;
+	double _waitTime;
 	TeTimer _waitTimeTimer;
 
 	Common::Array<TeBlocker> _blockers;
diff --git a/engines/tetraedge/te/te_real_timer.cpp b/engines/tetraedge/te/te_real_timer.cpp
index de4d736e9a3..b2441bf02d0 100644
--- a/engines/tetraedge/te/te_real_timer.cpp
+++ b/engines/tetraedge/te/te_real_timer.cpp
@@ -36,10 +36,14 @@ static uint64 getUsecs() {
 
 uint64 TeRealTimer::getTimeFromStart() {
 	uint64 timeNow;
-	if (_paused)
+	if (_paused) {
 		timeNow = _pausedTime;
-	else
+	} else {
 		timeNow = getUsecs();
+		if (timeNow < _maxTimeSeen)
+			timeNow = _maxTimeSeen;
+		_maxTimeSeen = timeNow;
+	}
 
 	return timeNow - _startTime;
 }
@@ -61,9 +65,9 @@ void TeRealTimer::start() {
 		if (timeNow < _maxTimeSeen)
 			timeNow = _maxTimeSeen;
 		timeNow += (_startTime - _pausedTime);
-		_maxTimeSeen = timeNow;
 		_startTime = timeNow;
 		_startTime2 = timeNow;
+		_maxTimeSeen = timeNow;
 		_paused = false;
 	}
 }
diff --git a/engines/tetraedge/te/te_timer.cpp b/engines/tetraedge/te/te_timer.cpp
index 92fa24fc10a..584a79b3ed3 100644
--- a/engines/tetraedge/te/te_timer.cpp
+++ b/engines/tetraedge/te/te_timer.cpp
@@ -129,12 +129,12 @@ uint64 TeTimer::getTimeFromStart() {
 
 uint64 TeTimer::timeElapsed() {
 	uint64 elapsed = _realTime - _lastTimeElapsed;
-	_lastTimeElapsed = elapsed + _lastTimeElapsed;
+	_lastTimeElapsed += elapsed;
 	return elapsed;
 }
 
 uint64 TeTimer::timeFromLastTimeElapsed() {
-	return realTimer()->time_() - _lastTimeElapsed;
+	return _realTime - _lastTimeElapsed;
 }
 
 uint64 TeTimer::time_() {


Commit: 6f7892ee3881eaeff173942819413915dcab1776
    https://github.com/scummvm/scummvm/commit/6f7892ee3881eaeff173942819413915dcab1776
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-03-03T17:22:34+09:00

Commit Message:
TETRAEDGE: Fix random lua bind to match original

Changed paths:
    engines/tetraedge/game/lua_binds.cpp


diff --git a/engines/tetraedge/game/lua_binds.cpp b/engines/tetraedge/game/lua_binds.cpp
index 8cc0f42fd3b..bec4a1aeb4e 100644
--- a/engines/tetraedge/game/lua_binds.cpp
+++ b/engines/tetraedge/game/lua_binds.cpp
@@ -1317,7 +1317,7 @@ static int tolua_ExportedFunctions_Save00(lua_State *L) {
 	error("#ferror in function 'Save': %d %d %s", err.index, err.array, err.type);
 }
 
-static void Wait(float seconds) {
+static void Wait(double seconds) {
 	Game *game = g_engine->getGame();
 	game->scene().waitTimeTimer().start();
 	game->scene().waitTimeTimer().stop();
@@ -1701,7 +1701,7 @@ static int tolua_ExportedFunctions_SetCharacterLookChar00(lua_State *L) {
 }
 
 static uint Random(uint max) {
-	return g_engine->getGame()->randomSource().getRandomNumber(max);
+	return g_engine->getGame()->randomSource().getRandomNumber(max - 1);
 }
 
 static int tolua_ExportedFunctions_Random00(lua_State *L) {


Commit: 2ffd7200d19b2f6ac61a73204038a5ee70074faa
    https://github.com/scummvm/scummvm/commit/2ffd7200d19b2f6ac61a73204038a5ee70074faa
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-03-03T17:22:34+09:00

Commit Message:
TETRAEDGE: Remove more callbacks unloading character

Changed paths:
    engines/tetraedge/game/game.cpp


diff --git a/engines/tetraedge/game/game.cpp b/engines/tetraedge/game/game.cpp
index 1f4661cf1ca..ec9e9a6fdca 100644
--- a/engines/tetraedge/game/game.cpp
+++ b/engines/tetraedge/game/game.cpp
@@ -1670,9 +1670,14 @@ bool Game::unloadCharacters() {
 	return true;
 }
 
-bool Game::unloadPlayerCharacter(const Common::String &character) {
-	_scene.unloadCharacter(character);
-	return true;
+bool Game::unloadPlayerCharacter(const Common::String &charname) {
+	Character *c = _scene.character(charname);
+	if (c) {
+		c->_onCharacterAnimFinishedSignal.remove(this, &Game::onCharacterAnimationPlayerFinished);
+		c->onFinished().remove(this, &Game::onDisplacementPlayerFinished);
+		_scene.unloadCharacter(charname);
+	}
+	return c != nullptr;
 }
 
 void Game::update() {


Commit: ea41054885fd2573bc40dbbbe1730c434c53d3aa
    https://github.com/scummvm/scummvm/commit/ea41054885fd2573bc40dbbbe1730c434c53d3aa
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-03-03T17:22:34+09:00

Commit Message:
TETRAEDGE: Add workaround for typo in config file

Changed paths:
    engines/tetraedge/game/in_game_scene_xml_parser.cpp
    engines/tetraedge/game/in_game_scene_xml_parser.h


diff --git a/engines/tetraedge/game/in_game_scene_xml_parser.cpp b/engines/tetraedge/game/in_game_scene_xml_parser.cpp
index 78b742c4499..c8f91095f21 100644
--- a/engines/tetraedge/game/in_game_scene_xml_parser.cpp
+++ b/engines/tetraedge/game/in_game_scene_xml_parser.cpp
@@ -117,6 +117,15 @@ bool InGameSceneXmlParser::parserCallback_collisionSlide(ParserNode *node) {
 	return true;
 }
 
+//
+// WORKAROUND: This is a typo in scenes/A2_Falaise/24020/Scene24020.xml
+// for collisionSlide.  Fix it to do what it was intended to do.
+//
+bool InGameSceneXmlParser::parserCallback_coliisionSlide(ParserNode *node) {
+	_scene->setCollisionSlide(true);
+	return true;
+}
+
 bool InGameSceneXmlParser::parserCallback_noCollisionSlide(ParserNode *node) {
 	_scene->setCollisionSlide(false);
 	return true;
diff --git a/engines/tetraedge/game/in_game_scene_xml_parser.h b/engines/tetraedge/game/in_game_scene_xml_parser.h
index 5e0c382320d..9ccf4ba189e 100644
--- a/engines/tetraedge/game/in_game_scene_xml_parser.h
+++ b/engines/tetraedge/game/in_game_scene_xml_parser.h
@@ -114,6 +114,8 @@ public:
 			KEY_END()
 			XML_KEY(collisionSlide)
 			KEY_END()
+			XML_KEY(coliisionSlide)
+			KEY_END()
 			XML_KEY(noCollisionSlide)
 			KEY_END()
 		KEY_END()
@@ -137,6 +139,7 @@ public:
 	bool parserCallback_rBB(ParserNode *node);
 	bool parserCallback_light(ParserNode *node);
 	bool parserCallback_collisionSlide(ParserNode *node);
+	bool parserCallback_coliisionSlide(ParserNode *node);
 	bool parserCallback_noCollisionSlide(ParserNode *node);
 
 	// Flamme and its children.


Commit: f97b8755b11bf25db1b75da4069a1b6ef467af8e
    https://github.com/scummvm/scummvm/commit/f97b8755b11bf25db1b75da4069a1b6ef467af8e
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-03-03T17:22:34+09:00

Commit Message:
TETRAEDGE: Use correct data type for flag

Changed paths:
    engines/tetraedge/game/in_game_scene.cpp


diff --git a/engines/tetraedge/game/in_game_scene.cpp b/engines/tetraedge/game/in_game_scene.cpp
index 68b8b6783d5..394bd2f6f2c 100644
--- a/engines/tetraedge/game/in_game_scene.cpp
+++ b/engines/tetraedge/game/in_game_scene.cpp
@@ -796,7 +796,7 @@ bool InGameScene::loadXml(const Common::String &zone, const Common::String &scen
 	_sceneName = scene;
 	_blockers.clear();
 	_rectBlockers.clear();
-	_collisionSlide = 0;
+	_collisionSlide = false;
 	loadActZones();
 	loadBlockers();
 


Commit: a007afd25207944656b19f3457143ac2046135ba
    https://github.com/scummvm/scummvm/commit/a007afd25207944656b19f3457143ac2046135ba
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-03-03T17:22:34+09:00

Commit Message:
TETRAEDGE: Fix potential crash in YoukiManager

Changed paths:
    engines/tetraedge/game/youki_manager.cpp


diff --git a/engines/tetraedge/game/youki_manager.cpp b/engines/tetraedge/game/youki_manager.cpp
index ab5ef52cfa8..12437d59ef2 100644
--- a/engines/tetraedge/game/youki_manager.cpp
+++ b/engines/tetraedge/game/youki_manager.cpp
@@ -49,12 +49,12 @@ void YoukiManager::reset() {
 }
 
 void YoukiManager::update() {
-	if (g_engine->gameType() != TetraedgeEngine::kSyberia2)
+	if (g_engine->gameType() != TetraedgeEngine::kSyberia2 || !_followKate)
 		return;
 
 	Game *game = g_engine->getGame();
 	Character *youki = game->scene().character("Youki");
-	if (!youki)
+	if (!youki || !youki->freeMoveZone())
 		return;
 
 	if (_timer.getTimeFromStart() <= 3000000.0 || !_allowUpdate)


Commit: b0d705f81dd0049cf88e311b2fe8a8955c18c825
    https://github.com/scummvm/scummvm/commit/b0d705f81dd0049cf88e311b2fe8a8955c18c825
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-03-03T17:22:34+09:00

Commit Message:
TETRAEDGE: Work around a script typo

Changed paths:
    engines/tetraedge/game/application.cpp


diff --git a/engines/tetraedge/game/application.cpp b/engines/tetraedge/game/application.cpp
index 575a6bf9a72..3e9ce0a98fa 100644
--- a/engines/tetraedge/game/application.cpp
+++ b/engines/tetraedge/game/application.cpp
@@ -59,6 +59,11 @@ _drawShadows(true) {
 	TeCore *core = g_engine->getCore();
 	core->_coreNotReady = true;
 	core->fileFlagSystemSetFlag("platform", "MacOSX");
+	//
+	// WORKAROUND: Syberia 2 A5_ValDomaine/54000/Logic54000.lua
+	// checks a typo of this flag..
+	//
+	core->fileFlagSystemSetFlag("plateform", "MacOSX");
 	core->fileFlagSystemSetFlag("part", "Full");
 	core->fileFlagSystemSetFlag("distributor", "DefaultDistributor");
 


Commit: 8c10b9044c13cb8e01ef89a2c5813a74add81e83
    https://github.com/scummvm/scummvm/commit/8c10b9044c13cb8e01ef89a2c5813a74add81e83
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-03-03T17:22:34+09:00

Commit Message:
TETRAEDGE: Avoid crashes with invalid data

Changed paths:
    engines/tetraedge/game/in_game_scene.cpp


diff --git a/engines/tetraedge/game/in_game_scene.cpp b/engines/tetraedge/game/in_game_scene.cpp
index 394bd2f6f2c..79ec072f5fd 100644
--- a/engines/tetraedge/game/in_game_scene.cpp
+++ b/engines/tetraedge/game/in_game_scene.cpp
@@ -520,6 +520,10 @@ void InGameScene::freeGeometry() {
 	_loadedPath.set("");
 	_youkiManager.reset();
 	freeSceneObjects();
+	if (_character)
+		_character->setFreeMoveZone(nullptr);
+	for (Character *character : _characters)
+		character->setFreeMoveZone(nullptr);
 	for (TeFreeMoveZone *zone : _freeMoveZones)
 		delete zone;
 	_freeMoveZones.clear();
@@ -1513,7 +1517,7 @@ void InGameScene::reset() {
 }
 
 TeLight *InGameScene::shadowLight() {
-	if (_shadowLightNo == -1) {
+	if (_shadowLightNo == -1 || (uint)_shadowLightNo >= _lights.size()) {
 		return nullptr;
 	}
 	return _lights[_shadowLightNo].get();


Commit: ede6b2a496f8a88e925c4a9b57dd29f425b0ce8b
    https://github.com/scummvm/scummvm/commit/ede6b2a496f8a88e925c4a9b57dd29f425b0ce8b
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-03-03T17:22:34+09:00

Commit Message:
TETRAEDGE: Fix mesh order for particles

Changed paths:
    engines/tetraedge/te/te_particle.cpp


diff --git a/engines/tetraedge/te/te_particle.cpp b/engines/tetraedge/te/te_particle.cpp
index b96f506f29d..e818596a879 100644
--- a/engines/tetraedge/te/te_particle.cpp
+++ b/engines/tetraedge/te/te_particle.cpp
@@ -94,9 +94,9 @@ void TeParticle::update(int val) {
 			// redoing the math on every particle.
 			Common::Array<TeVector3f32> quad(4);
 			quad[0] = _matrix.mult3x3(TeVector3f32(-1, -1, 0));
-			quad[1] = _matrix.mult3x3(TeVector3f32( 1, -1, 0));
-			quad[2] = _matrix.mult3x3(TeVector3f32( 1,  1, 0));
-			quad[3] = _matrix.mult3x3(TeVector3f32(-1,  1, 0));
+			quad[1] = _matrix.mult3x3(TeVector3f32(-1,  1, 0));
+			quad[2] = _matrix.mult3x3(TeVector3f32( 1, -1, 0));
+			quad[3] = _matrix.mult3x3(TeVector3f32( 1,  1, 0));
 			const TeQuaternion norot = TeQuaternion::fromEuler(TeVector3f32(0, 0, 0));
 			_lastTime = fmod(_lastTime, _period);
 			for (int p = 0; p < _particlePerPeriod; p++) {


Commit: a8e33019f5106af44921939616183371c4f95e38
    https://github.com/scummvm/scummvm/commit/a8e33019f5106af44921939616183371c4f95e38
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-03-03T17:22:34+09:00

Commit Message:
TETRAEDGE: Work around incorrect camera data

Changed paths:
    engines/tetraedge/te/te_camera.cpp


diff --git a/engines/tetraedge/te/te_camera.cpp b/engines/tetraedge/te/te_camera.cpp
index 67ea2b658ce..0b8af94cc62 100644
--- a/engines/tetraedge/te/te_camera.cpp
+++ b/engines/tetraedge/te/te_camera.cpp
@@ -170,6 +170,17 @@ void TeCamera::loadXml(const Common::Path &path) {
 	_projectionMatrixType = 3;
 	TeCore *core = g_engine->getCore();
 	Common::FSNode node = core->findFile(path);
+	if (!node.isReadable()) {
+		//
+		// WORKAROUND: scenes/A3_Village/34015 has Camera34010, not 34015
+		//
+		Common::String spath = path.toString();
+		size_t pos = spath.find("34015.xml");
+		if (pos != Common::String::npos) {
+			spath.replace(pos + 4, 1, "0");
+		}
+		node = core->findFile(spath);
+	}
 	if (!node.isReadable()) {
 		warning("Can't open camera data %s", path.toString().c_str());
 	}


Commit: 2955b12c272710ce64aa5018a6fdeaea1c33dbfa
    https://github.com/scummvm/scummvm/commit/2955b12c272710ce64aa5018a6fdeaea1c33dbfa
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-03-03T17:22:34+09:00

Commit Message:
TETRAEDGE: Work around some invalid position data

Changed paths:
    engines/tetraedge/game/in_game_scene_xml_parser.cpp


diff --git a/engines/tetraedge/game/in_game_scene_xml_parser.cpp b/engines/tetraedge/game/in_game_scene_xml_parser.cpp
index c8f91095f21..be34e3added 100644
--- a/engines/tetraedge/game/in_game_scene_xml_parser.cpp
+++ b/engines/tetraedge/game/in_game_scene_xml_parser.cpp
@@ -174,8 +174,16 @@ bool InGameSceneXmlParser::textCallback(const Common::String &val) {
 	case TextNodePosition: {
 		TeVector3f32 pos;
 		if (!pos.parse(val)) {
-			parserError("Can't parse dummy position");
-			return false;
+			//
+			// WORKAROUND: Syberia 2 A5_ValMaison/55016/Scene55016.xml
+			// contains invalid dummy position data.
+			//
+			if (val == "-10,-17,-31,7") {
+				pos = TeVector3f32(-10, -17, -31);
+			} else {
+				parserError("Can't parse dummy position");
+				return false;
+			}
 		}
 		_scene->_dummies.back()._position = pos;
 		break;


Commit: 2c5db1e1981b3d9c4a3615c47faf4a3838d1ea1d
    https://github.com/scummvm/scummvm/commit/2c5db1e1981b3d9c4a3615c47faf4a3838d1ea1d
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-03-03T17:28:32+09:00

Commit Message:
TETRAEDGE: Don't crash on credits for Syberia 2

Changed paths:
    engines/tetraedge/game/credits.cpp


diff --git a/engines/tetraedge/game/credits.cpp b/engines/tetraedge/game/credits.cpp
index 59c25495d45..394151ce5a0 100644
--- a/engines/tetraedge/game/credits.cpp
+++ b/engines/tetraedge/game/credits.cpp
@@ -69,13 +69,16 @@ void Credits::enter(bool returnToOptions) {
 	anchorAnim->_callbackMethod = &TeLayout::setAnchor;
 	anchorAnim->play();
 
-	TeCurveAnim2<TeLayout, TeVector3f32> *bgPosAnim = _gui.layoutPositionLinearAnimation("scrollBackgroundPositionAnim");
-	if (!bgPosAnim)
-		error("Credits gui - couldn't find scrollBackgroundPositionAnim");
+	TeCurveAnim2<TeLayout, TeVector3f32> *bgPosAnim = nullptr;
+	if (g_engine->gameType() == TetraedgeEngine::kSyberia) {
+		TeCurveAnim2<TeLayout, TeVector3f32> *bgPosAnim = _gui.layoutPositionLinearAnimation("scrollBackgroundPositionAnim");
+		if (!bgPosAnim)
+			error("Credits gui - couldn't find scrollBackgroundPositionAnim");
 
-	bgPosAnim->_callbackObj = _gui.layoutChecked("backgroundSprite");
-	bgPosAnim->_callbackMethod = &TeLayout::setAnchor;
-	bgPosAnim->play();
+		bgPosAnim->_callbackObj = _gui.layoutChecked("backgroundSprite");
+		bgPosAnim->_callbackMethod = &TeLayout::setAnchor;
+		bgPosAnim->play();
+	}
 
 	_curveAnim._runTimer.pausable(false);
 	_curveAnim.stop();
@@ -91,22 +94,24 @@ void Credits::enter(bool returnToOptions) {
 	_curveAnim.setCurve(curve);
 	_curveAnim._duration = 12000;
 
-	TeLayout *backgrounds = _gui.layoutChecked("Backgrounds");
-	if (_animCounter < backgrounds->childCount()) {
-		TeSpriteLayout *bgchild = dynamic_cast<TeSpriteLayout *>(backgrounds->child(_animCounter));
-		if (!bgchild)
-			error("Child of backgrounds is not a TeSpriteLayout");
-		_curveAnim._callbackObj = bgchild;
-		_curveAnim._callbackMethod = &TeLayout::setColor;
-		_curveAnim.play();
-		bgchild->setVisible(true);
-		const Common::String bgAnimName = bgchild->name() + "Anim";
-		bgPosAnim = _gui.layoutPositionLinearAnimation(bgAnimName);
-		if (!bgPosAnim)
-			error("Couldn't find bg position anim %s", bgAnimName.c_str());
-		bgPosAnim->_callbackObj = bgchild;
-		bgPosAnim->_callbackMethod = &TeLayout::setPosition;
-		bgPosAnim->play();
+	if (g_engine->gameType() == TetraedgeEngine::kSyberia) {
+		TeLayout *backgrounds = _gui.layoutChecked("Backgrounds");
+		if (_animCounter < backgrounds->childCount()) {
+			TeSpriteLayout *bgchild = dynamic_cast<TeSpriteLayout *>(backgrounds->child(_animCounter));
+			if (!bgchild)
+				error("Child of backgrounds is not a TeSpriteLayout");
+			_curveAnim._callbackObj = bgchild;
+			_curveAnim._callbackMethod = &TeLayout::setColor;
+			_curveAnim.play();
+			bgchild->setVisible(true);
+			const Common::String bgAnimName = bgchild->name() + "Anim";
+			bgPosAnim = _gui.layoutPositionLinearAnimation(bgAnimName);
+			if (!bgPosAnim)
+				error("Couldn't find bg position anim %s", bgAnimName.c_str());
+			bgPosAnim->_callbackObj = bgchild;
+			bgPosAnim->_callbackMethod = &TeLayout::setPosition;
+			bgPosAnim->play();
+		}
 	}
 	_curveAnim.onFinished().add(this, &Credits::onBackgroundAnimFinished);
 }




More information about the Scummvm-git-logs mailing list