mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-09 19:32:11 +00:00
d7b511b98b
Like the original the game loop returns to the main menu after the credits end. The variable states are reset and the player can start a new game or load an old one.
255 lines
8.1 KiB
C++
255 lines
8.1 KiB
C++
/* 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? </sarcasm>
|
|
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) {
|
|
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
|