diff options
Diffstat (limited to 'engines')
148 files changed, 1830 insertions, 1274 deletions
diff --git a/engines/adl/adl.cpp b/engines/adl/adl.cpp index 845fc524e1..58d5fa9e67 100644 --- a/engines/adl/adl.cpp +++ b/engines/adl/adl.cpp @@ -55,10 +55,11 @@ AdlEngine::AdlEngine(OSystem *syst, const AdlGameDescription *gd) : _dumpFile(nullptr), _display(nullptr), _graphics(nullptr), + _textMode(false), _isRestarting(false), _isRestoring(false), _isQuitting(false), - _skipOneCommand(false), + _abortScript(false), _gameDescription(gd), _console(nullptr), _messageIds(), @@ -911,10 +912,6 @@ byte AdlEngine::convertKey(uint16 ascii) const { } Common::String AdlEngine::getLine() { - // Original engine uses a global here, which isn't reset between - // calls and may not match actual mode - bool textMode = false; - while (1) { Common::String line = inputString(APPLECHAR('?')); @@ -922,8 +919,8 @@ Common::String AdlEngine::getLine() { return ""; if ((byte)line[0] == ('\r' | 0x80)) { - textMode = !textMode; - _display->setMode(textMode ? DISPLAY_MODE_TEXT : DISPLAY_MODE_MIXED); + _textMode = !_textMode; + _display->setMode(_textMode ? DISPLAY_MODE_TEXT : DISPLAY_MODE_MIXED); continue; } @@ -1320,20 +1317,18 @@ bool AdlEngine::doOneCommand(const Commands &commands, byte verb, byte noun) { Commands::const_iterator cmd; for (cmd = commands.begin(); cmd != commands.end(); ++cmd) { - - if (_skipOneCommand) { - _skipOneCommand = false; - continue; - } - ScriptEnv env(*cmd, _state.room, verb, noun); if (matchCommand(env)) { doActions(env); return true; } + + if (_abortScript) { + _abortScript = false; + return false; + } } - _skipOneCommand = false; return false; } @@ -1341,11 +1336,6 @@ void AdlEngine::doAllCommands(const Commands &commands, byte verb, byte noun) { Commands::const_iterator cmd; for (cmd = commands.begin(); cmd != commands.end(); ++cmd) { - if (_skipOneCommand) { - _skipOneCommand = false; - continue; - } - ScriptEnv env(*cmd, _state.room, verb, noun); if (matchCommand(env)) { doActions(env); @@ -1353,9 +1343,12 @@ void AdlEngine::doAllCommands(const Commands &commands, byte verb, byte noun) { if (_isRestarting) return; } - } - _skipOneCommand = false; + if (_abortScript) { + _abortScript = false; + return; + } + } } Common::String AdlEngine::toAscii(const Common::String &str) { diff --git a/engines/adl/adl.h b/engines/adl/adl.h index 3630cd69b9..d71d40816e 100644 --- a/engines/adl/adl.h +++ b/engines/adl/adl.h @@ -348,6 +348,7 @@ protected: Display *_display; GraphicsMan *_graphics; + bool _textMode; // Opcodes typedef Common::Functor1<ScriptEnv &, int> Opcode; @@ -391,7 +392,7 @@ protected: bool _isRestarting, _isRestoring, _isQuitting; bool _canSaveNow, _canRestoreNow; - bool _skipOneCommand; + bool _abortScript; const AdlGameDescription *_gameDescription; diff --git a/engines/adl/adl_v2.cpp b/engines/adl/adl_v2.cpp index 9653e2e40b..272e7801e7 100644 --- a/engines/adl/adl_v2.cpp +++ b/engines/adl/adl_v2.cpp @@ -37,6 +37,7 @@ AdlEngine_v2::~AdlEngine_v2() { AdlEngine_v2::AdlEngine_v2(OSystem *syst, const AdlGameDescription *gd) : AdlEngine(syst, gd), _linesPrinted(0), + _maxLines(4), _disk(nullptr), _itemRemoved(false), _roomOnScreen(0), @@ -151,9 +152,11 @@ void AdlEngine_v2::checkTextOverflow(char c) { ++_linesPrinted; - if (_linesPrinted < 4) - return; + if (_linesPrinted >= _maxLines) + handleTextOverflow(); +} +void AdlEngine_v2::handleTextOverflow() { _linesPrinted = 0; _display->updateTextScreen(); bell(); diff --git a/engines/adl/adl_v2.h b/engines/adl/adl_v2.h index f0af9eba22..5447974a2e 100644 --- a/engines/adl/adl_v2.h +++ b/engines/adl/adl_v2.h @@ -62,6 +62,7 @@ protected: int askForSlot(const Common::String &question); void checkTextOverflow(char c); + void handleTextOverflow(); int o2_isFirstTime(ScriptEnv &e); int o2_isRandomGT(ScriptEnv &e); @@ -85,7 +86,7 @@ protected: Common::String restoreInsert, restoreReplace; } _strings_v2; - uint _linesPrinted; + uint _linesPrinted, _maxLines; DiskImage *_disk; Common::Array<DataBlockPtr> _itemPics; bool _itemRemoved; diff --git a/engines/adl/adl_v4.cpp b/engines/adl/adl_v4.cpp index 8370bead6f..e8ee798199 100644 --- a/engines/adl/adl_v4.cpp +++ b/engines/adl/adl_v4.cpp @@ -127,7 +127,7 @@ void AdlEngine_v4::loadState(Common::ReadStream &stream) { if (size != expectedSize) error("Variable count mismatch (expected %i; found %i)", expectedSize, size); - for (uint i = getRegion(1).vars.size(); i < size; ++i) + for (uint i = getRegion(1).vars.size(); i < _state.vars.size(); ++i) _state.vars[i] = stream.readByte(); if (stream.err() || stream.eos()) @@ -238,6 +238,11 @@ void AdlEngine_v4::loadRegionInitDataOffsets(Common::ReadStream &stream, uint re } } +void AdlEngine_v4::initRoomState(RoomState &roomState) const { + roomState.picture = 1; + roomState.isFirstTime = 1; +} + void AdlEngine_v4::initRegions(const byte *roomsPerRegion, uint regions) { _state.regions.resize(regions); @@ -247,12 +252,8 @@ void AdlEngine_v4::initRegions(const byte *roomsPerRegion, uint regions) { regn.vars.resize(24); regn.rooms.resize(roomsPerRegion[r]); - for (uint rm = 0; rm < roomsPerRegion[r]; ++rm) { - // TODO: hires6 uses 0xff and has slightly different - // code working on these values - regn.rooms[rm].picture = 1; - regn.rooms[rm].isFirstTime = 1; - } + for (uint rm = 0; rm < roomsPerRegion[r]; ++rm) + initRoomState(regn.rooms[rm]); } } @@ -395,13 +396,16 @@ void AdlEngine_v4::backupRoomState(byte room) { backup.picture = getRoom(room).picture; } -void AdlEngine_v4::restoreRoomState(byte room) { +byte AdlEngine_v4::restoreRoomState(byte room) { const RoomState &backup = getCurRegion().rooms[room - 1]; if (backup.isFirstTime != 1) { getRoom(room).curPicture = getRoom(room).picture = backup.picture; getRoom(room).isFirstTime = false; + return 0; } + + return 1; } void AdlEngine_v4::backupVars() { diff --git a/engines/adl/adl_v4.h b/engines/adl/adl_v4.h index 08cea21181..ca9aeff492 100644 --- a/engines/adl/adl_v4.h +++ b/engines/adl/adl_v4.h @@ -81,7 +81,8 @@ protected: void loadRegion(byte region); void loadItemPicIndex(Common::ReadStream &stream, uint items); void backupRoomState(byte room); - void restoreRoomState(byte room); + virtual void initRoomState(RoomState &roomState) const; + virtual byte restoreRoomState(byte room); void backupVars(); void restoreVars(); diff --git a/engines/adl/adl_v5.cpp b/engines/adl/adl_v5.cpp index 795899c070..929ffff7f4 100644 --- a/engines/adl/adl_v5.cpp +++ b/engines/adl/adl_v5.cpp @@ -33,6 +33,27 @@ AdlEngine_v5::AdlEngine_v5(OSystem *syst, const AdlGameDescription *gd) : AdlEngine_v4(syst, gd) { } +void AdlEngine_v5::initRoomState(RoomState &roomState) const { + roomState.picture = 0xff; + roomState.isFirstTime = 0xff; +} + +byte AdlEngine_v5::restoreRoomState(byte room) { + const RoomState &backup = getCurRegion().rooms[room - 1]; + + if (backup.isFirstTime != 0xff) { + getRoom(room).curPicture = getRoom(room).picture = backup.picture; + + // CHECKME: Why doesn't this just copy the flag unconditionally? + if (backup.isFirstTime != 1) { + getRoom(room).isFirstTime = false; + return 0; + } + } + + return backup.isFirstTime; +} + AdlEngine_v5::RegionChunkType AdlEngine_v5::getRegionChunkType(const uint16 addr) const { switch (addr) { case 0x7b00: @@ -44,75 +65,6 @@ AdlEngine_v5::RegionChunkType AdlEngine_v5::getRegionChunkType(const uint16 addr } } -typedef Common::Functor1Mem<ScriptEnv &, int, AdlEngine_v5> OpcodeV5; -#define SetOpcodeTable(x) table = &x; -#define Opcode(x) table->push_back(new OpcodeV5(this, &AdlEngine_v5::x)) -#define OpcodeUnImpl() table->push_back(new OpcodeV5(this, 0)) - -void AdlEngine_v5::setupOpcodeTables() { - Common::Array<const Opcode *> *table = 0; - - SetOpcodeTable(_condOpcodes); - // 0x00 - OpcodeUnImpl(); - Opcode(o2_isFirstTime); - Opcode(o2_isRandomGT); - Opcode(o4_isItemInRoom); - // 0x04 - Opcode(o5_isNounNotInRoom); - Opcode(o1_isMovesGT); - Opcode(o1_isVarEQ); - Opcode(o2_isCarryingSomething); - // 0x08 - Opcode(o4_isVarGT); - Opcode(o1_isCurPicEQ); - Opcode(o5_skipOneCommand); - - SetOpcodeTable(_actOpcodes); - // 0x00 - OpcodeUnImpl(); - Opcode(o1_varAdd); - Opcode(o1_varSub); - Opcode(o1_varSet); - // 0x04 - Opcode(o1_listInv); - Opcode(o4_moveItem); - Opcode(o1_setRoom); - Opcode(o2_setCurPic); - // 0x08 - Opcode(o2_setPic); - Opcode(o1_printMsg); - Opcode(o5_dummy); - Opcode(o5_setTextMode); - // 0x0c - Opcode(o2_moveAllItems); - Opcode(o1_quit); - Opcode(o5_dummy); - Opcode(o2_save); - // 0x10 - Opcode(o2_restore); - Opcode(o1_restart); - Opcode(o5_setRegionRoom); - Opcode(o5_dummy); - // 0x14 - Opcode(o1_resetPic); - Opcode(o1_goDirection<IDI_DIR_NORTH>); - Opcode(o1_goDirection<IDI_DIR_SOUTH>); - Opcode(o1_goDirection<IDI_DIR_EAST>); - // 0x18 - Opcode(o1_goDirection<IDI_DIR_WEST>); - Opcode(o1_goDirection<IDI_DIR_UP>); - Opcode(o1_goDirection<IDI_DIR_DOWN>); - Opcode(o1_takeItem); - // 0x1c - Opcode(o1_dropItem); - Opcode(o1_setRoomPic); - Opcode(o_winGame); - OpcodeUnImpl(); - // 0x20 - Opcode(o2_initDisk); -} - int AdlEngine_v5::o5_isNounNotInRoom(ScriptEnv &e) { OP_DEBUG_1("\t&& NO_SUCH_ITEMS_IN_ROOM(%s)", itemRoomStr(e.arg(1)).c_str()); @@ -131,10 +83,10 @@ int AdlEngine_v5::o5_isNounNotInRoom(ScriptEnv &e) { return 1; } -int AdlEngine_v5::o5_skipOneCommand(ScriptEnv &e) { - OP_DEBUG_0("\t&& SKIP_ONE_COMMAND()"); +int AdlEngine_v5::o5_abortScript(ScriptEnv &e) { + OP_DEBUG_0("\t&& ABORT_SCRIPT()"); - _skipOneCommand = true; + _abortScript = true; setVar(2, 0); return -1; @@ -149,33 +101,54 @@ int AdlEngine_v5::o5_dummy(ScriptEnv &e) { int AdlEngine_v5::o5_setTextMode(ScriptEnv &e) { OP_DEBUG_1("\tSET_TEXT_MODE(%d)", e.arg(1)); - // TODO - // 1: 4-line mode - // 2: 24-line mode - switch (e.arg(1)) { + case 1: + if (_linesPrinted != 0) { + _display->printChar(APPLECHAR(' ')); + handleTextOverflow(); + _display->moveCursorTo(Common::Point(0, 23)); + _maxLines = 4; + } + return 1; + case 2: + _textMode = true; + _display->setMode(DISPLAY_MODE_TEXT); + _display->home(); + _maxLines = 24; + _linesPrinted = 0; + return 1; case 3: // We re-use the restarting flag here, to simulate a long jump _isRestarting = true; return -1; + default: + error("Invalid text mode %d", e.arg(1)); } - - return 1; } int AdlEngine_v5::o5_setRegionRoom(ScriptEnv &e) { OP_DEBUG_2("\tSET_REGION_ROOM(%d, %d)", e.arg(1), e.arg(2)); - // TODO - return 2; + getCurRoom().curPicture = getCurRoom().picture; + getCurRoom().isFirstTime = false; + switchRegion(e.arg(1)); + _state.room = e.arg(2); + restoreRoomState(_state.room); + return -1; } -int AdlEngine_v5::o_winGame(ScriptEnv &e) { - OP_DEBUG_0("\tWIN_GAME()"); +int AdlEngine_v5::o5_setRoomPic(ScriptEnv &e) { + const byte isFirstTime = restoreRoomState(e.arg(1)); - // TODO + // CHECKME: More peculiar isFirstTime handling (see also restoreRoomState). + // Is this here to prevent changing the backed up flag from 1 to 0? Since + // that could only happen if the room isFirstTime is 0 while the backed up flag + // is 1, is this scenario even possible? + if (isFirstTime != 0xff) + getRoom(e.arg(1)).isFirstTime = isFirstTime; - return 0; + o4_setRoomPic(e); + return 2; } } // End of namespace Adl diff --git a/engines/adl/adl_v5.h b/engines/adl/adl_v5.h index bb1cc3015a..473b244993 100644 --- a/engines/adl/adl_v5.h +++ b/engines/adl/adl_v5.h @@ -34,18 +34,17 @@ public: protected: AdlEngine_v5(OSystem *syst, const AdlGameDescription *gd); - // AdlEngine - virtual void setupOpcodeTables(); - // AdlEngine_v4 virtual RegionChunkType getRegionChunkType(const uint16 addr) const; + virtual void initRoomState(RoomState &roomState) const; + virtual byte restoreRoomState(byte room); int o5_isNounNotInRoom(ScriptEnv &e); - int o5_skipOneCommand(ScriptEnv &e); + int o5_abortScript(ScriptEnv &e); int o5_dummy(ScriptEnv &e); int o5_setTextMode(ScriptEnv &e); int o5_setRegionRoom(ScriptEnv &e); - int o_winGame(ScriptEnv &e); + int o5_setRoomPic(ScriptEnv &e); }; } // End of namespace Adl diff --git a/engines/adl/detection.cpp b/engines/adl/detection.cpp index 66bbe84ea2..02fadd255b 100644 --- a/engines/adl/detection.cpp +++ b/engines/adl/detection.cpp @@ -141,6 +141,21 @@ static const AdlGameDescription gameDescriptions[] = { }, GAME_TYPE_HIRES0 }, + { // Hi-Res Adventure #4: Ulysses and the Golden Fleece - Apple II - Load 'N' Go + { + "hires4", 0, + { + { "ULYSSESA.DSK", 0, "df21f28ae94440f958dbbcfdfaf0c36e", 143360 }, + { "ULYSSESB.DSK", 1, "c204e8fe265e9534049f3c0f816cc9fc", 143360 }, + AD_LISTEND + }, + Common::EN_ANY, + Common::kPlatformApple2, + ADGF_UNSTABLE, + GUIO2(GAMEOPTION_COLOR_DEFAULT_ON, GAMEOPTION_SCANLINES) + }, + GAME_TYPE_HIRES4 + }, { // Hi-Res Adventure #4: Ulysses and the Golden Fleece - Atari 8-bit - Re-release { "hires4", 0, diff --git a/engines/adl/hires6.cpp b/engines/adl/hires6.cpp index 91ab16313b..b3b66f6873 100644 --- a/engines/adl/hires6.cpp +++ b/engines/adl/hires6.cpp @@ -44,22 +44,162 @@ public: private: // AdlEngine + void gameLoop(); + void setupOpcodeTables(); void runIntro(); void init(); void initGameState(); void showRoom(); Common::String formatVerbError(const Common::String &verb) const; Common::String formatNounError(const Common::String &verb, const Common::String &noun) const; + void loadState(Common::ReadStream &stream); + void saveState(Common::WriteStream &stream); // AdlEngine_v2 void printString(const Common::String &str); + template <Direction D> + int o_goDirection(ScriptEnv &e); + int o_fluteSound(ScriptEnv &e); + static const uint kRegions = 3; static const uint kItems = 15; byte _currVerb, _currNoun; }; +void HiRes6Engine::gameLoop() { + AdlEngine_v5::gameLoop(); + + // Variable 25 starts at 5 and counts down every 160 moves. + // When it reaches 0, the game ends. This variable determines + // what you see when you "LOOK SUNS". + // Variable 39 is used to advance the suns based on game events, + // so even a fast player will see the suns getting closer together + // as he progresses. + if (getVar(39) != 0) { + if (getVar(39) < getVar(25)) + setVar(25, getVar(39)); + setVar(39, 0); + } + + if (getVar(25) != 0) { + if (getVar(25) > 5) + error("Variable 25 has unexpected value %d", getVar(25)); + if ((6 - getVar(25)) * 160 == _state.moves) + setVar(25, getVar(25) - 1); + } +} + +typedef Common::Functor1Mem<ScriptEnv &, int, HiRes6Engine> OpcodeH6; +#define SetOpcodeTable(x) table = &x; +#define Opcode(x) table->push_back(new OpcodeH6(this, &HiRes6Engine::x)) +#define OpcodeUnImpl() table->push_back(new OpcodeH6(this, 0)) + +void HiRes6Engine::setupOpcodeTables() { + Common::Array<const Opcode *> *table = 0; + + SetOpcodeTable(_condOpcodes); + // 0x00 + OpcodeUnImpl(); + Opcode(o2_isFirstTime); + Opcode(o2_isRandomGT); + Opcode(o4_isItemInRoom); + // 0x04 + Opcode(o5_isNounNotInRoom); + Opcode(o1_isMovesGT); + Opcode(o1_isVarEQ); + Opcode(o2_isCarryingSomething); + // 0x08 + Opcode(o4_isVarGT); + Opcode(o1_isCurPicEQ); + Opcode(o5_abortScript); + + SetOpcodeTable(_actOpcodes); + // 0x00 + OpcodeUnImpl(); + Opcode(o1_varAdd); + Opcode(o1_varSub); + Opcode(o1_varSet); + // 0x04 + Opcode(o1_listInv); + Opcode(o4_moveItem); + Opcode(o1_setRoom); + Opcode(o2_setCurPic); + // 0x08 + Opcode(o2_setPic); + Opcode(o1_printMsg); + Opcode(o5_dummy); + Opcode(o5_setTextMode); + // 0x0c + Opcode(o4_moveAllItems); + Opcode(o1_quit); + Opcode(o5_dummy); + Opcode(o4_save); + // 0x10 + Opcode(o4_restore); + Opcode(o1_restart); + Opcode(o5_setRegionRoom); + Opcode(o5_dummy); + // 0x14 + Opcode(o1_resetPic); + Opcode(o_goDirection<IDI_DIR_NORTH>); + Opcode(o_goDirection<IDI_DIR_SOUTH>); + Opcode(o_goDirection<IDI_DIR_EAST>); + // 0x18 + Opcode(o_goDirection<IDI_DIR_WEST>); + Opcode(o_goDirection<IDI_DIR_UP>); + Opcode(o_goDirection<IDI_DIR_DOWN>); + Opcode(o1_takeItem); + // 0x1c + Opcode(o1_dropItem); + Opcode(o5_setRoomPic); + Opcode(o_fluteSound); + OpcodeUnImpl(); + // 0x20 + Opcode(o2_initDisk); +} + +template <Direction D> +int HiRes6Engine::o_goDirection(ScriptEnv &e) { + OP_DEBUG_0((Common::String("\tGO_") + dirStr(D) + "()").c_str()); + + byte room = getCurRoom().connections[D]; + + if (room == 0) { + if (getVar(33) == 2) + setVar(34, getVar(34) + 1); + + printMessage(_messageIds.cantGoThere); + return -1; + } + + switchRoom(room); + + if (getVar(33) == 2) { + printMessage(102); + setVar(33, 0); + } + + return -1; +} + +int HiRes6Engine::o_fluteSound(ScriptEnv &e) { + OP_DEBUG_0("\tFLUTE_SOUND()"); + + Tones tones; + + tones.push_back(Tone(1072.0, 587.6)); + tones.push_back(Tone(1461.0, 495.8)); + tones.push_back(Tone(0.0, 1298.7)); + + playTones(tones, false); + + _linesPrinted = 0; + + return 0; +} + #define SECTORS_PER_TRACK 16 #define BYTES_PER_SECTOR 256 @@ -146,12 +286,9 @@ void HiRes6Engine::init() { _strings.lineFeeds = readStringAt(*stream, 0x408); - // Read opcode strings (TODO) _strings_v2.saveInsert = readStringAt(*stream, 0xad8); - readStringAt(*stream, 0xb95); // Confirm save - // _strings_v2.saveReplace + _strings_v2.saveReplace = readStringAt(*stream, 0xb95); _strings_v2.restoreInsert = readStringAt(*stream, 0xc07); - // _strings_v2.restoreReplace _strings.playAgain = readStringAt(*stream, 0xcdf, 0xff); _messageIds.cantGoThere = 249; @@ -275,10 +412,26 @@ Common::String HiRes6Engine::formatNounError(const Common::String &verb, const C return err; } +void HiRes6Engine::loadState(Common::ReadStream &stream) { + AdlEngine_v5::loadState(stream); + _state.moves = (getVar(39) << 8) | getVar(24); + setVar(39, 0); +} + +void HiRes6Engine::saveState(Common::WriteStream &stream) { + // Move counter is stuffed into variables, in order to save it + setVar(24, _state.moves & 0xff); + setVar(39, _state.moves >> 8); + AdlEngine_v5::saveState(stream); + setVar(39, 0); +} + void HiRes6Engine::printString(const Common::String &str) { Common::String s; uint found = 0; + // Variable 27 is 1 when Kira is present, 0 otherwise. It's used for choosing + // between singular and plural variants of a string. // This does not emulate the corner cases of the original, hence this check if (getVar(27) > 1) error("Invalid value %i encountered for variable 27", getVar(27)); @@ -294,21 +447,24 @@ void HiRes6Engine::printString(const Common::String &str) { } } - if (getVar(2) != 0xff) { - AdlEngine_v5::printString(s); - } else { + // Variables 2 and 26 are used for controlling the printing of room descriptions + if (getVar(2) == 0xff) { if (getVar(26) == 0) { + // This checks for special room description string " " if (str.size() != 1 || APPLECHAR(str[0]) != APPLECHAR(' ')) return AdlEngine_v5::printString(s); - setVar(2, APPLECHAR(' ')); - } else if (getVar(26) != 0xff) { - setVar(2, 'P'); - } else { + setVar(2, 160); + } else if (getVar(26) == 0xff) { + // Storing the room number in a variable allows for range comparisons setVar(26, _state.room); setVar(2, 1); + } else { + setVar(2, 80); } doAllCommands(_globalCommands, _currVerb, _currNoun); + } else { + AdlEngine_v5::printString(s); } } diff --git a/engines/adl/sound.cpp b/engines/adl/sound.cpp index 63eea45953..3d46ea0409 100644 --- a/engines/adl/sound.cpp +++ b/engines/adl/sound.cpp @@ -47,10 +47,9 @@ private: Speaker::Speaker(int sampleRate) : _rate(sampleRate), - _curSample(32767) { - - stopTone(); -} + _halfWaveLen(0), + _halfWaveRem(0), + _curSample(32767) { } void Speaker::startTone(double freq) { _halfWaveLen = _halfWaveRem = doubleToFrac(_rate / freq / 2); @@ -63,10 +62,15 @@ void Speaker::startTone(double freq) { void Speaker::stopTone() { _halfWaveLen = 0; - _halfWaveRem = intToFrac(32767); } void Speaker::generateSamples(int16 *buffer, int numSamples) { + if (_halfWaveLen == 0) { + // Silence + memset(buffer, 0, numSamples * sizeof(int16)); + return; + } + int offset = 0; while (offset < numSamples) { @@ -79,15 +83,14 @@ void Speaker::generateSamples(int16 *buffer, int numSamples) { // Compute next transition point _halfWaveRem += _halfWaveLen - FRAC_ONE; } else { - // Low/high level (incl. silence) + // Low/high level // Generate as many samples as we can const int samples = MIN(numSamples - offset, (int)fracToInt(_halfWaveRem)); Common::fill(buffer + offset, buffer + offset + samples, _curSample); offset += samples; - // Count down to level transition point, unless we're playing silence - if (_halfWaveLen > 0) - _halfWaveRem -= intToFrac(samples); + // Count down to level transition point + _halfWaveRem -= intToFrac(samples); } } } diff --git a/engines/cryo/eden.cpp b/engines/cryo/eden.cpp index b79eb4e984..a9476f8199 100644 --- a/engines/cryo/eden.cpp +++ b/engines/cryo/eden.cpp @@ -35,8 +35,6 @@ #include "graphics/screen.h" #include "graphics/palette.h" #include "common/timer.h" - -//#include "audio/audiostream.h" #include "audio/mixer.h" #include "cryo/defs.h" @@ -5334,7 +5332,7 @@ void EdenGame::save() { //SaveDialog(byte_37150, byte_37196->ff_A); //TODO strcpy(name, "edsave1.000"); - savegame(name); + saveGame(name); _vm->hideMouse(); CLBlitter_FillScreenView(0xFFFFFFFF); fadeToBlack(3); @@ -6369,55 +6367,126 @@ void EdenGame::phase560() { _gameRooms[127]._exits[1] = 0; } -void EdenGame::savegame(char *name) { - int32 size; - - Common::OutSaveFile *handle = g_system->getSavefileManager()->openForSaving(name); - if (!handle) +void EdenGame::saveGame(char *name) { + Common::OutSaveFile *fh = g_system->getSavefileManager()->openForSaving(name); + if (!fh) return; -#define CLFile_Write(h, ptr, size) \ -debug("writing 0x%X bytes", *size); \ -h->write(ptr, *size); + Common::Serializer s(nullptr, fh); - vavaoffsetout(); - size = (char *)(&_globals->_saveEnd) - (char *)(_globals); - CLFile_Write(handle, _globals, &size); - size = (char *)(&_gameIcons[134]) - (char *)(&_gameIcons[123]); - CLFile_Write(handle, &_gameIcons[123], &size); - lieuoffsetout(); - size = (char *)(&_areasTable[12]) - (char *)(&_areasTable[0]); - CLFile_Write(handle, &_areasTable[0], &size); - size = (char *)(&_gameRooms[423]) - (char *)(&_gameRooms[0]); - CLFile_Write(handle, &_gameRooms[0], &size); - size = (char *)(&_objects[42]) - (char *)(&_objects[0]); - CLFile_Write(handle, &_objects[0], &size); - size = (char *)(&_objectLocations[45]) - (char *)(&_objectLocations[0]); - CLFile_Write(handle, &_objectLocations[0], &size); - size = (char *)(&_followerList[14]) - (char *)(&_followerList[13]); - CLFile_Write(handle, &_followerList[13], &size); - size = (char *)(&_persons[PER_UNKN_3DE]) - (char *)(&_persons[PER_KING]); - CLFile_Write(handle, &_persons[PER_KING], &size); - bandeoffsetout(); - size = (char *)(&_tapes[16]) - (char *)(&_tapes[0]); - CLFile_Write(handle, &_tapes[0], &size); - size = (char *)(&_tabletView[6]) - (char *)(&_tabletView[0]); - CLFile_Write(handle, &_tabletView[0], &size); - size = (char *)(&_gameDialogs[10240]) - (char *)(&_gameDialogs[0]); //TODO: const size 10240 - CLFile_Write(handle, &_gameDialogs[0], &size); + syncGame(s); - delete handle; + delete fh; +} -#undef CLFile_Write +void EdenGame::syncGame(Common::Serializer s) { + syncGlobalPointers(s); + syncGlobalValues(s); - vavaoffsetin(); - lieuoffsetin(); - bandeoffsetin(); + // _gameIcons + // CHECKME: only from #123 to #133? + for (int i = 123; i < 134; i++) { + s.syncAsSint16LE(_gameIcons[i].sx); + s.syncAsSint16LE(_gameIcons[i].sy); + s.syncAsSint16LE(_gameIcons[i].ex); + s.syncAsSint16LE(_gameIcons[i].ey); + s.syncAsUint16LE(_gameIcons[i]._cursorId); + s.syncAsUint16LE(_gameIcons[i]._actionId); + s.syncAsUint16LE(_gameIcons[i]._objectId); + } + + syncCitadelRoomPointers(s); + + // _areasTable + for (int i = 0; i < 12; i++) { + s.syncAsByte(_areasTable[i]._num); + s.syncAsByte(_areasTable[i]._type); + s.syncAsUint16LE(_areasTable[i]._flags); + s.syncAsUint16LE(_areasTable[i]._firstRoomIdx); + s.syncAsByte(_areasTable[i]._citadelLevel); + s.syncAsByte(_areasTable[i]._placeNum); + s.syncAsSint16LE(_areasTable[i]._visitCount); + } + + // _gameRooms + for (int i = 0; i < 423; i++) { + s.syncAsByte(_gameRooms[i]._id); + for (int j = 0; j < 4; j++) + s.syncAsByte(_gameRooms[i]._exits[j]); + s.syncAsByte(_gameRooms[i]._flags); + s.syncAsUint16LE(_gameRooms[i]._bank); + s.syncAsUint16LE(_gameRooms[i]._party); + s.syncAsByte(_gameRooms[i]._level); + s.syncAsByte(_gameRooms[i]._video); + s.syncAsByte(_gameRooms[i]._location); + s.syncAsByte(_gameRooms[i]._backgroundBankNum); + } + + // _Objects + for (int i = 0; i < 42; i++) { + s.syncAsByte(_objects[i]._id); + s.syncAsByte(_objects[i]._flags); + s.syncAsSint16LE(_objects[i]._locations); + s.syncAsUint16LE(_objects[i]._itemMask); + s.syncAsUint16LE(_objects[i]._powerMask); + s.syncAsSint16LE(_objects[i]._count); + } + + for (int i = 0; i < 45; i++) + s.syncAsUint16LE(_objectLocations[i]); + + // _followerList[13] + // CHECKME: Only #13? + s.syncAsByte(_followerList[13]._id); + s.syncAsByte(_followerList[13]._spriteNum); + s.syncAsSint16LE(_followerList[13].sx); + s.syncAsSint16LE(_followerList[13].sy); + s.syncAsSint16LE(_followerList[13].ex); + s.syncAsSint16LE(_followerList[13].ey); + s.syncAsSint16LE(_followerList[13]._spriteBank); + s.syncAsSint16LE(_followerList[13].ff_C); + s.syncAsSint16LE(_followerList[13].ff_E); + + // _persons + for (int i = 0; i < 58; i++) { + s.syncAsUint16LE(_persons[i]._roomNum); + s.syncAsUint16LE(_persons[i]._actionId); + s.syncAsUint16LE(_persons[i]._partyMask); + s.syncAsByte(_persons[i]._id); + s.syncAsByte(_persons[i]._flags); + s.syncAsByte(_persons[i]._roomBankId); + s.syncAsByte(_persons[i]._spriteBank); + s.syncAsUint16LE(_persons[i]._items); + s.syncAsUint16LE(_persons[i]._powers); + s.syncAsByte(_persons[i]._targetLoc); + s.syncAsByte(_persons[i]._lastLoc); + s.syncAsByte(_persons[i]._speed); + s.syncAsByte(_persons[i]._steps); + } + + syncTapePointers(s); + + // _tapes + for (int i = 0; i < MAX_TAPES; i++) { + s.syncAsSint16LE(_tapes[i]._textNum); + s.syncAsSint16LE(_tapes[i]._party); + s.syncAsSint16LE(_tapes[i]._roomNum); + s.syncAsSint16LE(_tapes[i]._backgroundBankNum); + } + + // _tabletView + // CHECKME: Only 6 out of 12? + for (int i = 0; i < 6; i++) + s.syncAsByte(_tabletView[i]); - debug("* Game saved to %s", name); + // _gameDialogs + for (int i = 0; i < 10240; i++) + s.syncAsByte(_gameDialogs[i]); } void EdenGame::loadrestart() { + _quitFlag3 = true; +/* assert(0); //TODO: this won't work atm - all snapshots are BE int32 offs = 0; int32 size; @@ -6457,112 +6526,270 @@ void EdenGame::loadrestart() { size = (char *)(&_gameDialogs[10240]) - (char *)(&_gameDialogs[0]); //TODO: const size 10240 loadpartoffile(2495, &_gameDialogs[0], offs, size); _gameLoaded = true; + */ } void EdenGame::loadgame(char *name) { - Common::InSaveFile *handle = g_system->getSavefileManager()->openForLoading(name); - if (!handle) + Common::InSaveFile *fh = g_system->getSavefileManager()->openForLoading(name); + if (!fh) return; -#define CLFile_Read(h, ptr, size) \ - h->read(ptr, *size); - - int32 size = (char *)(&_globals->_saveEnd) - (char *)(_globals); - CLFile_Read(handle, _globals, &size); - vavaoffsetin(); - size = (char *)(&_gameIcons[134]) - (char *)(&_gameIcons[123]); - CLFile_Read(handle, &_gameIcons[123], &size); - size = (char *)(&_areasTable[12]) - (char *)(&_areasTable[0]); - CLFile_Read(handle, &_areasTable[0], &size); - lieuoffsetin(); - size = (char *)(&_gameRooms[423]) - (char *)(&_gameRooms[0]); - CLFile_Read(handle, &_gameRooms[0], &size); - size = (char *)(&_objects[42]) - (char *)(&_objects[0]); - CLFile_Read(handle, &_objects[0], &size); - size = (char *)(&_objectLocations[45]) - (char *)(&_objectLocations[0]); - CLFile_Read(handle, &_objectLocations[0], &size); - size = (char *)(&_followerList[14]) - (char *)(&_followerList[13]); - CLFile_Read(handle, &_followerList[13], &size); - size = (char *)(&_persons[55]) - (char *)(&_persons[0]); - CLFile_Read(handle, &_persons[0], &size); - size = (char *)(&_tapes[16]) - (char *)(&_tapes[0]); - CLFile_Read(handle, &_tapes[0], &size); - bandeoffsetin(); - size = (char *)(&_tabletView[6]) - (char *)(&_tabletView[0]); - CLFile_Read(handle, &_tabletView[0], &size); - size = (char *)(&_gameDialogs[10240]) - (char *)(&_gameDialogs[0]); //TODO: const size 10240 - CLFile_Read(handle, &_gameDialogs[0], &size); - - delete handle; -#undef CLFile_Read + Common::Serializer s(fh, nullptr); + syncGame(s); -// CLFile_Close(handle); + delete fh; _gameLoaded = true; - debug("* Game loaded from %s", name); } -#define NULLPTR (void*)0xFFFFFF -#define OFSOUT(val, base, typ) if (val) (val) = (typ*)((char*)(val) - (size_t)(base)); else (val) = (typ*)NULLPTR; +#define NULLPTR 0xFFFFFF +#define IDXOUT(val, base, typ, idx) if (val) (idx) = ((byte*)val - (byte*)base) / sizeof(typ); else (idx) = NULLPTR; #define OFSIN(val, base, typ) if ((void*)(val) != NULLPTR) (val) = (typ*)((char*)(val) + (size_t)(base)); else (val) = 0; -void EdenGame::vavaoffsetout() { - OFSOUT(_globals->_dialogPtr, _gameDialogs, Dialog); - OFSOUT(_globals->_nextDialogPtr, _gameDialogs, Dialog); - OFSOUT(_globals->_narratorDialogPtr, _gameDialogs, Dialog); - OFSOUT(_globals->_lastDialogPtr, _gameDialogs, Dialog); - OFSOUT(_globals->_tapePtr, _tapes, tape_t); - OFSOUT(_globals->_nextRoomIcon, _gameIcons, Icon); - OFSOUT(_globals->_roomPtr, _gameRooms, Room); - OFSOUT(_globals->_citaAreaFirstRoom, _gameRooms, Room); - OFSOUT(_globals->_areaPtr, _areasTable, Area); - OFSOUT(_globals->_lastAreaPtr, _areasTable, Area); - OFSOUT(_globals->_curAreaPtr, _areasTable, Area); - OFSOUT(_globals->_characterPtr, _persons, perso_t); - OFSOUT(_globals->_roomCharacterPtr, _persons, perso_t); -} - -void EdenGame::vavaoffsetin() { - OFSIN(_globals->_dialogPtr, _gameDialogs, Dialog); - OFSIN(_globals->_nextDialogPtr, _gameDialogs, Dialog); - OFSIN(_globals->_narratorDialogPtr, _gameDialogs, Dialog); - OFSIN(_globals->_lastDialogPtr, _gameDialogs, Dialog); - OFSIN(_globals->_tapePtr, _tapes, tape_t); - OFSIN(_globals->_nextRoomIcon, _gameIcons, Icon); - OFSIN(_globals->_roomPtr, _gameRooms, Room); - OFSIN(_globals->_citaAreaFirstRoom, _gameRooms, Room); - OFSIN(_globals->_areaPtr, _areasTable, Area); - OFSIN(_globals->_lastAreaPtr, _areasTable, Area); - OFSIN(_globals->_curAreaPtr, _areasTable, Area); - OFSIN(_globals->_characterPtr, _persons, perso_t); - OFSIN(_globals->_roomCharacterPtr, _persons, perso_t); -} - -void EdenGame::lieuoffsetout() { - for (int i = 0; i < 12; i++) - OFSOUT(_areasTable[i]._citadelRoomPtr, _gameRooms, Room); -} - -void EdenGame::lieuoffsetin() { - for (int i = 0; i < 12; i++) - OFSIN(_areasTable[i]._citadelRoomPtr, _gameRooms, Room); -} - -void EdenGame::bandeoffsetout() { - for (int i = 0; i < 16; i++) { - OFSOUT(_tapes[i]._perso, _persons, perso_t); - OFSOUT(_tapes[i]._dialog, _gameDialogs, Dialog); - } -} +void EdenGame::syncGlobalPointers(Common::Serializer s) { + uint32 dialogIdx, nextDialogIdx, narratorDialogIdx, lastDialogIdx, tapeIdx, nextRoomIconIdx, roomIdx; + uint32 citaAreaFirstRoomIdx, areaIdx, lastAreaIdx, curAreaIdx, characterIdx, roomCharacterIdx; + + if (s.isSaving()) { + IDXOUT(_globals->_dialogPtr, _gameDialogs, Dialog, dialogIdx); + IDXOUT(_globals->_nextDialogPtr, _gameDialogs, Dialog, nextDialogIdx); + IDXOUT(_globals->_narratorDialogPtr, _gameDialogs, Dialog, narratorDialogIdx); + IDXOUT(_globals->_lastDialogPtr, _gameDialogs, Dialog, lastDialogIdx); + IDXOUT(_globals->_tapePtr, _tapes, tape_t, tapeIdx); + IDXOUT(_globals->_nextRoomIcon, _gameIcons, Icon, nextRoomIconIdx); + IDXOUT(_globals->_roomPtr, _gameRooms, Room, roomIdx); + IDXOUT(_globals->_citaAreaFirstRoom, _gameRooms, Room, citaAreaFirstRoomIdx); + IDXOUT(_globals->_areaPtr, _areasTable, Area, areaIdx); + IDXOUT(_globals->_lastAreaPtr, _areasTable, Area, lastAreaIdx); + IDXOUT(_globals->_curAreaPtr, _areasTable, Area, curAreaIdx); + IDXOUT(_globals->_characterPtr, _persons, perso_t, characterIdx); + IDXOUT(_globals->_roomCharacterPtr, _persons, perso_t, roomCharacterIdx); + } + + s.syncAsUint32LE(dialogIdx); + s.syncAsUint32LE(nextDialogIdx); + s.syncAsUint32LE(narratorDialogIdx); + s.syncAsUint32LE(lastDialogIdx); + s.syncAsUint32LE(tapeIdx); + s.syncAsUint32LE(nextRoomIconIdx); + s.syncAsUint32LE(roomIdx); + s.syncAsUint32LE(citaAreaFirstRoomIdx); + s.syncAsUint32LE(areaIdx); + s.syncAsUint32LE(lastAreaIdx); + s.syncAsUint32LE(curAreaIdx); + s.syncAsUint32LE(characterIdx); + s.syncAsUint32LE(roomCharacterIdx); + + if (s.isLoading()) { + _globals->_dialogPtr = (dialogIdx == NULLPTR) ? nullptr : (Dialog *)getElem(_gameDialogs, dialogIdx); + _globals->_nextDialogPtr = (nextDialogIdx == NULLPTR) ? nullptr : (Dialog *)getElem(_gameDialogs, nextDialogIdx); + _globals->_narratorDialogPtr = (narratorDialogIdx == NULLPTR) ? nullptr : (Dialog *)getElem(_gameDialogs, narratorDialogIdx); + _globals->_lastDialogPtr = (lastDialogIdx == NULLPTR) ? nullptr : (Dialog *)getElem(_gameDialogs, lastDialogIdx); + _globals->_tapePtr = (tapeIdx == NULLPTR) ? nullptr : &_tapes[tapeIdx]; + _globals->_nextRoomIcon = (nextRoomIconIdx == NULLPTR) ? nullptr : &_gameIcons[nextRoomIconIdx]; + _globals->_roomPtr = (roomIdx == NULLPTR) ? nullptr : &_gameRooms[roomIdx]; + _globals->_citaAreaFirstRoom = (citaAreaFirstRoomIdx == NULLPTR) ? nullptr : &_gameRooms[citaAreaFirstRoomIdx]; + _globals->_areaPtr = (areaIdx == NULLPTR) ? nullptr : &_areasTable[areaIdx]; + _globals->_lastAreaPtr = (lastAreaIdx == NULLPTR) ? nullptr : &_areasTable[lastAreaIdx]; + _globals->_curAreaPtr = (curAreaIdx == NULLPTR) ? nullptr : &_areasTable[curAreaIdx]; + _globals->_characterPtr = (characterIdx == NULLPTR) ? nullptr : &_persons[characterIdx]; + _globals->_roomCharacterPtr = (roomCharacterIdx == NULLPTR) ? nullptr : &_persons[roomCharacterIdx]; + } +} + +void EdenGame::syncGlobalValues(Common::Serializer s) { + s.syncAsByte(_globals->_areaNum); + s.syncAsByte(_globals->_areaVisitCount); + s.syncAsByte(_globals->_menuItemIdLo); + s.syncAsByte(_globals->_menuItemIdHi); + s.syncAsUint16LE(_globals->_randomNumber); + s.syncAsUint16LE(_globals->_gameTime); + s.syncAsUint16LE(_globals->_gameDays); + s.syncAsUint16LE(_globals->_chrono); + s.syncAsUint16LE(_globals->_eloiDepartureDay); + s.syncAsUint16LE(_globals->_roomNum); + s.syncAsUint16LE(_globals->_newRoomNum); + s.syncAsUint16LE(_globals->_phaseNum); + s.syncAsUint16LE(_globals->_metPersonsMask1); + s.syncAsUint16LE(_globals->_party); + s.syncAsUint16LE(_globals->_partyOutside); + s.syncAsUint16LE(_globals->_metPersonsMask2); + s.syncAsUint16LE(_globals->_var1C); + s.syncAsUint16LE(_globals->_phaseActionsCount); + s.syncAsUint16LE(_globals->_curAreaFlags); + s.syncAsUint16LE(_globals->_curItemsMask); + s.syncAsUint16LE(_globals->_curPowersMask); + s.syncAsUint16LE(_globals->_curPersoItems); + s.syncAsUint16LE(_globals->_curCharacterPowers); + s.syncAsUint16LE(_globals->_wonItemsMask); + s.syncAsUint16LE(_globals->_wonPowersMask); + s.syncAsUint16LE(_globals->_stepsToFindAppleFast); + s.syncAsUint16LE(_globals->_stepsToFindAppleNormal); + s.syncAsUint16LE(_globals->_roomPersoItems); + s.syncAsUint16LE(_globals->_roomCharacterPowers); + s.syncAsUint16LE(_globals->_gameFlags); + s.syncAsUint16LE(_globals->_curVideoNum); + s.syncAsUint16LE(_globals->_morkusSpyVideoNum1); + s.syncAsUint16LE(_globals->_morkusSpyVideoNum2); + s.syncAsUint16LE(_globals->_morkusSpyVideoNum3); + s.syncAsUint16LE(_globals->_morkusSpyVideoNum4); + s.syncAsByte(_globals->_newMusicType); + s.syncAsByte(_globals->_var43); + s.syncAsByte(_globals->_videoSubtitleIndex); + s.syncAsByte(_globals->_partyInstruments); + s.syncAsByte(_globals->_monkGotRing); + s.syncAsByte(_globals->_chronoFlag); + s.syncAsByte(_globals->_curRoomFlags); + s.syncAsByte(_globals->_endGameFlag); + s.syncAsByte(_globals->_lastInfo); + + byte autoDialog; + if (s.isSaving()) + autoDialog = _globals->_autoDialog ? 1 : 0; + s.syncAsByte(autoDialog); + if (s.isLoading()) + _globals->_autoDialog = (autoDialog == 1); + + s.syncAsByte(_globals->_worldTyranSighted); + s.syncAsByte(_globals->_var4D); + s.syncAsByte(_globals->_var4E); + s.syncAsByte(_globals->_worldGaveGold); + s.syncAsByte(_globals->_worldHasTriceraptors); + s.syncAsByte(_globals->_worldHasVelociraptors); + s.syncAsByte(_globals->_worldHasTyran); + s.syncAsByte(_globals->_var53); + s.syncAsByte(_globals->_var54); + s.syncAsByte(_globals->_var55); + s.syncAsByte(_globals->_gameHours); + s.syncAsByte(_globals->_textToken1); + s.syncAsByte(_globals->_textToken2); + s.syncAsByte(_globals->_eloiHaveNews); + s.syncAsByte(_globals->_dialogFlags); + s.syncAsByte(_globals->_curAreaType); + s.syncAsByte(_globals->_curCitadelLevel); + s.syncAsByte(_globals->_newLocation); + s.syncAsByte(_globals->_prevLocation); + s.syncAsByte(_globals->_curPersoFlags); + s.syncAsByte(_globals->_var60); + s.syncAsByte(_globals->_eventType); + s.syncAsByte(_globals->_var62); + s.syncAsByte(_globals->_curObjectId); + s.syncAsByte(_globals->_curObjectFlags); + s.syncAsByte(_globals->_var65); + s.syncAsByte(_globals->_roomCharacterType); + s.syncAsByte(_globals->_roomCharacterFlags); + s.syncAsByte(_globals->_narratorSequence); + s.syncAsByte(_globals->_var69); + s.syncAsByte(_globals->_var6A); + s.syncAsByte(_globals->_frescoNumber); + s.syncAsByte(_globals->_var6C); + s.syncAsByte(_globals->_var6D); + s.syncAsByte(_globals->_labyrinthDirections); + s.syncAsByte(_globals->_labyrinthRoom); + +/* + CHECKME: *_sentenceBufferPtr +*/ + + s.syncAsByte(_globals->_lastInfoIdx); + s.syncAsByte(_globals->_nextInfoIdx); + +/* + CHECKME + * _persoSpritePtr + * _persoSpritePtr2 + * _curCharacterAnimPtr + * _varC2 +*/ + + s.syncAsSint16LE(_globals->_iconsIndex); + s.syncAsSint16LE(_globals->_curObjectCursor); + s.syncAsSint16LE(_globals->_varCA); + s.syncAsSint16LE(_globals->_varCC); + s.syncAsSint16LE(_globals->_characterImageBank); + s.syncAsUint16LE(_globals->_roomImgBank); + s.syncAsUint16LE(_globals->_characterBackgroundBankIdx); + s.syncAsUint16LE(_globals->_varD4); + s.syncAsUint16LE(_globals->_frescoeWidth); + s.syncAsUint16LE(_globals->_frescoeImgBank); + s.syncAsUint16LE(_globals->_varDA); + s.syncAsUint16LE(_globals->_varDC); + s.syncAsUint16LE(_globals->_roomBaseX); + s.syncAsUint16LE(_globals->_varE0); + s.syncAsUint16LE(_globals->_dialogType); + s.syncAsUint16LE(_globals->_varE4); + s.syncAsUint16LE(_globals->_currMusicNum); + s.syncAsSint16LE(_globals->_textNum); + s.syncAsUint16LE(_globals->_travelTime); + s.syncAsUint16LE(_globals->_varEC); + s.syncAsByte(_globals->_displayFlags); + s.syncAsByte(_globals->_oldDisplayFlags); + s.syncAsByte(_globals->_drawFlags); + s.syncAsByte(_globals->_varF1); + s.syncAsByte(_globals->_varF2); + s.syncAsByte(_globals->_menuFlags); + s.syncAsByte(_globals->_varF4); + s.syncAsByte(_globals->_varF5); + s.syncAsByte(_globals->_varF6); + s.syncAsByte(_globals->_varF7); + s.syncAsByte(_globals->_varF8); + s.syncAsByte(_globals->_varF9); + s.syncAsByte(_globals->_varFA); + s.syncAsByte(_globals->_animationFlags); + s.syncAsByte(_globals->_giveObj1); + s.syncAsByte(_globals->_giveObj2); + s.syncAsByte(_globals->_giveObj3); + s.syncAsByte(_globals->_var100); + s.syncAsByte(_globals->_roomVidNum); + s.syncAsByte(_globals->_mirrorEffect); + s.syncAsByte(_globals->_var103); + s.syncAsByte(_globals->_roomBackgroundBankNum); + s.syncAsByte(_globals->_valleyVidNum); + s.syncAsByte(_globals->_updatePaletteFlag); + s.syncAsByte(_globals->_inventoryScrollPos); + s.syncAsByte(_globals->_objCount); + s.syncAsByte(_globals->_textBankIndex); + s.syncAsByte(_globals->_prefLanguage); + for (int i = 0; i < 2; i++) { + s.syncAsByte(_globals->_prefMusicVol[i]); + s.syncAsByte(_globals->_prefVoiceVol[i]); + s.syncAsByte(_globals->_prefSoundVolume[i]); + } + s.syncAsByte(_globals->_citadelAreaNum); + s.syncAsByte(_globals->_var113); + s.syncAsByte(_globals->_lastPlaceNum); + s.syncAsByte(_globals->_saveEnd); +} + +void EdenGame::syncCitadelRoomPointers(Common::Serializer s) { + uint32 citadelRoomIdx; + for (int i = 0; i < 12; i++) { + if (s.isSaving()) + IDXOUT(_areasTable[i]._citadelRoomPtr, _gameRooms, Room, citadelRoomIdx); + s.syncAsUint32LE(citadelRoomIdx); + if (s.isLoading()) + _areasTable[i]._citadelRoomPtr = (citadelRoomIdx == NULLPTR) ? nullptr : &_gameRooms[citadelRoomIdx]; + } +} + +void EdenGame::syncTapePointers(Common::Serializer s) { + int persoIdx, dialogIdx; -void EdenGame::bandeoffsetin() { for (int i = 0; i < 16; i++) { - OFSIN(_tapes[i]._perso, _persons, perso_t); - OFSIN(_tapes[i]._dialog, _gameDialogs, Dialog); + if (s.isSaving()) { + IDXOUT(_tapes[i]._perso, _persons, perso_t, persoIdx); + IDXOUT(_tapes[i]._dialog, _gameDialogs, Dialog, dialogIdx); + } + + s.syncAsUint32LE(persoIdx); + s.syncAsUint32LE(dialogIdx); + + if (s.isLoading()) { + _tapes[i]._perso = (persoIdx == NULLPTR) ? nullptr : &_persons[persoIdx]; + _tapes[i]._dialog = (dialogIdx == NULLPTR) ? nullptr : (Dialog *)getElem(_gameDialogs, dialogIdx); + } } } -//// cond.c - char EdenGame::testCondition(int16 index) { bool endFl = false; uint16 stack[32]; diff --git a/engines/cryo/eden.h b/engines/cryo/eden.h index bdd1ba89ce..1fd5415163 100644 --- a/engines/cryo/eden.h +++ b/engines/cryo/eden.h @@ -24,6 +24,8 @@ #define CRYO_EDEN_H #include "common/file.h" +#include "common/savefile.h" +#include "common/serializer.h" #include "cryo/sound.h" #include "cryo/defs.h" @@ -461,15 +463,14 @@ private: void phase528(); void phase544(); void phase560(); - void savegame(char *name); + void saveGame(char *name); void loadrestart(); void loadgame(char *name); - void vavaoffsetout(); - void vavaoffsetin(); - void lieuoffsetout(); - void lieuoffsetin(); - void bandeoffsetout(); - void bandeoffsetin(); + void syncGame(Common::Serializer s); + void syncGlobalPointers(Common::Serializer s); + void syncGlobalValues(Common::Serializer s); + void syncCitadelRoomPointers(Common::Serializer s); + void syncTapePointers(Common::Serializer s); char testCondition(int16 index); uint16 operAdd(uint16 v1, uint16 v2); uint16 operSub(uint16 v1, uint16 v2); diff --git a/engines/director/archive.cpp b/engines/director/archive.cpp index c9b6cc1cfa..f426107ee3 100644 --- a/engines/director/archive.cpp +++ b/engines/director/archive.cpp @@ -441,14 +441,13 @@ bool RIFXArchive::openStream(Common::SeekableReadStream *stream, uint32 startOff debugCN(2, kDebugLoading, "CAS*: %d [", casSize); for (uint i = 0; i < casSize; i++) { - uint32 index = casStream.readUint32(); + uint32 index = casStream.readUint32BE(); + debugCN(2, kDebugLoading, "%d ", index); Resource &res = resources[index]; res.index = index; res.castId = i + 1; _types[castTag][res.castId] = res; - - debugCN(2, kDebugLoading, "%d ", index); } debugC(2, kDebugLoading, "]"); } diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp index 8b1e57cf18..ed5b05643c 100644 --- a/engines/director/cast.cpp +++ b/engines/director/cast.cpp @@ -95,7 +95,9 @@ TextCast::TextCast(Common::ReadStreamEndian &stream, uint16 version) { palinfo3 = stream.readUint16(); int t = stream.readUint32(); - assert(t == 0); // So far we saw only 0 here + if (t != 0) { // In D2 there are values + warning("TextCast: t: %x", t); + } initialRect = Score::readRect(stream); textShadow = static_cast<SizeType>(stream.readByte()); diff --git a/engines/director/detection.cpp b/engines/director/detection.cpp index c26084ac6c..43c5bf2b4f 100644 --- a/engines/director/detection.cpp +++ b/engines/director/detection.cpp @@ -78,6 +78,7 @@ static const PlainGameDescriptor directorGames[] = { { "jewels", "Jewels of the Oracle" }, { "jman", "The Journeyman Project" }, { "majestic", "Majestic Part I: Alien Encounter" }, + { "mediaband", "Meet Mediaband" }, { "melements", "Masters of the Elements" }, { "spyclub", "Spy Club" }, { "amber", "AMBER: Journeys Beyond"}, diff --git a/engines/director/detection_tables.h b/engines/director/detection_tables.h index 15bdf37968..11f70e033c 100644 --- a/engines/director/detection_tables.h +++ b/engines/director/detection_tables.h @@ -69,8 +69,21 @@ static const DirectorGameDescription gameDescriptions[] = { { { "theapartment", + "D2", + AD_ENTRY1s("Main Menu", "fc56c179cb8c6d4938e61ee61fd0032c", 48325), // Original name is "•Main Menu" + Common::EN_ANY, + Common::kPlatformMacintosh, + ADGF_MACRESFORK, + GUIO1(GUIO_NOASPECT) + }, + GID_GENERIC, + 2 + }, + { + { + "theapartment", "D3", - AD_ENTRY1s("Main Menu", "9e838fe1a6af7992d656ca325e38dee5", 47911), + AD_ENTRY1s("Main Menu", "9e838fe1a6af7992d656ca325e38dee5", 47911), // Original name is "•Main Menu" Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, @@ -83,7 +96,7 @@ static const DirectorGameDescription gameDescriptions[] = { { "theapartment", "D4", - AD_ENTRY1s("Main Menu", "ff86181f03fe6eb060f65a985ca0580d", 160612), + AD_ENTRY1s("Main Menu", "ff86181f03fe6eb060f65a985ca0580d", 160612),// Original name is "•Main Menu" Common::EN_ANY, Common::kPlatformMacintosh, ADGF_NO_FLAGS, @@ -291,6 +304,20 @@ static const DirectorGameDescription gameDescriptions[] = { 4 }, + { // Meet Mediaband + { + "mediaband", + "", + AD_ENTRY1s("MEDIABND.EXE", "0cfb9b4762e33ab56d656a0eb146a048", 717921), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + GUIO1(GUIO_NOASPECT) + }, + GID_GENERIC, + 4 + }, + { { // Masters of the Elements - English (from rootfather) diff --git a/engines/director/director.cpp b/engines/director/director.cpp index 4806b57cdf..bfe9a724be 100644 --- a/engines/director/director.cpp +++ b/engines/director/director.cpp @@ -42,9 +42,11 @@ DirectorEngine::DirectorEngine(OSystem *syst, const DirectorGameDescription *gam _rnd("director") { DebugMan.addDebugChannel(kDebugLingoExec, "lingoexec", "Lingo Execution"); DebugMan.addDebugChannel(kDebugLingoCompile, "lingocompile", "Lingo Compilation"); + DebugMan.addDebugChannel(kDebugLingoParse, "lingoparse", "Lingo code parsing"); DebugMan.addDebugChannel(kDebugLoading, "loading", "Loading"); DebugMan.addDebugChannel(kDebugImages, "images", "Image drawing"); DebugMan.addDebugChannel(kDebugText, "text", "Text rendering"); + DebugMan.addDebugChannel(kDebugEvents, "events", "Event processing"); g_director = this; @@ -83,12 +85,14 @@ DirectorEngine::DirectorEngine(OSystem *syst, const DirectorGameDescription *gam const Common::FSNode gameDataDir(ConfMan.get("path")); SearchMan.addSubDirectoryMatching(gameDataDir, "data"); SearchMan.addSubDirectoryMatching(gameDataDir, "install"); + SearchMan.addSubDirectoryMatching(gameDataDir, "main"); // Meet Mediaband _colorDepth = 8; // 256-color _key = 0; _keyCode = 0; _machineType = 9; // Macintosh IIci _playbackPaused = false; + g_director->_skipFrameAdvance = false; } DirectorEngine::~DirectorEngine() { @@ -136,13 +140,14 @@ Common::Error DirectorEngine::run() { //_mainArchive = new RIFFArchive(); //_mainArchive->openFile("bookshelf_example.mmm"); - if (getPlatform() == Common::kPlatformWindows) { - _sharedCastFile = "SHARDCST.MMM"; - } else { - if (getVersion() < 4) + if (getVersion() < 4) { + if (getPlatform() == Common::kPlatformWindows) { + _sharedCastFile = "SHARDCST.MMM"; + } else { _sharedCastFile = "Shared Cast"; - else - _sharedCastFile = "Shared.dir"; + } + } else { + _sharedCastFile = "Shared.dir"; } loadSharedCastsFrom(_sharedCastFile); diff --git a/engines/director/director.h b/engines/director/director.h index 001393bc97..fdbe8ded48 100644 --- a/engines/director/director.h +++ b/engines/director/director.h @@ -57,7 +57,9 @@ enum { kDebugLingoCompile = 1 << 1, kDebugLoading = 1 << 2, kDebugImages = 1 << 3, - kDebugText = 1 << 4 + kDebugText = 1 << 4, + kDebugEvents = 1 << 5, + kDebugLingoParse = 1 << 6 }; extern byte defaultPalette[768]; @@ -108,6 +110,7 @@ public: int _keyCode; int _machineType; bool _playbackPaused; + bool _skipFrameAdvance; Common::String _nextMovie; Common::String _nextMovieFrameS; diff --git a/engines/director/frame.cpp b/engines/director/frame.cpp index fa9063d54e..3c73b82af1 100644 --- a/engines/director/frame.cpp +++ b/engines/director/frame.cpp @@ -727,7 +727,7 @@ Image::ImageDecoder *Frame::getImageFrom(uint16 spriteId) { BitmapCast *bc = NULL; if (_vm->getSharedBMP() != NULL && _vm->getSharedBMP()->contains(imgId)) { - debugC(2, kDebugImages, "Shared cast BMP: id: %d", imgId); + debugC(4, kDebugImages, "Shared cast BMP: id: %d", imgId); pic = _vm->getSharedBMP()->getVal(imgId); pic->seek(0); // TODO: this actually gets re-read every loop... we need to rewind it! bc = static_cast<BitmapCast *>(_vm->getSharedCasts()->getVal(spriteId)); @@ -740,14 +740,14 @@ Image::ImageDecoder *Frame::getImageFrom(uint16 spriteId) { if (_vm->getVersion() < 4) { int w = bc->initialRect.width(), h = bc->initialRect.height(); - debugC(2, kDebugImages, "id: %d, w: %d, h: %d, flags: %x, some: %x, unk1: %d, unk2: %d", + debugC(4, kDebugImages, "id: %d, w: %d, h: %d, flags: %x, some: %x, unk1: %d, unk2: %d", imgId, w, h, bc->flags, bc->someFlaggyThing, bc->unk1, bc->unk2); img = new BITDDecoder(w, h); } else if (_vm->getVersion() < 6) { bc = static_cast<BitmapCast *>(_vm->getCurrentScore()->_casts[spriteId]); int w = bc->initialRect.width(), h = bc->initialRect.height(); - debugC(2, kDebugImages, "id: %d, w: %d, h: %d, flags: %x, some: %x, unk1: %d, unk2: %d", + debugC(4, kDebugImages, "id: %d, w: %d, h: %d, flags: %x, some: %x, unk1: %d, unk2: %d", imgId, w, h, bc->flags, bc->someFlaggyThing, bc->unk1, bc->unk2); img = new BITDDecoderV4(w, h, bc->bitsPerPixel); } else { diff --git a/engines/director/images.cpp b/engines/director/images.cpp index 53e91ac494..4574165bb6 100644 --- a/engines/director/images.cpp +++ b/engines/director/images.cpp @@ -147,7 +147,7 @@ bool BITDDecoder::loadStream(Common::SeekableReadStream &stream) { // If the stream has exactly the required number of bits for this image, // we assume it is uncompressed. if (stream.size() * 8 == _surface->pitch * _surface->h) { - debugC(3, kDebugImages, "Skipping compression"); + debugC(6, kDebugImages, "Skipping compression"); for (y = 0; y < _surface->h; y++) { for (x = 0; x < _surface->pitch; ) { byte color = stream.readByte(); @@ -265,7 +265,7 @@ bool BITDDecoderV4::loadStream(Common::SeekableReadStream &stream) { // If the stream has exactly the required number of bits for this image, // we assume it is uncompressed. if (stream.size() * 8 == _surface->pitch * _surface->h) { - debugC(3, kDebugImages, "Skipping compression"); + debugC(6, kDebugImages, "Skipping compression"); for (y = 0; y < _surface->h; y++) { for (x = 0; x < _surface->pitch; ) { byte color = stream.readByte(); diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp index be0a191a5b..f4c26a2193 100644 --- a/engines/director/lingo/lingo-builtins.cpp +++ b/engines/director/lingo/lingo-builtins.cpp @@ -20,6 +20,7 @@ * */ +#include "common/system.h" #include "director/lingo/lingo.h" namespace Director { @@ -871,7 +872,8 @@ void Lingo::b_nothing(int nargs) { void Lingo::b_delay(int nargs) { Datum d = g_lingo->pop(); d.toInt(); - warning("STUB: b_delay(%d)", d.u.i); + + g_director->getCurrentScore()->_nextFrameTime = g_system->getMillis() + (float)d.u.i / 60 * 1000; } void Lingo::b_do(int nargs) { @@ -894,8 +896,6 @@ void Lingo::b_pass(int nargs) { void Lingo::b_pause(int nargs) { g_director->_playbackPaused = true; - - g_lingo->pushVoid(); // Fake value } void Lingo::b_playAccel(int nargs) { diff --git a/engines/director/lingo/lingo-funcs.cpp b/engines/director/lingo/lingo-funcs.cpp index 7056d9a863..ddc51f4149 100644 --- a/engines/director/lingo/lingo-funcs.cpp +++ b/engines/director/lingo/lingo-funcs.cpp @@ -223,6 +223,8 @@ void Lingo::func_goto(Datum &frame, Datum &movie) { if (frame.type == VOID) return; + _vm->_skipFrameAdvance = true; + if (frame.type == STRING) { if (_vm->getCurrentScore()) _vm->getCurrentScore()->setStartToLabel(*frame.u.s); @@ -240,6 +242,8 @@ void Lingo::func_gotoloop() { return; _vm->getCurrentScore()->gotoLoop(); + + g_director->_skipFrameAdvance = true; } void Lingo::func_gotonext() { @@ -247,6 +251,8 @@ void Lingo::func_gotonext() { return; _vm->getCurrentScore()->gotoNext(); + + g_director->_skipFrameAdvance = true; } void Lingo::func_gotoprevious() { @@ -254,6 +260,8 @@ void Lingo::func_gotoprevious() { return; _vm->getCurrentScore()->gotoPrevious(); + + g_director->_skipFrameAdvance = true; } void Lingo::func_cursor(int c) { diff --git a/engines/director/lingo/lingo-lex.cpp b/engines/director/lingo/lingo-lex.cpp index c9a7be7ae5..48a5166b95 100644 --- a/engines/director/lingo/lingo-lex.cpp +++ b/engines/director/lingo/lingo-lex.cpp @@ -2549,7 +2549,7 @@ namespace Director { int Lingo::parse(const char *code) { YY_BUFFER_STATE bp; - if (debugChannelSet(-1, kDebugLingoCompile)) + if (debugChannelSet(-1, kDebugLingoParse)) yydebug = 1; else yydebug = 0; diff --git a/engines/director/lingo/lingo-lex.l b/engines/director/lingo/lingo-lex.l index a53a2f04de..37bad1247d 100644 --- a/engines/director/lingo/lingo-lex.l +++ b/engines/director/lingo/lingo-lex.l @@ -325,7 +325,7 @@ namespace Director { int Lingo::parse(const char *code) { YY_BUFFER_STATE bp; - if (debugChannelSet(-1, kDebugLingoCompile)) + if (debugChannelSet(-1, kDebugLingoParse)) yydebug = 1; else yydebug = 0; diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp index d90fac34c7..cf0038bfdc 100644 --- a/engines/director/lingo/lingo.cpp +++ b/engines/director/lingo/lingo.cpp @@ -158,7 +158,7 @@ const char *Lingo::findNextDefinition(const char *s) { } void Lingo::addCode(const char *code, ScriptType type, uint16 id) { - debugC(2, kDebugLingoCompile, "Add code \"%s\" for type %d with id %d", code, type, id); + debugC(2, kDebugLingoCompile, "Add code \"%s\" for type %s with id %d", code, scriptType2str(type), id); if (_scripts[type].contains(id)) { delete _scripts[type][id]; @@ -247,7 +247,7 @@ void Lingo::executeScript(ScriptType type, uint16 id) { return; } - debugC(2, kDebugLingoExec, "Executing script type: %d, id: %d", type, id); + debugC(2, kDebugLingoExec, "Executing script type: %s, id: %d", scriptType2str(type), id); _currentScript = _scripts[type][id]; _pc = 0; @@ -294,6 +294,8 @@ void Lingo::processEvent(LEvent event, ScriptType st, int entityId) { if (entityId <= 0) return; + debugC(1, kDebugEvents, "Lingo::processEvent(%s, %s, %d)", _eventHandlerTypes[event], scriptType2str(st), entityId); + _currentEntityId = entityId; if (!_eventHandlerTypes.contains(event)) @@ -303,7 +305,7 @@ void Lingo::processEvent(LEvent event, ScriptType st, int entityId) { call(_eventHandlerTypes[event], 0); // D4+ Events pop(); } else if (_scripts[st].contains(entityId)) { - executeScript(st, entityId - 1); // D3 list of scripts. + executeScript(st, entityId); // D3 list of scripts. } else { debugC(8, kDebugLingoExec, "STUB: processEvent(%s) for %d", _eventHandlerTypes[event], entityId); } diff --git a/engines/director/score.cpp b/engines/director/score.cpp index 31f97f76a3..975c6efe33 100644 --- a/engines/director/score.cpp +++ b/engines/director/score.cpp @@ -41,6 +41,24 @@ namespace Director { +const char *scriptTypes[] = { + "MovieScript", + "SpriteScript", + "FrameScript", + "CastScript" +}; + +const char *scriptType2str(ScriptType scr) { + if (scr < 0) + return "NoneScript"; + + if (scr > kMaxScriptType) + return "<unknown>"; + + return scriptTypes[scr]; +} + + Score::Score(DirectorEngine *vm, Archive *archive) { _vm = vm; _surface = new Graphics::ManagedSurface; @@ -142,10 +160,13 @@ void Score::loadArchive() { setSpriteCasts(); - //Common::Array<uint16> stxt = _movieArchive->getResourceIDList(MKTAG('S','T','X','T')); - //if (stxt.size() > 0) { - // loadScriptText(*_movieArchive->getResource(MKTAG('S','T','X','T'), *stxt.begin())); - //} + // Try to load movie script, it sits in resource A11 + if (_vm->getVersion() <= 3) { + Common::Array<uint16> stxt = _movieArchive->getResourceIDList(MKTAG('S','T','X','T')); + if (stxt.size() > 0) { + loadScriptText(*_movieArchive->getResource(MKTAG('S','T','X','T'), *stxt.begin())); + } + } } Score::~Score() { @@ -243,6 +264,8 @@ void Score::loadFrames(Common::SeekableSubReadStreamEndian &stream) { //Common::hexdump(channelData, ARRAYSIZE(channelData)); frame->readChannels(str); + debugC(3, kDebugLoading, "Frame %d actionId: %d", _frames.size(), frame->_actionId); + delete str; _frames.push_back(frame); @@ -484,12 +507,13 @@ void Score::loadActions(Common::SeekableSubReadStreamEndian &stream) { uint16 offset = count * 4 + 2; byte id = stream.readByte(); - /*byte subId = */ stream.readByte(); // I couldn't find how it used in continuity (except print). Frame actionId = 1 byte. + + byte subId = stream.readByte(); // I couldn't find how it used in continuity (except print). Frame actionId = 1 byte. uint16 stringPos = stream.readUint16() + offset; for (uint16 i = 0; i < count; i++) { uint16 nextId = stream.readByte(); - /*byte subId = */ stream.readByte(); + byte nextSubId = stream.readByte(); uint16 nextStringPos = stream.readUint16() + offset; uint16 streamPos = stream.pos(); @@ -500,12 +524,15 @@ void Score::loadActions(Common::SeekableSubReadStreamEndian &stream) { if (ch == 0x0d) { ch = '\n'; } - _actions[id] += ch; + _actions[i + 1] += ch; } + debugC(3, kDebugLoading, "id: %d nextId: %d subId: %d, code: %s", id, nextId, subId, _actions[id].c_str()); + stream.seek(streamPos); id = nextId; + subId = nextSubId; stringPos = nextStringPos; if (stringPos == stream.size()) @@ -639,6 +666,8 @@ void Score::gotoLoop() { } } } + + g_director->_skipFrameAdvance = true; } int Score::getCurrentLabelNumber() { @@ -657,11 +686,15 @@ int Score::getCurrentLabelNumber() { void Score::gotoNext() { // we can just try to use the current frame and get the next label _currentFrame = getNextLabelNumber(_currentFrame); + + g_director->_skipFrameAdvance = true; } void Score::gotoPrevious() { // we actually need the frame of the label prior to the most recent label. _currentFrame = getPreviousLabelNumber(getCurrentLabelNumber()); + + g_director->_skipFrameAdvance = true; } int Score::getNextLabelNumber(int referenceFrame) { @@ -839,7 +872,6 @@ void Score::startLoop() { _stopPlay = false; _nextFrameTime = 0; - _lingo->processEvent(kEventStartMovie, kMovieScript, 0); _frames[_currentFrame]->prepareFrame(this); while (!_stopPlay && _currentFrame < _frames.size()) { @@ -871,7 +903,7 @@ void Score::update() { } } - // TODO Director 6 step: send prepareFrame event to all sprites and the script channel in upcoming frame + // TODO: Director 6 step: send prepareFrame event to all sprites and the script channel in upcoming frame if (_vm->getVersion() >= 6) _lingo->processEvent(kEventPrepareFrame, kFrameScript, _currentFrame); @@ -884,9 +916,11 @@ void Score::update() { } } - if (!g_director->_playbackPaused) + if (!g_director->_playbackPaused && !g_director->_skipFrameAdvance) _currentFrame++; + g_director->_skipFrameAdvance = false; + if (_currentFrame >= _frames.size()) return; @@ -928,7 +962,7 @@ void Score::update() { } void Score::processEvents() { - //TODO: re-instate when we know which script to run. + // TODO: re-instate when we know which script to run. //if (_currentFrame > 0) // _lingo->processEvent(kEventIdle, _currentFrame - 1); @@ -944,9 +978,9 @@ void Score::processEvents() { if (event.type == Common::EVENT_LBUTTONDOWN) { Common::Point pos = g_system->getEventManager()->getMousePos(); - //D3 doesn't have both mouse up and down. + // D3 doesn't have both mouse up and down. if (_vm->getVersion() > 3) { - //TODO: check that this is the order of script execution! + // TODO: check that this is the order of script execution! uint16 spriteId = _frames[_currentFrame]->getSpriteIDFromPos(pos); _lingo->processEvent(kEventMouseDown, kCastScript, _frames[_currentFrame]->_sprites[spriteId]->_castId); _lingo->processEvent(kEventMouseDown, kSpriteScript, _frames[_currentFrame]->_sprites[spriteId]->_scriptId); @@ -958,11 +992,11 @@ void Score::processEvents() { uint16 spriteId = _frames[_currentFrame]->getSpriteIDFromPos(pos); if (_vm->getVersion() > 3) { - //TODO: check that this is the order of script execution! + // TODO: check that this is the order of script execution! _lingo->processEvent(kEventMouseUp, kCastScript, _frames[_currentFrame]->_sprites[spriteId]->_castId); _lingo->processEvent(kEventMouseUp, kSpriteScript, _frames[_currentFrame]->_sprites[spriteId]->_scriptId); } else { - //D3 doesn't have cast member or sprite scripts. Just Frame Scripts. + // D3 doesn't have cast member or sprite scripts. Just Frame Scripts. _lingo->processEvent(kEventMouseUp, kFrameScript, _frames[_currentFrame]->_sprites[spriteId]->_scriptId); } } @@ -988,7 +1022,7 @@ void Score::processEvents() { warning("Keycode: %d", _vm->_keyCode); } - //TODO: is movie script correct? Can this be elsewhere? + // TODO: is movie script correct? Can this be elsewhere? _lingo->processEvent(kEventKeyDown, kMovieScript, 0); } } diff --git a/engines/director/score.h b/engines/director/score.h index dca1b8fc02..6db5e33988 100644 --- a/engines/director/score.h +++ b/engines/director/score.h @@ -52,6 +52,8 @@ enum ScriptType { kMaxScriptType = 3 }; +const char *scriptType2str(ScriptType scr); + class Score { public: Score(DirectorEngine *vm, Archive *); @@ -110,6 +112,7 @@ public: Common::Rect _movieRect; bool _stopPlay; + uint32 _nextFrameTime; private: uint16 _versionMinor; @@ -123,7 +126,6 @@ private: uint16 _castArrayStart; uint16 _currentFrame; Common::String _currentLabel; - uint32 _nextFrameTime; uint32 _flags; uint16 _castArrayEnd; uint16 _movieScriptCount; diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 561b74d354..a3a690be59 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -456,9 +456,6 @@ void Script::syncStringHeap(Common::Serializer &s) { s.syncBytes(buf, blockSize); buf += blockSize; - - if (_buf - buf == 0) - break; } while (1); } else if (getSciVersion() >= SCI_VERSION_1_1 && getSciVersion() <= SCI_VERSION_2_1_LATE){ diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 77c3d4e637..aaa1c8ccfe 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -2234,7 +2234,7 @@ bool ResourceManager::checkResourceDataForSignature(Resource *resource, const by if (signatureSize > resource->size) return false; - const uint32 signatureDWord = *((const uint32 *)signature); + const uint32 signatureDWord = READ_UINT32(signature); signature += 4; signatureSize -= 4; const uint32 searchLimit = resource->size - signatureSize + 1; diff --git a/engines/scumm/actor.cpp b/engines/scumm/actor.cpp index 8465526243..5b7e14406a 100644 --- a/engines/scumm/actor.cpp +++ b/engines/scumm/actor.cpp @@ -937,7 +937,6 @@ L2A33:; } if ((_moving & 0x0F) == 3) { -L2C36:; setTmpFromActor(); if (!_walkDirX) { @@ -980,7 +979,6 @@ L2C36:; // 2ADA if ((_moving & 0x0F) == 4) { -L2CA3:; setTmpFromActor(); if (!_walkDirY) { @@ -1045,7 +1043,7 @@ L2CA3:; directionUpdate(); animateActor(newDirToOldDir(_facing)); - goto L2C36; + return; } else { // 2B39 @@ -1064,7 +1062,7 @@ L2CA3:; directionUpdate(); animateActor(newDirToOldDir(_facing)); - goto L2CA3; + return; } } } @@ -2416,6 +2414,7 @@ void Actor_v0::startAnimActor(int f) { return; _speaking = 1; + speakCheck(); return; } diff --git a/engines/titanic/carry/arm.cpp b/engines/titanic/carry/arm.cpp index 5105ea81b4..23b0710c30 100644 --- a/engines/titanic/carry/arm.cpp +++ b/engines/titanic/carry/arm.cpp @@ -35,55 +35,41 @@ BEGIN_MESSAGE_MAP(CArm, CCarry) ON_MESSAGE(MouseDragMoveMsg) END_MESSAGE_MAP() -CArm::CArm() : CCarry(), _string6("Key"), - _field138(0), _field158(0), _field16C(3), _field170(0), +CArm::CArm() : CCarry(), _heldItemName("Key"), + _puzzleUnused(0), _armUnlocked(false), _arboretumFrame(3), _unlockedFrame(0), _armRect(220, 208, 409, 350) { } void CArm::save(SimpleFile *file, int indent) { file->writeNumberLine(1, indent); - file->writeQuotedLine(_string6, indent); - file->writeNumberLine(_field138, indent); - file->writeNumberLine(_hookedRect.left, indent); - file->writeNumberLine(_hookedRect.top, indent); - file->writeNumberLine(_hookedRect.right, indent); - file->writeNumberLine(_hookedRect.bottom, indent); - - file->writeQuotedLine(_string7, indent); - file->writeNumberLine(_field158, indent); - file->writeNumberLine(_armRect.left, indent); - file->writeNumberLine(_armRect.top, indent); - file->writeNumberLine(_armRect.right, indent); - file->writeNumberLine(_armRect.bottom, indent); - file->writeNumberLine(_field16C, indent); - file->writeNumberLine(_field170, indent); + file->writeQuotedLine(_heldItemName, indent); + file->writeNumberLine(_puzzleUnused, indent); + file->writeRect(_hookedRect, indent); + file->writeQuotedLine(_hookedTarget, indent); + file->writeNumberLine(_armUnlocked, indent); + file->writeRect(_armRect, indent); + file->writeNumberLine(_arboretumFrame, indent); + file->writeNumberLine(_unlockedFrame, indent); CCarry::save(file, indent); } void CArm::load(SimpleFile *file) { file->readNumber(); - _string6 = file->readString(); - _field138 = file->readNumber(); - _hookedRect.left = file->readNumber(); - _hookedRect.top = file->readNumber(); - _hookedRect.right = file->readNumber(); - _hookedRect.bottom = file->readNumber(); - - _string7 = file->readString(); - _field158 = file->readNumber(); - _armRect.left = file->readNumber(); - _armRect.top = file->readNumber(); - _armRect.right = file->readNumber(); - _armRect.bottom = file->readNumber(); - _field16C = file->readNumber(); - _field170 = file->readNumber(); + _heldItemName = file->readString(); + _puzzleUnused = file->readNumber(); + _hookedRect = file->readRect(); + _hookedTarget = file->readString(); + _armUnlocked = file->readNumber(); + _armRect = file->readRect(); + _arboretumFrame = file->readNumber(); + _unlockedFrame = file->readNumber(); CCarry::load(file); } bool CArm::PuzzleSolvedMsg(CPuzzleSolvedMsg *msg) { - _field138 = 0; + _puzzleUnused = 0; _canTake = true; CString name = getName(); @@ -101,13 +87,13 @@ bool CArm::PuzzleSolvedMsg(CPuzzleSolvedMsg *msg) { } bool CArm::TranslateObjectMsg(CTranslateObjectMsg *msg) { - Point newPos(_bounds.left - msg->_delta.x, _bounds.top - msg->_delta.y); + Point newPos(_bounds.left + msg->_delta.x, _bounds.top + msg->_delta.y); setPosition(newPos); return true; } bool CArm::UseWithOtherMsg(CUseWithOtherMsg *msg) { - if (_string6 != "None") { + if (_heldItemName != "None") { CShowTextMsg textMsg(ARM_ALREADY_HOLDING); textMsg.execute("PET"); return false; @@ -116,8 +102,8 @@ bool CArm::UseWithOtherMsg(CUseWithOtherMsg *msg) { hookedMsg._rect.translate(_bounds.left, _bounds.top); hookedMsg.execute("GondolierLeftLever"); - if (hookedMsg._result) { - _string7 = "GondolierLeftLever"; + if (hookedMsg._isHooked) { + _hookedTarget = "GondolierLeftLever"; } else { petAddToInventory(); } @@ -126,11 +112,13 @@ bool CArm::UseWithOtherMsg(CUseWithOtherMsg *msg) { hookedMsg._rect.translate(_bounds.left, _bounds.top); hookedMsg.execute("GondolierRightLever"); - if (hookedMsg._result) { - _string7 = "GondolierRightLever"; + if (hookedMsg._isHooked) { + _hookedTarget = "GondolierRightLever"; } else { petAddToInventory(); } + } else { + petAddToInventory(); } return true; @@ -142,13 +130,13 @@ bool CArm::MouseDragStartMsg(CMouseDragStartMsg *msg) { textMsg.execute("PET"); } else if (checkStartDragging(msg)) { hideMouse(); - _tempPos = msg->_mousePos - _bounds; - setPosition(msg->_mousePos - _tempPos); + _centroid = msg->_mousePos - _bounds; + setPosition(msg->_mousePos - _centroid); - if (!_string7.empty()) { + if (!_hookedTarget.empty()) { CActMsg actMsg("Unhook"); - actMsg.execute(_string7); - _string7.clear(); + actMsg.execute(_hookedTarget); + _hookedTarget.clear(); } loadFrame(_visibleFrame); @@ -161,39 +149,39 @@ bool CArm::MouseDragStartMsg(CMouseDragStartMsg *msg) { bool CArm::MaitreDHappyMsg(CMaitreDHappyMsg *msg) { CGameObject *petItem; if (find(getName(), &petItem, FIND_PET)) { - if (!_field158) + if (!_armUnlocked) playSound("z#47.wav"); - if (_string6 == "Key" || _string6 == "AuditoryCentre") { - CGameObject *child = dynamic_cast<CGameObject *>(getFirstChild()); - if (child) { - child->setVisible(true); - petAddToInventory(); + if (_heldItemName == "Key" || _heldItemName == "AuditoryCentre") { + CGameObject *heldItem = dynamic_cast<CGameObject *>(getFirstChild()); + if (heldItem) { + heldItem->setVisible(true); + heldItem->petAddToInventory(); } - _visibleFrame = _field170; + _visibleFrame = _unlockedFrame; loadFrame(_visibleFrame); - _string6 = "None"; + _heldItemName = "None"; petInvChange(); } } - _field158 = 1; + _armUnlocked = true; _canTake = true; return true; } bool CArm::PETGainedObjectMsg(CPETGainedObjectMsg *msg) { - if (_field158) { - if (_string6 == "Key" || _string6 == "AuditoryCentre") { + if (_armUnlocked) { + if (_heldItemName == "Key" || _heldItemName == "AuditoryCentre") { CCarry *child = dynamic_cast<CCarry *>(getFirstChild()); if (child) { - _visibleFrame = _field170; + _visibleFrame = _unlockedFrame; loadFrame(_visibleFrame); child->setVisible(true); child->petAddToInventory(); } - _string6 = "None"; + _heldItemName = "None"; } } @@ -201,11 +189,11 @@ bool CArm::PETGainedObjectMsg(CPETGainedObjectMsg *msg) { } bool CArm::MouseDragMoveMsg(CMouseDragMoveMsg *msg) { - setPosition(msg->_mousePos - _tempPos); + setPosition(msg->_mousePos - _centroid); - if (_string6 != "None" && compareViewNameTo("FrozenArboretum.Node 5.S")) { + if (_heldItemName == "None" && compareViewNameTo("FrozenArboretum.Node 5.S")) { loadFrame(_armRect.contains(msg->_mousePos) ? - _field16C : _visibleFrame); + _arboretumFrame : _visibleFrame); } return true; diff --git a/engines/titanic/carry/arm.h b/engines/titanic/carry/arm.h index fc8bba1f08..3eec4b6995 100644 --- a/engines/titanic/carry/arm.h +++ b/engines/titanic/carry/arm.h @@ -40,14 +40,14 @@ class CArm : public CCarry { bool PETGainedObjectMsg(CPETGainedObjectMsg *msg); bool MouseDragMoveMsg(CMouseDragMoveMsg *msg); private: - CString _string6; - int _field138; + CString _heldItemName; + int _puzzleUnused; Rect _hookedRect; - CString _string7; - int _field158; + CString _hookedTarget; + bool _armUnlocked; Rect _armRect; - int _field16C; - int _field170; + int _arboretumFrame; + int _unlockedFrame; public: CLASSDEF; CArm(); diff --git a/engines/titanic/carry/brain.cpp b/engines/titanic/carry/brain.cpp index b00f026718..73970c404c 100644 --- a/engines/titanic/carry/brain.cpp +++ b/engines/titanic/carry/brain.cpp @@ -33,14 +33,14 @@ BEGIN_MESSAGE_MAP(CBrain, CCarry) ON_MESSAGE(PETGainedObjectMsg) END_MESSAGE_MAP() -CBrain::CBrain() : CCarry(), _field134(0), _field138(0) { +CBrain::CBrain() : CCarry(), _pieceAdded(false), _perchGained(false) { } void CBrain::save(SimpleFile *file, int indent) { file->writeNumberLine(1, indent); file->writePoint(_pos1, indent); - file->writeNumberLine(_field134, indent); - file->writeNumberLine(_field138, indent); + file->writeNumberLine(_pieceAdded, indent); + file->writeNumberLine(_perchGained, indent); CCarry::save(file, indent); } @@ -48,36 +48,38 @@ void CBrain::save(SimpleFile *file, int indent) { void CBrain::load(SimpleFile *file) { file->readNumber(); _pos1 = file->readPoint(); - _field134 = file->readNumber(); - _field138 = file->readNumber(); + _pieceAdded = file->readNumber(); + _perchGained = file->readNumber(); CCarry::load(file); } bool CBrain::UseWithOtherMsg(CUseWithOtherMsg *msg) { CBrainSlot *slot = dynamic_cast<CBrainSlot *>(msg->_other); - if (slot) { - if (slot->getName() == "CentralCore") { - setVisible(false); - petMoveToHiddenRoom(); - CAddHeadPieceMsg headpieceMsg(getName()); - headpieceMsg.execute("CentralCoreSlot"); - } - else if (!slot->_value1 && slot->getName() == "CentralCoreSlot") { - setVisible(false); - petMoveToHiddenRoom(); - CAddHeadPieceMsg headpieceMsg(getName()); - headpieceMsg.execute(msg->_other); - playSound("z#116.wav"); - setPosition(Point(0, 0)); - setVisible(false); - _field134 = 1; - } + if (!slot) + return CCarry::UseWithOtherMsg(msg); - return true; + if (isEquals("CentralCore")) { + setVisible(false); + petMoveToHiddenRoom(); + CAddHeadPieceMsg headpieceMsg(getName()); + headpieceMsg.execute("CentralCoreSlot"); + } else if (!slot->_occupied && slot->getName() != "CentralCoreSlot") { + // Brain card goes into vacant slot + setVisible(false); + petMoveToHiddenRoom(); + CAddHeadPieceMsg headpieceMsg(getName()); + headpieceMsg.execute(msg->_other); + playSound("z#116.wav"); + setPosition(Point(0, 0)); + setVisible(false); + _pieceAdded = true; } else { - return CCarry::UseWithOtherMsg(msg); + // Trying to put brain card into an already occupied slot + petAddToInventory(); } + + return true; } bool CBrain::VisibleMsg(CVisibleMsg *msg) { @@ -89,11 +91,11 @@ bool CBrain::MouseDragStartMsg(CMouseDragStartMsg *msg) { if (!checkStartDragging(msg)) return false; - if (_field134) { + if (_pieceAdded) { CTakeHeadPieceMsg headpieceMsg(getName()); headpieceMsg.execute("TitaniaControl"); - _field134 = 0; + _pieceAdded = false; setVisible(true); moveToView(); @@ -105,10 +107,10 @@ bool CBrain::MouseDragStartMsg(CMouseDragStartMsg *msg) { } bool CBrain::PassOnDragStartMsg(CPassOnDragStartMsg *msg) { - if (_field134) { + if (_pieceAdded) { CTakeHeadPieceMsg headpieceMsg(getName()); headpieceMsg.execute("TitaniaControl"); - _field134 = 0; + _pieceAdded = false; setVisible(true); moveToView(); @@ -120,10 +122,10 @@ bool CBrain::PassOnDragStartMsg(CPassOnDragStartMsg *msg) { } bool CBrain::PETGainedObjectMsg(CPETGainedObjectMsg *msg) { - if (!_field138) { + if (!_perchGained) { if (getName() == "Perch") { - stateInc38(); - _field138 = 1; + incParrotResponse(); + _perchGained = true; } } diff --git a/engines/titanic/carry/brain.h b/engines/titanic/carry/brain.h index bcba161e27..4c41378702 100644 --- a/engines/titanic/carry/brain.h +++ b/engines/titanic/carry/brain.h @@ -39,8 +39,8 @@ class CBrain : public CCarry { bool PETGainedObjectMsg(CPETGainedObjectMsg *msg); private: Point _pos1; - int _field134; - int _field138; + bool _pieceAdded; + bool _perchGained; public: CLASSDEF; CBrain(); diff --git a/engines/titanic/carry/carry.cpp b/engines/titanic/carry/carry.cpp index f6403b18b9..fd5b593fa3 100644 --- a/engines/titanic/carry/carry.cpp +++ b/engines/titanic/carry/carry.cpp @@ -44,30 +44,29 @@ BEGIN_MESSAGE_MAP(CCarry, CGameObject) ON_MESSAGE(PassOnDragStartMsg) END_MESSAGE_MAP() -CCarry::CCarry() : CGameObject(), _fieldDC(0), _canTake(true), - _field100(0), _field104(0), _field108(0), _field10C(0), - _itemFrame(0), _enterFrame(0), _enterFrameSet(false), _visibleFrame(0), - _string1("None"), - _fullViewName("NULL"), - _string3(g_vm->_strings[DOESNT_DO_ANYTHING]), - _string4(g_vm->_strings[DOESNT_WANT_THIS]) { +CCarry::CCarry() : CGameObject(), _unused5(0), _canTake(true), + _unusedR(0), _unusedG(0), _unusedB(0), _itemFrame(0), + _enterFrame(0), _enterFrameSet(false), _visibleFrame(0), + _npcUse("None"), _fullViewName("NULL"), + _doesNothingMsg(g_vm->_strings[DOESNT_DO_ANYTHING]), + _doesntWantMsg(g_vm->_strings[DOESNT_WANT_THIS]) { } void CCarry::save(SimpleFile *file, int indent) { file->writeNumberLine(1, indent); - file->writeQuotedLine(_string1, indent); + file->writeQuotedLine(_npcUse, indent); file->writePoint(_origPos, indent); file->writeQuotedLine(_fullViewName, indent); - file->writeNumberLine(_fieldDC, indent); + file->writeNumberLine(_unused5, indent); file->writeNumberLine(_canTake, indent); - file->writeQuotedLine(_string3, indent); - file->writeQuotedLine(_string4, indent); - file->writePoint(_tempPos, indent); - file->writeNumberLine(_field104, indent); - file->writeNumberLine(_field108, indent); - file->writeNumberLine(_field10C, indent); + file->writeQuotedLine(_doesNothingMsg, indent); + file->writeQuotedLine(_doesntWantMsg, indent); + file->writePoint(_centroid, indent); + file->writeNumberLine(_unusedR, indent); + file->writeNumberLine(_unusedG, indent); + file->writeNumberLine(_unusedB, indent); file->writeNumberLine(_itemFrame, indent); - file->writeQuotedLine(_string5, indent); + file->writeQuotedLine(_unused6, indent); file->writeNumberLine(_enterFrame, indent); file->writeNumberLine(_enterFrameSet, indent); file->writeNumberLine(_visibleFrame, indent); @@ -77,19 +76,19 @@ void CCarry::save(SimpleFile *file, int indent) { void CCarry::load(SimpleFile *file) { file->readNumber(); - _string1 = file->readString(); + _npcUse = file->readString(); _origPos = file->readPoint(); _fullViewName = file->readString(); - _fieldDC = file->readNumber(); + _unused5 = file->readNumber(); _canTake = file->readNumber(); - _string3 = file->readString(); - _string4 = file->readString(); - _tempPos = file->readPoint(); - _field104 = file->readNumber(); - _field108 = file->readNumber(); - _field10C = file->readNumber(); + _doesNothingMsg = file->readString(); + _doesntWantMsg = file->readString(); + _centroid = file->readPoint(); + _unusedR = file->readNumber(); + _unusedG = file->readNumber(); + _unusedB = file->readNumber(); _itemFrame = file->readNumber(); - _string5 = file->readString(); + _unused6 = file->readString(); _enterFrame = file->readNumber(); _enterFrameSet = file->readNumber(); _visibleFrame = file->readNumber(); @@ -118,7 +117,7 @@ bool CCarry::MouseDragStartMsg(CMouseDragStartMsg *msg) { } bool CCarry::MouseDragMoveMsg(CMouseDragMoveMsg *msg) { - setPosition(msg->_mousePos - _tempPos); + setPosition(msg->_mousePos - _centroid); return true; } @@ -167,7 +166,7 @@ bool CCarry::UseWithCharMsg(CUseWithCharMsg *msg) { carryMsg._item = this; carryMsg.execute(succubus); } else { - CShowTextMsg textMsg(_string4); + CShowTextMsg textMsg(_doesntWantMsg); textMsg.execute("PET"); petAddToInventory(); } @@ -180,7 +179,7 @@ bool CCarry::LeaveViewMsg(CLeaveViewMsg *msg) { } bool CCarry::UseWithOtherMsg(CUseWithOtherMsg *msg) { - CShowTextMsg textMsg(_string3); + CShowTextMsg textMsg(_doesNothingMsg); textMsg.execute("PET"); if (!compareViewNameTo(_fullViewName) || _bounds.top >= 360) { @@ -233,13 +232,13 @@ bool CCarry::PassOnDragStartMsg(CPassOnDragStartMsg *msg) { loadFrame(_visibleFrame); if (msg->_value3) { - _tempPos.x = _bounds.width() / 2; - _tempPos.y = _bounds.height() / 2; + _centroid.x = _bounds.width() / 2; + _centroid.y = _bounds.height() / 2; } else { - _tempPos = msg->_mousePos - _bounds; + _centroid = msg->_mousePos - _bounds; } - setPosition(getMousePos() - _tempPos); + setPosition(getMousePos() - _centroid); return true; } diff --git a/engines/titanic/carry/carry.h b/engines/titanic/carry/carry.h index cb53df47a5..e9069da925 100644 --- a/engines/titanic/carry/carry.h +++ b/engines/titanic/carry/carry.h @@ -43,22 +43,20 @@ class CCarry : public CGameObject { bool MoveToStartPosMsg(CMoveToStartPosMsg *msg); bool EnterViewMsg(CEnterViewMsg *msg); bool PassOnDragStartMsg(CPassOnDragStartMsg *msg); -protected: - int _fieldDC; - CString _string3; - CString _string4; - Point _tempPos; - int _field100; - int _field104; - int _field108; - int _field10C; +private: + int _unused5; + CString _doesNothingMsg; + CString _doesntWantMsg; + int _unusedR, _unusedG, _unusedB; int _itemFrame; - CString _string5; + CString _unused6; int _enterFrame; bool _enterFrameSet; +protected: + Point _centroid; int _visibleFrame; public: - CString _string1; + CString _npcUse; bool _canTake; Point _origPos; CString _fullViewName; diff --git a/engines/titanic/carry/carry_parrot.cpp b/engines/titanic/carry/carry_parrot.cpp index 3a2f2c9368..4bb3a96bfb 100644 --- a/engines/titanic/carry/carry_parrot.cpp +++ b/engines/titanic/carry/carry_parrot.cpp @@ -113,7 +113,7 @@ bool CCarryParrot::MouseDragEndMsg(CMouseDragEndMsg *msg) { CTreeItem *perchedParrot = findUnder(getRoot(), "PerchedParrot"); detach(); addUnder(perchedParrot); - sound8(true); + stopSoundChannel(true); CPutParrotBackMsg backMsg(msg->_mousePos.x); backMsg.execute(perchedParrot); @@ -122,7 +122,7 @@ bool CCarryParrot::MouseDragEndMsg(CMouseDragEndMsg *msg) { _canTake = false; CParrot::_state = PARROT_ESCAPED; playSound("z#475.wav"); - sound8(true); + stopSoundChannel(true); moveUnder(findRoom()); CActMsg actMsg("Shut"); @@ -137,7 +137,7 @@ bool CCarryParrot::MouseDragEndMsg(CMouseDragEndMsg *msg) { setVisible(false); _canTake = false; playSound("z#475.wav"); - sound8(true); + stopSoundChannel(true); moveUnder(findRoom()); } } diff --git a/engines/titanic/carry/ear.cpp b/engines/titanic/carry/ear.cpp index 580ebd662f..c5196dc557 100644 --- a/engines/titanic/carry/ear.cpp +++ b/engines/titanic/carry/ear.cpp @@ -59,9 +59,11 @@ bool CEar::UseWithOtherMsg(CUseWithOtherMsg *msg) { CAddHeadPieceMsg addMsg(getName()); if (addMsg._value != "NULL") addMsg.execute(addMsg._value == "Ear1" ? "Ear1Slot" : "Ear2Slot"); - } - return CCarry::UseWithOtherMsg(msg); + return true; + } else { + return CCarry::UseWithOtherMsg(msg); + } } } // End of namespace Titanic diff --git a/engines/titanic/carry/head_piece.cpp b/engines/titanic/carry/head_piece.cpp index 1ce1d5ba1e..fa025158a5 100644 --- a/engines/titanic/carry/head_piece.cpp +++ b/engines/titanic/carry/head_piece.cpp @@ -60,7 +60,7 @@ bool CHeadPiece::SenseWorkingMsg(CSenseWorkingMsg *msg) { bool CHeadPiece::PETGainedObjectMsg(CPETGainedObjectMsg *msg) { _visibleFrame = 1; if (!_field13C) { - stateInc38(); + incParrotResponse(); _field13C = true; } diff --git a/engines/titanic/carry/magazine.cpp b/engines/titanic/carry/magazine.cpp index e68c63f8f9..94e853bda9 100644 --- a/engines/titanic/carry/magazine.cpp +++ b/engines/titanic/carry/magazine.cpp @@ -52,19 +52,18 @@ void CMagazine::load(SimpleFile *file) { } bool CMagazine::UseWithCharMsg(CUseWithCharMsg *msg) { + // WORKAROUND: Slight difference to original to ensure that when the + // magazine is used on an incorrect char, it's returned to inventory CDeskbot *deskbot = dynamic_cast<CDeskbot *>(msg->_character); - if (deskbot) { - if (deskbot->_deskbotActive) { - setVisible(false); - setPosition(Point(1000, 1000)); - CActMsg actMsg("2ndClassUpgrade"); - actMsg.execute("Deskbot"); - } - + if (deskbot && deskbot->_deskbotActive) { + setVisible(false); + setPosition(Point(1000, 1000)); + CActMsg actMsg("2ndClassUpgrade"); + actMsg.execute("Deskbot"); return true; - } else { - return CCarry::UseWithCharMsg(msg); } + + return CCarry::UseWithCharMsg(msg); } bool CMagazine::MouseDoubleClickMsg(CMouseDoubleClickMsg *msg) { @@ -77,17 +76,20 @@ bool CMagazine::VisibleMsg(CVisibleMsg *msg) { } bool CMagazine::UseWithOtherMsg(CUseWithOtherMsg *msg) { + // WORKAROUND: Slight difference to original to ensure that when the + // magazine is used on an incorrect object, it's returned to inventory if (msg->_other->getName() == "SwitchOnDeskbot") { - // TODO: other _field108 if - if (false) { + CDeskbot *deskbot = dynamic_cast<CDeskbot *>(msg->_other); + if (deskbot && deskbot->_deskbotActive) { setVisible(false); setPosition(Point(1000, 1000)); CActMsg actMsg("2ndClassUpgrade"); actMsg.execute("Deskbot"); + return true; } } - return true; + return CCarry::UseWithOtherMsg(msg); } } // End of namespace Titanic diff --git a/engines/titanic/carry/mouth.cpp b/engines/titanic/carry/mouth.cpp index e48929a391..d750fc969e 100644 --- a/engines/titanic/carry/mouth.cpp +++ b/engines/titanic/carry/mouth.cpp @@ -70,7 +70,7 @@ bool CMouth::PETGainedObjectMsg(CPETGainedObjectMsg *msg) { loadFrame(2); setVisible(true); if (!_field13C) { - stateInc38(); + incParrotResponse(); _field13C = true; } diff --git a/engines/titanic/core/background.cpp b/engines/titanic/core/background.cpp index 9f22f1e992..d6419f23db 100644 --- a/engines/titanic/core/background.cpp +++ b/engines/titanic/core/background.cpp @@ -58,7 +58,7 @@ void CBackground::load(SimpleFile *file) { bool CBackground::StatusChangeMsg(CStatusChangeMsg *msg) { setVisible(true); if (_isBlocking) { - playMovie(_startFrame, _endFrame, MOVIE_GAMESTATE); + playMovie(_startFrame, _endFrame, MOVIE_WAIT_FOR_FINISH); } else { playMovie(_startFrame, _endFrame, 0); } diff --git a/engines/titanic/core/game_object.cpp b/engines/titanic/core/game_object.cpp index af7020532c..314746e496 100644 --- a/engines/titanic/core/game_object.cpp +++ b/engines/titanic/core/game_object.cpp @@ -56,26 +56,25 @@ void CGameObject::deinit() { CGameObject::CGameObject(): CNamedItem() { _bounds = Rect(0, 0, 15, 15); - _field34 = 0; - _field38 = 0; - _field3C = 0; + _unused1 = 0; + _unused2 = 0; + _unused3 = 0; _nonvisual = false; - _field44 = 0xF0; - _field48 = 0xF0; - _field4C = 0xFF; + _toggleR = 0xF0; + _toggleG = 0xF0; + _toggleB = 0xFF; _isPendingMail = false; _destRoomFlags = 0; _roomFlags = 0; _visible = true; - _field60 = 0; + _handleMouseFlag = false; _cursorId = CURSOR_ARROW; _initialFrame = 0; _frameNumber = -1; _text = nullptr; _textBorder = _textBorderRight = 0; - _field9C = 0; _surface = nullptr; - _fieldB8 = 0; + _unused4 = 0; } CGameObject::~CGameObject() { @@ -105,19 +104,19 @@ void CGameObject::save(SimpleFile *file, int indent) { file->writeNumberLine(getMovieFrame(), indent + 1); file->writeNumberLine(_cursorId, indent + 1); _movieClips.save(file, indent + 1); - file->writeNumberLine(_field60, indent + 1); + file->writeNumberLine(_handleMouseFlag, indent + 1); file->writeNumberLine(_nonvisual, indent + 1); file->writeQuotedLine(_resource, indent + 1); file->writeBounds(_bounds, indent + 1); - file->writeFloatLine(_field34, indent + 1); - file->writeFloatLine(_field38, indent + 1); - file->writeFloatLine(_field3C, indent + 1); + file->writeFloatLine(_unused1, indent + 1); + file->writeFloatLine(_unused2, indent + 1); + file->writeFloatLine(_unused3, indent + 1); - file->writeNumberLine(_field44, indent + 1); - file->writeNumberLine(_field48, indent + 1); - file->writeNumberLine(_field4C, indent + 1); - file->writeNumberLine(_fieldB8, indent + 1); + file->writeNumberLine(_toggleR, indent + 1); + file->writeNumberLine(_toggleG, indent + 1); + file->writeNumberLine(_toggleB, indent + 1); + file->writeNumberLine(_unused4, indent + 1); file->writeNumberLine(_visible, indent + 1); file->writeNumberLine(_isPendingMail, indent + 1); file->writeNumberLine(_destRoomFlags, indent + 1); @@ -153,7 +152,7 @@ void CGameObject::load(SimpleFile *file) { // Deliberate fall-through case 4: - _field60 = file->readNumber(); + _handleMouseFlag = file->readNumber(); // Deliberate fall-through case 3: @@ -166,13 +165,13 @@ void CGameObject::load(SimpleFile *file) { case 1: _bounds = file->readBounds(); - _field34 = file->readFloat(); - _field38 = file->readFloat(); - _field3C = file->readFloat(); - _field44 = file->readNumber(); - _field48 = file->readNumber(); - _field4C = file->readNumber(); - _fieldB8 = file->readNumber(); + _unused1 = file->readFloat(); + _unused2 = file->readFloat(); + _unused3 = file->readFloat(); + _toggleR = file->readNumber(); + _toggleG = file->readNumber(); + _toggleB = file->readNumber(); + _unused4 = file->readNumber(); _visible = file->readNumber() != 0; _isPendingMail = file->readNumber(); _destRoomFlags = file->readNumber(); @@ -543,15 +542,11 @@ void CGameObject::setGlobalSoundVolume(int mode, uint seconds, int handleIndex) } } -void CGameObject::sound8(bool flag) const { - getGameManager()->_sound.stopChannel(flag ? 3 : 0); +void CGameObject::stopSoundChannel(bool channel3) { + getGameManager()->_sound.stopChannel(channel3 ? 3 : 0); } void CGameObject::setVisible(bool val) { - if (_name.contains("ylinder")) { - warning("TODO"); - } - if (val != _visible) { _visible = val; makeDirty(); @@ -611,7 +606,7 @@ void CGameObject::playMovie(uint flags) { CGameObject *obj = (flags & MOVIE_NOTIFY_OBJECT) ? this : nullptr; if (_surface) { _surface->playMovie(flags, obj); - if (flags & MOVIE_GAMESTATE) + if (flags & MOVIE_WAIT_FOR_FINISH) getGameManager()->_gameState.addMovie(_surface->_movie); } } @@ -627,7 +622,7 @@ void CGameObject::playMovie(int startFrame, int endFrame, uint flags) { CGameObject *obj = (flags & MOVIE_NOTIFY_OBJECT) ? this : nullptr; if (_surface) { _surface->playMovie(startFrame, endFrame, flags, obj); - if (flags & MOVIE_GAMESTATE) + if (flags & MOVIE_WAIT_FOR_FINISH) getGameManager()->_gameState.addMovie(_surface->_movie); } } @@ -644,7 +639,7 @@ void CGameObject::playMovie(int startFrame, int endFrame, int initialFrame, uint CGameObject *obj = (flags & MOVIE_NOTIFY_OBJECT) ? this : nullptr; if (_surface) { _surface->playMovie(startFrame, endFrame, initialFrame, flags, obj); - if (flags & MOVIE_GAMESTATE) + if (flags & MOVIE_WAIT_FOR_FINISH) getGameManager()->_gameState.addMovie(_surface->_movie); } } @@ -1058,12 +1053,12 @@ bool CGameObject::stateGetParrotMet() const { return getGameManager()->_gameState.getParrotMet(); } -void CGameObject::stateInc38() { - getGameManager()->_gameState.inc38(); +void CGameObject::incParrotResponse() { + getGameManager()->_gameState.incParrotResponse(); } -int CGameObject::stateGet38() const { - return getGameManager()->_gameState._field38; +int CGameObject::getParrotResponse() const { + return getGameManager()->_gameState._parrotResponseIndex; } void CGameObject::quitGame() { @@ -1373,11 +1368,11 @@ void CGameObject::createCredits() { _credits->load(this, screenManager, _bounds); } -void CGameObject::fn10(int v1, int v2, int v3) { +void CGameObject::setToggleColor(byte r, byte g, byte b) { makeDirty(); - _field44 = v1; - _field48 = v2; - _field4C = v3; + _toggleR = r; + _toggleG = g; + _toggleB = b; } void CGameObject::movieSetAudioTiming(bool flag) { @@ -1429,8 +1424,8 @@ bool CGameObject::compareRoomFlags(RoomFlagsComparison compareType, uint flags1, } } -void CGameObject::setState1C(bool flag) { - getGameManager()->_gameState._field1C = flag; +void CGameObject::stateSetSoundMakerAllowed(bool flag) { + getGameManager()->_gameState._soundMakerAllowed = flag; } void CGameObject::addMail(uint destRoomFlags) { @@ -1648,9 +1643,9 @@ void CGameObject::starFn1(int v) { starControl->fn1(v); } -bool CGameObject::starFn2() { +bool CGameObject::starIsSolved() const { CStarControl *starControl = getStarControl(); - return starControl ? starControl->fn4() : false; + return starControl ? starControl->isSolved() : false; } /*------------------------------------------------------------------------*/ diff --git a/engines/titanic/core/game_object.h b/engines/titanic/core/game_object.h index a56095c60f..b214cf8c9e 100644 --- a/engines/titanic/core/game_object.h +++ b/engines/titanic/core/game_object.h @@ -77,13 +77,11 @@ private: protected: static CCreditText *_credits; protected: - double _field34; - double _field38; - double _field3C; + double _unused1; + double _unused2; + double _unused3; bool _nonvisual; - int _field44; - int _field48; - int _field4C; + byte _toggleR, _toggleG, _toggleB; CMovieClipList _movieClips; int _initialFrame; CMovieRangeInfoList _movieRangeInfoList; @@ -91,11 +89,10 @@ protected: CTextControl *_text; uint _textBorder; uint _textBorderRight; - int _field9C; Common::Point _savedPos; CVideoSurface *_surface; CString _resource; - int _fieldB8; + int _unused4; protected: /** * Saves the current position the object is located at @@ -277,7 +274,10 @@ protected: */ void setGlobalSoundVolume(int mode, uint seconds, int handleIndex); - void sound8(bool flag) const; + /** + * Stops sound channel 3 or 0 + */ + void stopSoundChannel(bool channel3); /** * Adds a timer @@ -462,7 +462,11 @@ protected: */ void setPassengerClass(PassengerClass newClass); - void fn10(int v1, int v2, int v3); + /** + * Sets color RGB for toggles + * @remarks The color set isn't actually used anywhere + */ + void setToggleColor(byte r, byte g, byte b); /** * Gets the duration of a specified clip in milliseconds @@ -523,7 +527,7 @@ public: bool _isPendingMail; uint _destRoomFlags; uint _roomFlags; - int _field60; + bool _handleMouseFlag; CursorId _cursorId; bool _visible; public: @@ -942,7 +946,11 @@ public: CStarControl *getStarControl() const; void starFn1(int v); - bool starFn2(); + + /** + * Returns true if the starmap puzzle has been solved + */ + bool starIsSolved() const; /*--- CTrueTalkManager Methods ---*/ @@ -987,7 +995,10 @@ public: /*--- CGameState Methods ---*/ - void setState1C(bool flag); + /** + * Sets whether a background sound maker is allowed for the rooms if available + */ + void stateSetSoundMakerAllowed(bool flag); /** * Change to the next season @@ -1009,8 +1020,15 @@ public: */ bool stateGetParrotMet() const; - void stateInc38(); - int stateGet38() const; + /** + * Moves the parrot to the next idle response + */ + void incParrotResponse(); + + /** + * Gets the index to use for parrot idle responses + */ + int getParrotResponse() const; /** * Gets the game state node changed counter diff --git a/engines/titanic/core/saveable_object.cpp b/engines/titanic/core/saveable_object.cpp index 8bb8a92b7f..0257f6a087 100644 --- a/engines/titanic/core/saveable_object.cpp +++ b/engines/titanic/core/saveable_object.cpp @@ -955,6 +955,7 @@ DEFFN(CUseWithCharMsg); DEFFN(CUseWithOtherMsg); DEFFN(CVirtualKeyCharMsg); DEFFN(CVisibleMsg); +DEFFN(CCheckCodeWheelsMsg); DEFFN(CEnterBombRoom); DEFFN(CEnterBridge); @@ -1538,6 +1539,7 @@ void CSaveableObject::initClassList() { ADDFN(CUseWithOtherMsg, CMessage); ADDFN(CVirtualKeyCharMsg, CMessage); ADDFN(CVisibleMsg, CMessage); + ADDFN(CCheckCodeWheelsMsg, CMessage); ADDFN(CMovePlayerTo, CGameObject); ADDFN(CMovePlayerToFrom, CGameObject); diff --git a/engines/titanic/core/tree_item.cpp b/engines/titanic/core/tree_item.cpp index 97d06d7bbe..b9b9aca67f 100644 --- a/engines/titanic/core/tree_item.cpp +++ b/engines/titanic/core/tree_item.cpp @@ -274,7 +274,7 @@ CNamedItem *CTreeItem::findByName(const CString &name, bool subMatch) { itemName.toLowercase(); if (subMatch) { - if (itemName.left(name.size()).compareTo(nameLower)) + if (!itemName.left(nameLower.size()).compareTo(nameLower)) return dynamic_cast<CNamedItem *>(treeItem); } else { if (!itemName.compareTo(nameLower)) diff --git a/engines/titanic/core/turn_on_turn_off.cpp b/engines/titanic/core/turn_on_turn_off.cpp index a6051c7c6f..3c1e623b6e 100644 --- a/engines/titanic/core/turn_on_turn_off.cpp +++ b/engines/titanic/core/turn_on_turn_off.cpp @@ -58,7 +58,7 @@ void CTurnOnTurnOff::load(SimpleFile *file) { bool CTurnOnTurnOff::TurnOn(CTurnOn *msg) { if (!_isOn) { if (_isBlocking) - playMovie(_startFrameOn, _endFrameOn, MOVIE_GAMESTATE); + playMovie(_startFrameOn, _endFrameOn, MOVIE_WAIT_FOR_FINISH); else playMovie(_startFrameOn, _endFrameOn, MOVIE_NOTIFY_OBJECT); _isOn = true; @@ -70,7 +70,7 @@ bool CTurnOnTurnOff::TurnOn(CTurnOn *msg) { bool CTurnOnTurnOff::TurnOff(CTurnOff *msg) { if (_isOn) { if (_isBlocking) - playMovie(_startFrameOff, _endFrameOff, MOVIE_GAMESTATE); + playMovie(_startFrameOff, _endFrameOff, MOVIE_WAIT_FOR_FINISH); else playMovie(_startFrameOff, _endFrameOff, MOVIE_NOTIFY_OBJECT); _isOn = false; diff --git a/engines/titanic/core/view_item.cpp b/engines/titanic/core/view_item.cpp index 9109bcc5b2..15d187e194 100644 --- a/engines/titanic/core/view_item.cpp +++ b/engines/titanic/core/view_item.cpp @@ -260,7 +260,7 @@ bool CViewItem::handleMouseMsg(CMouseMsg *msg, bool flag) { CGameObject *gameObject = dynamic_cast<CGameObject *>(treeItem); if (gameObject) { if (gameObject->checkPoint(msg->_mousePos, false, true) && - (!flag || !gameObject->_field60)) { + (!flag || !gameObject->_handleMouseFlag)) { if (gameObjects.size() < 256) gameObjects.push_back(gameObject); } diff --git a/engines/titanic/game/arboretum_gate.cpp b/engines/titanic/game/arboretum_gate.cpp index 2a79c31339..903f5efb54 100644 --- a/engines/titanic/game/arboretum_gate.cpp +++ b/engines/titanic/game/arboretum_gate.cpp @@ -275,27 +275,27 @@ bool CArboretumGate::TurnOff(CTurnOff *msg) { if (!_disabled) { switch (_seasonNum) { case SEASON_SUMMER: - playMovie(_startFrameSummerOff, _endFrameSummerOff, MOVIE_GAMESTATE | MOVIE_NOTIFY_OBJECT); + playMovie(_startFrameSummerOff, _endFrameSummerOff, MOVIE_WAIT_FOR_FINISH | MOVIE_NOTIFY_OBJECT); break; case SEASON_AUTUMN: if (_gotSpeechCentre) { - playMovie(_startFrameAutumnOff2, _endFrameAutumnOff2, MOVIE_GAMESTATE | MOVIE_NOTIFY_OBJECT); + playMovie(_startFrameAutumnOff2, _endFrameAutumnOff2, MOVIE_WAIT_FOR_FINISH | MOVIE_NOTIFY_OBJECT); } else { - playMovie(_startFrameAutumnOff1, _endFrameAutumnOff1, MOVIE_GAMESTATE | MOVIE_NOTIFY_OBJECT); + playMovie(_startFrameAutumnOff1, _endFrameAutumnOff1, MOVIE_WAIT_FOR_FINISH | MOVIE_NOTIFY_OBJECT); } break; case SEASON_WINTER: if (_gotSpeechCentre) { - playMovie(_startFrameWinterOff2, _endFrameWinterOff2, MOVIE_GAMESTATE | MOVIE_NOTIFY_OBJECT); + playMovie(_startFrameWinterOff2, _endFrameWinterOff2, MOVIE_WAIT_FOR_FINISH | MOVIE_NOTIFY_OBJECT); } else { - playMovie(_startFrameWinterOff1, _endFrameWinterOff1, MOVIE_GAMESTATE | MOVIE_NOTIFY_OBJECT); + playMovie(_startFrameWinterOff1, _endFrameWinterOff1, MOVIE_WAIT_FOR_FINISH | MOVIE_NOTIFY_OBJECT); } break; case SEASON_SPRING: - playMovie(_startFrameSpringOff, _endFrameSpringOff, MOVIE_GAMESTATE | MOVIE_NOTIFY_OBJECT); + playMovie(_startFrameSpringOff, _endFrameSpringOff, MOVIE_WAIT_FOR_FINISH | MOVIE_NOTIFY_OBJECT); break; default: @@ -303,7 +303,7 @@ bool CArboretumGate::TurnOff(CTurnOff *msg) { } _disabled = true; - CArboretumGateMsg gateMsg; + CArboretumGateMsg gateMsg(1); gateMsg.execute("Arboretum", nullptr, MSGFLAG_SCAN); } @@ -318,27 +318,27 @@ bool CArboretumGate::TurnOn(CTurnOn *msg) { switch (_seasonNum) { case SEASON_SUMMER: - playMovie(_startFrameSummerOn, _endFrameSummerOn, MOVIE_GAMESTATE | MOVIE_NOTIFY_OBJECT); + playMovie(_startFrameSummerOn, _endFrameSummerOn, MOVIE_WAIT_FOR_FINISH | MOVIE_NOTIFY_OBJECT); break; case SEASON_AUTUMN: if (_gotSpeechCentre) { - playMovie(_startFrameAutumnOn2, _endFrameAutumnOn2, MOVIE_GAMESTATE | MOVIE_NOTIFY_OBJECT); + playMovie(_startFrameAutumnOn2, _endFrameAutumnOn2, MOVIE_WAIT_FOR_FINISH | MOVIE_NOTIFY_OBJECT); } else { - playMovie(_startFrameAutumnOn1, _endFrameAutumnOn1, MOVIE_GAMESTATE | MOVIE_NOTIFY_OBJECT); + playMovie(_startFrameAutumnOn1, _endFrameAutumnOn1, MOVIE_WAIT_FOR_FINISH | MOVIE_NOTIFY_OBJECT); } break; case SEASON_WINTER: if (_gotSpeechCentre) { - playMovie(_startFrameWinterOn2, _endFrameWinterOn2, MOVIE_GAMESTATE | MOVIE_NOTIFY_OBJECT); + playMovie(_startFrameWinterOn2, _endFrameWinterOn2, MOVIE_WAIT_FOR_FINISH | MOVIE_NOTIFY_OBJECT); } else { - playMovie(_startFrameWinterOn1, _endFrameWinterOn1, MOVIE_GAMESTATE | MOVIE_NOTIFY_OBJECT); + playMovie(_startFrameWinterOn1, _endFrameWinterOn1, MOVIE_WAIT_FOR_FINISH | MOVIE_NOTIFY_OBJECT); } break; case SEASON_SPRING: - playMovie(_startFrameSpringOn, _endFrameSpringOn, MOVIE_GAMESTATE | MOVIE_NOTIFY_OBJECT); + playMovie(_startFrameSpringOn, _endFrameSpringOn, MOVIE_WAIT_FOR_FINISH | MOVIE_NOTIFY_OBJECT); break; default: diff --git a/engines/titanic/game/bomb.cpp b/engines/titanic/game/bomb.cpp index f3f1129e22..17c10c5082 100644 --- a/engines/titanic/game/bomb.cpp +++ b/engines/titanic/game/bomb.cpp @@ -21,6 +21,7 @@ */ #include "titanic/game/bomb.h" +#include "titanic/game/code_wheel.h" namespace Titanic { @@ -36,19 +37,19 @@ BEGIN_MESSAGE_MAP(CBomb, CBackground) ON_MESSAGE(SetFrameMsg) END_MESSAGE_MAP() -static const char *const WAVE_NAMES1[] = { - "z#353.wav", "z#339.wav", "z#325.wav", "z#311.wav", "z#297.wav", +const int CORRECT_WHEELS = 23; + +static const char *const HUNDREDS_WAVS[] = { + "", "z#353.wav", "z#339.wav", "z#325.wav", "z#311.wav", "z#297.wav", "z#283.wav", "z#269.wav", "z#255.wav", "z#241.wav" }; -static const char *const WAVE_NAMES2[] = { +static const char *const HUNDREDS_AND_WAVS[] = { "", "z#352.wav", "z#338.wav", "z#324.wav", "z#310.wav", "z#296.wav", - "z#281.wav", "z#268.wav", "z#254.wav", "z#240.wav", "", "z#351.wav", - "z#337.wav", "z#323.wav", "z#309.wav", "z#295.wav", "z#282.wav", - "z#267.wav", "z#253.wav", "z#239.wav" + "z#281.wav", "z#268.wav", "z#254.wav", "z#240.wav" }; -static const char *const WAVE_NAMES3[100] = { +static const char *const COUNTDOWN_WAVS[100] = { "bombcountdown_c0.wav", "z#355.wav", "z#341.wav", "z#327.wav", "z#313.wav", "z#299.wav", "z#285.wav", "z#271.wav", "z#257.wav", "z#243.wav", "z#354.wav", "z#350.wav", "z#349.wav", "z#348.wav", "z#347.wav", @@ -72,28 +73,28 @@ static const char *const WAVE_NAMES3[100] = { }; CBomb::CBomb() : CBackground() { - _fieldE0 = 0; - _fieldE4 = 0; - _fieldE8 = 17; - _fieldEC = 9; - _fieldF0 = 0; + _active = false; + _numCorrectWheels = 0; + _tappedCtr = 17; + _hammerCtr = 9; + _commentCtr = 0; _countdown = 999; _soundHandle = 0; - _fieldFC = 0; + _unusedHandle = 0; _startingTicks = 0; _volume = 60; } void CBomb::save(SimpleFile *file, int indent) { file->writeNumberLine(1, indent); - file->writeNumberLine(_fieldE0, indent); - file->writeNumberLine(_fieldE4, indent); - file->writeNumberLine(_fieldE8, indent); - file->writeNumberLine(_fieldEC, indent); - file->writeNumberLine(_fieldF0, indent); + file->writeNumberLine(_active, indent); + file->writeNumberLine(_numCorrectWheels, indent); + file->writeNumberLine(_tappedCtr, indent); + file->writeNumberLine(_hammerCtr, indent); + file->writeNumberLine(_commentCtr, indent); file->writeNumberLine(_countdown, indent); file->writeNumberLine(_soundHandle, indent); - file->writeNumberLine(_fieldFC, indent); + file->writeNumberLine(_unusedHandle, indent); file->writeNumberLine(_startingTicks, indent); file->writeNumberLine(_volume, indent); @@ -102,14 +103,14 @@ void CBomb::save(SimpleFile *file, int indent) { void CBomb::load(SimpleFile *file) { file->readNumber(); - _fieldE0 = file->readNumber(); - _fieldE4 = file->readNumber(); - _fieldE8 = file->readNumber(); - _fieldEC = file->readNumber(); - _fieldF0 = file->readNumber(); + _active = file->readNumber(); + _numCorrectWheels = file->readNumber(); + _tappedCtr = file->readNumber(); + _hammerCtr = file->readNumber(); + _commentCtr = file->readNumber(); _countdown = file->readNumber(); _soundHandle = file->readNumber(); - _fieldFC = file->readNumber(); + _unusedHandle = file->readNumber(); _startingTicks = file->readNumber(); _volume = file->readNumber(); @@ -117,34 +118,39 @@ void CBomb::load(SimpleFile *file) { } bool CBomb::StatusChangeMsg(CStatusChangeMsg *msg) { - _fieldE4 += msg->_newStatus; + // Check whether the wheels are corect + CCheckCodeWheelsMsg checkMsg; + checkMsg.execute(findRoom(), nullptr, MSGFLAG_SCAN); + + _numCorrectWheels = checkMsg._isCorrect ? CORRECT_WHEELS : 0; - if (_fieldE4 == 23) { + if (_numCorrectWheels == CORRECT_WHEELS) { + // Nobody likes a smartass startAnimTimer("Disarmed", 2000); lockMouse(); } - _fieldF0 %= 1000; - if (!(_fieldF0 % 20) && _countdown < 995) { + _commentCtr = (_commentCtr % 1000) + 1; + if (!(_commentCtr % 20) && _countdown < 995) { int val = getRandomNumber(5) + 25; - if (_fieldF0 < 20 || _fieldF0 > 80) + if (_commentCtr < 20 || _commentCtr > 80) val = 28; CString name; - switch (val - 25) { - case 0: + switch (val) { + case 25: name = "z#372.wav"; break; - case 1: + case 26: name = "z#371.wav"; break; - case 2: + case 27: name = "z#370.wav"; break; - case 3: + case 28: name = "z#369.wav"; break; - case 4: + case 29: name = "z#368.wav"; break; default: @@ -159,20 +165,22 @@ bool CBomb::StatusChangeMsg(CStatusChangeMsg *msg) { } bool CBomb::EnterViewMsg(CEnterViewMsg *msg) { - _fieldE4 = 2; + // WORKAROUND: Don't keep resetting wheels return true; } bool CBomb::MouseButtonDownMsg(CMouseButtonDownMsg *msg) { playSound("z#62.wav"); - if (_fieldE0) { + if (_active) { stopSound(_soundHandle); - if (_fieldE4 < 23) { - _fieldE8 = MIN(_fieldE8 + 1, 23); + //stopSound(_unusedHandle); + + if (_numCorrectWheels < CORRECT_WHEELS) { + _tappedCtr = MIN(_tappedCtr + 1, 23); CString name; - switch (_fieldE8) { + switch (_tappedCtr) { case 18: name = "z#380.wav"; break; @@ -198,7 +206,7 @@ bool CBomb::MouseButtonDownMsg(CMouseButtonDownMsg *msg) { } } else { _soundHandle = playSound("z#389.wav", _volume); - _fieldE0 = true; + _active = true; CActMsg actMsg("Arm Bomb"); actMsg.execute("EndExplodeShip"); } @@ -207,9 +215,9 @@ bool CBomb::MouseButtonDownMsg(CMouseButtonDownMsg *msg) { } bool CBomb::EnterRoomMsg(CEnterRoomMsg *msg) { - _fieldE8 = 17; - _fieldEC = 9; - _fieldF0 = 0; + _tappedCtr = 17; + _hammerCtr = 9; + _commentCtr = 0; _startingTicks = getTicksCount(); return true; } @@ -219,11 +227,11 @@ bool CBomb::ActMsg(CActMsg *msg) { playSound("z#63.wav"); stopSound(_soundHandle); - if (_fieldEC < 17) - ++_fieldEC; + if (_hammerCtr < 17) + ++_hammerCtr; CString name; - switch (_fieldEC) { + switch (_hammerCtr) { case 10: name = "z#388.wav"; break; @@ -258,9 +266,19 @@ bool CBomb::ActMsg(CActMsg *msg) { } bool CBomb::TurnOn(CTurnOn *msg) { - if (!_fieldE0) { + if (!_active) { _soundHandle = playSound("z#389.wav", _volume); - _fieldE0 = true; + _active = true; + + // WORKAROUND: Only reset the code wheels back to 'O' value + // when first arming the bomb, not whenever the bomb view is entered + _numCorrectWheels = 2; + CRoomItem *room = findRoom(); + for (CTreeItem *treeItem = room; treeItem; treeItem = treeItem->scan(room)) { + CodeWheel *codeWheel = dynamic_cast<CodeWheel *>(treeItem); + if (codeWheel) + codeWheel->reset(); + } CActMsg actMsg("Arm Bomb"); actMsg.execute("EndExplodeShip"); @@ -282,7 +300,7 @@ bool CBomb::TimerMsg(CTimerMsg *msg) { CActMsg actMsg1("Disarm Bomb"); actMsg1.execute("EndExplodeShip"); - _fieldE0 = false; + _active = false; CActMsg actMsg2("Titania.Node 5.N"); actMsg2.execute("BombNav"); actMsg2.execute("EnterBombNav"); @@ -294,49 +312,54 @@ bool CBomb::TimerMsg(CTimerMsg *msg) { if (compareRoomNameTo("Titania")) { if (msg->_actionVal == 1 && getRandomNumber(9) == 0) { - if (!_fieldE0) + if (!_active) return true; CParrotSpeakMsg speakMsg("Bomb", "BombCountdown"); speakMsg.execute("PerchedParrot"); } - if (_fieldE0) { - if (isSoundActive(_soundHandle)) { + if (_active) { + if (!isSoundActive(_soundHandle)) { if (msg->_actionVal == 0) { addTimer(1, 1000, 0); } else { _soundHandle = 0; - int section = _countdown / 100; - int index = _countdown % 100; + int hundreds = _countdown / 100; + int remainder = _countdown % 100; if (_countdown >= 100) { - CString name1 = index ? WAVE_NAMES2[section] : - WAVE_NAMES1[section]; - playSound(name1, _volume); + // Play "x hundred and" or just "x hundred" + CString hName = remainder ? HUNDREDS_AND_WAVS[hundreds] : HUNDREDS_WAVS[hundreds]; + _soundHandle = playSound(hName, _volume); } - CString name2 = WAVE_NAMES3[index]; + CString ctrName = COUNTDOWN_WAVS[remainder]; if (_countdown == 10) { - name2 = "z#229.wav"; + ctrName = "z#229.wav"; _countdown = 998; } + // Play the sub-hundred portion of the countdown amount if (_soundHandle > 0) { - _soundHandle = queueSound(name2, _soundHandle, _volume); + _soundHandle = queueSound(ctrName, _soundHandle, _volume); } else { - _soundHandle = playSound(name2, _volume); + _soundHandle = playSound(ctrName, _volume); } + // Reduce countdown and schedule another timer --_countdown; addTimer(0, 1000, 0); } } else { + // Bomb speech currently active, so schedule the method' + // to re-trigger after 100ms to check if speech is finished addTimer(0, 100, 0); } } } else { - if (_fieldE0) { + // In rooms other than the bomb room + if (_active) { --_countdown; addTimer(6000); @@ -350,7 +373,7 @@ bool CBomb::TimerMsg(CTimerMsg *msg) { bool CBomb::TrueTalkGetStateValueMsg(CTrueTalkGetStateValueMsg *msg) { if (msg->_stateNum == 10) - msg->_stateVal = _fieldE0; + msg->_stateVal = _active ? 1 : 0; return true; } diff --git a/engines/titanic/game/bomb.h b/engines/titanic/game/bomb.h index f78c42cff0..c474abf554 100644 --- a/engines/titanic/game/bomb.h +++ b/engines/titanic/game/bomb.h @@ -40,14 +40,14 @@ class CBomb : public CBackground { bool SetFrameMsg(CSetFrameMsg *msg); DECLARE_MESSAGE_MAP; private: - int _fieldE0; - int _fieldE4; - int _fieldE8; - int _fieldEC; - int _fieldF0; + bool _active; + int _numCorrectWheels; + int _tappedCtr; + int _hammerCtr; + int _commentCtr; int _countdown; int _soundHandle; - int _fieldFC; + int _unusedHandle; int _startingTicks; int _volume; public: diff --git a/engines/titanic/game/brain_slot.cpp b/engines/titanic/game/brain_slot.cpp index 1518d9b0b3..c0eb145d59 100644 --- a/engines/titanic/game/brain_slot.cpp +++ b/engines/titanic/game/brain_slot.cpp @@ -33,14 +33,14 @@ BEGIN_MESSAGE_MAP(CBrainSlot, CGameObject) ON_MESSAGE(MouseDragStartMsg) END_MESSAGE_MAP() -int CBrainSlot::_added; +int CBrainSlot::_numAdded; bool CBrainSlot::_woken; void CBrainSlot::save(SimpleFile *file, int indent) { file->writeNumberLine(1, indent); - file->writeNumberLine(_value1, indent); + file->writeNumberLine(_occupied, indent); file->writeQuotedLine(_target, indent); - file->writeNumberLine(_added, indent); + file->writeNumberLine(_numAdded, indent); file->writeNumberLine(_woken, indent); CGameObject::save(file, indent); @@ -48,9 +48,9 @@ void CBrainSlot::save(SimpleFile *file, int indent) { void CBrainSlot::load(SimpleFile *file) { file->readNumber(); - _value1 = file->readNumber(); + _occupied = file->readNumber(); _target = file->readString(); - _added = file->readNumber(); + _numAdded = file->readNumber(); _woken = file->readNumber(); CGameObject::load(file); @@ -58,12 +58,12 @@ void CBrainSlot::load(SimpleFile *file) { bool CBrainSlot::SetFrameMsg(CSetFrameMsg *msg) { loadFrame(msg->_frameNumber); - _value1 = 1; + _occupied = true; return true; } bool CBrainSlot::AddHeadPieceMsg(CAddHeadPieceMsg *msg) { - _added = 1; + _numAdded++; _cursorId = CURSOR_HAND; CAddHeadPieceMsg addMsg("NULL"); @@ -87,21 +87,21 @@ bool CBrainSlot::AddHeadPieceMsg(CAddHeadPieceMsg *msg) { if (addMsg._value != "NULL") addMsg.execute("TitaniaControl"); - if (addMsg._value == "OlfactoryCentre") + if (msg->_value == "OlfactoryCentre") loadFrame(2); - else if (addMsg._value == "AuditoryCentre") + else if (msg->_value == "AuditoryCentre") loadFrame(1); - else if (addMsg._value == "SpeechCentre") + else if (msg->_value == "SpeechCentre") loadFrame(3); - else if (addMsg._value == "VisionCentre") + else if (msg->_value == "VisionCentre") loadFrame(4); - else if (addMsg._value == "CentralCore") { + else if (msg->_value == "CentralCore") { CActMsg actMsg("Insert Central Core"); actMsg.execute("CentralCoreSlot"); } _target = msg->_value; - _value1 = 1; + _occupied = true; return true; } @@ -124,7 +124,7 @@ bool CBrainSlot::ActMsg(CActMsg *msg) { } bool CBrainSlot::MouseDragStartMsg(CMouseDragStartMsg *msg) { - if (!_value1 || _woken || !checkPoint(msg->_mousePos, false, true)) + if (!_occupied || _woken || !checkPoint(msg->_mousePos, false, true)) return false; _cursorId = CURSOR_ARROW; @@ -134,14 +134,14 @@ bool CBrainSlot::MouseDragStartMsg(CMouseDragStartMsg *msg) { takeMsg.execute("TitaniaControl"); loadFrame(isEquals("CentralCoreSlot") ? 21 : 0); - _value1 = 0; + _occupied = false; CPassOnDragStartMsg passMsg; passMsg._mousePos = msg->_mousePos; passMsg.execute(_target); msg->_dragItem = getRoot()->findByName(_target); - _added = 0; + _numAdded--; return true; } diff --git a/engines/titanic/game/brain_slot.h b/engines/titanic/game/brain_slot.h index 4d500cc59a..a85036303e 100644 --- a/engines/titanic/game/brain_slot.h +++ b/engines/titanic/game/brain_slot.h @@ -35,14 +35,14 @@ class CBrainSlot : public CGameObject { bool ActMsg(CActMsg *msg); bool MouseDragStartMsg(CMouseDragStartMsg *msg); public: - static int _added; + static int _numAdded; static bool _woken; public: - int _value1; + bool _occupied; CString _target; public: CLASSDEF; - CBrainSlot() : CGameObject(), _value1(0) {} + CBrainSlot() : CGameObject(), _occupied(false) {} /** * Save the data for the class to file diff --git a/engines/titanic/game/bridge_view.cpp b/engines/titanic/game/bridge_view.cpp index 5b2b8809d9..e8d70c8c43 100644 --- a/engines/titanic/game/bridge_view.cpp +++ b/engines/titanic/game/bridge_view.cpp @@ -31,13 +31,13 @@ END_MESSAGE_MAP() void CBridgeView::save(SimpleFile *file, int indent) { file->writeNumberLine(1, indent); - file->writeNumberLine(_mode, indent); + file->writeNumberLine(_action, indent); CBackground::save(file, indent); } void CBridgeView::load(SimpleFile *file) { file->readNumber(); - _mode = file->readNumber(); + _action = (BridgeAction)file->readNumber(); CBackground::load(file); } @@ -47,13 +47,13 @@ bool CBridgeView::ActMsg(CActMsg *msg) { volumeMsg._secondsTransition = 1; if (msg->_action == "End") { - _mode = 4; + _action = BA_ENDING2; petLockInput(); petHide(); setVisible(true); playMovie(MOVIE_NOTIFY_OBJECT); } else if (msg->_action == "Go") { - _mode = 1; + _action = BA_GO; setVisible(true); volumeMsg._volume = 100; volumeMsg.execute("EngineSounds"); @@ -65,11 +65,11 @@ bool CBridgeView::ActMsg(CActMsg *msg) { onMsg.execute("EngineSounds"); if (msg->_action == "Cruise") { - _mode = 2; + _action = BA_CRUISE; setVisible(true); playMovie(MOVIE_NOTIFY_OBJECT); - } else if (msg->_action == "GoENd") { - _mode = 3; + } else if (msg->_action == "GoEnd") { + _action = BA_ENDING1; setVisible(true); CChangeMusicMsg musicMsg; musicMsg._flags = 1; @@ -86,21 +86,21 @@ bool CBridgeView::MovieEndMsg(CMovieEndMsg *msg) { CTurnOff offMsg; offMsg.execute("EngineSounds"); - switch (_mode) { - case 0: - case 1: + switch (_action) { + case BA_GO: + case BA_CRUISE: setVisible(false); decTransitions(); break; - case 2: { + case BA_ENDING1: { setVisible(false); CActMsg actMsg("End"); actMsg.execute("HomeSequence"); break; } - case 3: + case BA_ENDING2: setVisible(false); changeView("TheEnd.Node 3.N"); break; diff --git a/engines/titanic/game/bridge_view.h b/engines/titanic/game/bridge_view.h index 45cfa3f4c8..01bd6310ce 100644 --- a/engines/titanic/game/bridge_view.h +++ b/engines/titanic/game/bridge_view.h @@ -27,15 +27,19 @@ namespace Titanic { +enum BridgeAction { + BA_NONE = 0, BA_GO = 1, BA_CRUISE = 2, BA_ENDING1 = 3, BA_ENDING2 = 4 +}; + class CBridgeView : public CBackground { DECLARE_MESSAGE_MAP; bool ActMsg(CActMsg *msg); bool MovieEndMsg(CMovieEndMsg *msg); public: - int _mode; + BridgeAction _action; public: CLASSDEF; - CBridgeView() : CBackground(), _mode(0) {} + CBridgeView() : CBackground(), _action(BA_NONE) {} /** * Save the data for the class to file diff --git a/engines/titanic/game/captains_wheel.cpp b/engines/titanic/game/captains_wheel.cpp index 72d3cf70d9..1f0b177a67 100644 --- a/engines/titanic/game/captains_wheel.cpp +++ b/engines/titanic/game/captains_wheel.cpp @@ -34,17 +34,17 @@ BEGIN_MESSAGE_MAP(CCaptainsWheel, CBackground) END_MESSAGE_MAP() CCaptainsWheel::CCaptainsWheel() : CBackground(), - _fieldE0(0), _fieldE4(0), _fieldE8(0), _fieldEC(0), - _fieldF0(0), _fieldF4(0) { + _stopEnabled(false), _actionNum(0), _fieldE8(0), + _cruiseEnabled(false), _goEnabled(false), _fieldF4(0) { } void CCaptainsWheel::save(SimpleFile *file, int indent) { file->writeNumberLine(1, indent); - file->writeNumberLine(_fieldE0, indent); - file->writeNumberLine(_fieldE4, indent); + file->writeNumberLine(_stopEnabled, indent); + file->writeNumberLine(_actionNum, indent); file->writeNumberLine(_fieldE8, indent); - file->writeNumberLine(_fieldEC, indent); - file->writeNumberLine(_fieldF0, indent); + file->writeNumberLine(_cruiseEnabled, indent); + file->writeNumberLine(_goEnabled, indent); file->writeNumberLine(_fieldF4, indent); CBackground::save(file, indent); @@ -52,19 +52,19 @@ void CCaptainsWheel::save(SimpleFile *file, int indent) { void CCaptainsWheel::load(SimpleFile *file) { file->readNumber(); - _fieldE0 = file->readNumber(); - _fieldE4 = file->readNumber(); + _stopEnabled = file->readNumber(); + _actionNum = file->readNumber(); _fieldE8 = file->readNumber(); - _fieldEC = file->readNumber(); - _fieldF0 = file->readNumber(); + _cruiseEnabled = file->readNumber(); + _goEnabled = file->readNumber(); _fieldF4 = file->readNumber(); CBackground::load(file); } bool CCaptainsWheel::MouseButtonDownMsg(CMouseButtonDownMsg *msg) { - if (_fieldE0) { - _fieldE0 = false; + if (_stopEnabled) { + _stopEnabled = false; CTurnOff offMsg; offMsg.execute(this); playMovie(162, 168, 0); @@ -76,11 +76,11 @@ bool CCaptainsWheel::MouseButtonDownMsg(CMouseButtonDownMsg *msg) { } bool CCaptainsWheel::LeaveViewMsg(CLeaveViewMsg *msg) { - if (_fieldE0) { - _fieldE0 = false; + if (_stopEnabled) { + _stopEnabled = false; CTurnOff offMsg; offMsg.execute(this); - playMovie(162, 168, MOVIE_GAMESTATE); + playMovie(162, 168, MOVIE_WAIT_FOR_FINISH); } return true; @@ -88,34 +88,34 @@ bool CCaptainsWheel::LeaveViewMsg(CLeaveViewMsg *msg) { bool CCaptainsWheel::ActMsg(CActMsg *msg) { if (msg->_action == "Spin") { - if (_fieldE0) { + if (_stopEnabled) { CTurnOn onMsg; onMsg.execute("RatchetySound"); - playMovie(8, 142, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(8, 142, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); } } else if (msg->_action == "Honk") { - if (_fieldE0) { - playMovie(150, 160, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + if (_stopEnabled) { + playMovie(150, 160, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); } } else if (msg->_action == "Go") { - if (!_fieldE0) { + if (!_stopEnabled) { incTransitions(); - _fieldE0 = false; - _fieldE4 = 1; + _stopEnabled = false; + _actionNum = 1; CTurnOff offMsg; offMsg.execute(this); - playMovie(162, 168, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(162, 168, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); } } else if (msg->_action == "Cruise") { - if (_fieldE0) { + if (_stopEnabled) { incTransitions(); - _fieldE0 = false; - _fieldE4 = 2; + _stopEnabled = false; + _actionNum = 2; CTurnOff offMsg; offMsg.execute(this); - playMovie(162, 168, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(162, 168, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); } } else if (msg->_action == "SetDestin") { playSound("a#44.wav"); @@ -124,9 +124,9 @@ bool CCaptainsWheel::ActMsg(CActMsg *msg) { volumeMsg.execute("EngineSounds"); CTurnOn onMsg; onMsg.execute("EngineSounds"); - _fieldF0 = 1; + _goEnabled = true; } else if (msg->_action == "ClearDestin") { - _fieldF0 = 0; + _goEnabled = false; } return true; @@ -152,17 +152,17 @@ bool CCaptainsWheel::TurnOn(CTurnOn *msg) { signalMsg.execute("WheelSpin"); signalMsg.execute("SeagullHorn"); - if (_fieldE0) { + if (_stopEnabled) { signalMsg.execute("WheelStopButt"); signalMsg.execute("StopHotSpot"); } - if (_fieldEC) { + if (_cruiseEnabled) { signalMsg.execute("WheelCruiseButt"); signalMsg.execute("CruiseHotSpot"); } - if (_fieldF0) { + if (_goEnabled) { signalMsg.execute("WheelGoButt"); signalMsg.execute("GoHotSpot"); } @@ -172,7 +172,7 @@ bool CCaptainsWheel::TurnOn(CTurnOn *msg) { bool CCaptainsWheel::MovieEndMsg(CMovieEndMsg *msg) { if (msg->_endFrame == 8) { - _fieldE0 = true; + _stopEnabled = true; CTurnOn onMsg; onMsg.execute(this); } @@ -183,9 +183,9 @@ bool CCaptainsWheel::MovieEndMsg(CMovieEndMsg *msg) { } if (msg->_endFrame == 168) { - switch (_fieldE4) { + switch (_actionNum) { case 1: { - CActMsg actMsg(starFn2() ? "GoEnd" : "Go"); + CActMsg actMsg(starIsSolved() ? "GoEnd" : "Go"); actMsg.execute("GoSequence"); break; } @@ -200,7 +200,7 @@ bool CCaptainsWheel::MovieEndMsg(CMovieEndMsg *msg) { break; } - _fieldE4 = 0; + _actionNum = 0; } return true; diff --git a/engines/titanic/game/captains_wheel.h b/engines/titanic/game/captains_wheel.h index 3aca45c21f..7dce1ac6ee 100644 --- a/engines/titanic/game/captains_wheel.h +++ b/engines/titanic/game/captains_wheel.h @@ -36,11 +36,11 @@ class CCaptainsWheel : public CBackground { bool TurnOn(CTurnOn *msg); bool MovieEndMsg(CMovieEndMsg *msg); public: - int _fieldE0; - int _fieldE4; + bool _stopEnabled; + int _actionNum; int _fieldE8; - int _fieldEC; - int _fieldF0; + bool _cruiseEnabled; + bool _goEnabled; int _fieldF4; public: CLASSDEF; diff --git a/engines/titanic/game/cdrom.cpp b/engines/titanic/game/cdrom.cpp index 0d1cd3a6f2..d8d31ecc1a 100644 --- a/engines/titanic/game/cdrom.cpp +++ b/engines/titanic/game/cdrom.cpp @@ -38,21 +38,21 @@ CCDROM::CCDROM() : CGameObject() { void CCDROM::save(SimpleFile *file, int indent) { file->writeNumberLine(1, indent); - file->writePoint(_tempPos, indent); + file->writePoint(_centroid, indent); CGameObject::save(file, indent); } void CCDROM::load(SimpleFile *file) { file->readNumber(); - _tempPos = file->readPoint(); + _centroid = file->readPoint(); CGameObject::load(file); } bool CCDROM::MouseDragStartMsg(CMouseDragStartMsg *msg) { if (checkStartDragging(msg)) { hideMouse(); - _tempPos = msg->_mousePos - _bounds; - setPosition(msg->_mousePos - _tempPos); + _centroid = msg->_mousePos - _bounds; + setPosition(msg->_mousePos - _centroid); return true; } else { return false; @@ -77,7 +77,7 @@ bool CCDROM::MouseDragEndMsg(CMouseDragEndMsg *msg) { } bool CCDROM::MouseDragMoveMsg(CMouseDragMoveMsg *msg) { - setPosition(msg->_mousePos - _tempPos); + setPosition(msg->_mousePos - _centroid); return true; } diff --git a/engines/titanic/game/cdrom.h b/engines/titanic/game/cdrom.h index 017914830c..12175f6450 100644 --- a/engines/titanic/game/cdrom.h +++ b/engines/titanic/game/cdrom.h @@ -36,7 +36,7 @@ class CCDROM : public CGameObject { bool MouseDragMoveMsg(CMouseDragMoveMsg *msg); bool ActMsg(CActMsg *msg); private: - Point _tempPos; + Point _centroid; public: CLASSDEF; CCDROM(); diff --git a/engines/titanic/game/chicken_dispensor.cpp b/engines/titanic/game/chicken_dispensor.cpp index 8a56f43fff..89873dcc4d 100644 --- a/engines/titanic/game/chicken_dispensor.cpp +++ b/engines/titanic/game/chicken_dispensor.cpp @@ -89,10 +89,10 @@ bool CChickenDispensor::StatusChangeMsg(CStatusChangeMsg *msg) { setVisible(true); if (_disabled) { - playMovie(0, 12, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(0, 12, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); playSound("z#400.wav"); } else { - playMovie(12, 16, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(12, 16, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); } break; @@ -186,7 +186,7 @@ bool CChickenDispensor::MouseDragStartMsg(CMouseDragStartMsg *msg) { bool CChickenDispensor::TurnOff(CTurnOff *msg) { if (getMovieFrame() != 16) setVisible(false); - playMovie(16, 12, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(16, 12, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); _dispensed = false; return true; diff --git a/engines/titanic/game/code_wheel.cpp b/engines/titanic/game/code_wheel.cpp index 441fddec02..1df99ae749 100644 --- a/engines/titanic/game/code_wheel.cpp +++ b/engines/titanic/game/code_wheel.cpp @@ -30,17 +30,25 @@ BEGIN_MESSAGE_MAP(CodeWheel, CBomb) ON_MESSAGE(EnterViewMsg) ON_MESSAGE(MouseButtonUpMsg) ON_MESSAGE(MovieEndMsg) + ON_MESSAGE(CheckCodeWheelsMsg) END_MESSAGE_MAP() -CodeWheel::CodeWheel() : CBomb(), _field108(0), _state(4), - _field110(0), _field114(0), _field118(0) { +static const int START_FRAMES[15] = { + 0, 5, 10, 15, 19, 24, 28, 33, 38, 42, 47, 52, 57, 61, 66 +}; +static const int END_FRAMES[15] = { + 5, 10, 15, 19, 24, 28, 33, 38, 42, 47, 52, 57, 61, 66, 70 +}; + +CodeWheel::CodeWheel() : CBomb(), _correctValue(0), _value(4), + _matched(false), _field114(0), _field118(0) { } void CodeWheel::save(SimpleFile *file, int indent) { file->writeNumberLine(1, indent); - file->writeNumberLine(_field108, indent); - file->writeNumberLine(_state, indent); - file->writeNumberLine(_field110, indent); + file->writeNumberLine(_correctValue, indent); + file->writeNumberLine(_value, indent); + file->writeNumberLine(_matched, indent); if (g_vm->isGerman()) { file->writeNumberLine(_field114, indent); file->writeNumberLine(_field118, indent); @@ -51,9 +59,9 @@ void CodeWheel::save(SimpleFile *file, int indent) { void CodeWheel::load(SimpleFile *file) { file->readNumber(); - _field108 = file->readNumber(); - _state = file->readNumber(); - _field110 = file->readNumber(); + _correctValue = file->readNumber(); + _value = file->readNumber(); + _matched = file->readNumber(); if (g_vm->isGerman()) { _field114 = file->readNumber(); _field118 = file->readNumber(); @@ -63,29 +71,24 @@ void CodeWheel::load(SimpleFile *file) { } bool CodeWheel::MouseButtonDownMsg(CMouseButtonDownMsg *msg) { - static const int START_FRAMES[15] = { - 0, 5, 10, 15, 19, 24, 28, 33, 38, 42, 47, 52, 57, 61, 66 - }; - static const int END_FRAMES[15] = { - 5, 10, 15, 19, 24, 28, 33, 38, 42, 47, 52, 57, 61, 66, 70 - }; - int yp = _bounds.top + _bounds.height() / 2; + _matched = false; + if (msg->_mousePos.y > yp) { - if (_state == _field108) - _field110 = true; + if (_value == _correctValue) + _matched = true; - _state = (_state + 1) % 15; - playMovie(START_FRAMES[_state], END_FRAMES[_state], - MOVIE_GAMESTATE | MOVIE_NOTIFY_OBJECT); + _value = (_value + 1) % 15; + playMovie(START_FRAMES[_value], END_FRAMES[_value], + MOVIE_WAIT_FOR_FINISH | MOVIE_NOTIFY_OBJECT); } else { - if (_state == _field108) - _field110 = true; + if (_value == _correctValue) + _matched = true; - playMovie(START_FRAMES[14 - _state] + 68, END_FRAMES[14 - _state] + 68, - MOVIE_GAMESTATE | MOVIE_NOTIFY_OBJECT); + playMovie(START_FRAMES[14 - _value] + 68, END_FRAMES[14 - _value] + 68, + MOVIE_WAIT_FOR_FINISH | MOVIE_NOTIFY_OBJECT); - _state = (_state <= 0) ? 14 : _state - 1; + _value = (_value <= 0) ? 14 : _value - 1; } playSound("z#59.wav"); @@ -93,8 +96,8 @@ bool CodeWheel::MouseButtonDownMsg(CMouseButtonDownMsg *msg) { } bool CodeWheel::EnterViewMsg(CEnterViewMsg *msg) { - loadFrame(24); - _state = 4; + // WORKAROUND: Don't keep resetting code wheels back to default + loadFrame(END_FRAMES[_value]); return true; } @@ -104,15 +107,18 @@ bool CodeWheel::MouseButtonUpMsg(CMouseButtonUpMsg *msg) { bool CodeWheel::MovieEndMsg(CMovieEndMsg *msg) { sleep(200); + + // Signal that a code wheel has changed CStatusChangeMsg changeMsg; - changeMsg._newStatus = 0; - if (_field110) - changeMsg._newStatus = -1; - if (_field108 == _state) - changeMsg._newStatus = 1; changeMsg.execute("Bomb"); return true; } +bool CodeWheel::CheckCodeWheelsMsg(CCheckCodeWheelsMsg *msg) { + if (_value != _correctValue) + msg->_isCorrect = false; + return true; +} + } // End of namespace Titanic diff --git a/engines/titanic/game/code_wheel.h b/engines/titanic/game/code_wheel.h index de246f56c4..3d19eeb53c 100644 --- a/engines/titanic/game/code_wheel.h +++ b/engines/titanic/game/code_wheel.h @@ -33,10 +33,11 @@ class CodeWheel : public CBomb { bool EnterViewMsg(CEnterViewMsg *msg); bool MouseButtonUpMsg(CMouseButtonUpMsg *msg); bool MovieEndMsg(CMovieEndMsg *msg); + bool CheckCodeWheelsMsg(CCheckCodeWheelsMsg *msg); private: - int _field108; - int _state; - int _field110; + int _correctValue; + int _value; + bool _matched; // German specific fields int _field114; int _field118; @@ -53,6 +54,11 @@ public: * Load the data for the class from file */ virtual void load(SimpleFile *file); + + /** + * Resets a code wheel back to the default 'O' value + */ + void reset() { _value = 4; } }; } // End of namespace Titanic diff --git a/engines/titanic/game/computer_screen.cpp b/engines/titanic/game/computer_screen.cpp index 98bef6eb63..7d549d0497 100644 --- a/engines/titanic/game/computer_screen.cpp +++ b/engines/titanic/game/computer_screen.cpp @@ -47,10 +47,10 @@ void CComputerScreen::load(SimpleFile *file) { bool CComputerScreen::ActMsg(CActMsg *msg) { if (msg->_action == "newCD1" || msg->_action == "newCD2") { - playMovie(27, 53, MOVIE_GAMESTATE); - playMovie(19, 26, MOVIE_GAMESTATE); + playMovie(27, 53, MOVIE_WAIT_FOR_FINISH); + playMovie(19, 26, MOVIE_WAIT_FOR_FINISH); } else if (msg->_action == "newSTCD") { - playMovie(0, 18, MOVIE_GAMESTATE | MOVIE_NOTIFY_OBJECT); + playMovie(0, 18, MOVIE_WAIT_FOR_FINISH | MOVIE_NOTIFY_OBJECT); } return true; diff --git a/engines/titanic/game/end_sequence_control.cpp b/engines/titanic/game/end_sequence_control.cpp index 033a7752a3..0f3a97c3a2 100644 --- a/engines/titanic/game/end_sequence_control.cpp +++ b/engines/titanic/game/end_sequence_control.cpp @@ -77,7 +77,7 @@ bool CEndSequenceControl::EnterRoomMsg(CEnterRoomMsg *msg) { bool CEndSequenceControl::EnterViewMsg(CEnterViewMsg *msg) { movieSetAudioTiming(true); - playMovie(MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); return true; } diff --git a/engines/titanic/game/fan_control.cpp b/engines/titanic/game/fan_control.cpp index ca664764ea..7ed22fd560 100644 --- a/engines/titanic/game/fan_control.cpp +++ b/engines/titanic/game/fan_control.cpp @@ -121,7 +121,7 @@ bool CFanControl::StatusChangeMsg(CStatusChangeMsg *msg) { // It's puret time incTransitions(); _starlingsDying = true; - playMovie(12, 18, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(12, 18, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); } else { playMovie(12, 18, 0); } diff --git a/engines/titanic/game/games_console.cpp b/engines/titanic/game/games_console.cpp index 40311f70ee..6c13f4b862 100644 --- a/engines/titanic/game/games_console.cpp +++ b/engines/titanic/game/games_console.cpp @@ -56,7 +56,7 @@ bool CGamesConsole::MouseButtonDownMsg(CMouseButtonDownMsg *msg) { bool CGamesConsole::LeaveViewMsg(CLeaveViewMsg *msg) { if (_active) { _active = false; - playMovie(23, 44, MOVIE_GAMESTATE); + playMovie(23, 44, MOVIE_WAIT_FOR_FINISH); } return true; diff --git a/engines/titanic/game/glass_smasher.cpp b/engines/titanic/game/glass_smasher.cpp index 2123f2dfd0..7de034c2ee 100644 --- a/engines/titanic/game/glass_smasher.cpp +++ b/engines/titanic/game/glass_smasher.cpp @@ -42,7 +42,7 @@ void CGlassSmasher::load(SimpleFile *file) { bool CGlassSmasher::StatusChangeMsg(CStatusChangeMsg *msg) { setVisible(true); playSound("b#40.wav"); - playMovie(MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); return true; } diff --git a/engines/titanic/game/gondolier/gondolier_base.cpp b/engines/titanic/game/gondolier/gondolier_base.cpp index f3dc31c9f5..8b753ec264 100644 --- a/engines/titanic/game/gondolier/gondolier_base.cpp +++ b/engines/titanic/game/gondolier/gondolier_base.cpp @@ -28,45 +28,45 @@ BEGIN_MESSAGE_MAP(CGondolierBase, CGameObject) ON_MESSAGE(PuzzleSolvedMsg) END_MESSAGE_MAP() -int CGondolierBase::_v1; +bool CGondolierBase::_chestOpen; bool CGondolierBase::_puzzleSolved; int CGondolierBase::_volume1; int CGondolierBase::_v4; -int CGondolierBase::_v5; int CGondolierBase::_volume2; int CGondolierBase::_v7; -int CGondolierBase::_v8; -int CGondolierBase::_v9; -int CGondolierBase::_v10; +bool CGondolierBase::_rightSliderHooked; +bool CGondolierBase::_leftSliderHooked; +bool CGondolierBase::_priorLeftSliderHooked; +bool CGondolierBase::_priorRightSliderHooked; void CGondolierBase::save(SimpleFile *file, int indent) { file->writeNumberLine(1, indent); - file->writeNumberLine(_v1, indent); + file->writeNumberLine(_chestOpen, indent); file->writeNumberLine(_puzzleSolved, indent); file->writeNumberLine(_volume1, indent); file->writeNumberLine(_v4, indent); - file->writeNumberLine(_v5, indent); + file->writeNumberLine(_rightSliderHooked, indent); file->writeNumberLine(_volume2, indent); file->writeNumberLine(_v7, indent); - file->writeNumberLine(_v8, indent); - file->writeNumberLine(_v9, indent); - file->writeNumberLine(_v10, indent); + file->writeNumberLine(_leftSliderHooked, indent); + file->writeNumberLine(_priorLeftSliderHooked, indent); + file->writeNumberLine(_priorRightSliderHooked, indent); CGameObject::save(file, indent); } void CGondolierBase::load(SimpleFile *file) { file->readNumber(); - _v1 = file->readNumber(); + _chestOpen = file->readNumber(); _puzzleSolved = file->readNumber(); _volume1 = file->readNumber(); _v4 = file->readNumber(); - _v5 = file->readNumber(); + _rightSliderHooked = file->readNumber(); _volume2 = file->readNumber(); _v7 = file->readNumber(); - _v8 = file->readNumber(); - _v9 = file->readNumber(); - _v10 = file->readNumber(); + _leftSliderHooked = file->readNumber(); + _priorLeftSliderHooked = file->readNumber(); + _priorRightSliderHooked = file->readNumber(); CGameObject::load(file); } diff --git a/engines/titanic/game/gondolier/gondolier_base.h b/engines/titanic/game/gondolier/gondolier_base.h index 06d77ba85f..3b5df9f371 100644 --- a/engines/titanic/game/gondolier/gondolier_base.h +++ b/engines/titanic/game/gondolier/gondolier_base.h @@ -31,16 +31,16 @@ class CGondolierBase : public CGameObject { DECLARE_MESSAGE_MAP; bool PuzzleSolvedMsg(CPuzzleSolvedMsg *msg); protected: - static int _v1; + static bool _chestOpen; static bool _puzzleSolved; static int _volume1; static int _v4; - static int _v5; static int _volume2; static int _v7; - static int _v8; - static int _v9; - static int _v10; + static bool _leftSliderHooked; + static bool _rightSliderHooked; + static bool _priorLeftSliderHooked; + static bool _priorRightSliderHooked; public: CLASSDEF; diff --git a/engines/titanic/game/gondolier/gondolier_chest.cpp b/engines/titanic/game/gondolier/gondolier_chest.cpp index cf6656732b..6058b582f7 100644 --- a/engines/titanic/game/gondolier/gondolier_chest.cpp +++ b/engines/titanic/game/gondolier/gondolier_chest.cpp @@ -41,13 +41,13 @@ void CGondolierChest::load(SimpleFile *file) { } bool CGondolierChest::MouseButtonDownMsg(CMouseButtonDownMsg *msg) { - if (!_v1) + if (!_chestOpen) playMovie(0, 14, MOVIE_NOTIFY_OBJECT); else if (msg->_mousePos.y < 330) return false; - else if (!_v8 && !_v5) { + else if (!_leftSliderHooked && !_rightSliderHooked) { playMovie(14, 29, 0); - _v1 = 0; + _chestOpen = false; } return true; @@ -55,7 +55,7 @@ bool CGondolierChest::MouseButtonDownMsg(CMouseButtonDownMsg *msg) { bool CGondolierChest::MovieEndMsg(CMovieEndMsg *msg) { if (msg->_endFrame == 14) - _v1 = 1; + _chestOpen = true; return true; } diff --git a/engines/titanic/game/gondolier/gondolier_mixer.cpp b/engines/titanic/game/gondolier/gondolier_mixer.cpp index fc71ddd357..205d1f42da 100644 --- a/engines/titanic/game/gondolier/gondolier_mixer.cpp +++ b/engines/titanic/game/gondolier/gondolier_mixer.cpp @@ -141,7 +141,7 @@ bool CGondolierMixer::SignalObject(CSignalObject *msg) { if (msg->_strValue == "Fly") { _v4 = CLIP(msg->_numValue, 0, 10); - if (!_v8) { + if (!_leftSliderHooked) { _v7 = 10 - _v4; CStatusChangeMsg statusMsg; statusMsg._newStatus = _v7; @@ -152,7 +152,7 @@ bool CGondolierMixer::SignalObject(CSignalObject *msg) { if (msg->_strValue == "Tos") { _v7 = CLIP(msg->_numValue, 0, 10); - if (!_v5) { + if (!_rightSliderHooked) { _v4 = 10 - _v7; CStatusChangeMsg statusMsg; statusMsg._newStatus = _v4; @@ -160,7 +160,7 @@ bool CGondolierMixer::SignalObject(CSignalObject *msg) { } } - if (!_v4 && !_v7 && _v5 && _v8) { + if (!_v4 && !_v7 && _rightSliderHooked && _leftSliderHooked) { _puzzleSolved = true; CStatusChangeMsg statusMsg; statusMsg._newStatus = 1; diff --git a/engines/titanic/game/gondolier/gondolier_slider.cpp b/engines/titanic/game/gondolier/gondolier_slider.cpp index e7ca61de9c..b5edac57d4 100644 --- a/engines/titanic/game/gondolier/gondolier_slider.cpp +++ b/engines/titanic/game/gondolier/gondolier_slider.cpp @@ -24,7 +24,10 @@ namespace Titanic { -static const int ARRAY[11] = { 0, 0, 1, 4, 9, 15, 21, 27, 32, 35, 36 }; +/** + * Y offsets within slider for each successive thumbnail position + */ +static const int Y_OFFSETS[11] = { 0, 0, 1, 4, 9, 15, 21, 27, 32, 35, 36 }; BEGIN_MESSAGE_MAP(CGondolierSlider, CGondolierBase) ON_MESSAGE(MouseButtonDownMsg) @@ -40,86 +43,66 @@ BEGIN_MESSAGE_MAP(CGondolierSlider, CGondolierBase) END_MESSAGE_MAP() CGondolierSlider::CGondolierSlider() : CGondolierBase(), - _fieldBC(0), _fieldC0(0), _fieldC4(0), _fieldC8(0), - _arrayIndex(0), _string1("NULL"), _fieldFC(0), _field118(0) { + _sliderIndex(0), _stringUnused("NULL"), _sliderNum(0), _dragging(false) { } void CGondolierSlider::save(SimpleFile *file, int indent) { file->writeNumberLine(1, indent); - file->writeNumberLine(_fieldBC, indent); - file->writeNumberLine(_fieldC0, indent); - file->writeNumberLine(_fieldC4, indent); - file->writeNumberLine(_fieldC8, indent); - file->writeNumberLine(_sliderRect1.left, indent); - file->writeNumberLine(_sliderRect1.top, indent); - file->writeNumberLine(_sliderRect1.right, indent); - file->writeNumberLine(_sliderRect1.bottom, indent); - file->writeNumberLine(_sliderRect2.left, indent); - file->writeNumberLine(_sliderRect2.top, indent); - file->writeNumberLine(_sliderRect2.right, indent); - file->writeNumberLine(_sliderRect2.bottom, indent); - file->writeNumberLine(_sliderRect1.left, indent); - file->writeQuotedLine(_string1, indent); - file->writeNumberLine(_fieldFC, indent); - file->writeQuotedLine(_string2, indent); - file->writeQuotedLine(_string3, indent); - file->writeNumberLine(_field118, indent); + file->writeRect(_rectUnused, indent); + file->writeRect(_thumbRect, indent); + file->writeRect(_defaultThumbRect, indent); + file->writeNumberLine(_sliderIndex, indent); + file->writeQuotedLine(_stringUnused, indent); + file->writeNumberLine(_sliderNum, indent); + file->writeQuotedLine(_armName, indent); + file->writeQuotedLine(_signalTarget, indent); + file->writeNumberLine(_dragging, indent); CGondolierBase::save(file, indent); } void CGondolierSlider::load(SimpleFile *file) { file->readNumber(); - _fieldBC = file->readNumber(); - _fieldC0 = file->readNumber(); - _fieldC4 = file->readNumber(); - _fieldC8 = file->readNumber(); - _sliderRect1.left = file->readNumber(); - _sliderRect1.top = file->readNumber(); - _sliderRect1.right = file->readNumber(); - _sliderRect1.bottom = file->readNumber(); - _sliderRect2.left = file->readNumber(); - _sliderRect2.top = file->readNumber(); - _sliderRect2.right = file->readNumber(); - _sliderRect2.bottom = file->readNumber(); - _arrayIndex = file->readNumber(); - _string1 = file->readString(); - _fieldFC = file->readNumber(); - _string2 = file->readString(); - _string3 = file->readString(); - _field118 = file->readNumber(); + _rectUnused = file->readRect(); + _thumbRect = file->readRect(); + _defaultThumbRect = file->readRect(); + _sliderIndex = file->readNumber(); + _stringUnused = file->readString(); + _sliderNum = file->readNumber(); + _armName = file->readString(); + _signalTarget = file->readString(); + _dragging = file->readNumber(); CGondolierBase::load(file); } bool CGondolierSlider::MouseButtonDownMsg(CMouseButtonDownMsg *msg) { - if (!_v1) + if (!_chestOpen) return false; - if (_fieldFC ? _v5 : _v8) + if (_sliderNum ? _rightSliderHooked : _leftSliderHooked) return false; - return _sliderRect1.contains(msg->_mousePos); + return _thumbRect.contains(msg->_mousePos); } bool CGondolierSlider::MouseDragMoveMsg(CMouseDragMoveMsg *msg) { - if (!(_fieldFC ? _v5 : _v8)) { + if (!(_sliderNum ? _rightSliderHooked : _leftSliderHooked)) { int minVal = 0x7FFFFFFF; int foundIndex = -1; - int yp = (_sliderRect2.top + _sliderRect2.bottom) / 2 + int yp = (_defaultThumbRect.top + _defaultThumbRect.bottom) / 2 + _bounds.top - msg->_mousePos.y; for (int idx = 0; idx < 11; ++idx) { - int yv = yp + ARRAY[idx]; - if (yv < 0) - yv = -yv; - if (yv < minVal) { - minVal = yv; + int yDiff = ABS(yp + Y_OFFSETS[idx]); + + if (yDiff < minVal) { + minVal = yDiff; foundIndex = idx; } } if (foundIndex >= 0) { - _arrayIndex = foundIndex; + _sliderIndex = foundIndex; CSignalObject signalMsg; signalMsg.execute(this); } @@ -135,70 +118,70 @@ bool CGondolierSlider::EnterViewMsg(CEnterViewMsg *msg) { } bool CGondolierSlider::MouseDragStartMsg(CMouseDragStartMsg *msg) { - if (!_v1) + if (!_chestOpen) return false; - if (_fieldFC ? _v5 : _v8) + if (_sliderNum ? _rightSliderHooked : _leftSliderHooked) return false; - _field118 = checkStartDragging(msg); - return _field118; + _dragging = checkStartDragging(msg); + return _dragging; } bool CGondolierSlider::StatusChangeMsg(CStatusChangeMsg *msg) { - _arrayIndex = CLIP(10 - msg->_newStatus, 0, 10); - _sliderRect1 = _sliderRect2; - _sliderRect1.translate(_bounds.left, _bounds.top); - _sliderRect1.translate(0, ARRAY[_arrayIndex]); + _sliderIndex = CLIP(10 - msg->_newStatus, 0, 10); + _thumbRect = _defaultThumbRect; + _thumbRect.translate(_bounds.left, _bounds.top); + _thumbRect.translate(0, Y_OFFSETS[_sliderIndex]); - loadFrame(_arrayIndex); + loadFrame(_sliderIndex); return true; } bool CGondolierSlider::MouseDragEndMsg(CMouseDragEndMsg *msg) { - _field118 = false; + _dragging = false; return true; } bool CGondolierSlider::IsHookedOnMsg(CIsHookedOnMsg *msg) { - if (_fieldFC ? _v5 : _v8) + if (_sliderNum ? _rightSliderHooked : _leftSliderHooked) return false; - if (!_sliderRect1.intersects(msg->_rect)) { - _string2 = CString(); - msg->_result = false; + if (!_thumbRect.intersects(msg->_rect)) { + _armName = CString(); + msg->_isHooked = false; } else { - _string2 = _string1; - if (_fieldFC) { - _v5 = _v9 = 1; + _armName = msg->_armName; + if (_sliderNum) { + _rightSliderHooked = _priorLeftSliderHooked = true; } else { - _v8 = _v10 = 1; + _leftSliderHooked = _priorRightSliderHooked = true; } - msg->_result = true; + msg->_isHooked = true; } return true; } bool CGondolierSlider::FrameMsg(CFrameMsg *msg) { - if (_fieldFC ? _v5 : _v8) { - if (_arrayIndex < 10) { - ++_arrayIndex; + if (_sliderNum ? _rightSliderHooked : _leftSliderHooked) { + if (_sliderIndex < 10) { + ++_sliderIndex; CSignalObject signalMsg; signalMsg.execute(this); int yp = 0; - if (_arrayIndex > 0) - yp = ARRAY[_arrayIndex] - ARRAY[_arrayIndex - 1]; + if (_sliderIndex > 0) + yp = Y_OFFSETS[_sliderIndex] - Y_OFFSETS[_sliderIndex - 1]; - if (!_string2.empty()) { + if (!_armName.empty()) { CTranslateObjectMsg transMsg; transMsg._delta = Point(0, yp); - transMsg.execute(_string2); + transMsg.execute(_armName); } } - } else if (_fieldFC ? _v10 : _v9) { - if (!_field118 && !_puzzleSolved && _arrayIndex > 0) { + } else if (_sliderNum ? _priorRightSliderHooked : _priorLeftSliderHooked) { + if (!_dragging && !_puzzleSolved && _sliderIndex > 0) { CSignalObject signalMsg; signalMsg.execute(this); } @@ -208,28 +191,28 @@ bool CGondolierSlider::FrameMsg(CFrameMsg *msg) { } bool CGondolierSlider::SignalObject(CSignalObject *msg) { - _arrayIndex = CLIP(_arrayIndex, 0, 10); - _sliderRect1 = _sliderRect2; - _sliderRect1.translate(_bounds.left, _bounds.top); - _sliderRect1.translate(0, ARRAY[_arrayIndex]); - loadFrame(_arrayIndex); + _sliderIndex = CLIP(_sliderIndex, 0, 10); + _thumbRect = _defaultThumbRect; + _thumbRect.translate(_bounds.left, _bounds.top); + _thumbRect.translate(0, Y_OFFSETS[_sliderIndex]); + loadFrame(_sliderIndex); CSignalObject signalMsg; - signalMsg._numValue = 10 - _arrayIndex; - signalMsg._strValue = _fieldFC ? "Fly" : "Tos"; - signalMsg.execute(_string3); + signalMsg._numValue = 10 - _sliderIndex; + signalMsg._strValue = _sliderNum ? "Fly" : "Tos"; + signalMsg.execute(_signalTarget); return true; } bool CGondolierSlider::ActMsg(CActMsg *msg) { if (msg->_action == "Unhook") { - if (_fieldFC) { - _v5 = _v9 = 0; - _v10 = _v8; + if (_sliderNum) { + _rightSliderHooked = _priorLeftSliderHooked = false; + _priorRightSliderHooked = _leftSliderHooked; } else { - _v8 = _v10 = 0; - _v9 = _v5; + _leftSliderHooked = _priorRightSliderHooked = false; + _priorLeftSliderHooked = _rightSliderHooked; } } diff --git a/engines/titanic/game/gondolier/gondolier_slider.h b/engines/titanic/game/gondolier/gondolier_slider.h index d1562f5b2d..0679c0d993 100644 --- a/engines/titanic/game/gondolier/gondolier_slider.h +++ b/engines/titanic/game/gondolier/gondolier_slider.h @@ -40,18 +40,15 @@ class CGondolierSlider : public CGondolierBase { bool SignalObject(CSignalObject *msg); bool ActMsg(CActMsg *msg); private: - int _fieldBC; - int _fieldC0; - int _fieldC4; - int _fieldC8; - Rect _sliderRect1; - Rect _sliderRect2; - int _arrayIndex; - CString _string1; - int _fieldFC; - CString _string2; - CString _string3; - bool _field118; + Rect _rectUnused; + Rect _thumbRect; + Rect _defaultThumbRect; + int _sliderIndex; + CString _stringUnused; + int _sliderNum; + CString _armName; + CString _signalTarget; + bool _dragging; public: CLASSDEF; CGondolierSlider(); diff --git a/engines/titanic/game/hammer_dispensor.cpp b/engines/titanic/game/hammer_dispensor.cpp index 2450868b14..82aeec12cb 100644 --- a/engines/titanic/game/hammer_dispensor.cpp +++ b/engines/titanic/game/hammer_dispensor.cpp @@ -77,9 +77,9 @@ bool CHammerDispensor::EnterViewMsg(CEnterViewMsg *msg) { bool CHammerDispensor::LeaveViewMsg(CLeaveViewMsg *msg) { if (_isOpen) - playMovie(32, 50, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(32, 50, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); else - playMovie(0, 7, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(0, 7, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); _panUp = true; _isOpen = false; diff --git a/engines/titanic/game/head_slot.cpp b/engines/titanic/game/head_slot.cpp index 06c366abd6..f8a65715ad 100644 --- a/engines/titanic/game/head_slot.cpp +++ b/engines/titanic/game/head_slot.cpp @@ -37,77 +37,77 @@ BEGIN_MESSAGE_MAP(CHeadSlot, CGameObject) ON_MESSAGE(MouseDragStartMsg) END_MESSAGE_MAP() -int CHeadSlot::_v1; +bool CHeadSlot::_titaniaWoken; -CHeadSlot::CHeadSlot() : CGameObject(), _string1("NotWorking"), _string2("NULL"), - _fieldBC(0), _fieldD8(0), _fieldDC(27), _fieldE0(56), - _fieldE4(82), _fieldE8(112), _fieldEC(false) { +CHeadSlot::CHeadSlot() : CGameObject(), _senseState("NotWorking"), _target("NULL"), + _occupied(false), _timerDuration(0), _frameNum1(27), _frameNum2(56), + _frameNum3(82), _frameNum4(112), _workingFlag(false) { } void CHeadSlot::save(SimpleFile *file, int indent) { file->writeNumberLine(1, indent); - file->writeNumberLine(_fieldBC, indent); - file->writeQuotedLine(_string1, indent); - file->writeQuotedLine(_string2, indent); - file->writeNumberLine(_fieldD8, indent); - file->writeNumberLine(_fieldDC, indent); - file->writeNumberLine(_fieldE0, indent); - file->writeNumberLine(_fieldE4, indent); - file->writeNumberLine(_fieldE8, indent); - file->writeNumberLine(_v1, indent); - file->writeNumberLine(_fieldEC, indent); + file->writeNumberLine(_occupied, indent); + file->writeQuotedLine(_senseState, indent); + file->writeQuotedLine(_target, indent); + file->writeNumberLine(_timerDuration, indent); + file->writeNumberLine(_frameNum1, indent); + file->writeNumberLine(_frameNum2, indent); + file->writeNumberLine(_frameNum3, indent); + file->writeNumberLine(_frameNum4, indent); + file->writeNumberLine(_titaniaWoken, indent); + file->writeNumberLine(_workingFlag, indent); CGameObject::save(file, indent); } void CHeadSlot::load(SimpleFile *file) { file->readNumber(); - _fieldBC = file->readNumber(); - _string1 = file->readString(); - _string2 = file->readString(); - _fieldD8 = file->readNumber(); - _fieldDC = file->readNumber(); - _fieldE0 = file->readNumber(); - _fieldE4 = file->readNumber(); - _fieldE8 = file->readNumber(); - _v1 = file->readNumber(); - _fieldEC = file->readNumber(); + _occupied = file->readNumber(); + _senseState = file->readString(); + _target = file->readString(); + _timerDuration = file->readNumber(); + _frameNum1 = file->readNumber(); + _frameNum2 = file->readNumber(); + _frameNum3 = file->readNumber(); + _frameNum4 = file->readNumber(); + _titaniaWoken = file->readNumber(); + _workingFlag = file->readNumber(); CGameObject::load(file); } bool CHeadSlot::AddHeadPieceMsg(CAddHeadPieceMsg *msg) { setVisible(true); - _fieldBC = 1; - _string2 = msg->_value; - playMovie(_fieldDC, _fieldE8, 0); + _occupied = true; + _target = msg->_value; + playMovie(_frameNum1, _frameNum4, 0); _cursorId = CURSOR_HAND; msg->execute("TitaniaControl"); return true; } bool CHeadSlot::SenseWorkingMsg(CSenseWorkingMsg *msg) { - if (_fieldEC) - playMovie(_fieldE4, _fieldE8, 0); + if (_workingFlag) + playMovie(_frameNum3, _frameNum4, 0); - _string1 = msg->_value; - _fieldEC = false; + _senseState = msg->_value; + _workingFlag = false; return true; } bool CHeadSlot::EnterViewMsg(CEnterViewMsg *msg) { setVisible(true); - if (_v1) + if (_titaniaWoken) _cursorId = CURSOR_ARROW; - if (_v1 == 1 || _string1 == "Working") { - playMovie(_fieldE0, _fieldE4, MOVIE_GAMESTATE); - _fieldEC = true; - } else if (_fieldBC) { - playMovie(_fieldE0, _fieldE8, MOVIE_GAMESTATE); - _fieldEC = false; + if (_titaniaWoken || _senseState == "Working") { + playMovie(_frameNum2, _frameNum3, MOVIE_WAIT_FOR_FINISH); + _workingFlag = true; + } else if (_occupied) { + playMovie(_frameNum2, _frameNum4, MOVIE_WAIT_FOR_FINISH); + _workingFlag = false; } else { - playMovie(0, _fieldDC, MOVIE_GAMESTATE); + playMovie(0, _frameNum1, MOVIE_WAIT_FOR_FINISH); } addTimer(5000 + getRandomNumber(3000)); @@ -118,16 +118,15 @@ bool CHeadSlot::LeaveViewMsg(CLeaveViewMsg *msg) { if (getName() == "YepItsASlot") { stopMovie(); - if (_fieldBC) { - loadFrame(_fieldE0); - playMovie(_fieldE0, _fieldE8, MOVIE_GAMESTATE); - _fieldEC = false; + if (_occupied) { + loadFrame(_frameNum2); + playMovie(_frameNum2, _frameNum4, MOVIE_WAIT_FOR_FINISH); } else { - loadFrame(_fieldDC); - playMovie(_fieldDC, _fieldE0, MOVIE_GAMESTATE); + loadFrame(_frameNum1); + playMovie(_frameNum1, _frameNum2, MOVIE_WAIT_FOR_FINISH); } - _fieldEC = false; + _workingFlag = false; } return true; @@ -138,19 +137,19 @@ bool CHeadSlot::LoadSuccessMsg(CLoadSuccessMsg *msg) { } bool CHeadSlot::TimerMsg(CTimerMsg *msg) { - if (compareViewNameTo("Titania.Node 15.S") && CBrainSlot::_added == 5 - && _fieldBC == 1) { - if (_string1 == "Working" && !_fieldEC) { - playMovie(_fieldE0, _fieldE4, 0); - _fieldEC = true; - } else if (_string1 == "Random") { - playMovie(_fieldE0, _fieldE8, 0); + if (compareViewNameTo("Titania.Node 15.S") && CBrainSlot::_numAdded == 5 + && _occupied) { + if (_senseState == "Working" && !_workingFlag) { + playMovie(_frameNum2, _frameNum3, 0); + _workingFlag = true; + } else if (_senseState == "Random") { + playMovie(_frameNum2, _frameNum4, 0); } } if (compareViewNameTo("Titania.Node 15.S")) { - _fieldD8 = 7000 + getRandomNumber(5000); - addTimer(_fieldD8); + _timerDuration = 7000 + getRandomNumber(5000); + addTimer(_timerDuration); } return true; @@ -158,27 +157,29 @@ bool CHeadSlot::TimerMsg(CTimerMsg *msg) { bool CHeadSlot::ActMsg(CActMsg *msg) { if (msg->_action == "Woken") - _v1 = 1; + _titaniaWoken = true; return true; } bool CHeadSlot::MouseDragStartMsg(CMouseDragStartMsg *msg) { - if (_fieldBC && !_v1 && checkPoint(msg->_mousePos, false, true)) { + if (_occupied && !_titaniaWoken && checkPoint(msg->_mousePos, false, true)) { CPassOnDragStartMsg passMsg; passMsg._mousePos = msg->_mousePos; - passMsg.execute(_string2); + passMsg.execute(_target); - msg->_dragItem = getRoot()->findByName(_string2); + msg->_dragItem = getRoot()->findByName(_target); _cursorId = CURSOR_ARROW; - _fieldBC = 0; - _fieldEC = false; - _string2 = "NULL"; + _occupied = false; + _workingFlag = false; + _target = "NULL"; stopMovie(); loadFrame(0); - playMovie(0, _fieldDC, 0); + playMovie(0, _frameNum1, 0); + + return true; } - return true; + return false; } } // End of namespace Titanic diff --git a/engines/titanic/game/head_slot.h b/engines/titanic/game/head_slot.h index 2767db3b61..1474e03ff3 100644 --- a/engines/titanic/game/head_slot.h +++ b/engines/titanic/game/head_slot.h @@ -38,17 +38,17 @@ class CHeadSlot : public CGameObject { bool ActMsg(CActMsg *msg); bool MouseDragStartMsg(CMouseDragStartMsg *msg); public: - static int _v1; + static bool _titaniaWoken; public: - int _fieldBC; - CString _string1; - CString _string2; - int _fieldD8; - int _fieldDC; - int _fieldE0; - int _fieldE4; - int _fieldE8; - bool _fieldEC; + bool _occupied; + CString _senseState; + CString _target; + int _timerDuration; + int _frameNum1; + int _frameNum2; + int _frameNum3; + int _frameNum4; + bool _workingFlag; public: CLASSDEF; CHeadSlot(); diff --git a/engines/titanic/game/head_smash_event.cpp b/engines/titanic/game/head_smash_event.cpp index 5ec3d299d5..dd5e516b0d 100644 --- a/engines/titanic/game/head_smash_event.cpp +++ b/engines/titanic/game/head_smash_event.cpp @@ -42,7 +42,7 @@ void CHeadSmashEvent::load(SimpleFile *file) { bool CHeadSmashEvent::ActMsg(CActMsg *msg) { if (msg->_action == "PlayToEnd") { setVisible(true); - playMovie(MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); } return true; diff --git a/engines/titanic/game/long_stick_dispenser.cpp b/engines/titanic/game/long_stick_dispenser.cpp index bf2dae53be..c340cae75b 100644 --- a/engines/titanic/game/long_stick_dispenser.cpp +++ b/engines/titanic/game/long_stick_dispenser.cpp @@ -109,9 +109,9 @@ bool CLongStickDispenser::MouseButtonDownMsg(CMouseButtonDownMsg *msg) { bool CLongStickDispenser::LeaveViewMsg(CLeaveViewMsg *msg) { if (_fieldC0 == 1) { if (_fieldC4) { - playMovie(19, 38, MOVIE_GAMESTATE); + playMovie(19, 38, MOVIE_WAIT_FOR_FINISH); } else { - playMovie(0, 18, MOVIE_GAMESTATE); + playMovie(0, 18, MOVIE_WAIT_FOR_FINISH); _fieldBC = 1; } diff --git a/engines/titanic/game/nut_replacer.cpp b/engines/titanic/game/nut_replacer.cpp index 6b05d1d0e9..3b1247fd8c 100644 --- a/engines/titanic/game/nut_replacer.cpp +++ b/engines/titanic/game/nut_replacer.cpp @@ -41,7 +41,7 @@ void CNutReplacer::load(SimpleFile *file) { bool CNutReplacer::ReplaceBowlAndNutsMsg(CReplaceBowlAndNutsMsg *msg) { setVisible(true); - playMovie(MOVIE_GAMESTATE | MOVIE_NOTIFY_OBJECT); + playMovie(MOVIE_WAIT_FOR_FINISH | MOVIE_NOTIFY_OBJECT); return true; } diff --git a/engines/titanic/game/parrot/parrot_nut_eater.cpp b/engines/titanic/game/parrot/parrot_nut_eater.cpp index b9697d7b61..7196d76ccb 100644 --- a/engines/titanic/game/parrot/parrot_nut_eater.cpp +++ b/engines/titanic/game/parrot/parrot_nut_eater.cpp @@ -67,7 +67,7 @@ bool CParrotNutEater::ReplaceBowlAndNutsMsg(CReplaceBowlAndNutsMsg *msg) { bool CParrotNutEater::NutPuzzleMsg(CNutPuzzleMsg *msg) { if (msg->_value == "Jiggle") { setVisible(true); - playMovie(MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); movieEvent(68); movieEvent(132); playSound("z#215.wav"); diff --git a/engines/titanic/game/phonograph.cpp b/engines/titanic/game/phonograph.cpp index f43bb3a60b..b86fa0b6e0 100644 --- a/engines/titanic/game/phonograph.cpp +++ b/engines/titanic/game/phonograph.cpp @@ -34,8 +34,8 @@ BEGIN_MESSAGE_MAP(CPhonograph, CMusicPlayer) END_MESSAGE_MAP() CPhonograph::CPhonograph() : CMusicPlayer(), - _isPlaying(false), _isRecording(false), _isDisabled(false), _fieldEC(0), - _fieldF0(0), _fieldF4(0) { + _isPlaying(false), _isRecording(false), _isDisabled(false), + _playUnpressedFrame(false), _playPressedFrame(false), _unused5(0) { } void CPhonograph::save(SimpleFile *file, int indent) { @@ -44,9 +44,9 @@ void CPhonograph::save(SimpleFile *file, int indent) { file->writeNumberLine(_isPlaying, indent); file->writeNumberLine(_isRecording, indent); file->writeNumberLine(_isDisabled, indent); - file->writeNumberLine(_fieldEC, indent); - file->writeNumberLine(_fieldF0, indent); - file->writeNumberLine(_fieldF4, indent); + file->writeNumberLine(_playUnpressedFrame, indent); + file->writeNumberLine(_playPressedFrame, indent); + file->writeNumberLine(_unused5, indent); CMusicPlayer::save(file, indent); } @@ -57,9 +57,9 @@ void CPhonograph::load(SimpleFile *file) { _isPlaying = file->readNumber(); _isRecording = file->readNumber(); _isDisabled = file->readNumber(); - _fieldEC = file->readNumber(); - _fieldF0 = file->readNumber(); - _fieldF4 = file->readNumber(); + _playUnpressedFrame = file->readNumber(); + _playPressedFrame = file->readNumber(); + _unused5 = file->readNumber(); CMusicPlayer::load(file); } @@ -83,7 +83,7 @@ bool CPhonograph::PhonographPlayMsg(CPhonographPlayMsg *msg) { _isPlaying = true; msg->_value = 1; } else { - stopGlobalSound(0, -1); + stopGlobalSound(false, -1); playGlobalSound(cylinderMsg._name, -2, true, true, 0); _isPlaying = true; msg->_value = 1; @@ -98,7 +98,6 @@ bool CPhonograph::PhonographStopMsg(CPhonographStopMsg *msg) { if (!holderMsg._isPresent) return true; - _isPlaying = false; CQueryCylinderMsg cylinderMsg; cylinderMsg.execute(holderMsg._target); diff --git a/engines/titanic/game/phonograph.h b/engines/titanic/game/phonograph.h index 4cce6ecefd..6630a18f27 100644 --- a/engines/titanic/game/phonograph.h +++ b/engines/titanic/game/phonograph.h @@ -41,9 +41,9 @@ protected: bool _isPlaying; bool _isRecording; bool _isDisabled; - int _fieldEC; - int _fieldF0; - int _fieldF4; + int _playUnpressedFrame; + int _playPressedFrame; + int _unused5; public: CLASSDEF; CPhonograph(); diff --git a/engines/titanic/game/phonograph_lid.cpp b/engines/titanic/game/phonograph_lid.cpp index e4e5f4882c..cde9415e02 100644 --- a/engines/titanic/game/phonograph_lid.cpp +++ b/engines/titanic/game/phonograph_lid.cpp @@ -76,7 +76,7 @@ bool CPhonographLid::LockPhonographMsg(CLockPhonographMsg *msg) { bool CPhonographLid::LeaveViewMsg(CLeaveViewMsg *msg) { if (_open) { - playMovie(27, 55, MOVIE_GAMESTATE); + playMovie(27, 55, MOVIE_WAIT_FOR_FINISH); _open = false; } diff --git a/engines/titanic/game/play_on_act.cpp b/engines/titanic/game/play_on_act.cpp index 9c368c335d..ffed45c11f 100644 --- a/engines/titanic/game/play_on_act.cpp +++ b/engines/titanic/game/play_on_act.cpp @@ -45,7 +45,7 @@ bool CPlayOnAct::ActMsg(CActMsg *msg) { playMovie(0); } else if (msg->_action == "PlayToEnd") { setVisible(true); - playMovie(MOVIE_GAMESTATE); + playMovie(MOVIE_WAIT_FOR_FINISH); } return true; diff --git a/engines/titanic/game/port_hole.cpp b/engines/titanic/game/port_hole.cpp index 25807b1b1d..9111561588 100644 --- a/engines/titanic/game/port_hole.cpp +++ b/engines/titanic/game/port_hole.cpp @@ -79,7 +79,7 @@ bool CPortHole::MovieEndMsg(CMovieEndMsg *msg) { bool CPortHole::LeaveViewMsg(CLeaveViewMsg *msg) { if (_open) { playSound(_closeSoundName); - playMovie(14, 26, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(14, 26, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); _open = false; } diff --git a/engines/titanic/game/replacement_ear.cpp b/engines/titanic/game/replacement_ear.cpp index e8bd384207..d1274e92db 100644 --- a/engines/titanic/game/replacement_ear.cpp +++ b/engines/titanic/game/replacement_ear.cpp @@ -40,7 +40,7 @@ void CReplacementEar::load(SimpleFile *file) { bool CReplacementEar::VisibleMsg(CVisibleMsg *msg) { setVisible(true); - playMovie(MOVIE_GAMESTATE); + playMovie(MOVIE_WAIT_FOR_FINISH); playSound("z#64.wav"); return true; } diff --git a/engines/titanic/game/restaurant_cylinder_holder.cpp b/engines/titanic/game/restaurant_cylinder_holder.cpp index 05f731d32d..eddd4d2288 100644 --- a/engines/titanic/game/restaurant_cylinder_holder.cpp +++ b/engines/titanic/game/restaurant_cylinder_holder.cpp @@ -66,15 +66,15 @@ void CRestaurantCylinderHolder::load(SimpleFile *file) { bool CRestaurantCylinderHolder::EjectCylinderMsg(CEjectCylinderMsg *msg) { _field11C = true; - bool hasCylinder = findByName("Phonograph Cylinder") != nullptr; + bool hasCylinder = findByName("Phonograph Cylinder", true) != nullptr; if (_isOpen) { playClip(hasCylinder ? "CloseHolder_Full" : "CloseHolder_Empty", - MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); _dropEnabled = true; } else { playClip(hasCylinder ? "OpenHolder_Full" : "OpenHolder_Empty", - MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); } playSound(_ejectSoundName, 50); diff --git a/engines/titanic/game/restaurant_phonograph.cpp b/engines/titanic/game/restaurant_phonograph.cpp index a2c8892201..3b35514a52 100644 --- a/engines/titanic/game/restaurant_phonograph.cpp +++ b/engines/titanic/game/restaurant_phonograph.cpp @@ -36,11 +36,11 @@ BEGIN_MESSAGE_MAP(CRestaurantPhonograph, CPhonograph) END_MESSAGE_MAP() CRestaurantPhonograph::CRestaurantPhonograph() : CPhonograph(), - _fieldF8(1), _field114(0) {} + _isLocked(true), _field114(0) {} void CRestaurantPhonograph::save(SimpleFile *file, int indent) { file->writeNumberLine(1, indent); - file->writeNumberLine(_fieldF8, indent); + file->writeNumberLine(_isLocked, indent); file->writeQuotedLine(_ejectSoundName, indent); file->writeQuotedLine(_stopSoundName, indent); @@ -51,7 +51,7 @@ void CRestaurantPhonograph::save(SimpleFile *file, int indent) { void CRestaurantPhonograph::load(SimpleFile *file) { file->readNumber(); - _fieldF8 = file->readNumber(); + _isLocked = file->readNumber(); _ejectSoundName = file->readString(); _stopSoundName = file->readString(); _field114 = file->readNumber(); @@ -60,20 +60,22 @@ void CRestaurantPhonograph::load(SimpleFile *file) { } bool CRestaurantPhonograph::MouseButtonDownMsg(CMouseButtonDownMsg *msg) { - if (!_fieldF8 && !_isPlaying) { + if (!_isLocked && !_isPlaying) { CQueryCylinderHolderMsg holderMsg; holderMsg.execute(this); if (!holderMsg._isOpen) { + // Start playing immediately CPhonographPlayMsg playMsg; playMsg.execute(this); } else if (holderMsg._isPresent) { + // Need to close the cylinder holder before playing CEjectCylinderMsg ejectMsg; - ejectMsg.execute(this); + ejectMsg.execute(this, nullptr, MSGFLAG_SCAN); _isDisabled = true; if (_field114) { - loadFrame(_fieldEC); + loadFrame(_playUnpressedFrame); playSound(_ejectSoundName); } } @@ -83,9 +85,11 @@ bool CRestaurantPhonograph::MouseButtonDownMsg(CMouseButtonDownMsg *msg) { } bool CRestaurantPhonograph::PhonographPlayMsg(CPhonographPlayMsg *msg) { + CPhonograph::PhonographPlayMsg(msg); + if (_isPlaying) { if (findView() == getView() && (!_isDisabled || !_field114)) { - loadFrame(_fieldEC); + loadFrame(_playUnpressedFrame); playSound(_ejectSoundName); } @@ -94,7 +98,7 @@ bool CRestaurantPhonograph::PhonographPlayMsg(CPhonographPlayMsg *msg) { CRestaurantMusicChanged musicMsg(nameMsg._name); musicMsg.execute(findRoom()); } else { - loadFrame(_fieldF0); + loadFrame(_playPressedFrame); } return true; @@ -105,11 +109,11 @@ bool CRestaurantPhonograph::PhonographStopMsg(CPhonographStopMsg *msg) { CPhonograph::PhonographStopMsg(msg); if (_isPlaying) { - loadFrame(_fieldF0); + loadFrame(_playUnpressedFrame); + } else { + loadFrame(_playPressedFrame); if (flag) playSound(_stopSoundName); - } else { - loadFrame(_fieldEC); } return true; @@ -135,12 +139,12 @@ bool CRestaurantPhonograph::EjectCylinderMsg(CEjectCylinderMsg *msg) { } bool CRestaurantPhonograph::QueryPhonographState(CQueryPhonographState *msg) { - msg->_value = _fieldF8; + msg->_value = _isLocked; return true; } bool CRestaurantPhonograph::LockPhonographMsg(CLockPhonographMsg *msg) { - _fieldF8 = msg->_value; + _isLocked = msg->_value; return true; } diff --git a/engines/titanic/game/restaurant_phonograph.h b/engines/titanic/game/restaurant_phonograph.h index 8f72eaf58f..67248447ab 100644 --- a/engines/titanic/game/restaurant_phonograph.h +++ b/engines/titanic/game/restaurant_phonograph.h @@ -37,7 +37,7 @@ class CRestaurantPhonograph : public CPhonograph { bool QueryPhonographState(CQueryPhonographState *msg); bool LockPhonographMsg(CLockPhonographMsg *msg); private: - int _fieldF8; + bool _isLocked; CString _ejectSoundName; CString _stopSoundName; int _field114; diff --git a/engines/titanic/game/season_background.cpp b/engines/titanic/game/season_background.cpp index 20ad6aca1d..d663c405ce 100644 --- a/engines/titanic/game/season_background.cpp +++ b/engines/titanic/game/season_background.cpp @@ -65,39 +65,39 @@ bool CSeasonBackground::ChangeSeasonMsg(CChangeSeasonMsg *msg) { switch (_seasonNum) { case SEASON_SUMMER: - playMovie(0, 45, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(0, 45, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); _defaultFrame = 45; break; case SEASON_AUTUMN: if (_flag) { - playMovie(232, 278, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(232, 278, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); _defaultFrame = 278; } else { - playMovie(45, 91, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(45, 91, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); _defaultFrame = 91; } break; case SEASON_WINTER: if (_flag) { - playMovie(278, 326, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(278, 326, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); _defaultFrame = 326; } else { CStatusChangeMsg changeMsg; changeMsg._newStatus = 0; changeMsg.execute("PickUpSpeechCentre"); - playMovie(91, 139, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(91, 139, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); _defaultFrame = 139; } break; case SEASON_SPRING: if (_flag) { - playMovie(326, 417, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(326, 417, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); _defaultFrame = 417; } else { - playMovie(139, 228, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(139, 228, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); _defaultFrame = 228; } break; diff --git a/engines/titanic/game/sgt/armchair.cpp b/engines/titanic/game/sgt/armchair.cpp index 681b1ae61d..6c0e7fe0ca 100644 --- a/engines/titanic/game/sgt/armchair.cpp +++ b/engines/titanic/game/sgt/armchair.cpp @@ -55,7 +55,7 @@ bool CArmchair::TurnOn(CTurnOn *msg) { _endFrame = 10; } - playMovie(_startFrame, _endFrame, MOVIE_GAMESTATE); + playMovie(_startFrame, _endFrame, MOVIE_WAIT_FOR_FINISH); playSound("b#0.wav"); _statics->_armchair = "Open"; _isClosed = false; @@ -70,7 +70,7 @@ bool CArmchair::TurnOff(CTurnOff *msg) { _startFrame = 11; _endFrame = 21; _isClosed = true; - playMovie(11, 21, MOVIE_GAMESTATE | MOVIE_NOTIFY_OBJECT); + playMovie(11, 21, MOVIE_WAIT_FOR_FINISH | MOVIE_NOTIFY_OBJECT); playSound("b#0.wav"); } diff --git a/engines/titanic/game/sgt/basin.cpp b/engines/titanic/game/sgt/basin.cpp index ce34a49250..fe3216e002 100644 --- a/engines/titanic/game/sgt/basin.cpp +++ b/engines/titanic/game/sgt/basin.cpp @@ -48,7 +48,7 @@ bool CBasin::TurnOn(CTurnOn *msg) { _isClosed = false; _startFrame = 0; _endFrame = 6; - playMovie(0, 6, MOVIE_GAMESTATE); + playMovie(0, 6, MOVIE_WAIT_FOR_FINISH); playSound("b#13.wav"); } @@ -61,7 +61,7 @@ bool CBasin::TurnOff(CTurnOff *msg) { _isClosed = true; _startFrame = 8; _endFrame = 14; - playMovie(8, 14, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(8, 14, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); playSound("b#13.wav"); } diff --git a/engines/titanic/game/sgt/bedfoot.cpp b/engines/titanic/game/sgt/bedfoot.cpp index d84a73f0a5..8f90e0f100 100644 --- a/engines/titanic/game/sgt/bedfoot.cpp +++ b/engines/titanic/game/sgt/bedfoot.cpp @@ -53,7 +53,7 @@ bool CBedfoot::TurnOn(CTurnOn *msg) { playSound("b#4.wav"); } - playMovie(_startFrame, _endFrame, MOVIE_GAMESTATE); + playMovie(_startFrame, _endFrame, MOVIE_WAIT_FOR_FINISH); } else if (_statics->_bedfoot == "RestingUnderTV") { _isClosed = false; _startFrame = 8; @@ -65,7 +65,7 @@ bool CBedfoot::TurnOn(CTurnOn *msg) { playSound("192_436_bed hits floor.wav"); } - playMovie(_startFrame, _endFrame, MOVIE_GAMESTATE); + playMovie(_startFrame, _endFrame, MOVIE_WAIT_FOR_FINISH); } if (_statics->_bedfoot == "Open") @@ -94,7 +94,7 @@ bool CBedfoot::TurnOff(CTurnOff *msg) { _endFrame = 25; } - playMovie(_startFrame, _endFrame, MOVIE_GAMESTATE); + playMovie(_startFrame, _endFrame, MOVIE_WAIT_FOR_FINISH); playSound("b#7.wav"); } else if (_statics->_bedfoot == "NotOnWashstand" && _statics->_bedhead == "ClosedWrong") { @@ -109,14 +109,14 @@ bool CBedfoot::TurnOff(CTurnOff *msg) { _endFrame = 25; } - playMovie(_startFrame, _endFrame, MOVIE_GAMESTATE); + playMovie(_startFrame, _endFrame, MOVIE_WAIT_FOR_FINISH); playSound("b#7.wav"); } else if (_statics->_bedfoot == "RestingUTV" && _statics->_tv == "Closed") { _statics->_bedfoot = "Closed"; _startFrame = 25; _endFrame = 30; - playMovie(25, 30, MOVIE_GAMESTATE); + playMovie(25, 30, MOVIE_WAIT_FOR_FINISH); playSound("b#7.wav"); } diff --git a/engines/titanic/game/sgt/bedhead.cpp b/engines/titanic/game/sgt/bedhead.cpp index b42c1c1146..1356afea83 100644 --- a/engines/titanic/game/sgt/bedhead.cpp +++ b/engines/titanic/game/sgt/bedhead.cpp @@ -110,7 +110,7 @@ bool CBedhead::TurnOn(CTurnOn *msg) { setVisible(true); _statics->_bedhead = entry._name4; - playMovie(entry._startFrame, entry._endFrame, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(entry._startFrame, entry._endFrame, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); playSound("b#6.wav"); _isClosed = false; } @@ -157,7 +157,7 @@ bool CBedhead::TurnOff(CTurnOff *msg) { setVisible(true); _statics->_bedhead = entry._name4; - playMovie(entry._startFrame, entry._endFrame, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(entry._startFrame, entry._endFrame, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); playSound("193_436_bed fold up 1.wav"); _isClosed = false; } diff --git a/engines/titanic/game/sgt/chest_of_drawers.cpp b/engines/titanic/game/sgt/chest_of_drawers.cpp index 9e00d4fde7..648308fc8f 100644 --- a/engines/titanic/game/sgt/chest_of_drawers.cpp +++ b/engines/titanic/game/sgt/chest_of_drawers.cpp @@ -46,7 +46,7 @@ bool CChestOfDrawers::TurnOn(CTurnOn *msg) { _statics->_chestOfDrawers = "Open"; _startFrame = 1; _endFrame = 14; - playMovie(1, 14, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(1, 14, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); playSound("b#11.wav"); } @@ -62,7 +62,7 @@ bool CChestOfDrawers::TurnOff(CTurnOff *msg) { _startFrame = 14; _endFrame = 27; - playMovie(14, 27, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(14, 27, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); playSound("b#11.wav"); } diff --git a/engines/titanic/game/sgt/desk.cpp b/engines/titanic/game/sgt/desk.cpp index a31efe9e5d..1aea9a8ab3 100644 --- a/engines/titanic/game/sgt/desk.cpp +++ b/engines/titanic/game/sgt/desk.cpp @@ -47,7 +47,7 @@ bool CDesk::TurnOn(CTurnOn *msg) { _isClosed = false; _startFrame = 1; _endFrame = 26; - playMovie(1, 26, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(1, 26, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); playSound("b#12.wav"); } @@ -64,7 +64,7 @@ bool CDesk::TurnOff(CTurnOff *msg) { _isClosed = true; _startFrame = 26; _endFrame = 51; - playMovie(26, 51, MOVIE_GAMESTATE); + playMovie(26, 51, MOVIE_WAIT_FOR_FINISH); playSound("b#9.wav"); } diff --git a/engines/titanic/game/sgt/deskchair.cpp b/engines/titanic/game/sgt/deskchair.cpp index 2b25f57d03..23b6ad64d7 100644 --- a/engines/titanic/game/sgt/deskchair.cpp +++ b/engines/titanic/game/sgt/deskchair.cpp @@ -48,7 +48,7 @@ bool CDeskchair::TurnOn(CTurnOn *msg) { _isClosed = false; _startFrame = 0; _endFrame = 16; - playMovie(0, 16, MOVIE_GAMESTATE); + playMovie(0, 16, MOVIE_WAIT_FOR_FINISH); playSound("b#8.wav"); } @@ -61,7 +61,7 @@ bool CDeskchair::TurnOff(CTurnOff *msg) { _isClosed = true; _startFrame = 16; _endFrame = 32; - playMovie(16, 32, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(16, 32, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); playSound("b#2.wav"); } diff --git a/engines/titanic/game/sgt/drawer.cpp b/engines/titanic/game/sgt/drawer.cpp index 68752b3d2f..7288bbdc61 100644 --- a/engines/titanic/game/sgt/drawer.cpp +++ b/engines/titanic/game/sgt/drawer.cpp @@ -53,7 +53,7 @@ bool CDrawer::TurnOn(CTurnOn *msg) { _endFrame = 75; setVisible(true); _statics->_drawer = "Open"; - playMovie(_startFrame, _endFrame, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(_startFrame, _endFrame, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); playSound("b#10.wav"); } @@ -66,7 +66,7 @@ bool CDrawer::TurnOff(CTurnOff *msg) { _startFrame = 75; _endFrame = 100; _isClosed = true; - playMovie(_startFrame, _endFrame, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(_startFrame, _endFrame, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); playSound("b#10.wav"); } diff --git a/engines/titanic/game/sgt/sgt_doors.cpp b/engines/titanic/game/sgt/sgt_doors.cpp index 71eae9800c..2dabd21077 100644 --- a/engines/titanic/game/sgt/sgt_doors.cpp +++ b/engines/titanic/game/sgt/sgt_doors.cpp @@ -60,9 +60,9 @@ bool CSGTDoors::EnterViewMsg(CEnterViewMsg *msg) { if (pet->getRooms1CC() == 1) playMovie(START_FRAMES[roomNum], END_FRAMES[roomNum], - MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); else - playMovie(0, 12, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(0, 12, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); } return true; @@ -89,9 +89,9 @@ bool CSGTDoors::LeaveRoomMsg(CLeaveRoomMsg *msg) { if (pet->getRooms1CC() == 1) playMovie(START_FRAMES[roomNum], END_FRAMES[roomNum], - MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); else - playMovie(12, 25, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(12, 25, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); } return true; diff --git a/engines/titanic/game/sgt/sgt_navigation.cpp b/engines/titanic/game/sgt/sgt_navigation.cpp index 031226226f..d0b57ba1ec 100644 --- a/engines/titanic/game/sgt/sgt_navigation.cpp +++ b/engines/titanic/game/sgt/sgt_navigation.cpp @@ -71,9 +71,9 @@ bool CSGTNavigation::StatusChangeMsg(CStatusChangeMsg *msg) { int startVal = pet->getRooms1CC(); if (startVal > _statics->_changeViewNum) - playMovie(FRAMES[startVal], FRAMES[_statics->_changeViewNum], MOVIE_GAMESTATE); + playMovie(FRAMES[startVal], FRAMES[_statics->_changeViewNum], MOVIE_WAIT_FOR_FINISH); else - playMovie(FRAMES[startVal + 3], FRAMES[_statics->_changeViewNum + 3], MOVIE_GAMESTATE); + playMovie(FRAMES[startVal + 3], FRAMES[_statics->_changeViewNum + 3], MOVIE_WAIT_FOR_FINISH); _cursorId = _statics->_changeViewNum != 1 ? CURSOR_MOVE_FORWARD : CURSOR_INVALID; diff --git a/engines/titanic/game/sgt/sgt_tv.cpp b/engines/titanic/game/sgt/sgt_tv.cpp index ebec334781..5ce7c5b20e 100644 --- a/engines/titanic/game/sgt/sgt_tv.cpp +++ b/engines/titanic/game/sgt/sgt_tv.cpp @@ -46,7 +46,7 @@ bool CSGTTV::TurnOff(CTurnOff *msg) { _isClosed = true; _startFrame = 6; _endFrame = 12; - playMovie(6, 12, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(6, 12, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); } return true; @@ -60,7 +60,7 @@ bool CSGTTV::TurnOn(CTurnOn *msg) { _isClosed = false; _startFrame = 1; _endFrame = 6; - playMovie(1, 6, MOVIE_GAMESTATE); + playMovie(1, 6, MOVIE_WAIT_FOR_FINISH); } return true; diff --git a/engines/titanic/game/sgt/toilet.cpp b/engines/titanic/game/sgt/toilet.cpp index 544cdda0c6..0f796c2b9d 100644 --- a/engines/titanic/game/sgt/toilet.cpp +++ b/engines/titanic/game/sgt/toilet.cpp @@ -50,7 +50,7 @@ bool CToilet::TurnOn(CTurnOn *msg) { _isClosed = false; _startFrame = 0; _endFrame = 11; - playMovie(0, 11, MOVIE_GAMESTATE); + playMovie(0, 11, MOVIE_WAIT_FOR_FINISH); playSound("b#1.wav"); } @@ -64,7 +64,7 @@ bool CToilet::TurnOff(CTurnOff *msg) { _isClosed = true; _startFrame = 11; _endFrame = 18; - playMovie(11, 18, MOVIE_GAMESTATE); + playMovie(11, 18, MOVIE_WAIT_FOR_FINISH); playSound("b#1.wav"); } diff --git a/engines/titanic/game/sgt/vase.cpp b/engines/titanic/game/sgt/vase.cpp index f9ee292be2..e7b427c28f 100644 --- a/engines/titanic/game/sgt/vase.cpp +++ b/engines/titanic/game/sgt/vase.cpp @@ -47,7 +47,7 @@ bool CVase::TurnOn(CTurnOn *msg) { _isClosed = false; _startFrame = 1; _endFrame = 12; - playMovie(1, 12, MOVIE_GAMESTATE); + playMovie(1, 12, MOVIE_WAIT_FOR_FINISH); } return true; @@ -61,7 +61,7 @@ bool CVase::TurnOff(CTurnOff *msg) { _isClosed = true; _startFrame = 12; _endFrame = 25; - playMovie(12, 25, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(12, 25, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); } return true; diff --git a/engines/titanic/game/sgt/washstand.cpp b/engines/titanic/game/sgt/washstand.cpp index 5be722bec4..217e36c1e9 100644 --- a/engines/titanic/game/sgt/washstand.cpp +++ b/engines/titanic/game/sgt/washstand.cpp @@ -47,7 +47,7 @@ bool CWashstand::TurnOn(CTurnOn *msg) { _isClosed = false; _startFrame = 0; _endFrame = 14; - playMovie(0, 14, MOVIE_GAMESTATE); + playMovie(0, 14, MOVIE_WAIT_FOR_FINISH); playSound("b#14.wav"); } @@ -61,7 +61,7 @@ bool CWashstand::TurnOff(CTurnOff *msg) { _isClosed = true; _startFrame = 14; _endFrame = 28; - playMovie(14, 28, MOVIE_GAMESTATE | MOVIE_NOTIFY_OBJECT); + playMovie(14, 28, MOVIE_WAIT_FOR_FINISH | MOVIE_NOTIFY_OBJECT); playSound("b#14.wav"); } diff --git a/engines/titanic/game/starling_puret.cpp b/engines/titanic/game/starling_puret.cpp index 2f1909d963..f598f134ba 100644 --- a/engines/titanic/game/starling_puret.cpp +++ b/engines/titanic/game/starling_puret.cpp @@ -59,7 +59,7 @@ bool CStarlingPuret::EnterViewMsg(CEnterViewMsg *msg) { changeMsg._newStatus = 1; changeMsg.execute("PromDeckStarlings"); - playMovie(MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); CSignalObject signalMsg; signalMsg._numValue = 4; signalMsg.execute("PromDeckStarlings"); diff --git a/engines/titanic/game/sub_glass.cpp b/engines/titanic/game/sub_glass.cpp index 041f49097d..48cc84815a 100644 --- a/engines/titanic/game/sub_glass.cpp +++ b/engines/titanic/game/sub_glass.cpp @@ -88,7 +88,7 @@ bool CSUBGlass::SignalObject(CSignalObject *msg) { setVisible(true); if (_signalStartFrame >= 0) { - playMovie(_signalStartFrame, _signalEndFrame, MOVIE_GAMESTATE); + playMovie(_signalStartFrame, _signalEndFrame, MOVIE_WAIT_FOR_FINISH); playSound("z#30.wav"); _fieldBC = false; } diff --git a/engines/titanic/game/sweet_bowl.cpp b/engines/titanic/game/sweet_bowl.cpp index 7a3832e7c2..a1d0dc2b01 100644 --- a/engines/titanic/game/sweet_bowl.cpp +++ b/engines/titanic/game/sweet_bowl.cpp @@ -55,7 +55,7 @@ bool CSweetBowl::EnterViewMsg(CEnterViewMsg *msg) { bool CSweetBowl::ActMsg(CActMsg *msg) { if (msg->_action == "Jiggle") { setVisible(true); - playMovie(MOVIE_GAMESTATE | MOVIE_NOTIFY_OBJECT); + playMovie(MOVIE_WAIT_FOR_FINISH | MOVIE_NOTIFY_OBJECT); playSound(getRandomNumber(1) == 1 ? "b#42.wav" : "b#43.wav"); } diff --git a/engines/titanic/game/throw_tv_down_well.cpp b/engines/titanic/game/throw_tv_down_well.cpp index be61f6e9ab..680fc7e29f 100644 --- a/engines/titanic/game/throw_tv_down_well.cpp +++ b/engines/titanic/game/throw_tv_down_well.cpp @@ -60,7 +60,7 @@ bool CThrowTVDownWell::ActMsg(CActMsg *msg) { } bool CThrowTVDownWell::EnterViewMsg(CEnterViewMsg *msg) { - playMovie(MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); movieEvent(49); return true; } diff --git a/engines/titanic/game/transport/lift.cpp b/engines/titanic/game/transport/lift.cpp index a6f45bda98..8dfc55905a 100644 --- a/engines/titanic/game/transport/lift.cpp +++ b/engines/titanic/game/transport/lift.cpp @@ -120,20 +120,20 @@ bool CLift::StatusChangeMsg(CStatusChangeMsg *msg) { if (oldClass == newClass) { debugStr = CString::format("Same (%d-%d)", _startFrame, _endFrame); - playMovie(_startFrame, _endFrame, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(_startFrame, _endFrame, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); } else if (oldClass == 1 && newClass == 2) { debugStr = CString::format("1 to 2 (%d-108, 108-%d)", _startFrame, _endFrame); - playMovie(_startFrame, 108, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); - playMovie(108, _endFrame, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(_startFrame, 108, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); + playMovie(108, _endFrame, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); } else if (oldClass == 1 && newClass == 3) { debugStr = CString::format("1 to 3 (%d-108, 108-190, 190-%d)", _startFrame, _endFrame); - playMovie(_startFrame, 108, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); - playMovie(108, 190, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); - playMovie(190, _endFrame, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(_startFrame, 108, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); + playMovie(108, 190, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); + playMovie(190, _endFrame, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); } else { debugStr = CString::format("2 to 3 (%d-190, 190-%d)", _startFrame, _endFrame); - playMovie(_startFrame, 190, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); - playMovie(190, _endFrame, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(_startFrame, 190, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); + playMovie(190, _endFrame, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); } } @@ -144,20 +144,20 @@ bool CLift::StatusChangeMsg(CStatusChangeMsg *msg) { if (oldClass == newClass) { debugStr = CString::format("Same (%d-%d)", _startFrame, _endFrame); - playMovie(_startFrame, _endFrame, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(_startFrame, _endFrame, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); } else if (oldClass == 3 && newClass == 2) { debugStr = CString::format("3 to 2 (%d-407, 407-%d)", _startFrame, _endFrame); - playMovie(_startFrame, 407, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); - playMovie(407, _endFrame, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(_startFrame, 407, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); + playMovie(407, _endFrame, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); } else if (oldClass == 3 && newClass == 1) { debugStr = CString::format("3 to 1 (%d-407, 407-489, 489-%d)", _startFrame, _endFrame); - playMovie(_startFrame, 407, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); - playMovie(407, 489, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); - playMovie(489, _endFrame, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(_startFrame, 407, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); + playMovie(407, 489, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); + playMovie(489, _endFrame, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); } else { debugStr = CString::format("2 to 1 (%d-489, 489-%d)", _startFrame, _endFrame); - playMovie(_startFrame, 489, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); - playMovie(489, _endFrame, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(_startFrame, 489, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); + playMovie(489, _endFrame, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); } } diff --git a/engines/titanic/game/transport/pellerator.cpp b/engines/titanic/game/transport/pellerator.cpp index 095202d176..0228f9bc8b 100644 --- a/engines/titanic/game/transport/pellerator.cpp +++ b/engines/titanic/game/transport/pellerator.cpp @@ -83,7 +83,7 @@ bool CPellerator::StatusChangeMsg(CStatusChangeMsg *msg) { playMovie(315, 323, 0); for (int idx = 0; idx < 3; ++idx) playMovie(299, 304, 0); - playMovie(305, 313, MOVIE_GAMESTATE); + playMovie(305, 313, MOVIE_WAIT_FOR_FINISH); break; case 2: @@ -95,7 +95,7 @@ bool CPellerator::StatusChangeMsg(CStatusChangeMsg *msg) { playMovie(153, 197, 0); for (int idx = 0; idx < 5; ++idx) playMovie(253, 263, 0); - playMovie(290, 293, MOVIE_GAMESTATE); + playMovie(290, 293, MOVIE_WAIT_FOR_FINISH); break; case 4: @@ -107,7 +107,7 @@ bool CPellerator::StatusChangeMsg(CStatusChangeMsg *msg) { playMovie(253, 263, 0); for (int idx = 0; idx < 7; ++idx) playMovie(336, 341, 0); - playMovie(342, 348, MOVIE_GAMESTATE); + playMovie(342, 348, MOVIE_WAIT_FOR_FINISH); break; case 5: @@ -130,7 +130,7 @@ bool CPellerator::StatusChangeMsg(CStatusChangeMsg *msg) { playMovie(315, 323, 0); for (int idx = 0; idx < 3; ++idx) playMovie(299, 304, 0); - playMovie(305, 313, MOVIE_GAMESTATE); + playMovie(305, 313, MOVIE_WAIT_FOR_FINISH); break; case 2: @@ -139,7 +139,7 @@ bool CPellerator::StatusChangeMsg(CStatusChangeMsg *msg) { playMovie(299, 304, 0); for (int idx = 0; idx < 15; ++idx) playMovie(245, 255, 0); - playMovie(264, 267, MOVIE_GAMESTATE); + playMovie(264, 267, MOVIE_WAIT_FOR_FINISH); ++_destination; break; @@ -149,7 +149,7 @@ bool CPellerator::StatusChangeMsg(CStatusChangeMsg *msg) { playMovie(245, 255, 0); for (int idx = 0; idx < 7; ++idx) playMovie(336, 341, 0); - playMovie(342, 348, MOVIE_GAMESTATE); + playMovie(342, 348, MOVIE_WAIT_FOR_FINISH); break; case 5: @@ -160,7 +160,7 @@ bool CPellerator::StatusChangeMsg(CStatusChangeMsg *msg) { playMovie(245, 255, 0); for (int idx = 0; idx < 3; ++idx) playMovie(299, 304, 0); - playMovie(305, 313, MOVIE_GAMESTATE); + playMovie(305, 313, MOVIE_WAIT_FOR_FINISH); break; default: @@ -184,7 +184,7 @@ bool CPellerator::StatusChangeMsg(CStatusChangeMsg *msg) { playMovie(351, 359, 0); for (int idx = 0; idx < 3; ++idx) playMovie(336, 341, 0); - playMovie(342, 348, MOVIE_GAMESTATE); + playMovie(342, 348, MOVIE_WAIT_FOR_FINISH); break; case 3: @@ -196,7 +196,7 @@ bool CPellerator::StatusChangeMsg(CStatusChangeMsg *msg) { playMovie(245, 255, 0); for (int idx = 0; idx < 3; ++idx) playMovie(336, 341, 0); - playMovie(342, 348, MOVIE_GAMESTATE); + playMovie(342, 348, MOVIE_WAIT_FOR_FINISH); --_destination; break; @@ -209,7 +209,7 @@ bool CPellerator::StatusChangeMsg(CStatusChangeMsg *msg) { playMovie(78, 149, 0); for (int idx = 0; idx < 5; ++idx) playMovie(245, 255, 0); - playMovie(264, 267, MOVIE_GAMESTATE); + playMovie(264, 267, MOVIE_WAIT_FOR_FINISH); break; case 5: @@ -221,7 +221,7 @@ bool CPellerator::StatusChangeMsg(CStatusChangeMsg *msg) { playMovie(78, 149, 0); for (int idx = 0; idx < 3; ++idx) playMovie(336, 341, 0); - playMovie(342, 348, MOVIE_GAMESTATE); + playMovie(342, 348, MOVIE_WAIT_FOR_FINISH); break; default: @@ -236,7 +236,7 @@ bool CPellerator::StatusChangeMsg(CStatusChangeMsg *msg) { playMovie(351, 359, 0); for (int idx = 0; idx < 3; ++idx) playMovie(336, 341, 0); - playMovie(342, 348, MOVIE_GAMESTATE); + playMovie(342, 348, MOVIE_WAIT_FOR_FINISH); break; case 3: @@ -245,7 +245,7 @@ bool CPellerator::StatusChangeMsg(CStatusChangeMsg *msg) { playMovie(253, 263, 0); for (int idx = 0; idx < 3; ++idx) playMovie(336, 341, 0); - playMovie(342, 348, MOVIE_GAMESTATE); + playMovie(342, 348, MOVIE_WAIT_FOR_FINISH); --_destination; break; @@ -255,7 +255,7 @@ bool CPellerator::StatusChangeMsg(CStatusChangeMsg *msg) { playMovie(299, 304, 0); for (int idx = 0; idx < 15; ++idx) playMovie(253, 263, 0); - playMovie(290, 293, MOVIE_GAMESTATE); + playMovie(290, 293, MOVIE_WAIT_FOR_FINISH); break; case 5: @@ -266,7 +266,7 @@ bool CPellerator::StatusChangeMsg(CStatusChangeMsg *msg) { playMovie(253, 263, 0); for (int idx = 0; idx < 3; ++idx) playMovie(336, 341, 0); - playMovie(342, 348, MOVIE_GAMESTATE); + playMovie(342, 348, MOVIE_WAIT_FOR_FINISH); break; default: diff --git a/engines/titanic/game/wheel_button.cpp b/engines/titanic/game/wheel_button.cpp index 730a5d9005..71532e52af 100644 --- a/engines/titanic/game/wheel_button.cpp +++ b/engines/titanic/game/wheel_button.cpp @@ -31,33 +31,33 @@ BEGIN_MESSAGE_MAP(CWheelButton, CBackground) END_MESSAGE_MAP() CWheelButton::CWheelButton() : CBackground(), - _fieldE0(false), _timerId(0), _fieldE8(0) { + _blinking(false), _timerId(0), _unused5(0) { } void CWheelButton::save(SimpleFile *file, int indent) { file->writeNumberLine(1, indent); - file->writeNumberLine(_fieldE0, indent); + file->writeNumberLine(_blinking, indent); file->writeNumberLine(_timerId, indent); - file->writeNumberLine(_fieldE8, indent); + file->writeNumberLine(_unused5, indent); CBackground::save(file, indent); } void CWheelButton::load(SimpleFile *file) { file->readNumber(); - _fieldE0 = file->readNumber(); + _blinking = file->readNumber(); _timerId = file->readNumber(); - _fieldE8 = file->readNumber(); + _unused5 = file->readNumber(); CBackground::load(file); } bool CWheelButton::SignalObject(CSignalObject *msg) { - bool oldFlag = _fieldE0; - _fieldE0 = msg->_numValue != 0; + bool oldBlinking = _blinking; + _blinking = msg->_numValue != 0; - if (oldFlag != _fieldE0) { - if (_fieldE0) { + if (oldBlinking != _blinking) { + if (_blinking) { _timerId = addTimer(500, 500); } else { stopAnimTimer(_timerId); diff --git a/engines/titanic/game/wheel_button.h b/engines/titanic/game/wheel_button.h index 2725e60622..7bdcecef75 100644 --- a/engines/titanic/game/wheel_button.h +++ b/engines/titanic/game/wheel_button.h @@ -33,9 +33,9 @@ class CWheelButton : public CBackground { bool TimerMsg(CTimerMsg *msg); bool LeaveViewMsg(CLeaveViewMsg *msg); public: - bool _fieldE0; + bool _blinking; int _timerId; - int _fieldE8; + int _unused5; public: CLASSDEF; CWheelButton(); diff --git a/engines/titanic/game/wheel_hotspot.cpp b/engines/titanic/game/wheel_hotspot.cpp index aeca7130b5..aec1c8b96d 100644 --- a/engines/titanic/game/wheel_hotspot.cpp +++ b/engines/titanic/game/wheel_hotspot.cpp @@ -31,36 +31,36 @@ END_MESSAGE_MAP() void CWheelHotSpot::save(SimpleFile *file, int indent) { file->writeNumberLine(1, indent); - file->writeNumberLine(_fieldE0, indent); - file->writeNumberLine(_fieldE4, indent); + file->writeNumberLine(_active, indent); + file->writeNumberLine(_action, indent); CBackground::save(file, indent); } void CWheelHotSpot::load(SimpleFile *file) { file->readNumber(); - _fieldE0 = file->readNumber(); - _fieldE4 = file->readNumber(); + _active = file->readNumber(); + _action = (WheelHotspotAction)file->readNumber(); CBackground::load(file); } bool CWheelHotSpot::MouseButtonDownMsg(CMouseButtonDownMsg *msg) { - if (_fieldE0) { + if (_active) { CActMsg actMsg; - switch (_fieldE4) { - case 1: + switch (_action) { + case WH_STOP: actMsg._action = "Stop"; actMsg.execute("CaptainsWheel"); break; - case 2: + case WH_CRUISE: actMsg._action = "Cruise"; actMsg.execute("CaptainsWheel"); break; - case 3: + case WH_GO: actMsg._action = "Go"; actMsg.execute("CaptainsWheel"); break; @@ -68,7 +68,7 @@ bool CWheelHotSpot::MouseButtonDownMsg(CMouseButtonDownMsg *msg) { default: break; } - } else if (_fieldE4 == 3) { + } else if (_action == WH_GO) { petDisplayMessage(GO_WHERE); } @@ -76,7 +76,7 @@ bool CWheelHotSpot::MouseButtonDownMsg(CMouseButtonDownMsg *msg) { } bool CWheelHotSpot::SignalObject(CSignalObject *msg) { - _fieldE0 = msg->_numValue != 0; + _active = msg->_numValue != 0; return true; } diff --git a/engines/titanic/game/wheel_hotspot.h b/engines/titanic/game/wheel_hotspot.h index e9071a2fa4..41da0fba81 100644 --- a/engines/titanic/game/wheel_hotspot.h +++ b/engines/titanic/game/wheel_hotspot.h @@ -27,16 +27,20 @@ namespace Titanic { +enum WheelHotspotAction { + WH_NONE = 0, WH_STOP = 1, WH_CRUISE = 2, WH_GO = 3 +}; + class CWheelHotSpot : public CBackground { DECLARE_MESSAGE_MAP; bool MouseButtonDownMsg(CMouseButtonDownMsg *msg); bool SignalObject(CSignalObject *msg); public: - int _fieldE0; - int _fieldE4; + bool _active; + WheelHotspotAction _action; public: CLASSDEF; - CWheelHotSpot() : CBackground(), _fieldE0(0), _fieldE4(0) {} + CWheelHotSpot() : CBackground(), _active(false), _action(WH_NONE) {} /** * Save the data for the class to file diff --git a/engines/titanic/game/wheel_spin_horn.cpp b/engines/titanic/game/wheel_spin_horn.cpp index b01cc678df..c299ffc8ff 100644 --- a/engines/titanic/game/wheel_spin_horn.cpp +++ b/engines/titanic/game/wheel_spin_horn.cpp @@ -24,20 +24,39 @@ namespace Titanic { +BEGIN_MESSAGE_MAP(CWheelSpinHorn, CWheelSpin) + ON_MESSAGE(MouseButtonDownMsg) +END_MESSAGE_MAP() + void CWheelSpinHorn::save(SimpleFile *file, int indent) { file->writeNumberLine(1, indent); - file->writeQuotedLine(_string1, indent); - file->writeQuotedLine(_string2, indent); + file->writeQuotedLine(_soundName, indent); + file->writeQuotedLine(_message, indent); CWheelSpin::save(file, indent); } void CWheelSpinHorn::load(SimpleFile *file) { file->readNumber(); - _string1 = file->readString(); - _string2 = file->readString(); + _soundName = file->readString(); + _message = file->readString(); CWheelSpin::load(file); } +bool CWheelSpinHorn::MouseButtonDownMsg(CMouseButtonDownMsg *msg) { + if (_active) { + if (!_soundName.empty()) + playSound(_soundName); + + if (!_message.empty()) + petDisplayMessage(_message); + + CActMsg actMsg("Honk"); + actMsg.execute("CaptainsWheel"); + } + + return true; +} + } // End of namespace Titanic diff --git a/engines/titanic/game/wheel_spin_horn.h b/engines/titanic/game/wheel_spin_horn.h index 21182253b3..b8546b01b6 100644 --- a/engines/titanic/game/wheel_spin_horn.h +++ b/engines/titanic/game/wheel_spin_horn.h @@ -28,9 +28,11 @@ namespace Titanic { class CWheelSpinHorn : public CWheelSpin { + DECLARE_MESSAGE_MAP; + bool MouseButtonDownMsg(CMouseButtonDownMsg *msg); public: - CString _string1; - CString _string2; + CString _soundName; + CString _message; public: CLASSDEF; diff --git a/engines/titanic/game_manager.cpp b/engines/titanic/game_manager.cpp index 96aeda1b83..5f51498e93 100644 --- a/engines/titanic/game_manager.cpp +++ b/engines/titanic/game_manager.cpp @@ -276,7 +276,7 @@ void CGameManager::frameMessage(CRoomItem *room) { CFrameMsg frameMsg(g_vm->_events->getTicksCount()); frameMsg.execute(room, nullptr, MSGFLAG_SCAN); - if (!_soundMaker) { + if (_gameState._soundMakerAllowed && !_soundMaker) { // Check for a sound maker in the room _soundMaker = dynamic_cast<CBackgroundSoundMaker *>( _project->findByName("zBackgroundSoundMaker")); diff --git a/engines/titanic/game_state.cpp b/engines/titanic/game_state.cpp index 964d6e604a..7ddd16ab22 100644 --- a/engines/titanic/game_state.cpp +++ b/engines/titanic/game_state.cpp @@ -46,8 +46,8 @@ bool CGameStateMovieList::empty() { CGameState::CGameState(CGameManager *gameManager) : _gameManager(gameManager), _gameLocation(this), _passengerClass(NO_CLASS), _priorClass(NO_CLASS), _mode(GSMODE_NONE), _seasonNum(SEASON_SUMMER), - _petActive(false), _field1C(false), _quitGame(false), _parrotMet(false), - _nodeChangeCtr(0), _nodeEnterTicks(0), _field38(0) { + _petActive(false), _soundMakerAllowed(false), _quitGame(false), _parrotMet(false), + _nodeChangeCtr(0), _nodeEnterTicks(0), _parrotResponseIndex(0) { } void CGameState::save(SimpleFile *file) const { @@ -56,9 +56,9 @@ void CGameState::save(SimpleFile *file) const { file->writeNumber(_priorClass); file->writeNumber(_seasonNum); file->writeNumber(_parrotMet); - file->writeNumber(_field38); + file->writeNumber(_parrotResponseIndex); _gameLocation.save(file); - file->writeNumber(_field1C); + file->writeNumber(_soundMakerAllowed); } void CGameState::load(SimpleFile *file) { @@ -67,10 +67,10 @@ void CGameState::load(SimpleFile *file) { _priorClass = (PassengerClass)file->readNumber(); _seasonNum = (Season)file->readNumber(); _parrotMet = file->readNumber(); - _field38 = file->readNumber(); + _parrotResponseIndex = file->readNumber(); _gameLocation.load(file); - _field1C = file->readNumber(); + _soundMakerAllowed = file->readNumber(); _nodeChangeCtr = 0; _nodeEnterTicks = 0; } diff --git a/engines/titanic/game_state.h b/engines/titanic/game_state.h index 5d0f67c02c..547e8f8221 100644 --- a/engines/titanic/game_state.h +++ b/engines/titanic/game_state.h @@ -69,13 +69,13 @@ public: GameStateMode _mode; Season _seasonNum; bool _petActive; - bool _field1C; + bool _soundMakerAllowed; bool _quitGame; bool _parrotMet; uint _nodeChangeCtr; uint32 _nodeEnterTicks; Point _mousePos; - int _field38; + int _parrotResponseIndex; public: CGameState(CGameManager *gameManager); @@ -151,9 +151,21 @@ public: */ bool getParrotMet() const { return _parrotMet; } + /** + * Gets the counter for the number of times different nodes have + * been entered + */ int getNodeChangedCtr() const { return _nodeChangeCtr; } + + /** + * Gets the node enter ticks amount + */ uint32 getNodeEnterTicks() const { return _nodeEnterTicks; } - void inc38() { ++_field38; } + + /** + * Increments the index to use for parrot idle responses + */ + void incParrotResponse() { ++_parrotResponseIndex; } }; } // End of namespace Titanic diff --git a/engines/titanic/gfx/toggle_switch.cpp b/engines/titanic/gfx/toggle_switch.cpp index 815f96cb5a..dae9acba0e 100644 --- a/engines/titanic/gfx/toggle_switch.cpp +++ b/engines/titanic/gfx/toggle_switch.cpp @@ -52,9 +52,9 @@ void CToggleSwitch::load(SimpleFile *file) { bool CToggleSwitch::MouseButtonUpMsg(CMouseButtonUpMsg *msg) { _pressed = !_pressed; if (_pressed) - fn10(0, 0, 0); + setToggleColor(0, 0, 0); else - fn10(0xff, 0xff, 0xff); + setToggleColor(0xff, 0xff, 0xff); return true; } diff --git a/engines/titanic/messages/messages.h b/engines/titanic/messages/messages.h index f70acdcfb2..a1e9ccbf9d 100644 --- a/engines/titanic/messages/messages.h +++ b/engines/titanic/messages/messages.h @@ -273,7 +273,7 @@ MESSAGE1(CGetChevRoomNum, int, roomNum, 0); MESSAGE2(CHoseConnectedMsg, bool, connected, true, CGameObject *, object, nullptr); MESSAGE0(CInitializeAnimMsg); MESSAGE1(CIsEarBowlPuzzleDone, int, value, 0); -MESSAGE3(CIsHookedOnMsg, Rect, rect, Rect(), bool, result, false, CString, string1, ""); +MESSAGE3(CIsHookedOnMsg, Rect, rect, Rect(), bool, isHooked, false, CString, armName, ""); MESSAGE1(CIsParrotPresentMsg, bool, value, false); MESSAGE1(CKeyCharMsg, int, key, 32); MESSAGE2(CLeaveNodeMsg, CNodeItem *, oldNode, nullptr, CNodeItem *, newNode, nullptr); @@ -378,6 +378,7 @@ MESSAGE1(CUseWithCharMsg, CCharacter *, character, nullptr); MESSAGE1(CUseWithOtherMsg, CGameObject *, other, 0); MESSAGE1(CVirtualKeyCharMsg, Common::KeyState, keyState, Common::KeyState()); MESSAGE1(CVisibleMsg, bool, visible, true); +MESSAGE1(CCheckCodeWheelsMsg, bool, isCorrect, true); } // End of namespace Titanic diff --git a/engines/titanic/moves/enter_bridge.cpp b/engines/titanic/moves/enter_bridge.cpp index fb44fe2e02..a9fbb5aff1 100644 --- a/engines/titanic/moves/enter_bridge.cpp +++ b/engines/titanic/moves/enter_bridge.cpp @@ -45,7 +45,7 @@ bool CEnterBridge::EnterRoomMsg(CEnterRoomMsg *msg) { CActMsg actMsg("Disable"); actMsg.execute("ShipAnnouncements"); - setState1C(false); + stateSetSoundMakerAllowed(false); _flag = false; } diff --git a/engines/titanic/moves/enter_sec_class_state.cpp b/engines/titanic/moves/enter_sec_class_state.cpp index af2bc4ac00..9ea8ae732a 100644 --- a/engines/titanic/moves/enter_sec_class_state.cpp +++ b/engines/titanic/moves/enter_sec_class_state.cpp @@ -85,9 +85,9 @@ bool CEnterSecClassState::StatusChangeMsg(CStatusChangeMsg *msg) { if (msg->_newStatus != 3) { if (msg->_newStatus == 2 && _mode == 1) - playMovie(0, 10, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(0, 10, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); else if (msg->_newStatus == 1) - playMovie(11, 21, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(11, 21, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); } _cursorId = msg->_newStatus == 2 ? CURSOR_MOVE_FORWARD : CURSOR_INVALID; diff --git a/engines/titanic/npcs/barbot.cpp b/engines/titanic/npcs/barbot.cpp index 58575d1c35..489ed39c4b 100644 --- a/engines/titanic/npcs/barbot.cpp +++ b/engines/titanic/npcs/barbot.cpp @@ -166,7 +166,7 @@ bool CBarbot::ActMsg(CActMsg *msg) { playRange(_frames[7]); playRange(_frames[8]); playRange(_frames[13]); - playRange(_frames[40], MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playRange(_frames[40], MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); _frameNum = _frames[40]._endFrame; } } else if (msg->_action == "GiveBackVisCentre") { @@ -316,7 +316,7 @@ bool CBarbot::TurnOn(CTurnOn *msg) { playRange(_frames[38], MOVIE_NOTIFY_OBJECT); playRange(_frames[58], MOVIE_NOTIFY_OBJECT); playRange(_frames[57], MOVIE_NOTIFY_OBJECT); - playRange(_frames[56], MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playRange(_frames[56], MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); _frameNum = _frames[56]._endFrame; } else { playRange(_frames[38]); @@ -363,13 +363,13 @@ bool CBarbot::TurnOff(CTurnOff *msg) { if (_visCenterOnCounter) { // Barbot will put away the vision center - playRange(_frames[28], MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playRange(_frames[28], MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); _frameNum = _frames[28]._endFrame; _visCenterOnCounter = false; _field134 = 1; } - playRange(_frames[29], MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playRange(_frames[29], MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); movieEvent(_frames[29]._startFrame); _frameNum = _frames[29]._endFrame; _fieldC4 = 0; @@ -560,7 +560,7 @@ bool CBarbot::TrueTalkTriggerActionMsg(CTrueTalkTriggerActionMsg *msg) { _frameNum = _frames[27]._endFrame; } else if (!_gottenDrunk && _drunkFlag) { playRange(_frames[45], MOVIE_NOTIFY_OBJECT); - playRange(_frames[44], MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playRange(_frames[44], MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); _frameNum = _frames[44]._endFrame; } break; diff --git a/engines/titanic/npcs/bellbot.cpp b/engines/titanic/npcs/bellbot.cpp index 26c9b13e40..36c57fe467 100644 --- a/engines/titanic/npcs/bellbot.cpp +++ b/engines/titanic/npcs/bellbot.cpp @@ -89,7 +89,7 @@ bool CBellBot::OnSummonBotMsg(COnSummonBotMsg *msg) { _npcFlags &= ~NPCFLAG_MOVE_LOOP; } - playClip("Walk On", MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playClip("Walk On", MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); movieEvent(); _npcFlags |= NPCFLAG_MOVING; @@ -135,13 +135,13 @@ bool CBellBot::MovieEndMsg(CMovieEndMsg *msg) { } bool CBellBot::Use(CUse *msg) { - dynamic_cast<CCarry *>(msg->_item)->_string1 = "Bellbot"; + dynamic_cast<CCarry *>(msg->_item)->_npcUse = "Bellbot"; return true; } bool CBellBot::DismissBotMsg(CDismissBotMsg *msg) { if (_npcFlags & NPCFLAG_MOVING) { - playClip("Walk Off", MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playClip("Walk Off", MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); if (_npcFlags & NPCFLAG_START_IDLING) { _npcFlags &= ~NPCFLAG_START_IDLING; performAction(true); @@ -168,7 +168,7 @@ bool CBellBot::TrueTalkTriggerActionMsg(CTrueTalkTriggerActionMsg *msg) { case 5: _npcFlags &= ~NPCFLAG_MOVE_START; - playClip("Walk Off", MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playClip("Walk Off", MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); movieEvent(); break; diff --git a/engines/titanic/npcs/bilge_succubus.cpp b/engines/titanic/npcs/bilge_succubus.cpp index 63d0006885..4db4d8d595 100644 --- a/engines/titanic/npcs/bilge_succubus.cpp +++ b/engines/titanic/npcs/bilge_succubus.cpp @@ -75,9 +75,9 @@ bool CBilgeSuccUBus::PETReceiveMsg(CPETReceiveMsg *msg) { if (_style) { if (_receiveStartFrame >= 0) - playMovie(_receiveStartFrame, _receiveEndFrame, MOVIE_GAMESTATE); + playMovie(_receiveStartFrame, _receiveEndFrame, MOVIE_WAIT_FOR_FINISH); if (_afterReceiveStartFrame >= 0) - playMovie(_afterReceiveStartFrame, _afterReceiveEndFrame, MOVIE_GAMESTATE); + playMovie(_afterReceiveStartFrame, _afterReceiveEndFrame, MOVIE_WAIT_FOR_FINISH); playSound("z#28.wav", 70); } else if (!_isOn) { @@ -94,7 +94,7 @@ bool CBilgeSuccUBus::PETReceiveMsg(CPETReceiveMsg *msg) { if (mailObject) { _mailP = mailObject; if (_receiveStartFrame >= 0) - playMovie(_receiveStartFrame, _receiveEndFrame, MOVIE_GAMESTATE); + playMovie(_receiveStartFrame, _receiveEndFrame, MOVIE_WAIT_FOR_FINISH); } else { petDisplayMessage(2, NOTHING_TO_DELIVER); } @@ -138,20 +138,20 @@ bool CBilgeSuccUBus::PETDeliverMsg(CPETDeliverMsg *msg) { playMovie(_sendStartFrame, _sendEndFrame, MOVIE_NOTIFY_OBJECT); if (_sneezing2StartFrame >= 0) { - playMovie(_trayOutStartFrame, _trayOutEndFrame, MOVIE_GAMESTATE); - playMovie(_sneezing1StartFrame, _sneezing1EndFrame, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); - playMovie(_sneezing2StartFrame, _sneezing2EndFrame, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(_trayOutStartFrame, _trayOutEndFrame, MOVIE_WAIT_FOR_FINISH); + playMovie(_sneezing1StartFrame, _sneezing1EndFrame, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); + playMovie(_sneezing2StartFrame, _sneezing2EndFrame, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); incTransitions(); } } else { startTalking(this, 230012); _sendAction = SA_EATEN; if (_sendStartFrame >= 0) - playMovie(_sendStartFrame, _sendEndFrame, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(_sendStartFrame, _sendEndFrame, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); if (_receiveStartFrame >= 0) - playMovie(_receiveStartFrame, _receiveEndFrame, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(_receiveStartFrame, _receiveEndFrame, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); if (_afterReceiveStartFrame >= 0) - playMovie(_afterReceiveStartFrame, _afterReceiveEndFrame, MOVIE_GAMESTATE); + playMovie(_afterReceiveStartFrame, _afterReceiveEndFrame, MOVIE_WAIT_FOR_FINISH); } } else { if (_isFeathers) { @@ -159,17 +159,17 @@ bool CBilgeSuccUBus::PETDeliverMsg(CPETDeliverMsg *msg) { _sendAction = SA_BILGE_FEATHERS; if (_sendStartFrame >= 0) - playMovie(_sendStartFrame, _sendEndFrame, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(_sendStartFrame, _sendEndFrame, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); if (_receiveStartFrame >= 0) - playMovie(_receiveStartFrame, _receiveEndFrame, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(_receiveStartFrame, _receiveEndFrame, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); if (_afterReceiveStartFrame >= 0) - playMovie(_afterReceiveStartFrame, _afterReceiveEndFrame, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(_afterReceiveStartFrame, _afterReceiveEndFrame, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); } else { sendMail(petRoomFlags, roomFlags); startTalking(this, 230012); if (_sendStartFrame >= 0) { _sendAction = SA_BILGE_SENT; - playMovie(_sendStartFrame, _sendEndFrame, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(_sendStartFrame, _sendEndFrame, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); } } } diff --git a/engines/titanic/npcs/deskbot.cpp b/engines/titanic/npcs/deskbot.cpp index 56f4d98f18..2b88160e47 100644 --- a/engines/titanic/npcs/deskbot.cpp +++ b/engines/titanic/npcs/deskbot.cpp @@ -306,7 +306,7 @@ bool CDeskbot::TurnOff(CTurnOff *msg) { performAction(1, findView()); _npcFlags = (_npcFlags & ~(NPCFLAG_SPEAKING | NPCFLAG_IDLING | NPCFLAG_START_IDLING)) | NPCFLAG_MOVE_LOOP; - playClip("Closing", MOVIE_GAMESTATE | MOVIE_NOTIFY_OBJECT); + playClip("Closing", MOVIE_WAIT_FOR_FINISH | MOVIE_NOTIFY_OBJECT); } return true; diff --git a/engines/titanic/npcs/doorbot.cpp b/engines/titanic/npcs/doorbot.cpp index 79e3dafed4..03d723a384 100644 --- a/engines/titanic/npcs/doorbot.cpp +++ b/engines/titanic/npcs/doorbot.cpp @@ -95,7 +95,7 @@ bool CDoorbot::MovieEndMsg(CMovieEndMsg *msg) { case 6: if (clipExistsByEnd("Cloak On", msg->_endFrame)) { petShow(); - setState1C(true); + stateSetSoundMakerAllowed(true); changeView("ServiceElevator.Node 1.S"); changeView("ServiceElevator.Node 1.N"); } @@ -129,7 +129,7 @@ bool CDoorbot::MovieEndMsg(CMovieEndMsg *msg) { _introMovieNum = 0; } else if (clipExistsByEnd("Cloak On", msg->_endFrame)) { petShow(); - setState1C(true); + stateSetSoundMakerAllowed(true); changeView("ServiceElevator.Node 1.S"); } else { CTrueTalkNPC::MovieEndMsg(msg); @@ -185,7 +185,7 @@ bool CDoorbot::OnSummonBotMsg(COnSummonBotMsg *msg) { } playClip(getRandomNumber(1) ? "Whizz On Left" : "Whizz On Right", - MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); movieEvent(); _npcFlags |= NPCFLAG_MOVE_END; @@ -200,7 +200,7 @@ bool CDoorbot::TrueTalkTriggerActionMsg(CTrueTalkTriggerActionMsg *msg) { case 4: _npcFlags = (_npcFlags & ~NPCFLAG_IDLING) | NPCFLAG_SUMMON_BELLBOT; - playClip("Whizz Off Left", MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playClip("Whizz Off Left", MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); break; case 28: { @@ -387,7 +387,7 @@ bool CDoorbot::PutBotBackInHisBoxMsg(CPutBotBackInHisBoxMsg *msg) { bool CDoorbot::DismissBotMsg(CDismissBotMsg *msg) { if (_npcFlags & NPCFLAG_MOVE_END) { playClip(getRandomNumber(1) ? "Whizz Off Left" : "Whizz Off Right", - MOVIE_STOP_PREVIOUS | MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + MOVIE_STOP_PREVIOUS | MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); movieEvent(); if (_npcFlags & NPCFLAG_START_IDLING) { diff --git a/engines/titanic/npcs/maitre_d.cpp b/engines/titanic/npcs/maitre_d.cpp index 88eceab46b..6ac69d9079 100644 --- a/engines/titanic/npcs/maitre_d.cpp +++ b/engines/titanic/npcs/maitre_d.cpp @@ -40,25 +40,24 @@ BEGIN_MESSAGE_MAP(CMaitreD, CTrueTalkNPC) ON_MESSAGE(TriggerNPCEvent) END_MESSAGE_MAP() -int CMaitreD::_v1; - CMaitreD::CMaitreD() : CTrueTalkNPC(), - _string2("z#40.wav"), _string3("z#40.wav"), _field108(0), _field118(1), - _field11C(0), _field12C(0), _field130(1), _field134(0), _timerId(0) { + _priorMusicName("z#40.wav"), _musicName("z#40.wav"), _unused5(0), _hasMusic(true), + _musicSet(false), _fightFlag(false), _unused6(true), _savedFightFlag(false), + _timerId(0), _defeated(false) { } void CMaitreD::save(SimpleFile *file, int indent) { file->writeNumberLine(1, indent); - file->writeNumberLine(_field108, indent); - file->writeQuotedLine(_string2, indent); - file->writeNumberLine(_field118, indent); - file->writeNumberLine(_field11C, indent); - file->writeQuotedLine(_string3, indent); - file->writeNumberLine(_field12C, indent); - file->writeNumberLine(_field130, indent); - - file->writeNumberLine(_v1, indent); - file->writeNumberLine(_field134, indent); + file->writeNumberLine(_unused5, indent); + file->writeQuotedLine(_priorMusicName, indent); + file->writeNumberLine(_hasMusic, indent); + file->writeNumberLine(_musicSet, indent); + file->writeQuotedLine(_musicName, indent); + file->writeNumberLine(_fightFlag, indent); + file->writeNumberLine(_unused6, indent); + + file->writeNumberLine(_defeated, indent); + file->writeNumberLine(_savedFightFlag, indent); file->writeNumberLine(_timerId, indent); CTrueTalkNPC::save(file, indent); @@ -66,16 +65,16 @@ void CMaitreD::save(SimpleFile *file, int indent) { void CMaitreD::load(SimpleFile *file) { file->readNumber(); - _field108 = file->readNumber(); - _string2 = file->readString(); - _field118 = file->readNumber(); - _field11C = file->readNumber(); - _string3 = file->readString(); - _field12C = file->readNumber(); - _field130 = file->readNumber(); - - _v1 = file->readNumber(); - _field134 = file->readNumber(); + _unused5 = file->readNumber(); + _priorMusicName = file->readString(); + _hasMusic = file->readNumber(); + _musicSet = file->readNumber(); + _musicName = file->readString(); + _fightFlag = file->readNumber(); + _unused6 = file->readNumber(); + + _defeated = file->readNumber(); + _savedFightFlag = file->readNumber(); _timerId = file->readNumber(); CTrueTalkNPC::load(file); @@ -83,10 +82,10 @@ void CMaitreD::load(SimpleFile *file) { bool CMaitreD::RestaurantMusicChanged(CRestaurantMusicChanged *msg) { if (msg->_value.empty()) { - _field118 = 0; + _hasMusic = false; } else { - _string3 = msg->_value; - _field118 = _field11C = 1; + _musicName = msg->_value; + _hasMusic = _musicSet = true; } return true; @@ -94,15 +93,15 @@ bool CMaitreD::RestaurantMusicChanged(CRestaurantMusicChanged *msg) { bool CMaitreD::TrueTalkTriggerActionMsg(CTrueTalkTriggerActionMsg *msg) { if (msg->_action == 8) { - _field12C = 1; + _fightFlag = true; stopAnimTimer(_timerId); _timerId = startAnimTimer("MD Fight", 3500, 0); } else if (msg->_action == 9) { stopAnimTimer(_timerId); _timerId = 0; } else if (msg->_action == 10) { - _field12C = 0; - _v1 = 1; + _fightFlag = false; + _defeated = true; stopAnimTimer(_timerId); _timerId = 0; @@ -115,12 +114,17 @@ bool CMaitreD::TrueTalkTriggerActionMsg(CTrueTalkTriggerActionMsg *msg) { bool CMaitreD::EnterViewMsg(CEnterViewMsg *msg) { setTalking(this, true, findView()); - _field12C = _field134; + _fightFlag = _savedFightFlag; + + if (_musicName != "STMusic" && (!_musicSet || _priorMusicName == _musicName)) + return true; - if (_string3 == "STMusic" && (!_field11C || _string2 == _string3)) + // WORKAROUND: It's possible in the original to not have a music handler set + // if you start and stop the phonograph, then save and restore the game + if (!CMusicRoom::_musicHandler) return true; - if (_string3.contains("nasty ambient")) + if (_musicName.contains("nasty ambient")) startTalking(this, 111, findView()); else if (!CMusicRoom::_musicHandler->checkInstrument(SNAKE)) startTalking(this, 114, findView()); @@ -135,16 +139,17 @@ bool CMaitreD::EnterViewMsg(CEnterViewMsg *msg) { happyMsg.execute("MaitreD Right Arm"); } + _priorMusicName = _musicName; return true; } bool CMaitreD::LeaveViewMsg(CLeaveViewMsg *msg) { - _field134 = _field12C; + _savedFightFlag = _fightFlag; performAction(true); stopAnimTimer(_timerId); _timerId = 0; - _field12C = 0; + _fightFlag = false; return true; } @@ -158,7 +163,7 @@ bool CMaitreD::NPCPlayTalkingAnimationMsg(CNPCPlayTalkingAnimationMsg *msg) { msg->_names = NAMES; CAnimateMaitreDMsg animMsg; - if (_field12C) + if (_fightFlag) animMsg._value = 0; animMsg.execute(this); } @@ -168,7 +173,7 @@ bool CMaitreD::NPCPlayTalkingAnimationMsg(CNPCPlayTalkingAnimationMsg *msg) { bool CMaitreD::TimerMsg(CTimerMsg *msg) { if (msg->_action == "MD Fight") { - if (_field12C && compareViewNameTo("1stClassRestaurant.MaitreD Node.N")) { + if (_fightFlag && compareViewNameTo("1stClassRestaurant.MaitreD Node.N")) { startTalking(this, 131, findView()); } } else { @@ -179,7 +184,7 @@ bool CMaitreD::TimerMsg(CTimerMsg *msg) { } bool CMaitreD::TrueTalkNotifySpeechStartedMsg(CTrueTalkNotifySpeechStartedMsg *msg) { - if (_field12C) { + if (_fightFlag) { stopAnimTimer(_timerId); _timerId = 0; } @@ -189,7 +194,7 @@ bool CMaitreD::TrueTalkNotifySpeechStartedMsg(CTrueTalkNotifySpeechStartedMsg *m } bool CMaitreD::TrueTalkNotifySpeechEndedMsg(CTrueTalkNotifySpeechEndedMsg *msg) { - if (_field12C) { + if (_fightFlag) { stopAnimTimer(_timerId); _timerId = startAnimTimer("MD Fight", 3000 + getRandomNumber(3000)); } @@ -199,7 +204,7 @@ bool CMaitreD::TrueTalkNotifySpeechEndedMsg(CTrueTalkNotifySpeechEndedMsg *msg) } bool CMaitreD::LoadSuccessMsg(CLoadSuccessMsg *msg) { - if (_field12C) { + if (_fightFlag) { _timerId = startAnimTimer("MD Fight", 3000 + getRandomNumber(3000)); } diff --git a/engines/titanic/npcs/maitre_d.h b/engines/titanic/npcs/maitre_d.h index 878c32cc0b..6677a587a8 100644 --- a/engines/titanic/npcs/maitre_d.h +++ b/engines/titanic/npcs/maitre_d.h @@ -41,17 +41,16 @@ class CMaitreD : public CTrueTalkNPC { bool TextInputMsg(CTextInputMsg *msg); bool TriggerNPCEvent(CTriggerNPCEvent *msg); private: - static int _v1; -private: - int _field108; - CString _string2; - int _field118; - int _field11C; - CString _string3; - int _field12C; - int _field130; - int _field134; + int _unused5; + CString _priorMusicName; + bool _hasMusic; + bool _musicSet; + CString _musicName; + bool _fightFlag; + bool _unused6; + bool _savedFightFlag; int _timerId; + bool _defeated; public: CLASSDEF; CMaitreD(); diff --git a/engines/titanic/npcs/parrot.cpp b/engines/titanic/npcs/parrot.cpp index b570bea6ae..6a48837d08 100644 --- a/engines/titanic/npcs/parrot.cpp +++ b/engines/titanic/npcs/parrot.cpp @@ -43,6 +43,7 @@ BEGIN_MESSAGE_MAP(CParrot, CTrueTalkNPC) ON_MESSAGE(PreEnterViewMsg) ON_MESSAGE(PanningAwayFromParrotMsg) ON_MESSAGE(LeaveRoomMsg) + ON_MESSAGE(TrueTalkNotifySpeechEndedMsg) END_MESSAGE_MAP() bool CParrot::_eatingChicken; @@ -475,7 +476,7 @@ bool CParrot::NPCPlayIdleAnimationMsg(CNPCPlayIdleAnimationMsg *msg) { } } else { int id = -1; - switch (stateGet38()) { + switch (getParrotResponse()) { case 0: id = 280107; break; @@ -729,4 +730,15 @@ bool CParrot::LeaveRoomMsg(CLeaveRoomMsg *msg) { return true; } +bool CParrot::TrueTalkNotifySpeechEndedMsg(CTrueTalkNotifySpeechEndedMsg *msg) { + if (msg->_dialogueId == 80022) { + // WORKAROUND: End of parrot speech after having fixed Titania + unlockMouse(); + changeView("Titania.Node 18.N", ""); + } + + return CTrueTalkNPC::TrueTalkNotifySpeechEndedMsg(msg); +} + + } // End of namespace Titanic diff --git a/engines/titanic/npcs/parrot.h b/engines/titanic/npcs/parrot.h index c178a2086a..d3558dfa3e 100644 --- a/engines/titanic/npcs/parrot.h +++ b/engines/titanic/npcs/parrot.h @@ -51,6 +51,7 @@ class CParrot : public CTrueTalkNPC { bool PreEnterViewMsg(CPreEnterViewMsg *msg); bool PanningAwayFromParrotMsg(CPanningAwayFromParrotMsg *msg); bool LeaveRoomMsg(CLeaveRoomMsg *msg); + bool TrueTalkNotifySpeechEndedMsg(CTrueTalkNotifySpeechEndedMsg *msg); public: static bool _eatingChicken; static bool _takeOff; diff --git a/engines/titanic/npcs/succubus.cpp b/engines/titanic/npcs/succubus.cpp index 71272fad03..ef681f64b8 100644 --- a/engines/titanic/npcs/succubus.cpp +++ b/engines/titanic/npcs/succubus.cpp @@ -701,11 +701,11 @@ bool CSuccUBus::TurnOff(CTurnOff *msg) { if (_offStartFrame >= 0) { playSound("z#27.wav", 100); - playMovie(_offStartFrame, _offEndFrame, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(_offStartFrame, _offEndFrame, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); } if (!_signalFlag && _endingStartFrame >= 0) - playMovie(_endingStartFrame, _endingEndFrame, MOVIE_NOTIFY_OBJECT | MOVIE_GAMESTATE); + playMovie(_endingStartFrame, _endingEndFrame, MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH); _isOn = false; performAction(true); diff --git a/engines/titanic/npcs/titania.cpp b/engines/titanic/npcs/titania.cpp index db0c85d5f5..e0ea4f1459 100644 --- a/engines/titanic/npcs/titania.cpp +++ b/engines/titanic/npcs/titania.cpp @@ -43,7 +43,7 @@ CTitania::CTitania() : CCharacter() { _ear2 = false; _nose = false; _mouth = false; - _showIntro = true; + _showSpeech = true; } void CTitania::save(SimpleFile *file, int indent) { @@ -59,7 +59,7 @@ void CTitania::save(SimpleFile *file, int indent) { file->writeNumberLine(_ear2, indent); file->writeNumberLine(_nose, indent); file->writeNumberLine(_mouth, indent); - file->writeNumberLine(_showIntro, indent); + file->writeNumberLine(_showSpeech, indent); CCharacter::save(file, indent); } @@ -77,7 +77,7 @@ void CTitania::load(SimpleFile *file) { _ear2 = file->readNumber(); _nose = file->readNumber(); _mouth = file->readNumber(); - _showIntro = file->readNumber(); + _showSpeech = file->readNumber(); CCharacter::load(file); } @@ -99,7 +99,7 @@ bool CTitania::AddHeadPieceMsg(CAddHeadPieceMsg *msg) { _eye2 = true; } else if (msg->_value == "Ear1") { _ear1 = true; - } else if (msg->_value == "Ear2") { + } else if (msg->_value == "Ear 2") { _ear2 = true; } else if (msg->_value == "Mouth") { _mouth = true; @@ -197,8 +197,8 @@ bool CTitania::ActMsg(CActMsg *msg) { } bool CTitania::EnterViewMsg(CEnterViewMsg *msg) { - if (_showIntro) { - _showIntro = false; + if (_showSpeech) { + _showSpeech = false; disableMouse(); petHide(); @@ -216,8 +216,11 @@ bool CTitania::EnterViewMsg(CEnterViewMsg *msg) { } bool CTitania::TimerMsg(CTimerMsg *msg) { - changeView("Titania.Node 18.N", ""); + // WORKAROUND: The original uses the disc change dialog as a pause + // to allow the parrot speech to finish. I've rewritten it to instead + // use the standard TrueTalkNotifySpeechEndedMsg message instead startTalking("PerchedParrot", 80022); + lockMouse(); return true; } diff --git a/engines/titanic/npcs/titania.h b/engines/titanic/npcs/titania.h index 61f8c86018..f94442d317 100644 --- a/engines/titanic/npcs/titania.h +++ b/engines/titanic/npcs/titania.h @@ -46,7 +46,7 @@ private: bool _ear2; bool _nose; bool _mouth; - bool _showIntro; + bool _showSpeech; public: CLASSDEF; CTitania(); diff --git a/engines/titanic/sound/music_room_instrument.cpp b/engines/titanic/sound/music_room_instrument.cpp index 5e7bd9bb8c..b92329850b 100644 --- a/engines/titanic/sound/music_room_instrument.cpp +++ b/engines/titanic/sound/music_room_instrument.cpp @@ -234,7 +234,7 @@ void CMusicRoomInstrument::update(int val) { double tempVal = 46.0 - ((double)(val - 14) * 1.43); int frameNum = _field4C; - int frameNum1 = (tempVal - frameNum) * 0.25; + int frameNum1 = (int)((tempVal - frameNum) * 0.25); _gameObjects[1]->playMovie(frameNum1, frameNum1, MOVIE_STOP_PREVIOUS); frameNum += frameNum1; diff --git a/engines/titanic/sound/titania_speech.cpp b/engines/titanic/sound/titania_speech.cpp index d0ff423342..1adce7a5ac 100644 --- a/engines/titanic/sound/titania_speech.cpp +++ b/engines/titanic/sound/titania_speech.cpp @@ -34,16 +34,16 @@ END_MESSAGE_MAP() void CTitaniaSpeech::save(SimpleFile *file, int indent) { file->writeNumberLine(1, indent); - file->writeNumberLine(_paraNum, indent); - file->writeNumberLine(_frameNum, indent); + file->writeNumberLine(_actionNum, indent); + file->writeNumberLine(_backgroundFrame, indent); CGameObject::save(file, indent); } void CTitaniaSpeech::load(SimpleFile *file) { file->readNumber(); - _paraNum = file->readNumber(); - _frameNum = file->readNumber(); + _actionNum = file->readNumber(); + _backgroundFrame = file->readNumber(); CGameObject::load(file); } @@ -54,16 +54,16 @@ bool CTitaniaSpeech::ActMsg(CActMsg *msg) { CActMsg actMsg; if (msg->_action == "TitaniaSpeech") { - switch (_paraNum) { - case 0: + switch (_actionNum) { + case 1: movieSetAudioTiming(true); loadSound("a#12.wav"); sleep(1000); - playMovie(0, 187, MOVIE_GAMESTATE | MOVIE_NOTIFY_OBJECT); + playMovie(0, 187, MOVIE_WAIT_FOR_FINISH | MOVIE_NOTIFY_OBJECT); movieEvent(0); break; - case 1: + case 2: loadSound("a#11.wav"); addTimer(0); startAnimTimer("Para2", 300); @@ -74,34 +74,34 @@ bool CTitaniaSpeech::ActMsg(CActMsg *msg) { startAnimTimer("NextPara", 30000); break; - case 2: + case 3: visibleMsg._visible = false; visibleMsg.execute("TitaniaStillControl"); loadSound("a#10.wav"); - playMovie(585, 706, MOVIE_GAMESTATE | MOVIE_NOTIFY_OBJECT); + playMovie(585, 706, MOVIE_WAIT_FOR_FINISH | MOVIE_NOTIFY_OBJECT); playSound("a#10.wav"); break; - case 3: + case 4: visibleMsg._visible = false; visibleMsg.execute("TitaniaStillControl"); loadSound("a#9.wav"); - playMovie(707, 905, MOVIE_GAMESTATE | MOVIE_NOTIFY_OBJECT); + playMovie(707, 905, MOVIE_WAIT_FOR_FINISH | MOVIE_NOTIFY_OBJECT); playSound("a#9.wav"); break; - case 4: + case 5: visibleMsg._visible = false; visibleMsg.execute("TitaniaStillControl"); loadSound("a#8.wav"); - playMovie(906, 938, MOVIE_GAMESTATE | MOVIE_NOTIFY_OBJECT); + playMovie(906, 938, MOVIE_WAIT_FOR_FINISH | MOVIE_NOTIFY_OBJECT); playSound("a#8.wav"); break; default: sleep(3000); actMsg._action = "SleepTitania"; - actMsg.execute(this); + actMsg.execute("TitaniaControl"); } } @@ -109,10 +109,10 @@ bool CTitaniaSpeech::ActMsg(CActMsg *msg) { } bool CTitaniaSpeech::MovieEndMsg(CMovieEndMsg *msg) { - if (_paraNum == 5) { + if (_actionNum == 5) { startAnimTimer("NextPara", 0); } else { - if (_paraNum != 1) + if (_actionNum != 1) addTimer(0); startAnimTimer("NextPara", 3000); } @@ -135,12 +135,12 @@ bool CTitaniaSpeech::TimerMsg(CTimerMsg *msg) { if (msg->_action == "NextPara") { visibleMsg.execute("TitaniaStillControl"); - ++_paraNum; + ++_actionNum; actMsg.execute(this); } else if (msg->_action == "Para2") { playSound("a#11.wav"); } else { - frameMsg._frameNumber = _frameNum; + frameMsg._frameNumber = _backgroundFrame++; frameMsg.execute("TitaniaStillControl"); } diff --git a/engines/titanic/sound/titania_speech.h b/engines/titanic/sound/titania_speech.h index 2244bb01af..48e0b7bdad 100644 --- a/engines/titanic/sound/titania_speech.h +++ b/engines/titanic/sound/titania_speech.h @@ -36,10 +36,11 @@ class CTitaniaSpeech : public CGameObject { bool TimerMsg(CTimerMsg *msg); bool EnterRoomMsg(CEnterRoomMsg *msg); private: - int _paraNum, _frameNum; + int _actionNum; + int _backgroundFrame; public: CLASSDEF; - CTitaniaSpeech() : CGameObject(), _paraNum(1), _frameNum(0) {} + CTitaniaSpeech() : CGameObject(), _actionNum(1), _backgroundFrame(0) {} /** * Save the data for the class to file diff --git a/engines/titanic/star_control/star_control.cpp b/engines/titanic/star_control/star_control.cpp index dcb004231a..a1c4f33ad2 100644 --- a/engines/titanic/star_control/star_control.cpp +++ b/engines/titanic/star_control/star_control.cpp @@ -133,8 +133,8 @@ void CStarControl::fn1(int action) { // TODO } -bool CStarControl::fn4() { - return _starField.get6(); +bool CStarControl::isSolved() const { + return _starField.isSolved(); } bool CStarControl::canSetStarDestination() const { diff --git a/engines/titanic/star_control/star_control.h b/engines/titanic/star_control/star_control.h index bf964b7cfa..0ee7c6530e 100644 --- a/engines/titanic/star_control/star_control.h +++ b/engines/titanic/star_control/star_control.h @@ -69,7 +69,11 @@ public: virtual void draw(CScreenManager *screenManager); void fn1(int action); - bool fn4(); + + /** + * Returns true if the starfield puzzle has been solved + */ + bool isSolved() const; /** * Returns true if a star destination can be set diff --git a/engines/titanic/star_control/star_field.cpp b/engines/titanic/star_control/star_field.cpp index 0dbc5fd700..7502f84d3d 100644 --- a/engines/titanic/star_control/star_field.cpp +++ b/engines/titanic/star_control/star_field.cpp @@ -26,7 +26,7 @@ namespace Titanic { CStarField::CStarField() : _val1(0), _val2(0), _val3(0), _val4(true), - _val5(0), _val6(false) { + _val5(0), _isSolved(false) { } void CStarField::load(SimpleFile *file) { @@ -36,7 +36,7 @@ void CStarField::load(SimpleFile *file) { _val2 = file->readNumber(); _val3 = file->readNumber(); _val4 = file->readNumber(); - _val6 = file->readNumber(); + _isSolved = file->readNumber(); } void CStarField::save(SimpleFile *file, int indent) { @@ -46,7 +46,7 @@ void CStarField::save(SimpleFile *file, int indent) { file->writeNumberLine(_val2, indent); file->writeNumberLine(_val3, indent); file->writeNumberLine(_val4, indent); - file->writeNumberLine(_val6, indent); + file->writeNumberLine(_isSolved, indent); } bool CStarField::initDocument() { @@ -119,12 +119,12 @@ int CStarField::get5() const { return _val5; } -void CStarField::update6() { - _val6 = _sub8._field8 == 2; +void CStarField::setSolved() { + _isSolved = _sub8._field8 == 2; } -int CStarField::get6() const { - return _val6; +bool CStarField::isSolved() const { + return _isSolved; } } // End of namespace Titanic diff --git a/engines/titanic/star_control/star_field.h b/engines/titanic/star_control/star_field.h index 91cefbb457..41f01894f4 100644 --- a/engines/titanic/star_control/star_field.h +++ b/engines/titanic/star_control/star_field.h @@ -44,7 +44,7 @@ private: int _val3; bool _val4; int _val5; - bool _val6; + bool _isSolved; public: CStarField(); @@ -77,8 +77,16 @@ public: bool set4(bool val); int get88() const; int get5() const; - void update6(); - int get6() const; + + /** + * Sets the flag that the starfield has been solved + */ + void setSolved(); + + /** + * Returns true if the starfield puzzle has been solved + */ + bool isSolved() const; }; } // End of namespace Titanic diff --git a/engines/titanic/support/avi_surface.cpp b/engines/titanic/support/avi_surface.cpp index 42e3618b97..a1dbecbe1c 100644 --- a/engines/titanic/support/avi_surface.cpp +++ b/engines/titanic/support/avi_surface.cpp @@ -284,10 +284,13 @@ void AVISurface::copyMovieFrame(const Graphics::Surface &src, Graphics::ManagedS if (src.format.bytesPerPixel == 1) { // Paletted 8-bit, so convert to 16-bit and copy over - Graphics::Surface *s = src.convertTo(dest.format, _decoder->getPalette()); - dest.blitFrom(*s, copyRect, Common::Point(0, 0)); - s->free(); - delete s; + const byte *palette = _decoder->getPalette(); + if (palette) { + Graphics::Surface *s = src.convertTo(dest.format, palette); + dest.blitFrom(*s, copyRect, Common::Point(0, 0)); + s->free(); + delete s; + } } else if (src.format.bytesPerPixel == 2) { // Source is already 16-bit, with no alpha, so do a straight copy dest.blitFrom(src, copyRect, Common::Point(0, 0)); diff --git a/engines/titanic/support/avi_surface.h b/engines/titanic/support/avi_surface.h index f45db3599e..d3442a12f7 100644 --- a/engines/titanic/support/avi_surface.h +++ b/engines/titanic/support/avi_surface.h @@ -34,8 +34,11 @@ class CSoundManager; class CVideoSurface; enum MovieFlag { - MOVIE_REPEAT = 1, MOVIE_STOP_PREVIOUS = 2, MOVIE_NOTIFY_OBJECT = 4, - MOVIE_REVERSE = 8, MOVIE_GAMESTATE = 0x10 + MOVIE_REPEAT = 1, // Repeat movie + MOVIE_STOP_PREVIOUS = 2, // Stop any prior movie playing on the object + MOVIE_NOTIFY_OBJECT = 4, // Notify the object when the movie finishes + MOVIE_REVERSE = 8, // Play the movie in reverse + MOVIE_WAIT_FOR_FINISH = 0x10 // Let finish before playing next movie for object }; class AVIDecoder : public Video::AVIDecoder { diff --git a/engines/titanic/support/files_manager.cpp b/engines/titanic/support/files_manager.cpp index fc09c5702c..cf706974a7 100644 --- a/engines/titanic/support/files_manager.cpp +++ b/engines/titanic/support/files_manager.cpp @@ -106,7 +106,7 @@ void CFilesManager::loadDrive() { } void CFilesManager::insertCD(CScreenManager *screenManager) { - // We not support running game directly from the original CDs, + // We don't support running the game directly from the original CDs, // so this method can remain stubbed } diff --git a/engines/titanic/true_talk/tt_title_script.cpp b/engines/titanic/true_talk/tt_title_script.cpp index 2effb96cc7..b69318dbe5 100644 --- a/engines/titanic/true_talk/tt_title_script.cpp +++ b/engines/titanic/true_talk/tt_title_script.cpp @@ -24,8 +24,7 @@ namespace Titanic { -TTTitleScript::TTTitleScript() : TTscriptBase(1, "", 0, "", 0, -1, -1, -1, 0), - _field50(0), _field5C(-1), _field60(0) { +TTTitleScript::TTTitleScript() : TTscriptBase(1, "", 0, "", 0, -1, -1, -1, 0) { } } // End of namespace Titanic diff --git a/engines/titanic/true_talk/tt_title_script.h b/engines/titanic/true_talk/tt_title_script.h index f02e591c54..03d1b04ac7 100644 --- a/engines/titanic/true_talk/tt_title_script.h +++ b/engines/titanic/true_talk/tt_title_script.h @@ -29,11 +29,6 @@ namespace Titanic { class TTTitleScript : public TTscriptBase { -private: - int _field50; - TTstring _string1; - int _field5C; - int _field60; public: TTTitleScript(); }; |