Initial commit
This commit is contained in:
253
engines/mohawk/riven_stacks/ospit.cpp
Normal file
253
engines/mohawk/riven_stacks/ospit.cpp
Normal file
@@ -0,0 +1,253 @@
|
||||
/* 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#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
|
||||
Reference in New Issue
Block a user