Common::Error MohawkEngine_Riven::run() { MohawkEngine::run(); // Let's try to open the installer file (it holds extras.mhk) // Though, we set a low priority to prefer the extracted version if (_installerArchive.open("arcriven.z")) SearchMan.add("arcriven.z", &_installerArchive, 0, false); _gfx = new RivenGraphics(this); _console = new RivenConsole(this); _saveLoad = new RivenSaveLoad(this, _saveFileMan); _externalScriptHandler = new RivenExternal(this); _optionsDialog = new RivenOptionsDialog(this); _scriptMan = new RivenScriptManager(this); _cursor = new RivenCursorManager(); _rnd = new Common::RandomSource(); g_eventRec.registerRandomSource(*_rnd, "riven"); initVars(); // Open extras.mhk for common images _extrasFile = new MohawkArchive(); if (!_extrasFile->open("extras.mhk")) error("Could not open extras.mhk"); // Start at main cursor _cursor->setCursor(kRivenMainCursor); // Let's begin, shall we? if (getFeatures() & GF_DEMO) { // Start the demo off with the videos changeToStack(aspit); changeToCard(6); } else if (ConfMan.hasKey("save_slot")) { // Load game from launcher/command line if requested uint32 gameToLoad = ConfMan.getInt("save_slot"); Common::StringArray savedGamesList = _saveLoad->generateSaveGameList(); if (gameToLoad > savedGamesList.size()) error ("Could not find saved game"); _saveLoad->loadGame(savedGamesList[gameToLoad]); } else { // Otherwise, start us off at aspit's card 1 (the main menu) changeToStack(aspit); changeToCard(1); } while (!_gameOver && !shouldQuit()) handleEvents(); return Common::kNoError; }
void MohawkEngine_Riven::changeToCard(uint16 dest) { debug (1, "Changing to card %d", dest); // Clear the graphics cache (images typically aren't used // on different cards). _gfx->clearCache(); if (!(getFeatures() & GF_DEMO)) { for (byte i = 0; i < ARRAYSIZE(rivenSpecialChange); i++) if (_stack->getId() == rivenSpecialChange[i].startStack && dest == _stack->getCardStackId( rivenSpecialChange[i].startCardRMAP)) { changeToStack(rivenSpecialChange[i].targetStack); dest = _stack->getCardStackId(rivenSpecialChange[i].targetCardRMAP); } } // Clear any timer still floating around _stack->removeTimer(); if (_card) { _card->leave(); delete _card; } _card = new RivenCard(this, dest); _card->enter(true); // Now we need to redraw the cursor if necessary and handle mouse over scripts _stack->queueMouseCursorRefresh(); // Finally, install any hardcoded timer _stack->installCardTimer(); }
void MohawkEngine_Riven::changeToCard(uint16 dest) { _curCard = dest; debug (1, "Changing to card %d", _curCard); // Clear the graphics cache (images typically aren't used // on different cards). _gfx->clearCache(); if (!(getFeatures() & GF_DEMO)) { for (byte i = 0; i < 13; i++) if (_curStack == rivenSpecialChange[i].startStack && _curCard == matchRMAPToCard(rivenSpecialChange[i].startCardRMAP)) { changeToStack(rivenSpecialChange[i].targetStack); _curCard = matchRMAPToCard(rivenSpecialChange[i].targetCardRMAP); } } if (_cardData.hasData) runCardScript(kCardLeaveScript); loadCard(_curCard); refreshCard(); // Handles hotspots and scripts }
void MohawkEngine_Riven::doFrame() { // Update background running things _sound->updateSLST(); _video->updateMovies(); if (!_scriptMan->hasQueuedScripts()) { _stack->keyResetAction(); } Common::Event event; while (_eventMan->pollEvent(event)) { switch (event.type) { case Common::EVENT_MOUSEMOVE: _stack->onMouseMove(event.mouse); break; case Common::EVENT_LBUTTONDOWN: _stack->onMouseDown(_eventMan->getMousePos()); break; case Common::EVENT_LBUTTONUP: _stack->onMouseUp(_eventMan->getMousePos()); _inventory->checkClick(_eventMan->getMousePos()); break; case Common::EVENT_KEYUP: _stack->keyResetAction(); break; case Common::EVENT_KEYDOWN: switch (event.kbd.keycode) { case Common::KEYCODE_d: if (event.kbd.flags & Common::KBD_CTRL) { _console->attach(); _console->onFrame(); } break; case Common::KEYCODE_SPACE: pauseGame(); break; case Common::KEYCODE_F5: runDialog(*_optionsDialog); if (_optionsDialog->getLoadSlot() >= 0) loadGameStateAndDisplayError(_optionsDialog->getLoadSlot()); _gfx->setTransitionMode((RivenTransitionMode) _vars["transitionmode"]); _card->initializeZipMode(); break; case Common::KEYCODE_r: // Return to the main menu in the demo on ctrl+r if (event.kbd.flags & Common::KBD_CTRL && getFeatures() & GF_DEMO) { if (_stack->getId() != kStackAspit) changeToStack(kStackAspit); changeToCard(1); } break; case Common::KEYCODE_p: // Play the intro videos in the demo on ctrl+p if (event.kbd.flags & Common::KBD_CTRL && getFeatures() & GF_DEMO) { if (_stack->getId() != kStackAspit) changeToStack(kStackAspit); changeToCard(6); } break; default: if (event.kbdRepeat) { continue; } _stack->onKeyPressed(event.kbd); break; } break; default: break; } } _stack->onFrame(); if (!_scriptMan->runningQueuedScripts()) { // Don't run queued scripts if we are calling from a queued script // otherwise infinite looping will happen. _scriptMan->runQueuedScripts(); } _inventory->onFrame(); // Update the screen once per frame _system->updateScreen(); // Cut down on CPU usage _system->delayMillis(10); }
Common::Error MohawkEngine_Riven::run() { MohawkEngine::run(); // Let's try to open the installer file (it holds extras.mhk) // Though, we set a low priority to prefer the extracted version if (_installerArchive.open("arcriven.z")) SearchMan.add("arcriven.z", &_installerArchive, 0, false); _gfx = new RivenGraphics(this); _video = new RivenVideoManager(this); _sound = new RivenSoundManager(this); _console = new RivenConsole(this); _saveLoad = new RivenSaveLoad(this, _saveFileMan); _optionsDialog = new RivenOptionsDialog(this); _scriptMan = new RivenScriptManager(this); _inventory = new RivenInventory(this); _rnd = new Common::RandomSource("riven"); // Create the cursor manager if (Common::File::exists("rivendmo.exe")) _cursor = new PECursorManager("rivendmo.exe"); else if (Common::File::exists("riven.exe")) _cursor = new PECursorManager("riven.exe"); else // last resort: try the Mac executable _cursor = new MacCursorManager("Riven"); initVars(); // Check the user has copied all the required datafiles if (!checkDatafiles()) { return Common::kNoGameDataFoundError; } // We need to have a cursor source, or the game won't work if (!_cursor->hasSource()) { Common::String message = _("You're missing a Riven executable. The Windows executable is 'riven.exe' or 'rivendmo.exe'. "); message += _("Using the 'arcriven.z' installer file also works. In addition, you can use the Mac 'Riven' executable."); GUIErrorMessage(message); warning("%s", message.c_str()); return Common::kNoGameDataFoundError; } // Open extras.mhk for common images _extrasFile = new MohawkArchive(); // We need extras.mhk for inventory images, marble images, and credits images if (!_extrasFile->openFile("extras.mhk")) { Common::String message = _("You're missing 'extras.mhk'. Using the 'arcriven.z' installer file also works."); GUIErrorMessage(message); warning("%s", message.c_str()); return Common::kNoGameDataFoundError; } // Set the transition speed _gfx->setTransitionMode((RivenTransitionMode) _vars["transitionmode"]); // Start at main cursor _cursor->setCursor(kRivenMainCursor); _cursor->showCursor(); // Let's begin, shall we? if (getFeatures() & GF_DEMO) { // Start the demo off with the videos changeToStack(kStackAspit); changeToCard(6); } else if (ConfMan.hasKey("save_slot")) { // Load game from launcher/command line if requested int gameToLoad = ConfMan.getInt("save_slot"); // Attempt to load the game. Common::Error loadError = _saveLoad->loadGame(gameToLoad); if (loadError.getCode() != Common::kNoError) { return loadError; } } else { // Otherwise, start us off at aspit's card 1 (the main menu) changeToStack(kStackAspit); changeToCard(1); } while (!hasGameEnded()) doFrame(); return Common::kNoError; }
void MohawkEngine_Riven::checkInventoryClick() { Common::Point mousePos = _eventMan->getMousePos(); // Don't even bother. We're not in the inventory portion of the screen. if (mousePos.y < 392) return; // In the demo, check if we've clicked the exit button if (getFeatures() & GF_DEMO) { if (g_demoExitRect->contains(mousePos)) { if (_curStack == kStackAspit && _curCard == 1) { // From the main menu, go to the "quit" screen changeToCard(12); } else if (_curStack == kStackAspit && _curCard == 12) { // From the "quit" screen, just quit _gameOver = true; } else { // Otherwise, return to the main menu if (_curStack != kStackAspit) changeToStack(kStackAspit); changeToCard(1); } } return; } // No inventory shown on aspit if (_curStack == kStackAspit) return; // Set the return stack/card id's. _vars["returnstackid"] = _curStack; _vars["returncardid"] = _curCard; // See RivenGraphics::showInventory() for an explanation // of the variables' meanings. bool hasCathBook = _vars["acathbook"] != 0; bool hasTrapBook = _vars["atrapbook"] != 0; // Go to the book if a hotspot contains the mouse if (!hasCathBook) { if (g_atrusJournalRect1->contains(mousePos)) { _gfx->hideInventory(); changeToStack(kStackAspit); changeToCard(5); } } else if (!hasTrapBook) { if (g_atrusJournalRect2->contains(mousePos)) { _gfx->hideInventory(); changeToStack(kStackAspit); changeToCard(5); } else if (g_cathJournalRect2->contains(mousePos)) { _gfx->hideInventory(); changeToStack(kStackAspit); changeToCard(6); } } else { if (g_atrusJournalRect3->contains(mousePos)) { _gfx->hideInventory(); changeToStack(kStackAspit); changeToCard(5); } else if (g_cathJournalRect3->contains(mousePos)) { _gfx->hideInventory(); changeToStack(kStackAspit); changeToCard(6); } else if (g_trapBookRect3->contains(mousePos)) { _gfx->hideInventory(); changeToStack(kStackAspit); changeToCard(7); } } }
void MohawkEngine_Riven::handleEvents() { // Update background running things checkTimer(); bool needsUpdate = _gfx->runScheduledWaterEffects(); needsUpdate |= _video->updateMovies(); Common::Event event; while (_eventMan->pollEvent(event)) { switch (event.type) { case Common::EVENT_MOUSEMOVE: checkHotspotChange(); if (!(getFeatures() & GF_DEMO)) { // Check to show the inventory, but it is always "showing" in the demo if (_eventMan->getMousePos().y >= 392) _gfx->showInventory(); else _gfx->hideInventory(); } needsUpdate = true; break; case Common::EVENT_LBUTTONDOWN: if (_curHotspot >= 0) { checkSunnerAlertClick(); runHotspotScript(_curHotspot, kMouseDownScript); } break; case Common::EVENT_LBUTTONUP: // See RivenScript::switchCard() for more information on why we sometimes // disable the next up event. if (!_ignoreNextMouseUp) { if (_curHotspot >= 0) runHotspotScript(_curHotspot, kMouseUpScript); else checkInventoryClick(); } _ignoreNextMouseUp = false; break; case Common::EVENT_KEYDOWN: switch (event.kbd.keycode) { case Common::KEYCODE_d: if (event.kbd.flags & Common::KBD_CTRL) { _console->attach(); _console->onFrame(); } break; case Common::KEYCODE_SPACE: pauseGame(); break; case Common::KEYCODE_F4: _showHotspots = !_showHotspots; if (_showHotspots) { for (uint16 i = 0; i < _hotspotCount; i++) _gfx->drawRect(_hotspots[i].rect, _hotspots[i].enabled); needsUpdate = true; } else refreshCard(); break; case Common::KEYCODE_F5: runDialog(*_optionsDialog); updateZipMode(); break; case Common::KEYCODE_r: // Return to the main menu in the demo on ctrl+r if (event.kbd.flags & Common::KBD_CTRL && getFeatures() & GF_DEMO) { if (_curStack != kStackAspit) changeToStack(kStackAspit); changeToCard(1); } break; case Common::KEYCODE_p: // Play the intro videos in the demo on ctrl+p if (event.kbd.flags & Common::KBD_CTRL && getFeatures() & GF_DEMO) { if (_curStack != kStackAspit) changeToStack(kStackAspit); changeToCard(6); } break; default: break; } break; default: break; } } if (_curHotspot >= 0) runHotspotScript(_curHotspot, kMouseInsideScript); // Update the screen if we need to if (needsUpdate) _system->updateScreen(); // Cut down on CPU usage _system->delayMillis(10); }
Common::Error MohawkEngine_Riven::run() { MohawkEngine::run(); // Let's try to open the installer file (it holds extras.mhk) // Though, we set a low priority to prefer the extracted version if (_installerArchive.open("arcriven.z")) SearchMan.add("arcriven.z", &_installerArchive, 0, false); _gfx = new RivenGraphics(this); _console = new RivenConsole(this); _saveLoad = new RivenSaveLoad(this, _saveFileMan); _externalScriptHandler = new RivenExternal(this); _optionsDialog = new RivenOptionsDialog(this); _scriptMan = new RivenScriptManager(this); _rnd = new Common::RandomSource("riven"); // Create the cursor manager if (Common::File::exists("rivendmo.exe")) _cursor = new PECursorManager("rivendmo.exe"); else if (Common::File::exists("riven.exe")) _cursor = new PECursorManager("riven.exe"); else // last resort: try the Mac executable _cursor = new MacCursorManager("Riven"); initVars(); // We need to have a cursor source, or the game won't work if (!_cursor->hasSource()) { Common::String message = "You're missing a Riven executable. The Windows executable is 'riven.exe' or 'rivendmo.exe'. "; message += "Using the 'arcriven.z' installer file also works. In addition, you can use the Mac 'Riven' executable."; GUIErrorMessage(message); warning("%s", message.c_str()); return Common::kNoGameDataFoundError; } // Open extras.mhk for common images _extrasFile = new MohawkArchive(); // We need extras.mhk for inventory images, marble images, and credits images if (!_extrasFile->openFile("extras.mhk")) { Common::String message = "You're missing 'extras.mhk'. Using the 'arcriven.z' installer file also works."; GUIErrorMessage(message); warning("%s", message.c_str()); return Common::kNoGameDataFoundError; } // Set the transition speed _gfx->setTransitionSpeed(_vars["transitionmode"]); // Start at main cursor _cursor->setCursor(kRivenMainCursor); _cursor->showCursor(); _system->updateScreen(); // Let's begin, shall we? if (getFeatures() & GF_DEMO) { // Start the demo off with the videos changeToStack(kStackAspit); changeToCard(6); } else if (ConfMan.hasKey("save_slot")) { // Load game from launcher/command line if requested uint32 gameToLoad = ConfMan.getInt("save_slot"); Common::StringArray savedGamesList = _saveLoad->generateSaveGameList(); if (gameToLoad > savedGamesList.size()) error ("Could not find saved game"); // Attempt to load the game. On failure, just send us to the main menu. if (_saveLoad->loadGame(savedGamesList[gameToLoad]).getCode() != Common::kNoError) { changeToStack(kStackAspit); changeToCard(1); } } else { // Otherwise, start us off at aspit's card 1 (the main menu) changeToStack(kStackAspit); changeToCard(1); } while (!_gameOver && !shouldQuit()) handleEvents(); return Common::kNoError; }