[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