diff options
Diffstat (limited to 'engines/mads/phantom/game_phantom.cpp')
-rw-r--r-- | engines/mads/phantom/game_phantom.cpp | 772 |
1 files changed, 757 insertions, 15 deletions
diff --git a/engines/mads/phantom/game_phantom.cpp b/engines/mads/phantom/game_phantom.cpp index 592a108aea..7e61241182 100644 --- a/engines/mads/phantom/game_phantom.cpp +++ b/engines/mads/phantom/game_phantom.cpp @@ -35,10 +35,109 @@ namespace MADS { namespace Phantom { -GamePhantom::GamePhantom(MADSEngine *vm) - : Game(vm) { + Catacombs _easyCatacombs[32] = { + { 401, { -1, 1, 2, 6 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK }, + { 404, { 10, 11, 3, 0 }, { 2, 3, 0, 1 }, MAZE_EVENT_PUDDLE }, + { 404, { 0, 3, 4, -2 }, { 2, 3, 0, 1 }, MAZE_EVENT_BLOCK }, + { 401, { 1, 14, 5, 2 }, { 2, 3, 0, 1 }, MAZE_EVENT_POT }, + { 453, { 2, 4, -1, 4 }, { 2, 3, 0, 1 }, MAZE_EVENT_DRAIN }, + { 403, { 3, 6, -1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_PLANK }, + { 406, { -1, 0, -1, 5 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 453, { -1, 8, -1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK }, + { 406, { -1, 9, -1, 7 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 401, { 1, -1, 10, 8 }, { 2, 3, 0, 1 }, MAZE_EVENT_RAT_NEST | MAZE_EVENT_SKULL }, + { 408, { 9, -1, 1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 453, { 12, -1, -1, 1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_STONE }, + { 408, { 13, -1, 11, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK }, + { 401, { 13, 20, 12, 13 }, { 3, 3, 0, 0 }, MAZE_EVENT_BRICK }, + { 453, { 16, 15, -1, 3 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_RAT_NEST }, + { 456, { -1, -1, -1, 14 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 404, { -1, 17, 14, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_WEB | MAZE_EVENT_POT }, + { 401, { 18, -1, 19, 16 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK }, + { 408, { -1, -1, 17, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK }, + { 403, { 17, -1, -1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_HOLE | MAZE_EVENT_WEB }, + { 403, { 21, 22, -1, 13 }, { 2, 3, 0, 1 }, MAZE_EVENT_WEB | MAZE_EVENT_SKULL }, + { 404, { -1, -1, 20, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 406, { -1, 23, -1, 20 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 404, { 24, 23, 23, 22 }, { 2, 2, 1, 1 }, MAZE_EVENT_RAT_NEST | MAZE_EVENT_BRICK }, + { 401, { -1, 1, 23, 25 }, { 2, 1, 0, 1 }, MAZE_EVENT_PUDDLE | MAZE_EVENT_POT | MAZE_EVENT_BRICK }, + { 407, { 29, 24, 28, 26 }, { 3, 3, 1, 1 }, MAZE_EVENT_NONE }, + { 401, { 27, 25, 23, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_SKULL }, + { 404, { -1, 28, 26, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_WEB | MAZE_EVENT_FALLEN_BLOCK }, + { 456, { -1, 25, -1, 27 }, { 2, 2, 0, 1 }, MAZE_EVENT_NONE }, + { 406, { -1, 30, -1, 25 }, { 2, 3, 0, 0 }, MAZE_EVENT_NONE }, + { 453, { -3, 30, -1, 29 }, { 2, 3, 0, 1 }, MAZE_EVENT_STONE | MAZE_EVENT_RAT_NEST | MAZE_EVENT_WEB }, + { 408, { -5, -1, -4, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_WEB | MAZE_EVENT_BRICK } + }; + + Catacombs _hardCatacombs[62] = { + { 401, { -1, 1, 2, 6 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK }, + { 404, { 10, 11, 3, 0 }, { 2, 3, 0, 1 }, MAZE_EVENT_PUDDLE }, + { 404, { 0, 3, 4, -2 }, { 2, 3, 0, 1 }, MAZE_EVENT_BLOCK }, + { 401, { 1, 20, 5, 2 }, { 2, 0, 0, 1 }, MAZE_EVENT_POT }, + { 453, { 2, 4, -1, 4 }, { 2, 3, 0, 1 }, MAZE_EVENT_DRAIN }, + { 403, { 3, 6, -1, 4 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_PLANK }, + { 406, { -1, 0, -1, 5 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 453, { -1, 8, -1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK }, + { 406, { -1, 9, -1, 7 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 401, { 1, -1, 10, 8 }, { 0, 3, 0, 1 }, MAZE_EVENT_RAT_NEST | MAZE_EVENT_SKULL }, + { 408, { 9, -1, 1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 453, { 12, -1, -1, 1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_STONE }, + { 408, { 13, -1, 11, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK }, + { 401, { 13, 21, 12, 13 }, { 3, 3, 0, 0 }, MAZE_EVENT_BRICK }, + { 453, { 16, 15, -1, 20 }, { 2, 3, 0, 2 }, MAZE_EVENT_RAT_NEST | MAZE_EVENT_BRICK }, + { 456, { -1, -1, -1, 14 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 404, { -1, 17, 14, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_WEB | MAZE_EVENT_POT }, + { 401, { 18, -1, 19, 16 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK }, + { 408, { -1, -1, 17, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK }, + { 403, { 17, -1, -1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_HOLE | MAZE_EVENT_WEB }, + { 408, { 3, -1, 14, -1 }, { 1, 3, 3, 1 }, MAZE_EVENT_NONE }, + { 404, { 9, 30, 22, 13 }, { 0, 3, 0, 1 }, MAZE_EVENT_RAT_NEST }, + { 403, { 21, 23, -1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_HOLE | MAZE_EVENT_WEB }, + { 401, { -1, -1, 24, 22 }, { 2, 3, 3, 1 }, MAZE_EVENT_BRICK }, + { 406, { -1, 26, -1, 23 }, { 2, 0, 0, 2 }, MAZE_EVENT_NONE }, + { 407, { 36, 33, 35, 34 }, { 3, 3, 1, 1 }, MAZE_EVENT_NONE }, + { 453, { 24, 27, -1, -1 }, { 1, 0, 0, 1 }, MAZE_EVENT_BRICK }, + { 403, { 26, -1, -1, 28 }, { 1, 3, 0, 0 }, MAZE_EVENT_BRICK | MAZE_EVENT_SKULL }, + { 404, { 27, 28, 28, 29 }, { 3, 2, 1, 2 }, MAZE_EVENT_NONE }, + { 408, { -1, -1, 28, -1 }, { 2, 3, 3, 1 }, MAZE_EVENT_BRICK }, + { 406, { -1, 31, -1, 21 }, { 2, 0, 0, 1 }, MAZE_EVENT_NONE }, + { 401, { 30, 33, 1, -1 }, { 1, 2, 1, 1 }, MAZE_EVENT_PUDDLE | MAZE_EVENT_POT }, + { 456, { -1, 31, -1, 33 }, { 2, 1, 0, 0 }, MAZE_EVENT_NONE }, + { 404, { 32, -1, 31, 25 }, { 3, 3, 1, 1 }, MAZE_EVENT_NONE }, + { 401, { 46, 25, 31, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_SKULL }, + { 401, { -1, 25, 41, -1 }, { 2, 2, 1, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_POT }, + { 406, { -1, 37, -1, 25 }, { 2, 3, 0, 0 }, MAZE_EVENT_NONE }, + { 453, { -3, 37, -1, 36 }, { 2, 3, 0, 1 }, MAZE_EVENT_STONE | MAZE_EVENT_RAT_NEST | MAZE_EVENT_WEB }, + { 408, { 57, -1, 54, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 408, { 40, -1, -4, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_WEB }, + { 404, { 40, 40, 39, 53 }, { 1, 0, 0, 1 }, MAZE_EVENT_BLOCK | MAZE_EVENT_FALLEN_BLOCK }, + { 456, { -1, 35, -1, 42 }, { 2, 2, 0, 2 }, MAZE_EVENT_NONE }, + { 408, { 43, -1, 41, -1 }, { 1, 3, 3, 1 }, MAZE_EVENT_BRICK }, + { 406, { -1, 42, -1, 61 }, { 2, 0, 0, 1 }, MAZE_EVENT_NONE }, + { 403, { 58, 45, -1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_RAT_NEST }, + { 401, { 34, -1, 46, 44 }, { 0, 3, 0, 1 }, MAZE_EVENT_RAT_NEST | MAZE_EVENT_BRICK }, + { 404, { 45, -1, 34, 47 }, { 2, 3, 0, 1 }, MAZE_EVENT_WEB | MAZE_EVENT_FALLEN_BLOCK }, + { 406, { -1, 46, -1, 48 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 403, { 49, 47, -1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_SKULL | MAZE_EVENT_WEB }, + { 408, { 50, -1, 48, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK }, + { 408, { 51, -1, 49, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 408, { 52, -1, 50, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK }, + { 408, { -1, -1, 51, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK }, + { 406, { -1, 40, -1, 54 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 403, { 38, 53, -1, 55 }, { 2, 3, 0, 1 }, MAZE_EVENT_SKULL }, + { 453, { 56, 54, -1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_WEB }, + { 401, { 56, -5, 55, 56 }, { 3, 3, 0, 0 }, MAZE_EVENT_BRICK | MAZE_EVENT_SKULL }, + { 404, { -1, 57, 38, 57 }, { 2, 3, 0, 1 }, MAZE_EVENT_POT | MAZE_EVENT_BLOCK }, + { 404, { 59, 59, 44, 60 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 404, { 59, 60, 59, 58 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 404, { 61, 58, 59, 59 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 404, { 34, 43, 60, 44 }, { 0, 3, 0, 1 }, MAZE_EVENT_NONE } + }; + +GamePhantom::GamePhantom(MADSEngine *vm) : Game(vm) { _surface = new MSurface(MADS_SCREEN_WIDTH, MADS_SCENE_HEIGHT); - _storyMode = STORYMODE_NAUGHTY; + _difficulty = DIFFICULTY_HARD; } void GamePhantom::startGame() { @@ -51,8 +150,7 @@ void GamePhantom::startGame() { void GamePhantom::initializeGlobals() { _globals.reset(); - - // TODO: Catacombs setup + setupCatacombs(); _player._facing = FACING_NORTH; _player._turnToFacing = FACING_NORTH; @@ -104,7 +202,7 @@ void GamePhantom::initializeGlobals() { _globals[kChristineToldEnvelope] = false; _globals[kLeaveAngelMusicOn] = false; _globals[kDoorIn409IsOpen] = false; - _globals[kUnknown] = false; + _globals[kPriestPistonPuke] = false; _globals[kCobwebIsCut] = false; _globals[kChristineIsInBoat] = false; _globals[kRightDoorIsOpen504] = false; @@ -161,27 +259,561 @@ void GamePhantom::checkShowDialog() { } } +void GamePhantom::genericObjectExamine() { + MADSAction &action = _scene._action; + int id = _objects.getIdFromDesc(action._activeAction._objectNameId); + + if (action.isAction(VERB_LOOK, NOUN_RED_FRAME)) + _vm->_dialogs->showItem(id, (_globals[kCurrentYear] == 1993) ? 802 : 842, 0); + else if (action.isAction(VERB_LOOK, NOUN_YELLOW_FRAME)) + _vm->_dialogs->showItem(id, (_globals[kCurrentYear] == 1993) ? 804 : 843, 0); + else if (action.isAction(VERB_LOOK, NOUN_BLUE_FRAME)) + _vm->_dialogs->showItem(id, (_globals[kCurrentYear] == 1993) ? 817 : 844, 0); + else if (action.isAction(VERB_LOOK, NOUN_GREEN_FRAME)) + _vm->_dialogs->showItem(id, (_globals[kCurrentYear] == 1993) ? 819 : 845, 0); + else if (action.isAction(VERB_LOOK, NOUN_LANTERN)) + _vm->_dialogs->showItem(id, (_globals[kLanternStatus] == 1) ? 831 : 801, 0); + else if (action.isAction(VERB_LOOK, NOUN_SMALL_NOTE)) + _vm->_dialogs->showItem(OBJ_SMALL_NOTE, 846, 2); + else if (action.isAction(VERB_LOOK, NOUN_PARCHMENT)) + _vm->_dialogs->showItem(OBJ_PARCHMENT, 812, 3); + else if (action.isAction(VERB_LOOK, NOUN_LETTER)) + _vm->_dialogs->showItem(OBJ_LETTER, 813, 4); + else if (action.isAction(VERB_LOOK, NOUN_NOTICE)) + _vm->_dialogs->showItem(OBJ_NOTICE, 814, 5); + else if (action.isAction(VERB_LOOK, NOUN_CRUMPLED_NOTE)) + _vm->_dialogs->showItem(OBJ_CRUMPLED_NOTE, 816, 6); + else if (action.isAction(VERB_LOOK, NOUN_LARGE_NOTE)) + _vm->_dialogs->showItem(OBJ_LARGE_NOTE, 818, 7); + else + _vm->_dialogs->showItem(id, 800 + id, 0); +} + void GamePhantom::doObjectAction() { - // TODO: Copied from Nebular - //Scene &scene = _scene; MADSAction &action = _scene._action; - //Dialogs &dialogs = *_vm->_dialogs; - //int id; - action._inProgress = false; + if ((_scene._currentSceneId >= 401) && (_scene._currentSceneId <= 456) + && (action.isObject(NOUN_RED_FRAME) || action.isObject(NOUN_YELLOW_FRAME) || action.isObject(NOUN_GREEN_FRAME) || action.isObject(NOUN_BLUE_FRAME)) + && action.isAction(VERB_PUT)) { + if (action.isTarget(NOUN_UNLUCKY_ADVENTURER)) { + _vm->_dialogs->show(35); + action._inProgress = false; + return; + } else if (action.isTarget(NOUN_HOLE)) { + _vm->_dialogs->show(36); + action._inProgress = false; + return; + } else if (action.isTarget(NOUN_GRATE)) { + _vm->_dialogs->show(37); + action._inProgress = false; + return; + } else if (action.isTarget(NOUN_WALL)) { + _vm->_dialogs->show(38); + action._inProgress = false; + return; + } + } + + if (action._lookFlag) { + _vm->_dialogs->show(810); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_PUT, NOUN_RED_FRAME) || action.isAction(VERB_PUT, NOUN_BLUE_FRAME) || action.isAction(VERB_PUT, NOUN_YELLOW_FRAME) || action.isAction(VERB_PUT, NOUN_GREEN_FRAME)) { + _vm->_dialogs->show((action.isTarget(NOUN_PUDDLE)) ? 40124 : 40125); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_WEAR, NOUN_WEDDING_RING)) { + if (_globals[kRingIsOnFinger]) + _vm->_dialogs->show(849); + else { + _vm->_dialogs->show(835); + _globals[kRingIsOnFinger] = true; + } + action._inProgress = false; + return; + } + + if (action.isAction(VERB_REMOVE, NOUN_WEDDING_RING)) { + if (!_globals[kRingIsOnFinger]) + _vm->_dialogs->show(848); + else { + _vm->_dialogs->show(836); + _globals[kRingIsOnFinger] = false; + } + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_ARCHWAY_TO_WEST) || action.isAction(VERB_LOOK, NOUN_ARCHWAY_TO_EAST) || action.isAction(VERB_LOOK, NOUN_ARCHWAY_TO_NORTH)) { + _vm->_dialogs->show(34); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_ATTACK, NOUN_CHRISTINE)) { + _vm->_dialogs->show(33); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_KEY)) { + _vm->_dialogs->showItem(OBJ_KEY, 800, 0); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_SANDBAG)) { + _vm->_dialogs->showItem(OBJ_SANDBAG, 803, 0); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_SMALL_NOTE) || action.isAction(VERB_READ, NOUN_SMALL_NOTE)) { + _vm->_dialogs->showItem(OBJ_SMALL_NOTE, 806, 2); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_ROPE)) { + _vm->_dialogs->showItem(OBJ_ROPE, 807, 0); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_SWORD)) { + _vm->_dialogs->showItem(OBJ_SWORD, 808, 0); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_ENVELOPE) || action.isAction(VERB_READ, NOUN_ENVELOPE)) { + _vm->_dialogs->showItem(OBJ_ENVELOPE, 809, 0); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_TICKET) || action.isAction(VERB_READ, NOUN_TICKET)) { + _vm->_dialogs->showItem(OBJ_TICKET, 810, 0); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_PIECE_OF_PAPER) || action.isAction(VERB_READ, NOUN_PIECE_OF_PAPER)) { + _vm->_dialogs->showItem(OBJ_PIECE_OF_PAPER, 811, 1); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_PARCHMENT) || action.isAction(VERB_READ, NOUN_PARCHMENT)) { + _vm->_dialogs->showItem(OBJ_PARCHMENT, 812, 3); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_LETTER) || action.isAction(VERB_READ, NOUN_LETTER)) { + _vm->_dialogs->showItem(OBJ_LETTER, 813, 4); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_NOTICE) || action.isAction(VERB_READ, NOUN_NOTICE)) { + _vm->_dialogs->showItem(OBJ_NOTICE, 814, 5); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_BOOK) || action.isAction(VERB_READ, NOUN_BOOK)) { + _vm->_dialogs->showItem(OBJ_BOOK, 815, 0); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_CRUMPLED_NOTE) || action.isAction(VERB_READ, NOUN_CRUMPLED_NOTE)) { + _vm->_dialogs->showItem(OBJ_CRUMPLED_NOTE, 816, 6); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_LARGE_NOTE) || action.isAction(VERB_READ, NOUN_LARGE_NOTE)) { + _vm->_dialogs->showItem(OBJ_LARGE_NOTE, 818, 7); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_MUSIC_SCORE) || action.isAction(VERB_READ, NOUN_MUSIC_SCORE)) { + _vm->_dialogs->showItem(OBJ_MUSIC_SCORE, 820, 0); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_WEDDING_RING)) { + _vm->_dialogs->showItem(OBJ_WEDDING_RING, 821, 0); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_CABLE_HOOK)) { + _vm->_dialogs->showItem(OBJ_CABLE_HOOK, 822, 0); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_ROPE_WITH_HOOK)) { + _vm->_dialogs->showItem(OBJ_ROPE_WITH_HOOK, 823, 0); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_OAR)) { + _vm->_dialogs->showItem(OBJ_OAR, 824, 0); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK) && _objects.isInInventory(_objects.getIdFromDesc(action._activeAction._objectNameId))) { + genericObjectExamine(); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_TURN_ON, NOUN_LANTERN)) { + if ((_globals[kLanternStatus] == 1) && !_trigger) + _vm->_dialogs->show(828); + else { + switch (_trigger) { + case 0: + _scene._sequences.addTimer(4, 1); + _globals[kLanternStatus] = 1; + _vm->_dialogs->spinObject(OBJ_LANTERN); + break; + + case 1: + _vm->_dialogs->show(825); + break; + + default: + break; + } + } + action._inProgress = false; + return; + } + + if (action.isAction(VERB_TURN_OFF, NOUN_LANTERN)) { + if ((_globals[kLanternStatus] == 0) && !_trigger) + _vm->_dialogs->show(829); + else if ((_scene._currentSceneId / 100) == 4) + _vm->_dialogs->show(826); + else { + switch (_trigger) { + case 0: + _scene._sequences.addTimer(4, 1); + _globals[kLanternStatus] = 0; + _vm->_dialogs->spinObject(OBJ_LANTERN); + break; + + case 1: + _vm->_dialogs->show(827); + break; + + default: + break; + } + } + action._inProgress = false; + return; + } + + if (action.isAction(VERB_OPEN, NOUN_ENVELOPE)) { + _objects.setRoom(OBJ_ENVELOPE, NOWHERE); + _objects.addToInventory(OBJ_TICKET); + _objects.addToInventory(OBJ_PIECE_OF_PAPER); + _vm->_dialogs->show(833); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_ATTACH, NOUN_CABLE_HOOK, NOUN_ROPE)) { + if (!_objects.isInInventory(OBJ_ROPE)) + _vm->_dialogs->show(11438); + else { + _objects.setRoom(OBJ_CABLE_HOOK, NOWHERE); + _objects.setRoom(OBJ_ROPE, NOWHERE); + _objects.addToInventory(OBJ_ROPE_WITH_HOOK); + _vm->_dialogs->showItem(OBJ_ROPE_WITH_HOOK, 823, 0); + } + action._inProgress = false; + } } void GamePhantom::unhandledAction() { - // TODO + int messageId = 0; + int rndNum = _vm->getRandomNumber(1, 1000); + MADSAction &action = _scene._action; + + if (action.isAction(VERB_PUT, NOUN_CHANDELIER, NOUN_SEATS)) + _vm->_dialogs->show(10123); + else if (action.isAction(VERB_TAKE)) { + if (_objects.isInInventory(_objects.getIdFromDesc(action._activeAction._objectNameId))) + messageId = 25; + else { + if (rndNum <= 333) + messageId = 1; + else if (rndNum <= 666) + messageId = 2; + else + messageId = 3; + } + } else if (action.isAction(VERB_PUSH)) { + if (rndNum < 750) + messageId = 4; + else + messageId = 5; + } else if (action.isAction(VERB_PULL)) { + if (rndNum < 750) + messageId = 6; + else + messageId = 7; + } else if (action.isAction(VERB_OPEN)) { + if (rndNum <= 500) + messageId = 8; + else if (rndNum <= 750) + messageId = 9; + else + messageId = 10; + } else if (action.isAction(VERB_CLOSE)) { + if (rndNum <= 500) + messageId = 11; + else if (rndNum <= 750) + messageId = 12; + else + messageId = 13; + } else if (action.isAction(VERB_PUT)) { + if (_objects.isInInventory(_objects.getIdFromDesc(action._activeAction._objectNameId))) + messageId = 26; + else if (rndNum < 500) + messageId = 14; + else + messageId = 15; + } else if (action.isAction(VERB_TALK_TO)) { + if (rndNum <= 500) + messageId = 16; + else + messageId = 17; + } else if (action.isAction(VERB_GIVE)) { + if (_objects.isInInventory(_objects.getIdFromDesc(action._activeAction._objectNameId))) + messageId = 27; + else + messageId = 18; + } else if (action.isAction(VERB_THROW)) { + if (_objects.isInInventory(_objects.getIdFromDesc(action._activeAction._objectNameId))) + messageId = 19; + else + messageId = 28; + } else if (action.isAction(VERB_LOOK)) { + if (rndNum <= 333) + messageId = 20; + else if (rndNum <= 666) + messageId = 21; + else + messageId = 22; + } else if ((action.isAction(VERB_UNLOCK) || action.isAction(VERB_LOCK)) + && (action.isObject(NOUN_DOOR) || action.isObject(NOUN_LEFT_DOOR) || action.isObject(NOUN_MIDDLE_DOOR) || action.isObject(NOUN_RIGHT_DOOR) || action.isObject(NOUN_TRAP_DOOR))) + messageId = 32; + else if (!action.isAction(VERB_WALK_TO) && !action.isAction(VERB_WALK_ACROSS) && !action.isAction(VERB_WALK_DOWN) && !action.isAction(VERB_WALK_UP)) { + if (rndNum < 500) + messageId = 23; + else + messageId = 24; + } + + if (messageId) + _vm->_dialogs->show(messageId); +} + +void GamePhantom::stopWalker() { + int state = _globals[kWalkerConverseState]; + int command = _globals[kWalkerConverse]; + + _globals[kWalkerConverseNow] = state; + + if ((_player._facing != FACING_NORTHEAST) && (_player._facing != FACING_NORTHWEST)) { + state = 0; + command = 0; + } + + switch (state) { + case 1: + switch (command) { + case 1: + _player.addWalker(3, 0); + break; + + case 2: + case 3: + _player.addWalker(6, 0); + _player.addWalker(5, 0); + _player.addWalker(4, 0); + state = 2; + break; + + case 4: + _player.addWalker(8, 0); + _player.addWalker(4, 0); + state = 4; + break; + + default: + _player.addWalker(-2, 0); + state = 0; + break; + } + break; + + case 2: + case 3: + switch (command) { + case 2: + case 3: + if (state == 2) { + if (_vm->getRandomNumber(1, 30000) < 2000) { + _player.addWalker(10, 0); + _player.addWalker(7, 0); + state = 3; + } else + _player.addWalker(6, 0); + } else { + if (_vm->getRandomNumber(1, 30000) < 1000) { + _player.addWalker(6, 0); + _player.addWalker(7, 0); + state = 2; + } else + _player.addWalker(10, 0); + } + break; + + default: + _player.addWalker(-4, 0); + _player.addWalker(-5, 0); + if (state == 3) { + _player.addWalker(6, 0); + _player.addWalker(7, 0); + } + state = 1; + break; + } + break; + + case 4: + if (command == 4) + _player.addWalker(9, 0); + else { + _player.addWalker(-4, 0); + _player.addWalker(-8, 0); + state = 1; + } + break; + + case 0: + default: + switch (command) { + case 1: + case 2: + case 3: + case 4: + _player.addWalker(2, 0); + state = 1; + break; + + default: + stopWalkerBasic(); + break; + } + break; + } + + _globals[kWalkerConverse] = command; + _globals[kWalkerConverseState] = state; } void GamePhantom::step() { - if (_player._visible && _player._stepEnabled && !_player._moving && - (_player._facing == _player._turnToFacing)) { + if (_player._visible && !_globals[kStopWalkerDisabled] + && (_player._stepEnabled || (_vm->_gameConv->_running >= 0)) + && !_player._moving && (_player._facing == _player._turnToFacing) + && (_scene._frameStartTime >= (uint32)_globals[kWalkerTiming])) { + if (!_player._stopWalkerIndex) + stopWalker(); - // TODO + _globals[kWalkerTiming] += 6; } +} + +void GamePhantom::stopWalkerBasic() { + int rndVal = _vm->getRandomNumber(1, 30000); + + switch (_player._facing) { + case FACING_SOUTH: + if (rndVal < 500) { + int maxSteps = _vm->getRandomNumber(4, 10); + for (int i = 0; i < maxSteps; i++) + _player.addWalker((rndVal < 250) ? 1 : 2, 0); + } else if (rndVal < 750) { + for (int i = 0; i < 4; i++) + _player.addWalker(1, 0); + + _player.addWalker(0, 0); + + for (int i = 0; i < 4; i++) + _player.addWalker(2, 0); + + _player.addWalker(0, 0); + } + break; + + case FACING_SOUTHEAST: + case FACING_SOUTHWEST: + case FACING_NORTHEAST: + case FACING_NORTHWEST: + if (rndVal < 150) { + _player.addWalker(-1, 0); + _player.addWalker(1, 0); + for (int i = 0; i < 6; i++) + _player.addWalker(0, 0); + } + break; + + case FACING_EAST: + case FACING_WEST: + if (rndVal < 250) { + _player.addWalker(-1, 0); + int maxSteps = _vm->getRandomNumber(2, 6); + for (int i = 0; i < maxSteps; i++) + _player.addWalker(2, 0); + _player.addWalker(1, 0); + _player.addWalker(0, 0); + _player.addWalker(0, 0); + } else if (rndVal < 500) + _globals[kWalkerTiming] = (int)_scene._frameStartTime; + break; + + case FACING_NORTH: + if (rndVal < 250) { + _player.addWalker(-1, 0); + int maxSteps = _vm->getRandomNumber(3, 7); + for (int i = 0; i < maxSteps; i++) + _player.addWalker(2, 0); + _player.addWalker(1, 0); + _player.addWalker(0, 0); + } + break; + default: + break; + } } void GamePhantom::synchronize(Common::Serializer &s, bool phase1) { @@ -193,6 +825,116 @@ void GamePhantom::synchronize(Common::Serializer &s, bool phase1) { } } +void GamePhantom::enterCatacombs(bool val) { + 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() { + _globals[kCatacombsRoom] = _globals[kCatacombsNextRoom]; +} + +void GamePhantom::setupCatacombs() { + switch (_difficulty) { + case DIFFICULTY_EASY: + _catacombs = _easyCatacombs; + _catacombSize = 32; + + _globals[kCatacombs309] = 2; + _globals[kCatacombs309From] = 3; + _globals[kCatacombs409a] = 30; + _globals[kCatacombs409aFrom] = 0; + _globals[kCatacombs409b] = 31; + _globals[kCatacombs409bFrom] = 2; + _globals[kCatacombs501] = 31; + _globals[kCatacombs501From] = 0; + break; + + case DIFFICULTY_HARD: + _catacombs = _hardCatacombs; + _catacombSize = 62; + + _globals[kCatacombs309] = 2; + _globals[kCatacombs309From] = 3; + _globals[kCatacombs409a] = 37; + _globals[kCatacombs409aFrom] = 0; + _globals[kCatacombs409b] = 39; + _globals[kCatacombs409bFrom] = 2; + _globals[kCatacombs501] = 56; + _globals[kCatacombs501From] = 1; + break; + } +} + +int GamePhantom::exitCatacombs(int dir) { + int scene = _globals[kCatacombsRoom]; + assert ((scene < _catacombSize) && (dir < 4)); + 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 = true; + _scene._nextSceneId = newSceneNum; + } +} + } // End of namespace Phantom } // End of namespace MADS |