aboutsummaryrefslogtreecommitdiff
path: root/engines/mads
diff options
context:
space:
mode:
authorStrangerke2015-11-04 14:45:22 +0100
committerStrangerke2015-11-04 14:45:22 +0100
commitd073f5767c0ab05afd072a7dd6c49cfa9c0363e6 (patch)
tree348d12a372f3451b258fa568088d947a0f7cbed0 /engines/mads
parentcdc564b06049d064aeb15ad632fc4822a5d814d8 (diff)
downloadscummvm-rg350-d073f5767c0ab05afd072a7dd6c49cfa9c0363e6.tar.gz
scummvm-rg350-d073f5767c0ab05afd072a7dd6c49cfa9c0363e6.tar.bz2
scummvm-rg350-d073f5767c0ab05afd072a7dd6c49cfa9c0363e6.zip
MADS: Phantom: Add more Catacombs functions
Diffstat (limited to 'engines/mads')
-rw-r--r--engines/mads/phantom/game_phantom.cpp70
-rw-r--r--engines/mads/phantom/game_phantom.h5
-rw-r--r--engines/mads/phantom/phantom_scenes3.cpp2
3 files changed, 72 insertions, 5 deletions
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;