[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