aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/zvision/zvision.cpp722
1 files changed, 361 insertions, 361 deletions
diff --git a/engines/zvision/zvision.cpp b/engines/zvision/zvision.cpp
index a70f9d8e39..54991aced3 100644
--- a/engines/zvision/zvision.cpp
+++ b/engines/zvision/zvision.cpp
@@ -1,361 +1,361 @@
-/* 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 "zvision/zvision.h"
-#include "zvision/core/console.h"
-#include "zvision/scripting/script_manager.h"
-#include "zvision/graphics/render_manager.h"
-#include "zvision/graphics/cursors/cursor_manager.h"
-#include "zvision/file/save_manager.h"
-#include "zvision/text/string_manager.h"
-#include "zvision/detection.h"
-#include "zvision/scripting/menu.h"
-#include "zvision/file/search_manager.h"
-#include "zvision/text/text.h"
-#include "zvision/text/truetype_font.h"
-#include "zvision/sound/midi.h"
-#include "zvision/file/zfs_archive.h"
-
-#include "common/config-manager.h"
-#include "common/str.h"
-#include "common/debug.h"
-#include "common/debug-channels.h"
-#include "common/textconsole.h"
-#include "common/error.h"
-#include "common/system.h"
-#include "common/file.h"
-
-#include "gui/message.h"
-#include "engines/util.h"
-#include "audio/mixer.h"
-
-namespace ZVision {
-
-#define ZVISION_SETTINGS_KEYS_COUNT 11
-
-struct zvisionIniSettings {
- const char *name;
- int16 slot;
- int16 defaultValue; // -1: use the bool value
- bool defaultBoolValue;
- bool allowEditing;
-} settingsKeys[ZVISION_SETTINGS_KEYS_COUNT] = {
- // Hardcoded settings
- {"countrycode", StateKey_CountryCode, 0, false, false}, // always 0 = US, subtitles are shown for codes 0 - 4, unused
- {"lineskipvideo", StateKey_VideoLineSkip, 0, false, false}, // video line skip, 0 = default, 1 = always, 2 = pixel double when possible, unused
- {"installlevel", StateKey_InstallLevel, 0, false, false}, // 0 = full, checked by universe.scr
- {"highquality", StateKey_HighQuality, -1, true, false}, // high panorama quality, unused
- {"qsoundenabled", StateKey_Qsound, -1, true, false}, // 1 = enable QSound - TODO: not supported yet
- {"debugcheats", StateKey_DebugCheats, -1, true, false}, // always start with the GOxxxx cheat enabled
- // Editable settings
- {"keyboardturnspeed", StateKey_KbdRotateSpeed, 5, false, true},
- {"panarotatespeed", StateKey_RotateSpeed, 540, false, true}, // checked by universe.scr
- {"noanimwhileturning", StateKey_NoTurnAnim, -1, false, true}, // toggle playing animations during pana rotation
- {"venusenabled", StateKey_VenusEnable, -1, true, true},
- {"subtitles", StateKey_Subtitles, -1, true, true}
-};
-
-ZVision::ZVision(OSystem *syst, const ZVisionGameDescription *gameDesc)
- : Engine(syst),
- _gameDescription(gameDesc),
- _resourcePixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0), /* RGB 555 */
- _screenPixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0), /* RGB 565 */
- _desiredFrameTime(33), /* ~30 fps */
- _clock(_system),
- _scriptManager(nullptr),
- _renderManager(nullptr),
- _saveManager(nullptr),
- _stringManager(nullptr),
- _cursorManager(nullptr),
- _midiManager(nullptr),
- _rnd(nullptr),
- _console(nullptr),
- _menu(nullptr),
- _searchManager(nullptr),
- _textRenderer(nullptr),
- _doubleFPS(false),
- _audioId(0),
- _frameRenderDelay(2),
- _keyboardVelocity(0),
- _mouseVelocity(0),
- _videoIsPlaying(false),
- _renderedFrameCount(0),
- _fps(0) {
-
- debug(1, "ZVision::ZVision");
-
- uint16 workingWindowWidth = (gameDesc->gameId == GID_NEMESIS) ? ZNM_WORKING_WINDOW_WIDTH : ZGI_WORKING_WINDOW_WIDTH;
- uint16 workingWindowHeight = (gameDesc->gameId == GID_NEMESIS) ? ZNM_WORKING_WINDOW_HEIGHT : ZGI_WORKING_WINDOW_HEIGHT;
- _workingWindow = Common::Rect(
- (WINDOW_WIDTH - workingWindowWidth) / 2,
- (WINDOW_HEIGHT - workingWindowHeight) / 2,
- ((WINDOW_WIDTH - workingWindowWidth) / 2) + workingWindowWidth,
- ((WINDOW_HEIGHT - workingWindowHeight) / 2) + workingWindowHeight
- );
-
- memset(_cheatBuffer, 0, sizeof(_cheatBuffer));
-}
-
-ZVision::~ZVision() {
- debug(1, "ZVision::~ZVision");
-
- // Dispose of resources
- delete _console;
- delete _cursorManager;
- delete _stringManager;
- delete _saveManager;
- delete _scriptManager;
- delete _renderManager; // should be deleted after the script manager
- delete _rnd;
- delete _midiManager;
-
- getTimerManager()->removeTimerProc(&fpsTimerCallback);
-
- // Remove all of our debug levels
- DebugMan.clearAllDebugChannels();
-}
-
-void ZVision::registerDefaultSettings() {
- for (int i = 0; i < ZVISION_SETTINGS_KEYS_COUNT; i++) {
- if (settingsKeys[i].allowEditing) {
- if (settingsKeys[i].defaultValue >= 0)
- ConfMan.registerDefault(settingsKeys[i].name, settingsKeys[i].defaultValue);
- else
- ConfMan.registerDefault(settingsKeys[i].name, settingsKeys[i].defaultBoolValue);
- }
- }
-
- ConfMan.registerDefault("originalsaveload", false);
- ConfMan.registerDefault("doublefps", false);
-}
-
-void ZVision::loadSettings() {
- int16 value = 0;
- bool boolValue = false;
-
- for (int i = 0; i < ZVISION_SETTINGS_KEYS_COUNT; i++) {
- if (settingsKeys[i].defaultValue >= 0) {
- value = (settingsKeys[i].allowEditing) ? ConfMan.getInt(settingsKeys[i].name) : settingsKeys[i].defaultValue;
- } else {
- boolValue = (settingsKeys[i].allowEditing) ? ConfMan.getBool(settingsKeys[i].name) : settingsKeys[i].defaultBoolValue;
- value = (boolValue) ? 1 : 0;
- }
-
- _scriptManager->setStateValue(settingsKeys[i].slot, value);
- }
-
- if (getGameId() == GID_NEMESIS)
- _scriptManager->setStateValue(StateKey_ExecScopeStyle, 1);
- else
- _scriptManager->setStateValue(StateKey_ExecScopeStyle, 0);
-}
-
-void ZVision::saveSettings() {
- for (int i = 0; i < ZVISION_SETTINGS_KEYS_COUNT; i++) {
- if (settingsKeys[i].allowEditing) {
- if (settingsKeys[i].defaultValue >= 0)
- ConfMan.setInt(settingsKeys[i].name, _scriptManager->getStateValue(settingsKeys[i].slot));
- else
- ConfMan.setBool(settingsKeys[i].name, (_scriptManager->getStateValue(settingsKeys[i].slot) == 1));
- }
- }
-
- ConfMan.flushToDisk();
-}
-
-void ZVision::initialize() {
- const Common::FSNode gameDataDir(ConfMan.get("path"));
-
- _searchManager = new SearchManager(ConfMan.get("path"), 6);
-
- _searchManager->addDir("FONTS");
- _searchManager->addDir("addon");
-
- if (_gameDescription->gameId == GID_GRANDINQUISITOR) {
- _searchManager->loadZix("INQUIS.ZIX");
- _searchManager->addPatch("C000H01Q.RAW", "C000H01Q.SRC");
- _searchManager->addPatch("CM00H01Q.RAW", "CM00H01Q.SRC");
- _searchManager->addPatch("DM00H01Q.RAW", "DM00H01Q.SRC");
- _searchManager->addPatch("E000H01Q.RAW", "E000H01Q.SRC");
- _searchManager->addPatch("EM00H50Q.RAW", "EM00H50Q.SRC");
- _searchManager->addPatch("GJNPH65P.RAW", "GJNPH65P.SRC");
- _searchManager->addPatch("GJNPH72P.RAW", "GJNPH72P.SRC");
- _searchManager->addPatch("H000H01Q.RAW", "H000H01Q.SRC");
- _searchManager->addPatch("M000H01Q.RAW", "M000H01Q.SRC");
- _searchManager->addPatch("P000H01Q.RAW", "P000H01Q.SRC");
- _searchManager->addPatch("Q000H01Q.RAW", "Q000H01Q.SRC");
- _searchManager->addPatch("SW00H01Q.RAW", "SW00H01Q.SRC");
- _searchManager->addPatch("T000H01Q.RAW", "T000H01Q.SRC");
- _searchManager->addPatch("U000H01Q.RAW", "U000H01Q.SRC");
- } else if (_gameDescription->gameId == GID_NEMESIS)
- _searchManager->loadZix("NEMESIS.ZIX");
-
- initGraphics(WINDOW_WIDTH, WINDOW_HEIGHT, true, &_screenPixelFormat);
-
- // Register random source
- _rnd = new Common::RandomSource("zvision");
-
- // Create managers
- _scriptManager = new ScriptManager(this);
- _renderManager = new RenderManager(this, WINDOW_WIDTH, WINDOW_HEIGHT, _workingWindow, _resourcePixelFormat, _doubleFPS);
- _saveManager = new SaveManager(this);
- _stringManager = new StringManager(this);
- _cursorManager = new CursorManager(this, _resourcePixelFormat);
- _textRenderer = new TextRenderer(this);
- _midiManager = new MidiManager();
-
- if (_gameDescription->gameId == GID_GRANDINQUISITOR)
- _menu = new MenuZGI(this);
- else
- _menu = new MenuNemesis(this);
-
- // Initialize the managers
- _cursorManager->initialize();
- _scriptManager->initialize();
- _stringManager->initialize(_gameDescription->gameId);
-
- registerDefaultSettings();
-
- loadSettings();
-
- // Create debugger console. It requires GFX to be initialized
- _console = new Console(this);
- _doubleFPS = ConfMan.getBool("doublefps");
-
- // Initialize FPS timer callback
- getTimerManager()->installTimerProc(&fpsTimerCallback, 1000000, this, "zvisionFPS");
-}
-
-Common::Error ZVision::run() {
- initialize();
-
- // Check if a saved game is to be loaded from the launcher
- if (ConfMan.hasKey("save_slot"))
- _saveManager->loadGame(ConfMan.getInt("save_slot"));
-
- // Before starting, make absolutely sure that the user has copied the needed fonts
- if (!Common::File::exists("arial.ttf") && !Common::File::exists("FreeSans.ttf") && !_searchManager->hasFile("arial.ttf") && !_searchManager->hasFile("FreeSans.ttf") ) {
- GUI::MessageDialog dialog(
- "Before playing this game, you'll need to copy the required "
- "fonts into ScummVM's extras directory, or into the game directory. "
- "On Windows, you'll need the following font files from the Windows "
- "font directory: Times New Roman, Century Schoolbook, Garamond, "
- "Courier New and Arial. Alternatively, you can download the GNU "
- "FreeFont package. You'll need all the fonts from that package, "
- "i.e., FreeMono, FreeSans and FreeSerif."
- );
- dialog.runModal();
- quitGame();
- return Common::kUnknownError;
- }
-
- // Main loop
- while (!shouldQuit()) {
- _clock.update();
- uint32 currentTime = _clock.getLastMeasuredTime();
- uint32 deltaTime = _clock.getDeltaTime();
-
- _cursorManager->setItemID(_scriptManager->getStateValue(StateKey_InventoryItem));
-
- processEvents();
- _renderManager->updateRotation();
-
- _scriptManager->update(deltaTime);
- _menu->process(deltaTime);
-
- // Render the backBuffer to the screen
- _renderManager->prepareBackground();
- _renderManager->renderMenuToScreen();
- _renderManager->processSubs(deltaTime);
- _renderManager->renderSceneToScreen();
-
- // Update the screen
- if (canRender()) {
- _system->updateScreen();
- _renderedFrameCount++;
- } else {
- _frameRenderDelay--;
- }
-
- // Calculate the frame delay based off a desired frame time
- int delay = _desiredFrameTime - int32(_system->getMillis() - currentTime);
- // Ensure non-negative
- delay = delay < 0 ? 0 : delay;
-
- if (_doubleFPS) {
- delay >>= 1;
- }
-
- if (canSaveGameStateCurrently() && shouldPerformAutoSave(_saveManager->getLastSaveTime())) {
- _saveManager->autoSave();
- }
-
- _system->delayMillis(delay);
- }
-
- return Common::kNoError;
-}
-
-void ZVision::pauseEngineIntern(bool pause) {
- _mixer->pauseAll(pause);
-
- if (pause) {
- _clock.stop();
- } else {
- _clock.start();
- }
-}
-
-Common::String ZVision::generateSaveFileName(uint slot) {
- return Common::String::format("%s.%03u", _targetName.c_str(), slot);
-}
-
-void ZVision::setRenderDelay(uint delay) {
- _frameRenderDelay = delay;
-}
-
-bool ZVision::canRender() {
- return _frameRenderDelay <= 0;
-}
-
-GUI::Debugger *ZVision::getDebugger() {
- return _console;
-}
-
-void ZVision::syncSoundSettings() {
- Engine::syncSoundSettings();
-
- _scriptManager->setStateValue(StateKey_Subtitles, ConfMan.getBool("subtitles") ? 1 : 0);
-}
-
-void ZVision::fpsTimerCallback(void *refCon) {
- ((ZVision *)refCon)->fpsTimer();
-}
-
-void ZVision::fpsTimer() {
- _fps = _renderedFrameCount;
- _renderedFrameCount = 0;
-}
-
-} // End of namespace ZVision
+/* 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 "zvision/zvision.h"
+#include "zvision/core/console.h"
+#include "zvision/scripting/script_manager.h"
+#include "zvision/graphics/render_manager.h"
+#include "zvision/graphics/cursors/cursor_manager.h"
+#include "zvision/file/save_manager.h"
+#include "zvision/text/string_manager.h"
+#include "zvision/detection.h"
+#include "zvision/scripting/menu.h"
+#include "zvision/file/search_manager.h"
+#include "zvision/text/text.h"
+#include "zvision/text/truetype_font.h"
+#include "zvision/sound/midi.h"
+#include "zvision/file/zfs_archive.h"
+
+#include "common/config-manager.h"
+#include "common/str.h"
+#include "common/debug.h"
+#include "common/debug-channels.h"
+#include "common/textconsole.h"
+#include "common/error.h"
+#include "common/system.h"
+#include "common/file.h"
+
+#include "gui/message.h"
+#include "engines/util.h"
+#include "audio/mixer.h"
+
+namespace ZVision {
+
+#define ZVISION_SETTINGS_KEYS_COUNT 11
+
+struct zvisionIniSettings {
+ const char *name;
+ int16 slot;
+ int16 defaultValue; // -1: use the bool value
+ bool defaultBoolValue;
+ bool allowEditing;
+} settingsKeys[ZVISION_SETTINGS_KEYS_COUNT] = {
+ // Hardcoded settings
+ {"countrycode", StateKey_CountryCode, 0, false, false}, // always 0 = US, subtitles are shown for codes 0 - 4, unused
+ {"lineskipvideo", StateKey_VideoLineSkip, 0, false, false}, // video line skip, 0 = default, 1 = always, 2 = pixel double when possible, unused
+ {"installlevel", StateKey_InstallLevel, 0, false, false}, // 0 = full, checked by universe.scr
+ {"highquality", StateKey_HighQuality, -1, true, false}, // high panorama quality, unused
+ {"qsoundenabled", StateKey_Qsound, -1, true, false}, // 1 = enable QSound - TODO: not supported yet
+ {"debugcheats", StateKey_DebugCheats, -1, true, false}, // always start with the GOxxxx cheat enabled
+ // Editable settings
+ {"keyboardturnspeed", StateKey_KbdRotateSpeed, 5, false, true},
+ {"panarotatespeed", StateKey_RotateSpeed, 540, false, true}, // checked by universe.scr
+ {"noanimwhileturning", StateKey_NoTurnAnim, -1, false, true}, // toggle playing animations during pana rotation
+ {"venusenabled", StateKey_VenusEnable, -1, true, true},
+ {"subtitles", StateKey_Subtitles, -1, true, true}
+};
+
+ZVision::ZVision(OSystem *syst, const ZVisionGameDescription *gameDesc)
+ : Engine(syst),
+ _gameDescription(gameDesc),
+ _resourcePixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0), /* RGB 555 */
+ _screenPixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0), /* RGB 565 */
+ _desiredFrameTime(33), /* ~30 fps */
+ _clock(_system),
+ _scriptManager(nullptr),
+ _renderManager(nullptr),
+ _saveManager(nullptr),
+ _stringManager(nullptr),
+ _cursorManager(nullptr),
+ _midiManager(nullptr),
+ _rnd(nullptr),
+ _console(nullptr),
+ _menu(nullptr),
+ _searchManager(nullptr),
+ _textRenderer(nullptr),
+ _doubleFPS(false),
+ _audioId(0),
+ _frameRenderDelay(2),
+ _keyboardVelocity(0),
+ _mouseVelocity(0),
+ _videoIsPlaying(false),
+ _renderedFrameCount(0),
+ _fps(0) {
+
+ debug(1, "ZVision::ZVision");
+
+ uint16 workingWindowWidth = (gameDesc->gameId == GID_NEMESIS) ? ZNM_WORKING_WINDOW_WIDTH : ZGI_WORKING_WINDOW_WIDTH;
+ uint16 workingWindowHeight = (gameDesc->gameId == GID_NEMESIS) ? ZNM_WORKING_WINDOW_HEIGHT : ZGI_WORKING_WINDOW_HEIGHT;
+ _workingWindow = Common::Rect(
+ (WINDOW_WIDTH - workingWindowWidth) / 2,
+ (WINDOW_HEIGHT - workingWindowHeight) / 2,
+ ((WINDOW_WIDTH - workingWindowWidth) / 2) + workingWindowWidth,
+ ((WINDOW_HEIGHT - workingWindowHeight) / 2) + workingWindowHeight
+ );
+
+ memset(_cheatBuffer, 0, sizeof(_cheatBuffer));
+}
+
+ZVision::~ZVision() {
+ debug(1, "ZVision::~ZVision");
+
+ // Dispose of resources
+ delete _console;
+ delete _cursorManager;
+ delete _stringManager;
+ delete _saveManager;
+ delete _scriptManager;
+ delete _renderManager; // should be deleted after the script manager
+ delete _rnd;
+ delete _midiManager;
+
+ getTimerManager()->removeTimerProc(&fpsTimerCallback);
+
+ // Remove all of our debug levels
+ DebugMan.clearAllDebugChannels();
+}
+
+void ZVision::registerDefaultSettings() {
+ for (int i = 0; i < ZVISION_SETTINGS_KEYS_COUNT; i++) {
+ if (settingsKeys[i].allowEditing) {
+ if (settingsKeys[i].defaultValue >= 0)
+ ConfMan.registerDefault(settingsKeys[i].name, settingsKeys[i].defaultValue);
+ else
+ ConfMan.registerDefault(settingsKeys[i].name, settingsKeys[i].defaultBoolValue);
+ }
+ }
+
+ ConfMan.registerDefault("originalsaveload", false);
+ ConfMan.registerDefault("doublefps", false);
+}
+
+void ZVision::loadSettings() {
+ int16 value = 0;
+ bool boolValue = false;
+
+ for (int i = 0; i < ZVISION_SETTINGS_KEYS_COUNT; i++) {
+ if (settingsKeys[i].defaultValue >= 0) {
+ value = (settingsKeys[i].allowEditing) ? ConfMan.getInt(settingsKeys[i].name) : settingsKeys[i].defaultValue;
+ } else {
+ boolValue = (settingsKeys[i].allowEditing) ? ConfMan.getBool(settingsKeys[i].name) : settingsKeys[i].defaultBoolValue;
+ value = (boolValue) ? 1 : 0;
+ }
+
+ _scriptManager->setStateValue(settingsKeys[i].slot, value);
+ }
+
+ if (getGameId() == GID_NEMESIS)
+ _scriptManager->setStateValue(StateKey_ExecScopeStyle, 1);
+ else
+ _scriptManager->setStateValue(StateKey_ExecScopeStyle, 0);
+}
+
+void ZVision::saveSettings() {
+ for (int i = 0; i < ZVISION_SETTINGS_KEYS_COUNT; i++) {
+ if (settingsKeys[i].allowEditing) {
+ if (settingsKeys[i].defaultValue >= 0)
+ ConfMan.setInt(settingsKeys[i].name, _scriptManager->getStateValue(settingsKeys[i].slot));
+ else
+ ConfMan.setBool(settingsKeys[i].name, (_scriptManager->getStateValue(settingsKeys[i].slot) == 1));
+ }
+ }
+
+ ConfMan.flushToDisk();
+}
+
+void ZVision::initialize() {
+ const Common::FSNode gameDataDir(ConfMan.get("path"));
+
+ _searchManager = new SearchManager(ConfMan.get("path"), 6);
+
+ _searchManager->addDir("FONTS");
+ _searchManager->addDir("addon");
+
+ if (_gameDescription->gameId == GID_GRANDINQUISITOR) {
+ _searchManager->loadZix("INQUIS.ZIX");
+ _searchManager->addPatch("C000H01Q.RAW", "C000H01Q.SRC");
+ _searchManager->addPatch("CM00H01Q.RAW", "CM00H01Q.SRC");
+ _searchManager->addPatch("DM00H01Q.RAW", "DM00H01Q.SRC");
+ _searchManager->addPatch("E000H01Q.RAW", "E000H01Q.SRC");
+ _searchManager->addPatch("EM00H50Q.RAW", "EM00H50Q.SRC");
+ _searchManager->addPatch("GJNPH65P.RAW", "GJNPH65P.SRC");
+ _searchManager->addPatch("GJNPH72P.RAW", "GJNPH72P.SRC");
+ _searchManager->addPatch("H000H01Q.RAW", "H000H01Q.SRC");
+ _searchManager->addPatch("M000H01Q.RAW", "M000H01Q.SRC");
+ _searchManager->addPatch("P000H01Q.RAW", "P000H01Q.SRC");
+ _searchManager->addPatch("Q000H01Q.RAW", "Q000H01Q.SRC");
+ _searchManager->addPatch("SW00H01Q.RAW", "SW00H01Q.SRC");
+ _searchManager->addPatch("T000H01Q.RAW", "T000H01Q.SRC");
+ _searchManager->addPatch("U000H01Q.RAW", "U000H01Q.SRC");
+ } else if (_gameDescription->gameId == GID_NEMESIS)
+ _searchManager->loadZix("NEMESIS.ZIX");
+
+ initGraphics(WINDOW_WIDTH, WINDOW_HEIGHT, true, &_screenPixelFormat);
+
+ // Register random source
+ _rnd = new Common::RandomSource("zvision");
+
+ // Create managers
+ _scriptManager = new ScriptManager(this);
+ _renderManager = new RenderManager(this, WINDOW_WIDTH, WINDOW_HEIGHT, _workingWindow, _resourcePixelFormat, _doubleFPS);
+ _saveManager = new SaveManager(this);
+ _stringManager = new StringManager(this);
+ _cursorManager = new CursorManager(this, _resourcePixelFormat);
+ _textRenderer = new TextRenderer(this);
+ _midiManager = new MidiManager();
+
+ if (_gameDescription->gameId == GID_GRANDINQUISITOR)
+ _menu = new MenuZGI(this);
+ else
+ _menu = new MenuNemesis(this);
+
+ // Initialize the managers
+ _cursorManager->initialize();
+ _scriptManager->initialize();
+ _stringManager->initialize(_gameDescription->gameId);
+
+ registerDefaultSettings();
+
+ loadSettings();
+
+ // Create debugger console. It requires GFX to be initialized
+ _console = new Console(this);
+ _doubleFPS = ConfMan.getBool("doublefps");
+
+ // Initialize FPS timer callback
+ getTimerManager()->installTimerProc(&fpsTimerCallback, 1000000, this, "zvisionFPS");
+}
+
+Common::Error ZVision::run() {
+ initialize();
+
+ // Check if a saved game is to be loaded from the launcher
+ if (ConfMan.hasKey("save_slot"))
+ _saveManager->loadGame(ConfMan.getInt("save_slot"));
+
+ // Before starting, make absolutely sure that the user has copied the needed fonts
+ if (!Common::File::exists("arial.ttf") && !Common::File::exists("FreeSans.ttf") && !_searchManager->hasFile("arial.ttf") && !_searchManager->hasFile("FreeSans.ttf") ) {
+ GUI::MessageDialog dialog(
+ "Before playing this game, you'll need to copy the required "
+ "fonts into ScummVM's extras directory, or into the game directory. "
+ "On Windows, you'll need the following font files from the Windows "
+ "font directory: Times New Roman, Century Schoolbook, Garamond, "
+ "Courier New and Arial. Alternatively, you can download the GNU "
+ "FreeFont package. You'll need all the fonts from that package, "
+ "i.e., FreeMono, FreeSans and FreeSerif."
+ );
+ dialog.runModal();
+ quitGame();
+ return Common::kUnknownError;
+ }
+
+ // Main loop
+ while (!shouldQuit()) {
+ _clock.update();
+ uint32 currentTime = _clock.getLastMeasuredTime();
+ uint32 deltaTime = _clock.getDeltaTime();
+
+ _cursorManager->setItemID(_scriptManager->getStateValue(StateKey_InventoryItem));
+
+ processEvents();
+ _renderManager->updateRotation();
+
+ _scriptManager->update(deltaTime);
+ _menu->process(deltaTime);
+
+ // Render the backBuffer to the screen
+ _renderManager->prepareBackground();
+ _renderManager->renderMenuToScreen();
+ _renderManager->processSubs(deltaTime);
+ _renderManager->renderSceneToScreen();
+
+ // Update the screen
+ if (canRender()) {
+ _system->updateScreen();
+ _renderedFrameCount++;
+ } else {
+ _frameRenderDelay--;
+ }
+
+ // Calculate the frame delay based off a desired frame time
+ int delay = _desiredFrameTime - int32(_system->getMillis() - currentTime);
+ // Ensure non-negative
+ delay = delay < 0 ? 0 : delay;
+
+ if (_doubleFPS) {
+ delay >>= 1;
+ }
+
+ if (canSaveGameStateCurrently() && shouldPerformAutoSave(_saveManager->getLastSaveTime())) {
+ _saveManager->autoSave();
+ }
+
+ _system->delayMillis(delay);
+ }
+
+ return Common::kNoError;
+}
+
+void ZVision::pauseEngineIntern(bool pause) {
+ _mixer->pauseAll(pause);
+
+ if (pause) {
+ _clock.stop();
+ } else {
+ _clock.start();
+ }
+}
+
+Common::String ZVision::generateSaveFileName(uint slot) {
+ return Common::String::format("%s.%03u", _targetName.c_str(), slot);
+}
+
+void ZVision::setRenderDelay(uint delay) {
+ _frameRenderDelay = delay;
+}
+
+bool ZVision::canRender() {
+ return _frameRenderDelay <= 0;
+}
+
+GUI::Debugger *ZVision::getDebugger() {
+ return _console;
+}
+
+void ZVision::syncSoundSettings() {
+ Engine::syncSoundSettings();
+
+ _scriptManager->setStateValue(StateKey_Subtitles, ConfMan.getBool("subtitles") ? 1 : 0);
+}
+
+void ZVision::fpsTimerCallback(void *refCon) {
+ ((ZVision *)refCon)->fpsTimer();
+}
+
+void ZVision::fpsTimer() {
+ _fps = _renderedFrameCount;
+ _renderedFrameCount = 0;
+}
+
+} // End of namespace ZVision