/* 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 "mohawk/riven_stacks/ospit.h" #include "mohawk/cursors.h" #include "mohawk/riven.h" #include "mohawk/riven_card.h" #include "mohawk/riven_graphics.h" #include "mohawk/riven_inventory.h" #include "mohawk/riven_video.h" namespace Mohawk { namespace RivenStacks { OSpit::OSpit(MohawkEngine_Riven *vm) : RivenStack(vm, kStackOspit) { REGISTER_COMMAND(OSpit, xorollcredittime); REGISTER_COMMAND(OSpit, xbookclick); REGISTER_COMMAND(OSpit, xooffice30_closebook); REGISTER_COMMAND(OSpit, xobedroom5_closedrawer); REGISTER_COMMAND(OSpit, xogehnopenbook); REGISTER_COMMAND(OSpit, xogehnbookprevpage); REGISTER_COMMAND(OSpit, xogehnbooknextpage); REGISTER_COMMAND(OSpit, xgwatch); } void OSpit::xorollcredittime(const ArgumentArray &args) { // WORKAROUND: The special change stuff only handles one destination and it would // be messy to modify the way that currently works. If we use the trap book on Tay, // we should be using the Tay end game sequences. if (_vm->_vars["returnstackid"] == kStackRspit) { RivenScriptPtr script = _vm->_scriptMan->createScriptWithCommand( new RivenStackChangeCommand(_vm, kStackRspit, 0x3338, true, false)); _vm->_scriptMan->runScript(script, false); return; } // You used the trap book... why? What were you thinking? uint32 gehnState = _vm->_vars["agehn"]; if (gehnState == 0) // Gehn who? runEndGame(1, 9500, 1225); else if (gehnState == 4) // You freed him? Are you kidding me? runEndGame(2, 12000, 558); else // You already spoke with Gehn. What were you thinking? runEndGame(3, 8000, 857); } void OSpit::xbookclick(const ArgumentArray &args) { // Let's hook onto our video RivenVideo *video = _vm->_video->getSlot(args[0]); // Convert from the standard QuickTime base time to milliseconds // The values are in terms of 1/600 of a second. // Have I said how much I just *love* QuickTime? uint32 startTime = args[1] * 1000 / 600; uint32 endTime = args[2] * 1000 / 600; // Track down our hotspot Common::String hotspotName = Common::String::format("touchBook%d", args[3]); RivenHotspot *hotspot = _vm->getCard()->getHotspotByName(hotspotName); Common::Rect hotspotRect = hotspot->getRect(); debug(0, "xbookclick:"); debug(0, "\tVideo Code = %d", args[0]); debug(0, "\tStart Time = %dms", startTime); debug(0, "\tEnd Time = %dms", endTime); debug(0, "\tHotspot = %d -> %s", args[3], hotspotName.c_str()); // Just let the video play while we wait until Gehn opens the trap book for us while (video->getTime() < startTime && !_vm->hasGameEnded()) { _vm->doFrame(); } // Break out if we're quitting if (_vm->hasGameEnded()) return; // OK, Gehn has opened the trap book and has asked us to go in. Let's watch // and see what the player will do... while (video->getTime() < endTime && !_vm->hasGameEnded()) { if (hotspotRect.contains(getMousePosition())) _vm->_cursor->setCursor(kRivenOpenHandCursor); else _vm->_cursor->setCursor(kRivenMainCursor); if (mouseIsDown()) { if (hotspotRect.contains(getMousePosition())) { // OK, we've used the trap book! We go for ride lady! _vm->_video->closeVideos(); // Stop all videos _vm->_cursor->setCursor(kRivenHideCursor); // Hide the cursor _vm->_gfx->scheduleTransition(kRivenTransitionBlend); _vm->getCard()->drawPicture(3); // Black out the screen _vm->_sound->playSound(0); // Play the link sound _vm->delay(12000); _vm->getCard()->playMovie(7); // Activate Gehn Link Video RivenVideo *linkVideo = _vm->_video->openSlot(1); // Play Gehn Link Video linkVideo->playBlocking(); _vm->_vars["ocage"] = 1; _vm->_vars["agehn"] = 4; // Set Gehn to the trapped state _vm->_vars["atrapbook"] = 1; // We've got the trap book again _vm->_sound->playSound(0); // Play the link sound again _vm->_gfx->scheduleTransition(kRivenTransitionBlend); _vm->changeToCard(_vm->getStack()->getCardStackId(0x2885)); // Link out! _vm->_inventory->forceVisible(true); _vm->delay(2000); _vm->_inventory->forceVisible(false); _vm->_scriptMan->stopAllScripts(); // Stop all running scripts (so we don't remain in the cage) return; } } _vm->doFrame(); } // Break out if we're quitting if (_vm->hasGameEnded()) return; // If there was no click and this is the third time Gehn asks us to // use the trap book, he will shoot the player. Dead on arrival. // Run the credits from here. if (_vm->_vars["agehn"] == 3) { _vm->_scriptMan->stopAllScripts(); runCredits(args[0], 5000, 995); return; } // There was no click, so just play the rest of the video. video->playBlocking(); } void OSpit::xooffice30_closebook(const ArgumentArray &args) { // Close the blank linking book if it's open uint32 &book = _vm->_vars["odeskbook"]; if (book != 1) return; // Set the variable to be "closed" book = 0; // Play the movie RivenVideo *video = _vm->_video->openSlot(1); video->seek(0); video->playBlocking(); // Set the hotspots into their correct states RivenHotspot *closeBook = _vm->getCard()->getHotspotByName("closeBook"); RivenHotspot *nullHotspot = _vm->getCard()->getHotspotByName("null"); RivenHotspot *openBook = _vm->getCard()->getHotspotByName("openBook"); closeBook->enable(false); nullHotspot->enable(false); openBook->enable(true); _vm->getCard()->drawPicture(1); } void OSpit::xobedroom5_closedrawer(const ArgumentArray &args) { // Close the drawer if open when clicking on the journal. RivenVideo *video = _vm->_video->openSlot(2); video->playBlocking(); _vm->_vars["ostanddrawer"] = 0; } void OSpit::xogehnopenbook(const ArgumentArray &args) { _vm->getCard()->drawPicture(_vm->_vars["ogehnpage"]); } void OSpit::xogehnbookprevpage(const ArgumentArray &args) { // Get the page variable uint32 &page = _vm->_vars["ogehnpage"]; // Keep turning pages while the mouse is pressed while (keepTurningPages()) { // Check for the first page if (page == 1) return; // Update the page number page--; pageTurn(kRivenTransitionWipeRight); _vm->getCard()->drawPicture(page); _vm->doFrame(); waitForPageTurnSound(); } } void OSpit::xogehnbooknextpage(const ArgumentArray &args) { // Get the page variable uint32 &page = _vm->_vars["ogehnpage"]; // Keep turning pages while the mouse is pressed while (keepTurningPages()) { // Check for the last page if (page == 13) return; // Update the page number page++; pageTurn(kRivenTransitionWipeLeft); _vm->getCard()->drawPicture(page); _vm->doFrame(); waitForPageTurnSound(); } } void OSpit::xgwatch(const ArgumentArray &args) { // Hide the cursor _vm->_cursor->setCursor(kRivenHideCursor); uint32 prisonCombo = _vm->_vars["pcorrectorder"]; byte curSound = 0; while (curSound < 5 && !_vm->hasGameEnded()) { // Play a sound every half second _vm->_sound->playSound(getComboDigit(prisonCombo, curSound) + 13); _vm->delay(500); curSound++; } // Now play the video for the watch _vm->getCard()->playMovie(1); RivenVideo *watchVideo = _vm->_video->openSlot(1); watchVideo->playBlocking(); } } // End of namespace RivenStacks } // End of namespace Mohawk