aboutsummaryrefslogtreecommitdiff
path: root/engines/hopkins/hopkins.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/hopkins/hopkins.cpp')
-rw-r--r--engines/hopkins/hopkins.cpp2872
1 files changed, 2872 insertions, 0 deletions
diff --git a/engines/hopkins/hopkins.cpp b/engines/hopkins/hopkins.cpp
new file mode 100644
index 0000000000..90bf6d98b0
--- /dev/null
+++ b/engines/hopkins/hopkins.cpp
@@ -0,0 +1,2872 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "common/config-manager.h"
+#include "common/debug-channels.h"
+#include "common/events.h"
+#include "common/file.h"
+#include "hopkins/graphics.h"
+#include "hopkins/hopkins.h"
+#include "hopkins/files.h"
+#include "hopkins/saveload.h"
+#include "hopkins/sound.h"
+#include "hopkins/talk.h"
+
+namespace Hopkins {
+
+HopkinsEngine *g_vm;
+
+HopkinsEngine::HopkinsEngine(OSystem *syst, const HopkinsGameDescription *gameDesc) : Engine(syst),
+ _gameDescription(gameDesc), _randomSource("Hopkins"), _animationManager() {
+ g_vm = this;
+ _debugger.setParent(this);
+ _animationManager.setParent(this);
+ _computerManager.setParent(this);
+ _dialogsManager.setParent(this);
+ _eventsManager.setParent(this);
+ _fileManager.setParent(this);
+ _fontManager.setParent(this);
+ _globals.setParent(this);
+ _graphicsManager.setParent(this);
+ _linesManager.setParent(this);
+ _menuManager.setParent(this);
+ _objectsManager.setParent(this);
+ _saveLoadManager.setParent(this);
+ _scriptManager.setParent(this);
+ _soundManager.setParent(this);
+ _talkManager.setParent(this);
+}
+
+HopkinsEngine::~HopkinsEngine() {
+}
+
+Common::String HopkinsEngine::generateSaveName(int slot) {
+ return Common::String::format("%s.%03d", _targetName.c_str(), slot);
+}
+
+/**
+ * Returns true if it is currently okay to restore a game
+ */
+bool HopkinsEngine::canLoadGameStateCurrently() {
+ return !_globals._exitId && !_globals._cityMapEnabledFl && _eventsManager._mouseFl;
+}
+
+/**
+ * Returns true if it is currently okay to save the game
+ */
+bool HopkinsEngine::canSaveGameStateCurrently() {
+ return !_globals._exitId && !_globals._cityMapEnabledFl && _eventsManager._mouseFl;
+}
+
+/**
+ * Load the savegame at the specified slot index
+ */
+Common::Error HopkinsEngine::loadGameState(int slot) {
+ return _saveLoadManager.loadGame(slot);
+}
+
+/**
+ * Save the game to the given slot index, and with the given name
+ */
+Common::Error HopkinsEngine::saveGameState(int slot, const Common::String &desc) {
+ return _saveLoadManager.saveGame(slot, desc);
+}
+
+Common::Error HopkinsEngine::run() {
+ _saveLoadManager.initSaves();
+
+ _globals.setConfig();
+ _fileManager.initCensorship();
+ initializeSystem();
+
+ if (!getIsDemo())
+ runFull();
+ else if (getPlatform() == Common::kPlatformLinux)
+ runLinuxDemo();
+ else if (getPlatform() == Common::kPlatformWindows)
+ runWin95Demo();
+ else {
+ warning("Unhandled version, switching to Linux demo. Please report this version to ScummVM developers");
+ runLinuxDemo();
+ }
+
+ return Common::kNoError;
+}
+
+bool HopkinsEngine::runWin95Demo() {
+ _globals.loadObjects();
+ _objectsManager.changeObject(14);
+ _objectsManager.addObject(14);
+ _objectsManager._helicopterFl = false;
+
+ _globals.iRegul = 1;
+
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ _graphicsManager.clearPalette();
+
+ _graphicsManager.loadImage("H2");
+ _graphicsManager.fadeInLong();
+
+ if (!_eventsManager._escKeyFl)
+ playIntro();
+
+ _eventsManager._rateCounter = 0;
+ _globals.iRegul = 1;
+ _globals._speed = 1;
+
+ for (int i = 1; i < 50; i++) {
+ _graphicsManager.copySurface(_graphicsManager._vesaScreen, 0, 0, 640, 440, _graphicsManager._vesaBuffer, 0, 0);
+ _eventsManager.VBL();
+ }
+
+ _globals.iRegul = 0;
+ if (_eventsManager._rateCounter > 475)
+ _globals._speed = 2;
+ if (_eventsManager._rateCounter > 700)
+ _globals._speed = 3;
+ _graphicsManager.fadeOutLong();
+ _globals.iRegul = 1;
+ _globals.PERSO = _fileManager.loadFile("PERSO.SPR");
+ _globals.PERSO_TYPE = 0;
+ _objectsManager._mapCarPosX = _objectsManager._mapCarPosY = 0;
+ memset(_globals._saveData, 0, 2000);
+ _globals._exitId = 0;
+
+ if (getLanguage() != Common::PL_POL)
+ if (!displayAdultDisclaimer())
+ return Common::kNoError;
+
+ for (;;) {
+ if (_globals._exitId == 300)
+ _globals._exitId = 0;
+
+ if (!_globals._exitId) {
+ _globals._exitId = _menuManager.menu();
+ if (_globals._exitId == -1) {
+ _globals.PERSO = _globals.freeMemory(_globals.PERSO);
+ restoreSystem();
+ return false;
+ }
+ }
+
+ if (g_system->getEventManager()->shouldQuit())
+ return false;
+
+ switch (_globals._exitId) {
+ case 1:
+ _linesManager.setMaxLineIdx(40);
+ _globals._characterMaxPosY = 435;
+ _objectsManager.PERSONAGE2("IM01", "IM01", "ANIM01", "IM01", 2, true);
+ break;
+
+ case 3:
+ if (!_globals._saveData->_data[svField170]) {
+ _soundManager.WSOUND(3);
+ if (getPlatform() == Common::kPlatformOS2 || getPlatform() == Common::kPlatformBeOS)
+ _graphicsManager.loadImage("fond");
+ else {
+ if (_globals._language == LANG_FR)
+ _graphicsManager.loadImage("fondfr");
+ else if (_globals._language == LANG_EN)
+ _graphicsManager.loadImage("fondan");
+ else if (_globals._language == LANG_SP)
+ _graphicsManager.loadImage("fondes");
+ }
+ _graphicsManager.fadeInLong();
+ _eventsManager.delay(500);
+ _graphicsManager.fadeOutLong();
+ _globals.iRegul = 1;
+ _soundManager._specialSoundNum = 2;
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ _graphicsManager.clearPalette();
+ if (!_globals._censorshipFl)
+ _animationManager.playAnim("BANQUE.ANM", 200, 28, 200);
+ else
+ _animationManager.playAnim("BANKUK.ANM", 200, 28, 200);
+ _soundManager._specialSoundNum = 0;
+ _soundManager.DEL_SAMPLE(1);
+ _soundManager.DEL_SAMPLE(2);
+ _soundManager.DEL_SAMPLE(3);
+ _soundManager.DEL_SAMPLE(4);
+ _graphicsManager.fadeOutLong();
+ _globals._saveData->_data[svField170] = 1;
+ }
+ _linesManager.setMaxLineIdx(5);
+ _globals._characterMaxPosY = 450;
+ _objectsManager.PERSONAGE2("IM03", "IM03", "ANIM03", "IM03", 2, false);
+ break;
+
+ case 4:
+ _globals._disableInventFl = true;
+ _objectsManager.handleCityMap();
+ _globals._disableInventFl = false;
+ break;
+
+ case 5:
+ _linesManager.setMaxLineIdx(5);
+ _globals._characterMaxPosY = 455;
+
+ if (_globals._saveData->_data[svField80]) {
+ if (_globals._saveData->_data[svField80] == 1)
+ _objectsManager.PERSONAGE2("IM05", "IM05A", "ANIM05B", "IM05", 3, false);
+ } else {
+ _objectsManager.PERSONAGE2("IM05", "IM05", "ANIM05", "IM05", 3, false);
+ }
+ break;
+
+ case 6:
+ _linesManager.setMaxLineIdx(20);
+ _globals._characterMaxPosY = 460;
+ _objectsManager.PERSONAGE2("IM06", "IM06", "ANIM06", "IM06", 2, true);
+ break;
+
+ case 7:
+ if (_globals._saveData->_data[svField220])
+ _objectsManager.PERSONAGE("BOMBEB", "BOMBE", "BOMBE", "BOMBE", 2, true);
+ else
+ _objectsManager.PERSONAGE("BOMBEA", "BOMBE", "BOMBE", "BOMBE", 2, true);
+ break;
+
+ case 8:
+ _linesManager.setMaxLineIdx(15);
+ _globals._characterMaxPosY = 450;
+ _objectsManager.PERSONAGE2("IM08", "IM08", "ANIM08", "IM08", 2, true);
+ break;
+
+ case 9:
+ _globals._characterMaxPosY = 440;
+ _linesManager.setMaxLineIdx(20);
+ if (_globals._saveData->_data[svField225])
+ _objectsManager.PERSONAGE2("IM09", "IM09", "ANIM09", "IM09", 10, true);
+ else
+ bombExplosion();
+ break;
+
+ case 10:
+ _objectsManager.PERSONAGE("IM10", "IM10", "ANIM10", "IM10", 9, false);
+ break;
+
+ case 11:
+ _linesManager.setMaxLineIdx(20);
+ _globals._characterMaxPosY = 450;
+ _objectsManager.PERSONAGE2("IM11", "IM11", "ANIM11", "IM11", 2, false);
+ break;
+
+ case 12:
+ _globals._characterMaxPosY = 450;
+ _linesManager.setMaxLineIdx(20);
+ if (_globals._saveData->_data[svField225]) {
+ if (_globals._language == LANG_FR)
+ _graphicsManager.loadImage("ENDFR");
+ else
+ _graphicsManager.loadImage("ENDUK");
+ _graphicsManager.fadeInLong();
+ _eventsManager.mouseOn();
+ do
+ _eventsManager.VBL();
+ while (_eventsManager.getMouseButton() != 1);
+ _graphicsManager.fadeOutLong();
+ restoreSystem();
+ }
+ bombExplosion();
+ break;
+
+ case 13:
+ case 14:
+ case 15:
+ handleNotAvailable(11);
+ break;
+
+ case 16:
+ case 24:
+ case 25:
+ case 26:
+ case 27:
+ case 28:
+ case 29:
+ case 30:
+ case 31:
+ case 33:
+ case 32:
+ case 34:
+ handleNotAvailable(4);
+ break;
+
+ case 17:
+ handleNotAvailable(1);
+ break;
+
+ case 111:
+ _objectsManager.PERSONAGE("IM111", "IM111", "ANIM111", "IM111", 10, false);
+ break;
+
+ case 112:
+ _objectsManager.PERSONAGE("IM112", "IM112", "ANIM112", "IM112", 10, false);
+ break;
+
+ case 113:
+ _globals._exitId = 0;
+ _globals._prevScreenId = _globals._screenId;
+ _globals._saveData->_data[svField6] = _globals._screenId;
+ _globals._screenId = 113;
+ _globals._saveData->_data[svField5] = _globals._screenId;
+ _computerManager.showComputer(COMPUTER_HOPKINS);
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ _graphicsManager.DD_VBL();
+ memset(_graphicsManager._vesaBuffer, 0, 307200);
+ memset(_graphicsManager._vesaScreen, 0, 307200);
+ _graphicsManager.clearPalette();
+ _graphicsManager.RESET_SEGMENT_VESA();
+ break;
+
+ case 114:
+ _globals._prevScreenId = _globals._screenId;
+ _globals._saveData->_data[svField6] = _globals._screenId;
+ _globals._screenId = 114;
+ _globals._saveData->_data[svField5] = _globals._screenId;
+ _globals._exitId = 0;
+ _computerManager.showComputer(COMPUTER_SAMANTHA);
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ break;
+
+ case 115:
+ _globals._exitId = 0;
+ _globals._prevScreenId = _globals._screenId;
+ _globals._saveData->_data[svField6] = _globals._screenId;
+ _globals._screenId = 115;
+ _globals._saveData->_data[svField5] = _globals._screenId;
+ _computerManager.showComputer(COMPUTER_PUBLIC);
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ break;
+
+ case 150:
+ _soundManager.WSOUND(28);
+ _globals.iRegul = 4; // CHECKME!
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ _graphicsManager.clearPalette();
+ _animationManager.playAnim("JOUR1A.anm", 12, 12, 2000);
+ _globals.iRegul = 0;
+ _globals._exitId = 300;
+ break;
+
+ case 151:
+ _soundManager.WSOUND(28);
+ _globals.iRegul = 4; // CHECKME!
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ _graphicsManager.clearPalette();
+ _graphicsManager.loadImage("njour3a");
+ _graphicsManager.fadeInLong();
+ _eventsManager.delay(5000);
+ _graphicsManager.fadeOutLong();
+ _globals._exitId = 300;
+ _globals.iRegul = 0;
+ break;
+
+ case 152:
+ _soundManager.WSOUND(28);
+ _globals.iRegul = 4; // CHECKME!
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ _graphicsManager.clearPalette();
+ _animationManager.playAnim("JOUR4A.anm", 12, 12, 2000);
+ _globals.iRegul = 0;
+ _globals._exitId = 300;
+ break;
+ }
+ }
+ return true;
+}
+
+bool HopkinsEngine::runLinuxDemo() {
+ _globals.loadObjects();
+ _objectsManager.changeObject(14);
+ _objectsManager.addObject(14);
+ _objectsManager._helicopterFl = false;
+
+ _eventsManager.mouseOff();
+
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+
+ _graphicsManager.loadImage("LINUX");
+ _graphicsManager.fadeInLong();
+ _eventsManager.delay(1500);
+ _graphicsManager.fadeOutLong();
+
+ _graphicsManager.loadImage("H2");
+ _graphicsManager.fadeInLong();
+ _eventsManager.delay(500);
+ _graphicsManager.fadeOutLong();
+
+ if (!_eventsManager._escKeyFl)
+ playIntro();
+
+ _globals.iRegul = 0;
+ _globals.PERSO = _fileManager.loadFile("PERSO.SPR");
+ _globals.PERSO_TYPE = 0;
+ _objectsManager._mapCarPosX = _objectsManager._mapCarPosY = 0;
+ memset(_globals._saveData, 0, 2000);
+ _globals._exitId = 0;
+
+ for (;;) {
+ if (_globals._exitId == 300)
+ _globals._exitId = 0;
+
+ if (!_globals._exitId) {
+ _globals._exitId = _menuManager.menu();
+ if (_globals._exitId == -1) {
+ if (!g_system->getEventManager()->shouldQuit())
+ endLinuxDemo();
+ _globals.PERSO = _globals.freeMemory(_globals.PERSO);
+ restoreSystem();
+ }
+ }
+
+ if (g_system->getEventManager()->shouldQuit())
+ return false;
+
+ switch (_globals._exitId) {
+ case 17:
+ case 18:
+ case 19:
+ case 20:
+ case 22:
+ case 23:
+ case 24:
+ case 27:
+ case 28:
+ case 29:
+ case 30:
+ case 31:
+ case 32:
+ case 34:
+ case 38:
+ displayNotAvailable();
+ break;
+
+ case 1:
+ _linesManager.setMaxLineIdx(40);
+ _globals._characterMaxPosY = 435;
+ _objectsManager.PERSONAGE2("IM01", "IM01", "ANIM01", "IM01", 1, true);
+ break;
+
+ case 3:
+ if (!_globals._saveData->_data[svField170]) {
+ _soundManager.WSOUND(3);
+ if (getPlatform() == Common::kPlatformOS2 || getPlatform() == Common::kPlatformBeOS)
+ _graphicsManager.loadImage("fond");
+ else {
+ if (_globals._language == LANG_FR)
+ _graphicsManager.loadImage("fondfr");
+ else if (_globals._language == LANG_EN)
+ _graphicsManager.loadImage("fondan");
+ else if (_globals._language == LANG_SP)
+ _graphicsManager.loadImage("fondes");
+ }
+ _graphicsManager.fadeInLong();
+ _eventsManager.delay(500);
+ _graphicsManager.fadeOutLong();
+ _globals.iRegul = 1;
+ _soundManager._specialSoundNum = 2;
+
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ _graphicsManager.clearPalette();
+ _graphicsManager.FADE_LINUX = 2;
+
+ if (!_globals._censorshipFl)
+ _animationManager.playAnim("BANQUE.ANM", 200, 28, 200);
+ else
+ _animationManager.playAnim("BANKUK.ANM", 200, 28, 200);
+ _soundManager._specialSoundNum = 0;
+ _soundManager.DEL_SAMPLE(1);
+ _soundManager.DEL_SAMPLE(2);
+ _soundManager.DEL_SAMPLE(3);
+ _soundManager.DEL_SAMPLE(4);
+ _globals._saveData->_data[svField170] = 1;
+ }
+
+ _linesManager.setMaxLineIdx(5);
+ _globals._characterMaxPosY = 450;
+ _objectsManager.PERSONAGE2("IM03", "IM03", "ANIM03", "IM03", 2, false);
+ break;
+
+ case 4:
+ _globals._disableInventFl = true;
+ _objectsManager.handleCityMap();
+ _globals._disableInventFl = false;
+ break;
+
+ case 5:
+ _linesManager.setMaxLineIdx(5);
+ _globals._characterMaxPosY = 455;
+ if (_globals._saveData->_data[svField80] == 1)
+ _objectsManager.PERSONAGE2("IM05", "IM05A", "ANIM05B", "IM05", 3, false);
+ else
+ _objectsManager.PERSONAGE2("IM05", "IM05", "ANIM05", "IM05", 3, false);
+ break;
+
+ case 6:
+ _linesManager.setMaxLineIdx(20);
+ _globals._characterMaxPosY = 460;
+ _objectsManager.PERSONAGE2("IM06", "IM06", "ANIM06", "IM06", 2, true);
+ break;
+
+ case 7:
+ if (_globals._saveData->_data[svField220])
+ _objectsManager.PERSONAGE("BOMBEB", "BOMBE", "BOMBE", "BOMBE", 2, true);
+ else
+ _objectsManager.PERSONAGE("BOMBEA", "BOMBE", "BOMBE", "BOMBE", 2, true);
+ break;
+
+ case 8:
+ _linesManager.setMaxLineIdx(15);
+ _globals._characterMaxPosY = 450;
+ _objectsManager.PERSONAGE2("IM08", "IM08", "ANIM08", "IM08", 2, true);
+ break;
+
+ case 9:
+ _linesManager.setMaxLineIdx(20);
+ _globals._characterMaxPosY = 440;
+
+ if (!_globals._saveData->_data[svField225])
+ bombExplosion();
+
+ _objectsManager.PERSONAGE2("IM09", "IM09", "ANIM09", "IM09", 10, true);
+ break;
+
+ case 10:
+ _objectsManager.PERSONAGE("IM10", "IM10", "ANIM10", "IM10", 9, false);
+ break;
+
+ case 11:
+ _linesManager.setMaxLineIdx(20);
+ _globals._characterMaxPosY = 450;
+ _objectsManager.PERSONAGE2("IM11", "IM11", "ANIM11", "IM11", 2, false);
+ break;
+
+ case 12:
+ _linesManager.setMaxLineIdx(20);
+ _globals._characterMaxPosY = 450;
+ if (_globals._saveData->_data[svField225])
+ _objectsManager.PERSONAGE2("IM12", "IM12", "ANIM12", "IM12", 1, false);
+ else
+ bombExplosion();
+ break;
+
+ case 13:
+ _linesManager.setMaxLineIdx(40);
+ _globals._characterMaxPosY = 440;
+ _objectsManager.PERSONAGE2("IM13", "IM13", "ANIM13", "IM13", 1, true);
+ break;
+
+ case 14:
+ _linesManager.setMaxLineIdx(40);
+ _globals._characterMaxPosY = 440;
+ _objectsManager.PERSONAGE2("IM14", "IM14", "ANIM14", "IM14", 1, true);
+ break;
+
+ case 15:
+ _objectsManager.PERSONAGE("IM15", "IM15", "ANIM15", "IM15", 29, false);
+ break;
+
+ case 16:
+ _linesManager.setMaxLineIdx(5);
+ _globals._characterMaxPosY = 450;
+
+ if (_globals._saveData->_data[svField113] == 1) {
+ _objectsManager.PERSONAGE2("IM16", "IM16A", "ANIM16", "IM16", 7, true);
+ } else if (!_globals._saveData->_data[svField113]) {
+ _objectsManager.PERSONAGE2("IM16", "IM16", "ANIM16", "IM16", 7, true);
+ }
+ break;
+
+ case 25:
+ _linesManager.setMaxLineIdx(20);
+ _globals._characterMaxPosY = 445;
+ _objectsManager.PERSONAGE2("IM25", "IM25", "ANIM25", "IM25", 30, true);
+ break;
+
+ case 26:
+ _linesManager.setMaxLineIdx(40);
+ _globals._characterMaxPosY = 435;
+ _objectsManager.PERSONAGE2("IM26", "IM26", "ANIM26", "IM26", 30, true);
+
+ case 33:
+ _objectsManager.PERSONAGE("IM33", "IM33", "ANIM33", "IM33", 8, false);
+ break;
+
+ case 35:
+ displayEndDemo();
+ break;
+
+ case 111:
+ _objectsManager.PERSONAGE("IM111", "IM111", "ANIM111", "IM111", 10, false);
+ break;
+
+ case 112:
+ _objectsManager.PERSONAGE("IM112", "IM112", "ANIM112", "IM112", 10, false);
+ break;
+
+ case 113:
+ _globals._exitId = 0;
+ _globals._prevScreenId = _globals._screenId;
+ _globals._saveData->_data[svField6] = _globals._screenId;
+ _globals._screenId = 113;
+ _globals._saveData->_data[svField5] = 113;
+ _computerManager.showComputer(COMPUTER_HOPKINS);
+
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ _graphicsManager.DD_VBL();
+ memset(_graphicsManager._vesaBuffer, 0, 307200);
+ memset(_graphicsManager._vesaScreen, 0, 307200);
+ _graphicsManager.clearPalette();
+ _graphicsManager.RESET_SEGMENT_VESA();
+ break;
+
+ case 114:
+ _globals._exitId = 0;
+ _globals._prevScreenId = _globals._screenId;
+ _globals._saveData->_data[svField6] = _globals._screenId;
+ _globals._screenId = 114;
+ _globals._saveData->_data[svField5] = 114;
+ _computerManager.showComputer(COMPUTER_SAMANTHA);
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ break;
+
+ case 115:
+ _globals._exitId = 0;
+ _globals._prevScreenId = _globals._screenId;
+ _globals._saveData->_data[svField6] = _globals._screenId;
+ _globals._screenId = 115;
+ _globals._saveData->_data[svField5] = 115;
+ _computerManager.showComputer(COMPUTER_PUBLIC);
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ break;
+
+ case 150:
+ _soundManager.WSOUND(16);
+ _globals.iRegul = 1;
+
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ _graphicsManager.clearPalette();
+ _graphicsManager.FADE_LINUX = 2;
+ _animationManager.playAnim("JOUR1A.anm", 12, 12, 2000);
+ _globals.iRegul = 0;
+ _globals._exitId = 300;
+ break;
+
+ case 151:
+ _soundManager.WSOUND(16);
+ _globals.iRegul = 1;
+
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ _graphicsManager.clearPalette();
+ _graphicsManager.FADE_LINUX = 2;
+ _animationManager.playAnim("JOUR3A.anm", 12, 12, 2000);
+ _globals.iRegul = 0;
+ _globals._exitId = 300;
+ break;
+
+ case 152:
+ _soundManager.WSOUND(16);
+ _globals.iRegul = 1;
+
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ _graphicsManager.clearPalette();
+ _graphicsManager.FADE_LINUX = 2;
+ _animationManager.playAnim("JOUR4A.anm", 12, 12, 2000);
+ _globals.iRegul = 0;
+ _globals._exitId = 300;
+ break;
+ }
+ }
+ return true;
+}
+
+bool HopkinsEngine::runFull() {
+ if (getPlatform() == Common::kPlatformLinux)
+ _soundManager.WSOUND(16);
+
+ _globals.loadObjects();
+ _objectsManager.changeObject(14);
+ _objectsManager.addObject(14);
+
+ if (getPlatform() == Common::kPlatformLinux) {
+ _objectsManager._helicopterFl = false;
+ _eventsManager.mouseOff();
+ // No code has been added to display the version as it's wrong
+ // in my copy: it mentions a Win95 version v4 using DirectDraw (Strangerke)
+ } else if (getPlatform() == Common::kPlatformWindows) {
+ _objectsManager._helicopterFl = false;
+ _globals.iRegul = 1;
+ // This code displays the game version.
+ // It wasn't present in the original and could be put in the debugger
+ // It has been added there for debug purposes
+ _graphicsManager.loadImage("VERSW");
+ _graphicsManager.fadeInLong();
+ _eventsManager.delay(500);
+ _graphicsManager.fadeOutLong();
+ } else {
+ // This piece of code, though named "display_version" in the original,
+ // displays a "loading please wait" screen.
+ _graphicsManager.loadImage("VERSW");
+ _graphicsManager.fadeInLong();
+ _eventsManager.delay(500);
+ _graphicsManager.fadeOutLong();
+ _globals.iRegul = 1;
+ }
+
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ _graphicsManager.clearPalette();
+
+ if (getPlatform() == Common::kPlatformLinux) {
+ _graphicsManager.loadImage("H2");
+ _graphicsManager.fadeInLong();
+ _eventsManager.delay(500);
+ _graphicsManager.fadeOutLong();
+
+ _globals._speed = 2;
+ _globals.iRegul = 1;
+ _graphicsManager.FADE_LINUX = 2;
+ _animationManager.playAnim("MP.ANM", 10, 16, 200);
+ } else {
+ _animationManager.playAnim("MP.ANM", 10, 16, 200);
+ _graphicsManager.fadeOutLong();
+ }
+
+ if (!_eventsManager._escKeyFl)
+ playIntro();
+ if (getPlatform() != Common::kPlatformLinux) {
+ _graphicsManager.fadeOutShort();
+ _graphicsManager.loadImage("H2");
+ _graphicsManager.fadeInLong();
+ _eventsManager.delay(500);
+ _graphicsManager.fadeOutLong();
+ }
+ _globals.iRegul = 0;
+ _globals.PERSO = _fileManager.loadFile("PERSO.SPR");
+ _globals.PERSO_TYPE = 0;
+ _objectsManager._mapCarPosX = _objectsManager._mapCarPosY = 0;
+ memset(_globals._saveData, 0, 2000);
+
+ _globals._exitId = 0;
+
+ for (;;) {
+ if (_globals._exitId == 300)
+ _globals._exitId = 0;
+ if (!_globals._exitId) {
+ _globals._exitId = _menuManager.menu();
+ if (_globals._exitId == -1) {
+ _globals.PERSO = _globals.freeMemory(_globals.PERSO);
+ restoreSystem();
+ return false;
+ }
+ }
+
+ if (g_system->getEventManager()->shouldQuit())
+ return false;
+
+ switch (_globals._exitId) {
+ case 1:
+ _linesManager.setMaxLineIdx(40);
+ _globals._characterMaxPosY = 435;
+ _objectsManager.PERSONAGE2("IM01", "IM01", "ANIM01", "IM01", 1, true);
+ break;
+
+ case 3:
+ if (!_globals._saveData->_data[svField170]) {
+ _soundManager.WSOUND(3);
+ if (getPlatform() == Common::kPlatformOS2 || getPlatform() == Common::kPlatformBeOS)
+ _graphicsManager.loadImage("fond");
+ else {
+ if (_globals._language == LANG_FR)
+ _graphicsManager.loadImage("fondfr");
+ else if (_globals._language == LANG_EN)
+ _graphicsManager.loadImage("fondan");
+ else if (_globals._language == LANG_SP)
+ _graphicsManager.loadImage("fondes");
+ }
+ _graphicsManager.fadeInLong();
+ _eventsManager.delay(500);
+ _graphicsManager.fadeOutLong();
+ _globals.iRegul = 1;
+ _soundManager._specialSoundNum = 2;
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ _graphicsManager.clearPalette();
+ if (getPlatform() == Common::kPlatformLinux || getPlatform() == Common::kPlatformWindows) {
+ if (getPlatform() == Common::kPlatformLinux)
+ _graphicsManager.FADE_LINUX = 2;
+
+ if (!_globals._censorshipFl)
+ _animationManager.playAnim("BANQUE.ANM", 200, 28, 200);
+ else
+ _animationManager.playAnim("BANKUK.ANM", 200, 28, 200);
+ } else {
+ _animationManager.playAnim("BANQUE.ANM", 200, 28, 200);
+ }
+ _soundManager._specialSoundNum = 0;
+ _soundManager.DEL_SAMPLE(1);
+ _soundManager.DEL_SAMPLE(2);
+ _soundManager.DEL_SAMPLE(3);
+ _soundManager.DEL_SAMPLE(4);
+ if (getPlatform() != Common::kPlatformLinux)
+ _graphicsManager.fadeOutLong();
+ _globals._saveData->_data[svField170] = 1;
+ }
+ _linesManager.setMaxLineIdx(5);
+ _globals._characterMaxPosY = 450;
+ _objectsManager.PERSONAGE2("IM03", "IM03", "ANIM03", "IM03", 2, false);
+ break;
+
+ case 4:
+ _globals._disableInventFl = true;
+ _objectsManager.handleCityMap();
+ _globals._disableInventFl = false;
+ break;
+
+ case 5:
+ _linesManager.setMaxLineIdx(5);
+ _globals._characterMaxPosY = 455;
+ if (_globals._saveData->_data[svField80] == 1)
+ _objectsManager.PERSONAGE2("IM05", "IM05A", "ANIM05B", "IM05", 3, false);
+ else
+ _objectsManager.PERSONAGE2("IM05", "IM05", "ANIM05", "IM05", 3, false);
+ break;
+
+ case 6:
+ _linesManager.setMaxLineIdx(20);
+ _globals._characterMaxPosY = 460;
+ _objectsManager.PERSONAGE2("IM06", "IM06", "ANIM06", "IM06", 2, true);
+ break;
+
+ case 7:
+ if (_globals._saveData->_data[svField220])
+ _objectsManager.PERSONAGE("BOMBEB", "BOMBE", "BOMBE", "BOMBE", 2, true);
+ else
+ _objectsManager.PERSONAGE("BOMBEA", "BOMBE", "BOMBE", "BOMBE", 2, true);
+ break;
+
+ case 8:
+ _linesManager.setMaxLineIdx(15);
+ _globals._characterMaxPosY = 450;
+ _objectsManager.PERSONAGE2("IM08", "IM08", "ANIM08", "IM08", 2, true);
+ break;
+
+ case 9:
+ _linesManager.setMaxLineIdx(20);
+ _globals._characterMaxPosY = 440;
+ if (_globals._saveData->_data[svField225])
+ _objectsManager.PERSONAGE2("IM09", "IM09", "ANIM09", "IM09", 10, true);
+ else
+ bombExplosion();
+ break;
+
+ case 10:
+ _objectsManager.PERSONAGE("IM10", "IM10", "ANIM10", "IM10", 9, false);
+ break;
+
+ case 11:
+ _linesManager.setMaxLineIdx(20);
+ _globals._characterMaxPosY = 450;
+ _objectsManager.PERSONAGE2("IM11", "IM11", "ANIM11", "IM11", 2, false);
+ break;
+
+ case 12:
+ _linesManager.setMaxLineIdx(20);
+ _globals._characterMaxPosY = 450;
+ if (_globals._saveData->_data[svField225])
+ _objectsManager.PERSONAGE2("IM12", "IM12", "ANIM12", "IM12", 1, false);
+ else
+ bombExplosion();
+ break;
+
+ case 13:
+ _linesManager.setMaxLineIdx(40);
+ _globals._characterMaxPosY = 440;
+ _objectsManager.PERSONAGE2("IM13", "IM13", "ANIM13", "IM13", 1, true);
+ break;
+
+ case 14:
+ _linesManager.setMaxLineIdx(40);
+ _globals._characterMaxPosY = 440;
+ _objectsManager.PERSONAGE2("IM14", "IM14", "ANIM14", "IM14", 1, true);
+ break;
+
+ case 15:
+ if (getPlatform() == Common::kPlatformLinux || getPlatform() == Common::kPlatformWindows)
+ _objectsManager.PERSONAGE("IM15", "IM15", "ANIM15", "IM15", 29, false);
+ else
+ _objectsManager.PERSONAGE("IM15", "IM15", "ANIM15", "IM15", 18, false);
+ break;
+
+ case 16:
+ _linesManager.setMaxLineIdx(5);
+ _globals._characterMaxPosY = 450;
+ if (_globals._saveData->_data[svField113] == 1)
+ _objectsManager.PERSONAGE2("IM16", "IM16A", "ANIM16", "IM16", 7, true);
+ else
+ _objectsManager.PERSONAGE2("IM16", "IM16", "ANIM16", "IM16", 7, true);
+ break;
+
+ case 17:
+ _linesManager.setMaxLineIdx(40);
+ _globals._characterMaxPosY = 440;
+ if (_globals._saveData->_data[svField117] == 1)
+ _objectsManager.PERSONAGE2("IM17", "IM17A", "ANIM17", "IM17", 11, true);
+ else if (!_globals._saveData->_data[svField117])
+ _objectsManager.PERSONAGE2("IM17", "IM17", "ANIM17", "IM17", 11, true);
+ if (_globals._exitId == 18) {
+ _globals.iRegul = 1;
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ _graphicsManager.clearPalette();
+ _soundManager.WSOUND_OFF();
+ if (getPlatform() == Common::kPlatformLinux) {
+ _soundManager.WSOUND(29);
+ _graphicsManager.FADE_LINUX = 2;
+ _animationManager.playAnim("PURG1A.ANM", 12, 18, 50);
+ } else if (getPlatform() == Common::kPlatformWindows) {
+ _soundManager.WSOUND(29);
+ _animationManager.playAnim("PURG1A.ANM", 12, 18, 50);
+ _graphicsManager.fadeOutShort();
+ } else {
+ _soundManager.WSOUND(6);
+ _animationManager.playAnim("PURG1A.ANM", 12, 18, 50);
+ _graphicsManager.fadeOutShort();
+ }
+ _globals.iRegul = 0;
+ }
+ break;
+
+ case 18:
+ _linesManager.setMaxLineIdx(5);
+ _globals._characterMaxPosY = 450;
+ if (getPlatform() == Common::kPlatformLinux || getPlatform() == Common::kPlatformWindows)
+ _objectsManager.PERSONAGE2("IM18", "IM18", "ANIM18", "IM18", 29, false);
+ else
+ _objectsManager.PERSONAGE2("IM18", "IM18", "ANIM18", "IM18", 6, false);
+ break;
+
+ case 19:
+ _linesManager.setMaxLineIdx(40);
+ _globals._characterMaxPosY = 440;
+ if (_globals._saveData->_data[svField123])
+ _objectsManager.PERSONAGE2("IM19", "IM19A", "ANIM19", "IM19", 6, true);
+ else
+ _objectsManager.PERSONAGE2("IM19", "IM19", "ANIM19", "IM19", 6, true);
+ break;
+
+ case 20:
+ _linesManager.setMaxLineIdx(10);
+ _globals._characterMaxPosY = 440;
+ _objectsManager.PERSONAGE2("IM20", "IM20", "ANIM20", "IM20", 6, true);
+ if (_globals._exitId == 17) {
+ _globals.iRegul = 1;
+ _soundManager.WSOUND_OFF();
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ _graphicsManager.clearPalette();
+ _soundManager.WSOUND(6);
+ if (getPlatform() == Common::kPlatformLinux)
+ _graphicsManager.FADE_LINUX = 2;
+ _animationManager.playAnim("PURG2A.ANM", 12, 18, 50);
+ if (getPlatform() != Common::kPlatformLinux)
+ _graphicsManager.fadeOutShort();
+ _globals.iRegul = 0;
+ }
+ break;
+
+ case 22:
+ _linesManager.setMaxLineIdx(20);
+ _globals._characterMaxPosY = 445;
+ _objectsManager.PERSONAGE2("IM22", "IM22", "ANIM22", "IM22", 6, true);
+ break;
+
+ case 23:
+ _linesManager.setMaxLineIdx(20);
+ _globals._characterMaxPosY = 440;
+ _objectsManager.PERSONAGE2("IM23", "IM23", "ANIM23", "IM23", 6, true);
+ break;
+
+ case 24:
+ _linesManager.setMaxLineIdx(5);
+ _globals._characterMaxPosY = 450;
+ if (_globals._saveData->_data[svField181] == 1)
+ _objectsManager.PERSONAGE2("IM24", "IM24A", "ANIM24", "IM24", 1, true);
+ else
+ _objectsManager.PERSONAGE2("IM24", "IM24", "ANIM24", "IM24", 1, true);
+ break;
+
+ case 25:
+ _linesManager.setMaxLineIdx(20);
+ _globals._characterMaxPosY = 445;
+ if (getPlatform() == Common::kPlatformLinux || getPlatform() == Common::kPlatformWindows)
+ _objectsManager.PERSONAGE2("IM25", "IM25", "ANIM25", "IM25", 30, true);
+ else
+ _objectsManager.PERSONAGE2("IM25", "IM25", "ANIM25", "IM25", 8, true);
+ break;
+
+ case 26:
+ _linesManager.setMaxLineIdx(40);
+ _globals._characterMaxPosY = 435;
+ if (getPlatform() == Common::kPlatformLinux || getPlatform() == Common::kPlatformWindows)
+ _objectsManager.PERSONAGE2("IM26", "IM26", "ANIM26", "IM26", 30, true);
+ else
+ _objectsManager.PERSONAGE2("IM26", "IM26", "ANIM26", "IM26", 8, true);
+ break;
+
+ case 27:
+ _linesManager.setMaxLineIdx(15);
+ _globals._characterMaxPosY = 440;
+ if (_globals._saveData->_data[svField177] == 1)
+ _objectsManager.PERSONAGE2("IM27", "IM27A", "ANIM27", "IM27", 27, true);
+ else
+ _objectsManager.PERSONAGE2("IM27", "IM27", "ANIM27", "IM27", 27, true);
+ break;
+
+ case 28:
+ _linesManager.setMaxLineIdx(5);
+ _globals._characterMaxPosY = 450;
+ if (_globals._saveData->_data[svField166] != 1 || _globals._saveData->_data[svField167] != 1)
+ _objectsManager.PERSONAGE2("IM28", "IM28", "ANIM28", "IM28", 1, false);
+ else
+ _objectsManager.PERSONAGE2("IM28A", "IM28", "ANIM28", "IM28", 1, false);
+ break;
+
+ case 29:
+ _linesManager.setMaxLineIdx(50);
+ _globals._characterMaxPosY = 445;
+ _objectsManager.PERSONAGE2("IM29", "IM29", "ANIM29", "IM29", 1, true);
+ break;
+
+ case 30:
+ _linesManager.setMaxLineIdx(15);
+ _globals._characterMaxPosY = 440;
+ _objectsManager.PERSONAGE2("IM30", "IM30", "ANIM30", "IM30", 24, false);
+ break;
+
+ case 31:
+ _objectsManager.PERSONAGE("IM31", "IM31", "ANIM31", "IM31", 10, true);
+ break;
+
+ case 32:
+ _linesManager.setMaxLineIdx(20);
+ _globals._characterMaxPosY = 445;
+ _objectsManager.PERSONAGE2("IM32", "IM32", "ANIM32", "IM32", 2, true);
+ break;
+
+ case 33:
+ _objectsManager.PERSONAGE("IM33", "IM33", "ANIM33", "IM33", 8, false);
+ break;
+
+ case 34:
+ _objectsManager.PERSONAGE("IM34", "IM34", "ANIM34", "IM34", 2, false);
+ break;
+
+ case 35:
+ case 36:
+ case 37:
+ case 38:
+ case 39:
+ case 40:
+ case 41: {
+ _linesManager.setMaxLineIdx(40);
+ _globals._characterMaxPosY = 435;
+ _globals._disableInventFl = false;
+ _objectsManager._forestFl = true;
+ Common::String im = Common::String::format("IM%d", _globals._exitId);
+ _soundManager.WSOUND(13);
+ if (_objectsManager._forestSprite == g_PTRNUL) {
+ _objectsManager._forestSprite = _objectsManager.loadSprite("HOPDEG.SPR");
+ _soundManager.loadSample(1, "SOUND41.WAV");
+ }
+ _objectsManager.PERSONAGE2(im, im, "BANDIT", im, 13, false);
+ if (_globals._exitId < 35 || _globals._exitId > 49) {
+ _objectsManager._forestSprite = _globals.freeMemory(_objectsManager._forestSprite);
+ _objectsManager._forestFl = false;
+ _soundManager.DEL_SAMPLE(1);
+ }
+ break;
+ }
+
+ case 50:
+ displayPlane();
+ _globals._exitId = 51;
+ break;
+
+ case 51:
+ _linesManager.setMaxLineIdx(10);
+ _globals._characterMaxPosY = 440;
+ _objectsManager.PERSONAGE2("IM51", "IM51", "ANIM51", "IM51", 14, true);
+ break;
+
+ case 52:
+ _linesManager.setMaxLineIdx(15);
+ _globals._characterMaxPosY = 445;
+ _objectsManager.PERSONAGE2("IM52", "IM52", "ANIM52", "IM52", 14, true);
+ break;
+
+ case 54:
+ _linesManager.setMaxLineIdx(30);
+ _globals._characterMaxPosY = 440;
+ _objectsManager.PERSONAGE2("IM54", "IM54", "ANIM54", "IM54", 14, true);
+ break;
+
+ case 55:
+ _linesManager.setMaxLineIdx(30);
+ _globals._characterMaxPosY = 460;
+ _objectsManager.PERSONAGE2("IM55", "IM55", "ANIM55", "IM55", 14, false);
+ break;
+
+ case 56:
+ _linesManager.setMaxLineIdx(30);
+ _globals._characterMaxPosY = 440;
+ _objectsManager.PERSONAGE2("IM56", "IM56", "ANIM56", "IM56", 14, false);
+ break;
+
+ case 57:
+ _linesManager.setMaxLineIdx(30);
+ _globals._characterMaxPosY = 440;
+ _objectsManager.PERSONAGE2("IM57", "IM57", "ANIM57", "IM57", 14, true);
+ break;
+
+ case 58:
+ _linesManager.setMaxLineIdx(30);
+ _globals._characterMaxPosY = 440;
+ _objectsManager.PERSONAGE2("IM58", "IM58", "ANIM58", "IM58", 14, false);
+ break;
+
+ case 59:
+ _linesManager.setMaxLineIdx(5);
+ _globals._characterMaxPosY = 445;
+ _objectsManager.PERSONAGE2("IM59", "IM59", "ANIM59", "IM59", 21, false);
+ break;
+
+ case 60:
+ _linesManager.setMaxLineIdx(30);
+ _globals._characterMaxPosY = 440;
+ _objectsManager.PERSONAGE2("IM60", "IM60", "ANIM60", "IM60", 21, false);
+ break;
+
+ case 61:
+ if (_globals._saveData->_data[svField311] == 1 && !_globals._saveData->_data[svField312])
+ handleConflagration();
+ _objectsManager.PERSONAGE("IM61", "IM61", "ANIM61", "IM61", 21, false);
+ break;
+
+ case 62:
+ _linesManager.setMaxLineIdx(8);
+ _globals._characterMaxPosY = 435;
+ _objectsManager.PERSONAGE2("IM62", "IM62", NULL, "IM62", 21, false);
+ break;
+
+ case 63:
+ _linesManager.setMaxLineIdx(30);
+ _globals._characterMaxPosY = 435;
+ _objectsManager.PERSONAGE2("IM63", "IM63", "ANIM63", "IM63", 21, false);
+ break;
+
+ case 64:
+ _linesManager.setMaxLineIdx(30);
+ _globals._characterMaxPosY = 435;
+ _objectsManager.PERSONAGE2("IM64", "IM64", "ANIM64", "IM64", 21, true);
+ break;
+
+ case 65:
+ _linesManager.setMaxLineIdx(30);
+ _globals._characterMaxPosY = 435;
+ _objectsManager.PERSONAGE2("IM65", "IM65", "ANIM65", "IM65", 21, false);
+ break;
+
+ case 66:
+ _linesManager.setMaxLineIdx(5);
+ _globals._characterMaxPosY = 445;
+ _objectsManager.PERSONAGE2("IM66", "IM66", "ANIM66", "IM66", 21, false);
+ break;
+
+ case 67:
+ _linesManager.setMaxLineIdx(8);
+ _globals._characterMaxPosY = 435;
+ _objectsManager.PERSONAGE2("IM67", "IM67", NULL, "IM67", 21, false);
+ break;
+
+ case 68:
+ _linesManager.setMaxLineIdx(8);
+ _globals._characterMaxPosY = 435;
+ _objectsManager.PERSONAGE2("IM68", "IM68", "ANIM68", "IM68", 21, true);
+ break;
+
+ case 69:
+ _linesManager.setMaxLineIdx(5);
+ _globals._characterMaxPosY = 445;
+ _objectsManager.PERSONAGE2("IM69", "IM69", "ANIM69", "IM69", 21, false);
+ break;
+
+ case 70:
+ _linesManager.setMaxLineIdx(8);
+ _globals._characterMaxPosY = 435;
+ _objectsManager.PERSONAGE2("IM70", "IM70", NULL, "IM70", 21, false);
+ break;
+
+ case 71:
+ _linesManager.setMaxLineIdx(5);
+ _globals._characterMaxPosY = 445;
+ _objectsManager.PERSONAGE2("IM71", "IM71", "ANIM71", "IM71", 21, false);
+ break;
+
+ case 73:
+ _linesManager.setMaxLineIdx(15);
+ _globals._characterMaxPosY = 445;
+ if (_globals._saveData->_data[svField318] == 1)
+ _objectsManager.PERSONAGE2("IM73", "IM73A", "ANIM73", "IM73", 21, true);
+ else
+ _objectsManager.PERSONAGE2("IM73", "IM73", "ANIM73", "IM73", 21, true);
+ break;
+
+ case 75:
+ BASE();
+ break;
+
+ case 77:
+ OCEAN(77, "OCEAN01", 3, 0, 84, 0, 0, 25);
+ break;
+
+ case 78:
+ OCEAN(78, "OCEAN02", 1, 0, 91, 84, 0, 25);
+ break;
+
+ case 79:
+ OCEAN(79, "OCEAN03", 7, 87, 0, 0, 83, 25);
+ break;
+
+ case 80:
+ OCEAN(80, "OCEAN04", 1, 86, 88, 0, 81, 25);
+ break;
+
+ case 81:
+ OCEAN(81, "OCEAN05", 1, 91, 82, 80, 85, 25);
+ break;
+
+ case 82:
+ OCEAN(82, "OCEAN06", 7, 81, 0, 88, 0, 25);
+ break;
+
+ case 83:
+ OCEAN(83, "OCEAN07", 1, 89, 0, 79, 88, 25);
+ break;
+
+ case 84:
+ OCEAN(84, "OCEAN08", 1, 77, 0, 0, 78, 25);
+ break;
+
+ case 85:
+ OCEAN(85, "OCEAN09", 1, 0, 0, 81, 0, 25);
+ break;
+
+ case 86:
+ OCEAN(86, "OCEAN10", 1, 0, 80, 0, 91, 25);
+ break;
+
+ case 87:
+ OCEAN(87, "OCEAN11", 3, 0, 79, 90, 0, 25);
+ break;
+
+ case 88:
+ OCEAN(88, "OCEAN12", 1, 80, 0, 83, 82, 25);
+ break;
+
+ case 89:
+ OCEAN(89, "OCEAN13", 3, 0, 83, 0, 0, 25);
+ break;
+
+ case 90:
+ BASED();
+ break;
+
+ case 91:
+ OCEAN(91, "OCEAN15", 3, 78, 81, 86, 0, 25);
+ break;
+
+ case 93:
+ _linesManager.setMaxLineIdx(5);
+ _globals._characterMaxPosY = 445;
+ if (_globals._saveData->_data[svField330]) {
+ if (getPlatform() == Common::kPlatformLinux || getPlatform() == Common::kPlatformWindows)
+ _objectsManager.PERSONAGE2("IM93", "IM93C", "ANIM93", "IM93", 29, true);
+ else
+ _objectsManager.PERSONAGE2("IM93", "IM93C", "ANIM93", "IM93", 26, true);
+ } else {
+ if (getPlatform() == Common::kPlatformLinux || getPlatform() == Common::kPlatformWindows)
+ _objectsManager.PERSONAGE2("IM93", "IM93", "ANIM93", "IM93", 29, true);
+ else
+ _objectsManager.PERSONAGE2("IM93", "IM93", "ANIM93", "IM93", 26, true);
+ }
+ break;
+
+ case 94:
+ _linesManager.setMaxLineIdx(5);
+ _globals._characterMaxPosY = 440;
+ _objectsManager.PERSONAGE2("IM94", "IM94", "ANIM94", "IM94", 19, true);
+ break;
+
+ case 95:
+ _linesManager.setMaxLineIdx(5);
+ _globals._characterMaxPosY = 435;
+ _objectsManager.PERSONAGE2("IM95", "IM95", "ANIM95", "IM95", 19, false);
+ break;
+
+ case 96:
+ _linesManager.setMaxLineIdx(5);
+ _globals._characterMaxPosY = 435;
+ _objectsManager.PERSONAGE2("IM96", "IM96", "ANIM96", "IM96", 19, false);
+ break;
+
+ case 97:
+ _linesManager.setMaxLineIdx(5);
+ _globals._characterMaxPosY = 435;
+ _objectsManager.PERSONAGE2("IM97", "IM97", "ANIM97", "IM97", 19, false);
+ if (_globals._exitId == 18) {
+ _globals.iRegul = 1;
+ _soundManager.WSOUND_OFF();
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ _graphicsManager.clearPalette();
+ _soundManager.WSOUND(6);
+ _animationManager.playAnim("PURG1A.ANM", 12, 18, 50);
+ _graphicsManager.fadeOutShort();
+ _globals.iRegul = 0;
+ }
+ break;
+
+ case 98:
+ _linesManager.setMaxLineIdx(5);
+ _globals._characterMaxPosY = 435;
+ _objectsManager.PERSONAGE2("IM98", "IM98", "ANIM98", "IM98", 19, true);
+ break;
+
+ case 99:
+ _linesManager.setMaxLineIdx(5);
+ _globals._characterMaxPosY = 435;
+ _objectsManager.PERSONAGE2("IM99", "IM99", "ANIM99", "IM99", 19, true);
+ break;
+
+ case 100:
+ playEnding();
+ break;
+
+ case 111:
+ _objectsManager.PERSONAGE("IM111", "IM111", "ANIM111", "IM111", 10, false);
+ break;
+
+ case 112:
+ _objectsManager.PERSONAGE("IM112", "IM112", "ANIM112", "IM112", 10, false);
+ break;
+
+ case 113:
+ _globals._prevScreenId = _globals._screenId;
+ _globals._screenId = 113;
+ _globals._saveData->_data[svField6] = _globals._prevScreenId;
+ _globals._saveData->_data[svField5] = _globals._screenId;
+ _globals._exitId = 0;
+ _computerManager.showComputer(COMPUTER_HOPKINS);
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ _graphicsManager.DD_VBL();
+ memset(_graphicsManager._vesaBuffer, 0, 307200);
+ memset(_graphicsManager._vesaScreen, 0, 307200);
+ _graphicsManager.clearPalette();
+ _graphicsManager.RESET_SEGMENT_VESA();
+ break;
+
+ case 114:
+ _globals._exitId = 0;
+ _globals._prevScreenId = _globals._screenId;
+ _globals._screenId = 114;
+ _globals._saveData->_data[svField6] = _globals._prevScreenId;
+ _globals._saveData->_data[svField5] = _globals._screenId;
+ _computerManager.showComputer(COMPUTER_SAMANTHA);
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ break;
+
+ case 115:
+ _globals._prevScreenId = _globals._screenId;
+ _globals._screenId = 115;
+ _globals._saveData->_data[svField6] = _globals._prevScreenId;
+ _globals._saveData->_data[svField5] = _globals._screenId;
+ _globals._exitId = 0;
+ _computerManager.showComputer(COMPUTER_PUBLIC);
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ break;
+
+ case 150:
+ _soundManager.WSOUND(16);
+ _globals.iRegul = 1;
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ _graphicsManager.clearPalette();
+ if (getPlatform() == Common::kPlatformLinux)
+ _graphicsManager.FADE_LINUX = 2;
+ _animationManager.playAnim("JOUR1A.ANM", 12, 12, 2000);
+ _globals.iRegul = 0;
+ _globals._exitId = 300;
+ break;
+
+ case 151:
+ _soundManager.WSOUND(16);
+ _globals.iRegul = 1;
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ _graphicsManager.clearPalette();
+ if (getPlatform() == Common::kPlatformLinux)
+ _graphicsManager.FADE_LINUX = 2;
+ _animationManager.playAnim("JOUR3A.ANM", 12, 12, 2000);
+ _globals.iRegul = 0;
+ _globals._exitId = 300;
+ break;
+
+ case 152:
+ _soundManager.WSOUND(16);
+ _globals.iRegul = 1;
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ _graphicsManager.clearPalette();
+ if (getPlatform() == Common::kPlatformLinux)
+ _graphicsManager.FADE_LINUX = 2;
+ _animationManager.playAnim("JOUR4A.ANM", 12, 12, 2000);
+ _globals.iRegul = 0;
+ _globals._exitId = 300;
+ break;
+
+ case 194:
+ case 195:
+ case 196:
+ case 197:
+ case 198:
+ case 199:
+ _globals.PERSO = _globals.freeMemory(_globals.PERSO);
+ _globals.iRegul = 1;
+ _soundManager.WSOUND_OFF();
+ _soundManager.WSOUND(23);
+ _globals._exitId = handleBaseMap(); // Handles the base map (non-Windows)
+ //_globals._exitId = WBASE(); // Handles the 3D Doom level (Windows)
+ _soundManager.WSOUND_OFF();
+ _globals.PERSO = _fileManager.loadFile("PERSO.SPR");
+ _globals.PERSO_TYPE = 0;
+ _globals.iRegul = 0;
+ _graphicsManager._lineNbr = SCREEN_WIDTH;
+ break;
+ }
+ }
+ _globals.PERSO = _globals.freeMemory(_globals.PERSO);
+ restoreSystem();
+ return true;
+}
+
+bool HopkinsEngine::shouldQuit() const {
+ return g_system->getEventManager()->shouldQuit();
+}
+
+int HopkinsEngine::getRandomNumber(int maxNumber) {
+ return _randomSource.getRandomNumber(maxNumber);
+}
+
+void HopkinsEngine::initializeSystem() {
+ // Set graphics mode
+ _graphicsManager.setGraphicalMode(SCREEN_WIDTH, SCREEN_HEIGHT);
+
+ // Synchronize the sound settings from ScummVM
+ _soundManager.syncSoundSettings();
+
+ const Common::FSNode gameDataDir(ConfMan.get("path"));
+ SearchMan.addSubDirectoryMatching(gameDataDir, "SYSTEM");
+ SearchMan.addSubDirectoryMatching(gameDataDir, "LINK");
+ SearchMan.addSubDirectoryMatching(gameDataDir, "BUFFER");
+ SearchMan.addSubDirectoryMatching(gameDataDir, "ANIM");
+ SearchMan.addSubDirectoryMatching(gameDataDir, "ANM");
+ SearchMan.addSubDirectoryMatching(gameDataDir, "BASE");
+ SearchMan.addSubDirectoryMatching(gameDataDir, "MUSIC");
+ SearchMan.addSubDirectoryMatching(gameDataDir, "SEQ");
+ SearchMan.addSubDirectoryMatching(gameDataDir, "SAVE");
+ SearchMan.addSubDirectoryMatching(gameDataDir, "SOUND");
+ SearchMan.addSubDirectoryMatching(gameDataDir, "SVGA");
+ SearchMan.addSubDirectoryMatching(gameDataDir, "VOICE");
+ SearchMan.addSubDirectoryMatching(gameDataDir, "TSVGA");
+
+ _globals.clearAll();
+
+ _eventsManager.initMouseData();
+ _fontManager.initData();
+
+ _dialogsManager._inventoryIcons = _fileManager.loadFile("ICONE.SPR");
+ _objectsManager._headSprites = _fileManager.loadFile("TETE.SPR");
+
+ switch (_globals._language) {
+ case LANG_EN:
+ _globals.BUF_ZONE = _fileManager.loadFile("ZONEAN.TXT");
+ break;
+ case LANG_FR:
+ _globals.BUF_ZONE = _fileManager.loadFile("ZONE01.TXT");
+ break;
+ case LANG_SP:
+ _globals.BUF_ZONE = _fileManager.loadFile("ZONEES.TXT");
+ break;
+ }
+
+ _eventsManager.setMouseOn();
+ _eventsManager._mouseFl = false;
+
+ _globals.loadCharacterData();
+
+ _eventsManager._mouseOffset.x = 0;
+ _eventsManager._mouseOffset.y = 0;
+}
+
+/**
+ * Play the intro of the game
+ */
+void HopkinsEngine::playIntro() {
+ // Win95 EN demo doesn't include the intro
+ if ((getLanguage() == Common::EN_ANY) && (getPlatform() == Common::kPlatformWindows) && (getIsDemo()))
+ return;
+
+ byte paletteData[PALETTE_EXT_BLOCK_SIZE];
+ byte paletteData2[PALETTE_EXT_BLOCK_SIZE];
+
+ memset(&paletteData, 0, PALETTE_EXT_BLOCK_SIZE);
+ _eventsManager.VBL();
+ _eventsManager._mouseFl = false;
+ _globals.iRegul = 1;
+ _eventsManager.VBL();
+ _soundManager.WSOUND(16);
+ _animationManager._clearAnimationFl = true;
+ _animationManager.playAnim("J1.anm", 12, 12, 50);
+ if (shouldQuit() || _eventsManager._escKeyFl)
+ return;
+
+ _soundManager.mixVoice(1, 3);
+ _animationManager.playAnim("J2.anm", 12, 12, 50);
+
+ if (shouldQuit() || _eventsManager._escKeyFl)
+ return;
+
+ _soundManager.mixVoice(2, 3);
+ _animationManager.playAnim("J3.anm", 12, 12, 50);
+
+ if (shouldQuit() || _eventsManager._escKeyFl)
+ return;
+
+ _soundManager.mixVoice(3, 3);
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ _graphicsManager.clearPalette();
+ _graphicsManager.DD_VBL();
+ _soundManager.WSOUND(11);
+ _graphicsManager.loadImage("intro1");
+ _graphicsManager.scrollScreen(0);
+ _graphicsManager._scrollOffset = 0;
+ _graphicsManager.SETCOLOR3(252, 100, 100, 100);
+ _graphicsManager.SETCOLOR3(253, 100, 100, 100);
+ _graphicsManager.SETCOLOR3(251, 100, 100, 100);
+ _graphicsManager.SETCOLOR3(254, 0, 0, 0);
+ for (int i = 0; i <= 4; i++)
+ _eventsManager.VBL();
+
+ _globals.iRegul = 1;
+ _graphicsManager.fadeInLong();
+ if (_graphicsManager._largeScreenFl) {
+ _graphicsManager._scrollStatus = 2;
+ _graphicsManager._scrollPosX = 0;
+
+ bool loopCond = false;
+ do {
+ _graphicsManager._scrollPosX += 2;
+ if (_graphicsManager._scrollPosX > (SCREEN_WIDTH - 2)) {
+ _graphicsManager._scrollPosX = SCREEN_WIDTH;
+ loopCond = true;
+ }
+
+ if (_eventsManager.getMouseX() < _graphicsManager._scrollPosX + 10)
+ _eventsManager.setMouseXY(_eventsManager._mousePos.x + 4, _eventsManager.getMouseY());
+ _eventsManager.VBL();
+ } while (!shouldQuit() && !loopCond && _graphicsManager._scrollPosX != SCREEN_WIDTH);
+
+ _eventsManager.VBL();
+ _graphicsManager._scrollStatus = 0;
+
+ if (shouldQuit())
+ return;
+ }
+
+ _soundManager.mixVoice(4, 3);
+ _graphicsManager.fadeOutLong();
+ _graphicsManager._scrollStatus = 0;
+ _graphicsManager.loadImage("intro2");
+ _graphicsManager.scrollScreen(0);
+ _animationManager.loadAnim("INTRO2");
+ _graphicsManager.VISU_ALL();
+ _soundManager.WSOUND(23);
+ _objectsManager.stopBobAnimation(3);
+ _objectsManager.stopBobAnimation(5);
+ _graphicsManager._scrollOffset = 0;
+ _graphicsManager.SETCOLOR3(252, 100, 100, 100);
+ _graphicsManager.SETCOLOR3(253, 100, 100, 100);
+ _graphicsManager.SETCOLOR3(251, 100, 100, 100);
+ _graphicsManager.SETCOLOR3(254, 0, 0, 0);
+
+ for (int i = 0; i <= 4; i++)
+ _eventsManager.VBL();
+
+ _globals.iRegul = 1;
+ _graphicsManager.fadeInLong();
+ for (uint i = 0; i < 200 / _globals._speed; ++i)
+ _eventsManager.VBL();
+
+ _objectsManager.setBobAnimation(3);
+ _soundManager.mixVoice(5, 3);
+ _objectsManager.stopBobAnimation(3);
+ _eventsManager.VBL();
+ memcpy(&paletteData2, _graphicsManager._palette, 796);
+
+ _graphicsManager.setPaletteVGA256WithRefresh(paletteData, _graphicsManager._vesaBuffer);
+ _graphicsManager.FIN_VISU();
+
+ if (shouldQuit() || _eventsManager._escKeyFl)
+ return;
+
+ _soundManager._specialSoundNum = 5;
+ _graphicsManager.FADE_LINUX = 2;
+ _animationManager.playAnim("ELEC.ANM", 10, 26, 200);
+ _soundManager._specialSoundNum = 0;
+
+ if (shouldQuit() || _eventsManager._escKeyFl)
+ return;
+
+ _graphicsManager.loadImage("intro2");
+ _graphicsManager.scrollScreen(0);
+ _animationManager.loadAnim("INTRO2");
+ _graphicsManager.VISU_ALL();
+ _soundManager.WSOUND(23);
+ _objectsManager.stopBobAnimation(3);
+ _objectsManager.stopBobAnimation(5);
+ _objectsManager.stopBobAnimation(1);
+ _graphicsManager._scrollOffset = 0;
+ _graphicsManager.SETCOLOR3(252, 100, 100, 100);
+ _graphicsManager.SETCOLOR3(253, 100, 100, 100);
+ _graphicsManager.SETCOLOR3(251, 100, 100, 100);
+ _graphicsManager.SETCOLOR3(254, 0, 0, 0);
+
+ for (int i = 0; i <= 3; i++)
+ _eventsManager.VBL();
+
+ _globals.iRegul = 1;
+ _graphicsManager.setPaletteVGA256WithRefresh(paletteData2, _graphicsManager._vesaBuffer);
+
+ int introIndex = 0;
+ while (!shouldQuit() && !_eventsManager._escKeyFl) {
+ if (introIndex == 12) {
+ _objectsManager.setBobAnimation(3);
+ _eventsManager.VBL();
+ _soundManager.mixVoice(6, 3);
+ _eventsManager.VBL();
+ _objectsManager.stopBobAnimation(3);
+ }
+
+ Common::copy(&paletteData2[0], &paletteData2[PALETTE_BLOCK_SIZE], &_graphicsManager._palette[0]);
+
+ for (int i = 1, v12 = 4 * introIndex; i <= PALETTE_BLOCK_SIZE; i++) {
+ if (_graphicsManager._palette[i] > v12)
+ _graphicsManager._palette[i] -= v12;
+ }
+
+ _graphicsManager.setPaletteVGA256WithRefresh(_graphicsManager._palette, _graphicsManager._vesaBuffer);
+
+ for (int i = 1; i < 2 * introIndex; i++)
+ _eventsManager.VBL();
+
+ _graphicsManager.setPaletteVGA256WithRefresh(paletteData2, _graphicsManager._vesaBuffer);
+
+ for (int i = 1; i < 20 - introIndex; i++)
+ _eventsManager.VBL();
+
+ introIndex += 2;
+ if (introIndex > 15) {
+ _graphicsManager.setPaletteVGA256WithRefresh(paletteData, _graphicsManager._vesaBuffer);
+ for (uint j = 1; j < 100 / _globals._speed; ++j)
+ _eventsManager.VBL();
+
+ _objectsManager.setBobAnimation(3);
+ _soundManager.mixVoice(7, 3);
+ _objectsManager.stopBobAnimation(3);
+
+ for (uint k = 1; k < 60 / _globals._speed; ++k)
+ _eventsManager.VBL();
+ _objectsManager.setBobAnimation(5);
+ for (uint l = 0; l < 20 / _globals._speed; ++l)
+ _eventsManager.VBL();
+
+ Common::copy(&paletteData2[0], &paletteData2[PALETTE_BLOCK_SIZE], &_graphicsManager._palette[0]);
+ _graphicsManager.setPaletteVGA256WithRefresh(_graphicsManager._palette, _graphicsManager._vesaBuffer);
+
+ for (uint m = 0; m < 50 / _globals._speed; ++m) {
+ if (m == 30 / _globals._speed) {
+ _objectsManager.setBobAnimation(3);
+ _soundManager.mixVoice(8, 3);
+ _objectsManager.stopBobAnimation(3);
+ }
+
+ _eventsManager.VBL();
+ }
+
+ _graphicsManager.fadeOutLong();
+ _graphicsManager.FIN_VISU();
+ _animationManager._clearAnimationFl = true;
+ _soundManager.WSOUND(3);
+ _soundManager._specialSoundNum = 1;
+ _animationManager.playAnim("INTRO1.anm", 10, 24, 18);
+ _soundManager._specialSoundNum = 0;
+ if (shouldQuit() || _eventsManager._escKeyFl)
+ return;
+
+ _animationManager.playAnim("INTRO2.anm", 10, 24, 18);
+ if (shouldQuit() || _eventsManager._escKeyFl)
+ return;
+
+ _animationManager.playAnim("INTRO3.anm", 10, 24, 200);
+ if (shouldQuit() || _eventsManager._escKeyFl)
+ return;
+
+ _animationManager._clearAnimationFl = false;
+ _graphicsManager.FADE_LINUX = 2;
+ _animationManager.playAnim("J4.anm", 12, 12, 1000);
+ break;
+ }
+ }
+
+ _eventsManager._escKeyFl = false;
+}
+
+/**
+ * If in demo, displays a 'not available' screen and returns to the city map
+ */
+void HopkinsEngine::displayNotAvailable() {
+ if (!getIsDemo())
+ return;
+
+ if (_globals._language == LANG_FR)
+ _graphicsManager.loadImage("ndfr");
+ else
+ _graphicsManager.loadImage("nduk");
+
+ _graphicsManager.fadeInLong();
+ if (_soundManager._voiceOffFl)
+ _eventsManager.delay(500);
+ else
+ _soundManager.mixVoice(628, 4);
+
+ _graphicsManager.fadeOutLong();
+ _globals._exitId = 4;
+}
+
+void HopkinsEngine::handleNotAvailable(int sortie) {
+ // Use the code of the linux demo instead of the code of the Windows demo.
+ // The behavior is somewhat better, and common code is easier to maintain.
+ displayNotAvailable();
+ _globals._exitId = sortie;
+}
+
+void HopkinsEngine::displayEndDemo() {
+ _soundManager.WSOUND(28);
+ if (_globals._language == LANG_FR)
+ _graphicsManager.loadImage("endfr");
+ else
+ _graphicsManager.loadImage("enduk");
+
+ _graphicsManager.fadeInLong();
+ _eventsManager.delay(1500);
+ _graphicsManager.fadeOutLong();
+ _globals._exitId = 0;
+}
+
+void HopkinsEngine::bombExplosion() {
+ _graphicsManager._lineNbr = SCREEN_WIDTH;
+ _graphicsManager.SCANLINE(SCREEN_WIDTH);
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ _graphicsManager.clearPalette();
+
+ _globals.iRegul = 1;
+ _soundManager._specialSoundNum = 199;
+ _graphicsManager.FADE_LINUX = 2;
+ _animationManager.playAnim("BOMBE2A.ANM", 50, 14, 500);
+ _soundManager._specialSoundNum = 0;
+ _graphicsManager.loadImage("IM15");
+ _animationManager.loadAnim("ANIM15");
+ _graphicsManager.VISU_ALL();
+ _objectsManager.stopBobAnimation(7);
+
+ for (int idx = 0; idx < 5; ++idx) {
+ _eventsManager.VBL();
+ }
+
+ _graphicsManager.fadeInLong();
+ _eventsManager.mouseOff();
+
+ for (int idx = 0; idx < 20; ++idx) {
+ _eventsManager.VBL();
+ }
+
+ _globals._introSpeechOffFl = true;
+ _talkManager.PARLER_PERSO2("vire.pe2");
+ _globals._introSpeechOffFl = false;
+ _objectsManager.setBobAnimation(7);
+
+ for (int idx = 0; idx < 100; ++idx) {
+ _eventsManager.VBL();
+ }
+
+ _graphicsManager.fadeOutLong();
+ _graphicsManager.FIN_VISU();
+ _globals.iRegul = 0;
+ _globals._exitId = 151;
+}
+
+void HopkinsEngine::restoreSystem() {
+ quitGame();
+ _eventsManager.refreshEvents();
+}
+
+void HopkinsEngine::endLinuxDemo() {
+ _globals._linuxEndDemoFl = true;
+ _graphicsManager.RESET_SEGMENT_VESA();
+ _objectsManager._forestFl = false;
+ _eventsManager._breakoutFl = false;
+ _globals._disableInventFl = true;
+ _graphicsManager.loadImage("BOX");
+ _soundManager.WSOUND(28);
+ _graphicsManager.fadeInLong();
+ _eventsManager.mouseOn();
+ _eventsManager.changeMouseCursor(0);
+ _eventsManager._mouseCursorId = 0;
+ _eventsManager._mouseSpriteId = 0;
+
+ bool mouseClicked = false;
+
+ do {
+ _eventsManager.VBL();
+
+ if (_eventsManager.getMouseButton() == 1)
+ mouseClicked = true;
+ } while (!mouseClicked && !g_system->getEventManager()->shouldQuit());
+
+ // Original tried to open a web browser link here. Since ScummVM doesn't support
+ // that, it's being skipped in favor of simply exiting
+
+ _graphicsManager.fadeOutLong();
+}
+
+void HopkinsEngine::handleConflagration() {
+ _globals._disableInventFl = true;
+ _globals.iRegul = 1;
+ _graphicsManager.loadImage("IM71");
+ _animationManager.loadAnim("ANIM71");
+ _graphicsManager.SETCOLOR3(252, 100, 100, 100);
+ _graphicsManager.SETCOLOR3(253, 100, 100, 100);
+ _graphicsManager.SETCOLOR3(251, 100, 100, 100);
+ _graphicsManager.SETCOLOR3(254, 0, 0, 0);
+ _graphicsManager.VISU_ALL();
+
+ for (int cpt = 0; cpt <= 4; cpt++)
+ _eventsManager.VBL();
+
+ _graphicsManager.fadeInLong();
+ _globals.iRegul = 1;
+
+ for (int cpt = 0; cpt <= 249; cpt++)
+ _eventsManager.VBL();
+
+ _globals._introSpeechOffFl = true;
+ _talkManager.PARLER_PERSO("SVGARD1.pe2");
+ _globals._introSpeechOffFl = false;
+
+ for (int cpt = 0; cpt <= 49; cpt++)
+ _eventsManager.VBL();
+
+ _graphicsManager.fadeOutLong();
+ _graphicsManager.FIN_VISU();
+ _globals._saveData->_data[svField312] = 1;
+ _globals._disableInventFl = false;
+}
+
+void HopkinsEngine::BASE() {
+ _globals.iRegul = 1;
+ _graphicsManager._lineNbr = SCREEN_WIDTH;
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ _graphicsManager.clearPalette();
+ _animationManager._clearAnimationFl = true;
+ _soundManager.WSOUND(25);
+ _animationManager.playAnim("base00a.anm", 10, 18, 18);
+ if (!_eventsManager._escKeyFl)
+ _animationManager.playAnim("base05a.anm", 10, 18, 18);
+ if (!_eventsManager._escKeyFl)
+ _animationManager.playAnim("base10a.anm", 10, 18, 18);
+ if (!_eventsManager._escKeyFl)
+ _animationManager.playAnim("base20a.anm", 10, 18, 18);
+ // CHECKME: The original code was doing the opposite test, which was a bug.
+ if (!_eventsManager._escKeyFl)
+ _animationManager.playAnim("base30a.anm", 10, 18, 18);
+ if (!_eventsManager._escKeyFl)
+ _animationManager.playAnim("base40a.anm", 10, 18, 18);
+ if (!_eventsManager._escKeyFl)
+ _animationManager.playAnim("base50a.anm", 10, 18, 18);
+ if (!_eventsManager._escKeyFl)
+ _animationManager.playAnim("OC00a.anm", 10, 18, 18);
+ if (!_eventsManager._escKeyFl)
+ _animationManager.playAnim("OC05a.anm", 10, 18, 18);
+ if (!_eventsManager._escKeyFl)
+ _animationManager.playAnim("OC10a.anm", 10, 18, 18);
+ if (!_eventsManager._escKeyFl)
+ _animationManager.playAnim("OC20a.anm", 10, 18, 18);
+ if (!_eventsManager._escKeyFl) {
+ _graphicsManager.FADE_LINUX = 2;
+ _animationManager.playAnim("OC30a.anm", 10, 18, 18);
+ }
+
+ _eventsManager._escKeyFl = false;
+ _animationManager._clearAnimationFl = false;
+ _globals._exitId = 85;
+}
+
+void HopkinsEngine::BASED() {
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ _graphicsManager.clearPalette();
+ _animationManager.NO_SEQ = false;
+ _soundManager.WSOUND(26);
+ _globals.iRegul = 1;
+ _globals._disableInventFl = true;
+ _animationManager.NO_COUL = true;
+ _graphicsManager.FADE_LINUX = 2;
+ _animationManager.playSequence("abase.seq", 50, 15, 50);
+ _animationManager.NO_COUL = false;
+ _graphicsManager.loadImage("IM92");
+ _animationManager.loadAnim("ANIM92");
+ _graphicsManager.VISU_ALL();
+ _objectsManager.INILINK("IM92");
+
+ for (int cpt = 0; cpt <= 4; cpt++)
+ _eventsManager.VBL();
+
+ _graphicsManager.fadeInLong();
+ _globals.CACHE_ON();
+
+ do
+ _eventsManager.VBL();
+ while (_objectsManager.getBobAnimDataIdx(8) != 22);
+
+ _graphicsManager.fadeOutLong();
+ _graphicsManager.FIN_VISU();
+ _globals.resetCache();
+ _globals._disableInventFl = false;
+ _globals._exitId = 93;
+ _globals.iRegul = 0;
+}
+
+void HopkinsEngine::playEnding() {
+ _globals.PERSO = _globals.freeMemory(_globals.PERSO);
+ _dialogsManager._removeInventFl = true;
+ _globals._disableInventFl = true;
+ _graphicsManager._scrollOffset = 0;
+ _globals._cityMapEnabledFl = false;
+ _globals.iRegul = 1;
+ _soundManager.WSOUND(26);
+ _linesManager._route = (int16 *)g_PTRNUL;
+ _globals.NOMARCHE = true;
+ _globals._exitId = 0;
+ _soundManager.loadSample(1, "SOUND90.WAV");
+ _graphicsManager.loadImage("IM100");
+ _animationManager.loadAnim("ANIM100");
+ _graphicsManager.VISU_ALL();
+ _eventsManager.mouseOn();
+ _objectsManager.stopBobAnimation(7);
+ _objectsManager.stopBobAnimation(8);
+ _objectsManager.stopBobAnimation(9);
+ _graphicsManager.SETCOLOR3(252, 100, 100, 100);
+ _graphicsManager.SETCOLOR3(253, 100, 100, 100);
+ _graphicsManager.SETCOLOR3(251, 100, 100, 100);
+ _graphicsManager.SETCOLOR3(254, 0, 0, 0);
+ _eventsManager.changeMouseCursor(0);
+
+ for (int cpt = 0; cpt <= 4; cpt++)
+ _eventsManager.VBL();
+
+ _graphicsManager.fadeInLong();
+ _globals.iRegul = 1;
+
+ do
+ _eventsManager.VBL();
+ while (_objectsManager.getBobAnimDataIdx(6) != 54);
+
+ _globals._introSpeechOffFl = true;
+ _talkManager.PARLER_PERSO("GM4.PE2");
+ _globals._disableInventFl = true;
+ _objectsManager.stopBobAnimation(6);
+ _objectsManager.stopBobAnimation(10);
+ _objectsManager.setBobAnimation(9);
+ _objectsManager.setBobAnimation(7);
+
+ do
+ _eventsManager.VBL();
+ while (_objectsManager.getBobAnimDataIdx(7) != 54);
+
+ _soundManager.PLAY_SAMPLE2(1);
+
+ do
+ _eventsManager.VBL();
+ while (_objectsManager.getBobAnimDataIdx(7) != 65);
+
+ _globals._introSpeechOffFl = true;
+ _talkManager.PARLER_PERSO("DUELB4.PE2");
+ _eventsManager.mouseOff();
+ _globals._disableInventFl = true;
+
+ do
+ _eventsManager.VBL();
+ while (_objectsManager.getBobAnimDataIdx(7) != 72);
+
+ _globals._introSpeechOffFl = true;
+ _talkManager.PARLER_PERSO("DUELH1.PE2");
+
+ do
+ _eventsManager.VBL();
+ while (_objectsManager.getBobAnimDataIdx(7) != 81);
+
+ _globals._introSpeechOffFl = true;
+ _talkManager.PARLER_PERSO("DUELB5.PE2");
+
+ do
+ _eventsManager.VBL();
+ while (_objectsManager.getBobAnimDataIdx(7) != 120);
+
+ _objectsManager.stopBobAnimation(7);
+ if (_globals._saveData->_data[svField135] == 1) {
+ _soundManager._specialSoundNum = 200;
+ _soundManager._skipRefreshFl = true;
+ _graphicsManager.FADE_LINUX = 2;
+ _animationManager.playAnim("BERM.ANM", 100, 24, 300);
+ _graphicsManager.FIN_VISU();
+ _soundManager.DEL_SAMPLE(1);
+ _graphicsManager.loadImage("PLAN3");
+ _graphicsManager.fadeInLong();
+
+ _eventsManager._rateCounter = 0;
+ if (!_eventsManager._escKeyFl) {
+ do
+ _eventsManager.refreshEvents();
+ while (_eventsManager._rateCounter < 2000 / _globals._speed && !_eventsManager._escKeyFl);
+ }
+ _eventsManager._escKeyFl = false;
+ _graphicsManager.fadeOutLong();
+ _globals.iRegul = 1;
+ _soundManager._specialSoundNum = 0;
+ _graphicsManager.FADE_LINUX = 2;
+ _animationManager.playAnim("JOUR2A.anm", 12, 12, 1000);
+ _soundManager.WSOUND(11);
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ _graphicsManager.clearPalette();
+ _animationManager.playAnim("FF1a.anm", 18, 18, 9);
+ _animationManager.playAnim("FF1a.anm", 9, 18, 9);
+ _animationManager.playAnim("FF1a.anm", 9, 18, 18);
+ _animationManager.playAnim("FF1a.anm", 9, 18, 9);
+ _animationManager.playAnim("FF2a.anm", 24, 24, 100);
+ displayCredits();
+ _globals.iRegul = 0;
+ _globals._exitId = 300;
+ _dialogsManager._removeInventFl = false;
+ _globals._disableInventFl = false;
+ } else {
+ _soundManager._specialSoundNum = 200;
+ _soundManager._skipRefreshFl = true;
+ _animationManager.playAnim2("BERM.ANM", 100, 24, 300);
+ _objectsManager.stopBobAnimation(7);
+ _objectsManager.setBobAnimation(8);
+ _globals._introSpeechOffFl = true;
+ _talkManager.PARLER_PERSO("GM5.PE2");
+ _globals._disableInventFl = true;
+
+ do
+ _eventsManager.VBL();
+ while (_objectsManager.getBobAnimDataIdx(8) != 5);
+
+ _soundManager.PLAY_SOUND2("SOUND41.WAV");
+
+ do
+ _eventsManager.VBL();
+ while (_objectsManager.getBobAnimDataIdx(8) != 21);
+
+ _graphicsManager.fadeOutLong();
+ _graphicsManager.FIN_VISU();
+ _soundManager.DEL_SAMPLE(1);
+ _soundManager.WSOUND(16);
+ _globals.iRegul = 1;
+ _soundManager._specialSoundNum = 0;
+ _dialogsManager._removeInventFl = false;
+ _globals._disableInventFl = false;
+ _animationManager.playAnim("JOUR4A.anm", 12, 12, 1000);
+ _globals.iRegul = 0;
+ _globals._exitId = 300;
+ }
+ _globals.PERSO = _fileManager.loadFile("PERSO.SPR");
+ _globals.PERSO_TYPE = 0;
+ _globals.iRegul = 0;
+}
+
+void HopkinsEngine::displayPlane() {
+ _soundManager.WSOUND(28);
+ _globals.iRegul = 1;
+ _globals.nbrligne = SCREEN_WIDTH;
+ _graphicsManager.lockScreen();
+ _graphicsManager.clearScreen();
+ _graphicsManager.unlockScreen();
+ _graphicsManager.clearPalette();
+
+ _animationManager._clearAnimationFl = false;
+ _animationManager.playAnim("aerop00a.anm", 10, 18, 18);
+ if (!_eventsManager._escKeyFl)
+ _animationManager.playAnim("serop10a.anm", 10, 18, 18);
+ if (!_eventsManager._escKeyFl)
+ _animationManager.playAnim("aerop20a.anm", 10, 18, 18);
+ if (!_eventsManager._escKeyFl)
+ _animationManager.playAnim("aerop30a.anm", 10, 18, 18);
+ if (!_eventsManager._escKeyFl)
+ _animationManager.playAnim("aerop40a.anm", 10, 18, 18);
+ if (!_eventsManager._escKeyFl)
+ _animationManager.playAnim("aerop50a.anm", 10, 18, 18);
+ if (!_eventsManager._escKeyFl)
+ _animationManager.playAnim("aerop60a.anm", 10, 18, 18);
+ if (!_eventsManager._escKeyFl)
+ _animationManager.playAnim("aerop70a.anm", 10, 18, 18);
+ if (!_eventsManager._escKeyFl)
+ _animationManager.playAnim("trans00a.anm", 10, 18, 18);
+ if (!_eventsManager._escKeyFl)
+ _animationManager.playAnim("trans10a.anm", 10, 18, 18);
+ if (!_eventsManager._escKeyFl)
+ _animationManager.playAnim("trans15a.anm", 10, 18, 18);
+ if (!_eventsManager._escKeyFl)
+ _animationManager.playAnim("trans20a.anm", 10, 18, 18);
+ if (!_eventsManager._escKeyFl)
+ _animationManager.playAnim("trans30a.anm", 10, 18, 18);
+ if (!_eventsManager._escKeyFl)
+ _animationManager.playAnim("trans40a.anm", 10, 18, 18);
+ if (!_eventsManager._escKeyFl) {
+ _graphicsManager.FADE_LINUX = 2;
+ _animationManager.playAnim("PARA00a.anm", 9, 9, 9);
+ }
+
+ _eventsManager._escKeyFl = false;
+ _animationManager._clearAnimationFl = false;
+}
+
+void HopkinsEngine::loadBaseMap() {
+ Common::String filename = Common::String::format("%s.PCX", "PBASE");
+ Common::File f;
+
+ if (f.exists(filename)) {
+ // PBASE file exists, so go ahead and load it
+ _graphicsManager.loadImage("PBASE");
+ } else {
+ // PBASE file doesn't exist, so draw a substitute screen
+ drawBaseMap();
+ }
+}
+
+void HopkinsEngine::drawBaseMap() {
+ memset(_graphicsManager._vesaScreen, 0, SCREEN_WIDTH * 2 * SCREEN_HEIGHT);
+
+ // List of rectangle areas to draw for exit points
+ const int rects[] = {
+ 181, 66, 181 + 16, 66 + 22,
+ 353, 116, 353 + 22, 116 + 16,
+ 483, 250, 483 + 20, 250 + 25,
+ 471, 326, 471 + 27, 326 + 20,
+ 162, 365, 162 + 21, 365 + 23,
+ 106, 267, 106 + 20, 267 + 26
+ };
+
+ // Loop through displaying
+ const int *rectP = &rects[0];
+ for (int rectIndex = 0; rectIndex < 6; ++rectIndex, rectP += 4) {
+ Common::Rect r(rectP[0], rectP[1], rectP[2], rectP[3]);
+
+ for (int yp = r.top; yp <= r.bottom; ++yp) {
+ byte *pDest = _graphicsManager._vesaScreen + yp * SCREEN_WIDTH + r.left;
+ Common::fill(pDest, pDest + r.width(), 0xff);
+ }
+ }
+
+ // Copy the calculated screen
+ memcpy(_graphicsManager._vesaBuffer, _graphicsManager._vesaScreen, SCREEN_WIDTH * 2 * SCREEN_HEIGHT);
+
+ // Write some explanatory text
+ _fontManager.displayText(40, 200, "ScummVM base map - select a square for different rooms", 255);
+}
+
+int HopkinsEngine::handleBaseMap() {
+ _globals._disableInventFl = true;
+
+ // Load the map image
+ loadBaseMap();
+
+ // Set needed colours
+ _graphicsManager.SETCOLOR3(252, 100, 100, 100);
+ _graphicsManager.SETCOLOR3(253, 100, 100, 100);
+ _graphicsManager.SETCOLOR3(251, 100, 100, 100);
+ _graphicsManager.SETCOLOR3(254, 0, 0, 0);
+ _eventsManager.changeMouseCursor(0);
+ _graphicsManager.fadeInLong();
+ bool loopCond = false;
+ int zone;
+ do {
+ if (shouldQuit())
+ return 0;
+
+ int mouseButton = _eventsManager.getMouseButton();
+ int posX = _eventsManager.getMouseX();
+ int posY = _eventsManager.getMouseY();
+ zone = 0;
+ if ((posX - 181 <= 16) && (posY - 66 <= 22) &&
+ (posX - 181 >= 0) && (posY - 66 >= 0))
+ zone = 1;
+ if ((posX - 353 <= 22) && (posY - 116 <= 19) &&
+ (posX - 353 >= 0) && (posY - 116 >= 0))
+ zone = 2;
+ if ((posX - 483 <= 20) && (posY - 250 <= 25) &&
+ (posX - 483 >= 0) && (posY - 250 >= 0))
+ zone = 3;
+ if ((posX - 471 <= 27) && (posY - 326 <= 20) &&
+ (posX - 471 >= 0) && (posY - 326 >= 0))
+ zone = 4;
+ if ((posX - 162 <= 21) && (posY - 365 <= 23) &&
+ (posX - 162 >= 0) && (posY - 365 >= 0))
+ zone = 5;
+ if ((posX - 106 <= 20) && (posY - 267 <= 26) &&
+ (posX - 106 >= 0) && (posY - 267 >= 0))
+ zone = 6;
+ if (zone) {
+ _eventsManager.changeMouseCursor(4);
+ _globals._baseMapColor += 25;
+ if (_globals._baseMapColor > 100)
+ _globals._baseMapColor = 0;
+ _graphicsManager.SETCOLOR4(251, _globals._baseMapColor, _globals._baseMapColor, _globals._baseMapColor);
+ } else {
+ _eventsManager.changeMouseCursor(0);
+ _graphicsManager.SETCOLOR4(251, 100, 100, 100);
+ }
+ _eventsManager.VBL();
+ if ((mouseButton == 1) && zone)
+ loopCond = true;
+ } while (!loopCond);
+
+ _globals._disableInventFl = false;
+ _graphicsManager.fadeOutLong();
+
+ int result;
+ switch (zone) {
+ case 1:
+ result = 94;
+ break;
+ case 2:
+ result = 95;
+ break;
+ case 3:
+ result = 96;
+ break;
+ case 4:
+ result = 97;
+ break;
+ case 5:
+ result = 98;
+ break;
+ case 6:
+ result = 99;
+ break;
+ default:
+ result = 0;
+ break;
+ }
+ return result;
+}
+
+void HopkinsEngine::loadCredits() {
+ _globals._creditsPosY = 440;
+ _globals._creditsStep = 45;
+ byte *bufPtr;
+ switch (_globals._language) {
+ case LANG_EN:
+ bufPtr = _fileManager.loadFile("CREAN.TXT");
+ break;
+ case LANG_FR:
+ bufPtr = _fileManager.loadFile("CREFR.TXT");
+ break;
+ case LANG_SP:
+ bufPtr = _fileManager.loadFile("CREES.TXT");
+ break;
+ default:
+ error("Unhandled language");
+ break;
+ }
+
+ byte *curPtr = bufPtr;
+ int idxLines = 0;
+ bool loopCond = false;
+ do {
+ if (*curPtr == '%') {
+ if (curPtr[1] == '%') {
+ loopCond = true;
+ break;
+ }
+ _globals._creditsItem[idxLines]._colour = curPtr[1];
+ _globals._creditsItem[idxLines]._actvFl = true;
+ _globals._creditsItem[idxLines]._linePosY = _globals._creditsPosY + idxLines * _globals._creditsStep;
+
+ int idxBuf = 0;
+ for(; idxBuf < 49; idxBuf++) {
+ byte curChar = curPtr[idxBuf + 3];
+ if (curChar == '%' || curChar == 10)
+ break;
+ _globals._creditsItem[idxLines]._line[idxBuf] = curChar;
+ }
+ _globals._creditsItem[idxLines]._line[idxBuf] = 0;
+ _globals._creditsItem[idxLines]._lineSize = idxBuf - 1;
+ curPtr = curPtr + idxBuf + 2;
+ ++idxLines;
+ } else {
+ curPtr++;
+ }
+ _globals._creditsLineNumb = idxLines;
+ } while (!loopCond);
+
+ _globals.freeMemory(bufPtr);
+}
+
+void HopkinsEngine::displayCredits(int startPosY, byte *buffer, char colour) {
+ byte *bufPtr = buffer;
+ int strWidth = 0;
+ byte curChar;
+ for (;;) {
+ curChar = *bufPtr++;
+ if (!curChar)
+ break;
+ if (curChar > 31)
+ strWidth += _objectsManager.getWidth(_fontManager._font, curChar - 32);
+ }
+ int startPosX = 320 - strWidth / 2;
+ int endPosX = strWidth + startPosX;
+ int endPosY = startPosY + 12;
+ if ((_globals.Credit_bx == -1) && (_globals.Credit_bx1 == -1) && (_globals.Credit_by == -1) && (_globals.Credit_by1 == -1)) {
+ _globals.Credit_bx = startPosX;
+ _globals.Credit_bx1 = endPosX;
+ _globals.Credit_by = startPosY;
+ _globals.Credit_by1 = endPosY;
+ }
+ if (startPosX < _globals.Credit_bx)
+ _globals.Credit_bx = startPosX;
+ if (endPosX > _globals.Credit_bx1)
+ _globals.Credit_bx1 = endPosX;
+ if (_globals.Credit_by > startPosY)
+ _globals.Credit_by = startPosY;
+ if (endPosY > _globals.Credit_by1)
+ _globals.Credit_by1 = endPosY;
+
+ bufPtr = buffer;
+ for (;;) {
+ curChar = *bufPtr++;
+ if (!curChar)
+ break;
+ if (curChar > 31) {
+ _graphicsManager.displayFont(_graphicsManager._vesaBuffer, _fontManager._font, startPosX, startPosY, curChar - 32, colour);
+ startPosX += _objectsManager.getWidth(_fontManager._font, curChar - 32);
+ }
+ }
+}
+
+void HopkinsEngine::displayCredits() {
+ loadCredits();
+ _globals._creditsPosY = 436;
+ _graphicsManager.loadImage("GENERIC");
+ _graphicsManager.fadeInLong();
+ _soundManager.WSOUND(28);
+ _eventsManager._mouseFl = false;
+ _globals.iRegul = 3;
+ _globals.Credit_bx = _globals.Credit_bx1 = _globals.Credit_by = _globals.Credit_by1 = -1;
+ int soundId = 28;
+ do {
+ for (int i = 0; i < _globals._creditsLineNumb; ++i) {
+ if (_globals._creditsItem[i]._actvFl) {
+ int nextY = _globals._creditsPosY + i * _globals._creditsStep;
+ _globals._creditsItem[i]._linePosY = nextY;
+
+ if ((nextY - 21 >= 0) && (nextY - 21 <= 418)) {
+ int col = 0;
+ switch (_globals._creditsItem[i]._colour) {
+ case '1':
+ col = 163;
+ break;
+ case '2':
+ col = 161;
+ break;
+ case '3':
+ col = 162;
+ break;
+ default:
+ warning("Unknown colour, default to col #1");
+ col = 163;
+ break;
+ }
+ if (_globals._creditsItem[i]._lineSize != -1)
+ displayCredits(nextY, _globals._creditsItem[i]._line, col);
+ }
+ }
+ }
+ --_globals._creditsPosY;
+ if (_globals.Credit_bx != -1 || _globals.Credit_bx1 != -1 || _globals.Credit_by != -1 || _globals.Credit_by1 != -1) {
+ _eventsManager.VBL();
+ _graphicsManager.copySurface(_graphicsManager._vesaScreen, 60, 50, 520, 380, _graphicsManager._vesaBuffer, 60, 50);
+ } else {
+ _eventsManager.VBL();
+ }
+ if (_globals._creditsItem[_globals._creditsLineNumb - 1]._linePosY <= 39) {
+ _globals._creditsPosY = 440;
+ ++soundId;
+ if (soundId > 31)
+ soundId = 28;
+ _soundManager.WSOUND(soundId);
+ }
+ _globals.Credit_bx = -1;
+ _globals.Credit_bx1 = -1;
+ _globals.Credit_by = -1;
+ _globals.Credit_by1 = -1;
+ } while ((_eventsManager.getMouseButton() != 1) && (!g_system->getEventManager()->shouldQuit()));
+ _graphicsManager.fadeOutLong();
+ _globals.iRegul = 1;
+ _eventsManager._mouseFl = true;
+}
+
+void HopkinsEngine::BTOCEAN() {
+ _fontManager.hideText(9);
+ if (_eventsManager._mouseCursorId != 16)
+ return;
+
+ _eventsManager.getMouseX();
+ if (_objectsManager._zoneNum <= 0)
+ return;
+
+ int oldPosX = _eventsManager.getMouseX();
+ int oldPosY = _eventsManager.getMouseY();
+ bool displAnim = false;
+ int oldX;
+ switch (_objectsManager._zoneNum) {
+ case 1:
+ switch (_globals._oceanDirection) {
+ case 1:
+ _objectsManager.SPACTION(_globals.PERSO, "27,26,25,24,23,22,21,20,19,18,-1,", 0, 0, 6, false);
+ break;
+ case 3:
+ _objectsManager.SPACTION(_globals.PERSO, "0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,-1,", 0, 0, 6, false);
+ break;
+ case 5:
+ _objectsManager.SPACTION(_globals.PERSO, "9,10,11,12,13,14,15,16,17,18,-1,", 0, 0, 6, false);
+ break;
+ }
+
+ _globals._oceanDirection = 7;
+ _globals._exitId = 1;
+ oldX = _objectsManager.getSpriteX(0);
+ for (;;) {
+ if (_globals._speed == 1)
+ oldX -= 2;
+ else if (_globals._speed == 2)
+ oldX -= 4;
+ else if (_globals._speed == 3)
+ oldX -= 6;
+ _objectsManager.setSpriteX(0, oldX);
+ OCEAN_HOME();
+ _eventsManager.VBL();
+ if (_eventsManager.getMouseButton() == 1 && oldPosX == _eventsManager.getMouseX() && _eventsManager.getMouseY() == oldPosY) {
+ displAnim = true;
+ break;
+ }
+
+ if (oldX <= -100)
+ break;
+ }
+ break;
+ case 2:
+ switch (_globals._oceanDirection) {
+ case 1:
+ _objectsManager.SPACTION(_globals.PERSO, "27,28,29,30,31,32,33,34,35,36,-1,", 0, 0, 6, false);
+ break;
+ case 5:
+ _objectsManager.SPACTION(_globals.PERSO, "9,8,7,6,5,4,3,2,1,0,-1,", 0, 0, 6, false);
+ break;
+ case 7:
+ _objectsManager.SPACTION(_globals.PERSO, "18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,-1,", 0, 0, 6, false);
+ break;
+ }
+ _globals._oceanDirection = 3;
+ _globals._exitId = 2;
+ oldX = _objectsManager.getSpriteX(0);
+ for (;;) {
+ if (_globals._speed == 1)
+ oldX += 2;
+ else if (_globals._speed == 2)
+ oldX += 4;
+ else if (_globals._speed == 3)
+ oldX += 6;
+ _objectsManager.setSpriteX(0, oldX);
+ OCEAN_HOME();
+ _eventsManager.VBL();
+ if (_eventsManager.getMouseButton() == 1 && oldPosX == _eventsManager.getMouseX() && _eventsManager.getMouseY() == oldPosY) {
+ displAnim = true;
+ break;
+ }
+ if (oldX > 499)
+ break;
+ }
+ break;
+ case 3:
+ switch (_globals._oceanDirection) {
+ case 3:
+ oldX = _objectsManager.getSpriteX(0);
+ do {
+ if (_globals._speed == 1)
+ oldX += 2;
+ else if (_globals._speed == 2)
+ oldX += 4;
+ else if (_globals._speed == 3)
+ oldX += 6;
+ _objectsManager.setSpriteX(0, oldX);
+ OCEAN_HOME();
+ _eventsManager.VBL();
+ if (_eventsManager.getMouseButton() == 1 && oldPosX == _eventsManager.getMouseX() && _eventsManager.getMouseY() == oldPosY) {
+ displAnim = true;
+ break;
+ }
+ } while (oldX <= 235);
+ if (!displAnim)
+ _objectsManager.SPACTION(_globals.PERSO, "36,35,34,33,32,31,30,29,28,27,-1,", 0, 0, 6, false);
+ break;
+ case 5:
+ _objectsManager.SPACTION(_globals.PERSO, "9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,-1,", 0, 0, 6, false);
+ break;
+ case 7:
+ oldX = _objectsManager.getSpriteX(0);
+ do {
+ if (_globals._speed == 1)
+ oldX -= 2;
+ else if (_globals._speed == 2)
+ oldX -= 4;
+ else if (_globals._speed == 3)
+ oldX -= 6;
+ _objectsManager.setSpriteX(0, oldX);
+ OCEAN_HOME();
+ _eventsManager.VBL();
+ if (_eventsManager.getMouseButton() == 1 && oldPosX == _eventsManager.getMouseX() && _eventsManager.getMouseY() == oldPosY) {
+ displAnim = true;
+ break;
+ }
+ } while (oldX > 236);
+ if (!displAnim)
+ _objectsManager.SPACTION(_globals.PERSO, "18,19,20,21,22,23,24,25,26,27,-1,", 0, 0, 6, false);
+ break;
+ }
+ _globals._oceanDirection = 1;
+ _globals._exitId = 3;
+ break;
+ case 4:
+ switch (_globals._oceanDirection) {
+ case 1:
+ _objectsManager.SPACTION(_globals.PERSO, "27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,-1,", 0, 0, 6, false);
+ break;
+ case 3:
+ oldX = _objectsManager.getSpriteX(0);
+ do {
+ if (_globals._speed == 1)
+ oldX += 2;
+ else if (_globals._speed == 2)
+ oldX += 4;
+ else if (_globals._speed == 3)
+ oldX += 6;
+ _objectsManager.setSpriteX(0, oldX);
+ OCEAN_HOME();
+ _eventsManager.VBL();
+ if (_eventsManager.getMouseButton() == 1 && oldPosX == _eventsManager.getMouseX() && _eventsManager.getMouseY() == oldPosY) {
+ displAnim = true;
+ break;
+ }
+ } while (oldX <= 235);
+ if (!displAnim)
+ _objectsManager.SPACTION(_globals.PERSO, "0,1,2,3,4,5,6,7,8,9,-1,", 0, 0, 6, false);
+ break;
+ case 7:
+ oldX = _objectsManager.getSpriteX(0);
+ for (;;) {
+ if (_globals._speed == 1)
+ oldX -= 2;
+ else if (_globals._speed == 2)
+ oldX -= 4;
+ else if (_globals._speed == 3)
+ oldX -= 6;
+ _objectsManager.setSpriteX(0, oldX);
+ OCEAN_HOME();
+ _eventsManager.VBL();
+ if (_eventsManager.getMouseButton() == 1 && oldPosX == _eventsManager.getMouseX() && _eventsManager.getMouseY() == oldPosY)
+ break;
+
+ if (oldX <= 236) {
+ if (!displAnim)
+ _objectsManager.SPACTION(_globals.PERSO, "18,17,16,15,14,13,12,11,10,9,-1,", 0, 0, 6, false);
+ break;
+ }
+ }
+ break;
+ }
+ _globals._oceanDirection = 5;
+ _globals._exitId = 4;
+ break;
+ }
+}
+
+void HopkinsEngine::OCEAN_HOME() {
+ if (_globals._oceanDirection == 3)
+ _objectsManager.setSpriteIndex(0, 0);
+ else if (_globals._oceanDirection == 7)
+ _objectsManager.setSpriteIndex(0, 18);
+ else if (_globals._oceanDirection == 1)
+ _objectsManager.setSpriteIndex(0, 27);
+ else if (_globals._oceanDirection == 5)
+ _objectsManager.setSpriteIndex(0, 9);
+}
+
+void HopkinsEngine::OCEAN(int16 curExitId, Common::String backgroundFilename, int16 defaultDirection, int16 exit1, int16 exit2, int16 exit3, int16 exit4, int16 soundId) {
+ _globals._cityMapEnabledFl = false;
+ _graphicsManager._noFadingFl = false;
+ _globals.NOMARCHE = false;
+ _globals._exitId = 0;
+ _globals._disableInventFl = true;
+ _soundManager.WSOUND(soundId);
+ _globals.PERSO = _fileManager.loadFile("VAISSEAU.SPR");
+ if (backgroundFilename.size())
+ _graphicsManager.loadImage(backgroundFilename);
+
+ if (curExitId == 77)
+ _objectsManager.INILINK("IM77");
+ else if (curExitId == 84)
+ _objectsManager.INILINK("IM84");
+ else if (curExitId == 91)
+ _objectsManager.INILINK("IM91");
+ else
+ _objectsManager.INILINK("ocean");
+
+ if (!exit1)
+ _linesManager.disableZone(1);
+ if (!exit2)
+ _linesManager.disableZone(2);
+ if (!exit3)
+ _linesManager.disableZone(3);
+ if (!exit4)
+ _linesManager.disableZone(4);
+
+ if (!_globals._oceanDirection)
+ _globals._oceanDirection = defaultDirection;
+
+ switch (_globals._oceanDirection) {
+ case 1:
+ _objectsManager._characterPos.x = 236;
+ _objectsManager._startSpriteIndex = 27;
+ break;
+ case 3:
+ _objectsManager._characterPos.x = -20;
+ _objectsManager._startSpriteIndex = 0;
+ break;
+ case 5:
+ _objectsManager._characterPos.x = 236;
+ _objectsManager._startSpriteIndex = 9;
+ break;
+ case 7:
+ _objectsManager._characterPos.x = 415;
+ _objectsManager._startSpriteIndex = 18;
+ break;
+ }
+
+ _objectsManager.addStaticSprite(_globals.PERSO, Common::Point(_objectsManager._characterPos.x, 110), 0, _objectsManager._startSpriteIndex, 0, false, 0, 0);
+ _graphicsManager.SETCOLOR3(252, 100, 100, 100);
+ _graphicsManager.SETCOLOR3(253, 100, 100, 100);
+ _graphicsManager.SETCOLOR3(251, 100, 100, 100);
+ _graphicsManager.SETCOLOR3(254, 0, 0, 0);
+ _objectsManager.animateSprite(0);
+ _linesManager._route = (int16 *)g_PTRNUL;
+ _eventsManager.mouseOn();
+ _eventsManager.changeMouseCursor(4);
+
+ for (int cpt = 0; cpt <= 4; cpt++)
+ _eventsManager.VBL();
+
+ if (!_graphicsManager._noFadingFl)
+ _graphicsManager.fadeInLong();
+ _graphicsManager._noFadingFl = false;
+ _globals.iRegul = 1;
+
+ for (;;) {
+ int mouseButton = _eventsManager.getMouseButton();
+ if (mouseButton && mouseButton == 1)
+ BTOCEAN();
+ _linesManager.checkZone();
+ OCEAN_HOME();
+ _eventsManager.VBL();
+ if (_globals._exitId || g_system->getEventManager()->shouldQuit())
+ break;
+ }
+
+ if (_globals._exitId == 1)
+ _globals._exitId = exit1;
+ else if (_globals._exitId == 2)
+ _globals._exitId = exit2;
+ else if (_globals._exitId == 3)
+ _globals._exitId = exit3;
+ else if (_globals._exitId == 4)
+ _globals._exitId = exit4;
+ _graphicsManager.fadeOutLong();
+ _objectsManager.removeSprite(0);
+ _objectsManager.clearScreen();
+ _globals.PERSO = _fileManager.loadFile("PERSO.SPR");
+ _globals.PERSO_TYPE = 0;
+}
+
+void HopkinsEngine::syncSoundSettings() {
+ Engine::syncSoundSettings();
+
+ _soundManager.syncSoundSettings();
+}
+
+bool HopkinsEngine::displayAdultDisclaimer() {
+ int xp, yp;
+ int buttonIndex;
+
+ _graphicsManager._minX = 0;
+ _graphicsManager._minY = 0;
+ _graphicsManager._maxX = SCREEN_WIDTH;
+ _graphicsManager._maxY = SCREEN_HEIGHT - 1;
+ _eventsManager._breakoutFl = false;
+ _objectsManager._forestFl = false;
+ _globals._disableInventFl = true;
+ _globals._exitId = 0;
+
+ _graphicsManager.loadImage("ADULT");
+ _graphicsManager.fadeInLong();
+ _eventsManager.mouseOn();
+ _eventsManager.changeMouseCursor(0);
+ _eventsManager._mouseCursorId = 0;
+ _eventsManager._mouseSpriteId = 0;
+
+ do {
+ xp = _eventsManager.getMouseX();
+ yp = _eventsManager.getMouseY();
+
+ buttonIndex = 0;
+ if (xp >= 37 && xp <= 169 && yp >= 406 && yp <= 445)
+ buttonIndex = 2;
+ else if (xp >= 424 && xp <= 602 && yp >= 406 && yp <= 445)
+ buttonIndex = 1;
+
+ _eventsManager.VBL();
+ } while (!shouldQuit() && (buttonIndex == 0 || _eventsManager.getMouseButton() != 1));
+
+ _globals._disableInventFl = false;
+ _graphicsManager.fadeOutLong();
+
+ if (buttonIndex != 2) {
+ // Quit game
+ return false;
+ } else {
+ // Continue
+ _graphicsManager._minX = 0;
+ _graphicsManager._maxY = 20;
+ _graphicsManager._maxX = SCREEN_WIDTH;
+ _graphicsManager._maxY = SCREEN_HEIGHT - 20;
+ return true;
+ }
+}
+
+} // End of namespace Hopkins