[Scummvm-git-logs] scummvm master -> 5c8de85cd9a6c9fb44bdbd28586f37e442970cd9

mduggan noreply at scummvm.org
Mon Feb 13 07:49:09 UTC 2023


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

Summary:
c378270513 TETRAEDGE: Add curve loading and run control for Syberia 2
fad7e5175b TETRAEDGE: Add game type enum to allow easy checking
6e4add3682 TETRAEDGE: Handle some more Syberia 2 lua scripts
d0936edb14 TETRAEDGE: Parse scene dummy data for Syberia 2
60a6bd1609 TETRAEDGE: Copy sounds while iterating to avoid potential crash
77bb85ac6a TETRAEDGE: Add comments re alpha-only textures
737e1e2b31 TETRAEDGE: Handle character animation callbacks for Syberia 2
5c8de85cd9 TETRAEDGE: Add more features for Syberia 2 lua scripts


Commit: c37827051353946cef2b92829a6dca35cca6aa30
    https://github.com/scummvm/scummvm/commit/c37827051353946cef2b92829a6dca35cca6aa30
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-02-13T15:40:15+09:00

Commit Message:
TETRAEDGE: Add curve loading and run control for Syberia 2

Changed paths:
    engines/tetraedge/game/game.cpp
    engines/tetraedge/game/game.h
    engines/tetraedge/game/in_game_scene.cpp
    engines/tetraedge/game/in_game_scene.h
    engines/tetraedge/game/in_game_scene_xml_parser.cpp
    engines/tetraedge/game/lua_binds.cpp
    engines/tetraedge/te/te_bezier_curve.cpp
    engines/tetraedge/te/te_bezier_curve.h


diff --git a/engines/tetraedge/game/game.cpp b/engines/tetraedge/game/game.cpp
index 13a478abdb3..7959a8dc2a0 100644
--- a/engines/tetraedge/game/game.cpp
+++ b/engines/tetraedge/game/game.cpp
@@ -53,7 +53,7 @@ _lastCharMoveMousePos(0.0f, 0.0f), _randomSoundFinished(false),
 _previousMousePos(-1, -1), _markersVisible(true), _saveRequested(false),
 _gameLoadState(0), _luaShowOwnerError(false), _score(0), _warped(false),
 _firstInventory(true), _randomSource("SyberiaGameRandom"), _frameCounter(0),
-_warpFadeFlag(false), _dialogsTold(0) {
+_warpFadeFlag(false), _dialogsTold(0), _runModeEnabled(true) {
 	for (int i = 0; i < NUM_OBJECTS_TAKEN_IDS; i++) {
 		_objectsTakenBits[i] = false;
 	}
@@ -1115,7 +1115,7 @@ bool Game::onMouseClick(const Common::Point &pt) {
 			if (curve->controlPoints().size() == 1) {
 				character->endMove();
 			} else {
-				if (!_walkTimer.running() || _walkTimer.timeElapsed() > 300000) {
+				if (!_walkTimer.running() || _walkTimer.timeElapsed() > 300000 || !_runModeEnabled) {
 					_walkTimer.stop();
 					_walkTimer.start();
 					character->walkMode("Walk");
diff --git a/engines/tetraedge/game/game.h b/engines/tetraedge/game/game.h
index 2b1bf49aabc..56c21fe0112 100644
--- a/engines/tetraedge/game/game.h
+++ b/engines/tetraedge/game/game.h
@@ -205,6 +205,9 @@ public:
 	bool isArtworkUnlocked(const Common::String &name) const;
 	static Common::String artworkConfName(const Common::String &name);
 
+	void setRunModeEnabled(bool val) { _runModeEnabled = val; }
+	bool runModeEnabled() const { return _runModeEnabled; }
+
 private:
 	bool _luaShowOwnerError;
 	bool _running;
@@ -286,6 +289,9 @@ private:
 	TeVector3f32 _posPlayer;
 
 	Common::Point _lastUpdateMousePos;
+
+	// Syberia 2 specific data
+	bool _runModeEnabled;
 };
 
 } // end namespace Tetraedge
diff --git a/engines/tetraedge/game/in_game_scene.cpp b/engines/tetraedge/game/in_game_scene.cpp
index ef7037282d7..9e8b35348bd 100644
--- a/engines/tetraedge/game/in_game_scene.cpp
+++ b/engines/tetraedge/game/in_game_scene.cpp
@@ -861,9 +861,22 @@ bool InGameScene::loadPlayerCharacter(const Common::String &name) {
 	return true;
 }
 
+bool InGameScene::loadCurve(const Common::String &name) {
+	const Common::Path path = _sceneFileNameBase().joinInPlace(name).appendInPlace(".bin");
+	TeCore *core = g_engine->getCore();
+	Common::FSNode node = core->findFile(path);
+	if (!node.isReadable()) {
+		warning("[InGameScene::loadCurve] Can't open file : %s.", path.toString().c_str());
+		return false;
+	}
+	TeBezierCurve *curve = new TeBezierCurve();
+	curve->loadBin(node);
+	return true;
+}
+
 bool InGameScene::loadDynamicLightBloc(const Common::String &name, const Common::String &texture, const Common::String &zone, const Common::String &scene) {
-	const Common::Path pdat = Common::Path(zone).joinInPlace(scene).joinInPlace(name).appendInPlace(".bin");
-	const Common::Path ptex = Common::Path(zone).joinInPlace(scene).joinInPlace(texture);
+	const Common::Path pdat = _sceneFileNameBase(zone, scene).joinInPlace(name).appendInPlace(".bin");
+	const Common::Path ptex = _sceneFileNameBase(zone, scene).joinInPlace(texture);
 	Common::FSNode datnode = g_engine->getCore()->findFile(pdat);
 	Common::FSNode texnode = g_engine->getCore()->findFile(ptex);
 	if (!datnode.isReadable()) {
diff --git a/engines/tetraedge/game/in_game_scene.h b/engines/tetraedge/game/in_game_scene.h
index 02bd3948688..20e5d816715 100644
--- a/engines/tetraedge/game/in_game_scene.h
+++ b/engines/tetraedge/game/in_game_scene.h
@@ -152,6 +152,7 @@ public:
 	// Syberia 2 specific data..
 	void loadActZones();
 	bool loadCamera(const Common::String &name);
+	bool loadCurve(const Common::String &name);
 	bool loadDynamicLightBloc(const Common::String &name, const Common::String &texture, const Common::String &zone, const Common::String &scene);
 	// loadFlamme uses the xml doc
 	bool loadFreeMoveZone(const Common::String &name, TeVector2f32 &gridSize);
diff --git a/engines/tetraedge/game/in_game_scene_xml_parser.cpp b/engines/tetraedge/game/in_game_scene_xml_parser.cpp
index 3a1762b7b1c..76c1d0e0f24 100644
--- a/engines/tetraedge/game/in_game_scene_xml_parser.cpp
+++ b/engines/tetraedge/game/in_game_scene_xml_parser.cpp
@@ -41,7 +41,7 @@ bool InGameSceneXmlParser::parserCallback_gridSize(ParserNode *node) {
 }
 
 bool InGameSceneXmlParser::parserCallback_curve(ParserNode *node) {
-	warning("TODO: handle curve tag in InGameSceneXmlParser");
+	_scene->loadCurve(node->values["name"]);
 	return true;
 }
 
diff --git a/engines/tetraedge/game/lua_binds.cpp b/engines/tetraedge/game/lua_binds.cpp
index 531c2d71386..3a6f26ade8b 100644
--- a/engines/tetraedge/game/lua_binds.cpp
+++ b/engines/tetraedge/game/lua_binds.cpp
@@ -2138,7 +2138,7 @@ static void MoveCharacterPlayerTo(float x, float y, float z, bool walkFlag) {
 	if (dest == game->posPlayer() && character->walkModeStr() == "Walk")
 		return;
 
-	if (game->walkTimer().running() && game->walkTimer().timeElapsed() < 300000) {
+	if (game->walkTimer().running() && game->walkTimer().timeElapsed() < 300000 && game->runModeEnabled()) {
 		uint64 elapsed = game->walkTimer().timeElapsed();
 		game->walkTimer().stop();
 		if (elapsed < 300000) {
@@ -2183,9 +2183,8 @@ static int tolua_ExportedFunctions_MoveCharacterPlayerTo00(lua_State *L) {
 }
 
 static void EnableRunMode(bool val) {
-	//Game *game = g_engine->getGame();
-	//game->setRunMode(val);
-	warning("TODO: EnableRunMode %s", val ? "true" : "false");
+	Game *game = g_engine->getGame();
+	game->setRunModeEnabled(val);
 }
 
 static int tolua_ExportedFunctions_EnableRunMode00(lua_State *L) {
diff --git a/engines/tetraedge/te/te_bezier_curve.cpp b/engines/tetraedge/te/te_bezier_curve.cpp
index 5b82dee4a0d..0498ae8935c 100644
--- a/engines/tetraedge/te/te_bezier_curve.cpp
+++ b/engines/tetraedge/te/te_bezier_curve.cpp
@@ -19,12 +19,13 @@
  *
  */
 
+#include "common/file.h"
+
 #include "tetraedge/te/te_bezier_curve.h"
 #include "tetraedge/te/te_mesh.h"
 #include "tetraedge/te/te_renderer.h"
 #include "tetraedge/tetraedge.h"
 
-
 namespace Tetraedge {
 
 TeBezierCurve::TeBezierCurve() : _length(0.0), _rawLength(0.0), _lengthNeedsUpdate(true),
@@ -207,6 +208,33 @@ void TeBezierCurve::deserialize(Common::ReadStream &stream, TeBezierCurve &curve
 	}
 }
 
+void TeBezierCurve::loadBin(Common::FSNode &node) {
+	Common::File file;
+	file.open(node);
+	Common::String fname = node.getName();
+	if (fname.size() < 4)
+		error("TeBezierCurve::loadBin fname %s is too short", fname.c_str());
+	setName(fname.substr(0, fname.size() - 4));
+
+	// Load position / rotation / size
+	Te3DObject2::deserialize(file, *this, false);
+	// Then it resets them?
+	setPosition(TeVector3f32());
+	setRotation(TeQuaternion());
+	setSize(TeVector3f32(1, 1, 1));
+
+	_lengthNeedsUpdate = true;
+	uint32 npoints = file.readUint32LE();
+	if (npoints > 1000000)
+		error("TeBezierCurve::loadBin improbable number of control ponts %d", npoints);
+
+	for (uint i = 0; i < npoints; i++) {
+		TeVector3f32 vec;
+		TeVector3f32::deserialize(file, vec);
+		_controlPoints.push_back(vec);
+	}
+}
+
 /*static*/
 TeVector3f32 TeBezierCurve::hermiteInterpolate(float t, const TeVector3f32 *points, float param_4, float param_5) {
 	assert(points);
diff --git a/engines/tetraedge/te/te_bezier_curve.h b/engines/tetraedge/te/te_bezier_curve.h
index 71fab8441cb..271dac93006 100644
--- a/engines/tetraedge/te/te_bezier_curve.h
+++ b/engines/tetraedge/te/te_bezier_curve.h
@@ -50,6 +50,7 @@ public:
 
 	static void serialize(Common::WriteStream &stream, const TeBezierCurve &curve);
 	static void deserialize(Common::ReadStream &stream, TeBezierCurve &curve);
+	void loadBin(Common::FSNode &node);
 
 	const Common::Array<TeVector3f32> &controlPoints() { return _controlPoints; }
 	uint numIterations() const { return _numIterations; }


Commit: fad7e5175b883136e6b8effd8b9763e6fadb5ea1
    https://github.com/scummvm/scummvm/commit/fad7e5175b883136e6b8effd8b9763e6fadb5ea1
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-02-13T15:40:15+09:00

Commit Message:
TETRAEDGE: Add game type enum to allow easy checking

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


diff --git a/engines/tetraedge/tetraedge.cpp b/engines/tetraedge/tetraedge.cpp
index 57a65500729..626174d2393 100644
--- a/engines/tetraedge/tetraedge.cpp
+++ b/engines/tetraedge/tetraedge.cpp
@@ -48,7 +48,7 @@ TetraedgeEngine *g_engine;
 TetraedgeEngine::TetraedgeEngine(OSystem *syst, const ADGameDescription *gameDesc) : Engine(syst),
 	_gameDescription(gameDesc), _randomSource("Tetraedge"), _resourceManager(nullptr),
 	_core(nullptr),	_application(nullptr), _game(nullptr), _renderer(nullptr),
-	_soundManager(nullptr), _inputMgr(nullptr) {
+	_soundManager(nullptr), _inputMgr(nullptr), _gameType(kNone) {
 	g_engine = this;
 }
 
@@ -194,6 +194,15 @@ bool TetraedgeEngine::onKeyUp(const Common::KeyState &state) {
 }
 
 Common::Error TetraedgeEngine::run() {
+	if (getGameId() == "syberia")
+		_gameType = kSyberia;
+	else if (getGameId() == "syberia2")
+		_gameType = kSyberia2;
+	else if (getGameId() == "amerzone")
+		_gameType = kAmerzone;
+	else
+		error("Unknown game id %s", getGameId().c_str());
+
 	configureSearchPaths();
 	// from BasicOpenGLView::prepareOpenGL..
 	_application = new Application();
diff --git a/engines/tetraedge/tetraedge.h b/engines/tetraedge/tetraedge.h
index 0b853ddb97d..102e72ab246 100644
--- a/engines/tetraedge/tetraedge.h
+++ b/engines/tetraedge/tetraedge.h
@@ -51,6 +51,14 @@ class TeResourceManager;
 class TeInputMgr;
 
 class TetraedgeEngine : public Engine {
+public:
+	enum TetraedgeGameType {
+		kNone,
+		kSyberia,
+		kSyberia2,
+		kAmerzone
+	};
+
 private:
 	const ADGameDescription *_gameDescription;
 	Common::RandomSource _randomSource;
@@ -61,6 +69,7 @@ private:
 	TeRenderer *_renderer;
 	TeResourceManager *_resourceManager;
 	TeInputMgr *_inputMgr;
+	enum TetraedgeGameType _gameType;
 
 protected:
 	// Engine APIs
@@ -120,6 +129,7 @@ public:
 	TeRenderer *getRenderer();
 	TeResourceManager *getResourceManager();
 	TeInputMgr *getInputMgr();
+	TetraedgeGameType gameType() const { return _gameType; }
 
 	void openConfigDialog();
 	bool onKeyUp(const Common::KeyState &state);


Commit: 6e4add36824d98c40b94cb54b1d31290038c1d4e
    https://github.com/scummvm/scummvm/commit/6e4add36824d98c40b94cb54b1d31290038c1d4e
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-02-13T15:40:15+09:00

Commit Message:
TETRAEDGE: Handle some more Syberia 2 lua scripts

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 3a6f26ade8b..3591d2c428c 100644
--- a/engines/tetraedge/game/lua_binds.cpp
+++ b/engines/tetraedge/game/lua_binds.cpp
@@ -1248,7 +1248,10 @@ static void ShowBillboard(const Common::String &name) {
 	Game *game = g_engine->getGame();
 	Billboard *bb = game->scene().billboard(name);
 	if (!bb) {
-		error("[ShowBillboard] Billboard not found %s", name.c_str());
+		// Syberia 2 uses billboard A1_RomHaut/11100/A11100-01-04.png but never
+		// loads it..
+		warning("[ShowBillboard] Billboard not found %s", name.c_str());
+		return;
 	}
 	bb->model()->setVisible(true);
 }
@@ -1654,7 +1657,7 @@ static int tolua_ExportedFunctions_ActivateAnchorZone00(lua_State *L) {
 	error("#ferror in function 'ActivateAnchorZone': %d %d %s", err.index, err.array, err.type);
 }
 
-static void SetCharacterLookChar(const Common::String &charname, const Common::String &destname, bool tall) {
+static void SetCharacterLookChar(const Common::String &charname, const Common::String &destname, bool tall, float f) {
 	Game *game = g_engine->getGame();
 	Character *character = game->scene().character(charname);
 	if (!character) {
@@ -1662,6 +1665,8 @@ 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);
 	if (destname.empty()) {
 		character->setCharLookingAt(nullptr);
 	} else {
@@ -1677,11 +1682,13 @@ static void SetCharacterLookChar(const Common::String &charname, const Common::S
 static int tolua_ExportedFunctions_SetCharacterLookChar00(lua_State *L) {
 	tolua_Error err;
 	if (tolua_isstring(L, 1, 0, &err) && tolua_isstring(L, 2, 0, &err)
-		&& tolua_isboolean(L, 3, 1, &err) && tolua_isnoobj(L, 4, &err)) {
+		&& tolua_isboolean(L, 3, 1, &err) && tolua_isnumber(L, 4, 1, &err)
+		&& tolua_isnoobj(L, 5, &err)) {
 		Common::String s1(tolua_tostring(L, 1, nullptr));
 		Common::String s2(tolua_tostring(L, 2, nullptr));
 		bool b = tolua_toboolean(L, 3, 1);
-		SetCharacterLookChar(s1, s2, b);
+		float f = tolua_tonumber(L, 4, 0.0);
+		SetCharacterLookChar(s1, s2, b, f);
 		return 0;
 	}
 	error("#ferror in function 'SetCharacterLookChar': %d %d %s", err.index, err.array, err.type);


Commit: d0936edb14932d915fb89d4626e6b152f19fa4a3
    https://github.com/scummvm/scummvm/commit/d0936edb14932d915fb89d4626e6b152f19fa4a3
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-02-13T15:40:15+09:00

Commit Message:
TETRAEDGE: Parse scene dummy data for Syberia 2

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 76c1d0e0f24..9329dfa7e4f 100644
--- a/engines/tetraedge/game/in_game_scene_xml_parser.cpp
+++ b/engines/tetraedge/game/in_game_scene_xml_parser.cpp
@@ -46,7 +46,8 @@ bool InGameSceneXmlParser::parserCallback_curve(ParserNode *node) {
 }
 
 bool InGameSceneXmlParser::parserCallback_dummy(ParserNode *node) {
-	warning("TODO: handle dummy tag in InGameSceneXmlParser");
+	_scene->_dummies.push_back(InGameScene::Dummy());
+	_scene->_dummies.back()._name = node->values["name"];
 	return true;
 }
 


Commit: 60a6bd1609934a9f81dcbba201aeff2efe99d304
    https://github.com/scummvm/scummvm/commit/60a6bd1609934a9f81dcbba201aeff2efe99d304
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-02-13T15:40:15+09:00

Commit Message:
TETRAEDGE: Copy sounds while iterating to avoid potential crash

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


diff --git a/engines/tetraedge/te/te_sound_manager.cpp b/engines/tetraedge/te/te_sound_manager.cpp
index 3ac1b616b8b..91bf2574769 100644
--- a/engines/tetraedge/te/te_sound_manager.cpp
+++ b/engines/tetraedge/te/te_sound_manager.cpp
@@ -83,8 +83,11 @@ void TeSoundManager::setChannelVolume(const Common::String &channel, float vol)
 }
 
 void TeSoundManager::update() {
-	for (auto &m : _musics)
+	// Take a copy in case the list changes as we iterate.
+	Common::Array<TeMusic *> musics = _musics;
+	for (TeMusic *m : musics) {
 		m->update();
+	}
 }
 
 


Commit: 77bb85ac6a3c6c3365ee7ff82eef48fe3af0d9ad
    https://github.com/scummvm/scummvm/commit/77bb85ac6a3c6c3365ee7ff82eef48fe3af0d9ad
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-02-13T15:40:15+09:00

Commit Message:
TETRAEDGE: Add comments re alpha-only textures

Changed paths:
    engines/tetraedge/te/te_3d_texture.cpp
    engines/tetraedge/te/te_material.h


diff --git a/engines/tetraedge/te/te_3d_texture.cpp b/engines/tetraedge/te/te_3d_texture.cpp
index fcaa8841023..b910cbf874a 100644
--- a/engines/tetraedge/te/te_3d_texture.cpp
+++ b/engines/tetraedge/te/te_3d_texture.cpp
@@ -47,6 +47,9 @@ bool Te3DTexture::hasAlpha() const {
 TeIntrusivePtr<Te3DTexture> Te3DTexture::load2(const Common::FSNode &node, bool alphaOnly) {
 	const Common::String fullPath = node.getPath() + ".3dtex";
 
+	if (alphaOnly)
+		warning("TODO: Handle alphaOnly in Te3DTexture::load2");
+
 	TeResourceManager *resMgr = g_engine->getResourceManager();
 	if (!resMgr->exists(fullPath)) {
 		TeIntrusivePtr<Te3DTexture> retval(makeInstance());
diff --git a/engines/tetraedge/te/te_material.h b/engines/tetraedge/te/te_material.h
index 047f1e4f08f..655898ead00 100644
--- a/engines/tetraedge/te/te_material.h
+++ b/engines/tetraedge/te/te_material.h
@@ -37,7 +37,7 @@ public:
 	enum Mode {
 		MaterialMode0,
 		MaterialMode1,
-		MaterialMode2
+		MaterialMode2 // alpha only?
 	};
 
 	TeMaterial();


Commit: 737e1e2b310e047418ef3ceff65e16d93a21ba5f
    https://github.com/scummvm/scummvm/commit/737e1e2b310e047418ef3ceff65e16d93a21ba5f
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-02-13T15:40:15+09:00

Commit Message:
TETRAEDGE: Handle character animation callbacks for Syberia 2

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


diff --git a/engines/tetraedge/game/character.cpp b/engines/tetraedge/game/character.cpp
index 09a7d1181d4..95045ff665f 100644
--- a/engines/tetraedge/game/character.cpp
+++ b/engines/tetraedge/game/character.cpp
@@ -507,8 +507,7 @@ bool Character::onBonesUpdate(const Common::String &boneName, TeMatrix4x4 &boneM
 			float newY = (fabs(minY) > fabs(lastHeadY)) ? 0.0 : minY + lastHeadY;
 			_lastHeadRotation.setY(newY);
 
-			_headRotation.setX(_lastHeadRotation.getX());
-			_headRotation.setY(_lastHeadRotation.getY());
+			_headRotation = _lastHeadRotation;
 
 			TeQuaternion rot1 = TeQuaternion::fromAxisAndAngle(TeVector3f32(-1, 0, 0), _lastHeadRotation.getX());
 			TeQuaternion rot2 = TeQuaternion::fromAxisAndAngle(TeVector3f32(0, 0, 1), _lastHeadRotation.getY());
diff --git a/engines/tetraedge/game/game.cpp b/engines/tetraedge/game/game.cpp
index 7959a8dc2a0..e47eba25c5f 100644
--- a/engines/tetraedge/game/game.cpp
+++ b/engines/tetraedge/game/game.cpp
@@ -306,7 +306,7 @@ void Game::enter() {
 	Character::loadSettings("models/ModelsSettings.xml");
 	Object3D::loadSettings("objects/ObjectsSettings.xml");
 	if (_scene._character) {
-		_scene._character->onFinished().remove(this, &Game::onDisplacementFinished);
+		_scene._character->onFinished().remove(this, &Game::onDisplacementPlayerFinished);
 		_scene.unloadCharacter(_scene._character->_model->name());
 	}
 	bool loaded = loadPlayerCharacter("Kate");
@@ -364,8 +364,8 @@ void Game::enter() {
 		onFinishedLoadingBackup("");
 	}
 	_sceneCharacterVisibleFromLoad = true;
-	_scene._character->onFinished().remove(this, &Game::onDisplacementFinished);
-	_scene._character->onFinished().add(this, &Game::onDisplacementFinished);
+	_scene._character->onFinished().remove(this, &Game::onDisplacementPlayerFinished);
+	_scene._character->onFinished().add(this, &Game::onDisplacementPlayerFinished);
 	_prevSceneName.clear();
 	_notifier.load();
 }
@@ -850,7 +850,12 @@ bool Game::loadCharacter(const Common::String &name) {
 			assert(character);
 			character->_onCharacterAnimFinishedSignal.remove(this, &Game::onCharacterAnimationFinished);
 			character->_onCharacterAnimFinishedSignal.add(this, &Game::onCharacterAnimationFinished);
-			character->onFinished().add(this, &Game::onDisplacementFinished);
+			// Syberia 2 uses a simplified callback here.
+			// We have made onDisplacementPlayerFinished more like Syberia 1's onDisplacementPlayerFinished.
+			if (g_engine->gameType() == TetraedgeEngine::kSyberia)
+				character->onFinished().add(this, &Game::onDisplacementPlayerFinished);
+			else
+				character->onFinished().add(this, &Game::onDisplacementFinished);
 		}
 	}
 	return result;
@@ -861,8 +866,8 @@ bool Game::loadPlayerCharacter(const Common::String &name) {
 	if (result) {
 		_scene._character->_characterAnimPlayerFinishedSignal.remove(this, &Game::onCharacterAnimationPlayerFinished);
 		_scene._character->_characterAnimPlayerFinishedSignal.add(this, &Game::onCharacterAnimationPlayerFinished);
-		_scene._character->onFinished().remove(this, &Game::onDisplacementFinished);
-		_scene._character->onFinished().add(this, &Game::onDisplacementFinished);
+		_scene._character->onFinished().remove(this, &Game::onDisplacementPlayerFinished);
+		_scene._character->onFinished().add(this, &Game::onDisplacementPlayerFinished);
 	}
 	return result;
 }
@@ -980,12 +985,34 @@ bool Game::onDialogFinished(const Common::String &val) {
 	return false;
 }
 
+// This is the Syberia 2 version of this function, not used in Syb 2.
+// Syb 1 uses a function much more like onDisplacementPlayerFinished below.
 bool Game::onDisplacementFinished() {
+	TeLuaThread *thread = nullptr;
+	for (uint i = 0; i < _yieldedCallbacks.size(); i++) {
+		YieldedCallback &cb = _yieldedCallbacks[i];
+		if (cb._luaFnName == "OnDisplacementFinished") {
+			thread = cb._luaThread;
+			_yieldedCallbacks.remove_at(i);
+			break;
+		}
+	}
+	if (thread) {
+		thread->resume();
+	} else {
+		_luaScript.execute("OnDisplacementFinished");
+	}
+	return false;
+}
+
+bool Game::onDisplacementPlayerFinished() {
 	_sceneCharacterVisibleFromLoad = true;
+	assert(_scene._character);
 	_scene._character->stop();
+	_scene._character->walkMode("Walk");
 	_scene._character->setAnimation(_scene._character->characterSettings()._idleAnimFileName, true);
 
-	if (!_isCharacterWalking) {
+	if (_isCharacterWalking) {
 		_isCharacterWalking = false;
 		_isCharacterIdle = true;
 	} else {
@@ -994,9 +1021,12 @@ bool Game::onDisplacementFinished() {
 
 	TeLuaThread *thread = nullptr;
 
+	const char *cbName = (g_engine->gameType() == TetraedgeEngine::kSyberia ?
+						"OnDisplacementFinished" : "OnDisplacementPlayerFinished");
+
 	for (uint i = 0; i < _yieldedCallbacks.size(); i++) {
 		YieldedCallback &cb = _yieldedCallbacks[i];
-		if (cb._luaFnName == "OnDisplacementFinished") {
+		if (cb._luaFnName == cbName) {
 			thread = cb._luaThread;
 			_yieldedCallbacks.remove_at(i);
 			break;
@@ -1005,7 +1035,7 @@ bool Game::onDisplacementFinished() {
 	if (thread) {
 		thread->resume();
 	} else {
-		_luaScript.execute("OnDisplacementFinished");
+		_luaScript.execute(cbName);
 	}
 	return false;
 }
@@ -1584,7 +1614,12 @@ bool Game::unloadCharacter(const Common::String &charname) {
 	}
 	c->_onCharacterAnimFinishedSignal.remove(this, &Game::onCharacterAnimationFinished);
 	c->removeAnim();
-	c->onFinished().remove(this, &Game::onDisplacementFinished);
+	// Syberia 2 uses a simplified callback here.
+	// We have made onDisplacementPlayerFinished more like Syberia 1's onDisplacementPlayerFinished.
+	if (g_engine->gameType() == TetraedgeEngine::kSyberia)
+		c->onFinished().remove(this, &Game::onDisplacementPlayerFinished);
+	else
+		c->onFinished().remove(this, &Game::onDisplacementFinished);
 	_scene.unloadCharacter(charname);
 	return true;
 }
@@ -1692,7 +1727,9 @@ void Game::update() {
 		_scene.update();
 	} else {
 		TeSoundManager *soundmgr = g_engine->getSoundManager();
-		for (auto &music : soundmgr->musics()) {
+		// Take a copy in case the active music objects changes as we iterate.
+		Common::Array<TeMusic *> musics = soundmgr->musics();
+		for (TeMusic *music : musics) {
 			const Common::String &chanName = music->channelName();
 			if (chanName != "music" && chanName != "sfx" && chanName != "dialog")
 				music->stop();
diff --git a/engines/tetraedge/game/game.h b/engines/tetraedge/game/game.h
index 56c21fe0112..bc2c50857a5 100644
--- a/engines/tetraedge/game/game.h
+++ b/engines/tetraedge/game/game.h
@@ -132,6 +132,7 @@ public:
 	bool onCharacterAnimationPlayerFinished(const Common::String &val);
 	bool onDialogFinished(const Common::String &val);
 	bool onDisplacementFinished();
+	bool onDisplacementPlayerFinished();
 	bool onFinishedCheckBackup(bool result);
 	bool onFinishedLoadingBackup(const Common::String &val);
 	bool onFinishedSavingBackup(int something);


Commit: 5c8de85cd9a6c9fb44bdbd28586f37e442970cd9
    https://github.com/scummvm/scummvm/commit/5c8de85cd9a6c9fb44bdbd28586f37e442970cd9
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-02-13T16:48:17+09:00

Commit Message:
TETRAEDGE: Add more features for Syberia 2 lua scripts

Can now do most things in the first few scenes, with some bugs.

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


diff --git a/engines/tetraedge/game/in_game_scene.cpp b/engines/tetraedge/game/in_game_scene.cpp
index 9e8b35348bd..fd6cd61584e 100644
--- a/engines/tetraedge/game/in_game_scene.cpp
+++ b/engines/tetraedge/game/in_game_scene.cpp
@@ -174,8 +174,9 @@ Billboard *InGameScene::billboard(const Common::String &name) {
 }
 
 bool InGameScene::changeBackground(const Common::String &name) {
-	if (Common::File::exists(name)) {
-		_bgGui.spriteLayoutChecked("root")->load(name);
+	Common::FSNode node = g_engine->getCore()->findFile(name);
+	if (node.isReadable()) {
+		_bgGui.spriteLayoutChecked("root")->load(node);
 		return true;
 	}
 	return false;
@@ -1421,6 +1422,16 @@ void InGameScene::update() {
 	}
 }
 
+void InGameScene::activateMask(const Common::String &name, bool val) {
+	for (auto mask : _masks) {
+		if (mask->name() == name) {
+			mask->setVisible(val);
+			return;
+		}
+	}
+	warning("activateMask: Didn't find mask %s", name.c_str());
+}
+
 bool InGameScene::AnimObject::onFinished() {
 	Game *game = g_engine->getGame();
 	for (uint i = 0; i < game->yieldedCallbacks().size(); i++) {
diff --git a/engines/tetraedge/game/in_game_scene.h b/engines/tetraedge/game/in_game_scene.h
index 20e5d816715..1829ad7c43c 100644
--- a/engines/tetraedge/game/in_game_scene.h
+++ b/engines/tetraedge/game/in_game_scene.h
@@ -226,6 +226,7 @@ public:
 	const Common::String getSceneName() const { return _sceneName; }
 
 	void setCollisionSlide(bool val) { _collisionSlide = val; }
+	void activateMask(const Common::String &name, bool val);
 
 private:
 	int _shadowLightNo;
diff --git a/engines/tetraedge/game/lua_binds.cpp b/engines/tetraedge/game/lua_binds.cpp
index 3591d2c428c..92f52b706c1 100644
--- a/engines/tetraedge/game/lua_binds.cpp
+++ b/engines/tetraedge/game/lua_binds.cpp
@@ -2370,7 +2370,79 @@ static int tolua_ExportedFunctions_AddUnlockedAnim00(lua_State *L) {
 	error("#ferror in function 'AddUnlockedAnim': %d %d %s", err.index, err.array, err.type);
 }
 
+static void SetObjectMoveDest(const Common::String &obj, float x, float y, float z) {
+	warning("TODO: SetObjectMoveDest(%s, %f, %f, %f)", obj.c_str(), x, y, z);
+}
 
+static int tolua_ExportedFunctions_SetObjectMoveDest00(lua_State *L) {
+	tolua_Error err;
+	if (tolua_isstring(L, 1, 0, &err) && tolua_isnumber(L, 2, 0, &err)
+		&& tolua_isnumber(L, 2, 0, &err) && tolua_isnumber(L, 4, 0, &err)
+		&& tolua_isnoobj(L, 5, &err)) {
+		Common::String s1(tolua_tostring(L, 1, nullptr));
+		float f1 = tolua_tonumber(L, 2, 0.0);
+		float f2 = tolua_tonumber(L, 3, 0.0);
+		float f3 = tolua_tonumber(L, 4, 0.0);
+		SetObjectMoveDest(s1, f1, f2, f3);
+		return 0;
+	}
+	error("#ferror in function 'SetObjectMoveDest': %d %d %s", err.index, err.array, err.type);
+}
+
+static void SetObjectMoveTime(const Common::String &obj, float f) {
+	warning("TODO: SetObjectMoveTime(%s, %f)", obj.c_str(), f);
+}
+
+static int tolua_ExportedFunctions_SetObjectMoveTime00(lua_State *L) {
+	tolua_Error err;
+	if (tolua_isstring(L, 1, 0, &err) && tolua_isnumber(L, 2, 0, &err)
+		&& tolua_isnoobj(L, 3, &err)) {
+		Common::String s1(tolua_tostring(L, 1, nullptr));
+		float f1 = tolua_tonumber(L, 2, 0.0);
+		SetObjectMoveTime(s1, f1);
+		return 0;
+	}
+	error("#ferror in function 'SetObjectMoveTime': %d %d %s", err.index, err.array, err.type);
+}
+
+static void ActivateMask(const Common::String &name, bool val) {
+	Game *game = g_engine->getGame();
+	game->scene().activateMask(name, val);
+}
+
+static int tolua_ExportedFunctions_ActivateMask00(lua_State *L) {
+	tolua_Error err;
+	if (tolua_isstring(L, 1, 0, &err) && tolua_isboolean(L, 2, 0, &err)
+		&& tolua_isnoobj(L, 3, &err)) {
+		Common::String s1(tolua_tostring(L, 1, nullptr));
+		bool b1 = tolua_toboolean(L, 2, 0.0);
+		ActivateMask(s1, b1);
+		return 0;
+	}
+	error("#ferror in function 'ActivateMask': %d %d %s", err.index, err.array, err.type);
+}
+
+// Not your imagination, the implementation of these two is quite different to the others.
+static int tolua_GetParticleIndex(lua_State *L) {
+	Common::String s1(tolua_tostring(L, 1, nullptr));
+	warning("TODO: GetParticleIndex(%s)", s1.c_str());
+	tolua_pushnumber(L, 0);
+	//int idx = TeParticle::getIndex(s1);
+	//tolua_pushnumber(L, idx);
+	return 1;
+}
+
+static int tolua_EnableParticle(lua_State *L) {
+	double d1 = tolua_tonumber(L, 1, 0.0);
+	/*
+	TeParticle *p = (TeParticle *)TeParticle::getIndexedParticle((int)d1);
+	if (p) {
+		double d2 = tolua_tonumber(L, 2, 1.0);
+		p->enable((int)d2 != 0);
+	}*/
+	warning("TODO: EnableParticle(%d)", (int)d1);
+	return 0;
+}
 
 
 // ////////////////////////////////////////////////////////////////////////
@@ -2532,6 +2604,11 @@ void LuaOpenBinds(lua_State *L) {
 	tolua_function(L, "SetCharacterPlayerPosition", tolua_ExportedFunctions_SetCharacterPlayerPosition00);
 	tolua_function(L, "SetCharacterPlayerAnimation", tolua_ExportedFunctions_SetCharacterPlayerAnimation00);
 	tolua_function(L, "AddUnlockedAnim", tolua_ExportedFunctions_AddUnlockedAnim00);
+	tolua_function(L, "SetObjectMoveDest", tolua_ExportedFunctions_SetObjectMoveDest00);
+	tolua_function(L, "SetObjectMoveTime", tolua_ExportedFunctions_SetObjectMoveTime00);
+	tolua_function(L, "ActivateMask", tolua_ExportedFunctions_ActivateMask00);
+	tolua_function(L, "GetParticleIndex", tolua_GetParticleIndex);
+	tolua_function(L, "EnableParticle", tolua_EnableParticle);
 
 	// TODO Syberia 2 functions..
 	//tolua_function(L, "PlaySnow", tolua_ExportedFunctions_PlaySnow00);
@@ -2541,14 +2618,9 @@ void LuaOpenBinds(lua_State *L) {
 	//tolua_function(L, "SetYoukiFollowKate", tolua_ExportedFunctions_SetYoukiFollowKate00);
 	//tolua_function(L, "PlaySmoke", tolua_ExportedFunctions_PlaySmoke00);
 	//tolua_function(L, "SmokeVisible", tolua_ExportedFunctions_SmokeVisible00);
-	//tolua_function(L, "ActivateMask", tolua_ExportedFunctions_ActivateMask00);
 	//tolua_function(L, "AddRandomAnimation", tolua_ExportedFunctions_AddRandomAnimation00);
 	//tolua_function(L, "PlayRandomAnimation", tolua_ExportedFunctions_PlayRandomAnimation00);
-	//tolua_function(L, "SetObjectMoveDest", tolua_ExportedFunctions_SetObjectMoveDest00);
-	//tolua_function(L, "SetObjectMoveTime", tolua_ExportedFunctions_SetObjectMoveTime00);
 	//tolua_function(L, "PlayVerticalScrolling", tolua_ExportedFunctions_PlayVerticalScrolling00);
-	//tolua_function(L, "GetParticleIndex", tolua_GetParticleIndex);
-	//tolua_function(L, "EnableParticle", tolua_EnableParticle);
 
 	tolua_endmodule(L);
 }




More information about the Scummvm-git-logs mailing list