diff options
Diffstat (limited to 'engines/hopkins/hopkins.cpp')
-rw-r--r-- | engines/hopkins/hopkins.cpp | 109 |
1 files changed, 66 insertions, 43 deletions
diff --git a/engines/hopkins/hopkins.cpp b/engines/hopkins/hopkins.cpp index 960a5cf524..b773808c50 100644 --- a/engines/hopkins/hopkins.cpp +++ b/engines/hopkins/hopkins.cpp @@ -35,11 +35,9 @@ namespace Hopkins { -HopkinsEngine *g_vm; - HopkinsEngine::HopkinsEngine(OSystem *syst, const HopkinsGameDescription *gameDesc) : Engine(syst), _gameDescription(gameDesc), _randomSource("Hopkins") { - g_vm = this; + DebugMan.addDebugChannel(kDebugPath, "Path", "Pathfinding debug level"); _animMan = new AnimationManager(this); _computer = new ComputerManager(this); _dialog = new DialogsManager(this); @@ -87,14 +85,15 @@ Common::String HopkinsEngine::generateSaveName(int slot) { * Returns true if it is currently okay to restore a game */ bool HopkinsEngine::canLoadGameStateCurrently() { - return !_globals->_exitId && !_globals->_cityMapEnabledFl && _events->_mouseFl; + return !_globals->_exitId && !_globals->_cityMapEnabledFl && _events->_mouseFl && _globals->_curRoomNum != 0; } /** * Returns true if it is currently okay to save the game */ bool HopkinsEngine::canSaveGameStateCurrently() { - return !_globals->_exitId && !_globals->_cityMapEnabledFl && _events->_mouseFl; + return !_globals->_exitId && !_globals->_cityMapEnabledFl && _events->_mouseFl + && _globals->_curRoomNum != 0 && !isUnderwaterSubScene(); } /** @@ -154,36 +153,31 @@ bool HopkinsEngine::runWin95Demo() { _events->_rateCounter = 0; _globals->_eventMode = EVENTMODE_IGNORE; _globals->_speed = 1; - - for (int i = 1; i < 50; i++) { - _graphicsMan->copySurface(_graphicsMan->_backBuffer, 0, 0, 640, 440, _graphicsMan->_frontBuffer, 0, 0); - _events->refreshScreenAndEvents(); - } - + _events->delay(500); _globals->_eventMode = EVENTMODE_DEFAULT; if (_events->_rateCounter > 475) _globals->_speed = 2; if (_events->_rateCounter > 700) _globals->_speed = 3; - if (_startGameSlot == -1) { - _graphicsMan->fadeOutLong(); - _globals->_eventMode = EVENTMODE_IGNORE; - _globals->_characterSpriteBuf = _fileIO->loadFile("PERSO.SPR"); - } + if (_startGameSlot == -1) + _graphicsMan->fadeOutShort(); + + _globals->_eventMode = EVENTMODE_IGNORE; + _globals->_characterSpriteBuf = _fileIO->loadFile("PERSO.SPR"); _globals->_characterType = CHARACTER_HOPKINS; _objectsMan->_mapCarPosX = _objectsMan->_mapCarPosY = 0; memset(_globals->_saveData, 0, 2000); _globals->_exitId = 0; - if (_startGameSlot != -1) - _saveLoad->loadGame(_startGameSlot); - if (getLanguage() != Common::PL_POL) if (!displayAdultDisclaimer()) return Common::kNoError; + if (_startGameSlot != -1) + _saveLoad->loadGame(_startGameSlot); + for (;;) { if (_globals->_exitId == 300) _globals->_exitId = 0; @@ -204,12 +198,15 @@ bool HopkinsEngine::runWin95Demo() { switch (_globals->_exitId) { case 1: + // Handles room: Apartment _linesMan->setMaxLineIdx(40); _globals->_characterMaxPosY = 435; _objectsMan->sceneControl2("IM01", "IM01", "ANIM01", "IM01", 2, true); break; case 3: + // - Displays bank attack when leaving the apartment + // - Handles room: bottom of the apartment if (!_globals->_saveData->_data[svBankAttackAnimPlayedFl]) { _soundMan->playSound(3); if (getPlatform() == Common::kPlatformOS2 || getPlatform() == Common::kPlatformBeOS) @@ -238,7 +235,7 @@ bool HopkinsEngine::runWin95Demo() { _soundMan->removeSample(2); _soundMan->removeSample(3); _soundMan->removeSample(4); - _graphicsMan->fadeOutLong(); + _graphicsMan->fadeOutShort(); _globals->_saveData->_data[svBankAttackAnimPlayedFl] = 1; } _linesMan->setMaxLineIdx(5); @@ -247,12 +244,14 @@ bool HopkinsEngine::runWin95Demo() { break; case 4: + // Handle room: City map _globals->_disableInventFl = true; _objectsMan->handleCityMap(); _globals->_disableInventFl = false; break; case 5: + // Handle room: Outside the bank _linesMan->setMaxLineIdx(5); _globals->_characterMaxPosY = 455; @@ -400,14 +399,27 @@ bool HopkinsEngine::runWin95Demo() { break; case 151: - _soundMan->playSound(28); - _globals->_eventMode = EVENTMODE_ALT; // CHECKME! - _graphicsMan->clearScreen(); - _graphicsMan->clearPalette(); - _graphicsMan->loadImage("njour3a"); - _graphicsMan->fadeInLong(); - _events->delay(5000); - _graphicsMan->fadeOutLong(); + if (_fileIO->fileExists("JOUR3A.ANM")) { + // The Polish demo uses the animation file than the complete versions + _soundMan->playSound(16); + _globals->_eventMode = EVENTMODE_IGNORE; + + _graphicsMan->clearScreen(); + _graphicsMan->clearPalette(); + _graphicsMan->_fadingFl = true; + _animMan->playAnim("JOUR3A.ANM", "JOUR3A.ANM", 12, 12, 2000); + } else { + // The other demos only display a nag screen + _soundMan->playSound(28); + _globals->_eventMode = EVENTMODE_ALT; // CHECKME! + _graphicsMan->clearScreen(); + _graphicsMan->clearPalette(); + _graphicsMan->loadImage("njour3a"); + _graphicsMan->fadeInLong(); + _events->delay(5000); + _graphicsMan->fadeOutLong(); + } + _globals->_exitId = 300; _globals->_eventMode = EVENTMODE_DEFAULT; break; @@ -783,14 +795,14 @@ bool HopkinsEngine::runFull() { if (_startGameSlot == -1) { if (getPlatform() == Common::kPlatformLinux) { - _graphicsMan->loadImage("H2"); - _graphicsMan->fadeInLong(); - _events->delay(500); - _graphicsMan->fadeOutLong(); - _globals->_speed = 2; - _globals->_eventMode = EVENTMODE_IGNORE; - _graphicsMan->_fadingFl = true; - _animMan->playAnim("MP.ANM", "MP.ANM", 10, 16, 200); + _graphicsMan->loadImage("H2"); + _graphicsMan->fadeInLong(); + _events->delay(500); + _graphicsMan->fadeOutLong(); + _globals->_speed = 2; + _globals->_eventMode = EVENTMODE_IGNORE; + _graphicsMan->_fadingFl = true; + _animMan->playAnim("MP.ANM", "MP.ANM", 10, 16, 200); } else { _animMan->playAnim("MP.ANM", "MP.ANM", 10, 16, 200); _graphicsMan->fadeOutLong(); @@ -804,6 +816,7 @@ bool HopkinsEngine::runFull() { if (shouldQuit()) return false; } + if (getPlatform() != Common::kPlatformLinux && _startGameSlot == -1) { _graphicsMan->fadeOutShort(); _graphicsMan->loadImage("H2"); @@ -819,8 +832,11 @@ bool HopkinsEngine::runFull() { _globals->_exitId = 0; - if (_startGameSlot != -1) + + if (_startGameSlot != -1) { + _soundMan->playSound(28); _saveLoad->loadGame(_startGameSlot); + } for (;;) { if (_globals->_exitId == 300) @@ -1119,12 +1135,14 @@ bool HopkinsEngine::runFull() { break; case 30: + // Shooting _linesMan->setMaxLineIdx(15); _globals->_characterMaxPosY = 440; _objectsMan->sceneControl2("IM30", "IM30", "ANIM30", "IM30", 24, false); break; case 31: + // Shooting target _objectsMan->sceneControl("IM31", "IM31", "ANIM31", "IM31", 10, true); break; @@ -1139,6 +1157,7 @@ bool HopkinsEngine::runFull() { break; case 34: + // In the airport, before the flight cut-scene _objectsMan->sceneControl("IM34", "IM34", "ANIM34", "IM34", 2, false); break; @@ -1169,6 +1188,7 @@ bool HopkinsEngine::runFull() { } case 50: + // Flight cut scene playPlaneCutscene(); _globals->_exitId = 51; break; @@ -1628,8 +1648,8 @@ void HopkinsEngine::playIntro() { _graphicsMan->setColorPercentage(253, 100, 100, 100); _graphicsMan->setColorPercentage(251, 100, 100, 100); _graphicsMan->setColorPercentage(254, 0, 0, 0); - for (int i = 0; i <= 4; i++) - _events->refreshScreenAndEvents(); + + _events->delay(500); _globals->_eventMode = EVENTMODE_IGNORE; _graphicsMan->fadeInLong(); @@ -1890,10 +1910,7 @@ void HopkinsEngine::bombExplosion() { } void HopkinsEngine::restoreSystem() { - // If the game isn't alerady trying to quit, flag that quitting is needed - if (!shouldQuit()) - quitGame(); - + quitGame(); _events->refreshEvents(); } @@ -2218,6 +2235,8 @@ void HopkinsEngine::playPlaneCutscene() { if (!_events->_escKeyFl) { _graphicsMan->_fadingFl = true; _animMan->playAnim("PARA00A.ANM", "PARA00.ANM", 9, 9, 9); + } else { + _graphicsMan->fadeOutShort(); } _events->_escKeyFl = false; @@ -2877,4 +2896,8 @@ bool HopkinsEngine::displayAdultDisclaimer() { } } +bool HopkinsEngine::isUnderwaterSubScene() { + return (_globals->_curRoomNum >= 77) && (_globals->_curRoomNum <= 89); +} + } // End of namespace Hopkins |