diff options
Diffstat (limited to 'engines/mohawk')
93 files changed, 2007 insertions, 1308 deletions
diff --git a/engines/mohawk/POTFILES b/engines/mohawk/POTFILES new file mode 100644 index 0000000000..54d9dcaa3a --- /dev/null +++ b/engines/mohawk/POTFILES @@ -0,0 +1,3 @@ +engines/mohawk/dialogs.cpp +engines/mohawk/myst.cpp +engines/mohawk/riven.cpp diff --git a/engines/mohawk/bitmap.cpp b/engines/mohawk/bitmap.cpp index bc19fe2d3e..6435daf46f 100644 --- a/engines/mohawk/bitmap.cpp +++ b/engines/mohawk/bitmap.cpp @@ -8,12 +8,12 @@ * 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. @@ -29,7 +29,7 @@ #include "common/substream.h" #include "common/system.h" #include "common/textconsole.h" -#include "graphics/decoders/bmp.h" +#include "image/bmp.h" namespace Mohawk { @@ -580,7 +580,7 @@ void MohawkBitmap::drawRaw(Graphics::Surface *surface) { _data->skip(_header.bytesPerRow - _header.width * 3); } else { - _data->read((byte *)surface->pixels + y * _header.width, _header.width); + _data->read((byte *)surface->getBasePtr(0, y), _header.width); _data->skip(_header.bytesPerRow - _header.width); } } @@ -599,7 +599,7 @@ void MohawkBitmap::drawRLE8(Graphics::Surface *surface, bool isLE) { for (uint16 i = 0; i < _header.height; i++) { uint16 rowByteCount = isLE ? _data->readUint16LE() : _data->readUint16BE(); int32 startPos = _data->pos(); - byte *dst = (byte *)surface->pixels + i * _header.width; + byte *dst = (byte *)surface->getBasePtr(0, i); int16 remaining = _header.width; while (remaining > 0) { @@ -635,7 +635,7 @@ MohawkSurface *MystBitmap::decodeImage(Common::SeekableReadStream *stream) { Common::SeekableReadStream *bmpStream = decompressLZ(stream, uncompressedSize); delete stream; - Graphics::BitmapDecoder bitmapDecoder; + Image::BitmapDecoder bitmapDecoder; if (!bitmapDecoder.loadStream(*bmpStream)) error("Could not decode Myst bitmap"); @@ -779,7 +779,7 @@ MohawkSurface *DOSBitmap::decodeImage(Common::SeekableReadStream *stream) { } Graphics::Surface *surface = createSurface(_header.width, _header.height); - memset(surface->pixels, 0, _header.width * _header.height); + memset(surface->getPixels(), 0, _header.width * _header.height); // Expand the <8bpp data to one byte per pixel switch (getBitsPerPixel()) { @@ -801,7 +801,7 @@ MohawkSurface *DOSBitmap::decodeImage(Common::SeekableReadStream *stream) { void DOSBitmap::expandMonochromePlane(Graphics::Surface *surface, Common::SeekableReadStream *rawStream) { assert(surface->format.bytesPerPixel == 1); - byte *dst = (byte *)surface->pixels; + byte *dst = (byte *)surface->getPixels(); // Expand the 8 pixels in a byte into a full byte per pixel @@ -830,7 +830,7 @@ void DOSBitmap::expandEGAPlanes(Graphics::Surface *surface, Common::SeekableRead // Note that the image is in EGA planar form and not just standard 4bpp // This seems to contradict the PoP specs which seem to do something else - byte *dst = (byte *)surface->pixels; + byte *dst = (byte *)surface->getPixels(); for (uint32 i = 0; i < surface->h; i++) { uint x = 0; diff --git a/engines/mohawk/bitmap.h b/engines/mohawk/bitmap.h index 73c117b5c7..ea8664f39d 100644 --- a/engines/mohawk/bitmap.h +++ b/engines/mohawk/bitmap.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/configure.engine b/engines/mohawk/configure.engine new file mode 100644 index 0000000000..47402c4560 --- /dev/null +++ b/engines/mohawk/configure.engine @@ -0,0 +1,6 @@ +# This file is included from the main "configure" script +# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps] +add_engine mohawk "Mohawk" yes "cstime myst riven" "Living Books" +add_engine cstime "Where in Time is Carmen Sandiego?" no +add_engine riven "Riven: The Sequel to Myst" no "" "" "16bit" +add_engine myst "Myst" no diff --git a/engines/mohawk/console.cpp b/engines/mohawk/console.cpp index ce22132cee..9b5bae78be 100644 --- a/engines/mohawk/console.cpp +++ b/engines/mohawk/console.cpp @@ -8,12 +8,12 @@ * 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. @@ -49,20 +49,20 @@ namespace Mohawk { #ifdef ENABLE_MYST MystConsole::MystConsole(MohawkEngine_Myst *vm) : GUI::Debugger(), _vm(vm) { - DCmd_Register("changeCard", WRAP_METHOD(MystConsole, Cmd_ChangeCard)); - DCmd_Register("curCard", WRAP_METHOD(MystConsole, Cmd_CurCard)); - DCmd_Register("var", WRAP_METHOD(MystConsole, Cmd_Var)); - DCmd_Register("curStack", WRAP_METHOD(MystConsole, Cmd_CurStack)); - DCmd_Register("changeStack", WRAP_METHOD(MystConsole, Cmd_ChangeStack)); - DCmd_Register("drawImage", WRAP_METHOD(MystConsole, Cmd_DrawImage)); - DCmd_Register("drawRect", WRAP_METHOD(MystConsole, Cmd_DrawRect)); - DCmd_Register("setResourceEnable", WRAP_METHOD(MystConsole, Cmd_SetResourceEnable)); - DCmd_Register("playSound", WRAP_METHOD(MystConsole, Cmd_PlaySound)); - DCmd_Register("stopSound", WRAP_METHOD(MystConsole, Cmd_StopSound)); - DCmd_Register("playMovie", WRAP_METHOD(MystConsole, Cmd_PlayMovie)); - DCmd_Register("disableInitOpcodes", WRAP_METHOD(MystConsole, Cmd_DisableInitOpcodes)); - DCmd_Register("cache", WRAP_METHOD(MystConsole, Cmd_Cache)); - DCmd_Register("resources", WRAP_METHOD(MystConsole, Cmd_Resources)); + registerCmd("changeCard", WRAP_METHOD(MystConsole, Cmd_ChangeCard)); + registerCmd("curCard", WRAP_METHOD(MystConsole, Cmd_CurCard)); + registerCmd("var", WRAP_METHOD(MystConsole, Cmd_Var)); + registerCmd("curStack", WRAP_METHOD(MystConsole, Cmd_CurStack)); + registerCmd("changeStack", WRAP_METHOD(MystConsole, Cmd_ChangeStack)); + registerCmd("drawImage", WRAP_METHOD(MystConsole, Cmd_DrawImage)); + registerCmd("drawRect", WRAP_METHOD(MystConsole, Cmd_DrawRect)); + registerCmd("setResourceEnable", WRAP_METHOD(MystConsole, Cmd_SetResourceEnable)); + registerCmd("playSound", WRAP_METHOD(MystConsole, Cmd_PlaySound)); + registerCmd("stopSound", WRAP_METHOD(MystConsole, Cmd_StopSound)); + registerCmd("playMovie", WRAP_METHOD(MystConsole, Cmd_PlayMovie)); + registerCmd("disableInitOpcodes", WRAP_METHOD(MystConsole, Cmd_DisableInitOpcodes)); + registerCmd("cache", WRAP_METHOD(MystConsole, Cmd_Cache)); + registerCmd("resources", WRAP_METHOD(MystConsole, Cmd_Resources)); } MystConsole::~MystConsole() { @@ -70,7 +70,7 @@ MystConsole::~MystConsole() { bool MystConsole::Cmd_ChangeCard(int argc, const char **argv) { if (argc < 2) { - DebugPrintf("Usage: changeCard <card>\n"); + debugPrintf("Usage: changeCard <card>\n"); return true; } @@ -81,20 +81,20 @@ bool MystConsole::Cmd_ChangeCard(int argc, const char **argv) { } bool MystConsole::Cmd_CurCard(int argc, const char **argv) { - DebugPrintf("Current Card: %d\n", _vm->getCurCard()); + debugPrintf("Current Card: %d\n", _vm->getCurCard()); return true; } bool MystConsole::Cmd_Var(int argc, const char **argv) { if (argc == 1) { - DebugPrintf("Usage: var <var> (<value>)\n"); + debugPrintf("Usage: var <var> (<value>)\n"); return true; } if (argc > 2) _vm->_scriptParser->setVarValue((uint16)atoi(argv[1]), (uint16)atoi(argv[2])); - DebugPrintf("%d = %d\n", (uint16)atoi(argv[1]), _vm->_scriptParser->getVar((uint16)atoi(argv[1]))); + debugPrintf("%d = %d\n", (uint16)atoi(argv[1]), _vm->_scriptParser->getVar((uint16)atoi(argv[1]))); return true; } @@ -130,19 +130,19 @@ static const uint16 default_start_card[12] = { }; bool MystConsole::Cmd_CurStack(int argc, const char **argv) { - DebugPrintf("Current Stack: %s\n", mystStackNames[_vm->getCurStack()]); + debugPrintf("Current Stack: %s\n", mystStackNames[_vm->getCurStack()]); return true; } bool MystConsole::Cmd_ChangeStack(int argc, const char **argv) { if (argc != 2 && argc != 3) { - DebugPrintf("Usage: changeStack <stack> [<card>]\n\n"); - DebugPrintf("Stacks:\n=======\n"); + debugPrintf("Usage: changeStack <stack> [<card>]\n\n"); + debugPrintf("Stacks:\n=======\n"); for (byte i = 0; i < ARRAYSIZE(mystStackNames); i++) - DebugPrintf(" %s\n", mystStackNames[i]); + debugPrintf(" %s\n", mystStackNames[i]); - DebugPrintf("\n"); + debugPrintf("\n"); return true; } @@ -156,7 +156,7 @@ bool MystConsole::Cmd_ChangeStack(int argc, const char **argv) { } if (!stackNum) { - DebugPrintf("\'%s\' is not a stack name!\n", argv[1]); + debugPrintf("\'%s\' is not a stack name!\n", argv[1]); return true; } @@ -177,7 +177,7 @@ bool MystConsole::Cmd_ChangeStack(int argc, const char **argv) { bool MystConsole::Cmd_DrawImage(int argc, const char **argv) { if (argc != 2 && argc != 6) { - DebugPrintf("Usage: drawImage <image> [<left> <top> <right> <bottom>]\n"); + debugPrintf("Usage: drawImage <image> [<left> <top> <right> <bottom>]\n"); return true; } @@ -195,8 +195,8 @@ bool MystConsole::Cmd_DrawImage(int argc, const char **argv) { bool MystConsole::Cmd_DrawRect(int argc, const char **argv) { if (argc != 5 && argc != 2) { - DebugPrintf("Usage: drawRect <left> <top> <right> <bottom>\n"); - DebugPrintf("Usage: drawRect <resource id>\n"); + debugPrintf("Usage: drawRect <left> <top> <right> <bottom>\n"); + debugPrintf("Usage: drawRect <resource id>\n"); return true; } @@ -213,7 +213,7 @@ bool MystConsole::Cmd_DrawRect(int argc, const char **argv) { bool MystConsole::Cmd_SetResourceEnable(int argc, const char **argv) { if (argc < 3) { - DebugPrintf("Usage: setResourceEnable <resource id> <bool>\n"); + debugPrintf("Usage: setResourceEnable <resource id> <bool>\n"); return true; } @@ -223,7 +223,7 @@ bool MystConsole::Cmd_SetResourceEnable(int argc, const char **argv) { bool MystConsole::Cmd_PlaySound(int argc, const char **argv) { if (argc == 1) { - DebugPrintf("Usage: playSound <value>\n"); + debugPrintf("Usage: playSound <value>\n"); return true; } @@ -234,7 +234,7 @@ bool MystConsole::Cmd_PlaySound(int argc, const char **argv) { } bool MystConsole::Cmd_StopSound(int argc, const char **argv) { - DebugPrintf("Stopping Sound\n"); + debugPrintf("Stopping Sound\n"); _vm->_sound->stopSound(); @@ -243,14 +243,14 @@ bool MystConsole::Cmd_StopSound(int argc, const char **argv) { bool MystConsole::Cmd_PlayMovie(int argc, const char **argv) { if (argc < 2) { - DebugPrintf("Usage: playMovie <name> [<stack>] [<left> <top>]\n"); - DebugPrintf("NOTE: The movie will play *once* in the background.\n"); + debugPrintf("Usage: playMovie <name> [<stack>] [<left> <top>]\n"); + debugPrintf("NOTE: The movie will play *once* in the background.\n"); return true; } - int8 stackNum = 0; - + Common::String fileName; if (argc == 3 || argc > 4) { + int8 stackNum = 0; for (byte i = 1; i <= ARRAYSIZE(mystStackNames); i++) if (!scumm_stricmp(argv[2], mystStackNames[i - 1])) { stackNum = i; @@ -258,26 +258,37 @@ bool MystConsole::Cmd_PlayMovie(int argc, const char **argv) { } if (!stackNum) { - DebugPrintf("\'%s\' is not a stack name!\n", argv[2]); + debugPrintf("\'%s\' is not a stack name!\n", argv[2]); return true; } + + fileName = _vm->wrapMovieFilename(argv[1], stackNum - 1); + } else { + fileName = argv[1]; } - if (argc == 2) - _vm->_video->playMovie(argv[1], 0, 0); - else if (argc == 3) - _vm->_video->playMovie(_vm->wrapMovieFilename(argv[1], stackNum - 1), 0, 0); - else if (argc == 4) - _vm->_video->playMovie(argv[1], atoi(argv[2]), atoi(argv[3])); - else - _vm->_video->playMovie(_vm->wrapMovieFilename(argv[1], stackNum - 1), atoi(argv[3]), atoi(argv[4])); + VideoHandle handle = _vm->_video->playMovie(fileName); + if (!handle) { + debugPrintf("Failed to open movie '%s'\n", fileName.c_str()); + return true; + } + + if (argc == 4) { + handle->setX(atoi(argv[2])); + handle->setY(atoi(argv[3])); + } else if (argc > 4) { + handle->setX(atoi(argv[3])); + handle->setY(atoi(argv[4])); + } else { + handle->center(); + } return false; } bool MystConsole::Cmd_DisableInitOpcodes(int argc, const char **argv) { if (argc != 1) { - DebugPrintf("Usage: disableInitOpcodes\n"); + debugPrintf("Usage: disableInitOpcodes\n"); return true; } @@ -289,7 +300,7 @@ bool MystConsole::Cmd_DisableInitOpcodes(int argc, const char **argv) { bool MystConsole::Cmd_Cache(int argc, const char **argv) { if (argc > 2) { - DebugPrintf("Usage: cache on/off - Omit parameter to get current state\n"); + debugPrintf("Usage: cache on/off - Omit parameter to get current state\n"); return true; } @@ -304,15 +315,15 @@ bool MystConsole::Cmd_Cache(int argc, const char **argv) { _vm->setCacheState(state); } - DebugPrintf("Cache: %s\n", state ? "Enabled" : "Disabled"); + debugPrintf("Cache: %s\n", state ? "Enabled" : "Disabled"); return true; } bool MystConsole::Cmd_Resources(int argc, const char **argv) { - DebugPrintf("Resources in card %d:\n", _vm->getCurCard()); + debugPrintf("Resources in card %d:\n", _vm->getCurCard()); for (uint i = 0; i < _vm->_resources.size(); i++) { - DebugPrintf("#%2d %s\n", i, _vm->_resources[i]->describe().c_str()); + debugPrintf("#%2d %s\n", i, _vm->_resources[i]->describe().c_str()); } return true; @@ -323,21 +334,21 @@ bool MystConsole::Cmd_Resources(int argc, const char **argv) { #ifdef ENABLE_RIVEN RivenConsole::RivenConsole(MohawkEngine_Riven *vm) : GUI::Debugger(), _vm(vm) { - DCmd_Register("changeCard", WRAP_METHOD(RivenConsole, Cmd_ChangeCard)); - DCmd_Register("curCard", WRAP_METHOD(RivenConsole, Cmd_CurCard)); - DCmd_Register("var", WRAP_METHOD(RivenConsole, Cmd_Var)); - DCmd_Register("playSound", WRAP_METHOD(RivenConsole, Cmd_PlaySound)); - DCmd_Register("playSLST", WRAP_METHOD(RivenConsole, Cmd_PlaySLST)); - DCmd_Register("stopSound", WRAP_METHOD(RivenConsole, Cmd_StopSound)); - DCmd_Register("curStack", WRAP_METHOD(RivenConsole, Cmd_CurStack)); - DCmd_Register("changeStack", WRAP_METHOD(RivenConsole, Cmd_ChangeStack)); - DCmd_Register("hotspots", WRAP_METHOD(RivenConsole, Cmd_Hotspots)); - DCmd_Register("zipMode", WRAP_METHOD(RivenConsole, Cmd_ZipMode)); - DCmd_Register("dumpScript", WRAP_METHOD(RivenConsole, Cmd_DumpScript)); - DCmd_Register("listZipCards", WRAP_METHOD(RivenConsole, Cmd_ListZipCards)); - DCmd_Register("getRMAP", WRAP_METHOD(RivenConsole, Cmd_GetRMAP)); - DCmd_Register("combos", WRAP_METHOD(RivenConsole, Cmd_Combos)); - DCmd_Register("sliderState", WRAP_METHOD(RivenConsole, Cmd_SliderState)); + registerCmd("changeCard", WRAP_METHOD(RivenConsole, Cmd_ChangeCard)); + registerCmd("curCard", WRAP_METHOD(RivenConsole, Cmd_CurCard)); + registerCmd("var", WRAP_METHOD(RivenConsole, Cmd_Var)); + registerCmd("playSound", WRAP_METHOD(RivenConsole, Cmd_PlaySound)); + registerCmd("playSLST", WRAP_METHOD(RivenConsole, Cmd_PlaySLST)); + registerCmd("stopSound", WRAP_METHOD(RivenConsole, Cmd_StopSound)); + registerCmd("curStack", WRAP_METHOD(RivenConsole, Cmd_CurStack)); + registerCmd("changeStack", WRAP_METHOD(RivenConsole, Cmd_ChangeStack)); + registerCmd("hotspots", WRAP_METHOD(RivenConsole, Cmd_Hotspots)); + registerCmd("zipMode", WRAP_METHOD(RivenConsole, Cmd_ZipMode)); + registerCmd("dumpScript", WRAP_METHOD(RivenConsole, Cmd_DumpScript)); + registerCmd("listZipCards", WRAP_METHOD(RivenConsole, Cmd_ListZipCards)); + registerCmd("getRMAP", WRAP_METHOD(RivenConsole, Cmd_GetRMAP)); + registerCmd("combos", WRAP_METHOD(RivenConsole, Cmd_Combos)); + registerCmd("sliderState", WRAP_METHOD(RivenConsole, Cmd_SliderState)); } RivenConsole::~RivenConsole() { @@ -346,7 +357,7 @@ RivenConsole::~RivenConsole() { bool RivenConsole::Cmd_ChangeCard(int argc, const char **argv) { if (argc < 2) { - DebugPrintf("Usage: changeCard <card>\n"); + debugPrintf("Usage: changeCard <card>\n"); return true; } @@ -358,19 +369,19 @@ bool RivenConsole::Cmd_ChangeCard(int argc, const char **argv) { } bool RivenConsole::Cmd_CurCard(int argc, const char **argv) { - DebugPrintf("Current Card: %d\n", _vm->getCurCard()); + debugPrintf("Current Card: %d\n", _vm->getCurCard()); return true; } bool RivenConsole::Cmd_Var(int argc, const char **argv) { if (argc == 1) { - DebugPrintf("Usage: var <var name> (<value>)\n"); + debugPrintf("Usage: var <var name> (<value>)\n"); return true; } if (!_vm->_vars.contains(argv[1])) { - DebugPrintf("Unknown variable '%s'\n", argv[1]); + debugPrintf("Unknown variable '%s'\n", argv[1]); return true; } @@ -379,13 +390,13 @@ bool RivenConsole::Cmd_Var(int argc, const char **argv) { if (argc > 2) var = (uint32)atoi(argv[2]); - DebugPrintf("%s = %d\n", argv[1], var); + debugPrintf("%s = %d\n", argv[1], var); return true; } bool RivenConsole::Cmd_PlaySound(int argc, const char **argv) { if (argc < 2) { - DebugPrintf("Usage: playSound <value>\n"); + debugPrintf("Usage: playSound <value>\n"); return true; } @@ -397,7 +408,7 @@ bool RivenConsole::Cmd_PlaySound(int argc, const char **argv) { bool RivenConsole::Cmd_PlaySLST(int argc, const char **argv) { if (argc < 2) { - DebugPrintf("Usage: playSLST <slst index> <card, default = current>\n"); + debugPrintf("Usage: playSLST <slst index> <card, default = current>\n"); return true; } @@ -412,7 +423,7 @@ bool RivenConsole::Cmd_PlaySLST(int argc, const char **argv) { } bool RivenConsole::Cmd_StopSound(int argc, const char **argv) { - DebugPrintf("Stopping Sound\n"); + debugPrintf("Stopping Sound\n"); _vm->_sound->stopSound(); _vm->_sound->stopAllSLST(); @@ -420,58 +431,57 @@ bool RivenConsole::Cmd_StopSound(int argc, const char **argv) { } bool RivenConsole::Cmd_CurStack(int argc, const char **argv) { - DebugPrintf("Current Stack: %s\n", _vm->getStackName(_vm->getCurStack()).c_str()); + debugPrintf("Current Stack: %s\n", _vm->getStackName(_vm->getCurStack()).c_str()); return true; } bool RivenConsole::Cmd_ChangeStack(int argc, const char **argv) { - byte i; - if (argc < 3) { - DebugPrintf("Usage: changeStack <stack> <card>\n\n"); - DebugPrintf("Stacks:\n=======\n"); + debugPrintf("Usage: changeStack <stack> <card>\n\n"); + debugPrintf("Stacks:\n=======\n"); - for (i = 0; i <= tspit; i++) - DebugPrintf(" %s\n", _vm->getStackName(i).c_str()); + for (uint i = kStackFirst; i <= kStackLast; i++) + debugPrintf(" %s\n", _vm->getStackName(i).c_str()); - DebugPrintf("\n"); + debugPrintf("\n"); return true; } - byte stackNum = 0; + uint stack = kStackUnknown; - for (i = 1; i <= tspit + 1; i++) - if (!scumm_stricmp(argv[1], _vm->getStackName(i - 1).c_str())) { - stackNum = i; + for (uint i = kStackFirst; i <= kStackLast; i++) { + if (!scumm_stricmp(argv[1], _vm->getStackName(i).c_str())) { + stack = i; break; } + } - if (!stackNum) { - DebugPrintf("\'%s\' is not a stack name!\n", argv[1]); + if (stack == kStackUnknown) { + debugPrintf("\'%s\' is not a stack name!\n", argv[1]); return true; } - _vm->changeToStack(stackNum - 1); + _vm->changeToStack(stack); _vm->changeToCard((uint16)atoi(argv[2])); return false; } bool RivenConsole::Cmd_Hotspots(int argc, const char **argv) { - DebugPrintf("Current card (%d) has %d hotspots:\n", _vm->getCurCard(), _vm->getHotspotCount()); + debugPrintf("Current card (%d) has %d hotspots:\n", _vm->getCurCard(), _vm->getHotspotCount()); for (uint16 i = 0; i < _vm->getHotspotCount(); i++) { - DebugPrintf("Hotspot %d, index %d, BLST ID %d (", i, _vm->_hotspots[i].index, _vm->_hotspots[i].blstID); + debugPrintf("Hotspot %d, index %d, BLST ID %d (", i, _vm->_hotspots[i].index, _vm->_hotspots[i].blstID); if (_vm->_hotspots[i].enabled) - DebugPrintf("enabled"); + debugPrintf("enabled"); else - DebugPrintf("disabled"); + debugPrintf("disabled"); - DebugPrintf(") - (%d, %d, %d, %d)\n", _vm->_hotspots[i].rect.left, _vm->_hotspots[i].rect.top, _vm->_hotspots[i].rect.right, _vm->_hotspots[i].rect.bottom); - DebugPrintf(" Name = %s\n", _vm->getHotspotName(i).c_str()); + debugPrintf(") - (%d, %d, %d, %d)\n", _vm->_hotspots[i].rect.left, _vm->_hotspots[i].rect.top, _vm->_hotspots[i].rect.right, _vm->_hotspots[i].rect.bottom); + debugPrintf(" Name = %s\n", _vm->getHotspotName(i).c_str()); } return true; @@ -481,34 +491,33 @@ bool RivenConsole::Cmd_ZipMode(int argc, const char **argv) { uint32 &zipModeActive = _vm->_vars["azip"]; zipModeActive = !zipModeActive; - DebugPrintf("Zip Mode is "); - DebugPrintf(zipModeActive ? "Enabled" : "Disabled"); - DebugPrintf("\n"); + debugPrintf("Zip Mode is "); + debugPrintf(zipModeActive ? "Enabled" : "Disabled"); + debugPrintf("\n"); return true; } bool RivenConsole::Cmd_DumpScript(int argc, const char **argv) { if (argc < 4) { - DebugPrintf("Usage: dumpScript <stack> <CARD or HSPT> <card>\n"); + debugPrintf("Usage: dumpScript <stack> <CARD or HSPT> <card>\n"); return true; } uint16 oldStack = _vm->getCurStack(); + uint newStack = kStackUnknown; - byte newStack = 0; - - for (byte i = 1; i <= tspit + 1; i++) - if (!scumm_stricmp(argv[1], _vm->getStackName(i - 1).c_str())) { + for (uint i = kStackFirst; i <= kStackLast; i++) { + if (!scumm_stricmp(argv[1], _vm->getStackName(i).c_str())) { newStack = i; break; } + } - if (!newStack) { - DebugPrintf("\'%s\' is not a stack name!\n", argv[1]); + if (newStack == kStackUnknown) { + debugPrintf("\'%s\' is not a stack name!\n", argv[1]); return true; } - newStack--; _vm->changeToStack(newStack); // Load in Variable Names @@ -594,7 +603,7 @@ bool RivenConsole::Cmd_DumpScript(int argc, const char **argv) { delete hsptStream; } else { - DebugPrintf("%s doesn't have any scripts!\n", argv[2]); + debugPrintf("%s doesn't have any scripts!\n", argv[2]); } // See above for why this is printed via debugN @@ -602,18 +611,18 @@ bool RivenConsole::Cmd_DumpScript(int argc, const char **argv) { _vm->changeToStack(oldStack); - DebugPrintf("Script dump complete.\n"); + debugPrintf("Script dump complete.\n"); return true; } bool RivenConsole::Cmd_ListZipCards(int argc, const char **argv) { if (_vm->_zipModeData.size() == 0) { - DebugPrintf("No zip card data.\n"); + debugPrintf("No zip card data.\n"); } else { - DebugPrintf("Listing zip cards:\n"); + debugPrintf("Listing zip cards:\n"); for (uint32 i = 0; i < _vm->_zipModeData.size(); i++) - DebugPrintf("ID = %d, Name = %s\n", _vm->_zipModeData[i].id, _vm->_zipModeData[i].name.c_str()); + debugPrintf("ID = %d, Name = %s\n", _vm->_zipModeData[i].id, _vm->_zipModeData[i].name.c_str()); } return true; @@ -621,7 +630,7 @@ bool RivenConsole::Cmd_ListZipCards(int argc, const char **argv) { bool RivenConsole::Cmd_GetRMAP(int argc, const char **argv) { uint32 rmapCode = _vm->getCurCardRMAP(); - DebugPrintf("RMAP for %s %d = %08x\n", _vm->getStackName(_vm->getCurStack()).c_str(), _vm->getCurCard(), rmapCode); + debugPrintf("RMAP for %s %d = %08x\n", _vm->getStackName(_vm->getCurStack()).c_str(), _vm->getCurCard(), rmapCode); return true; } @@ -635,20 +644,20 @@ bool RivenConsole::Cmd_Combos(int argc, const char **argv) { uint32 prisonCombo = _vm->_vars["pcorrectorder"]; uint32 domeCombo = _vm->_vars["adomecombo"]; - DebugPrintf("Telescope Combo:\n "); + debugPrintf("Telescope Combo:\n "); for (int i = 0; i < 5; i++) - DebugPrintf("%d ", _vm->_externalScriptHandler->getComboDigit(teleCombo, i)); + debugPrintf("%d ", _vm->_externalScriptHandler->getComboDigit(teleCombo, i)); - DebugPrintf("\nPrison Combo:\n "); + debugPrintf("\nPrison Combo:\n "); for (int i = 0; i < 5; i++) - DebugPrintf("%d ", _vm->_externalScriptHandler->getComboDigit(prisonCombo, i)); + debugPrintf("%d ", _vm->_externalScriptHandler->getComboDigit(prisonCombo, i)); - DebugPrintf("\nDome Combo:\n "); + debugPrintf("\nDome Combo:\n "); for (int i = 1; i <= 25; i++) if (domeCombo & (1 << (25 - i))) - DebugPrintf("%d ", i); + debugPrintf("%d ", i); - DebugPrintf("\n"); + debugPrintf("\n"); return true; } @@ -656,17 +665,17 @@ bool RivenConsole::Cmd_SliderState(int argc, const char **argv) { if (argc > 1) _vm->_externalScriptHandler->setDomeSliderState((uint32)atoi(argv[1])); - DebugPrintf("Dome Slider State = %08x\n", _vm->_externalScriptHandler->getDomeSliderState()); + debugPrintf("Dome Slider State = %08x\n", _vm->_externalScriptHandler->getDomeSliderState()); return true; } #endif // ENABLE_RIVEN LivingBooksConsole::LivingBooksConsole(MohawkEngine_LivingBooks *vm) : GUI::Debugger(), _vm(vm) { - DCmd_Register("playSound", WRAP_METHOD(LivingBooksConsole, Cmd_PlaySound)); - DCmd_Register("stopSound", WRAP_METHOD(LivingBooksConsole, Cmd_StopSound)); - DCmd_Register("drawImage", WRAP_METHOD(LivingBooksConsole, Cmd_DrawImage)); - DCmd_Register("changePage", WRAP_METHOD(LivingBooksConsole, Cmd_ChangePage)); + registerCmd("playSound", WRAP_METHOD(LivingBooksConsole, Cmd_PlaySound)); + registerCmd("stopSound", WRAP_METHOD(LivingBooksConsole, Cmd_StopSound)); + registerCmd("drawImage", WRAP_METHOD(LivingBooksConsole, Cmd_DrawImage)); + registerCmd("changePage", WRAP_METHOD(LivingBooksConsole, Cmd_ChangePage)); } LivingBooksConsole::~LivingBooksConsole() { @@ -674,7 +683,7 @@ LivingBooksConsole::~LivingBooksConsole() { bool LivingBooksConsole::Cmd_PlaySound(int argc, const char **argv) { if (argc == 1) { - DebugPrintf("Usage: playSound <value>\n"); + debugPrintf("Usage: playSound <value>\n"); return true; } @@ -684,7 +693,7 @@ bool LivingBooksConsole::Cmd_PlaySound(int argc, const char **argv) { } bool LivingBooksConsole::Cmd_StopSound(int argc, const char **argv) { - DebugPrintf("Stopping Sound\n"); + debugPrintf("Stopping Sound\n"); _vm->_sound->stopSound(); return true; @@ -692,7 +701,7 @@ bool LivingBooksConsole::Cmd_StopSound(int argc, const char **argv) { bool LivingBooksConsole::Cmd_DrawImage(int argc, const char **argv) { if (argc == 1) { - DebugPrintf("Usage: drawImage <value>\n"); + debugPrintf("Usage: drawImage <value>\n"); return true; } @@ -703,13 +712,13 @@ bool LivingBooksConsole::Cmd_DrawImage(int argc, const char **argv) { bool LivingBooksConsole::Cmd_ChangePage(int argc, const char **argv) { if (argc < 2 || argc > 3) { - DebugPrintf("Usage: changePage <page>[.<subpage>] [<mode>]\n"); + debugPrintf("Usage: changePage <page>[.<subpage>] [<mode>]\n"); return true; } int page, subpage = 0; if (sscanf(argv[1], "%d.%d", &page, &subpage) == 0) { - DebugPrintf("Usage: changePage <page>[.<subpage>] [<mode>]\n"); + debugPrintf("Usage: changePage <page>[.<subpage>] [<mode>]\n"); return true; } LBMode mode = argc == 2 ? _vm->getCurMode() : (LBMode)atoi(argv[2]); @@ -720,21 +729,21 @@ bool LivingBooksConsole::Cmd_ChangePage(int argc, const char **argv) { if (_vm->loadPage(mode, page, subpage)) return false; } - DebugPrintf("no such page %d.%d\n", page, subpage); + debugPrintf("no such page %d.%d\n", page, subpage); return true; } #ifdef ENABLE_CSTIME CSTimeConsole::CSTimeConsole(MohawkEngine_CSTime *vm) : GUI::Debugger(), _vm(vm) { - DCmd_Register("playSound", WRAP_METHOD(CSTimeConsole, Cmd_PlaySound)); - DCmd_Register("stopSound", WRAP_METHOD(CSTimeConsole, Cmd_StopSound)); - DCmd_Register("drawImage", WRAP_METHOD(CSTimeConsole, Cmd_DrawImage)); - DCmd_Register("drawSubimage", WRAP_METHOD(CSTimeConsole, Cmd_DrawSubimage)); - DCmd_Register("changeCase", WRAP_METHOD(CSTimeConsole, Cmd_ChangeCase)); - DCmd_Register("changeScene", WRAP_METHOD(CSTimeConsole, Cmd_ChangeScene)); - DCmd_Register("caseVariable", WRAP_METHOD(CSTimeConsole, Cmd_CaseVariable)); - DCmd_Register("invItem", WRAP_METHOD(CSTimeConsole, Cmd_InvItem)); + registerCmd("playSound", WRAP_METHOD(CSTimeConsole, Cmd_PlaySound)); + registerCmd("stopSound", WRAP_METHOD(CSTimeConsole, Cmd_StopSound)); + registerCmd("drawImage", WRAP_METHOD(CSTimeConsole, Cmd_DrawImage)); + registerCmd("drawSubimage", WRAP_METHOD(CSTimeConsole, Cmd_DrawSubimage)); + registerCmd("changeCase", WRAP_METHOD(CSTimeConsole, Cmd_ChangeCase)); + registerCmd("changeScene", WRAP_METHOD(CSTimeConsole, Cmd_ChangeScene)); + registerCmd("caseVariable", WRAP_METHOD(CSTimeConsole, Cmd_CaseVariable)); + registerCmd("invItem", WRAP_METHOD(CSTimeConsole, Cmd_InvItem)); } CSTimeConsole::~CSTimeConsole() { @@ -742,7 +751,7 @@ CSTimeConsole::~CSTimeConsole() { bool CSTimeConsole::Cmd_PlaySound(int argc, const char **argv) { if (argc == 1) { - DebugPrintf("Usage: playSound <value>\n"); + debugPrintf("Usage: playSound <value>\n"); return true; } @@ -752,7 +761,7 @@ bool CSTimeConsole::Cmd_PlaySound(int argc, const char **argv) { } bool CSTimeConsole::Cmd_StopSound(int argc, const char **argv) { - DebugPrintf("Stopping Sound\n"); + debugPrintf("Stopping Sound\n"); _vm->_sound->stopSound(); return true; @@ -760,7 +769,7 @@ bool CSTimeConsole::Cmd_StopSound(int argc, const char **argv) { bool CSTimeConsole::Cmd_DrawImage(int argc, const char **argv) { if (argc == 1) { - DebugPrintf("Usage: drawImage <value>\n"); + debugPrintf("Usage: drawImage <value>\n"); return true; } @@ -771,7 +780,7 @@ bool CSTimeConsole::Cmd_DrawImage(int argc, const char **argv) { bool CSTimeConsole::Cmd_DrawSubimage(int argc, const char **argv) { if (argc < 3) { - DebugPrintf("Usage: drawSubimage <value> <subimage>\n"); + debugPrintf("Usage: drawSubimage <value> <subimage>\n"); return true; } @@ -782,7 +791,7 @@ bool CSTimeConsole::Cmd_DrawSubimage(int argc, const char **argv) { bool CSTimeConsole::Cmd_ChangeCase(int argc, const char **argv) { if (argc < 2) { - DebugPrintf("Usage: changeCase <value>\n"); + debugPrintf("Usage: changeCase <value>\n"); return true; } @@ -792,7 +801,7 @@ bool CSTimeConsole::Cmd_ChangeCase(int argc, const char **argv) { bool CSTimeConsole::Cmd_ChangeScene(int argc, const char **argv) { if (argc < 2) { - DebugPrintf("Usage: changeScene <value>\n"); + debugPrintf("Usage: changeScene <value>\n"); return true; } @@ -802,12 +811,12 @@ bool CSTimeConsole::Cmd_ChangeScene(int argc, const char **argv) { bool CSTimeConsole::Cmd_CaseVariable(int argc, const char **argv) { if (argc < 2) { - DebugPrintf("Usage: caseVariable <id> [<value>]\n"); + debugPrintf("Usage: caseVariable <id> [<value>]\n"); return true; } if (argc == 2) { - DebugPrintf("case variable %d has value %d\n", atoi(argv[1]), _vm->_caseVariable[atoi(argv[1])]); + debugPrintf("case variable %d has value %d\n", atoi(argv[1]), _vm->_caseVariable[atoi(argv[1])]); } else { _vm->_caseVariable[atoi(argv[1])] = atoi(argv[2]); } @@ -816,7 +825,7 @@ bool CSTimeConsole::Cmd_CaseVariable(int argc, const char **argv) { bool CSTimeConsole::Cmd_InvItem(int argc, const char **argv) { if (argc < 3) { - DebugPrintf("Usage: invItem <id> <0 or 1>\n"); + debugPrintf("Usage: invItem <id> <0 or 1>\n"); return true; } diff --git a/engines/mohawk/console.h b/engines/mohawk/console.h index cdb4e1bedf..af01c0d1e0 100644 --- a/engines/mohawk/console.h +++ b/engines/mohawk/console.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/cstime.cpp b/engines/mohawk/cstime.cpp index 3f9827581b..3b26378819 100644 --- a/engines/mohawk/cstime.cpp +++ b/engines/mohawk/cstime.cpp @@ -8,12 +8,12 @@ * 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. @@ -51,6 +51,15 @@ MohawkEngine_CSTime::MohawkEngine_CSTime(OSystem *syst, const MohawkGameDescript _state = kCSTStateStartup; reset(); + + _console = 0; + _gfx = 0; + _cursor = 0; + _interface = 0; + _view = 0; + _needsUpdate = false; + _case = 0; + _nextSceneId = 1; } MohawkEngine_CSTime::~MohawkEngine_CSTime() { diff --git a/engines/mohawk/cstime.h b/engines/mohawk/cstime.h index db06b9791e..f95222d3a1 100644 --- a/engines/mohawk/cstime.h +++ b/engines/mohawk/cstime.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/cstime_cases.cpp b/engines/mohawk/cstime_cases.cpp index c0a8dfc0e3..722d82a9f2 100644 --- a/engines/mohawk/cstime_cases.cpp +++ b/engines/mohawk/cstime_cases.cpp @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/cstime_cases.h b/engines/mohawk/cstime_cases.h index 1ac9abf87e..ba1231784a 100644 --- a/engines/mohawk/cstime_cases.h +++ b/engines/mohawk/cstime_cases.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/cstime_game.cpp b/engines/mohawk/cstime_game.cpp index 2e21111025..8eced701c3 100644 --- a/engines/mohawk/cstime_game.cpp +++ b/engines/mohawk/cstime_game.cpp @@ -8,12 +8,12 @@ * 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. @@ -1094,7 +1094,7 @@ void CSTimeScene::idleAmbientAnims() { bool CSTimeScene::eventIsActive() { return _vm->NISIsRunning() /* TODO || _vm->soundIsPlaying()*/ || _vm->getCurrentEventType() == kCSTimeEventWaitForClick - || _activeChar->_flappingState != 0xffff || _vm->getInterface()->getState() == 4; + || _activeChar->_flappingState != 0xffff || _vm->getInterface()->getState() == kCSTimeInterfaceDroppedInventory; } void CSTimeScene::cursorOverHotspot(uint id) { diff --git a/engines/mohawk/cstime_game.h b/engines/mohawk/cstime_game.h index 88e813c999..6c082fc4d2 100644 --- a/engines/mohawk/cstime_game.h +++ b/engines/mohawk/cstime_game.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/cstime_graphics.cpp b/engines/mohawk/cstime_graphics.cpp index 3a1452e67c..29336525da 100644 --- a/engines/mohawk/cstime_graphics.cpp +++ b/engines/mohawk/cstime_graphics.cpp @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/cstime_graphics.h b/engines/mohawk/cstime_graphics.h index 5f034f47f4..35d5882bf0 100644 --- a/engines/mohawk/cstime_graphics.h +++ b/engines/mohawk/cstime_graphics.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/cstime_ui.cpp b/engines/mohawk/cstime_ui.cpp index de7d5bde80..f3fe27a966 100644 --- a/engines/mohawk/cstime_ui.cpp +++ b/engines/mohawk/cstime_ui.cpp @@ -8,12 +8,12 @@ * 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. @@ -854,7 +854,7 @@ void CSTimeInterface::dropItemInInventory(uint16 id) { clearDialogArea(); _inventoryDisplay->show(); _inventoryDisplay->draw(); - _inventoryDisplay->setState(4); + _inventoryDisplay->setState(kCSTimeInterfaceDroppedInventory); } CSTimeHelp::CSTimeHelp(MohawkEngine_CSTime *vm) : _vm(vm) { diff --git a/engines/mohawk/cstime_ui.h b/engines/mohawk/cstime_ui.h index 27df7cac3e..47e03081d2 100644 --- a/engines/mohawk/cstime_ui.h +++ b/engines/mohawk/cstime_ui.h @@ -8,12 +8,12 @@ * 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. @@ -167,7 +167,8 @@ protected: enum CSTimeInterfaceState { kCSTimeInterfaceStateNormal = 1, kCSTimeInterfaceStateDragStart = 2, - kCSTimeInterfaceStateDragging = 3 + kCSTimeInterfaceStateDragging = 3, + kCSTimeInterfaceDroppedInventory = 4 }; class CSTimeInterface { diff --git a/engines/mohawk/cstime_view.cpp b/engines/mohawk/cstime_view.cpp index 37c418f416..7879175bb0 100644 --- a/engines/mohawk/cstime_view.cpp +++ b/engines/mohawk/cstime_view.cpp @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/cstime_view.h b/engines/mohawk/cstime_view.h index ae3283771d..0005d906f3 100644 --- a/engines/mohawk/cstime_view.h +++ b/engines/mohawk/cstime_view.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/cursors.cpp b/engines/mohawk/cursors.cpp index c7bd03678f..4b66829e6a 100644 --- a/engines/mohawk/cursors.cpp +++ b/engines/mohawk/cursors.cpp @@ -8,12 +8,12 @@ * 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. @@ -121,11 +121,15 @@ void MystCursorManager::setCursor(uint16 id) { // Myst ME stores some cursors as 24bpp images instead of 8bpp if (surface->format.bytesPerPixel == 1) { - CursorMan.replaceCursor(surface->pixels, surface->w, surface->h, hotspotX, hotspotY, 0); - CursorMan.replaceCursorPalette(mhkSurface->getPalette(), 0, 256); + CursorMan.replaceCursor(surface->getPixels(), surface->w, surface->h, hotspotX, hotspotY, 0); + + // We're using the screen palette for the original game, but we need + // to use this for any 8bpp cursor in ME. + if (_vm->getFeatures() & GF_ME) + CursorMan.replaceCursorPalette(mhkSurface->getPalette(), 0, 256); } else { Graphics::PixelFormat pixelFormat = g_system->getScreenFormat(); - CursorMan.replaceCursor(surface->pixels, surface->w, surface->h, hotspotX, hotspotY, pixelFormat.RGBToColor(255, 255, 255), false, &pixelFormat); + CursorMan.replaceCursor(surface->getPixels(), surface->w, surface->h, hotspotX, hotspotY, pixelFormat.RGBToColor(255, 255, 255), false, &pixelFormat); } _vm->_needsUpdate = true; diff --git a/engines/mohawk/cursors.h b/engines/mohawk/cursors.h index 7bfa491904..c41b5c273e 100644 --- a/engines/mohawk/cursors.h +++ b/engines/mohawk/cursors.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/detection.cpp b/engines/mohawk/detection.cpp index ef07de0180..926c296257 100644 --- a/engines/mohawk/detection.cpp +++ b/engines/mohawk/detection.cpp @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/detection_tables.h b/engines/mohawk/detection_tables.h index 3b925af5a9..6bb836b5b8 100644 --- a/engines/mohawk/detection_tables.h +++ b/engines/mohawk/detection_tables.h @@ -8,12 +8,12 @@ * 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. @@ -294,7 +294,7 @@ static const MohawkGameDescription gameDescriptions[] = { }, // Riven: The Sequel to Myst - // Version 1.? (5CD) + // Version 1.? (5CD) - Spanish // From jvprat { { @@ -312,6 +312,24 @@ static const MohawkGameDescription gameDescriptions[] = { }, // Riven: The Sequel to Myst + // Version 1.0 (5CD) - Italian + // From dodomorandi on bug #6629 + { + { + "riven", + "", + AD_ENTRY1("a_Data.MHK", "0e21e89df7788f32056b6521abf2e81a"), + Common::IT_ITA, + Common::kPlatformWindows, + ADGF_UNSTABLE, + GUIO1(GUIO_NOASPECT) + }, + GType_RIVEN, + 0, + 0, + }, + + // Riven: The Sequel to Myst // Version 1.? (DVD, From "Myst 10th Anniversary Edition") // From Clone2727 { @@ -1361,6 +1379,22 @@ static const MohawkGameDescription gameDescriptions[] = { "GRANDMA.EXE" }, + // Just Grandma and Me 1.0, Macintosh + { + { + "grandma", + "v1.0", + AD_ENTRY1("BookOutline", "9162483da06179e76f4a082412245efa"), + Common::EN_ANY, + Common::kPlatformMacintosh, + ADGF_NO_FLAGS, + GUIO1(GUIO_NOASPECT) + }, + GType_LIVINGBOOKSV1, + GF_LB_10, + 0 + }, + // Just Grandma and Me 1.1 Mac // From eisnerguy1 in bug#3610725 { diff --git a/engines/mohawk/dialogs.cpp b/engines/mohawk/dialogs.cpp index 5f5a3b3800..ffc455286f 100644 --- a/engines/mohawk/dialogs.cpp +++ b/engines/mohawk/dialogs.cpp @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/dialogs.h b/engines/mohawk/dialogs.h index 844c01ad26..7470cd3acd 100644 --- a/engines/mohawk/dialogs.h +++ b/engines/mohawk/dialogs.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/graphics.cpp b/engines/mohawk/graphics.cpp index 0f9a62c891..ea9b57ae17 100644 --- a/engines/mohawk/graphics.cpp +++ b/engines/mohawk/graphics.cpp @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/graphics.h b/engines/mohawk/graphics.h index 51d25db5d9..5f9b523e9a 100644 --- a/engines/mohawk/graphics.h +++ b/engines/mohawk/graphics.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/installer_archive.cpp b/engines/mohawk/installer_archive.cpp index 5af95f27e3..0abc930683 100644 --- a/engines/mohawk/installer_archive.cpp +++ b/engines/mohawk/installer_archive.cpp @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/installer_archive.h b/engines/mohawk/installer_archive.h index 89d2d85f8d..c3212d7f7c 100644 --- a/engines/mohawk/installer_archive.h +++ b/engines/mohawk/installer_archive.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/livingbooks.cpp b/engines/mohawk/livingbooks.cpp index efa0dd3fd3..5af8fac901 100644 --- a/engines/mohawk/livingbooks.cpp +++ b/engines/mohawk/livingbooks.cpp @@ -8,12 +8,12 @@ * 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. @@ -311,8 +311,8 @@ void MohawkEngine_LivingBooks::loadBookInfo(const Common::String &filename) { // - fDebugWindow (always 0?) if (_bookInfoFile.hasSection("Globals")) { - const Common::ConfigFile::SectionKeyList globals = _bookInfoFile.getKeys("Globals"); - for (Common::ConfigFile::SectionKeyList::const_iterator i = globals.begin(); i != globals.end(); i++) { + const Common::INIFile::SectionKeyList globals = _bookInfoFile.getKeys("Globals"); + for (Common::INIFile::SectionKeyList::const_iterator i = globals.begin(); i != globals.end(); i++) { Common::String command = Common::String::format("%s = %s", i->key.c_str(), i->value.c_str()); LBCode tempCode(this, 0); uint offset = tempCode.parseCode(command); @@ -363,6 +363,44 @@ void MohawkEngine_LivingBooks::destroyPage() { _focus = NULL; } +// Replace any colons (originally a slash) with another character +static Common::String replaceColons(const Common::String &in, char replace) { + Common::String out; + + for (uint32 i = 0; i < in.size(); i++) { + if (in[i] == ':') + out += replace; + else + out += in[i]; + } + + return out; +} + +// Helper function to assist in opening pages +static bool tryOpenPage(Archive *archive, const Common::String &fileName) { + // Try the plain file name first + if (archive->openFile(fileName)) + return true; + + // No colons, then bail out + if (!fileName.contains(':')) + return false; + + // Try replacing colons with underscores (in case the original was + // a Mac version and had slashes not as a separator). + if (archive->openFile(replaceColons(fileName, '_'))) + return true; + + // Try replacing colons with slashes (in case the original was a Mac + // version and had slashes as a separator). + if (archive->openFile(replaceColons(fileName, '/'))) + return true; + + // Failed to open the archive + return false; +} + bool MohawkEngine_LivingBooks::loadPage(LBMode mode, uint page, uint subpage) { destroyPage(); @@ -410,7 +448,7 @@ bool MohawkEngine_LivingBooks::loadPage(LBMode mode, uint page, uint subpage) { } Archive *pageArchive = createArchive(); - if (!filename.empty() && pageArchive->openFile(filename)) { + if (!filename.empty() && tryOpenPage(pageArchive, filename)) { _page = new LBPage(this); _page->open(pageArchive, 1000); } else { @@ -824,18 +862,18 @@ int MohawkEngine_LivingBooks::getIntFromConfig(const Common::String §ion, co Common::String MohawkEngine_LivingBooks::getFileNameFromConfig(const Common::String §ion, const Common::String &key, Common::String &leftover) { Common::String string = getStringFromConfig(section, key, leftover); - Common::String x; - uint32 i = 0; if (string.hasPrefix("//")) { // skip "//CD-ROM Title/" prefixes which we don't care about - i = 3; + uint i = 3; while (i < string.size() && string[i - 1] != '/') i++; + + // Already uses slashes, no need to convert further + return string.c_str() + i; } - x = string.c_str() + i; - return (getPlatform() == Common::kPlatformMacintosh) ? convertMacFileName(x) : convertWinFileName(x); + return (getPlatform() == Common::kPlatformMacintosh) ? convertMacFileName(string) : convertWinFileName(string); } Common::String MohawkEngine_LivingBooks::removeQuotesFromString(const Common::String &string, Common::String &leftover) { @@ -866,8 +904,10 @@ Common::String MohawkEngine_LivingBooks::convertMacFileName(const Common::String for (uint32 i = 0; i < string.size(); i++) { if (i == 0 && string[i] == ':') // First character should be ignored (another colon) continue; - if (string[i] == ':') + if (string[i] == ':') // Directory separator filename += '/'; + else if (string[i] == '/') // Literal slash + filename += ':'; // Replace by colon, as used by Mac OS X for slash else filename += string[i]; } @@ -3772,7 +3812,7 @@ LBMovieItem::~LBMovieItem() { void LBMovieItem::update() { if (_playing) { VideoHandle videoHandle = _vm->_video->findVideoHandle(_resourceId); - if (videoHandle == NULL_VID_HANDLE || _vm->_video->endOfVideo(videoHandle)) + if (!videoHandle || videoHandle->endOfVideo()) done(true); } @@ -3783,8 +3823,11 @@ bool LBMovieItem::togglePlaying(bool playing, bool restart) { if (playing) { if ((_loaded && _enabled && _globalEnabled) || _phase == kLBPhaseNone) { debug("toggled video for phase %d", _phase); - _vm->_video->playMovie(_resourceId, _rect.left, _rect.top); + VideoHandle handle = _vm->_video->playMovie(_resourceId); + if (!handle) + error("Failed to open tMOV %d", _resourceId); + handle->moveTo(_rect.left, _rect.top); return true; } } @@ -3808,9 +3851,9 @@ bool LBMiniGameItem::togglePlaying(bool playing, bool restart) { // just skip to the most logical page. For optional minigames, this // will return the player to the previous page. For mandatory minigames, // this will send the player to the next page. - // TODO: Document mini games from Arthur's Reading Race - uint16 destPage; + uint16 destPage = 0; + bool returnToMenu = false; // Figure out what minigame we have and bring us back to a page where // the player can continue @@ -3820,13 +3863,31 @@ bool LBMiniGameItem::togglePlaying(bool playing, bool restart) { destPage = 5; else if (_desc == "Fall") // Green Eggs and Ham: Fall minigame destPage = 13; + else if (_desc == "MagicWrite3") // Arthur's Reading Race: "Let Me Write" minigame (Page 3) + destPage = 3; + else if (_desc == "MagicWrite4") // Arthur's Reading Race: "Let Me Write" minigame (Page 4) + destPage = 4; + else if (_desc == "MagicSpy5") // Arthur's Reading Race: "I Spy" minigame (Page 5) + destPage = 5; + else if (_desc == "MagicSpy6") // Arthur's Reading Race: "I Spy" minigame (Page 6) + destPage = 6; + else if (_desc == "MagicWrite7") // Arthur's Reading Race: "Let Me Write" minigame (Page 7) + destPage = 7; + else if (_desc == "MagicSpy8") // Arthur's Reading Race: "I Spy" minigame (Page 8) + destPage = 8; + else if (_desc == "MagicRace") // Arthur's Reading Race: Race minigame + returnToMenu = true; else error("Unknown minigame '%s'", _desc.c_str()); GUI::MessageDialog dialog(Common::String::format("The '%s' minigame is not supported yet.", _desc.c_str())); dialog.runModal(); - _vm->addNotifyEvent(NotifyEvent(kLBNotifyChangePage, destPage)); + // Go back to the menu if requested, otherwise go to the requested page + if (returnToMenu) + _vm->addNotifyEvent(NotifyEvent(kLBNotifyGoToControls, 1)); + else + _vm->addNotifyEvent(NotifyEvent(kLBNotifyChangePage, destPage)); return false; } @@ -3863,7 +3924,7 @@ void LBProxyItem::load() { debug(1, "LBProxyItem loading archive '%s' with id %d", filename.c_str(), baseId); Archive *pageArchive = _vm->createArchive(); - if (!pageArchive->openFile(filename)) + if (!tryOpenPage(pageArchive, filename)) error("failed to open archive '%s' (for proxy '%s')", filename.c_str(), _desc.c_str()); _page = new LBPage(_vm); _page->open(pageArchive, baseId); diff --git a/engines/mohawk/livingbooks.h b/engines/mohawk/livingbooks.h index 76da7d8219..1a265a1a02 100644 --- a/engines/mohawk/livingbooks.h +++ b/engines/mohawk/livingbooks.h @@ -8,12 +8,12 @@ * 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. @@ -28,7 +28,7 @@ #include "mohawk/livingbooks_graphics.h" #include "mohawk/sound.h" -#include "common/config-file.h" +#include "common/ini-file.h" #include "common/rect.h" #include "common/queue.h" #include "common/random.h" @@ -759,7 +759,7 @@ public: private: LivingBooksConsole *_console; - Common::ConfigFile _bookInfoFile; + Common::INIFile _bookInfoFile; Common::String getBookInfoFileName() const; void loadBookInfo(const Common::String &filename); diff --git a/engines/mohawk/livingbooks_code.cpp b/engines/mohawk/livingbooks_code.cpp index c45efb2c39..b5ea547414 100644 --- a/engines/mohawk/livingbooks_code.cpp +++ b/engines/mohawk/livingbooks_code.cpp @@ -8,12 +8,12 @@ * 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. @@ -842,8 +842,8 @@ CodeCommandInfo generalCommandInfo[NUM_GENERAL_COMMANDS] = { { "bottom", &LBCode::cmdBottom }, // 0x10 { "right", &LBCode::cmdRight }, - { "xpos", 0 }, - { "ypos", 0 }, + { "xpos", &LBCode::cmdXPos }, + { "ypos", &LBCode::cmdYPos }, { "playFrom", 0 }, { "move", &LBCode::cmdMove }, { 0, 0 }, @@ -852,13 +852,13 @@ CodeCommandInfo generalCommandInfo[NUM_GENERAL_COMMANDS] = { { "resetDragParams", 0 }, { "enableRollover", &LBCode::cmdUnimplemented /* FIXME */ }, { "setCursor", 0 }, - { "width", 0 }, - { "height", 0 }, + { "width", &LBCode::cmdWidth }, + { "height", &LBCode::cmdHeight }, { "getFrameBounds", 0 }, // also "getFrameRect" { "traceRect", 0 }, { "sqrt", 0 }, // 0x20 - { "deleteVar", 0 }, + { "deleteVar", &LBCode::cmdDeleteVar }, { "saveVars", 0 }, { "scriptLink", 0 }, { "setViewOrigin", &LBCode::cmdUnimplemented }, @@ -1131,6 +1131,38 @@ void LBCode::cmdRight(const Common::Array<LBValue> ¶ms) { _stack.push(rect.right); } +void LBCode::cmdXPos(const Common::Array<LBValue> ¶ms) { + if (params.size() != 1) + error("too many parameters (%d) to xpos", params.size()); + + Common::Point point = params[0].toPoint(); + _stack.push(point.x); +} + +void LBCode::cmdYPos(const Common::Array<LBValue> ¶ms) { + if (params.size() != 1) + error("too many parameters (%d) to ypos", params.size()); + + Common::Point point = params[0].toPoint(); + _stack.push(point.y); +} + +void LBCode::cmdWidth(const Common::Array<LBValue> ¶ms) { + if (params.size() > 1) + error("too many parameters (%d) to width", params.size()); + + Common::Rect rect = getRectFromParams(params); + _stack.push(rect.width()); +} + +void LBCode::cmdHeight(const Common::Array<LBValue> ¶ms) { + if (params.size() > 1) + error("too many parameters (%d) to height", params.size()); + + Common::Rect rect = getRectFromParams(params); + _stack.push(rect.height()); +} + void LBCode::cmdMove(const Common::Array<LBValue> ¶ms) { if (params.size() != 1 && params.size() != 2) error("incorrect number of parameters (%d) to move", params.size()); @@ -1263,6 +1295,14 @@ void LBCode::cmdGetProperty(const Common::Array<LBValue> ¶ms) { _stack.push(target->_variables[name]); } +void LBCode::cmdDeleteVar(const Common::Array<LBValue> ¶ms) { + if (params.size() != 1) + error("incorrect number of parameters (%d) to deleteVar", params.size()); + + const Common::String &string = params[0].toString(); + _vm->_variables.erase(string); +} + void LBCode::cmdExec(const Common::Array<LBValue> ¶ms) { if (params.size() != 1) error("incorrect number of parameters (%d) to exec", params.size()); @@ -1706,6 +1746,10 @@ uint LBCode::parseCode(const Common::String &source) { if (token != ' ' && token != '(' && wasFunction) error("while parsing script '%s', encountered incomplete function call", source.c_str()); + // Skip C++-style comments + if (token == '/' && lookahead == '/') + break; + // First, we check for simple operators. for (uint i = 0; i < NUM_LB_OPERATORS; i++) { if (token != operators[i].token) @@ -1736,6 +1780,7 @@ uint LBCode::parseCode(const Common::String &source) { switch (token) { // whitespace case ' ': + case '\t': // ignore break; // literal string diff --git a/engines/mohawk/livingbooks_code.h b/engines/mohawk/livingbooks_code.h index c9d9ae06e6..6f6297d592 100644 --- a/engines/mohawk/livingbooks_code.h +++ b/engines/mohawk/livingbooks_code.h @@ -8,12 +8,12 @@ * 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. @@ -263,6 +263,10 @@ public: void cmdLeft(const Common::Array<LBValue> ¶ms); void cmdBottom(const Common::Array<LBValue> ¶ms); void cmdRight(const Common::Array<LBValue> ¶ms); + void cmdXPos(const Common::Array<LBValue> ¶ms); + void cmdYPos(const Common::Array<LBValue> ¶ms); + void cmdWidth(const Common::Array<LBValue> ¶ms); + void cmdHeight(const Common::Array<LBValue> ¶ms); void cmdMove(const Common::Array<LBValue> ¶ms); void cmdSetDragParams(const Common::Array<LBValue> ¶ms); void cmdNewList(const Common::Array<LBValue> ¶ms); @@ -273,6 +277,7 @@ public: void cmdDeleteAt(const Common::Array<LBValue> ¶ms); void cmdSetProperty(const Common::Array<LBValue> ¶ms); void cmdGetProperty(const Common::Array<LBValue> ¶ms); + void cmdDeleteVar(const Common::Array<LBValue> ¶ms); void cmdExec(const Common::Array<LBValue> ¶ms); void cmdReturn(const Common::Array<LBValue> ¶ms); void cmdSetPlayParams(const Common::Array<LBValue> ¶ms); diff --git a/engines/mohawk/livingbooks_graphics.cpp b/engines/mohawk/livingbooks_graphics.cpp index fb764fa15b..fae0c99f6e 100644 --- a/engines/mohawk/livingbooks_graphics.cpp +++ b/engines/mohawk/livingbooks_graphics.cpp @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/livingbooks_graphics.h b/engines/mohawk/livingbooks_graphics.h index 3e2609750a..c76f92f641 100644 --- a/engines/mohawk/livingbooks_graphics.h +++ b/engines/mohawk/livingbooks_graphics.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/livingbooks_lbx.cpp b/engines/mohawk/livingbooks_lbx.cpp index 2b8b22ec81..b5f62704a1 100644 --- a/engines/mohawk/livingbooks_lbx.cpp +++ b/engines/mohawk/livingbooks_lbx.cpp @@ -8,12 +8,12 @@ * 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. @@ -33,7 +33,7 @@ public: bool call(uint callId, const Common::Array<LBValue> ¶ms, LBValue &result); protected: - Common::ConfigFile _dataFile; + Common::INIFile _dataFile; Common::String _curSection; void open(const Common::String &filename); @@ -77,8 +77,8 @@ bool LBXDataFile::call(uint callId, const Common::Array<LBValue> ¶ms, LBValu case kLBXDataFileGetSectionList: { Common::SharedPtr<LBList> list = Common::SharedPtr<LBList>(new LBList); - Common::ConfigFile::SectionList sections = _dataFile.getSections(); - for (Common::List<Common::ConfigFile::Section>::const_iterator i = sections.begin(); i != sections.end(); ++i) + Common::INIFile::SectionList sections = _dataFile.getSections(); + for (Common::List<Common::INIFile::Section>::const_iterator i = sections.begin(); i != sections.end(); ++i) list->array.push_back(LBValue(i->name)); result = LBValue(list); } @@ -103,8 +103,8 @@ bool LBXDataFile::call(uint callId, const Common::Array<LBValue> ¶ms, LBValu error("incorrect number of parameters (%d) to LBXDataFile::loadCurSectionVars", params.size()); { - const Common::ConfigFile::SectionKeyList globals = _dataFile.getKeys(_curSection); - for (Common::ConfigFile::SectionKeyList::const_iterator i = globals.begin(); i != globals.end(); i++) { + const Common::INIFile::SectionKeyList globals = _dataFile.getKeys(_curSection); + for (Common::INIFile::SectionKeyList::const_iterator i = globals.begin(); i != globals.end(); i++) { Common::String command = Common::String::format("%s = %s", i->key.c_str(), i->value.c_str()); LBCode tempCode(_vm, 0); uint offset = tempCode.parseCode(command); diff --git a/engines/mohawk/livingbooks_lbx.h b/engines/mohawk/livingbooks_lbx.h index 3cca0a8e82..f9457c1425 100644 --- a/engines/mohawk/livingbooks_lbx.h +++ b/engines/mohawk/livingbooks_lbx.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/mohawk.cpp b/engines/mohawk/mohawk.cpp index cb419064c0..d740d9479a 100644 --- a/engines/mohawk/mohawk.cpp +++ b/engines/mohawk/mohawk.cpp @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/mohawk.h b/engines/mohawk/mohawk.h index 2f0e570d56..6fa733e38e 100644 --- a/engines/mohawk/mohawk.h +++ b/engines/mohawk/mohawk.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/myst.cpp b/engines/mohawk/myst.cpp index 8140817eb3..b6a6c27329 100644 --- a/engines/mohawk/myst.cpp +++ b/engines/mohawk/myst.cpp @@ -8,12 +8,12 @@ * 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. @@ -413,11 +413,17 @@ void MohawkEngine_Myst::changeToStack(uint16 stack, uint16 card, uint16 linkSrcS // Fill screen with black and empty cursor _cursor->setCursor(0); - _system->fillScreen(_system->getScreenFormat().RGBToColor(0, 0, 0)); + + if (getFeatures() & GF_ME) + _system->fillScreen(_system->getScreenFormat().RGBToColor(0, 0, 0)); + else + _gfx->clearScreenPalette(); + _system->updateScreen(); _sound->stopSound(); _sound->stopBackgroundMyst(); + _video->stopVideos(); if (linkSrcSound) _sound->playSoundBlocking(linkSrcSound); @@ -494,9 +500,10 @@ void MohawkEngine_Myst::changeToStack(uint16 stack, uint16 card, uint16 linkSrcS _cache.clear(); _gfx->clearCache(); - // Play Flyby Entry Movie on Masterpiece Edition. - const char *flyby = 0; if (getFeatures() & GF_ME) { + // Play Flyby Entry Movie on Masterpiece Edition. + const char *flyby = 0; + switch (_curStack) { case kSeleniticStack: flyby = "selenitic flyby"; diff --git a/engines/mohawk/myst.h b/engines/mohawk/myst.h index a268c19737..4d86642652 100644 --- a/engines/mohawk/myst.h +++ b/engines/mohawk/myst.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/myst_areas.cpp b/engines/mohawk/myst_areas.cpp index 12a2c7f44c..7a9596d8e0 100644 --- a/engines/mohawk/myst_areas.cpp +++ b/engines/mohawk/myst_areas.cpp @@ -8,12 +8,12 @@ * 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. @@ -223,20 +223,26 @@ VideoHandle MystResourceType6::playMovie() { VideoHandle handle = _vm->_video->findVideoHandle(_videoFile); // If the video is not running, play it - if (handle == NULL_VID_HANDLE || _vm->_video->endOfVideo(handle)) { - handle = _vm->_video->playMovie(_videoFile, _left, _top, _loop); + if (!handle || handle->endOfVideo()) { + handle = _vm->_video->playMovie(_videoFile); + if (!handle) + error("Failed to open '%s'", _videoFile.c_str()); + + handle->moveTo(_left, _top); + handle->setLooping(_loop != 0); + if (_direction == -1) { - _vm->_video->seekToTime(handle, _vm->_video->getDuration(handle)); - _vm->_video->setVideoRate(handle, -1); + handle->seek(handle->getDuration()); + handle->setRate(-1); } } else { // Resume the video - _vm->_video->pauseMovie(handle, false); + handle->pause(false); } if (_playBlocking) { _vm->_video->waitUntilMovieEnds(handle); - handle = NULL_VID_HANDLE; + return VideoHandle(); } return handle; @@ -249,13 +255,13 @@ void MystResourceType6::handleCardChange() { bool MystResourceType6::isPlaying() { VideoHandle handle = _vm->_video->findVideoHandle(_videoFile); - return handle != NULL_VID_HANDLE && !_vm->_video->endOfVideo(handle); + return handle && !handle->endOfVideo(); } void MystResourceType6::pauseMovie(bool pause) { VideoHandle handle = _vm->_video->findVideoHandle(_videoFile); - if (handle != NULL_VID_HANDLE && !_vm->_video->endOfVideo(handle)) - _vm->_video->pauseMovie(handle, pause); + if (handle && !handle->endOfVideo()) + handle->pause(pause); } MystResourceType7::MystResourceType7(MohawkEngine_Myst *vm, Common::SeekableReadStream *rlstStream, MystResource *parent) : MystResource(vm, rlstStream, parent) { diff --git a/engines/mohawk/myst_areas.h b/engines/mohawk/myst_areas.h index 62af5ec4cf..97ec882497 100644 --- a/engines/mohawk/myst_areas.h +++ b/engines/mohawk/myst_areas.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/myst_graphics.cpp b/engines/mohawk/myst_graphics.cpp index 6a292c66e2..49f97cca63 100644 --- a/engines/mohawk/myst_graphics.cpp +++ b/engines/mohawk/myst_graphics.cpp @@ -8,12 +8,12 @@ * 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. @@ -28,8 +28,8 @@ #include "common/system.h" #include "common/textconsole.h" #include "engines/util.h" -#include "graphics/decoders/jpeg.h" -#include "graphics/decoders/pict.h" +#include "graphics/palette.h" +#include "image/pict.h" namespace Mohawk { @@ -38,17 +38,21 @@ MystGraphics::MystGraphics(MohawkEngine_Myst* vm) : GraphicsManager(), _vm(vm) { _viewport = Common::Rect(544, 332); - // The original version of Myst could run in 8bpp color too. - // However, it dithered videos to 8bpp and they looked considerably - // worse (than they already did :P). So we're not even going to - // support 8bpp mode in Myst (Myst ME required >8bpp anyway). - initGraphics(_viewport.width(), _viewport.height(), true, NULL); // What an odd screen size! + if (_vm->getFeatures() & GF_ME) { + // High color + initGraphics(_viewport.width(), _viewport.height(), true, NULL); + + if (_vm->_system->getScreenFormat().bytesPerPixel == 1) + error("Myst ME requires greater than 256 colors to run"); + } else { + // Paletted + initGraphics(_viewport.width(), _viewport.height(), true); + setBasePalette(); + setPaletteToScreen(); + } _pixelFormat = _vm->_system->getScreenFormat(); - if (_pixelFormat.bytesPerPixel == 1) - error("Myst requires greater than 256 colors to run"); - // Initialize our buffer _backBuffer = new Graphics::Surface(); _backBuffer->create(_vm->_system->getWidth(), _vm->_system->getHeight(), _pixelFormat); @@ -94,7 +98,7 @@ MohawkSurface *MystGraphics::decodeImage(uint16 id) { MohawkSurface *mhkSurface = 0; if (isPict) { - Graphics::PICTDecoder pict; + Image::PICTDecoder pict; if (!pict.loadStream(*dataStream)) error("Could not decode Myst ME PICT"); @@ -102,7 +106,9 @@ MohawkSurface *MystGraphics::decodeImage(uint16 id) { mhkSurface = new MohawkSurface(pict.getSurface()->convertTo(_pixelFormat)); } else { mhkSurface = _bmpDecoder->decodeImage(dataStream); - mhkSurface->convertToTrueColor(); + + if (_vm->getFeatures() & GF_ME) + mhkSurface->convertToTrueColor(); } assert(mhkSurface); @@ -152,7 +158,8 @@ void MystGraphics::copyImageSectionToScreen(uint16 image, Common::Rect src, Comm } void MystGraphics::copyImageSectionToBackBuffer(uint16 image, Common::Rect src, Common::Rect dest) { - Graphics::Surface *surface = findImage(image)->getSurface(); + MohawkSurface *mhkSurface = findImage(image); + Graphics::Surface *surface = mhkSurface->getSurface(); // Make sure the image is bottom aligned in the dest rect dest.top = dest.bottom - MIN<int>(surface->h, dest.height()); @@ -191,6 +198,13 @@ void MystGraphics::copyImageSectionToBackBuffer(uint16 image, Common::Rect src, for (uint16 i = 0; i < height; i++) memcpy(_backBuffer->getBasePtr(dest.left, i + dest.top), surface->getBasePtr(src.left, top + i), width * surface->format.bytesPerPixel); + + if (!(_vm->getFeatures() & GF_ME)) { + // Make sure the palette is set + assert(mhkSurface->getPalette()); + memcpy(_palette + 10 * 3, mhkSurface->getPalette() + 10 * 3, (256 - 10 * 2) * 3); + setPaletteToScreen(); + } } void MystGraphics::copyImageToScreen(uint16 image, Common::Rect dest) { @@ -420,12 +434,16 @@ void MystGraphics::transitionDissolve(Common::Rect rect, uint step) { for (uint16 x = rect.left; x < rect.right; x++) { if (linePattern[x % 4]) { - if (_pixelFormat.bytesPerPixel == 2) { - uint16 *dst = (uint16 *)screen->getBasePtr(x, y); - *dst = *(const uint16 *)_backBuffer->getBasePtr(x, y); - } else { - uint32 *dst = (uint32 *)screen->getBasePtr(x, y); - *dst = *(const uint32 *)_backBuffer->getBasePtr(x, y); + switch (_pixelFormat.bytesPerPixel) { + case 1: + *((byte *)screen->getBasePtr(x, y)) = *((const byte *)_backBuffer->getBasePtr(x, y)); + break; + case 2: + *((uint16 *)screen->getBasePtr(x, y)) = *((const uint16 *)_backBuffer->getBasePtr(x, y)); + break; + case 4: + *((uint32 *)screen->getBasePtr(x, y)) = *((const uint32 *)_backBuffer->getBasePtr(x, y)); + break; } } } @@ -589,11 +607,11 @@ void MystGraphics::drawRect(Common::Rect rect, RectState state) { Graphics::Surface *screen = _vm->_system->lockScreen(); if (state == kRectEnabled) - screen->frameRect(rect, _pixelFormat.RGBToColor(0, 255, 0)); + screen->frameRect(rect, (_vm->getFeatures() & GF_ME) ? _pixelFormat.RGBToColor(0, 255, 0) : 250); else if (state == kRectUnreachable) - screen->frameRect(rect, _pixelFormat.RGBToColor(0, 0, 255)); + screen->frameRect(rect, (_vm->getFeatures() & GF_ME) ? _pixelFormat.RGBToColor(0, 0, 255) : 252); else - screen->frameRect(rect, _pixelFormat.RGBToColor(255, 0, 0)); + screen->frameRect(rect, (_vm->getFeatures() & GF_ME) ? _pixelFormat.RGBToColor(255, 0, 0) : 249); _vm->_system->unlockScreen(); } @@ -630,50 +648,94 @@ void MystGraphics::simulatePreviousDrawDelay(const Common::Rect &dest) { _nextAllowedDrawTime = time + _constantDrawDelay + dest.height() * dest.width() / _proportionalDrawDelay; } -void MystGraphics::copyBackBufferToScreenWithSaturation(int16 saturation) { - Graphics::Surface *screen = _vm->_system->lockScreen(); +void MystGraphics::fadeToBlack() { + // This is only for the demo + assert(!(_vm->getFeatures() & GF_ME)); - for (uint16 y = 0; y < _viewport.height(); y++) - for (uint16 x = 0; x < _viewport.width(); x++) { - uint32 color; - uint8 r, g, b; + // Linear fade in 64 steps + for (int i = 63; i >= 0; i--) { + byte palette[256 * 3]; + byte *src = _palette; + byte *dst = palette; - if (_pixelFormat.bytesPerPixel == 2) - color = *(const uint16 *)_backBuffer->getBasePtr(x, y); - else - color = *(const uint32 *)_backBuffer->getBasePtr(x, y); + for (uint j = 0; j < sizeof(palette); j++) + *dst++ = *src++ * i / 64; - _pixelFormat.colorToRGB(color, r, g, b); + _vm->_system->getPaletteManager()->setPalette(palette, 0, 256); + _vm->_system->updateScreen(); + } +} - r = CLIP<int16>((int16)r - saturation, 0, 255); - g = CLIP<int16>((int16)g - saturation, 0, 255); - b = CLIP<int16>((int16)b - saturation, 0, 255); +void MystGraphics::fadeFromBlack() { + // This is only for the demo + assert(!(_vm->getFeatures() & GF_ME)); - color = _pixelFormat.RGBToColor(r, g, b); + copyBackBufferToScreen(_viewport); - if (_pixelFormat.bytesPerPixel == 2) { - uint16 *dst = (uint16 *)screen->getBasePtr(x, y); - *dst = color; - } else { - uint32 *dst = (uint32 *)screen->getBasePtr(x, y); - *dst = color; - } - } + // Linear fade in 64 steps + for (int i = 0; i < 64; i++) { + byte palette[256 * 3]; + byte *src = _palette; + byte *dst = palette; - _vm->_system->unlockScreen(); + for (uint j = 0; j < sizeof(palette); j++) + *dst++ = *src++ * i / 64; + + _vm->_system->getPaletteManager()->setPalette(palette, 0, 256); + _vm->_system->updateScreen(); + } + + // Set the full palette + _vm->_system->getPaletteManager()->setPalette(_palette, 0, 256); _vm->_system->updateScreen(); } -void MystGraphics::fadeToBlack() { - for (int16 i = 0; i < 256; i += 32) { - copyBackBufferToScreenWithSaturation(i); - } +void MystGraphics::clearScreenPalette() { + // Set the palette to all black + byte palette[256 * 3]; + memset(palette, 0, sizeof(palette)); + _vm->_system->getPaletteManager()->setPalette(palette, 0, 256); } -void MystGraphics::fadeFromBlack() { - for (int16 i = 256; i >= 0; i -= 32) { - copyBackBufferToScreenWithSaturation(i); - } +void MystGraphics::setBasePalette() { + // Entries [0, 9] of the palette + static const byte lowPalette[] = { + 0xFF, 0xFF, 0xFF, + 0x80, 0x00, 0x00, + 0x00, 0x80, 0x00, + 0x80, 0x80, 0x00, + 0x00, 0x00, 0x80, + 0x80, 0x00, 0x80, + 0x00, 0x80, 0x80, + 0xC0, 0xC0, 0xC0, + 0xC0, 0xDC, 0xC0, + 0xA6, 0xCA, 0xF0 + }; + + // Entries [246, 255] of the palette + static const byte highPalette[] = { + 0xFF, 0xFB, 0xF0, + 0xA0, 0xA0, 0xA4, + 0x80, 0x80, 0x80, + 0xFF, 0x00, 0x00, + 0x00, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0xFF, + 0xFF, 0x00, 0xFF, + 0x00, 0xFF, 0xFF, + 0x00, 0x00, 0x00 + }; + + // Note that 0 and 255 are different from normal Windows. + // Myst seems to hack that to white, resp. black (probably for Mac compat). + + memcpy(_palette, lowPalette, sizeof(lowPalette)); + memset(_palette + sizeof(lowPalette), 0, sizeof(_palette) - sizeof(lowPalette) - sizeof(highPalette)); + memcpy(_palette + sizeof(_palette) - sizeof(highPalette), highPalette, sizeof(highPalette)); +} + +void MystGraphics::setPaletteToScreen() { + _vm->_system->getPaletteManager()->setPalette(_palette, 0, 256); } } // End of namespace Mohawk diff --git a/engines/mohawk/myst_graphics.h b/engines/mohawk/myst_graphics.h index 4bbc8d5b8c..6281c94cc8 100644 --- a/engines/mohawk/myst_graphics.h +++ b/engines/mohawk/myst_graphics.h @@ -8,12 +8,12 @@ * 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. @@ -40,7 +40,7 @@ enum RectState { class MystGraphics : public GraphicsManager { public: - MystGraphics(MohawkEngine_Myst*); + MystGraphics(MohawkEngine_Myst *vm); ~MystGraphics(); void copyImageSectionToScreen(uint16 image, Common::Rect src, Common::Rect dest); @@ -55,18 +55,15 @@ public: void fadeToBlack(); void fadeFromBlack(); + void clearScreenPalette(); + void setBasePalette(); + void setPaletteToScreen(); + const byte *getPalette() const { return _palette; } + protected: MohawkSurface *decodeImage(uint16 id); MohawkEngine *getVM() { return (MohawkEngine *)_vm; } - void simulatePreviousDrawDelay(const Common::Rect &dest); - void copyBackBufferToScreenWithSaturation(int16 saturation); - void transitionDissolve(Common::Rect rect, uint step); - void transitionSlideToLeft(Common::Rect rect, uint16 steps, uint16 delay); - void transitionSlideToRight(Common::Rect rect, uint16 steps, uint16 delay); - void transitionSlideToTop(Common::Rect rect, uint16 steps, uint16 delay); - void transitionSlideToBottom(Common::Rect rect, uint16 steps, uint16 delay); - void transitionPartialToRight(Common::Rect rect, uint32 width, uint32 steps); - void transitionPartialToLeft(Common::Rect rect, uint32 width, uint32 steps); + private: MohawkEngine_Myst *_vm; MystBitmap *_bmpDecoder; @@ -74,11 +71,21 @@ private: Graphics::Surface *_backBuffer; Graphics::PixelFormat _pixelFormat; Common::Rect _viewport; + byte _palette[256 * 3]; int _enableDrawingTimeSimulation; uint32 _nextAllowedDrawTime; static const uint _constantDrawDelay = 10; // ms static const uint _proportionalDrawDelay = 500; // pixels per ms + + void simulatePreviousDrawDelay(const Common::Rect &dest); + void transitionDissolve(Common::Rect rect, uint step); + void transitionSlideToLeft(Common::Rect rect, uint16 steps, uint16 delay); + void transitionSlideToRight(Common::Rect rect, uint16 steps, uint16 delay); + void transitionSlideToTop(Common::Rect rect, uint16 steps, uint16 delay); + void transitionSlideToBottom(Common::Rect rect, uint16 steps, uint16 delay); + void transitionPartialToRight(Common::Rect rect, uint32 width, uint32 steps); + void transitionPartialToLeft(Common::Rect rect, uint32 width, uint32 steps); }; } // End of namespace Mohawk diff --git a/engines/mohawk/myst_scripts.cpp b/engines/mohawk/myst_scripts.cpp index c1b75df4cf..15d74a2253 100644 --- a/engines/mohawk/myst_scripts.cpp +++ b/engines/mohawk/myst_scripts.cpp @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/myst_scripts.h b/engines/mohawk/myst_scripts.h index b75da0801a..7d8165c762 100644 --- a/engines/mohawk/myst_scripts.h +++ b/engines/mohawk/myst_scripts.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/myst_stacks/channelwood.cpp b/engines/mohawk/myst_stacks/channelwood.cpp index 63ba5f7c85..dfa15a9b6c 100644 --- a/engines/mohawk/myst_stacks/channelwood.cpp +++ b/engines/mohawk/myst_stacks/channelwood.cpp @@ -8,12 +8,12 @@ * 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. @@ -299,13 +299,17 @@ bool Channelwood::pipeChangeValve(bool open, uint16 mask) { void Channelwood::o_bridgeToggle(uint16 op, uint16 var, uint16 argc, uint16 *argv) { debugC(kDebugScript, "Opcode %d: Bridge rise / skink video", op); - VideoHandle bridge = _vm->_video->playMovie(_vm->wrapMovieFilename("bridge", kChannelwoodStack), 292, 203); + VideoHandle bridge = _vm->_video->playMovie(_vm->wrapMovieFilename("bridge", kChannelwoodStack)); + if (!bridge) + error("Failed to open 'bridge' movie"); + + bridge->moveTo(292, 203); // Toggle bridge state if (_state.waterPumpBridgeState) - _vm->_video->setVideoBounds(bridge, Audio::Timestamp(0, 3050, 600), Audio::Timestamp(0, 6100, 600)); + bridge->setBounds(Audio::Timestamp(0, 3050, 600), Audio::Timestamp(0, 6100, 600)); else - _vm->_video->setVideoBounds(bridge, Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 3050, 600)); + bridge->setBounds(Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 3050, 600)); _vm->_video->waitUntilMovieEnds(bridge); } @@ -317,13 +321,17 @@ void Channelwood::o_pipeExtend(uint16 op, uint16 var, uint16 argc, uint16 *argv) debugC(kDebugScript, "\tsoundId: %d", soundId); _vm->_sound->replaceSoundMyst(soundId); - VideoHandle pipe = _vm->_video->playMovie(_vm->wrapMovieFilename("pipebrid", kChannelwoodStack), 267, 170); + VideoHandle pipe = _vm->_video->playMovie(_vm->wrapMovieFilename("pipebrid", kChannelwoodStack)); + if (!pipe) + error("Failed to open 'pipebrid' movie"); + + pipe->moveTo(267, 170); // Toggle pipe state if (_state.pipeState) - _vm->_video->setVideoBounds(pipe, Audio::Timestamp(0, 3040, 600), Audio::Timestamp(0, 6080, 600)); + pipe->setBounds(Audio::Timestamp(0, 3040, 600), Audio::Timestamp(0, 6080, 600)); else - _vm->_video->setVideoBounds(pipe, Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 3040, 600)); + pipe->setBounds(Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 3040, 600)); _vm->_video->waitUntilMovieEnds(pipe); _vm->_sound->resumeBackgroundMyst(); @@ -605,23 +613,29 @@ void Channelwood::o_hologramMonitor(uint16 op, uint16 var, uint16 argc, uint16 * _vm->_video->stopVideos(); + VideoHandle handle; + switch (button) { case 0: - _vm->_video->playMovie(_vm->wrapMovieFilename("monalgh", kChannelwoodStack), 227, 70); + handle = _vm->_video->playMovie(_vm->wrapMovieFilename("monalgh", kChannelwoodStack)); break; case 1: - _vm->_video->playMovie(_vm->wrapMovieFilename("monamth", kChannelwoodStack), 227, 70); + handle = _vm->_video->playMovie(_vm->wrapMovieFilename("monamth", kChannelwoodStack)); break; case 2: - _vm->_video->playMovie(_vm->wrapMovieFilename("monasirs", kChannelwoodStack), 227, 70); + handle = _vm->_video->playMovie(_vm->wrapMovieFilename("monasirs", kChannelwoodStack)); break; case 3: - _vm->_video->playMovie(_vm->wrapMovieFilename("monsmsg", kChannelwoodStack), 227, 70); + handle = _vm->_video->playMovie(_vm->wrapMovieFilename("monsmsg", kChannelwoodStack)); break; default: warning("Opcode %d Control Variable Out of Range", op); break; } + + // Move the video to the right location + if (handle) + handle->moveTo(227, 70); } } diff --git a/engines/mohawk/myst_stacks/channelwood.h b/engines/mohawk/myst_stacks/channelwood.h index a3ea406003..bd5d7ffe94 100644 --- a/engines/mohawk/myst_stacks/channelwood.h +++ b/engines/mohawk/myst_stacks/channelwood.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/myst_stacks/credits.cpp b/engines/mohawk/myst_stacks/credits.cpp index 192e55d5e3..b9ff8b26aa 100644 --- a/engines/mohawk/myst_stacks/credits.cpp +++ b/engines/mohawk/myst_stacks/credits.cpp @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/myst_stacks/credits.h b/engines/mohawk/myst_stacks/credits.h index a1f8b0a7d8..3c0f969203 100644 --- a/engines/mohawk/myst_stacks/credits.h +++ b/engines/mohawk/myst_stacks/credits.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/myst_stacks/demo.cpp b/engines/mohawk/myst_stacks/demo.cpp index 9f393ea401..848736e37c 100644 --- a/engines/mohawk/myst_stacks/demo.cpp +++ b/engines/mohawk/myst_stacks/demo.cpp @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/myst_stacks/demo.h b/engines/mohawk/myst_stacks/demo.h index c3e57cf7ae..f19b9a6c2c 100644 --- a/engines/mohawk/myst_stacks/demo.h +++ b/engines/mohawk/myst_stacks/demo.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/myst_stacks/dni.cpp b/engines/mohawk/myst_stacks/dni.cpp index d103105c2d..6ba0b63423 100644 --- a/engines/mohawk/myst_stacks/dni.cpp +++ b/engines/mohawk/myst_stacks/dni.cpp @@ -8,12 +8,12 @@ * 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. @@ -103,14 +103,14 @@ void Dni::o_handPage(uint16 op, uint16 var, uint16 argc, uint16 *argv) { VideoHandle atrus = _vm->_video->findVideoHandle(_video); // Good ending and Atrus asked to give page - if (_globals.ending == 1 && _vm->_video->getTime(atrus) > (uint)Audio::Timestamp(0, 6801, 600).msecs()) { + if (_globals.ending == 1 && atrus && atrus->getTime() > (uint)Audio::Timestamp(0, 6801, 600).msecs()) { _globals.ending = 2; _globals.heldPage = 0; _vm->setMainCursor(kDefaultMystCursor); // Play movie end (atrus leaving) - _vm->_video->setVideoBounds(atrus, Audio::Timestamp(0, 14813, 600), _vm->_video->getDuration(atrus)); - _vm->_video->setVideoLooping(atrus, false); + atrus->setBounds(Audio::Timestamp(0, 14813, 600), atrus->getDuration()); + atrus->setLooping(false); _atrusLeft = true; _waitForLoop = false; @@ -121,8 +121,12 @@ void Dni::o_handPage(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void Dni::atrusLeft_run() { if (_vm->_system->getMillis() > _atrusLeftTime + 63333) { _video = _vm->wrapMovieFilename("atrus2", kDniStack); - VideoHandle atrus = _vm->_video->playMovie(_video, 215, 77); - _vm->_video->setVideoBounds(atrus, Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 98000, 600)); + VideoHandle atrus = _vm->_video->playMovie(_video); + if (!atrus) + error("Failed to open '%s'", _video.c_str()); + + atrus->moveTo(215, 77); + atrus->setBounds(Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 98000, 600)); _waitForLoop = true; _loopStart = 73095; @@ -139,9 +143,13 @@ void Dni::atrusLeft_run() { void Dni::loopVideo_run() { if (!_vm->_video->isVideoPlaying()) { - VideoHandle atrus = _vm->_video->playMovie(_video, 215, 77); - _vm->_video->setVideoBounds(atrus, Audio::Timestamp(0, _loopStart, 600), Audio::Timestamp(0, _loopEnd, 600)); - _vm->_video->setVideoLooping(atrus, true); + VideoHandle atrus = _vm->_video->playMovie(_video); + if (!atrus) + error("Failed to open '%s'", _video.c_str()); + + atrus->moveTo(215, 77); + atrus->setBounds(Audio::Timestamp(0, _loopStart, 600), Audio::Timestamp(0, _loopEnd, 600)); + atrus->setLooping(true); _waitForLoop = false; } @@ -155,14 +163,23 @@ void Dni::atrus_run() { // Atrus asking for page if (!_vm->_video->isVideoPlaying()) { _video = _vm->wrapMovieFilename("atr1page", kDniStack); - VideoHandle atrus = _vm->_video->playMovie(_video, 215, 77, true); - _vm->_video->setVideoBounds(atrus, Audio::Timestamp(0, 7388, 600), Audio::Timestamp(0, 14700, 600)); + VideoHandle atrus = _vm->_video->playMovie(_video); + if (!atrus) + error("Failed to open '%s'", _video.c_str()); + + atrus->moveTo(215, 77); + atrus->setLooping(true); + atrus->setBounds(Audio::Timestamp(0, 7388, 600), Audio::Timestamp(0, 14700, 600)); } } else if (_globals.ending != 3 && _globals.ending != 4) { if (_globals.heldPage == 13) { _video = _vm->wrapMovieFilename("atr1page", kDniStack); - VideoHandle atrus = _vm->_video->playMovie(_video, 215, 77); - _vm->_video->setVideoBounds(atrus, Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 14700, 600)); + VideoHandle atrus = _vm->_video->playMovie(_video); + if (!atrus) + error("Failed to open '%s'", _video.c_str()); + + atrus->moveTo(215, 77); + atrus->setBounds(Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 14700, 600)); _waitForLoop = true; _loopStart = 7388; @@ -173,8 +190,12 @@ void Dni::atrus_run() { } else { _video = _vm->wrapMovieFilename("atr1nopg", kDniStack); - VideoHandle atrus = _vm->_video->playMovie(_video, 215, 77); - _vm->_video->setVideoBounds(atrus, Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 46175, 600)); + VideoHandle atrus = _vm->_video->playMovie(_video); + if (!atrus) + error("Failed to open '%s'", _video.c_str()); + + atrus->moveTo(215, 77); + atrus->setBounds(Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 46175, 600)); _waitForLoop = true; _loopStart = 30656; @@ -184,7 +205,12 @@ void Dni::atrus_run() { _globals.ending = 3; } } else if (!_vm->_video->isVideoPlaying()) { - _vm->_video->playMovie(_vm->wrapMovieFilename("atrwrite", kDniStack), 215, 77, true); + VideoHandle handle = _vm->_video->playMovie(_vm->wrapMovieFilename("atrwrite", kDniStack)); + if (!handle) + error("Failed to open atrwrite movie"); + + handle->moveTo(215, 77); + handle->setLooping(true); } } diff --git a/engines/mohawk/myst_stacks/dni.h b/engines/mohawk/myst_stacks/dni.h index 7f04287082..3dc4645bd3 100644 --- a/engines/mohawk/myst_stacks/dni.h +++ b/engines/mohawk/myst_stacks/dni.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/myst_stacks/intro.cpp b/engines/mohawk/myst_stacks/intro.cpp index 71733227ac..dc66984398 100644 --- a/engines/mohawk/myst_stacks/intro.cpp +++ b/engines/mohawk/myst_stacks/intro.cpp @@ -8,12 +8,12 @@ * 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. @@ -98,10 +98,16 @@ void Intro::introMovies_run() { // Play Intro Movies // This is all quite messy... + VideoHandle handle; + switch (_introStep) { case 0: _introStep = 1; - _vm->_video->playMovie(_vm->wrapMovieFilename("broder", kIntroStack)); + handle = _vm->_video->playMovie(_vm->wrapMovieFilename("broder", kIntroStack)); + if (!handle) + error("Failed to open broder movie"); + + handle->center(); break; case 1: if (!_vm->_video->isVideoPlaying()) @@ -109,7 +115,11 @@ void Intro::introMovies_run() { break; case 2: _introStep = 3; - _vm->_video->playMovie(_vm->wrapMovieFilename("cyanlogo", kIntroStack)); + handle = _vm->_video->playMovie(_vm->wrapMovieFilename("cyanlogo", kIntroStack)); + if (!handle) + error("Failed to open cyanlogo movie"); + + handle->center(); break; case 3: if (!_vm->_video->isVideoPlaying()) @@ -118,8 +128,13 @@ void Intro::introMovies_run() { case 4: _introStep = 5; - if (!(_vm->getFeatures() & GF_DEMO)) // The demo doesn't have the intro video - _vm->_video->playMovie(_vm->wrapMovieFilename("intro", kIntroStack)); + if (!(_vm->getFeatures() & GF_DEMO)) { // The demo doesn't have the intro video + handle = _vm->_video->playMovie(_vm->wrapMovieFilename("intro", kIntroStack)); + if (!handle) + error("Failed to open intro movie"); + + handle->center(); + } break; case 5: if (!_vm->_video->isVideoPlaying()) diff --git a/engines/mohawk/myst_stacks/intro.h b/engines/mohawk/myst_stacks/intro.h index 9fe3920e53..a6c4a594d2 100644 --- a/engines/mohawk/myst_stacks/intro.h +++ b/engines/mohawk/myst_stacks/intro.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/myst_stacks/makingof.cpp b/engines/mohawk/myst_stacks/makingof.cpp index b5ad647381..1059fd0c5e 100644 --- a/engines/mohawk/myst_stacks/makingof.cpp +++ b/engines/mohawk/myst_stacks/makingof.cpp @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/myst_stacks/makingof.h b/engines/mohawk/myst_stacks/makingof.h index d4bc0fd9f2..79ef913bcf 100644 --- a/engines/mohawk/myst_stacks/makingof.h +++ b/engines/mohawk/myst_stacks/makingof.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/myst_stacks/mechanical.cpp b/engines/mohawk/myst_stacks/mechanical.cpp index 43e9bcfed5..ffcaa226c6 100644 --- a/engines/mohawk/myst_stacks/mechanical.cpp +++ b/engines/mohawk/myst_stacks/mechanical.cpp @@ -8,12 +8,12 @@ * 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. @@ -316,12 +316,16 @@ void Mechanical::o_snakeBoxTrigger(uint16 op, uint16 var, uint16 argc, uint16 *a void Mechanical::o_fortressStaircaseMovie(uint16 op, uint16 var, uint16 argc, uint16 *argv) { debugC(kDebugScript, "Opcode %d: Play Stairs Movement Movie", op); - VideoHandle staircase = _vm->_video->playMovie(_vm->wrapMovieFilename("hhstairs", kMechanicalStack), 174, 222); + VideoHandle staircase = _vm->_video->playMovie(_vm->wrapMovieFilename("hhstairs", kMechanicalStack)); + if (!staircase) + error("Failed to open hhstairs movie"); + + staircase->moveTo(174, 222); if (_state.staircaseState) { - _vm->_video->setVideoBounds(staircase, Audio::Timestamp(0, 840, 600), Audio::Timestamp(0, 1680, 600)); + staircase->setBounds(Audio::Timestamp(0, 840, 600), Audio::Timestamp(0, 1680, 600)); } else { - _vm->_video->setVideoBounds(staircase, Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 840, 600)); + staircase->setBounds(Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 840, 600)); } _vm->_video->waitUntilMovieEnds(staircase); @@ -353,7 +357,7 @@ void Mechanical::o_elevatorRotationMove(uint16 op, uint16 var, uint16 argc, uint int16 step = ((rect.bottom - mouse.y) * lever->getNumFrames()) / rect.height(); step = CLIP<int16>(step, 0, maxStep); - _elevatorRotationSpeed = step * 0.1; + _elevatorRotationSpeed = step * 0.1f; // Draw current frame lever->drawFrame(step); @@ -386,9 +390,9 @@ void Mechanical::o_elevatorRotationStop(uint16 op, uint16 var, uint16 argc, uint // Decrease speed while (speed > 2) { - speed -= 0.5; + speed -= 0.5f; - _elevatorRotationGearPosition += speed * 0.1; + _elevatorRotationGearPosition += speed * 0.1f; if (_elevatorRotationGearPosition > 12) break; @@ -571,8 +575,12 @@ void Mechanical::o_elevatorWindowMovie(uint16 op, uint16 var, uint16 argc, uint1 debugC(kDebugScript, "Opcode %d Movie Time Index %d to %d", op, startTime, endTime); - VideoHandle window = _vm->_video->playMovie(_vm->wrapMovieFilename("ewindow", kMechanicalStack), 253, 0); - _vm->_video->setVideoBounds(window, Audio::Timestamp(0, startTime, 600), Audio::Timestamp(0, endTime, 600)); + VideoHandle window = _vm->_video->playMovie(_vm->wrapMovieFilename("ewindow", kMechanicalStack)); + if (!window) + error("Failed to open ewindow movie"); + + window->moveTo(253, 0); + window->setBounds(Audio::Timestamp(0, startTime, 600), Audio::Timestamp(0, endTime, 600)); _vm->_video->waitUntilMovieEnds(window); } @@ -644,8 +652,12 @@ void Mechanical::o_elevatorTopMovie(uint16 op, uint16 var, uint16 argc, uint16 * debugC(kDebugScript, "Opcode %d Movie Time Index %d to %d", op, startTime, endTime); - VideoHandle window = _vm->_video->playMovie(_vm->wrapMovieFilename("hcelev", kMechanicalStack), 206, 38); - _vm->_video->setVideoBounds(window, Audio::Timestamp(0, startTime, 600), Audio::Timestamp(0, endTime, 600)); + VideoHandle window = _vm->_video->playMovie(_vm->wrapMovieFilename("hcelev", kMechanicalStack)); + if (!window) + error("Failed to open hcelev movie"); + + window->moveTo(206, 38); + window->setBounds(Audio::Timestamp(0, startTime, 600), Audio::Timestamp(0, endTime, 600)); _vm->_video->waitUntilMovieEnds(window); } @@ -653,7 +665,7 @@ void Mechanical::o_fortressRotationSetPosition(uint16 op, uint16 var, uint16 arg debugC(kDebugScript, "Opcode %d: Set fortress position", op); VideoHandle gears = _fortressRotationGears->playMovie(); - uint32 moviePosition = Audio::Timestamp(_vm->_video->getTime(gears), 600).totalNumberOfFrames(); + uint32 moviePosition = Audio::Timestamp(gears->getTime(), 600).totalNumberOfFrames(); // Myst ME short movie workaround, explained in o_fortressRotation_init if (_fortressRotationShortMovieWorkaround) { @@ -788,9 +800,8 @@ void Mechanical::o_elevatorRotation_init(uint16 op, uint16 var, uint16 argc, uin void Mechanical::fortressRotation_run() { VideoHandle gears = _fortressRotationGears->playMovie(); - double oldRate = _vm->_video->getVideoRate(gears).toDouble(); - - uint32 moviePosition = Audio::Timestamp(_vm->_video->getTime(gears), 600).totalNumberOfFrames(); + double oldRate = gears->getRate().toDouble(); + uint32 moviePosition = Audio::Timestamp(gears->getTime(), 600).totalNumberOfFrames(); // Myst ME short movie workaround, explained in o_fortressRotation_init if (_fortressRotationShortMovieWorkaround) { @@ -837,19 +848,19 @@ void Mechanical::fortressRotation_run() { newRate = CLIP<double>(newRate, -2.5, 2.5); - _vm->_video->setVideoRate(gears, Common::Rational((int)(newRate * 1000.0), 1000)); + gears->setRate(Common::Rational((int)(newRate * 1000.0), 1000)); _gearsWereRunning = true; } else if (_gearsWereRunning) { // The fortress has stopped. Set its new position _fortressPosition = (moviePosition + 900) / 1800 % 4; - _vm->_video->setVideoRate(gears, 0); + gears->setRate(0); if (!_fortressRotationShortMovieWorkaround) { - _vm->_video->seekToTime(gears, Audio::Timestamp(0, 1800 * _fortressPosition, 600)); + gears->seek(Audio::Timestamp(0, 1800 * _fortressPosition, 600)); } else { - _vm->_video->seekToTime(gears, Audio::Timestamp(0, 1800 * (_fortressPosition % 2), 600)); + gears->seek(Audio::Timestamp(0, 1800 * (_fortressPosition % 2), 600)); } _vm->_sound->playSoundBlocking(_fortressRotationSounds[_fortressPosition]); @@ -864,9 +875,9 @@ void Mechanical::o_fortressRotation_init(uint16 op, uint16 var, uint16 argc, uin _fortressRotationGears = static_cast<MystResourceType6 *>(_invokingResource); VideoHandle gears = _fortressRotationGears->playMovie(); - _vm->_video->setVideoLooping(gears, true); - _vm->_video->seekToTime(gears, Audio::Timestamp(0, 1800 * _fortressPosition, 600)); - _vm->_video->setVideoRate(gears, 0); + gears->setLooping(true); + gears->seek(Audio::Timestamp(0, 1800 * _fortressPosition, 600)); + gears->setRate(0); _fortressRotationSounds[0] = argv[0]; _fortressRotationSounds[1] = argv[1]; @@ -884,7 +895,7 @@ void Mechanical::o_fortressRotation_init(uint16 op, uint16 var, uint16 argc, uin // ScummVM simulates a longer movie by counting the number of times the movie // looped and adding that time to the current movie position. // Hence allowing the fortress position to be properly computed. - uint32 movieDuration = _vm->_video->getDuration(gears).convertToFramerate(600).totalNumberOfFrames(); + uint32 movieDuration = gears->getDuration().convertToFramerate(600).totalNumberOfFrames(); if (movieDuration == 3680) { _fortressRotationShortMovieWorkaround = true; _fortressRotationShortMovieCount = 0; @@ -924,8 +935,8 @@ void Mechanical::fortressSimulation_run() { _fortressSimulationStartup->pauseMovie(true); VideoHandle holo = _fortressSimulationHolo->playMovie(); - _vm->_video->setVideoLooping(holo, true); - _vm->_video->setVideoRate(holo, 0); + holo->setLooping(true); + holo->setRate(0); _vm->_cursor->showCursor(); @@ -933,9 +944,8 @@ void Mechanical::fortressSimulation_run() { } else { VideoHandle holo = _fortressSimulationHolo->playMovie(); - double oldRate = _vm->_video->getVideoRate(holo).toDouble(); - - uint32 moviePosition = Audio::Timestamp(_vm->_video->getTime(holo), 600).totalNumberOfFrames(); + double oldRate = holo->getRate().toDouble(); + uint32 moviePosition = Audio::Timestamp(holo->getTime(), 600).totalNumberOfFrames(); int32 positionInQuarter = 900 - (moviePosition + 900) % 1800; @@ -968,15 +978,15 @@ void Mechanical::fortressSimulation_run() { newRate = CLIP<double>(newRate, -2.5, 2.5); - _vm->_video->setVideoRate(holo, Common::Rational((int)(newRate * 1000.0), 1000)); + holo->setRate(Common::Rational((int)(newRate * 1000.0), 1000)); _gearsWereRunning = true; } else if (_gearsWereRunning) { // The fortress has stopped. Set its new position uint16 simulationPosition = (moviePosition + 900) / 1800 % 4; - _vm->_video->setVideoRate(holo, 0); - _vm->_video->seekToTime(holo, Audio::Timestamp(0, 1800 * simulationPosition, 600)); + holo->setRate(0); + holo->seek(Audio::Timestamp(0, 1800 * simulationPosition, 600)); _vm->_sound->playSoundBlocking( _fortressRotationSounds[simulationPosition]); _gearsWereRunning = false; diff --git a/engines/mohawk/myst_stacks/mechanical.h b/engines/mohawk/myst_stacks/mechanical.h index 7f3d5143e4..6360b2be2d 100644 --- a/engines/mohawk/myst_stacks/mechanical.h +++ b/engines/mohawk/myst_stacks/mechanical.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/myst_stacks/myst.cpp b/engines/mohawk/myst_stacks/myst.cpp index f17d765c99..98f0aa5349 100644 --- a/engines/mohawk/myst_stacks/myst.cpp +++ b/engines/mohawk/myst_stacks/myst.cpp @@ -8,12 +8,12 @@ * 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. @@ -51,8 +51,6 @@ Myst::Myst(MohawkEngine_Myst *vm) : _dockVaultState = 0; _cabinDoorOpened = 0; _cabinMatchState = 2; - _cabinGaugeMovie = NULL_VID_HANDLE; - _cabinFireMovie = NULL_VID_HANDLE; _matchBurning = false; _tree = 0; _treeAlcove = 0; @@ -691,6 +689,7 @@ void Myst::toggleVar(uint16 var) { else _state.courtyardImageBoxes |= mask; } + break; case 41: // Vault white page if (_globals.ending != 4) { if (_dockVaultState == 1) { @@ -1134,10 +1133,13 @@ void Myst::o_clockWheelsExecute(uint16 op, uint16 var, uint16 argc, uint16 *argv _vm->_system->delayMillis(500); // Gears rise up - VideoHandle gears = _vm->_video->playMovie(_vm->wrapMovieFilename("gears", kMystStack), 305, 33); - _vm->_video->setVideoBounds(gears, Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 650, 600)); - _vm->_video->waitUntilMovieEnds(gears); + VideoHandle gears = _vm->_video->playMovie(_vm->wrapMovieFilename("gears", kMystStack)); + if (!gears) + error("Failed to open gears movie"); + gears->moveTo(305, 33); + gears->setBounds(Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 650, 600)); + _vm->_video->waitUntilMovieEnds(gears); _state.clockTowerBridgeOpen = 1; _vm->redrawArea(12); @@ -1146,8 +1148,12 @@ void Myst::o_clockWheelsExecute(uint16 op, uint16 var, uint16 argc, uint16 *argv _vm->_system->delayMillis(500); // Gears sink down - VideoHandle gears = _vm->_video->playMovie(_vm->wrapMovieFilename("gears", kMystStack), 305, 33); - _vm->_video->setVideoBounds(gears, Audio::Timestamp(0, 700, 600), Audio::Timestamp(0, 1300, 600)); + VideoHandle gears = _vm->_video->playMovie(_vm->wrapMovieFilename("gears", kMystStack)); + if (!gears) + error("Failed to open gears movie"); + + gears->moveTo(305, 33); + gears->setBounds(Audio::Timestamp(0, 700, 600), Audio::Timestamp(0, 1300, 600)); _vm->_video->waitUntilMovieEnds(gears); _state.clockTowerBridgeOpen = 0; @@ -1190,15 +1196,23 @@ void Myst::o_imagerPlayButton(uint16 op, uint16 var, uint16 argc, uint16 *argv) if (_state.imagerActive) { // Mountains disappearing Common::String file = _vm->wrapMovieFilename("vltmntn", kMystStack); - VideoHandle mountain = _vm->_video->playMovie(file, 159, 96, false); - _vm->_video->setVideoBounds(mountain, Audio::Timestamp(0, 11180, 600), Audio::Timestamp(0, 16800, 600)); + VideoHandle mountain = _vm->_video->playMovie(file); + if (!mountain) + error("Failed to open '%s'", file.c_str()); + + mountain->moveTo(159, 96); + mountain->setBounds(Audio::Timestamp(0, 11180, 600), Audio::Timestamp(0, 16800, 600)); _state.imagerActive = 0; } else { // Mountains appearing Common::String file = _vm->wrapMovieFilename("vltmntn", kMystStack); - VideoHandle mountain = _vm->_video->playMovie(file, 159, 96, false); - _vm->_video->setVideoBounds(mountain, Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 11180, 600)); + VideoHandle mountain = _vm->_video->playMovie(file); + if (!mountain) + error("Failed to open '%s'", file.c_str()); + + mountain->moveTo(159, 96); + mountain->setBounds(Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 11180, 600)); _state.imagerActive = 1; } @@ -1211,20 +1225,20 @@ void Myst::o_imagerPlayButton(uint16 op, uint16 var, uint16 argc, uint16 *argv) // Water disappearing VideoHandle water = _imagerMovie->playMovie(); - _vm->_video->setVideoBounds(water, Audio::Timestamp(0, 4204, 600), Audio::Timestamp(0, 6040, 600)); - _vm->_video->setVideoLooping(water, false); + water->setBounds(Audio::Timestamp(0, 4204, 600), Audio::Timestamp(0, 6040, 600)); + water->setLooping(false); _state.imagerActive = 0; } else { // Water appearing VideoHandle water = _imagerMovie->playMovie(); - _vm->_video->setVideoBounds(water, Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 1814, 600)); + water->setBounds(Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 1814, 600)); _vm->_video->waitUntilMovieEnds(water); // Water looping water = _imagerMovie->playMovie(); - _vm->_video->setVideoBounds(water, Audio::Timestamp(0, 1814, 600), Audio::Timestamp(0, 4204, 600)); - _vm->_video->setVideoLooping(water, true); + water->setBounds(Audio::Timestamp(0, 1814, 600), Audio::Timestamp(0, 4204, 600)); + water->setLooping(true); _state.imagerActive = 1; } @@ -1901,11 +1915,19 @@ Common::Rational Myst::boilerComputeGaugeRate(uint16 pressure, uint32 delay) { } void Myst::boilerResetGauge(const Common::Rational &rate) { - if (_vm->_video->endOfVideo(_cabinGaugeMovie)) { + if (!_cabinGaugeMovie || _cabinGaugeMovie->endOfVideo()) { if (_vm->getCurCard() == 4098) { - _cabinGaugeMovie = _vm->_video->playMovie(_vm->wrapMovieFilename("cabingau", kMystStack), 243, 96); + _cabinGaugeMovie = _vm->_video->playMovie(_vm->wrapMovieFilename("cabingau", kMystStack)); + if (!_cabinGaugeMovie) + error("Failed to open cabingau movie"); + + _cabinGaugeMovie->moveTo(243, 96); } else { - _cabinGaugeMovie = _vm->_video->playMovie(_vm->wrapMovieFilename("cabcgfar", kMystStack), 254, 136); + _cabinGaugeMovie = _vm->_video->playMovie(_vm->wrapMovieFilename("cabcgfar", kMystStack)); + if (!_cabinGaugeMovie) + error("Failed to open cabingau movie"); + + _cabinGaugeMovie->moveTo(254, 136); } } @@ -1913,10 +1935,10 @@ void Myst::boilerResetGauge(const Common::Rational &rate) { if (rate > 0) goTo = Audio::Timestamp(0, 0, 600); else - goTo = _vm->_video->getDuration(_cabinGaugeMovie); + goTo = _cabinGaugeMovie->getDuration(); - _vm->_video->seekToTime(_cabinGaugeMovie, goTo); - _vm->_video->setVideoRate(_cabinGaugeMovie, rate); + _cabinGaugeMovie->seek(goTo); + _cabinGaugeMovie->setRate(rate); } void Myst::o_boilerIncreasePressureStop(uint16 op, uint16 var, uint16 argc, uint16 *argv) { @@ -1930,10 +1952,10 @@ void Myst::o_boilerIncreasePressureStop(uint16 op, uint16 var, uint16 argc, uint if (_state.cabinValvePosition > 0) _vm->_sound->replaceBackgroundMyst(8098, 49152); - if (!_vm->_video->endOfVideo(_cabinGaugeMovie)) { + if (_cabinGaugeMovie && !_cabinGaugeMovie->endOfVideo()) { uint16 delay = treeNextMoveDelay(_state.cabinValvePosition); Common::Rational rate = boilerComputeGaugeRate(_state.cabinValvePosition, delay); - _vm->_video->setVideoRate(_cabinGaugeMovie, rate); + _cabinGaugeMovie->setRate(rate); } } else if (_state.cabinValvePosition > 0) @@ -2005,10 +2027,10 @@ void Myst::o_boilerDecreasePressureStop(uint16 op, uint16 var, uint16 argc, uint if (_state.cabinValvePosition > 0) _vm->_sound->replaceBackgroundMyst(8098, 49152); - if (!_vm->_video->endOfVideo(_cabinGaugeMovie)) { + if (_cabinGaugeMovie && !_cabinGaugeMovie->endOfVideo()) { uint16 delay = treeNextMoveDelay(_state.cabinValvePosition); Common::Rational rate = boilerComputeGaugeRate(_state.cabinValvePosition, delay); - _vm->_video->setVideoRate(_cabinGaugeMovie, rate); + _cabinGaugeMovie->setRate(rate); } } else { @@ -2116,7 +2138,7 @@ void Myst::tree_run() { // Check if alcove is accessible treeSetAlcoveAccessible(); - if (_cabinGaugeMovie != NULL_VID_HANDLE) { + if (_cabinGaugeMovie) { Common::Rational rate = boilerComputeGaugeRate(pressure, delay); boilerResetGauge(rate); } @@ -2245,13 +2267,22 @@ void Myst::rocketCheckSolution() { // Book appearing Common::String movieFile = _vm->wrapMovieFilename("selenbok", kMystStack); - _rocketLinkBook = _vm->_video->playMovie(movieFile, 224, 41); - _vm->_video->setVideoBounds(_rocketLinkBook, Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 660, 600)); + _rocketLinkBook = _vm->_video->playMovie(movieFile); + if (!_rocketLinkBook) + error("Failed to open '%s'", movieFile.c_str()); + + _rocketLinkBook->moveTo(224, 41); + _rocketLinkBook->setBounds(Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 660, 600)); _vm->_video->waitUntilMovieEnds(_rocketLinkBook); // Book looping closed - _rocketLinkBook = _vm->_video->playMovie(movieFile, 224, 41, true); - _vm->_video->setVideoBounds(_rocketLinkBook, Audio::Timestamp(0, 660, 600), Audio::Timestamp(0, 3500, 600)); + _rocketLinkBook = _vm->_video->playMovie(movieFile); + if (!_rocketLinkBook) + error("Failed to open '%s'", movieFile.c_str()); + + _rocketLinkBook->moveTo(224, 41); + _rocketLinkBook->setLooping(true); + _rocketLinkBook->setBounds(Audio::Timestamp(0, 660, 600), Audio::Timestamp(0, 3500, 600)); _tempVar = 1; } @@ -2366,7 +2397,7 @@ void Myst::o_rocketOpenBook(uint16 op, uint16 var, uint16 argc, uint16 *argv) { debugC(kDebugScript, "Opcode %d: Rocket open link book", op); // Flyby movie - _vm->_video->setVideoBounds(_rocketLinkBook, Audio::Timestamp(0, 3500, 600), Audio::Timestamp(0, 13100, 600)); + _rocketLinkBook->setBounds(Audio::Timestamp(0, 3500, 600), Audio::Timestamp(0, 13100, 600)); // Set linkable _tempVar = 2; @@ -2888,8 +2919,12 @@ void Myst::clockGearForwardOneStep(uint16 gear) { // Set video bounds uint16 gearPosition = _clockGearsPositions[gear] - 1; - _clockGearsVideos[gear] = _vm->_video->playMovie(_vm->wrapMovieFilename(videos[gear], kMystStack), x[gear], y[gear]); - _vm->_video->setVideoBounds(_clockGearsVideos[gear], + _clockGearsVideos[gear] = _vm->_video->playMovie(_vm->wrapMovieFilename(videos[gear], kMystStack)); + if (!_clockGearsVideos[gear]) + error("Failed to open %s movie", videos[gear]); + + _clockGearsVideos[gear]->moveTo(x[gear], y[gear]); + _clockGearsVideos[gear]->setBounds( Audio::Timestamp(0, startTime[gearPosition], 600), Audio::Timestamp(0, endTime[gearPosition], 600)); } @@ -2901,8 +2936,12 @@ void Myst::clockWeightDownOneStep() { // Set video bounds if (updateVideo) { - _clockWeightVideo = _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wlfch", kMystStack) , 124, 0); - _vm->_video->setVideoBounds(_clockWeightVideo, + _clockWeightVideo = _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wlfch", kMystStack)); + if (!_clockWeightVideo) + error("Failed to open cl1wlfch movie"); + + _clockWeightVideo->moveTo(124, 0); + _clockWeightVideo->setBounds( Audio::Timestamp(0, _clockWeightPosition, 600), Audio::Timestamp(0, _clockWeightPosition + 246, 600)); } @@ -2930,7 +2969,7 @@ void Myst::o_clockLeverEndMove(uint16 op, uint16 var, uint16 argc, uint16 *argv) // Let movies stop playing for (uint i = 0; i < ARRAYSIZE(videos); i++) { VideoHandle handle = _vm->_video->findVideoHandle(_vm->wrapMovieFilename(videos[i], kMystStack)); - if (handle != NULL_VID_HANDLE) + if (handle) _vm->_video->delayUntilMovieEnds(handle); } @@ -2955,8 +2994,12 @@ void Myst::clockGearsCheckSolution() { // Make weight go down _vm->_sound->replaceSoundMyst(9113); - _clockWeightVideo = _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wlfch", kMystStack) , 124, 0); - _vm->_video->setVideoBounds(_clockWeightVideo, + _clockWeightVideo = _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wlfch", kMystStack)); + if (!_clockWeightVideo) + error("Failed to open cl1wlfch movie"); + + _clockWeightVideo->moveTo(124, 0); + _clockWeightVideo->setBounds( Audio::Timestamp(0, _clockWeightPosition, 600), Audio::Timestamp(0, 2214, 600)); _vm->_video->waitUntilMovieEnds(_clockWeightVideo); @@ -2967,7 +3010,7 @@ void Myst::clockGearsCheckSolution() { _vm->_sound->replaceSoundMyst(7113); // Gear opening video - _vm->_video->playMovieBlocking(_vm->wrapMovieFilename("cl1wggat", kMystStack) , 195, 225); + _vm->_video->playMovieBlocking(_vm->wrapMovieFilename("cl1wggat", kMystStack), 195, 225); _state.gearsOpen = 1; _vm->redrawArea(40); @@ -3010,7 +3053,7 @@ void Myst::clockReset() { // Let movies stop playing for (uint i = 0; i < ARRAYSIZE(videos); i++) { VideoHandle handle = _vm->_video->findVideoHandle(_vm->wrapMovieFilename(videos[i], kMystStack)); - if (handle != NULL_VID_HANDLE) + if (handle) _vm->_video->delayUntilMovieEnds(handle); } @@ -3023,9 +3066,13 @@ void Myst::clockReset() { _vm->_sound->replaceSoundMyst(7113); // Gear closing movie - VideoHandle handle = _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wggat", kMystStack) , 195, 225); - _vm->_video->seekToTime(handle, _vm->_video->getDuration(handle)); - _vm->_video->setVideoRate(handle, -1); + VideoHandle handle = _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wggat", kMystStack)); + if (!handle) + error("Failed to open cl1wggat movie"); + + handle->moveTo(195, 225); + handle->seek(handle->getDuration()); + handle->setRate(-1); _vm->_video->waitUntilMovieEnds(handle); // Redraw gear @@ -3037,11 +3084,15 @@ void Myst::clockReset() { } void Myst::clockResetWeight() { - _clockWeightVideo = _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wlfch", kMystStack) , 124, 0); + _clockWeightVideo = _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wlfch", kMystStack)); + if (!_clockWeightVideo) + error("Failed to open cl1wlfch movie"); + + _clockWeightVideo->moveTo(124, 0); // Play the movie backwards, weight going up - _vm->_video->seekToTime(_clockWeightVideo, Audio::Timestamp(0, _clockWeightPosition, 600)); - _vm->_video->setVideoRate(_clockWeightVideo, -1); + _clockWeightVideo->seek(Audio::Timestamp(0, _clockWeightPosition, 600)); + _clockWeightVideo->setRate(-1); // Reset position _clockWeightPosition = 0; @@ -3056,8 +3107,12 @@ void Myst::clockResetGear(uint16 gear) { // Set video bounds, gears going to 3 uint16 gearPosition = _clockGearsPositions[gear] - 1; if (gearPosition != 2) { - _clockGearsVideos[gear] = _vm->_video->playMovie(_vm->wrapMovieFilename(videos[gear], kMystStack), x[gear], y[gear]); - _vm->_video->setVideoBounds(_clockGearsVideos[gear], + _clockGearsVideos[gear] = _vm->_video->playMovie(_vm->wrapMovieFilename(videos[gear], kMystStack)); + if (!_clockGearsVideos[gear]) + error("Failed to open gears movie"); + + _clockGearsVideos[gear]->moveTo(x[gear], y[gear]); + _clockGearsVideos[gear]->setBounds( Audio::Timestamp(0, time[gearPosition], 600), Audio::Timestamp(0, time[2], 600)); } @@ -3200,13 +3255,21 @@ Common::Point Myst::towerRotationMapComputeCoords(const Common::Point ¢er, u } void Myst::towerRotationMapDrawLine(const Common::Point ¢er, const Common::Point &end) { - Graphics::PixelFormat pf = _vm->_system->getScreenFormat(); - uint32 color = 0; + uint32 color; - if (!_towerRotationOverSpot) - color = pf.RGBToColor(0xFF, 0xFF, 0xFF); // White - else - color = pf.RGBToColor(0xFF, 0, 0); // Red + if (_vm->getFeatures() & GF_ME) { + Graphics::PixelFormat pf = _vm->_system->getScreenFormat(); + + if (!_towerRotationOverSpot) + color = pf.RGBToColor(0xFF, 0xFF, 0xFF); // White + else + color = pf.RGBToColor(0xFF, 0, 0); // Red + } else { + if (!_towerRotationOverSpot) + color = 0x00; // White + else + color = 0xF9; // Red + } const Common::Rect rect = Common::Rect(106, 42, 459, 273); @@ -3280,8 +3343,8 @@ void Myst::imager_run() { if (_state.imagerActive && _state.imagerSelection == 67) { VideoHandle water = _imagerMovie->playMovie(); - _vm->_video->setVideoBounds(water, Audio::Timestamp(0, 1814, 600), Audio::Timestamp(0, 4204, 600)); - _vm->_video->setVideoLooping(water, true); + water->setBounds(Audio::Timestamp(0, 1814, 600), Audio::Timestamp(0, 4204, 600)); + water->setLooping(true); } } @@ -3393,8 +3456,11 @@ void Myst::gullsFly1_run() { else x = _vm->_rnd->getRandomNumber(160) + 260; - _vm->_video->playMovie(_vm->wrapMovieFilename(gulls[video], kMystStack), x, 0); + VideoHandle handle = _vm->_video->playMovie(_vm->wrapMovieFilename(gulls[video], kMystStack)); + if (!handle) + error("Failed to open gulls movie"); + handle->moveTo(x, 0); _gullsNextTime = time + _vm->_rnd->getRandomNumber(16667) + 13334; } } @@ -3539,8 +3605,11 @@ void Myst::gullsFly2_run() { if (time > _gullsNextTime) { uint16 video = _vm->_rnd->getRandomNumber(3); if (video != 3) { - _vm->_video->playMovie(_vm->wrapMovieFilename(gulls[video], kMystStack), 424, 0); - + VideoHandle handle = _vm->_video->playMovie(_vm->wrapMovieFilename(gulls[video], kMystStack)); + if (!handle) + error("Failed to open gulls movie"); + + handle->moveTo(424, 0); _gullsNextTime = time + _vm->_rnd->getRandomNumber(16667) + 13334; } } @@ -3571,31 +3640,41 @@ void Myst::o_boilerMovies_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) void Myst::boilerFireInit() { if (_vm->getCurCard() == 4098) { - _cabinFireMovie = _vm->_video->playMovie(_vm->wrapMovieFilename("cabfire", kMystStack), 240, 279, true); - _vm->_video->pauseMovie(_cabinFireMovie, true); + _cabinFireMovie = _vm->_video->playMovie(_vm->wrapMovieFilename("cabfire", kMystStack)); + if (!_cabinFireMovie) + error("Failed to open cabfire movie"); + + _cabinFireMovie->moveTo(240, 279); + _cabinFireMovie->setLooping(true); + _cabinFireMovie->pause(true); _vm->redrawArea(305); boilerFireUpdate(true); } else { if (_state.cabinPilotLightLit == 1 && _state.cabinValvePosition >= 1) { - _cabinFireMovie = _vm->_video->playMovie(_vm->wrapMovieFilename("cabfirfr", kMystStack), 254, 244, true); + _cabinFireMovie = _vm->_video->playMovie(_vm->wrapMovieFilename("cabfirfr", kMystStack)); + if (!_cabinFireMovie) + error("Failed to open cabfirfr movie"); + + _cabinFireMovie->moveTo(254, 244); + _cabinFireMovie->setLooping(true); } } } void Myst::boilerFireUpdate(bool init) { - uint position = _vm->_video->getTime(_cabinFireMovie); + uint position = _cabinFireMovie->getTime(); if (_state.cabinPilotLightLit == 1) { if (_state.cabinValvePosition == 0) { if (position > (uint)Audio::Timestamp(0, 200, 600).msecs() || init) { - _vm->_video->setVideoBounds(_cabinFireMovie, Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 100, 600)); - _vm->_video->pauseMovie(_cabinFireMovie, false); + _cabinFireMovie->setBounds(Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 100, 600)); + _cabinFireMovie->pause(false); } } else { if (position < (uint)Audio::Timestamp(0, 200, 600).msecs() || init) { - _vm->_video->setVideoBounds(_cabinFireMovie, Audio::Timestamp(0, 201, 600), Audio::Timestamp(0, 1900, 600)); - _vm->_video->pauseMovie(_cabinFireMovie, false); + _cabinFireMovie->setBounds(Audio::Timestamp(0, 201, 600), Audio::Timestamp(0, 1900, 600)); + _cabinFireMovie->pause(false); } } } @@ -3603,15 +3682,23 @@ void Myst::boilerFireUpdate(bool init) { void Myst::boilerGaugeInit() { if (_vm->getCurCard() == 4098) { - _cabinGaugeMovie = _vm->_video->playMovie(_vm->wrapMovieFilename("cabingau", kMystStack), 243, 96); + _cabinGaugeMovie = _vm->_video->playMovie(_vm->wrapMovieFilename("cabingau", kMystStack)); + if (!_cabinFireMovie) + error("Failed to open cabingau movie"); + + _cabinFireMovie->moveTo(243, 96); } else { - _cabinGaugeMovie = _vm->_video->playMovie(_vm->wrapMovieFilename("cabcgfar", kMystStack), 254, 136); + _cabinGaugeMovie = _vm->_video->playMovie(_vm->wrapMovieFilename("cabcgfar", kMystStack)); + if (!_cabinFireMovie) + error("Failed to open cabcgfar movie"); + + _cabinFireMovie->moveTo(254, 136); } Audio::Timestamp frame; if (_state.cabinPilotLightLit == 1 && _state.cabinValvePosition > 12) - frame = _vm->_video->getDuration(_cabinGaugeMovie); + frame = _cabinGaugeMovie->getDuration(); else frame = Audio::Timestamp(0, 0, 600); @@ -3671,18 +3758,27 @@ void Myst::greenBook_run() { _vm->_sound->stopSound(); _vm->_sound->pauseBackgroundMyst(); + VideoHandle book = _vm->_video->playMovie(file); + if (!book) + error("Failed to open '%s'", file.c_str()); + + book->moveTo(314, 76); + if (_globals.ending != 4) { _tempVar = 2; - _vm->_video->playMovie(file, 314, 76); } else { - VideoHandle book = _vm->_video->playMovie(file, 314, 76, true); - _vm->_video->setVideoBounds(book, Audio::Timestamp(0, loopStart, 600), Audio::Timestamp(0, loopEnd, 600)); + book->setBounds(Audio::Timestamp(0, loopStart, 600), Audio::Timestamp(0, loopEnd, 600)); + book->setLooping(true); _tempVar = 0; } } else if (_tempVar == 2 && !_vm->_video->isVideoPlaying()) { - VideoHandle book = _vm->_video->playMovie(file, 314, 76); - _vm->_video->setVideoBounds(book, Audio::Timestamp(0, loopStart, 600), Audio::Timestamp(0, loopEnd, 600)); - _vm->_video->setVideoLooping(book, true); + VideoHandle book = _vm->_video->playMovie(file); + if (!book) + error("Failed to open '%s'", file.c_str()); + + book->moveTo(314, 76); + book->setBounds(Audio::Timestamp(0, loopStart, 600), Audio::Timestamp(0, loopEnd, 600)); + book->setLooping(true); _tempVar = 0; } } @@ -3705,8 +3801,11 @@ void Myst::gullsFly3_run() { if (video != 3) { uint16 x = _vm->_rnd->getRandomNumber(280) + 135; - _vm->_video->playMovie(_vm->wrapMovieFilename(gulls[video], kMystStack), x, 0); + VideoHandle handle = _vm->_video->playMovie(_vm->wrapMovieFilename(gulls[video], kMystStack)); + if (!handle) + error("Failed to open gulls movie"); + handle->moveTo(x, 0); _gullsNextTime = time + _vm->_rnd->getRandomNumber(16667) + 13334; } } @@ -3741,8 +3840,8 @@ void Myst::o_treeEntry_exit(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void Myst::o_boiler_exit(uint16 op, uint16 var, uint16 argc, uint16 *argv) { debugC(kDebugScript, "Opcode %d: Exit boiler card", op); - _cabinGaugeMovie = NULL_VID_HANDLE; - _cabinFireMovie = NULL_VID_HANDLE; + _cabinGaugeMovie = VideoHandle(); + _cabinFireMovie = VideoHandle(); } void Myst::o_generatorControlRoom_exit(uint16 op, uint16 var, uint16 argc, uint16 *argv) { diff --git a/engines/mohawk/myst_stacks/myst.h b/engines/mohawk/myst_stacks/myst.h index de88843d59..a83609f640 100644 --- a/engines/mohawk/myst_stacks/myst.h +++ b/engines/mohawk/myst_stacks/myst.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/myst_stacks/preview.cpp b/engines/mohawk/myst_stacks/preview.cpp index 75e870281e..4cae4aaca7 100644 --- a/engines/mohawk/myst_stacks/preview.cpp +++ b/engines/mohawk/myst_stacks/preview.cpp @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/myst_stacks/preview.h b/engines/mohawk/myst_stacks/preview.h index 706220e8ed..0959e935f5 100644 --- a/engines/mohawk/myst_stacks/preview.h +++ b/engines/mohawk/myst_stacks/preview.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/myst_stacks/selenitic.cpp b/engines/mohawk/myst_stacks/selenitic.cpp index a941b14eaa..8b95c7fa53 100644 --- a/engines/mohawk/myst_stacks/selenitic.cpp +++ b/engines/mohawk/myst_stacks/selenitic.cpp @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/myst_stacks/selenitic.h b/engines/mohawk/myst_stacks/selenitic.h index d314c4d810..c669d01012 100644 --- a/engines/mohawk/myst_stacks/selenitic.h +++ b/engines/mohawk/myst_stacks/selenitic.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/myst_stacks/slides.cpp b/engines/mohawk/myst_stacks/slides.cpp index 720926904a..a1413f0d71 100644 --- a/engines/mohawk/myst_stacks/slides.cpp +++ b/engines/mohawk/myst_stacks/slides.cpp @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/myst_stacks/slides.h b/engines/mohawk/myst_stacks/slides.h index 9fb76728b6..fb7868a03c 100644 --- a/engines/mohawk/myst_stacks/slides.h +++ b/engines/mohawk/myst_stacks/slides.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/myst_stacks/stoneship.cpp b/engines/mohawk/myst_stacks/stoneship.cpp index 1359685302..1113ceeac9 100644 --- a/engines/mohawk/myst_stacks/stoneship.cpp +++ b/engines/mohawk/myst_stacks/stoneship.cpp @@ -8,12 +8,12 @@ * 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. @@ -42,6 +42,7 @@ Stoneship::Stoneship(MohawkEngine_Myst *vm) : _tunnelRunning = false; + _state.lightState = 0; _state.generatorDepletionTime = 0; _state.generatorDuration = 0; _cabinMystBookPresent = 0; @@ -424,8 +425,12 @@ void Stoneship::o_cabinBookMovie(uint16 op, uint16 var, uint16 argc, uint16 *arg uint16 startTime = argv[0]; uint16 endTime = argv[1]; - VideoHandle book = _vm->_video->playMovie(_vm->wrapMovieFilename("bkroom", kStoneshipStack), 159, 99); - _vm->_video->setVideoBounds(book, Audio::Timestamp(0, startTime, 600), Audio::Timestamp(0, endTime, 600)); + VideoHandle book = _vm->_video->playMovie(_vm->wrapMovieFilename("bkroom", kStoneshipStack)); + if (!book) + error("Failed to open bkroom movie"); + + book->moveTo(159, 99); + book->setBounds(Audio::Timestamp(0, startTime, 600), Audio::Timestamp(0, endTime, 600)); _vm->_video->waitUntilMovieEnds(book); } @@ -596,9 +601,9 @@ void Stoneship::o_hologramPlayback(uint16 op, uint16 var, uint16 argc, uint16 *a if (_hologramTurnedOn) { if (_hologramDisplayPos) endPoint = _hologramDisplayPos; - _vm->_video->setVideoBounds(displayMovie, Audio::Timestamp(0, startPoint, 600), Audio::Timestamp(0, endPoint, 600)); + displayMovie->setBounds(Audio::Timestamp(0, startPoint, 600), Audio::Timestamp(0, endPoint, 600)); } else { - _vm->_video->setVideoBounds(displayMovie, Audio::Timestamp(0, startPoint, 600), Audio::Timestamp(0, endPoint, 600)); + displayMovie->setBounds(Audio::Timestamp(0, startPoint, 600), Audio::Timestamp(0, endPoint, 600)); } _vm->_video->delayUntilMovieEnds(displayMovie); @@ -672,29 +677,45 @@ void Stoneship::o_chestValveVideos(uint16 op, uint16 var, uint16 argc, uint16 *a if (_state.chestValveState) { // Valve closing - VideoHandle valve = _vm->_video->playMovie(movie, 97, 267); - _vm->_video->setVideoBounds(valve, Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 350, 600)); + VideoHandle valve = _vm->_video->playMovie(movie); + if (!valve) + error("Failed to open '%s'", movie.c_str()); + + valve->moveTo(97, 267); + valve->setBounds(Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 350, 600)); _vm->_video->waitUntilMovieEnds(valve); } else if (_state.chestWaterState) { // Valve opening, spilling water - VideoHandle valve = _vm->_video->playMovie(movie, 97, 267); - _vm->_video->setVideoBounds(valve, Audio::Timestamp(0, 350, 600), Audio::Timestamp(0, 650, 600)); + VideoHandle valve = _vm->_video->playMovie(movie); + if (!valve) + error("Failed to open '%s'", movie.c_str()); + + valve->moveTo(97, 267); + valve->setBounds(Audio::Timestamp(0, 350, 600), Audio::Timestamp(0, 650, 600)); _vm->_video->waitUntilMovieEnds(valve); _vm->_sound->playSound(3132); for (uint i = 0; i < 25; i++) { - valve = _vm->_video->playMovie(movie, 97, 267); - _vm->_video->setVideoBounds(valve, Audio::Timestamp(0, 650, 600), Audio::Timestamp(0, 750, 600)); + valve = _vm->_video->playMovie(movie); + if (!valve) + error("Failed to open '%s'", movie.c_str()); + + valve->moveTo(97, 267); + valve->setBounds(Audio::Timestamp(0, 650, 600), Audio::Timestamp(0, 750, 600)); _vm->_video->waitUntilMovieEnds(valve); } _vm->_sound->resumeBackgroundMyst(); } else { // Valve opening - VideoHandle valve = _vm->_video->playMovie(movie, 97, 267); - _vm->_video->seekToTime(valve, Audio::Timestamp(0, 350, 600)); - _vm->_video->setVideoRate(valve, -1); + VideoHandle valve = _vm->_video->playMovie(movie); + if (!valve) + error("Failed to open '%s'", movie.c_str()); + + valve->moveTo(97, 267); + valve->seek(Audio::Timestamp(0, 350, 600)); + valve->setRate(-1); _vm->_video->waitUntilMovieEnds(valve); } } @@ -715,14 +736,22 @@ void Stoneship::o_trapLockOpen(uint16 op, uint16 var, uint16 argc, uint16 *argv) Common::String movie = _vm->wrapMovieFilename("openloc", kStoneshipStack); - VideoHandle lock = _vm->_video->playMovie(movie, 187, 71); - _vm->_video->setVideoBounds(lock, Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 750, 600)); + VideoHandle lock = _vm->_video->playMovie(movie); + if (!lock) + error("Failed to open '%s'", movie.c_str()); + + lock->moveTo(187, 71); + lock->setBounds(Audio::Timestamp(0, 0, 600), Audio::Timestamp(0, 750, 600)); _vm->_video->waitUntilMovieEnds(lock); _vm->_sound->playSound(2143); - lock = _vm->_video->playMovie(movie, 187, 71); - _vm->_video->setVideoBounds(lock, Audio::Timestamp(0, 750, 600), Audio::Timestamp(0, 10000, 600)); + lock = _vm->_video->playMovie(movie); + if (!lock) + error("Failed to open '%s'", movie.c_str()); + + lock->moveTo(187, 71); + lock->setBounds(Audio::Timestamp(0, 750, 600), Audio::Timestamp(0, 10000, 600)); _vm->_video->waitUntilMovieEnds(lock); if (_state.pumpState != 4) diff --git a/engines/mohawk/myst_stacks/stoneship.h b/engines/mohawk/myst_stacks/stoneship.h index 4125412b4d..4e1b42f26b 100644 --- a/engines/mohawk/myst_stacks/stoneship.h +++ b/engines/mohawk/myst_stacks/stoneship.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/myst_state.cpp b/engines/mohawk/myst_state.cpp index 3a8d233a26..3e54017df8 100644 --- a/engines/mohawk/myst_state.cpp +++ b/engines/mohawk/myst_state.cpp @@ -8,12 +8,12 @@ * 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. @@ -100,6 +100,9 @@ bool MystGameState::load(const Common::String &filename) { syncGameState(s, size == 664); delete loadFile; + // Set Channelwood elevator state to down, because we start on the lower level + _channelwood.elevatorState = 0; + // Switch us back to the intro stack, to the linking book _vm->changeToStack(kIntroStack, 5, 0, 0); diff --git a/engines/mohawk/myst_state.h b/engines/mohawk/myst_state.h index c7a6c0b4ac..b07a0f2469 100644 --- a/engines/mohawk/myst_state.h +++ b/engines/mohawk/myst_state.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/resource.cpp b/engines/mohawk/resource.cpp index d7e829118a..4a4b78e391 100644 --- a/engines/mohawk/resource.cpp +++ b/engines/mohawk/resource.cpp @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/resource.h b/engines/mohawk/resource.h index f2ead7af65..d9074a5b73 100644 --- a/engines/mohawk/resource.h +++ b/engines/mohawk/resource.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/resource_cache.cpp b/engines/mohawk/resource_cache.cpp index e73d8c43d3..0c19934278 100644 --- a/engines/mohawk/resource_cache.cpp +++ b/engines/mohawk/resource_cache.cpp @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/resource_cache.h b/engines/mohawk/resource_cache.h index b7eac9ebd7..b3c5bf7bb9 100644 --- a/engines/mohawk/resource_cache.h +++ b/engines/mohawk/resource_cache.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/riven.cpp b/engines/mohawk/riven.cpp index 71aa371073..898f68c581 100644 --- a/engines/mohawk/riven.cpp +++ b/engines/mohawk/riven.cpp @@ -8,12 +8,12 @@ * 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. @@ -55,7 +55,7 @@ MohawkEngine_Riven::MohawkEngine_Riven(OSystem *syst, const MohawkGameDescriptio _activatedSLST = false; _ignoreNextMouseUp = false; _extrasFile = 0; - _curStack = aspit; + _curStack = kStackUnknown; _hotspots = 0; removeTimer(); @@ -161,7 +161,7 @@ Common::Error MohawkEngine_Riven::run() { // Let's begin, shall we? if (getFeatures() & GF_DEMO) { // Start the demo off with the videos - changeToStack(aspit); + changeToStack(kStackAspit); changeToCard(6); } else if (ConfMan.hasKey("save_slot")) { // Load game from launcher/command line if requested @@ -172,12 +172,12 @@ Common::Error MohawkEngine_Riven::run() { // Attempt to load the game. On failure, just send us to the main menu. if (_saveLoad->loadGame(savedGamesList[gameToLoad]).getCode() != Common::kNoError) { - changeToStack(aspit); + changeToStack(kStackAspit); changeToCard(1); } } else { // Otherwise, start us off at aspit's card 1 (the main menu) - changeToStack(aspit); + changeToStack(kStackAspit); changeToCard(1); } @@ -255,16 +255,16 @@ void MohawkEngine_Riven::handleEvents() { 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 != aspit) - changeToStack(aspit); + 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 != aspit) - changeToStack(aspit); + if (_curStack != kStackAspit) + changeToStack(kStackAspit); changeToCard(6); } break; @@ -343,20 +343,22 @@ struct RivenSpecialChange { uint32 startCardRMAP; byte targetStack; uint32 targetCardRMAP; -} rivenSpecialChange[] = { - { aspit, 0x1f04, ospit, 0x44ad }, // Trap Book - { bspit, 0x1c0e7, ospit, 0x2e76 }, // Dome Linking Book - { gspit, 0x111b1, ospit, 0x2e76 }, // Dome Linking Book - { jspit, 0x28a18, rspit, 0xf94 }, // Tay Linking Book - { jspit, 0x26228, ospit, 0x2e76 }, // Dome Linking Book - { ospit, 0x5f0d, pspit, 0x3bf0 }, // Return from 233rd Age - { ospit, 0x470a, jspit, 0x1508e }, // Return from 233rd Age - { ospit, 0x5c52, gspit, 0x10bea }, // Return from 233rd Age - { ospit, 0x5d68, bspit, 0x1adfd }, // Return from 233rd Age - { ospit, 0x5e49, tspit, 0xe87 }, // Return from 233rd Age - { pspit, 0x4108, ospit, 0x2e76 }, // Dome Linking Book - { rspit, 0x32d8, jspit, 0x1c474 }, // Return from Tay - { tspit, 0x21b69, ospit, 0x2e76 } // Dome Linking Book +}; + +static const RivenSpecialChange rivenSpecialChange[] = { + { kStackAspit, 0x1f04, kStackOspit, 0x44ad }, // Trap Book + { kStackBspit, 0x1c0e7, kStackOspit, 0x2e76 }, // Dome Linking Book + { kStackGspit, 0x111b1, kStackOspit, 0x2e76 }, // Dome Linking Book + { kStackJspit, 0x28a18, kStackRspit, 0xf94 }, // Tay Linking Book + { kStackJspit, 0x26228, kStackOspit, 0x2e76 }, // Dome Linking Book + { kStackOspit, 0x5f0d, kStackPspit, 0x3bf0 }, // Return from 233rd Age + { kStackOspit, 0x470a, kStackJspit, 0x1508e }, // Return from 233rd Age + { kStackOspit, 0x5c52, kStackGspit, 0x10bea }, // Return from 233rd Age + { kStackOspit, 0x5d68, kStackBspit, 0x1adfd }, // Return from 233rd Age + { kStackOspit, 0x5e49, kStackTspit, 0xe87 }, // Return from 233rd Age + { kStackPspit, 0x4108, kStackOspit, 0x2e76 }, // Dome Linking Book + { kStackRspit, 0x32d8, kStackJspit, 0x1c474 }, // Return from Tay + { kStackTspit, 0x21b69, kStackOspit, 0x2e76 } // Dome Linking Book }; void MohawkEngine_Riven::changeToCard(uint16 dest) { @@ -556,16 +558,16 @@ void MohawkEngine_Riven::checkInventoryClick() { // In the demo, check if we've clicked the exit button if (getFeatures() & GF_DEMO) { if (g_demoExitRect->contains(mousePos)) { - if (_curStack == aspit && _curCard == 1) { + if (_curStack == kStackAspit && _curCard == 1) { // From the main menu, go to the "quit" screen changeToCard(12); - } else if (_curStack == aspit && _curCard == 12) { + } else if (_curStack == kStackAspit && _curCard == 12) { // From the "quit" screen, just quit _gameOver = true; } else { // Otherwise, return to the main menu - if (_curStack != aspit) - changeToStack(aspit); + if (_curStack != kStackAspit) + changeToStack(kStackAspit); changeToCard(1); } } @@ -573,7 +575,7 @@ void MohawkEngine_Riven::checkInventoryClick() { } // No inventory shown on aspit - if (_curStack == aspit) + if (_curStack == kStackAspit) return; // Set the return stack/card id's. @@ -589,31 +591,31 @@ void MohawkEngine_Riven::checkInventoryClick() { if (!hasCathBook) { if (g_atrusJournalRect1->contains(mousePos)) { _gfx->hideInventory(); - changeToStack(aspit); + changeToStack(kStackAspit); changeToCard(5); } } else if (!hasTrapBook) { if (g_atrusJournalRect2->contains(mousePos)) { _gfx->hideInventory(); - changeToStack(aspit); + changeToStack(kStackAspit); changeToCard(5); } else if (g_cathJournalRect2->contains(mousePos)) { _gfx->hideInventory(); - changeToStack(aspit); + changeToStack(kStackAspit); changeToCard(6); } } else { if (g_atrusJournalRect3->contains(mousePos)) { _gfx->hideInventory(); - changeToStack(aspit); + changeToStack(kStackAspit); changeToCard(5); } else if (g_cathJournalRect3->contains(mousePos)) { _gfx->hideInventory(); - changeToStack(aspit); + changeToStack(kStackAspit); changeToCard(6); } else if (g_trapBookRect3->contains(mousePos)) { _gfx->hideInventory(); - changeToStack(aspit); + changeToStack(kStackAspit); changeToCard(7); } } @@ -735,16 +737,20 @@ Common::Error MohawkEngine_Riven::saveGameState(int slot, const Common::String & Common::String MohawkEngine_Riven::getStackName(uint16 stack) const { static const char *rivenStackNames[] = { - "aspit", - "bspit", - "gspit", - "jspit", + "<unknown>", "ospit", "pspit", "rspit", - "tspit" + "tspit", + "bspit", + "gspit", + "jspit", + "aspit" }; + // Sanity check. + assert(stack < ARRAYSIZE(rivenStackNames)); + return rivenStackNames[stack]; } @@ -822,7 +828,7 @@ static void sunnersTopStairsTimer(MohawkEngine_Riven *vm) { VideoHandle oldHandle = vm->_video->findVideoHandleRiven(1); uint32 timerTime = 500; - if (oldHandle == NULL_VID_HANDLE || vm->_video->endOfVideo(oldHandle)) { + if (!oldHandle || oldHandle->endOfVideo()) { uint32 &sunnerTime = vm->_vars["jsunnertime"]; if (sunnerTime == 0) { @@ -830,7 +836,7 @@ static void sunnersTopStairsTimer(MohawkEngine_Riven *vm) { } else if (sunnerTime < vm->getTotalPlayTime()) { VideoHandle handle = vm->_video->playMovieRiven(vm->_rnd->getRandomNumberRng(1, 3)); - timerTime = vm->_video->getDuration(handle).msecs() + vm->_rnd->getRandomNumberRng(2, 15) * 1000; + timerTime = handle->getDuration().msecs() + vm->_rnd->getRandomNumberRng(2, 15) * 1000; } sunnerTime = timerTime + vm->getTotalPlayTime(); @@ -852,7 +858,7 @@ static void sunnersMidStairsTimer(MohawkEngine_Riven *vm) { VideoHandle oldHandle = vm->_video->findVideoHandleRiven(1); uint32 timerTime = 500; - if (oldHandle == NULL_VID_HANDLE || vm->_video->endOfVideo(oldHandle)) { + if (!oldHandle || oldHandle->endOfVideo()) { uint32 &sunnerTime = vm->_vars["jsunnertime"]; if (sunnerTime == 0) { @@ -868,7 +874,7 @@ static void sunnersMidStairsTimer(MohawkEngine_Riven *vm) { VideoHandle handle = vm->_video->playMovieRiven(movie); - timerTime = vm->_video->getDuration(handle).msecs() + vm->_rnd->getRandomNumberRng(1, 10) * 1000; + timerTime = handle->getDuration().msecs() + vm->_rnd->getRandomNumberRng(1, 10) * 1000; } sunnerTime = timerTime + vm->getTotalPlayTime(); @@ -890,7 +896,7 @@ static void sunnersLowerStairsTimer(MohawkEngine_Riven *vm) { VideoHandle oldHandle = vm->_video->findVideoHandleRiven(1); uint32 timerTime = 500; - if (oldHandle == NULL_VID_HANDLE || vm->_video->endOfVideo(oldHandle)) { + if (!oldHandle || oldHandle->endOfVideo()) { uint32 &sunnerTime = vm->_vars["jsunnertime"]; if (sunnerTime == 0) { @@ -898,7 +904,7 @@ static void sunnersLowerStairsTimer(MohawkEngine_Riven *vm) { } else if (sunnerTime < vm->getTotalPlayTime()) { VideoHandle handle = vm->_video->playMovieRiven(vm->_rnd->getRandomNumberRng(3, 5)); - timerTime = vm->_video->getDuration(handle).msecs() + vm->_rnd->getRandomNumberRng(1, 30) * 1000; + timerTime = handle->getDuration().msecs() + vm->_rnd->getRandomNumberRng(1, 30) * 1000; } sunnerTime = timerTime + vm->getTotalPlayTime(); @@ -920,7 +926,7 @@ static void sunnersBeachTimer(MohawkEngine_Riven *vm) { VideoHandle oldHandle = vm->_video->findVideoHandleRiven(3); uint32 timerTime = 500; - if (oldHandle == NULL_VID_HANDLE || vm->_video->endOfVideo(oldHandle)) { + if (!oldHandle || oldHandle->endOfVideo()) { uint32 &sunnerTime = vm->_vars["jsunnertime"]; if (sunnerTime == 0) { @@ -932,7 +938,7 @@ static void sunnersBeachTimer(MohawkEngine_Riven *vm) { vm->_video->activateMLST(mlstID, vm->getCurCard()); VideoHandle handle = vm->_video->playMovieRiven(mlstID); - timerTime = vm->_video->getDuration(handle).msecs() + vm->_rnd->getRandomNumberRng(1, 30) * 1000; + timerTime = handle->getDuration().msecs() + vm->_rnd->getRandomNumberRng(1, 30) * 1000; } sunnerTime = timerTime + vm->getTotalPlayTime(); @@ -963,7 +969,7 @@ void MohawkEngine_Riven::installCardTimer() { } void MohawkEngine_Riven::doVideoTimer(VideoHandle handle, bool force) { - assert(handle != NULL_VID_HANDLE); + assert(handle); uint16 id = _scriptMan->getStoredMovieOpcodeID(); @@ -971,7 +977,7 @@ void MohawkEngine_Riven::doVideoTimer(VideoHandle handle, bool force) { return; // Run the opcode if we can at this point - if (force || _video->getTime(handle) >= _scriptMan->getStoredMovieOpcodeTime()) + if (force || handle->getTime() >= _scriptMan->getStoredMovieOpcodeTime()) _scriptMan->runStoredMovieOpcode(); } @@ -997,7 +1003,7 @@ void MohawkEngine_Riven::checkSunnerAlertClick() { // If the alert video is no longer playing, we have nothing left to do VideoHandle handle = _video->findVideoHandleRiven(1); - if (handle == NULL_VID_HANDLE || _video->endOfVideo(handle)) + if (!handle || handle->endOfVideo()) return; sunners = 1; diff --git a/engines/mohawk/riven.h b/engines/mohawk/riven.h index 961d85d61a..9c23d07c52 100644 --- a/engines/mohawk/riven.h +++ b/engines/mohawk/riven.h @@ -8,12 +8,12 @@ * 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. @@ -44,18 +44,20 @@ class RivenConsole; class RivenSaveLoad; class RivenOptionsDialog; -#define RIVEN_STACKS 8 - // Riven Stack Types enum { - aspit = 0, // Main Menu, Books, Setup - bspit = 1, // Book-Making Island - gspit = 2, // Garden Island - jspit = 3, // Jungle Island - ospit = 4, // 233rd Age (Gehn's Office) - pspit = 5, // Prison Island - rspit = 6, // Rebel Age (Tay) - tspit = 7 // Temple Island + kStackUnknown = 0, // Default value for ReturnStackID + kStackOspit = 1, // 233rd Age (Gehn's Office) + kStackPspit = 2, // Prison Island + kStackRspit = 3, // Temple Island + kStackTspit = 4, // Rebel Age (Tay) + kStackBspit = 5, // Book-Making Island + kStackGspit = 6, // Garden Island + kStackJspit = 7, // Jungle Island + kStackAspit = 8, // Main Menu, Books, Setup + + kStackFirst = kStackOspit, + kStackLast = kStackAspit }; // NAME Resource ID's diff --git a/engines/mohawk/riven_external.cpp b/engines/mohawk/riven_external.cpp index 384e89a4cf..00075039fe 100644 --- a/engines/mohawk/riven_external.cpp +++ b/engines/mohawk/riven_external.cpp @@ -8,12 +8,12 @@ * 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. @@ -229,7 +229,7 @@ void RivenExternal::runCredits(uint16 video, uint32 delay) { VideoHandle videoHandle = _vm->_video->findVideoHandleRiven(video); while (!_vm->shouldQuit() && _vm->_gfx->getCurCreditsImage() <= 320) { - if (_vm->_video->getCurFrame(videoHandle) >= (int32)_vm->_video->getFrameCount(videoHandle) - 1) { + if (videoHandle->getCurFrame() >= (int32)videoHandle->getFrameCount() - 1) { if (nextCreditsFrameStart == 0) { // Set us up to start after delay ms nextCreditsFrameStart = _vm->_system->getMillis() + delay; @@ -265,10 +265,10 @@ void RivenExternal::runDomeCheck() { // Check if we clicked while the golden frame was showing VideoHandle video = _vm->_video->findVideoHandleRiven(1); - assert(video != NULL_VID_HANDLE); + assert(video); - int32 curFrame = _vm->_video->getCurFrame(video); - int32 frameCount = _vm->_video->getFrameCount(video); + int32 curFrame = video->getCurFrame(); + int32 frameCount = video->getFrameCount(); // The final frame of the video is the 'golden' frame (double meaning: the // frame that is the magic one is the one with the golden symbol) but we @@ -405,7 +405,7 @@ void RivenExternal::drawDomeSliders(uint16 startHotspot) { // On pspit, the rect is different by two pixels // (alternatively, we could just use hotspot 3 here, but only on pspit is there a hotspot for this) - if (_vm->getCurStack() == pspit) + if (_vm->getCurStack() == kStackPspit) dstAreaRect.translate(-2, 0); // Find out bitmap id @@ -857,8 +857,12 @@ void RivenExternal::xbupdateboiler(uint16 argc, uint16 *argv) { _vm->_video->playMovieRiven(7); } } else { - _vm->_video->disableMovieRiven(7); - _vm->_video->disableMovieRiven(8); + VideoHandle handle = _vm->_video->findVideoHandleRiven(7); + if (handle) + handle->setEnabled(false); + handle = _vm->_video->findVideoHandleRiven(8); + if (handle) + handle->setEnabled(false); } } @@ -1149,8 +1153,8 @@ void RivenExternal::lowerPins() { // Play the video of the pins going down VideoHandle handle = _vm->_video->playMovieRiven(upMovie); - assert(handle != NULL_VID_HANDLE); - _vm->_video->setVideoBounds(handle, Audio::Timestamp(0, startTime, 600), Audio::Timestamp(0, startTime + 550, 600)); + assert(handle); + handle->setBounds(Audio::Timestamp(0, startTime, 600), Audio::Timestamp(0, startTime + 550, 600)); _vm->_video->waitUntilMovieEnds(handle); upMovie = 0; @@ -1181,8 +1185,8 @@ void RivenExternal::xgrotatepins(uint16 argc, uint16 *argv) { // Play the video of the pins rotating VideoHandle handle = _vm->_video->playMovieRiven(_vm->_vars["gupmoov"]); - assert(handle != NULL_VID_HANDLE); - _vm->_video->setVideoBounds(handle, Audio::Timestamp(0, startTime, 600), Audio::Timestamp(0, startTime + 1215, 600)); + assert(handle); + handle->setBounds(Audio::Timestamp(0, startTime, 600), Audio::Timestamp(0, startTime + 1215, 600)); _vm->_video->waitUntilMovieEnds(handle); } @@ -1265,9 +1269,9 @@ void RivenExternal::xgpincontrols(uint16 argc, uint16 *argv) { // Actually play the movie VideoHandle handle = _vm->_video->playMovieRiven(pinMovieCodes[imagePos - 1]); - assert(handle != NULL_VID_HANDLE); + assert(handle); uint32 startTime = 9630 - pinPos * 600; - _vm->_video->setVideoBounds(handle, Audio::Timestamp(0, startTime, 600), Audio::Timestamp(0, startTime + 550, 600)); + handle->setBounds(Audio::Timestamp(0, startTime, 600), Audio::Timestamp(0, startTime + 550, 600)); _vm->_video->waitUntilMovieEnds(handle); // Update the relevant variables @@ -1343,8 +1347,8 @@ void RivenExternal::xgrviewer(uint16 argc, uint16 *argv) { // Now play the movie VideoHandle handle = _vm->_video->playMovieRiven(1); - assert(handle != NULL_VID_HANDLE); - _vm->_video->setVideoBounds(handle, Audio::Timestamp(0, s_viewerTimeIntervals[curPos], 600), Audio::Timestamp(0, s_viewerTimeIntervals[newPos], 600)); + assert(handle); + handle->setBounds(Audio::Timestamp(0, s_viewerTimeIntervals[curPos], 600), Audio::Timestamp(0, s_viewerTimeIntervals[newPos], 600)); _vm->_video->waitUntilMovieEnds(handle); // Set the new position and let the card's scripts take over again @@ -1412,8 +1416,8 @@ void RivenExternal::xglviewer(uint16 argc, uint16 *argv) { // Now play the movie VideoHandle handle = _vm->_video->playMovieRiven(1); - assert(handle != NULL_VID_HANDLE); - _vm->_video->setVideoBounds(handle, Audio::Timestamp(0, s_viewerTimeIntervals[curPos], 600), Audio::Timestamp(0, s_viewerTimeIntervals[newPos], 600)); + assert(handle); + handle->setBounds(Audio::Timestamp(0, s_viewerTimeIntervals[curPos], 600), Audio::Timestamp(0, s_viewerTimeIntervals[newPos], 600)); _vm->_video->waitUntilMovieEnds(handle); // Set the new position to the variable @@ -1467,7 +1471,7 @@ static void catherineViewerIdleTimer(MohawkEngine_Riven *vm) { VideoHandle videoHandle = vm->_video->playMovieRiven(30); // Reset the timer - vm->installTimer(&catherineViewerIdleTimer, vm->_video->getDuration(videoHandle).msecs() + vm->_rnd->getRandomNumber(60) * 1000); + vm->installTimer(&catherineViewerIdleTimer, videoHandle->getDuration().msecs() + vm->_rnd->getRandomNumber(60) * 1000); } void RivenExternal::xglview_prisonon(uint16 argc, uint16 *argv) { @@ -1507,7 +1511,7 @@ void RivenExternal::xglview_prisonon(uint16 argc, uint16 *argv) { _vm->_video->activateMLST(cathMovie, _vm->getCurCard()); VideoHandle videoHandle = _vm->_video->playMovieRiven(30); - timeUntilNextMovie = _vm->_video->getDuration(videoHandle).msecs() + _vm->_rnd->getRandomNumber(60) * 1000; + timeUntilNextMovie = videoHandle->getDuration().msecs() + _vm->_rnd->getRandomNumber(60) * 1000; } else { // Otherwise, just redraw the imager timeUntilNextMovie = _vm->_rnd->getRandomNumberRng(10, 20) * 1000; @@ -1986,7 +1990,7 @@ void RivenExternal::xschool280_playwhark(uint16 argc, uint16 *argv) { Audio::Timestamp startTime = Audio::Timestamp(0, (11560 / 19) * (*posVar), 600); *posVar += number; // Adjust to the end Audio::Timestamp endTime = Audio::Timestamp(0, (11560 / 19) * (*posVar), 600); - _vm->_video->setVideoBounds(handle, startTime, endTime); + handle->setBounds(startTime, endTime); _vm->_video->waitUntilMovieEnds(handle); if (*posVar > 19) { @@ -2016,8 +2020,8 @@ void RivenExternal::xorollcredittime(uint16 argc, uint16 *argv) { // 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"] == rspit) { - _vm->changeToStack(rspit); + if (_vm->_vars["returnstackid"] == kStackRspit) { + _vm->changeToStack(kStackRspit); _vm->changeToCard(2); return; } @@ -2059,7 +2063,7 @@ void RivenExternal::xbookclick(uint16 argc, uint16 *argv) { debug(0, "\tHotspot = %d -> %d", argv[3], hotspotMap[argv[3] - 1]); // Just let the video play while we wait until Gehn opens the trap book for us - while (_vm->_video->getTime(video) < startTime && !_vm->shouldQuit()) { + while (video->getTime() < startTime && !_vm->shouldQuit()) { if (_vm->_video->updateMovies()) _vm->_system->updateScreen(); @@ -2084,7 +2088,7 @@ void RivenExternal::xbookclick(uint16 argc, uint16 *argv) { // 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 (_vm->_video->getTime(video) < endTime && !_vm->shouldQuit()) { + while (video->getTime() < endTime && !_vm->shouldQuit()) { bool updateScreen = _vm->_video->updateMovies(); Common::Event event; @@ -2335,7 +2339,7 @@ static void rebelPrisonWindowTimer(MohawkEngine_Riven *vm) { VideoHandle handle = vm->_video->playMovieRiven(movie); // Ensure the next video starts after this one ends - uint32 timeUntilNextVideo = vm->_video->getDuration(handle).msecs() + vm->_rnd->getRandomNumberRng(38, 58) * 1000; + uint32 timeUntilNextVideo = handle->getDuration().msecs() + vm->_rnd->getRandomNumberRng(38, 58) * 1000; // Save the time in case we leave the card and return vm->_vars["rvillagetime"] = timeUntilNextVideo + vm->getTotalPlayTime(); @@ -2434,7 +2438,7 @@ void RivenExternal::xtexterior300_telescopedown(uint16 argc, uint16 *argv) { static const uint32 timeIntervals[] = { 4320, 3440, 2560, 1760, 880, 0 }; uint16 movieCode = telescopeCover ? 1 : 2; VideoHandle handle = _vm->_video->playMovieRiven(movieCode); - _vm->_video->setVideoBounds(handle, Audio::Timestamp(0, timeIntervals[telescopePos], 600), Audio::Timestamp(0, timeIntervals[telescopePos - 1], 600)); + handle->setBounds(Audio::Timestamp(0, timeIntervals[telescopePos], 600), Audio::Timestamp(0, timeIntervals[telescopePos - 1], 600)); _vm->_sound->playSound(14); // Play the moving sound _vm->_video->waitUntilMovieEnds(handle); @@ -2467,7 +2471,7 @@ void RivenExternal::xtexterior300_telescopeup(uint16 argc, uint16 *argv) { static const uint32 timeIntervals[] = { 0, 800, 1680, 2560, 3440, 4320 }; uint16 movieCode = _vm->_vars["ttelecover"] ? 4 : 5; VideoHandle handle = _vm->_video->playMovieRiven(movieCode); - _vm->_video->setVideoBounds(handle, Audio::Timestamp(0, timeIntervals[telescopePos - 1], 600), Audio::Timestamp(0, timeIntervals[telescopePos], 600)); + handle->setBounds(Audio::Timestamp(0, timeIntervals[telescopePos - 1], 600), Audio::Timestamp(0, timeIntervals[telescopePos], 600)); _vm->_sound->playSound(14); // Play the moving sound _vm->_video->waitUntilMovieEnds(handle); @@ -2513,7 +2517,7 @@ void RivenExternal::xthideinventory(uint16 argc, uint16 *argv) { static const uint32 kMarbleCount = 6; static const int kSmallMarbleWidth = 4; static const int kSmallMarbleHeight = 2; -static const int kLargeMarbleSize = 8; +//static const int kLargeMarbleSize = 8; static const int kMarbleHotspotSize = 13; static const char *s_marbleNames[] = { "tred", "torange", "tyellow", "tgreen", "tblue", "tviolet" }; @@ -2569,26 +2573,47 @@ void RivenExternal::xt7500_checkmarbles(uint16 argc, uint16 *argv) { void RivenExternal::xt7600_setupmarbles(uint16 argc, uint16 *argv) { // Draw the small marbles when we're a step away from the waffle - uint16 baseBitmapId = _vm->findResourceID(ID_TBMP, "*tsmallred"); + + // Convert from marble X coordinate to screen X coordinate + static const uint16 xPosOffsets[] = { + 246, 245, 244, 243, 243, 241, 240, 240, 239, 238, 237, 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, 226, 226, 225 + }; + + // Convert from marble Y coordinate to screen Y coordinate + static const uint16 yPosOffsets[] = { + 261, 263, 265, 267, 268, 270, 272, 274, 276, 278, 281, 284, 285, 288, 290, 293, 295, 298, 300, 303, 306, 309, 311, 314, 316 + }; + + // Handle spacing for y coordinates due to the angle + static const double yAdjusts[] = { + 4.56, 4.68, 4.76, 4.84, 4.84, 4.96, 5.04, 5.04, 5.12, 5.2, 5.28, 5.28, 5.36, 5.44, 5.4, 5.6, 5.72, 5.8, 5.88, 5.96, 6.04, 6.12, 6.2, 6.2, 6.28 + }; + + // Waffle state of 0 is up, 1 down bool waffleDown = _vm->_vars["twaffle"] != 0; // Note that each of the small marble images is exactly 4x2 + // The original seems to scale the marble images from extras.mhk, but + // we're using the pre-scaled images in the stack. + uint16 baseBitmapId = _vm->findResourceID(ID_TBMP, "*tsmallred"); for (uint16 i = 0; i < kMarbleCount; i++) { - uint32 &var = _vm->_vars[s_marbleNames[i]]; + uint32 var = _vm->_vars[s_marbleNames[i]]; if (var == 0) { // The marble is still in its initial place // (Note that this is still drawn even if the waffle is down) - int marbleX = 376 + i * 2; - int marbleY = 253 + i * 4; - _vm->_gfx->copyImageToScreen(baseBitmapId + i, marbleX, marbleY, marbleX + kSmallMarbleWidth, marbleY + kSmallMarbleHeight); + static const uint16 defaultX[] = { 375, 377, 379, 381, 383, 385 }; + static const uint16 defaultY[] = { 253, 257, 261, 265, 268, 273 }; + _vm->_gfx->copyImageToScreen(baseBitmapId + i, defaultX[i], defaultY[i], defaultX[i] + kSmallMarbleWidth, defaultY[i] + kSmallMarbleHeight); } else if (waffleDown) { // The marble is on the grid and the waffle is down // (Nothing to draw here) } else { // The marble is on the grid and the waffle is up - // TODO: Draw them onto the grid + int marbleX = (int)floor(getMarbleX(var) * yAdjusts[getMarbleY(var)] + xPosOffsets[getMarbleY(var)] + 0.5); + int marbleY = yPosOffsets[getMarbleY(var)]; + _vm->_gfx->copyImageToScreen(baseBitmapId + i, marbleX, marbleY, marbleX + kSmallMarbleWidth, marbleY + kSmallMarbleHeight); } } } diff --git a/engines/mohawk/riven_external.h b/engines/mohawk/riven_external.h index 9f076325a2..58dfde1a00 100644 --- a/engines/mohawk/riven_external.h +++ b/engines/mohawk/riven_external.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/riven_graphics.cpp b/engines/mohawk/riven_graphics.cpp index 05e66a3924..b44fbb828e 100644 --- a/engines/mohawk/riven_graphics.cpp +++ b/engines/mohawk/riven_graphics.cpp @@ -8,12 +8,12 @@ * 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. @@ -255,7 +255,7 @@ void RivenGraphics::runScheduledTransition() { } // For now, just copy the image to screen without doing any transition. - _vm->_system->copyRectToScreen(_mainScreen->pixels, _mainScreen->pitch, 0, 0, _mainScreen->w, _mainScreen->h); + _vm->_system->copyRectToScreen(_mainScreen->getPixels(), _mainScreen->pitch, 0, 0, _mainScreen->w, _mainScreen->h); _vm->_system->updateScreen(); _scheduledTransition = -1; // Clear scheduled transition @@ -289,7 +289,7 @@ void RivenGraphics::showInventory() { drawInventoryImage(101, g_demoExitRect); } else { // We don't want to show the inventory on setup screens or in other journals. - if (_vm->getCurStack() == aspit) + if (_vm->getCurStack() == kStackAspit) return; // There are three books and three vars. We have three different @@ -345,7 +345,7 @@ void RivenGraphics::drawInventoryImage(uint16 id, const Common::Rect *rect) { mhkSurface->convertToTrueColor(); Graphics::Surface *surface = mhkSurface->getSurface(); - _vm->_system->copyRectToScreen(surface->pixels, surface->pitch, rect->left, rect->top, surface->w, surface->h); + _vm->_system->copyRectToScreen(surface->getPixels(), surface->pitch, rect->left, rect->top, surface->w, surface->h); delete mhkSurface; } @@ -420,7 +420,7 @@ void RivenGraphics::updateCredits() { } else { // Otheriwse, we're scrolling // Move the screen up one row - memmove(_mainScreen->pixels, _mainScreen->getBasePtr(0, 1), _mainScreen->pitch * (_mainScreen->h - 1)); + memmove(_mainScreen->getPixels(), _mainScreen->getBasePtr(0, 1), _mainScreen->pitch * (_mainScreen->h - 1)); // Only update as long as we're not before the last frame // Otherwise, we're just moving up a row (which we already did) @@ -437,7 +437,7 @@ void RivenGraphics::updateCredits() { } // Now flush the new screen - _vm->_system->copyRectToScreen(_mainScreen->pixels, _mainScreen->pitch, 0, 0, _mainScreen->w, _mainScreen->h); + _vm->_system->copyRectToScreen(_mainScreen->getPixels(), _mainScreen->pitch, 0, 0, _mainScreen->w, _mainScreen->h); _vm->_system->updateScreen(); } } diff --git a/engines/mohawk/riven_graphics.h b/engines/mohawk/riven_graphics.h index 48dda28afd..577e5e6911 100644 --- a/engines/mohawk/riven_graphics.h +++ b/engines/mohawk/riven_graphics.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/riven_saveload.cpp b/engines/mohawk/riven_saveload.cpp index f5bf7782d4..6af66f7a2d 100644 --- a/engines/mohawk/riven_saveload.cpp +++ b/engines/mohawk/riven_saveload.cpp @@ -8,12 +8,12 @@ * 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. @@ -38,56 +38,6 @@ Common::StringArray RivenSaveLoad::generateSaveGameList() { return _saveFileMan->listSavefiles("*.rvn"); } -// Note: The stack numbers we use do not match up to what the original executable, -// so, match them ;) -static uint16 mapOldStackIDToNew(uint16 oldID) { - switch (oldID) { - case 1: - return ospit; - case 2: - return pspit; - case 3: - return rspit; - case 4: - return tspit; - case 5: - return bspit; - case 6: - return gspit; - case 7: - return jspit; - case 8: - return aspit; - } - - error("Unknown old stack ID %d", oldID); - return 0; -} - -static uint16 mapNewStackIDToOld(uint16 newID) { - switch (newID) { - case aspit: - return 8; - case bspit: - return 5; - case gspit: - return 6; - case jspit: - return 7; - case ospit: - return 1; - case pspit: - return 2; - case rspit: - return 3; - case tspit: - return 4; - } - - error("Unknown new stack ID %d", newID); - return 0; -} - Common::Error RivenSaveLoad::loadGame(Common::String filename) { if (_vm->getFeatures() & GF_DEMO) // Don't load games in the demo return Common::kNoError; @@ -141,9 +91,6 @@ Common::Error RivenSaveLoad::loadGame(Common::String filename) { names->readUint16BE(); // Skip unknown values uint32 curNamesPos = names->pos(); - uint16 stackID = 0; - uint16 cardID = 0; - for (uint32 i = 0; i < namesCount && !names->eos(); i++) { names->seek(curNamesPos); names->seek(stringOffsets[i], SEEK_CUR); @@ -165,25 +112,18 @@ Common::Error RivenSaveLoad::loadGame(Common::String filename) { uint32 &var = _vm->_vars[name]; name.toLowercase(); - // Handle any special variables here // WORKAROUND: time variables are reset here for one main reason: // The save does not store any start point for the time, so we don't know the real time. // Because of this, in many cases, the original would just give a 'free' Ytram upon saving // since the time would be used in a new (improper) time frame. - if (name.equalsIgnoreCase("CurrentStackID")) // Remap to our definitions, store for later - stackID = mapOldStackIDToNew(rawVariables[i]); - else if (name.equalsIgnoreCase("CurrentCardID")) // Store for later - cardID = rawVariables[i]; - else if (name.equalsIgnoreCase("ReturnStackID") && var != 0) // if 0, the game did not use the variable yet - var = mapOldStackIDToNew(rawVariables[i]); - else if (name.contains("time")) // WORKAROUND: See above + if (name.contains("time")) var = 0; - else // Otherwise, just store it + else var = rawVariables[i]; } - _vm->changeToStack(stackID); - _vm->changeToCard(cardID); + _vm->changeToStack(_vm->_vars["CurrentStackID"]); + _vm->changeToCard(_vm->_vars["CurrentCardID"]); delete names; delete[] stringOffsets; @@ -224,14 +164,7 @@ Common::MemoryWriteStreamDynamic *RivenSaveLoad::genVARSSection() { for (RivenVariableMap::const_iterator it = _vm->_vars.begin(); it != _vm->_vars.end(); it++) { stream->writeUint32BE(0); // Unknown stream->writeUint32BE(0); // Unknown - - // Remap returnstackid here because we don't actually want to change - // our internal returnstackid. - uint32 variable = it->_value; - if (it->_key == "returnstackid") - variable = mapNewStackIDToOld(variable); - - stream->writeUint32BE(variable); + stream->writeUint32BE(it->_value); } return stream; @@ -290,7 +223,7 @@ Common::Error RivenSaveLoad::saveGame(Common::String filename) { filename += ".rvn"; // Convert class variables to variable numbers - _vm->_vars["currentstackid"] = mapNewStackIDToOld(_vm->getCurStack()); + _vm->_vars["currentstackid"] = _vm->getCurStack(); _vm->_vars["currentcardid"] = _vm->getCurCard(); Common::OutSaveFile *saveFile = _saveFileMan->openForSaving(filename); diff --git a/engines/mohawk/riven_saveload.h b/engines/mohawk/riven_saveload.h index 37b73c26c6..a6ddce5713 100644 --- a/engines/mohawk/riven_saveload.h +++ b/engines/mohawk/riven_saveload.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/riven_scripts.cpp b/engines/mohawk/riven_scripts.cpp index 352a018990..caa235ec8b 100644 --- a/engines/mohawk/riven_scripts.cpp +++ b/engines/mohawk/riven_scripts.cpp @@ -8,12 +8,12 @@ * 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. @@ -403,7 +403,7 @@ void RivenScript::stopSound(uint16 op, uint16 argc, uint16 *argv) { // would cause all ambient sounds not to play. An alternative // fix would be to stop all scripts on a stack change, but this // does fine for now. - if (_vm->getCurStack() == tspit && (_vm->getCurCardRMAP() == 0x6e9a || _vm->getCurCardRMAP() == 0xfeeb)) + if (_vm->getCurStack() == kStackTspit && (_vm->getCurCardRMAP() == 0x6e9a || _vm->getCurCardRMAP() == 0xfeeb)) return; // The argument is a bitflag for the setting. @@ -493,7 +493,9 @@ void RivenScript::changeStack(uint16 op, uint16 argc, uint16 *argv) { // Command 28: disable a movie void RivenScript::disableMovie(uint16 op, uint16 argc, uint16 *argv) { - _vm->_video->disableMovieRiven(argv[0]); + VideoHandle handle = _vm->_video->findVideoHandleRiven(argv[0]); + if (handle) + handle->setEnabled(false); } // Command 29: disable all movies @@ -503,7 +505,9 @@ void RivenScript::disableAllMovies(uint16 op, uint16 argc, uint16 *argv) { // Command 31: enable a movie void RivenScript::enableMovie(uint16 op, uint16 argc, uint16 *argv) { - _vm->_video->enableMovieRiven(argv[0]); + VideoHandle handle = _vm->_video->findVideoHandleRiven(argv[0]); + if (handle) + handle->setEnabled(true); } // Command 32: play foreground movie - blocking (movie_id) @@ -586,7 +590,7 @@ void RivenScript::activatePLST(uint16 op, uint16 argc, uint16 *argv) { void RivenScript::activateSLST(uint16 op, uint16 argc, uint16 *argv) { // WORKAROUND: Disable the SLST that is played during Riven's intro. // Riven X does this too (spoke this over with Jeff) - if (_vm->getCurStack() == tspit && _vm->getCurCardRMAP() == 0x6e9a && argv[0] == 2) + if (_vm->getCurStack() == kStackTspit && _vm->getCurCardRMAP() == 0x6e9a && argv[0] == 2) return; _vm->_sound->playSLST(argv[0], _vm->getCurCard()); diff --git a/engines/mohawk/riven_scripts.h b/engines/mohawk/riven_scripts.h index 6df4a2e523..b669cd5081 100644 --- a/engines/mohawk/riven_scripts.h +++ b/engines/mohawk/riven_scripts.h @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/riven_vars.cpp b/engines/mohawk/riven_vars.cpp index 8ddb76eec9..f09aba7f90 100644 --- a/engines/mohawk/riven_vars.cpp +++ b/engines/mohawk/riven_vars.cpp @@ -8,12 +8,12 @@ * 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. @@ -31,240 +31,240 @@ namespace Mohawk { static const char *variableNames[] = { // aspit - "aatrusbook", - "aatruspage", - "acathbook", - "acathpage", - "acathstate", - "adoit", - "adomecombo", - "agehn", - "ainventory", - "aova", - "apower", - "araw", - "atemp", - "atrap", - "atrapbook", - "auservolume", - "azip", + "aAtrusBook", + "aAtrusPage", + "aCathBook", + "aCathPage", + "aCathState", + "aDoIt", + "aDomeCombo", + "aGehn", + "aInventory", + "aOva", + "aPower", + "aRaw", + "aTemp", + "aTrap", + "aTrapBook", + "aUserVolume", + "aZip", // bspit - "bbacklock", - "bbait", - "bbigbridge", - "bbirds", - "bblrarm", - "bblrdoor", - "bblrgrt", - "bblrsw", - "bblrvalve", - "bblrwtr", - "bbook", - "bbrlever", - "bcavedoor", + "bBackLock", + "bBait", + "bBigBridge", + "bBirds", + "bBlrArm", + "bBlrDoor", + "bBlrGrt", + "bBlrSw", + "bBlrValve", + "bBlrWtr", + "bBook", + "bBrLever", + "bCaveDoor", "bcombo", - "bcpipegr", - "bcratergg", - "bdome", - "bdrwr", - "bfans", - "bfmdoor", - "bidvlv", - "blab", - "blabbackdr", - "blabbook", - "blabeye", - "blabfrontdr", - "blabpage", - "blever", - "bfrontlock", - "bheat", - "bmagcar", - "bpipdr", - "bprs", - "bstove", - "btrap", - "bvalve", - "bvise", - "bytram", - "bytramtime", - "bytrap", - "bytrapped", + "bCPipeGr", + "bCraterGg", + "bDome", + "bDrwr", + "bFans", + "bFMDoor", + "bIdVlv", + "bLab", + "bLabBackDr", + "bLabBook", + "bLabEye", + "bLabFrontDr", + "bLabPage", + "bLever", + "bFrontLock", + "bHeat", + "bMagCar", + "bPipDr", + "bPrs", + "bStove", + "bTrap", + "bValve", + "bVise", + "bYtram", + "bYtramTime", + "bYtrap", + "bYtrapped", // gspit - "gbook", - "gcathtime", - "gcathstate", - "gcombo", - "gdome", - "gemagcar", - "gimagecurr", + "gBook", + "gCathTime", + "gCathState", + "gCombo", + "gDome", + "gEmagCar", + "gImageCurr", "gimagemax", - "gimagerot", - "glkbtns", - "glkbridge", - "glkelev", - "glview", - "glviewmpos", - "glviewpos", - "gnmagrot", - "gnmagcar", - "gpinup", - "gpinpos", - "gpinsmpos", - "grview", - "grviewmpos", - "grviewpos", - "gscribe", - "gscribetime", - "gsubelev", - "gsubdr", - "gupmoov", - "gwhark", - "gwharktime", + "gImageRot", + "gLkBtns", + "gLkBridge", + "gLkElev", + "gLView", + "gLViewMPos", + "gLViewPos", + "gNmagRot", + "gNmagCar", + "gPinUp", + "gPinPos", + "gPinsMPos", + "gRView", + "gRViewMPos", + "gRViewPos", + "gScribe", + "gScribeTime", + "gSubElev", + "gSubDr", + "gUpMoov", + "gWhark", + "gWharkTime", // jspit - "jwmagcar", - "jbeetle", - "jbeetlepool", - "jbook", - "jbridge1", - "jbridge2", - "jbridge3", - "jbridge4", - "jbridge5", - "jccb", - "jcombo", - "jcrg", - "jdome", - "jdrain", - "jgallows", - "jgate", - "jgirl", - "jiconcorrectorder", - "jiconorder", - "jicons", - "jladder", - "jleftpos", - "jpeek", - "jplaybeetle", - "jprebel", - "jprisondr", - "jprisonsecdr", - "jrbook", - "jrightpos", - "jsouthpathdr", - "jschooldr", - "jsub", - "jsubdir", - "jsubhatch", - "jsubsw", - "jsunners", - "jsunnertime", - "jthronedr", - "jtunneldr", - "jtunnellamps", - "jvillagepeople", - "jwarning", - "jwharkpos", - "jwharkram", - "jwmouth", - "jwmagcar", - "jymagcar", + "jWMagCar", + "jBeetle", + "jBeetlePool", + "jBook", + "jBridge1", + "jBridge2", + "jBridge3", + "jBridge4", + "jBridge5", + "jCCB", + "jCombo", + "jCrg", + "jDome", + "jDrain", + "jGallows", + "jGate", + "jGirl", + "jIconCorrectOrder", + "jIconOrder", + "jIcons", + "jLadder", + "jLeftPos", + "jPeek", + "jPlayBeetle", + "jPRebel", + "jPrisonDr", + "jPrisonSecDr", + "jrBook", + "jRightPos", + "jSouthPathDr", + "jSchoolDr", + "jSub", + "jSubDir", + "jSubHatch", + "jSubSw", + "jSunners", + "jSunnerTime", + "jThroneDr", + "jTunnelDr", + "jTunnelLamps", + "jVillagePeople", + "jWarning", + "jWharkPos", + "jWharkRam", + "jWMouth", + "jWMagCar", + "jYMagCar", // ospit "oambient", - "obutton", + "oButton", "ocage", - "odeskbook", - "ogehnpage", - "omusicplayer", - "ostanddrawer", - "ostove", + "oDeskBook", + "oGehnPage", + "oMusicPlayer", + "oStandDrawer", + "oStove", // pspit - "pbook", - "pcage", - "pcathcheck", - "pcathstate", - "pcathtime", - "pcombo", - "pcorrectorder", + "pBook", + "pCage", + "pCathCheck", + "pCathState", + "pCathTime", + "pCombo", + "pCorrectOrder", "pdome", - "pelevcombo", - "pleftpos", - "prightpos", - "ptemp", - "pwharkpos", + "pElevCombo", + "pLeftPos", + "pRightPos", + "pTemp", + "pWharkPos", // rspit - "rrebel", - "rrebelview", - "rrichard", - "rvillagetime", + "rRebel", + "rRebelView", + "rRichard", + "rVillageTime", // tspit - "tbars", - "tbeetle", - "tblue", - "tbook", - "tbookvalve", - "tcage", - "tcombo", - "tcorrectorder", - "tcovercombo", - "tdl", - "tdome", - "tdomeelev", - "tdomeelevbtn", - "tgatebrhandle", - "tgatebridge", - "tgatestate", - "tgreen", - "tgridoor", - "tgrodoor", - "tgrmdoor", - "tguard", - "timagedoor", - "tmagcar", - "torange", - "tred", - "tsecdoor", - "tsubbridge", - "ttelecover", - "ttelehandle", - "ttelepin", - "ttelescope", - "ttelevalve", - "ttemple", - "ttempledoor", - "ttunneldoor", - "tviewer", - "tviolet", - "twabrvalve", - "twaffle", - "tyellow", + "tBars", + "tBeetle", + "tBlue", + "tBook", + "tBookValve", + "tCage", + "tCombo", + "tCorrectOrder", + "tCoverCombo", + "tDL", + "tDome", + "tDomeElev", + "tDomeElevBtn", + "tGateBrHandle", + "tGateBridge", + "tGateState", + "tGreen", + "tGRIDoor", + "tGRODoor", + "tGRMDoor", + "tGuard", + "tImageDoor", + "tMagCar", + "tOrange", + "tRed", + "tSecDoor", + "tSubBridge", + "tTeleCover", + "tTeleHandle", + "tTelePin", + "tTelescope", + "tTeleValve", + "tTemple", + "tTempleDoor", + "tTunnelDoor", + "tViewer", + "tViolet", + "tWaBrValve", + "tWaffle", + "tYellow", // Miscellaneous "elevbtn1", "elevbtn2", "elevbtn3", - "domecheck", - "transitionsenabled", - "transitionmode", - "waterenabled", - "rivenambients", - "stackvarsinitialized", - "doingsetupscreens", + "domeCheck", + "transitionsEnabled", + "transitionMode", + "waterEnabled", + "RivenAmbients", + "stackVarsInitialized", + "DoingSetupScreens", "all_book", - "playerhasbook", - "returnstackid", - "returncardid", - "newpos", - "themarble", - "currentstackid", - "currentcardid" + "playerHasBook", + "returnStackID", + "returnCardID", + "NewPos", + "theMarble", + "CurrentStackID", + "CurrentCardID" }; uint32 &MohawkEngine_Riven::getStackVar(uint32 index) { diff --git a/engines/mohawk/sound.cpp b/engines/mohawk/sound.cpp index f92bebf10e..198627e012 100644 --- a/engines/mohawk/sound.cpp +++ b/engines/mohawk/sound.cpp @@ -8,12 +8,12 @@ * 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. @@ -77,8 +77,8 @@ void Sound::initMidi() { _midiParser->setTimerRate(_midiDriver->getBaseTempo()); } -Audio::AudioStream *Sound::makeAudioStream(uint16 id, CueList *cueList) { - Audio::AudioStream *audStream = NULL; +Audio::RewindableAudioStream *Sound::makeAudioStream(uint16 id, CueList *cueList) { + Audio::RewindableAudioStream *audStream = NULL; switch (_vm->getGameType()) { case GType_MYST: @@ -109,17 +109,18 @@ Audio::AudioStream *Sound::makeAudioStream(uint16 id, CueList *cueList) { Audio::SoundHandle *Sound::playSound(uint16 id, byte volume, bool loop, CueList *cueList) { debug (0, "Playing sound %d", id); - Audio::AudioStream *audStream = makeAudioStream(id, cueList); + Audio::RewindableAudioStream *rewindStream = makeAudioStream(id, cueList); - if (audStream) { + if (rewindStream) { SndHandle *handle = getHandle(); handle->type = kUsedHandle; handle->id = id; - handle->samplesPerSecond = audStream->getRate(); + handle->samplesPerSecond = rewindStream->getRate(); // Set the stream to loop here if it's requested + Audio::AudioStream *audStream = rewindStream; if (loop) - audStream = Audio::makeLoopingAudioStream((Audio::RewindableAudioStream *)audStream, 0); + audStream = Audio::makeLoopingAudioStream(rewindStream, 0); _vm->_mixer->playStream(Audio::Mixer::kPlainSoundType, &handle->handle, audStream, -1, volume); return &handle->handle; @@ -335,11 +336,12 @@ void Sound::playSLSTSound(uint16 id, bool fade, bool loop, uint16 volume, int16 sndHandle.id = id; _currentSLSTSounds.push_back(sndHandle); - Audio::AudioStream *audStream = makeMohawkWaveStream(_vm->getResource(ID_TWAV, id)); + Audio::RewindableAudioStream *rewindStream = makeMohawkWaveStream(_vm->getResource(ID_TWAV, id)); // Loop here if necessary + Audio::AudioStream *audStream = rewindStream; if (loop) - audStream = Audio::makeLoopingAudioStream((Audio::RewindableAudioStream *)audStream, 0); + audStream = Audio::makeLoopingAudioStream(rewindStream, 0); // TODO: Handle fading, possibly just raise the volume of the channel in increments? @@ -363,7 +365,7 @@ void Sound::resumeSLST() { _vm->_mixer->pauseHandle(*_currentSLSTSounds[i].handle, false); } -Audio::AudioStream *Sound::makeMohawkWaveStream(Common::SeekableReadStream *stream, CueList *cueList) { +Audio::RewindableAudioStream *Sound::makeMohawkWaveStream(Common::SeekableReadStream *stream, CueList *cueList) { uint32 tag = 0; ADPCMStatus adpcmStatus; DataChunk dataChunk; @@ -507,7 +509,7 @@ Audio::AudioStream *Sound::makeMohawkWaveStream(Common::SeekableReadStream *stre return NULL; } -Audio::AudioStream *Sound::makeLivingBooksWaveStream_v1(Common::SeekableReadStream *stream) { +Audio::RewindableAudioStream *Sound::makeLivingBooksWaveStream_v1(Common::SeekableReadStream *stream) { uint16 header = stream->readUint16BE(); uint16 rate = 0; uint32 size = 0; @@ -646,15 +648,15 @@ Audio::SoundHandle *Sound::replaceBackgroundMyst(uint16 id, uint16 volume) { stopBackgroundMyst(); // Play new sound - Audio::AudioStream *audStream = makeAudioStream(id); + Audio::RewindableAudioStream *rewindStream = makeAudioStream(id); - if (audStream) { + if (rewindStream) { _mystBackgroundSound.type = kUsedHandle; _mystBackgroundSound.id = id; - _mystBackgroundSound.samplesPerSecond = audStream->getRate(); + _mystBackgroundSound.samplesPerSecond = rewindStream->getRate(); // Set the stream to loop - audStream = Audio::makeLoopingAudioStream((Audio::RewindableAudioStream *)audStream, 0); + Audio::AudioStream *audStream = Audio::makeLoopingAudioStream(rewindStream, 0); _vm->_mixer->playStream(Audio::Mixer::kPlainSoundType, &_mystBackgroundSound.handle, audStream, -1, volume >> 8); return &_mystBackgroundSound.handle; diff --git a/engines/mohawk/sound.h b/engines/mohawk/sound.h index 12a59cdedf..75c9492d96 100644 --- a/engines/mohawk/sound.h +++ b/engines/mohawk/sound.h @@ -8,12 +8,12 @@ * 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. @@ -156,13 +156,13 @@ private: MidiParser *_midiParser; byte *_midiData; - static Audio::AudioStream *makeMohawkWaveStream(Common::SeekableReadStream *stream, CueList *cueList = NULL); - static Audio::AudioStream *makeLivingBooksWaveStream_v1(Common::SeekableReadStream *stream); + static Audio::RewindableAudioStream *makeMohawkWaveStream(Common::SeekableReadStream *stream, CueList *cueList = NULL); + static Audio::RewindableAudioStream *makeLivingBooksWaveStream_v1(Common::SeekableReadStream *stream); void initMidi(); Common::Array<SndHandle> _handles; SndHandle *getHandle(); - Audio::AudioStream *makeAudioStream(uint16 id, CueList *cueList = NULL); + Audio::RewindableAudioStream *makeAudioStream(uint16 id, CueList *cueList = NULL); uint16 convertMystID(uint16 id); // Myst-specific diff --git a/engines/mohawk/video.cpp b/engines/mohawk/video.cpp index 8b0130d711..ff4a69cd28 100644 --- a/engines/mohawk/video.cpp +++ b/engines/mohawk/video.cpp @@ -8,12 +8,12 @@ * 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. @@ -24,6 +24,7 @@ #include "mohawk/resource.h" #include "mohawk/video.h" +#include "common/algorithm.h" #include "common/debug.h" #include "common/events.h" #include "common/textconsole.h" @@ -37,22 +38,115 @@ namespace Mohawk { -void VideoEntry::clear() { - video = 0; - x = 0; - y = 0; - loop = false; - enabled = false; - start = Audio::Timestamp(0, 1); - filename.clear(); - id = -1; +VideoEntry::VideoEntry() : _video(0), _id(-1), _x(0), _y(0), _loop(false), _enabled(true) { +} + +VideoEntry::VideoEntry(Video::VideoDecoder *video, const Common::String &fileName) : _video(video), _fileName(fileName), _id(-1), _x(0), _y(0), _loop(false), _enabled(true) { +} + +VideoEntry::VideoEntry(Video::VideoDecoder *video, int id) : _video(video), _id(id), _x(0), _y(0), _loop(false), _enabled(true) { +} + +VideoEntry::~VideoEntry() { + close(); +} + +void VideoEntry::close() { + delete _video; + _video = 0; +} + +bool VideoEntry::endOfVideo() const { + return !isOpen() || _video->endOfVideo(); +} + +int VideoEntry::getCurFrame() const { + assert(_video); + return _video->getCurFrame(); +} + +uint32 VideoEntry::getFrameCount() const { + assert(_video); + return _video->getFrameCount(); +} + +uint32 VideoEntry::getTime() const { + assert(_video); + return _video->getTime(); +} + +Audio::Timestamp VideoEntry::getDuration() const { + assert(_video); + return _video->getDuration(); +} + +Common::Rational VideoEntry::getRate() const { + assert(_video); + return _video->getRate(); +} + +void VideoEntry::center() { + assert(_video); + _x = (g_system->getWidth() - _video->getWidth()) / 2; + _y = (g_system->getHeight() - _video->getHeight()) / 2; } -bool VideoEntry::endOfVideo() { - return !video || video->endOfVideo(); +void VideoEntry::setBounds(const Audio::Timestamp &startTime, const Audio::Timestamp &endTime) { + assert(_video); + _start = startTime; + _video->setEndTime(endTime); + _video->seek(startTime); +} + +void VideoEntry::seek(const Audio::Timestamp &time) { + assert(_video); + _video->seek(time); +} + +void VideoEntry::setRate(const Common::Rational &rate) { + assert(_video); + _video->setRate(rate); +} + +void VideoEntry::pause(bool isPaused) { + assert(_video); + _video->pauseVideo(isPaused); +} + +void VideoEntry::start() { + assert(_video); + _video->start(); +} + +void VideoEntry::stop() { + assert(_video); + _video->stop(); +} + +bool VideoEntry::isPlaying() const { + assert(_video); + return _video->isPlaying(); +} + +int VideoEntry::getVolume() const { + assert(_video); + return _video->getVolume(); +} + +void VideoEntry::setVolume(int volume) { + assert(_video); + _video->setVolume(CLIP(volume, 0, 255)); +} + +VideoHandle::VideoHandle(VideoEntryPtr ptr) : _ptr(ptr) { +} + +VideoHandle::VideoHandle(const VideoHandle &handle) : _ptr(handle._ptr) { } VideoManager::VideoManager(MohawkEngine* vm) : _vm(vm) { + // Set dithering enabled, if required + _enableDither = _vm->getGameType() == GType_MYST && !(_vm->getFeatures() & GF_ME); } VideoManager::~VideoManager() { @@ -60,41 +154,42 @@ VideoManager::~VideoManager() { } void VideoManager::pauseVideos() { - for (uint16 i = 0; i < _videoStreams.size(); i++) - if (_videoStreams[i].video) - _videoStreams[i]->pauseVideo(true); + for (VideoList::iterator it = _videos.begin(); it != _videos.end(); it++) + (*it)->pause(true); } void VideoManager::resumeVideos() { - for (uint16 i = 0; i < _videoStreams.size(); i++) - if (_videoStreams[i].video) - _videoStreams[i]->pauseVideo(false); + for (VideoList::iterator it = _videos.begin(); it != _videos.end(); it++) + (*it)->pause(false); } void VideoManager::stopVideos() { - for (uint16 i = 0; i < _videoStreams.size(); i++) - delete _videoStreams[i].video; + for (VideoList::iterator it = _videos.begin(); it != _videos.end(); it++) + (*it)->close(); - _videoStreams.clear(); + _videos.clear(); } -void VideoManager::playMovieBlocking(const Common::String &filename, uint16 x, uint16 y, bool clearScreen) { - VideoHandle videoHandle = createVideoHandle(filename, x, y, false); - if (videoHandle == NULL_VID_HANDLE) +void VideoManager::playMovieBlocking(const Common::String &fileName, uint16 x, uint16 y, bool clearScreen) { + VideoEntryPtr ptr = open(fileName); + if (!ptr) return; + ptr->moveTo(x, y); + // Clear screen if requested if (clearScreen) { _vm->_system->fillScreen(_vm->_system->getScreenFormat().RGBToColor(0, 0, 0)); _vm->_system->updateScreen(); } - waitUntilMovieEnds(videoHandle); + ptr->start(); + waitUntilMovieEnds(ptr); } -void VideoManager::playMovieBlockingCentered(const Common::String &filename, bool clearScreen) { - VideoHandle videoHandle = createVideoHandle(filename, 0, 0, false); - if (videoHandle == NULL_VID_HANDLE) +void VideoManager::playMovieBlockingCentered(const Common::String &fileName, bool clearScreen) { + VideoEntryPtr ptr = open(fileName); + if (!ptr) return; // Clear screen if requested @@ -103,19 +198,22 @@ void VideoManager::playMovieBlockingCentered(const Common::String &filename, boo _vm->_system->updateScreen(); } - _videoStreams[videoHandle].x = (_vm->_system->getWidth() - _videoStreams[videoHandle]->getWidth()) / 2; - _videoStreams[videoHandle].y = (_vm->_system->getHeight() - _videoStreams[videoHandle]->getHeight()) / 2; - - waitUntilMovieEnds(videoHandle); + ptr->center(); + ptr->start(); + waitUntilMovieEnds(ptr); } void VideoManager::waitUntilMovieEnds(VideoHandle videoHandle) { - if (videoHandle == NULL_VID_HANDLE) + if (!videoHandle) return; + // Sanity check + if (videoHandle._ptr->isLooping()) + error("Called waitUntilMovieEnds() on a looping video"); + bool continuePlaying = true; - while (!_videoStreams[videoHandle].endOfVideo() && !_vm->shouldQuit() && continuePlaying) { + while (!videoHandle->endOfVideo() && !_vm->shouldQuit() && continuePlaying) { if (updateMovies()) _vm->_system->updateScreen(); @@ -147,12 +245,22 @@ void VideoManager::waitUntilMovieEnds(VideoHandle videoHandle) { _vm->_system->delayMillis(10); } - delete _videoStreams[videoHandle].video; - _videoStreams[videoHandle].clear(); + // Ensure it's removed + removeEntry(videoHandle._ptr); } void VideoManager::delayUntilMovieEnds(VideoHandle videoHandle) { - while (!_videoStreams[videoHandle].endOfVideo() && !_vm->shouldQuit()) { + // FIXME: Why is this separate from waitUntilMovieEnds? + // It seems to only cut out the event loop (which is bad). + + if (!videoHandle) + return; + + // Sanity check + if (videoHandle._ptr->isLooping()) + error("Called delayUntilMovieEnds() on a looping video"); + + while (!videoHandle->endOfVideo() && !_vm->shouldQuit()) { if (updateMovies()) _vm->_system->updateScreen(); @@ -160,92 +268,85 @@ void VideoManager::delayUntilMovieEnds(VideoHandle videoHandle) { _vm->_system->delayMillis(10); } - delete _videoStreams[videoHandle].video; - _videoStreams[videoHandle].clear(); + // Ensure it's removed + removeEntry(videoHandle._ptr); } -VideoHandle VideoManager::playMovie(const Common::String &filename, int16 x, int16 y, bool loop) { - VideoHandle videoHandle = createVideoHandle(filename, x, y, loop); - if (videoHandle == NULL_VID_HANDLE) - return NULL_VID_HANDLE; - - // Center x if requested - if (x < 0) - _videoStreams[videoHandle].x = (_vm->_system->getWidth() - _videoStreams[videoHandle]->getWidth()) / 2; +VideoHandle VideoManager::playMovie(const Common::String &fileName) { + VideoEntryPtr ptr = open(fileName); + if (!ptr) + return VideoHandle(); - // Center y if requested - if (y < 0) - _videoStreams[videoHandle].y = (_vm->_system->getHeight() - _videoStreams[videoHandle]->getHeight()) / 2; - - return videoHandle; + ptr->start(); + return ptr; } -VideoHandle VideoManager::playMovie(uint16 id, int16 x, int16 y, bool loop) { - VideoHandle videoHandle = createVideoHandle(id, x, y, loop); - if (videoHandle == NULL_VID_HANDLE) - return NULL_VID_HANDLE; - - // Center x if requested - if (x < 0) - _videoStreams[videoHandle].x = (_vm->_system->getWidth() - _videoStreams[videoHandle]->getWidth()) / 2; +VideoHandle VideoManager::playMovie(uint16 id) { + VideoEntryPtr ptr = open(id); + if (!ptr) + return VideoHandle(); - // Center y if requested - if (y < 0) - _videoStreams[videoHandle].y = (_vm->_system->getHeight() - _videoStreams[videoHandle]->getHeight()) / 2; - - return videoHandle; + ptr->start(); + return ptr; } bool VideoManager::updateMovies() { bool updateScreen = false; - for (uint32 i = 0; i < _videoStreams.size() && !_vm->shouldQuit(); i++) { - // Skip deleted videos - if (!_videoStreams[i].video) - continue; - - // Remove any videos that are over - if (_videoStreams[i].endOfVideo()) { - if (_videoStreams[i].loop) { - _videoStreams[i]->seek(_videoStreams[i].start); + for (VideoList::iterator it = _videos.begin(); it != _videos.end(); ) { + // Check of the video has reached the end + if ((*it)->endOfVideo()) { + if ((*it)->isLooping()) { + // Seek back if looping + (*it)->seek((*it)->getStart()); } else { - // Check the video time one last time before deleting it - _vm->doVideoTimer(i, true); - delete _videoStreams[i].video; - _videoStreams[i].clear(); + // Done; close and continue on + (*it)->close(); + it = _videos.erase(it); continue; } } - // Nothing more to do if we're paused - if (_videoStreams[i]->isPaused()) + Video::VideoDecoder *video = (*it)->_video; + + // Ignore paused videos + if (video->isPaused()) { + it++; continue; + } // Check if we need to draw a frame - if (_videoStreams[i]->needsUpdate()) { - const Graphics::Surface *frame = _videoStreams[i]->decodeNextFrame(); + if (video->needsUpdate()) { + const Graphics::Surface *frame = video->decodeNextFrame(); Graphics::Surface *convertedFrame = 0; - if (frame && _videoStreams[i].enabled) { + if (frame && (*it)->isEnabled()) { Graphics::PixelFormat pixelFormat = _vm->_system->getScreenFormat(); if (frame->format != pixelFormat) { - // We don't support downconverting to 8bpp - if (pixelFormat.bytesPerPixel == 1) - error("Cannot convert high color video frame to 8bpp"); + // We don't support downconverting to 8bpp without having + // support in the codec. Set _enableDither if shows up. + if (pixelFormat.bytesPerPixel == 1) { + warning("Cannot convert high color video frame to 8bpp"); + (*it)->close(); + it = _videos.erase(it); + continue; + } // Convert to the current screen format - convertedFrame = frame->convertTo(pixelFormat, _videoStreams[i]->getPalette()); + convertedFrame = frame->convertTo(pixelFormat, video->getPalette()); frame = convertedFrame; - } else if (pixelFormat.bytesPerPixel == 1 && _videoStreams[i]->hasDirtyPalette()) { + } else if (pixelFormat.bytesPerPixel == 1 && video->hasDirtyPalette()) { // Set the palette when running in 8bpp mode only - _vm->_system->getPaletteManager()->setPalette(_videoStreams[i]->getPalette(), 0, 256); + // Don't do this for Myst, which has its own per-stack handling + if (_vm->getGameType() != GType_MYST) + _vm->_system->getPaletteManager()->setPalette(video->getPalette(), 0, 256); } // Clip the width/height to make sure we stay on the screen (Myst does this a few times) - uint16 width = MIN<int32>(_videoStreams[i]->getWidth(), _vm->_system->getWidth() - _videoStreams[i].x); - uint16 height = MIN<int32>(_videoStreams[i]->getHeight(), _vm->_system->getHeight() - _videoStreams[i].y); - _vm->_system->copyRectToScreen(frame->pixels, frame->pitch, _videoStreams[i].x, _videoStreams[i].y, width, height); + uint16 width = MIN<int32>(video->getWidth(), _vm->_system->getWidth() - (*it)->getX()); + uint16 height = MIN<int32>(video->getHeight(), _vm->_system->getHeight() - (*it)->getY()); + _vm->_system->copyRectToScreen(frame->getPixels(), frame->pitch, (*it)->getX(), (*it)->getY(), width, height); // We've drawn something to the screen, make sure we update it updateScreen = true; @@ -259,7 +360,10 @@ bool VideoManager::updateMovies() { } // Check the video time - _vm->doVideoTimer(i, false); + _vm->doVideoTimer(*it, false); + + // Remember to increase the iterator + it++; } // Return true if we need to update the screen @@ -314,241 +418,180 @@ void VideoManager::clearMLST() { } VideoHandle VideoManager::playMovieRiven(uint16 id) { - for (uint16 i = 0; i < _mlstRecords.size(); i++) + for (uint16 i = 0; i < _mlstRecords.size(); i++) { if (_mlstRecords[i].code == id) { - debug(1, "Play tMOV %d (non-blocking) at (%d, %d) %s", _mlstRecords[i].movieID, _mlstRecords[i].left, _mlstRecords[i].top, _mlstRecords[i].loop != 0 ? "looping" : "non-looping"); - return createVideoHandle(_mlstRecords[i].movieID, _mlstRecords[i].left, _mlstRecords[i].top, _mlstRecords[i].loop != 0, _mlstRecords[i].volume); + debug(1, "Play tMOV %d (non-blocking) at (%d, %d) %s, Volume = %d", _mlstRecords[i].movieID, _mlstRecords[i].left, _mlstRecords[i].top, _mlstRecords[i].loop != 0 ? "looping" : "non-looping", _mlstRecords[i].volume); + + VideoEntryPtr ptr = open(_mlstRecords[i].movieID); + if (ptr) { + ptr->moveTo(_mlstRecords[i].left, _mlstRecords[i].top); + ptr->setLooping(_mlstRecords[i].loop != 0); + ptr->setVolume(_mlstRecords[i].volume); + ptr->start(); + } + + return ptr; } + } - return NULL_VID_HANDLE; + return VideoHandle(); } void VideoManager::playMovieBlockingRiven(uint16 id) { - for (uint16 i = 0; i < _mlstRecords.size(); i++) + for (uint16 i = 0; i < _mlstRecords.size(); i++) { if (_mlstRecords[i].code == id) { - debug(1, "Play tMOV %d (blocking) at (%d, %d)", _mlstRecords[i].movieID, _mlstRecords[i].left, _mlstRecords[i].top); - VideoHandle videoHandle = createVideoHandle(_mlstRecords[i].movieID, _mlstRecords[i].left, _mlstRecords[i].top, false); - waitUntilMovieEnds(videoHandle); + debug(1, "Play tMOV %d (blocking) at (%d, %d), Volume = %d", _mlstRecords[i].movieID, _mlstRecords[i].left, _mlstRecords[i].top, _mlstRecords[i].volume); + VideoEntryPtr ptr = open(_mlstRecords[i].movieID); + ptr->moveTo(_mlstRecords[i].left, _mlstRecords[i].top); + ptr->setVolume(_mlstRecords[i].volume); + ptr->start(); + waitUntilMovieEnds(ptr); return; } + } } void VideoManager::stopMovieRiven(uint16 id) { debug(2, "Stopping movie %d", id); - for (uint16 i = 0; i < _mlstRecords.size(); i++) - if (_mlstRecords[i].code == id) - for (uint16 j = 0; j < _videoStreams.size(); j++) - if (_mlstRecords[i].movieID == _videoStreams[j].id) { - delete _videoStreams[j].video; - _videoStreams[j].clear(); - return; - } -} - -void VideoManager::enableMovieRiven(uint16 id) { - debug(2, "Enabling movie %d", id); - for (uint16 i = 0; i < _mlstRecords.size(); i++) - if (_mlstRecords[i].code == id) - for (uint16 j = 0; j < _videoStreams.size(); j++) - if (_mlstRecords[i].movieID == _videoStreams[j].id) { - _videoStreams[j].enabled = true; - return; - } -} - -void VideoManager::disableMovieRiven(uint16 id) { - debug(2, "Disabling movie %d", id); - for (uint16 i = 0; i < _mlstRecords.size(); i++) - if (_mlstRecords[i].code == id) - for (uint16 j = 0; j < _videoStreams.size(); j++) - if (_mlstRecords[i].movieID == _videoStreams[j].id) { - _videoStreams[j].enabled = false; - return; - } + VideoHandle handle = findVideoHandleRiven(id); + if (handle) + removeEntry(handle._ptr); } void VideoManager::disableAllMovies() { debug(2, "Disabling all movies"); - for (uint16 i = 0; i < _videoStreams.size(); i++) - _videoStreams[i].enabled = false; + for (VideoList::iterator it = _videos.begin(); it != _videos.end(); it++) + (*it)->setEnabled(false); } -VideoHandle VideoManager::createVideoHandle(uint16 id, uint16 x, uint16 y, bool loop, byte volume) { - // First, check to see if that video is already playing - for (uint32 i = 0; i < _videoStreams.size(); i++) - if (_videoStreams[i].id == id) - return i; +VideoEntryPtr VideoManager::open(uint16 id) { + // If this video is already playing, return that handle + VideoHandle oldHandle = findVideoHandle(id); + if (oldHandle._ptr) + return oldHandle._ptr; // Otherwise, create a new entry - Video::QuickTimeDecoder *decoder = new Video::QuickTimeDecoder(); - decoder->setChunkBeginOffset(_vm->getResourceOffset(ID_TMOV, id)); - decoder->loadStream(_vm->getResource(ID_TMOV, id)); - decoder->setVolume(volume); - - VideoEntry entry; - entry.clear(); - entry.video = decoder; - entry.x = x; - entry.y = y; - entry.id = id; - entry.loop = loop; - entry.enabled = true; - - entry->start(); - - // Search for any deleted videos so we can take a formerly used slot - for (uint32 i = 0; i < _videoStreams.size(); i++) - if (!_videoStreams[i].video) { - _videoStreams[i] = entry; - return i; - } + Video::QuickTimeDecoder *video = new Video::QuickTimeDecoder(); + video->setChunkBeginOffset(_vm->getResourceOffset(ID_TMOV, id)); + video->loadStream(_vm->getResource(ID_TMOV, id)); + + // Create the entry + VideoEntryPtr entry(new VideoEntry(video, id)); + + // Enable dither if necessary + checkEnableDither(entry); + + // Add it to the video list + _videos.push_back(entry); - // Otherwise, just add it to the list - _videoStreams.push_back(entry); - return _videoStreams.size() - 1; + return entry; } -VideoHandle VideoManager::createVideoHandle(const Common::String &filename, uint16 x, uint16 y, bool loop, byte volume) { - // First, check to see if that video is already playing - for (uint32 i = 0; i < _videoStreams.size(); i++) - if (_videoStreams[i].filename == filename) - return i; +VideoEntryPtr VideoManager::open(const Common::String &fileName) { + // If this video is already playing, return that entry + VideoHandle oldHandle = findVideoHandle(fileName); + if (oldHandle._ptr) + return oldHandle._ptr; // Otherwise, create a new entry - VideoEntry entry; - entry.clear(); - entry.video = new Video::QuickTimeDecoder(); - entry.x = x; - entry.y = y; - entry.filename = filename; - entry.loop = loop; - entry.enabled = true; - - Common::File *file = new Common::File(); - if (!file->open(filename)) { - delete file; - return NULL_VID_HANDLE; + Common::SeekableReadStream *stream = SearchMan.createReadStreamForMember(fileName); + if (!stream) + return VideoEntryPtr(); + + Video::VideoDecoder *video = new Video::QuickTimeDecoder(); + if (!video->loadStream(stream)) { + // FIXME: Better error handling + delete video; + return VideoEntryPtr(); } - entry->loadStream(file); - entry->setVolume(volume); - entry->start(); + // Create the entry + VideoEntryPtr entry(new VideoEntry(video, fileName)); - // Search for any deleted videos so we can take a formerly used slot - for (uint32 i = 0; i < _videoStreams.size(); i++) - if (!_videoStreams[i].video) { - _videoStreams[i] = entry; - return i; - } + // Enable dither if necessary + checkEnableDither(entry); + + // Add it to the video list + _videos.push_back(entry); - // Otherwise, just add it to the list - _videoStreams.push_back(entry); - return _videoStreams.size() - 1; + return entry; } VideoHandle VideoManager::findVideoHandleRiven(uint16 id) { for (uint16 i = 0; i < _mlstRecords.size(); i++) if (_mlstRecords[i].code == id) - for (uint32 j = 0; j < _videoStreams.size(); j++) - if (_videoStreams[j].video && _mlstRecords[i].movieID == _videoStreams[j].id) - return j; + for (VideoList::iterator it = _videos.begin(); it != _videos.end(); it++) + if ((*it)->getID() == _mlstRecords[i].movieID) + return *it; - return NULL_VID_HANDLE; + return VideoHandle(); } VideoHandle VideoManager::findVideoHandle(uint16 id) { - if (!id) - return NULL_VID_HANDLE; + if (id == 0) + return VideoHandle(); - for (uint32 i = 0; i < _videoStreams.size(); i++) - if (_videoStreams[i].video && _videoStreams[i].id == id) - return i; + for (VideoList::iterator it = _videos.begin(); it != _videos.end(); it++) + if ((*it)->getID() == id) + return *it; - return NULL_VID_HANDLE; + return VideoHandle(); } -VideoHandle VideoManager::findVideoHandle(const Common::String &filename) { - if (filename.empty()) - return NULL_VID_HANDLE; - - for (uint32 i = 0; i < _videoStreams.size(); i++) - if (_videoStreams[i].video && _videoStreams[i].filename.equalsIgnoreCase(filename)) - return i; +VideoHandle VideoManager::findVideoHandle(const Common::String &fileName) { + if (fileName.empty()) + return VideoHandle(); - return NULL_VID_HANDLE; -} - -int VideoManager::getCurFrame(VideoHandle handle) { - assert(handle != NULL_VID_HANDLE); - return _videoStreams[handle]->getCurFrame(); -} + for (VideoList::iterator it = _videos.begin(); it != _videos.end(); it++) + if ((*it)->getFileName().equalsIgnoreCase(fileName)) + return *it; -uint32 VideoManager::getFrameCount(VideoHandle handle) { - assert(handle != NULL_VID_HANDLE); - return _videoStreams[handle]->getFrameCount(); -} - -uint32 VideoManager::getTime(VideoHandle handle) { - assert(handle != NULL_VID_HANDLE); - return _videoStreams[handle]->getTime(); -} - -Audio::Timestamp VideoManager::getDuration(VideoHandle handle) { - assert(handle != NULL_VID_HANDLE); - return _videoStreams[handle]->getDuration(); -} - -bool VideoManager::endOfVideo(VideoHandle handle) { - assert(handle != NULL_VID_HANDLE); - return _videoStreams[handle].endOfVideo(); + return VideoHandle(); } bool VideoManager::isVideoPlaying() { - for (uint32 i = 0; i < _videoStreams.size(); i++) - if (!_videoStreams[i].endOfVideo()) + for (VideoList::iterator it = _videos.begin(); it != _videos.end(); it++) + if (!(*it)->endOfVideo()) return true; return false; } -void VideoManager::setVideoBounds(VideoHandle handle, Audio::Timestamp start, Audio::Timestamp end) { - assert(handle != NULL_VID_HANDLE); - _videoStreams[handle].start = start; - _videoStreams[handle]->setEndTime(end); - _videoStreams[handle]->seek(start); -} - -void VideoManager::drawVideoFrame(VideoHandle handle, Audio::Timestamp time) { - assert(handle != NULL_VID_HANDLE); - _videoStreams[handle]->seek(time); +void VideoManager::drawVideoFrame(VideoHandle handle, const Audio::Timestamp &time) { + // FIXME: This should be done separately from the "playing" + // videos eventually. + assert(handle); + handle->seek(time); updateMovies(); - delete _videoStreams[handle].video; - _videoStreams[handle].clear(); + handle->close(); } -void VideoManager::seekToTime(VideoHandle handle, Audio::Timestamp time) { - assert(handle != NULL_VID_HANDLE); - _videoStreams[handle]->seek(time); +VideoManager::VideoList::iterator VideoManager::findEntry(VideoEntryPtr ptr) { + return Common::find(_videos.begin(), _videos.end(), ptr); } -void VideoManager::setVideoLooping(VideoHandle handle, bool loop) { - assert(handle != NULL_VID_HANDLE); - _videoStreams[handle].loop = loop; +void VideoManager::removeEntry(VideoEntryPtr ptr) { + VideoManager::VideoList::iterator it = findEntry(ptr); + if (it != _videos.end()) + _videos.erase(it); } -Common::Rational VideoManager::getVideoRate(VideoHandle handle) const { - assert(handle != NULL_VID_HANDLE); - return _videoStreams[handle]->getRate(); -} +void VideoManager::checkEnableDither(VideoEntryPtr &entry) { + // If we're not dithering, bail out + if (!_enableDither) + return; -void VideoManager::setVideoRate(VideoHandle handle, const Common::Rational &rate) { - assert(handle != NULL_VID_HANDLE); - _videoStreams[handle]->setRate(rate); -} + // Set the palette + byte palette[256 * 3]; + g_system->getPaletteManager()->grabPalette(palette, 0, 256); + entry->_video->setDitheringPalette(palette); -void VideoManager::pauseMovie(VideoHandle handle, bool pause) { - assert(handle != NULL_VID_HANDLE); - _videoStreams[handle]->pauseVideo(pause); + if (entry->_video->getPixelFormat().bytesPerPixel != 1) { + if (entry->getFileName().empty()) + error("Failed to set dither for video tMOV %d", entry->getID()); + else + error("Failed to set dither for video %s", entry->getFileName().c_str()); + } } } // End of namespace Mohawk diff --git a/engines/mohawk/video.h b/engines/mohawk/video.h index 2c4c827aa8..106a32f8e2 100644 --- a/engines/mohawk/video.h +++ b/engines/mohawk/video.h @@ -8,12 +8,12 @@ * 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. @@ -23,9 +23,17 @@ #ifndef MOHAWK_VIDEO_H #define MOHAWK_VIDEO_H +#include "audio/timestamp.h" #include "common/array.h" +#include "common/list.h" +#include "common/noncopyable.h" +#include "common/ptr.h" +#include "common/rational.h" #include "graphics/pixelformat.h" -#include "video/video_decoder.h" + +namespace Video { +class VideoDecoder; +} namespace Mohawk { @@ -43,29 +51,254 @@ struct MLSTRecord { uint16 u1; }; -struct VideoEntry { +/** + * A video monitored by the VideoManager + */ +class VideoEntry : private Common::NonCopyable { + // The private members should be able to be manipulated by VideoManager + friend class VideoManager; + +private: + // Hide the destructor/constructor + // Only VideoManager should be allowed + VideoEntry(); + VideoEntry(Video::VideoDecoder *video, const Common::String &fileName); + VideoEntry(Video::VideoDecoder *video, int id); + +public: + ~VideoEntry(); + + /** + * Convenience implicit cast to bool + */ + operator bool() const { return isOpen(); } + + /** + * Is the video open? + */ + bool isOpen() const { return _video != 0; } + + /** + * Close the video + */ + void close(); + + /** + * Has the video reached its end? + */ + bool endOfVideo() const; + + /** + * Get the X position of where the video is displayed + */ + uint16 getX() const { return _x; } + + /** + * Get the Y position of where the video is displayed + */ + uint16 getY() const { return _y; } + + /** + * Is the video looping? + */ + bool isLooping() const { return _loop; } + + /** + * Is the video enabled? (Drawing to the screen) + */ + bool isEnabled() const { return _enabled; } + + /** + * Get the start time of the video bounds + */ + const Audio::Timestamp &getStart() const { return _start; } + + /** + * Get the file name of the video, or empty if by ID + */ + const Common::String &getFileName() const { return _fileName; } + + /** + * Get the ID of the video, or -1 if by file name + */ + int getID() const { return _id; } + + /** + * Get the current frame of the video + */ + int getCurFrame() const; + + /** + * Get the frame count of the video + */ + uint32 getFrameCount() const; + + /** + * Get the current time position of the video + */ + uint32 getTime() const; + + /** + * Get the duration of the video + */ + Audio::Timestamp getDuration() const; + + /** + * Get the current playback rate of the videos + */ + Common::Rational getRate() const; + + /** + * Move the x position of the video + */ + void setX(uint16 x) { _x = x; } + + /** + * Move the y position of the video + */ + void setY(uint16 y) { _y = y; } + + /** + * Move the video to the specified coordinates + */ + void moveTo(uint16 x, uint16 y) { setX(x); setY(y); } + + /** + * Center the video on the screen + */ + void center(); + + /** + * Set the start time when using video bounds + */ + void setStart(const Audio::Timestamp &time) { _start = time; } + + /** + * Set the video to loop (true) or not (false) + */ + void setLooping(bool loop) { _loop = loop; } + + /** + * Set the video's enabled status + */ + void setEnabled(bool enabled) { _enabled = enabled; } + + /** + * Set the bounds of the video + * + * This automatically seeks to the start time + */ + void setBounds(const Audio::Timestamp &startTime, const Audio::Timestamp &endTime); + + /** + * Seek to the given time + */ + void seek(const Audio::Timestamp &time); + + /** + * Set the playback rate + */ + void setRate(const Common::Rational &rate); + + /** + * Pause the video + */ + void pause(bool isPaused); + + /** + * Start playing the video + */ + void start(); + + /** + * Stop playing the video + */ + void stop(); + + /** + * Is the video playing? + */ + bool isPlaying() const; + + /** + * Get the volume of the video + */ + int getVolume() const; + + /** + * Set the volume of the video + */ + void setVolume(int volume); + +private: + // Non-changing variables + Video::VideoDecoder *_video; + Common::String _fileName; // External video files + int _id; // Internal Mohawk files + // Playback variables - Video::VideoDecoder *video; - uint16 x; - uint16 y; - bool loop; - bool enabled; - Audio::Timestamp start; - - // Identification - Common::String filename; // External video files - int id; // Internal Mohawk files - - // Helper functions - Video::VideoDecoder *operator->() const { assert(video); return video; } // TODO: Remove this eventually - void clear(); - bool endOfVideo(); + uint16 _x; + uint16 _y; + bool _loop; + bool _enabled; + Audio::Timestamp _start; }; -typedef int32 VideoHandle; +typedef Common::SharedPtr<VideoEntry> VideoEntryPtr; -enum { - NULL_VID_HANDLE = -1 +/** + * A handle for manipulating a video + */ +class VideoHandle { + // The private members should be able to be manipulated by VideoManager + friend class VideoManager; + +public: + /** + * Default constructor + */ + VideoHandle() {} + + /** + * Copy constructor + */ + VideoHandle(const VideoHandle &handle); + + /** + * Is this handle pointing to a valid video entry? + */ + bool isValid() const { return _ptr && _ptr->isOpen(); } + + /** + * Convenience implicit cast to bool + */ + operator bool() const { return isValid(); } + + /** + * Simple equality operator + */ + bool operator==(const VideoHandle &other) const { return _ptr.get() == other._ptr.get(); } + + /** + * Simple inequality operator + */ + bool operator!=(const VideoHandle &other) const { return !(*this == other); } + + /** + * Convenience operator-> override to give direct access to the VideoEntry + */ + VideoEntryPtr operator->() const { return _ptr; } + +private: + /** + * Constructor for internal VideoManager use + */ + VideoHandle(VideoEntryPtr ptr); + + /** + * The video entry this is associated with + */ + VideoEntryPtr _ptr; }; class VideoManager { @@ -76,8 +309,8 @@ public: // Generic movie functions void playMovieBlocking(const Common::String &filename, uint16 x = 0, uint16 y = 0, bool clearScreen = false); void playMovieBlockingCentered(const Common::String &filename, bool clearScreen = true); - VideoHandle playMovie(const Common::String &filename, int16 x = -1, int16 y = -1, bool loop = false); - VideoHandle playMovie(uint16 id, int16 x = -1, int16 y = -1, bool loop = false); + VideoHandle playMovie(const Common::String &filename); + VideoHandle playMovie(uint16 id); bool updateMovies(); void pauseVideos(); void resumeVideos(); @@ -87,31 +320,18 @@ public: // Riven-related functions void activateMLST(uint16 mlstId, uint16 card); void clearMLST(); - void enableMovieRiven(uint16 id); - void disableMovieRiven(uint16 id); void disableAllMovies(); VideoHandle playMovieRiven(uint16 id); - void stopMovieRiven(uint16 id); void playMovieBlockingRiven(uint16 id); VideoHandle findVideoHandleRiven(uint16 id); + void stopMovieRiven(uint16 id); // Handle functions VideoHandle findVideoHandle(uint16 id); - VideoHandle findVideoHandle(const Common::String &filename); - int getCurFrame(VideoHandle handle); - uint32 getFrameCount(VideoHandle handle); - uint32 getTime(VideoHandle handle); - Audio::Timestamp getDuration(VideoHandle videoHandle); - bool endOfVideo(VideoHandle handle); - void setVideoBounds(VideoHandle handle, Audio::Timestamp start, Audio::Timestamp end); - void drawVideoFrame(VideoHandle handle, Audio::Timestamp time); - void seekToTime(VideoHandle handle, Audio::Timestamp time); - void setVideoLooping(VideoHandle handle, bool loop); - Common::Rational getVideoRate(VideoHandle handle) const; - void setVideoRate(VideoHandle handle, const Common::Rational &rate); - void waitUntilMovieEnds(VideoHandle videoHandle); - void delayUntilMovieEnds(VideoHandle videoHandle); - void pauseMovie(VideoHandle videoHandle, bool pause); + VideoHandle findVideoHandle(const Common::String &fileName); + void waitUntilMovieEnds(VideoHandle handle); + void delayUntilMovieEnds(VideoHandle handle); + void drawVideoFrame(VideoHandle handle, const Audio::Timestamp &time); private: MohawkEngine *_vm; @@ -120,10 +340,19 @@ private: Common::Array<MLSTRecord> _mlstRecords; // Keep tabs on any videos playing - Common::Array<VideoEntry> _videoStreams; + typedef Common::List<VideoEntryPtr> VideoList; + VideoList _videos; + + // Utility functions for managing entries + VideoEntryPtr open(uint16 id); + VideoEntryPtr open(const Common::String &fileName); + + VideoList::iterator findEntry(VideoEntryPtr ptr); + void removeEntry(VideoEntryPtr ptr); - VideoHandle createVideoHandle(uint16 id, uint16 x, uint16 y, bool loop, byte volume = 0xff); - VideoHandle createVideoHandle(const Common::String &filename, uint16 x, uint16 y, bool loop, byte volume = 0xff); + // Dithering control + bool _enableDither; + void checkEnableDither(VideoEntryPtr &entry); }; } // End of namespace Mohawk diff --git a/engines/mohawk/view.cpp b/engines/mohawk/view.cpp index 719c288af5..1aaf32ea78 100644 --- a/engines/mohawk/view.cpp +++ b/engines/mohawk/view.cpp @@ -8,12 +8,12 @@ * 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. diff --git a/engines/mohawk/view.h b/engines/mohawk/view.h index 06ffe605a3..47853f056f 100644 --- a/engines/mohawk/view.h +++ b/engines/mohawk/view.h @@ -8,12 +8,12 @@ * 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. |
