From d073f5767c0ab05afd072a7dd6c49cfa9c0363e6 Mon Sep 17 00:00:00 2001 From: Strangerke Date: Wed, 4 Nov 2015 14:45:22 +0100 Subject: MADS: Phantom: Add more Catacombs functions --- engines/mads/phantom/game_phantom.cpp | 70 +++++++++++++++++++++++++++++++- engines/mads/phantom/game_phantom.h | 5 ++- engines/mads/phantom/phantom_scenes3.cpp | 2 +- 3 files changed, 72 insertions(+), 5 deletions(-) (limited to 'engines') diff --git a/engines/mads/phantom/game_phantom.cpp b/engines/mads/phantom/game_phantom.cpp index ca2d68713b..05127147ea 100644 --- a/engines/mads/phantom/game_phantom.cpp +++ b/engines/mads/phantom/game_phantom.cpp @@ -291,12 +291,33 @@ void GamePhantom::synchronize(Common::Serializer &s, bool phase1) { } } -void GamePhantom::enterCatacombs(int val) { +void GamePhantom::enterCatacombs(bool val) { warning("TODO: enterCatacombs"); + + setupCatacombs(); + + int var4, var2; + if (_scene._currentSceneId == 409) { + if (val) { + var4 = _globals[kCatacombs409b]; + var2 = _globals[kCatacombs409bFrom]; + } else { + var4 = _globals[kCatacombs409a]; + var2 = _globals[kCatacombs409aFrom]; + } + } else if (_scene._currentSceneId == 501) { + var4 = _globals[kCatacombs501]; + var2 = _globals[kCatacombs501From]; + } else { + var4 = _globals[kCatacombs309]; + var2 = _globals[kCatacombs309From]; + } + + newCatacombRoom(var4, var2); } void GamePhantom::initCatacombs() { - warning("TODO: initCatacombs"); + _globals[kCatacombsRoom] = _globals[kCatacombsNextRoom]; } void GamePhantom::setupCatacombs() { @@ -337,6 +358,51 @@ int GamePhantom::exitCatacombs(int dir) { return (_catacombs[scene]._exit[dir]); }; +void GamePhantom::moveCatacombs(int dir) { + assert(_globals[kCatacombsRoom] = CLIP(_globals[kCatacombsRoom], 0, _catacombSize)); + assert(dir = CLIP(dir, 0, 3)); + + newCatacombRoom(_catacombs[_globals[kCatacombsRoom]]._fromDirection[dir], _catacombs[_globals[kCatacombsRoom]]._exit[dir]); +}; + +void GamePhantom::newCatacombRoom(int toRoom, int fromExit) { + _globals[kCatacombsNextRoom] = toRoom; + _globals[kCatacombsFrom] = fromExit & 0x03; + _globals[kCatacombsFlag] = fromExit & 0xFC; + + int newSceneNum = -1; + + if (toRoom < 0) { + switch (toRoom) { + case -5: + newSceneNum = 501; + break; + + case -4: + case -3: + newSceneNum = 409; + break; + + case -2: + newSceneNum = 309; + break; + + default: + error("Unexpected room in newCatacombRoom"); + } + } else { + newSceneNum = _catacombs[toRoom]._sceneNum; + _globals[81] = _catacombs[toRoom]._flags; + } + + if (_triggerSetupMode == SEQUENCE_TRIGGER_PREPARE) { + _player._walkOffScreenSceneId = newSceneNum; + } else { + _scene._reloadSceneFlag = -1; + _scene._nextSceneId = newSceneNum; + } +} + } // End of namespace Phantom } // End of namespace MADS diff --git a/engines/mads/phantom/game_phantom.h b/engines/mads/phantom/game_phantom.h index a7a91b37ad..6c3f2fca14 100644 --- a/engines/mads/phantom/game_phantom.h +++ b/engines/mads/phantom/game_phantom.h @@ -121,10 +121,11 @@ public: virtual void synchronize(Common::Serializer &s, bool phase1); void setupCatacombs(); - void enterCatacombs(int val); + void enterCatacombs(bool val); void initCatacombs(); - void moveCatacombs(int dir) { warning("TODO: moveCataCombs"); }; + void moveCatacombs(int dir); int exitCatacombs(int dir); + void newCatacombRoom(int fromRoom, int fromExit); }; diff --git a/engines/mads/phantom/phantom_scenes3.cpp b/engines/mads/phantom/phantom_scenes3.cpp index 434dc5707e..f2b709c4f0 100644 --- a/engines/mads/phantom/phantom_scenes3.cpp +++ b/engines/mads/phantom/phantom_scenes3.cpp @@ -2351,7 +2351,7 @@ void Scene309::actions() { _boatStatus = 0; _talkCount = 0; } else if (_globals[kLanternStatus] == 1) - _game.enterCatacombs(0); + _game.enterCatacombs(false); _action._inProgress = false; return; -- cgit v1.2.3