diff options
Diffstat (limited to 'engines')
140 files changed, 38196 insertions, 3927 deletions
diff --git a/engines/access/access.cpp b/engines/access/access.cpp index 56fa6c7533..bc9bcb4b08 100644 --- a/engines/access/access.cpp +++ b/engines/access/access.cpp @@ -34,19 +34,24 @@ namespace Access { AccessEngine::AccessEngine(OSystem *syst, const AccessGameDescription *gameDesc) : _gameDescription(gameDesc), Engine(syst), _randomSource("Access"), _useItem(_flags[99]), _startup(_flags[170]), _manScaleOff(_flags[172]) { + _aboutBox = nullptr; _animation = nullptr; _bubbleBox = nullptr; _char = nullptr; _debugger = nullptr; _events = nullptr; _files = nullptr; + _invBox = nullptr; _inventory = nullptr; + _helpBox = nullptr; _midi = nullptr; _player = nullptr; + _res = nullptr; _room = nullptr; _screen = nullptr; _scripts = nullptr; _sound = nullptr; + _travelBox = nullptr; _video = nullptr; _destIn = nullptr; @@ -130,6 +135,7 @@ AccessEngine::~AccessEngine() { delete _inventory; delete _midi; delete _player; + delete _res; delete _room; delete _screen; delete _scripts; @@ -204,6 +210,13 @@ void AccessEngine::initialize() { } Common::Error AccessEngine::run() { + _res = Resources::init(this); + Common::String errorMessage; + if (!_res->load(errorMessage)) { + GUIErrorMessage(errorMessage); + return Common::kNoError; + } + setVGA(); initialize(); diff --git a/engines/access/access.h b/engines/access/access.h index 37b9fec5a5..2ca4a3468e 100644 --- a/engines/access/access.h +++ b/engines/access/access.h @@ -42,6 +42,7 @@ #include "access/font.h" #include "access/inventory.h" #include "access/player.h" +#include "access/resources.h" #include "access/room.h" #include "access/screen.h" #include "access/scripts.h" @@ -147,6 +148,7 @@ public: FileManager *_files; InventoryManager *_inventory; Player *_player; + Resources *_res; Room *_room; Screen *_screen; Scripts *_scripts; @@ -313,6 +315,8 @@ public: void SPRINTCHR(char c, int fontNum); void PRINTCHR(Common::String msg, int fontNum); + + bool playMovie(const Common::String &filename, const Common::Point &pos); }; } // End of namespace Access diff --git a/engines/access/amazon/amazon_game.cpp b/engines/access/amazon/amazon_game.cpp index 7a55873d97..cf90beae96 100644 --- a/engines/access/amazon/amazon_game.cpp +++ b/engines/access/amazon/amazon_game.cpp @@ -146,27 +146,24 @@ void AmazonEngine::playGame() { } void AmazonEngine::setupGame() { + Amazon::AmazonResources &res = *((Amazon::AmazonResources *)_res); + // Load death list - if (isDemo()) { - _deaths.resize(34); - for (int i = 0; i < 34; ++i) { - _deaths[i]._screenId = DEATH_SCREENS_DEMO[i]; - _deaths[i]._msg = DEATH_TEXT_DEMO[i]; - } - } else { - _deaths.resize(58); - for (int i = 0; i < 58; ++i) { - _deaths[i]._screenId = DEATH_SCREENS[i]; - _deaths[i]._msg = DEATH_TEXT[i]; - } + _deaths.resize(_res->DEATHS.size()); + + for (uint idx = 0; idx < _deaths.size(); ++idx) { + _deaths[idx]._screenId = res.DEATHS[idx]._screenId; + _deaths[idx]._msg = res.DEATHS[idx]._msg; } + + // Load the deaths cells _deaths._cells.resize(13); for (int i = 0; i < 13; ++i) _deaths._cells[i] = CellIdent(DEATH_CELLS[i][0], DEATH_CELLS[i][1], DEATH_CELLS[i][2]); // Miscellaneous - _fonts._font1.load(FONT6x6_INDEX, FONT6x6_DATA); - _fonts._font2.load(FONT2_INDEX, FONT2_DATA); + _fonts._font1.load(&res.FONT6x6_INDEX[0], &res.FONT6x6_DATA[0]); + _fonts._font2.load(&res.FONT2_INDEX[0], &res.FONT2_DATA[0]); initVariables(); } @@ -195,8 +192,8 @@ void AmazonEngine::initVariables() { _timers.push_back(te); } - _player->_playerX = _player->_rawPlayer.x = _travelPos[_player->_roomNumber][0]; - _player->_playerY = _player->_rawPlayer.y = _travelPos[_player->_roomNumber][1]; + _player->_playerX = _player->_rawPlayer.x = _res->ROOMTBL[_player->_roomNumber]._travelPos.x; + _player->_playerY = _player->_rawPlayer.y = _res->ROOMTBL[_player->_roomNumber]._travelPos.y; _room->_selectCommand = -1; _events->setNormalCursor(CURSOR_CROSSHAIRS); _mouseMode = 0; @@ -411,6 +408,7 @@ void AmazonEngine::calcIQ() { } void AmazonEngine::helpTitle() { + AmazonResources &res = *(AmazonResources *)_res; int width = _fonts._font2.stringWidth(_bubbleBox->_bubbleTitle); int posX = 160 - (width / 2); _fonts._font2._fontColors[0] = 0; @@ -419,13 +417,13 @@ void AmazonEngine::helpTitle() { _fonts._font2._fontColors[3] = 35; _fonts._font2.drawString(_screen, _bubbleBox->_bubbleTitle, Common::Point(posX, 24)); - width = _fonts._font2.stringWidth(HELPLVLTXT[_helpLevel]); + width = _fonts._font2.stringWidth(res.HELPLVLTXT[_helpLevel]); posX = 160 - (width / 2); _fonts._font2._fontColors[0] = 0; _fonts._font2._fontColors[1] = 10; _fonts._font2._fontColors[2] = 11; _fonts._font2._fontColors[3] = 12; - _fonts._font2.drawString(_screen, HELPLVLTXT[_helpLevel], Common::Point(posX, 36)); + _fonts._font2.drawString(_screen, res.HELPLVLTXT[_helpLevel], Common::Point(posX, 36)); Common::String iqText = "IQ: "; calcIQ(); @@ -441,7 +439,7 @@ void AmazonEngine::helpTitle() { index /= 20; iqText += " "; - iqText += IQLABELS[index]; + iqText += res.IQLABELS[index]; width = _fonts._font2.stringWidth(iqText); posX = 160 - (width / 2); diff --git a/engines/access/amazon/amazon_logic.cpp b/engines/access/amazon/amazon_logic.cpp index de53da51cd..f927525ad1 100644 --- a/engines/access/amazon/amazon_logic.cpp +++ b/engines/access/amazon/amazon_logic.cpp @@ -1598,7 +1598,7 @@ void River::moveCanoe() { if (events._leftButton && pt.y >= 140) { if (pt.x < _vm->_room->_rMouse[8][0]) { // Disk icon wasn't clicked - _vm->_scripts->printString(BAR_MESSAGE); + _vm->_scripts->printString(AMRES.BAR_MESSAGE); } else { // Clicked on the Disc icon. Show the ScummVM menu _vm->_room->handleCommand(9); diff --git a/engines/access/amazon/amazon_resources.cpp b/engines/access/amazon/amazon_resources.cpp index 430aa64f30..7dbe1c9f90 100644 --- a/engines/access/amazon/amazon_resources.cpp +++ b/engines/access/amazon/amazon_resources.cpp @@ -27,50 +27,60 @@ namespace Access { namespace Amazon { -const char *const FILENAMES[] = { - "S00.AP", "S01.AP", "S02.AP", "R03.AP", "S04.AP", "S05.AP", - "S06.AP", "S07.AP", "S08.AP", "S09.AP", "S10.AP", "S11.AP", - "S12.AP", "S13.AP", "S14.AP", "S15.AP", "S16.AP", "S17.AP", - "S18.AP", "S19.AP", "S20.AP", "S21.AP", "S22.AP", "S23.AP", - "S24.AP", "S25.AP", "S26.AP", "S27.AP", "S28.AP", "S29.AP", - "S30.AP", "S31.AP", "S32.AP", "S33.AP", "S34.AP", "R35.AP", - "S36.AP", "S37.AP", "S38.AP", "S39.AP", "S40.AP", "C26.AP", - "S42.AP", "S01.AP", "S44.AP", "S45.AP", "S46.AP", "S47.AP", - "C36.AP", nullptr, "S50.AP", nullptr, nullptr, "S53.AP", - "S54.AP", "S55.AP", "C35.AP", "S57.AP", "S58.AP", nullptr, - nullptr, "S61.AP", nullptr, nullptr, "S64.AP", "C00.AP", - "C01.AP", "C06.AP", "C07.AP", "C08.AP", "C05.AP", "C09.AP", - "C12.AP", "C03.AP", "C13.AP", "C15.AP", "C14.AP", "C16.AP", - "C17.AP", "C19.AP", "C20.AP", "C21.AP", "C22.AP", "C23.AP", - "C24.AP", "C25.AP", "C29.AP", "C30.AP", "C32.AP", "C33.AP", - "C34.AP", "CREDITS.AP", "MIDIDRV.AP", "SUMMARY.AP", "DEAD.AP", - "EST.AP", "CHAPTER.AP", "MIDI.AP", "SOUND.AP", "INV.AP", - // The following files are only present in the CD version - "NARATE01.AP", "NARATE02.AP", "NARATE03.AP", "NARATE04.AP", - "NARATE05.AP", "NARATE06.AP", "NARATE07.AP", "NARATE08.AP", - "NARATE09.AP", "NARATE10.AP", "NARATE11.AP", "NARATE12.AP", - "NARATE13.AP", "NARATE14.AP", "S00.AP", "TAG.AP" -}; - -const char *const FILENAMES_DEMO[] = { - "S00.AP", "S01.AP", "S02.AP", "R03.AP", "S04.AP", "S05.AP", - "S06.AP", "S07.AP", "S08.AP", "S09.AP", "S10.AP", "S11.AP", - "S12.AP", "S13.AP", "S14.AP", "S15.AP", "S16.AP", "S17.AP", - "S18.AP", "S19.AP", "S20.AP", "S21.AP", "S22.AP", "S23.AP", - "S24.AP", "S25.AP", "S26.AP", "S27.AP", "S28.AP", "S29.AP", - "S30.AP", "S31.AP", "S32.AP", "S33.AP", "S34.AP", "R35.AP", - "S36.AP", "S37.AP", "S38.AP", "S39.AP", "S40.AP", "TITLE.AP", - "S42.AP", "S01.AP", "S44.AP", "S45.AP", "S46.AP", "S47.AP", - nullptr, nullptr, "S50.AP", nullptr, nullptr, "S53.AP", - "S54.AP", nullptr, nullptr, "S57.AP", nullptr, nullptr, - nullptr, "S61.AP", nullptr, "C23.AP", "C12.AP", "C00.AP", - "C01.AP", "C06.AP", "C07.AP", "C08.AP", "C05.AP", "C09.AP", - "C12.AP", "C03.AP", "C13.AP", "C15.AP", "C14.AP", "C16.AP", - "C17.AP", "C19.AP", "C20.AP", "C21.AP", "C22.AP", "C23.AP", - "C24.AP", "C25.AP", "R49.AP", "R49.AP", "R49.AP", "R49.AP", - "R49.AP", "R49.AP", "R49.AP", "R49.AP", "DEAD.AP", "EST.AP", - "CHAPTER.AP", "MUSIC.AP", "SOUND.AP", "INV.AP" -}; +void AmazonResources::load(Common::SeekableReadStream &s) { + Resources::load(s); + uint count; + + // Load the version specific data + NO_HELP_MESSAGE = readString(s); + NO_HINTS_MESSAGE = readString(s); + RIVER_HIT1 = readString(s); + RIVER_HIT2 = readString(s); + BAR_MESSAGE = readString(s); + + for (int idx = 0; idx < 3; ++idx) + HELPLVLTXT[idx] = readString(s); + for (int idx = 0; idx < 9; ++idx) + IQLABELS[idx] = readString(s); + + CANT_GET_THERE = readString(s); + + // Get the offset of the general shared data for the game + uint entryOffset = findEntry(_vm->getGameID(), 2, 0, (Common::Language)0); + s.seek(entryOffset); + + // Read in the cursor list + count = s.readUint16LE(); + CURSORS.resize(count); + for (uint idx = 0; idx < count; ++idx) { + uint count2 = s.readUint16LE(); + CURSORS[idx].resize(count2); + s.read(&CURSORS[idx][0], count2); + } + + // Load font data + count = s.readUint16LE(); + FONT2_INDEX.resize(count); + for (uint idx = 0; idx < count; ++idx) + FONT2_INDEX[idx] = s.readSint16LE(); + + count = s.readUint16LE(); + FONT2_DATA.resize(count); + for (uint idx = 0; idx < count; ++idx) + FONT2_DATA[idx] = s.readByte(); + + count = s.readUint16LE(); + FONT6x6_INDEX.resize(count); + for (uint idx = 0; idx < count; ++idx) + FONT6x6_INDEX[idx] = s.readSint16LE(); + + count = s.readUint16LE(); + FONT6x6_DATA.resize(count); + for (uint idx = 0; idx < count; ++idx) + FONT6x6_DATA[idx] = s.readByte(); +} + +/*------------------------------------------------------------------------*/ const int SIDEOFFR[] = { 5, 5, 5, 5, 5, 5, 5, 5, 0 }; const int SIDEOFFL[] = { 5, 5, 5, 5, 5, 5, 5, 5, 0 }; @@ -85,316 +95,6 @@ const int DIAGOFFULY[] = { 3, 3, 1, 2, 2, 1, 1, 1, 0 }; const int DIAGOFFDLX[] = { 4, 5, 3, 3, 5, 4, 6, 1, 0 }; const int DIAGOFFDLY[] = { 2, 2, 1, 2, 3, 1, 2, 1, 0 }; -const byte MOUSE0[] = { - // hotspot x and y, uint16 LE - 0, 0, 0, 0, - // byte 1: number of skipped pixels - // byte 2: number of plotted pixels - // then, pixels - 0, 2, 6, 1, - 0, 3, 6, 6, 1, - 0, 3, 6, 6, 1, - 0, 4, 6, 6, 6, 1, - 0, 4, 6, 6, 6, 1, - 0, 5, 6, 6, 6, 6, 1, - 0, 5, 6, 6, 6, 6, 1, - 0, 6, 6, 6, 6, 6, 6, 1, - 0, 6, 6, 6, 6, 6, 6, 1, - 0, 7, 6, 6, 6, 6, 6, 6, 1, - 0, 6, 6, 6, 6, 6, 6, 1, - 0, 5, 6, 6, 6, 6, 1, - 2, 3, 6, 6, 1, - 3, 3, 6, 6, 1, - 3, 3, 6, 6, 1, - 4, 2, 6, 1 -}; - -const byte MOUSE1[] = { - // hotspot x and y, uint16 LE - 0x07, 0x00, 0x07, 0x00, - // byte 1: number of skipped pixels - // byte 2: number of plotted pixels - // then, pixels - 0x06, 0x01, 0x05, - 0x04, 0x05, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, - 0x03, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, - 0x02, 0x09, 0xFF, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0xFF, - 0x01, 0x0B, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, - 0x01, 0x0B, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xFF, - 0x00, 0x0D, 0x05, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x00, 0x05, - 0x01, 0x0B, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xFF, - 0x01, 0x0B, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, - 0x02, 0x09, 0xFF, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0xFF, - 0x03, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, - 0x04, 0x05, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, - 0x06, 0x01, 0x05, - 0x00, 0x00, - 0x00, 0x00, - 0x00, 0x00 -}; - -const byte MOUSE2[] = { - // hotspot x and y, uint16 LE - 0x08, 0x00, 0x08, 0x00, - // byte 1: number of skipped pixels - // byte 2: number of plotted pixels - // then, pixels - 0x00, 0x00, - 0x00, 0x00, - 0x07, 0x02, 0x04, 0x05, - 0x07, 0x02, 0x04, 0x05, - 0x07, 0x02, 0x04, 0x05, - 0x07, 0x02, 0x04, 0x05, - 0x07, 0x02, 0x04, 0x05, - 0x02, 0x0C, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, - 0x07, 0x02, 0x04, 0x05, - 0x07, 0x02, 0x04, 0x05, - 0x07, 0x02, 0x04, 0x05, - 0x07, 0x02, 0x04, 0x05, - 0x07, 0x02, 0x04, 0x05, - 0x00, 0x00, - 0x00, 0x00, - 0x00, 0x00 -}; - -const byte MOUSE3[] = { - // hotspot x and y, uint16 LE - 0x00, 0x00, 0x00, 0x00, - // byte 1: number of skipped pixels - // byte 2: number of plotted pixels - // then, pixels - 0x00, 0x0B, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x00, 0x0C, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x05, - 0x00, 0x0C, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x05, 0x05, - 0x00, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, - 0x00, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, - 0x00, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x05, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x05, - 0x00, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, - 0x00, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, - 0x00, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, - 0x00, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, - 0x00, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, - 0x00, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, - 0x01, 0x0B, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x00, 0x00, - 0x00, 0x00, - 0x00, 0x00 -}; -const byte CURSEYE[] = { - // hotspot x and y, uint16 LE - 0x01, 0x00, 0x08, 0x00, - // byte 1: number of skipped pixels - // byte 2: number of plotted pixels - // then, pixels - 0x04, 0x06, 0x0E, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, - 0x03, 0x09, 0x0E, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0D, 0x0D, - 0x02, 0x0B, 0x0E, 0x01, 0x33, 0x33, 0x01, 0x01, 0x33, 0x34, 0x01, 0x01, 0x0D, - 0x01, 0x0D, 0x0E, 0x01, 0x04, 0x34, 0x01, 0x01, 0x01, 0x07, 0x33, 0x04, 0x04, 0x01, 0x0D, - 0x00, 0x0F, 0x0E, 0x0E, 0x01, 0x07, 0x33, 0x33, 0x01, 0x01, 0x33, 0x34, 0x07, 0x07, 0x06, 0x01, 0x0E, - 0x01, 0x0D, 0x0F, 0x0F, 0x06, 0x07, 0x34, 0x33, 0x33, 0x34, 0x07, 0x07, 0x06, 0x0F, 0x0E, - 0x03, 0x09, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0E, - 0x01, 0x01, 0x07, - 0x00, 0x03, 0x07, 0x01, 0x07, - 0x01, 0x01, 0x07, - 0x00, 0x00, - 0x00, 0x00, - 0x00, 0x00, - 0x00, 0x00, - 0x00, 0x00, - 0x00, 0x00 -}; - -const byte CURSHAND[] = { - // hotspot x and y, uint16 LE - 0x02, 0x00, 0x03, 0x00, - // byte 1: number of skipped pixels - // byte 2: number of plotted pixels - // then, pixels - 0x07, 0x02, 0x17, 0x0E, - 0x05, 0x07, 0x0E, 0x12, 0x17, 0x0E, 0x13, 0x17, 0x0E, - 0x02, 0x0C, 0x07, 0x00, 0x17, 0x0E, 0x11, 0x0F, 0x0E, 0x11, 0x17, 0x0E, 0x00, 0x17, - 0x01, 0x0E, 0x07, 0x01, 0x07, 0x0F, 0x0E, 0x11, 0x17, 0x0E, 0x11, 0x0F, 0x0E, 0x12, 0x17, 0x0E, - 0x02, 0x0D, 0x07, 0x00, 0x17, 0x0F, 0x12, 0x0F, 0x0F, 0x11, 0x17, 0x0E, 0x12, 0x0F, 0x0E, - 0x04, 0x0B, 0x0F, 0x0E, 0x11, 0x17, 0x0E, 0x12, 0x0F, 0x0F, 0x11, 0x17, 0x0E, - 0x04, 0x0B, 0x17, 0x0E, 0x12, 0x17, 0x0E, 0x12, 0x17, 0x0E, 0x11, 0x0F, 0x0E, - 0x00, 0x0F, 0x0E, 0x0D, 0x12, 0x00, 0x17, 0x0F, 0x0F, 0x0F, 0x0F, 0x12, 0x0F, 0x0E, 0x12, 0x17, 0x0F, - 0x00, 0x0F, 0x0F, 0x17, 0x0D, 0x11, 0x0F, 0x0E, 0x0D, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0E, 0x0D, - 0x01, 0x0E, 0x0F, 0x17, 0x0F, 0x0E, 0x0F, 0x0D, 0x0D, 0x0D, 0x0D, 0x0E, 0x0F, 0x0F, 0x0E, 0x0D, - 0x02, 0x0D, 0x0F, 0x17, 0x0F, 0x0E, 0x0D, 0x0D, 0x0F, 0x0F, 0x0E, 0x0F, 0x0E, 0x0E, 0x12, - 0x03, 0x0C, 0x0F, 0x17, 0x0F, 0x0F, 0x0F, 0x0E, 0x0F, 0x0F, 0x0F, 0x0E, 0x0D, 0x12, - 0x04, 0x0A, 0x0F, 0x17, 0x0F, 0x0F, 0x0F, 0x0E, 0x0F, 0x0F, 0x0E, 0x0D, - 0x05, 0x09, 0x0F, 0x17, 0x0F, 0x0F, 0x0F, 0x0F, 0x0E, 0x0D, 0x12, - 0x06, 0x08, 0x17, 0x0F, 0x0F, 0x0F, 0x0F, 0x0E, 0x0D, 0x12, - 0x06, 0x07, 0x17, 0x0F, 0x0F, 0x0F, 0x3D, 0x0E, 0x0D -}; - -const byte CURSGET[] = { - // hotspot x and y, uint16 LE - 0x07, 0x00, 0x0E, 0x00, - // byte 1: number of skipped pixels - // byte 2: number of plotted pixels - // then, pixels - 0x0A, 0x05, 0x1C, 0x07, 0x0F, 0x0F, 0x0F, - 0x08, 0x08, 0x1C, 0x07, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0C, - 0x06, 0x0A, 0x1C, 0x07, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0C, - 0x05, 0x0A, 0x07, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0C, - 0x03, 0x0C, 0x07, 0x1C, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0C, - 0x02, 0x0D, 0x1C, 0x0F, 0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0C, - 0x01, 0x0E, 0x07, 0x0F, 0x0E, 0x0D, 0x0F, 0x0E, 0x0D, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0C, - 0x00, 0x0F, 0x1C, 0x0F, 0x0E, 0x0D, 0x0F, 0x0E, 0x0D, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0C, - 0x00, 0x0F, 0x1C, 0x0E, 0x0D, 0x0F, 0x0E, 0x0D, 0x0F, 0x0F, 0x0C, 0x0C, 0x0E, 0x0F, 0x0F, 0x0F, 0x0C, - 0x00, 0x0E, 0x1C, 0x0D, 0x0F, 0x0E, 0x0D, 0x0F, 0x0F, 0x0C, 0x00, 0x00, 0x0E, 0x0F, 0x0F, 0x0C, - 0x00, 0x0E, 0x1C, 0x0E, 0x0F, 0x0D, 0x0F, 0x0F, 0x0C, 0x00, 0x00, 0x0E, 0x1C, 0x0F, 0x0F, 0x0C, - 0x00, 0x0D, 0x1C, 0x0D, 0x0F, 0x0D, 0x0F, 0x0C, 0x00, 0x00, 0x00, 0x0E, 0x1C, 0x0F, 0x0C, - 0x01, 0x0B, 0x0E, 0x0F, 0x0E, 0x0F, 0x0C, 0x00, 0x00, 0x0E, 0x07, 0x0F, 0x0C, - 0x02, 0x09, 0x0E, 0x0D, 0x0F, 0x0C, 0x00, 0x07, 0x0E, 0x0F, 0x0C, - 0x03, 0x06, 0x0E, 0x0F, 0x0E, 0x07, 0x01, 0x07, - 0x07, 0x01, 0x07 -}; - -const byte CURSCLIMB[] = { - // hotspot x and y, uint16 LE - 0x03, 0x00, 0x0E, 0x00, - // byte 1: number of skipped pixels - // byte 2: number of plotted pixels - // then, pixels - 0x06, 0x04, 0x01, 0x01, 0x01, 0x01, - 0x06, 0x04, 0x0F, 0x0E, 0x01, 0x01, - 0x06, 0x04, 0x0F, 0x0E, 0x0D, 0x01, - 0x07, 0x02, 0x0F, 0x0D, - 0x00, 0x0C, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x13, 0x12, 0x12, 0x12, 0x12, 0x11, 0x11, - 0x00, 0x0D, 0x0D, 0x0E, 0x00, 0x00, 0x13, 0x14, 0x13, 0x12, 0x12, 0x12, 0x11, 0x11, 0x0E, - 0x01, 0x0C, 0x0D, 0x0D, 0x0D, 0x0E, 0x11, 0x13, 0x13, 0x12, 0x11, 0x11, 0x0E, 0x0D, - 0x02, 0x0C, 0x0E, 0x0E, 0x00, 0x00, 0x00, 0x13, 0x12, 0x11, 0x00, 0x00, 0x0E, 0x0D, - 0x03, 0x0B, 0x04, 0x04, 0x04, 0x22, 0x21, 0x21, 0x20, 0x00, 0x00, 0x00, 0x0D, - 0x02, 0x0D, 0x22, 0x04, 0x20, 0x22, 0x04, 0x21, 0x04, 0x20, 0x00, 0x00, 0x00, 0x0E, 0x0E, - 0x03, 0x07, 0x22, 0x21, 0x20, 0x20, 0x22, 0x04, 0x20, - 0x04, 0x06, 0x01, 0x01, 0x00, 0x04, 0x22, 0x20, - 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x04, 0x20, - 0x03, 0x09, 0x07, 0x01, 0x01, 0x00, 0x00, 0x00, 0x22, 0x04, 0x20, - 0x02, 0x0B, 0x07, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x20, - 0x03, 0x0A, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01 -}; - -const byte CURSTALK[] = { - // hotspot x and y, uint16 LE - 0x02, 0x00, 0x0B, 0x00, - // byte 1: number of skipped pixels - // byte 2: number of plotted pixels - // then, pixels - 0x03, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x01, 0x0C, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, - 0x00, 0x0E, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x07, 0x07, 0x06, 0x07, 0x07, 0x06, 0x07, 0x06, - 0x00, 0x0F, 0x06, 0x08, 0x08, 0x08, 0x06, 0x08, 0x06, 0x06, 0x08, 0x06, 0x06, 0x08, 0x06, 0x08, 0x06, - 0x00, 0x0F, 0x06, 0x06, 0x08, 0x06, 0x08, 0x06, 0x08, 0x06, 0x08, 0x06, 0x06, 0x08, 0x08, 0x06, 0x06, - 0x00, 0x0F, 0x06, 0x06, 0x08, 0x06, 0x08, 0x08, 0x08, 0x06, 0x08, 0x06, 0x06, 0x08, 0x06, 0x08, 0x06, - 0x01, 0x0E, 0x06, 0x08, 0x06, 0x08, 0x06, 0x08, 0x06, 0x08, 0x08, 0x06, 0x08, 0x06, 0x08, 0x06, - 0x02, 0x0C, 0x06, 0x06, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0x07, 0x06, 0x07, 0x06, - 0x04, 0x09, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, - 0x07, 0x04, 0x06, 0x07, 0x07, 0x06, - 0x02, 0x08, 0x07, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x01, 0x06, 0x07, 0x01, 0x07, 0x06, 0x06, 0x06, - 0x02, 0x01, 0x07, - 0x00, 0x00, - 0x00, 0x00, - 0x00, 0x00 -}; -const byte CURSHELP[] = { - // hotspot x and y, uint16 LE - 0x02, 0x00, 0x0B, 0x00, - // byte 1: number of skipped pixels - // byte 2: number of plotted pixels - // then, pixels - 0x04, 0x06, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, - 0x02, 0x0A, 0x24, 0x24, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, 0x20, - 0x01, 0x0C, 0x24, 0x22, 0x22, 0x22, 0x20, 0x20, 0x20, 0x22, 0x22, 0x22, 0x22, 0x20, - 0x00, 0x0E, 0x24, 0x22, 0x22, 0x22, 0x20, 0x00, 0x00, 0x00, 0x24, 0x22, 0x22, 0x22, 0x22, 0x20, - 0x00, 0x0E, 0x24, 0x22, 0x22, 0x22, 0x22, 0x20, 0x00, 0x00, 0x00, 0x24, 0x22, 0x22, 0x22, 0x20, - 0x00, 0x0E, 0x24, 0x22, 0x22, 0x22, 0x22, 0x20, 0x00, 0x00, 0x00, 0x24, 0x22, 0x22, 0x22, 0x20, - 0x01, 0x0D, 0x24, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x24, 0x22, 0x22, 0x22, 0x22, 0x20, - 0x07, 0x06, 0x24, 0x22, 0x22, 0x22, 0x22, 0x20, - 0x05, 0x07, 0x24, 0x22, 0x22, 0x22, 0x22, 0x20, 0x20, - 0x04, 0x05, 0x24, 0x22, 0x22, 0x22, 0x20, - 0x02, 0x07, 0x07, 0x00, 0x24, 0x20, 0x20, 0x20, 0x20, - 0x01, 0x03, 0x07, 0x01, 0x07, - 0x02, 0x07, 0x07, 0x00, 0x00, 0x24, 0x24, 0x24, 0x24, - 0x04, 0x06, 0x24, 0x22, 0x22, 0x22, 0x22, 0x20, - 0x04, 0x06, 0x24, 0x22, 0x22, 0x22, 0x22, 0x20, - 0x05, 0x04, 0x20, 0x20, 0x20, 0x20 -}; -const byte *const CURSORS[10] = { - MOUSE0, MOUSE1, MOUSE2, MOUSE3, CURSEYE, CURSHAND, CURSGET, CURSCLIMB, CURSTALK, CURSHELP -}; - -const int _travelPos[][2] = { - { -1, 0 }, - { 228, 117 }, - { 28, 98 }, - { 161, 140 }, - { 130, 139 }, - { 884, 95 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 41, 185 }, - { 60, 138 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 170, 155 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 108, 95 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 100, 115 }, - { 480, 90 }, - { 154, 63 }, - { 0, 0 }, - { 145, 85 }, - { 0, 0 }, - { 110, 107 }, - { 0, 0 }, - { 105, 154 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 20, 160 }, - { 130, 314 }, - { 0, 0 }, - { 50, 125 }, - { 0, 0 }, - { 0, 0 }, - { 123, 123 }, - { -1, 7 }, - { 266, 168 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { -1, 18 }, - { -1, 19 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 203, 160 }, - { 0, 0 }, - { 283, 163 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 180, 165 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 } -}; - const int OVEROFFR[] = { 2, 2, 1, 2, 2, 1, 0, 0, 0 }; const int OVEROFFL[] = { 2, 2, 1, 2, 2, 1, 0, 0, 0 }; const int OVEROFFU[] = { 1, 1, 1, 1, 1, 1, 0, 0, 0 }; @@ -408,1528 +108,6 @@ const int OVEROFFULY[] = { 1, 0, 0, 2, 1, 0, 0, 0, 0 }; const int OVEROFFDLX[] = { 1, 2, 1, 1, 2, 1, 0, 0, 0 }; const int OVEROFFDLY[] = { 0, 1, 0, 0, 1, 1, 0, 0, 0 }; -const byte CREDITS[] = { - 0x2, 0xFF, 0xFF, 0x61, 0x0, 0x3, 0x0, 0x30, 0x22, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0xFF, 0xFF, - 0x0, 0x0, 0xFF, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -}; - -const byte ALLISTER[] = { - 0x0, 0xFF, 0xFF, 0x61, 0x0, 0x0, 0x0, 0x36, 0x0F, 0x5E, 0x4, 0x0, 0x0, - 0x0, 0x4, 0x4, 0x0, 0x3, 0x0, 0xFF, 0x4, 0x0, 0x2, 0x0, 0x4, 0x0, 0x1, 0x0, 0x8C, - 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x0, 0x0, 0x0, - 0x1, 0x0, 0x62, 0x0, 0x0B, 0x0, 0x1, 0x0, 0x62, 0x0, 0x0C, 0x0, 0x1, 0x0, 0x62, - 0x0, 0x0D, 0x0, 0x1, 0x0, 0xFF, 0xFF -}; - -const byte HALL[] = { - 0x0, 0xFF, 0xFF, 0x61, 0x0, 0x0, 0x0, 0x40, 0x3E, 0x1A, 0x5, 0x0, 0x0, - 0x0, 0x5, 0x5, 0x0, 0x3, 0x0, 0xFF, 0x5, 0x0, 0x2, 0x0, 0x5, 0x0, 0x1, 0x0, 0xFF, - 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x0, 0x0, - 0x0, 0x2, 0x0, 0x62, 0x0, 0x0D, 0x0, 0x1, 0x0, 0x62, 0x0, 0x13, 0x0, 0x1, 0x0, - 0x62, 0x0, 0x14, 0x0, 0x2, 0x0, 0x62, 0x0, 0x4, 0x0, 0x1, 0x0, 0xFF, 0xFF -}; - -const byte JASONLAB[] = { - 0x1, 0x6, 0x0, 0x61, 0x0, 0x0D, 0x0, 0x40, 0x20, 0x0C4, 0x6, 0x0, 0x0, 0x0, - 0x6, 0x6, 0x0, 0x3, 0x0, 0xFF, 0x6, 0x0, 0x2, 0x0, 0x6, 0x0, 0x1, 0x0, 0xFF, 0x0, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x62, 0x0, 0x1, 0x0, 0x1, 0x0, 0x62, 0x0, 0x2, 0x0, 0x1, 0x0, 0x62, 0x0, 0x3, - 0x0, 0x2, 0x0, 0x62, 0x0, 0x26, 0x0, 0x1, 0x0, 0x62, 0x0, 0x0D, 0x0, 0x1, 0x0, - 0x62, 0x0, 0x35, 0x0, 0x2, 0x0, 0xFF, 0xFF -}; - -const byte ALLENLAB[] = { - 0x1, 0x8, 0x0, 0x61, 0x0, 0x0D, 0x0, 0x40, 0x20, 0x0C4, 0x8, 0x0, 0x0, 0x0, - 0x8, 0x8, 0x0, 0x3, 0x0, 0xFF, 0x8, 0x0, 0x2, 0x0, 0x8, 0x0, 0x1, 0x0, 0xFF, 0x0, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x62, 0x0, 0x7, 0x0, 0x1, 0x0, 0x62, 0x0, 0x8, 0x0, 0x2, 0x0, 0x62, 0x0, 0x9, - 0x0, 0x1, 0x0, 0x62, 0x0, 0x0A, 0x0, 0x1, 0x0, 0x62, 0x0, 0x0D, 0x0, 0x1, 0x0, - 0xFF, 0xFF -}; - -const byte OUTVAULT[] = { - 0x0, 0x9, 0x0, 0x61, 0x0, 0x2B, 0x0, 0x30, 0x18, 0x9B, 0x9, 0x0, 0x0, 0x0, - 0x9, 0x9, 0x0, 0x3, 0x0, 0xFF, 0x9, 0x0, 0x2, 0x0, 0x9, 0x0, 0x1, 0x0, 0x0B4, 0x10, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x0, 0x0, 0x0, 0x3, - 0x0, 0x62, 0x0, 0x4, 0x0, 0x1, 0x0, 0x62, 0x0, 0x5, 0x0, 0x2, 0x0, 0x62, 0x0, 0x6, - 0x0, 0x2, 0x0, 0x62, 0x0, 0x36, 0x0, 0x1, 0x0, 0x62, 0x0, 0x47, 0x0, 0x1, 0x0, - 0xFF, 0xFF -}; - -const byte VAULT[] = { - 0x0, 0xFF, 0xFF, 0x61, 0x0, 0x29, 0x0, 0x40, 0x3A, 0x37, 0x0A, 0x0, - 0x0, 0x0, 0x0A, 0x0A, 0x0, 0x3, 0x0, 0xFF, 0x0A, 0x0, 0x2, 0x0, 0x0A, 0x0, - 0x1, 0x0, 0xFF, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x62, 0x0, 0x37, 0x0, 0x2, 0x0, 0x62, 0x0, 0x39, 0x0, - 0x1, 0x0, 0x62, 0x0, 0x38, 0x0, 0x2, 0x0, 0x62, 0x0, 0x15, 0x0, 0x2, 0x0, 0xFF, - 0xFF -}; - -const byte LIBRARY[] = { - 0x1, 0xFF, 0xFF, 0x61, 0x0, 0x0C, 0x0, 0x40, 0x3A, 0x22, 0x0B, 0x0, - 0x0, 0x0, 0x0B, 0x0B, 0x0, 0x3, 0x0, 0xFF, 0x0B, 0x0, 0x2, 0x0, 0x0B, 0x0, - 0x1, 0x0, 0xFF, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x62, 0x0, 0x1, 0x0, 0x1, 0x0, 0xFF, 0xFF, -}; - -const byte JASAPT[] = { - 0x1, 0x0C, 0x0, 0x61, 0x0, 0x19, 0x0, 0x40, 0x30, 0x14, 0x0C, 0x0, 0x0, - 0x0, 0x0C, 0x0C, 0x0, 0x3, 0x0, 0xFF, 0x0C, 0x0, 0x2, 0x0, 0x0C, 0x0, 0x1, - 0x0, 0xFF, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, - 0x0, 0x18, 0x0, 0x2, 0x0, 0x62, 0x0, 0x17, 0x0, 0x1, 0x0, 0x62, 0x0, 0x11, - 0x0, 0x1, 0x0, 0x62, 0x0, 0x0D, 0x0, 0x1, 0x0, 0xFF, 0xFF -}; - -const byte RANSACKED[] = { - 0x1, 0x0D, 0x0, 0x61, 0x0, 0x2D, 0x0, 0x40, 0x36, 0x2C, 0x0D, 0x0, 0x0, - 0x0, 0x0D, 0x0D, 0x0, 0x3, 0x0, 0xFF, 0x0D, 0x0, 0x2, 0x0, 0x0D, 0x0, 0x1, - 0x0, 0xFF, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, - 0x0, 0x17, 0x0, 0x1, 0x0, 0xFF, 0xFF -}; - -const byte MEAN1[] = { - 0x1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0x3E, 0x33, - 0xFF, 0xFF, 0x0, 0x0, 0xFF, 0x0E, 0x0, 0x5, 0x0, 0x0E, 0x0, 0x4, 0x0, - 0xFF, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -}; - -const byte FLYSOUTH[] = { - 0x1, 0xFF, 0xFF, 0x61, 0x0, 0x10, 0x0, 0x28, 0x0C, 0x5E, 0x0F, 0x0, - 0x0, 0x0, 0x0F, 0x0F, 0x0, 0x2, 0x0, 0xFF, 0x0F, 0x0, 0x1, 0x0, 0xFF, 0xFF, - 0x1, 0x0, 0xFF, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, - 0x0, 0x44, 0x0, 0x1, 0x0, 0xFF, 0xFF -}; - -const byte CUZCO[] = { - 0x2, 0x10, 0x0, 0x61, 0x0, 0x10, 0x0, 0x40, 0x20, 0x30, 0x10, 0x0, 0x0, - 0x0, 0x10, 0x10, 0x0, 0x3, 0x0, 0xFF, 0x10, 0x0, 0x2, 0x0, 0x10, 0x0, 0x1, - 0x0, 0x6E, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, - 0x0, 0x0, 0x0, 0x2, 0x0, 0x62, 0x0, 0x44, 0x0, 0x1, 0x0, 0xFF, 0xFF -}; - -const byte INAIR[] = { - 0x1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x28, 0x19, 0x2B, - 0x11, 0x0, 0x0, 0x0, 0x11, 0x11, 0x0, 0x3, 0x0, 0xFF, 0x11, 0x0, 0x2, 0x0, - 0x11, 0x0, 0x1, 0x0, 0xFF, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF -}; - -const byte GREENMONKEY[] = { - 0x1, 0xFF, 0xFF, 0x61, 0x0, 0x11, 0x0, 0x2D, 0x14, 0x3C, 0x12, 0x0, - 0x0, 0x0, 0x12, 0x12, 0x0, 0x3, 0x0, 0xFF, 0x12, 0x0, 0x2, 0x0, 0x12, 0x0, - 0x1, 0x0, 0xFF, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -}; - -const byte INPLANE[] = { - 0x2, 0x13, 0x0, 0x61, 0x0, 0x26, 0x0, 0x2D, 0x28, 0x28, 0x13, 0x0, 0x0, - 0x0, 0x13, 0x13, 0x0, 0x3, 0x0, 0xFF, 0x13, 0x0, 0x2, 0x0, 0x13, 0x0, 0x1, - 0x0, 0xFF, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x0, 0x0, 0x0, - 0x2, 0x0, 0x62, 0x0, 0x29, 0x0, 0x2, 0x0, 0x62, 0x0, 0x1F, 0x0, 0x1, 0x0, - 0x62, 0x0, 0x38, 0x0, 0x2, 0x0, 0x62, 0x0, 0x33, 0x0, 0x1, 0x0, 0xFF, 0xFF -}; - -const byte PILFALL[] = { - 0x1, 0xFF, 0xFF, 0x61, 0x0, 0x16, 0x0, 0x28, 0x0C, 0x5E, 0x14, 0x0, - 0x0, 0x0, 0x14, 0x14, 0x0, 0x2, 0x0, 0xFF, 0x14, 0x0, 0x1, 0x0, 0xFF, 0xFF, - 0x1, 0x0, 0xFF, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, - 0x0, 0x3A, 0x0, 0x1, 0x0, 0xFF, 0xFF -}; - -const byte COCKPIT[] = { - 0x1, 0xFF, 0xFF, 0x61, 0x0, 0x12, 0x0, 0x3C, 0x2A, 0x29, 0x15, 0x0, - 0x0, 0x0, 0x15, 0x15, 0x0, 0x3, 0x0, 0xFF, 0x15, 0x0, 0x2, 0x0, 0x15, 0x0, - 0x1, 0x0, 0xFF, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, - 0x0, 0x23, 0x0, 0x1, 0x0, 0xFF, 0xFF -}; - -const byte CRASH[] = { - 0x1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0x2D, 0x64, - 0x16, 0x0, 0x0, 0x0, 0xFF, 0x16, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0x0, 0x0, - 0xFF, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0x16, 0x0, 0x2, 0x0, 0xFF, - 0xFF, 0x62, 0x0, 0x2A, 0x0, 0x1, 0x0, 0xFF, 0xFF -}; - -const byte SINKING[] = { - 0x2, 0xFF, 0xFF, 0x61, 0x0, 0x14, 0x0, 0x40, 0x3C, 0x19, 0x17, 0x0, - 0x0, 0x0, 0x17, 0x17, 0x0, 0x3, 0x0, 0xFF, 0x17, 0x0, 0x2, 0x0, 0x17, 0x0, - 0x1, 0x0, 0xFF, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x62, 0x0, 0x48, 0x0, 0x1, 0x0, 0x62, 0x0, 0x17, 0x0, - 0x1, 0x0, 0xFF, 0xFF -}; - -const byte JNGLWLK[] = { - 0x2, 0xFF, 0xFF, 0x61, 0x0, 0x17, 0x0, 0x40, 0x3F, 0x5A, 0x18, 0x0, - 0x0, 0x0, 0x18, 0x18, 0x0, 0x2, 0x0, 0xFF, 0x18, 0x0, 0x1, 0x0, 0xFF, 0xFF, - 0x0, 0x0, 0x0DC, 0x0A0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x62, 0x0, 0x0, 0x0, 0x1, 0x0, 0xFF, 0xFF -}; - -const byte TOWN[] = { - 0x2, 0x19, 0x0, 0x61, 0x0, 0x18, 0x0, 0x3E, 0x32, 0x80, 0x19, 0x0, 0x0, - 0x0, 0x19, 0x19, 0x0, 0x3, 0x0, 0xFF, 0x19, 0x0, 0x2, 0x0, 0x19, 0x0, 0x1, - 0x0, 0x64, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x62, 0x0, 0x3D, 0x0, 0x1, 0x0, 0x62, 0x0, 0x3B, 0x0, - 0x2, 0x0, 0xFF, 0xFF -}; - -const byte HOTEL[] = { - 0x1, 0xFF, 0xFF, 0x61, 0x0, 0x19, 0x0, 0x34, 0x28, 0x28, 0x1A, 0x0, - 0x0, 0x0, 0x1A, 0x1A, 0x0, 0x3, 0x0, 0xFF, 0x1A, 0x0, 0x2, 0x0, 0x1A, 0x0, - 0x1, 0x0, 0xFF, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, - 0x0, 0x28, 0x0, 0x1, 0x0, 0x62, 0x0, 0x2B, 0x0, 0x1, 0x0, 0x62, 0x0, 0x46, - 0x0, 0x2, 0x0, 0x62, 0x0, 0x45, 0x0, 0x1, 0x0, 0x62, 0x0, 0x0E, 0x0, 0x1, 0x0, - 0xFF, 0xFF -}; - -const byte CANTINA[] = { - 0x2, 0xFF, 0xFF, 0x61, 0x0, 0x27, 0x0, 0x40, 0x3A, 0x6C, 0x1B, 0x0, - 0x0, 0x0, 0x1B, 0x1B, 0x0, 0x3, 0x0, 0xFF, 0x1B, 0x0, 0x2, 0x0, 0x1B, 0x0, - 0x1, 0x0, 0x0C8, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, - 0x0, 0x0, 0x0, 0x1, 0x0, 0xFF, 0xFF -}; - -const byte MASSACRE[] = { - 0x2, 0x1D, 0x0, 0x61, 0x0, 0x32, 0x0, 0x20, 0x18, 0x73, 0x1D, 0x0, 0x0, - 0x0, 0x1D, 0x1D, 0x0, 0x3, 0x0, 0xFF, 0x1D, 0x0, 0x2, 0x0, 0x1D, 0x0, 0x1, - 0x0, 0x96, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x62, 0x0, 0x0C, 0x0, 0x1, 0x0, 0x62, 0x0, 0x3, 0x0, 0x2, - 0x0, 0x62, 0x0, 0x49, 0x0, 0x2, 0x0, 0x62, 0x0, 0x4A, 0x0, 0x2, 0x0, 0xFF, 0xFF -}; - -const byte TRADE[] = { - 0x1, 0xFF, 0xFF, 0x61, 0x0, 0x18, 0x0, 0x3F, 0x1C, 0x27, 0x1E, 0x0, - 0x0, 0x0, 0x1E, 0x1E, 0x0, 0x3, 0x0, 0xFF, 0x1E, 0x0, 0x2, 0x0, 0x1E, 0x0, - 0x1, 0x0, 0xFF, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -}; - -const byte BRIDGE[] = { - 0x2, 0x1F, 0x0, 0x61, 0x0, 0x1B, 0x0, 0x40, 0x3F, 0x78, 0x1F, 0x0, 0x0, - 0x0, 0x1F, 0x1F, 0x0, 0x3, 0x0, 0xFF, 0x1F, 0x0, 0x2, 0x0, 0x1F, 0x0, 0x1, - 0x0, 0xFF, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, - 0x0, 0x0, 0x0, 0x2, 0x0, 0x62, 0x0, 0x1F, 0x0, 0x1, 0x0, 0xFF, 0xFF -}; - -const byte DOCK[] = { - 0x1, 0xFF, 0xFF, 0x61, 0x0, 0x1E, 0x0, 0x40, 0x3B, 0x4B, 0x20, 0x0, - 0x0, 0x0, 0xFF, 0x20, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0x1, 0x0, 0xFF, 0x0, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -}; - -const byte DRIVER[] = { - 0x1, 0x21, 0x0, 0x61, 0x0, 0x28, 0x0, 0x30, 0x10, 0x51, 0x21, 0x0, 0x0, - 0x0, 0x21, 0x21, 0x0, 0x2, 0x0, 0xFF, 0x21, 0x0, 0x1, 0x0, 0xFF, 0xFF, - 0x0, 0x0, 0xFF, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, - 0x0, 0x2E, 0x0, 0x1, 0x0, 0x62, 0x0, 0x2F, 0x0, 0x1, 0x0, 0xFF, 0xFF -}; - -const byte SHORE[] = { - 0x2, 0x24, 0x0, 0x61, 0x0, 0x4, 0x0, 0x3E, 0x3A, 0x32, 0x24, 0x0, 0x0, 0x0, - 0x24, 0x24, 0x0, 0x3, 0x0, 0xFF, 0x24, 0x0, 0x2, 0x0, 0x24, 0x0, 0x1, 0x0, - 0x0B4, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x0, - 0x2D, 0x0, 0x2, 0x0, 0x62, 0x0, 0x1F, 0x0, 0x1, 0x0, 0x62, 0x0, 0x2E, 0x0, - 0x1, 0x0, 0x62, 0x0, 0x2F, 0x0, 0x1, 0x0, 0xFF, 0xFF -}; - -const byte BOAT[] = { - 0x3, 0xFF, 0xFF, 0x61, 0x0, 0x8, 0x0, 0x3F, 0x3F, 0xFF, 0x25, 0x0, - 0x0, 0x0, 0x25, 0x25, 0x0, 0x3, 0x0, 0xFF, 0x25, 0x0, 0x2, 0x0, 0x25, 0x0, - 0x1, 0x0, 0xFF, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x62, 0x0, 0x0, 0x0, 0x2, 0x0, 0x62, 0x0, 0x21, 0x0, 0x1, 0x0, 0x62, 0x0, 0x25, - 0x0, 0x1, 0x0, 0x62, 0x0, 0x1F, 0x0, 0x1, 0x0, 0x62, 0x0, 0x30, 0x0, 0x1, 0x0, - 0x62, 0x0, 0x32, 0x0, 0x1, 0x0, 0xFF, 0xFF -}; - -const byte CABIN[] = { - 0x1, 0xFF, 0xFF, 0x61, 0x0, 0x8, 0x0, 0x40, 0x32, 0x50, 0x26, 0x0, - 0x0, 0x0, 0x26, 0x26, 0x0, 0x3, 0x0, 0xFF, 0x26, 0x0, 0x2, 0x0, 0x26, 0x0, - 0x1, 0x0, 0xFF, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x62, 0x0, 0x22, 0x0, 0x2, 0x0, 0x62, 0x0, 0x31, 0x0, - 0x1, 0x0, 0xFF, 0xFF -}; - -const byte CAPTIVE[] = { - 0x2, 0x27, 0x0, 0x61, 0x0, 0x9, 0x0, 0x40, 0x3F, 0x37, 0x27, 0x0, 0x0, 0x0, - 0x27, 0x27, 0x0, 0x3, 0x0, 0xFF, 0x27, 0x0, 0x2, 0x0, 0x27, 0x0, 0x1, 0x0, - 0xFF, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x0, - 0x0, 0x0, 0x4, 0x0, 0x62, 0x0, 0x1B, 0x0, 0x3, 0x0, 0x62, 0x0, 0x1C, 0x0, 0x1, - 0x0, 0x62, 0x0, 0x1F, 0x0, 0x2, 0x0, 0x62, 0x0, 0x23, 0x0, 0x1, 0x0, 0x62, - 0x0, 0x32, 0x0, 0x1, 0x0, 0x62, 0x0, 0x33, 0x0, 0x1, 0x0, 0xFF, 0xFF -}; - -const byte VILLAGE[] = { - 0x2, 0x2A, 0x0, 0x61, 0x0, 0x2E, 0x0, 0x1E, 0x1B, 0x6E, 0x2A, 0x0, 0x0, - 0x0, 0x2A, 0x2A, 0x0, 0x3, 0x0, 0xFF, 0x2A, 0x0, 0x2, 0x0, 0x2A, 0x0, 0x1, - 0x0, 0x0A5, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, - 0x0, 0x2D, 0x0, 0x3, 0x0, 0x62, 0x0, 0x3F, 0x0, 0x1, 0x0, 0x62, 0x0, 0x40, - 0x0, 0x2, 0x0, 0xFF, 0xFF -}; - -const byte TREE[] = { - 0x2, 0x2C, 0x0, 0x61, 0x0, 0x31, 0x0, 0x1E, 0x1D, 0x0BE, 0x2C, 0x0, 0x0, - 0x0, 0x2C, 0x2C, 0x0, 0x3, 0x0, 0xFF, 0x2C, 0x0, 0x2, 0x0, 0x2C, 0x0, 0x1, - 0x0, 0x50, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, - 0x0, 0x0, 0x0, 0x2, 0x0, 0x62, 0x0, 0x2E, 0x0, 0x1, 0x0, 0x62, 0x0, 0x2F, 0x0, - 0x1, 0x0, 0x62, 0x0, 0x4, 0x0, 0x1, 0x0, 0x62, 0x0, 0x42, 0x0, 0x1, 0x0, 0xFF, - 0xFF -}; - -const byte CANOE[] = { - 0x1, 0x2D, 0x0, 0x61, 0x0, 0x2F, 0x0, 0x1E, 0x1D, 0x78, 0x2D, 0x0, 0x0, - 0x0, 0x2D, 0x2D, 0x0, 0x3, 0x0, 0xFF, 0x2D, 0x0, 0x2, 0x0, 0x2D, 0x0, 0x1, - 0x0, 0xFF, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, - 0x0, 0x40, 0x0, 0x3, 0x0, 0x62, 0x0, 0x41, 0x0, 0x2, 0x0, 0x62, 0x0, 0x2E, - 0x0, 0x2, 0x0, 0x62, 0x0, 0x2F, 0x0, 0x2, 0x0, 0x62, 0x0, 0x16, 0x0, 0x1, 0x0, - 0xFF, 0xFF -}; - -const byte INTREE[] = { - 0x1, 0xFF, 0xFF, 0x61, 0x0, 0x33, 0x0, 0x28, 0x1E, 0x32, 0x2E, 0x0, - 0x0, 0x0, 0x2E, 0x2E, 0x0, 0x3, 0x0, 0xFF, 0x2E, 0x0, 0x2, 0x0, 0x2E, 0x0, - 0x1, 0x0, 0x0F0, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -}; - -const byte FALLS[] = { - 0x1, 0xFF, 0xFF, 0x61, 0x0, 0x3B, 0x0, 0x28, 0x1E, 0x32, 0x2F, 0x0, - 0x0, 0x0, 0x2F, 0x2F, 0x0, 0x3, 0x0, 0xFF, 0x2F, 0x0, 0x2, 0x0, 0x2F, 0x0, - 0x1, 0x0, 0xFF, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, - 0x0, 0x4, 0x0, 0x1, 0x0, 0x62, 0x0, 0x2A, 0x0, 0x1, 0x0, 0xFF, 0xFF -}; - -const byte WATERFALL[] = { - 0x1, 0x36, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0x28, 0x1E, 0x6E, 0x36, - 0x0, 0x0, 0x0, 0x36, 0x36, 0x0, 0x3, 0x0, 0xFF, 0x36, 0x0, 0x2, 0x0, 0x36, - 0x0, 0x1, 0x0, 0xFF, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0x36, 0x0, 0x4, - 0x0, 0xFF, 0xFF, 0x62, 0x0, 0x1F, 0x0, 0x1, 0x0, 0xFF, 0xFF -}; - -const byte INWATER[] = { - 0x2, 0xFF, 0xFF, 0x61, 0x0, 0x36, 0x0, 0x40, 0x3F, 0x2A, 0x37, 0x0, - 0x0, 0x0, 0x37, 0x37, 0x0, 0x3, 0x0, 0xFF, 0x37, 0x0, 0x2, 0x0, 0x37, 0x0, - 0x1, 0x0, 0xFF, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x62, 0x0, 0x38, 0x0, 0x1, 0x0, 0xFF, 0xFF -}; - -const byte CAVE[] = { - 0x2, 0x39, 0x0, 0x61, 0x0, 0x37, 0x0, 0x32, 0x14, 0x73, 0x39, 0x0, 0x0, - 0x0, 0x39, 0x39, 0x0, 0x3, 0x0, 0xFF, 0x39, 0x0, 0x2, 0x0, 0x39, 0x0, 0x1, - 0x0, 0x0B4, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x62, 0x0, 0x1F, 0x0, 0x1, 0x0, 0x62, 0x0, 0x4B, 0x0, - 0x2, 0x0, 0x62, 0x0, 0x4C, 0x0, 0x2, 0x0, 0xFF, 0xFF -}; - -const byte PIT[] = { - 0x2, 0xFF, 0xFF, 0x61, 0x0, 0x38, 0x0, 0x41, 0x3F, 0x19, 0x3D, 0x0, - 0x0, 0x0, 0x3D, 0x3D, 0x0, 0x3, 0x0, 0x3E, 0x3D, 0x0, 0x4, 0x0, 0xFF, 0x3D, - 0x0, 0x2, 0x0, 0x3D, 0x0, 0x1, 0x0, 0x0BE, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x62, 0x0, 0x0, 0x0, 0x2, 0x0, 0x62, 0x0, 0x27, 0x0, 0x1, 0x0, - 0x62, 0x0, 0x4D, 0x0, 0x2, 0x0, 0xFF, 0xFF, 0x0 -}; - -const byte *const ROOM_TABLE[] = { - CREDITS, nullptr, nullptr, nullptr, ALLISTER, HALL, JASONLAB, nullptr, - ALLENLAB, OUTVAULT, VAULT, LIBRARY, JASAPT, RANSACKED, MEAN1, FLYSOUTH, - CUZCO, INAIR, GREENMONKEY, INPLANE, PILFALL, COCKPIT, CRASH, SINKING, - JNGLWLK, TOWN, HOTEL, CANTINA, nullptr, MASSACRE, TRADE, BRIDGE, DOCK, - DRIVER, nullptr, nullptr, SHORE, BOAT, CABIN, CAPTIVE, nullptr, - nullptr, VILLAGE, nullptr, TREE, CANOE, INTREE, FALLS, nullptr, - nullptr, nullptr, nullptr, nullptr, nullptr, WATERFALL, INWATER, nullptr, - CAVE, nullptr, nullptr, nullptr, PIT, nullptr, nullptr -}; - -const char *const ROOM_DESCR[] = { - "Credits", nullptr, nullptr, nullptr, "Outside of Allister Center", - "Hall", "Jason's Lab", nullptr, "Allen's Lab", "Outside of the Vault", - "Inside the Vault", "Reader", "Jason's Apartment", "Jason's ransacked apartment", "Cutscene 1", - "TBD FLYSOUTH", "Cuzco Airport", "TBD INAIR", "Green Monkey Club", "In Plane", - "TBD PILFALL", "TBD COCKPIT", "TBD CRASH", "TBD SINKING", "Cutscene Jungle Walk", - "TBD TOWN", "TBD HOTEL", "TBD CANTINA", nullptr, "TBD MASSACRE", - "TBD TRADE", "TBD BRIDGE", "TBD DOCK", "TBD DRIVER", nullptr, - nullptr, "TBD SHORE", "TBD BOAT", "TBD CABIN", "TBD CAPTIVE", - nullptr, nullptr, "TBD VILLAGE", nullptr, "TBD TREE", - "TBD CANOE", "TBD INTREE", "TBD FALLS", nullptr, nullptr, - nullptr, nullptr, nullptr, nullptr, "TBD WATERFALL", - "TBD INWATER", nullptr, "Cave Bridge", nullptr, nullptr, - nullptr, "Pit with Ants", nullptr, nullptr -}; - -const byte ROOM_TABLE1_DEMO[] = { - 0x02, 0x61, 0x00, 0x03, 0x00, 0x30, 0x22, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -}; - -const byte ROOM_TABLE5_DEMO[] = { - 0x00, 0x61, 0x00, 0x0E, 0x00, 0x36, 0x0F, 0x5E, 0x04, 0x00, - 0x00, 0x00, 0x04, 0x04, 0x00, 0x03, 0x00, 0xFF, 0x04, 0x00, - 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x8C, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x62, 0x00, 0x0B, 0x00, 0x01, 0x00, 0x62, 0x00, 0x0C, 0x00, - 0x01, 0x00, 0x62, 0x00, 0x0D, 0x00, 0x01, 0x00, 0xFF, 0xFF -}; - -const byte ROOM_TABLE6_DEMO[] = { - 0x00, 0x61, 0x00, 0x0E, 0x00, 0x40, 0x3E, 0x1A, 0x05, 0x00, - 0x00, 0x00, 0x05, 0x05, 0x00, 0x03, 0x00, 0xFF, 0x05, 0x00, - 0x02, 0x00, 0x05, 0x00, 0x01, 0x00, 0xFF, 0x30, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x62, 0x00, 0x12, 0x00, 0x03, 0x00, 0x62, 0x00, 0x13, 0x00, - 0x01, 0x00, 0x62, 0x00, 0x14, 0x00, 0x02, 0x00, 0x62, 0x00, - 0x04, 0x00, 0x01, 0x00, 0xFF, 0xFF -}; - -const byte ROOM_TABLE7_DEMO[] = { - 0x01, 0x61, 0x00, 0x0D, 0x00, 0x40, 0x20, 0xC4, 0x06, 0x00, - 0x00, 0x00, 0x06, 0x06, 0x00, 0x03, 0x00, 0xFF, 0x06, 0x00, - 0x02, 0x00, 0x06, 0x00, 0x01, 0x00, 0xFF, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x62, 0x00, 0x01, 0x00, 0x01, 0x00, 0x62, 0x00, 0x02, 0x00, - 0x01, 0x00, 0x62, 0x00, 0x03, 0x00, 0x02, 0x00, 0x62, 0x00, - 0x26, 0x00, 0x01, 0x00, 0xFF, 0xFF -}; - -const byte ROOM_TABLE9_DEMO[] = { - 0x01, 0x61, 0x00, 0x0D, 0x00, 0x40, 0x20, 0xC4, 0x08, 0x00, - 0x00, 0x00, 0x08, 0x08, 0x00, 0x03, 0x00, 0xFF, 0x08, 0x00, - 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 0xFF, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x62, 0x00, 0x07, 0x00, 0x01, 0x00, 0x62, 0x00, 0x08, 0x00, - 0x02, 0x00, 0x62, 0x00, 0x09, 0x00, 0x01, 0x00, 0x62, 0x00, - 0x0A, 0x00, 0x01, 0x00, 0xFF, 0xFF -}; - -const byte ROOM_TABLE10_DEMO[] = { - 0x00, 0x61, 0x00, 0x0E, 0x00, 0x30, 0x18, 0x9B, 0x09, 0x00, - 0x00, 0x00, 0x09, 0x09, 0x00, 0x03, 0x00, 0xFF, 0x09, 0x00, - 0x02, 0x00, 0x09, 0x00, 0x01, 0x00, 0xB4, 0x10, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x00, 0x00, 0x00, 0x03, 0x00, - 0x62, 0x00, 0x04, 0x00, 0x01, 0x00, 0x62, 0x00, 0x05, 0x00, - 0x02, 0x00, 0x62, 0x00, 0x06, 0x00, 0x02, 0x00, 0xFF, 0xFF -}; - -const byte ROOM_TABLE11_DEMO[] = { - 0x01, 0x61, 0x00, 0x0E, 0x00, 0x40, 0x30, 0x14, 0x0A, 0x00, - 0x00, 0x00, 0x0A, 0x0A, 0x00, 0x03, 0x00, 0xFF, 0x0A, 0x00, - 0x02, 0x00, 0x0A, 0x00, 0x01, 0x00, 0xFF, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x62, 0x00, 0x15, 0x00, 0x01, 0x00, 0x62, 0x00, 0x16, 0x00, - 0x01, 0x00, 0xFF, 0xFF -}; - -const byte ROOM_TABLE12_DEMO[] = { - 0x01, 0x61, 0x00, 0x0E, 0x00, 0x40, 0x3A, 0x22, 0x0B, 0x00, - 0x00, 0x00, 0x0B, 0x0B, 0x00, 0x03, 0x00, 0xFF, 0x0B, 0x00, - 0x02, 0x00, 0x0B, 0x00, 0x01, 0x00, 0xFF, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x62, 0x00, 0x01, 0x00, 0x01, 0x00, 0xFF, 0xFF -}; - -const byte ROOM_TABLE13_DEMO[] = { - 0x01, 0x61, 0x00, 0x08, 0x00, 0x40, 0x30, 0x14, 0x0C, 0x00, - 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0x00, 0xFF, 0x0C, 0x00, - 0x02, 0x00, 0x0C, 0x00, 0x01, 0x00, 0xFF, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x00, 0x18, 0x00, 0x02, 0x00, - 0x62, 0x00, 0x17, 0x00, 0x01, 0x00, 0x62, 0x00, 0x11, 0x00, - 0x01, 0x00, 0xFF, 0xFF -}; - -const byte ROOM_TABLE14_DEMO[] = { - 0x01, 0x61, 0x00, 0x0D, 0x00, 0x40, 0x36, 0x2C, 0x0D, 0x00, - 0x00, 0x00, 0x0D, 0x0D, 0x00, 0x03, 0x00, 0xFF, 0x0D, 0x00, - 0x02, 0x00, 0x0D, 0x00, 0x01, 0x00, 0xFF, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -}; - -const byte ROOM_TABLE15_DEMO[] = { - 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0x3E, 0x33, 0xFF, 0xFF, - 0x00, 0x00, 0xFF, 0x0E, 0x00, 0x05, 0x00, 0x0E, 0x00, 0x04, - 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF -}; - -const byte ROOM_TABLE16_DEMO[] = { - 0x01, 0x61, 0x00, 0x10, 0x00, 0x28, 0x0C, 0x5E, 0x0F, 0x00, - 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x02, 0x00, 0xFF, 0x0F, 0x00, - 0x01, 0x00, 0xFF, 0xFF, 0x01, 0x00, 0xFF, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -}; - -const byte ROOM_TABLE17_DEMO[] = { - 0x02, 0x61, 0x00, 0x10, 0x00, 0x40, 0x20, 0x30, 0x10, 0x00, - 0x00, 0x00, 0x10, 0x10, 0x00, 0x03, 0x00, 0xFF, 0x10, 0x00, - 0x02, 0x00, 0x10, 0x00, 0x01, 0x00, 0x6E, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, - 0xFF, 0xFF -}; - -const byte ROOM_TABLE18_DEMO[] = { - 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x28, 0x19, 0x2B, 0x11, 0x00, - 0x00, 0x00, 0x11, 0x11, 0x00, 0x03, 0x00, 0xFF, 0x11, 0x00, - 0x02, 0x00, 0x11, 0x00, 0x01, 0x00, 0xFF, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -}; - -const byte ROOM_TABLE19_DEMO[] = { - 0x01, 0x61, 0x00, 0x11, 0x00, 0x2D, 0x14, 0x3C, 0x12, 0x00, - 0x00, 0x00, 0x12, 0x12, 0x00, 0x03, 0x00, 0xFF, 0x12, 0x00, - 0x02, 0x00, 0x12, 0x00, 0x01, 0x00, 0xFF, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -}; - -const byte ROOM_TABLE20_DEMO[] = { - 0x02, 0x61, 0x00, 0x12, 0x00, 0x2D, 0x28, 0x28, 0x13, 0x00, - 0x00, 0x00, 0x13, 0x13, 0x00, 0x03, 0x00, 0xFF, 0x13, 0x00, - 0x02, 0x00, 0x13, 0x00, 0x01, 0x00, 0xFF, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x62, 0x00, 0x29, 0x00, 0x01, 0x00, 0x62, 0x00, 0x24, 0x00, - 0x01, 0x00, 0xFF, 0xFF -}; - -const byte ROOM_TABLE21_DEMO[] = { - 0x01, 0x61, 0x00, 0x16, 0x00, 0x28, 0x0C, 0x5E, 0x14, 0x00, - 0x00, 0x00, 0x14, 0x14, 0x00, 0x02, 0x00, 0xFF, 0x14, 0x00, - 0x01, 0x00, 0xFF, 0xFF, 0x01, 0x00, 0xFF, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -}; - -const byte ROOM_TABLE22_DEMO[] = { - 0x01, 0x61, 0x00, 0x12, 0x00, 0x3C, 0x2A, 0x29, 0x15, 0x00, - 0x00, 0x00, 0x15, 0x15, 0x00, 0x03, 0x00, 0xFF, 0x15, 0x00, - 0x02, 0x00, 0x15, 0x00, 0x01, 0x00, 0xFF, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x00, 0x23, 0x00, 0x01, 0x00, - 0xFF, 0xFF -}; - -const byte ROOM_TABLE23_DEMO[] = { - 0x01, 0x61, 0x00, 0x13, 0x00, 0x40, 0x2D, 0x64, 0x16, 0x00, - 0x00, 0x00, 0xFF, 0x16, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0x00, - 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x16, 0x00, 0x02, - 0x00, 0xFF, 0xFF, 0x62, 0x00, 0x2A, 0x00, 0x01, 0x00, 0xFF, - 0xFF -}; - -const byte ROOM_TABLE24_DEMO[] = { - 0x02, 0x61, 0x00, 0x14, 0x00, 0x40, 0x3C, 0x19, 0x17, 0x00, - 0x00, 0x00, 0x17, 0x17, 0x00, 0x03, 0x00, 0xFF, 0x17, 0x00, - 0x02, 0x00, 0x17, 0x00, 0x01, 0x00, 0xFF, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, - 0xFF, 0xFF -}; - -const byte ROOM_TABLE25_DEMO[] = { - 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0x3F, 0x5A, 0x18, 0x00, - 0x00, 0x00, 0x18, 0x18, 0x00, 0x02, 0x00, 0xFF, 0x18, 0x00, - 0x01, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xDC, 0xA0, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, - 0xFF, 0xFF -}; - -const byte ROOM_TABLE26_DEMO[] = { - 0x02, 0x61, 0x00, 0x17, 0x00, 0x3E, 0x32, 0x80, 0x19, 0x00, - 0x00, 0x00, 0x19, 0x19, 0x00, 0x03, 0x00, 0xFF, 0x19, 0x00, - 0x02, 0x00, 0x19, 0x00, 0x01, 0x00, 0x64, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, - 0xFF, 0xFF -}; - -const byte ROOM_TABLE27_DEMO[] = { - 0x01, 0x61, 0x00, 0x19, 0x00, 0x34, 0x28, 0x28, 0x1A, 0x00, - 0x00, 0x00, 0x1A, 0x1A, 0x00, 0x03, 0x00, 0xFF, 0x1A, 0x00, - 0x02, 0x00, 0x1A, 0x00, 0x01, 0x00, 0xFF, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x00, 0x28, 0x00, 0x01, 0x00, - 0x62, 0x00, 0x2B, 0x00, 0x01, 0x00, 0xFF, 0xFF -}; - -const byte ROOM_TABLE28_DEMO[] = { - 0x02, 0x61, 0x00, 0x18, 0x00, 0x40, 0x3A, 0x6C, 0x1B, 0x00, - 0x00, 0x00, 0x1B, 0x1B, 0x00, 0x03, 0x00, 0xFF, 0x1B, 0x00, - 0x02, 0x00, 0x1B, 0x00, 0x01, 0x00, 0xC8, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, - 0xFF, 0xFF -}; - -const byte ROOM_TABLE30_DEMO[] = { - 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x18, 0x73, 0x1D, 0x00, - 0x00, 0x00, 0x1D, 0x1D, 0x00, 0x03, 0x00, 0xFF, 0x1D, 0x00, - 0x02, 0x00, 0x1D, 0x00, 0x01, 0x00, 0x80, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -}; - -const byte ROOM_TABLE31_DEMO[] = { - 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1C, 0x27, 0x1E, 0x00, - 0x00, 0x00, 0x1E, 0x1E, 0x00, 0x03, 0x00, 0xFF, 0x1E, 0x00, - 0x02, 0x00, 0x1E, 0x00, 0x01, 0x00, 0xFF, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -}; - -const byte ROOM_TABLE32_DEMO[] = { - 0x02, 0x61, 0x00, 0x1B, 0x00, 0x40, 0x10, 0x78, 0x1F, 0x00, - 0x00, 0x00, 0x1F, 0x1F, 0x00, 0x03, 0x00, 0xFF, 0x1F, 0x00, - 0x02, 0x00, 0x1F, 0x00, 0x01, 0x00, 0xFE, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x62, 0x00, 0x1F, 0x00, 0x01, 0x00, 0xFF, 0xFF -}; - -const byte ROOM_TABLE33_DEMO[] = { - 0x01, 0x61, 0x00, 0x1E, 0x00, 0x40, 0x3B, 0x4B, 0x20, 0x00, - 0x00, 0x00, 0x20, 0x20, 0x00, 0x03, 0x00, 0xFF, 0x20, 0x00, - 0x02, 0x00, 0x20, 0x00, 0x01, 0x00, 0xFF, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -}; - -const byte ROOM_TABLE34_DEMO[] = { - 0x01, 0x61, 0x00, 0x04, 0x00, 0x30, 0x10, 0x51, 0x21, 0x00, - 0x00, 0x00, 0x21, 0x21, 0x00, 0x02, 0x00, 0xFF, 0x21, 0x00, - 0x01, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x00, 0x2E, 0x00, 0x01, 0x00, - 0x62, 0x00, 0x2F, 0x00, 0x01, 0x00, 0xFF, 0xFF -}; - -const byte ROOM_TABLE37_DEMO[] = { - 0x02, 0x61, 0x00, 0x04, 0x00, 0x3E, 0x3A, 0x32, 0x24, 0x00, - 0x00, 0x00, 0x24, 0x24, 0x00, 0x03, 0x00, 0xFF, 0x24, 0x00, - 0x02, 0x00, 0x24, 0x00, 0x01, 0x00, 0xB4, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x00, 0x2D, 0x00, 0x02, 0x00, - 0x62, 0x00, 0x1F, 0x00, 0x01, 0x00, 0x62, 0x00, 0x2E, 0x00, - 0x01, 0x00, 0x62, 0x00, 0x2F, 0x00, 0x01, 0x00, 0xFF, 0xFF -}; - -const byte ROOM_TABLE38_DEMO[] = { - 0x03, 0x61, 0x00, 0x08, 0x00, 0x3F, 0x3F, 0xFF, 0x25, 0x00, - 0x00, 0x00, 0x25, 0x25, 0x00, 0x03, 0x00, 0xFF, 0x25, 0x00, - 0x02, 0x00, 0x25, 0x00, 0x01, 0x00, 0xFF, 0x40, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x62, 0x00, 0x21, 0x00, 0x01, 0x00, 0x62, 0x00, 0x25, 0x00, - 0x01, 0x00, 0x62, 0x00, 0x1F, 0x00, 0x01, 0x00, 0x62, 0x00, - 0x30, 0x00, 0x01, 0x00, 0x62, 0x00, 0x32, 0x00, 0x01, 0x00, - 0xFF, 0xFF -}; - -const byte ROOM_TABLE39_DEMO[] = { - 0x01, 0x61, 0x00, 0x08, 0x00, 0x40, 0x32, 0x50, 0x26, 0x00, - 0x00, 0x00, 0x26, 0x26, 0x00, 0x03, 0x00, 0xFF, 0x26, 0x00, - 0x02, 0x00, 0x26, 0x00, 0x01, 0x00, 0xFF, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x62, 0x00, 0x22, 0x00, 0x02, 0x00, 0x62, 0x00, 0x31, 0x00, - 0x01, 0x00, 0xFF, 0xFF -}; - -const byte ROOM_TABLE40_DEMO[] = { - 0x02, 0x61, 0x00, 0x09, 0x00, 0x40, 0x3F, 0x37, 0x27, 0x00, - 0x00, 0x00, 0x27, 0x27, 0x00, 0x03, 0x00, 0xFF, 0x27, 0x00, - 0x02, 0x00, 0x27, 0x00, 0x01, 0x00, 0xFF, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x00, 0x00, 0x00, 0x04, 0x00, - 0x62, 0x00, 0x1B, 0x00, 0x03, 0x00, 0x62, 0x00, 0x1C, 0x00, - 0x01, 0x00, 0x62, 0x00, 0x1F, 0x00, 0x02, 0x00, 0x62, 0x00, - 0x23, 0x00, 0x01, 0x00, 0x62, 0x00, 0x32, 0x00, 0x01, 0x00, - 0xFF, 0xFF -}; - -const byte ROOM_TABLE43_DEMO[] = { - 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0x1E, 0x1B, 0x6E, 0x2A, 0x00, - 0x00, 0x00, 0x2A, 0x2A, 0x00, 0x03, 0x00, 0xFF, 0x2A, 0x00, - 0x02, 0x00, 0x2A, 0x00, 0x01, 0x00, 0xA5, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, - 0xFF, 0xFF -}; - -const byte ROOM_TABLE45_DEMO[] = { - 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0x1E, 0x1D, 0xBE, 0x2C, 0x00, - 0x00, 0x00, 0x2C, 0x2C, 0x00, 0x03, 0x00, 0xFF, 0x2C, 0x00, - 0x02, 0x00, 0x2C, 0x00, 0x01, 0x00, 0x50, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, - 0xFF, 0xFF -}; - -const byte ROOM_TABLE46_DEMO[] = { - 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x1E, 0x1D, 0x78, 0x2D, 0x00, - 0x00, 0x00, 0x2D, 0x2D, 0x00, 0x03, 0x00, 0xFF, 0x2D, 0x00, - 0x02, 0x00, 0x2D, 0x00, 0x01, 0x00, 0xFF, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -}; - -const byte ROOM_TABLE47_DEMO[] = { - 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x28, 0x1E, 0x32, 0x2E, 0x00, - 0x00, 0x00, 0x2E, 0x2E, 0x00, 0x03, 0x00, 0xFF, 0x2E, 0x00, - 0x02, 0x00, 0x2E, 0x00, 0x01, 0x00, 0xF0, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -}; - -const byte ROOM_TABLE48_DEMO[] = { - 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x28, 0x1E, 0x32, 0x2F, 0x00, - 0x00, 0x00, 0x2F, 0x2F, 0x00, 0x03, 0x00, 0xFF, 0x2F, 0x00, - 0x02, 0x00, 0x2F, 0x00, 0x01, 0x00, 0xFF, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -}; - -const byte ROOM_TABLE51_DEMO[] = { - 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x28, 0x1E, 0x32, 0xFF, 0xFF, - 0x00, 0x00, 0xFF, 0x32, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x04, - 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x32, - 0x00, 0x01, 0x00, 0x01, 0x00, 0xFF, 0xFF -}; - -const byte ROOM_TABLE55_DEMO[] = { - 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x28, 0x1E, 0x6E, 0x36, 0x00, - 0x00, 0x00, 0x36, 0x36, 0x00, 0x03, 0x00, 0xFF, 0x36, 0x00, - 0x02, 0x00, 0x36, 0x00, 0x01, 0x00, 0xFF, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0x36, 0x00, 0x04, 0x00, 0xFF, 0xFF, 0xFF, 0xFF -}; - -const byte ROOM_TABLE58_DEMO[] = { - 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0x32, 0x14, 0x73, 0x39, 0x00, - 0x00, 0x00, 0x39, 0x39, 0x00, 0x03, 0x00, 0xFF, 0x39, 0x00, - 0x02, 0x00, 0x39, 0x00, 0x01, 0x00, 0xB4, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, - 0xFF, 0xFF -}; - -const byte ROOM_TABLE62_DEMO[] = { - 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0x3F, 0x19, 0x3D, 0x00, - 0x00, 0x00, 0x3D, 0x3D, 0x00, 0x03, 0x00, 0x3E, 0x3D, 0x00, - 0x04, 0x00, 0xFF, 0x3D, 0x00, 0x02, 0x00, 0x3D, 0x00, 0x01, - 0x00, 0xBE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, - 0x00, 0x00, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0x00 -}; - -const byte *const ROOM_TABLE_DEMO[] = { - ROOM_TABLE1_DEMO, nullptr, nullptr, nullptr, ROOM_TABLE5_DEMO, - ROOM_TABLE6_DEMO, ROOM_TABLE7_DEMO, nullptr, ROOM_TABLE9_DEMO, ROOM_TABLE10_DEMO, - ROOM_TABLE11_DEMO, ROOM_TABLE12_DEMO, ROOM_TABLE13_DEMO, ROOM_TABLE14_DEMO, ROOM_TABLE15_DEMO, - ROOM_TABLE16_DEMO, ROOM_TABLE17_DEMO, ROOM_TABLE18_DEMO, ROOM_TABLE19_DEMO, ROOM_TABLE20_DEMO, - ROOM_TABLE21_DEMO, ROOM_TABLE22_DEMO, ROOM_TABLE23_DEMO, ROOM_TABLE24_DEMO, ROOM_TABLE25_DEMO, - ROOM_TABLE26_DEMO, ROOM_TABLE27_DEMO, ROOM_TABLE28_DEMO, nullptr, ROOM_TABLE30_DEMO, - ROOM_TABLE31_DEMO, ROOM_TABLE32_DEMO, ROOM_TABLE33_DEMO, ROOM_TABLE34_DEMO, nullptr, - nullptr, ROOM_TABLE37_DEMO, ROOM_TABLE38_DEMO, ROOM_TABLE39_DEMO, ROOM_TABLE40_DEMO, - nullptr, nullptr, ROOM_TABLE43_DEMO, nullptr, ROOM_TABLE45_DEMO, - ROOM_TABLE46_DEMO, ROOM_TABLE47_DEMO, ROOM_TABLE48_DEMO, nullptr, nullptr, - ROOM_TABLE51_DEMO, nullptr, nullptr, nullptr, ROOM_TABLE55_DEMO, - nullptr, nullptr, ROOM_TABLE58_DEMO, nullptr, nullptr, - nullptr, ROOM_TABLE62_DEMO, nullptr, nullptr -}; - -const int ROOM_NUMB = 63; - -const byte ELAINE[] = { - 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x0, 0x0, 0x0, 0x0, 0x41, 0x41, 0x0, 0x1, 0x0, 0xFF, 0x41, 0x0, 0x2, - 0x0, 0x41, 0x0, 0x0, 0x0, 0x41, 0x0, 0x3, 0x0, 0x41, 0x0, 0x25, 0x0, 0x41, - 0x0, 0x4, 0x0, 0x41, 0x0, 0x26, 0x0, 0x41, 0x0, 0x5, 0x0, 0x41, 0x0, 0x27, - 0x0, 0x41, 0x0, 0x6, 0x0, 0x41, 0x0, 0x28, 0x0, 0x41, 0x0, 0x7, 0x0, 0x41, - 0x0, 0x29, 0x0, 0x41, 0x0, 0x8, 0x0, 0x41, 0x0, 0x2A, 0x0, 0x41, 0x0, 0x9, - 0x0, 0x41, 0x0, 0x2B, 0x0, 0x41, 0x0, 0x0A, 0x0, 0x41, 0x0, 0x2C, 0x0, 0x41, - 0x0, 0x0B, 0x0, 0x41, 0x0, 0x2D, 0x0, 0x41, 0x0, 0x0C, 0x0, 0x41, 0x0, 0x2E, - 0x0, 0x41, 0x0, 0x0D, 0x0, 0x41, 0x0, 0x2F, 0x0, 0x41, 0x0, 0x0E, 0x0, 0x41, - 0x0, 0x30, 0x0, 0x41, 0x0, 0x0F, 0x0, 0x41, 0x0, 0x31, 0x0, 0x41, 0x0, 0x10, - 0x0, 0x41, 0x0, 0x32, 0x0, 0x41, 0x0, 0x11, 0x0, 0x41, 0x0, 0x33, 0x0, 0x41, - 0x0, 0x12, 0x0, 0x41, 0x0, 0x34, 0x0, 0x41, 0x0, 0x13, 0x0, 0x41, 0x0, 0x35, - 0x0, 0x41, 0x0, 0x14, 0x0, 0x41, 0x0, 0x36, 0x0, 0x41, 0x0, 0x15, 0x0, 0x41, - 0x0, 0x37, 0x0, 0x41, 0x0, 0x16, 0x0, 0x41, 0x0, 0x38, 0x0, 0x41, 0x0, 0x17, - 0x0, 0x41, 0x0, 0x39, 0x0, 0x41, 0x0, 0x18, 0x0, 0x41, 0x0, 0x3A, 0x0, 0x41, - 0x0, 0x19, 0x0, 0x41, 0x0, 0x3B, 0x0, 0x41, 0x0, 0x1A, 0x0, 0x41, 0x0, 0x3C, - 0x0, 0x41, 0x0, 0x1B, 0x0, 0x41, 0x0, 0x3D, 0x0, 0x41, 0x0, 0x1C, 0x0, 0x41, - 0x0, 0x3E, 0x0, 0x41, 0x0, 0x1D, 0x0, 0x41, 0x0, 0x3F, 0x0, 0x41, 0x0, 0x1E, - 0x0, 0x41, 0x0, 0x40, 0x0, 0x41, 0x0, 0x1F, 0x0, 0x41, 0x0, 0x41, 0x0, 0x41, - 0x0, 0x20, 0x0, 0x41, 0x0, 0x42, 0x0, 0x41, 0x0, 0x21, 0x0, 0x41, 0x0, 0x43, - 0x0, 0x41, 0x0, 0x22, 0x0, 0x41, 0x0, 0x44, 0x0, 0x41, 0x0, 0x23, 0x0, 0x41, - 0x0, 0x45, 0x0, 0x41, 0x0, 0x24, 0x0, 0x41, 0x0, 0x46, 0x0, 0xFF, 0xFF -}; - -const byte LIB[] = { - 0x1, 0xFF, 0xFF, 0x42, 0x0, 0x2, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, - 0x0, 0x0, 0x0, 0x0, 0x42, 0x42, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0x2, - 0x0, 0x42, 0x0, 0x0, 0x0, 0x42, 0x0, 0x3, 0x0, 0x42, 0x0, 0x18, 0x0, 0x42, - 0x0, 0x4, 0x0, 0x42, 0x0, 0x19, 0x0, 0x42, 0x0, 0x5, 0x0, 0x42, 0x0, 0x1A, - 0x0, 0x42, 0x0, 0x6, 0x0, 0x42, 0x0, 0x1B, 0x0, 0x42, 0x0, 0x7, 0x0, 0x42, - 0x0, 0x1C, 0x0, 0x42, 0x0, 0x8, 0x0, 0x42, 0x0, 0x1D, 0x0, 0x42, 0x0, 0x9, - 0x0, 0x42, 0x0, 0x1E, 0x0, 0x42, 0x0, 0x0A, 0x0, 0x42, 0x0, 0x1F, 0x0, 0x42, - 0x0, 0x0B, 0x0, 0x42, 0x0, 0x20, 0x0, 0x42, 0x0, 0x0C, 0x0, 0x42, 0x0, 0x21, - 0x0, 0x42, 0x0, 0x0D, 0x0, 0x42, 0x0, 0x22, 0x0, 0x42, 0x0, 0x0E, 0x0, 0x42, - 0x0, 0x23, 0x0, 0x42, 0x0, 0x0F, 0x0, 0x42, 0x0, 0x24, 0x0, 0x42, 0x0, 0x10, - 0x0, 0x42, 0x0, 0x25, 0x0, 0x42, 0x0, 0x11, 0x0, 0x42, 0x0, 0x26, 0x0, 0x42, - 0x0, 0x12, 0x0, 0x42, 0x0, 0x27, 0x0, 0x42, 0x0, 0x13, 0x0, 0x42, 0x0, 0x28, - 0x0, 0x42, 0x0, 0x14, 0x0, 0x42, 0x0, 0x29, 0x0, 0x42, 0x0, 0x15, 0x0, 0x42, - 0x0, 0x2A, 0x0, 0x42, 0x0, 0x16, 0x0, 0x42, 0x0, 0x2B, 0x0, 0x42, 0x0, 0x17, - 0x0, 0x42, 0x0, 0x2C, 0x0, 0xFF, 0xFF -}; - -const byte FLASHBACK[] = { - 0x2, 0x1B, 0x0, 0x1C, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, - 0x0, 0x0, 0x0, 0xFF, 0xFF, 0xFF, 0x26, 0x0, 0x1C, 0x0, 0x0, 0x0, 0x1C, - 0x0, 0x5, 0x0, 0x1C, 0x0, 0x0E, 0x0, 0x1C, 0x0, 0x6, 0x0, 0x1C, 0x0, 0x0F, - 0x0, 0x1C, 0x0, 0x7, 0x0, 0x1C, 0x0, 0x0C, 0x0, 0x1C, 0x0, 0x8, 0x0, 0x1C, - 0x0, 0x0D, 0x0, 0x2, 0x0, 0x1, 0x0, 0x1C, 0x0, 0x10, 0x0, 0x2, 0x0, 0x2, 0x0, 0x1C, - 0x0, 0x11, 0x0, 0x1C, 0x0, 0x9, 0x0, 0x1C, 0x0, 0x12, 0x0, 0x1C, 0x0, 0x0A, - 0x0, 0x1C, 0x0, 0x13, 0x0, 0x1C, 0x0, 0x0B, 0x0, 0x1C, 0x0, 0x14, 0x0, 0x1C, - 0x0, 0x0B, 0x0, 0x1C, 0x0, 0x15, 0x0, 0x1C, 0x0, 0x0B, 0x0, 0x1C, 0x0, 0x16, - 0x0, 0x1C, 0x0, 0x0B, 0x0, 0x1C, 0x0, 0x17, 0x0, 0x1C, 0x0, 0x0B, 0x0, 0x1C, - 0x0, 0x18, 0x0, 0x1C, 0x0, 0x0B, 0x0, 0x1C, 0x0, 0x19, 0x0, 0x1C, 0x0, 0x0B, - 0x0, 0x1C, 0x0, 0x1A, 0x0, 0x1C, 0x0, 0x0B, 0x0, 0x1C, 0x0, 0x1B, 0x0, 0x1C, - 0x0, 0x0B, 0x0, 0x1C, 0x0, 0x1C, 0x0, 0x1C, 0x0, 0x0B, 0x0, 0x1C, 0x0, 0x1D, - 0x0, 0x1C, 0x0, 0x0B, 0x0, 0x1C, 0x0, 0x1E, 0x0, 0x1C, 0x0, 0x0B, 0x0, 0x1C, - 0x0, 0x1F, 0x0, 0x1C, 0x0, 0x0B, 0x0, 0x1C, 0x0, 0x20, 0x0, 0x1C, 0x0, 0x0B, - 0x0, 0x1C, 0x0, 0x21, 0x0, 0x1C, 0x0, 0x0B, 0x0, 0x1C, 0x0, 0x22, 0x0, 0x1C, - 0x0, 0x0B, 0x0, 0x1C, 0x0, 0x23, 0x0, 0x1C, 0x0, 0x0B, 0x0, 0x1C, 0x0, 0x24, - 0x0, 0xFF, 0xFF -}; - -const byte ALLENDIE[] = { - 0x2, 0xFF, 0xFF, 0x49, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, - 0x0, 0x0, 0x0, 0x0, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x49, 0x0, 0x0, 0x0, 0x49, - 0x0, 0x4, 0x0, 0x62, 0x0, 0x1F, 0x0, 0x49, 0x0, 0x5, 0x0, 0x62, 0x0, 0x3A, - 0x0, 0x49, 0x0, 0x6, 0x0, 0x49, 0x0, 0x7, 0x0, 0xFF, 0xFF -}; - -const byte OVERBOARD[] = { - 0x2, 0xFF, 0xFF, 0x22, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, - 0x0, 0x0, 0x0, 0x0, 0x22, 0x22, 0x0, 0x2, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x22, 0x0, 0x0, 0x0, 0x22, 0x0, 0x3, 0x0, 0x22, 0x0, 0x6, 0x0, 0x22, - 0x0, 0x4, 0x0, 0x22, 0x0, 0x7, 0x0, 0x22, 0x0, 0x5, 0x0, 0x62, 0x0, 0x1D, 0x0, - 0x22, 0x0, 0x5, 0x0, 0x62, 0x0, 0x24, 0x0, 0xFF, 0xFF -}; - -const byte PILOT2[] = { - 0x0, 0x12, 0x0, 0xFF, 0xFF, 0x0, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, - 0x0, 0x0, 0x0, 0x0, 0x46, 0x46, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x46, 0x0, 0x0, 0x0, 0x46, 0x0, 0x2, 0x0, 0x46, 0x0, 0x0A, 0x0, 0x46, - 0x0, 0x3, 0x0, 0x46, 0x0, 0x0B, 0x0, 0x46, 0x0, 0x4, 0x0, 0x46, 0x0, 0x0C, - 0x0, 0x46, 0x0, 0x5, 0x0, 0x46, 0x0, 0x0D, 0x0, 0x46, 0x0, 0x6, 0x0, 0x46, - 0x0, 0x0E, 0x0, 0x46, 0x0, 0x7, 0x0, 0x46, 0x0, 0x0F, 0x0, 0x46, 0x0, 0x8, - 0x0, 0x46, 0x0, 0x10, 0x0, 0x46, 0x0, 0x9, 0x0, 0x46, 0x0, 0x11, 0x0, 0x46, - 0x0, 0x9, 0x0, 0x62, 0x0, 0x1F, 0x0, 0xFF, 0xFF -}; - -const byte TIKAGENT[] = { - 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, - 0x0, 0x0, 0x0, 0x0, 0x43, 0x43, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0x2, - 0x0, 0x43, 0x0, 0x0, 0x0, 0x43, 0x0, 0x2, 0x0, 0x43, 0x0, 0x12, 0x0, 0x43, - 0x0, 0x3, 0x0, 0x43, 0x0, 0x13, 0x0, 0x43, 0x0, 0x4, 0x0, 0x43, 0x0, 0x14, - 0x0, 0x43, 0x0, 0x5, 0x0, 0x43, 0x0, 0x15, 0x0, 0x43, 0x0, 0x6, 0x0, 0x43, - 0x0, 0x16, 0x0, 0x43, 0x0, 0x7, 0x0, 0x43, 0x0, 0x17, 0x0, 0x43, 0x0, 0x8, - 0x0, 0x43, 0x0, 0x18, 0x0, 0x43, 0x0, 0x9, 0x0, 0x43, 0x0, 0x19, 0x0, 0x43, - 0x0, 0x0A, 0x0, 0x43, 0x0, 0x1A, 0x0, 0x43, 0x0, 0x0B, 0x0, 0x43, 0x0, 0x1B, - 0x0, 0x43, 0x0, 0x0C, 0x0, 0x43, 0x0, 0x1C, 0x0, 0x43, 0x0, 0x0D, 0x0, 0x43, - 0x0, 0x1D, 0x0, 0x43, 0x0, 0x0E, 0x0, 0x43, 0x0, 0x1E, 0x0, 0x43, 0x0, 0x0F, - 0x0, 0x43, 0x0, 0x1F, 0x0, 0x43, 0x0, 0x10, 0x0, 0x43, 0x0, 0x20, 0x0, 0x43, - 0x0, 0x11, 0x0, 0x43, 0x0, 0x21, 0x0, 0xFF, 0xFF -}; - -const byte BARTENDER[] = { - 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, - 0x0, 0x0, 0x0, 0x0, 0x44, 0x44, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0x0, - 0x0, 0x44, 0x0, 0x0, 0x0, 0x44, 0x0, 0x2, 0x0, 0x44, 0x0, 0x8, 0x0, 0x44, 0x0, - 0x3, 0x0, 0x44, 0x0, 0x9, 0x0, 0x44, 0x0, 0x4, 0x0, 0x44, 0x0, 0x0A, 0x0, 0x44, - 0x0, 0x5, 0x0, 0x44, 0x0, 0x0B, 0x0, 0x44, 0x0, 0x6, 0x0, 0x44, 0x0, 0x0C, - 0x0, 0x44, 0x0, 0x7, 0x0, 0x44, 0x0, 0x0D, 0x0, 0xFF, 0xFF -}; - -const byte PILOT1[] = { - 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x0, 0x0, 0x0, 0x0, 0x45, 0x45, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0x0, - 0x0, 0x45, 0x0, 0x0, 0x0, 0x45, 0x0, 0x2, 0x0, 0x45, 0x0, 0x3, 0x0, 0xFF, 0xFF -}; - -const byte COOK[] = { - 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x0, 0x0, 0x0, 0x0, 0x47, 0x47, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, - 0x2, 0x0, 0x47, 0x0, 0x0, 0x0, 0x47, 0x0, 0x2, 0x0, 0x47, 0x0, 0x10, 0x0, 0x47, - 0x0, 0x3, 0x0, 0x47, 0x0, 0x11, 0x0, 0x47, 0x0, 0x4, 0x0, 0x47, 0x0, 0x12, - 0x0, 0x47, 0x0, 0x5, 0x0, 0x47, 0x0, 0x13, 0x0, 0x47, 0x0, 0x6, 0x0, 0x47, - 0x0, 0x14, 0x0, 0x47, 0x0, 0x7, 0x0, 0x47, 0x0, 0x15, 0x0, 0x47, 0x0, 0x8, - 0x0, 0x47, 0x0, 0x16, 0x0, 0x47, 0x0, 0x9, 0x0, 0x47, 0x0, 0x17, 0x0, 0x47, - 0x0, 0x0A, 0x0, 0x47, 0x0, 0x18, 0x0, 0x47, 0x0, 0x0B, 0x0, 0x47, 0x0, 0x19, - 0x0, 0x47, 0x0, 0x0C, 0x0, 0x47, 0x0, 0x1A, 0x0, 0x47, 0x0, 0x0D, 0x0, 0x47, - 0x0, 0x1B, 0x0, 0x47, 0x0, 0x0E, 0x0, 0x47, 0x0, 0x1C, 0x0, 0x47, 0x0, 0x0F, - 0x0, 0x47, 0x0, 0x1D, 0x0, 0xFF, 0xFF -}; - -const byte BEXPLODE[] = { - 0x2, 0xFF, 0xFF, 0x28, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, - 0x0, 0x0, 0x0, 0x0, 0x28, 0x28, 0x0, 0x2, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x28, 0x0, 0x0, 0x0, 0x28, 0x0, 0x3, 0x0, 0x28, 0x0, 0x9, 0x0, 0x28, - 0x0, 0x4, 0x0, 0x28, 0x0, 0x0A, 0x0, 0x28, 0x0, 0x5, 0x0, 0x28, 0x0, 0x0B, - 0x0, 0x28, 0x0, 0x6, 0x0, 0x62, 0x0, 0x23, 0x0, 0x28, 0x0, 0x7, 0x0, 0x62, - 0x0, 0x23, 0x0, 0x28, 0x0, 0x8, 0x0, 0x62, 0x0, 0x23, 0x0, 0xFF, 0xFF -}; - -const byte THORNICK[] = { - 0x2, 0x7, 0x0, 0x7, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x0, - 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7, 0x0, 0x0, 0x0, 0x7, 0x0, 0x2, 0x0, - 0x7, 0x0, 0x5, 0x0, 0x7, 0x0, 0x3, 0x0, 0x7, 0x0, 0x6, 0x0, 0x7, 0x0, 0x3, - 0x0, 0x7, 0x0, 0x7, 0x0, 0x7, 0x0, 0x4, 0x0, 0x7, 0x0, 0x8, 0x0, 0xFF, 0xFF -}; - -const byte MAYA[] = { - 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, - 0x0, 0x0, 0x0, 0x48, 0x48, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0x2, 0x0, - 0x48, 0x0, 0x0, 0x0, 0x48, 0x0, 0x2, 0x0, 0x48, 0x0, 0x13, 0x0, 0x48, - 0x0, 0x3, 0x0, 0x48, 0x0, 0x14, 0x0, 0x48, 0x0, 0x4, 0x0, 0x48, 0x0, 0x15, - 0x0, 0x48, 0x0, 0x5, 0x0, 0x48, 0x0, 0x16, 0x0, 0x48, 0x0, 0x6, 0x0, 0x48, - 0x0, 0x17, 0x0, 0x48, 0x0, 0x7, 0x0, 0x48, 0x0, 0x18, 0x0, 0x48, 0x0, 0x8, - 0x0, 0x48, 0x0, 0x19, 0x0, 0x48, 0x0, 0x9, 0x0, 0x48, 0x0, 0x1A, 0x0, 0x48, - 0x0, 0x0A, 0x0, 0x48, 0x0, 0x1B, 0x0, 0x48, 0x0, 0x0B, 0x0, 0x48, 0x0, 0x1C, - 0x0, 0x48, 0x0, 0x0C, 0x0, 0x48, 0x0, 0x1D, 0x0, 0x48, 0x0, 0x0D, 0x0, 0x48, - 0x0, 0x1E, 0x0, 0x48, 0x0, 0x0E, 0x0, 0x48, 0x0, 0x1F, 0x0, 0x48, 0x0, 0x0F, - 0x0, 0x48, 0x0, 0x20, 0x0, 0x48, 0x0, 0x10, 0x0, 0x48, 0x0, 0x21, 0x0, 0x48, - 0x0, 0x11, 0x0, 0x48, 0x0, 0x22, 0x0, 0x48, 0x0, 0x12, 0x0, 0x48, 0x0, 0x23, - 0x0, 0xFF, 0xFF -}; - -const byte CAPTAIN[] = { - 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x0, 0x0, 0x0, 0x0, 0x4A, 0x4A, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, - 0x2, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x4A, 0x0, 0x2, 0x0, 0x4A, 0x0, 0x0E, 0x0, 0x4A, - 0x0, 0x3, 0x0, 0x4A, 0x0, 0x0F, 0x0, 0x4A, 0x0, 0x4, 0x0, 0x4A, 0x0, 0x10, - 0x0, 0x4A, 0x0, 0x5, 0x0, 0x4A, 0x0, 0x11, 0x0, 0x4A, 0x0, 0x6, 0x0, 0x4A, - 0x0, 0x12, 0x0, 0x4A, 0x0, 0x7, 0x0, 0x4A, 0x0, 0x13, 0x0, 0x4A, 0x0, 0x8, - 0x0, 0x4A, 0x0, 0x14, 0x0, 0x4A, 0x0, 0x9, 0x0, 0x4A, 0x0, 0x15, 0x0, 0x4A, - 0x0, 0x0A, 0x0, 0x4A, 0x0, 0x16, 0x0, 0x4A, 0x0, 0x0B, 0x0, 0x4A, 0x0, 0x17, - 0x0, 0x4A, 0x0, 0x0C, 0x0, 0x4A, 0x0, 0x18, 0x0, 0x4A, 0x0, 0x0D, 0x0, 0x4A, - 0x0, 0x19, 0x0, 0xFF, 0xFF -}; - -const byte ALLEN[] = { - 0x3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x0, 0x0, 0x0, 0x0, 0x1E, 0x4C, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x4C, 0x0, 0x0, 0x0, 0x4C, 0x0, 0x2, 0x0, 0x4C, 0x0, 0x3, 0x0, - 0xFF, 0xFF -}; - -const byte ARCH[] = { - 0x1, 0x2B, 0x0, 0x4B, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, - 0x0, 0x0, 0x0, 0x2B, 0x4B, 0x0, 0x40, 0x0, 0xFF, 0x4B, 0x0, 0x41, 0x0, - 0x4B, 0x0, 0x0, 0x0, 0x4B, 0x0, 0x2, 0x0, 0x4B, 0x0, 0x4, 0x0, 0x4B, 0x0, 0x3, - 0x0, 0x4B, 0x0, 0x5, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x6, 0x0, 0x4B, 0x0, - 0x3, 0x0, 0x4B, 0x0, 0x7, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x8, 0x0, 0x4B, - 0x0, 0x3, 0x0, 0x4B, 0x0, 0x9, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x0A, 0x0, - 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x0B, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, - 0x0C, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x0D, 0x0, 0x4B, 0x0, 0x3, 0x0, - 0x4B, 0x0, 0x0E, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x0F, 0x0, 0x4B, 0x0, - 0x3, 0x0, 0x4B, 0x0, 0x10, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x11, 0x0, - 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x12, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, - 0x13, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x14, 0x0, 0x4B, 0x0, 0x3, 0x0, - 0x4B, 0x0, 0x15, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x16, 0x0, 0x4B, 0x0, - 0x3, 0x0, 0x4B, 0x0, 0x17, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x18, 0x0, - 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x19, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, - 0x1A, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x1B, 0x0, 0x4B, 0x0, 0x3, 0x0, - 0x4B, 0x0, 0x1C, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x1D, 0x0, 0x4B, 0x0, - 0x3, 0x0, 0x4B, 0x0, 0x1E, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x1F, 0x0, - 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x20, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, - 0x21, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x22, 0x0, 0x4B, 0x0, 0x3, 0x0, - 0x4B, 0x0, 0x23, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x24, 0x0, 0x4B, 0x0, - 0x3, 0x0, 0x4B, 0x0, 0x25, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x26, 0x0, - 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x27, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, - 0x28, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x29, 0x0, 0x4B, 0x0, 0x3, 0x0, - 0x4B, 0x0, 0x2A, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x2B, 0x0, 0x4B, 0x0, - 0x3, 0x0, 0x4B, 0x0, 0x2C, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x2D, 0x0, - 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x2E, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, - 0x2F, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x30, 0x0, 0x4B, 0x0, 0x3, 0x0, - 0x4B, 0x0, 0x31, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x32, 0x0, 0x4B, 0x0, - 0x3, 0x0, 0x4B, 0x0, 0x33, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x34, 0x0, - 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x35, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, - 0x36, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x37, 0x0, 0x4B, 0x0, 0x3, 0x0, - 0x4B, 0x0, 0x38, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x39, 0x0, 0x4B, 0x0, - 0x3, 0x0, 0x4B, 0x0, 0x3A, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x3B, 0x0, - 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x3C, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, - 0x3D, 0x0, 0x4B, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x3E, 0x0, 0x4B, 0x0, 0x3, 0x0, - 0x4B, 0x0, 0x3F, 0x0, 0xFF, 0xFF -}; - -const byte GUARD1[] = { - 0x3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x0, 0x0, 0x0, 0x0, 0x4D, 0x4D, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x4D, 0x0, 0x0, 0x0, 0x4D, 0x0, 0x2, 0x0, 0x4D, 0x0, 0x3, 0x0, - 0xFF, 0xFF -}; - -const byte MCANOE[] = { - 0x3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x0, 0x0, 0x0, 0x0, 0x4E, 0x4E, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x4E, 0x0, 0x0, 0x0, 0x4E, 0x0, 0x2, 0x0, 0x4E, 0x0, 0x3, 0x0, - 0xFF, 0xFF -}; - -const byte CAMPFIRE[] = { - 0x2, 0x35, 0x0, 0x35, 0x0, 0x3, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, - 0x0, 0x0, 0x0, 0x35, 0x35, 0x0, 0x1, 0x0, 0xFF, 0x35, 0x0, 0x2, 0x0, 0x35, - 0x0, 0x0, 0x0, 0x35, 0x0, 0x4, 0x0, 0x35, 0x0, 0x18, 0x0, 0x35, 0x0, 0x5, 0x0, - 0x35, 0x0, 0x19, 0x0, 0x35, 0x0, 0x6, 0x0, 0x35, 0x0, 0x1A, 0x0, 0x35, 0x0, - 0x7, 0x0, 0x35, 0x0, 0x1B, 0x0, 0x35, 0x0, 0x8, 0x0, 0x35, 0x0, 0x1C, 0x0, - 0x35, 0x0, 0x9, 0x0, 0x35, 0x0, 0x1D, 0x0, 0x35, 0x0, 0x0A, 0x0, 0x35, 0x0, - 0x1E, 0x0, 0x35, 0x0, 0x0B, 0x0, 0x35, 0x0, 0x1F, 0x0, 0x35, 0x0, 0x0C, - 0x0, 0x35, 0x0, 0x20, 0x0, 0x35, 0x0, 0x0D, 0x0, 0x35, 0x0, 0x21, 0x0, 0x35, - 0x0, 0x0E, 0x0, 0x35, 0x0, 0x22, 0x0, 0x35, 0x0, 0x0F, 0x0, 0x35, 0x0, 0x23, - 0x0, 0x35, 0x0, 0x10, 0x0, 0x35, 0x0, 0x24, 0x0, 0x35, 0x0, 0x11, 0x0, 0x35, - 0x0, 0x25, 0x0, 0x35, 0x0, 0x12, 0x0, 0x35, 0x0, 0x26, 0x0, 0x35, 0x0, 0x13, - 0x0, 0x35, 0x0, 0x27, 0x0, 0x35, 0x0, 0x14, 0x0, 0x35, 0x0, 0x28, 0x0, 0x35, - 0x0, 0x15, 0x0, 0x35, 0x0, 0x29, 0x0, 0x35, 0x0, 0x16, 0x0, 0x35, 0x0, 0x2A, - 0x0, 0x35, 0x0, 0x17, 0x0, 0x35, 0x0, 0x2B, 0x0, 0xFF, 0xFF -}; - -const byte COLONEL[] = { - 0x2, 0xFF, 0xFF, 0x0E, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, - 0x0, 0x0, 0x0, 0x0, 0x0E, 0x0E, 0x0, 0x5, 0x0, 0xFF, 0xFF, 0xFF, 0x2, - 0x0, 0x4F, 0x0, 0x0, 0x0, 0x4F, 0x0, 0x1, 0x0, 0x4F, 0x0, 0x2, 0x0, 0x0E, 0x0, - 0x8, 0x0, 0x4F, 0x0, 0x3, 0x0, 0xFF, 0xFF -}; - -const byte SOLDIERS[] = { - 0x2, 0xFF, 0xFF, 0x50, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, - 0x0, 0x0, 0x0, 0x0, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x50, - 0x0, 0x2, 0x0, 0x50, 0x0, 0x0, 0x0, 0xFF, 0xFF -}; - -const byte JWATER[] = { - 0x2, 0xFF, 0xFF, 0x51, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, - 0x0, 0x0, 0x0, 0x0, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x51, 0x0, 0x0, 0x0, 0x51, - 0x0, 0x2, 0x0, 0x51, 0x0, 0x3, 0x0, 0xFF, 0xFF -}; - -const byte SHOOT[] = { - 0x2, 0xFF, 0xFF, 0x52, 0x0, 0x2, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, - 0x0, 0x0, 0x0, 0x0, 0x38, 0x52, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0x0, - 0x0, 0x52, 0x0, 0x0, 0x0, 0x52, 0x0, 0x3, 0x0, 0x52, 0x0, 0x5, 0x0, 0x52, - 0x0, 0x4, 0x0, 0x62, 0x0, 0x1F, 0x0, 0xFF, 0xFF -}; - -const byte ADIE[] = { - 0x2, 0xFF, 0xFF, 0x53, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, - 0x0, 0x0, 0x0, 0x0, 0xFF, 0xFF, 0xFF, 0x2, 0x0, 0x53, 0x0, 0x0, 0x0, 0x53, - 0x0, 0x2, 0x0, 0x62, 0x0, 0x4, 0x0, 0x53, 0x0, 0x3, 0x0, 0x62, 0x0, 0x4, - 0x0, 0x53, 0x0, 0x4, 0x0, 0x62, 0x0, 0x4, 0x0, 0xFF, 0xFF -}; - -const byte DYNAMITE[] = { - 0x2, 0xFF, 0xFF, 0x54, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, - 0x0, 0x0, 0x0, 0x0, 0xFF, 0xFF, 0xFF, 0x2, 0x0, 0x54, 0x0, 0x0, 0x0, 0x54, - 0x0, 0x2, 0x0, 0x62, 0x0, 0x23, 0x0, 0xFF, 0xFF -}; - -const byte MAYASHOT[] = { - 0x3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x0, 0x0, 0x0, 0x0, 0x36, 0x55, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, - 0x3, 0x0, 0x55, 0x0, 0x0, 0x0, 0x55, 0x0, 0x2, 0x0, 0x62, 0x0, 0x1F, - 0x0, 0xFF, 0xFF -}; - -const byte OFFKEV[] = { - 0x3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, - 0x0, 0x0, 0x0, 0x4D, 0x29, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x29, 0x0, 0x0, 0x0, 0x29, 0x0, 0x2, 0x0, 0x29, 0x0, 0x3, 0x0, 0xFF, 0xFF -}; - -const byte VALLEY[] = { - 0x2, 0x3A, 0x0, 0x3A, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, - 0x0, 0x0, 0x0, 0x3A, 0x3A, 0x0, 0x2, 0x0, 0xFF, 0xFF, 0xFF, 0x3, 0x0, - 0x3A, 0x0, 0x0, 0x0, 0x3A, 0x0, 0x3, 0x0, 0x3A, 0x0, 0x5, 0x0, 0x3A, 0x0, - 0x4, 0x0, 0x62, 0x0, 0x27, 0x0, 0xFF, 0xFF -}; - -const byte MEANWHILE1[] = { - 0x2, 0xFF, 0xFF, 0x0E, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, - 0x0, 0x0, 0x0, 0x0, 0x0E, 0x0E, 0x0, 0x5, 0x0, 0xFF, 0xFF, 0xFF, 0x3, - 0x0, 0x0E, 0x0, 0x0, 0x0, 0x0E, 0x0, 0x6, 0x0, 0x0E, 0x0, 0x0A, 0x0, 0x0E, - 0x0, 0x7, 0x0, 0x0E, 0x0, 0x0B, 0x0, 0x0E, 0x0, 0x8, 0x0, 0x0E, 0x0, 0x0C, - 0x0, 0x0E, 0x0, 0x8, 0x0, 0x0E, 0x0, 0x0D, 0x0, 0x0E, 0x0, 0x8, 0x0, 0x0E, - 0x0, 0x0E, 0x0, 0x0E, 0x0, 0x9, 0x0, 0x0E, 0x0, 0x0F, 0x0, 0x0E, 0x0, 0x9, - 0x0, 0x0E, 0x0, 0x10, 0x0, 0x0E, 0x0, 0x9, 0x0, 0x0E, 0x0, 0x11, 0x0, 0x0E, - 0x0, 0x9, 0x0, 0x0E, 0x0, 0x12, 0x0, 0x0E, 0x0, 0x9, 0x0, 0x62, 0x0, 0x1A, - 0x0, 0xFF, 0xFF -}; - -const byte MAYATREE[] = { - 0x3, 0xFF, 0xFF, 0xFF, 0xFF, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, - 0x0, 0x0, 0x0, 0x0, 0x30, 0x56, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0x0, - 0x0, 0x56, 0x0, 0x0, 0x0, 0x56, 0x0, 0x2, 0x0, 0x56, 0x0, 0x3, 0x0, 0xFF, 0xFF -}; - -const byte LOCO[] = { - 0x3, 0xFF, 0xFF, 0xFF, 0xFF, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, - 0x0, 0x0, 0x0, 0x0, 0x31, 0x57, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0x0, - 0x0, 0x57, 0x0, 0x0, 0x0, 0x57, 0x0, 0x2, 0x0, 0x57, 0x0, 0x3, 0x0, 0xFF, 0xFF -}; - -const byte KISS[] = { - 0x2, 0xFF, 0xFF, 0x3A, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, - 0x0, 0x0, 0x0, 0x0, 0x40, 0x40, 0x0, 0x5, 0x0, 0xFF, 0xFF, 0xFF, 0x0, - 0x0, 0x40, 0x0, 0x0, 0x0, 0x40, 0x0, 0x6, 0x0, 0x40, 0x0, 0x26, 0x0, 0x40, - 0x0, 0x7, 0x0, 0x40, 0x0, 0x27, 0x0, 0x40, 0x0, 0x8, 0x0, 0x40, 0x0, 0x28, - 0x0, 0x40, 0x0, 0x9, 0x0, 0x62, 0x0, 0x4E, 0x0, 0x40, 0x0, 0x0A, 0x0, 0x40, - 0x0, 0x29, 0x0, 0x40, 0x0, 0x0B, 0x0, 0x40, 0x0, 0x2A, 0x0, 0x40, 0x0, 0x0C, - 0x0, 0x40, 0x0, 0x2B, 0x0, 0x40, 0x0, 0x0D, 0x0, 0x40, 0x0, 0x2C, 0x0, 0x40, - 0x0, 0x0E, 0x0, 0x40, 0x0, 0x2D, 0x0, 0x40, 0x0, 0x0F, 0x0, 0x40, 0x0, 0x2E, - 0x0, 0x40, 0x0, 0x10, 0x0, 0x40, 0x0, 0x2F, 0x0, 0x40, 0x0, 0x11, 0x0, 0x40, - 0x0, 0x30, 0x0, 0x40, 0x0, 0x12, 0x0, 0x40, 0x0, 0x31, 0x0, 0x40, 0x0, 0x13, - 0x0, 0x40, 0x0, 0x32, 0x0, 0x40, 0x0, 0x14, 0x0, 0x40, 0x0, 0x33, 0x0, 0x40, - 0x0, 0x15, 0x0, 0x40, 0x0, 0x34, 0x0, 0x40, 0x0, 0x16, 0x0, 0x40, 0x0, 0x35, - 0x0, 0x40, 0x0, 0x17, 0x0, 0x40, 0x0, 0x36, 0x0, 0x40, 0x0, 0x18, 0x0, 0x40, - 0x0, 0x37, 0x0, 0x40, 0x0, 0x19, 0x0, 0x40, 0x0, 0x38, 0x0, 0x40, 0x0, 0x1A, - 0x0, 0x40, 0x0, 0x39, 0x0, 0x40, 0x0, 0x1B, 0x0, 0x40, 0x0, 0x3A, 0x0, 0x40, - 0x0, 0x1C, 0x0, 0x40, 0x0, 0x3B, 0x0, 0x40, 0x0, 0x1D, 0x0, 0x40, 0x0, 0x3C, - 0x0, 0x40, 0x0, 0x1E, 0x0, 0x40, 0x0, 0x3D, 0x0, 0x40, 0x0, 0x1F, 0x0, 0x40, - 0x0, 0x3E, 0x0, 0x40, 0x0, 0x20, 0x0, 0x40, 0x0, 0x3F, 0x0, 0x40, 0x0, 0x21, - 0x0, 0x40, 0x0, 0x40, 0x0, 0x40, 0x0, 0x22, 0x0, 0x40, 0x0, 0x41, 0x0, 0x40, - 0x0, 0x23, 0x0, 0x40, 0x0, 0x42, 0x0, 0x40, 0x0, 0x24, 0x0, 0x40, 0x0, 0x43, - 0x0, 0x40, 0x0, 0x25, 0x0, 0x40, 0x0, 0x44, 0x0, 0x40, 0x0, 0x25, 0x0, 0x40, - 0x0, 0x45, 0x0, 0x40, 0x0, 0x25, 0x0, 0x40, 0x0, 0x46, 0x0, 0x40, 0x0, 0x25, - 0x0, 0x40, 0x0, 0x47, 0x0, 0xFF, 0xFF -}; - -const byte ROBOT[] = { - 0x3, 0xFF, 0xFF, 0xFF, 0xFF, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, - 0x0, 0x0, 0x0, 0x0, 0x9, 0x58, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0x0, 0x0, - 0x58, 0x0, 0x0, 0x0, 0x58, 0x0, 0x0, 0x0, 0x58, 0x0, 0x2, 0x0, 0xFF, 0xFF -}; - -const byte ANTKILL[] = { - 0x3, 0xFF, 0xFF, 0xFF, 0xFF, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x0, - 0x0, 0x0, 0x3C, 0x59, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x59, - 0x0, 0x0, 0x0, 0x59, 0x0, 0x2, 0x0, 0x62, 0x0, 0x0E, 0x0, 0xFF, 0xFF -}; - -const byte LOCOHOT[] = { - 0x3, 0xFF, 0xFF, 0xFF, 0xFF, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x0, - 0x0, 0x0, 0x19, 0x5A, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x5A, - 0x0, 0x0, 0x0, 0x5A, 0x0, 0x2, 0x0, 0x62, 0x0, 0x3C, 0x0, 0xFF, 0xFF -}; - -const byte CRACK[] = { - 0x2, 0x38, 0x0, 0x38, 0x0, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, - 0x0, 0x0, 0x0, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x38, - 0x0, 0x0, 0x0, 0x38, 0x0, 0x2, 0x0, 0xFF, 0xFF -}; - -const byte LETTER[] = { - 0x3, 0xFF, 0xFF, 0xFF, 0xFF, 0x1, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, - 0x0, 0x0, 0x0, 0x0, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x30, - 0x0, 0x0, 0x0, 0x30, 0x0, 0x1, 0x0, 0x30, 0x0, 0x0, 0x0, 0x30, 0x0, 0x6, 0x0, 0x30, - 0x0, 0x0, 0x0, 0x30, 0x0, 0x7, 0x0, 0x30, 0x0, 0x0, 0x0, 0x30, 0x0, 0x8, 0x0, 0x30, - 0x0, 0x0, 0x0, 0x30, 0x0, 0x9, 0x0, 0x30, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0A, 0x0, - 0x30, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0B, 0x0, 0x30, 0x0, 0x0, 0x0, 0x30, 0x0, - 0x0C, 0x0, 0x30, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0D, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x30, 0x0, 0x0E, 0x0, 0x30, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0F, 0x0, 0x30, 0x0, - 0x0, 0x0, 0x30, 0x0, 0x10, 0x0, 0x30, 0x0, 0x0, 0x0, 0x30, 0x0, 0x2, 0x0, 0x30, - 0x0, 0x0, 0x0, 0x30, 0x0, 0x3, 0x0, 0x30, 0x0, 0x0, 0x0, 0x30, 0x0, 0x4, 0x0, 0x30, - 0x0, 0x0, 0x0, 0x30, 0x0, 0x5, 0x0, 0xFF, 0xFF -}; - -const byte OVERBOARD_DEMO[] = { - 0x02, 0xFF, 0xFF, 0x22, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0xFF, - 0xFF, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x02, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x22, 0x00, 0x00, 0x00, 0x22, - 0x00, 0x03, 0x00, 0x22, 0x00, 0x06, 0x00, 0x22, 0x00, 0x04, - 0x00, 0x22, 0x00, 0x07, 0x00, 0x22, 0x00, 0x05, 0x00, 0x62, - 0x00, 0x1D, 0x00, 0x60, 0x00, 0x00, 0x00, 0x22, 0x00, 0x06, - 0x00, 0x60, 0x00, 0x01, 0x00, 0x22, 0x00, 0x07, 0x00, 0xFF, - 0xFF -}; - -const byte SHORE1[] = { - 0x02, 0xFF, 0xFF, 0x55, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0xFF, - 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x03, 0x00, - 0x55, 0x00, 0x00, 0x00, 0x55, 0x00, 0x02, 0x00, 0x62, 0x00, - 0x2E, 0x00, 0x55, 0x00, 0x02, 0x00, 0x62, 0x00, 0x2F, 0x00, - 0xFF, 0xFF -}; - -const byte CHAP8[] = { - 0x02, 0xFF, 0xFF, 0x60, 0x00, 0x03, 0x00, 0xFF, 0xFF, 0xFF, - 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x60, 0x00, 0x02, 0x00, 0xFF, 0xFF -}; - -const byte *const CHARTBL[] = { - ELAINE, LIB, FLASHBACK, ALLENDIE, OVERBOARD, PILOT2, TIKAGENT, - BARTENDER, PILOT1, COOK, BEXPLODE, THORNICK, MAYA, CAPTAIN, - ALLEN, ARCH, GUARD1, MCANOE, CAMPFIRE, COLONEL, SOLDIERS, - JWATER, SHOOT, ADIE, DYNAMITE, MAYASHOT, OFFKEV, VALLEY, - MEANWHILE1, MAYATREE, LOCO, KISS, ROBOT, ANTKILL, LOCOHOT, - CRACK, LETTER -}; - -const byte *const CHARTBL_DEMO[] = { - ELAINE, LIB, FLASHBACK, ALLENDIE, OVERBOARD_DEMO, PILOT2, TIKAGENT, - BARTENDER, PILOT1, COOK, BEXPLODE, THORNICK, MAYA, CAPTAIN, - ALLEN, ARCH, GUARD1, MCANOE, CAMPFIRE, COLONEL, SOLDIERS, - JWATER, SHOOT, ADIE, DYNAMITE, SHORE1, CHAP8 -}; - -const char *const INVENTORY_NAMES[] = { - "RAT", "ALCOHOL", "SAFE COMBINATION", "BEAKER", "MICROFILM", - "VAULT KEY", "BOLT CUTTERS", "BLOWGUN", "LOVE POTION", "MONEY", - "DARTS", "TAPE", "JUNGLE POTION", "MOVIE", "CABINET KEY", - "DISPLAY CASE KEY", "FLITCH'S CAR KEYS", "COAT HANGER", - "CROWBAR", "COMPASS", "MAP", "LETTER OPENER", "LETTER", - "DECODER", "DIPPED DART", "LOADED BLOWGUN", "CARD", "JERRYCAN", - "CIGARETTES", "BIKE PUMP", "PARACHUTE", "PESO", "PEPPERS", - "MACHETE", "POISON ROOT", "AMMUNITION", "PADDLE", "FISHING NET", - "RAT TRAP", "CHEESE", "LOADED TRAP", "KNIFE", "CHOPPED PEPPERS", - "LIGHTER", "LADDER", "SMALL POLE", "JEEP KEY", "CHAIN", "ARROW", - "FILLED JERRY CAN", "EXPLOSIVES", "GEIGER COUNTER", "VINE", - "GOLD NUGGET", "HOLLOW REED", "AMAZON QUEEN KEYS", "FISHING POLE", - "HARPOON", "RAG", "BOTTLE OF RUM", "RAG IN BOTTLE", "MOLOTOV COCKTAIL", - "JUNGLE PLANT", "LADLE", "WORM", "FISH", "FIREWORKS", "BAITED POLE", - "FILLED LADLE", "EMERALD", "SMALL KEY", "SCROLL", "LIT EXPLOSIVES", - "LIGHTER", "BROKEN SPEAR", "SHOE LACES", "TORCH", "LACES AND SPEAR", - "KNIFE SPEAR", "GARBAGE CAN", "RAFT", "INFLATED RAFT", - "JASON'S CAR KEYS", "PESO BILLS", "PLANK" -}; - -const int FONT2_INDEX[] = { - 62, 2, 6, - 0x0000, 0x0019, 0x0021, 0x002e, 0x0041, 0x005a, 0x0073, 0x008c, 0x0093, 0x009b, - 0x00a3, 0x00bc, 0x00d5, 0x00dd, 0x00ea, 0x00f1, 0x00fe, 0x010b, 0x0118, 0x0125, - 0x0132, 0x013f, 0x014c, 0x0159, 0x0166, 0x0173, 0x0180, 0x0187, 0x018e, 0x01a7, - 0x01b4, 0x01cd, 0x01dc, 0x01f5, 0x0208, 0x0215, 0x0222, 0x022f, 0x023c, 0x0249, - 0x025c, 0x0269, 0x0276, 0x0285, 0x0292, 0x029f, 0x02b2, 0x02c5, 0x02d2, 0x02df, - 0x02ee, 0x02fb, 0x0308, 0x0315, 0x0322, 0x032f, 0x0342, 0x034f, 0x0362, 0x036f, - 0x0388, 0x03a1, -}; - -const byte FONT2_DATA[] = { - 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf0, 0xf0, 0xf0, 0xf0, - 0x00, 0xf0, 0x00, 0x06, 0xf3, 0xc0, 0xc3, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x07, 0x1c, 0x00, - 0x67, 0x9e, 0xc0, 0x07, 0x1c, 0x00, 0x67, 0x9e, 0xc0, 0x07, - 0x1c, 0x00, 0x00, 0x00, 0x00, 0x09, 0x02, 0xc0, 0x00, 0x3f, - 0xfc, 0x00, 0xb2, 0xc0, 0x00, 0x3f, 0xfc, 0x00, 0x02, 0xcb, - 0x00, 0x3f, 0xfc, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x18, 0x60, - 0x70, 0x70, 0x60, 0x1c, 0x00, 0x04, 0x60, 0x18, 0x1c, 0x1c, - 0x1c, 0x70, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x30, - 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xf0, 0xf0, - 0x00, 0x07, 0x00, 0xf0, 0x03, 0xc0, 0x0f, 0x00, 0x3c, 0x00, - 0xf0, 0x00, 0x00, 0x00, 0x07, 0x3f, 0xc0, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x3f, 0xc0, 0x00, 0x00, 0x07, 0x1f, 0x00, - 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0xff, 0xf0, 0x00, 0x00, - 0x08, 0x2b, 0xf0, 0xb0, 0x2c, 0x00, 0xa0, 0x0a, 0x00, 0xff, - 0xfc, 0x00, 0x00, 0x07, 0xff, 0xc0, 0x00, 0x70, 0x03, 0xc0, - 0x00, 0x70, 0xff, 0xc0, 0x00, 0x00, 0x07, 0x0b, 0xc0, 0x2d, - 0xc0, 0xb1, 0xc0, 0xaa, 0xa0, 0x01, 0xc0, 0x00, 0x00, 0x07, - 0xff, 0xf0, 0x70, 0x00, 0x7f, 0xc0, 0x00, 0xb0, 0xbf, 0xc0, - 0x00, 0x00, 0x07, 0x2f, 0xc0, 0x70, 0x00, 0x7f, 0xc0, 0x70, - 0x70, 0x3f, 0xc0, 0x00, 0x00, 0x08, 0xff, 0xfc, 0x00, 0xb0, - 0x02, 0xc0, 0x02, 0xc0, 0x0b, 0x00, 0x00, 0x00, 0x08, 0x2f, - 0xf0, 0xb0, 0x1c, 0x2f, 0xf0, 0xb0, 0x1c, 0x2f, 0xf0, 0x00, - 0x00, 0x07, 0x3f, 0xc0, 0x70, 0x70, 0x3f, 0xf0, 0x00, 0x70, - 0x3f, 0xc0, 0x00, 0x00, 0x03, 0xf0, 0xf0, 0x00, 0xf0, 0xf0, - 0x00, 0x03, 0xf0, 0xf0, 0x00, 0xf0, 0x30, 0x00, 0x09, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0xff, 0xc0, 0x00, 0x00, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x06, 0xff, 0x00, 0x03, 0xc0, 0x0f, 0x00, 0x3c, 0x00, - 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0a, 0x00, 0x40, 0x00, 0x01, 0xf0, 0x00, 0x07, 0x1c, - 0x00, 0x1f, 0xff, 0x00, 0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, - 0x08, 0x7f, 0xf0, 0x70, 0x1c, 0x7f, 0xf0, 0x70, 0x1c, 0x6a, - 0xb0, 0x00, 0x00, 0x08, 0x2f, 0xfc, 0x70, 0x00, 0x70, 0x00, - 0x70, 0x00, 0x2a, 0xa8, 0x00, 0x00, 0x08, 0x7f, 0xf0, 0x70, - 0x1c, 0x70, 0x1c, 0x70, 0x1c, 0x6a, 0xb0, 0x00, 0x00, 0x07, - 0x7f, 0xf0, 0x70, 0x00, 0x7f, 0xc0, 0x70, 0x00, 0x6a, 0xa0, - 0x00, 0x00, 0x07, 0x7f, 0xf0, 0x70, 0x00, 0x7f, 0xc0, 0x70, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x09, 0x3f, 0xfc, 0x00, 0x70, - 0x00, 0x00, 0x70, 0xff, 0x00, 0x70, 0x1c, 0x00, 0x2a, 0xbc, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x70, 0x1c, 0x70, 0x1c, 0x7f, - 0xfc, 0x70, 0x1c, 0x70, 0x1c, 0x00, 0x00, 0x07, 0xff, 0xf0, - 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0xaa, 0xa0, 0x00, 0x00, - 0x08, 0x0f, 0xfc, 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x70, - 0x70, 0x2a, 0x40, 0x00, 0x00, 0x08, 0x70, 0x2c, 0x72, 0xc0, - 0x7f, 0x00, 0x72, 0xc0, 0x70, 0x28, 0x00, 0x00, 0x07, 0x70, - 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6a, 0xa0, 0x00, - 0x00, 0x0a, 0x70, 0x02, 0xc0, 0x7c, 0x09, 0xc0, 0x77, 0x2d, - 0xc0, 0x71, 0xb1, 0xc0, 0x60, 0xc1, 0x80, 0x00, 0x00, 0x00, - 0x09, 0x70, 0x07, 0x00, 0x77, 0x07, 0x00, 0x71, 0xc7, 0x00, - 0x70, 0x77, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x2f, 0xf0, 0x70, 0x1c, 0x70, 0x1c, 0x70, 0x1c, 0x2a, 0xa0, - 0x00, 0x00, 0x08, 0x7f, 0xf0, 0x70, 0x1c, 0x7f, 0xf0, 0x70, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x08, 0x2f, 0xf0, 0x70, 0x1c, - 0x70, 0x1c, 0x71, 0xdc, 0x2a, 0xa0, 0x00, 0x1c, 0x00, 0x00, - 0x08, 0x7f, 0xf0, 0x70, 0x1c, 0x7f, 0xc0, 0x70, 0x70, 0x60, - 0x18, 0x00, 0x00, 0x07, 0x2f, 0xf0, 0x70, 0x00, 0x2f, 0xc0, - 0x00, 0xb0, 0xbf, 0xc0, 0x00, 0x00, 0x07, 0xff, 0xf0, 0x0b, - 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, - 0x70, 0x1c, 0x70, 0x1c, 0x70, 0x1c, 0x70, 0xdc, 0x1f, 0x1c, - 0x00, 0x00, 0x08, 0xf0, 0x1c, 0xb0, 0x1c, 0x70, 0xb0, 0x72, - 0xc0, 0x7f, 0x00, 0x00, 0x00, 0x0b, 0xf0, 0x00, 0xb0, 0xb0, - 0x00, 0x70, 0x70, 0xc0, 0x70, 0x72, 0x72, 0xc0, 0x7c, 0x1f, - 0x00, 0x00, 0x00, 0x00, 0x08, 0xf0, 0x3c, 0x1c, 0xe0, 0x07, - 0xc0, 0x1c, 0x70, 0x70, 0x1c, 0x00, 0x00, 0x09, 0x70, 0x07, - 0x00, 0x1c, 0x1c, 0x00, 0x07, 0xf0, 0x00, 0x01, 0xc0, 0x00, - 0x01, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xfc, 0x00, - 0x70, 0x07, 0x00, 0x1c, 0x00, 0xaa, 0xac, 0x00, 0x00, 0x09, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -const int FONT6x6_INDEX[] = { - 62, 1, 6, - 0x0000, 0x0007, 0x000e, 0x0015, 0x001c, 0x0023, 0x002a, 0x0031, 0x0038, 0x003f, - 0x0046, 0x004d, 0x0054, 0x005b, 0x0062, 0x0069, 0x0070, 0x0077, 0x007e, 0x0085, - 0x008c, 0x0093, 0x009a, 0x00a1, 0x00a8, 0x00af, 0x00b6, 0x00bd, 0x00c4, 0x00cb, - 0x00d2, 0x00d9, 0x00e0, 0x00e7, 0x00ee, 0x00f5, 0x00fc, 0x0103, 0x010a, 0x0111, - 0x0118, 0x011f, 0x0126, 0x012d, 0x0134, 0x013b, 0x0142, 0x0149, 0x0150, 0x0157, - 0x015e, 0x0165, 0x016c, 0x0173, 0x017a, 0x0181, 0x0188, 0x018f, 0x0196, 0x019d, - 0x01a4, 0x01ab, -}; - -const byte FONT6x6_DATA[] = { - 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x30, 0x30, - 0x30, 0x30, 0x00, 0x30, 0x06, 0xd8, 0xd8, 0x90, 0x00, 0x00, - 0x00, 0x06, 0x50, 0xf8, 0x50, 0xf8, 0x50, 0x00, 0x06, 0x78, - 0xa0, 0x70, 0x28, 0xf0, 0x20, 0x06, 0xc8, 0xd0, 0x20, 0x58, - 0x98, 0x00, 0x06, 0x60, 0xd0, 0x60, 0xe8, 0xd0, 0x68, 0x06, - 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x06, 0x30, 0x60, 0x60, - 0x60, 0x30, 0x00, 0x07, 0x30, 0x18, 0x18, 0x18, 0x30, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, 0x20, - 0xf8, 0x20, 0x20, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x30, - 0x60, 0x06, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x06, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x06, 0x18, 0x30, 0x60, 0xc0, - 0x80, 0x00, 0x06, 0x70, 0x98, 0xa8, 0xc8, 0x70, 0x00, 0x06, - 0x10, 0x30, 0x10, 0x10, 0x10, 0x00, 0x06, 0xf0, 0x08, 0x70, - 0x80, 0xf8, 0x00, 0x06, 0xf0, 0x08, 0x70, 0x08, 0xf0, 0x00, - 0x06, 0x30, 0x50, 0x90, 0xf8, 0x10, 0x00, 0x06, 0xf0, 0x80, - 0xf0, 0x08, 0xf0, 0x00, 0x06, 0x70, 0x80, 0xf0, 0x88, 0x70, - 0x00, 0x06, 0xf8, 0x08, 0x10, 0x20, 0x20, 0x00, 0x06, 0x70, - 0x88, 0x70, 0x88, 0x70, 0x00, 0x06, 0x70, 0x88, 0x78, 0x08, - 0x70, 0x00, 0x06, 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, 0x06, - 0x60, 0x60, 0x00, 0x60, 0x20, 0x40, 0x06, 0x18, 0x30, 0x60, - 0x30, 0x18, 0x00, 0x06, 0x00, 0x78, 0x00, 0x78, 0x00, 0x00, - 0x06, 0x60, 0x30, 0x18, 0x30, 0x60, 0x00, 0x06, 0x70, 0x98, - 0x30, 0x30, 0x00, 0x30, 0x06, 0x70, 0x88, 0xb8, 0xb0, 0x80, - 0x78, 0x06, 0x70, 0x88, 0xf8, 0x88, 0x88, 0x00, 0x06, 0xf0, - 0x88, 0xf0, 0x88, 0xf0, 0x00, 0x06, 0x78, 0x80, 0x80, 0x80, - 0x78, 0x00, 0x06, 0xf0, 0x88, 0x88, 0x88, 0xf0, 0x00, 0x06, - 0xf8, 0x80, 0xf0, 0x80, 0xf8, 0x00, 0x06, 0xf8, 0x80, 0xf0, - 0x80, 0x80, 0x00, 0x06, 0x78, 0x80, 0x98, 0x88, 0x78, 0x00, - 0x06, 0x88, 0x88, 0xf8, 0x88, 0x88, 0x00, 0x06, 0x70, 0x20, - 0x20, 0x20, 0x70, 0x00, 0x06, 0x08, 0x08, 0x08, 0x88, 0x70, - 0x00, 0x06, 0x90, 0xa0, 0xc0, 0xa0, 0x90, 0x00, 0x06, 0x80, - 0x80, 0x80, 0x80, 0xf0, 0x00, 0x06, 0x88, 0xd8, 0xa8, 0x88, - 0x88, 0x00, 0x06, 0x88, 0xc8, 0xa8, 0x98, 0x88, 0x00, 0x06, - 0x70, 0x88, 0x88, 0x88, 0x70, 0x00, 0x06, 0xf0, 0x88, 0xf0, - 0x80, 0x80, 0x00, 0x06, 0x70, 0x88, 0x88, 0x88, 0x70, 0x18, - 0x06, 0xf0, 0x88, 0xf0, 0xa0, 0x98, 0x00, 0x06, 0x78, 0x80, - 0x70, 0x08, 0xf0, 0x00, 0x06, 0xf8, 0x20, 0x20, 0x20, 0x20, - 0x00, 0x06, 0x88, 0x88, 0x88, 0x88, 0x78, 0x00, 0x06, 0x88, - 0x88, 0x88, 0x50, 0x20, 0x00, 0x06, 0x88, 0x88, 0xa8, 0xd8, - 0x88, 0x00, 0x06, 0x88, 0x50, 0x20, 0x50, 0x88, 0x00, 0x06, - 0x88, 0x88, 0x50, 0x20, 0x20, 0x00, 0x06, 0xf8, 0x10, 0x20, - 0x40, 0xf8, 0x00, 0x06, 0x78, 0x60, 0x60, 0x60, 0x78, 0x00, - 0x06, 0xc0, 0x60, 0x30, 0x18, 0x08, 0x00, 0x06, 0x78, 0x18, - 0x18, 0x18, 0x78, 0x00, 0x00, 0x52, 0x41, 0x54, 0x00, 0x41, - 0x4c, 0x43, 0x4f, 0x48, 0x4f, 0x4c, 0x00, 0x53, 0x41, 0x46, - 0x45, 0x20, 0x43, 0x4f, 0x4d, 0x42, 0x49, 0x4e, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x00, 0x42, 0x45, 0x41, 0x4b, 0x45, 0x52, - 0x00, 0x4d, 0x49, 0x43, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x4d, - 0x00, 0x56, 0x41, 0x55, 0x4c, 0x54, 0x20, 0x4b, 0x45, 0x59, - 0x00, 0x42, 0x4f, 0x4c, 0x54, 0x20, 0x43, 0x55, 0x54, 0x54, - 0x45, 0x52, 0x53, 0x00, 0x42, 0x4c, 0x4f, 0x57, 0x47, 0x55, - 0x4e, 0x00, 0x4c, 0x4f, 0x56, 0x45, 0x20, 0x50, 0x4f, 0x54, - 0x49, 0x4f, 0x4e, 0x00, 0x4d, 0x4f, 0x4e, 0x45, 0x59, 0x00, - 0x44, 0x41, 0x52, 0x54, 0x53, 0x00, 0x54, 0x41, 0x50, 0x45, - 0x00, 0x4a, 0x55, 0x4e, 0x47, 0x4c, 0x45, 0x20, 0x50, 0x4f, - 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x4d, 0x4f, 0x56, 0x49, -}; - -const char *const NO_HELP_MESSAGE = - "WE ARE UNABLE TO PROVIDE YOU WITH ANY MORE HINTS. YOUR IQ \ -HAS DECREASED SO FAR THAT WE CAN NO LONGER PUT THE HINTS IN TERMS \ -YOU CAN UNDERSTAND."; -const char *const NO_HINTS_MESSAGE = "THE HELP SYSTEM HAS BEEN TURNED OFF FOR THIS GAME."; -const char *const RIVER_HIT1 = "YOU HIT THE ROCKS AND THE CANOE BEGINS TO LEAK."; -const char *const RIVER_HIT2 = "YOU HIT THE ROCKS AND THE CANOE DEVELOPS SERIOUS LEAKS."; -const char *const BAR_MESSAGE = "YOU ARE TOO BUSY TRYING TO KEEP FROM SINKING TO DO THAT"; -const char *const HELPLVLTXT[3] = { - " LEVEL 1 ", - " LEVEL 2 ", - " LEVEL 3 " -}; - -const char *const IQLABELS[9] = { - "VEGETABLE", - "NEANDERTHAL", - "LOBOTOMIZED", - "DENSE", - "AVERAGE", - "INTELLIGENT", - "MURPHYITE", - "BRILLIANT", - "GENIUS" -}; - -const byte DEATH_SCREENS[58] = { - 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, - 0, 2, 4, 2, 1, 0, 0, 0, 0, 0, - 0, 2, 7, 7, 4, 6, 7, 10, 4, 2, - 0, 0, 0, 0, 5, 5, 3, 3, 3, 5, - 8, 8, 11, 9, 8, 12, 0, 1, 9, 8, - 8, 0, 5, 8, 0, 12, 12, 11 -}; - -const byte DEATH_SCREENS_DEMO[34] = { - 1, 2, 1, 1, 1, 1, 1, 1, 4, 1, - 3, 4, 2, 4, 2, 1, 1, 1, 1, 1, - 1, 4, 2, 4, 2, 4, 2, 4, 4, 4, - 1, 1, 1, 1 -}; - -const char *const DEATH_TEXT[58] = { - "SAM SALVADOR SPOTS YOU AND LETS YOU HAVE IT.", - "WHILE TAKING A MOONLIGHT SWIM YOU DISCOVER THAT PIRANHA REALLY CAN STRIP FLESH TO THE BONE.", - "THE GUARD FILLS YOU FULL OF HOLES BEFORE TOSSING YOU TO THE PIRANHA.", - "YOU'RE ONLY ABLE TO SWIM HALFWAY ACROSS THE RIVER BEFORE RUNNING OUT OF AIR. " - "YOU MAKE SO MUCH NOISE GASPING FOR BREATH THAT SAM EASILY FINDS YOU AND LEAVES " - "YOU IN THE RIVER PERMANENTLY.", - "SAM SALVADOR NOTICES SOMEONE HAS BEEN PLAYING WITH THE CARGO. " - "HE TRACKS YOU DOWN AND LETS YOU HAVE IT.", - "THE GUARD COMES AROUND THE CORNER. HE DECIDES THAT THREE LEAD SLUGS WILL " - "TEACH YOU TO BE MORE POLITE.", - "THE CAPTAIN IS WAITING OUTSIDE THE DOOR.", - "THE CAPTAIN'S RANDOM SHOOTING FINALLY FINDS ITS TARGET.", - "THE CRATE OUTSIDE THE WINDOW EXPLODES, DESTROYING THE SHIP. " - "UNFORTUNATELY, YOU'RE STILL ABOARD.", - "THE DOOR WAS NOT BARRED AND THE CAPTAIN WALKS RIGHT IN AND PARTS YOUR HAIR.", - - "", - "YOU RUN OUT ON DECK, THEN REALIZE THAT MAYA IS STILL TIED UP. " - "AS YOU TURN TO GO BACK THE BOAT BLOWS UP.", - "AFTER YOU FAIL TO PROVE YOUR DIVINITY THE NATIVES EAT YOU FOR LUNCH.", - "THIS IS THE GENERIC DEATH SCENE", - "YOU ONLY MAKE IT HALFWAY ACROSS THE RIVER BEFORE THE PIRANHA STRIKE.", - "WITH NOTHING TO PROTECT HIM FROM THE HAIL OF BULLETS ALLEN IS QUICKLY GUNNED DOWN. " - "JASON AND MAYA SOON FOLLOW...", - "THE COMBINATION OF THE WIND AND GUNFIRE KNOCK THE CORRUGATED IRON OVER, " - "LEAVING YOU WITHOUT PROTECTION.", - "WITHOUT SUFFICIENT AMMUNITION, ALLEN IS UNABLE TO HOLD OFF THE ATTACKERS FOR LONG. " - "THIS RESULTS IN A SERIOUS CASE OF LEAD POISONING. ADDITIONAL AMMUNITION SHOULD " - "HAVE BEEN PURCHASED AT THE RIO BLANCO TRADING POST (CHAPTER 6).", - "ALLEN IS A MARVELOUS SHOT, BUT HIS AMMUNITION IS NOT UNLIMITED. " - "SOON IT IS ALL OVER.", - "THE PILOT FEELS YOU ARE TOO CLOSE AND PULLS THE TRIGGER.", - - "THE PILOT SHOOTS YOU IN THE HEART, THEN TOSSES YOUR LIFELESS BODY OUT THE DOOR.", - "THE PLANE CRASHES INTO THE JUNGLE CANOPY AT 200 MPH.", - "THE CANOE HITS THE ROCKS AND CAPSIZES, AND THE PIRANHA MAKE YOU THEIR LUNCH GUESTS.", - "YOU TAKE THE WRONG BRANCH AND ACCIDENTALLY DISCOVER THE FOURTH TALLEST WATERFALL " - "IN SOUTH AMERICA.", - "YOU TAKE THE WRONG BRANCH AND DISCOVER A VERY HUNGRY TRIBE OF CANNIBALS.", - "YOU TAKE THE WRONG BRANCH AND BECOME LOST IN THE WINDING WATERWAYS. " - "YOU WANDER UNTIL YOU STARVE TO DEATH.", - "YOU TAKE THE WRONG BRANCH AND BECOME TRAPPED IN THE RAPIDS. " - "EVENTUALLY YOU AND MAYA ARE CRUSHED BETWEEN THE ROCKS.", - "YOU WAIT AROUND FOR SOME TIME, BUT HANS STROHEIM NEVER SPEAKS TO YOU AGAIN. " - "FINALLY YOU RETURN HOME KNOWING YOU HAVE FAILED.", - "DECIDING THAT YOU THREATEN HIM AND HIS WORK, HANS STROHEIM HAS THE NATIVES " - "IN THE VILLAGE KILL YOU.", - "YOU DO NOT GET FAR ENOUGH AWAY BEFORE THE DYNAMITE EXPLODES AND YOU ARE BLOWN " - "INTO A THOUSAND PIECES.", - - "YOU ARE STANDING SO CLOSE TO THE ENTRANCE WHEN SANCEZ AND HIS MEN BREAK THROUGH " - "THE WALL THAT YOU ARE QUICKLY SPOTTED AND SHOT", - "THE AMAZON SENTINELS SPOT YOU AND FILL YOU FULL OF ARROWS.", - "SAM MAY BE UGLY, BUT HE'S NOT DEAF. HE HEARS ALL THE NOISE YOU ARE MAKING AND " - "CANCELS YOUR BOARDING PASS.", - "WITH THE BAR OFF THE DOOR THE CAPTAIN WALTZES IN AND BLOWS YOU AWAY", - "THE BEAR WANDERS OFF INTO THE WOODS AND DISTURBS THE TWO LOVEBIRDS. " - "WHEN THEY COME OUT THEY FIND YOU AND PUT YOU IN THE BIG HOUSE FOR TWENTY YEARS.", - "WHEN YOU DO NOT LEAVE THE SECURITY AREA QUICKLY ENOUGH YOU ARE ARRESTED AND CONVICTED " - "AS A COMMIE SPY. YOU EMBARK ON A NEW CAREER STAMPING OUT LICENSE PLATES.", - "THE HUNGRY BEAR SPOTS YOU AND DECIDES YOU WILL MAKE A NICE APPETIZER.", - "YOU DISTURB THE BEAR'S LUNCH AND HE EATS YOU FOR DESSERT.", - "AFTER FAILING TO FIND ANY LUNCH AT THE GARBAGE CAN THE BEAR EATS YOU INSTEAD.", - "THE SUSPICIOUS LIBRARIAN CALLS SECURITY AND YOU ARE SENT TO JAIL.", - - "YOU PLUMMET 10,000 FEET TO YOUR DEATH.", - "EL LOCO FLIES INTO AN INSANE RAGE AND BEATS YOU TO A BLOODY PULP.", - "THE WOMAN WALKS OUT THE DOOR AND NEVER RETURNS. YOU SPEND THE REST OF YOUR LIFE " - "IN A FUTILE ATTEMPT TO LOCATE ALLEN.", - "YOU SLIP OFF THE PLATFORM AND FALL TO YOUR DEATH.", - "YOU SLIP OFF THE PLATFORM AND FALL TO YOUR DEATH.", - "YOU COME TOO CLOSE TO THE POWERFUL JAWS OF THE ANT AND HE SNIPS YOU IN TWO BEFORE " - "DEVOURING YOU.", - "B.O.B. HAS A FLAW IN HIS PROGRAMMING THAT DIRECTS HIM TO SHOOT FIRST AND ASK QUESTIONS LATER.", - "THE PLANE SINKS AND THE PIRHANA ATTACK BEFORE YOU EVEN GET OUT THE DOOR.", - "MAYA FALLS OFF THE END OF THE BROKEN BRIDGE.", - "YOUR WEIGHT IS JUST ENOUGH TO CAUSE THE REMAINING SUPPORT CABLE TO SNAP AND YOU " - "FALL TO THE BOTTOM OF THE GORGE.", - - "EVEN WITH REPAIRS THE BRIDGE IS NOT STRONG ENOUGH TO HOLD TWO PEOPLE.", - "SANCHEZ AND HIS MEN FIND YOU AND HOLD FIRING SQUAD PRACTICE.", - "THE TWO GUARDS ARE DISTURBED IN THEIR LOVE NEST AND COME LOOKING FOR ANYONE ACTING SUSPICIOUS. " - "THEY FIND YOU AND SEND YOU UP THE RIVER.", - "THE PARACHUTE IS NOT LARGE ENOUGH TO SUPPORT YOU, AND YOU HIT THE TREES AT 140 M.P.H.", - "SANCHEZ AND HIS MEN FOLLOW YOU ACROSS THE BRIDGE AND CUT YOU DOWN IN A HAIL OF GUNFIRE", - "YOU TRIED TO STAB THE ANT BUT HIS SHELL IS TOO DIFFICULT TO PENETRATE. " - "YOU NOTICE A SLIGHT CUT IN THE SHELL UNDERNEATH BUT YOU CAN'T GET TO IT " - "AND HE SNIPS YOU INTO DELICIOUS MEATY CHUNKS.", - "AFTER THE ANT FINISHES SUCKING ALL OF THE SAP OUT OF THE VINE HE TURNS HIS ATTENTION BACK TO YOU " - "AND BITES YOUR HEAD OFF.", - "THE CANTINA OWNER NOTICES YOU ARE TRYING TO STEAL OBJECTS FROM THE TABLES. " - "TWENTY YEARS LATER YOU ARE RELEASED FROM A SOUTH AMERICAN PRISON." -}; - -const char *const DEATH_TEXT_DEMO[34] = { - "SAM SALVADOR SPOTS YOU AND LETS YOU HAVE IT.", - "WHILE TAKING A MOONLIGHT SWIM YOU DISCOVER THAT PIRANHA REALLY CAN STRIP FLESH TO THE BONE.", - "THE GUARD FILLS YOU FULL OF HOLES BEFORE TOSSING YOU TO THE PIRANHA.", - "YOU'RE ONLY ABLE TO SWIM HALFWAY ACROSS THE RIVER BEFORE RUNNING OUT OF AIR. YOU MAKE SO MUCH NOISE GASPING FOR BREATH THAT SAM EASILY FINDS YOU AND LEAVES YOU IN THE RIVER PERMANENTLY.", - "SAM SALVADOR NOTICES SOMEONE HAS BEEN PLAYING WITH THE CARGO. HE TRACKS YOU DOWN AND LETS YOU HAVE IT.", - "THE GUARD COMES AROUND THE CORNER. HE DECIDES THAT THREE LEAD SLUGS WILL TEACH YOU TO BE MORE POLITE.", - "THE CAPTAIN IS WAITING OUTSIDE THE DOOR.", - "THE CAPTAIN'S RANDOM SHOOTING FINALLY FINDS ITS TARGET.", - "THE CRATE OUTSIDE THE WINDOW EXPLODES, DESTROYING THE SHIP. UNFORTUNATELY, YOU'RE STILL ABOARD.", - "THE DOOR WAS NOT BARRED AND THE CAPTAIN WALKS RIGHT IN AND PARTS YOUR HAIR.", - "", - "YOU RUN OUT ON DECK, THEN REALIZE THAT MAYA IS STILL TIED UP. AS YOU TURN TO GO BACK THE BOAT BLOWS UP.", - "AFTER YOU FAIL TO PROVE YOUR DIVINITY THE NATIVES EAT YOU FOR LUNCH.", - "THIS IS THE GENERIC DEATH SCENE", - "YOU ONLY MAKE IT HALFWAY ACROSS THE RIVER BEFORE THE PIRANHA STRIKE.", - "WITH NOTHING TO PROTECT HIM FROM THE HAIL OF BULLETS ALLEN IS QUICKLY GUNNED DOWN. JASON AND MAYA SOON FOLLOW...", - "THE COMBINATION OF THE WIND AND GUNFIRE KNOCK THE CORRUGATED IRON OVER, LEAVING YOU WITHOUT PROTECTION.", - "WITHOUT SUFFICIENT AMMUNITION, ALLEN IS UNABLE TO HOLD OFF THE ATTACKERS FOR LONG. THIS RESULTS IN A SERIOUS CASE OF LEAD POISONING.", - "ALLEN IS A MARVELOUS SHOT, BUT HIS AMMUNITION IS NOT UNLIMITED. SOON IT IS ALL OVER.", - "THE PILOT FEELS YOU ARE TOO CLOSE AND PULLS THE TRIGGER.", - "THE PILOT SHOOTS YOU IN THE HEAD, THEN TOSSES YOUR LIFELESS", - "THE PLANE CRASHES INTO THE JUNGLE CANOPY AT 200 MPH.", - "THE CANOE HITS THE ROCKS AND CAPSIZES, AND THE PIRANHA MAKE YOU THEIR LUNCH GUESTS.", - "YOU ACCIDENTALLY DISCOVER THE FOURTH TALLEST WATERFALL IN SOUTH AMERICA.", - "YOU DISCOVER A VERY HUNGRY TRIBE OF CANNIBALS.", - "YOU BECOME LOST IN THE WINDING WATERWAYS AND WANDER UNTIL YOU STARVE TO DEATH.", - "YOU BECOME TRAPPED IN THE RAPIDS AND ARE CRUSHED BETWEEN THE ROCKS.", - "YOU WAIT AROUND FOR SOME TIME, BUT HANS STROHEIM NEVER SPEAKS TO YOU AGAIN. FINALLY YOU RETURN HOME KNOWING YOU HAVE FAILED.", - "DECIDING THAT YOU THREATEN HIM AND HIS WORK, HANS STROHEIM HAS THE NATIVES IN THE VILLAGE KILL YOU.", - "YOU DO NOT GET FAR ENOUGH AWAY BEFORE THE DYNAMITE EXPLODES AND YOU ARE BLOWN INTO A THOUSAND PIECES.", - "STANDING OUT IN THE OPEN YOU ARE EXPOSED TO THE HAIL OF BULLETS FROM SANCHEZ' MEN.", - "THE AMAZON SENTINELS SPOT YOU AND FILL YOU FULL OF ARROWS.", - "SAM MAY BE UGLY, BUT HE'S NOT DEAF. HE HEARS ALL THE NOISE YOU ARE MAKING AND CANCELS YOUR BOARDING PASS.", - "WITH THE BAR OFF THE DOOR THE CAPTAIN WALTZES IN AND BLOWS YOU AWAY" -}; - const int DEATH_CELLS[13][3] = { { 0, 94, 2 }, { 0, 94, 3 }, @@ -1984,94 +162,6 @@ const int CHAPTER_JUMP[14] = { 0, 12, 10, 15, 19, 25, 31, 36, 45, 46, 29, 55, 61, 0 }; -const int COMBO_TABLE[85][4] = { - { -1, -1, -1, -1 }, - { 12, 3, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { 24, 25, -1, -1 }, - { 10, 24, -1, -1 }, - { -1, -1, -1, -1 }, - { 8, 24, -1, -1 }, - { -1, -1, -1, -1 }, - { 1, 3, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { 7, 25, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { 80, 81, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { 41, 42, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { 39, 40, -1, -1 }, - { 38, 40, -1, -1 }, - { -1, -1, -1, -1 }, - { 32, 42, 77, 78 }, - { -1, -1, -1, -1 }, - { 60, 61, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { 73, 72, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { 64, 67, -1, -1 }, - { -1, -1, -1, -1 }, - { 59, 60, -1, -1 }, - { 58, 60, -1, -1 }, - { 43, 61, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { 56, 67, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { 50, 72, -1, -1 }, - { 75, 77, -1, -1 }, - { 74, 77, -1, -1 }, - { -1, -1, -1, -1 }, - { 41, 78, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { 29, 81, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 }, - { -1, -1, -1, -1 } -}; - const int ANTWALK[24] = { 0, 3, 0, 1, 5, 0, @@ -2349,8 +439,8 @@ RiverStruct RIVER2OBJECTS[54] = { RiverStruct *RIVER_OBJECTS[3][2] = { { RIVER0OBJECTS, RIVER0OBJECTS + 46 - 1}, - { RIVER1OBJECTS, RIVER0OBJECTS + 50 - 1 }, - { RIVER2OBJECTS, RIVER0OBJECTS + 54 - 1 } + { RIVER1OBJECTS, RIVER1OBJECTS + 50 - 1 }, + { RIVER2OBJECTS, RIVER2OBJECTS + 54 - 1 } }; const int HELP1COORDS[2][4] = { diff --git a/engines/access/amazon/amazon_resources.h b/engines/access/amazon/amazon_resources.h index 10dea02abc..20d90cc5b6 100644 --- a/engines/access/amazon/amazon_resources.h +++ b/engines/access/amazon/amazon_resources.h @@ -24,6 +24,8 @@ #define ACCESS_AMAZON_RESOURCES_H #include "common/scummsys.h" +#include "common/array.h" +#include "access/resources.h" namespace Access { @@ -42,9 +44,6 @@ struct RiverStruct { int _offsetY; }; -extern const char *const FILENAMES[]; -extern const char *const FILENAMES_DEMO[]; - extern const int SIDEOFFR[]; extern const int SIDEOFFL[]; extern const int SIDEOFFU[]; @@ -58,8 +57,6 @@ extern const int DIAGOFFULY[]; extern const int DIAGOFFDLX[]; extern const int DIAGOFFDLY[]; -extern const byte *const CURSORS[10]; - extern const int _travelPos[][2]; extern const int OVEROFFR[]; @@ -75,37 +72,6 @@ extern const int OVEROFFULY[]; extern const int OVEROFFDLX[]; extern const int OVEROFFDLY[]; -extern const byte *const ROOM_TABLE[]; -extern const char *const ROOM_DESCR[]; -extern const byte *const ROOM_TABLE_DEMO[]; -extern const int ROOM_NUMB; - -extern const byte *const CHARTBL[]; -extern const byte *const CHARTBL_DEMO[]; - -extern const char *const INVENTORY_NAMES[]; - -extern const int FONT2_INDEX[]; - -extern const byte FONT2_DATA[]; - -extern const int FONT6x6_INDEX[]; - -extern const byte FONT6x6_DATA[]; - -extern const char *const NO_HELP_MESSAGE; -extern const char *const NO_HINTS_MESSAGE; -extern const char *const RIVER_HIT1; -extern const char *const RIVER_HIT2; -extern const char *const BAR_MESSAGE; -extern const char *const HELPLVLTXT[3]; -extern const char *const IQLABELS[9]; -extern const byte DEATH_SCREENS[58]; -extern const byte DEATH_SCREENS_DEMO[34]; - -extern const char *const DEATH_TEXT[58]; -extern const char *const DEATH_TEXT_DEMO[34]; - extern const int DEATH_CELLS[13][3]; extern const int CHAPTER_CELLS[17][3]; @@ -155,6 +121,31 @@ extern const int CAST_END_OBJ1[4][4]; extern const int RMOUSE[10][2]; +class AmazonResources: public Resources { +protected: + /** + * Load data from the access.dat file + */ + virtual void load(Common::SeekableReadStream &s); +public: + Common::Array<int> FONT2_INDEX; + Common::Array<byte> FONT2_DATA; + Common::Array<int> FONT6x6_INDEX; + Common::Array<byte> FONT6x6_DATA; + Common::String NO_HELP_MESSAGE; + Common::String NO_HINTS_MESSAGE; + Common::String RIVER_HIT1; + Common::String RIVER_HIT2; + Common::String BAR_MESSAGE; + Common::String HELPLVLTXT[3]; + Common::String IQLABELS[9]; +public: + AmazonResources(AccessEngine *vm) : Resources(vm) {} + virtual ~AmazonResources() {} +}; + +#define AMRES (*((Amazon::AmazonResources *)_vm->_res)) + } // End of namespace Amazon } // End of namespace Access diff --git a/engines/access/amazon/amazon_room.cpp b/engines/access/amazon/amazon_room.cpp index 29742f66bd..c027f4e7c6 100644 --- a/engines/access/amazon/amazon_room.cpp +++ b/engines/access/amazon/amazon_room.cpp @@ -41,10 +41,7 @@ AmazonRoom::~AmazonRoom() { } void AmazonRoom::loadRoom(int roomNumber) { - if (_vm->isDemo()) - loadRoomData(ROOM_TABLE_DEMO[roomNumber]); - else - loadRoomData(ROOM_TABLE[roomNumber]); + loadRoomData(&AMRES.ROOMTBL[roomNumber]._data[0]); } void AmazonRoom::reloadRoom() { diff --git a/engines/access/amazon/amazon_scripts.cpp b/engines/access/amazon/amazon_scripts.cpp index d8f4663401..9ff6a2952d 100644 --- a/engines/access/amazon/amazon_scripts.cpp +++ b/engines/access/amazon/amazon_scripts.cpp @@ -401,10 +401,10 @@ void AmazonScripts::cmdHelp_v2() { _game->_useItem = 0; if (_game->_noHints) { - printString(NO_HELP_MESSAGE); + printString(AMRES.NO_HELP_MESSAGE); return; } else if (_game->_hintLevel == 0) { - printString(NO_HINTS_MESSAGE); + printString(AMRES.NO_HINTS_MESSAGE); return; } } diff --git a/engines/access/asurface.cpp b/engines/access/asurface.cpp index 526690807a..abae6bf703 100644 --- a/engines/access/asurface.cpp +++ b/engines/access/asurface.cpp @@ -258,7 +258,7 @@ void ASurface::transBlitFrom(ASurface &src) { blitFrom(src); } -void ASurface::blitFrom(Graphics::Surface &src) { +void ASurface::blitFrom(const Graphics::Surface &src) { assert(w >= src.w && h >= src.h); for (int y = 0; y < src.h; ++y) { const byte *srcP = (const byte *)src.getBasePtr(0, y); diff --git a/engines/access/asurface.h b/engines/access/asurface.h index 022e2534c1..ce9928c00e 100644 --- a/engines/access/asurface.h +++ b/engines/access/asurface.h @@ -107,7 +107,7 @@ public: virtual void transBlitFrom(ASurface &src); - virtual void blitFrom(Graphics::Surface &src); + virtual void blitFrom(const Graphics::Surface &src); virtual void copyBuffer(Graphics::Surface *src); diff --git a/engines/access/char.cpp b/engines/access/char.cpp index aca7262952..3e95208fe5 100644 --- a/engines/access/char.cpp +++ b/engines/access/char.cpp @@ -31,7 +31,7 @@ CharEntry::CharEntry(const byte *data, AccessEngine *vm) { Common::MemoryReadStream s(data, 999); _charFlag = s.readByte(); - if (vm->getGameID() == GType_MartianMemorandum) { + if (vm->getGameID() != GType_Amazon || vm->isDemo()) { _screenFile.load(s); _estabIndex = s.readSint16LE(); } else { @@ -78,25 +78,12 @@ CharEntry::CharEntry() { /*------------------------------------------------------------------------*/ CharManager::CharManager(AccessEngine *vm) : Manager(vm) { - switch (vm->getGameID()) { - case GType_Amazon: - // Setup character list - if (_vm->isDemo()) { - for (int i = 0; i < 27; ++i) - _charTable.push_back(CharEntry(Amazon::CHARTBL_DEMO[i], vm)); - } else { - for (int i = 0; i < 37; ++i) - _charTable.push_back(CharEntry(Amazon::CHARTBL[i], vm)); - } - break; - - case GType_MartianMemorandum: - for (int i = 0; i < 27; ++i) - _charTable.push_back(CharEntry(Martian::CHARTBL_MM[i], vm)); - break; - - default: - error("Unknown game"); + // Setup character list + for (uint idx = 0; idx < _vm->_res->CHARTBL.size(); ++idx) { + if (_vm->_res->CHARTBL[idx].size() == 0) + _charTable.push_back(CharEntry()); + else + _charTable.push_back(CharEntry(&_vm->_res->CHARTBL[idx][0], _vm)); } _charFlag = 0; diff --git a/engines/access/configure.engine b/engines/access/configure.engine index b1defce946..0082430062 100644 --- a/engines/access/configure.engine +++ b/engines/access/configure.engine @@ -1,3 +1,3 @@ # This file is included from the main "configure" script # add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps] -add_engine access "Access" no +add_engine access "Access" yes diff --git a/engines/access/debugger.cpp b/engines/access/debugger.cpp index 6cb2bb606c..48c7290249 100644 --- a/engines/access/debugger.cpp +++ b/engines/access/debugger.cpp @@ -52,35 +52,26 @@ Debugger *Debugger::init(AccessEngine *vm) { } } +void Debugger::postEnter() { + if (!_playMovieFile.empty()) { + _vm->playMovie(_playMovieFile, Common::Point(0, 0)); + + _playMovieFile.clear(); + } + + _vm->pauseEngine(false); +} + /*------------------------------------------------------------------------*/ Debugger::Debugger(AccessEngine *vm) : GUI::Debugger(), _vm(vm) { registerCmd("continue", WRAP_METHOD(Debugger, cmdExit)); registerCmd("scene", WRAP_METHOD(Debugger, Cmd_LoadScene)); registerCmd("cheat", WRAP_METHOD(Debugger, Cmd_Cheat)); - - switch (vm->getGameID()) { - case GType_Amazon: - _sceneNumb = Amazon::ROOM_NUMB; - _sceneDescr = new Common::String[_sceneNumb]; - for (int i = 0; i < _sceneNumb; i++) - _sceneDescr[i] = Common::String(Amazon::ROOM_DESCR[i]); - break; - case GType_MartianMemorandum: - _sceneNumb = Martian::ROOM_NUMB; - _sceneDescr = new Common::String[_sceneNumb]; - for (int i = 0; i < _sceneNumb; i++) - _sceneDescr[i] = Common::String(Martian::ROOM_DESCR[i]); - break; - default: - _sceneDescr = nullptr; - _sceneNumb = 0; - break; - } + registerCmd("playmovie", WRAP_METHOD(Debugger, Cmd_PlayMovie)); } Debugger::~Debugger() { - delete[] _sceneDescr; } bool Debugger::Cmd_LoadScene(int argc, const char **argv) { @@ -88,18 +79,18 @@ bool Debugger::Cmd_LoadScene(int argc, const char **argv) { case 1: debugPrintf("Current scene is: %d\n\n", _vm->_player->_roomNumber); - for (int i = 0; i < _sceneNumb; i++) - if (_sceneDescr[i].size()) - debugPrintf("%d - %s\n", i, _sceneDescr[i].c_str()); + for (uint i = 0; i < _vm->_res->ROOMTBL.size(); i++) + if (!_vm->_res->ROOMTBL[i]._desc.empty()) + debugPrintf("%d - %s\n", i, _vm->_res->ROOMTBL[i]._desc.c_str()); return true; case 2: { int newRoom = strToInt(argv[1]); - if (newRoom < 0 || newRoom >= _sceneNumb) { + if (newRoom < 0 || newRoom >= (int)_vm->_res->ROOMTBL.size()) { debugPrintf("Invalid Room Number\n"); return true; } - if (!_sceneDescr[newRoom].size()) { + if (_vm->_res->ROOMTBL[newRoom]._desc.empty()) { debugPrintf("Unused Room Number\n"); return true; } @@ -133,6 +124,19 @@ bool Debugger::Cmd_Cheat(int argc, const char **argv) { return true; } +bool Debugger::Cmd_PlayMovie(int argc, const char **argv) { + if (argc != 2) { + debugPrintf("Format: playmovie <movie-file>\n"); + return true; + } + + // play gets postponed until debugger is closed + Common::String filename = argv[1]; + _playMovieFile = filename; + + return cmdExit(0, 0); +} + /*------------------------------------------------------------------------*/ namespace Amazon { diff --git a/engines/access/debugger.h b/engines/access/debugger.h index f4d8df7634..641b85c19b 100644 --- a/engines/access/debugger.h +++ b/engines/access/debugger.h @@ -35,13 +35,14 @@ class AccessEngine; class Debugger : public GUI::Debugger { protected: AccessEngine *_vm; + Common::String _playMovieFile; bool Cmd_LoadScene(int argc, const char **argv); bool Cmd_Cheat(int argc, const char **argv); - Common::String *_sceneDescr; - int _sceneNumb; + bool Cmd_PlayMovie(int argc, const char **argv); public: static Debugger *init(AccessEngine *vm); + void postEnter(); public: Debugger(AccessEngine *vm); virtual ~Debugger(); diff --git a/engines/access/detection_tables.h b/engines/access/detection_tables.h index 124f5fcf0d..9556cd9f67 100644 --- a/engines/access/detection_tables.h +++ b/engines/access/detection_tables.h @@ -40,6 +40,22 @@ static const AccessGameDescription gameDescriptions[] = { 0 }, + { + // Amazon Guardians of Eden - Spanish + // Provided by dianiu in bug report #6958 + { + "amazon", + 0, + AD_ENTRY1s("c00.ap", "aeb429ff015596144c0df06886c84825", 303753), + Common::ES_ESP, + Common::kPlatformDOS, + ADGF_NO_FLAGS, + GUIO1(GUIO_NONE) + }, + GType_Amazon, + 0 + }, + // Amazon Guardians of Eden - Demo English { { diff --git a/engines/access/events.cpp b/engines/access/events.cpp index 6ffe67acfb..d62b05c33f 100644 --- a/engines/access/events.cpp +++ b/engines/access/events.cpp @@ -74,7 +74,7 @@ void EventsManager::setCursor(CursorType cursorId) { _invCursor.w / 2, _invCursor.h / 2, 0); } else { // Get a pointer to the mouse data to use, and get the cursor hotspot - const byte *srcP = Amazon::CURSORS[cursorId]; + const byte *srcP = &_vm->_res->CURSORS[cursorId][0]; int hotspotX = (int16)READ_LE_UINT16(srcP); int hotspotY = (int16)READ_LE_UINT16(srcP + 2); srcP += 4; diff --git a/engines/access/files.cpp b/engines/access/files.cpp index 4d734a67a9..b9c0f7080d 100644 --- a/engines/access/files.cpp +++ b/engines/access/files.cpp @@ -84,20 +84,6 @@ byte *Resource::data() { /*------------------------------------------------------------------------*/ FileManager::FileManager(AccessEngine *vm) : _vm(vm) { - switch (vm->getGameID()) { - case GType_Amazon: - if (_vm->isDemo()) - _filenames = &Amazon::FILENAMES_DEMO[0]; - else - _filenames = &Amazon::FILENAMES[0]; - break; - case GType_MartianMemorandum: - _filenames = &Martian::FILENAMES[0]; - break; - default: - error("Unknown game"); - } - _fileNumber = -1; _setPaletteFlag = true; } @@ -215,8 +201,8 @@ void FileManager::handleFile(Resource *res) { void FileManager::setAppended(Resource *res, int fileNum) { // Open the file for access - if (!res->_file.open(_filenames[fileNum])) - error("Could not open file %s", _filenames[fileNum]); + if (!res->_file.open(_vm->_res->FILENAMES[fileNum])) + error("Could not open file %s", _vm->_res->FILENAMES[fileNum].c_str()); // If a different file has been opened then previously, load its index if (_fileNumber != fileNum) { diff --git a/engines/access/files.h b/engines/access/files.h index 714ea44c75..d081934e91 100644 --- a/engines/access/files.h +++ b/engines/access/files.h @@ -70,7 +70,6 @@ public: class FileManager { private: AccessEngine *_vm; - const char * const *_filenames; void openFile(Resource *res, const Common::String &filename); diff --git a/engines/access/inventory.cpp b/engines/access/inventory.cpp index 3823b17283..d4a869be28 100644 --- a/engines/access/inventory.cpp +++ b/engines/access/inventory.cpp @@ -66,27 +66,9 @@ InventoryManager::InventoryManager(AccessEngine *vm) : Manager(vm) { _iconDisplayFlag = true; _boxNum = 0; - const char *const *names; - const int *combineP; - - switch (vm->getGameID()) { - case GType_Amazon: - names = Amazon::INVENTORY_NAMES; - combineP = &Amazon::COMBO_TABLE[0][0]; - _inv.resize(85); - for (uint i = 0; i < _inv.size(); ++i, combineP += 4) - _inv[i].load(names[i], combineP); - break; - case GType_MartianMemorandum: - names = Martian::INVENTORY_NAMES; - combineP = nullptr; - _inv.resize(55); - for (uint i = 0; i < _inv.size(); ++i) - _inv[i].load(names[i], nullptr); - break; - default: - error("Unknown game"); - } + _inv.resize(_vm->_res->INVENTORY.size()); + for (uint idx = 0; idx < _inv.size(); ++idx) + _inv[idx].load(_vm->_res->INVENTORY[idx]._desc, _vm->_res->INVENTORY[idx]._combo); for (uint i = 0; i < 26; ++i) { const int *r = INVCOORDS[i]; @@ -217,12 +199,15 @@ int InventoryManager::newDisplayInv() { } int InventoryManager::displayInv() { - int *inv = (int *) malloc (Martian::INVENTORY_SIZE * sizeof(int)); + int *inv = (int *) malloc(_vm->_res->INVENTORY.size() * sizeof(int)); + const char **names = (const char **)malloc(_vm->_res->INVENTORY.size() * sizeof(const char *)); - for (int i = 0; i < Martian::INVENTORY_SIZE; i++) + for (uint i = 0; i < _vm->_res->INVENTORY.size(); i++) { inv[i] = _inv[i]._value; + names[i] = _inv[i]._name.c_str(); + } _vm->_events->forceSetCursor(CURSOR_CROSSHAIRS); - _vm->_invBox->getList(Martian::INVENTORY_NAMES, inv); + _vm->_invBox->getList(names, inv); int btnSelected = 0; int boxX = _vm->_invBox->doBox_v1(_startInvItem, _startInvBox, btnSelected); diff --git a/engines/access/martian/martian_game.cpp b/engines/access/martian/martian_game.cpp index 3fdba8d260..4e858568fe 100644 --- a/engines/access/martian/martian_game.cpp +++ b/engines/access/martian/martian_game.cpp @@ -68,8 +68,8 @@ void MartianEngine::initVariables() { _timers.push_back(te); } - _player->_playerX = _player->_rawPlayer.x = _travelPos[_player->_roomNumber][0]; - _player->_playerY = _player->_rawPlayer.y = _travelPos[_player->_roomNumber][1]; + _player->_playerX = _player->_rawPlayer.x = _res->ROOMTBL[_player->_roomNumber]._travelPos.x; + _player->_playerY = _player->_rawPlayer.y = _res->ROOMTBL[_player->_roomNumber]._travelPos.y; _room->_selectCommand = -1; _events->setNormalCursor(CURSOR_CROSSHAIRS); _mouseMode = 0; @@ -280,10 +280,10 @@ void MartianEngine::doCredits() { void MartianEngine::setupGame() { // Load death list - _deaths.resize(20); - for (int i = 0; i < 20; ++i) { - _deaths[i]._screenId = Martian::DEATH_SCREENS[i]; - _deaths[i]._msg = Martian::DEATHMESSAGE[i]; + _deaths.resize(_res->DEATHS.size()); + for (uint idx = 0; idx < _deaths.size(); ++idx) { + _deaths[idx]._screenId = _res->DEATHS[idx]._screenId; + _deaths[idx]._msg = _res->DEATHS[idx]._msg; } // Setup timers @@ -297,14 +297,14 @@ void MartianEngine::setupGame() { } // Miscellaneous - // TODO: Replace with Martian fonts when located - _fonts._font1.load(Amazon::FONT6x6_INDEX, Amazon::FONT6x6_DATA); - _fonts._font2.load(Amazon::FONT2_INDEX, Amazon::FONT2_DATA); + Amazon::AmazonResources &res = *((Amazon::AmazonResources *)_res); + _fonts._font1.load(&res.FONT6x6_INDEX[0], &res.FONT6x6_DATA[0]); + _fonts._font2.load(&res.FONT2_INDEX[0], &res.FONT2_DATA[0]); // Set player room and position _player->_roomNumber = 7; - _player->_playerX = _player->_rawPlayer.x = _travelPos[_player->_roomNumber][0]; - _player->_playerY = _player->_rawPlayer.y = _travelPos[_player->_roomNumber][1]; + _player->_playerX = _player->_rawPlayer.x = _res->ROOMTBL[_player->_roomNumber]._travelPos.x; + _player->_playerY = _player->_rawPlayer.y = _res->ROOMTBL[_player->_roomNumber]._travelPos.y; } void MartianEngine::showDeathText(Common::String msg) { diff --git a/engines/access/martian/martian_resources.cpp b/engines/access/martian/martian_resources.cpp index 474ec2f71c..070fa0f7e3 100644 --- a/engines/access/martian/martian_resources.cpp +++ b/engines/access/martian/martian_resources.cpp @@ -27,691 +27,6 @@ namespace Access { namespace Martian { -const char *const FILENAMES[] = { - "R00.AP", "R01.AP", "R02.AP", "R03.AP", "R04.AP", "R05.AP", "R06.AP", "R07.AP", - "R08.AP", "R09.AP", "R10.AP", "R11.AP", "R12.AP", "R13.AP", "R14.AP", "R15.AP", - "R16.AP", "R17.AP", "R18.AP", "R19.AP", "R20.AP", "R21.AP", "R22.AP", "R23.AP", - "R24.AP", "R25.AP", "R26.AP", "R27.AP", "R28.AP", "R29.AP", "R30.AP", "R31.AP", - "R32.AP", "R33.AP", "R34.AP", "R35.AP", "R36.AP", "R37.AP", "R38.AP", "R39.AP", - "R40.AP","TITLE.AP","R42.AP","S01.AP", "R44.AP", "R45.AP","SOUND.AP","MUSIC.AP", - "DEAD.AP","EST.AP", "W02.AP", "C02.AP", "C05.AP", "C04.AP", "C10.AP", "C03.AP", - "C07.AP", "LOVE.AP","CAFE.AP","C08.AP", "C18.AP", "C19.AP", "C21.AP", "C23.AP", - "C12.AP", "C16.AP","CAFE1.AP","C05A.AP","C06.AP","C11.AP", "C13.AP", "C20.AP", - "C16A.AP","C09.AP", "R45.AP", "R46.AP", "R47.AP", "R48.AP", "R49.AP" -}; - -const byte MOUSE0[] = { - // hotspot x and y, uint16 LE - 0, 0, 0, 0, - // byte 1: number of skipped pixels - // byte 2: number of plotted pixels - // then, pixels - 0, 2, 0xF7, 5, - 0, 3, 0xF7, 0xF7, 5, - 0, 3, 0xF7, 0xF7, 5, - 0, 4, 0xF7, 0xF7, 0xF7, 5, - 0, 4, 0xF7, 0xF7, 0xF7, 5, - 0, 5, 0xF7, 0xF7, 0xF7, 0xF7, 5, - 0, 5, 0xF7, 0xF7, 0xF7, 0xF7, 5, - 0, 6, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 5, - 0, 6, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 5, - 0, 7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 5, - 0, 6, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 5, - 0, 5, 0xF7, 0xF7, 0xF7, 0xF7, 5, - 2, 3, 0xF7, 0xF7, 5, - 3, 3, 0xF7, 0xF7, 5, - 3, 3, 0xF7, 0xF7, 5, - 4, 2, 0xF7, 5 -}; -const byte MOUSE1[] = { - // hotspot x and y, uint16 LE - 7, 0, 7, 0, - // byte 1: number of skipped pixels - // byte 2: number of plotted pixels - // then, pixels - 6, 1, 0xF7, - 4, 5, 0xFF, 0xFF, 0, 0xFF, 0xFF, - 3, 7, 0xFF, 0, 0, 0, 0, 0, 0xFF, - 2, 9, 0xFF, 0, 0, 0, 0xF7, 0, 0, 0, 0xFF, - 1, 11, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, - 1, 11, 0xFF, 0, 0, 0, 0, 0xF7, 0, 0, 0, 0, 0xFF, - 0, 13, 0xF7, 0, 0, 0xF7, 0, 0xF7, 0, 0xF7, 0, 0xF7, 0, 0, 0xF7, - 1, 11, 0xFF, 0, 0, 0, 0, 0xF7, 0, 0, 0, 0, 0xFF, - 1, 11, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, - 2, 9, 0xFF, 0, 0, 0, 0xF7, 0, 0, 0, 0xFF, - 3, 7, 0xFF, 0, 0, 0, 0, 0, 0xFF, - 4, 5, 0xFF, 0xFF, 0, 0xFF, 0xFF, - 6, 1, 0xF7, - 0, 0, - 0, 0, - 0, 0 -}; -const byte MOUSE2[] = { - // hotspot x and y, uint16 LE - 8, 0, 8, 0, - // byte 1: number of skipped pixels - // byte 2: number of plotted pixels - // then, pixels - 0, 0, - 0, 0, - 7, 2, 4, 5, - 7, 2, 4, 5, - 7, 2, 4, 5, - 7, 2, 4, 5, - 7, 2, 4, 5, - 2, 12, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 5, - 7, 2, 4, 5, - 7, 2, 4, 5, - 7, 2, 4, 5, - 7, 2, 4, 5, - 7, 2, 4, 5, - 0, 0, - 0, 0, - 0, 0 -}; -const byte MOUSE3[] = { - // hotspot x and y, uint16 LE - 0, 0, 0, 0, - // byte 1: number of skipped pixels - // byte 2: number of plotted pixels - // then, pixels - 0, 11, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 0, 12, 6, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 5, - 0, 12, 6, 7, 7, 7, 7, 7, 7, 7, 7, 6, 5, 5, - 0, 12, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, - 0, 12, 6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 5, - 0, 12, 6, 6, 6, 6, 5, 0, 0, 6, 6, 6, 6, 5, - 0, 12, 6, 6, 6, 6, 6, 0, 6, 6, 6, 6, 6, 5, - 0, 12, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, - 0, 12, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, - 0, 12, 6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 5, - 0, 12, 6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 5, - 0, 12, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, - 1, 11, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 0, 0, - 0, 0, - 0, 0 -}; -const byte *const CURSORS[4] = { MOUSE0, MOUSE1, MOUSE2, MOUSE3 }; - -const int _travelPos[][2] = { - { -1, 0 }, - { 228, 117 }, - { 28, 98 }, - { 161, 140 }, - { 160, 116 }, - { 34, 119 }, - { 166, 105 }, - { 260, 126 }, - { 37, 107 }, - { 78, 139 }, - { 0, 0 }, - { 13, 112 }, - { 0, 0 }, - { 16, 122 }, - { 33, 126 }, - { 10, 160 }, - { 150, 102 }, - { 134, 160 }, - { 160, 76 }, - { 0, 0 }, - { 0, 0 }, - { 36, 116 }, - { 214, 113 }, - { 30, 127 }, - { 143, 131 }, - { 163, 103 }, - { 254, 106 }, - { 28, 161 }, - { 11, 164 }, - { 276, 134 }, - { 93, 118 }, - { 22, 150 }, - { 282, 156 }, - { 149, 92 }, - { 0, 0 }, - { 43, 410 }, - { 0, 0 }, - { 10, 136 }, - { 41, 100 }, - { 157, 97 }, - { -1, 5 }, - { -1, 4 }, - { -1, 10 }, - { -1, 7 }, - { -1, 3 }, - { -1, 8 }, - { -1, 6 }, - { -1, 20 }, - { -1, 18 }, - { -1, 19 }, - { -1, 21 } -}; - -const int INVENTORY_SIZE = 55; -const char *const INVENTORY_NAMES[] = { - "CAMERA", "LENS", "PHOTOS", "MAIL", "GUN", - "CASH", "COMLINK", "AMMO", "LOCKPICK KIT", "EARRING", - "RECIEPTS", "PAPER", "LADDER", "BOOTS", "DOCUMENTS", - "KNIFE", "DAGGER", "KEYS", "ROCK", "LOG", - "SHOVEL", "STONE", "REMOTE CONTROL", "FOOD AND WATER", "DOOR CARD KEY", - "FLASHLIGHT", "INTERLOCK KEY", "TOOLS", "REBREATHER", "JET PACK", - "ROD", "HCL2", "SAFE CARD KEY", "TUNING FORK", "STONE", - "ROSE", "KEY", "NOTE", "ALLEN WRENCH", "HOVER BOARD", - "BLUE PRINTS", "LETTER", "MEMORANDUM", "MARKERS", "FILM", - "ANDRETTI FILM", "GLASSES", "AMULET", "FACIAL KIT", "CAT FOOD", - "MONKEY WRENCH", "BIG DICK CARD", "BRA", "BOLT", nullptr -}; - -const byte ROOM_TABLE1[] = { - 0x00, 0x2f, 0x00, 0x0d, 0x00, 0x30, 0x22, 0x30, 0x01, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x00, 0x03, 0x00, 0xff, 0x01, 0x00, - 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0xc0, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x2e, 0x00, 0x05, 0x00, 0x01, 0x00, 0xff, 0xff, -}; -const byte ROOM_TABLE2[] = { - 0x00, 0x2f, 0x00, 0x0d, 0x00, 0x32, 0x28, 0x25, 0x02, 0x00, - 0x00, 0x00, 0x02, 0x02, 0x00, 0x03, 0x00, 0xff, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0xc8, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x2e, 0x00, 0x06, 0x00, 0x01, 0x00, 0xff, 0xff, -}; -const byte ROOM_TABLE3[] = { - 0x00, 0x2f, 0x00, 0x0f, 0x00, 0x1e, 0x19, 0x24, 0x03, 0x00, - 0x00, 0x00, 0x03, 0x03, 0x00, 0x03, 0x00, 0xff, 0x03, 0x00, - 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x78, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x03, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x05, 0x00, - 0x01, 0x00, 0x03, 0x00, 0x06, 0x00, 0x01, 0x00, 0x2e, 0x00, - 0x01, 0x00, 0x01, 0x00, 0xff, 0xff, -}; -const byte ROOM_TABLE4[] = { - 0x00, 0x2f, 0x00, 0x06, 0x00, 0x36, 0x27, 0x32, 0x04, 0x00, - 0x00, 0x00, 0x04, 0x04, 0x00, 0x03, 0x00, 0xff, 0x04, 0x00, - 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0xc8, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x2e, 0x00, 0x07, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x05, 0x00, - 0x01, 0x00, 0xff, 0xff, -}; -const byte ROOM_TABLE5[] = { - 0x00, 0x2f, 0x00, 0x00, 0x00, 0x28, 0x19, 0x36, 0x05, 0x00, - 0x00, 0x00, 0x05, 0x05, 0x00, 0x03, 0x00, 0xff, 0x05, 0x00, - 0x02, 0x00, 0x05, 0x00, 0x01, 0x00, 0xa0, 0x20, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x2e, 0x00, 0x02, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x03, 0x00, - 0x01, 0x00, 0xff, 0xff, -}; -const byte ROOM_TABLE6[] = { - 0x00, 0x2f, 0x00, 0x07, 0x00, 0x40, 0x36, 0x36, 0x06, 0x00, - 0x00, 0x00, 0x06, 0x06, 0x00, 0x03, 0x00, 0xff, 0x06, 0x00, - 0x02, 0x00, 0x06, 0x00, 0x01, 0x00, 0xfe, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x2e, 0x00, 0x13, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x08, 0x00, - 0x01, 0x00, 0x2e, 0x00, 0x14, 0x00, 0x01, 0x00, 0x2e, 0x00, - 0x07, 0x00, 0x01, 0x00, 0xff, 0xff, -}; -const byte ROOM_TABLE7[] = { - 0x00, 0x2f, 0x00, 0x0e, 0x00, 0x40, 0x32, 0x3b, 0x07, 0x00, - 0x00, 0x00, 0x07, 0x07, 0x00, 0x03, 0x00, 0xff, 0x07, 0x00, - 0x02, 0x00, 0x07, 0x00, 0x01, 0x00, 0xfe, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x2e, 0x00, 0x14, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x07, 0x00, - 0x01, 0x00, 0xff, 0xff, -}; -const byte ROOM_TABLE8[] = { - 0x00, 0x2f, 0x00, 0x0a, 0x00, 0x30, 0x22, 0x46, 0x08, 0x00, - 0x00, 0x00, 0x08, 0x08, 0x00, 0x03, 0x00, 0xff, 0x08, 0x00, - 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 0xc0, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0xff, 0xff, -}; -const byte ROOM_TABLE9[] = { - 0x00, 0x2f, 0x00, 0x07, 0x00, 0x32, 0x0c, 0x29, 0x09, 0x00, - 0x00, 0x00, 0x09, 0x09, 0x00, 0x03, 0x00, 0xff, 0x09, 0x00, - 0x02, 0x00, 0x09, 0x00, 0x01, 0x00, 0xc8, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0xff, 0xff, -}; -const byte ROOM_TABLE11[] = { - 0x00, 0x2f, 0x00, 0x00, 0x00, 0x40, 0x3a, 0x22, 0x0b, 0x00, - 0x00, 0x00, 0x0b, 0x0b, 0x00, 0x03, 0x00, 0xff, 0x0b, 0x00, - 0x02, 0x00, 0x0b, 0x00, 0x01, 0x00, 0xfe, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0xff, 0xff, -}; -const byte ROOM_TABLE13[] = { - 0x00, 0x2f, 0x00, 0x0c, 0x00, 0x40, 0x36, 0x2c, 0x0d, 0x00, - 0x00, 0x00, 0x0d, 0x0d, 0x00, 0x03, 0x00, 0xff, 0x0d, 0x00, - 0x02, 0x00, 0x0d, 0x00, 0x01, 0x00, 0xe6, 0x40, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x2e, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x07, 0x00, - 0x01, 0x00, 0x2e, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x2e, 0x00, - 0x15, 0x00, 0x01, 0x00, 0xff, 0xff, -}; -const byte ROOM_TABLE14[] = { - 0x00, 0x2f, 0x00, 0x05, 0x00, 0x40, 0x3e, 0x33, 0x0e, 0x00, - 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x03, 0x00, 0xff, 0x0e, 0x00, - 0x02, 0x00, 0x0e, 0x00, 0x01, 0x00, 0xfe, 0x40, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x2e, 0x00, 0x09, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x07, 0x00, - 0x01, 0x00, 0x2e, 0x00, 0x13, 0x00, 0x01, 0x00, 0x2e, 0x00, - 0x0a, 0x00, 0x01, 0x00, 0xff, 0xff, -}; -const byte ROOM_TABLE15[] = { - 0x00, 0x2f, 0x00, 0x0c, 0x00, 0x28, 0x0c, 0x5e, 0x0f, 0x00, - 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x03, 0x00, 0xff, 0x0f, 0x00, - 0x02, 0x00, 0x0f, 0x00, 0x01, 0x00, 0xb4, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x2e, 0x00, 0x11, 0x00, 0x01, 0x00, 0xff, 0xff, -}; -const byte ROOM_TABLE16[] = { - 0x00, 0x2f, 0x00, 0x05, 0x00, 0x28, 0x1e, 0x24, 0x10, 0x00, - 0x00, 0x00, 0x10, 0x10, 0x00, 0x03, 0x00, 0xff, 0x10, 0x00, - 0x02, 0x00, 0x10, 0x00, 0x01, 0x00, 0xa0, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x2e, 0x00, 0x07, 0x00, 0x01, 0x00, 0xff, 0xff, -}; -const byte ROOM_TABLE17[] = { - 0x00, 0x2f, 0x00, 0x06, 0x00, 0x28, 0x19, 0x2b, 0x11, 0x00, - 0x00, 0x00, 0x11, 0x11, 0x00, 0x03, 0x00, 0xff, 0x11, 0x00, - 0x02, 0x00, 0x11, 0x00, 0x01, 0x00, 0xa0, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x2e, 0x00, 0x05, 0x00, 0x01, 0x00, 0xff, 0xff, -}; -const byte ROOM_TABLE18[] = { - 0x00, 0x2f, 0x00, 0x00, 0x00, 0x2d, 0x14, 0x3c, 0x12, 0x00, - 0x00, 0x00, 0x12, 0x12, 0x00, 0x03, 0x00, 0xff, 0x12, 0x00, - 0x02, 0x00, 0x12, 0x00, 0x01, 0x00, 0xb1, 0x40, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x2e, 0x00, 0x05, 0x00, 0x01, 0x00, 0xff, 0xff, -}; -const byte ROOM_TABLE21[] = { - 0x00, 0x2f, 0x00, 0x07, 0x00, 0x3c, 0x2a, 0x29, 0x15, 0x00, - 0x00, 0x00, 0x15, 0x15, 0x00, 0x03, 0x00, 0xff, 0x15, 0x00, - 0x02, 0x00, 0x15, 0x00, 0x01, 0x00, 0xf0, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x2e, 0x00, 0x12, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x07, 0x00, - 0x01, 0x00, 0xff, 0xff, -}; -const byte ROOM_TABLE22[] = { - 0x00, 0x2f, 0x00, 0x0a, 0x00, 0x40, 0x2d, 0x27, 0x16, 0x00, - 0x00, 0x00, 0x16, 0x16, 0x00, 0x03, 0x00, 0xff, 0x16, 0x00, - 0x02, 0x00, 0x16, 0x00, 0x01, 0x00, 0xfe, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x2e, 0x00, 0x16, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x07, 0x00, - 0x01, 0x00, 0xff, 0xff, -}; -const byte ROOM_TABLE23[] = { - 0x00, 0x2f, 0x00, 0x0a, 0x00, 0x40, 0x38, 0x24, 0x17, 0x00, - 0x00, 0x00, 0x17, 0x17, 0x00, 0x03, 0x00, 0xff, 0x17, 0x00, - 0x02, 0x00, 0x17, 0x00, 0x01, 0x00, 0xfe, 0x40, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x2e, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x17, 0x00, - 0x01, 0x00, 0xff, 0xff, -}; -const byte ROOM_TABLE24[] = { - 0x00, 0x2f, 0x00, 0x06, 0x00, 0x3e, 0x10, 0x62, 0x18, 0x00, - 0x00, 0x00, 0x18, 0x18, 0x00, 0x03, 0x00, 0xff, 0x18, 0x00, - 0x02, 0x00, 0x18, 0x00, 0x01, 0x00, 0xf8, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x2e, 0x00, 0x16, 0x00, 0x01, 0x00, 0xff, 0xff, -}; -const byte ROOM_TABLE25[] = { - 0x00, 0x2f, 0x00, 0x0e, 0x00, 0x3e, 0x37, 0x19, 0x19, 0x00, - 0x00, 0x00, 0x19, 0x19, 0x00, 0x03, 0x00, 0xff, 0x19, 0x00, - 0x02, 0x00, 0x19, 0x00, 0x01, 0x00, 0xf8, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x2e, 0x00, 0x10, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x07, 0x00, - 0x01, 0x00, 0xff, 0xff, -}; -const byte ROOM_TABLE26[] = { - 0x00, 0x2f, 0x00, 0x06, 0x00, 0x34, 0x28, 0x28, 0x1a, 0x00, - 0x00, 0x00, 0x1a, 0x1a, 0x00, 0x03, 0x00, 0xff, 0x1a, 0x00, - 0x02, 0x00, 0x1a, 0x00, 0x01, 0x00, 0xd0, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x2e, 0x00, 0x07, 0x00, 0x01, 0x00, 0xff, 0xff, -}; -const byte ROOM_TABLE27[] = { - 0x00, 0x2f, 0x00, 0x0f, 0x00, 0x1b, 0x16, 0x18, 0x1b, 0x00, - 0x00, 0x00, 0x1b, 0x1b, 0x00, 0x03, 0x00, 0xff, 0x1b, 0x00, - 0x02, 0x00, 0x1b, 0x00, 0x01, 0x00, 0x70, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x2e, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x07, 0x00, - 0x01, 0x00, 0xff, 0xff, -}; -const byte ROOM_TABLE28[] = { - 0x00, 0x2f, 0x00, 0x09, 0x00, 0x25, 0x10, 0x43, 0x1c, 0x00, - 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x03, 0x00, 0xff, 0x1c, 0x00, - 0x02, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x94, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0xff, 0xff, -}; -const byte ROOM_TABLE29[] = { - 0x00, 0x2f, 0x00, 0x0a, 0x00, 0x20, 0x18, 0x56, 0x1d, 0x00, - 0x00, 0x00, 0x1d, 0x1d, 0x00, 0x03, 0x00, 0xff, 0x1d, 0x00, - 0x02, 0x00, 0x1d, 0x00, 0x01, 0x00, 0x80, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x2e, 0x00, 0x17, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x10, 0x00, - 0x02, 0x00, 0xff, 0xff, -}; -const byte ROOM_TABLE30[] = { - 0x00, 0x2f, 0x00, 0x07, 0x00, 0x3f, 0x1c, 0x27, 0x1e, 0x00, - 0x00, 0x00, 0x1e, 0x1e, 0x00, 0x03, 0x00, 0xff, 0x1e, 0x00, - 0x02, 0x00, 0x1e, 0x00, 0x01, 0x00, 0xfe, 0x00, 0xff, 0xff, - 0xff, 0xff, 0x1e, 0x00, 0x04, 0x00, 0xff, 0xff, 0x2e, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x07, 0x00, 0x01, 0x00, - 0x2e, 0x00, 0x15, 0x00, 0x01, 0x00, 0xff, 0xff, -}; -const byte ROOM_TABLE31[] = { - 0x00, 0x2f, 0x00, 0x0d, 0x00, 0x32, 0x2e, 0x69, 0x1f, 0x00, - 0x00, 0x00, 0x1f, 0x1f, 0x00, 0x03, 0x00, 0xff, 0x1f, 0x00, - 0x02, 0x00, 0x1f, 0x00, 0x01, 0x00, 0xc8, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0xff, 0xff, -}; -const byte ROOM_TABLE32[] = { - 0x00, 0x2f, 0x00, 0x07, 0x00, 0x40, 0x3b, 0x4b, 0x20, 0x00, - 0x00, 0x00, 0x20, 0x20, 0x00, 0x03, 0x00, 0xff, 0x20, 0x00, - 0x02, 0x00, 0x20, 0x00, 0x01, 0x00, 0xfe, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x2e, 0x00, 0x05, 0x00, 0x01, 0x00, 0xff, 0xff, -}; -const byte ROOM_TABLE33[] = { - 0x00, 0x2f, 0x00, 0x0b, 0x00, 0x30, 0x10, 0x51, 0x21, 0x00, - 0x00, 0x00, 0x21, 0x21, 0x00, 0x03, 0x00, 0xff, 0x21, 0x00, - 0x02, 0x00, 0x21, 0x00, 0x01, 0x00, 0xc0, 0x40, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0xff, 0xff, -}; -const byte ROOM_TABLE35[] = { - 0x00, 0x2f, 0x00, 0x0f, 0x00, 0x1e, 0x18, 0x25, 0x23, 0x00, - 0x00, 0x00, 0x23, 0x23, 0x00, 0x03, 0x00, 0xff, 0x23, 0x00, - 0x02, 0x00, 0x23, 0x00, 0x01, 0x00, 0x78, 0x18, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x2e, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x07, 0x00, - 0x01, 0x00, 0x2e, 0x00, 0x16, 0x00, 0x01, 0x00, 0x2e, 0x00, - 0x0c, 0x00, 0x01, 0x00, 0xff, 0xff, -}; -const byte ROOM_TABLE37[] = { - 0x00, 0x2f, 0x00, 0x0f, 0x00, 0x3f, 0x3a, 0x1a, 0x25, 0x00, - 0x00, 0x00, 0x25, 0x25, 0x00, 0x03, 0x00, 0xff, 0x25, 0x00, - 0x02, 0x00, 0x25, 0x00, 0x01, 0x00, 0xfe, 0x40, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x2e, 0x00, 0x0d, 0x00, 0x01, 0x00, 0xff, 0xff, -}; -const byte ROOM_TABLE38[] = { - 0x00, 0x2f, 0x00, 0x0d, 0x00, 0x40, 0x32, 0x32, 0x26, 0x00, - 0x00, 0x00, 0x26, 0x26, 0x00, 0x03, 0x00, 0xff, 0x26, 0x00, - 0x02, 0x00, 0x26, 0x00, 0x01, 0x00, 0xf0, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x2e, 0x00, 0x0b, 0x00, 0x01, 0x00, 0xff, 0xff, -}; -const byte ROOM_TABLE39[] = { - 0x00, 0x2f, 0x00, 0x0a, 0x00, 0x3c, 0x10, 0x4c, 0x27, 0x00, - 0x00, 0x00, 0x27, 0x27, 0x00, 0x03, 0x00, 0xff, 0x27, 0x00, - 0x02, 0x00, 0x27, 0x00, 0x01, 0x00, 0xf0, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x2e, 0x00, 0x11, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x0f, 0x00, - 0x01, 0x00, 0xff, 0xff, -}; -const byte ROOM_TABLE47[] = { - 0x00, 0x2f, 0x00, 0x06, 0x00, 0x28, 0x1e, 0x32, 0x2b, 0x00, - 0x00, 0x00, 0x46, 0x2b, 0x00, 0x03, 0x00, 0xff, 0x2b, 0x00, - 0x02, 0x00, 0x2b, 0x00, 0x01, 0x00, 0xf0, 0x00, 0xff, 0xff, - 0xff, 0xff, 0x2b, 0x00, 0x04, 0x00, 0xff, 0xff, 0x2e, 0x00, - 0x04, 0x00, 0x01, 0x00, 0xff, 0xff, 0x00, -}; -const byte *const ROOM_TABLE[] = { - nullptr, ROOM_TABLE1, ROOM_TABLE2, ROOM_TABLE3, ROOM_TABLE4, ROOM_TABLE5, ROOM_TABLE6, - ROOM_TABLE7, ROOM_TABLE8, ROOM_TABLE9, nullptr, ROOM_TABLE11, nullptr, ROOM_TABLE13, - ROOM_TABLE14, ROOM_TABLE15, ROOM_TABLE16, ROOM_TABLE17, ROOM_TABLE18, nullptr, nullptr, - ROOM_TABLE21, ROOM_TABLE22, ROOM_TABLE23, ROOM_TABLE24, ROOM_TABLE25, ROOM_TABLE26, ROOM_TABLE27, - ROOM_TABLE28, ROOM_TABLE29, ROOM_TABLE30, ROOM_TABLE31, ROOM_TABLE32, ROOM_TABLE33, nullptr, - ROOM_TABLE35, nullptr, ROOM_TABLE37, ROOM_TABLE38, ROOM_TABLE39, nullptr, nullptr, - nullptr, nullptr, nullptr, nullptr, nullptr, ROOM_TABLE47 -}; - -const char *const ROOM_DESCR[] = { - nullptr, "TBD ROOM_TABLE1", "TBD ROOM_TABLE2", "TBD ROOM_TABLE3", "TBD ROOM_TABLE4", - "TBD ROOM_TABLE5", "TBD ROOM_TABLE6", "TBD ROOM_TABLE7", "TBD ROOM_TABLE8", "TBD ROOM_TABLE9", - nullptr, "TBD ROOM_TABLE11", nullptr, "TBD ROOM_TABLE13", "TBD ROOM_TABLE14", - "TBD ROOM_TABLE15", "TBD ROOM_TABLE16", "TBD ROOM_TABLE17", "TBD ROOM_TABLE18", nullptr, - nullptr, "TBD ROOM_TABLE21", "TBD ROOM_TABLE22", "TBD ROOM_TABLE23", "TBD ROOM_TABLE24", - "TBD ROOM_TABLE25", "TBD ROOM_TABLE26", "TBD ROOM_TABLE27", "TBD ROOM_TABLE28", "TBD ROOM_TABLE29", - "TBD ROOM_TABLE30", "TBD ROOM_TABLE31", "TBD ROOM_TABLE32", "TBD ROOM_TABLE33", nullptr, - "TBD ROOM_TABLE35", nullptr, "TBD ROOM_TABLE37", "TBD ROOM_TABLE38", "TBD ROOM_TABLE39", - nullptr, nullptr, nullptr, nullptr, nullptr, - nullptr, nullptr, "TBD ROOM_TABLE47" -}; - -const int ROOM_NUMB = 48; - -const byte MMCHAR_0[] = { - 0x02, 0x31, 0x00, 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, -}; -const byte MMCHAR_2[] = { - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x32, 0x33, 0x00, 0x01, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x33, 0x00, 0x00, 0x00, 0x33, - 0x00, 0x02, 0x00, 0x33, 0x00, 0x0b, 0x00, 0x33, 0x00, 0x03, - 0x00, 0x33, 0x00, 0x0c, 0x00, 0x33, 0x00, 0x04, 0x00, 0x33, - 0x00, 0x0d, 0x00, 0x33, 0x00, 0x05, 0x00, 0x33, 0x00, 0x0e, - 0x00, 0x33, 0x00, 0x06, 0x00, 0x33, 0x00, 0x0f, 0x00, 0x33, - 0x00, 0x07, 0x00, 0x33, 0x00, 0x10, 0x00, 0x33, 0x00, 0x08, - 0x00, 0x33, 0x00, 0x11, 0x00, 0x33, 0x00, 0x09, 0x00, 0x33, - 0x00, 0x12, 0x00, 0x33, 0x00, 0x0a, 0x00, 0x33, 0x00, 0x13, - 0x00, 0xff, 0xff, -}; -const byte MMCHAR_3[] = { - 0x02, 0x31, 0x00, 0x03, 0x00, 0x35, 0x00, 0x37, 0x00, 0x02, - 0x00, 0x80, 0x00, 0xf7, 0x00, 0x4b, 0x37, 0x00, 0x01, 0x00, - 0xff, 0x37, 0x00, 0x03, 0x00, 0x37, 0x00, 0x00, 0x00, 0xff, - 0xff, -}; -const byte MMCHAR_4[] = { - 0x01, 0x31, 0x00, 0x0a, 0x00, 0x36, 0x00, 0x35, 0x00, 0x02, - 0x00, 0x80, 0x00, 0xf7, 0x00, 0x49, 0x35, 0x00, 0x01, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x35, 0x00, 0x00, 0x00, 0x35, - 0x00, 0x03, 0x00, 0x35, 0x00, 0x0c, 0x00, 0x35, 0x00, 0x04, - 0x00, 0x35, 0x00, 0x0d, 0x00, 0x35, 0x00, 0x05, 0x00, 0x35, - 0x00, 0x0e, 0x00, 0x35, 0x00, 0x06, 0x00, 0x35, 0x00, 0x0f, - 0x00, 0x35, 0x00, 0x07, 0x00, 0x35, 0x00, 0x10, 0x00, 0x35, - 0x00, 0x08, 0x00, 0x35, 0x00, 0x11, 0x00, 0x35, 0x00, 0x09, - 0x00, 0x35, 0x00, 0x12, 0x00, 0x35, 0x00, 0x0a, 0x00, 0x35, - 0x00, 0x13, 0x00, 0x35, 0x00, 0x0b, 0x00, 0x35, 0x00, 0x14, - 0x00, 0xff, 0xff, -}; -const byte MMCHAR_5[] = { - 0x01, 0x31, 0x00, 0x08, 0x00, 0x37, 0x00, 0x34, 0x00, 0x02, - 0x00, 0x80, 0x00, 0xf7, 0x00, 0x48, 0x34, 0x00, 0x01, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x43, - 0x00, 0x00, 0x00, 0x34, 0x00, 0x03, 0x00, 0x43, 0x00, 0x01, - 0x00, 0x34, 0x00, 0x04, 0x00, 0x43, 0x00, 0x02, 0x00, 0x34, - 0x00, 0x05, 0x00, 0x43, 0x00, 0x03, 0x00, 0x34, 0x00, 0x06, - 0x00, 0x43, 0x00, 0x04, 0x00, 0x34, 0x00, 0x07, 0x00, 0x43, - 0x00, 0x05, 0x00, 0x34, 0x00, 0x08, 0x00, 0x43, 0x00, 0x06, - 0x00, 0x34, 0x00, 0x09, 0x00, 0x43, 0x00, 0x07, 0x00, 0x34, - 0x00, 0x0a, 0x00, 0x43, 0x00, 0x08, 0x00, 0x34, 0x00, 0x0b, - 0x00, 0x43, 0x00, 0x09, 0x00, 0x34, 0x00, 0x0c, 0x00, 0x43, - 0x00, 0x0a, 0x00, 0x34, 0x00, 0x0d, 0x00, 0x43, 0x00, 0x0b, - 0x00, 0x34, 0x00, 0x0e, 0x00, 0x43, 0x00, 0x0c, 0x00, 0x34, - 0x00, 0x0f, 0x00, 0x43, 0x00, 0x0d, 0x00, 0x34, 0x00, 0x10, - 0x00, 0xff, 0xff, -}; -const byte MMCHAR_6[] = { - 0x02, 0x31, 0x00, 0x03, 0x00, 0x38, 0x00, 0x44, 0x00, 0x03, - 0x00, 0x80, 0x00, 0xf7, 0x00, 0x4e, 0x44, 0x00, 0x01, 0x00, - 0xff, 0x44, 0x00, 0x02, 0x00, 0x44, 0x00, 0x00, 0x00, 0xff, - 0xff, -}; -const byte MMCHAR_7[] = { - 0x02, 0x31, 0x00, 0x01, 0x00, 0x39, 0x00, 0x38, 0x00, 0x02, - 0x00, 0x80, 0x00, 0xf7, 0x00, 0x4c, 0x38, 0x00, 0x01, 0x00, - 0xff, 0x38, 0x00, 0x03, 0x00, 0x38, 0x00, 0x00, 0x00, 0xff, - 0xff, -}; -const byte MMCHAR_8[] = { - 0x03, 0xff, 0xff, 0xff, 0xff, 0x3a, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x3b, 0x00, 0x01, 0x00, - 0xff, 0x3b, 0x00, 0x02, 0x00, 0x3b, 0x00, 0x00, 0x00, 0xff, - 0xff, -}; -const byte MMCHAR_9[] = { - 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x59, 0x4a, 0x00, 0x01, 0x00, - 0xff, 0x4a, 0x00, 0x02, 0x00, 0x4a, 0x00, 0x00, 0x00, 0xff, - 0xff, -}; -const byte MMCHAR_10[] = { - 0x01, 0x31, 0x00, 0x0a, 0x00, 0x3c, 0x00, 0x36, 0x00, 0x02, - 0x00, 0x80, 0x00, 0xf7, 0x00, 0x4a, 0x36, 0x00, 0x01, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x36, 0x00, 0x00, 0x00, 0x36, - 0x00, 0x03, 0x00, 0x36, 0x00, 0x13, 0x00, 0x36, 0x00, 0x04, - 0x00, 0x36, 0x00, 0x14, 0x00, 0x36, 0x00, 0x05, 0x00, 0x36, - 0x00, 0x15, 0x00, 0x36, 0x00, 0x06, 0x00, 0x36, 0x00, 0x16, - 0x00, 0x36, 0x00, 0x07, 0x00, 0x36, 0x00, 0x17, 0x00, 0x36, - 0x00, 0x08, 0x00, 0x36, 0x00, 0x18, 0x00, 0x36, 0x00, 0x09, - 0x00, 0x36, 0x00, 0x19, 0x00, 0x36, 0x00, 0x0a, 0x00, 0x36, - 0x00, 0x1a, 0x00, 0x36, 0x00, 0x0b, 0x00, 0x36, 0x00, 0x1b, - 0x00, 0x36, 0x00, 0x0c, 0x00, 0x36, 0x00, 0x1c, 0x00, 0x36, - 0x00, 0x0d, 0x00, 0x36, 0x00, 0x1d, 0x00, 0x36, 0x00, 0x0e, - 0x00, 0x36, 0x00, 0x1e, 0x00, 0x36, 0x00, 0x0f, 0x00, 0x36, - 0x00, 0x1f, 0x00, 0x36, 0x00, 0x10, 0x00, 0x36, 0x00, 0x20, - 0x00, 0x36, 0x00, 0x11, 0x00, 0x36, 0x00, 0x21, 0x00, 0x36, - 0x00, 0x12, 0x00, 0x36, 0x00, 0x22, 0x00, 0xff, 0xff, -}; -const byte MMCHAR_11[] = { - 0x03, 0xff, 0xff, 0xff, 0xff, 0x3d, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x55, 0x45, 0x00, 0x01, 0x00, - 0xff, 0x45, 0x00, 0x02, 0x00, 0x45, 0x00, 0x00, 0x00, 0xff, - 0xff, -}; -const byte MMCHAR_12[] = { - 0x03, 0xff, 0xff, 0xff, 0xff, 0x3e, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x40, 0x00, 0x01, 0x00, - 0xff, 0x40, 0x00, 0x02, 0x00, 0x40, 0x00, 0x00, 0x00, 0xff, - 0xff, -}; -const byte MMCHAR_13[] = { - 0x00, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x46, 0x00, 0x02, - 0x00, 0x80, 0x00, 0xf7, 0x00, 0x56, 0x46, 0x00, 0x01, 0x00, - 0xff, 0x46, 0x00, 0x03, 0x00, 0x46, 0x00, 0x00, 0x00, 0x46, - 0x00, 0x04, 0x00, 0x46, 0x00, 0x0d, 0x00, 0x46, 0x00, 0x05, - 0x00, 0x46, 0x00, 0x0e, 0x00, 0x46, 0x00, 0x06, 0x00, 0x46, - 0x00, 0x0f, 0x00, 0x46, 0x00, 0x07, 0x00, 0x46, 0x00, 0x10, - 0x00, 0x46, 0x00, 0x08, 0x00, 0x46, 0x00, 0x11, 0x00, 0x46, - 0x00, 0x09, 0x00, 0x46, 0x00, 0x12, 0x00, 0x46, 0x00, 0x0a, - 0x00, 0x46, 0x00, 0x13, 0x00, 0x46, 0x00, 0x0b, 0x00, 0x46, - 0x00, 0x14, 0x00, 0x46, 0x00, 0x0c, 0x00, 0x46, 0x00, 0x15, - 0x00, 0xff, 0xff, -}; -const byte MMCHAR_15[] = { - 0x00, 0xff, 0xff, 0xff, 0xff, 0x41, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x57, 0x47, 0x00, 0x01, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x47, 0x00, 0x00, 0x00, 0x47, - 0x00, 0x02, 0x00, 0x47, 0x00, 0x05, 0x00, 0x47, 0x00, 0x03, - 0x00, 0x47, 0x00, 0x06, 0x00, 0x47, 0x00, 0x04, 0x00, 0x47, - 0x00, 0x07, 0x00, 0xff, 0xff, -}; -const byte MMCHAR_16[] = { - 0x03, 0xff, 0xff, 0xff, 0xff, 0x42, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x54, 0x41, 0x00, 0x01, 0x00, - 0xff, 0x41, 0x00, 0x02, 0x00, 0x41, 0x00, 0x00, 0x00, 0xff, - 0xff, -}; -const byte MMCHAR_18[] = { - 0x02, 0x31, 0x00, 0x07, 0x00, 0x44, 0x00, 0x3c, 0x00, 0x03, - 0x00, 0x80, 0x00, 0xf7, 0x00, 0x50, 0x3c, 0x00, 0x01, 0x00, - 0xff, 0x3c, 0x00, 0x02, 0x00, 0x3c, 0x00, 0x00, 0x00, 0xff, - 0xff, -}; -const byte MMCHAR_19[] = { - 0x02, 0x31, 0x00, 0x07, 0x00, 0x45, 0x00, 0x3d, 0x00, 0x03, - 0x00, 0x80, 0x00, 0xf7, 0x00, 0x51, 0x3d, 0x00, 0x01, 0x00, - 0xff, 0x3d, 0x00, 0x02, 0x00, 0x3d, 0x00, 0x00, 0x00, 0xff, - 0xff, -}; -const byte MMCHAR_20[] = { - 0x02, 0x31, 0x00, 0x02, 0x00, 0x46, 0x00, 0x48, 0x00, 0x02, - 0x00, 0x80, 0x00, 0xf7, 0x00, 0x58, 0x48, 0x00, 0x01, 0x00, - 0xff, 0x48, 0x00, 0x03, 0x00, 0x48, 0x00, 0x00, 0x00, 0xff, - 0xff, -}; -const byte MMCHAR_21[] = { - 0x02, 0x31, 0x00, 0x07, 0x00, 0x47, 0x00, 0x3e, 0x00, 0x03, - 0x00, 0x80, 0x00, 0xf7, 0x00, 0x52, 0x3e, 0x00, 0x01, 0x00, - 0xff, 0x3e, 0x00, 0x02, 0x00, 0x3e, 0x00, 0x00, 0x00, 0xff, - 0xff, -}; -const byte MMCHAR_23[] = { - 0x02, 0x31, 0x00, 0x08, 0x00, 0x49, 0x00, 0x3f, 0x00, 0x03, - 0x00, 0x80, 0x00, 0xf7, 0x00, 0x53, 0x3f, 0x00, 0x01, 0x00, - 0xff, 0x3f, 0x00, 0x02, 0x00, 0x3f, 0x00, 0x00, 0x00, 0xff, - 0xff, -}; -const byte MMCHAR_24[] = { - 0x02, 0x32, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x47, 0x32, 0x00, 0x02, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x32, 0x00, 0x01, 0x00, 0x32, - 0x00, 0x03, 0x00, 0x32, 0x00, 0x0a, 0x00, 0x32, 0x00, 0x04, - 0x00, 0x32, 0x00, 0x0b, 0x00, 0x32, 0x00, 0x05, 0x00, 0x32, - 0x00, 0x0c, 0x00, 0x32, 0x00, 0x06, 0x00, 0x32, 0x00, 0x0d, - 0x00, 0x32, 0x00, 0x07, 0x00, 0x32, 0x00, 0x0e, 0x00, 0x32, - 0x00, 0x08, 0x00, 0x32, 0x00, 0x0f, 0x00, 0x32, 0x00, 0x09, - 0x00, 0x32, 0x00, 0x10, 0x00, 0xff, 0xff -}; -const byte MMCHAR_25[] = { - 0x02, 0x39, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x39, 0x00, 0x00, 0x00, 0x39, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFF, 0xFF -}; -const byte MMCHAR_26[] = { - 0x01, 0x3a, 0x00, 0x01, 0x00, 0x0a, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x3a, 0x00, 0x02, 0x00, - 0xff, 0x3a, 0x00, 0x03, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x42, - 0x00, 0x00, 0x00, 0x3a, 0x00, 0x04, 0x00, 0x42, 0x00, 0x01, - 0x00, 0x3a, 0x00, 0x05, 0x00, 0x42, 0x00, 0x02, 0x00, 0x3a, - 0x00, 0x06, 0x00, 0x42, 0x00, 0x03, 0x00, 0x3a, 0x00, 0x07, - 0x00, 0x42, 0x00, 0x04, 0x00, 0x3a, 0x00, 0x08, 0x00, 0x42, - 0x00, 0x05, 0x00, 0x3a, 0x00, 0x09, 0x00, 0x42, 0x00, 0x06, - 0x00, 0x3a, 0x00, 0x0a, 0x00, 0x42, 0x00, 0x07, 0x00, 0x3a, - 0x00, 0x0b, 0x00, 0x42, 0x00, 0x08, 0x00, 0x3a, 0x00, 0x0c, - 0x00, 0x42, 0x00, 0x09, 0x00, 0x3a, 0x00, 0x0d, 0x00, 0x42, - 0x00, 0x0a, 0x00, 0x3a, 0x00, 0x0e, 0x00, 0x42, 0x00, 0x0b, - 0x00, 0x3a, 0x00, 0x0f, 0x00, 0x42, 0x00, 0x0c, 0x00, 0x3a, - 0x00, 0x10, 0x00, 0x42, 0x00, 0x0d, 0x00, 0x3a, 0x00, 0x11, - 0x00, 0x42, 0x00, 0x0e, 0x00, 0x3a, 0x00, 0x12, 0x00, 0x42, - 0x00, 0x0f, 0x00, 0x3a, 0x00, 0x13, 0x00, 0x42, 0x00, 0x10, - 0x00, 0x3a, 0x00, 0x14, 0x00, 0x42, 0x00, 0x11, 0x00, 0x3a, - 0x00, 0x15, 0x00, 0xff, 0xff -}; -const byte MMCHAR_27[] = { - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x58, 0x49, 0x00, 0x01, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x49, 0x00, 0x00, 0x00, 0x49, - 0x00, 0x02, 0x00, 0x49, 0x00, 0x0a, 0x00, 0x49, 0x00, 0x03, - 0x00, 0x49, 0x00, 0x0b, 0x00, 0x49, 0x00, 0x04, 0x00, 0x49, - 0x00, 0x0c, 0x00, 0x49, 0x00, 0x05, 0x00, 0x49, 0x00, 0x0d, - 0x00, 0x49, 0x00, 0x06, 0x00, 0x49, 0x00, 0x0e, 0x00, 0x49, - 0x00, 0x07, 0x00, 0x49, 0x00, 0x0f, 0x00, 0x49, 0x00, 0x08, - 0x00, 0x49, 0x00, 0x10, 0x00, 0x49, 0x00, 0x09, 0x00, 0x49, - 0x00, 0x11, 0x00, 0xff, 0xff, -}; - -// HACK: MMCHAR_0 has been used to replace the missing CHAR: 1, 14, 17 and 22 -const byte *const CHARTBL_MM[] = { - MMCHAR_0, MMCHAR_0, MMCHAR_2, MMCHAR_3, MMCHAR_4, - MMCHAR_5, MMCHAR_6, MMCHAR_7, MMCHAR_8, MMCHAR_9, - MMCHAR_10, MMCHAR_11, MMCHAR_12, MMCHAR_13, MMCHAR_0, - MMCHAR_15, MMCHAR_16, MMCHAR_0, MMCHAR_18, MMCHAR_19, - MMCHAR_20, MMCHAR_21, MMCHAR_0, MMCHAR_23, MMCHAR_24, - MMCHAR_25, MMCHAR_26, MMCHAR_27 -}; - const int SIDEOFFR[] = { 4, 0, 7, 10, 3, 1, 2, 13, 0, 0, 0, 0 }; const int SIDEOFFL[] = { 11, 6, 1, 4, 10, 6, 1, 4, 0, 0, 0, 0 }; const int SIDEOFFU[] = { 1, 2, 0, 2, 2, 1, 1, 0, 0, 0, 0, 0 }; @@ -765,7 +80,7 @@ const char *const TRAVDATA[] = { "COOPER BRADBURY", nullptr }; -const char *const _askTBL[] = { +const char *const ASK_TBL[] = { "NONE", "MARSHALL ALEXANDER", "TERRAFORM CORP.", "COLLIER STANTON", "ROCKWELL BACHE", "JOCQUES SPARROW", "NORA DESMOND ALEXANDER", "GALACTIC PICTURES", "LAWRENCE BARKLEY", "TMS", "MAC MALDEN", "STANTON EXPEDITION", "LOWELL PERCIVAL", "CHANTAL VARGAS", "RICK LOGAN", @@ -783,33 +98,6 @@ byte HELP[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; -const byte DEATH_SCREENS[] = { - 5, 5, 3, 3, 7, 4, 6, 2, 2, 2, 1, 5, 3, 5, 2, 8, 5, 3, 8, 5 -}; - -const char *const DEATHMESSAGE[] = { - "A VICIOUS THUG PULLS OUT HIS GUN AND AIR CONDITIONS YOUR BRAIN.", - "BIG DICK COMES BACK AND ANNOUNCES YOUR TIME IS UP. ONE OF HIS BOYS PROCEEDS TO PART YOUR EYEBROWS.", - "ALTHOUGH HIS FIRST SHOT MISSED, THE PUNK FINDS YOU AND TURNS YOU INTO A DOUGHNUT.", - "THE CREEP SPOTS YOU. HE TURNS AND FIRES HIS WEAPON. IT BURNS A HOLE A BUZZARD CAN FLY THROUGH.", - "OBVIOUSLY RICK LOGAN HAS A FEW TRICK UP HIS SLEEVE. A TREMENDOUS WEIGHT HITS YOUR HEAD. YOU MUMBLE; WATCH OUT FOR THAT TREE...", - "SLOWLY SINKING IN THE SLIMY OOZE, YOU THINK OF SEVERAL JELLO WRESTLING MATCHES YOU'VE ATTENDED. BUT NO MORE...", - "THE PATH SUDDENLY GIVES WAY AND YOU FEEL MANY STAKES TEAR THROUGH YOUR FLESH. HOW DO YOU LIKE YOUR STAKE", - "THE SNAKE SINKS ITS FANGS INTO YOU LEG. THE POISON WORKS QUICKLY. THE SNAKE THEN SWALLOWS YOU WHOLE.", - "YOU FADE AWAY, GLOWING LIKE A LIGHTBULB.", - "YOU TOUCH THE BUBBLING RADIOACTIVE SELTZER. IT IMMEDIATELY CAUSES VITAL ORGANS TO ELONGATE AND EXPLODE. YOU DIE WITH AN ABSURD AND FOOLISH LOOK ON YOUR FACE.", - "THE DOGS PRETTY HUNGRY. IT WON'T TAKE HIM LONG TO FINISH SO SIT BACK AND ENJOY IT.", - "ROCKY DOESN'T LIKE BEING FOLLOWED. HE DECIDES TO BEAT YOU. WITHIN AND INCH OF YOUR LIFE. UNFORTUNATELY, HE MISJUDGED THE DISTANCE", - "YOU STUMBLE INTO DEADLY LASER FIRE.", - "THE OUTPOST AND YOUR BODY PARTS ARE BLOWN TO KINGDOM COME.", - "YOU REACH THE TOP, BUT YOUR AIR SOON RUNS OUT LEAVING YOU BREATHLESS.", - "YOU DIE IN THE FIERY EXPLOSION.", - "YOU FALL HUNDREDS OF FEET TO YOUR DEATH.", - "YOU WALK ONTO A PRESSURE SENSITIVE SECURITY PAD. A LASER ZEROS IN AND BLOWS A HOLE THE SIZE OF A SUBARU TIRE THROUGH YOU.", - "DANGERFIELD'S EXPERIMENT BACKFIRES. IT RELEASES A DEMON FROM HIS SUBCONSCIOUS WHICH DESTROYS THE ENTIRE PLANET.", - "ONCE DANGERFIELD GETS OUT OF HIS CHAMBER, HE PULLS OUT A WEAPON AND LETS YOU HAVE IT." -}; - const char *const SPEC7MESSAGE = { "THOMAS DANGERFIELD'S MAD EXPERIMENT OF ATTEMPTING TO HARNESS THE STONE'S POWER, ENDED HIS LIFE. DANGERFIELD WAS A DECENT HUMAN " \ "BEING ONCE, BUT WAS DRIVEN INSANE BY HIS QUEST FOR THE ULTIMATE POWER. ALEXIS AND I DECIDE THAT DEACON HAWKE IS THE ONLY " \ diff --git a/engines/access/martian/martian_resources.h b/engines/access/martian/martian_resources.h index 2eb810ac80..46cf6a71c1 100644 --- a/engines/access/martian/martian_resources.h +++ b/engines/access/martian/martian_resources.h @@ -24,31 +24,17 @@ #define ACCESS_MARTIAN_RESOURCES_H #include "common/scummsys.h" +#include "access/resources.h" namespace Access { namespace Martian { -extern const char *const FILENAMES[]; - extern const int SIDEOFFR[]; extern const int SIDEOFFL[]; extern const int SIDEOFFU[]; extern const int SIDEOFFD[]; -extern const byte *const CURSORS[4]; - -extern const int _travelPos[][2]; - -extern const int INVENTORY_SIZE; -extern const char *const INVENTORY_NAMES[]; - -extern const byte *const ROOM_TABLE[]; -extern const char *const ROOM_DESCR[]; -extern const int ROOM_NUMB; - -extern const byte *const CHARTBL_MM[]; - extern const int SIDEOFFR[]; extern const int SIDEOFFL[]; extern const int SIDEOFFU[]; @@ -60,16 +46,24 @@ extern const byte ICON_PALETTE[]; extern const int RMOUSE[10][2]; extern byte HELP[]; -extern const char *const _askTBL[]; +extern const char *const ASK_TBL[]; extern const char *const TRAVDATA[]; -extern const byte DEATH_SCREENS[]; -extern const char *const DEATHMESSAGE[]; extern const char *const SPEC7MESSAGE; extern const byte _byte1EEB5[]; extern const int PICTURERANGE[][2]; +class MartianResources : public Resources { +public: + +public: + MartianResources(AccessEngine *vm) : Resources(vm) {} + virtual ~MartianResources() {} +}; + +#define MMRES (*((Martian::MartianResources *)_vm->_res)) + } // End of namespace Martian } // End of namespace Access diff --git a/engines/access/martian/martian_room.cpp b/engines/access/martian/martian_room.cpp index d5b03db246..0b8b4a842a 100644 --- a/engines/access/martian/martian_room.cpp +++ b/engines/access/martian/martian_room.cpp @@ -39,7 +39,7 @@ MartianRoom::~MartianRoom() { } void MartianRoom::loadRoom(int roomNumber) { - loadRoomData(ROOM_TABLE[roomNumber]); + loadRoomData(&MMRES.ROOMTBL[roomNumber]._data[0]); } void MartianRoom::reloadRoom() { diff --git a/engines/access/module.mk b/engines/access/module.mk index f7cf7f2261..cccb603d31 100644 --- a/engines/access/module.mk +++ b/engines/access/module.mk @@ -21,6 +21,7 @@ MODULE_OBJS := \ scripts.o \ sound.o \ video.o \ + video/movie_decoder.o \ amazon/amazon_game.o \ amazon/amazon_logic.o \ amazon/amazon_player.o \ diff --git a/engines/access/resources.cpp b/engines/access/resources.cpp index 8699a4a82f..096fb15b35 100644 --- a/engines/access/resources.cpp +++ b/engines/access/resources.cpp @@ -22,9 +22,140 @@ #include "access/resources.h" #include "access/access.h" +#include "access/amazon/amazon_resources.h" +#include "access/martian/martian_resources.h" namespace Access { +Resources *Resources::init(AccessEngine *vm) { + if (vm->getGameID() == GType_Amazon) + return new Amazon::AmazonResources(vm); + else if (vm->getGameID() == GType_MartianMemorandum) + return new Martian::MartianResources(vm); + + error("Unknown game"); +} + +bool Resources::load(Common::String &errorMessage) { + Common::File f; + if (!f.open("access.dat")) { + errorMessage = "Could not locate required access.dat file"; + return false; + } + + // Check for the magic identifier + char buffer[4]; + f.read(buffer, 4); + if (strncmp(buffer, "SVMA", 4)) { + errorMessage = "Located access.dat file had invalid contents"; + return false; + } + + // Validate the version number + uint expectedVersion = 1; + uint version = f.readUint16LE(); + if (version != expectedVersion) { + errorMessage = Common::String::format( + "Incorrect version of access.dat found. Expected %d but got %d", + expectedVersion, version); + return false; + } + + // Load in the index + uint count = f.readUint16LE(); + _datIndex.resize(count); + for (uint idx = 0; idx < _datIndex.size(); ++idx) { + _datIndex[idx]._gameId = f.readByte(); + _datIndex[idx]._discType = f.readByte(); + _datIndex[idx]._demoType = f.readByte(); + _datIndex[idx]._language = (Common::Language)f.readByte(); + _datIndex[idx]._fileOffset = f.readUint32LE(); + } + + // Load in the data for the game + load(f); + + return true; +} + +void Resources::load(Common::SeekableReadStream &s) { + uint count; + + // Get the offset of the data for the game + uint entryOffset = findEntry(_vm->getGameID(), _vm->isCD() ? 1 : 0, + _vm->isDemo() ? 1 : 0, _vm->getLanguage()); + s.seek(entryOffset); + + // Load filename list + count = s.readUint16LE(); + FILENAMES.resize(count); + for (uint idx = 0; idx < count; ++idx) + FILENAMES[idx] = readString(s); + + // Load the character data + count = s.readUint16LE(); + CHARTBL.resize(count); + for (uint idx = 0; idx < count; ++idx) { + uint count2 = s.readUint16LE(); + CHARTBL[idx].resize(count2); + if (count2 > 0) + s.read(&CHARTBL[idx][0], count2); + } + + // Load the room data + count = s.readUint16LE(); + ROOMTBL.resize(count); + for (uint idx = 0; idx < count; ++idx) { + ROOMTBL[idx]._desc = readString(s); + ROOMTBL[idx]._travelPos.x = s.readSint16LE(); + ROOMTBL[idx]._travelPos.y = s.readSint16LE(); + uint count2 = s.readUint16LE(); + ROOMTBL[idx]._data.resize(count2); + if (count2 > 0) + s.read(&ROOMTBL[idx]._data[0], count2); + } + + // Load the deaths list + count = s.readUint16LE(); + DEATHS.resize(count); + for (uint idx = 0; idx < count; ++idx) { + DEATHS[idx]._screenId = s.readByte(); + DEATHS[idx]._msg = readString(s); + } + + // Load in the inventory list + count = s.readUint16LE(); + INVENTORY.resize(count); + for (uint idx = 0; idx < count; ++idx) { + INVENTORY[idx]._desc = readString(s); + for (uint idx2 = 0; idx2 < 4; ++idx2) + INVENTORY[idx]._combo[idx2] = s.readSint16LE(); + } +} + +uint Resources::findEntry(byte gameId, byte discType, byte demoType, Common::Language language) { + for (uint idx = 0; idx < _datIndex.size(); ++idx) { + DATEntry &de = _datIndex[idx]; + if (de._gameId == gameId && de._discType == discType && + de._demoType == demoType && de._language == language) + return de._fileOffset; + } + + error("Could not locate appropriate access.dat entry"); +} + +Common::String Resources::readString(Common::SeekableReadStream &s) { + Common::String result; + char c; + + while ((c = s.readByte()) != 0) + result += c; + + return result; +} + +/*------------------------------------------------------------------------*/ + const byte INITIAL_PALETTE[18 * 3] = { 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, @@ -49,14 +180,14 @@ const byte INITIAL_PALETTE[18 * 3] = { const char *const GENERAL_MESSAGES[] = { "LOOKING THERE REVEALS NOTHING OF INTEREST.", // LOOK_MESSAGE "THAT DOESN'T OPEN.", // OPEN_MESSAGE - "THAT WON'T MOVE." // MOVE_MESSAGE + "THAT WON'T MOVE.", // MOVE_MESSAGE "YOU CAN'T TAKE THAT.", // GET_MESSAGE "THAT DOESN'T SEEM TO WORK.", // USE_MESSAGE "YOU CAN'T CLIMB THAT.", // GO_MESSAGE "THERE SEEMS TO BE NO RESPONSE.", // TALK_MESSAGE "THIS OBJECT REQUIRES NO HINTS", // HELP_MESSAGE "THIS OBJECT REQUIRES NO HINTS", // HELP_MESSAGE - "THAT DOESN'T SEEM TO WORK.", // USE_MESSAGE + "THAT DOESN'T SEEM TO WORK." // USE_MESSAGE }; const int INVCOORDS[][4] = { diff --git a/engines/access/resources.h b/engines/access/resources.h index 07b8e5ada9..bb5c3f9f61 100644 --- a/engines/access/resources.h +++ b/engines/access/resources.h @@ -24,6 +24,11 @@ #define ACCESS_RESOURCES_H #include "common/scummsys.h" +#include "common/array.h" +#include "common/language.h" +#include "common/rect.h" +#include "common/str-array.h" +#include "common/stream.h" namespace Access { @@ -33,6 +38,66 @@ extern const char *const GENERAL_MESSAGES[]; extern const int INVCOORDS[][4]; +class AccessEngine; + +class Resources { + struct DATEntry { + byte _gameId; + byte _discType; + byte _demoType; + Common::Language _language; + uint _fileOffset; + }; + struct RoomEntry { + Common::String _desc; + Common::Point _travelPos; + Common::Array<byte> _data; + }; + struct DeathEntry { + byte _screenId; + Common::String _msg; + }; + struct InventoryEntry { + Common::String _desc; + int _combo[4]; + }; +protected: + AccessEngine *_vm; + Common::Array<DATEntry> _datIndex; + + /** + * Locate a specified entry in the index and return it's file offset + */ + uint findEntry(byte gameId, byte discType, byte demoType, Common::Language language); + + /** + * Read a string in from the passed stream + */ + Common::String readString(Common::SeekableReadStream &s); + + /** + * Load data from the access.dat file + */ + virtual void load(Common::SeekableReadStream &s); +public: + Common::StringArray FILENAMES; + Common::Array< Common::Array<byte> > CHARTBL; + Common::Array<RoomEntry> ROOMTBL; + Common::Array<DeathEntry> DEATHS; + Common::Array<InventoryEntry> INVENTORY; + Common::Array< Common::Array<byte> > CURSORS; + Common::String CANT_GET_THERE; +public: + Resources(AccessEngine *vm) : _vm(vm) {} + virtual ~Resources() {} + static Resources *init(AccessEngine *vm); + + /** + * Load the access.dat file + */ + bool load(Common::String &errorMessage); +}; + } // End of namespace Access #endif /* ACCESS_RESOURCES_H */ diff --git a/engines/access/room.cpp b/engines/access/room.cpp index c91b37c65d..9a6efd32fc 100644 --- a/engines/access/room.cpp +++ b/engines/access/room.cpp @@ -111,8 +111,7 @@ void Room::takePicture() { return; } - // TODO: simplify the second part of the test when tested - if ((_vm->_scrollCol < 35) || ((_vm->_scrollRow >= 10) && (_vm->_scrollRow >= 20))){ + if ((_vm->_scrollCol < 35) || (_vm->_scrollRow >= 20)){ Common::String msg = "THAT ISN'T INTERESTING ENOUGH TO WASTE FILM ON."; _vm->_scripts->doCmdPrint_v1(msg); return; @@ -612,6 +611,7 @@ void Room::handleCommand(int commandId) { void Room::executeCommand(int commandId) { EventsManager &events = *_vm->_events; + Screen &screen = *_vm->_screen; _selectCommand = commandId; if (_vm->getGameID() == GType_MartianMemorandum) { @@ -698,8 +698,8 @@ void Room::executeCommand(int commandId) { break; } } - _vm->_screen->saveScreen(); - _vm->_screen->setDisplayScan(); + screen.saveScreen(); + screen.setDisplayScan(); // Get the toolbar icons resource Resource *iconData = _vm->_files->loadFile("ICONS.LZ"); @@ -707,7 +707,9 @@ void Room::executeCommand(int commandId) { delete iconData; // Draw the button as selected - _vm->_screen->plotImage(spr, _selectCommand + 2, + screen.plotImage(spr, 0, Common::Point(0, 177)); + screen.plotImage(spr, 1, Common::Point(143, 177)); + screen.plotImage(spr, _selectCommand + 2, Common::Point(_rMouse[_selectCommand][0], (_vm->getGameID() == GType_MartianMemorandum) ? 184 : 176)); _vm->_screen->restoreScreen(); @@ -928,16 +930,9 @@ RoomInfo::RoomInfo(const byte *data, int gameType, bool isCD, bool isDemo) { _roomFlag = stream.readByte(); - if (gameType == GType_Amazon) { - if (isCD) - _estIndex = stream.readSint16LE(); - else { - _estIndex = -1; - if (!isDemo) - stream.readSint16LE(); - } - } else - _estIndex = -1; + _estIndex = -1; + if (gameType == GType_Amazon && isCD) + _estIndex = stream.readSint16LE(); _musicFile.load(stream); _scaleH1 = stream.readByte(); diff --git a/engines/access/screen.cpp b/engines/access/screen.cpp index 41f6194238..e6d43d0156 100644 --- a/engines/access/screen.cpp +++ b/engines/access/screen.cpp @@ -181,7 +181,7 @@ void Screen::forceFadeOut() { int v = *srcP; if (v) { repeatFlag = true; - *srcP = MAX(*srcP - FADE_AMOUNT, 0); + *srcP = MAX((int)*srcP - FADE_AMOUNT, 0); } } @@ -296,7 +296,7 @@ void Screen::transBlitFrom(ASurface *src, const Common::Rect &bounds) { ASurface::transBlitFrom(src, bounds); } -void Screen::blitFrom(Graphics::Surface &src) { +void Screen::blitFrom(const Graphics::Surface &src) { addDirtyRect(Common::Rect(0, 0, src.w, src.h)); ASurface::blitFrom(src); } diff --git a/engines/access/screen.h b/engines/access/screen.h index 52485e5c7c..5cb85471c6 100644 --- a/engines/access/screen.h +++ b/engines/access/screen.h @@ -98,7 +98,7 @@ public: virtual void transBlitFrom(ASurface *src, const Common::Rect &bounds); - virtual void blitFrom(Graphics::Surface &src); + virtual void blitFrom(const Graphics::Surface &src); virtual void copyBuffer(Graphics::Surface *src); diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp index 41dd5cc0d0..25b8c97be5 100644 --- a/engines/access/scripts.cpp +++ b/engines/access/scripts.cpp @@ -164,7 +164,7 @@ void Scripts::charLoop() { _sequence = 2000; searchForSequence(); _vm->_images.clear(); - _vm->_buffer2.blitFrom(_vm->_buffer1); + _vm->_buffer2.copyBlock(&_vm->_buffer1, Common::Rect(0, 0, _vm->_buffer2.w, _vm->_buffer2.h)); _vm->_newRects.clear(); executeScript(); @@ -689,19 +689,20 @@ void Scripts::cmdDoTravel() { int idx = _vm->_travelBox->_tempListIdx[boxX]; if (Martian::_byte1EEB5[idx] != _vm->_byte26CB5) { _vm->_bubbleBox->_bubbleTitle = "_travel"; - _vm->_bubbleBox->printString("YOU CAN'T GET THERE FROM HERE."); + _vm->_bubbleBox->printString(_vm->_res->CANT_GET_THERE); continue; } if (_vm->_player->_roomNumber != idx) { _vm->_player->_roomNumber = idx; _vm->_room->_function = FN_CLEAR1; - if (Martian::_travelPos[idx][0] == -1) { + if (_vm->_res->ROOMTBL[idx]._travelPos.x == -1) { + // For x == -1, the y value is a script Id, not a co-ordinate _vm->_player->_roomNumber = idx; _vm->_room->_conFlag = true; - _vm->_scripts->converse1(Martian::_travelPos[idx][1]); + _vm->_scripts->converse1(_vm->_res->ROOMTBL[idx]._travelPos.y); return; } - _vm->_player->_rawPlayer = Common::Point(Martian::_travelPos[idx][0], Martian::_travelPos[idx][1]); + _vm->_player->_rawPlayer = _vm->_res->ROOMTBL[idx]._travelPos; cmdRetPos(); return; } @@ -1033,7 +1034,7 @@ void Scripts::cmdPrintWatch() { } void Scripts::cmdDispAbout() { - _vm->_travelBox->getList(Martian::_askTBL, _vm->_ask); + _vm->_travelBox->getList(Martian::ASK_TBL, _vm->_ask); int btnSelected = 0; int boxX = _vm->_aboutBox->doBox_v1(_vm->_startAboutItem, _vm->_startAboutBox, btnSelected); _vm->_startAboutItem = _vm->_boxDataStart; diff --git a/engines/access/sound.cpp b/engines/access/sound.cpp index 51ffb88f37..b3317cee5f 100644 --- a/engines/access/sound.cpp +++ b/engines/access/sound.cpp @@ -213,7 +213,7 @@ MusicManager::MusicManager(AccessEngine *vm) : _vm(vm) { // switch (musicType) { case MT_ADLIB: { - if (_vm->getGameID() == GType_Amazon) { + if (_vm->getGameID() == GType_Amazon && !_vm->isDemo()) { Resource *midiDrvResource = _vm->_files->loadFile(92, 1); Common::MemoryReadStream *adLibInstrumentStream = new Common::MemoryReadStream(midiDrvResource->data(), midiDrvResource->_size); diff --git a/engines/access/video/movie_decoder.cpp b/engines/access/video/movie_decoder.cpp new file mode 100644 index 0000000000..05ec25d54c --- /dev/null +++ b/engines/access/video/movie_decoder.cpp @@ -0,0 +1,741 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/scummsys.h" +#include "common/stream.h" +#include "common/textconsole.h" + +#include "audio/audiostream.h" +#include "audio/decoders/raw.h" + +#include "access/access.h" +#include "access/video/movie_decoder.h" + +// for Test-Code +#include "common/system.h" +#include "common/events.h" +#include "common/keyboard.h" +#include "engines/engine.h" +#include "engines/util.h" +#include "graphics/palette.h" +#include "graphics/pixelformat.h" +#include "graphics/surface.h" + +namespace Access { + +AccessVIDMovieDecoder::AccessVIDMovieDecoder() + : _stream(0), _videoTrack(0), _audioTrack(0) { + _streamSeekOffset = 0; + _streamVideoIndex = 0; + _streamAudioIndex = 0; +} + +AccessVIDMovieDecoder::~AccessVIDMovieDecoder() { + close(); +} + +bool AccessVIDMovieDecoder::loadStream(Common::SeekableReadStream *stream) { + uint32 videoCodecTag = 0; + uint32 videoHeight = 0; + uint32 videoWidth = 0; + uint16 regularDelay = 0; + uint32 audioSampleRate = 0; + + close(); + + _stream = stream; + _streamSeekOffset = 15; // offset of first chunk + _streamVideoIndex = 0; + _streamAudioIndex = 0; + + // read header + // ID [dword] "VID" + // ?? [byte] + // ?? [word] + // width [word] + // height [word] + // regular delay between frames (60 per second) [word] + // ?? [word] + + videoCodecTag = _stream->readUint32BE(); + if (videoCodecTag != MKTAG('V','I','D',0x00)) { + warning("AccessVIDMoviePlay: bad codec tag, not a video file?"); + close(); + return false; + } + _stream->skip(3); + videoWidth = _stream->readUint16LE(); + videoHeight = _stream->readUint16LE(); + regularDelay = _stream->readUint16LE(); + _stream->skip(2); + + if (!regularDelay) { + warning("AccessVIDMoviePlay: delay between frames is zero?"); + close(); + return false; + } + + // create video track + _videoTrack = new StreamVideoTrack(videoWidth, videoHeight, regularDelay); + addTrack(_videoTrack); + + //warning("width %d, height %d", videoWidth, videoHeight); + + // Look through the first few packets + static const int maxPacketCheckCount = 10; + + for (int i = 0; i < maxPacketCheckCount; i++) { + byte chunkId = _stream->readByte(); + + // Bail out if done + if (_stream->eos()) + break; + + // Bail also in case end of file chunk was found + if (chunkId == kVIDMovieChunkId_EndOfFile) + break; + + uint32 chunkStartOffset = _stream->pos(); + //warning("data chunk at %x", chunkStartOffset); + + switch (chunkId) { + case kVIDMovieChunkId_FullFrame: + case kVIDMovieChunkId_FullFrameCompressed: + case kVIDMovieChunkId_PartialFrameCompressed: + case kVIDMovieChunkId_FullFrameCompressedFill: { + if (!_videoTrack->skipOverFrame(_stream, chunkId)) { + close(); + return false; + } + break; + } + + case kVIDMovieChunkId_Palette: { + if (!_videoTrack->skipOverPalette(_stream)) { + close(); + return false; + } + break; + } + + case kVIDMovieChunkId_AudioFirstChunk: + case kVIDMovieChunkId_Audio: { + // sync [word] + // sampling rate [byte] + // size of audio data [word] + // sample data [] (mono, 8-bit, unsigned) + // + // Only first chunk has sync + sampling rate + if (chunkId == kVIDMovieChunkId_AudioFirstChunk) { + byte soundblasterRate; + + _stream->skip(2); // skip over sync + soundblasterRate = _stream->readByte(); + audioSampleRate = 1000000 / (256 - soundblasterRate); + + _audioTrack = new StreamAudioTrack(audioSampleRate); + addTrack(_audioTrack); + + _stream->seek(chunkStartOffset); // seek back + } + + if (!_audioTrack) { + warning("AccessVIDMoviePlay: regular audio chunk, before audio chunk w/ header"); + close(); + return false; + } + if (!_audioTrack->skipOverAudio(_stream, chunkId)) { + close(); + return false; + } + break; + } + + default: + warning("AccessVIDMoviePlay: Unknown chunk-id '%x' inside VID movie", chunkId); + close(); + return false; + } + + // Remember this chunk inside our cache + IndexCacheEntry indexCacheEntry; + + indexCacheEntry.chunkId = chunkId; + indexCacheEntry.offset = chunkStartOffset; + + _indexCacheTable.push_back(indexCacheEntry); + + // Got an audio chunk now? -> exit b/c we are done + if (audioSampleRate) + break; + } + + // Remember offset of latest not-indexed-yet chunk + _streamSeekOffset = _stream->pos(); + + // If sample rate was found, create an audio track + if (audioSampleRate) { + _audioTrack = new StreamAudioTrack(audioSampleRate); + addTrack(_audioTrack); + } + + // Rewind back to the beginning right to the first chunk + _stream->seek(15); + + return true; +} + +void AccessVIDMovieDecoder::close() { + Video::VideoDecoder::close(); + + delete _stream; _stream = 0; + _videoTrack = 0; + + _indexCacheTable.clear(); +} + +// We try to at least decode 1 frame +// and also try to get at least 0.5 seconds of audio queued up +void AccessVIDMovieDecoder::readNextPacket() { + uint32 currentMovieTime = getTime(); + uint32 wantedAudioQueued = currentMovieTime + 500; // always try to be 0.500 seconds in front of movie time + + uint32 streamIndex = 0; + IndexCacheEntry indexEntry; + bool currentlySeeking = false; + + bool videoDone = false; + bool audioDone = false; + + // Seek to smallest stream offset + if ((_streamVideoIndex <= _streamAudioIndex) || (!_audioTrack)) { + streamIndex = _streamVideoIndex; + } else { + streamIndex = _streamAudioIndex; + } + + if (_audioTrack) { + if (wantedAudioQueued <= _audioTrack->getTotalAudioQueued()) { + // already got enough audio queued up + audioDone = true; + } + } else { + // no audio track, audio is always done + audioDone = true; + } + + while (1) { + // Check, if stream-index is already cached + if (streamIndex < _indexCacheTable.size()) { + indexEntry.chunkId = _indexCacheTable[streamIndex].chunkId; + indexEntry.offset = _indexCacheTable[streamIndex].offset; + currentlySeeking = false; + + } else { + // read from file + _stream->seek(_streamSeekOffset); + indexEntry.chunkId = _stream->readByte(); + indexEntry.offset = _stream->pos(); + currentlySeeking = true; + + // and store that as well + _indexCacheTable.push_back(indexEntry); + } + + // end of stream -> exit + if (_stream->eos()) + break; + + // end of file chunk -> exit + if (indexEntry.chunkId == kVIDMovieChunkId_EndOfFile) + break; + +// warning("chunk %x", indexEntry.chunkId); + + switch (indexEntry.chunkId) { + case kVIDMovieChunkId_FullFrame: + case kVIDMovieChunkId_FullFrameCompressed: + case kVIDMovieChunkId_PartialFrameCompressed: + case kVIDMovieChunkId_FullFrameCompressedFill: { + if ((_streamVideoIndex <= streamIndex) && (!videoDone)) { + // We are at an index, that is still relevant for video decoding + // and we are not done with video yet + if (!currentlySeeking) { + // seek to stream position in case we used the cache + _stream->seek(indexEntry.offset); + } + //warning("video decode chunk %x at %lx", indexEntry.chunkId, _stream->pos()); + _videoTrack->decodeFrame(_stream, indexEntry.chunkId); + videoDone = true; + _streamVideoIndex = streamIndex + 1; + } else { + if (currentlySeeking) { + // currently seeking, so we have to skip the frame bytes manually + _videoTrack->skipOverFrame(_stream, indexEntry.chunkId); + } + } + break; + } + + case kVIDMovieChunkId_Palette: { + if ((_streamVideoIndex <= streamIndex) && (!videoDone)) { + // We are at an index, that is still relevant for video decoding + // and we are not done with video yet + if (!currentlySeeking) { + // seek to stream position in case we used the cache + _stream->seek(indexEntry.offset); + } + _videoTrack->decodePalette(_stream); + _streamVideoIndex = streamIndex + 1; + } else { + if (currentlySeeking) { + // currently seeking, so we have to skip the frame bytes manually + _videoTrack->skipOverPalette(_stream); + } + } + break; + } + + case kVIDMovieChunkId_AudioFirstChunk: + case kVIDMovieChunkId_Audio: { + if ((_streamAudioIndex <= streamIndex) && (!audioDone)) { + // We are at an index that is still relevant for audio decoding + if (!currentlySeeking) { + // seek to stream position in case we used the cache + _stream->seek(indexEntry.offset); + } + _audioTrack->queueAudio(_stream, indexEntry.chunkId); + _streamAudioIndex = streamIndex + 1; + + if (wantedAudioQueued <= _audioTrack->getTotalAudioQueued()) { + // Got enough audio + audioDone = true; + } + } else { + if (!_audioTrack) { + error("AccessVIDMoviePlay: audio chunks found without audio track active"); + } + if (currentlySeeking) { + // currently seeking, so we have to skip the audio bytes manually + _audioTrack->skipOverAudio(_stream, indexEntry.chunkId); + } + } + break; + } + + default: + error("AccessVIDMoviePlay: Unknown chunk-id '%x' inside VID movie", indexEntry.chunkId); + } + + if (currentlySeeking) { + // remember currently stream offset in case we are seeking + _streamSeekOffset = _stream->pos(); + } + + // go to next index + streamIndex++; + + if ((videoDone) && (audioDone)) { + return; + } + } + + if (!videoDone) { + // no more video frames? set end of video track + _videoTrack->setEndOfTrack(); + } +} + +AccessVIDMovieDecoder::StreamVideoTrack::StreamVideoTrack(uint32 width, uint32 height, uint16 regularFrameDelay) { + _width = width; + _height = height; + _regularFrameDelay = regularFrameDelay; + _curFrame = -1; + _nextFrameStartTime = 0; + _endOfTrack = false; + _dirtyPalette = false; + + memset(&_palette, 0, sizeof(_palette)); + + _surface = new Graphics::Surface(); + _surface->create(_width, _height, Graphics::PixelFormat::createFormatCLUT8()); +} + +AccessVIDMovieDecoder::StreamVideoTrack::~StreamVideoTrack() { + delete _surface; +} + +bool AccessVIDMovieDecoder::StreamVideoTrack::endOfTrack() const { + return _endOfTrack; +} + +Graphics::PixelFormat AccessVIDMovieDecoder::StreamVideoTrack::getPixelFormat() const { + return _surface->format; +} + +void AccessVIDMovieDecoder::StreamVideoTrack::decodeFrame(Common::SeekableReadStream *stream, byte chunkId) { + byte *framePixelsPtr = (byte *)_surface->getPixels(); + byte *pixelsPtr = framePixelsPtr; + byte rleByte = 0; + uint16 additionalDelay = 0; + int32 expectedPixels = 0; + + switch (chunkId) { + case kVIDMovieChunkId_FullFrame: { + // Full frame is: + // data [width * height] + additionalDelay = stream->readUint16LE(); + stream->read(framePixelsPtr, _width * _height); + break; + } + + case kVIDMovieChunkId_FullFrameCompressed: + case kVIDMovieChunkId_PartialFrameCompressed: { + // Skip manually over compressed data + // Full frame compressed is: + // additional delay [word] + // REPEAT: + // RLE [byte] + // RLE upper bit set: skip over RLE & 0x7F pixels + // RLE upper bit not set: draw RLE amount of pixels (those pixels follow right after RLE byte) + // + // Partial frame compressed is: + // sync [word] + // horizontal start position [word] + // REPEAT: + // see full frame compressed + uint16 horizontalStartPosition = 0; + + additionalDelay = stream->readUint16LE(); + + if (chunkId == kVIDMovieChunkId_PartialFrameCompressed) { + horizontalStartPosition = stream->readUint16LE(); + if (horizontalStartPosition >= _height) { + error("AccessVIDMoviePlay: starting position larger than height during partial frame compressed, data corrupt?"); + return; + } + } + + expectedPixels = _width * (_height - horizontalStartPosition); + + // adjust frame destination pointer + pixelsPtr += (horizontalStartPosition * _width); + + while (expectedPixels >= 0) { + rleByte = stream->readByte(); + if (!rleByte) // NUL means end of stream + break; + + if (rleByte & 0x80) { + rleByte = rleByte & 0x7F; + expectedPixels -= rleByte; + } else { + // skip over pixels + expectedPixels -= rleByte; + stream->read(pixelsPtr, rleByte); // read pixel data into frame + } + pixelsPtr += rleByte; + } + // expectedPixels may be positive here in case stream got terminated with a NUL + if (expectedPixels < 0) { + error("AccessVIDMoviePlay: pixel count mismatch during full/partial frame compressed, data corrupt?"); + } + break; + } + + case kVIDMovieChunkId_FullFrameCompressedFill: { + // Full frame compressed fill is: + // additional delay [word] + // REPEAT: + // RLE [byte] + // RLE upper bit set: draw RLE amount (& 0x7F) of pixels with specified color (color byte follows after RLE byte) + // RLE upper bit not set: draw RLE amount of pixels (those pixels follow right after RLE byte) + additionalDelay = stream->readUint16LE(); + expectedPixels = _width * _height; + + while (expectedPixels > 0) { + rleByte = stream->readByte(); + + if (rleByte & 0x80) { + rleByte = rleByte & 0x7F; + expectedPixels -= rleByte; + + byte fillColor = stream->readByte(); + memset(pixelsPtr, fillColor, rleByte); + } else { + // skip over pixels + expectedPixels -= rleByte; + stream->read(pixelsPtr, rleByte); // read pixel data into frame + } + pixelsPtr += rleByte; + } + if (expectedPixels < 0) { + error("AccessVIDMoviePlay: pixel count mismatch during full frame compressed fill, data corrupt?"); + } + break; + } + default: + assert(0); + break; + } + + _curFrame++; + + // TODO: not sure, if additionalDelay is supposed to affect the follow-up frame or the current frame + // the videos, that I found, don't have it set + uint32 currentFrameStartTime = getNextFrameStartTime(); + uint32 nextFrameStartTime = (_regularFrameDelay * _curFrame) * 1000 / 60; + if (additionalDelay) { + nextFrameStartTime += additionalDelay * 1000 / 60; + } + assert(currentFrameStartTime <= nextFrameStartTime); + setNextFrameStartTime(nextFrameStartTime); +} + +bool AccessVIDMovieDecoder::StreamVideoTrack::skipOverFrame(Common::SeekableReadStream *stream, byte chunkId) { + byte rleByte = 0; + int32 expectedPixels = 0; + + switch (chunkId) { + case kVIDMovieChunkId_FullFrame: { + // Full frame is: + // additional delay [word] + // data [width * height] + stream->skip(2); + stream->skip(_width * _height); + break; + } + + case kVIDMovieChunkId_FullFrameCompressed: + case kVIDMovieChunkId_PartialFrameCompressed: { + // Skip manually over compressed data + // Full frame compressed is: + // additional delay [word] + // REPEAT: + // RLE [byte] + // RLE upper bit set: skip over RLE & 0x7F pixels + // RLE upper bit not set: draw RLE amount of pixels (those pixels follow right after RLE byte) + // + // Partial frame compressed is: + // sync [word] + // horizontal start position [word] + // REPEAT: + // see full frame compressed + uint16 horizontalStartPosition = 0; + + stream->skip(2); + + if (chunkId == kVIDMovieChunkId_PartialFrameCompressed) { + horizontalStartPosition = stream->readUint16LE(); + if (horizontalStartPosition >= _height) { + warning("AccessVIDMoviePlay: starting position larger than height during partial frame compressed, data corrupt?"); + return false; + } + } + + expectedPixels = _width * (_height - horizontalStartPosition); + + while (expectedPixels >= 0) { + rleByte = stream->readByte(); + if (!rleByte) // NUL means end of stream + break; + + if (rleByte & 0x80) { + expectedPixels -= rleByte & 0x7F; + } else { + // skip over pixels + expectedPixels -= rleByte; + stream->skip(rleByte); // skip over pixel data + } + } + // expectedPixels may be positive here in case stream got terminated with a NUL + if (expectedPixels < 0) { + warning("AccessVIDMoviePlay: pixel count mismatch during full/partial frame compressed, data corrupt?"); + return false; + } + break; + } + + case kVIDMovieChunkId_FullFrameCompressedFill: { + // Full frame compressed fill is: + // additional delay [word] + // REPEAT: + // RLE [byte] + // RLE upper bit set: draw RLE amount (& 0x7F) of pixels with specified color (color byte follows after RLE byte) + // RLE upper bit not set: draw RLE amount of pixels (those pixels follow right after RLE byte) + stream->skip(2); + expectedPixels = _width * _height; + + while (expectedPixels > 0) { + rleByte = stream->readByte(); + + if (rleByte & 0x80) { + expectedPixels -= rleByte & 0x7F; + stream->skip(1); + } else { + // skip over pixels + expectedPixels -= rleByte; + stream->skip(rleByte); // skip over pixel data + } + } + if (expectedPixels < 0) { + warning("AccessVIDMoviePlay: pixel count mismatch during full frame compressed fill, data corrupt?"); + return false; + } + break; + } + default: + assert(0); + break; + } + return true; +} + +bool AccessVIDMovieDecoder::StreamVideoTrack::skipOverPalette(Common::SeekableReadStream *stream) { + stream->skip(0x300); // 3 bytes per color, 256 colors + return true; +} + +void AccessVIDMovieDecoder::StreamVideoTrack::decodePalette(Common::SeekableReadStream *stream) { + byte red, green, blue; + assert(stream); + + // VID files use a 6-bit palette and not a 8-bit one, we change it to 8-bit + for (uint16 curColor = 0; curColor < 256; curColor++) { + red = stream->readByte() & 0x3F; + green = stream->readByte() & 0x3F; + blue = stream->readByte() & 0x3F; + _palette[curColor * 3] = (red << 2) | (red >> 4); + _palette[curColor * 3 + 1] = (green << 2) | (green >> 4); + _palette[curColor * 3 + 2] = (blue << 2) | (blue >> 4); + } + + _dirtyPalette = true; +} + +const byte *AccessVIDMovieDecoder::StreamVideoTrack::getPalette() const { + _dirtyPalette = false; + return _palette; +} + +bool AccessVIDMovieDecoder::StreamVideoTrack::hasDirtyPalette() const { + return _dirtyPalette; +} + +AccessVIDMovieDecoder::StreamAudioTrack::StreamAudioTrack(uint32 sampleRate) { + _totalAudioQueued = 0; // currently 0 milliseconds queued + + _sampleRate = sampleRate; + _stereo = false; // always mono + + _audioStream = Audio::makeQueuingAudioStream(sampleRate, _stereo); +} + +AccessVIDMovieDecoder::StreamAudioTrack::~StreamAudioTrack() { + delete _audioStream; +} + +void AccessVIDMovieDecoder::StreamAudioTrack::queueAudio(Common::SeekableReadStream *stream, byte chunkId) { + Common::SeekableReadStream *rawAudioStream = 0; + Audio::RewindableAudioStream *audioStream = 0; + uint32 audioLengthMSecs = 0; + + if (chunkId == kVIDMovieChunkId_AudioFirstChunk) { + stream->skip(3); // skip over additional delay + sample rate + } + + uint32 audioSize = stream->readUint16LE(); + + // Read the specified chunk into memory + rawAudioStream = stream->readStream(audioSize); + audioLengthMSecs = audioSize * 1000 / _sampleRate; // 1 byte == 1 8-bit sample + + audioStream = Audio::makeRawStream(rawAudioStream, _sampleRate, Audio::FLAG_UNSIGNED | Audio::FLAG_LITTLE_ENDIAN, DisposeAfterUse::YES); + if (audioStream) { + _totalAudioQueued += audioLengthMSecs; + _audioStream->queueAudioStream(audioStream, DisposeAfterUse::YES); + } else { + // in case there was an error + delete rawAudioStream; + } +} + +bool AccessVIDMovieDecoder::StreamAudioTrack::skipOverAudio(Common::SeekableReadStream *stream, byte chunkId) { + if (chunkId == kVIDMovieChunkId_AudioFirstChunk) { + stream->skip(3); // skip over additional delay + sample rate + } + uint32 audioSize = stream->readUint16LE(); + stream->skip(audioSize); + return true; +} + +Audio::AudioStream *AccessVIDMovieDecoder::StreamAudioTrack::getAudioStream() const { + return _audioStream; +} + +bool AccessEngine::playMovie(const Common::String &filename, const Common::Point &pos) { + AccessVIDMovieDecoder *videoDecoder = new AccessVIDMovieDecoder(); + + Common::Point framePos(pos.x, pos.y); + + if (!videoDecoder->loadFile(filename)) { + warning("AccessVIDMoviePlay: could not open '%s'", filename.c_str()); + return false; + } + + bool skipVideo = false; + + _events->clearEvents(); + videoDecoder->start(); + + while (!shouldQuit() && !videoDecoder->endOfVideo() && !skipVideo) { + if (videoDecoder->needsUpdate()) { + const Graphics::Surface *frame = videoDecoder->decodeNextFrame(); + + if (frame) { + _screen->blitFrom(*frame); + + if (videoDecoder->hasDirtyPalette()) { + const byte *palette = videoDecoder->getPalette(); + g_system->getPaletteManager()->setPalette(palette, 0, 256); + } + + _screen->updateScreen(); + } + } + + _events->pollEventsAndWait(); + + Common::KeyState keyState; + if (_events->getKey(keyState)) { + if (keyState.keycode == Common::KEYCODE_ESCAPE) + skipVideo = true; + } + } + + videoDecoder->close(); + delete videoDecoder; + + return !skipVideo; +} + +} // End of namespace Access diff --git a/engines/access/video/movie_decoder.h b/engines/access/video/movie_decoder.h new file mode 100644 index 0000000000..fe8a89fcde --- /dev/null +++ b/engines/access/video/movie_decoder.h @@ -0,0 +1,157 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef ACCESS_VIDEO_MOVIE_DECODER_H +#define ACCESS_VIDEO_MOVIE_DECODER_H + +#include "common/rect.h" +#include "video/video_decoder.h" +#include "audio/decoders/raw.h" + +namespace Audio { +class QueuingAudioStream; +} + +namespace Common { +class SeekableReadStream; +} + +namespace Image { +class Codec; +} + +namespace Access { + +enum kDebugLevels { + kVIDMovieChunkId_FullFrame = 0x00, + kVIDMovieChunkId_FullFrameCompressed = 0x01, + kVIDMovieChunkId_Palette = 0x02, + kVIDMovieChunkId_FullFrameCompressedFill = 0x03, + kVIDMovieChunkId_PartialFrameCompressed = 0x04, + kVIDMovieChunkId_EndOfFile = 0x14, + kVIDMovieChunkId_AudioFirstChunk = 0x7C, + kVIDMovieChunkId_Audio = 0x7D +}; + +// This video format is used in at least the following Access engine games: +// - Noctropolis +// - Synnergist + +class AccessVIDMovieDecoder : public Video::VideoDecoder { +public: + AccessVIDMovieDecoder(); + ~AccessVIDMovieDecoder(); + + bool loadStream(Common::SeekableReadStream *stream); + void close(); + +protected: + void readNextPacket(); + +private: + bool streamSkipFullFrameCompressedFill(); + +private: + int32 _streamSeekOffset; /* current stream offset, pointing to not-yet-indexed stream position */ + uint32 _streamVideoIndex; /* current stream index for video decoding */ + uint32 _streamAudioIndex; /* current stream index for audio decoding */ + + struct IndexCacheEntry { + byte chunkId; + int32 offset; + }; + + Common::Array<IndexCacheEntry> _indexCacheTable; + +private: + class StreamVideoTrack : public VideoTrack { + public: + StreamVideoTrack(uint32 width, uint32 height, uint16 regularFrameDelay); + ~StreamVideoTrack(); + + bool endOfTrack() const; + + uint16 getWidth() const { return _width; } + uint16 getHeight() const { return _height; } + Graphics::PixelFormat getPixelFormat() const; + int getCurFrame() const { return _curFrame; } + void setNextFrameStartTime(uint32 nextFrameStartTime) { _nextFrameStartTime = nextFrameStartTime; } + uint32 getNextFrameStartTime() const { return _nextFrameStartTime; } + const Graphics::Surface *decodeNextFrame() { return _surface; } + + const byte *getPalette() const; + bool hasDirtyPalette() const; + + void decodePalette(Common::SeekableReadStream *stream); + void decodeFrame(Common::SeekableReadStream *stream, byte chunkId); + bool skipOverFrame(Common::SeekableReadStream *stream, byte chunkId); + bool skipOverPalette(Common::SeekableReadStream *stream); + + void setEndOfTrack() { _endOfTrack = true; } + + private: + Graphics::Surface *_surface; + + int _curFrame; + uint32 _nextFrameStartTime; + + byte _palette[3 * 256]; + mutable bool _dirtyPalette; + uint16 _width, _height; + + uint16 _regularFrameDelay; // delay between frames (1 = 1/60 of a second) + bool _endOfTrack; + }; + + class StreamAudioTrack : public AudioTrack { + public: + StreamAudioTrack(uint32 sampleRate); + ~StreamAudioTrack(); + + void queueAudio(Common::SeekableReadStream *stream, byte chunkId); + bool skipOverAudio(Common::SeekableReadStream *stream, byte chunkId); + + protected: + Audio::AudioStream *getAudioStream() const; + + private: + Audio::QueuingAudioStream *_audioStream; + uint32 _totalAudioQueued; /* total amount of milliseconds of audio, that we queued up already */ + + public: + uint32 getTotalAudioQueued() const { return _totalAudioQueued; } + + private: + int16 decodeSample(uint8 dataNibble); + + uint16 _sampleRate; + bool _stereo; + }; + + Common::SeekableReadStream *_stream; + StreamVideoTrack *_videoTrack; + StreamAudioTrack *_audioTrack; +}; + +} // End of namespace Access + +#endif diff --git a/engines/agi/console.cpp b/engines/agi/console.cpp index 6d7f9384cd..7995938d99 100644 --- a/engines/agi/console.cpp +++ b/engines/agi/console.cpp @@ -35,6 +35,7 @@ Console::Console(AgiEngine *vm) : GUI::Debugger() { registerCmd("debug", WRAP_METHOD(Console, Cmd_Debug)); registerCmd("cont", WRAP_METHOD(Console, Cmd_Cont)); registerCmd("agiver", WRAP_METHOD(Console, Cmd_Agiver)); + registerCmd("version", WRAP_METHOD(Console, Cmd_Version)); registerCmd("flags", WRAP_METHOD(Console, Cmd_Flags)); registerCmd("logic0", WRAP_METHOD(Console, Cmd_Logic0)); registerCmd("objs", WRAP_METHOD(Console, Cmd_Objs)); @@ -125,11 +126,156 @@ bool Console::Cmd_Agiver(int argc, const char **argv) { maj = (ver >> 12) & 0xf; min = ver & 0xfff; + debugPrintf("AGI version: "); debugPrintf(maj <= 2 ? "%x.%03x\n" : "%x.002.%03x\n", maj, min); return true; } +#define CONSOLE_VERSION_MAXLEN 10 + +bool Console::Cmd_Version(int argc, const char **argv) { + AgiGame *game = &_vm->_game; + int scriptNr = 0; + int scriptTextCount = 0; + int scriptTextNr = 0; + const char *scriptTextPtr = NULL; + const char *wordScanPtr = NULL; + const char *wordStartPtr = NULL; + const char *versionStartPtr = NULL; + const char *versionPtr = NULL; + int wordLen = 0; + char curChar = 0; + int versionLen = 0; + bool wordFound = false; + bool versionFound = false; + char versionString[CONSOLE_VERSION_MAXLEN]; + bool scriptLoadedByUs = false; + + // Show AGI version + Cmd_Agiver(argc, argv); + + // And now try to figure out the version of the game + // We do this by scanning through all script texts + // This is the best we can do about it. There is no special location for the game version number. + // There are multiple variations, like "ver. X.XX", "ver X.XX" and even "verion X.XX". + for (scriptNr = 0; scriptNr < MAX_DIRS; scriptNr++) { + if (game->dirLogic[scriptNr].offset != _EMPTY) { + // Script is supposed to exist? + scriptLoadedByUs = false; + if (!(game->dirLogic[scriptNr].flags & RES_LOADED)) { + // But not currently loaded? -> load it now + if (_vm->agiLoadResource(rLOGIC, scriptNr) != errOK) { + // In case we can't load the source, skip it + continue; + } + scriptLoadedByUs = true; + } + // Script currently loaded + // Now scan all texts + scriptTextCount = game->logics[scriptNr].numTexts; + for (scriptTextNr = 0; scriptTextNr < scriptTextCount; scriptTextNr++) { + scriptTextPtr = game->logics[scriptNr].texts[scriptTextNr]; + + // Now scan this text for version information + wordScanPtr = scriptTextPtr; + versionPtr = NULL; + + do { + curChar = *wordScanPtr; + + if ((curChar == 'V') || (curChar == 'v')) { + // "V" gefunden, ggf. beginning of version? + wordStartPtr = wordScanPtr; + wordFound = false; + + do { + curChar = *wordScanPtr; + if (curChar == ' ') { + break; + } + wordScanPtr++; + } while (curChar); + + if (curChar) { + // end of "version" found + wordLen = wordScanPtr - wordStartPtr; + + if (wordLen >= 3) { + if (strncmp(wordStartPtr, "ver", wordLen) == 0) + wordFound = true; + if (strncmp(wordStartPtr, "Ver", wordLen) == 0) + wordFound = true; + } + if ((!wordFound) && (wordLen >= 4)) { + if (strncmp(wordStartPtr, "ver.", wordLen) == 0) + wordFound = true; + if (strncmp(wordStartPtr, "Ver.", wordLen) == 0) + wordFound = true; + } + if ((!versionFound) && (wordLen >= 7)) { + if (strncmp(wordStartPtr, "version", wordLen) == 0) + wordFound = true; + if (strncmp(wordStartPtr, "Version", wordLen) == 0) + wordFound = true; + if (strncmp(wordStartPtr, "VERSION", wordLen) == 0) + wordFound = true; + } + + if (wordFound) { + // We found something interesting + //debugPrintf("%d: %s\n", scriptNr, scriptTextPtr); + + wordScanPtr++; // skip space + versionStartPtr = wordScanPtr; + curChar = *wordScanPtr; + if ((curChar >= '0') && (curChar <= '9')) { + // Next word starts with a number + wordScanPtr++; + curChar = *wordScanPtr; + if (curChar == '.') { + // Followed by a point? then we assume that we found a version number + // Now we try to find the end of it + wordScanPtr++; + do { + curChar = *wordScanPtr; + if ((curChar == ' ') || (curChar == '\\') || (!curChar)) + break; // space or potential new line or NUL? -> found the end + wordScanPtr++; + } while (1); + + versionLen = wordScanPtr - versionStartPtr; + if (versionLen < CONSOLE_VERSION_MAXLEN) { + // Looks fine, now extract and show it + memcpy(versionString, versionStartPtr, versionLen); + versionString[versionLen] = 0; + debugPrintf("Scanned game version: %s\n", versionString); + versionFound = true; + } + } + } + } + } + + // Seek back + wordScanPtr = wordStartPtr; + } + wordScanPtr++; + } while (curChar); + } + + if (scriptLoadedByUs) { + _vm->agiUnloadResource(rLOGIC, scriptNr); + } + } + } + + if (!versionFound) { + debugPrintf("Scanned game version: [not found]\n"); + } + return true; +} + bool Console::Cmd_Flags(int argc, const char **argv) { int i, j; diff --git a/engines/agi/console.h b/engines/agi/console.h index 6e86067373..c650e143a0 100644 --- a/engines/agi/console.h +++ b/engines/agi/console.h @@ -50,6 +50,7 @@ private: bool Cmd_SetObj(int argc, const char **argv); bool Cmd_RunOpcode(int argc, const char **argv); bool Cmd_Agiver(int argc, const char **argv); + bool Cmd_Version(int argc, const char **argv); bool Cmd_Flags(int argc, const char **argv); bool Cmd_Vars(int argc, const char **argv); bool Cmd_Objs(int argc, const char **argv); diff --git a/engines/agi/cycle.cpp b/engines/agi/cycle.cpp index 6b34605364..145b827160 100644 --- a/engines/agi/cycle.cpp +++ b/engines/agi/cycle.cpp @@ -84,13 +84,23 @@ void AgiEngine::newRoom(int n) { break; } - _game.vars[vBorderTouchEgo] = 0; - setflag(fNewRoomExec, true); + if (getVersion() < 0x2000) { + warning("STUB: NewRoom(%d)", n); - _game.exitAllLogics = true; + v->flags &= ~fDidntMove; + // animateObject(0); + agiLoadResource(rVIEW, _game.viewTable[0].currentView); + setView(&_game.viewTable[0], _game.viewTable[0].currentView); - writeStatus(); - writePrompt(); + } else { + _game.vars[vBorderTouchEgo] = 0; + setflag(fNewRoomExec, true); + + _game.exitAllLogics = true; + + writeStatus(); + writePrompt(); + } } void AgiEngine::resetControllers() { diff --git a/engines/agi/op_cmd.cpp b/engines/agi/op_cmd.cpp index 662454f3c1..bf2a2ed77b 100644 --- a/engines/agi/op_cmd.cpp +++ b/engines/agi/op_cmd.cpp @@ -1711,22 +1711,6 @@ void cmdCallV1(AgiGame *state, uint8 *p) { _v[13] = 1; } -void cmdNewRoomV1(AgiGame *state, uint8 *p) { - warning("cmdNewRoomV1()"); - state->_vm->agiLoadResource(rLOGIC, p0); - state->max_logics = 1; - state->logic_list[1] = p0; - _v[13] = 1; -} - -void cmdNewRoomVV1(AgiGame *state, uint8 *p) { - warning("cmdNewRoomVV1()"); - state->_vm->agiLoadResource(rLOGIC, _v[p0]); - state->max_logics = 1; - state->logic_list[1] = _v[p0]; - _v[13] = 1; -} - void cmdUnknown(AgiGame *state, uint8 *p) { warning("Skipping unknown opcode %2X", *(code + ip - 1)); } diff --git a/engines/agi/opcodes.cpp b/engines/agi/opcodes.cpp index 621fbb8e82..0d7d180ec9 100644 --- a/engines/agi/opcodes.cpp +++ b/engines/agi/opcodes.cpp @@ -60,7 +60,7 @@ AgiInstruction insV1[] = { { "subv", "vv", &cmdSubV }, // 08 { "load.view", "n", &cmdLoadView }, // 09 { "animate.obj", "n", &cmdAnimateObj }, // 0A - { "new.room", "n", &cmdNewRoomV1 }, // 0B + { "new.room", "n", &cmdNewRoom }, // 0B { "draw.pic", "v", &cmdDrawPicV1 }, // 0C { "print", "s", &cmdPrint }, // 0D TODO { "status", "", &cmdStatus }, // 0E TODO @@ -112,7 +112,7 @@ AgiInstruction insV1[] = { { "set.v", "v", &cmdSetV }, // 3C { "reset.v", "v", &cmdResetV }, // 3D { "toggle.v", "v", &cmdToggleV }, // 3E - { "new.room.v", "v", &cmdNewRoomVV1 }, // 3F TODO + { "new.room.v", "v", &cmdNewRoom }, // 3F { "call", "n", &cmdCallV1 }, // 40 TODO { "quit", "", &cmdQuitV1 }, // 41 { "set.speed", "v", &cmdSetSpeed }, // 42 diff --git a/engines/agi/opcodes.h b/engines/agi/opcodes.h index 6bd31c339a..5466bc6ee0 100644 --- a/engines/agi/opcodes.h +++ b/engines/agi/opcodes.h @@ -237,8 +237,6 @@ void cmdAdjEgoMoveToXY(AgiGame *state, uint8 *p); void cmdSetSpeed(AgiGame *state, uint8 *p); void cmdSetItemView(AgiGame *state, uint8 *p); void cmdCallV1(AgiGame *state, uint8 *p); -void cmdNewRoomV1(AgiGame *state, uint8 *p); -void cmdNewRoomVV1(AgiGame *state, uint8 *p); void cmdUnknown(AgiGame *state, uint8 *p); void condEqual(AgiGame *state, uint8 *p); diff --git a/engines/agi/sound_2gs.cpp b/engines/agi/sound_2gs.cpp index b940eed762..b221afbc23 100644 --- a/engines/agi/sound_2gs.cpp +++ b/engines/agi/sound_2gs.cpp @@ -345,7 +345,7 @@ void SoundGen2GS::advanceMidiPlayer() { case MIDI_PITCH_WHEEL: parm1 = *p++; parm2 = *p++; - debugC(3, kDebugLevelSound, "channel %X: pitch wheel (unimplemented)", chn); + debugC(3, kDebugLevelSound, "channel %X: pitch wheel (unimplemented) %02X, %02X", chn, parm1, parm2); break; default: diff --git a/engines/agi/wagparser.cpp b/engines/agi/wagparser.cpp index 0b49866531..54f8eaf90b 100644 --- a/engines/agi/wagparser.cpp +++ b/engines/agi/wagparser.cpp @@ -79,7 +79,7 @@ bool WagProperty::read(Common::SeekableReadStream &stream) { uint32 readBytes = stream.read(_propData, _propSize); // Read the data in _propData[_propSize] = 0; // Set the trailing zero for easy C-style string access - _readOk = (_propData != NULL && readBytes == _propSize); // Check that we got the whole data + _readOk = (readBytes == _propSize); // Check that we got the whole data return _readOk; } diff --git a/engines/agi/words.cpp b/engines/agi/words.cpp index ff9049fdc5..438c1ce354 100644 --- a/engines/agi/words.cpp +++ b/engines/agi/words.cpp @@ -161,11 +161,13 @@ void AgiEngine::dictionaryWords(char *msg) { char *q = NULL; int wid, wlen; + assert(msg); + debugC(2, kDebugLevelScripts, "msg = \"%s\"", msg); cleanInput(); - for (p = msg; p && *p && getvar(vWordNotFound) == 0;) { + for (p = msg; *p && getvar(vWordNotFound) == 0;) { if (*p == 0x20) p++; @@ -205,7 +207,7 @@ void AgiEngine::dictionaryWords(char *msg) { break; } - if (p != NULL && *p) { + if (*p) { debugC(2, kDebugLevelScripts, "p = %s", p); *p = 0; p++; diff --git a/engines/bbvs/bbvs.cpp b/engines/bbvs/bbvs.cpp index 1d668f9c34..816b713b1f 100644 --- a/engines/bbvs/bbvs.cpp +++ b/engines/bbvs/bbvs.cpp @@ -1384,7 +1384,7 @@ void BbvsEngine::checkEasterEgg(char key) { }; if (_currSceneNum == kCredits) { - memcpy(&_easterEggInput[1], &_easterEggInput[0], 6); + memmove(&_easterEggInput[1], &_easterEggInput[0], 6); _easterEggInput[0] = key; for (int i = 0; i < ARRAYSIZE(kEasterEggStrings); ++i) { if (!scumm_strnicmp(kEasterEggStrings[i], _easterEggInput, kEasterEggLengths[i])) { diff --git a/engines/bbvs/walk.cpp b/engines/bbvs/walk.cpp index 5ef14101a0..e97182ff5d 100644 --- a/engines/bbvs/walk.cpp +++ b/engines/bbvs/walk.cpp @@ -326,12 +326,10 @@ void BbvsEngine::canWalkToDest(WalkArea *walkArea, int infoCount) { } bool BbvsEngine::walkTestLineWalkable(const Common::Point &sourcePt, const Common::Point &destPt, WalkInfo *walkInfo) { - const float ptDeltaX = destPt.x - sourcePt.x; + const float ptDeltaX = MAX<float>(destPt.x - sourcePt.x, 1.0f); const float ptDeltaY = destPt.y - sourcePt.y; const float wDeltaX = walkInfo->x - sourcePt.x; const float wDeltaY = walkInfo->y - sourcePt.y; - if (destPt.x == sourcePt.x) - return true; if (walkInfo->direction) { const float nDeltaY = wDeltaX * ptDeltaY / ptDeltaX + (float)sourcePt.y - (float)walkInfo->y; return (nDeltaY >= 0.0f) && (nDeltaY < (float)walkInfo->delta); diff --git a/engines/cge2/sound.h b/engines/cge2/sound.h index 6673b67b7a..02afe610a2 100644 --- a/engines/cge2/sound.h +++ b/engines/cge2/sound.h @@ -68,7 +68,7 @@ class Sound { public: SmpInfo _smpinf; - Sound(CGE2Engine *vm); + explicit Sound(CGE2Engine *vm); ~Sound(); void open(); void close(); @@ -116,7 +116,7 @@ private: // Stop MIDI File void sndMidiStop(); public: - MusicPlayer(CGE2Engine *vm); + explicit MusicPlayer(CGE2Engine *vm); ~MusicPlayer(); void loadMidi(int ref); diff --git a/engines/cge2/vga13h.cpp b/engines/cge2/vga13h.cpp index f4064f3565..eb111c3255 100644 --- a/engines/cge2/vga13h.cpp +++ b/engines/cge2/vga13h.cpp @@ -629,11 +629,11 @@ void Sprite::gotoxyz(V2D pos) { if (!_follow) { FXP m = _vm->_eye->_z / (_pos3D._z - _vm->_eye->_z); _pos3D._x = (_vm->_eye->_x + (_vm->_eye->_x - _pos2D.x) / m); - _pos3D._x.round(); + _pos3D._x = _pos3D._x.round(); if (!_constY) { _pos3D._y = _vm->_eye->_y + (_vm->_eye->_y - _pos2D.y) / m; - _pos3D._y.round(); + _pos3D._y = _pos3D._y.round(); } } diff --git a/engines/fullpipe/scenes/scene04.cpp b/engines/fullpipe/scenes/scene04.cpp index c0f0960aba..6c361d6f1a 100644 --- a/engines/fullpipe/scenes/scene04.cpp +++ b/engines/fullpipe/scenes/scene04.cpp @@ -238,7 +238,7 @@ int scene04_updateCursor() { } } - if (g_fp->_objectIdAtCursor == PIC_CSR_ITN && g_fp->_objectIdAtCursor == PIC_SC4_DOWNTRUBA) + if (g_fp->_cursorId == PIC_CSR_ITN && g_fp->_objectIdAtCursor == PIC_SC4_DOWNTRUBA) g_fp->_cursorId = PIC_CSR_GOD; return g_fp->_cursorId; diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp index de3e1ea728..8ee3b14d0c 100644 --- a/engines/fullpipe/statics.cpp +++ b/engines/fullpipe/statics.cpp @@ -106,9 +106,14 @@ bool StepArray::gotoNextPoint() { } void StepArray::insertPoints(Common::Point **points, int pointsCount) { - if (_currPointIndex + pointsCount >= _pointsCount) + if (_currPointIndex + pointsCount >= _pointsCount) { _points = (Common::Point **)realloc(_points, sizeof(Common::Point *) * (_currPointIndex + pointsCount)); + if (!_points) { + error("Out of memory at StepArray::insertPoints()"); + } + } + _maxPointIndex = _currPointIndex + pointsCount; for (int i = 0; i < pointsCount; i++) { diff --git a/engines/lastexpress/game/savegame.cpp b/engines/lastexpress/game/savegame.cpp index d9f2993c17..e2682ba0d1 100644 --- a/engines/lastexpress/game/savegame.cpp +++ b/engines/lastexpress/game/savegame.cpp @@ -497,9 +497,6 @@ void SaveLoad::loadLastGame() { return; } - if (!_savegame) - error("[SaveLoad::loadGame] No savegame stream present"); - // Load the last entry _savegame->seek(header.offsetEntry); diff --git a/engines/mads/animation.cpp b/engines/mads/animation.cpp index e4f44fc308..605c63e91d 100644 --- a/engines/mads/animation.cpp +++ b/engines/mads/animation.cpp @@ -162,6 +162,7 @@ Animation::Animation(MADSEngine *vm, Scene *scene) : _vm(vm), _scene(scene) { _flags = 0; _font = nullptr; _resetFlag = false; + _canChangeView = false; _messageCtr = 0; _skipLoad = false; _freeFlag = false; @@ -177,6 +178,7 @@ Animation::Animation(MADSEngine *vm, Scene *scene) : _vm(vm), _scene(scene) { _oldFrameEntry = 0; _rgbResult = -1; _palIndex1 = _palIndex2 = -1; + _dynamicHotspotIndex = -1; } Animation::~Animation() { @@ -375,6 +377,7 @@ void Animation::loadFrame(int frameNumber) { pt.x = _unkList[_unkIndex].x; pt.y = _unkList[_unkIndex].y; _unkIndex = 1 - _unkIndex; + warning("LoadFrame - Using unknown array"); } if (drawFrame(spriteSet, pt, frameNumber)) @@ -463,21 +466,25 @@ void Animation::update() { scene._spriteSlots.fullRefresh(); } - // Handle any offset adjustment for sprites as of this frame - bool paChanged = false; - if (scene._posAdjust.x != misc._posAdjust.x) { - scene._posAdjust.x = misc._posAdjust.x; - paChanged = true; - } - if (scene._posAdjust.y != misc._posAdjust.y) { - scene._posAdjust.y = misc._posAdjust.y; - paChanged = true; - } + bool isV2 = (_vm->getGameID() != GType_RexNebular); + if (isV2 && _canChangeView) { + // Handle any offset adjustment for sprites as of this frame + bool paChanged = false; + if (getFramePosAdjust(_currentFrame).x != scene._posAdjust.x) { + scene._posAdjust.x = getFramePosAdjust(_currentFrame).x; + paChanged = true; + } + + if (getFramePosAdjust(_currentFrame).y != scene._posAdjust.y) { + scene._posAdjust.y = getFramePosAdjust(_currentFrame).y; + paChanged = true; + } - if (paChanged) { - int newIndex = scene._spriteSlots.add(); - scene._spriteSlots[newIndex]._seqIndex = -1; - scene._spriteSlots[newIndex]._flags = IMG_REFRESH; + if (paChanged) { + int newIndex = scene._spriteSlots.add(); + scene._spriteSlots[newIndex]._seqIndex = -1; + scene._spriteSlots[newIndex]._flags = IMG_REFRESH; + } } // Main frame animation loop - frames get animated by being placed, as necessary, into the @@ -598,8 +605,8 @@ void Animation::setCurrentFrame(int frameNumber) { _freeFlag = false; } -void Animation::setNextFrameTimer(int frameNumber) { - _nextFrameTimer = frameNumber; +void Animation::setNextFrameTimer(uint32 newTimer) { + _nextFrameTimer = newTimer; } void Animation::eraseSprites() { @@ -611,4 +618,9 @@ void Animation::eraseSprites() { } } +Common::Point Animation::getFramePosAdjust(int idx) { + warning("TODO: Implement getFramePosAdjust"); + + return Common::Point(0, 0); +} } // End of namespace MADS diff --git a/engines/mads/animation.h b/engines/mads/animation.h index 46ef85c5eb..a6a4cfbc8b 100644 --- a/engines/mads/animation.h +++ b/engines/mads/animation.h @@ -34,11 +34,12 @@ namespace MADS { enum AnimFlag { - ANIMFLAG_DITHER = 0x1000, // Dither to 16 colors - ANIMFLAG_CUSTOM_FONT = 0x2000, // Load ccustom font - ANIMFLAG_LOAD_BACKGROUND = 0x0100, // Load background + ANIMFLAG_LOAD_BACKGROUND = 0x0100, // Load background ANIMFLAG_LOAD_BACKGROUND_ONLY = 0x0200, // Load background only - ANIMFLAG_ANIMVIEW = 0x4000 // Cutscene animation + + ANIMFLAG_DITHER = 0x0001, // Dither to 16 colors + ANIMFLAG_CUSTOM_FONT = 0x2000, // Load custom fonts + ANIMFLAG_ANIMVIEW = 0x4000 // Cutscene animation }; enum AnimBgType { @@ -189,8 +190,10 @@ public: Common::Array<AnimUIEntry> _uiEntries; Common::Array<AnimMessage> _messages; bool _resetFlag; + bool _canChangeView; int _currentFrame; int _oldFrameEntry; + int _dynamicHotspotIndex; static Animation *init(MADSEngine *vm, Scene *scene); /* @@ -224,8 +227,8 @@ public: */ void eraseSprites(); - void setNextFrameTimer(int frameNumber); - int getNextFrameTimer() const { return _nextFrameTimer; } + void setNextFrameTimer(uint32 newTimer); + uint32 getNextFrameTimer() const { return _nextFrameTimer; } void setCurrentFrame(int frameNumber); int getCurrentFrame() const { return _currentFrame; } @@ -235,6 +238,8 @@ public: void resetSpriteSetsCount() { _header._spriteSetsCount = 0; } // CHECKME: See if it doesn't leak the memory when the destructor is called SpriteAsset *getSpriteSet(int idx) { return _spriteSets[idx]; } + + Common::Point getFramePosAdjust(int idx); }; } // End of namespace MADS diff --git a/engines/mads/assets.h b/engines/mads/assets.h index 8a0dc2cd44..0aae534498 100644 --- a/engines/mads/assets.h +++ b/engines/mads/assets.h @@ -99,8 +99,9 @@ public: int getCount() { return _frameCount; } int getFrameRate() const { return _frameRate; } int getPixelSpeed() const { return _pixelSpeed; } - int getFrameWidth(int index); - int getFrameHeight(int index); + Common::Point getFramePos(int index) { assert (index < _frameCount); return Common::Point(_frames[index]._bounds.left, _frames[index]._bounds.top); } + int getFrameWidth(int index) { assert (index < _frameCount); return _frames[index]._bounds.width(); } + int getFrameHeight(int index) { assert (index < _frameCount); return _frames[index]._bounds.height(); } int getMaxFrameWidth() const { return _maxWidth; } int getMaxFrameHeight() const { return _maxHeight; } MSprite *getFrame(int frameIndex); diff --git a/engines/mads/camera.cpp b/engines/mads/camera.cpp new file mode 100644 index 0000000000..a727042551 --- /dev/null +++ b/engines/mads/camera.cpp @@ -0,0 +1,192 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "mads/mads.h" +#include "mads/camera.h" + +namespace MADS { + +Camera::Camera(MADSEngine *vm) : _vm(vm) { + _panAllowedFl = false; + _activeFl = false; + _currentFrameFl = false; + _manualFl = false; + _speed = -1; + _rate = -1; + _target = -1; + _distOffCenter = -1; + _startTolerance = -1; + _endTolerance = -1; + _direction = -1; + _timer = 0; +} + +void Camera::setDefaultPanX() { + _activeFl = false; + Scene &scene = _vm->_game->_scene; + _panAllowedFl = (scene._sceneInfo->_width > MADS_SCREEN_WIDTH); + + if (_panAllowedFl) { + _manualFl = false; + _rate = 4; + _speed = 4; + _target = 0; + _distOffCenter = 80; + _startTolerance = 80; + _endTolerance = 4; + _timer = scene._frameStartTime; + } +} + +void Camera::setDefaultPanY() { + _activeFl = false; + Scene &scene = _vm->_game->_scene; + _panAllowedFl = (scene._sceneInfo->_height > MADS_SCENE_HEIGHT); + + if (_panAllowedFl) { + _manualFl = true; + _rate = 4; + _speed = 2; + _target = 0; + _distOffCenter = 80; + _startTolerance = 60; + _endTolerance = 4; + _timer = scene._frameStartTime; + } +} + +void Camera::camPanTo(int target) { + if (_panAllowedFl) { + _activeFl = true; + _manualFl = true; + _target = target; + _timer = _vm->_game->_scene._frameStartTime; + } +} + +bool Camera::camPan(int16 *picture_view, int16 *player_loc, int display_size, int picture_size) { + bool panningFl = false; + if (_panAllowedFl) { + Scene &scene = _vm->_game->_scene; + Player &player = _vm->_game->_player; + + _currentFrameFl = false; + + uint32 timer; + if ((abs((int32) (_timer - player._priorTimer)) < _rate) && (player._ticksAmount == _rate)) + timer = player._priorTimer; + else + timer = _timer; + + if (_activeFl && (scene._frameStartTime < timer)) + return (panningFl); + + _timer = scene._frameStartTime + _rate; + + if (_manualFl) { + if (_activeFl) { + int diff = _target - *picture_view; + int direction = 0; + if (diff < 0) + direction = -1; + else if (diff > 0) + direction = 1; + + int magnitude = MIN(abs(diff), _speed); + + if (magnitude == 0) + _activeFl = false; + else { + int panAmount; + if (direction < 0) + panAmount = -magnitude; + else + panAmount = magnitude; + + *picture_view += panAmount; + + panningFl = true; + _currentFrameFl = true; + } + } + } else { + if (!_activeFl) { + int lowEdge = *picture_view + _startTolerance; + int highEdge = *picture_view - _startTolerance + display_size - 1; + + if ((*player_loc < lowEdge) && (picture_view > 0)) { + _activeFl = true; + _direction = -1; + } + + if ((*player_loc > highEdge) && (*picture_view < (picture_size - display_size))) { + _activeFl = true; + _direction = 1; + } + } + + int newTarget = *player_loc - (display_size >> 1); + + if (_direction < 0) + newTarget -= _distOffCenter; + else + newTarget += _distOffCenter; + + newTarget = MAX(0, newTarget); + newTarget = MIN(newTarget, (picture_size - display_size)); + + _target = newTarget; + + int diff = newTarget - *picture_view; + int magnitude = abs(diff); + + int direction = 0; + if (diff < 0) + direction = -1; + else if (diff > 0) + direction = 1; + + if (_activeFl && (magnitude <= _endTolerance)) + _activeFl = false; + + if (_activeFl) { + magnitude = MIN(magnitude, _speed); + + int panAmount; + if (direction < 0) + panAmount = -magnitude; + else + panAmount = magnitude; + + if (panAmount) { + *picture_view += panAmount; + panningFl = true; + _currentFrameFl = true; + } + } + } + } + + return (panningFl); +} + +} // End of namespace MADS diff --git a/engines/mads/camera.h b/engines/mads/camera.h new file mode 100644 index 0000000000..63f1f9f7ff --- /dev/null +++ b/engines/mads/camera.h @@ -0,0 +1,63 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef MADS_CAMERA_H +#define MADS_CAMERA_H + +#include "mads/scene.h" +#include "mads/player.h" +#include "mads/camera.h" + +namespace MADS { + +class MADSEngine; + +class Camera { +private: + MADSEngine *_vm; + +public: + bool _panAllowedFl; + bool _activeFl; + bool _currentFrameFl; + bool _manualFl; + + int _speed; + int _rate; + int _target; + int _distOffCenter; + int _startTolerance; + int _endTolerance; + int _direction; + uint32 _timer; + + Camera(MADSEngine *vm); + + void camPanTo(int target); + bool camPan(int16 *picture_view, int16 *player_loc, int display_size, int picture_size); + void setDefaultPanX(); + void setDefaultPanY(); +}; + +} // End of namespace MADS + +#endif /* MADS_CAMERA_H */ diff --git a/engines/mads/conversations.cpp b/engines/mads/conversations.cpp new file mode 100644 index 0000000000..53b8e7900d --- /dev/null +++ b/engines/mads/conversations.cpp @@ -0,0 +1,362 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "mads/conversations.h" +#include "mads/mads.h" +#include "mads/compression.h" +#include "common/file.h" +#include "common/util.h" // for Common::hexdump + +namespace MADS { + +#define MAX_SPEAKERS 5 + +enum DialogCommands { + cmdNodeEnd = 0, + // + cmdHide = 2, + cmdUnhide = 3, + cmdMessage = 4, + // + // + cmdGoto = 7, + // + cmdAssign = 9, + cmdDialogEnd = 255 +}; + +struct ConvDialog { + int16 textLineIndex; // 0-based + int16 speechIndex; // 1-based + uint16 nodeOffset; // offset in section 6 + uint16 nodeSize; // size in section 6 +}; + +struct ConvNode { + uint16 index; + uint16 dialogCount; + int16 unk1; + int16 unk2; + int16 unk3; + + Common::Array<ConvDialog> dialogs; +}; + +struct ConvData { + uint16 nodeCount; // conversation nodes, each one containing several dialog options and messages + uint16 dialogCount; // messages (non-selectable) + texts (selectable) + uint16 messageCount; // messages (non-selectable) + uint16 textLineCount; + uint16 unk2; + uint16 importCount; + uint16 speakerCount; + Common::String portraits[MAX_SPEAKERS]; + bool speakerExists[MAX_SPEAKERS]; + Common::String speechFile; + Common::Array<Common::String> textLines; + Common::Array<ConvNode> convNodes; +}; + +GameConversation::GameConversation(MADSEngine *vm) + : _vm(vm) { + _running = _restoreRunning = 0; + _nextStartNode = nullptr; +} + +GameConversation::~GameConversation() { +} + +void GameConversation::get(int id) { + Common::File inFile; + Common::String fileName = Common::String::format("CONV%03d.CNV", id); + // TODO: Also handle the .CND file + + inFile.open(fileName); + MadsPack convFileUnpacked(&inFile); + Common::SeekableReadStream *convFile = convFileUnpacked.getItemStream(0); + + char buffer[16]; + + ConvData conv; + + // **** Section 0: Header ************************************************* + conv.nodeCount = convFile->readUint16LE(); + conv.dialogCount = convFile->readUint16LE(); + conv.messageCount = convFile->readUint16LE(); + conv.textLineCount = convFile->readUint16LE(); + conv.unk2 = convFile->readUint16LE(); + conv.importCount = convFile->readUint16LE(); + conv.speakerCount = convFile->readUint16LE(); + + //debug("Conv %d has %d nodes, %d dialogs, %d messages, %d text lines, %d unk2, %d imports and %d speakers", + // id, conv.nodeCount, conv.dialogCount, conv.messageCount, conv.textLineCount, conv.unk2, conv.importCount, conv.speakerCount); + + for (uint16 i = 0; i < MAX_SPEAKERS; i++) { + convFile->read(buffer, 16); + conv.portraits[i] = buffer; + //debug("Speaker %d, portrait %s", i, conv.portraits[i].c_str()); + } + + for (uint16 i = 0; i < MAX_SPEAKERS; i++) { + conv.speakerExists[i] = convFile->readUint16LE(); + //debug("Speaker %d exists: %d", i, conv.speakerExists[i]); + } + + convFile->read(buffer, 14); + conv.speechFile = Common::String(buffer); + //debug("Speech file %s", conv.speechFile.c_str()); + + uint16 textLength = convFile->readUint16LE(); // Total text length in section 5 + convFile->skip(2); // TODO: unknown + uint16 commandLength = convFile->readUint16LE(); // Total length of commands in section 6 + //debug("Node entry commands length: %d", commandLength); + +#if 0 + debug("Section 0 unknown bytes"); + byte *tmp0 = new byte[26]; + convFile->read(tmp0, 26); + Common::hexdump(tmp0, 26); + delete[] tmp0; + delete convFile; +#else + warning("Section 0 unknown bytes"); +#endif + // **** Section 1: Nodes ************************************************** + convFile = convFileUnpacked.getItemStream(1); + + for (uint16 i = 0; i < conv.nodeCount; i++) { + ConvNode node; + node.index = convFile->readUint16LE(); + node.dialogCount = convFile->readUint16LE(); + node.unk1 = convFile->readSint16LE(); // TODO + node.unk2 = convFile->readSint16LE(); // TODO + node.unk3 = convFile->readSint16LE(); // TODO + conv.convNodes.push_back(node); + //debug("Node %d, index %d, entries %d - %d, %d, %d", i, node.index, node.dialogCount, node.unk1, node.unk2, node.unk3); + } + delete convFile; + + // **** Section 2: Dialogs ************************************************ + convFile = convFileUnpacked.getItemStream(2); + assert(convFile->size() == conv.dialogCount * 8); + + for (uint16 i = 0; i < conv.nodeCount; i++) { + uint16 dialogCount = conv.convNodes[i].dialogCount; + + for (uint16 j = 0; j < dialogCount; j++) { + ConvDialog dialog; + dialog.textLineIndex = convFile->readSint16LE(); + dialog.speechIndex = convFile->readSint16LE(); + dialog.nodeOffset = convFile->readUint16LE(); + dialog.nodeSize = convFile->readUint16LE(); + conv.convNodes[i].dialogs.push_back(dialog); + //debug("Node %d, dialog %d: text line %d, speech index %d, node offset %d, node size %d", j, i, dialog.textLineIndex, dialog.speechIndex, dialog.nodeOffset, dialog.nodeSize); + } + } + delete convFile; + + // **** Section 3: ???? *************************************************** +#if 0 + debug("Section 3"); + convFile = convFileUnpacked.getItemStream(3); + byte *tmp1 = new byte[convFile->size()]; + convFile->read(tmp1, convFile->size()); + Common::hexdump(tmp1, convFile->size()); + delete[] tmp1; + delete convFile; +#else + warning("Section 3 - TODO"); +#endif + // **** Section 4: Text line offsets ************************************** + convFile = convFileUnpacked.getItemStream(4); + assert(convFile->size() == conv.textLineCount * 2); + + uint16 *textLineOffsets = new uint16[conv.textLineCount]; // deleted below in section 5 + for (uint16 i = 0; i < conv.textLineCount; i++) + textLineOffsets[i] = convFile->readUint16LE(); + + delete convFile; + + // **** Section 5: Text lines ********************************************* + convFile = convFileUnpacked.getItemStream(5); + assert(convFile->size() == textLength); + + Common::String textLine; + conv.textLines.resize(conv.textLineCount); + char textLineBuffer[256]; + uint16 nextOffset; + for (uint16 i = 0; i < conv.textLineCount; i++) { + nextOffset = (i != conv.textLineCount - 1) ? textLineOffsets[i + 1] : convFile->size(); + convFile->read(textLineBuffer, nextOffset - textLineOffsets[i]); + conv.textLines[i] = Common::String(textLineBuffer); + //debug("Text line %d: %s", i, conv.textLines[i].c_str()); + } + + delete[] textLineOffsets; + delete convFile; + + // **** Section 6: Node entry commands ************************************ + convFile = convFileUnpacked.getItemStream(6); + assert(convFile->size() == commandLength); + + for (uint16 i = 0; i < conv.nodeCount; i++) { + uint16 dialogCount = conv.convNodes[i].dialogCount; + + for (uint16 j = 0; j < dialogCount; j++) { + //ConvDialog dialog = conv.convNodes[i].dialogs[j]; + byte command; + uint16 chk; + + do { + command = convFile->readByte(); + chk = convFile->readUint16BE(); + if (chk != 0xFF00 && chk != 0x0000) { + warning("Error while reading conversation node entries - bailing out"); + break; + } + + switch (command) { + case cmdNodeEnd: + //debug("Node end"); + break; + case cmdDialogEnd: + //debug("Dialog end"); + break; + case cmdHide: { + byte count = convFile->readByte(); + for (byte k = 0; k < count; k++) { + /*uint16 nodeRef = */convFile->readUint16LE(); + //debug("Hide node %d", nodeRef); + } + + } + break; + case cmdUnhide: { + byte count = convFile->readByte(); + for (byte k = 0; k < count; k++) { + /*uint16 nodeRef = */convFile->readUint16LE(); + //debug("Unhide node %d", nodeRef); + } + + } + break; + case cmdMessage: + //debug("Message"); + convFile->skip(7); // TODO + break; + case cmdGoto: { + convFile->skip(3); // unused? + /*byte nodeRef = */convFile->readByte(); + //debug("Goto %d", nodeRef); + } + break; + case cmdAssign: { + convFile->skip(3); // unused? + /*uint16 value = */convFile->readUint16LE(); + /*uint16 variable = */convFile->readUint16LE(); + //debug("Variable %d = %d", variable, value); + } + break; + default: + error("Unknown conversation command %d", command); + break; + } + } while (command != cmdNodeEnd && command != cmdDialogEnd); + } + } + + delete convFile; + inFile.close(); + + /* + // DEBUG: Show the very first message, and play the very first speech + _vm->_audio->setSoundGroup(conv.speechFile); + uint16 firstText = 0, firstSpeech = 1; + + for (uint16 i = 0; i < conv.convNodes.size(); i++) { + for (uint16 k = 0; k < conv.convNodes[i].dialogs.size(); k++) { + if (conv.convNodes[i].dialogs[k].textLineIndex >= 0) { + firstText = conv.convNodes[i].dialogs[k].textLineIndex; + firstSpeech = conv.convNodes[i].dialogs[k].speechIndex; + break; + } + } + } + + _vm->_audio->playSound(firstSpeech - 1); + + TextDialog *dialog = new TextDialog(_vm, FONT_INTERFACE, Common::Point(0, 100), 30); + dialog->addLine(conv.textLines[firstText]); + dialog->show(); + delete dialog; + */ + + warning("TODO GameConversation::get"); +} + +void GameConversation::run(int id) { + warning("TODO GameConversation::run"); +} + +void GameConversation::stop() { + warning("TODO GameConversation::stop"); +} + +void GameConversation::exportPointer(int *val) { + warning("TODO GameConversation::exportPointer"); +} + +void GameConversation::exportValue(int val) { + warning("TODO GameConversation::exportValue"); +} + +void GameConversation::setHeroTrigger(int val) { + _vm->_game->_trigger = val; // HACK + _running = -1; // HACK + warning("TODO: GameConversation::setHeroTrigger"); +} + +void GameConversation::setInterlocutorTrigger(int val) { + warning("TODO: GameConversation::setInterlocutorTrigger"); +} + +int* GameConversation::getVariable(int idx) { + warning("TODO: GameConversation::getVariable"); + return nullptr; +} + +void GameConversation::hold() { + warning("TODO: GameConversation::hold"); +} + +void GameConversation::release() { + warning("TODO: GameConversation::release"); +} + +void GameConversation::reset(int id) { + warning("TODO: GameConversation::reset"); +} + +void GameConversation::abortConv() { + warning("TODO: GameConversation::abort"); +} +} // End of namespace MADS diff --git a/engines/mads/conversations.h b/engines/mads/conversations.h new file mode 100644 index 0000000000..c4bf06e6dc --- /dev/null +++ b/engines/mads/conversations.h @@ -0,0 +1,66 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef MADS_CONVERSATIONS_H +#define MADS_CONVERSATIONS_H + +namespace MADS { + +class MADSEngine; + +class GameConversation { +private: + MADSEngine *_vm; + +public: + /** + * Constructor + */ + GameConversation(MADSEngine *vm); + + /** + * Destructor + */ + virtual ~GameConversation(); + + int* _nextStartNode; + int* getVariable(int idx); + + void get(int id); + void run(int id); + void stop(); + void exportPointer(int *val); + void exportValue(int val); + void setHeroTrigger(int val); + void setInterlocutorTrigger(int val); + void hold(); + void release(); + void reset(int id); + void abortConv(); + + int _running; + int _restoreRunning; +}; + +} // End of namespace MADS + +#endif /* MADS_CONVERSATIONS_H */ diff --git a/engines/mads/debugger.cpp b/engines/mads/debugger.cpp index a6a4d3edbc..740c19abad 100644 --- a/engines/mads/debugger.cpp +++ b/engines/mads/debugger.cpp @@ -49,6 +49,7 @@ Debugger::Debugger(MADSEngine *vm) : GUI::Debugger(), _vm(vm) { registerCmd("item", WRAP_METHOD(Debugger, Cmd_Item)); registerCmd("play_anim", WRAP_METHOD(Debugger, Cmd_PlayAnim)); registerCmd("play_text", WRAP_METHOD(Debugger, Cmd_PlayText)); + registerCmd("set_camera", WRAP_METHOD(Debugger, Cmd_SetCamera)); } static int strToInt(const char *s) { @@ -391,4 +392,17 @@ bool Debugger::Cmd_PlayText(int argc, const char **argv) { } } +bool Debugger::Cmd_SetCamera(int argc, const char **argv) { + if (argc != 3) { + debugPrintf("Usage: %s <x> <y>\n", argv[0]); + return true; + } else { + int x = strToInt(argv[1]); + int y = strToInt(argv[2]); + _vm->_game->_scene.setCamera(Common::Point(x, y)); + _vm->_game->_scene.resetScene(); + _vm->_game->_scene.drawElements(kTransitionNone, false); + return false; + } +} } // End of namespace MADS diff --git a/engines/mads/debugger.h b/engines/mads/debugger.h index 70b2cadc65..f6b58ac0de 100644 --- a/engines/mads/debugger.h +++ b/engines/mads/debugger.h @@ -51,6 +51,7 @@ protected: bool Cmd_Item(int argc, const char **argv); bool Cmd_PlayAnim(int argc, const char **argv); bool Cmd_PlayText(int argc, const char **argv); + bool Cmd_SetCamera(int argc, const char **argv); public: bool _showMousePos; public: diff --git a/engines/mads/dialogs.h b/engines/mads/dialogs.h index efd2871d89..27bc0a43ee 100644 --- a/engines/mads/dialogs.h +++ b/engines/mads/dialogs.h @@ -226,6 +226,11 @@ public: virtual void showItem(int objectId, int messageId, int speech = 0) = 0; virtual Common::String getVocab(int vocabId) = 0; virtual bool show(int messageId, int objectId = -1) = 0; + + /** + * Show a spinning picture of an object, used in V2+ games + */ + virtual void spinObject(int idx) { warning("TODO: spinObject"); } }; class FullScreenDialog: public EventTarget { diff --git a/engines/mads/dragonsphere/dragonsphere_scenes.cpp b/engines/mads/dragonsphere/dragonsphere_scenes.cpp index 6f5a28bff9..938931e80d 100644 --- a/engines/mads/dragonsphere/dragonsphere_scenes.cpp +++ b/engines/mads/dragonsphere/dragonsphere_scenes.cpp @@ -28,6 +28,7 @@ #include "mads/scene.h" #include "mads/dragonsphere/game_dragonsphere.h" #include "mads/dragonsphere/dragonsphere_scenes.h" +#include "mads/dragonsphere/dragonsphere_scenes1.h" namespace MADS { @@ -42,15 +43,15 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) { switch (scene._nextSceneId) { // Scene group #1 (Castle, river and caves) case 101: // king's bedroom - return new DummyScene(vm); // TODO + return new Scene101(vm); case 102: // queen's bedroom - return new DummyScene(vm); // TODO + return new Scene102(vm); case 103: // outside king's bedroom - return new DummyScene(vm); // TODO + return new Scene103(vm); case 104: // fireplace / bookshelf - return new DummyScene(vm); // TODO + return new Scene104(vm); case 105: // dining room - return new DummyScene(vm); // TODO + return new Scene105(vm); case 106: // throne room return new DummyScene(vm); // TODO case 107: // council chamber @@ -201,12 +202,12 @@ Common::String DragonsphereScene::formAnimName(char sepChar, int suffixNum) { /*------------------------------------------------------------------------*/ void SceneInfoDragonsphere::loadCodes(MSurface &depthSurface, int variant) { - // The intro scenes do not have any codes - if (_sceneId >= 900) + Common::String ext = Common::String::format(".WW%d", variant); + Common::String fileName = Resources::formatName(RESPREFIX_RM, _sceneId, ext); + if (!Common::File::exists(fileName)) return; - Common::String ext = Common::String::format(".WW%d", variant); - File f(Resources::formatName(RESPREFIX_RM, _sceneId, ext)); + File f(fileName); MadsPack codesPack(&f); Common::SeekableReadStream *stream = codesPack.getItemStream(0); diff --git a/engines/mads/dragonsphere/dragonsphere_scenes.h b/engines/mads/dragonsphere/dragonsphere_scenes.h index 173cc667ce..e9b48715db 100644 --- a/engines/mads/dragonsphere/dragonsphere_scenes.h +++ b/engines/mads/dragonsphere/dragonsphere_scenes.h @@ -29,29 +29,49 @@ #include "mads/dragonsphere/game_dragonsphere.h" //#include "mads/dragonsphere/globals_dragonsphere.h" - namespace MADS { namespace Dragonsphere { +enum Verb { + VERB_LOOK = 0x3, + VERB_TAKE = 0x4, + VERB_PUSH = 0x5, + VERB_OPEN = 0x6, + VERB_PUT = 0x7, + VERB_TALK_TO = 0x8, + VERB_GIVE = 0x9, + VERB_PULL = 0xA, + VERB_CLOSE = 0xB, + VERB_THROW = 0xC, + VERB_WALK_TO = 0xD, + VERB_WALK_ACROSS = 0x11, + VERB_WALK_BEHIND = 0x1C, + VERB_LOOK_AT = 0x1E, + VERB_WALK_THROUGH = 0x25, + VERB_WALK_INTO = 0x27, + VERB_INVOKE = 0x2F, + VERB_ATTACK = 0x39, + VERB_CARVE_UP = 0x3A, + VERB_THRUST = 0x57, + VERB_POUR = 0x62, + VERB_POUR_CONTENTS_OF = 0x63, + VERB_DRINK = 0x64, + VERB_SHIFT_SELF = 0x73, + VERB_SHIFT_INTO_BEAR = 0x74, + VERB_SHIFT_INTO_SEAL = 0x75, + VERB_SHIFT_INTO_SNAKE = 0x76, + VERB_WALK_DOWN = 0xA9, + VERB_WALK = 0x1CB, + VERB_WALK_AROUND = 0x221 +}; + enum Noun { NOUN_GAME = 0x1, NOUN_QSAVE = 0x2, - NOUN_LOOK = 0x3, - NOUN_TAKE = 0x4, - NOUN_PUSH = 0x5, - NOUN_OPEN = 0x6, - NOUN_PUT = 0x7, - NOUN_TALK_TO = 0x8, - NOUN_GIVE = 0x9, - NOUN_PULL = 0xA, - NOUN_CLOSE = 0xB, - NOUN_THROW = 0xC, - NOUN_WALK_TO = 0xD, NOUN_NOTHING = 0xE, NOUN_ = 0xF, NOUN_FLOOR = 0x10, - NOUN_WALK_ACROSS = 0x11, NOUN_RUG = 0x12, NOUN_CARPET = 0x13, NOUN_WALL = 0x14, @@ -62,18 +82,14 @@ enum Noun { NOUN_NIGHTSTAND = 0x19, NOUN_TAPESTRY = 0x1A, NOUN_DRESSING_SCREEN = 0x1B, - NOUN_WALK_BEHIND = 0x1C, NOUN_ROYAL_CREST = 0x1D, - NOUN_LOOK_AT = 0x1E, NOUN_WASHBASIN = 0x1F, NOUN_WASH_AT = 0x20, NOUN_BOOK = 0x21, NOUN_FIREPLACE = 0x22, NOUN_FIREPLACE_SCREEN = 0x23, NOUN_DOOR_TO_QUEENS_ROOM = 0x24, - NOUN_WALK_THROUGH = 0x25, NOUN_HALL_TO_SOUTH = 0x26, - NOUN_WALK_INTO = 0x27, NOUN_WALL_PLAQUE = 0x28, NOUN_DECORATION = 0x29, NOUN_SWORDS = 0x2A, @@ -81,7 +97,6 @@ enum Noun { NOUN_BUST_ON_WALL = 0x2C, NOUN_WALL_ARCH = 0x2D, NOUN_SIGNET_RING = 0x2E, - NOUN_INVOKE = 0x2F, NOUN_POLISH = 0x30, NOUN_GANGBANG = 0x31, NOUN_BIRD_FIGURINE = 0x32, @@ -91,8 +106,6 @@ enum Noun { NOUN_MAKE_NOISE = 0x36, NOUN_SHIELDSTONE = 0x37, NOUN_SWORD = 0x38, - NOUN_ATTACK = 0x39, - NOUN_CARVE_UP = 0x3A, NOUN_GOBLET = 0x3B, NOUN_FILL = 0x3C, NOUN_DRINK_FROM = 0x3D, @@ -121,7 +134,6 @@ enum Noun { NOUN_MAGIC_BELT = 0x54, NOUN_ADJUST = 0x55, NOUN_AMULET = 0x56, - NOUN_THRUST = 0x57, NOUN_MUD = 0x58, NOUN_FEEL = 0x59, NOUN_TASTE = 0x5A, @@ -132,9 +144,6 @@ enum Noun { NOUN_FLASK = 0x5F, NOUN_FLASK_FULL_OF_ACID = 0x60, NOUN_POUR_CONTENTS = 0x61, - NOUN_POUR = 0x62, - NOUN_POUR_CONTENTS_OF = 0x63, - NOUN_DRINK = 0x64, NOUN_ROPE = 0x65, NOUN_TIE = 0x66, NOUN_POWER_VACUUM_STONE = 0x67, @@ -149,10 +158,6 @@ enum Noun { NOUN_BLACK_SPHERE = 0x70, NOUN_SOPTUS_SOPORIFIC = 0x71, NOUN_SHIFTER_RING = 0x72, - NOUN_SHIFT_SELF = 0x73, - NOUN_SHIFT_INTO_BEAR = 0x74, - NOUN_SHIFT_INTO_SEAL = 0x75, - NOUN_SHIFT_INTO_SNAKE = 0x76, NOUN_REVERT = 0x77, NOUN_MEDICINE_BUNDLE = 0x78, NOUN_SHAKE = 0x79, @@ -203,7 +208,6 @@ enum Noun { NOUN_DOOR = 0xA6, NOUN_WALL_SWITCH = 0xA7, NOUN_STAIRS = 0xA8, - NOUN_WALK_DOWN = 0xA9, NOUN_EDGE_OF_ABYSS = 0xAA, NOUN_COURTYARD = 0xAB, NOUN_ROCK = 0xAC, @@ -493,7 +497,6 @@ enum Noun { NOUN_PATH_TO_HIGHTOWER = 0x1C8, NOUN_SPIRIT_PLANE = 0x1C9, NOUN_SPIRIT_TREE = 0x1CA, - NOUN_WALK = 0x1CB, NOUN_REMAINS = 0x1CC, NOUN_DOORWAY_TO_ELEVATOR = 0x1CD, NOUN_DRAGON_DOOR = 0x1CE, @@ -579,7 +582,6 @@ enum Noun { NOUN_SHIFTER_VILLAGE = 0x21E, NOUN_SLATHAN_SKY = 0x21F, NOUN_SHIFTER = 0x220, - NOUN_WALK_AROUND = 0x221, NOUN_WRECKED_BRIDGE = 0x222, NOUN_SHACK = 0x223, NOUN_WRECKED_SHACK = 0x224, @@ -656,27 +658,6 @@ protected: }; // TODO: Temporary, remove once implemented properly -class Scene1xx : public DragonsphereScene { -protected: - /** - * Plays an appropriate sound when entering a scene - */ - void sceneEntrySound() {} - - /** - *Sets the AA file to use for the scene - */ - void setAAName() {} - - /** - * Updates the prefix used for getting player sprites for the scene - */ - void setPlayerSpritesPrefix() {} -public: - Scene1xx(MADSEngine *vm) : DragonsphereScene(vm) {} -}; - -// TODO: Temporary, remove once implemented properly class DummyScene : public DragonsphereScene { public: DummyScene(MADSEngine *vm) : DragonsphereScene(vm) { diff --git a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp new file mode 100644 index 0000000000..8a89d8ed08 --- /dev/null +++ b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp @@ -0,0 +1,3694 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/scummsys.h" +#include "mads/mads.h" +#include "mads/conversations.h" +#include "mads/scene.h" +#include "mads/dragonsphere/dragonsphere_scenes.h" +#include "mads/dragonsphere/dragonsphere_scenes1.h" + +namespace MADS { + +namespace Dragonsphere { + +void Scene1xx::setAAName() { + int interface; + + switch (_scene->_nextSceneId) { + case 108: + case 109: + interface = 3; + break; + case 110: + interface = 5; + break; + case 113: + case 114: + case 115: + case 117: + case 119: + interface = 1; + break; + case 116: + interface = 2; + break; + case 120: + interface = 8; + break; + default: + interface = 0; + break; + } + + _game._aaName = Resources::formatAAName(interface); + _vm->_palette->setEntry(254, 56, 47, 32); + +} + +void Scene1xx::sceneEntrySound() { + if (!_vm->_musicFlag) + return; + + switch (_scene->_nextSceneId) { + case 104: + if (_globals[kPlayerPersona] == 1) + _vm->_sound->command(44); + else + _vm->_sound->command(16); + break; + + case 106: + if (_globals[kEndOfGame]) + _vm->_sound->command(47); + else + _vm->_sound->command(16); + break; + + case 108: + if (_game._visitedScenes.exists(109)) + _vm->_sound->command(32); + else + _vm->_sound->command(33); + break; + + case 109: + _vm->_sound->command(32); + break; + + case 110: + _vm->_sound->command(37); + break; + + case 111: + _vm->_sound->command(34); + break; + + case 112: + _vm->_sound->command(38); + break; + + case 113: + _vm->_sound->command(5); + if (_globals[kPlayerIsSeal]) + _vm->_sound->command(35); + else + _vm->_sound->command(36); + break; + + case 114: + _vm->_sound->command(36); + break; + + case 115: + _vm->_sound->command(39); + break; + + case 116: + _vm->_sound->command(40); + break; + + case 117: + _vm->_sound->command(35); + break; + + case 119: + _vm->_sound->command(41); + break; + + case 120: + _vm->_sound->command(46); + break; + + default: + _vm->_sound->command(16); + break; + } +} + +void Scene1xx::setPlayerSpritesPrefix() { + int darkSceneFl = false; + int noPlayerFl = false; + + _vm->_sound->command(5); + Common::String oldName = _game._player._spritesPrefix; + + _globals[kPerformDisplacements] = true; + + switch (_scene->_nextSceneId) { + case 106: + if (_scene->_currentSceneId == 120) + noPlayerFl = true; + break; + + case 108: + case 109: + case 114: + case 115: + darkSceneFl = true; + break; + + case 111: + case 112: + case 117: + case 120: + case 119: + noPlayerFl = true; + break; + + case 113: + if (!_globals[kPlayerPersona]) + noPlayerFl = true; + darkSceneFl = true; + break; + } + + if (noPlayerFl || _globals[kNoLoadWalker]) { + _game._player._spritesPrefix = ""; + } else if (!_game._player._forcePrefix) { + if (!_globals[kPlayerPersona] || _scene->_nextSceneId == 108 || _scene->_nextSceneId == 109) { + if (_scene->_nextSceneId == 113 || _scene->_nextSceneId == 114 || _scene->_nextSceneId == 115 || _scene->_nextSceneId == 116) + _game._player._spritesPrefix = "PD"; + else + _game._player._spritesPrefix = "KG"; + } else + _game._player._spritesPrefix = "PD"; + + if (darkSceneFl) + _game._player._spritesPrefix += "D"; + } + + if (oldName != _game._player._spritesPrefix) + _game._player._spritesChanged = true; + + _game._player._scalingVelocity = true; +} + +/*------------------------------------------------------------------------*/ + +Scene101::Scene101(MADSEngine *vm) : Scene1xx(vm) { +} + +void Scene101::synchronize(Common::Serializer &s) { + Scene1xx::synchronize(s); +} + +void Scene101::setup() { + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene101::enter() { + sceneEntrySound(); +} + +void Scene101::step() { +} + +void Scene101::actions() { + if (_action.isObject(NOUN_BED)) { + int sprIdx = _scene->_sprites.addSprites("*ob001i"); + int seqIdx = _scene->_sequences.addStampCycle(sprIdx, false, 1); + _scene->_sequences.setDepth(seqIdx, 0); + _scene->_sequences.setPosition(seqIdx, Common::Point(10, 50)); + _action._inProgress = false; + } +} + +void Scene101::preActions() { +} + +/*------------------------------------------------------------------------*/ + +Scene102::Scene102(MADSEngine *vm) : Scene1xx(vm) { + _diaryHotspotIdx1 = -1; + _diaryHotspotIdx2 = -1; + _diaryFrame = -1; + _animRunning = -1; +} + +void Scene102::synchronize(Common::Serializer &s) { + Scene1xx::synchronize(s); + + s.syncAsSint16LE(_diaryHotspotIdx1); + s.syncAsSint16LE(_diaryHotspotIdx2); + s.syncAsSint16LE(_diaryFrame); + s.syncAsSint16LE(_animRunning); +} + +void Scene102::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + _scene->addActiveVocab(NOUN_DIARIES); + _scene->addActiveVocab(VERB_WALK_TO); +} + +void Scene102::enter() { + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('p', 0)); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 1)); + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('y', 0)); + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('y', 1)); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', -1)); + _globals._spriteIndexes[7] = _scene->_sprites.addSprites("*KGRD_6"); + _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('y', 2)); + + _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 0); + _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 7, 0); + _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 7, 0); + + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 12); + _diaryHotspotIdx1 = _scene->_dynamicHotspots.add(NOUN_DIARIES, VERB_WALK_TO, SYNTAX_PLURAL, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots.setPosition(_diaryHotspotIdx1, Common::Point(47, 123), FACING_NORTHWEST); + + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 12); + _diaryHotspotIdx2 = _scene->_dynamicHotspots.add(NOUN_DIARIES, VERB_WALK_TO, SYNTAX_PLURAL, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots.setPosition(_diaryHotspotIdx2, Common::Point(47, 123), FACING_NORTHWEST); + + if (_scene->_priorSceneId == 103) { + _game._player._playerPos = Common::Point(170, 152); + _game._player._facing = FACING_NORTHWEST; + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5); + } else if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5); + _game._player.firstWalk(Common::Point(-10, 130), FACING_EAST, Common::Point(35, 144), FACING_EAST, false); + _game._player.setWalkTrigger(70); + } else { + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5); + } + + sceneEntrySound(); +} + +void Scene102::step() { + int resetFrame; + + if ((_animRunning == 1) && _scene->_animation[_globals._animationIndexes[0]]) { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() != _diaryFrame) { + _diaryFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + resetFrame = -1; + + switch (_diaryFrame) { + case 6: + _scene->deleteSequence(_globals._sequenceIndexes[1]); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[1], SYNC_ANIM, _globals._animationIndexes[0]); + break; + + case 10: + _vm->_sound->command(65); + break; + + case 26: + _vm->_dialogs->show(10210); + _vm->_dialogs->show(10211); + _vm->_dialogs->show(10212); + break; + + default: + break; + } + + if (resetFrame >= 0) { + if (resetFrame != _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame()) { + _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame); + _diaryFrame = resetFrame; + } + } + } + } + + if ((_animRunning == 2) && _scene->_animation[_globals._animationIndexes[0]]) { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() != _diaryFrame) { + _diaryFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + + switch (_diaryFrame) { + case 6: + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[2], SYNC_ANIM, _globals._animationIndexes[0]); + break; + + case 26: + _vm->_dialogs->show(10213); + _vm->_dialogs->show(10214); + break; + + default: + break; + } + } + } + + if (_game._trigger >= 70) { + switch (_game._trigger) { + case 70: + _scene->deleteSequence(_globals._sequenceIndexes[6]); + _vm->_sound->command(25); + _globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], false, 9, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 4); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 71); + break; + + case 71: { + int idx = _globals._sequenceIndexes[6]; + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], -2); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[6], SYNC_SEQ, idx); + _game._player._stepEnabled = true; + } + break; + + default: + break; + } + } +} + +void Scene102::actions() { + if (_action._lookFlag) { + _vm->_dialogs->show(10201); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_KINGS_ROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_KINGS_ROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_KINGS_ROOM)) { + switch (_game._trigger) { + case 0: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[7] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[7], true, 8, 2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[7], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_SPRITE, 2, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 3); + break; + + case 1: + _scene->deleteSequence(_globals._sequenceIndexes[6]); + _vm->_sound->command(24); + _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 9, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 2: { + int idx = _globals._sequenceIndexes[6]; + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 5); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[6], SYNC_SEQ, idx); + } + break; + + case 3: + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[7]); + _game._player.walk(Common::Point(0, 130), FACING_WEST); + _game._player._walkOffScreenSceneId = 101; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_HALLWAY)) { + _scene->_nextSceneId = 103; + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_DIARIES) || _action.isAction(VERB_OPEN, NOUN_DIARIES)) { + switch (_game._trigger) { + case 0: + _game._player._stepEnabled = false; + _game._player._visible = false; + _animRunning = 1; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('B',-1), 1); + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0); + break; + + case 1: + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 12); + _diaryHotspotIdx1 = _scene->_dynamicHotspots.add(NOUN_DIARIES, VERB_WALK_TO, SYNTAX_PLURAL, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots.setPosition(_diaryHotspotIdx1, Common::Point(47, 123), FACING_NORTHWEST); + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); + _scene->_sequences.addTimer(6, 2); + break; + + case 2: + _game._player.walk(Common::Point(51, 121), FACING_NORTHWEST); + _game._player.setWalkTrigger(3); + break; + + case 3: + _game._player._visible = false; + _animRunning = 2; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('A',-1), 4); + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0); + break; + + case 4: + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 12); + _diaryHotspotIdx2 = _scene->_dynamicHotspots.add(NOUN_DIARIES, VERB_WALK_TO, SYNTAX_PLURAL, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots.setPosition(_diaryHotspotIdx2, Common::Point(47, 123), FACING_NORTHWEST); + _game._player._visible = true; + _game._player._stepEnabled = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_FIREPLACE)) { + _vm->_dialogs->show(10202); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BED)) { + _vm->_dialogs->show(10203); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SHUTTERS)) { + _vm->_dialogs->show(10204); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RUG)) { + _vm->_dialogs->show(10206); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BOOKCASE)) { + _vm->_dialogs->show(10208); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DIARIES)) { + _vm->_dialogs->show(10209); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR_TO_KINGS_ROOM)) { + _vm->_dialogs->show(10215); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FLOWERS)) { + _vm->_dialogs->show(10216); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WINDOW)) { + _vm->_dialogs->show(10217); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WOOD_BASKET)) { + _vm->_dialogs->show(10219); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FIREPLACE_SCREEN)) { + _vm->_dialogs->show(10220); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_NIGHTSTAND)) { + _vm->_dialogs->show(10222); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR_TO_HALLWAY)) { + _vm->_dialogs->show(10223); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CHEST)) { + _vm->_dialogs->show(10224); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TAPESTRY)) { + _vm->_dialogs->show(10226); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SCONCE)) { + _vm->_dialogs->show(10227); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(10228); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(10229); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DECORATION)) { + _vm->_dialogs->show(10230); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CEILING)) { + _vm->_dialogs->show(10231); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_OPEN, NOUN_CHEST)) { + _vm->_dialogs->show(10224); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_FLOWERS)) { + _vm->_dialogs->show(10225); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_OPEN, NOUN_WINDOW)) { + _vm->_dialogs->show(10218); + _action._inProgress = false; + return; + } + + if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_FIREPLACE_SCREEN)) { + _vm->_dialogs->show(10221); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLOSE, NOUN_SHUTTERS)) { + _vm->_dialogs->show(10205); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_PULL, NOUN_RUG)) { + _vm->_dialogs->show(10207); + _action._inProgress = false; + return; + } +} + +void Scene102::preActions() { +} + +/*------------------------------------------------------------------------*/ + +Scene103::Scene103(MADSEngine *vm) : Scene1xx(vm) { +} + +void Scene103::synchronize(Common::Serializer &s) { + Scene1xx::synchronize(s); +} + +void Scene103::setup() { + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene103::enter() { + _vm->_disableFastwalk = true; + + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('y', 1)); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('y', 2)); + _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('y', 7)); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('y', 0)); + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('y', 3)); + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('y', 4)); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('y', 5)); + _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('y', 6)); + _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('x', 1)); + _globals._spriteIndexes[11] = _scene->_sprites.addSprites("*KGRD_9"); + + _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 0, 0); + _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 7, 0, 4); + _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 7, 0, 0); + _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 7, 0, 0); + _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 0, 3); + _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 7, 0, 2); + _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 7, 0, 0); + _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 7, 0, 5); + + if ((_scene->_priorSceneId == 104) || (_scene->_priorSceneId == 105)) { + _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8); + _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 8); + } + + if (_scene->_priorSceneId == 102) { + _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 6); + _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14); + _scene->setCamera(Common::Point(320, 0)); + _game._player.walk(Common::Point(482, 128), FACING_SOUTH); + _game._player.firstWalk(Common::Point(471, 108), FACING_SOUTH, Common::Point(482, 128), FACING_SOUTH, false); + _game._player.setWalkTrigger(72); + } else if (_scene->_priorSceneId == 104) { + _game._player._playerPos = Common::Point(130, 152); + _game._player._facing = FACING_NORTHEAST; + } else if (_scene->_priorSceneId == 105) { + _game._player._playerPos = Common::Point(517, 152); + _game._player._facing = FACING_NORTHWEST; + _scene->setCamera(Common::Point(320, 0)); + } else if ((_scene->_priorSceneId == 101) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6); + _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 14); + _game._player.firstWalk(Common::Point(173, 108), FACING_SOUTH, Common::Point(162, 127), FACING_SOUTH, false); + _game._player.setWalkTrigger(70); + } else { + _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6); + _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 6); + } + + sceneEntrySound(); +} + +void Scene103::step() { + switch (_game._trigger) { + case 70: + _scene->deleteSequence(_globals._sequenceIndexes[9]); + _vm->_sound->command(25); + _globals._sequenceIndexes[9] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[9], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 6); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 1, 3); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 71); + break; + + case 71: { + int tmpIdx = _globals._sequenceIndexes[9]; + _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 6); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[9], SYNC_SEQ, tmpIdx); + _game._player._stepEnabled = true; + } + break; + + case 72: + _scene->deleteSequence(_globals._sequenceIndexes[10]); + _vm->_sound->command(25); + _globals._sequenceIndexes[10] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[10], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 1, 3); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 73); + break; + + case 73: { + int tmpIdx = _globals._sequenceIndexes[10]; + _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[10], SYNC_SEQ, tmpIdx); + _game._player._stepEnabled = true; + } + break; + + default: + break; + } +} + +void Scene103::actions() { + if (_action._lookFlag) { + _vm->_dialogs->show(10301); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_KINGS_ROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_KINGS_ROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_KINGS_ROOM)) { + switch (_game._trigger) { + case 0: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[11] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[11], false, 7, 2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[11], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_SPRITE, 2, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 3); + break; + + case 1: + _scene->deleteSequence(_globals._sequenceIndexes[9]); + _vm->_sound->command(24); + _globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 7, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 2: { + int tmpIdx = _globals._sequenceIndexes[9]; + _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 14); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[9], SYNC_SEQ, tmpIdx); + } + break; + + case 3: + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[11]); + _scene->_sequences.addTimer(1, 4); + break; + + case 4: + _game._player.walk(Common::Point(173, 108), FACING_NORTH); + _game._player.setWalkTrigger(5); + break; + + case 5: + _scene->deleteSequence(_globals._sequenceIndexes[9]); + _vm->_sound->command(25); + _globals._sequenceIndexes[9] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[9], false, 7, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 6); + break; + + case 6: { + int tmpIdx = _globals._sequenceIndexes[9]; + _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[9], SYNC_SEQ, tmpIdx); + _scene->_sequences.addTimer(6, 7); + } + break; + + case 7: + _scene->_nextSceneId = 101; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_QUEENS_ROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_QUEENS_ROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_QUEENS_ROOM)) { + switch (_game._trigger) { + case 0: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[11] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[11], true, 7, 2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[11], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_SPRITE, 2, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 3); + break; + + case 1: + _scene->deleteSequence(_globals._sequenceIndexes[10]); + _vm->_sound->command(24); + _globals._sequenceIndexes[10] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[10], false, 7, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 8); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 2: { + int tmpIdx = _globals._sequenceIndexes[10]; + _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[10], SYNC_SEQ, tmpIdx); + } + break; + + case 3: + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[11]); + _scene->_sequences.addTimer(1, 4); + break; + + case 4: + _game._player.walk(Common::Point(471, 108), FACING_NORTH); + _game._player.setWalkTrigger(5); + break; + + case 5: + _scene->deleteSequence(_globals._sequenceIndexes[10]); + _vm->_sound->command(25); + _globals._sequenceIndexes[10] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[10], false, 7, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 6); + break; + + case 6: { + int tmpIdx = _globals._sequenceIndexes[10]; + _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[10], SYNC_SEQ, tmpIdx); + _scene->_sequences.addTimer(6, 7); + } + break; + + case 7: + _scene->_nextSceneId = 102; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_MEETING_ROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_MEETING_ROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_MEETING_ROOM)) { + _scene->_nextSceneId = 104; + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_BALLROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_BALLROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_BALLROOM)) { + _scene->_nextSceneId = 105; + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_TAPESTRY)) { + if ((_scene->_customDest.x <= 75) && (_scene->_customDest.y <= 130)) + _vm->_dialogs->show(10302); + else + _vm->_dialogs->show(10303); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_COAT_OF_ARMS)) { + _vm->_dialogs->show(10305); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR_TO_QUEENS_ROOM)) { + _vm->_dialogs->show(10307); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR_TO_KINGS_ROOM)) { + _vm->_dialogs->show(10308); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CEDAR_CHEST)) { + _vm->_dialogs->show(10309); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TABLE)) { + _vm->_dialogs->show(10311); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SMALL_WINDOW)) { + _vm->_dialogs->show(10312); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LARGE_WINDOW)) { + _vm->_dialogs->show(10314); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BATTLE_AXES)) { + _vm->_dialogs->show(10315); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BUST_ON_WALL)) { + _vm->_dialogs->show(10317); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DECORATION)) { + _vm->_dialogs->show(10320); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL_PLAQUE)) { + _vm->_dialogs->show(10322); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR_TO_BALLROOM)) { + _vm->_dialogs->show(10323); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR_TO_MEETING_ROOM)) { + _vm->_dialogs->show(10324); + _action._inProgress = false; + return; + } + } + + if ((_action.isAction(VERB_TAKE) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_BATTLE_AXES)) { + _vm->_dialogs->show(10316); + _action._inProgress = false; + return; + } + + if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_TAPESTRY)) { + _vm->_dialogs->show(10304); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_PULL, NOUN_COAT_OF_ARMS)) { + _vm->_dialogs->show(10306); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_OPEN, NOUN_CEDAR_CHEST)) { + _vm->_dialogs->show(10310); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_OPEN, NOUN_SMALL_WINDOW) || _action.isAction(VERB_OPEN, NOUN_LARGE_WINDOW)) { + _vm->_dialogs->show(10313); + _action._inProgress = false; + return; + } +} + +void Scene103::preActions() { +} + +/*------------------------------------------------------------------------*/ + +Scene104::Scene104(MADSEngine *vm) : Scene1xx(vm) { + _anim0ActvFl = false; + _anim1ActvFl = false; + _anim2ActvFl = false; + _anim3ActvFl = false; + _anim4ActvFl = false; + _anim5ActvFl = false; + _activateTimerFl = false; + _wasBearFl = false; + _amuletWorksFl = false; + _pidDrawnSword = false; + _anim6ActvFl = false; + + _animationRunning = -1; + _deathTimer = -1; + _deathFrame = -1; + _doorwayHotspotId = -1; + + _kingStatus = -1; + _kingFrame = -1; + _kingCount = -1; + _macCount = -1; + _macFrame = -1; + _macStatus = -1; + _queenStatus = -1; + _queenFrame = -1; + _queenCount = -1; + _pidStatus = -1; + _pidFrame = -1; + _pidCount = -1; + _twinklesFrame = -1; + _twinklesStatus = -1; + _twinklesCount = -1; + + _tapestryFrame = -1; + _clock = -1; +} + +void Scene104::synchronize(Common::Serializer &s) { + Scene1xx::synchronize(s); + + s.syncAsByte(_anim0ActvFl); + s.syncAsByte(_anim1ActvFl); + s.syncAsByte(_anim2ActvFl); + s.syncAsByte(_anim3ActvFl); + s.syncAsByte(_anim4ActvFl); + s.syncAsByte(_anim5ActvFl); + s.syncAsByte(_activateTimerFl); + s.syncAsByte(_wasBearFl); + s.syncAsByte(_amuletWorksFl); + s.syncAsByte(_pidDrawnSword); + s.syncAsByte(_anim6ActvFl); + + s.syncAsSint16LE(_animationRunning); + s.syncAsSint16LE(_deathTimer); + s.syncAsSint16LE(_deathFrame); + s.syncAsSint16LE(_doorwayHotspotId); + + s.syncAsSint16LE(_kingStatus); + s.syncAsSint16LE(_kingFrame); + s.syncAsSint16LE(_kingCount); + s.syncAsSint16LE(_queenStatus); + s.syncAsSint16LE(_queenFrame); + s.syncAsSint16LE(_queenCount); + s.syncAsSint16LE(_macStatus); + s.syncAsSint16LE(_macFrame); + s.syncAsSint16LE(_macCount); + s.syncAsSint16LE(_pidStatus); + s.syncAsSint16LE(_pidFrame); + s.syncAsSint16LE(_pidCount); + s.syncAsSint16LE(_twinklesStatus); + s.syncAsSint16LE(_twinklesFrame); + s.syncAsSint16LE(_twinklesCount); + + s.syncAsSint16LE(_tapestryFrame); + s.syncAsSint32LE(_clock); +} + +void Scene104::setup() { + if (_scene->_currentSceneId == 119) + _globals[kNoLoadWalker] = true; + + setPlayerSpritesPrefix(); + setAAName(); + + _scene->addActiveVocab(NOUN_DOORWAY); + _scene->addActiveVocab(NOUN_QUEEN_MOTHER); + _scene->addActiveVocab(NOUN_KING); +} + +void Scene104::enter() { + _vm->_gameConv->get(1); + + if (_globals[kPlayerPersona] == 1) { + _scene->_sprites.addSprites(formAnimName('e', 8)); + _scene->_sprites.addSprites(formAnimName('b', 5)); + } + + _scene->_hotspots.activate(NOUN_MACMORN, false); + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _animationRunning = 0; + _anim0ActvFl = false; + _anim1ActvFl = false; + _anim2ActvFl = false; + _anim3ActvFl = false; + _anim4ActvFl = false; + _anim5ActvFl = false; + _kingCount = 0; + _macCount = 0; + _queenCount = 0; + _twinklesCount = 0; + _deathTimer = 0; + _clock = 0; + _activateTimerFl = false; + _wasBearFl = false; + _amuletWorksFl = false; + _pidDrawnSword = false; + } + + _anim6ActvFl = false; + + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1)); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 2)); + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 3)); + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 5)); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 4)); + + if (_globals[kNoLoadWalker]) { + _scene->drawToBackground(_globals._spriteIndexes[6], 5, Common::Point(-32000, -32000), 0, 100); + _scene->_sprites.remove(_globals._spriteIndexes[6]); + } + + if (_globals[kPlayerPersona] == 0) { + _scene->_hotspots.activateAtPos(NOUN_TABLE, false, Common::Point(139, 132)); + + _globals._spriteIndexes[7] = _scene->_sprites.addSprites("*KGRD_8"); + _globals._spriteIndexes[8] = _scene->_sprites.addSprites("*KGRM1_8"); + _globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('y', 5)); + _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('y', 4)); + _globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('y', 1)); + + if (_globals[kTapestryStatus] == 0 || _globals[kTapestryStatus] == 2) { + _scene->_hotspots.activate(NOUN_WALL_PANEL, false); + _scene->_hotspots.activate(NOUN_SECRET_DOOR, false); + _globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[11], 6); + } else { + _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6); + _scene->_hotspots.activateAtPos(NOUN_TAPESTRY, false, Common::Point(310, 70)); + } + + if (_globals[kBooksStatus] == 1 || _globals[kBooksStatus] == 3) { + if (_globals[kTapestryStatus] == 1 || _globals[kTapestryStatus] == 3) + _scene->_hotspots.activate(NOUN_SECRET_DOOR, false); + } else if (_globals[kBooksStatus] == 2 || _globals[kBooksStatus] == 4) { + _globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 8); + + if (_globals[kTapestryStatus] == 1 || _globals[kTapestryStatus] == 3) { + _scene->_hotspots.activate(NOUN_WALL_PANEL, false); + _scene->_hotspots.activate(NOUN_SECRET_DOOR, true); + } + } + } else { + _globals._spriteIndexes[14] = _scene->_sprites.addSprites(formAnimName('e', 5)); + _scene->_sprites.addSprites(formAnimName('b', 0)); + _globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('b', 3)); + _scene->_hotspots.activateAtPos(NOUN_TABLE, false, Common::Point(140, 107)); + _scene->_hotspots.activateAtPos(NOUN_TABLE, true, Common::Point(139, 132)); + _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('y', 4)); + + if (_globals[kNoLoadWalker]) { + _scene->drawToBackground(_globals._spriteIndexes[10], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_sprites.remove(_globals._spriteIndexes[10]); + } + + _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('y', 3)); + _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8); + _doorwayHotspotId = _scene->_dynamicHotspots.add(NOUN_DOORWAY, VERB_WALK_THROUGH, SYNTAX_SINGULAR, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots.setPosition(_doorwayHotspotId, Common::Point(295, 145), FACING_NORTHEAST); + + _globals[kBooksStatus] = 0; + _scene->_hotspots.activateAtPos(NOUN_TAPESTRY, false, Common::Point(310, 70)); + } + + if (_globals[kBooksStatus] == 0) + _scene->_hotspots.activate(NOUN_BOOKS, false); + + _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 7, 0, 5); + _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 0); + _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 7, 0); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3); + _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 0); + + + if (_globals[kPlayerPersona] == 0) { + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 4); + } + + if (_scene->_priorSceneId == 106) { + _game._player._playerPos = Common::Point(201, 152); + _game._player._facing = FACING_NORTHWEST; + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14); + } else if ((_scene->_priorSceneId == 119) || (_scene->_priorSceneId == 104)) { + _game._player._visible = false; + _game._player._stepEnabled = false; + + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 4); + _scene->_sequences.addTimer(60, 77); + + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('k', 1), 0); + _anim0ActvFl = true; + _kingStatus = 2; + _scene->setAnimFrame(_globals._animationIndexes[0], 22); + + _globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('q', 1), 0); + _anim2ActvFl = true; + _queenStatus = 0; + + _globals._sequenceIndexes[14] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[14], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[14], 6); + + _globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('p', 1), 79); + + int idx = _scene->_dynamicHotspots.add(NOUN_QUEEN_MOTHER, VERB_WALK_TO, SYNTAX_FEM_NOT_PROPER, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots[idx]._articleNumber = PREP_ON; + _scene->setDynamicAnim(idx, _globals._animationIndexes[2], 0); + + _scene->_hotspots.activate(NOUN_MACMORN, true); + + idx = _scene->_dynamicHotspots.add(NOUN_KING, VERB_WALK_TO, SYNTAX_MASC_NOT_PROPER, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots[idx]._articleNumber = PREP_ON; + _scene->setDynamicAnim(idx, _globals._animationIndexes[0], 0); + } else if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14); + _game._player.firstWalk(Common::Point(77, 93), FACING_SOUTH, Common::Point(74, 107), FACING_SOUTH, false); + _game._player.setWalkTrigger(70); + } else if (_globals[kNoLoadWalker]) { + _game._player._visible = false; + _game._player._stepEnabled = false; + + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1); + + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('k', 1), 0); + _anim0ActvFl = true; + _kingStatus = 0; + _scene->setAnimFrame(_globals._animationIndexes[0], 14); + + _globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('q', 1), 0); + _anim2ActvFl = true; + _queenStatus = 0; + + _globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('p', 2), 0); + _anim4ActvFl = true; + _pidStatus = 0; + if (_amuletWorksFl) + _scene->setAnimFrame(_globals._animationIndexes[4], 89); + + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('m', 1), 0); + _anim1ActvFl = true; + _macStatus = 0; + _scene->setAnimFrame(_globals._animationIndexes[1], 25); + + int idx = _scene->_dynamicHotspots.add(NOUN_QUEEN_MOTHER, VERB_WALK_TO, SYNTAX_FEM_NOT_PROPER, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots[idx]._articleNumber = PREP_ON; + _scene->setDynamicAnim(idx, _globals._animationIndexes[2], 0); + + _scene->_hotspots.activate(NOUN_MACMORN, true); + + idx = _scene->_dynamicHotspots.add(NOUN_KING, VERB_WALK_TO, SYNTAX_MASC_NOT_PROPER, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots[idx]._articleNumber = PREP_ON; + _scene->setDynamicAnim(idx, _globals._animationIndexes[0], 0); + + if (_vm->_gameConv->_restoreRunning == 1) { + _game._player._stepEnabled = false; + _vm->_gameConv->run(1); + _vm->_gameConv->exportValue(0); + _vm->_gameConv->exportValue(0); + _vm->_gameConv->exportValue(0); + if (_globals[kLlanieStatus] != 2) + _vm->_gameConv->exportValue(1); + else + _vm->_gameConv->exportValue(0); + } else { + _activateTimerFl = true; + _deathTimer = 0; + _clock = 0; + _game._player._stepEnabled = true; + } + } else { + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 12); + } + + sceneEntrySound(); +} + +void Scene104::step() { + if (_anim0ActvFl) + handleKingAnimation(); + + if (_anim1ActvFl) + handleMacAnimation1(); + + if (_anim2ActvFl) + handleQueenAnimation(); + + if (_anim3ActvFl) + handleTwinklesAnimation(); + + if (_anim4ActvFl) + handlePidAnimation(); + + if (_anim5ActvFl) + handleMacAnimation2(); + + if (_anim6ActvFl) + handleDeathAnimation(); + + if ((_animationRunning == 1) && _scene->_animation[_globals._animationIndexes[0]]) { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() != _tapestryFrame) { + _tapestryFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + + if (_tapestryFrame == 13) { + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); + } + } + } + + switch (_game._trigger) { + case 70: + _scene->deleteSequence(_globals._sequenceIndexes[6]); + _vm->_sound->command(25); + _globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 4); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 71); + break; + + case 71: { + int idx = _globals._sequenceIndexes[6]; + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[6], SYNC_SEQ, idx); + _game._player._stepEnabled = true; + } + break; + } + + if (_game._trigger == 77) + _kingStatus = 0; + + if (_game._trigger == 79) { + _scene->freeAnimation(_globals._animationIndexes[4]); + + _globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('p', 2), 0); + _anim4ActvFl = true; + _pidStatus = 0; + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[4], SYNC_CLOCK, 0); + + _scene->deleteSequence(_globals._sequenceIndexes[14]); + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('m', 1), 0); + _anim1ActvFl = true; + _macStatus = 0; + + _game._player._stepEnabled = false; + _vm->_gameConv->run(1); + _vm->_gameConv->exportValue(0); + _vm->_gameConv->exportValue(0); + _vm->_gameConv->exportValue(0); + + if (_globals[kLlanieStatus] != 2) + _vm->_gameConv->exportValue(1); + else + _vm->_gameConv->exportValue(0); + } + + if (_game._trigger == 85) { + _vm->_sound->command(100); + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1); + } + + if (_activateTimerFl) { + long clockDiff = _scene->_frameStartTime - _clock; + if ((clockDiff >= 0) && (clockDiff <= 4)) + _deathTimer += clockDiff; + else + _deathTimer += 1; + + _clock = _scene->_frameStartTime; + + if (_deathTimer >= 1300) { + _activateTimerFl = false; + if (_pidDrawnSword) { + _pidStatus = 6; + _vm->_gameConv->run(1); + _vm->_gameConv->exportValue(0); + _vm->_gameConv->exportValue(1); + _vm->_gameConv->exportValue(0); + if (_globals[kLlanieStatus] != 2) + _vm->_gameConv->exportValue(1); + else + _vm->_gameConv->exportValue(0); + _vm->_gameConv->hold(); + } else + _pidStatus = 8; + + _game._player._stepEnabled = false; + } + } + + + if ((_globals[kTapestryStatus] == 1 || _globals[kTapestryStatus] == 3) + && (_globals[kBooksStatus] == 2 || _globals[kBooksStatus] == 4)) + _globals[kCanViewCrownHole] = true; + + if (_game._trigger == 95) { + _vm->_gameConv->reset(1); + _vm->_dialogs->show(10466); + _globals[kNoLoadWalker] = false; + _scene->_nextSceneId = 119; + } +} + +void Scene104::actions() { + if (_vm->_gameConv->_running == 1) { + handleFinalConversation(); + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + if (_globals[kPlayerPersona] == 0) + _vm->_dialogs->show(10401); + else + _vm->_dialogs->show(10437); + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_THRONE_ROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_THRONE_ROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_THRONE_ROOM)) { + if (_globals[kPlayerPersona] == 0) + _scene->_nextSceneId = 106; + else + _vm->_dialogs->show(10434); + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_HALLWAY)) { + if (_globals[kPlayerPersona] == 0) { + switch (_game._trigger) { + case 0: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[7] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[7], false, 8, 2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[7], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_SPRITE, 2, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 3); + break; + + case 1: + _scene->deleteSequence(_globals._sequenceIndexes[6]); + _vm->_sound->command(24); + _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 2: { + int tmpIdx = _globals._sequenceIndexes[6]; + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[6], SYNC_SEQ, tmpIdx); + } + break; + + case 3: + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[7]); + _scene->_sequences.addTimer(1, 4); + break; + + case 4: + _game._player.walk(Common::Point(77, 93), FACING_NORTH); + _game._player.setWalkTrigger(5); + break; + + case 5: + _scene->deleteSequence(_globals._sequenceIndexes[6]); + _vm->_sound->command(25); + _globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], false, 7, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 6); + break; + + case 6: { + int tmpIdx = _globals._sequenceIndexes[6]; + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[6], SYNC_SEQ, tmpIdx); + _scene->_sequences.addTimer(6, 7); + } + break; + + case 7: + _scene->_nextSceneId = 103; + break; + + default: + break; + } + } else + _vm->_dialogs->show(10434); + + _action._inProgress = false; + return; + } + + if ((_action.isAction(VERB_PULL) || _action.isAction(VERB_TAKE) || _action.isAction(VERB_OPEN)) && _action.isObject(NOUN_BOOKS)) { + if ((_globals[kBooksStatus] == 1) || (_globals[kBooksStatus] == 3) || _game._trigger) { + switch (_game._trigger) { + case 0: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], false, 8, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -1, 3); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 3, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 3); + break; + + case 1: + _globals._sequenceIndexes[12] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[12], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 8); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 2: { + int tmpIdx = _globals._sequenceIndexes[12]; + _globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, -2); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[12], SYNC_SEQ, tmpIdx); + _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 8); + if ((_globals[kTapestryStatus] == 1) || (_globals[kTapestryStatus] == 3)) { + _scene->_hotspots.activate(NOUN_WALL_PANEL, false); + _scene->_hotspots.activate(NOUN_SECRET_DOOR, true); + } + } + break; + + case 3: + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]); + _scene->_sequences.addTimer(5, 4); + break; + + case 4: + if (_globals[kBooksStatus] == 1) { + _globals[kPlayerScore] += 2; + _globals[kBooksStatus] = 2; + if ((_globals[kTapestryStatus] == 1) || (_globals[kTapestryStatus] == 3)) + _vm->_dialogs->show(10428); + else { + _vm->_sound->command(94); + _vm->_sound->command(67); + _vm->_dialogs->show(10427); + } + } else { + _vm->_sound->command(94); + _vm->_sound->command(67); + _globals[kBooksStatus] = 4; + } + _game._player._stepEnabled = true; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_PUSH, NOUN_BOOKS)) { + if ((_globals[kBooksStatus] == 2) || (_globals[kBooksStatus] == 4)) { + switch (_game._trigger) { + case 0: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], false, 8, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -1, 3); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 3, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 3); + break; + + case 1: + _vm->_sound->command(94); + _vm->_sound->command(67); + _scene->deleteSequence(_globals._sequenceIndexes[12]); + _globals._sequenceIndexes[12] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[12], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 8); + _scene->_sequences.addTimer(6, 2); + break; + + case 2: + if ((_globals[kTapestryStatus] == 1) || (_globals[kTapestryStatus] == 3)) { + _scene->_hotspots.activate(NOUN_WALL_PANEL, true); + _scene->_hotspots.activate(NOUN_SECRET_DOOR, false); + } + break; + + case 3: + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]); + _scene->_sequences.addTimer(5, 4); + break; + + case 4: + if (_globals[kBooksStatus] == 2) + _vm->_dialogs->show(10429); + _globals[kBooksStatus] = 3; + _game._player._stepEnabled = true; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + } + + if ((_action.isAction(VERB_PULL) || _action.isAction(VERB_OPEN) || _action.isAction(VERB_PUSH)) && _action.isObject(NOUN_TAPESTRY)) { + if (_globals[kPlayerPersona] == 0) { + if (_scene->_customDest.x >= 279) { + if ((_globals[kTapestryStatus] == 0) || (_globals[kTapestryStatus] == 2)) { + switch (_game._trigger) { + case 0: + _scene->deleteSequence(_globals._sequenceIndexes[11]); + _game._player._stepEnabled = false; + _game._player._visible = false; + _animationRunning = 1; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('a', -1), 1); + break; + + case 1: + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); + _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6); + _scene->_hotspots.activateAtPos(NOUN_TAPESTRY, true, Common::Point(290, 20)); + _scene->_hotspots.activateAtPos(NOUN_TAPESTRY, false, Common::Point(310, 70)); + if ((_globals[kBooksStatus] == 2) || (_globals[kBooksStatus] == 4)) { + _scene->_hotspots.activate(NOUN_WALL_PANEL, false); + _scene->_hotspots.activate(NOUN_SECRET_DOOR, true); + } else { + _scene->_hotspots.activate(NOUN_WALL_PANEL, true); + _scene->_hotspots.activate(NOUN_SECRET_DOOR, false); + } + _scene->_sequences.addTimer(6, 2); + break; + + case 2: + if (_globals[kTapestryStatus] == 0) { + _globals[kTapestryStatus] = 1; + _globals[kPlayerScore] += 2; + if (_globals[kBooksStatus] == 0 || _globals[kBooksStatus] == 1 || _globals[kBooksStatus] == 3) + _vm->_dialogs->show(10424); + else if (_globals[kBooksStatus] == 2 || _globals[kBooksStatus] == 4) + _vm->_dialogs->show(10425); + } else + _globals[kTapestryStatus] = 3; + + _game._player._stepEnabled = true; + break; + + default: + break; + } + } + } else + _vm->_dialogs->show(10404); + } else + _vm->_dialogs->show(10445); + + _action._inProgress = false; + return; + } + + if ((_action.isAction(VERB_PULL) || _action.isAction(VERB_CLOSE) || _action.isAction(VERB_PUSH)) && _action.isObject(NOUN_TAPESTRY)) { + if (_globals[kPlayerPersona] == 0) { + if (_scene->_customDest.x >= 279) { + if (_globals[kTapestryStatus] == 1 || _globals[kTapestryStatus] == 3) { + switch (_game._trigger) { + case 0: + _game._player._stepEnabled = false; + _game._player._visible = false; + _scene->deleteSequence(_globals._sequenceIndexes[10]); + _animationRunning = 2; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', -1), 1); + break; + + case 1: + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); + _globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[11], 6); + _scene->_hotspots.activateAtPos(NOUN_TAPESTRY, false, Common::Point(290, 20)); + _scene->_hotspots.activateAtPos(NOUN_TAPESTRY, true, Common::Point(310, 70)); + _scene->_hotspots.activate(NOUN_SECRET_DOOR, false); + _scene->_hotspots.activate(NOUN_WALL_PANEL, false); + _scene->_sequences.addTimer(6, 2); + break; + + case 2: + _globals[kTapestryStatus] = 2; + _game._player._stepEnabled = true; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + } + } else { + _vm->_dialogs->show(10445); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_BOOKS) || _action.isObject(NOUN_BOOKSHELF)) { + if (_globals[kPlayerPersona] == 0) { + switch (_globals[kBooksStatus]) { + case 0: + _scene->_hotspots.activate(NOUN_BOOKS, true); + _globals[kBooksStatus] = 1; + _vm->_dialogs->show(10418); + _action._inProgress = false; + return; + + case 1: + _vm->_dialogs->show(10418); + _action._inProgress = false; + return; + + case 2: + case 4: + _vm->_dialogs->show(10419); + _action._inProgress = false; + return; + + case 3: + _vm->_dialogs->show(10420); + _action._inProgress = false; + return; + + default: + break; + } + } else { + _vm->_dialogs->show(10439); + _action._inProgress = false; + return; + } + } + + if (_action.isObject(NOUN_FIREPLACE)) { + if (_globals[kPlayerPersona] == 0) + _vm->_dialogs->show(10402); + else + _vm->_dialogs->show(10438); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TAPESTRY)) { + if (_globals[kPlayerPersona] == 0) { + if (_scene->_customDest.x >= 209 && _scene->_customDest.x <= 278) + _vm->_dialogs->show(10403); + else if (_scene->_customDest.x >= 107 && _scene->_customDest.x <= 190) + _vm->_dialogs->show(10422); + else if (_globals[kTapestryStatus] == 1 || _globals[kTapestryStatus] == 3) + _vm->_dialogs->show(10460); + else + _vm->_dialogs->show(10423); + } else + _vm->_dialogs->show(10439); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RUG)) { + if (_globals[kPlayerPersona] == 0) + _vm->_dialogs->show(10405); + else + _vm->_dialogs->show(10439); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FIREPLACE_SCREEN)) { + if (_globals[kPlayerPersona] == 0) + _vm->_dialogs->show(10407); + else + _vm->_dialogs->show(10439); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR_TO_THRONE_ROOM)) { + if (_globals[kPlayerPersona] == 0) + _vm->_dialogs->show(10409); + else + _vm->_dialogs->show(10434); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SCONCE)) { + if (_globals[kPlayerPersona] == 0) + _vm->_dialogs->show(10410); + else + _vm->_dialogs->show(10440); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WOOD_BASKET)) { + if (_globals[kPlayerPersona] == 0) + _vm->_dialogs->show(10411); + else + _vm->_dialogs->show(10439); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TROPHY)) { + if (_globals[kPlayerPersona] == 0) + _vm->_dialogs->show(10412); + else + _vm->_dialogs->show(10441); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_READING_BENCH)) { + if (_globals[kPlayerPersona] == 0) + _vm->_dialogs->show(10414); + else + _vm->_dialogs->show(10439); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LOVESEAT)) { + if (_globals[kPlayerPersona] == 0) + _vm->_dialogs->show(10416); + else + _vm->_dialogs->show(10439); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR_TO_HALLWAY)) { + if (_globals[kPlayerPersona] == 0) + _vm->_dialogs->show(10421); + else + _vm->_dialogs->show(10434); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SECRET_DOOR)) { + _vm->_dialogs->show(10430); + _action._inProgress = false; + return; + } + + if ((_action.isObject(NOUN_DOORWAY) || _action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY) || _action.isAction(VERB_OPEN, NOUN_DOORWAY)) && (_globals[kPlayerPersona] == 1)) { + _vm->_dialogs->show(10432); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK, NOUN_WALL_PANEL)) { + if ((_globals[kBooksStatus] == 0) || (_globals[kBooksStatus] == 1)) + _vm->_dialogs->show(10435); + else + _vm->_dialogs->show(10436); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_KING) && _globals[kPlayerPersona] == 1) { + _vm->_dialogs->show(10443); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MUSIC_BOX) && _globals[kNoLoadWalker]) { + _vm->_dialogs->showItem(OBJ_MAGIC_MUSIC_BOX, 843, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MACMORN) && (_globals[kPlayerPersona] == 1)) { + _vm->_dialogs->show(10444); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TABLE)) { + if (_globals[kPlayerPersona] == 1) + _vm->_dialogs->show(10455); + else if (_scene->_customDest.x < 174) + _vm->_dialogs->show(10451); + else + _vm->_dialogs->show(10448); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DECORATION)) { + if (_globals[kPlayerPersona] == 1) + _vm->_dialogs->show(10439); + else + _vm->_dialogs->show(10449); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SWORD)) { + if (_globals[kPlayerPersona] == 1) + _vm->_dialogs->show(10439); + else + _vm->_dialogs->show(10450); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FLOOR) && (_globals[kPlayerPersona] == 1)) { + _vm->_dialogs->show(10439); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL) && (_globals[kPlayerPersona] == 1)) { + _vm->_dialogs->show(10439); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CANDLESTICK)) { + if (_globals[kPlayerPersona] == 1) + _vm->_dialogs->show(10439); + else + _vm->_dialogs->show(10461); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_QUEEN_MOTHER)) { + _vm->_dialogs->show(10456); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MACMORN)) { + _vm->_dialogs->show(10444); + _action._inProgress = false; + return; + } + } + + if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_RUG)) { + if (_globals[kPlayerPersona] == 0) + _vm->_dialogs->show(10406); + else + _vm->_dialogs->show(10445); + + _action._inProgress = false; + return; + } + + if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_FIREPLACE_SCREEN)) { + if (_globals[kPlayerPersona] == 0) + _vm->_dialogs->show(10408); + else + _vm->_dialogs->show(10445); + + _action._inProgress = false; + return; + } + + if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_TROPHY)) { + if (_globals[kPlayerPersona] == 0) + _vm->_dialogs->show(10413); + else + _vm->_dialogs->show(10445); + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_OPEN, NOUN_READING_BENCH)) { + if (_globals[kPlayerPersona] == 0) + _vm->_dialogs->show(10415); + else + _vm->_dialogs->show(10445); + + _action._inProgress = false; + return; + } + + if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_LOVESEAT)) { + if (_globals[kPlayerPersona] == 0) + _vm->_dialogs->show(10417); + else + _vm->_dialogs->show(10445); + + _action._inProgress = false; + return; + } + + if ((_action.isAction(VERB_OPEN) || _action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && (_action.isObject(NOUN_SECRET_DOOR) || _action.isObject(NOUN_WALL_PANEL))) { + _vm->_dialogs->show(10431); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_INVOKE, NOUN_SIGNET_RING) && (_globals[kPlayerPersona] == 1)) { + _vm->_dialogs->show(10433); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_PUT, NOUN_TENTACLE_PARTS, NOUN_WALL_PANEL) && (_globals[kPlayerPersona] == 0)) { + _vm->_dialogs->show(10446); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_SHIFT_INTO_BEAR) && _anim0ActvFl) { + if (_wasBearFl) + _vm->_dialogs->show(10457); + else if (_amuletWorksFl) + _vm->_dialogs->show(10459); + else { + _wasBearFl = true; + _globals[kPlayerScore] += 2; + _vm->_gameConv->run(1); + _vm->_gameConv->exportValue(1); + _vm->_gameConv->exportValue(0); + _vm->_gameConv->exportValue(0); + if (_globals[kLlanieStatus] != 2) + _vm->_gameConv->exportValue(1); + else + _vm->_gameConv->exportValue(0); + } + _action._inProgress = false; + return; + } + + if ((_action.isAction(VERB_ATTACK, NOUN_SWORD, NOUN_MACMORN) || _action.isAction(VERB_CARVE_UP, NOUN_SWORD, NOUN_MACMORN) || _action.isAction(VERB_THRUST, NOUN_SWORD, NOUN_MACMORN) || _action.isAction(VERB_TAKE, NOUN_SWORD)) && _anim0ActvFl) { + _activateTimerFl = false; + _pidStatus = 6; + + if (!_amuletWorksFl) { + _globals[kPlayerScore] += 5; + _vm->_gameConv->run(1); + _vm->_gameConv->exportValue(0); + _vm->_gameConv->exportValue(1); + _vm->_gameConv->exportValue(0); + if (_globals[kLlanieStatus] != 2) + _vm->_gameConv->exportValue(1); + else + _vm->_gameConv->exportValue(0); + + _vm->_gameConv->hold(); + } else { + _macStatus = 6; + _game._player._stepEnabled = false; + } + _amuletWorksFl = true; + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_INVOKE, NOUN_AMULET) && _anim0ActvFl) { + if (_amuletWorksFl) { + _activateTimerFl = false; + _pidStatus = 5; + _globals[kPlayerScore] += 15; + _globals[kAmuletStatus] = 2; + _game._player._stepEnabled = false; + + _scene->freeAnimation(_globals._animationIndexes[1]); + + _globals._sequenceIndexes[14] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[14], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[14], 6); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[14], SYNC_CLOCK, 0); + + _globals._spriteIndexes[15] = _scene->_sprites.addSprites(formAnimName('e', 3), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('m', 2), 0); + _anim1ActvFl = false; + _anim5ActvFl = true; + } else + _vm->_dialogs->showItem(OBJ_AMULET, 945, 0); + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_ATTACK, NOUN_SWORD, NOUN_QUEEN_MOTHER) || _action.isAction(VERB_CARVE_UP, NOUN_SWORD, NOUN_QUEEN_MOTHER) || _action.isAction(VERB_THRUST, NOUN_SWORD, NOUN_QUEEN_MOTHER)) { + _vm->_dialogs->show(10458); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TALK_TO, NOUN_MACMORN)) { + _vm->_dialogs->show(10464); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TALK_TO, NOUN_QUEEN_MOTHER)) { + _vm->_dialogs->show(10463); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TALK_TO, NOUN_KING)) { + _vm->_dialogs->show(10465); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_POUR_CONTENTS_OF, NOUN_MACMORN)) { + _vm->_dialogs->show(10462); + _action._inProgress = false; + return; + } + + + if (_anim2ActvFl && (_action.isAction(VERB_WALK_ACROSS) || _action.isAction(VERB_WALK_TO))) { + _vm->_dialogs->show(10445); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_CANDLESTICK)) { + _vm->_dialogs->show(10468); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_OPEN, NOUN_MUSIC_BOX) && _globals[kNoLoadWalker]) { + _vm->_dialogs->show(10470); + _action._inProgress = false; + return; + } +} + +void Scene104::preActions() { + if ((_action.isAction(VERB_PULL) || _action.isAction(VERB_OPEN) || _action.isAction(VERB_CLOSE) || _action.isAction(VERB_PUSH)) + && _action.isObject(NOUN_TAPESTRY) && (_scene->_customDest.x > 280)) + _game._player.walk(Common::Point(295, 145), FACING_NORTHEAST); + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_THRONE_ROOM) + || _action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_HALLWAY) + || _action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY) + || ((_action.isAction(VERB_PULL) || _action.isAction(VERB_OPEN) || _action.isAction(VERB_PUSH)) && _action.isObject(NOUN_TAPESTRY)) + || ((_action.isAction(VERB_PULL) || _action.isAction(VERB_CLOSE) || _action.isAction(VERB_PUSH)) && _action.isObject(NOUN_TAPESTRY)) + || ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) + && (_action.isObject(NOUN_RUG) || _action.isObject(NOUN_FIREPLACE_SCREEN) || _action.isObject(NOUN_TROPHY) || _action.isObject(NOUN_LOVESEAT))) + || _action.isAction(VERB_OPEN, NOUN_READING_BENCH)) { + if (_globals[kPlayerPersona] == 1) + _game._player.cancelWalk(); + } + + if (_globals[kNoLoadWalker]) + _game._player._needToWalk = false; +} + +void Scene104::handleFinalConversation() { + bool interlocutorFl = false; + bool heroFl = false; + + switch (_action._activeAction._verbId) { + case 11: + _deathTimer = 0; + _clock = 0; + _activateTimerFl = true; + interlocutorFl = true; + heroFl = true; + break; + + case 14: + if (!_game._trigger) + _macStatus = 3; + + interlocutorFl = true; + heroFl = true; + break; + + case 17: + _pidStatus = 3; + _vm->_gameConv->hold(); + interlocutorFl = true; + heroFl = true; + break; + + case 20: + if (!_game._trigger) + _macStatus = 2; + interlocutorFl = true; + heroFl = true; + break; + + case 30: + *_vm->_gameConv->_nextStartNode = 31; + _vm->_gameConv->abortConv(); + + if (_globals[kLlanieStatus] == 2) { + _globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('l', 1), 0); + _anim3ActvFl = true; + _twinklesStatus = 1; + } + break; + + case 38: + _globals[kEndOfGame] = true; + _scene->_nextSceneId = 106; + break; + + default: + break; + } + + switch (_game._trigger) { + case 81: + switch (_action._activeAction._verbId) { + case 0: + case 2: + case 4: + case 5: + case 7: + case 8: + case 11: + case 17: + if (_macStatus == 0) + _macStatus = 1; + + _pidStatus = 0; + if (_queenStatus != 2) + _queenStatus = 0; + + _kingStatus = 0; + break; + + case 1: + case 3: + case 6: + case 20: + case 22: + case 24: + case 26: + case 28: + case 32: + case 34: + case 39: + case 41: + case 43: + _kingStatus = 1; + _pidStatus = 0; + if (_queenStatus != 2) + _queenStatus = 0; + + if (_macStatus == 1) + _macStatus = 0; + + break; + + case 21: + case 23: + case 25: + case 27: + case 35: + case 40: + case 42: + if (_queenStatus != 2) + _queenStatus = 1; + + _pidStatus = 0; + if (_macStatus == 1) + _macStatus = 0; + + _kingStatus = 0; + break; + + case 31: + case 33: + _twinklesStatus = 1; + _pidStatus = 0; + if (_queenStatus != 2) + _queenStatus = 0; + + if (_macStatus == 1) + _macStatus = 0; + + _kingStatus = 0; + break; + + default: + break; + } + break; + + case 83: + if ((_action._activeAction._verbId == 8) || (_action._activeAction._verbId == 11)) + _pidStatus = 2; + else + _pidStatus = 1; + + if (_macStatus == 1) + _macStatus = 0; + + if (_queenStatus != 2) + _queenStatus = 0; + + _kingStatus = 0; + break; + + default: + break; + } + + if (!heroFl) + _vm->_gameConv->setHeroTrigger(83); + + if (!interlocutorFl) + _vm->_gameConv->setInterlocutorTrigger(81); + + _kingCount = 0; + _queenCount = 0; + _macCount = 0; + _twinklesCount = 0; + _pidCount = 0; +} + +void Scene104::handleKingAnimation() { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _kingFrame) + return; + + _kingFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + int resetFrame = -1; + + switch (_kingFrame) { + case 14: + case 21: + switch (_kingStatus) { + case 0: + if (_kingCount > _vm->getRandomNumber(40, 50)) { + _kingCount = 0; + if (_vm->getRandomNumber(1,2) == 1) + resetFrame = 13; + else + resetFrame = 14; + } else { + ++_kingCount; + resetFrame = 13; + } + break; + + case 1: + resetFrame = 14; + break; + + default: + break; + } + break; + + case 16: + case 17: + case 18: + case 19: + switch (_kingStatus) { + case 0: + if (_kingCount > _vm->getRandomNumber(40, 50)) { + _kingCount = 0; + if (_vm->getRandomNumber(1,2) == 1) + resetFrame = 15; + else + resetFrame = 19; + } else { + ++_kingCount; + resetFrame = 15; + } + break; + + case 1: + resetFrame = _vm->getRandomNumber(16, 18); + ++_kingCount; + if (_kingCount > 15) { + _kingStatus = 0; + _kingCount = 0; + resetFrame = 15; + } + break; + + default: + break; + } + break; + + case 22: + if (_kingStatus == 2) + resetFrame = 21; + else + resetFrame = 0; + + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame); + _kingFrame = resetFrame; + } +} + + +void Scene104::handleMacAnimation1() { + if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _macFrame) + return; + + _macFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame(); + int resetFrame = -1; + + switch (_macFrame) { + case 1: + case 2: + case 7: + switch (_macStatus) { + case 0: + resetFrame = 0; + break; + + case 1: + if (_macCount == 0) { + if (_vm->getRandomNumber(1,2) == 1) + resetFrame = 2; + else + resetFrame = 1; + + ++_macCount; + } else { + resetFrame = _vm->getRandomNumber(0, 1); + ++_macCount; + if (_macCount > 15) { + _macStatus = 0; + _macCount = 0; + resetFrame = 0; + } + } + break; + + case 2: + resetFrame = 90; + break; + + default: + break; + } + break; + + case 3: + case 4: + case 5: + switch (_macStatus) { + case 0: + case 2: + case 3: + case 4: + resetFrame = 5; + break; + + case 1: + if (_macCount == 0) { + if (_vm->getRandomNumber(1,2) == 1) + resetFrame = 5; + else + resetFrame = 3; + + ++_macCount; + + } else { + resetFrame = _vm->getRandomNumber(3, 4); + ++_macCount; + if (_macCount > 15) { + _macStatus = 0; + _macCount = 0; + resetFrame = 5; + } + } + break; + + default: + break; + } + break; + + case 25: + _game._player._stepEnabled = true; + break; + + case 26: + case 90: + case 174: + switch (_macStatus) { + case 3: + resetFrame = 76; + _macStatus = 0; + _game._player._stepEnabled = false; + break; + + case 4: + break; + + case 5: + resetFrame = 147; + _macStatus = 0; + break; + + case 6: + _pidFrame = 105; + resetFrame = 26; + _scene->setAnimFrame(_globals._animationIndexes[4], 105); + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[4], SYNC_ANIM, _globals._animationIndexes[1]); + break; + + default: + resetFrame = 25; + break; + } + break; + + case 36: + _globals._sequenceIndexes[13] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[13], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 13); + break; + + case 37: + _scene->setAnimFrame(_globals._animationIndexes[4], 89); + _pidFrame = 89; + _pidStatus = 7; + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[4], SYNC_ANIM, _globals._animationIndexes[1]); + break; + + case 76: + _vm->_gameConv->reset(1); + _vm->_dialogs->show(10467); + _globals[kNoLoadWalker] = false; + _scene->_nextSceneId = 119; + break; + + case 82: + _pidStatus = 4; + break; + + case 97: + _activateTimerFl = true; + _scene->deleteSequence(_globals._sequenceIndexes[5]); + _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 10, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 85); + break; + + case 112: + resetFrame = 8; + _macStatus = 0; + break; + + case 162: + _vm->_gameConv->release(); + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[1], resetFrame); + _macFrame = resetFrame; + } +} + + +void Scene104::handleMacAnimation2() { + + if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _macFrame) + return; + + _macFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame(); + int resetFrame = -1; + + switch (_macFrame) { + case 1: + if (_macStatus != 4) + resetFrame = 0; + break; + + case 2: + _scene->deleteSequence(_globals._sequenceIndexes[14]); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[14], SYNC_ANIM, _globals._animationIndexes[1]); + break; + + case 37: + _scene->freeAnimation(_globals._animationIndexes[1]); + _scene->_sprites.remove(_globals._spriteIndexes[15]); + _anim5ActvFl = false; + resetFrame = -1; + + _vm->_dialogs->show(10426); + _vm->_sound->command(45); + _vm->_gameConv->run(1); + _vm->_gameConv->exportValue(0); + _vm->_gameConv->exportValue(0); + _vm->_gameConv->exportValue(1); + if (_globals[kLlanieStatus] != 2) + _vm->_gameConv->exportValue(1); + else + _vm->_gameConv->exportValue(0); + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[1], resetFrame); + _macFrame = resetFrame; + } +} + +void Scene104::handleQueenAnimation() { + if (_scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame() == _queenFrame) + return; + + _queenFrame = _scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame(); + int resetFrame = -1; + + switch (_queenFrame) { + case 1: + case 8: + case 15: + case 24: + switch (_queenStatus) { + case 0: + if (_queenCount > _vm->getRandomNumber(40, 50)) { + _queenCount = 0; + if (_vm->getRandomNumber(1,2) == 1) + resetFrame = 0; + else + resetFrame = 8; + } else { + ++_queenCount; + resetFrame = 0; + } + break; + + case 1: + if (_vm->getRandomNumber(1,2) == 1) + resetFrame = 1; + else + resetFrame = 15; + + _queenStatus = 0; + break; + + case 2: + resetFrame = 8; + break; + + default: + break; + } + break; + + case 12: + case 29: + switch (_queenStatus) { + case 0: + if (_queenCount > _vm->getRandomNumber(40, 50)) { + _queenCount = 0; + if (_vm->getRandomNumber(1,2) == 1) + resetFrame = 11; + else + resetFrame = 12; + } else { + ++_queenCount; + resetFrame = 11; + } + break; + + case 1: + resetFrame = 12; + break; + + case 2: + resetFrame = 24; + break; + + default: + break; + } + break; + + case 27: + switch (_queenStatus) { + case 0: + case 1: + resetFrame = 27; + break; + + case 2: + resetFrame = 26; + break; + + case 3: + resetFrame = 27; + _queenStatus = 0; + break; + + default: + break; + } + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[2], resetFrame); + _queenFrame = resetFrame; + } +} + +void Scene104::handleTwinklesAnimation() { + if (_scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame() == _twinklesFrame) + return; + + _twinklesFrame = _scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame(); + int resetFrame = -1; + + switch (_twinklesFrame) { + case 1: + if (_twinklesStatus == 2) + resetFrame = 0; + break; + + case 10: + _queenStatus = 2; + break; + + case 28: + _vm->_gameConv->run(1); + _vm->_gameConv->exportValue(0); + _vm->_gameConv->exportValue(0); + _vm->_gameConv->exportValue(1); + if (_globals[kLlanieStatus] != 2) + _vm->_gameConv->exportValue(1); + else + _vm->_gameConv->exportValue(0); + break; + + case 36: + _queenStatus = 3; + break; + + case 37: + case 38: + case 47: + switch (_twinklesStatus) { + case 0: + if (_twinklesFrame != 37 && _twinklesFrame != 38) + _twinklesFrame = 38; + + if (_twinklesCount > _vm->getRandomNumber(40, 50)) { + _twinklesCount = 0; + if (_vm->getRandomNumber(1, 2) == 1) + resetFrame = 36; + else + resetFrame = 37; + } else { + ++_twinklesCount; + resetFrame = _twinklesFrame - 1; + } + break; + + case 1: + resetFrame = 38; + _twinklesStatus = 0; + break; + + default: + break; + } + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[3], resetFrame); + _twinklesFrame = resetFrame; + } +} + +void Scene104::handleDeathAnimation() { + if (_scene->_animation[_globals._animationIndexes[4]]->getCurrentFrame() == _deathFrame) + return; + + _deathFrame = _scene->_animation[_globals._animationIndexes[4]]->getCurrentFrame(); + + if (_deathFrame == 11) + _scene->playSpeech(7); + else if (_deathFrame == 17) + _scene->playSpeech(6); +} + +void Scene104::handlePidAnimation() { + if (_scene->_animation[_globals._animationIndexes[4]]->getCurrentFrame() == _pidFrame) + return; + + _pidFrame = _scene->_animation[_globals._animationIndexes[4]]->getCurrentFrame(); + int resetFrame = -1; + + switch (_pidFrame) { + case 1: + case 2: + case 3: + case 9: + case 47: + case 81: + switch (_pidStatus) { + case 0: + resetFrame = 0; + break; + + case 1: + resetFrame = _vm->getRandomNumber(0, 2); + ++_pidCount; + if (_pidCount > 20) { + _pidStatus = 0; + _pidCount = 0; + resetFrame = 0; + } + break; + + case 2: + resetFrame = 3; + break; + + case 3: + _activateTimerFl = false; + resetFrame = 10; + break; + + case 5: + _game._player._stepEnabled = false; + _activateTimerFl = false; + resetFrame = 47; + _pidStatus = 0; + break; + + case 6: + resetFrame = 81; + break; + + case 8: + _scene->freeAnimation(_globals._animationIndexes[1]); + _scene->freeAnimation(_globals._animationIndexes[4]); + _anim1ActvFl = false; + _anim4ActvFl = false; + _globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('d', 2), 95); + _anim6ActvFl = true; + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[4], SYNC_CLOCK, 0); + break; + + default: + break; + } + break; + + case 4: + case 5: + case 6: + case 7: + if (_pidStatus == 2) { + resetFrame = _vm->getRandomNumber(4, 6); + ++_pidCount; + if (_pidCount > 20) { + _pidStatus = 0; + _pidCount = 0; + resetFrame = 7; + } + } else + resetFrame = 7; + break; + + case 24: + _vm->_gameConv->release(); + break; + + case 25: + if (_pidStatus == 4) { + resetFrame = 25; + _pidStatus = 0; + } else + resetFrame = 24; + break; + + case 46: + _activateTimerFl = true; + _clock = 0; + _deathTimer = 0; + _game._player._stepEnabled = true; + break; + + case 60: + resetFrame = 107; + break; + + case 62: + _macStatus = 4; + break; + + case 88: + if (_deathTimer < 1300) + _macStatus = 5; + break; + + case 89: + if (_pidStatus == 5) { + resetFrame = 55; + _pidStatus = 0; + } else if (_deathTimer >= 1300) + _macStatus = 6; + else { + _pidDrawnSword = true; + resetFrame = 88; + } + break; + + case 91: + _scene->playSpeech(7); + break; + + case 95: + _scene->playSpeech(6); + break; + + case 105: + resetFrame = 104; + break; + + case 106: + if (_pidStatus == 7) + resetFrame = 89; + else + resetFrame = 105; + break; + + case 111: + resetFrame = 60; + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[4], resetFrame); + _pidFrame = resetFrame; + } +} +/*------------------------------------------------------------------------*/ + +Scene105::Scene105(MADSEngine *vm) : Scene1xx(vm) { + _maidTalkingFl = false; + _sitUpFl = false; + _goodNumberFl = false; + + _maidFrame = -1; + _newStatus = -1; + _previousStatus = -1; + _maidHotspotId1 = -1; + _maidHotspotId2 = -1; + _bucketHotspotId = -1; + _boneHotspotId = -1; + _gobletHotspotId = -1; +} + +void Scene105::synchronize(Common::Serializer &s) { + Scene1xx::synchronize(s); + + s.syncAsByte(_maidTalkingFl); + s.syncAsByte(_sitUpFl); + s.syncAsByte(_goodNumberFl); + + s.syncAsSint16LE(_maidFrame); + s.syncAsSint16LE(_newStatus); + s.syncAsSint16LE(_previousStatus); + s.syncAsSint16LE(_maidHotspotId1); + s.syncAsSint16LE(_maidHotspotId2); + s.syncAsSint16LE(_bucketHotspotId); + s.syncAsSint16LE(_boneHotspotId); + s.syncAsSint16LE(_gobletHotspotId); +} + +void Scene105::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + _scene->addActiveVocab(NOUN_SCULLERY_MAID); + _scene->addActiveVocab(NOUN_BUCKET); + _scene->addActiveVocab(VERB_WALK_TO); + _scene->addActiveVocab(NOUN_BONE); + _scene->addActiveVocab(NOUN_GOBLET); +} + +void Scene105::enter() { + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1)); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 2)); + _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*KGRD_8"); + + _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 7, 0); + _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 0, 3); + + _maidHotspotId1 = _scene->_dynamicHotspots.add(NOUN_SCULLERY_MAID, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(189, 123, 189 + 25, 123 + 11)); + _scene->_dynamicHotspots.setPosition(_maidHotspotId1, Common::Point(174, 151), FACING_NORTHEAST); + _scene->_dynamicHotspots[_maidHotspotId1]._articleNumber = PREP_ON; + + _maidHotspotId2 = _scene->_dynamicHotspots.add(NOUN_SCULLERY_MAID, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(189, 134, 189 + 38, 134 + 9)); + _scene->_dynamicHotspots.setPosition(_maidHotspotId2, Common::Point(174, 151), FACING_NORTHEAST); + _scene->_dynamicHotspots[_maidHotspotId2]._articleNumber = PREP_ON; + + _bucketHotspotId = _scene->_dynamicHotspots.add(NOUN_BUCKET, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(176, 137, 176 + 10, 137 + 8)); + _scene->_dynamicHotspots.setPosition(_bucketHotspotId, Common::Point(174, 151), FACING_NORTHEAST); + + if (_game._objects.isInRoom(OBJ_GOBLET)) { + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('p', 1)); + _globals._spriteIndexes[8] = _scene->_sprites.addSprites("*KGRM_6"); + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -1); + _gobletHotspotId = _scene->_dynamicHotspots.add(NOUN_GOBLET, VERB_WALK_TO, SYNTAX_SINGULAR, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0)); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 6); + _scene->_dynamicHotspots.setPosition(_gobletHotspotId, Common::Point(63, 142), FACING_WEST); + } + + if (_game._objects.isInRoom(OBJ_BONE)) { + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('p', 0)); + _globals._spriteIndexes[7] = _scene->_sprites.addSprites("*KGRL_6"); + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1); + _boneHotspotId = _scene->_dynamicHotspots.add(NOUN_BONE, VERB_WALK_TO, SYNTAX_SINGULAR, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0)); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 6); + _scene->_dynamicHotspots.setPosition(_boneHotspotId, Common::Point(255, 145), FACING_EAST); + } + + _vm->_gameConv->get(2); + _newStatus = 1; + _previousStatus = 0; + _maidTalkingFl = false; + _sitUpFl = false; + _goodNumberFl = false; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('A',-1), 1); + + + if (_scene->_priorSceneId == 106) { + _game._player._playerPos = Common::Point(104, 152); + _game._player._facing = FACING_NORTHEAST; + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 12); + } else if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 6); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 12); + _game._player.firstWalk(Common::Point(120, 96), FACING_SOUTH, Common::Point(117, 108), FACING_SOUTH, false); + _game._player.setWalkTrigger(70); + } else { + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 15); + } + + sceneEntrySound(); +} + +void Scene105::step() { + if (_scene->_animation[_globals._animationIndexes[0]]) { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() != _maidFrame) { + _maidFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + int resetFrame = -1; + + if (_sitUpFl && !_maidTalkingFl) { + _previousStatus = _newStatus; + _newStatus = 4; + } + + if (_maidTalkingFl) { + _previousStatus = _newStatus; + _newStatus = 5; + } + + switch (_maidFrame) { + case 16: + if (_newStatus == 1) { + _goodNumberFl = false; + while (!_goodNumberFl) + setRandomStatus(); + } + + if (_newStatus == 1) + resetFrame = 1; + else if ((_newStatus == 3 && !_sitUpFl) || _newStatus == 4) + resetFrame = 53; + else if ((_newStatus == 3) && (_sitUpFl)) + resetFrame = 24; + break; + + case 24: + if (_newStatus == 2) { + _goodNumberFl = false; + while (!_goodNumberFl) + setRandomStatus(); + } + + if ((_newStatus == 3) || (_newStatus == 5)) + resetFrame = 53; + else if (_newStatus == 1) + resetFrame = 56; + else if (_newStatus == 4) + resetFrame = 53; + + break; + + case 32: + if (_newStatus == 3) { + _goodNumberFl = false; + while (!_goodNumberFl) + setRandomStatus(); + } + + if ((_newStatus == 1) || (_newStatus == 2)) + resetFrame = 57; + else if (_newStatus == 4) + resetFrame = 55; + break; + + case 53: + _maidTalkingFl = false; + _goodNumberFl = false; + while (!_goodNumberFl) + setRandomStatus(); + + if (_newStatus == 1) + resetFrame = 60; + else if (_newStatus == 2) + resetFrame = 57; + else if (_newStatus == 3) + resetFrame = 63; + else if (_newStatus == 4) + resetFrame = 55; + break; + + case 56: + if (_newStatus == 4) { + _goodNumberFl = false; + while (!_goodNumberFl) + setRandomWipebrow(); + } + + if (_newStatus == 4) + resetFrame = 55; + else if (_newStatus == 5) + resetFrame = 32; + else if (_newStatus == 3) + resetFrame = 24; + break; + + case 57: + if (_newStatus == 1) + resetFrame = 1; + break; + + case 60: + if (_newStatus == 1) + resetFrame = 1; + else if (_newStatus == 2) + resetFrame = 16; + break; + + case 63: + if (_newStatus == 1) + resetFrame = 1; + break; + + case 64: + resetFrame = 24; + break; + + default: + break; + } + + if ((resetFrame >= 0) && (resetFrame != _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame())) { + _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame); + _maidFrame = resetFrame; + } + } + } + + if (_game._trigger >= 70) { + switch (_game._trigger) { + case 70: + _scene->deleteSequence(_globals._sequenceIndexes[3]); + _vm->_sound->command(25); + _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 12); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 5); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 71); + break; + + case 71: { + int seqIdx = _globals._sequenceIndexes[3]; + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 15); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_SEQ, seqIdx); + _game._player._stepEnabled = true; + } + break; + + default: + break; + } + } +} + +void Scene105::actions() { + if (_action._lookFlag) { + _vm->_dialogs->show(10501); + _action._inProgress = false; + return; + } + + if (_vm->_gameConv->_running == 2) { + handleConversation(); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_HALLWAY)) { + switch (_game._trigger) { + case 0: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 8, 2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[4],true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 2, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 3); + break; + + case 1: + _scene->deleteSequence(_globals._sequenceIndexes[3]); + _vm->_sound->command(24); + _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 12); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 2: { + int seqIdx = _globals._sequenceIndexes[3]; + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 12); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_SEQ, seqIdx); + } + break; + + case 3: + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[4]); + _scene->_sequences.addTimer(1,4); + break; + + case 4: + _game._player.walk(Common::Point(120, 96), FACING_NORTH); + _game._player.setWalkTrigger(5); + break; + + case 5: + _scene->deleteSequence(_globals._sequenceIndexes[3]); + _vm->_sound->command(25); + _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 7, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 6); + break; + + case 6: { + int seqIdx = _globals._sequenceIndexes[3]; + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 1); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_SEQ, seqIdx); + _scene->_sequences.addTimer(6, 7); + } + break; + + case 7: + _scene->_nextSceneId = 103; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_THRONE_ROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_THRONE_ROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_THRONE_ROOM)) { + _scene->_nextSceneId = 106; + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TALK_TO, NOUN_SCULLERY_MAID)) { + _vm->_gameConv->run(2); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_GOBLET)) { + if (_game._trigger || !_game._objects.isInInventory(OBJ_GOBLET)) { + switch (_game._trigger) { + case 0: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 6, 2); + _scene->_sequences.setAnimRange (_globals._sequenceIndexes[8], 1, 7); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 7, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + _scene->deleteSequence (_globals._sequenceIndexes[5]); + _scene->_dynamicHotspots.remove(_gobletHotspotId); + _vm->_sound->command(26); + _game._objects.addToInventory(OBJ_GOBLET); + _vm->_dialogs->showItem(OBJ_GOBLET, 10519, 0); + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]); + _globals[kPlayerScore] += 1; + _game._player._visible = true; + _game._player._stepEnabled = true; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE, NOUN_BONE) && _action._mainObjectSource == CAT_HOTSPOT) { + if (_game._trigger || !_game._objects.isInInventory(OBJ_BONE)) { + switch (_game._trigger) { + case 0: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[7] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[7], false, 6, 2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[7], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_SPRITE, 6, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + _scene->deleteSequence (_globals._sequenceIndexes[6]); + _vm->_sound->command(26); + _scene->_dynamicHotspots.remove(_boneHotspotId); + _game._objects.addToInventory(OBJ_BONE); + _vm->_dialogs->showItem(OBJ_BONE, 10520, 0); + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[7]); + if (!(_globals[kPlayerScoreFlags] & 2048)) { + _globals[kPlayerScoreFlags] |= 2048; + _globals[kPlayerScore] += 1; + } + _game._player._visible = true; + _game._player._stepEnabled = true; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE, NOUN_BONE) && _game._objects.isInInventory(OBJ_BONE) && (_action._mainObjectSource == CAT_HOTSPOT)) { + _vm->_dialogs->show(40112); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(10502); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BRAZIER)) { + _vm->_dialogs->show(10503); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DINING_TABLE)) { + if (_scene->_customDest.x <= 98) { + if (_game._objects[OBJ_GOBLET]._roomNumber == _scene->_currentSceneId) + _vm->_dialogs->show(10505); + else + _vm->_dialogs->show(10522); + } else + _vm->_dialogs->show(10504); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CHAIR)) { + _vm->_dialogs->show(10507); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WINDOW)) { + _vm->_dialogs->show(10508); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TAPESTRY)) { + _vm->_dialogs->show(10509); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR_TO_THRONE_ROOM)) { + _vm->_dialogs->show(10511); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(10512); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR_TO_HALLWAY)) { + _vm->_dialogs->show(10513); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DIVIDING_WALL)) { + _vm->_dialogs->show(10514); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CEILING)) { + _vm->_dialogs->show(10515); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SCULLERY_MAID)) { + _vm->_dialogs->show(10516); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GOBLET) && _game._objects.isInRoom(OBJ_GOBLET)) { + _vm->_dialogs->show(10517); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BONE) && _game._objects.isInRoom(OBJ_BONE)) { + _vm->_dialogs->show(10518); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SCONCE)) { + _vm->_dialogs->show(10524); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BUCKET)) { + _vm->_dialogs->show(10521); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE, NOUN_SCULLERY_MAID)) { + _vm->_dialogs->show(30); + _action._inProgress = false; + return; + } + + if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_DINING_TABLE)) { + _vm->_dialogs->show(10506); + _action._inProgress = false; + return; + } + + if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_TAPESTRY)) { + _vm->_dialogs->show(10510); + _action._inProgress = false; + return; + } +} + +void Scene105::preActions() { + if (_action.isAction(VERB_TALK_TO, NOUN_SCULLERY_MAID)) + _sitUpFl = true; +} + +void Scene105::setRandomStatus() { + _previousStatus = _newStatus; + int rndVal = _vm->getRandomNumber(1, 30); + if (rndVal < 20) { + _newStatus = 1; + _goodNumberFl = true; + } else if ((rndVal > 19) && (rndVal < 27) && (_previousStatus != 2)) { + _newStatus = 2; + _goodNumberFl = true; + } else if (_previousStatus != 3) { + _newStatus = 3; + _goodNumberFl = true; + } +} + +void Scene105::setRandomWipebrow() { + _previousStatus = _newStatus; + + if (_vm->getRandomNumber(1, 100) < 100) { + _newStatus = 4; + _goodNumberFl = true; + } else if (_previousStatus != 3) { + _newStatus = 3; + _goodNumberFl = true; + } +} + +void Scene105::handleConversation() { + if ((_action._activeAction._verbId == 0) && !_sitUpFl) + _sitUpFl = true; + + if ((_action._activeAction._verbId == 1) || (_action._activeAction._verbId == 2)) { + switch (_game._trigger) { + case 0: + _vm->_gameConv->setInterlocutorTrigger(1); + break; + + case 1: + _maidTalkingFl = true; + _sitUpFl = false; + _vm->_gameConv->setHeroTrigger(2); + break; + + case 2: + _maidTalkingFl = false; + break; + + default: + break; + } + } +} + +/*------------------------------------------------------------------------*/ + +} // End of namespace Dragonsphere +} // End of namespace MADS diff --git a/engines/mads/dragonsphere/dragonsphere_scenes1.h b/engines/mads/dragonsphere/dragonsphere_scenes1.h new file mode 100644 index 0000000000..fe51ed4135 --- /dev/null +++ b/engines/mads/dragonsphere/dragonsphere_scenes1.h @@ -0,0 +1,188 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef MADS_DRAGON_SCENES1_H +#define MADS_DRAGON_SCENES1_H + +#include "common/scummsys.h" +#include "common/serializer.h" +#include "mads/game.h" +#include "mads/scene.h" +#include "mads/dragonsphere/dragonsphere_scenes.h" + +namespace MADS { + +namespace Dragonsphere { + +class Scene1xx : public DragonsphereScene { +protected: + /** + * Plays an appropriate sound when entering a scene + */ + void sceneEntrySound(); + + /** + *Sets the AA file to use for the scene + */ + void setAAName(); + + /** + * Updates the prefix used for getting player sprites for the scene + */ + void setPlayerSpritesPrefix(); +public: + Scene1xx(MADSEngine *vm) : DragonsphereScene(vm) {} +}; + +class Scene101 : public Scene1xx { +public: + Scene101(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene102 : public Scene1xx { +private: + int _diaryHotspotIdx1; + int _diaryHotspotIdx2; + int _diaryFrame; + int _animRunning; + +public: + Scene102(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene103 : public Scene1xx { +public: + Scene103(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene104 : public Scene1xx { +private: + bool _anim0ActvFl; + bool _anim1ActvFl; + bool _anim2ActvFl; + bool _anim3ActvFl; + bool _anim4ActvFl; + bool _anim5ActvFl; + bool _anim6ActvFl; + bool _activateTimerFl; + bool _wasBearFl; + bool _amuletWorksFl; + bool _pidDrawnSword; + int _animationRunning; + int _deathTimer; + int _deathFrame; + int _doorwayHotspotId; + + int _kingStatus; + int _kingFrame; + int _kingCount; + int _queenStatus; + int _queenFrame; + int _queenCount; + int _pidStatus; + int _pidFrame; + int _pidCount; + int _macStatus; + int _macFrame; + int _macCount; + int _twinklesStatus; + int _twinklesFrame; + int _twinklesCount; + int _tapestryFrame; + + int32 _clock; + + void handleFinalConversation(); + void handleKingAnimation(); + void handleMacAnimation1(); + void handleMacAnimation2(); + void handleQueenAnimation(); + void handleTwinklesAnimation(); + void handleDeathAnimation(); + void handlePidAnimation(); + +public: + Scene104(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene105 : public Scene1xx { +private: + bool _maidTalkingFl; + bool _sitUpFl; + bool _goodNumberFl; + + int _maidFrame; + int _maidHotspotId1; + int _maidHotspotId2; + int _newStatus; + int _previousStatus; + int _bucketHotspotId; + int _boneHotspotId; + int _gobletHotspotId; + + void setRandomStatus(); + void setRandomWipebrow(); + void handleConversation(); + +public: + Scene105(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +} // End of namespace Dragonsphere +} // End of namespace MADS + +#endif /* MADS_DRAGON_SCENES1_H */ diff --git a/engines/mads/dragonsphere/game_dragonsphere.cpp b/engines/mads/dragonsphere/game_dragonsphere.cpp index b07eab9daa..f528056a54 100644 --- a/engines/mads/dragonsphere/game_dragonsphere.cpp +++ b/engines/mads/dragonsphere/game_dragonsphere.cpp @@ -28,7 +28,7 @@ #include "mads/msurface.h" #include "mads/dragonsphere/game_dragonsphere.h" //#include "mads/nebular/dialogs_nebular.h" -//#include "mads/nebular/globals_nebular.h" +#include "mads/dragonsphere/globals_dragonsphere.h" #include "mads/dragonsphere/dragonsphere_scenes.h" namespace MADS { diff --git a/engines/mads/dragonsphere/game_dragonsphere.h b/engines/mads/dragonsphere/game_dragonsphere.h index b57f8833c6..b9eb86af64 100644 --- a/engines/mads/dragonsphere/game_dragonsphere.h +++ b/engines/mads/dragonsphere/game_dragonsphere.h @@ -26,7 +26,7 @@ #include "common/scummsys.h" #include "mads/game.h" #include "mads/globals.h" -//#include "mads/nebular/globals_nebular.h" +#include "mads/dragonsphere/globals_dragonsphere.h" namespace MADS { @@ -80,7 +80,7 @@ enum InventoryObject { OBJ_DIAMOND_DUST = 40, OBJ_RUBY_RING = 41, OBJ_GOLD_NUGGET = 42, - OBJ_MUSIC_BOX = 43, + OBJ_MAGIC_MUSIC_BOX = 43, OBJ_EMERALD = 44, OBJ_PARCHMENT = 45, OBJ_GAME = 46, @@ -88,15 +88,6 @@ enum InventoryObject { OBJ_NEW_BUNDLE = 48 }; -// HACK: A stub for now, remove from here once it's implemented properly -class DragonsphereGlobals : public Globals { -public: - DragonsphereGlobals() { - resize(210); // Rex has 210 globals - } - virtual ~DragonsphereGlobals() {} -}; - class GameDragonsphere : public Game { friend class Game; protected: diff --git a/engines/mads/dragonsphere/globals_dragonsphere.cpp b/engines/mads/dragonsphere/globals_dragonsphere.cpp new file mode 100644 index 0000000000..fa05ed97c2 --- /dev/null +++ b/engines/mads/dragonsphere/globals_dragonsphere.cpp @@ -0,0 +1,51 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/scummsys.h" +#include "common/config-manager.h" +#include "mads/dragonsphere/globals_dragonsphere.h" + +namespace MADS { + +namespace Dragonsphere { + +DragonsphereGlobals::DragonsphereGlobals() + : Globals() { + // Initialize lists + resize(140); + _spriteIndexes.resize(30); + _sequenceIndexes.resize(30); + _animationIndexes.resize(30); +} + +void DragonsphereGlobals::synchronize(Common::Serializer &s) { + Globals::synchronize(s); + + _spriteIndexes.synchronize(s); + _sequenceIndexes.synchronize(s); + _animationIndexes.synchronize(s); +} + + +} // End of namespace Dragonsphere + +} // End of namespace MADS diff --git a/engines/mads/dragonsphere/globals_dragonsphere.h b/engines/mads/dragonsphere/globals_dragonsphere.h new file mode 100644 index 0000000000..cc0e42eb43 --- /dev/null +++ b/engines/mads/dragonsphere/globals_dragonsphere.h @@ -0,0 +1,184 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef MADS_GLOBALS_DRAGONSPHERE_H +#define MADS_GLOBALS_DRAGONSPHERE_H + +#include "common/scummsys.h" +#include "common/array.h" +#include "mads/game.h" +#include "mads/resources.h" + +namespace MADS { + +namespace Dragonsphere { + +enum GlobalId { + // Global variables + + kWalkerTiming = 0, + kWalkerTiming2 = 1, + kPlayerPersona = 10, + kPlayerScore = 11, + kDragonHighScene = 12, + kDragonMyScene = 13, + kNoLoadWalker = 14, + kPlayerScoreFlags = 15, + kSorcerorDefeated = 16, + kPreRoom = 17, + kPerformDisplacements = 18, + + kKingStatus = 20, + kWardStatus = 21, + kTalkedToSoptus = 22, + kTalkedToShifter = 23, + kAmuletStatus = 24, + kBooksStatus = 25, + kTapestryStatus = 26, + kTalkedToMerchant = 27, + kCanViewCrownHole = 28, + kTalkedToStatus = 29, + + kGuardPidStatus = 30, + kCrawledOutOfBed101 = 31, + kStatueIsOnStairway114 = 32, + kDogIsAsleep = 33, + kCrystalBallDead = 34, + kThrewBone = 35, + kWoodenDoorOpen = 36, + kKingIsInStairwell = 37, + kLlanieStatus = 38, + kNoTalkToGuard = 39, + + kObjectGiven201 = 40, + kKingGotStabbed = 41, + kGivenObjectBefore = 42, + kGuardsAreAsleep = 43, + kDomeUp = 44, + kTalkedToWise = 45, + kDollGiven = 46, + kResetConv = 47, + kTalkedToGreta = 48, + kSlimeHealed = 49, + + kDanceMusicOn = 50, + kPlayerIsSeal = 51, + kVinesHavePlayer = 52, + kEndOfGame = 53, + kResetConv2 = 54, + kInvokedFrom111 = 55, + + kSaveWinsInDesert = 60, + kBubblesUpIn301 = 61, + kBubbleWontAttack = 62, + kPidLookedAtDoll = 63, + + kOasis = 80, + kFireHoles = 81, + kDesertRoom = 82, + kFromDirection = 83, + kDesertCounter = 84, + kMoveDirection409 = 85, + kHealVerbsVisible = 86, + kGrapesHaveGrown = 87, + kPidTalkShamon = 88, + kPidJustDied = 89, + + kGrapesAreDead = 90, + kRocIsChewingDates = 91, + kWinsInDesert = 92, + kWinsTillPrize = 93, + kPidHasBeenHealedSop = 94, + kGamePoints = 95, + kDancePoints = 96, + kCluePoints = 97, + kPrizesOwedToPlayer = 98, + kObjectFlags = 99, + + kWaterfallDiverted = 100, + kShakStatus = 101, + kMaxGridValue = 102, + kMoveDirection510 = 103, + kShak506Angry = 104, + kMonsterIsDead = 105, + kDoneTalkingLani502 = 106, + kFoundLani504 = 107, + kSaidUseSwordShak = 108, + kGobletFilledSoporific = 109, + + kBeenIn504AsPid = 110, + kSeenLaniDeadFirstTime = 111, + kSaidPoemIn504 = 112, + kTriedToHealLlanie504 = 113, + kPutBundleOnLlanie504 = 114, + kMake504Empty = 115, + kHasTakenMud = 116, + kPlatformClicked606 = 117, + kHadSpiritBundle = 118, + + kMudIsInEye603 = 120, + kRopeIsAlive = 121, + kRatCageIsOpen = 122, + kFlaskOnPlate = 123, + kFluidIsDripping = 124, + kHoleIsIn607 = 125, + kRopeIsHangingIn607 = 126, + kObjectIsInFreezer605 = 127, + kObjectImitated = 128, + kHasRed = 129, + + kHasYellow = 130, + kHasBlue = 131, + kWizardDead = 132, + kVineWillGrab = 133, + kFloorIsCool = 134, + kRatMelted = 135, + kDoorIsCool = 136, + kUsedElevator = 137, + kBeenOnTopFloor = 138, + kTorchIsIn609 = 139, + + kGridPosition = 140 + }; + +class DragonsphereGlobals : public Globals { +public: + SynchronizedList _spriteIndexes; + SynchronizedList _sequenceIndexes; + SynchronizedList _animationIndexes; +public: + /** + * Constructor + */ + DragonsphereGlobals(); + + /** + * Synchronize the globals data + */ + virtual void synchronize(Common::Serializer &s); +}; + +} // End of namespace Dragonsphere + +} // End of namespace MADS + +#endif /* MADS_GLOBALS_DRAGONSPHERE_H */ diff --git a/engines/mads/game.cpp b/engines/mads/game.cpp index 91f6cd5630..8ebea2a3b2 100644 --- a/engines/mads/game.cpp +++ b/engines/mads/game.cpp @@ -57,8 +57,7 @@ Game *Game::init(MADSEngine *vm) { } Game::Game(MADSEngine *vm) - : _vm(vm), _surface(nullptr), _objects(vm), _scene(vm), - _screenObjects(vm), _player(vm) { + : _vm(vm), _surface(nullptr), _objects(vm), _scene(vm), _screenObjects(vm), _player(vm), _camX(vm), _camY(vm) { _sectionNumber = 1; _priorSectionNumber = 0; _loadGameSlot = -1; @@ -82,6 +81,7 @@ Game::Game(MADSEngine *vm) _winStatus = 0; _widepipeCtr = 0; _fx = kTransitionNone; + _panningSpeed = 1; // Medium speed // Load the inventory object list _objects.load(); @@ -218,6 +218,10 @@ void Game::sectionLoop() { } _scene.loadScene(_scene._nextSceneId, _aaName, 0); + camInitDefault(); + camSetSpeed(); + + _vm->_sound->pauseNewCommands(); if (!_player._spritesLoaded) { @@ -297,8 +301,10 @@ void Game::sectionLoop() { _vm->_events->waitCursor(); _kernelMode = KERNEL_ROOM_PRELOAD; - delete _scene._activeAnimation; - _scene._activeAnimation = nullptr; + for (int i = 0; i < 10; i++) { + delete _scene._animation[i]; + _scene._animation[i] = nullptr; + } _scene._reloadSceneFlag = false; @@ -597,4 +603,78 @@ void Game::createThumbnail() { ::createThumbnail(_saveThumb, _vm->_screen.getData(), MADS_SCREEN_WIDTH, MADS_SCREEN_HEIGHT, thumbPalette); } +void Game::syncTimers(SyncType slaveType, int slaveId, SyncType masterType, int masterId) { + uint32 syncTime = 0; + + switch (masterType) { + case SYNC_SEQ: + syncTime = _scene._sequences[masterId]._timeout; + break; + + case SYNC_ANIM: + syncTime = _scene._animation[masterId]->getNextFrameTimer(); + break; + + case SYNC_CLOCK: + syncTime = _scene._frameStartTime + masterId; + break; + + case SYNC_PLAYER: + syncTime = _player._priorTimer; + break; + } + + + switch (slaveType) { + case SYNC_SEQ: + _scene._sequences[slaveId]._timeout = syncTime; + break; + + case SYNC_PLAYER: + _player._priorTimer = syncTime; + break; + + case SYNC_ANIM: + _scene._animation[slaveId]->setNextFrameTimer(syncTime); + break; + + case SYNC_CLOCK: + error("syncTimer is trying to force _frameStartTime"); + } +} + +void Game::camInitDefault() { + _camX.setDefaultPanX(); + _camY.setDefaultPanY(); +} + +void Game::camSetSpeed() { + switch (_panningSpeed) { + case 1: + _camX._speed = 8; + _camY._speed = 4; + break; + + case 2: + _camX._speed = 320; + _camY._speed = 160; + break; + + default: + _camX._speed = 4; + _camY._speed = 2; + break; + } +} + +void Game::camUpdate() { + bool any_pan = _camX.camPan(&_scene._posAdjust.x, &_player._playerPos.x, 320, _scene._sceneInfo->_width); + any_pan |= _camY.camPan(&_scene._posAdjust.y, &_player._playerPos.y, 156, _scene._sceneInfo->_height); + + if (any_pan) { + _scene.setCamera(_scene._posAdjust); + _screenObjects._forceRescan = true; + } +} + } // End of namespace MADS diff --git a/engines/mads/game.h b/engines/mads/game.h index 95b54b0d1a..9defb58b1a 100644 --- a/engines/mads/game.h +++ b/engines/mads/game.h @@ -34,6 +34,7 @@ #include "mads/inventory.h" #include "mads/player.h" #include "mads/screen.h" +#include "mads/camera.h" namespace MADS { @@ -44,6 +45,11 @@ enum KernelMode { KERNEL_ROOM_PRELOAD = 3, KERNEL_ROOM_INIT = 4, KERNEL_ACTIVE_CODE = 5 }; +enum SyncType { + SYNC_SEQ = 1, SYNC_PLAYER = 2, SYNC_ANIM = 3, SYNC_CLOCK = 4 +}; + + #define MADS_SAVEGAME_VERSION 1 struct MADSSavegameHeader { @@ -142,6 +148,8 @@ public: int _winStatus; int _widepipeCtr; int _loadGameSlot; + int _panningSpeed; + Camera _camX, _camY; public: virtual ~Game(); @@ -235,6 +243,12 @@ public: * Creates a temporary thumbnail for use in saving games */ void createThumbnail(); + + void syncTimers(SyncType slaveType, int slaveId, SyncType masterType, int masterId); + + void camInitDefault(); + void camSetSpeed(); + void camUpdate(); }; } // End of namespace MADS diff --git a/engines/mads/hotspots.cpp b/engines/mads/hotspots.cpp index 8afef2e524..098313eca4 100644 --- a/engines/mads/hotspots.cpp +++ b/engines/mads/hotspots.cpp @@ -27,6 +27,7 @@ namespace MADS { DynamicHotspot::DynamicHotspot() { _seqIndex = 0; + _animIndex = -1; _facing = FACING_NONE; _descId = 0; _verbId = 0; @@ -52,6 +53,11 @@ DynamicHotspots::DynamicHotspots(MADSEngine *vm) : _vm(vm) { _count = 0; } +int DynamicHotspots::add(int descId, int verbId, int syntax, int seqIndex, const Common::Rect &bounds) { + warning("TODO: DynamicHotspots::add(5 params))"); + return add(descId, verbId, seqIndex, bounds); +} + int DynamicHotspots::add(int descId, int verbId, int seqIndex, const Common::Rect &bounds) { // Find a free slot uint idx = 0; @@ -69,6 +75,7 @@ int DynamicHotspots::add(int descId, int verbId, int seqIndex, const Common::Rec _entries[idx]._verbId = verbId; _entries[idx]._articleNumber = PREP_IN; _entries[idx]._cursor = CURSOR_NONE; + _entries[idx]._animIndex = -1; ++_count; _changed = true; @@ -101,6 +108,8 @@ void DynamicHotspots::remove(int index) { if (index >= 0 && _entries[index]._active) { if (_entries[index]._seqIndex >= 0) scene._sequences[_entries[index]._seqIndex]._dynamicHotspotIndex = -1; + if (_entries[index]._animIndex >= 0) + scene._animation[_entries[index]._animIndex]->_dynamicHotspotIndex = -1; _entries[index]._active = false; --_count; @@ -212,4 +221,16 @@ void Hotspots::activate(int vocabId, bool active) { } } +void Hotspots::activateAtPos(int vocabId, bool active, Common::Point pos) { + for (uint idx = 0; idx < size(); ++idx) { + Hotspot &hotspot = (*this)[idx]; + if ((hotspot._vocabId == vocabId) && (pos.x >= hotspot._bounds.left) && + (pos.x <= hotspot._bounds.right) && (pos.y >= hotspot._bounds.top) && + (pos.y <= hotspot._bounds.bottom)) { + hotspot._active = active; + _vm->_game->_screenObjects.setActive(CAT_HOTSPOT, idx, active); + } + } +} + } // End of namespace MADS diff --git a/engines/mads/hotspots.h b/engines/mads/hotspots.h index 902275bb21..ffd53e5a70 100644 --- a/engines/mads/hotspots.h +++ b/engines/mads/hotspots.h @@ -35,6 +35,7 @@ class DynamicHotspot { public: bool _active; int _seqIndex; + int _animIndex; Common::Rect _bounds; Common::Point _feetPos; Facing _facing; @@ -54,7 +55,17 @@ public: void synchronize(Common::Serializer &s); }; -#define DYNAMIC_HOTSPOTS_SIZE 8 +#define DYNAMIC_HOTSPOTS_SIZE 16 + +#define SYNTAX_SINGULAR 0 +#define SYNTAX_PLURAL 1 +#define SYNTAX_PARTITIVE 2 +#define SYNTAX_SINGULAR_MASC 3 +#define SYNTAX_SINGULAR_FEM 4 +#define SYNTAX_SINGULAR_LIVING 5 +#define SYNTAX_MASC_NOT_PROPER 6 +#define SYNTAX_FEM_NOT_PROPER 7 +#define MAX_SYNTAX 8 class DynamicHotspots { private: @@ -68,6 +79,7 @@ public: Common::Array<MADS::DynamicHotspot>::size_type size() const { return _entries.size(); } DynamicHotspot &operator[](uint idx) { return _entries[idx]; } + int add(int descId, int verbId, int syntax, int seqIndex, const Common::Rect &bounds); int add(int descId, int verbId, int seqIndex, const Common::Rect &bounds); int setPosition(int index, const Common::Point &pos, Facing facing); int setCursor(int index, CursorType cursor); @@ -113,6 +125,12 @@ public: * Sets the active state of a given hotspot */ void activate(int vocabId, bool active); + + /** + * Sets the active state of a given hotspot if it includes a given position + */ + void activateAtPos(int vocabId, bool active, Common::Point pos); + }; } // End of namespace MADS diff --git a/engines/mads/mads.cpp b/engines/mads/mads.cpp index 8c7b6b1ce3..0bdf484c9a 100644 --- a/engines/mads/mads.cpp +++ b/engines/mads/mads.cpp @@ -46,12 +46,14 @@ MADSEngine::MADSEngine(OSystem *syst, const MADSGameDescription *gameDesc) : _musicFlag = true; _soundFlag = true; _dithering = false; + _disableFastwalk = false; _debugger = nullptr; _dialogs = nullptr; _events = nullptr; _font = nullptr; _game = nullptr; + _gameConv = nullptr; _palette = nullptr; _resources = nullptr; _sound = nullptr; @@ -65,6 +67,7 @@ MADSEngine::~MADSEngine() { delete _font; Font::deinit(); delete _game; + delete _gameConv; delete _palette; delete _resources; delete _sound; @@ -96,6 +99,14 @@ void MADSEngine::initialize() { _audio = new AudioPlayer(_mixer, getGameID()); _game = Game::init(this); + switch (getGameID()) { + case GType_RexNebular: + _gameConv = nullptr; + break; + default: + _gameConv = new GameConversation(this); + } + loadOptions(); _screen.empty(); diff --git a/engines/mads/mads.h b/engines/mads/mads.h index 901035320a..1b0f96a656 100644 --- a/engines/mads/mads.h +++ b/engines/mads/mads.h @@ -30,6 +30,7 @@ #include "common/util.h" #include "engines/engine.h" #include "graphics/surface.h" +#include "mads/conversations.h" #include "mads/debugger.h" #include "mads/dialogs.h" #include "mads/events.h" @@ -96,6 +97,7 @@ public: EventsManager *_events; Font *_font; Game *_game; + GameConversation * _gameConv; Palette *_palette; Resources *_resources; ScreenSurface _screen; @@ -108,6 +110,7 @@ public: bool _musicFlag; bool _soundFlag; bool _dithering; + bool _disableFastwalk; public: MADSEngine(OSystem *syst, const MADSGameDescription *gameDesc); virtual ~MADSEngine(); diff --git a/engines/mads/menu_views.cpp b/engines/mads/menu_views.cpp index cfc3b09461..10d5a2179a 100644 --- a/engines/mads/menu_views.cpp +++ b/engines/mads/menu_views.cpp @@ -1,24 +1,24 @@ /* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ +* +* ScummVM is the legal property of its developers, whose names +* are too numerous to list here. Please refer to the COPYRIGHT +* file distributed with this source distribution. +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +*/ #include "common/scummsys.h" #include "mads/game.h" @@ -254,6 +254,7 @@ void TextView::processCommand() { sceneInfo->_width = MADS_SCREEN_WIDTH; sceneInfo->_height = MADS_SCENE_HEIGHT; _spareScreens[spareIndex].setSize(MADS_SCREEN_WIDTH, MADS_SCENE_HEIGHT); + sceneInfo->loadMadsV1Background(screenId, "", SCENEFLAG_TRANSLATE, _spareScreens[spareIndex]); delete sceneInfo; @@ -795,4 +796,40 @@ int AnimationView::getParameter() { return result; } +void AnimationView::checkResource(const Common::String &resourceName) { + //bool hasSuffix = false; + +} + +int AnimationView::scanResourceIndex(const Common::String &resourceName) { + int foundIndex = -1; + + if (_v1) { + const char *chP = strchr(resourceName.c_str(), '\\'); + if (!chP) { + chP = strchr(resourceName.c_str(), '*'); + } + + Common::String resName = chP ? Common::String(chP + 1) : resourceName; + + if (_v2 != 3) { + assert(_resIndex.size() == 0); + } + + // Scan for the resource name + for (uint resIndex = 0; resIndex < _resIndex.size(); ++resIndex) { + ResIndexEntry &resEntry = _resIndex[resIndex]; + if (resEntry._resourceName.compareToIgnoreCase(resourceName)) { + foundIndex = resIndex; + break; + } + } + } + + if (foundIndex >= 0) { + // TODO + } + return -1; +} + } // End of namespace MADS diff --git a/engines/mads/menu_views.h b/engines/mads/menu_views.h index 6c8a2a8bdd..c203248ad9 100644 --- a/engines/mads/menu_views.h +++ b/engines/mads/menu_views.h @@ -8,12 +8,20 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. +<<<<<<< HEAD + +======= * +>>>>>>> master * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. +<<<<<<< HEAD + +======= * +>>>>>>> master * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. @@ -119,8 +127,8 @@ protected: virtual void doFrame(); /** - * Called when the script is finished - */ + * Called when the script is finished + */ virtual void scriptDone(); public: /** @@ -191,6 +199,11 @@ private: int _manualFrame2; int _animFrameNumber; bool _nextCyclingActive; +private: + void checkResource(const Common::String &resourceName); + + int scanResourceIndex(const Common::String &resourceName); + uint _scrollFrameCtr; private: void load(); diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index d88806150d..2bee77dae7 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -193,6 +193,10 @@ void KernelMessages::processText(int msgIndex) { msg._timeout = 0; } + if (msg._flags & KMSG_ANIM) { + warning("TODO: Implement animated text"); + } + if ((msg._timeout <= 0) && (_vm->_game->_trigger == 0)) { msg._flags |= KMSG_EXPIRE; if (msg._trigger != 0) { @@ -465,6 +469,16 @@ void KernelMessages::initRandomMessages(int maxSimultaneousMessages, va_end(va); } +void KernelMessages::setAnim(int msgId, int seqId, int val3 = 0) { + if (msgId < 0) + return; + + _entries[msgId]._flags |= KMSG_ANIM; + _entries[msgId]._sequenceIndex = seqId; + + warning("TODO: KernelMessages::setAnim, unused parameter"); +} + /*------------------------------------------------------------------------*/ diff --git a/engines/mads/messages.h b/engines/mads/messages.h index 764477a7fc..2b673a8a4d 100644 --- a/engines/mads/messages.h +++ b/engines/mads/messages.h @@ -39,14 +39,14 @@ namespace MADS { enum KernelMessageFlags { KMSG_QUOTED = 1, KMSG_PLAYER_TIMEOUT = 2, KMSG_SEQ_ENTRY = 4, KMSG_SCROLL = 8, KMSG_RIGHT_ALIGN = 0x10, KMSG_CENTER_ALIGN = 0x20, KMSG_EXPIRE = 0x40, - KMSG_ACTIVE = 0x80 + KMSG_ACTIVE = 0x80, KMSG_ANIM = 0x100 }; class MADSEngine; class KernelMessage { public: - uint8 _flags; + uint16 _flags; int _sequenceIndex; int _color1; int _color2; @@ -104,6 +104,7 @@ public: int addQuote(int quoteId, int endTrigger, uint32 timeout); void scrollMessage(int msgIndex, int numTicks, bool quoted); void setSeqIndex(int msgIndex, int seqIndex); + void setAnim(int msgId, int seqId, int val3); void remove(int msgIndex); void reset(); void update(); diff --git a/engines/mads/module.mk b/engines/mads/module.mk index 7cb7a91e8c..8f154394bf 100644 --- a/engines/mads/module.mk +++ b/engines/mads/module.mk @@ -3,10 +3,16 @@ MODULE := engines/mads MODULE_OBJS := \ dragonsphere/game_dragonsphere.o \ dragonsphere/dragonsphere_scenes.o \ + dragonsphere/dragonsphere_scenes1.o \ + dragonsphere/globals_dragonsphere.o \ phantom/game_phantom.o \ phantom/globals_phantom.o \ phantom/phantom_scenes.o \ phantom/phantom_scenes1.o \ + phantom/phantom_scenes2.o \ + phantom/phantom_scenes3.o \ + phantom/phantom_scenes4.o \ + phantom/phantom_scenes5.o \ nebular/dialogs_nebular.o \ nebular/game_nebular.o \ nebular/globals_nebular.o \ @@ -25,7 +31,9 @@ MODULE_OBJS := \ animation.o \ assets.o \ audio.o \ + camera.o \ compression.o \ + conversations.o \ debugger.o \ detection.o \ dialogs.o \ diff --git a/engines/mads/nebular/dialogs_nebular.cpp b/engines/mads/nebular/dialogs_nebular.cpp index 960a2cc2f4..ede16e1f99 100644 --- a/engines/mads/nebular/dialogs_nebular.cpp +++ b/engines/mads/nebular/dialogs_nebular.cpp @@ -82,11 +82,14 @@ bool DialogsNebular::show(int messageId, int objectId) { if (centerFlag) { crFlag = true; } else { - if (objectId == -1) { + if (dialog) + delete dialog; + + if (objectId == -1) dialog = new TextDialog(_vm, FONT_INTERFACE, _defaultPosition, _dialogWidth); - } else { + else dialog = new PictureDialog(_vm, _defaultPosition, _dialogWidth, objectId); - } + dialog->wordWrap(dialogText); dialog->incNumLines(); } @@ -146,11 +149,10 @@ bool DialogsNebular::show(int messageId, int objectId) { } if (!dialog) { - if (objectId == -1) { + if (objectId == -1) dialog = new TextDialog(_vm, FONT_INTERFACE, _defaultPosition, _dialogWidth); - } else { + else dialog = new PictureDialog(_vm, _defaultPosition, _dialogWidth, objectId); - } } if (centerFlag) { @@ -366,6 +368,8 @@ void DialogsNebular::showScummVMSaveDialog() { // Flag for scene loading that we're returning from a dialog scene._currentSceneId = RETURNING_FROM_DIALOG; + + delete dialog; } void DialogsNebular::showScummVMRestoreDialog() { @@ -382,6 +386,8 @@ void DialogsNebular::showScummVMRestoreDialog() { // Flag for scene loading that we're returning from a dialog scene._currentSceneId = RETURNING_FROM_DIALOG; } + + delete dialog; } /*------------------------------------------------------------------------*/ diff --git a/engines/mads/nebular/game_nebular.cpp b/engines/mads/nebular/game_nebular.cpp index 8f40bc15c8..c4b7f57281 100644 --- a/engines/mads/nebular/game_nebular.cpp +++ b/engines/mads/nebular/game_nebular.cpp @@ -354,7 +354,7 @@ void GameNebular::setSectionHandler() { void GameNebular::checkShowDialog() { // Loop for showing dialogs, if any need to be shown - if (_vm->_dialogs->_pendingDialog && (_player._stepEnabled || _winStatus) + if (_vm->_dialogs->_pendingDialog && (_player._stepEnabled || _winStatus) && !_globals[kCopyProtectFailed]) { _player.releasePlayerSprites(); @@ -693,8 +693,6 @@ void GameNebular::doObjectAction() { _globals[kHandsetCellStatus] = _difficulty != DIFFICULTY_HARD || _globals[kHandsetCellStatus] ? 1 : 2; dialogs.show(425); } - } else if (action.isAction(VERB_SET, NOUN_TIMEBOMB)) { - dialogs.show(427); } else if (action.isAction(VERB_PUT, NOUN_BOMB, NOUN_CHICKEN) || action.isAction(VERB_PUT, NOUN_BOMBS, NOUN_CHICKEN)) { _objects.setRoom(OBJ_CHICKEN, NOWHERE); if (_objects.isInInventory(OBJ_BOMBS)) { @@ -828,7 +826,7 @@ void GameNebular::unhandledAction() { void GameNebular::step() { if (_player._visible && _player._stepEnabled && !_player._moving && (_player._facing == _player._turnToFacing)) { - if (_scene._frameStartTime >= *((uint32 *)&_globals[kWalkerTiming])) { + if (_scene._frameStartTime >= (uint32)_globals[kWalkerTiming]) { if (!_player._stopWalkerIndex) { int randomVal = _vm->getRandomNumber(29999); if (_globals[kSexOfRex] == REX_MALE) { @@ -877,19 +875,19 @@ void GameNebular::step() { } } - *((uint32 *)&_globals[kWalkerTiming]) += 6; + _globals[kWalkerTiming] += 6; } } // Below is countdown to set the timebomb off in room 604 if (_globals[kTimebombStatus] == TIMEBOMB_ACTIVATED) { - int diff = _scene._frameStartTime - *((uint32 *)&_globals[kTimebombClock]); - if ((diff >= 0) && (diff <= 60)) { - *((uint32 *)&_globals[kTimebombTimer]) += diff; - } else { - ++*((uint32 *)&_globals[kTimebombTimer]); - } - *((uint32 *)&_globals[kTimebombClock]) = _scene._frameStartTime; + int diff = _scene._frameStartTime - _globals[kTimebombClock]; + if ((diff >= 0) && (diff <= 60)) + _globals[kTimebombTimer] += diff; + else + ++_globals[kTimebombTimer]; + + _globals[kTimebombClock] = (int) _scene._frameStartTime; } } diff --git a/engines/mads/nebular/nebular_scenes.cpp b/engines/mads/nebular/nebular_scenes.cpp index eb6f7a5610..da419a70a2 100644 --- a/engines/mads/nebular/nebular_scenes.cpp +++ b/engines/mads/nebular/nebular_scenes.cpp @@ -485,7 +485,7 @@ void SceneTeleporter::teleporterHandleKey() { if (_scene->_currentSceneId != 711) { if (_curMessageId >= 0) _scene->_kernelMessages.remove(_curMessageId); - _curMessageId = _scene->_kernelMessages.add(Common::Point(143, 61), 0xFDFC, 16, 0, 9999999, _msgText); + _curMessageId = _scene->_kernelMessages.add(Common::Point(143, 61), 0xFDFC, 16, 0, INDEFINITE_TIMEOUT, _msgText); } break; @@ -563,8 +563,8 @@ void SceneTeleporter::teleporterEnter() { Common::String msgText2 = Common::String::format("#%.4d", codeVal); if (_scene->_currentSceneId != 711) { - _scene->_kernelMessages.add(Common::Point(133, 34), 0, 32, 0, 9999999, msgText2); - _scene->_kernelMessages.add(Common::Point(143, 61), 0xFDFC, 16, 0, 9999999, _msgText); + _scene->_kernelMessages.add(Common::Point(133, 34), 0, 32, 0, INDEFINITE_TIMEOUT, msgText2); + _scene->_kernelMessages.add(Common::Point(143, 61), 0xFDFC, 16, 0, INDEFINITE_TIMEOUT, _msgText); } _meteorologistCurPlace = 0; @@ -577,9 +577,9 @@ void SceneTeleporter::teleporterEnter() { bool SceneTeleporter::teleporterActions() { bool retVal = false; - static int _buttonList[12] = { NOUN_0_KEY, NOUN_1_KEY, NOUN_2_KEY, NOUN_3_KEY, NOUN_4_KEY, NOUN_5_KEY, NOUN_6_KEY, NOUN_7_KEY, NOUN_8_KEY, NOUN_9_KEY, NOUN_SMILE_KEY, NOUN_FROWN_KEY }; if (_action.isAction(VERB_PRESS) || _action.isAction(VERB_PUSH)) { + static int _buttonList[12] = { NOUN_0_KEY, NOUN_1_KEY, NOUN_2_KEY, NOUN_3_KEY, NOUN_4_KEY, NOUN_5_KEY, NOUN_6_KEY, NOUN_7_KEY, NOUN_8_KEY, NOUN_9_KEY, NOUN_SMILE_KEY, NOUN_FROWN_KEY }; for (int i = 0; i < 12; i++) { if (_action._activeAction._objectNameId == _buttonList[i]) _buttonTyped = i; diff --git a/engines/mads/nebular/nebular_scenes1.cpp b/engines/mads/nebular/nebular_scenes1.cpp index 0cb1b11ee9..9207d87be7 100644 --- a/engines/mads/nebular/nebular_scenes1.cpp +++ b/engines/mads/nebular/nebular_scenes1.cpp @@ -258,32 +258,32 @@ void Scene101::step() { break; } - if (_scene->_activeAnimation != nullptr) { - if ((_scene->_activeAnimation->getCurrentFrame() >= 6) && (_messageNum == 0)) { + if (_scene->_animation[0] != nullptr) { + if ((_scene->_animation[0]->getCurrentFrame() >= 6) && (_messageNum == 0)) { _messageNum++; _scene->_kernelMessages.add(Common::Point(63, _posY), 0x1110, 0, 0, 240, _game.getQuote(49)); _posY += 14; } - if ((_scene->_activeAnimation->getCurrentFrame() >= 7) && (_messageNum == 1)) { + if ((_scene->_animation[0]->getCurrentFrame() >= 7) && (_messageNum == 1)) { _messageNum++; _scene->_kernelMessages.add(Common::Point(63, _posY), 0x1110, 0, 0, 240, _game.getQuote(54)); _posY += 14; } - if ((_scene->_activeAnimation->getCurrentFrame() >= 10) && (_messageNum == 2)) { + if ((_scene->_animation[0]->getCurrentFrame() >= 10) && (_messageNum == 2)) { _messageNum++; _scene->_kernelMessages.add(Common::Point(63, _posY), 0x1110, 0, 0, 240, _game.getQuote(55)); _posY += 14; } - if ((_scene->_activeAnimation->getCurrentFrame() >= 17) && (_messageNum == 3)) { + if ((_scene->_animation[0]->getCurrentFrame() >= 17) && (_messageNum == 3)) { _messageNum++; _scene->_kernelMessages.add(Common::Point(63, _posY), 0x1110, 0, 0, 240, _game.getQuote(56)); _posY += 14; } - if ((_scene->_activeAnimation->getCurrentFrame() >= 20) && (_messageNum == 4)) { + if ((_scene->_animation[0]->getCurrentFrame() >= 20) && (_messageNum == 4)) { _messageNum++; _scene->_kernelMessages.add(Common::Point(63, _posY), 0x1110, 0, 0, 240, _game.getQuote(50)); _posY += 14; @@ -1263,7 +1263,7 @@ void Scene102::actions() { return; } - if (_action.isAction(VERB_LOOK, NOUN_BURGER) && (_action._mainObjectSource == 4)) { + if (_action.isAction(VERB_LOOK, NOUN_BURGER) && (_action._mainObjectSource == CAT_HOTSPOT)) { _vm->_dialogs->show(801); _action._inProgress = false; } @@ -1782,7 +1782,7 @@ void Scene104::step() { if ((_game._player._special > 0) && _game._player._stepEnabled) _game._player._stepEnabled = false; - if (_kargShootingFl && (_scene->_activeAnimation->getCurrentFrame() >= 19)) { + if (_kargShootingFl && (_scene->_animation[0]->getCurrentFrame() >= 19)) { _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(52)); _kargShootingFl = false; } @@ -2079,7 +2079,7 @@ void Scene106::step() { } } - if (_firstEmergingFl && (_scene->_activeAnimation->getCurrentFrame() >= 19)) { + if (_firstEmergingFl && (_scene->_animation[0]->getCurrentFrame() >= 19)) { _firstEmergingFl = false; _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(52)); } @@ -2263,7 +2263,7 @@ void Scene107::enter() { } void Scene107::step() { - if (_shootingFl && (_scene->_activeAnimation->getCurrentFrame() >= 19)) { + if (_shootingFl && (_scene->_animation[0]->getCurrentFrame() >= 19)) { _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(52)); _shootingFl = false; } @@ -2295,7 +2295,7 @@ void Scene107::actions() { _scene->_nextSceneId = 105; else if (_action.isAction(VERB_LOOK, NOUN_NORTHERN_SEA_CLIFF)) _vm->_dialogs->show(10701); - else if (_action.isAction(VERB_LOOK, NOUN_DEAD_FISH) && (_action._mainObjectSource == 4)) + else if (_action.isAction(VERB_LOOK, NOUN_DEAD_FISH) && (_action._mainObjectSource == CAT_HOTSPOT)) _vm->_dialogs->show(10702); else if (_action.isAction(VERB_LOOK, NOUN_BUSH_LIKE_FORMATION)) _vm->_dialogs->show(10703); @@ -2919,7 +2919,7 @@ void Scene110::actions() { switch (_game._trigger) { case 0: _scene->loadAnimation(Resources::formatName(110, 'T', 0, EXT_AA, ""), 1); - _scene->_activeAnimation->setNextFrameTimer(_game._player._ticksAmount + _game._player._priorTimer); + _scene->_animation[0]->setNextFrameTimer(_game._player._ticksAmount + _game._player._priorTimer); _game._player._stepEnabled = false; _game._player._visible = false; break; @@ -3066,7 +3066,7 @@ void Scene111::step() { if (_game._trigger == 73) _vm->_sound->command(37); - if (_rexDivingFl && (_scene->_activeAnimation->getCurrentFrame() >= 9)) { + if (_rexDivingFl && (_scene->_animation[0]->getCurrentFrame() >= 9)) { _vm->_sound->command(36); _rexDivingFl = false; } @@ -3138,8 +3138,8 @@ void Scene112::enter() { } void Scene112::step() { - if ((_scene->_activeAnimation != nullptr) && (_game._storyMode == STORYMODE_NICE)) { - if (_scene->_activeAnimation->getCurrentFrame() >= 54) { + if ((_scene->_animation[0] != nullptr) && (_game._storyMode == STORYMODE_NICE)) { + if (_scene->_animation[0]->getCurrentFrame() >= 54) { _scene->freeAnimation(); _game._trigger = 70; } diff --git a/engines/mads/nebular/nebular_scenes2.cpp b/engines/mads/nebular/nebular_scenes2.cpp index 1cbd6f56ef..5210f59f47 100644 --- a/engines/mads/nebular/nebular_scenes2.cpp +++ b/engines/mads/nebular/nebular_scenes2.cpp @@ -484,7 +484,7 @@ void Scene202::enter() { } _scene->loadAnimation(formAnimName('M', -1), 71); - _scene->_activeAnimation->setCurrentFrame(200); + _scene->_animation[0]->setCurrentFrame(200); } else { if (_ladderTopFl) { _game._player._visible = false; @@ -596,7 +596,7 @@ void Scene202::step() { break; } - if (!_scene->_activeAnimation && (_globals[kMeteorologistStatus] != METEOROLOGIST_GONE) && (_meteoClock2 <= _scene->_frameStartTime) && (_meteoClock1 <= _scene->_frameStartTime)) { + if (!_scene->_animation[0] && (_globals[kMeteorologistStatus] != METEOROLOGIST_GONE) && (_meteoClock2 <= _scene->_frameStartTime) && (_meteoClock1 <= _scene->_frameStartTime)) { int randVal = _vm->getRandomNumber(1, 500); int threshold = 1; if (_ladderTopFl) @@ -615,11 +615,11 @@ void Scene202::step() { } } - if (!_scene->_activeAnimation) + if (!_scene->_animation[0]) return; if (_waitingMeteoFl) { - if (_scene->_activeAnimation->getCurrentFrame() >= 200) { + if (_scene->_animation[0]->getCurrentFrame() >= 200) { if ((_globals[kMeteorologistWatch] == METEOROLOGIST_TOWER) || _globals[kLadderBroken]) { _scene->_nextSceneId = 213; } else { @@ -628,7 +628,7 @@ void Scene202::step() { } } - if ((_scene->_activeAnimation->getCurrentFrame() == 160) && (_meteoFrame != _scene->_activeAnimation->getCurrentFrame())) { + if ((_scene->_animation[0]->getCurrentFrame() == 160) && (_meteoFrame != _scene->_animation[0]->getCurrentFrame())) { Common::Point msgPos; int msgFlag; if (!_ladderTopFl) { @@ -647,15 +647,15 @@ void Scene202::step() { _toTeleportFl = true; } - if (_scene->_activeAnimation->getCurrentFrame() == _meteoFrame) { + if (_scene->_animation[0]->getCurrentFrame() == _meteoFrame) { return; } - _meteoFrame = _scene->_activeAnimation->getCurrentFrame(); + _meteoFrame = _scene->_animation[0]->getCurrentFrame(); int randVal = _vm->getRandomNumber(1, 1000); int frameStep = -1; - switch (_scene->_activeAnimation->getCurrentFrame()) { + switch (_scene->_animation[0]->getCurrentFrame()) { case 42: case 77: case 96: @@ -693,8 +693,8 @@ void Scene202::step() { break; } - if (frameStep >= 0 && frameStep != _scene->_activeAnimation->getCurrentFrame() + 1) { - _scene->_activeAnimation->setCurrentFrame(frameStep); + if (frameStep >= 0 && frameStep != _scene->_animation[0]->getCurrentFrame() + 1) { + _scene->_animation[0]->setCurrentFrame(frameStep); _meteoFrame = frameStep; } } @@ -797,7 +797,7 @@ void Scene202::actions() { _scene->_nextSceneId = 203; } else if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_NORTH)) { if (_globals[kMeteorologistStatus] != METEOROLOGIST_GONE) { - if (_scene->_activeAnimation) + if (_scene->_animation[0]) _globals[kMeteorologistStatus] = METEOROLOGIST_PRESENT; else _globals[kMeteorologistStatus] = METEOROLOGIST_ABSENT; @@ -890,7 +890,7 @@ void Scene202::actions() { _globals._sequenceIndexes[10] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 6); _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1); _scene->_sequences.setPosition(_globals._sequenceIndexes[10], Common::Point(172, 123)); - if (_scene->_activeAnimation) { + if (_scene->_animation[0]) { _waitingMeteoFl = true; _globals[kMeteorologistWatch] = METEOROLOGIST_GROUND; } else { @@ -898,7 +898,7 @@ void Scene202::actions() { } break; case 2: - if (!_scene->_activeAnimation && !_meteorologistSpecial) { + if (!_scene->_animation[0] && !_meteorologistSpecial) { _vm->_dialogs->show(20222); } _scene->_sequences.remove(_globals._sequenceIndexes[10]); @@ -932,13 +932,13 @@ void Scene202::actions() { _globals._sequenceIndexes[10] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], true, -2); _scene->_sequences.setPosition(_globals._sequenceIndexes[10], Common::Point(247, 82)); _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1); - if (_scene->_activeAnimation) { - if (_scene->_activeAnimation->getCurrentFrame() > 200) { + if (_scene->_animation[0]) { + if (_scene->_animation[0]->getCurrentFrame() > 200) { _scene->_sequences.addTimer(120, 2); } else { _waitingMeteoFl = true; _globals[kMeteorologistWatch] = METEOROLOGIST_GONE; - if ((_scene->_activeAnimation->getCurrentFrame() >= 44) && (_scene->_activeAnimation->getCurrentFrame() <= 75)) { + if ((_scene->_animation[0]->getCurrentFrame() >= 44) && (_scene->_animation[0]->getCurrentFrame() <= 75)) { _scene->_kernelMessages.reset(); int msgIndex = _scene->_kernelMessages.add(Common::Point(248, 15), 0x1110, 32, 0, 60, _game.getQuote(100)); _scene->_kernelMessages.setQuoted(msgIndex, 4, false); @@ -952,7 +952,7 @@ void Scene202::actions() { } break; case 2: - if (!_scene->_activeAnimation) + if (!_scene->_animation[0]) _vm->_dialogs->show(20222); _meteorologistSpecial = false; _scene->_sequences.remove(_globals._sequenceIndexes[10]); @@ -1227,7 +1227,7 @@ void Scene205::enter() { if (_globals[kSexOfRex] != SEX_MALE) { _scene->loadAnimation(formAnimName('a', -1)); - _scene->_activeAnimation->_resetFlag = true; + _scene->_animation[0]->_resetFlag = true; } else { _beingKicked = true; _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 1, 0, 0); @@ -1284,7 +1284,7 @@ void Scene205::step() { } void Scene205::handleWomanSpeech(int quote) { - _kernelMessage = _scene->_kernelMessages.add(Common::Point(186, 27), 0xFBFA, 0, 0, 9999999, _game.getQuote(quote)); + _kernelMessage = _scene->_kernelMessages.add(Common::Point(186, 27), 0xFBFA, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(quote)); } void Scene205::actions() { @@ -1379,8 +1379,8 @@ void Scene205::actions() { _scene->_sequences.updateTimeout(_globals._sequenceIndexes[9], -1); _vm->_sound->command(27); } else if (_game._trigger == 1) { - if (_scene->_activeAnimation != nullptr) - _scene->_activeAnimation->resetSpriteSetsCount(); + if (_scene->_animation[0] != nullptr) + _scene->_animation[0]->resetSpriteSetsCount(); _vm->_dialogs->show(20516); _scene->_reloadSceneFlag = true; @@ -1405,9 +1405,9 @@ void Scene205::actions() { _vm->_dialogs->show(20503); else if (_action.isAction(VERB_LOOK, NOUN_HUT)) _vm->_dialogs->show(20504); - else if (_action.isAction(VERB_LOOK, NOUN_CHICKEN) && (_action._mainObjectSource == 4)) + else if (_action.isAction(VERB_LOOK, NOUN_CHICKEN) && (_action._mainObjectSource == CAT_HOTSPOT)) _vm->_dialogs->show(20505); - else if (_action.isAction(VERB_TAKE, NOUN_CHICKEN) && (_action._mainObjectSource == 4)) + else if (_action.isAction(VERB_TAKE, NOUN_CHICKEN) && (_action._mainObjectSource == CAT_HOTSPOT)) _vm->_dialogs->show(20506); else if (_action.isAction(VERB_LOOK, NOUN_CHICKEN_ON_SPIT)) _vm->_dialogs->show(20507); @@ -1746,9 +1746,9 @@ void Scene208::enter() { } void Scene208::step() { - if (_boundingFl && _scene->_activeAnimation && - (_rhotundaTime <= _scene->_activeAnimation->getCurrentFrame())) { - _rhotundaTime = _scene->_activeAnimation->getCurrentFrame(); + if (_boundingFl && _scene->_animation[0] && + (_rhotundaTime <= _scene->_animation[0]->getCurrentFrame())) { + _rhotundaTime = _scene->_animation[0]->getCurrentFrame(); if (_rhotundaTime == 125) _scene->_sequences.remove(_globals._sequenceIndexes[4]); @@ -4064,7 +4064,7 @@ void Scene210::setDialogNode(int node) { _vm->_palette->lock(); _scene->_kernelMessages.reset(); _scene->freeAnimation(); - _scene->_activeAnimation = nullptr; + _scene->_animation[0] = nullptr; _scene->resetScene(); _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', -1)); @@ -4109,7 +4109,7 @@ void Scene210::setDialogNode(int node) { } void Scene210::handleTwinklesSpeech(int quoteId, int shiftX, uint32 delay) { - _scene->_kernelMessages.add(Common::Point(10, 70 + (shiftX * 14)), 0xFDFC, 0, 0, (delay == 0) ? 9999999 : delay, _game.getQuote(quoteId)); + _scene->_kernelMessages.add(Common::Point(10, 70 + (shiftX * 14)), 0xFDFC, 0, 0, (delay == 0) ? INDEFINITE_TIMEOUT : delay, _game.getQuote(quoteId)); } void Scene210::newNode(int node) { @@ -4263,8 +4263,8 @@ void Scene210::enter() { } restoreDialogNode(_curDialogNode, quote, number); - if (_scene->_activeAnimation) - _scene->_activeAnimation->setCurrentFrame(131); + if (_scene->_animation[0]) + _scene->_animation[0]->setCurrentFrame(131); } _vm->_palette->setEntry(252, 63, 63, 10); @@ -4274,9 +4274,9 @@ void Scene210::enter() { } void Scene210::step() { - if ((_twinkleAnimationType == 1) && _scene->_activeAnimation) { - if (_twinklesCurrentFrame != _scene->_activeAnimation->getCurrentFrame()) { - _twinklesCurrentFrame = _scene->_activeAnimation->getCurrentFrame(); + if ((_twinkleAnimationType == 1) && _scene->_animation[0]) { + if (_twinklesCurrentFrame != _scene->_animation[0]->getCurrentFrame()) { + _twinklesCurrentFrame = _scene->_animation[0]->getCurrentFrame(); int reset_frame = -1; int random = _vm->getRandomNumber(1, 1000); @@ -4396,8 +4396,8 @@ void Scene210::step() { } if (reset_frame >= 0) { - if (reset_frame != _scene->_activeAnimation->getCurrentFrame()) { - _scene->_activeAnimation->setCurrentFrame(reset_frame); + if (reset_frame != _scene->_animation[0]->getCurrentFrame()) { + _scene->_animation[0]->setCurrentFrame(reset_frame); _twinklesCurrentFrame = reset_frame; } @@ -4411,9 +4411,9 @@ void Scene210::step() { } } - if ((_twinkleAnimationType == 2) && _scene->_activeAnimation) { - if (_twinklesCurrentFrame != _scene->_activeAnimation->getCurrentFrame()) { - _twinklesCurrentFrame = _scene->_activeAnimation->getCurrentFrame(); + if ((_twinkleAnimationType == 2) && _scene->_animation[0]) { + if (_twinklesCurrentFrame != _scene->_animation[0]->getCurrentFrame()) { + _twinklesCurrentFrame = _scene->_animation[0]->getCurrentFrame(); int reset_frame = -1; if (_twinklesCurrentFrame == 53) { @@ -4422,8 +4422,8 @@ void Scene210::step() { } else if ((_twinklesCurrentFrame == 75) && _shouldTalk) reset_frame = 60; - if ((reset_frame >= 0) && (reset_frame != _scene->_activeAnimation->getCurrentFrame())) { - _scene->_activeAnimation->setCurrentFrame(reset_frame); + if ((reset_frame >= 0) && (reset_frame != _scene->_animation[0]->getCurrentFrame())) { + _scene->_animation[0]->setCurrentFrame(reset_frame); _twinklesCurrentFrame = reset_frame; } } @@ -4646,7 +4646,7 @@ void Scene211::enter() { _game._player._stepEnabled = false; _game._player._visible = false; _scene->loadAnimation(formAnimName('A', -1), 100); - _scene->_activeAnimation->setCurrentFrame(169); + _scene->_animation[0]->setCurrentFrame(169); } else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) { _game._player._playerPos = Common::Point(310, 31); _game._player._facing = FACING_SOUTHWEST; @@ -4725,8 +4725,8 @@ void Scene211::step() { } } - if (_ambushFl && (_scene->_activeAnimation->getCurrentFrame() > _monkeyFrame)) { - _monkeyFrame = _scene->_activeAnimation->getCurrentFrame(); + if (_ambushFl && (_scene->_animation[0]->getCurrentFrame() > _monkeyFrame)) { + _monkeyFrame = _scene->_animation[0]->getCurrentFrame(); switch (_monkeyFrame) { case 2: { int msgIndex = _scene->_kernelMessages.add(Common::Point(12, 4), 0xFDFC, 0, 0, 60, _game.getQuote(157)); @@ -4798,9 +4798,9 @@ void Scene211::step() { _wakeFl = false; } - if (_scene->_activeAnimation->getCurrentFrame() > _monkeyFrame) { - _monkeyFrame = _scene->_activeAnimation->getCurrentFrame(); - switch (_scene->_activeAnimation->getCurrentFrame()) { + if (_scene->_animation[0]->getCurrentFrame() > _monkeyFrame) { + _monkeyFrame = _scene->_animation[0]->getCurrentFrame(); + switch (_scene->_animation[0]->getCurrentFrame()) { case 177: { int msgIndex = _scene->_kernelMessages.add(Common::Point(63, _scrollY), 0x1110, 0, 0, 180, _game.getQuote(165)); _scene->_kernelMessages.setQuoted(msgIndex, 4, true); diff --git a/engines/mads/nebular/nebular_scenes3.cpp b/engines/mads/nebular/nebular_scenes3.cpp index 5a6edbf995..0fb13a706c 100644 --- a/engines/mads/nebular/nebular_scenes3.cpp +++ b/engines/mads/nebular/nebular_scenes3.cpp @@ -293,8 +293,8 @@ void Scene302::step() { if (_game._trigger == 71) _scene->_nextSceneId = 303; - if ((_scene->_activeAnimation != nullptr) && (_scene->_activeAnimation->getCurrentFrame() != _oldFrame)) { - _oldFrame = _scene->_activeAnimation->getCurrentFrame(); + if ((_scene->_animation[0] != nullptr) && (_scene->_animation[0]->getCurrentFrame() != _oldFrame)) { + _oldFrame = _scene->_animation[0]->getCurrentFrame(); if (_oldFrame == 147) { _game._objects.setRoom(OBJ_POISON_DARTS, 1); _game._objects.setRoom(OBJ_BLOWGUN, 1); @@ -551,7 +551,7 @@ void Scene307::handlePrisonerEncounter() { } } -void Scene307::handlePrisonerSpeech(int firstQuoteId, int number, long timeout) { +void Scene307::handlePrisonerSpeech(int firstQuoteId, int number, uint32 timeout) { int height = number * 14; int posY; @@ -581,13 +581,13 @@ void Scene307::setDialogNode(int node) { case 1: _globals[kMetBuddyBeast] = true; - handlePrisonerSpeech(0x10F, 2, 9999999); + handlePrisonerSpeech(0x10F, 2, INDEFINITE_TIMEOUT); _dialog1.start(); break; case 2: _globals[kMetBuddyBeast] = true; - handlePrisonerSpeech(0x111, 2, 9999999); + handlePrisonerSpeech(0x111, 2, INDEFINITE_TIMEOUT); _dialog1.start(); break; @@ -598,7 +598,7 @@ void Scene307::setDialogNode(int node) { case 5: _globals[kKnowsBuddyBeast] = true; - handlePrisonerSpeech(0x117, 2, 9999999); + handlePrisonerSpeech(0x117, 2, INDEFINITE_TIMEOUT); _dialog2.start(); break; @@ -609,7 +609,7 @@ void Scene307::setDialogNode(int node) { case 7: _globals[kKnowsBuddyBeast] = true; - handlePrisonerSpeech(0x124, 10, 9999999); + handlePrisonerSpeech(0x124, 10, INDEFINITE_TIMEOUT); _dialog2.write(0x11A, false); _dialog2.write(0x11B, true); _dialog2.write(0x120, true); @@ -617,7 +617,7 @@ void Scene307::setDialogNode(int node) { break; case 8: - handlePrisonerSpeech(0x12E, 6, 9999999); + handlePrisonerSpeech(0x12E, 6, INDEFINITE_TIMEOUT); _dialog2.write(0x11A, false); _dialog2.write(0x11B, false); _dialog2.write(0x11C, true); @@ -627,38 +627,38 @@ void Scene307::setDialogNode(int node) { break; case 9: - handlePrisonerSpeech(0x134, 4, 9999999); + handlePrisonerSpeech(0x134, 4, INDEFINITE_TIMEOUT); _dialog2.write(0x11D, false); _dialog2.start(); break; case 10: - handlePrisonerSpeech(0x138, 6, 9999999); + handlePrisonerSpeech(0x138, 6, INDEFINITE_TIMEOUT); _dialog2.write(0x11E, false); _dialog2.start(); break; case 11: - handlePrisonerSpeech(0x13E, 6, 9999999); + handlePrisonerSpeech(0x13E, 6, INDEFINITE_TIMEOUT); _dialog2.write(0x11F, false); _dialog2.write(0x121, true); _dialog2.start(); break; case 12: - handlePrisonerSpeech(0x144, 4, 9999999); + handlePrisonerSpeech(0x144, 4, INDEFINITE_TIMEOUT); _dialog2.write(0x11C, false); _dialog2.start(); break; case 13: - handlePrisonerSpeech(0x148, 7, 9999999); + handlePrisonerSpeech(0x148, 7, INDEFINITE_TIMEOUT); _dialog2.write(0x120, false); _dialog2.start(); break; case 14: - handlePrisonerSpeech(0x14F, 3, 9999999); + handlePrisonerSpeech(0x14F, 3, INDEFINITE_TIMEOUT); _dialog2.write(0x121, false); _dialog2.start(); break; @@ -670,7 +670,7 @@ void Scene307::setDialogNode(int node) { case 16: _globals[kKnowsBuddyBeast] = true; - handlePrisonerSpeech(0x10C, 1, 9999999); + handlePrisonerSpeech(0x10C, 1, INDEFINITE_TIMEOUT); _dialog2.start(); break; @@ -828,23 +828,23 @@ void Scene307::enter() { void Scene307::step() { handleForceField(&_forceField, &_globals._spriteIndexes[0]); - if ((_animationMode == 1) && (_scene->_activeAnimation != nullptr)) { - if (_scene->_activeAnimation->getCurrentFrame() == 126) { + if ((_animationMode == 1) && (_scene->_animation[0] != nullptr)) { + if (_scene->_animation[0]->getCurrentFrame() == 126) { _forceField._flag = false; _vm->_sound->command(5); } - if (_scene->_activeAnimation->getCurrentFrame() == 194) { + if (_scene->_animation[0]->getCurrentFrame() == 194) { _forceField._flag = true; _vm->_sound->command(24); } } - if ((_animationMode == 2) && (_scene->_activeAnimation != nullptr)) { - if (_scene->_activeAnimation->getCurrentFrame() == 54) + if ((_animationMode == 2) && (_scene->_animation[0] != nullptr)) { + if (_scene->_animation[0]->getCurrentFrame() == 54) _forceField._flag = false; - if (_scene->_activeAnimation->getCurrentFrame() == 150) { + if (_scene->_animation[0]->getCurrentFrame() == 150) { _game._player._visible = false; _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount; } @@ -869,7 +869,7 @@ void Scene307::step() { } _lastFrameTime = _scene->_frameStartTime; - if ((_guardTime > 3000) && !_duringPeeingFl && (_scene->_activeAnimation == nullptr) + if ((_guardTime > 3000) && !_duringPeeingFl && (_scene->_animation[0] == nullptr) && (_game._screenObjects._inputMode != kInputConversation) && _globals[kMetBuddyBeast] && !_activePrisonerFl) { if (!_game._objects.isInInventory(OBJ_SCALPEL) && !_grateOpenedFl) { _game._player._stepEnabled = false; @@ -879,7 +879,7 @@ void Scene307::step() { _scene->loadAnimation(formAnimName('b', -1), 70); } _guardTime = 0; - } else if ((_prisonerTimer > 300) && (_game._screenObjects._inputMode != kInputConversation) && (_scene->_activeAnimation == nullptr) && !_activePrisonerFl) { + } else if ((_prisonerTimer > 300) && (_game._screenObjects._inputMode != kInputConversation) && (_scene->_animation[0] == nullptr) && !_activePrisonerFl) { if (!_globals[kMetBuddyBeast]) { int idx = _scene->_kernelMessages.add(Common::Point(5, 51), 0xFDFC, 0, 81, 120, _game.getQuote(_prisonerMessageId)); _scene->_kernelMessages.setQuoted(idx, 4, true); @@ -1380,9 +1380,9 @@ void Scene309::enter() { _game._player._stepEnabled = false; _scene->loadAnimation(formAnimName('a', -1), 60); - _characterSpriteIndexes[0] = _scene->_activeAnimation->_spriteListIndexes[2]; - _characterSpriteIndexes[1] = _scene->_activeAnimation->_spriteListIndexes[2]; - _characterSpriteIndexes[2] = _scene->_activeAnimation->_spriteListIndexes[1]; + _characterSpriteIndexes[0] = _scene->_animation[0]->_spriteListIndexes[2]; + _characterSpriteIndexes[1] = _scene->_animation[0]->_spriteListIndexes[2]; + _characterSpriteIndexes[2] = _scene->_animation[0]->_spriteListIndexes[1]; _messagesIndexes[0] = -1; _messagesIndexes[1] = -1; @@ -1404,9 +1404,9 @@ void Scene309::step() { if (_game._trigger == 62) _messagesIndexes[2] = -1; - if (_scene->_activeAnimation != nullptr) { - if (_lastFrame != _scene->_activeAnimation->getCurrentFrame()) { - _lastFrame = _scene->_activeAnimation->getCurrentFrame(); + if (_scene->_animation[0] != nullptr) { + if (_lastFrame != _scene->_animation[0]->getCurrentFrame()) { + _lastFrame = _scene->_animation[0]->getCurrentFrame(); if (_lastFrame == 39) { _messagesIndexes[0] = _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 32, 61, 210, _game.getQuote(348)); _messagesIndexes[1] = _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 32, 0, 210, _game.getQuote(349)); @@ -1419,15 +1419,15 @@ void Scene309::step() { if (_messagesIndexes[charIdx] >= 0) { bool match = false; int j = -1; - for (j = _scene->_activeAnimation->_oldFrameEntry; j < _scene->_activeAnimation->_header._frameEntriesCount; j++) { - if (_scene->_activeAnimation->_frameEntries[j]._spriteSlot._spritesIndex == _characterSpriteIndexes[charIdx]) { + for (j = _scene->_animation[0]->_oldFrameEntry; j < _scene->_animation[0]->_header._frameEntriesCount; j++) { + if (_scene->_animation[0]->_frameEntries[j]._spriteSlot._spritesIndex == _characterSpriteIndexes[charIdx]) { match = true; break; } } if (match) { - SpriteSlotSubset *curSpriteSlot = &_scene->_activeAnimation->_frameEntries[j]._spriteSlot; + SpriteSlotSubset *curSpriteSlot = &_scene->_animation[0]->_frameEntries[j]._spriteSlot; _scene->_kernelMessages._entries[_messagesIndexes[charIdx]]._position.x = curSpriteSlot->_position.x; _scene->_kernelMessages._entries[_messagesIndexes[charIdx]]._position.y = curSpriteSlot->_position.y - (50 + (14 * ((charIdx == 0) ? 2 : 1))); } @@ -2465,59 +2465,59 @@ void Scene318::handleDialog() { switch (_action._activeAction._verbId) { case 0x191: - handleInternDialog(0x19E, 2, 9999999); + handleInternDialog(0x19E, 2, INDEFINITE_TIMEOUT); _dialog1.write(0x192, true); break; case 0x192: - handleInternDialog(0x1A0, 5, 9999999); + handleInternDialog(0x1A0, 5, INDEFINITE_TIMEOUT); _dialog1.write(0x193, true); break; case 0x193: - handleInternDialog(0x1A5, 4, 9999999); + handleInternDialog(0x1A5, 4, INDEFINITE_TIMEOUT); _dialog1.write(0x194, true); break; case 0x194: - handleInternDialog(0x1A9, 6, 9999999); + handleInternDialog(0x1A9, 6, INDEFINITE_TIMEOUT); _dialog1.write(0x195, true); _dialog1.write(0x196, true); _dialog1.write(0x19D, false); break; case 0x195: - handleInternDialog(0x1AF, 7, 9999999); + handleInternDialog(0x1AF, 7, INDEFINITE_TIMEOUT); if (!_dialog1.read(0x196)) _dialog1.write(0x197, true); break; case 0x196: - handleInternDialog(0x1B6, 5, 9999999); + handleInternDialog(0x1B6, 5, INDEFINITE_TIMEOUT); if (!_dialog1.read(0x195)) _dialog1.write(0x197, true); break; case 0x197: - handleInternDialog(0x1BB, 5, 9999999); + handleInternDialog(0x1BB, 5, INDEFINITE_TIMEOUT); break; case 0x198: - handleInternDialog(0x1C0, 5, 9999999); + handleInternDialog(0x1C0, 5, INDEFINITE_TIMEOUT); _dialog1.write(0x19A, true); break; case 0x199: - handleInternDialog(0x1C5, 3, 9999999); + handleInternDialog(0x1C5, 3, INDEFINITE_TIMEOUT); break; case 0x19A: - handleInternDialog(0x1C8, 5, 9999999); + handleInternDialog(0x1C8, 5, INDEFINITE_TIMEOUT); _dialog1.write(0x19B, true); break; case 0x19B: - handleInternDialog(0x1CD, 3, 9999999); + handleInternDialog(0x1CD, 3, INDEFINITE_TIMEOUT); break; case 0x19C: @@ -2602,7 +2602,7 @@ void Scene318::enter() { if (_globals[kAfterHavoc]) { _scene->loadAnimation(formAnimName('f', -1)); - _scene->_activeAnimation->_resetFlag = true; + _scene->_animation[0]->_resetFlag = true; } else if (!_globals[kHasSeenProfPyro]) { _scene->_hotspots.activate(NOUN_PROFESSORS_GURNEY, false); _scene->_hotspots.activate(NOUN_PROFESSOR, false); @@ -2655,7 +2655,7 @@ void Scene318::enter() { 0x1C8, 0x1C9, 0x1CA, 0x1CB, 0x1CC, 0x1CD, 0x1CE, 0x1CF, 0x1D0, 0x1D1, 0x1D2, 0x1D3, 0x190, 0x19D, 0); - if ((_scene->_priorSceneId == RETURNING_FROM_DIALOG) || (((_scene->_priorSceneId == 318) || + if ((_scene->_priorSceneId == RETURNING_FROM_DIALOG) || (((_scene->_priorSceneId == 318) || (_scene->_priorSceneId == RETURNING_FROM_LOADING)) && (!_globals[kAfterHavoc]))) { if (!_globals[kAfterHavoc]) { _game._player._visible = false; @@ -2705,9 +2705,9 @@ void Scene318::enter() { } void Scene318::step() { - if ((_scene->_activeAnimation != nullptr) && (_animMode == 2)) { - if (_lastFrame != _scene->_activeAnimation->getCurrentFrame()) { - _lastFrame = _scene->_activeAnimation->getCurrentFrame(); + if ((_scene->_animation[0] != nullptr) && (_animMode == 2)) { + if (_lastFrame != _scene->_animation[0]->getCurrentFrame()) { + _lastFrame = _scene->_animation[0]->getCurrentFrame(); int nextFrame = -1; switch (_lastFrame) { @@ -2759,8 +2759,8 @@ void Scene318::step() { break; } - if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) { - _scene->_activeAnimation->setCurrentFrame(nextFrame); + if ((nextFrame >= 0) && (nextFrame != _scene->_animation[0]->getCurrentFrame())) { + _scene->_animation[0]->setCurrentFrame(nextFrame); _lastFrame = nextFrame; } } @@ -2865,7 +2865,7 @@ void Scene318::actions() { case 1: _game._player._stepEnabled = true; - handleInternDialog(0x18F, 1, 9999999); + handleInternDialog(0x18F, 1, INDEFINITE_TIMEOUT); _dialog1.start(); break; @@ -3152,27 +3152,27 @@ void Scene319::enter() { _slacheInitFl = true; if (_globals[kRexHasMetSlache]) { - handleSlacheDialogs(VERB_WALK_OUTSIDE, 2, 9999999); + handleSlacheDialogs(VERB_WALK_OUTSIDE, 2, INDEFINITE_TIMEOUT); _slachePosY = 3; } else { - handleSlacheDialogs(0x186, 4, 9999999); + handleSlacheDialogs(0x186, 4, INDEFINITE_TIMEOUT); _slachePosY = 5; } } switch (_slacheTopic) { case 1: - handleSlacheDialogs(0x15F, 2, 9999999); + handleSlacheDialogs(0x15F, 2, INDEFINITE_TIMEOUT); _dialog1.start(); break; case 2: - handleSlacheDialogs(0x16B, 2, 9999999); + handleSlacheDialogs(0x16B, 2, INDEFINITE_TIMEOUT); _dialog2.start(); break; case 3: - handleSlacheDialogs(0x177, 2, 9999999); + handleSlacheDialogs(0x177, 2, INDEFINITE_TIMEOUT); _dialog3.start(); break; @@ -3185,11 +3185,11 @@ void Scene319::enter() { } void Scene319::step() { - if (_scene->_activeAnimation == nullptr) + if (_scene->_animation[0] == nullptr) return; - if (_animFrame != _scene->_activeAnimation->getCurrentFrame()) { - _animFrame = _scene->_activeAnimation->getCurrentFrame(); + if (_animFrame != _scene->_animation[0]->getCurrentFrame()) { + _animFrame = _scene->_animation[0]->getCurrentFrame(); int nextFrame = -1; if (_animMode == 1) { switch (_animFrame) { @@ -3305,8 +3305,8 @@ void Scene319::step() { if ((_animMode == 4) && (_animFrame == 16)) _vm->_screen._shakeCountdown = 80; - if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) { - _scene->_activeAnimation->setCurrentFrame(nextFrame); + if ((nextFrame >= 0) && (nextFrame != _scene->_animation[0]->getCurrentFrame())) { + _scene->_animation[0]->setCurrentFrame(nextFrame); _animFrame = nextFrame; } } @@ -3320,11 +3320,11 @@ void Scene319::step() { _scene->freeAnimation(); _scene->loadAnimation(formAnimName('b', 0)); if (_nextAction1 == 3) - _scene->_activeAnimation->setCurrentFrame(85); + _scene->_animation[0]->setCurrentFrame(85); else if (_nextAction1 == 1) - _scene->_activeAnimation->setCurrentFrame(40); + _scene->_animation[0]->setCurrentFrame(40); - _animFrame = _scene->_activeAnimation->getCurrentFrame(); + _animFrame = _scene->_animation[0]->getCurrentFrame(); _slacheTalkingFl = true; _vm->_screen._shakeCountdown = 1; @@ -3394,7 +3394,7 @@ void Scene319::actions() { if (!_slacheTalkingFl) { _scene->_sequences.addTimer(4, 2); } else { - handleSlacheDialogs(0x16B, 2, 9999999); + handleSlacheDialogs(0x16B, 2, INDEFINITE_TIMEOUT); _dialog2.start(); _game._player._stepEnabled = true; } @@ -3411,7 +3411,7 @@ void Scene319::actions() { if (!_slacheTalkingFl) { _scene->_sequences.addTimer(4, 2); } else { - handleSlacheDialogs(0x177, 2, 9999999); + handleSlacheDialogs(0x177, 2, INDEFINITE_TIMEOUT); _dialog3.start(); _game._player._stepEnabled = true; } @@ -3480,7 +3480,7 @@ void Scene319::actions() { curDialog = &_dialog3; } - handleSlacheDialogs(nextDocQuote, 2, 9999999); + handleSlacheDialogs(nextDocQuote, 2, INDEFINITE_TIMEOUT); if (addDialogLine) { curDialog->write(_action._activeAction._verbId, false); curDialog->write(addVerbId, true); @@ -3512,7 +3512,7 @@ void Scene319::actions() { curDialog = &_dialog3; } - handleSlacheDialogs(nextDocQuote, 2, 9999999); + handleSlacheDialogs(nextDocQuote, 2, INDEFINITE_TIMEOUT); if (addDialogLine) { curDialog->write(_action._activeAction._verbId, false); curDialog->write(addVerbId, true); @@ -3710,9 +3710,9 @@ void Scene320::enter() { } void Scene320::step() { - if (_scene->_activeAnimation != nullptr) { - if (_lastFrame != _scene->_activeAnimation->getCurrentFrame()) { - _lastFrame = _scene->_activeAnimation->getCurrentFrame(); + if (_scene->_animation[0] != nullptr) { + if (_lastFrame != _scene->_animation[0]->getCurrentFrame()) { + _lastFrame = _scene->_animation[0]->getCurrentFrame(); switch (_lastFrame) { case 95: _blinkFl = true; @@ -3892,8 +3892,8 @@ void Scene321::enter() { } void Scene321::step() { - if (_scene->_activeAnimation != nullptr) { - if ((_scene->_activeAnimation->getCurrentFrame() >= 260) && (_globals[kSexOfRex] == REX_MALE) && (_game._storyMode >= STORYMODE_NICE)) + if (_scene->_animation[0] != nullptr) { + if ((_scene->_animation[0]->getCurrentFrame() >= 260) && (_globals[kSexOfRex] == REX_MALE) && (_game._storyMode >= STORYMODE_NICE)) _scene->_nextSceneId = 316; } @@ -5045,7 +5045,7 @@ void Scene359::actions() { _vm->_dialogs->show(35918); else if (_action.isAction(VERB_TAKE, NOUN_LIMB)) _vm->_dialogs->show(35919); - else if (_action.isAction(VERB_LOOK, NOUN_SECURITY_CARD) && (_action._mainObjectSource == 4)) + else if (_action.isAction(VERB_LOOK, NOUN_SECURITY_CARD) && (_action._mainObjectSource == CAT_HOTSPOT)) _vm->_dialogs->show(35921); else if (_action.isAction(VERB_LOOK, NOUN_BLOOD_STAIN)) { if ((_game._difficulty != DIFFICULTY_HARD) && (_game._objects[OBJ_SECURITY_CARD]._roomNumber == 359)) diff --git a/engines/mads/nebular/nebular_scenes3.h b/engines/mads/nebular/nebular_scenes3.h index cf925b3867..af75b14193 100644 --- a/engines/mads/nebular/nebular_scenes3.h +++ b/engines/mads/nebular/nebular_scenes3.h @@ -158,7 +158,7 @@ private: void handlePrisonerDialog(); void handlePrisonerEncounter(); void setDialogNode(int node); - void handlePrisonerSpeech(int firstQuoteId, int number, long timeout); + void handlePrisonerSpeech(int firstQuoteId, int number, uint32 timeout); public: Scene307(MADSEngine *vm); diff --git a/engines/mads/nebular/nebular_scenes4.cpp b/engines/mads/nebular/nebular_scenes4.cpp index c981f6a6e4..d71fd9f8c9 100644 --- a/engines/mads/nebular/nebular_scenes4.cpp +++ b/engines/mads/nebular/nebular_scenes4.cpp @@ -396,7 +396,7 @@ void Scene402::handleConversation1() { break; } _scene->_kernelMessages.reset(); - _scene->_kernelMessages.add(Common::Point(quotePosX, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(quoteId)); + _scene->_kernelMessages.add(Common::Point(quotePosX, 41), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(quoteId)); _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON; _scene->_sequences.addTimer(1, 100); _talkTimer = 120; @@ -406,7 +406,7 @@ void Scene402::handleConversation1() { case 0x215: _scene->_kernelMessages.reset(); - _scene->_kernelMessages.add(Common::Point(260, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1EC)); + _scene->_kernelMessages.add(Common::Point(260, 41), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1EC)); _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON; _scene->_sequences.addTimer(1, 100); _talkTimer = 120; @@ -502,8 +502,8 @@ void Scene402::handleConversation2() { _scene->_sequences.addTimer(1, 100); _talkTimer = 180; _scene->_kernelMessages.reset(); - _scene->_kernelMessages.add(Common::Point(198, 27), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1E7)); - _scene->_kernelMessages.add(Common::Point(201, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1E8)); + _scene->_kernelMessages.add(Common::Point(198, 27), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1E7)); + _scene->_kernelMessages.add(Common::Point(201, 41), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1E8)); _bartenderCurrentQuestion = 7; break; @@ -512,8 +512,8 @@ void Scene402::handleConversation2() { _scene->_sequences.addTimer(1, 100); _talkTimer = 180; _scene->_kernelMessages.reset(); - _scene->_kernelMessages.add(Common::Point(220, 27), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1E9)); - _scene->_kernelMessages.add(Common::Point(190, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1EA)); + _scene->_kernelMessages.add(Common::Point(220, 27), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1E9)); + _scene->_kernelMessages.add(Common::Point(190, 41), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1EA)); _bartenderCurrentQuestion = 8; break; @@ -522,7 +522,7 @@ void Scene402::handleConversation2() { _scene->_sequences.addTimer(1, 100); _talkTimer = 150; _scene->_kernelMessages.reset(); - _scene->_kernelMessages.add(Common::Point(196, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1EB)); + _scene->_kernelMessages.add(Common::Point(196, 41), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1EB)); _bartenderCurrentQuestion = 9; break; @@ -548,8 +548,8 @@ void Scene402::handleConversation3() { _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON; _scene->_sequences.addTimer(1, 86); _scene->_kernelMessages.reset(); - _scene->_kernelMessages.add(Common::Point(188, 27), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1ED)); - _scene->_kernelMessages.add(Common::Point(199, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1EE)); + _scene->_kernelMessages.add(Common::Point(188, 27), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1ED)); + _scene->_kernelMessages.add(Common::Point(199, 41), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1EE)); setDialogNode(4); _bartenderCurrentQuestion = 2; break; @@ -799,47 +799,47 @@ void Scene402::enter() { switch (_bartenderCurrentQuestion) { case 1: - _scene->_kernelMessages.add(Common::Point(260, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1EC)); + _scene->_kernelMessages.add(Common::Point(260, 41), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1EC)); break; case 2: - _scene->_kernelMessages.add(Common::Point(188, 27), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1ED)); - _scene->_kernelMessages.add(Common::Point(199, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1EE)); + _scene->_kernelMessages.add(Common::Point(188, 27), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1ED)); + _scene->_kernelMessages.add(Common::Point(199, 41), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1EE)); break; case 3: - _scene->_kernelMessages.add(Common::Point(177, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1EF)); + _scene->_kernelMessages.add(Common::Point(177, 41), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1EF)); break; case 4: - _scene->_kernelMessages.add(Common::Point(205, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1E4)); + _scene->_kernelMessages.add(Common::Point(205, 41), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1E4)); break; case 5: - _scene->_kernelMessages.add(Common::Point(203, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1E5)); + _scene->_kernelMessages.add(Common::Point(203, 41), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1E5)); break; case 6: - _scene->_kernelMessages.add(Common::Point(260, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1E6)); + _scene->_kernelMessages.add(Common::Point(260, 41), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1E6)); break; case 7: - _scene->_kernelMessages.add(Common::Point(198, 27), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1E7)); - _scene->_kernelMessages.add(Common::Point(201, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1E8)); + _scene->_kernelMessages.add(Common::Point(198, 27), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1E7)); + _scene->_kernelMessages.add(Common::Point(201, 41), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1E8)); break; case 8: - _scene->_kernelMessages.add(Common::Point(220, 27), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1E9)); - _scene->_kernelMessages.add(Common::Point(190, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1EA)); + _scene->_kernelMessages.add(Common::Point(220, 27), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1E9)); + _scene->_kernelMessages.add(Common::Point(190, 41), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1EA)); break; case 9: - _scene->_kernelMessages.add(Common::Point(196, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1EB)); + _scene->_kernelMessages.add(Common::Point(196, 41), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1EB)); break; case 10: - _scene->_kernelMessages.add(Common::Point(198, 27), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1E2)); - _scene->_kernelMessages.add(Common::Point(199, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1E3)); + _scene->_kernelMessages.add(Common::Point(198, 27), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1E2)); + _scene->_kernelMessages.add(Common::Point(199, 41), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1E3)); break; default: @@ -876,7 +876,7 @@ void Scene402::enter() { _refuseAlienLiquor = false; _scene->loadAnimation(Resources::formatName(402, 'd', 1, EXT_AA, "")); - _scene->_activeAnimation->_resetFlag = true; + _scene->_animation[0]->_resetFlag = true; _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1); @@ -1536,43 +1536,43 @@ void Scene402::step() { if (_game._trigger == 32) _rightWomanMoving = false; - if (_scene->_activeAnimation->getCurrentFrame() == 1) { + if (_scene->_animation[0]->getCurrentFrame() == 1) { switch (_vm->getRandomNumber(1, 50)) { case 1: - _scene->_activeAnimation->setCurrentFrame(2); + _scene->_animation[0]->setCurrentFrame(2); break; case 2: - _scene->_activeAnimation->setCurrentFrame(7); + _scene->_animation[0]->setCurrentFrame(7); break; case 3: - _scene->_activeAnimation->setCurrentFrame(11); + _scene->_animation[0]->setCurrentFrame(11); break; default: - _scene->_activeAnimation->setCurrentFrame(0); + _scene->_animation[0]->setCurrentFrame(0); break; } } - if ((_scene->_activeAnimation->getCurrentFrame() == 4) && (_drinkTimer < 10)) { + if ((_scene->_animation[0]->getCurrentFrame() == 4) && (_drinkTimer < 10)) { ++ _drinkTimer; - _scene->_activeAnimation->setCurrentFrame(3); + _scene->_animation[0]->setCurrentFrame(3); } if (_drinkTimer == 10) { _drinkTimer = 0; - _scene->_activeAnimation->setCurrentFrame(4); - _scene->_activeAnimation->_currentFrame = 5; + _scene->_animation[0]->setCurrentFrame(4); + _scene->_animation[0]->_currentFrame = 5; } - switch (_scene->_activeAnimation->getCurrentFrame()) { + switch (_scene->_animation[0]->getCurrentFrame()) { case 6: case 10: case 14: - _scene->_activeAnimation->setCurrentFrame(0); + _scene->_animation[0]->setCurrentFrame(0); break; default: @@ -2268,8 +2268,8 @@ void Scene402::actions() { if (_game._objects.isInRoom(OBJ_ALIEN_LIQUOR)) { if (!_refuseAlienLiquor) { _scene->_kernelMessages.reset(); - _scene->_kernelMessages.add(Common::Point(198, 27), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1E2)); - _scene->_kernelMessages.add(Common::Point(199, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1E3)); + _scene->_kernelMessages.add(Common::Point(198, 27), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1E2)); + _scene->_kernelMessages.add(Common::Point(199, 41), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1E3)); _bartenderCurrentQuestion = 10; _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON; _scene->_sequences.addTimer(1, 100); @@ -2281,7 +2281,7 @@ void Scene402::actions() { _dialog1.start(); } else { - _scene->_kernelMessages.add(Common::Point(177, 41), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x1EF)); + _scene->_kernelMessages.add(Common::Point(177, 41), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x1EF)); _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON; _scene->_sequences.addTimer(1, 100); _talkTimer = 120; @@ -3126,36 +3126,36 @@ void Scene410::enter() { sceneEntrySound(); _scene->loadAnimation(Resources::formatName(410, 'r', -1, EXT_AA, "")); - _scene->_activeAnimation->_resetFlag = true; + _scene->_animation[0]->_resetFlag = true; } void Scene410::step() { - if (_scene->_activeAnimation->getCurrentFrame() == 1) { + if (_scene->_animation[0]->getCurrentFrame() == 1) { if (_vm->getRandomNumber(1, 30) == 1) - _scene->_activeAnimation->setCurrentFrame(2); + _scene->_animation[0]->setCurrentFrame(2); else - _scene->_activeAnimation->setCurrentFrame(0); + _scene->_animation[0]->setCurrentFrame(0); } - if (_scene->_activeAnimation->getCurrentFrame() == 9) { + if (_scene->_animation[0]->getCurrentFrame() == 9) { if (_vm->getRandomNumber(1, 30) == 1) - _scene->_activeAnimation->setCurrentFrame(10); + _scene->_animation[0]->setCurrentFrame(10); else - _scene->_activeAnimation->setCurrentFrame(8); + _scene->_animation[0]->setCurrentFrame(8); } - if (_scene->_activeAnimation->getCurrentFrame() == 5) { + if (_scene->_animation[0]->getCurrentFrame() == 5) { if (_vm->getRandomNumber(1, 30) == 1) - _scene->_activeAnimation->setCurrentFrame(6); + _scene->_animation[0]->setCurrentFrame(6); else - _scene->_activeAnimation->setCurrentFrame(4); + _scene->_animation[0]->setCurrentFrame(4); } - if (_scene->_activeAnimation->getCurrentFrame() == 3) { + if (_scene->_animation[0]->getCurrentFrame() == 3) { if (_vm->getRandomNumber(1, 2) == 1) - _scene->_activeAnimation->setCurrentFrame(4); + _scene->_animation[0]->setCurrentFrame(4); else // == 2 - _scene->_activeAnimation->setCurrentFrame(8); + _scene->_animation[0]->setCurrentFrame(8); } } @@ -3491,7 +3491,7 @@ void Scene411::handleDialog() { _game._player._priorTimer = _scene->_frameStartTime + _game._player._ticksAmount; _game._player._visible = false; _game._player._stepEnabled = false; - _scene->_activeAnimation->setCurrentFrame(_resetFrame); + _scene->_animation[0]->setCurrentFrame(_resetFrame); } _scene->_kernelMessages.reset(); _newQuantity = computeQuoteAndQuantity(); @@ -3661,16 +3661,16 @@ void Scene411::enter() { } _scene->loadAnimation(formAnimName('a', -1)); - _scene->_activeAnimation->setCurrentFrame(128); + _scene->_animation[0]->setCurrentFrame(128); _makeMushroomCloud = false; _killRox = false; } void Scene411::step() { - if (_scene->_activeAnimation != nullptr) { - if (_curAnimationFrame != _scene->_activeAnimation->getCurrentFrame()) { - _curAnimationFrame = _scene->_activeAnimation->getCurrentFrame(); + if (_scene->_animation[0] != nullptr) { + if (_curAnimationFrame != _scene->_animation[0]->getCurrentFrame()) { + _curAnimationFrame = _scene->_animation[0]->getCurrentFrame(); _resetFrame = -1; switch (_curAnimationFrame) { @@ -3738,14 +3738,14 @@ void Scene411::step() { break; } - if ((_resetFrame >= 0) && (_resetFrame != _scene->_activeAnimation->getCurrentFrame())) { - _scene->_activeAnimation->setCurrentFrame(_resetFrame); + if ((_resetFrame >= 0) && (_resetFrame != _scene->_animation[0]->getCurrentFrame())) { + _scene->_animation[0]->setCurrentFrame(_resetFrame); _curAnimationFrame = _resetFrame; } } } - if (_scene->_activeAnimation->getCurrentFrame() == 86) + if (_scene->_animation[0]->getCurrentFrame() == 86) _vm->_sound->command(59); } @@ -4113,10 +4113,10 @@ void Scene413::enter() { } void Scene413::step() { - if (_scene->_activeAnimation && _scene->_activeAnimation->getCurrentFrame() == 38) - _scene->_activeAnimation->setCurrentFrame(37); + if (_scene->_animation[0] && _scene->_animation[0]->getCurrentFrame() == 38) + _scene->_animation[0]->setCurrentFrame(37); - if (_scene->_activeAnimation && _scene->_activeAnimation->getCurrentFrame() == 21 && _canMove) { + if (_scene->_animation[0] && _scene->_animation[0]->getCurrentFrame() == 21 && _canMove) { _vm->_sound->command(27); _canMove = false; } diff --git a/engines/mads/nebular/nebular_scenes5.cpp b/engines/mads/nebular/nebular_scenes5.cpp index 95eb429193..3778a59eb3 100644 --- a/engines/mads/nebular/nebular_scenes5.cpp +++ b/engines/mads/nebular/nebular_scenes5.cpp @@ -722,9 +722,9 @@ void Scene504::enter() { } void Scene504::step() { - if ((_carAnimationMode == 1) && (_scene->_activeAnimation != nullptr)) { - if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) { - _carFrame = _scene->_activeAnimation->getCurrentFrame(); + if ((_carAnimationMode == 1) && (_scene->_animation[0] != nullptr)) { + if (_scene->_animation[0]->getCurrentFrame() != _carFrame) { + _carFrame = _scene->_animation[0]->getCurrentFrame(); int nextFrame; if (_carFrame == 1) @@ -732,8 +732,8 @@ void Scene504::step() { else nextFrame = -1; - if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) { - _scene->_activeAnimation->setCurrentFrame(nextFrame); + if ((nextFrame >= 0) && (nextFrame != _scene->_animation[0]->getCurrentFrame())) { + _scene->_animation[0]->setCurrentFrame(nextFrame); _carFrame = nextFrame; } } @@ -943,15 +943,15 @@ void Scene505::enter() { _game._player._stepEnabled = false; _frame = -1; _scene->loadAnimation(formAnimName('a', -1)); - _scene->_activeAnimation->setCurrentFrame(86); + _scene->_animation[0]->setCurrentFrame(86); sceneEntrySound(); _vm->_sound->command(16); } void Scene505::step() { - if (_frame != _scene->_activeAnimation->getCurrentFrame()) { - _frame = _scene->_activeAnimation->getCurrentFrame(); + if (_frame != _scene->_animation[0]->getCurrentFrame()) { + _frame = _scene->_animation[0]->getCurrentFrame(); int resetFrame = -1; switch (_frame) { @@ -1088,8 +1088,8 @@ void Scene505::step() { break; } - if ((resetFrame >= 0) && (resetFrame != _scene->_activeAnimation->getCurrentFrame())) { - _scene->_activeAnimation->setCurrentFrame(resetFrame); + if ((resetFrame >= 0) && (resetFrame != _scene->_animation[0]->getCurrentFrame())) { + _scene->_animation[0]->setCurrentFrame(resetFrame); _frame = resetFrame; } } @@ -1254,7 +1254,7 @@ void Scene506::step() { switch (_game._trigger) { case 70: _game._player._visible = true; - _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount; + _game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount; _scene->_sequences.addTimer(6, 71); break; @@ -1943,9 +1943,9 @@ void Scene511::enter() { } void Scene511::step() { - if ((_lineAnimationMode == 1) && _scene->_activeAnimation) { - if (_lineFrame != _scene->_activeAnimation->getCurrentFrame()) { - _lineFrame = _scene->_activeAnimation->getCurrentFrame(); + if ((_lineAnimationMode == 1) && _scene->_animation[0]) { + if (_lineFrame != _scene->_animation[0]->getCurrentFrame()) { + _lineFrame = _scene->_animation[0]->getCurrentFrame(); int resetFrame = -1; if ((_lineAnimationPosition == 2) && (_lineFrame == 14)) @@ -1961,8 +1961,8 @@ void Scene511::step() { resetFrame = 2; } - if ((resetFrame >= 0) && (resetFrame != _scene->_activeAnimation->getCurrentFrame())) { - _scene->_activeAnimation->setCurrentFrame(resetFrame); + if ((resetFrame >= 0) && (resetFrame != _scene->_animation[0]->getCurrentFrame())) { + _scene->_animation[0]->setCurrentFrame(resetFrame); _lineFrame = resetFrame; } } @@ -1971,7 +1971,7 @@ void Scene511::step() { switch (_game._trigger) { case 70: _game._player._visible = true; - _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount; + _game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount; _scene->_sequences.addTimer(6, 71); break; @@ -2009,7 +2009,7 @@ void Scene511::preActions() { _scene->loadAnimation(formAnimName('R',2), 1); } else if (_game._trigger == 1) { _game._player._visible = true; - _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount; + _game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount; _game._objects.setRoom(OBJ_FISHING_LINE, 1); _handingLine = false; _game._player._stepEnabled = true; @@ -2089,7 +2089,7 @@ void Scene511::actions() { } else { _vm->_dialogs->show(51130); } - } else if (_action.isAction(VERB_TIE, NOUN_FISHING_LINE, NOUN_BOAT) || + } else if (_action.isAction(VERB_TIE, NOUN_FISHING_LINE, NOUN_BOAT) || _action.isAction(VERB_ATTACH, NOUN_FISHING_LINE, NOUN_BOAT)) { if (_globals[kBoatRaised]) _vm->_dialogs->show(51131); @@ -2118,8 +2118,8 @@ void Scene511::actions() { _globals[kLineStatus] = 3; _game._player._stepEnabled = true; - if (_scene->_activeAnimation) - _scene->_activeAnimation->eraseSprites(); + if (_scene->_animation[0]) + _scene->_animation[0]->eraseSprites(); _game._player.update(); } } @@ -2159,9 +2159,9 @@ void Scene511::actions() { _vm->_dialogs->show(51128); } else if (_action.isAction(VERB_LOOK, NOUN_PORTHOLE)) _vm->_dialogs->show(51122); - else if (_action.isAction(VERB_LOOK, NOUN_FISHING_LINE) && (_action._mainObjectSource == 4) && (_globals[kLineStatus] == 2)) + else if (_action.isAction(VERB_LOOK, NOUN_FISHING_LINE) && (_action._mainObjectSource == CAT_HOTSPOT) && (_globals[kLineStatus] == 2)) _vm->_dialogs->show(51126); - else if (_action.isAction(VERB_LOOK, NOUN_FISHING_LINE) && (_action._mainObjectSource == 4) && (_globals[kLineStatus] == 3)) + else if (_action.isAction(VERB_LOOK, NOUN_FISHING_LINE) && (_action._mainObjectSource == CAT_HOTSPOT) && (_globals[kLineStatus] == 3)) _vm->_dialogs->show(51133); else if (_action.isAction(VERB_LOOK, NOUN_STATUE)) _vm->_dialogs->show(51127); @@ -2434,8 +2434,8 @@ void Scene512::actions() { _vm->_dialogs->show(51225); else if (_action.isAction(VERB_LOOK, NOUN_PADLOCK_KEY) && _game._objects.isInRoom(OBJ_PADLOCK_KEY)) _vm->_dialogs->show(51215); - else if (_action.isAction(VERB_LOOK, NOUN_FISHING_ROD) && (!_scene->_activeAnimation || - _scene->_activeAnimation->getCurrentFrame() == 4)) + else if (_action.isAction(VERB_LOOK, NOUN_FISHING_ROD) && (!_scene->_animation[0] || + _scene->_animation[0]->getCurrentFrame() == 4)) _vm->_dialogs->show(51216); else if (_action.isAction(VERB_LOOK, NOUN_SHIPS_WHEEL)) _vm->_dialogs->show(51218); @@ -2570,7 +2570,7 @@ void Scene513::step() { switch (_game._trigger) { case 70: _game._player._visible = true; - _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount; + _game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount; _scene->_sequences.addTimer(6, 71); break; diff --git a/engines/mads/nebular/nebular_scenes6.cpp b/engines/mads/nebular/nebular_scenes6.cpp index d97e37ea0b..e6e286392c 100644 --- a/engines/mads/nebular/nebular_scenes6.cpp +++ b/engines/mads/nebular/nebular_scenes6.cpp @@ -124,7 +124,7 @@ void Scene601::step() { switch (_game._trigger) { case 70: _game._player._visible = true; - _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount; + _game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount; _scene->_sequences.addTimer(30, 71); break; @@ -431,7 +431,7 @@ void Scene602::actions() { case 1: { _game._player._visible = true; - _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount; + _game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount; _lastSpriteIdx = _globals._spriteIndexes[3]; _lastSequenceIdx = _scene->_sequences.startCycle(_lastSpriteIdx, false, -1); _scene->_sequences.setDepth(_lastSequenceIdx, 14); @@ -684,7 +684,7 @@ void Scene603::actions() { _vm->_dialogs->show(60327); else _vm->_dialogs->show(60328); - } else if (_action.isAction(VERB_LOOK, NOUN_COMPACT_CASE) && (_action._mainObjectSource == 4)) + } else if (_action.isAction(VERB_LOOK, NOUN_COMPACT_CASE) && (_action._mainObjectSource == CAT_HOTSPOT)) _vm->_dialogs->show(60329); // For the next two checks, the second part of the check wasn't surrounded par parenthesis, which was obviously wrong else if (_action.isAction(VERB_LOOK) && (_action.isObject(NOUN_BRA) || _action.isObject(NOUN_BOA) || _action.isObject(NOUN_SLIP))) @@ -775,7 +775,7 @@ void Scene604::step() { switch (_game._trigger) { case 70: _game._player._visible = true; - _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount; + _game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount; _scene->_sequences.addTimer(30, 71); break; @@ -797,9 +797,9 @@ void Scene604::step() { break; } - if (_monsterActive && (_scene->_activeAnimation != nullptr)) { - if (_scene->_activeAnimation->getCurrentFrame() != _monsterFrame) { - _monsterFrame = _scene->_activeAnimation->getCurrentFrame(); + if (_monsterActive && (_scene->_animation[0] != nullptr)) { + if (_scene->_animation[0]->getCurrentFrame() != _monsterFrame) { + _monsterFrame = _scene->_animation[0]->getCurrentFrame(); int nextMonsterFrame = -1; switch (_monsterFrame) { @@ -837,7 +837,7 @@ void Scene604::step() { } if ((nextMonsterFrame >= 0) && (nextMonsterFrame != _monsterFrame)) { - _scene->_activeAnimation->setCurrentFrame(nextMonsterFrame); + _scene->_animation[0]->setCurrentFrame(nextMonsterFrame); _monsterFrame = nextMonsterFrame; } } @@ -1297,7 +1297,7 @@ void Scene607::step() { switch (_game._trigger) { case 80: _game._player._visible = true; - _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount; + _game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount; _scene->_sequences.addTimer(6, 81); break; @@ -1331,7 +1331,7 @@ void Scene607::handleThrowingBone() { case 1: _game._player._visible = true; - _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount; + _game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount; if (_animationMode != 1) _scene->_hotspots.activate(NOUN_OBNOXIOUS_DOG, false); @@ -1605,7 +1605,7 @@ void Scene608::restoreAnimations() { _scene->_sequences.remove(_globals._sequenceIndexes[6]); _scene->_sequences.remove(_globals._sequenceIndexes[7]); _scene->loadAnimation(formAnimName('A', -1)); - _scene->_activeAnimation->setCurrentFrame(6); + _scene->_animation[0]->setCurrentFrame(6); } } @@ -1757,7 +1757,7 @@ void Scene608::enter() { int idx = _scene->_dynamicHotspots.add(NOUN_CAR, VERB_WALKTO, -1, Common::Rect(100, 100, 100 + 82, 100 + 25)); _carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST); _scene->loadAnimation(formAnimName('A', -1)); - _scene->_activeAnimation->setCurrentFrame(6); + _scene->_animation[0]->setCurrentFrame(6); } else if (_globals[kCarStatus] == CAR_SQUASHES_DOG) { _carMode = 2; _dogDeathMode = 0; @@ -1927,13 +1927,13 @@ void Scene608::step() { _animationMode = 0; } - if ((_carMode == 4) && (_scene->_activeAnimation != nullptr)) { - if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) { - _carFrame = _scene->_activeAnimation->getCurrentFrame(); + if ((_carMode == 4) && (_scene->_animation[0] != nullptr)) { + if (_scene->_animation[0]->getCurrentFrame() != _carFrame) { + _carFrame = _scene->_animation[0]->getCurrentFrame(); if (_carFrame == 10) { _game._player._visible = true; - _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount; + _game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount; } else if (_carFrame == 56) { resetDogVariables(); _animationMode = 0; @@ -1942,12 +1942,12 @@ void Scene608::step() { } } - if ((_carMode == 5) && (_scene->_activeAnimation != nullptr)) { - if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) { - _carFrame = _scene->_activeAnimation->getCurrentFrame(); + if ((_carMode == 5) && (_scene->_animation[0] != nullptr)) { + if (_scene->_animation[0]->getCurrentFrame() != _carFrame) { + _carFrame = _scene->_animation[0]->getCurrentFrame(); if (_carFrame == 10) { _game._player._visible = true; - _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount; + _game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount; } else if (_carFrame == 52) { resetDogVariables(); _animationMode = 0; @@ -1956,13 +1956,13 @@ void Scene608::step() { } } - if ((_carMode == 6) && (_scene->_activeAnimation != nullptr)) { - if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) { - _carFrame = _scene->_activeAnimation->getCurrentFrame(); + if ((_carMode == 6) && (_scene->_animation[0] != nullptr)) { + if (_scene->_animation[0]->getCurrentFrame() != _carFrame) { + _carFrame = _scene->_animation[0]->getCurrentFrame(); if (_carFrame == 11) { _game._player._visible = true; - _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount; + _game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount; } else if (_carFrame == 41) { _globals._sequenceIndexes[10] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[10], false, 9, 0, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 10, 11); @@ -2000,9 +2000,9 @@ void Scene608::step() { if (_game._trigger == 112) _dogYelping = false; - if ((_carMode == 0) && (_scene->_activeAnimation != nullptr)) { - if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) { - _carFrame = _scene->_activeAnimation->getCurrentFrame(); + if ((_carMode == 0) && (_scene->_animation[0] != nullptr)) { + if (_scene->_animation[0]->getCurrentFrame() != _carFrame) { + _carFrame = _scene->_animation[0]->getCurrentFrame(); int nextFrame = -1; if ((_globals[kCarStatus] == CAR_UP) || (_globals[kCarStatus] == CAR_DOWN)) { @@ -2015,7 +2015,7 @@ void Scene608::step() { break; case 1: - if (_scene->_activeAnimation->getCurrentFrame() >= 12) { + if (_scene->_animation[0]->getCurrentFrame() >= 12) { nextFrame = 0; _carMoveMode = 0; _globals[kCarStatus] = CAR_UP; @@ -2023,7 +2023,7 @@ void Scene608::step() { break; case 2: - if (_scene->_activeAnimation->getCurrentFrame() >= 6) { + if (_scene->_animation[0]->getCurrentFrame() >= 6) { nextFrame = 6; _carMoveMode = 0; _globals[kCarStatus] = CAR_DOWN; @@ -2035,35 +2035,35 @@ void Scene608::step() { } } - if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) { - _scene->_activeAnimation->setCurrentFrame(nextFrame); + if ((nextFrame >= 0) && (nextFrame != _scene->_animation[0]->getCurrentFrame())) { + _scene->_animation[0]->setCurrentFrame(nextFrame); _carFrame = nextFrame; } } } - if ((_carMode == 2) && (_scene->_activeAnimation != nullptr)) { - if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) { - _carFrame = _scene->_activeAnimation->getCurrentFrame(); + if ((_carMode == 2) && (_scene->_animation[0] != nullptr)) { + if (_scene->_animation[0]->getCurrentFrame() != _carFrame) { + _carFrame = _scene->_animation[0]->getCurrentFrame(); int nextFrame = -1; if (_carMoveMode == 0) nextFrame = 28; - else if (_scene->_activeAnimation->getCurrentFrame() >= 28) { + else if (_scene->_animation[0]->getCurrentFrame() >= 28) { nextFrame = 28; _carMoveMode = 0; } - if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) { - _scene->_activeAnimation->setCurrentFrame(nextFrame); + if ((nextFrame >= 0) && (nextFrame != _scene->_animation[0]->getCurrentFrame())) { + _scene->_animation[0]->setCurrentFrame(nextFrame); _carFrame = nextFrame; } } } - if ((_carMode == 3) && (_scene->_activeAnimation != nullptr)) { - if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) { - _carFrame = _scene->_activeAnimation->getCurrentFrame(); + if ((_carMode == 3) && (_scene->_animation[0] != nullptr)) { + if (_scene->_animation[0]->getCurrentFrame() != _carFrame) { + _carFrame = _scene->_animation[0]->getCurrentFrame(); int nextFrame = -1; if (_resetPositionsFl) { @@ -2071,22 +2071,22 @@ void Scene608::step() { _carMoveMode = 0; } else if (_carMoveMode == 0) nextFrame = 6; - else if (_scene->_activeAnimation->getCurrentFrame() >= 6) { + else if (_scene->_animation[0]->getCurrentFrame() >= 6) { nextFrame = 6; _carMoveMode = 0; } - if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) { - _scene->_activeAnimation->setCurrentFrame(nextFrame); + if ((nextFrame >= 0) && (nextFrame != _scene->_animation[0]->getCurrentFrame())) { + _scene->_animation[0]->setCurrentFrame(nextFrame); _carFrame = nextFrame; } } } - if ((_carMode == 1) && (_scene->_activeAnimation != nullptr)) { - if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) { - _carFrame = _scene->_activeAnimation->getCurrentFrame(); + if ((_carMode == 1) && (_scene->_animation[0] != nullptr)) { + if (_scene->_animation[0]->getCurrentFrame() != _carFrame) { + _carFrame = _scene->_animation[0]->getCurrentFrame(); int nextFrame = -1; if (_resetPositionsFl) { @@ -2094,13 +2094,13 @@ void Scene608::step() { _carMoveMode = 0; } else if (_carMoveMode == 0) nextFrame = 6; - else if (_scene->_activeAnimation->getCurrentFrame() >= 6) { + else if (_scene->_animation[0]->getCurrentFrame() >= 6) { nextFrame = 6; _carMoveMode = 0; } - if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) { - _scene->_activeAnimation->setCurrentFrame(nextFrame); + if ((nextFrame >= 0) && (nextFrame != _scene->_animation[0]->getCurrentFrame())) { + _scene->_animation[0]->setCurrentFrame(nextFrame); _carFrame = nextFrame; } } @@ -2476,7 +2476,7 @@ void Scene608::actions() { _vm->_dialogs->show(60824); } else if (_action.isAction(VERB_OPEN, NOUN_STORAGE_BOX)) _vm->_dialogs->show(60826); - else if (_action.isAction(VERB_LOOK, NOUN_REARVIEW_MIRROR) && (_action._mainObjectSource == 4)) + else if (_action.isAction(VERB_LOOK, NOUN_REARVIEW_MIRROR) && (_action._mainObjectSource == CAT_HOTSPOT)) _vm->_dialogs->show(60828); else if (_action.isAction(VERB_LOOK, NOUN_TOOL_BOX)) { if (_game._objects[OBJ_POLYCEMENT]._roomNumber == _scene->_currentSceneId) @@ -2605,7 +2605,7 @@ void Scene609::step() { switch (_game._trigger) { case 70: _game._player._visible = true; - _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount; + _game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount; _scene->_sequences.addTimer(6, 71); break; @@ -3014,7 +3014,7 @@ void Scene610::actions() { _vm->_dialogs->show(61024); else if (_action.isAction(VERB_LOOK, NOUN_SPOTLIGHT)) _vm->_dialogs->show(61025); - else if (_action.isAction(VERB_LOOK, NOUN_PHONE_HANDSET) && (_action._mainObjectSource == 4)) + else if (_action.isAction(VERB_LOOK, NOUN_PHONE_HANDSET) && (_action._mainObjectSource == CAT_HOTSPOT)) _vm->_dialogs->show(61026); else if (_action.isAction(VERB_LOOK, NOUN_PHONE_CRADLE)) _vm->_dialogs->show(61027); @@ -3466,12 +3466,12 @@ void Scene611::displayHermitQuestions(int question) { Common::String curQuote = _game.getQuote(0x281); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x282); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); } break; @@ -3479,12 +3479,12 @@ void Scene611::displayHermitQuestions(int question) { Common::String curQuote = _game.getQuote(0x283); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x284); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); } break; @@ -3492,7 +3492,7 @@ void Scene611::displayHermitQuestions(int question) { Common::String curQuote = _game.getQuote(0x285); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); } break; @@ -3500,7 +3500,7 @@ void Scene611::displayHermitQuestions(int question) { Common::String curQuote = _game.getQuote(0x286); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); } break; @@ -3508,17 +3508,17 @@ void Scene611::displayHermitQuestions(int question) { Common::String curQuote = _game.getQuote(0x297); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y - 14), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y - 14), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x298); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x299); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); } break; @@ -3526,12 +3526,12 @@ void Scene611::displayHermitQuestions(int question) { Common::String curQuote = _game.getQuote(0x29A); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x29B); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); } break; @@ -3539,12 +3539,12 @@ void Scene611::displayHermitQuestions(int question) { Common::String curQuote = _game.getQuote(0x2A0); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2A1); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); } break; @@ -3552,17 +3552,17 @@ void Scene611::displayHermitQuestions(int question) { Common::String curQuote = _game.getQuote(0x2A2); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2A3); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2A4); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); } break; @@ -3570,12 +3570,12 @@ void Scene611::displayHermitQuestions(int question) { Common::String curQuote = _game.getQuote(0x2A5); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2A6); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); } break; @@ -3583,17 +3583,17 @@ void Scene611::displayHermitQuestions(int question) { Common::String curQuote = _game.getQuote(0x2A8); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2A9); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2AA); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); } break; @@ -3601,22 +3601,22 @@ void Scene611::displayHermitQuestions(int question) { Common::String curQuote = _game.getQuote(0x2AB); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2AC); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2AD); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2AE); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); } break; @@ -3624,22 +3624,22 @@ void Scene611::displayHermitQuestions(int question) { Common::String curQuote = _game.getQuote(0x2AF); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2B0); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2B1); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2B2); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); } break; @@ -3647,26 +3647,26 @@ void Scene611::displayHermitQuestions(int question) { Common::String curQuote = _game.getQuote(0x2B3); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 3), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 3), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2B4); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2B5); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2B6); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); - _scene->_kernelMessages.add(Common::Point(11, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x2B7)); - _scene->_kernelMessages.add(Common::Point(11, _defaultDialogPos.y + 73), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x2B8)); - _scene->_kernelMessages.add(Common::Point(11, _defaultDialogPos.y + 87), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x2B9)); + _scene->_kernelMessages.add(Common::Point(11, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x2B7)); + _scene->_kernelMessages.add(Common::Point(11, _defaultDialogPos.y + 73), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x2B8)); + _scene->_kernelMessages.add(Common::Point(11, _defaultDialogPos.y + 87), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(0x2B9)); } break; @@ -3674,22 +3674,22 @@ void Scene611::displayHermitQuestions(int question) { Common::String curQuote = _game.getQuote(0x2BA); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2BB); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2BC); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2BD); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); } break; @@ -3697,22 +3697,22 @@ void Scene611::displayHermitQuestions(int question) { Common::String curQuote = _game.getQuote(0x2BE); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2BF); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2C0); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2C1); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); } break; @@ -3720,27 +3720,27 @@ void Scene611::displayHermitQuestions(int question) { Common::String curQuote = _game.getQuote(0x2C2); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 3), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 3), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2C3); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2C4); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2C5); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2C6); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); } break; @@ -3748,22 +3748,22 @@ void Scene611::displayHermitQuestions(int question) { Common::String curQuote = _game.getQuote(0x2C7); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2C8); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2C0); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2CA); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); } break; @@ -3771,17 +3771,17 @@ void Scene611::displayHermitQuestions(int question) { Common::String curQuote = _game.getQuote(0x2CB); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2CC); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2CD); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); } break; @@ -3789,17 +3789,17 @@ void Scene611::displayHermitQuestions(int question) { Common::String curQuote = _game.getQuote(0x2CE); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2CF); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2D0); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); } break; @@ -3807,27 +3807,27 @@ void Scene611::displayHermitQuestions(int question) { Common::String curQuote = _game.getQuote(0x2E1); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 3), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 3), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2E2); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2E3); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2E4); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); curQuote = _game.getQuote(0x2E5); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); - _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote); + _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, INDEFINITE_TIMEOUT, curQuote); } break; @@ -3930,7 +3930,7 @@ void Scene611::enter() { 0x2D9, 0x2DA, 0x2DB, 0x2DC, 0x2DD, 0x2DE, 0x2DF, 0x2E0, 0x2E1, 0x2E2, 0x2E3, 0x2E4, 0x2E5, 0x2E6, 0x323, 0x324, 0); - _dialog1.setup(kConvHermit1, 0x287, 0x288, 0x289, 0x28A, 0x28B, 0x28C, 0x28D, 0x28E, 0x28F, 0x290, + _dialog1.setup(kConvHermit1, 0x287, 0x288, 0x289, 0x28A, 0x28B, 0x28C, 0x28D, 0x28E, 0x28F, 0x290, 0x291, 0x292, 0x293, 0x294, 0x295, 0x296, 0); _dialog2.setup(kConvHermit2, 0x29C, 0x29D, 0x29E, 0x29F, 0); @@ -4145,13 +4145,13 @@ void Scene611::step() { _hermitMovingFl = true; } - if (_stickFingerFl && (_scene->_activeAnimation->getCurrentFrame() == 47)) { + if (_stickFingerFl && (_scene->_animation[0]->getCurrentFrame() == 47)) { _stickFingerFl = false; _hermitMovingFl = true; _hermitMode = 1; } - if (_scene->_activeAnimation != nullptr && (_scene->_activeAnimation->getCurrentFrame() == 240) && _check1Fl) { + if (_scene->_animation[0] != nullptr && (_scene->_animation[0]->getCurrentFrame() == 240) && _check1Fl) { _check1Fl = false; _scene->_kernelMessages.add(Common::Point(33, 88), 0xFDFC, 0, 0, 90, _game.getQuote(0x27E)); _scene->_sequences.addTimer(120, 120); @@ -4240,7 +4240,7 @@ void Scene611::step() { } } - if (_scene->_activeAnimation != nullptr && _scene->_activeAnimation->getCurrentFrame() == 254) + if (_scene->_animation[0] != nullptr && _scene->_animation[0]->getCurrentFrame() == 254) _game._player._stepEnabled = true; if (_game._trigger == 110) { @@ -4266,7 +4266,7 @@ void Scene611::step() { } if (_hermitMode == 6) { - if ((_scene->_activeAnimation->getCurrentFrame() == 9) && _check1Fl) { + if ((_scene->_animation[0]->getCurrentFrame() == 9) && _check1Fl) { _scene->_sequences.remove(_globals._sequenceIndexes[3]); _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 7, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 2); @@ -4275,7 +4275,7 @@ void Scene611::step() { _check1Fl = false; } - if ((_scene->_activeAnimation->getCurrentFrame() == 17) && !_check1Fl) { + if ((_scene->_animation[0]->getCurrentFrame() == 17) && !_check1Fl) { _nextFrame = 26; _hermitMode = 4; _check1Fl = true; @@ -4283,13 +4283,13 @@ void Scene611::step() { } if (_hermitMode == 4) { - if ((_scene->_activeAnimation->getCurrentFrame() == 33) && _check1Fl) { + if ((_scene->_animation[0]->getCurrentFrame() == 33) && _check1Fl) { displayHermitQuestions(_hermitDisplayedQuestion); _nextFrame = 1; _check1Fl = false; } - if ((_scene->_activeAnimation->getCurrentFrame() == 9) && !_check1Fl) { + if ((_scene->_animation[0]->getCurrentFrame() == 9) && !_check1Fl) { _nextFrame = 8; _scene->_sequences.addTimer(1, 113); _check1Fl = true; @@ -4315,8 +4315,8 @@ void Scene611::step() { _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 115); } - if ((_nextFrame >= 0) && (_nextFrame != _scene->_activeAnimation->getCurrentFrame())) { - _scene->_activeAnimation->setCurrentFrame(_nextFrame); + if ((_nextFrame >= 0) && (_nextFrame != _scene->_animation[0]->getCurrentFrame())) { + _scene->_animation[0]->setCurrentFrame(_nextFrame); _nextFrame = -1; } @@ -4588,7 +4588,7 @@ void Scene612::step() { switch (_game._trigger) { case 70: _game._player._visible = true; - _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount; + _game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount; _scene->_sequences.addTimer(6, 71); break; diff --git a/engines/mads/nebular/nebular_scenes7.cpp b/engines/mads/nebular/nebular_scenes7.cpp index c2a249e5f8..6caebb7f79 100644 --- a/engines/mads/nebular/nebular_scenes7.cpp +++ b/engines/mads/nebular/nebular_scenes7.cpp @@ -361,7 +361,7 @@ void Scene701::actions() { case 1: { _game._player._visible = true; - _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount; + _game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount; _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1); _scene->_sequences.setDepth (_globals._sequenceIndexes[2], 9); int idx = _scene->_dynamicHotspots.add(NOUN_BOAT, VERB_CLIMB_INTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0)); @@ -498,7 +498,7 @@ void Scene702::actions() { _game._player._stepEnabled = false; _game._player._visible = false; _scene->_nextSceneId = 711; - } else if (_action.isAction(VERB_TAKE, NOUN_BONES) && (_action._mainObjectSource == 4) && (!_game._objects.isInInventory(OBJ_BONES) || _game._trigger)) { + } else if (_action.isAction(VERB_TAKE, NOUN_BONES) && (_action._mainObjectSource == CAT_HOTSPOT) && (!_game._objects.isInInventory(OBJ_BONES) || _game._trigger)) { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; @@ -537,9 +537,9 @@ void Scene702::actions() { _vm->_dialogs->show(70215); else if (_action.isAction(VERB_LOOK, NOUN_TELEPORTER)) _vm->_dialogs->show(70216); - else if (_action.isAction(VERB_LOOK, NOUN_BONES) && (_action._mainObjectSource == 4)) + else if (_action.isAction(VERB_LOOK, NOUN_BONES) && (_action._mainObjectSource == CAT_HOTSPOT)) _vm->_dialogs->show(70217); - else if (_action.isAction(VERB_TAKE, NOUN_BONES) && (_action._mainObjectSource == 4)) { + else if (_action.isAction(VERB_TAKE, NOUN_BONES) && (_action._mainObjectSource == CAT_HOTSPOT)) { if (_game._objects.isInInventory(OBJ_BONES)) _vm->_dialogs->show(70219); } else if (_action.isAction(VERB_LOOK, NOUN_SUBMERGED_CITY)) @@ -694,7 +694,7 @@ void Scene703::enter() { _boatDir = 2; _monsterMode = 0; _scene->loadAnimation(formAnimName('A', -1)); - _scene->_activeAnimation->setCurrentFrame(34); + _scene->_animation[0]->setCurrentFrame(34); } else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) { _game._player._stepEnabled = false; _boatDir = 1; @@ -712,17 +712,17 @@ void Scene703::enter() { _boatDir = 1; _monsterMode = 1; _scene->loadAnimation(formAnimName('B', -1)); - _scene->_activeAnimation->setCurrentFrame(39); + _scene->_animation[0]->setCurrentFrame(39); } else if (_boatDir == 1) { _curSequence = 0; _monsterMode = 0; _scene->loadAnimation(formAnimName('A', -1)); - _scene->_activeAnimation->setCurrentFrame(9); + _scene->_animation[0]->setCurrentFrame(9); } else if (_boatDir == 2) { _curSequence = 0; _monsterMode = 0; _scene->loadAnimation(formAnimName('A', -1)); - _scene->_activeAnimation->setCurrentFrame(56); + _scene->_animation[0]->setCurrentFrame(56); } if (_scene->_roomChanged) { @@ -764,9 +764,9 @@ void Scene703::step() { if (_game._trigger == 70) _scene->_reloadSceneFlag = true; - if ((_monsterMode == 3) && (_scene->_activeAnimation != nullptr)) { - if (_scene->_activeAnimation->getCurrentFrame() != _boatFrame) { - _boatFrame = _scene->_activeAnimation->getCurrentFrame(); + if ((_monsterMode == 3) && (_scene->_animation[0] != nullptr)) { + if (_scene->_animation[0]->getCurrentFrame() != _boatFrame) { + _boatFrame = _scene->_animation[0]->getCurrentFrame(); int nextBoatFrame = -1; if (_boatFrame == 62) { @@ -777,8 +777,8 @@ void Scene703::step() { } } - if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_activeAnimation->getCurrentFrame())) { - _scene->_activeAnimation->setCurrentFrame(nextBoatFrame); + if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_animation[0]->getCurrentFrame())) { + _scene->_animation[0]->setCurrentFrame(nextBoatFrame); _boatFrame = nextBoatFrame; } } @@ -787,9 +787,9 @@ void Scene703::step() { if (_game._trigger == 70) _scene->_reloadSceneFlag = true; - if ((_monsterMode == 0) && (_scene->_activeAnimation != nullptr)) { - if (_scene->_activeAnimation->getCurrentFrame() != _boatFrame) { - _boatFrame = _scene->_activeAnimation->getCurrentFrame(); + if ((_monsterMode == 0) && (_scene->_animation[0] != nullptr)) { + if (_scene->_animation[0]->getCurrentFrame() != _boatFrame) { + _boatFrame = _scene->_animation[0]->getCurrentFrame(); int nextBoatFrame = -1; switch (_boatFrame) { @@ -860,8 +860,8 @@ void Scene703::step() { break; } - if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_activeAnimation->getCurrentFrame())) { - _scene->_activeAnimation->setCurrentFrame(nextBoatFrame); + if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_animation[0]->getCurrentFrame())) { + _scene->_animation[0]->setCurrentFrame(nextBoatFrame); _boatFrame = nextBoatFrame; } } @@ -895,9 +895,9 @@ void Scene703::step() { } - if ((_monsterMode == 1) && (_scene->_activeAnimation != nullptr)) { - if (_scene->_activeAnimation->getCurrentFrame() != _boatFrame) { - _boatFrame = _scene->_activeAnimation->getCurrentFrame(); + if ((_monsterMode == 1) && (_scene->_animation[0] != nullptr)) { + if (_scene->_animation[0]->getCurrentFrame() != _boatFrame) { + _boatFrame = _scene->_animation[0]->getCurrentFrame(); int nextBoatFrame = -1; switch (_boatFrame) { @@ -934,16 +934,16 @@ void Scene703::step() { break; } - if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_activeAnimation->getCurrentFrame())) { - _scene->_activeAnimation->setCurrentFrame(nextBoatFrame); + if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_animation[0]->getCurrentFrame())) { + _scene->_animation[0]->setCurrentFrame(nextBoatFrame); _boatFrame = nextBoatFrame; } } } - if ((_monsterMode == 2) && (_scene->_activeAnimation != nullptr)) { - if (_scene->_activeAnimation->getCurrentFrame() != _boatFrame) { - _boatFrame = _scene->_activeAnimation->getCurrentFrame(); + if ((_monsterMode == 2) && (_scene->_animation[0] != nullptr)) { + if (_scene->_animation[0]->getCurrentFrame() != _boatFrame) { + _boatFrame = _scene->_animation[0]->getCurrentFrame(); int nextBoatFrame = -1; switch (_boatFrame) { @@ -983,7 +983,7 @@ void Scene703::step() { _scene->freeAnimation(); _monsterMode = 1; _scene->loadAnimation(formAnimName('B', -1)); - _scene->_activeAnimation->setCurrentFrame(39); + _scene->_animation[0]->setCurrentFrame(39); _game._player._stepEnabled = true; break; @@ -992,7 +992,7 @@ void Scene703::step() { _scene->freeAnimation(); _monsterMode = 1; _scene->loadAnimation(formAnimName('B', -1)); - _scene->_activeAnimation->setCurrentFrame(39); + _scene->_animation[0]->setCurrentFrame(39); _game._player._stepEnabled = true; } else _game._objects.setRoom(OBJ_CHICKEN_BOMB, 1); @@ -1005,7 +1005,7 @@ void Scene703::step() { _scene->freeAnimation(); _monsterMode = 0; _scene->loadAnimation(formAnimName('A', -1)); - _scene->_activeAnimation->setCurrentFrame(9); + _scene->_animation[0]->setCurrentFrame(9); _game._player._stepEnabled = true; if (_game._storyMode == STORYMODE_NAUGHTY) _vm->_dialogs->show(70321); @@ -1018,8 +1018,8 @@ void Scene703::step() { break; } - if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_activeAnimation->getCurrentFrame())) { - _scene->_activeAnimation->setCurrentFrame(nextBoatFrame); + if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_animation[0]->getCurrentFrame())) { + _scene->_animation[0]->setCurrentFrame(nextBoatFrame); _boatFrame = nextBoatFrame; } } @@ -1055,7 +1055,7 @@ void Scene703::actions() { _scene->freeAnimation(); _monsterMode = 2; _scene->loadAnimation(formAnimName('C', -1)); - _scene->_activeAnimation->setCurrentFrame(19); + _scene->_animation[0]->setCurrentFrame(19); } else if (_action.isAction(VERB_THROW, NOUN_CHICKEN, NOUN_SEA_MONSTER)) { _game._player._stepEnabled = false; _scene->freeAnimation(); @@ -1066,13 +1066,13 @@ void Scene703::actions() { _scene->freeAnimation(); _monsterMode = 2; _scene->loadAnimation(formAnimName('C', -1)); - _scene->_activeAnimation->setCurrentFrame(39); + _scene->_animation[0]->setCurrentFrame(39); } else if (_action.isAction(VERB_THROW, NOUN_BOMB, NOUN_SEA_MONSTER)) { _game._player._stepEnabled = false; _scene->freeAnimation(); _monsterMode = 2; _scene->loadAnimation(formAnimName('C', -1)); - _scene->_activeAnimation->setCurrentFrame(59); + _scene->_animation[0]->setCurrentFrame(59); } else if (_action.isAction(VERB_THROW, NOUN_CHICKEN_BOMB, NOUN_SEA_MONSTER)) { _useBomb = true; _game._player._stepEnabled = false; @@ -1241,21 +1241,21 @@ void Scene704::enter() { _animationMode = 2; _boatDirection = 2; _scene->loadAnimation(formAnimName('A', -1)); - _scene->_activeAnimation->setCurrentFrame(36); + _scene->_animation[0]->setCurrentFrame(36); } else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) { _game._player._stepEnabled = false; _boatDirection = 1; _scene->loadAnimation(formAnimName('A', -1)); } else if (_boatDirection == 1) { _scene->loadAnimation(formAnimName('A', -1)); - _scene->_activeAnimation->setCurrentFrame(8); + _scene->_animation[0]->setCurrentFrame(8); } else if (_boatDirection == 2) { if (_game._objects[OBJ_BOTTLE]._roomNumber == _scene->_currentSceneId) { _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(123, 125)); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1); } _scene->loadAnimation(formAnimName('A', -1)); - _scene->_activeAnimation->setCurrentFrame(57); + _scene->_animation[0]->setCurrentFrame(57); } if (_scene->_roomChanged) @@ -1269,9 +1269,9 @@ void Scene704::enter() { } void Scene704::step() { - if (_scene->_activeAnimation != nullptr) { - if (_scene->_activeAnimation->getCurrentFrame() != _boatCurrentFrame) { - _boatCurrentFrame = _scene->_activeAnimation->getCurrentFrame(); + if (_scene->_animation[0] != nullptr) { + if (_scene->_animation[0]->getCurrentFrame() != _boatCurrentFrame) { + _boatCurrentFrame = _scene->_animation[0]->getCurrentFrame(); int nextFrame = -1; switch (_boatCurrentFrame) { @@ -1377,8 +1377,8 @@ void Scene704::step() { break; } - if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) { - _scene->_activeAnimation->setCurrentFrame(nextFrame); + if ((nextFrame >= 0) && (nextFrame != _scene->_animation[0]->getCurrentFrame())) { + _scene->_animation[0]->setCurrentFrame(nextFrame); _boatCurrentFrame = nextFrame; } } @@ -1455,7 +1455,7 @@ void Scene704::actions() { _vm->_dialogs->show(70412); } else if (_action.isAction(VERB_LOOK, NOUN_VOLCANO_RIM)) _vm->_dialogs->show(70413); - else if (_action.isAction(VERB_LOOK, NOUN_BOTTLE) && (_action._mainObjectSource == 4)) + else if (_action.isAction(VERB_LOOK, NOUN_BOTTLE) && (_action._mainObjectSource == CAT_HOTSPOT)) _vm->_dialogs->show(70414); else if (_action.isAction(VERB_LOOK, NOUN_OPEN_WATER_TO_SOUTH)) _vm->_dialogs->show(70416); @@ -1906,9 +1906,9 @@ void Scene706::step() { _scene->_reloadSceneFlag = true; } - if (_scene->_activeAnimation != nullptr) { - if ((_animationMode != 0) && (_scene->_activeAnimation->getCurrentFrame() != _animationFrame)) { - _animationFrame = _scene->_activeAnimation->getCurrentFrame(); + if (_scene->_animation[0] != nullptr) { + if ((_animationMode != 0) && (_scene->_animation[0]->getCurrentFrame() != _animationFrame)) { + _animationFrame = _scene->_animation[0]->getCurrentFrame(); if (_animationFrame == 6) { _scene->_sequences.remove(_globals._sequenceIndexes[1]); @@ -2017,7 +2017,7 @@ void Scene706::actions() { _vm->_dialogs->show(70623); else if (_action.isAction(VERB_LOOK, NOUN_VASE) && (_game._objects[OBJ_VASE]._roomNumber == _scene->_currentSceneId)) _vm->_dialogs->show(70624); - else if (_action.isAction(VERB_LOOK, NOUN_BOTTLE) && (_action._mainObjectSource == 4)) + else if (_action.isAction(VERB_LOOK, NOUN_BOTTLE) && (_action._mainObjectSource == CAT_HOTSPOT)) _vm->_dialogs->show(70632); else return; diff --git a/engines/mads/nebular/nebular_scenes8.cpp b/engines/mads/nebular/nebular_scenes8.cpp index a904569624..951b270a1c 100644 --- a/engines/mads/nebular/nebular_scenes8.cpp +++ b/engines/mads/nebular/nebular_scenes8.cpp @@ -930,7 +930,7 @@ void Scene804::enter() { void Scene804::step() { if (!_messWithThrottle) { - if ((_throttleGone) && (_movingThrottle) && (_scene->_activeAnimation->getCurrentFrame() == 39)) { + if ((_throttleGone) && (_movingThrottle) && (_scene->_animation[0]->getCurrentFrame() == 39)) { _globals._sequenceIndexes[1] = _scene->_sequences.startCycle (_globals._spriteIndexes[1], false, 1); _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(133, 139)); @@ -938,7 +938,7 @@ void Scene804::step() { _throttleGone = false; } - if ((_movingThrottle) && (_scene->_activeAnimation->getCurrentFrame() == 42)) { + if ((_movingThrottle) && (_scene->_animation[0]->getCurrentFrame() == 42)) { _resetFrame = 0; _movingThrottle = false; } @@ -947,12 +947,12 @@ void Scene804::step() { _resetFrame = 42; } - if (_scene->_activeAnimation->getCurrentFrame() == 65) + if (_scene->_animation[0]->getCurrentFrame() == 65) _scene->_sequences.remove(_globals._sequenceIndexes[7]); switch (_game._storyMode) { case STORYMODE_NAUGHTY: - if (_scene->_activeAnimation->getCurrentFrame() == 81) { + if (_scene->_animation[0]->getCurrentFrame() == 81) { _resetFrame = 80; _globals[kInSpace] = false; _globals[kBeamIsUp] = true; @@ -964,7 +964,7 @@ void Scene804::step() { break; case STORYMODE_NICE: - if (_scene->_activeAnimation->getCurrentFrame() == 68) { + if (_scene->_animation[0]->getCurrentFrame() == 68) { _resetFrame = 66; _globals[kInSpace] = false; _globals[kBeamIsUp] = true; @@ -975,12 +975,12 @@ void Scene804::step() { } } - if (_scene->_activeAnimation->getCurrentFrame() == 34) { + if (_scene->_animation[0]->getCurrentFrame() == 34) { _resetFrame = 36; _scene->_sequences.remove(_globals._sequenceIndexes[1]); } - if (_scene->_activeAnimation->getCurrentFrame() == 37) { + if (_scene->_animation[0]->getCurrentFrame() == 37) { _resetFrame = 36; if (!_dontPullThrottleAgain) { _dontPullThrottleAgain = true; @@ -992,20 +992,20 @@ void Scene804::step() { _scene->_nextSceneId = 803; } - if ((_scene->_activeAnimation->getCurrentFrame() == 7) && (!_globals[kWindowFixed])) { + if ((_scene->_animation[0]->getCurrentFrame() == 7) && (!_globals[kWindowFixed])) { _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1); _scene->_sequences.addTimer(20, 110); _globals[kWindowFixed] = true; } - if (_scene->_activeAnimation->getCurrentFrame() == 10) { + if (_scene->_animation[0]->getCurrentFrame() == 10) { _resetFrame = 0; _game._player._stepEnabled = true; _game._objects.setRoom(OBJ_POLYCEMENT, NOWHERE); } // FIXME: Original doesn't have resetFrame check. Check why this has been needed - if (_resetFrame == -1 && _scene->_activeAnimation->getCurrentFrame() == 1) { + if (_resetFrame == -1 && _scene->_animation[0]->getCurrentFrame() == 1) { int randomVal = _vm->getRandomNumber(29) + 1; switch (randomVal) { case 1: @@ -1023,7 +1023,7 @@ void Scene804::step() { } } - switch (_scene->_activeAnimation->getCurrentFrame()) { + switch (_scene->_animation[0]->getCurrentFrame()) { case 26: case 28: case 31: @@ -1031,12 +1031,12 @@ void Scene804::step() { break; } } else { - if ((_scene->_activeAnimation->getCurrentFrame() == 36) && (!_throttleGone)) { + if ((_scene->_animation[0]->getCurrentFrame() == 36) && (!_throttleGone)) { _scene->_sequences.remove(_globals._sequenceIndexes[1]); _throttleGone = true; } - if (_scene->_activeAnimation->getCurrentFrame() == 39) { + if (_scene->_animation[0]->getCurrentFrame() == 39) { _movingThrottle = false; switch (_throttleCounter) { case 1: @@ -1074,8 +1074,8 @@ void Scene804::step() { } if (_resetFrame >= 0) { - if (_resetFrame != _scene->_activeAnimation->getCurrentFrame()) { - _scene->_activeAnimation->setCurrentFrame(_resetFrame); + if (_resetFrame != _scene->_animation[0]->getCurrentFrame()) { + _scene->_animation[0]->setCurrentFrame(_resetFrame); _resetFrame = -1; } } @@ -1084,12 +1084,12 @@ void Scene804::step() { _scene->_nextSceneId = 803; } - if ((_scene->_activeAnimation->getCurrentFrame() == 72) && !_alreadyPop) { + if ((_scene->_animation[0]->getCurrentFrame() == 72) && !_alreadyPop) { _vm->_sound->command(21); _alreadyPop = true; } - if ((_scene->_activeAnimation->getCurrentFrame() == 80) && !_alreadyOrgan) { + if ((_scene->_animation[0]->getCurrentFrame() == 80) && !_alreadyOrgan) { _vm->_sound->command(22); _alreadyOrgan = true; } @@ -1606,7 +1606,7 @@ void Scene810::enter() { } void Scene810::step() { - if (_scene->_activeAnimation && (_scene->_activeAnimation->getCurrentFrame() == 200) + if (_scene->_animation[0] && (_scene->_animation[0]->getCurrentFrame() == 200) && _moveAllowed) { _scene->_sequences.addTimer(100, 70); _moveAllowed = false; diff --git a/engines/mads/palette.h b/engines/mads/palette.h index 6c98947384..1efe63b324 100644 --- a/engines/mads/palette.h +++ b/engines/mads/palette.h @@ -316,7 +316,7 @@ public: void refreshSceneColors(); - static int closestColor(const byte *matchColor, const byte *refPalette, + static int closestColor(const byte *matchColor, const byte *refPalette, int paletteInc, int count); }; diff --git a/engines/mads/phantom/game_phantom.cpp b/engines/mads/phantom/game_phantom.cpp index 592a108aea..27849cce1e 100644 --- a/engines/mads/phantom/game_phantom.cpp +++ b/engines/mads/phantom/game_phantom.cpp @@ -35,10 +35,111 @@ namespace MADS { namespace Phantom { -GamePhantom::GamePhantom(MADSEngine *vm) - : Game(vm) { + Catacombs _easyCatacombs[32] = { + { 401, { -1, 1, 2, 6 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK }, + { 404, { 10, 11, 3, 0 }, { 2, 3, 0, 1 }, MAZE_EVENT_PUDDLE }, + { 404, { 0, 3, 4, -2 }, { 2, 3, 0, 1 }, MAZE_EVENT_BLOCK }, + { 401, { 1, 14, 5, 2 }, { 2, 3, 0, 1 }, MAZE_EVENT_POT }, + { 453, { 2, 4, -1, 4 }, { 2, 3, 0, 1 }, MAZE_EVENT_DRAIN }, + { 403, { 3, 6, -1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_PLANK }, + { 406, { -1, 0, -1, 5 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 453, { -1, 8, -1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK }, + { 406, { -1, 9, -1, 7 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 401, { 1, -1, 10, 8 }, { 2, 3, 0, 1 }, MAZE_EVENT_RAT_NEST | MAZE_EVENT_SKULL }, + { 408, { 9, -1, 1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 453, { 12, -1, -1, 1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_STONE }, + { 408, { 13, -1, 11, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK }, + { 401, { 13, 20, 12, 13 }, { 3, 3, 0, 0 }, MAZE_EVENT_BRICK }, + { 453, { 16, 15, -1, 3 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_RAT_NEST }, + { 456, { -1, -1, -1, 14 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 404, { -1, 17, 14, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_WEB | MAZE_EVENT_POT }, + { 401, { 18, -1, 19, 16 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK }, + { 408, { -1, -1, 17, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK }, + { 403, { 17, -1, -1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_HOLE | MAZE_EVENT_WEB }, + { 403, { 21, 22, -1, 13 }, { 2, 3, 0, 1 }, MAZE_EVENT_WEB | MAZE_EVENT_SKULL }, + { 404, { -1, -1, 20, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 406, { -1, 23, -1, 20 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 404, { 24, 23, 23, 22 }, { 2, 2, 1, 1 }, MAZE_EVENT_RAT_NEST | MAZE_EVENT_BRICK }, + { 401, { -1, 1, 23, 25 }, { 2, 1, 0, 1 }, MAZE_EVENT_PUDDLE | MAZE_EVENT_POT | MAZE_EVENT_BRICK }, + { 407, { 29, 24, 28, 26 }, { 3, 3, 1, 1 }, MAZE_EVENT_NONE }, + { 401, { 27, 25, 23, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_SKULL }, + { 404, { -1, 28, 26, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_WEB | MAZE_EVENT_FALLEN_BLOCK }, + { 456, { -1, 25, -1, 27 }, { 2, 2, 0, 1 }, MAZE_EVENT_NONE }, + { 406, { -1, 30, -1, 25 }, { 2, 3, 0, 0 }, MAZE_EVENT_NONE }, + { 453, { -3, 30, -1, 29 }, { 2, 3, 0, 1 }, MAZE_EVENT_STONE | MAZE_EVENT_RAT_NEST | MAZE_EVENT_WEB }, + { 408, { -5, -1, -4, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_WEB | MAZE_EVENT_BRICK } + }; + + Catacombs _hardCatacombs[62] = { + { 401, { -1, 1, 2, 6 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK }, + { 404, { 10, 11, 3, 0 }, { 2, 3, 0, 1 }, MAZE_EVENT_PUDDLE }, + { 404, { 0, 3, 4, -2 }, { 2, 3, 0, 1 }, MAZE_EVENT_BLOCK }, + { 401, { 1, 20, 5, 2 }, { 2, 0, 0, 1 }, MAZE_EVENT_POT }, + { 453, { 2, 4, -1, 4 }, { 2, 3, 0, 1 }, MAZE_EVENT_DRAIN }, + { 403, { 3, 6, -1, 4 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_PLANK }, + { 406, { -1, 0, -1, 5 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 453, { -1, 8, -1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK }, + { 406, { -1, 9, -1, 7 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 401, { 1, -1, 10, 8 }, { 0, 3, 0, 1 }, MAZE_EVENT_RAT_NEST | MAZE_EVENT_SKULL }, + { 408, { 9, -1, 1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 453, { 12, -1, -1, 1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_STONE }, + { 408, { 13, -1, 11, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK }, + { 401, { 13, 21, 12, 13 }, { 3, 3, 0, 0 }, MAZE_EVENT_BRICK }, + { 453, { 16, 15, -1, 20 }, { 2, 3, 0, 2 }, MAZE_EVENT_RAT_NEST | MAZE_EVENT_BRICK }, + { 456, { -1, -1, -1, 14 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 404, { -1, 17, 14, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_WEB | MAZE_EVENT_POT }, + { 401, { 18, -1, 19, 16 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK }, + { 408, { -1, -1, 17, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK }, + { 403, { 17, -1, -1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_HOLE | MAZE_EVENT_WEB }, + { 408, { 3, -1, 14, -1 }, { 1, 3, 3, 1 }, MAZE_EVENT_NONE }, + { 404, { 9, 30, 22, 13 }, { 0, 3, 0, 1 }, MAZE_EVENT_RAT_NEST }, + { 403, { 21, 23, -1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_HOLE | MAZE_EVENT_WEB }, + { 401, { -1, -1, 24, 22 }, { 2, 3, 3, 1 }, MAZE_EVENT_BRICK }, + { 406, { -1, 26, -1, 23 }, { 2, 0, 0, 2 }, MAZE_EVENT_NONE }, + { 407, { 36, 33, 35, 34 }, { 3, 3, 1, 1 }, MAZE_EVENT_NONE }, + { 453, { 24, 27, -1, -1 }, { 1, 0, 0, 1 }, MAZE_EVENT_BRICK }, + { 403, { 26, -1, -1, 28 }, { 1, 3, 0, 0 }, MAZE_EVENT_BRICK | MAZE_EVENT_SKULL }, + { 404, { 27, 28, 28, 29 }, { 3, 2, 1, 2 }, MAZE_EVENT_NONE }, + { 408, { -1, -1, 28, -1 }, { 2, 3, 3, 1 }, MAZE_EVENT_BRICK }, + { 406, { -1, 31, -1, 21 }, { 2, 0, 0, 1 }, MAZE_EVENT_NONE }, + { 401, { 30, 33, 1, -1 }, { 1, 2, 1, 1 }, MAZE_EVENT_PUDDLE | MAZE_EVENT_POT }, + { 456, { -1, 31, -1, 33 }, { 2, 1, 0, 0 }, MAZE_EVENT_NONE }, + { 404, { 32, -1, 31, 25 }, { 3, 3, 1, 1 }, MAZE_EVENT_NONE }, + { 401, { 46, 25, 31, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_SKULL }, + { 401, { -1, 25, 41, -1 }, { 2, 2, 1, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_POT }, + { 406, { -1, 37, -1, 25 }, { 2, 3, 0, 0 }, MAZE_EVENT_NONE }, + { 453, { -3, 37, -1, 36 }, { 2, 3, 0, 1 }, MAZE_EVENT_STONE | MAZE_EVENT_RAT_NEST | MAZE_EVENT_WEB }, + { 408, { 57, -1, 54, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 408, { 40, -1, -4, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_WEB }, + { 404, { 40, 40, 39, 53 }, { 1, 0, 0, 1 }, MAZE_EVENT_BLOCK | MAZE_EVENT_FALLEN_BLOCK }, + { 456, { -1, 35, -1, 42 }, { 2, 2, 0, 2 }, MAZE_EVENT_NONE }, + { 408, { 43, -1, 41, -1 }, { 1, 3, 3, 1 }, MAZE_EVENT_BRICK }, + { 406, { -1, 42, -1, 61 }, { 2, 0, 0, 1 }, MAZE_EVENT_NONE }, + { 403, { 58, 45, -1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_RAT_NEST }, + { 401, { 34, -1, 46, 44 }, { 0, 3, 0, 1 }, MAZE_EVENT_RAT_NEST | MAZE_EVENT_BRICK }, + { 404, { 45, -1, 34, 47 }, { 2, 3, 0, 1 }, MAZE_EVENT_WEB | MAZE_EVENT_FALLEN_BLOCK }, + { 406, { -1, 46, -1, 48 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 403, { 49, 47, -1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_SKULL | MAZE_EVENT_WEB }, + { 408, { 50, -1, 48, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK }, + { 408, { 51, -1, 49, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 408, { 52, -1, 50, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK }, + { 408, { -1, -1, 51, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK }, + { 406, { -1, 40, -1, 54 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 403, { 38, 53, -1, 55 }, { 2, 3, 0, 1 }, MAZE_EVENT_SKULL }, + { 453, { 56, 54, -1, -1 }, { 2, 3, 0, 1 }, MAZE_EVENT_BRICK | MAZE_EVENT_WEB }, + { 401, { 56, -5, 55, 56 }, { 3, 3, 0, 0 }, MAZE_EVENT_BRICK | MAZE_EVENT_SKULL }, + { 404, { -1, 57, 38, 57 }, { 2, 3, 0, 1 }, MAZE_EVENT_POT | MAZE_EVENT_BLOCK }, + { 404, { 59, 59, 44, 60 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 404, { 59, 60, 59, 58 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 404, { 61, 58, 59, 59 }, { 2, 3, 0, 1 }, MAZE_EVENT_NONE }, + { 404, { 34, 43, 60, 44 }, { 0, 3, 0, 1 }, MAZE_EVENT_NONE } + }; + +GamePhantom::GamePhantom(MADSEngine *vm) : Game(vm) { _surface = new MSurface(MADS_SCREEN_WIDTH, MADS_SCENE_HEIGHT); - _storyMode = STORYMODE_NAUGHTY; + _difficulty = DIFFICULTY_HARD; + _catacombs = nullptr; + _catacombSize = -1; } void GamePhantom::startGame() { @@ -51,8 +152,7 @@ void GamePhantom::startGame() { void GamePhantom::initializeGlobals() { _globals.reset(); - - // TODO: Catacombs setup + setupCatacombs(); _player._facing = FACING_NORTH; _player._turnToFacing = FACING_NORTH; @@ -104,7 +204,7 @@ void GamePhantom::initializeGlobals() { _globals[kChristineToldEnvelope] = false; _globals[kLeaveAngelMusicOn] = false; _globals[kDoorIn409IsOpen] = false; - _globals[kUnknown] = false; + _globals[kPriestPistonPuke] = false; _globals[kCobwebIsCut] = false; _globals[kChristineIsInBoat] = false; _globals[kRightDoorIsOpen504] = false; @@ -161,27 +261,561 @@ void GamePhantom::checkShowDialog() { } } +void GamePhantom::genericObjectExamine() { + MADSAction &action = _scene._action; + int id = _objects.getIdFromDesc(action._activeAction._objectNameId); + + if (action.isAction(VERB_LOOK, NOUN_RED_FRAME)) + _vm->_dialogs->showItem(id, (_globals[kCurrentYear] == 1993) ? 802 : 842, 0); + else if (action.isAction(VERB_LOOK, NOUN_YELLOW_FRAME)) + _vm->_dialogs->showItem(id, (_globals[kCurrentYear] == 1993) ? 804 : 843, 0); + else if (action.isAction(VERB_LOOK, NOUN_BLUE_FRAME)) + _vm->_dialogs->showItem(id, (_globals[kCurrentYear] == 1993) ? 817 : 844, 0); + else if (action.isAction(VERB_LOOK, NOUN_GREEN_FRAME)) + _vm->_dialogs->showItem(id, (_globals[kCurrentYear] == 1993) ? 819 : 845, 0); + else if (action.isAction(VERB_LOOK, NOUN_LANTERN)) + _vm->_dialogs->showItem(id, (_globals[kLanternStatus] == 1) ? 831 : 801, 0); + else if (action.isAction(VERB_LOOK, NOUN_SMALL_NOTE)) + _vm->_dialogs->showItem(OBJ_SMALL_NOTE, 846, 2); + else if (action.isAction(VERB_LOOK, NOUN_PARCHMENT)) + _vm->_dialogs->showItem(OBJ_PARCHMENT, 812, 3); + else if (action.isAction(VERB_LOOK, NOUN_LETTER)) + _vm->_dialogs->showItem(OBJ_LETTER, 813, 4); + else if (action.isAction(VERB_LOOK, NOUN_NOTICE)) + _vm->_dialogs->showItem(OBJ_NOTICE, 814, 5); + else if (action.isAction(VERB_LOOK, NOUN_CRUMPLED_NOTE)) + _vm->_dialogs->showItem(OBJ_CRUMPLED_NOTE, 816, 6); + else if (action.isAction(VERB_LOOK, NOUN_LARGE_NOTE)) + _vm->_dialogs->showItem(OBJ_LARGE_NOTE, 818, 7); + else + _vm->_dialogs->showItem(id, 800 + id, 0); +} + void GamePhantom::doObjectAction() { - // TODO: Copied from Nebular - //Scene &scene = _scene; MADSAction &action = _scene._action; - //Dialogs &dialogs = *_vm->_dialogs; - //int id; - action._inProgress = false; + if ((_scene._currentSceneId >= 401) && (_scene._currentSceneId <= 456) + && (action.isObject(NOUN_RED_FRAME) || action.isObject(NOUN_YELLOW_FRAME) || action.isObject(NOUN_GREEN_FRAME) || action.isObject(NOUN_BLUE_FRAME)) + && action.isAction(VERB_PUT)) { + if (action.isTarget(NOUN_UNLUCKY_ADVENTURER)) { + _vm->_dialogs->show(35); + action._inProgress = false; + return; + } else if (action.isTarget(NOUN_HOLE)) { + _vm->_dialogs->show(36); + action._inProgress = false; + return; + } else if (action.isTarget(NOUN_GRATE)) { + _vm->_dialogs->show(37); + action._inProgress = false; + return; + } else if (action.isTarget(NOUN_WALL)) { + _vm->_dialogs->show(38); + action._inProgress = false; + return; + } + } + + if (action._lookFlag) { + _vm->_dialogs->show(810); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_PUT, NOUN_RED_FRAME) || action.isAction(VERB_PUT, NOUN_BLUE_FRAME) || action.isAction(VERB_PUT, NOUN_YELLOW_FRAME) || action.isAction(VERB_PUT, NOUN_GREEN_FRAME)) { + _vm->_dialogs->show((action.isTarget(NOUN_PUDDLE)) ? 40124 : 40125); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_WEAR, NOUN_WEDDING_RING)) { + if (_globals[kRingIsOnFinger]) + _vm->_dialogs->show(849); + else { + _vm->_dialogs->show(835); + _globals[kRingIsOnFinger] = true; + } + action._inProgress = false; + return; + } + + if (action.isAction(VERB_REMOVE, NOUN_WEDDING_RING)) { + if (!_globals[kRingIsOnFinger]) + _vm->_dialogs->show(848); + else { + _vm->_dialogs->show(836); + _globals[kRingIsOnFinger] = false; + } + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_ARCHWAY_TO_WEST) || action.isAction(VERB_LOOK, NOUN_ARCHWAY_TO_EAST) || action.isAction(VERB_LOOK, NOUN_ARCHWAY_TO_NORTH)) { + _vm->_dialogs->show(34); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_ATTACK, NOUN_CHRISTINE)) { + _vm->_dialogs->show(33); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_KEY)) { + _vm->_dialogs->showItem(OBJ_KEY, 800, 0); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_SANDBAG)) { + _vm->_dialogs->showItem(OBJ_SANDBAG, 803, 0); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_SMALL_NOTE) || action.isAction(VERB_READ, NOUN_SMALL_NOTE)) { + _vm->_dialogs->showItem(OBJ_SMALL_NOTE, 806, 2); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_ROPE)) { + _vm->_dialogs->showItem(OBJ_ROPE, 807, 0); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_SWORD)) { + _vm->_dialogs->showItem(OBJ_SWORD, 808, 0); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_ENVELOPE) || action.isAction(VERB_READ, NOUN_ENVELOPE)) { + _vm->_dialogs->showItem(OBJ_ENVELOPE, 809, 0); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_TICKET) || action.isAction(VERB_READ, NOUN_TICKET)) { + _vm->_dialogs->showItem(OBJ_TICKET, 810, 0); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_PIECE_OF_PAPER) || action.isAction(VERB_READ, NOUN_PIECE_OF_PAPER)) { + _vm->_dialogs->showItem(OBJ_PIECE_OF_PAPER, 811, 1); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_PARCHMENT) || action.isAction(VERB_READ, NOUN_PARCHMENT)) { + _vm->_dialogs->showItem(OBJ_PARCHMENT, 812, 3); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_LETTER) || action.isAction(VERB_READ, NOUN_LETTER)) { + _vm->_dialogs->showItem(OBJ_LETTER, 813, 4); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_NOTICE) || action.isAction(VERB_READ, NOUN_NOTICE)) { + _vm->_dialogs->showItem(OBJ_NOTICE, 814, 5); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_BOOK) || action.isAction(VERB_READ, NOUN_BOOK)) { + _vm->_dialogs->showItem(OBJ_BOOK, 815, 0); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_CRUMPLED_NOTE) || action.isAction(VERB_READ, NOUN_CRUMPLED_NOTE)) { + _vm->_dialogs->showItem(OBJ_CRUMPLED_NOTE, 816, 6); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_LARGE_NOTE) || action.isAction(VERB_READ, NOUN_LARGE_NOTE)) { + _vm->_dialogs->showItem(OBJ_LARGE_NOTE, 818, 7); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_MUSIC_SCORE) || action.isAction(VERB_READ, NOUN_MUSIC_SCORE)) { + _vm->_dialogs->showItem(OBJ_MUSIC_SCORE, 820, 0); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_WEDDING_RING)) { + _vm->_dialogs->showItem(OBJ_WEDDING_RING, 821, 0); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_CABLE_HOOK)) { + _vm->_dialogs->showItem(OBJ_CABLE_HOOK, 822, 0); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_ROPE_WITH_HOOK)) { + _vm->_dialogs->showItem(OBJ_ROPE_WITH_HOOK, 823, 0); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK, NOUN_OAR)) { + _vm->_dialogs->showItem(OBJ_OAR, 824, 0); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_LOOK) && _objects.isInInventory(_objects.getIdFromDesc(action._activeAction._objectNameId))) { + genericObjectExamine(); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_TURN_ON, NOUN_LANTERN)) { + if ((_globals[kLanternStatus] == 1) && !_trigger) + _vm->_dialogs->show(828); + else { + switch (_trigger) { + case 0: + _scene._sequences.addTimer(4, 1); + _globals[kLanternStatus] = 1; + _vm->_dialogs->spinObject(OBJ_LANTERN); + break; + + case 1: + _vm->_dialogs->show(825); + break; + + default: + break; + } + } + action._inProgress = false; + return; + } + + if (action.isAction(VERB_TURN_OFF, NOUN_LANTERN)) { + if ((_globals[kLanternStatus] == 0) && !_trigger) + _vm->_dialogs->show(829); + else if ((_scene._currentSceneId / 100) == 4) + _vm->_dialogs->show(826); + else { + switch (_trigger) { + case 0: + _scene._sequences.addTimer(4, 1); + _globals[kLanternStatus] = 0; + _vm->_dialogs->spinObject(OBJ_LANTERN); + break; + + case 1: + _vm->_dialogs->show(827); + break; + + default: + break; + } + } + action._inProgress = false; + return; + } + + if (action.isAction(VERB_OPEN, NOUN_ENVELOPE)) { + _objects.setRoom(OBJ_ENVELOPE, NOWHERE); + _objects.addToInventory(OBJ_TICKET); + _objects.addToInventory(OBJ_PIECE_OF_PAPER); + _vm->_dialogs->show(833); + action._inProgress = false; + return; + } + + if (action.isAction(VERB_ATTACH, NOUN_CABLE_HOOK, NOUN_ROPE)) { + if (!_objects.isInInventory(OBJ_ROPE)) + _vm->_dialogs->show(11438); + else { + _objects.setRoom(OBJ_CABLE_HOOK, NOWHERE); + _objects.setRoom(OBJ_ROPE, NOWHERE); + _objects.addToInventory(OBJ_ROPE_WITH_HOOK); + _vm->_dialogs->showItem(OBJ_ROPE_WITH_HOOK, 823, 0); + } + action._inProgress = false; + } } void GamePhantom::unhandledAction() { - // TODO + int messageId = 0; + int rndNum = _vm->getRandomNumber(1, 1000); + MADSAction &action = _scene._action; + + if (action.isAction(VERB_PUT, NOUN_CHANDELIER, NOUN_SEATS)) + _vm->_dialogs->show(10123); + else if (action.isAction(VERB_TAKE)) { + if (_objects.isInInventory(_objects.getIdFromDesc(action._activeAction._objectNameId))) + messageId = 25; + else { + if (rndNum <= 333) + messageId = 1; + else if (rndNum <= 666) + messageId = 2; + else + messageId = 3; + } + } else if (action.isAction(VERB_PUSH)) { + if (rndNum < 750) + messageId = 4; + else + messageId = 5; + } else if (action.isAction(VERB_PULL)) { + if (rndNum < 750) + messageId = 6; + else + messageId = 7; + } else if (action.isAction(VERB_OPEN)) { + if (rndNum <= 500) + messageId = 8; + else if (rndNum <= 750) + messageId = 9; + else + messageId = 10; + } else if (action.isAction(VERB_CLOSE)) { + if (rndNum <= 500) + messageId = 11; + else if (rndNum <= 750) + messageId = 12; + else + messageId = 13; + } else if (action.isAction(VERB_PUT)) { + if (_objects.isInInventory(_objects.getIdFromDesc(action._activeAction._objectNameId))) + messageId = 26; + else if (rndNum < 500) + messageId = 14; + else + messageId = 15; + } else if (action.isAction(VERB_TALK_TO)) { + if (rndNum <= 500) + messageId = 16; + else + messageId = 17; + } else if (action.isAction(VERB_GIVE)) { + if (_objects.isInInventory(_objects.getIdFromDesc(action._activeAction._objectNameId))) + messageId = 27; + else + messageId = 18; + } else if (action.isAction(VERB_THROW)) { + if (_objects.isInInventory(_objects.getIdFromDesc(action._activeAction._objectNameId))) + messageId = 19; + else + messageId = 28; + } else if (action.isAction(VERB_LOOK)) { + if (rndNum <= 333) + messageId = 20; + else if (rndNum <= 666) + messageId = 21; + else + messageId = 22; + } else if ((action.isAction(VERB_UNLOCK) || action.isAction(VERB_LOCK)) + && (action.isObject(NOUN_DOOR) || action.isObject(NOUN_LEFT_DOOR) || action.isObject(NOUN_MIDDLE_DOOR) || action.isObject(NOUN_RIGHT_DOOR) || action.isObject(NOUN_TRAP_DOOR))) + messageId = 32; + else if (!action.isAction(VERB_WALK_TO) && !action.isAction(VERB_WALK_ACROSS) && !action.isAction(VERB_WALK_DOWN) && !action.isAction(VERB_WALK_UP)) { + if (rndNum < 500) + messageId = 23; + else + messageId = 24; + } + + if (messageId) + _vm->_dialogs->show(messageId); +} + +void GamePhantom::stopWalker() { + int state = _globals[kWalkerConverseState]; + int command = _globals[kWalkerConverse]; + + _globals[kWalkerConverseNow] = state; + + if ((_player._facing != FACING_NORTHEAST) && (_player._facing != FACING_NORTHWEST)) { + state = 0; + command = 0; + } + + switch (state) { + case 1: + switch (command) { + case 1: + _player.addWalker(3, 0); + break; + + case 2: + case 3: + _player.addWalker(6, 0); + _player.addWalker(5, 0); + _player.addWalker(4, 0); + state = 2; + break; + + case 4: + _player.addWalker(8, 0); + _player.addWalker(4, 0); + state = 4; + break; + + default: + _player.addWalker(-2, 0); + state = 0; + break; + } + break; + + case 2: + case 3: + switch (command) { + case 2: + case 3: + if (state == 2) { + if (_vm->getRandomNumber(1, 30000) < 2000) { + _player.addWalker(10, 0); + _player.addWalker(7, 0); + state = 3; + } else + _player.addWalker(6, 0); + } else { + if (_vm->getRandomNumber(1, 30000) < 1000) { + _player.addWalker(6, 0); + _player.addWalker(7, 0); + state = 2; + } else + _player.addWalker(10, 0); + } + break; + + default: + _player.addWalker(-4, 0); + _player.addWalker(-5, 0); + if (state == 3) { + _player.addWalker(6, 0); + _player.addWalker(7, 0); + } + state = 1; + break; + } + break; + + case 4: + if (command == 4) + _player.addWalker(9, 0); + else { + _player.addWalker(-4, 0); + _player.addWalker(-8, 0); + state = 1; + } + break; + + case 0: + default: + switch (command) { + case 1: + case 2: + case 3: + case 4: + _player.addWalker(2, 0); + state = 1; + break; + + default: + stopWalkerBasic(); + break; + } + break; + } + + _globals[kWalkerConverse] = command; + _globals[kWalkerConverseState] = state; } void GamePhantom::step() { - if (_player._visible && _player._stepEnabled && !_player._moving && - (_player._facing == _player._turnToFacing)) { + if (_player._visible && !_globals[kStopWalkerDisabled] + && (_player._stepEnabled || (_vm->_gameConv->_running >= 0)) + && !_player._moving && (_player._facing == _player._turnToFacing) + && (_scene._frameStartTime >= (uint32)_globals[kWalkerTiming])) { + if (!_player._stopWalkerIndex) + stopWalker(); - // TODO + _globals[kWalkerTiming] += 6; } +} + +void GamePhantom::stopWalkerBasic() { + int rndVal = _vm->getRandomNumber(1, 30000); + + switch (_player._facing) { + case FACING_SOUTH: + if (rndVal < 500) { + int maxSteps = _vm->getRandomNumber(4, 10); + for (int i = 0; i < maxSteps; i++) + _player.addWalker((rndVal < 250) ? 1 : 2, 0); + } else if (rndVal < 750) { + for (int i = 0; i < 4; i++) + _player.addWalker(1, 0); + _player.addWalker(0, 0); + + for (int i = 0; i < 4; i++) + _player.addWalker(2, 0); + + _player.addWalker(0, 0); + } + break; + + case FACING_SOUTHEAST: + case FACING_SOUTHWEST: + case FACING_NORTHEAST: + case FACING_NORTHWEST: + if (rndVal < 150) { + _player.addWalker(-1, 0); + _player.addWalker(1, 0); + for (int i = 0; i < 6; i++) + _player.addWalker(0, 0); + } + break; + + case FACING_EAST: + case FACING_WEST: + if (rndVal < 250) { + _player.addWalker(-1, 0); + int maxSteps = _vm->getRandomNumber(2, 6); + for (int i = 0; i < maxSteps; i++) + _player.addWalker(2, 0); + _player.addWalker(1, 0); + _player.addWalker(0, 0); + _player.addWalker(0, 0); + } else if (rndVal < 500) + _globals[kWalkerTiming] = (int)_scene._frameStartTime; + break; + + case FACING_NORTH: + if (rndVal < 250) { + _player.addWalker(-1, 0); + int maxSteps = _vm->getRandomNumber(3, 7); + for (int i = 0; i < maxSteps; i++) + _player.addWalker(2, 0); + _player.addWalker(1, 0); + _player.addWalker(0, 0); + } + break; + + default: + break; + } } void GamePhantom::synchronize(Common::Serializer &s, bool phase1) { @@ -193,6 +827,121 @@ void GamePhantom::synchronize(Common::Serializer &s, bool phase1) { } } +void GamePhantom::enterCatacombs(bool val) { + setupCatacombs(); + + int var4, var2; + if (_scene._currentSceneId == 409) { + if (val) { + var4 = _globals[kCatacombs409b]; + var2 = _globals[kCatacombs409bFrom]; + } else { + var4 = _globals[kCatacombs409a]; + var2 = _globals[kCatacombs409aFrom]; + } + } else if (_scene._currentSceneId == 501) { + var4 = _globals[kCatacombs501]; + var2 = _globals[kCatacombs501From]; + } else { + var4 = _globals[kCatacombs309]; + var2 = _globals[kCatacombs309From]; + } + + newCatacombRoom(var4, var2); +} + +void GamePhantom::initCatacombs() { + _globals[kCatacombsRoom] = _globals[kCatacombsNextRoom]; +} + +void GamePhantom::setupCatacombs() { + switch (_difficulty) { + case DIFFICULTY_EASY: + _catacombs = _easyCatacombs; + _catacombSize = 32; + + _globals[kCatacombs309] = 2; + _globals[kCatacombs309From] = 3; + _globals[kCatacombs409a] = 30; + _globals[kCatacombs409aFrom] = 0; + _globals[kCatacombs409b] = 31; + _globals[kCatacombs409bFrom] = 2; + _globals[kCatacombs501] = 31; + _globals[kCatacombs501From] = 0; + break; + + case DIFFICULTY_MEDIUM: + // TODO: FIXME. Do we need to set something here? + break; + + case DIFFICULTY_HARD: + _catacombs = _hardCatacombs; + _catacombSize = 62; + + _globals[kCatacombs309] = 2; + _globals[kCatacombs309From] = 3; + _globals[kCatacombs409a] = 37; + _globals[kCatacombs409aFrom] = 0; + _globals[kCatacombs409b] = 39; + _globals[kCatacombs409bFrom] = 2; + _globals[kCatacombs501] = 56; + _globals[kCatacombs501From] = 1; + break; + } +} + +int GamePhantom::exitCatacombs(int dir) { + assert(_globals[kCatacombsRoom] == CLIP(_globals[kCatacombsRoom], 0, _catacombSize - 1)); + assert(dir == CLIP(dir, 0, 3)); + + return (_catacombs[_globals[kCatacombsRoom]]._exit[dir]); +} + +void GamePhantom::moveCatacombs(int dir) { + assert(_globals[kCatacombsRoom] == CLIP(_globals[kCatacombsRoom], 0, _catacombSize - 1)); + assert(dir == CLIP(dir, 0, 3)); + + newCatacombRoom(_catacombs[_globals[kCatacombsRoom]]._fromDirection[dir], _catacombs[_globals[kCatacombsRoom]]._exit[dir]); +} + +void GamePhantom::newCatacombRoom(int toRoom, int fromExit) { + _globals[kCatacombsNextRoom] = toRoom; + _globals[kCatacombsFrom] = fromExit & 0x03; + _globals[kCatacombsFlag] = fromExit & 0xFC; + + int newSceneNum = -1; + + if (toRoom < 0) { + switch (toRoom) { + case -5: + newSceneNum = 501; + break; + + case -4: + case -3: + newSceneNum = 409; + break; + + case -2: + newSceneNum = 309; + break; + + default: + error("Unexpected room in newCatacombRoom"); + } + } else { + newSceneNum = _catacombs[toRoom]._sceneNum; + _globals[81] = _catacombs[toRoom]._flags; + } + + if (_triggerSetupMode == SEQUENCE_TRIGGER_PREPARE) { + _player._walkOffScreenSceneId = newSceneNum; + } else { + _scene._reloadSceneFlag = true; + _scene._nextSceneId = newSceneNum; + } +} + } // End of namespace Phantom } // End of namespace MADS diff --git a/engines/mads/phantom/game_phantom.h b/engines/mads/phantom/game_phantom.h index 44b2321f42..2f0204f331 100644 --- a/engines/mads/phantom/game_phantom.h +++ b/engines/mads/phantom/game_phantom.h @@ -32,8 +32,9 @@ namespace MADS { namespace Phantom { -// TODO: Adapt for Phantom's difficulty setting -enum StoryMode { STORYMODE_NAUGHTY = 1, STORYMODE_NICE = 2 }; +enum Difficulty { + DIFFICULTY_HARD = 1, DIFFICULTY_MEDIUM = 2, DIFFICULTY_EASY = 3 +}; enum InventoryObject { OBJ_NONE = -1, @@ -64,8 +65,40 @@ enum InventoryObject { OBJ_OAR = 24 }; +enum MazeEvent { + MAZE_EVENT_NONE = 0, + MAZE_EVENT_PUDDLE = 0x0001, + MAZE_EVENT_RAT_NEST = 0x0002, + MAZE_EVENT_SKULL = 0x0004, + MAZE_EVENT_POT = 0x0008, + MAZE_EVENT_BRICK = 0x0010, + MAZE_EVENT_HOLE = 0x0020, + MAZE_EVENT_WEB = 0x0040, + MAZE_EVENT_PLANK = 0x0080, + MAZE_EVENT_DRAIN = 0x0100, + MAZE_EVENT_STONE = 0x0200, + MAZE_EVENT_BLOCK = 0x0400, + MAZE_EVENT_FALLEN_BLOCK = 0x0800 +}; + +struct Catacombs { + int _sceneNum; + int _exit[4]; + int _fromDirection[4]; + int _flags; +}; + class GamePhantom : public Game { friend class Game; + +private: + void genericObjectExamine(); + void stopWalker(); + void stopWalkerBasic(); + + Catacombs *_catacombs; + int _catacombSize; + protected: GamePhantom(MADSEngine *vm); @@ -78,7 +111,8 @@ protected: virtual void checkShowDialog(); public: PhantomGlobals _globals; - StoryMode _storyMode; + Difficulty _difficulty; + virtual Globals &globals() { return _globals; } @@ -89,20 +123,25 @@ public: virtual void step(); virtual void synchronize(Common::Serializer &s, bool phase1); -}; + void setupCatacombs(); + void enterCatacombs(bool val); + void initCatacombs(); + void moveCatacombs(int dir); + int exitCatacombs(int dir); + void newCatacombRoom(int fromRoom, int fromExit); +}; +// Section handlers aren't needed in ScummVM implementation class Section1Handler : public SectionHandler { public: Section1Handler(MADSEngine *vm) : SectionHandler(vm) {} - // TODO: Properly implement handler methods virtual void preLoadSection() {} virtual void sectionPtr2() {} virtual void postLoadSection() {} }; -// TODO: Properly implement handler classes typedef Section1Handler Section2Handler; typedef Section1Handler Section3Handler; typedef Section1Handler Section4Handler; diff --git a/engines/mads/phantom/globals_phantom.cpp b/engines/mads/phantom/globals_phantom.cpp index e0db0a1bb0..eea84762fe 100644 --- a/engines/mads/phantom/globals_phantom.cpp +++ b/engines/mads/phantom/globals_phantom.cpp @@ -28,12 +28,12 @@ namespace MADS { namespace Phantom { -PhantomGlobals::PhantomGlobals() - : Globals() { +PhantomGlobals::PhantomGlobals() : Globals() { // Initialize lists resize(210); _spriteIndexes.resize(30); _sequenceIndexes.resize(30); + _animationIndexes.resize(30); } void PhantomGlobals::synchronize(Common::Serializer &s) { @@ -41,6 +41,7 @@ void PhantomGlobals::synchronize(Common::Serializer &s) { _spriteIndexes.synchronize(s); _sequenceIndexes.synchronize(s); + _animationIndexes.synchronize(s); } diff --git a/engines/mads/phantom/globals_phantom.h b/engines/mads/phantom/globals_phantom.h index c23b53cdf5..f120df3c47 100644 --- a/engines/mads/phantom/globals_phantom.h +++ b/engines/mads/phantom/globals_phantom.h @@ -99,9 +99,20 @@ enum GlobalId { // Section #4 Variables kCatacombsRoom = 80, - // TODO + kCatacombsMisc = 81, + kCatacombsFlag = 82, + kCatacombsFrom = 83, + kCatacombs309 = 84, + kCatacombs409a = 85, + kCatacombs409b = 86, + kCatacombs501 = 87, + kCatacombs309From = 88, + kCatacombs409aFrom = 89, + kCatacombs409bFrom = 90, + kCatacombs501From = 91, + kCatacombsNextRoom = 92, kDoorIn409IsOpen = 93, - kUnknown = 94, // TODO + kPriestPistonPuke = 94, kCobwebIsCut = 95, // Section #5 Variables @@ -124,6 +135,7 @@ class PhantomGlobals : public Globals { public: SynchronizedList _spriteIndexes; SynchronizedList _sequenceIndexes; + SynchronizedList _animationIndexes; public: /** * Constructor diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp index f7f4d154df..f7a7153fbe 100644 --- a/engines/mads/phantom/phantom_scenes.cpp +++ b/engines/mads/phantom/phantom_scenes.cpp @@ -29,6 +29,10 @@ #include "mads/phantom/game_phantom.h" #include "mads/phantom/phantom_scenes.h" #include "mads/phantom/phantom_scenes1.h" +#include "mads/phantom/phantom_scenes2.h" +#include "mads/phantom/phantom_scenes3.h" +#include "mads/phantom/phantom_scenes4.h" +#include "mads/phantom/phantom_scenes5.h" namespace MADS { @@ -37,8 +41,9 @@ namespace Phantom { SceneLogic *SceneFactory::createScene(MADSEngine *vm) { Scene &scene = vm->_game->_scene; - // TODO - //scene.addActiveVocab(NOUN_DROP); + // When changing from one section to the other, set the scaling velocity + if ((scene._nextSceneId / 100) != (scene._priorSceneId / 100)) + vm->_game->_player._scalingVelocity = true; switch (scene._nextSceneId) { // Scene group #1 (theater, stage and dressing rooms) @@ -47,107 +52,107 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) { case 102: // music stands return new Scene102(vm); case 103: // below stage - return new DummyScene(vm); // TODO + return new Scene103(vm); case 104: // stage - return new DummyScene(vm); // TODO + return new Scene104(vm); case 105: // ground floor, storage room - return new DummyScene(vm); // TODO + return new Scene105(vm); case 106: // behind stage - return new DummyScene(vm); // TODO + return new Scene106(vm); case 107: // stage right wing - return new DummyScene(vm); // TODO + return new Scene107(vm); case 108: // stage left wing - return new DummyScene(vm); // TODO + return new Scene108(vm); case 109: // upper floor, staircase - return new DummyScene(vm); // TODO + return new Scene109(vm); case 110: // outside dressing rooms 1 - return new DummyScene(vm); // TODO + return new Scene110(vm); case 111: // outside dressing rooms 2 - return new DummyScene(vm); // TODO + return new Scene111(vm); case 112: // inside dressing room 1 - return new DummyScene(vm); // TODO + return new Scene112(vm); case 113: // inside dressing room 2 - return new DummyScene(vm); // TODO + return new Scene113(vm); case 114: // lower floor, storage room - return new DummyScene(vm); // TODO + return new Scene114(vm); case 150: // cutscene - return new DummyScene(vm); // TODO + return new Scene150(vm); // Scene group #2 (theater entrance, offices, balcony) case 201: // entrance / ticket office - return new DummyScene(vm); // TODO + return new Scene201(vm); case 202: // outside offices / paintings room - return new DummyScene(vm); // TODO + return new Scene202(vm); case 203: // office - return new DummyScene(vm); // TODO + return new Scene203(vm); case 204: // library - return new DummyScene(vm); // TODO + return new Scene204(vm); case 205: // upper floor, outside balcony boxes - return new DummyScene(vm); // TODO + return new Scene205(vm); case 206: // balcony box #1 - return new DummyScene(vm); // TODO + return new Scene206(vm); case 207: // balcony box #2 - return new DummyScene(vm); // TODO + return new Scene207(vm); case 208: // stage and balcony view - return new DummyScene(vm); // TODO + return new Scene208(vm); case 250: // cutscene - return new DummyScene(vm); // TODO + return new Scene250(vm); // Scene group #3 (catwalks, chandelier, lake / catacombs entrance) case 301: // catwalk #1 above stage - return new DummyScene(vm); // TODO + return new Scene301(vm); case 302: // catwalk #2 above stage - return new DummyScene(vm); // TODO + return new Scene302(vm); case 303: // above chandelier - return new DummyScene(vm); // TODO + return new Scene303(vm); case 304: // chandelier - return new DummyScene(vm); // TODO + return new Scene304(vm); case 305: // chandelier fight, phantom closeup - return new DummyScene(vm); // TODO + return new Scene305(vm); case 306: // chandelier #2 - return new DummyScene(vm); // TODO + return new Scene306(vm); case 307: // catwalk #3 above stage - return new DummyScene(vm); // TODO + return new Scene307(vm); case 308: // hidden staircase behind balcony box - return new DummyScene(vm); // TODO + return new Scene308(vm); case 309: // lake and archway - return new DummyScene(vm); // TODO + return new Scene309(vm); case 310: // lake - return new DummyScene(vm); // TODO + return new Scene310(vm); // Scene group #4 (labyrinth) case 401: // labyrinth room, 3 exits - return new DummyScene(vm); // TODO + return new Scene401(vm); case 403: // labyrinth room (big), 4 exits + 1 bricked door, left - return new DummyScene(vm); // TODO + return new Scene403(vm); case 404: // labyrinth room, 3 exits - return new DummyScene(vm); // TODO + return new Scene404(vm); case 406: // labyrinth room, 2 exits - return new DummyScene(vm); // TODO + return new Scene406(vm); case 407: // catacomb room / lake - return new DummyScene(vm); // TODO + return new Scene407(vm); case 408: // catacomb corridor - return new DummyScene(vm); // TODO + return new Scene408(vm); case 409: // catacomb room, door with switch panel - return new DummyScene(vm); // TODO + return new Scene409(vm); case 410: // skull switch panel - return new DummyScene(vm); // TODO + return new Scene410(vm); case 453: // Labyrinth room (big), 4 exits + 1 bricked door, right - return new DummyScene(vm); // TODO + return new Scene453(vm); case 456: // Labyrinth room, 2 exits - return new DummyScene(vm); // TODO + return new Scene456(vm); // Scene group #5 (Phantom's hideout) case 501: // catacombs, outside phantom's hideout, lake and boat - return new DummyScene(vm); // TODO + return new Scene501(vm); case 502: // push panel trap - return new DummyScene(vm); // TODO + return new Scene502(vm); case 504: // Phantom's hideout, church organ - return new DummyScene(vm); // TODO + return new Scene504(vm); case 505: // Phantom's hideout, sarcophagus - return new DummyScene(vm); // TODO + return new Scene505(vm); case 506: // catacomb room with ramp - return new DummyScene(vm); // TODO + return new Scene506(vm); default: error("Invalid scene %d called", scene._nextSceneId); @@ -170,12 +175,12 @@ Common::String PhantomScene::formAnimName(char sepChar, int suffixNum) { /*------------------------------------------------------------------------*/ void SceneInfoPhantom::loadCodes(MSurface &depthSurface, int variant) { - // The intro scenes do not have any codes - if (_sceneId >= 900) + Common::String ext = Common::String::format(".WW%d", variant); + Common::String fileName = Resources::formatName(RESPREFIX_RM, _sceneId, ext); + if (!Common::File::exists(fileName)) return; - Common::String ext = Common::String::format(".WW%d", variant); - File f(Resources::formatName(RESPREFIX_RM, _sceneId, ext)); + File f(fileName); MadsPack codesPack(&f); Common::SeekableReadStream *stream = codesPack.getItemStream(0); diff --git a/engines/mads/phantom/phantom_scenes.h b/engines/mads/phantom/phantom_scenes.h index c0a823ae06..a6a8395a2c 100644 --- a/engines/mads/phantom/phantom_scenes.h +++ b/engines/mads/phantom/phantom_scenes.h @@ -46,13 +46,19 @@ enum Verb { VERB_CLOSE = 0xB, VERB_THROW = 0xC, VERB_WALK_TO = 0xD, + VERB_ATTACK = 0x14, VERB_CLIMB_DOWN = 0x21, VERB_CLIMB_INTO = 0x22, VERB_CLIMB_THROUGH = 0x23, + VERB_EXIT = 0x34, VERB_EXIT_TO = 0x37, VERB_JUMP_INTO = 0x53, + VERB_LASSO = 0x59, + VERB_LOCK = 0x5D, VERB_LOOK_AT = 0x60, VERB_LOOK_THROUGH = 0x61, + VERB_READ = 0x7A, + VERB_REMOVE = 0x7C, VERB_TURN_OFF = 0x95, VERB_TURN_ON = 0x96, VERB_UNLOCK = 0x97, @@ -60,9 +66,18 @@ enum Verb { VERB_WALK_DOWN = 0x9A, VERB_WALK_THROUGH = 0x9B, VERB_WALK_UP = 0x9C, + VERB_WEAR = 0xA1, VERB_CLIMB_UP = 0xA5, VERB_WALK_ONTO = 0xA6, - VERB_WALK = 0xA7 + VERB_WALK = 0xA7, + VERB_ENTER = 0xEC, + VERB_WALK_BEHIND = 0xF3, + VERB_CLIMB = 0x120, + VERB_ATTACH = 0x131, + VERB_GRAPPLE = 0x133, + VERB_SIT_ON = 0x138, + VERB_SIT_IN = 0x13A, + VERB_WALK_DOWN_STAIRS_TO = 0x153 }; enum Noun { @@ -74,7 +89,6 @@ enum Noun { NOUN_ACT_CURTAIN = 0x11, NOUN_AISLE = 0x12, NOUN_APRON = 0x13, - NOUN_ATTACK = 0x14, NOUN_BACKSTAGE = 0x15, NOUN_BEAR_PROP = 0x16, NOUN_BLUE_FRAME = 0x17, @@ -103,7 +117,6 @@ enum Noun { NOUN_DRESSING_TABLE = 0x31, NOUN_ELEPHANT_PROP = 0x32, NOUN_ENVELOPE = 0x33, - NOUN_EXIT = 0x34, NOUN_EXIT_DOWN = 0x35, NOUN_EXIT_SIGN = 0x36, NOUN_EXIT_TO_BACKSTAGE = 0x38, @@ -138,11 +151,9 @@ enum Noun { NOUN_LAMP = 0x56, NOUN_LANTERN = 0x57, NOUN_LARGE_NOTE = 0x58, - NOUN_LASSO = 0x59, NOUN_LEG = 0x5A, NOUN_LETTER = 0x5B, NOUN_LIGHT_FIXTURE = 0x5C, - NOUN_LOCK = 0x5D, NOUN_LOCKING_RAIL = 0x5E, NOUN_LOCKRAIL = 0x5F, NOUN_MANNEQUINS = 0x62, @@ -169,9 +180,7 @@ enum Noun { NOUN_PROSCENIUM_ARCH = 0x77, NOUN_PURCHASE_LINES = 0x78, NOUN_RAILING = 0x79, - NOUN_READ = 0x7A, NOUN_RED_FRAME = 0x7B, - NOUN_REMOVE = 0x7C, NOUN_ROPE = 0x7D, NOUN_RUG = 0x7E, NOUN_SANDBAG = 0x7F, @@ -201,7 +210,6 @@ enum Noun { NOUN_WARDROBE = 0x9E, NOUN_WASTE_BASKET = 0x9F, NOUN_WATER_PIPE = 0xA0, - NOUN_WEAR = 0xA1, NOUN_WEDDING_RING = 0xA2, NOUN_YELLOW_FRAME = 0xA3, NOUN_PROP = 0xA4, @@ -273,14 +281,12 @@ enum Noun { NOUN_DECORATIVE_VASE = 0xE9, NOUN_MARBLE_COLUMN = 0xEA, NOUN_BOX_FIVE = 0xEB, - NOUN_ENTER = 0xEC, NOUN_BOX_SIX = 0xED, NOUN_BOX_SEVEN = 0xEE, NOUN_BOX_EIGHT = 0xEF, NOUN_BOX_NINE = 0xF0, NOUN_STEP = 0xF1, NOUN_PANEL = 0xF2, - NOUN_WALK_BEHIND = 0xF3, NOUN_MIDDLE_DOORWAY = 0xF4, NOUN_LIGHT = 0xF5, NOUN_CANDLE = 0xF6, @@ -325,7 +331,6 @@ enum Noun { NOUN_MIDDLE_LEVEL = 0x11D, NOUN_LOWER_LEVEL = 0x11E, NOUN_LADDER = 0x11F, - NOUN_CLIMB = 0x120, NOUN_CHANDELIER_TRAP = 0x121, NOUN_PIECE_OF_WOOD = 0x122, NOUN_CUT_HEMP = 0x123, @@ -342,16 +347,12 @@ enum Noun { NOUN_MONSIEUR_RICHARD = 0x12E, NOUN_JULIE2 = 0x12F, NOUN_CABLE_HOOK = 0x130, - NOUN_ATTACH = 0x131, NOUN_ROPE_WITH_HOOK = 0x132, - NOUN_GRAPPLE = 0x133, NOUN_OAR = 0x134, NOUN_ORGAN = 0x135, NOUN_SIT_AT = 0x136, NOUN_ORGAN_BENCH = 0x137, - NOUN_SIT_ON = 0x138, NOUN_LARGE_CHAIR = 0x139, - NOUN_SIT_IN = 0x13A, NOUN_SARCOPHAGUS = 0x13B, NOUN_SKULL = 0x13C, NOUN_SKULLS = 0x13D, @@ -376,7 +377,6 @@ enum Noun { NOUN_BOX_TEN = 0x150, NOUN_FOYER = 0x151, NOUN_WALK_DOWN_STAIRCASE = 0x152, - NOUN_WALK_DOWN_STAIRS_TO = 0x153, NOUN_HAT_RACK = 0x154, NOUN_VASE = 0x155, NOUN_CLOTHES_DUMMY = 0x156, @@ -484,20 +484,7 @@ protected: SceneInfoPhantom(MADSEngine *vm) : SceneInfo(vm) {} }; -// TODO: Temporary, remove once implemented properly -class DummyScene : public PhantomScene { -public: - DummyScene(MADSEngine *vm) : PhantomScene(vm) { - warning("Unimplemented scene"); - } - - virtual void setup() {} - virtual void enter() {} - virtual void actions() {} -}; - } // End of namespace Phantom - } // End of namespace MADS #endif /* MADS_PHANTOM_SCENES_H */ diff --git a/engines/mads/phantom/phantom_scenes1.cpp b/engines/mads/phantom/phantom_scenes1.cpp index 2d991fd3bc..c86d2852c7 100644 --- a/engines/mads/phantom/phantom_scenes1.cpp +++ b/engines/mads/phantom/phantom_scenes1.cpp @@ -11,7 +11,7 @@ * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License @@ -22,6 +22,7 @@ #include "common/scummsys.h" #include "mads/mads.h" +#include "mads/conversations.h" #include "mads/scene.h" #include "mads/phantom/phantom_scenes.h" #include "mads/phantom/phantom_scenes1.h" @@ -31,72 +32,284 @@ namespace MADS { namespace Phantom { void Scene1xx::setAAName() { - // TODO - //int idx = 0; - //_game._aaName = Resources::formatAAName(idx); + _game._aaName = Resources::formatAAName(_globals[kTempInterface]); + _vm->_palette->setEntry(254, 43, 47, 51); } void Scene1xx::sceneEntrySound() { - // TODO + if (!_vm->_musicFlag) + return; + + if (_globals[kDoneBrieConv203] == 3) { + _vm->_sound->command(39); + } else { + switch (_scene->_nextSceneId) { + case 101: + if (!_game._visitedScenes._sceneRevisited) + _vm->_sound->command(38); + else + _vm->_sound->command(16); + break; + + case 102: + if (_scene->_priorSceneId == 104) + _vm->_sound->command(27); + else + _vm->_sound->command(16); + break; + + case 103: + if (_globals[kJacquesStatus] == 2) { + _vm->_sound->command(32); + _globals[kJacquesStatus] = 3; + } else + _vm->_sound->command(16); + break; + + case 104: + if ((_vm->_gameConv->_restoreRunning == 7) || (_scene->_priorSceneId == 301)) { + _vm->_sound->command(33); + } else if (!_globals[kRoom103104Transition] && !_globals[kObservedPhan104]) { + _vm->_sound->command(37); + _globals[kObservedPhan104] = true; + } else + _vm->_sound->command(16); + break; + + case 111: + if (_scene->_priorSceneId == 150) + _vm->_sound->command(38); + else if (_globals[kLeaveAngelMusicOn]) + _vm->_sound->command(34); + else + _vm->_sound->command(16); + break; + case 113: + if (_globals[kLeaveAngelMusicOn]) + _vm->_sound->command(34); + else if (_globals[kCurrentYear] == 1993) + _vm->_sound->command(36); + else + _vm->_sound->command(35); + break; + + default: + if ((_scene->_priorSceneId != 204) && (_scene->_nextSceneId != 150)) + _vm->_sound->command(16); + break; + } + } +} + +void Scene1xx::setPlayerSpritesPrefix() { + _vm->_sound->command(5); + + Common::String oldName = _game._player._spritesPrefix; + + if (!_game._player._forcePrefix) + _game._player._spritesPrefix = "RAL"; + + if (oldName != _game._player._spritesPrefix) + _game._player._spritesChanged = true; + + _game._player._scalingVelocity = true; } /*------------------------------------------------------------------------*/ Scene101::Scene101(MADSEngine *vm) : Scene1xx(vm) { - + _chanStatus = -1; + _wipeStatus = -1; + _callingStatus = -1; + _chandelierStatus = -1; + _callingFrame = -1; + _chandelierFrame = -1; + _convCounter = 0; + _talkCounter = -1; + _brieAnimId = 0; + _startWalkingFl = false; + _startWalking0Fl = false; + _anim0Running = false; + _anim1Running = false; + _startSittingFl = false; } void Scene101::synchronize(Common::Serializer &s) { Scene1xx::synchronize(s); - + s.syncAsSint16LE(_chanStatus); + s.syncAsSint16LE(_wipeStatus); + s.syncAsSint16LE(_callingStatus); + s.syncAsSint16LE(_chandelierStatus); + s.syncAsSint16LE(_callingFrame); + s.syncAsSint16LE(_chandelierFrame); + s.syncAsSint16LE(_convCounter); + s.syncAsSint16LE(_talkCounter); + s.syncAsSint16LE(_brieAnimId); + s.syncAsByte(_startWalkingFl); + s.syncAsByte(_startWalking0Fl); + s.syncAsByte(_anim0Running); + s.syncAsByte(_anim1Running); + s.syncAsByte(_startSittingFl); } void Scene101::setup() { - //setPlayerSpritesPrefix(); + setPlayerSpritesPrefix(); setAAName(); + _scene->addActiveVocab(NOUN_MONSIEUR_BRIE); } void Scene101::enter() { - // TODO + _vm->_disableFastwalk = true; + + if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) { + _chanStatus = _wipeStatus = -1; + _startWalkingFl = _startWalking0Fl = false; + _anim0Running = _anim1Running = false; + _startSittingFl = false; + } + + // Load Dialogs + _vm->_gameConv->get(0); + _vm->_gameConv->get(1); if (_globals[kCurrentYear] == 1993) { _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1)); - // TODO - //_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); } else { - // TODO + _scene->_hotspots.activate(NOUN_CHANDELIER, false); + } + + if (_globals[kBrieTalkStatus] == 0) { + _game._player.firstWalk(Common::Point(-20, 75), FACING_EAST, Common::Point(18, 79), FACING_EAST, true); + _callingStatus = 0; + _chandelierStatus = 3; + _game._player.setWalkTrigger(50); + + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('b', 9), 1); + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 8), 1); + + _anim0Running = true; + _anim1Running = true; + + _brieAnimId = _scene->_dynamicHotspots.add(NOUN_MONSIEUR_BRIE, VERB_WALKTO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots[_brieAnimId]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_brieAnimId, Common::Point(490, 119), FACING_NONE); + _scene->setDynamicAnim(_brieAnimId, _globals._animationIndexes[0], 0); + _scene->setDynamicAnim(_brieAnimId, _globals._animationIndexes[0], 1); + _scene->setDynamicAnim(_brieAnimId, _globals._animationIndexes[0], 2); + _scene->setDynamicAnim(_brieAnimId, _globals._animationIndexes[0], 3); + _scene->setDynamicAnim(_brieAnimId, _globals._animationIndexes[0], 4); + + int tmpIdx = _scene->_dynamicHotspots.add(NOUN_MONSIEUR_BRIE, VERB_WALKTO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(25, 80), FACING_NONE); + _scene->setDynamicAnim(tmpIdx, _globals._animationIndexes[1], 1); + _scene->setDynamicAnim(tmpIdx, _globals._animationIndexes[1], 2); + + _talkCounter = 0; + } else if (_globals[kBrieTalkStatus] == 1) { + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('b', 9), 1); + _brieAnimId = _scene->_dynamicHotspots.add(NOUN_MONSIEUR_BRIE, VERB_WALKTO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots[_brieAnimId]._articleNumber = PREP_ON; + _scene->setDynamicAnim(_brieAnimId, _globals._animationIndexes[1], 1); + _scene->setDynamicAnim(_brieAnimId, _globals._animationIndexes[1], 2); + _anim1Running = true; + _talkCounter = 0; + _chandelierStatus = 3; + + if (_vm->_gameConv->_restoreRunning == 1) { + _vm->_gameConv->run(1); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + _chandelierStatus = 4; + _scene->setAnimFrame(_globals._animationIndexes[1], 25); + } + } else if (_scene->_priorSceneId == 202) { + if (_globals[kJacquesStatus] == 1) + _globals[kJacquesStatus] = 2; + _game._player.firstWalk(Common::Point(-20, 75), FACING_EAST, Common::Point(18, 79), FACING_EAST, true); + } else if ((_scene->_priorSceneId == 102) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + _game._player.firstWalk(Common::Point(655, 130), FACING_WEST, Common::Point(625, 127), FACING_WEST, true); + _scene->setCamera(Common::Point(320, 0)); } - // TODO + sceneEntrySound(); } void Scene101::step() { - // TODO + if (_anim0Running) + handleAnimation0(); + + if ((_globals[kWalkerConverse] == 2) || (_globals[kWalkerConverse] == 3)) { + ++_convCounter; + if (_convCounter > 200) + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + } + + if (_anim1Running) { + handleAnimation1(); + + if (_scene->getAnimFrame(_globals._animationIndexes[1]) == 80) { + _game._player._stepEnabled = true; + _game._player.setWalkTrigger(55); + } + } + + if (_scene->_posAdjust.x > 200 && !_startSittingFl && (_globals[kBrieTalkStatus] != 2)) { + _startSittingFl = true; + _game._player.walk(Common::Point(490, 119), FACING_NORTHEAST); + _game._player._stepEnabled = false; + _game._player.setWalkTrigger(55); + _chandelierStatus = 4; + } + + if (_game._trigger == 55) { + _game._player._stepEnabled = true; + _vm->_gameConv->run(1); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + _chandelierFrame = -1; + _talkCounter = 0; + } + + if (_game._trigger == 50) { + _vm->_gameConv->run(0); + _callingStatus = 1; + } } void Scene101::preActions() { if (_action.isAction(VERB_EXIT_TO, NOUN_ORCHESTRA_PIT)) { - // TODO: Handle Brie - _game._player._walkOffScreenSceneId = 102; + if ((_globals[kBrieTalkStatus] == 2) || _startWalkingFl) { + _game._player._walkOffScreenSceneId = 102; + _globals[kBrieTalkStatus] = 2; + } else { + _vm->_gameConv->run(0); + _game._player._needToWalk = false; + } } else if (_action.isAction(VERB_EXIT_TO, NOUN_GRAND_FOYER)) { - // TODO: Handle Brie - _game._player._walkOffScreenSceneId = 202; - } else if (_action.isAction(VERB_TAKE, NOUN_MONSIEUR_BRIE)) { - _vm->_dialogs->show(10121); - } else if (_action.isAction(VERB_TALK_TO, NOUN_MONSIEUR_BRIE)) { - if (_globals[kBrieTalkStatus] == 2) + if ((_globals[kBrieTalkStatus] == 2) || _startWalkingFl) + _game._player._walkOffScreenSceneId = 202; + else { + _vm->_gameConv->run(0); _game._player._needToWalk = false; - } - - // TODO + } + } else if (_action.isAction(VERB_TAKE, NOUN_MONSIEUR_BRIE)) + _vm->_dialogs->show(10121); + else if (_action.isAction(VERB_TALK_TO, NOUN_MONSIEUR_BRIE) && (_globals[kBrieTalkStatus] == 2)) + _game._player._needToWalk = false; } void Scene101::actions() { - // TODO: Brie conversation - - // TODO: Look around - - if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_vm->_gameConv->_running == 0) + handleConversation0(); + else if (_vm->_gameConv->_running == 1) + handleConversation1(); + else if (_action._lookFlag) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(10110); + else + _vm->_dialogs->show(10111); + } else if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { if (_action.isObject(NOUN_AISLE)) { _vm->_dialogs->show(10112); } else if (_action.isObject(NOUN_CHANDELIER)) { @@ -106,8 +319,10 @@ void Scene101::actions() { } else if (_action.isObject(NOUN_SIDE_WALL)) { _vm->_dialogs->show(10115); } else if (_action.isObject(NOUN_SEATS)) { - // TODO: Finish this - _vm->_dialogs->show(10116); + if ((_globals[kBrieTalkStatus] > 1) || _startWalkingFl) + _vm->_dialogs->show(10119); + else + _vm->_dialogs->show(10116); } else if (_action.isObject(NOUN_GRAND_FOYER)) { _vm->_dialogs->show(10117); } else if (_action.isObject(NOUN_ORCHESTRA_PIT)) { @@ -115,64 +330,357 @@ void Scene101::actions() { } else if (_action.isObject(NOUN_MONSIEUR_BRIE)) { _vm->_dialogs->show(10120); } - - _game._player._stepEnabled = true; } else if (_action.isAction(VERB_TALK_TO, NOUN_MONSIEUR_BRIE)) { if (_globals[kBrieTalkStatus] == 2) _vm->_dialogs->show(10122); - _game._player._stepEnabled = true; - } else if (_action.isAction(VERB_TAKE, NOUN_MONSIEUR_BRIE)) { - _game._player._stepEnabled = true; + } else if (!_action.isAction(VERB_TAKE, NOUN_MONSIEUR_BRIE)) + return; + + _action._inProgress = false; +} + +void Scene101::handleConversation0() { + _vm->_gameConv->setHeroTrigger(90); + + if (_game._trigger == 90) { + _globals[kBrieTalkStatus] = 1; + _startWalking0Fl = true; + } +} + +void Scene101::handleConversation1() { + if ((_action._activeAction._verbId >= 0) && (_action._activeAction._verbId <= 27)) { + bool interlocutorFl = false; + + if (_game._trigger == 60) { + switch (_action._activeAction._verbId) { + case 0: + _chandelierStatus = 6; + _wipeStatus = 2; + break; + + case 1: + _chandelierStatus = 2; + _chanStatus = 9; + break; + + case 4: + _chandelierStatus = 0; + _chanStatus = -1; + _wipeStatus = -1; + break; + + case 8: + case 10: + case 18: + case 22: + case 24: + _startWalkingFl = true; + _chanStatus = -1; + _wipeStatus = -1; + _globals[kWalkerConverse] = 0; + _vm->_gameConv->setInterlocutorTrigger(105); + interlocutorFl = true; + break; + + case 12: + _chandelierStatus = 5; + _chanStatus = -1; + _wipeStatus = -1; + break; + + default: + break; + } + } + + if (!interlocutorFl) + _vm->_gameConv->setInterlocutorTrigger(60); + + _vm->_gameConv->setHeroTrigger(70); + + _talkCounter = 0; + + if (_game._trigger == 60) { + if (!_startWalkingFl) + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + + _chandelierStatus = 2; + } else if ((_game._trigger == 70) && !_startWalkingFl) { + _chandelierStatus = 4; + _chanStatus = -1; + _wipeStatus = -1; + if (!_startWalkingFl) + _globals[kWalkerConverse] = _vm->getRandomNumber(2, 3); + + _convCounter = 0; + } + } +} + +void Scene101::handleAnimation0() { + if (_scene->getAnimFrame(_globals._animationIndexes[0]) == _callingFrame) + return; + + _callingFrame = _scene->getAnimFrame(_globals._animationIndexes[0]); + int resetFrame = -1; + switch (_callingFrame) { + case 1: + case 9: + case 12: + if (_callingStatus == 1) { + if (_callingFrame == 9) { + if (_startWalking0Fl) { + resetFrame = 13; + _callingStatus = 3; + } else + _callingStatus = 2; + } else + resetFrame = 1; + } + + if (_callingStatus == 0) { + if (_startWalking0Fl) { + resetFrame = 60; + _callingStatus = 3; + } else + resetFrame = 0; + } + + if (_callingStatus == 2) { + if (_startWalking0Fl) { + resetFrame = 13; + _callingStatus = 3; + } else { + ++_talkCounter; + + if (_talkCounter < 18) { + if (_vm->getRandomNumber(1, 2) == 1) + resetFrame = 7; + else + resetFrame = 10; + } else { + resetFrame = 54; + _callingStatus = 0; + } + } + } + break; + + case 53: + _anim0Running = false; + _scene->freeAnimation(0); + break; + + case 59: + if (_startWalking0Fl) { + resetFrame = 60; + _callingStatus = 3; + } else { + resetFrame = 0; + _callingStatus = 0; + } + break; + + case 66: + resetFrame = 24; + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame); + _callingFrame = resetFrame; + } +} + +void Scene101::handleAnimation1() { + if (_scene->getAnimFrame(_globals._animationIndexes[1]) == _chandelierFrame) + return; + + _chandelierFrame = _scene->getAnimFrame(_globals._animationIndexes[1]); + int resetFrame = -1; + switch (_chandelierFrame) { + case 1: + if (_chandelierStatus == 3) + resetFrame = 0; + break; + + case 11: + case 14: + case 17: + case 19: + case 26: + case 44: + case 333: + if (_talkCounter == _chanStatus) { + _chandelierStatus = 0; + ++_talkCounter; + _chanStatus = -1; + } + + if (_talkCounter == _wipeStatus) { + _chandelierStatus = 6; + ++_talkCounter; + _wipeStatus = -1; + } + + if (_startWalkingFl) { + if (_vm->_gameConv->_running == 1) { + if (_talkCounter > 13) + _chandelierStatus = 1; + } else + _chandelierStatus = 1; + } + + switch (_chandelierStatus) { + case 0: + resetFrame = 27; + _chandelierStatus = 2; + break; + + case 1: + _globals[kBrieTalkStatus] = 2; + resetFrame = 45; + if (_vm->_gameConv->_running == 1) + _vm->_gameConv->stop(); + _scene->_dynamicHotspots.remove(_brieAnimId); + _game._player._stepEnabled = false; + break; + + case 2: + ++_talkCounter; + if (_talkCounter < 15) { + switch (_vm->getRandomNumber(1, 3)) { + case 1: + resetFrame = 12; + break; + + case 2: + resetFrame = 14; + break; + + case 3: + resetFrame = 17; + } + } else { + _chandelierStatus = 4; + resetFrame = 25; + } + break; + + case 4: + resetFrame = 25; + break; + + case 5: + resetFrame = 21; + _chandelierStatus = 2; + break; + + case 6: + resetFrame = 316; + _chandelierStatus = 2; + break; + + default: + break; + } + break; + + case 315: + _scene->freeAnimation(1); + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[1], resetFrame); + _chandelierFrame = resetFrame; } } /*------------------------------------------------------------------------*/ Scene102::Scene102(MADSEngine *vm) : Scene1xx(vm) { - _animRunningFl = false; + _anim0Running = false; } void Scene102::synchronize(Common::Serializer &s) { Scene1xx::synchronize(s); - s.syncAsByte(_animRunningFl); + s.syncAsByte(_anim0Running); } void Scene102::setup() { - //setPlayerSpritesPrefix(); + setPlayerSpritesPrefix(); setAAName(); } void Scene102::enter() { - _animRunningFl = false; + _anim0Running = false; _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0)); _globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RAL86"); if (_globals[kCurrentYear] == 1993) { _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1)); - // TODO - //_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); } else { - // TODO + _scene->_hotspots.activate(NOUN_CHANDELIER, false); } if (_scene->_priorSceneId == 101) { _game._player._playerPos = Common::Point(97, 79); _game._player._facing = FACING_SOUTHEAST; - // TODO + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 4); _game._player.walk(Common::Point(83, 87), FACING_SOUTHEAST); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); } else if (_scene->_priorSceneId == 104) { // Player fell from pit -> death - // TODO - } else if (_scene->_priorSceneId == 103 || _scene->_priorSceneId != -1) { + Common::Point deathPos = Common::Point(0, 0); + int deathScale = 0; + int deathDepth = 0; + _game._player._stepEnabled = false; + _game._player._visible = false; + + switch (_globals[36]) { + case 0: + deathPos = Common::Point(221, 57); + deathScale = 50; + deathDepth = 14; + break; + + case 1: + deathPos = Common::Point(219, 85); + deathScale = 60; + deathDepth = 6; + break; + + case 2: + deathPos = Common::Point(257, 138); + deathScale = 76; + deathDepth = 1; + break; + + default: + break; + } + _scene->_userInterface.emptyConversationList(); + _scene->_userInterface.setup(kInputConversation); + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], deathDepth); + _scene->_sequences.setPosition(_globals._sequenceIndexes[3], deathPos); + _scene->_sequences.setScale(_globals._sequenceIndexes[3], deathScale); + _scene->_sequences.addTimer(120, 65); + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 4); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + } else if (_scene->_priorSceneId == 103 || _scene->_priorSceneId != RETURNING_FROM_LOADING) { _game._player._playerPos = Common::Point(282, 145); _game._player._facing = FACING_WEST; - _animRunningFl = true; - // TODO: Door closing animation + _anim0Running = true; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 60); } else if (_scene->_priorSceneId == -1) { - // TODO + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 4); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); } @@ -180,52 +688,56 @@ void Scene102::enter() { } void Scene102::step() { - if (_game._trigger == 60) { // Door closes - // TODO - _animRunningFl = false; - } else if (_game._trigger == 65) { // Death - // TODO - _scene->_currentSceneId = 104; + if (_game._trigger == 60) { + // Door closes + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 4); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + _anim0Running = false; + } else if (_game._trigger == 65) { + // Death + if (_globals[kDeathLocation] == 0) + _vm->_dialogs->show(10232); + else + _vm->_dialogs->show(10229); + + _vm->_sound->command(16); + _scene->_nextSceneId = 104; } } void Scene102::preActions() { - if (_action.isAction(VERB_OPEN, NOUN_ORCHESTRA_DOOR) || _action.isAction(VERB_PUSH, NOUN_ORCHESTRA_DOOR)) { + if (_action.isAction(VERB_OPEN, NOUN_ORCHESTRA_DOOR) || _action.isAction(VERB_PUSH, NOUN_ORCHESTRA_DOOR)) _game._player.walk(Common::Point(282, 145), FACING_EAST); - } } void Scene102::actions() { if (_action.isAction(VERB_WALK_DOWN, NOUN_AISLE)) { _scene->_nextSceneId = 101; - _game._player._stepEnabled = true; - } - - if (_action.isAction(VERB_WALK_THROUGH, NOUN_ORCHESTRA_DOOR) || + } else if (_action.isAction(VERB_WALK_THROUGH, NOUN_ORCHESTRA_DOOR) || _action.isAction(VERB_PUSH, NOUN_ORCHESTRA_DOOR) || _action.isAction(VERB_OPEN, NOUN_ORCHESTRA_DOOR)) { - if (_animRunningFl) { - // TODO + if (_anim0Running) { + _scene->_sequences.addTimer(15, 70); + _game._player._stepEnabled = false; } else { - _scene->_nextSceneId = 103; // FIXME: temporary HACK - remove! - switch (_game._trigger) { case 70: // try again case 0: - // TODO + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 0), 1); + _game._player._stepEnabled = false; + _game._player._visible = false; break; case 1: _scene->_nextSceneId = 103; break; + default: + break; } } - - _game._player._stepEnabled = true; - } - - // TODO: Look around - - if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + } else if (_action._lookFlag) + _vm->_dialogs->show(10210); + else if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { if (_action.isObject(NOUN_PIT)) _vm->_dialogs->show(10211); else if (_action.isObject(NOUN_SEATS)) @@ -263,18 +775,8777 @@ void Scene102::actions() { _vm->_dialogs->show(10227); else if (_action.isObject(NOUN_CHANDELIER)) _vm->_dialogs->show(10231); + } else if (_action.isAction(VERB_CLOSE, NOUN_ORCHESTRA_DOOR)) + _vm->_dialogs->show(10228); + + _game._player._stepEnabled = false; +} + +/*------------------------------------------------------------------------*/ + +Scene103::Scene103(MADSEngine *vm) : Scene1xx(vm) { + _jacquesAction = -1; + _lastRandom = -1; + _standPosition = -1; + _hotspotPrompt1 = -1; + _hotspotPrompt2 = -1; + _hotspotPrompt3 = -1; + _hotspotPrompt4 = -1; + _hotspotPrompt5 = -1; + _hotspotRightFloor1 = -1; + _hotspotRightFloor2 = -1; + _hotspotLeftFloor1 = -1; + _hotspotLeftFloor2 = -1; + _hotspotGentleman = -1; + _convCount = -1; + _lastStairFrame = -1; + _lastJacquesFrame = -1; + _talkCount = -1; + + _anim0ActvFl = false; + _anim1ActvFl = false; + _anim2ActvFl = false; + _anim3ActvFl = false; + _anim4ActvFl = false; + _anim5ActvFl = false; + _anim6ActvFl = false; + _climbThroughTrapFl = false; + _guardFrameFl = false; + _sitFl = false; +} + +void Scene103::synchronize(Common::Serializer &s) { + Scene1xx::synchronize(s); + + s.syncAsSint16LE(_jacquesAction); + s.syncAsSint16LE(_lastRandom); + s.syncAsSint16LE(_standPosition); + s.syncAsSint16LE(_hotspotPrompt1); + s.syncAsSint16LE(_hotspotPrompt2); + s.syncAsSint16LE(_hotspotPrompt3); + s.syncAsSint16LE(_hotspotPrompt4); + s.syncAsSint16LE(_hotspotPrompt5); + s.syncAsSint16LE(_hotspotRightFloor1); + s.syncAsSint16LE(_hotspotRightFloor2); + s.syncAsSint16LE(_hotspotLeftFloor1); + s.syncAsSint16LE(_hotspotLeftFloor2); + s.syncAsSint16LE(_convCount); + s.syncAsSint16LE(_lastStairFrame); + + s.syncAsByte(_anim0ActvFl); + s.syncAsByte(_anim1ActvFl); + s.syncAsByte(_anim2ActvFl); + s.syncAsByte(_anim3ActvFl); + s.syncAsByte(_anim4ActvFl); + s.syncAsByte(_anim5ActvFl); + s.syncAsByte(_anim6ActvFl); + s.syncAsByte(_climbThroughTrapFl); + s.syncAsByte(_guardFrameFl); + s.syncAsByte(_sitFl); +} + +void Scene103::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + _scene->_variant = 0; + + if ((_globals[kPrompterStandStatus] == 1) || (_globals[kCurrentYear] == 1881)) { + _scene->_variant = 1; + if ((_globals[kJacquesStatus] == 0) && (_globals[kCurrentYear] == 1881)) + _scene->_variant = 2; + else if ((_globals[kJacquesStatus] >= 1) && (_globals[kCurrentYear] == 1881)) + _scene->_variant = 3; + } + + _scene->addActiveVocab(NOUN_PROMPTERS_STAND); + _scene->addActiveVocab(NOUN_JACQUES); + _scene->addActiveVocab(NOUN_GENTLEMAN); + _scene->addActiveVocab(VERB_CLIMB); +} + +void Scene103::enter() { + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _anim0ActvFl = false; + _anim1ActvFl = false; + _anim2ActvFl = false; + _anim3ActvFl = false; + _anim4ActvFl = false; + _anim5ActvFl = false; + _anim6ActvFl = false; + _climbThroughTrapFl = false; + _guardFrameFl = false; + _sitFl = false; + _jacquesAction = 1; + _lastRandom = 0; + _standPosition = 0; + } + + if (_globals[kJacquesStatus] >= 1) { + if (_game._objects.isInRoom(OBJ_KEY)) { + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 2)); + _globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RRD_9"); + } + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 3)); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('c', 1)); + _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('f', 1)); + } else { + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 0)); + _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('a', 3)); + } + + _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('x', 3)); + _globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('a', 2)); + _globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('f', 2)); + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1)); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RDR_6"); + + adjustRails(_scene->_variant); + + _scene->_hotspots.activate(NOUN_JACQUES, false); + _scene->_hotspots.activate(NOUN_KEY, false); + + _vm->_gameConv->get(12); + + if (_globals[kTrapDoorStatus] == 0) { + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 5); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + + _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, 2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 3); + } else if (_globals[kTrapDoorStatus] == 1) { + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + + _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 3); + } + + Common::Point promptPos; + Facing promptFacing; + + if (_globals[kJacquesStatus] == 0) { + promptPos = Common::Point(115, 142); + promptFacing = FACING_NORTHEAST; + } else { + promptPos = Common::Point(171, 142); + promptFacing = FACING_NORTHWEST; + } + + if ((_globals[kPrompterStandStatus] == 1) || (_globals[kCurrentYear] == 1881)) { + if (_globals[kJacquesStatus] >= 1) { + _globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1); + + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4); + _scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139)); + + } else { + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4); + _scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139)); + + _globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 1); + } + + _hotspotPrompt1 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(121, 79, 121 + 40, 79 + 63)); + _scene->_dynamicHotspots[_hotspotPrompt1]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotPrompt1, promptPos, promptFacing); + + _hotspotPrompt2 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(161, 67, 161 + 16, 67 + 75)); + _scene->_dynamicHotspots[_hotspotPrompt2]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotPrompt2, promptPos, promptFacing); + + _hotspotPrompt3 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(177, 90, 177 + 18, 90 + 52)); + _scene->_dynamicHotspots[_hotspotPrompt3]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotPrompt3, promptPos, promptFacing); + + _hotspotPrompt4 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(114, 100, 114 + 7, 100 + 38)); + _scene->_dynamicHotspots[_hotspotPrompt4]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotPrompt4, promptPos, promptFacing); + + _hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_CLIMB, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(121, 49, 121 + 40, 49 + 30)); + _scene->_dynamicHotspots[_hotspotPrompt5]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotPrompt5, Common::Point(196, 134), FACING_SOUTHWEST); + _scene->_dynamicHotspots.setCursor(_hotspotPrompt5, CURSOR_GO_UP); + + _hotspotRightFloor1 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(154, 6, 154 + 41, 6 + 6)); + _scene->_dynamicHotspots[_hotspotRightFloor1]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotRightFloor1, Common::Point(171, 142), FACING_NONE); + + _hotspotRightFloor2 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(114, 136, 114 + 32, 136 + 6)); + _scene->_dynamicHotspots[_hotspotRightFloor2]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotRightFloor2, Common::Point(127, 140), FACING_NONE); + + if ((_globals[kJacquesStatus] == 0) && (_globals[kCurrentYear] == 1881)) { + if (_globals[kJacquesNameIsKnown] >= 1) { + _hotspotGentleman = _scene->_dynamicHotspots.add(NOUN_JACQUES, VERB_WALKTO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(156, 116, 156 + 33, 116 + 31)); + _scene->_dynamicHotspots[_hotspotGentleman]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotGentleman, Common::Point(206, 148), FACING_NORTHWEST); + } else { + _hotspotGentleman = _scene->_dynamicHotspots.add(NOUN_GENTLEMAN, VERB_WALKTO, SYNTAX_MASC_NOT_PROPER, -1, Common::Rect(156, 116, 156 + 33, 116 + 31)); + _scene->_dynamicHotspots[_hotspotGentleman]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotGentleman, Common::Point(206, 148), FACING_NORTHWEST); + } + int tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(149, 140, 149 + 13, 140 + 7)); + _scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(155, 144), FACING_NONE); + + tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(187, 136, 187 + 8, 136 + 7)); + _scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(195, 139), FACING_NONE); + } else if ((_globals[kJacquesStatus] >= 1) && (_globals[kCurrentYear] == 1881)) { + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 3); + if (_game._objects.isInRoom(OBJ_KEY)) { + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14); + _scene->_hotspots.activate(NOUN_KEY, true); + } + _scene->_hotspots.activate(NOUN_JACQUES, true); + _scene->_dynamicHotspots.remove(_hotspotRightFloor2); + + int tmpIdx = _scene->_dynamicHotspots.add(NOUN_JACQUES, VERB_WALKTO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(114, 132, 114 + 30, 132 + 10)); + _scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(95, 144), FACING_NORTHEAST); + + tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(94, 129, 94 + 18, 129 + 4)); + _scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(95, 133), FACING_NONE); + + tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(94, 132, 94 + 3, 132 + 9)); + _scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(93, 135), FACING_NONE); + + tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(112, 150, 112 + 21, 150 + 3)); + _scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(118, 154), FACING_NONE); + + tmpIdx = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(98, 146, 98 + 21, 146 + 4)); + _scene->_dynamicHotspots[tmpIdx]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(104, 148), FACING_NONE); + } + } else if (_globals[kPrompterStandStatus] == 0) { + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4); + _scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(37, 139)); + + _hotspotPrompt1 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(2, 79, 2 + 40, 79 + 63)); + _scene->_dynamicHotspots[_hotspotPrompt1]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotPrompt1, Common::Point(59, 140), FACING_NORTHWEST); + + _hotspotPrompt2 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(42, 67, 42 + 16, 67 + 75)); + _scene->_dynamicHotspots[_hotspotPrompt2]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotPrompt2, Common::Point(59, 140), FACING_NORTHWEST); + + _hotspotPrompt3 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(58, 90, 58 + 18, 90 + 52)); + _scene->_dynamicHotspots[_hotspotPrompt3]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotPrompt3, Common::Point(59, 140), FACING_NORTHWEST); + + _hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_CLIMB, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(2, 49, 2 + 40, 49 + 30)); + _scene->_dynamicHotspots[_hotspotPrompt5]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotPrompt5, Common::Point(79, 132), FACING_SOUTHWEST); + _scene->_dynamicHotspots.setCursor(_hotspotPrompt5, CURSOR_GO_UP); + + _hotspotLeftFloor1 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(35, 137, 35 + 40, 137 + 5)); + _scene->_dynamicHotspots[_hotspotLeftFloor1]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotLeftFloor1, Common::Point(59, 140), FACING_NONE); + _hotspotLeftFloor2 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(76, 129, 76 + 6, 129 + 6)); + _scene->_dynamicHotspots[_hotspotLeftFloor2]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotLeftFloor2, Common::Point(80, 135), FACING_NONE); + } + + if ((_globals[kJacquesStatus] == 0) && (_globals[kCurrentYear] == 1881)) { + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('j', 1), 1); + _anim0ActvFl = true; + _scene->setAnimFrame(_globals._animationIndexes[0], 9); + } + + if (_scene->_priorSceneId == 104) { + _game._player._stepEnabled = false; + _game._player._visible = false; + if (_globals[kRoom103104Transition] == 0) { + _globals[kRoom103104Transition] = 1; + _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 4); + _standPosition = 1; + _game._player._playerPos = Common::Point(79, 132); + _scene->_sequences.addTimer(1, 100); + } else { + _standPosition = 2; + _globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('w', 1), 0); + _anim3ActvFl = true; + _game._player._stepEnabled = true; + _game._player._playerPos = Common::Point(196, 134); + _scene->setAnimFrame(_globals._animationIndexes[3], 36); + + _scene->deleteSequence(_globals._sequenceIndexes[3]); + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13); + _scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139)); + } + + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + } else if (_scene->_priorSceneId == 102) { + _game._player.firstWalk(Common::Point(-20, 140), FACING_EAST, Common::Point(15, 147), FACING_EAST, true); + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + } else if ((_scene->_priorSceneId == 105) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + _game._player._playerPos = Common::Point(287, 135); + _game._player._facing = FACING_WEST; + _game._player._stepEnabled = false; + _game._player.walk(Common::Point(252, 134), FACING_WEST); + _game._player.setWalkTrigger(65); + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 6); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + } else if (_scene->_priorSceneId == -1) { + if (_standPosition == 1) { + _game._player._visible = false; + _globals._animationIndexes[5] = _scene->loadAnimation(formAnimName('w', 3), 0); + _anim5ActvFl = true; + _scene->setAnimFrame(_globals._animationIndexes[5], 33); + } else if (_standPosition == 2) { + _scene->deleteSequence(_globals._sequenceIndexes[3]); + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13); + _scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139)); + _game._player._visible = false; + _globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('w', 1), 0); + _anim3ActvFl = true; + _game._player._stepEnabled = true; + _scene->setAnimFrame(_globals._animationIndexes[3], 36); + } else if (_vm->_gameConv->_restoreRunning == 12) { + _vm->_gameConv->run(12); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + _vm->_gameConv->exportValue(_globals[kMusicSelected]); + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + } + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + } + + sceneEntrySound(); +} + +void Scene103::step() { + if (_anim0ActvFl) + handleJacquesAnim(); + + if (_anim3ActvFl) + climbRightStairs(); + + if (_anim5ActvFl) + climbLeftStairs(); + + if (_anim4ActvFl) + descendRightStairs(); + + if (_anim6ActvFl) + descendLeftStairs(); + + if ((_globals[kWalkerConverse] == 2) || (_globals[kWalkerConverse] == 3)) { + ++_convCount; + if (_convCount > 200) + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + } + + switch (_game._trigger) { + case 65: + _scene->deleteSequence(_globals._sequenceIndexes[1]); + _globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 6); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 66); + _vm->_sound->command(66); + break; + + case 66: { + int syncIdx = _globals._sequenceIndexes[1]; + _vm->_sound->command(25); + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[1], SYNC_SEQ, syncIdx); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + _game._player._stepEnabled = true; + } + break; + + case 80: + _scene->_nextSceneId = 104; + _scene->_reloadSceneFlag = true; + break; + + default: + break; + } + + switch (_game._trigger) { + case 100: + _scene->deleteSequence(_globals._sequenceIndexes[10]); + _globals._sequenceIndexes[10] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[10], false, 6, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 101); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], -1, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 4); + break; + + case 101: + _globals._animationIndexes[5] = _scene->loadAnimation(formAnimName('w', 3), 0); + _anim5ActvFl = true; + _scene->setAnimFrame(_globals._animationIndexes[5], 33); + _game._player._stepEnabled = true; + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[5], SYNC_SEQ, _globals._sequenceIndexes[10]); + break; + + default: + break; + } + + switch (_game._trigger) { + case 0: + if (_anim1ActvFl) { + if ((_scene->getAnimFrame(_globals._animationIndexes[1]) == 10) && !_guardFrameFl) { + _vm->_sound->command(64); + _guardFrameFl = true; + _scene->deleteSequence(_globals._sequenceIndexes[0]); + _scene->deleteSequence(_globals._sequenceIndexes[9]); + _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 105); + } + } else if (_anim2ActvFl) { + if ((_scene->getAnimFrame(_globals._animationIndexes[2]) == 7) && !_guardFrameFl) { + _vm->_sound->command(64); + _guardFrameFl = true; + _scene->deleteSequence(_globals._sequenceIndexes[0]); + _scene->deleteSequence(_globals._sequenceIndexes[9]); + _globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 110); + } + } + break; + + case 105: + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 2); + _guardFrameFl = false; + break; + + case 110: + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 2); + _guardFrameFl = false; + break; + + default: + break; + } + + if (_globals[kJacquesStatus] == 3) { + warning("TODO: add a check on the return value of _vm->_sound->command ???"); + _vm->_sound->command(38); + } +} + +void Scene103::preActions() { + if (_action.isAction(VERB_OPEN, NOUN_DOOR)) + _game._player._needToWalk = true; + + if (_action.isAction(VERB_OPEN, NOUN_DOOR_TO_PIT)) { + _game._player.walk(Common::Point(0, 150), FACING_WEST); + _game._player._walkOffScreenSceneId = 102; + } + + if ((_standPosition != 0) && !_action.isAction(VERB_CLIMB_THROUGH, NOUN_TRAP_DOOR) && + !_action.isAction(VERB_OPEN, NOUN_TRAP_DOOR) && + !_action.isAction(VERB_CLIMB, NOUN_PROMPTERS_STAND) && + !_action.isAction(VERB_PUSH, NOUN_TRAP_DOOR) && + !_action.isAction(VERB_LOOK_THROUGH, NOUN_PROMPTERS_BOX) && + !_action.isAction(VERB_PULL, NOUN_TRAP_DOOR)) { + + if (_action.isAction(VERB_PULL) || _action.isAction(VERB_PUSH)) { + if (!_action.isObject(NOUN_LEVER) && !_game._trigger) + _game._player._needToWalk = false; + } + + if ((_action.isAction(VERB_PUSH, NOUN_PROMPTERS_STAND)) || (_action.isAction(VERB_PULL, NOUN_PROMPTERS_STAND))) { + if (!_game._trigger) + _game._player._needToWalk = true; + } + + if (_game._player._needToWalk) { + if (_globals[kPrompterStandStatus] == 0) { + switch (_game._trigger) { + case 0: + _scene->freeAnimation(5); + _game._player._readyToWalk = false; + _game._player._visible = false; + _game._player._stepEnabled = false; + _anim5ActvFl = false; + _anim6ActvFl = true; + _globals._animationIndexes[6] = _scene->loadAnimation(formAnimName('w', 4), 1); + break; + + case 1: + _game._player._playerPos = Common::Point(79, 132); + _game._player._stepEnabled = true; + _game._player._visible = true; + _standPosition = 0; + _game._player._readyToWalk = true; + if (_action.isAction(VERB_PUSH, NOUN_PROMPTERS_STAND)) + _game._player._needToWalk = false; + _anim6ActvFl = false; + _game._player.resetFacing(FACING_NORTHEAST); + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[6]); + break; + + default: + break; + } + } else { + switch (_game._trigger) { + case 0: + _scene->freeAnimation(3); + _game._player._readyToWalk = false; + if (_action.isAction(VERB_PUSH, NOUN_PROMPTERS_STAND)) + _game._player._needToWalk = true; + _game._player._visible = false; + _game._player._stepEnabled = false; + _anim3ActvFl = false; + _anim4ActvFl = true; + _globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('w', 2), 1); + break; + + case 1: + _game._player._playerPos = Common::Point(196, 134); + _game._player._stepEnabled = true; + _game._player._readyToWalk = true; + if (_action.isAction(VERB_PUSH, NOUN_PROMPTERS_STAND)) + _game._player._needToWalk = false; + _game._player._visible = true; + _standPosition = 0; + _anim4ActvFl = false; + _game._player.resetFacing(FACING_NORTHEAST); + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[4]); + break; + + default: + break; + } + } + } + } + + if (_standPosition == 0) { + if ((_action.isAction(VERB_PUSH, NOUN_PROMPTERS_STAND)) || (_action.isAction(VERB_PULL, NOUN_PROMPTERS_STAND))) { + if (_globals[kCurrentYear] == 1993) { + if (_globals[kPrompterStandStatus] == 0) + _game._player.walk(Common::Point(2, 138), FACING_WEST); + else + _game._player.walk(Common::Point(176, 142), FACING_WEST); + } + } + } + + if (_action.isAction(VERB_LOOK_THROUGH, NOUN_PROMPTERS_BOX) && (_standPosition == 0) && (_globals[kPrompterStandStatus] == 0) && (_globals[kCurrentYear] == 1993)) + _game._player.walk(Common::Point(79, 132), FACING_SOUTHWEST); + + if (_action.isAction(VERB_CLIMB_THROUGH, NOUN_TRAP_DOOR) && (_standPosition == 0) && (_globals[kPrompterStandStatus] == 1) && (_globals[kTrapDoorStatus] == 0)) + _game._player.walk(Common::Point(196, 134), FACING_SOUTHWEST); + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_PIT)) + _game._player._walkOffScreenSceneId = 102; + + if ((_action.isAction(VERB_OPEN, NOUN_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_DOOR) || _action.isAction(VERB_LOCK, NOUN_DOOR)) && (_standPosition == 0)) + _game._player.walk(Common::Point(252, 134), FACING_EAST); +} + +void Scene103::actions() { + if (_action.isAction(VERB_OPEN, NOUN_DOOR_TO_PIT)) { + _scene->_nextSceneId = 102; + _action._inProgress = false; + return; + } + + if (_vm->_gameConv->_running == 12) { + process_conv_jacques(); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLIMB_THROUGH, NOUN_TRAP_DOOR)) { + if (_globals[kTrapDoorStatus] == 1) { + _vm->_dialogs->show(10333); + _action._inProgress = false; + return; + } else if (_globals[kPrompterStandStatus] == 0) { + _vm->_dialogs->show(10341); + _action._inProgress = false; + return; + } + } + + if ((_action.isAction(VERB_LOOK_THROUGH, NOUN_PROMPTERS_BOX)) && (_globals[kPrompterStandStatus] == 1)) { + _vm->_dialogs->show(10342); + _action._inProgress = false; + return; + } + + if ((_action.isAction(VERB_CLIMB, NOUN_PROMPTERS_STAND) && _standPosition == 0) || + (_action.isAction(VERB_LOOK_THROUGH, NOUN_PROMPTERS_BOX) && (_standPosition == 0)) || + (_action.isAction(VERB_CLIMB_THROUGH, NOUN_TRAP_DOOR) && (_standPosition == 0))) { + if (_globals[kPrompterStandStatus] == 0) { + if (_game._trigger == 0) { + if (_action.isAction(VERB_LOOK_THROUGH, NOUN_PROMPTERS_BOX)) { + _sitFl = true; + _globals._animationIndexes[5] = _scene->loadAnimation(formAnimName('w', 3), 115); + } else + _globals._animationIndexes[5] = _scene->loadAnimation(formAnimName('w', 3), 0); + + _game._player._visible = false; + _game._player._stepEnabled = false; + _anim5ActvFl = true; + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[5], SYNC_PLAYER, 0); + _action._inProgress = false; + return; + } + } else if (_game._trigger == 0) { + if (_action.isAction(VERB_CLIMB_THROUGH, NOUN_TRAP_DOOR)) { + _climbThroughTrapFl = true; + _globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('w', 1), 120); + } else + _globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('w', 1), 0); + + _game._player._visible = false; + _game._player._stepEnabled = false; + _anim3ActvFl = true; + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[3], SYNC_PLAYER, 0); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_CLIMB, NOUN_PROMPTERS_STAND) && (_standPosition != 0)) { + _action._inProgress = false; + return; + } + + if ((_action.isAction(VERB_PUSH, NOUN_PROMPTERS_STAND)) || (_action.isAction(VERB_PULL, NOUN_PROMPTERS_STAND))) { + if (_globals[kCurrentYear] == 1993) { + if (_globals[kPrompterStandStatus] == 0) { + switch (_game._trigger) { + case 0: + if (_globals[kPrompterStandStatus] == 0) { + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('s', 1), 75); + _game._player._priorTimer = _scene->_frameStartTime; + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0); + _scene->deleteSequence(_globals._sequenceIndexes[3]); + } + break; + + case 75: + if (_globals[kPrompterStandStatus] == 0) { + _globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 1); + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4); + _scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139)); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_ANIM, _globals._animationIndexes[0]); + _globals[kPrompterStandStatus] = 1; + _game._player._stepEnabled = true; + _game._player._visible = true; + _game._player._playerPos = Common::Point(117, 139); + _game._player.resetFacing(FACING_EAST); + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); + + _scene->_dynamicHotspots.remove(_hotspotPrompt1); + _scene->_dynamicHotspots.remove(_hotspotPrompt2); + _scene->_dynamicHotspots.remove(_hotspotPrompt3); + _scene->_dynamicHotspots.remove(_hotspotPrompt5); + _scene->_dynamicHotspots.remove(_hotspotLeftFloor1); + _scene->_dynamicHotspots.remove(_hotspotLeftFloor2); + + _hotspotPrompt1 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(121, 79, 121 + 40, 79 + 63)); + _scene->_dynamicHotspots[_hotspotPrompt1]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotPrompt1, Common::Point(171, 142), FACING_NORTHWEST); + + _hotspotPrompt2 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(161, 67, 161 + 16, 67 + 75)); + _scene->_dynamicHotspots[_hotspotPrompt2]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotPrompt2, Common::Point(171, 142), FACING_NORTHWEST); + + _hotspotPrompt3 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(177, 90, 177 + 18, 90 + 52)); + _scene->_dynamicHotspots[_hotspotPrompt3]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotPrompt3, Common::Point(171, 142), FACING_NORTHWEST); + + _hotspotPrompt4 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(114, 100, 114 + 7, 100 + 38)); + _scene->_dynamicHotspots[_hotspotPrompt4]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotPrompt4, Common::Point(171, 142), FACING_NORTHWEST); + + _hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_CLIMB, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(121, 49, 121 + 40, 49 + 30)); + _scene->_dynamicHotspots[_hotspotPrompt5]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotPrompt5, Common::Point(196, 134), FACING_SOUTHWEST); + _scene->_dynamicHotspots.setCursor(_hotspotPrompt5, CURSOR_GO_UP); + + _hotspotRightFloor1 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(154, 6, 154 + 41, 6 + 6)); + _scene->_dynamicHotspots[_hotspotRightFloor1]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotRightFloor1, Common::Point(171, 142), FACING_NONE); + + _hotspotRightFloor2 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(114, 136, 114 + 32, 132 + 6)); + _scene->_dynamicHotspots[_hotspotRightFloor2]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotRightFloor2, Common::Point(127, 140), FACING_NONE); + + _scene->changeVariant(1); + adjustRails(1); + } + break; + + default: + break; + } + } else { + switch (_game._trigger) { + case 0: + if (_globals[kPrompterStandStatus] == 1) { + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('s', 2), 75); + _game._player._priorTimer = _scene->_frameStartTime; + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0); + _scene->deleteSequence(_globals._sequenceIndexes[12]); + _scene->deleteSequence(_globals._sequenceIndexes[3]); + } + break; + + case 75: + if (_globals[kPrompterStandStatus] == 1) { + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4); + _scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(37, 139)); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_ANIM, _globals._animationIndexes[0]); + _globals[kPrompterStandStatus] = 0; + _game._player._stepEnabled = true; + _game._player._visible = true; + _game._player._playerPos = Common::Point(62, 142); + _game._player.resetFacing(FACING_WEST); + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); + _scene->_dynamicHotspots.remove(_hotspotPrompt1); + _scene->_dynamicHotspots.remove(_hotspotPrompt2); + _scene->_dynamicHotspots.remove(_hotspotPrompt3); + _scene->_dynamicHotspots.remove(_hotspotPrompt4); + _scene->_dynamicHotspots.remove(_hotspotPrompt5); + _scene->_dynamicHotspots.remove(_hotspotRightFloor1); + _scene->_dynamicHotspots.remove(_hotspotRightFloor2); + + _hotspotPrompt1 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(2, 79, 2 + 40, 79 + 63)); + _scene->_dynamicHotspots[_hotspotPrompt1]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotPrompt1, Common::Point(59, 140), FACING_NORTHWEST); + + _hotspotPrompt2 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(42, 67, 42 + 16, 67 + 75)); + _scene->_dynamicHotspots[_hotspotPrompt2]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotPrompt2, Common::Point(59, 140), FACING_NORTHWEST); + + _hotspotPrompt3 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(58, 90, 58 + 18, 90 + 52)); + _scene->_dynamicHotspots[_hotspotPrompt3]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotPrompt3, Common::Point(59, 140), FACING_NORTHWEST); + + _hotspotLeftFloor1 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(35, 137, 35 + 40, 137 + 5)); + _scene->_dynamicHotspots[_hotspotLeftFloor1]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotLeftFloor1, Common::Point(59, 140), FACING_NONE); + + _hotspotLeftFloor2 = _scene->_dynamicHotspots.add(NOUN_FLOOR, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(76, 129, 76 + 6, 129 + 6)); + _scene->_dynamicHotspots[_hotspotLeftFloor2]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotLeftFloor2, Common::Point(80, 135), FACING_NONE); + + _hotspotPrompt5 = _scene->_dynamicHotspots.add(NOUN_PROMPTERS_STAND, VERB_CLIMB, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(2, 49, 2 + 40, 49 + 30)); + _scene->_dynamicHotspots[_hotspotPrompt5]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotPrompt5, Common::Point(79, 132), FACING_SOUTHWEST); + _scene->_dynamicHotspots.setCursor(_hotspotPrompt5, CURSOR_GO_UP); + + _scene->changeVariant(0); + adjustRails(0); + } + break; + + default: + break; + } + } + } else if (_globals[kJacquesNameIsKnown]) + _vm->_dialogs->show(10340); else + _vm->_dialogs->show(10350); + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_DOOR) || _action.isAction(VERB_LOCK, NOUN_DOOR)) { + if ((_globals[kCurrentYear] == 1881) && !_action.isAction(VERB_LOCK, NOUN_DOOR) && !_action.isAction(VERB_UNLOCK, NOUN_DOOR)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], false, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 3, 70); + break; + + case 2: + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[2]); + _game._player.walk(Common::Point(295, 132), FACING_WEST); + _scene->_sequences.addTimer(180, 3); + break; + + case 3: + _scene->_nextSceneId = 105; + break; + + case 70: + _vm->_sound->command(24); + _scene->deleteSequence(_globals._sequenceIndexes[1]); + _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 71); + _vm->_sound->command(66); + break; + + case 71: { + int oldIdx = _globals._sequenceIndexes[1]; + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -2); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[1], SYNC_SEQ, oldIdx); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + } + break; + + default: + break; + } + } else { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 1); + break; + + case 1: { + int oldIdx = _globals._sequenceIndexes[2]; + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 4); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[2], SYNC_SEQ, oldIdx); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], false); + _scene->_sequences.addTimer(15, 2); + _vm->_sound->command(73); + } + break; + + case 2: + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], false); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 3); + break; + + case 3: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[2]); + _game._player._visible = true; + if (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK)) + _vm->_dialogs->show(00032); + else + _vm->_dialogs->show(10335); + + _game._player._stepEnabled = true; + break; + + default: + break; + } + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_KEY) && (_game._objects.isInRoom(OBJ_KEY) || _game._trigger)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], false, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 5, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + _action._inProgress = false; + return; + + case 1: + _scene->deleteSequence(_globals._sequenceIndexes[5]); + _scene->_hotspots.activate(NOUN_KEY, false); + _game._objects.addToInventory(OBJ_KEY); + _vm->_sound->command(26); + _action._inProgress = false; + return; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]); + _game._player._visible = true; + _scene->_sequences.addTimer(20, 3); + _action._inProgress = false; + return; + + case 3: + _globals[kPlayerScore] += 5; + _vm->_dialogs->showItem(OBJ_KEY, 800, 0); + _game._player._stepEnabled = true; + _action._inProgress = false; + return; + + default: + break; + } + } + + if (_action.isAction(VERB_TALK_TO, NOUN_GENTLEMAN) || _action.isAction(VERB_TALK_TO, NOUN_JACQUES)) { + if (_globals[kJacquesStatus] == 0) { + _vm->_gameConv->run(12); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + _vm->_gameConv->exportValue(_globals[kMusicSelected]); + } else + _vm->_dialogs->show(10343); + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLIMB_THROUGH, NOUN_TRAP_DOOR) || _climbThroughTrapFl) { + if ((_standPosition == 2) && (_globals[kTrapDoorStatus] == 0)) { + switch (_game._trigger) { + case 0: + case 120: + if (!(_globals[kPlayerScoreFlags] & 1)) { + _globals[kPlayerScoreFlags] |= 1; + _globals[kPlayerScore] += 3; + } + + _scene->freeAnimation(3); + _anim3ActvFl = false; + _climbThroughTrapFl = false; + _game._player._stepEnabled = false; + _globals._sequenceIndexes[11] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[11], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[11], 5); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[11], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 1); + break; + + case 1: + _globals[kRoom103104Transition] = 1; + _scene->_nextSceneId = 104; + break; + + default: + break; + } + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK_THROUGH, NOUN_PROMPTERS_BOX) || _sitFl) { + if (_standPosition == 1) { + switch (_game._trigger) { + case 0: + case 115: + _scene->freeAnimation(5); + _anim5ActvFl = false; + _game._player._stepEnabled = false; + _globals._sequenceIndexes[10] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[10], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 4); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 1); + if (!_sitFl) + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[10], SYNC_ANIM, _globals._animationIndexes[5]); + _sitFl = false; + break; + + case 1: + _globals[kRoom103104Transition] = 0; + _scene->_nextSceneId = 104; + break; + + default: + break; + } + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_PUSH, NOUN_LEVER) || _action.isAction(VERB_PULL, NOUN_LEVER)) { + if (_globals[kTrapDoorStatus] == 1) { + switch (_game._trigger) { + case 0: + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('l', 1), 1); + _anim1ActvFl = true; + _game._player._visible = false; + _game._player._stepEnabled = false; + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[1], SYNC_PLAYER, 0); + break; + + case 1: + _anim1ActvFl = false; + _game._player._visible = true; + _globals[kTrapDoorStatus] = 0; + _game._player._stepEnabled = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[1]); + break; + + default: + break; + } + } else { + switch (_game._trigger) { + case 0: + _globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('l', 2), 1); + _anim2ActvFl = true; + _game._player._visible = false; + _game._player._stepEnabled = false; + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[2], SYNC_PLAYER, 0); + break; + + case 1: + _anim2ActvFl = false; + _game._player._visible = true; + _globals[kTrapDoorStatus] = 1; + _game._player._stepEnabled = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[2]); + break; + + default: + break; + } + } + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + if ((_globals[kCurrentYear] == 1881) && (_globals[kJacquesStatus] >= 1)) + _vm->_dialogs->show(10311); + else + _vm->_dialogs->show(10310); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_PROMPTERS_STAND)) { + if (_globals[kJacquesStatus] >= 1) + _vm->_dialogs->show(10349); + else if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(10312); + else + _vm->_dialogs->show(10345); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(10313); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TRAP_CEILING)) { + _vm->_dialogs->show(10314); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR)) { + _vm->_dialogs->show(10315); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR_TO_PIT)) { + _vm->_dialogs->show(10316); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(10317); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PROMPTERS_BOX)) { + _vm->_dialogs->show(10318); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TRAP_DOOR)) { + _vm->_dialogs->show(10319); + _action._inProgress = false; return; + } + + if (_action.isObject(NOUN_JUNK)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(10320); + else + _vm->_dialogs->show(10346); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CARTON)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(10321); + else + _vm->_dialogs->show(10347); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GARBAGE_CAN)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(10322); + else + _vm->_dialogs->show(10348); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CABLE)) { + _vm->_dialogs->show(10323); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_JACQUES) || _action.isObject(NOUN_GENTLEMAN)) { + if (_globals[kJacquesStatus] == 0) + _vm->_dialogs->show(10324); + else + _vm->_dialogs->show(10325); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_KEY) && _game._objects.isInRoom(OBJ_KEY)) { + _vm->_dialogs->show(10326); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_STAIR_UNIT)) { + _vm->_dialogs->show(10327); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_EXPOSED_BRICK)) { + _vm->_dialogs->show(10328); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WATER_PIPE)) { + _vm->_dialogs->show(10329); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PROMPTERS_SEAT)) { + _vm->_dialogs->show(10338); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LEVER)) { + _vm->_dialogs->show(10339); + _action._inProgress = false; + return; + } + + } + + if (_action.isAction(VERB_CLOSE, NOUN_DOOR_TO_PIT)) { + _vm->_dialogs->show(10331); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLOSE, NOUN_DOOR)) { + _vm->_dialogs->show(10331); + _action._inProgress = false; + return; + } + + if ((_action.isAction(VERB_OPEN, NOUN_TRAP_DOOR)) || (_action.isAction(VERB_CLOSE, NOUN_TRAP_DOOR))) { + _vm->_dialogs->show(10344); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_JACQUES) || _action.isAction(VERB_TAKE, NOUN_GENTLEMAN)) { + if (_globals[kJacquesStatus] == 0) { + if (_globals[kJacquesNameIsKnown]) + _vm->_dialogs->show(10336); + else + _vm->_dialogs->show(10351); + } else + _vm->_dialogs->show(10337); + _action._inProgress = false; + return; + } +} + +void Scene103::adjustRails(int variant) { + switch (variant) { + case 0: + _scene->_rails.disableNode(3); + _scene->_rails.disableNode(4); + _scene->_rails.disableNode(5); + _scene->_rails.disableNode(6); + _scene->_rails.disableNode(12); + _scene->_rails.disableNode(13); + _scene->_rails.disableNode(14); + break; + + case 1: + _scene->_rails.disableNode(1); + _scene->_rails.disableNode(2); + _scene->_rails.disableNode(3); + _scene->_rails.disableNode(4); + _scene->_rails.disableNode(5); + _scene->_rails.disableNode(6); + _scene->_rails.disableNode(7); + _scene->_rails.disableNode(9); + _scene->_rails.disableNode(10); + _scene->_rails.disableNode(11); + break; + + case 2: + _scene->_rails.disableNode(1); + _scene->_rails.disableNode(2); + _scene->_rails.disableNode(5); + _scene->_rails.disableNode(6); + _scene->_rails.disableNode(7); + _scene->_rails.disableNode(9); + _scene->_rails.disableNode(10); + _scene->_rails.disableNode(11); + break; + + case 3: + _scene->_rails.disableNode(1); + _scene->_rails.disableNode(2); + _scene->_rails.disableNode(3); + _scene->_rails.disableNode(4); + _scene->_rails.disableNode(10); + _scene->_rails.disableNode(11); + break; + + default: + break; + } +} + +void Scene103::handleJacquesAnim() { + if (_scene->getAnimFrame(_globals._animationIndexes[0]) == _lastJacquesFrame) + return; + + _lastJacquesFrame = _scene->getAnimFrame(_globals._animationIndexes[0]); + int resetFrame = -1; + int random; + + switch (_lastJacquesFrame) { + case 1: + case 2: + case 3: + case 9: + case 17: + case 23: + case 33: + case 51: + switch (_jacquesAction) { + case 2: + random = 4; + _jacquesAction = 0; + break; + + case 3: + random = 5; + _jacquesAction = 0; + break; + + case 4: + random = 6; + break; + + case 0: + random = _vm->getRandomNumber(1, 3); + ++_talkCount; + if (_talkCount > 22) { + _jacquesAction = 1; + random = 9; + } + break; + + default: + random = _vm->getRandomNumber(6, 50); + while (_lastRandom == random) + random = _vm->getRandomNumber(6, 50); + + _lastRandom = random; + break; + } + + switch (random) { + case 1: + resetFrame = 0; + break; + + case 2: + resetFrame = 1; + break; + + case 3: + resetFrame = 2; + break; + + case 4: + resetFrame = 4; + break; + + case 5: + resetFrame = 10; + break; + + case 6: + resetFrame = 34; + break; + + case 7: + resetFrame = 24; + break; + + case 8: + resetFrame = 18; + break; + + default: + resetFrame = 8; + break; + } + break; + + case 36: + case 40: + case 48: + switch (_jacquesAction) { + case 0: + case 2: + case 3: + random = 2; + break; + + case 4: + random = 1; + _jacquesAction = 0; + break; + + default: + random = _vm->getRandomNumber(2, 50); + while (_lastRandom == random) + random = _vm->getRandomNumber(2, 50); + _lastRandom = random; + break; + } + + switch (random) { + case 1: + resetFrame = 37; + break; + + case 2: + resetFrame = 49; + break; + + case 3: + resetFrame = 41; + break; + + default: + resetFrame = 35; + break; + } + break; + + case 44: + random = _vm->getRandomNumber(1, 50); + while (_lastRandom == random) + random = _vm->getRandomNumber(1, 50); + + _lastRandom = random; + + switch (_jacquesAction) { + case 0: + case 2: + case 3: + case 4: + random = 1; + break; + + default: + random = _vm->getRandomNumber(1, 50); + while (_lastRandom == random) + random = _vm->getRandomNumber(1, 50); + _lastRandom = random; + break; + } + switch (random) { + case 1: + resetFrame = 45; + break; + + default: + resetFrame = 43; + break; + } + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame); + _lastJacquesFrame = resetFrame; + } +} + +void Scene103::climbRightStairs() { + if (_scene->getAnimFrame(_globals._animationIndexes[3]) == _lastStairFrame) + return; + + _lastStairFrame = _scene->getAnimFrame(_globals._animationIndexes[3]); + int stairsResetFrame = -1; + + if (_lastStairFrame == 37) { + stairsResetFrame = 36; + _standPosition = 2; _game._player._stepEnabled = true; } - if (_action.isAction(VERB_CLOSE, NOUN_ORCHESTRA_DOOR)) { - _vm->_dialogs->show(10228); + if (_lastStairFrame == 2) { + _scene->deleteSequence(3); + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13); + _scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139)); + } + + if (stairsResetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[3], stairsResetFrame); + _lastStairFrame = stairsResetFrame; + } +} + +void Scene103::climbLeftStairs() { + if (_scene->getAnimFrame(_globals._animationIndexes[5]) == _lastStairFrame) + return; + + _lastStairFrame = _scene->getAnimFrame(_globals._animationIndexes[5]); + int stairsResetFrame = -1; + + if (_lastStairFrame == 34) { + stairsResetFrame = 33; + _standPosition = 1; + _game._player._stepEnabled = true; + } + + if (_lastStairFrame == 2) { + _scene->deleteSequence(3); + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13); + _scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(37, 139)); + } + + if (stairsResetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[5], stairsResetFrame); + _lastStairFrame = stairsResetFrame; + } +} + +void Scene103::descendRightStairs() { + if (_scene->getAnimFrame(_globals._animationIndexes[4]) == _lastStairFrame) + return; + + _lastStairFrame = _scene->getAnimFrame(_globals._animationIndexes[4]); + + if (_lastStairFrame == 2) { + _scene->deleteSequence(3); + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4); + _scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(154, 139)); + } +} + +void Scene103::descendLeftStairs() { + if (_scene->getAnimFrame(_globals._animationIndexes[6]) == _lastStairFrame) + return; + + _lastStairFrame = _scene->getAnimFrame(_globals._animationIndexes[6]); + + if (_lastStairFrame == 2) { + _scene->deleteSequence(3); + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4); + _scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(37, 139)); + } +} + +void Scene103::process_conv_jacques() { + bool quitConversationFl = false; + + switch (_action._activeAction._verbId) { + case 1: + _vm->_gameConv->setInterlocutorTrigger(96); + if (_globals[kJacquesNameIsKnown] == 0) { + _globals[kJacquesNameIsKnown] = 1; + _scene->_dynamicHotspots.remove(_hotspotGentleman); + _hotspotGentleman = _scene->_dynamicHotspots.add(NOUN_JACQUES, VERB_WALKTO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(156, 116, 156 + 33, 116 + 31)); + _scene->_dynamicHotspots[_hotspotGentleman]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_hotspotGentleman, Common::Point(206, 148), FACING_NORTHWEST); + } + break; + + case 4: + case 6: + case 7: + case 10: + case 19: + case 30: { + _globals[kWalkerConverse] = 0; + int *val = _vm->_gameConv->getVariable(26); + if (*val) + _globals[kJacquesNameIsKnown] = 2; + + quitConversationFl = true; + } + break; + + case 8: + _vm->_gameConv->setInterlocutorTrigger(94); + break; + + case 12: + _vm->_gameConv->setInterlocutorTrigger(96); + break; + + case 29: + _vm->_gameConv->setInterlocutorTrigger(98); + break; + + default: + break; + } + + if ((_action._activeAction._verbId != 1) && (_action._activeAction._verbId != 8) + && (_action._activeAction._verbId != 12) && (_action._activeAction._verbId != 29)) + _vm->_gameConv->setInterlocutorTrigger(90); + + _vm->_gameConv->setHeroTrigger(92); + + switch (_game._trigger) { + case 90: + if (!quitConversationFl) + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + _jacquesAction = 0; + break; + + case 92: + if (!quitConversationFl) + _globals[kWalkerConverse] = _vm->getRandomNumber(2, 3); + _convCount = 0; + _jacquesAction = 1; + break; + + case 94: + if (!quitConversationFl) + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + _jacquesAction = 2; + break; + + case 96: + if (!quitConversationFl) + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + _jacquesAction = 3; + break; + + case 98: + if (!quitConversationFl) + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + _jacquesAction = 4; + break; + + default: + break; + } + + _talkCount = 0; +} + +/*------------------------------------------------------------------------*/ + +Scene104::Scene104(MADSEngine *vm) : Scene1xx(vm) { + _anim0ActvFl = _anim1ActvFl = _anim2ActvFl = false; + _needToTalk = false; + _needToGetUp = false; + _sittingUp = false; + _beforeHeLeaves = false; + _beforeSheLeaves = false; + _needToStandUp = false; + + _walkStatus = -1; + _walkFrame = -1; + _coupleStatus = -1; + _richStatus = -1; + _richTalkCount = -1; + _manTalkCount = -1; + _womanTalkCount = -1; + _lookCount = -1; + _coupleFrame = -1; + _lastPlayerFrame = -1; + _richFrame = -1; +} + +void Scene104::synchronize(Common::Serializer &s) { + Scene1xx::synchronize(s); + + s.syncAsByte(_anim0ActvFl); + s.syncAsByte(_anim1ActvFl); + s.syncAsByte(_anim2ActvFl); + s.syncAsByte(_needToTalk); + s.syncAsByte(_needToGetUp); + s.syncAsByte(_sittingUp); + s.syncAsByte(_beforeHeLeaves); + s.syncAsByte(_beforeSheLeaves); + s.syncAsByte(_needToStandUp); + + s.syncAsSint16LE(_walkStatus); + s.syncAsSint16LE(_walkFrame); + s.syncAsSint16LE(_coupleStatus); + s.syncAsSint16LE(_richStatus); + s.syncAsSint16LE(_richTalkCount); + s.syncAsSint16LE(_manTalkCount); + s.syncAsSint16LE(_womanTalkCount); + s.syncAsSint16LE(_lookCount); + s.syncAsSint16LE(_coupleFrame); + s.syncAsSint16LE(_lastPlayerFrame); +} + +void Scene104::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + if (_globals[kTrapDoorStatus] == 1) + _scene->_variant = 1; + + _scene->addActiveVocab(NOUN_MONSIEUR_RICHARD); +} + +void Scene104::enter() { + _vm->_disableFastwalk = true; + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _anim0ActvFl = false; + _anim1ActvFl = false; + _anim2ActvFl = false; + _needToTalk = false; + _needToGetUp = false; + _sittingUp = false; + _beforeSheLeaves = false; + _needToStandUp = false; + } + + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('a', 0)); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 6)); + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0)); + + if (_globals[kCurrentYear] == 1993) + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('z', 0)); + + _vm->_gameConv->get(7); + + if (_globals[kTrapDoorStatus] == 1) { + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 15); + } else { + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 15); + } + + if (_scene->_priorSceneId == RETURNING_FROM_LOADING) { + if (_vm->_gameConv->_restoreRunning == 7) { + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('r', 1), 1); + _globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('d', 1), 1); + _walkStatus = 0; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('m', 1), 1); + if (_coupleStatus < 11) { + _coupleStatus = 1; + _richStatus = 0; + _scene->setAnimFrame(_globals._animationIndexes[1], 14); + } else { + _coupleStatus = 17; + _richStatus = 4; + _scene->setAnimFrame(_globals._animationIndexes[1], 105); + _scene->setAnimFrame(_globals._animationIndexes[0], 216); + } + + _vm->_gameConv->run(7); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + _game._player._visible = false; + } + + } else if (_scene->_priorSceneId == 301) { + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('r', 1), 1); + _anim1ActvFl = true; + _coupleStatus = 11; + + _globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('d', 1), 1); + _anim2ActvFl = true; + _walkStatus = 0; + + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('m', 1), 1); + _anim0ActvFl = true; + _richStatus = 0; + + cleanInventory(); + + _game._player._visible = false; + _game._visitedScenes.pop_back(); + _globals[kTrapDoorStatus] = 1; + _globals[kCurrentYear] = 1881; + _globals[kPrompterStandStatus] = 1; + _globals[kTicketPeoplePresent] = 1; + _globals[kMakeBrieLeave203] = false; + _game._player._playerPos.x = 161; + + _game._visitedScenes.add(301); + _game._visitedScenes.add(101); + + _scene->setCamera(Common::Point(60, 0)); + _scene->_sequences.addTimer(1, 91); + + } else if (_scene->_priorSceneId == 103) { + if (_globals[kRoom103104Transition] == 0) { + _scene->_userInterface.emptyConversationList(); + _scene->_userInterface.setup(kInputConversation); + + if (!_globals[kObservedPhan104]) { + _globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('p', 1), 93); + _game._player._playerPos.x = 319; + _game._player._stepEnabled = false; + _game._player._visible = false; + _scene->setCamera(Common::Point(158, 0)); + } else { + _globals._animationIndexes[5] = _scene->loadAnimation(formAnimName('p', 2), 94); + _game._player._playerPos.x = 319; + _game._player._stepEnabled = false; + _game._player._visible = false; + _scene->setCamera(Common::Point(158, 0)); + } + } else { + _game._player._playerPos = Common::Point(319, 96); + _game._player._facing = FACING_SOUTH; + _scene->setCamera(Common::Point(158, 0)); + } + } else if (_scene->_priorSceneId == 102) { + switch (_globals[kDeathLocation]) { + case 0: + _game._player._playerPos = Common::Point(496, 79); + _scene->setCamera(Common::Point(320, 0)); + break; + + case 1: + _game._player._playerPos = Common::Point(346, 71); + _scene->setCamera(Common::Point(158, 0)); + break; + + case 2: + _game._player._playerPos = Common::Point(172, 73); + break; + + default: + break; + } + } else if (_scene->_priorSceneId == 108) { + if (_game._player._playerPos.x > 213) + _game._player._playerPos.y = 97; + else if (_game._player._playerPos.x > 110) + _game._player._playerPos.y = 128; + else + _game._player._playerPos.y = 148; + + _game._player.firstWalk(Common::Point(-20, _game._player._playerPos.y), FACING_EAST, Common::Point(12, _game._player._playerPos.y), FACING_EAST, true); + } else if ((_scene->_priorSceneId == 107) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + if (_game._player._playerPos.x > 191) + _game._player._playerPos.y = 142; + else if (_game._player._playerPos.x > 104) + _game._player._playerPos.y = 120; + else + _game._player._playerPos.y = 95; + + _game._player.firstWalk(Common::Point(655, _game._player._playerPos.y), FACING_WEST, Common::Point(627, _game._player._playerPos.y), FACING_WEST, true); + _scene->setCamera(Common::Point(320, 0)); + } + + if (_globals[kCurrentYear] == 1993) { + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + } else + _scene->_hotspots.activate(NOUN_CHANDELIER, false); + + if (_globals[kTrapDoorStatus] == 1) { + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 15); + } else { + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 15); + } + + sceneEntrySound(); +} + +void Scene104::step() { + if (_anim0ActvFl) + handleRichAnimations(); + + if (_anim1ActvFl) + handleCoupleAnimations(); + + if (_anim2ActvFl) + handleWalkAnimation(); + + if (_game._player._moving) + handlePlayerWalk(); + + if (_game._trigger == 91) { + _vm->_dialogs->show(10434); + _vm->_gameConv->run(7); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + } + + if (_game._trigger == 93) { + _scene->_nextSceneId = 103; + _game._player._playerPos.x = 400; + _globals[kRoom103104Transition] = 0; + } + + if (_game._trigger == 94) { + _scene->_nextSceneId = 103; + _globals[kRoom103104Transition] = 0; + } +} + +void Scene104::preActions() { + if (_action.isAction(VERB_EXIT, NOUN_STAGE_LEFT)) + _game._player._walkOffScreenSceneId = 108; + + if (_action.isAction(VERB_EXIT, NOUN_STAGE_RIGHT)) + _game._player._walkOffScreenSceneId = 107; + + if (_action.isAction(VERB_OPEN, NOUN_TRAP_DOOR) || _action.isAction(VERB_CLOSE, NOUN_TRAP_DOOR)) + _game._player.walk(Common::Point(320, 92), FACING_NORTH); +} + +void Scene104::actions() { + if (_vm->_gameConv->_running == 7) { + processConversations(); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLIMB_THROUGH, NOUN_TRAP_DOOR)) { + if (_globals[kTrapDoorStatus] == 0) { + switch (_game._trigger) { + case 0: + _game._player._visible = false; + _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 13); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 16); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 60); + break; + + case 60: + _scene->_nextSceneId = 103; + _globals[kRoom103104Transition] = 1; + _game._player._stepEnabled = true; + break; + + default: + break; + } + } else { + _vm->_dialogs->show(10429); + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_JUMP_INTO, NOUN_ORCHESTRA_PIT)) { + switch (_game._trigger) { + case 0: + if (_game._player._playerPos.x > 400) + _globals[kDeathLocation] = 0; + else if (_game._player._playerPos.x > 200) + _globals[kDeathLocation] = 1; + else + _globals[kDeathLocation] = 2; + + _scene->changeVariant(2); + + if (_globals[kTrapDoorStatus] == 1) + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + else + _scene->drawToBackground(_globals._spriteIndexes[0], 2, Common::Point(-32000, -32000), 0, 100); + + _vm->_dialogs->show(10426); + _game._player._visible = false; + _game._player._stepEnabled = false; + _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 7, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 15); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, 4); + _scene->_sequences.setPosition(_globals._sequenceIndexes[3], _game._player._playerPos); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 1); + break; + + case 1: + _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 1, 10); + _scene->_sequences.addTimer(60, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 4, 4); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 15); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true); + _scene->_sequences.setMotion(_globals._sequenceIndexes[3], 0, 0, 200); + break; + + case 2: + _vm->_sound->command(1); + _vm->_sound->command(67); + _scene->_nextSceneId = 102; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(10410); + else + _vm->_dialogs->show(10411); + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_STAGE)) { + _vm->_dialogs->show(10412); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_APRON)) { + _vm->_dialogs->show(10413); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PROSCENIUM_ARCH)) { + _vm->_dialogs->show(10414); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ACT_CURTAIN)) { + _vm->_dialogs->show(10415); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ORCHESTRA_PIT)) { + _vm->_dialogs->show(10416); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CONDUCTORS_STAND)) { + _vm->_dialogs->show(10417); + _action._inProgress = false; + return; + } + + if ((_action.isObject(NOUN_MUSIC_STAND)) || (_action.isObject(NOUN_MUSIC_STANDS))) { + _vm->_dialogs->show(10418); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PROMPTERS_BOX)) { + _vm->_dialogs->show(10419); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TRAP_DOOR)) { + _vm->_dialogs->show(10420); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_HOUSE)) { + if (_globals[kCurrentYear] == 1881) + _vm->_dialogs->show(10421); + else + _vm->_dialogs->show(10427); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_STAGE_LEFT)) { + _vm->_dialogs->show(10422); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_STAGE_RIGHT)) { + _vm->_dialogs->show(10423); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CHANDELIER)) { + _vm->_dialogs->show(10428); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MONSIEUR_RICHARD)) { + _vm->_dialogs->show(10433); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_JUMP_INTO, NOUN_ORCHESTRA_PIT)) { + _vm->_dialogs->show(10426); + _scene->_nextSceneId = 102; + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_OPEN, NOUN_PROMPTERS_BOX) || _action.isAction(VERB_CLOSE, NOUN_PROMPTERS_BOX)) { + _vm->_dialogs->show(10430); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_OPEN, NOUN_TRAP_DOOR)) { + if (_globals[kTrapDoorStatus] == 0) + _vm->_dialogs->show(10424); + else + _vm->_dialogs->show(10432); + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLOSE, NOUN_TRAP_DOOR)) { + if (_globals[kTrapDoorStatus] == 1) + _vm->_dialogs->show(10425); + else + _vm->_dialogs->show(10433); + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_CHANDELIER)) { + _vm->_dialogs->show(10435); + _action._inProgress = false; + return; + } +} + +void Scene104::cleanInventory() { + if (_game._objects.isInInventory(OBJ_LARGE_NOTE)) + _game._objects.setRoom(OBJ_LARGE_NOTE, NOWHERE); + + if (_game._objects.isInInventory(OBJ_SANDBAG)) + _game._objects.setRoom(OBJ_SANDBAG, NOWHERE); + + if (_game._objects.isInInventory(OBJ_SMALL_NOTE)) + _game._objects.setRoom(OBJ_SMALL_NOTE, NOWHERE); + + if (_game._objects.isInInventory(OBJ_PARCHMENT)) + _game._objects.setRoom(OBJ_PARCHMENT, NOWHERE); + + if (_game._objects.isInInventory(OBJ_BOOK)) + _game._objects.setRoom(OBJ_BOOK, NOWHERE); + + if (_game._objects.isInInventory(OBJ_RED_FRAME)) + _game._objects.setRoom(OBJ_RED_FRAME, 105); + + if (_game._objects.isInInventory(OBJ_YELLOW_FRAME)) + _game._objects.setRoom(OBJ_YELLOW_FRAME, 107); + + if (_game._objects.isInInventory(OBJ_BLUE_FRAME)) + _game._objects.setRoom(OBJ_BLUE_FRAME, 302); + + if (_game._objects.isInInventory(OBJ_GREEN_FRAME)) + _game._objects.setRoom(OBJ_GREEN_FRAME, 307); +} + +void Scene104::processConversations() { + bool interlocutorTriggerFl = false; + bool heroTriggerFl = false; + + switch (_action._activeAction._verbId) { + case 2: + case 10: + case 12: + case 16: + case 20: + case 21: + case 24: + _vm->_gameConv->setInterlocutorTrigger(75); + interlocutorTriggerFl = true; + break; + + case 3: + if (!_needToGetUp) { + _vm->_gameConv->setInterlocutorTrigger(67); + interlocutorTriggerFl = true; + _needToGetUp = true; + } + break; + + case 8: + _vm->_gameConv->setInterlocutorTrigger(87); + interlocutorTriggerFl = true; + break; + + case 11: + _vm->_gameConv->setInterlocutorTrigger(77); + interlocutorTriggerFl = true; + break; + + case 14: + case 25: + if (!_game._trigger) { + _richStatus = 0; + _coupleStatus = 5; + _vm->_gameConv->hold(); + } + break; + + case 22: + _vm->_gameConv->setInterlocutorTrigger(75); + _vm->_gameConv->setHeroTrigger(79); + interlocutorTriggerFl = true; + heroTriggerFl = true; + break; + + case 23: + _vm->_gameConv->setInterlocutorTrigger(89); + interlocutorTriggerFl = true; + break; + + case 28: + _vm->_gameConv->setInterlocutorTrigger(81); + interlocutorTriggerFl = true; + break; + + case 30: + if (!_game._trigger) { + _vm->_gameConv->hold(); + _richStatus = 4; + } + break; + + case 32: + _coupleStatus = 14; + heroTriggerFl = true; + interlocutorTriggerFl = true; + _vm->_gameConv->hold(); + break; + + default: + break; + } + + switch (_game._trigger) { + case 67: + _vm->_gameConv->hold(); + _coupleStatus = 12; + break; + + case 69: + if (!_beforeSheLeaves && !_beforeHeLeaves && (_coupleStatus != 14) && !_needToStandUp) { + _richStatus = 0; + if (_sittingUp) + _coupleStatus = 4; + else + _coupleStatus = 12; + } + break; + + case 71: + if (!_beforeSheLeaves && !_beforeHeLeaves && (_coupleStatus != 14) && !_needToStandUp) { + _richStatus = 0; + if (_sittingUp && !_beforeSheLeaves) { + _coupleStatus = 3; + _richStatus = 0; + } + } + break; + + case 75: + _richStatus = 1; + + if (_sittingUp) { + if (_action._activeAction._verbId == 20) { + _lookCount = 0; + _coupleStatus = 9; + } else if ((_action._activeAction._verbId == 21) || (_action._activeAction._verbId == 22)) { + _lookCount = 0; + _coupleStatus = 10; + } else { + _coupleStatus = 1; + } + } else { + _coupleStatus = 11; + } + break; + + case 77: + _richStatus = 0; + _coupleStatus = 8; + break; + + case 79: + _richStatus = 0; + _coupleStatus = 7; + break; + + case 81: + _richStatus = 1; + _beforeHeLeaves = true; + _coupleStatus = 15; + break; + + case 83: + _vm->_gameConv->release(); + if (_coupleStatus != 17) + _game._player._stepEnabled = false; + break; + + case 87: + _richStatus = 3; + break; + + case 89: + _richStatus = 2; + break; + + default: + break; + } + + if (!heroTriggerFl && !_beforeSheLeaves) + _vm->_gameConv->setHeroTrigger(71); + + if (!interlocutorTriggerFl) + _vm->_gameConv->setInterlocutorTrigger(69); + + _richTalkCount = 0; + _manTalkCount = 0; + _womanTalkCount = 0; +} + +void Scene104::handleWalkAnimation() { + if (_scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame() == _walkFrame) + return; + + _walkFrame = _scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame(); + int daaeResetFrame = -1; + + switch (_walkFrame) { + case 1: + if (_walkStatus == 0) { + daaeResetFrame = 0; + } else { + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[2], SYNC_ANIM, _globals._animationIndexes[1]); + daaeResetFrame = 1; + } + break; + + case 138: + _walkStatus = 0; + daaeResetFrame = 0; + break; + + default: + break; + } + + if (daaeResetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[2], daaeResetFrame); + _walkFrame = daaeResetFrame; + } +} + +void Scene104::handleRichAnimations() { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _richFrame) + return; + + _richFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + int random; + int resetFrame = -1; + + switch (_richFrame) { + case 1: + case 2: + case 3: + case 4: + case 8: + case 14: + case 22: + case 34: + case 40: + case 44: + case 48: + random = -1; + if (_richStatus == 1) { + random = _vm->getRandomNumber(1, 3); + ++_richTalkCount; + if (_richTalkCount > 15) { + _richStatus = 0; + random = 40; + } + } + + if (_richStatus == 0) + random = _vm->getRandomNumber(7, 80); + + if (_richStatus == 2) { + random = 4; + _richStatus = 1; + _richTalkCount = 8; + } + + if (_richStatus == 3) { + random = 5; + _richStatus = 1; + _richTalkCount = 8; + } + + if (_richStatus == 4) + random = 6; + + if (_richStatus == 5) + random = 7; + + switch (random) { + case 1: + resetFrame = 1; + break; + + case 2: + resetFrame = 2; + break; + + case 3: + resetFrame = 3; + break; + + case 4: + resetFrame = 23; + break; + + case 5: + resetFrame = 35; + break; + + case 6: + resetFrame = 49; + break; + + case 7: + resetFrame = 41; + break; + + case 8: + resetFrame = 45; + break; + + case 9: + resetFrame = 9; + break; + + case 10: + resetFrame = 5; + break; + + case 11: + resetFrame = 15; + break; + + default: + resetFrame = 0; + break; + } + break; + + case 117: + _coupleStatus = 13; + break; + + case 125: + resetFrame = 124; + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame); + _richFrame = resetFrame; + } +} + +void Scene104::handleCoupleAnimations() { + if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _coupleFrame) + return; + + _coupleFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame(); + int resetFrame = -1; + int random; + + switch (_coupleFrame) { + case 1: + case 103: + case 104: + case 105: + if (_coupleStatus == 11) + resetFrame = 0; + else { + resetFrame = _vm->getRandomNumber(102, 104); + ++_womanTalkCount; + if (_womanTalkCount > 15) { + if (_needToGetUp) { + _coupleStatus = 6; + resetFrame = 1; + } else { + _coupleStatus = 11; + resetFrame = 0; + } + } + } + break; + + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 25: + case 33: + case 41: + switch (_coupleFrame) { + case 9: + _coupleStatus = 6; + break; + + case 33: + _vm->_gameConv->release(); + if (_action._activeAction._verbId == 13) + _coupleStatus = 4; + + break; + + case 41: + _vm->_gameConv->release(); + _sittingUp = true; + if (_needToTalk) + _coupleStatus = 3; + else + _coupleStatus = 1; + break; + + default: + break; + } + + random = -1; + + switch (_coupleStatus) { + case 1: + random = 12; + break; + + case 2: + case 7: + case 8: + random = 11; + break; + + case 3: + random = _vm->getRandomNumber(4, 6); + ++_manTalkCount; + if (_manTalkCount > 15) { + _coupleStatus = 1; + random = 12; + } + break; + + case 4: + if (_beforeSheLeaves) { + random = 10; + } else { + random = _vm->getRandomNumber(1, 3); + ++_womanTalkCount; + if (_womanTalkCount > 15) { + _coupleStatus = 1; + random = 12; + } + } + break; + + case 5: + _coupleStatus = 1; + random = 8; + break; + + case 6: + _coupleStatus = 1; + random = 7; + break; + + case 13: + random = 9; + break; + + case 15: + random = 10; + break; + + default: + break; + } + + switch (random) { + case 1: + resetFrame = 12; + break; + + case 2: + resetFrame = 13; + break; + + case 3: + resetFrame = 14; + break; + + case 4: + resetFrame = 9; + break; + + case 5: + resetFrame = 10; + break; + + case 6: + resetFrame = 11; + break; + + case 7: + resetFrame = 33; + break; + + case 8: + resetFrame = 25; + break; + + case 9: + resetFrame = 54; + break; + + case 10: + resetFrame = 41; + break; + + case 11: + resetFrame = 15; + break; + + case 12: + resetFrame = 14; + break; + + default: + break; + } + break; + + case 17: + case 18: + case 19: + case 20: + case 21: + case 22: + case 23: + random = -1; + switch (_coupleStatus) { + case 1: + case 3: + case 4: + case 5: + case 6: + case 15: + case 16: + random = 7; + break; + + case 2: + random = 8; + break; + + case 7: + random = _vm->getRandomNumber(4, 6); + ++_manTalkCount; + if (_manTalkCount > 15) { + _coupleStatus = 2; + random = 8; + } + break; + + case 8: + random = _vm->getRandomNumber(1, 3); + ++_womanTalkCount; + if (_womanTalkCount > 15) { + _coupleStatus = 1; + random = 7; + } + break; + + case 9: + random = 1; + ++_lookCount; + if (_lookCount > 6) { + _coupleStatus = 1; + random = 7; + } + break; + + case 10: + random = 1; + break; + + default: + break; + } + + switch (random) { + case 1: + resetFrame = 20; + break; + + case 2: + resetFrame = 21; + break; + + case 3: + resetFrame = 22; + break; + + case 4: + resetFrame = 17; + break; + + case 5: + resetFrame = 18; + break; + + case 6: + resetFrame = 19; + break; + + case 7: + resetFrame = 23; + break; + + case 8: + resetFrame = 20; + break; + + default: + break; + } + break; + + case 52: + _walkStatus = 1; + resetFrame = 54; + break; + + case 55: + if (_coupleStatus != 13) + resetFrame = 54; + + break; + + case 89: + _vm->_gameConv->release(); + break; + + case 90: + if (_coupleStatus != 14) { + resetFrame = 89; + } else { + resetFrame = 90; + _globals[kTempVar] = 200; + } + break; + + case 102: + _vm->_gameConv->release(); + _game._player._playerPos = Common::Point(166, 126); + _game._player.resetFacing(FACING_SOUTH); + resetFrame = 105; + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[1]); + break; + + case 106: + _coupleStatus = 17; + resetFrame = 105; + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[1], resetFrame); + _coupleFrame = resetFrame; + } +} + +void Scene104::handlePlayerWalk() { + if (_game._player._frameNumber == _lastPlayerFrame) + return; + + _lastPlayerFrame = _game._player._frameNumber; + switch (_game._player._facing) { + case FACING_NORTH: + case FACING_SOUTH: + if ((_game._player._frameNumber == 5) || (_game._player._frameNumber == 11)) + _vm->_sound->command(68); + break; + + case FACING_NORTHEAST: + case FACING_NORTHWEST: + case FACING_SOUTHEAST: + case FACING_SOUTHWEST: + if ((_game._player._frameNumber == 7) || (_game._player._frameNumber == 14)) + _vm->_sound->command(68); + break; + + case FACING_EAST: + case FACING_WEST: + if ((_game._player._frameNumber == 8) || (_game._player._frameNumber == 16)) + _vm->_sound->command(68); + break; + + default: + break; + } +} + +/*------------------------------------------------------------------------*/ + +Scene105::Scene105(MADSEngine *vm) : Scene1xx(vm) { +} + +void Scene105::synchronize(Common::Serializer &s) { + Scene1xx::synchronize(s); + +} + +void Scene105::setup() { + if (_globals[kCurrentYear] == 1993) + _scene->_variant = 1; + + setPlayerSpritesPrefix(); + setAAName(); + + _scene->addActiveVocab(NOUN_LIGHT_FIXTURE); +} + +void Scene105::enter() { + _scene->loadSpeech(8); + + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2)); + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 3)); + _globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RRD_9"); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*RDR_9"); + _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 0)); + _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 1)); + if (_globals[kCurrentYear] == 1993) + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('z', -1)); + + if ((_globals[kCurrentYear] == 1881) && (!_globals[kHintThatDaaeIsHome2])) { + if ((_globals[kJacquesNameIsKnown] == 2) && (_globals[kMadameNameIsKnown] == 2) && + _globals[kPanelIn206] && _globals[kDoneRichConv203] && _game._objects.isInInventory(OBJ_LANTERN) && + ((_game._objects.isInInventory(OBJ_CABLE_HOOK) && _game._objects.isInInventory(OBJ_ROPE)) || _game._objects.isInInventory(OBJ_ROPE_WITH_HOOK))) { + _globals[kHintThatDaaeIsHome2] = true; + _scene->_sequences.addTimer(300, 75); + } + } + + if ((_game._objects.isInRoom(OBJ_LANTERN)) && (_globals[kCurrentYear] == 1881)) { + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + } else { + _scene->_hotspots.activate(NOUN_LANTERN, false); + } + + if (_game._objects.isInRoom(OBJ_RED_FRAME)) { + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1)); + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + } else { + _scene->_hotspots.activate(NOUN_RED_FRAME, false); + } + + if (_globals[kCurrentYear] == 1993) { + _scene->drawToBackground(_globals._spriteIndexes[3], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_PROPS, false); + _scene->_hotspots.activate(NOUN_BEAR_PROP, false); + _scene->_hotspots.activate(NOUN_STAIR_UNIT, false); + _scene->_hotspots.activate(NOUN_PROP, false); + _scene->_hotspots.activate(NOUN_ELEPHANT_PROP, false); + _scene->_hotspots.activate(NOUN_COLUMN_PROP, false); + + int tmpIdx = _scene->_dynamicHotspots.add(NOUN_COLUMN_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(132, 24, 132 + 21, 24 + 105)); + _scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(159, 133), FACING_NORTHWEST); + + tmpIdx = _scene->_dynamicHotspots.add(NOUN_COLUMN_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(56, 45, 56 + 11, 45 + 77)); + _scene->_dynamicHotspots.setPosition(tmpIdx, Common::Point(72, 126), FACING_NORTHWEST); + + _scene->_dynamicHotspots.add(NOUN_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(0, 125, 29, 125 + 31)); + _scene->_dynamicHotspots.add(NOUN_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(29, 136, 29 + 50, 136 + 20)); + _scene->_dynamicHotspots.add(NOUN_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(79, 141, 79 + 53, 141 + 15)); + + _scene->_dynamicHotspots.add(NOUN_BEAR_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(278, 132, 278 + 21, 132 + 24)); + _scene->_dynamicHotspots.add(NOUN_BEAR_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(299, 146, 299 + 8, 146 + 10)); + _scene->_dynamicHotspots.add(NOUN_BEAR_PROP, VERB_WALKTO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(269, 142, 269 + 8, 142 + 8)); + + _scene->_dynamicHotspots.add(NOUN_LIGHT_FIXTURE, VERB_LOOK_AT, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(102, 14, 102 + 24, 102 + 10)); + } + + _globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14); + + if ((_scene->_priorSceneId == 106) || (_scene->_priorSceneId == 114)) { + _game._player._playerPos = Common::Point(198, 132); + _game._player._facing = FACING_WEST; + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10); + } else if ((_scene->_priorSceneId == 103) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + _game._player._playerPos = Common::Point(3, 112); + _game._player._facing = FACING_SOUTHEAST; + _game._player.walk(Common::Point(45, 131), FACING_SOUTHEAST); + _game._player.setWalkTrigger(60); + _game._player._stepEnabled = false; + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 8); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10); + } else if (_scene->_priorSceneId == RETURNING_FROM_LOADING) { + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10); + } + + sceneEntrySound(); +} + +void Scene105::step() { + switch (_game._trigger) { + case 60: + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 8); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 61); + _vm->_sound->command(66); + break; + + case 61: + _vm->_sound->command(25); + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10); + _game._player._stepEnabled = true; + break; + + case 75: + _scene->playSpeech(8); + _scene->_sequences.addTimer(120, 76); + break; + + case 76: + _vm->_dialogs->show(10537); + break; + + default: + break; + } +} + +void Scene105::actions() { + if ((_action.isAction(VERB_PUSH, NOUN_THUNDER_MACHINE)) || (_action.isAction(VERB_PULL, NOUN_THUNDER_MACHINE))) { + switch (_game._trigger) { + case 0: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('t', 1), 70); + _scene->deleteSequence(_globals._sequenceIndexes[4]); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[4], SYNC_ANIM, _globals._animationIndexes[0]); + _scene->_sequences.setSeqPlayer(_globals._animationIndexes[0], false); + break; + + case 70: + _globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[4], SYNC_ANIM, _globals._animationIndexes[0]); + _game._player._stepEnabled = true; + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLIMB_UP, NOUN_CIRCULAR_STAIRCASE)) { + switch (_game._trigger) { + case 0: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 1), 1); + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0); + break; + + case 1: + _scene->_nextSceneId = 106; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLIMB_DOWN, NOUN_CIRCULAR_STAIRCASE)) { + switch (_game._trigger) { + case 0: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 1); + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0); + break; + + case 1: + _scene->_nextSceneId = 114; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_RED_FRAME) && (_game._objects.isInRoom(OBJ_RED_FRAME) || _game._trigger)) { + switch (_game._trigger) { + case (0): + if (_globals[kCurrentYear] == 1881) { + int count = 0; + + if (_game._objects.isInInventory(NOUN_YELLOW_FRAME)) + ++count; + + if (_game._objects.isInInventory(NOUN_GREEN_FRAME)) + ++count; + + if (_game._objects.isInInventory(NOUN_BLUE_FRAME)) + ++count; + + if (count < 3) + _globals[kPlayerScore] += 5; + } + + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 5, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + _scene->deleteSequence(_globals._sequenceIndexes[1]); + _scene->_hotspots.activate(NOUN_RED_FRAME, false); + _game._objects.addToInventory(OBJ_RED_FRAME); + _vm->_sound->command(26); + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[5]); + _game._player._visible = true; + _scene->_sequences.addTimer(20, 3); + break; + + case 3: + if (_globals[kCurrentYear] == 1881) + _vm->_dialogs->showItem(OBJ_RED_FRAME, 842, 0); + else + _vm->_dialogs->showItem(OBJ_RED_FRAME, 802, 0); + + _game._player._stepEnabled = true; + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_LANTERN) && (_game._objects.isInRoom(OBJ_LANTERN) || _game._trigger)) { + switch (_game._trigger) { + case (0): + _globals[kPlayerScore] += 5; + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[6] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[6], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_SPRITE, 4, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + _scene->deleteSequence(_globals._sequenceIndexes[0]); + _scene->_hotspots.activate(NOUN_LANTERN, false); + _game._objects.addToInventory(OBJ_LANTERN); + _vm->_sound->command(26); + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[6]); + _game._player._visible = true; + _scene->_sequences.addTimer(20, 3); + break; + + case 3: + _vm->_dialogs->showItem(OBJ_LANTERN, 801, 0); + _game._player._stepEnabled = true; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR) || (_game._trigger) || + _action.isAction(VERB_UNLOCK, NOUN_DOOR) || _action.isAction(VERB_LOCK, NOUN_DOOR)) { + if ((_globals[kCurrentYear] == 1881) && !_action.isAction(VERB_UNLOCK) && !_action.isAction(VERB_LOCK)){ + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[6] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[6], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_SPRITE, 4, 65); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 2: + _game._player._visible = true; + _scene->_sequences.addTimer(180, 3); + break; + + case 3: + _scene->_nextSceneId = 103; + break; + + case 65: + _vm->_sound->command(24); + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 8); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 66); + _vm->_sound->command(66); + break; + + case 66: { + int tmpIdx = _globals._sequenceIndexes[2]; + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 8); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[2], SYNC_SEQ, tmpIdx); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + _game._player.walk(Common::Point(0, 111), FACING_NORTHWEST); + } + break; + + default: + break; + } + } else { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], true, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 1); + break; + + case 1: { + int tmpIdx = _globals._sequenceIndexes[6]; + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], true, 4); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[6], SYNC_SEQ, tmpIdx); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], false); + _vm->_sound->command(73); + _scene->_sequences.addTimer(15, 2); + } + break; + + case 2: + _scene->deleteSequence(_globals._sequenceIndexes[6]); + _globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], true, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[6], false); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 3); + break; + + case 3: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[6]); + _game._player._visible = true; + if (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK)) + _vm->_dialogs->show(32); + else + _vm->_dialogs->show(10536); + + _game._player._stepEnabled = true; + break; + + default: + break; + } + } + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(10510); + else + _vm->_dialogs->show(10511); + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(10512); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CIRCULAR_STAIRCASE)) { + _vm->_dialogs->show(10513); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LANTERN) && _game._objects.isInRoom(OBJ_LANTERN)) { + _vm->_dialogs->show(10514); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RED_FRAME) && _game._objects.isInRoom(OBJ_RED_FRAME)){ + if (_globals[kCurrentYear] == 1881) + _vm->_dialogs->show(10530); + else + _vm->_dialogs->show(10515); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR)) { + _vm->_dialogs->show(10516); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(10517); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PROP_TABLE)) { + _vm->_dialogs->show(10518); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BEAR_PROP)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(10519); + else + _vm->_dialogs->show(10538); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ELEPHANT_PROP)) { + _vm->_dialogs->show(10520); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_COLUMN_PROP)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(10521); + else + _vm->_dialogs->show(10539); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_THUNDER_MACHINE)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(10522); + else + _vm->_dialogs->show(10540); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_STAIR_UNIT)) { + _vm->_dialogs->show(10523); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PROP)) { + _vm->_dialogs->show(10524); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PROPS)) { + _vm->_dialogs->show(10525); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_EXIT_SIGN)) { + _vm->_dialogs->show(10526); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FLATS)) { + _vm->_dialogs->show(10527); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_HEMP)) { + _vm->_dialogs->show(10528); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PIPE)) { + _vm->_dialogs->show(10529); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GRAFFITI)) { + _vm->_dialogs->show(10531); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LIGHT_FIXTURE)) { + _vm->_dialogs->show(10535); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TALK_TO, NOUN_BEAR_PROP)) { + _vm->_dialogs->show(10532); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_BEAR_PROP)) { + _vm->_dialogs->show(10533); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLOSE, NOUN_DOOR)) { + _vm->_dialogs->show(10534); + _action._inProgress = false; + return; + } +} + +void Scene105::preActions() { + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_PIT)) + _game._player._walkOffScreenSceneId = 102; + + if (_action.isAction(VERB_OPEN, NOUN_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_DOOR) || _action.isAction(VERB_LOCK, NOUN_DOOR)) + _game._player.walk(Common::Point(33, 128), FACING_NORTHWEST); +} + +/*------------------------------------------------------------------------*/ + +Scene106::Scene106(MADSEngine *vm) : Scene1xx(vm) { + _sandbagHostpotId = -1; +} + +void Scene106::synchronize(Common::Serializer &s) { + Scene1xx::synchronize(s); + + s.syncAsSint16LE(_sandbagHostpotId); +} + +void Scene106::setup() { + if (_globals[kCurrentYear] == 1881) + _scene->_variant = 1; + + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene106::enter() { + _scene->loadSpeech(8); + + if (_globals[kCurrentYear] == 1993) { + if (!_game._objects.isInInventory(OBJ_SANDBAG)) { + _globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RRD_9"); + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0)); + } + } else { + _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('z', -1)); + if (_game._objects.isInRoom(OBJ_CABLE_HOOK) && !_game._objects.isInInventory(OBJ_ROPE_WITH_HOOK)) { + _globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RRD_9"); + _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('p', 0)); + } + } + + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('a', 0)); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1)); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RDR_9"); + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('a', 1)); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('a', 2)); + + if ((_globals[kCurrentYear] == 1881) && (!_globals[kHintThatDaaeIsHome1])) { + if ((_globals[kJacquesNameIsKnown] == 2) && (_globals[kMadameNameIsKnown] == 2) + && (_globals[kPanelIn206]) && (_globals[kDoneRichConv203]) && (_game._objects.isInInventory(OBJ_LANTERN)) + && ((_game._objects.isInInventory(OBJ_CABLE_HOOK) && _game._objects.isInInventory(OBJ_ROPE)) + || _game._objects.isInInventory(OBJ_ROPE_WITH_HOOK))) { + _globals[kHintThatDaaeIsHome1] = true; + _scene->_sequences.addTimer(300, 85); + } + } + + if ((_globals[kSandbagStatus] == 1) && (_globals[kCurrentYear] == 1993) && _game._objects.isInRoom(OBJ_SANDBAG)) { + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -2); + _sandbagHostpotId = _scene->_dynamicHotspots.add(NOUN_SANDBAG, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(227, 140, 227 + 18, 140 + 11)); + _scene->_dynamicHotspots.setPosition(_sandbagHostpotId, Common::Point(224, 152), FACING_NORTHEAST); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2); + } + + if (_globals[kCurrentYear] == 1881) { + _scene->drawToBackground(_globals._spriteIndexes[7], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_BIG_PROP, false); + _scene->_hotspots.activate(NOUN_STATUE, false); + _scene->_hotspots.activate(NOUN_PLANT_PROP, false); + _scene->_hotspots.activate(NOUN_PEDESTAL, false); + _scene->_hotspots.activate(NOUN_SANDBAG, false); + _scene->_hotspots.activate(NOUN_CRATE, false); + + _scene->_dynamicHotspots.add(NOUN_SANDBAG, VERB_LOOK_AT, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(40, 47, 40 + 11, 47 + 17)); + _scene->_dynamicHotspots.add(NOUN_SANDBAG, VERB_LOOK_AT, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(98, 14, 98 + 5, 14 + 10)); + _scene->_dynamicHotspots.add(NOUN_SANDBAG, VERB_LOOK_AT, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(111, 23, 111 + 6, 23 + 9)); + _scene->_dynamicHotspots.add(NOUN_SANDBAG, VERB_LOOK_AT, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(119, 12, 119 + 5, 12 + 8)); + + int idx = _scene->_dynamicHotspots.add(NOUN_STAGE, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(80, 114, 80 + 24, 114 + 4)); + _scene->_dynamicHotspots.setPosition(idx, Common::Point(93, 121), FACING_NONE); + + idx = _scene->_dynamicHotspots.add(NOUN_STAGE, VERB_WALK_ACROSS, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(106, 102, 106 + 5, 102 + 10)); + _scene->_dynamicHotspots.setPosition(idx, Common::Point(108, 109), FACING_NONE); + } else { + _scene->_hotspots.activate(NOUN_BOXES, false); + _scene->_hotspots.activate(NOUN_CASE, false); + } + + if ((_game._objects.isInRoom(OBJ_CABLE_HOOK)) && (_globals[kCurrentYear] == 1881) && !_game._objects.isInInventory(OBJ_ROPE_WITH_HOOK)){ + _globals._sequenceIndexes[8] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[8], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 3); + } else { + _scene->_hotspots.activate(NOUN_CABLE_HOOK, false); + } + + if (_scene->_priorSceneId == 109) { + _game._player._playerPos = Common::Point(180, 58); + _game._player._facing = FACING_SOUTH; + _game._player.walk(Common::Point(179, 63), FACING_SOUTH); + _game._player.setWalkTrigger(60); + _game._player._stepEnabled = false; + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 5); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + } else if ((_scene->_priorSceneId == 105) || (_scene->_priorSceneId == 301)) { + _game._player._playerPos = Common::Point(235, 142); + _game._player._facing = FACING_WEST; + _game._player.walk(Common::Point(227, 143), FACING_WEST); + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + } else if (_scene->_priorSceneId == 107) { + _game._player._playerPos = Common::Point(143, 68); + _game._player._facing = FACING_WEST; + _game._player.walk(Common::Point(163, 68), FACING_SOUTHEAST); + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + } else if ((_scene->_priorSceneId == 108) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + _game._player.firstWalk(Common::Point(-20, 130), FACING_SOUTHEAST, Common::Point(19, 147), FACING_NORTHEAST, true); + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + } else if (_scene->_priorSceneId == RETURNING_FROM_LOADING) { + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + } + + sceneEntrySound(); +} + +void Scene106::step() { + switch (_game._trigger) { + case 85: + _scene->playSpeech(8); + _scene->_sequences.addTimer(120, 86); + break; + + case 86: + _vm->_dialogs->show(10637); + break; + + case 60: + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 5); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 61); + break; + + case 61: + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + _vm->_sound->command(25); + _game._player._stepEnabled = true; + break; + + default: + break; + } +} + +void Scene106::actions() { + if ((_action.isAction(VERB_TAKE, NOUN_SANDBAG)) && (_scene->_customDest.y < 61)) { + _vm->_dialogs->show(10635); + _action._inProgress = false; + return; + } else if (_action.isAction(VERB_TAKE, NOUN_SANDBAG)) { + if (_game._objects.isInRoom(OBJ_SANDBAG)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], false, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 5, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + _scene->deleteSequence(_globals._sequenceIndexes[0]); + _scene->_dynamicHotspots.remove(_sandbagHostpotId); + _vm->_sound->command(26); + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[5]); + _game._player._visible = true; + _scene->_sequences.addTimer(20, 3); + break; + + case 3: + _game._objects.addToInventory(OBJ_SANDBAG); + _vm->_dialogs->showItem(OBJ_SANDBAG, 803, 0); + _game._player._stepEnabled = true; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE, NOUN_CABLE_HOOK)) { + if (_game._objects.isInRoom(OBJ_CABLE_HOOK)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 5, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + _globals[kPlayerScore] += 5; + break; + + case 1: + _scene->deleteSequence(_globals._sequenceIndexes[8]); + _scene->_hotspots.activate(NOUN_CABLE_HOOK, false); + _vm->_sound->command(26); + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[5]); + _game._player._visible = true; + _scene->_sequences.addTimer(20, 3); + break; + + case 3: + _game._objects.addToInventory(OBJ_CABLE_HOOK); + _vm->_dialogs->showItem(OBJ_CABLE_HOOK, 822, 0); + _game._player._stepEnabled = true; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + } + + switch (_game._trigger) { + case 75: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 76); + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0); + _action._inProgress = false; + return; + + case 76: + _scene->_nextSceneId = 105; + _action._inProgress = false; + return; + + case 80: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 1), 81); + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0); + _action._inProgress = false; + return; + + case 81: + _scene->_sequences.addTimer(120, 82); + _action._inProgress = false; + return; + + case 82: + _scene->_nextSceneId = 301; + _action._inProgress = false; + return; + + default: + break; + } + + if (_action.isAction(VERB_EXIT_TO, NOUN_STAGE_RIGHT_WING)) { + _scene->_nextSceneId = 107; + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLIMB_DOWN) || _action.isAction(VERB_CLIMB_UP)) { + if (_globals[kSandbagStatus] == 1) { + switch (_game._trigger) { + case 0: + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('s',-1), 1); + _game._player._stepEnabled = false; + _game._player._visible = false; + break; + + case 1: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); + _game._player._visible = true; + _game._player._playerPos = Common::Point(225, 143); + _game._player.resetFacing(FACING_EAST); + _game._player.walk(Common::Point(236, 142), FACING_EAST); + + if (_action.isAction(VERB_CLIMB_DOWN)) + _game._player.setWalkTrigger(75); + else + _game._player.setWalkTrigger(80); + break; + + default: + break; + } + } else { + switch (_game._trigger) { + case 0: + _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 4, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 9); + _scene->_sequences.addTimer(6, 2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 1); + break; + + case 1: + _vm->_sound->command(70); + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2); + _sandbagHostpotId = _scene->_dynamicHotspots.add(NOUN_SANDBAG, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(227, 140, 227 + 18, 140 + 11)); + _scene->_dynamicHotspots.setPosition(_sandbagHostpotId, Common::Point(224, 152), FACING_NORTHEAST); + break; + + case 2: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('s', 1), 3); + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0); + break; + + case 3: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); + _game._player._visible = true; + _game._player._stepEnabled = true; + _game._player._playerPos = Common::Point(228, 140); + _game._player.resetFacing(FACING_SOUTHEAST); + _globals[kSandbagStatus] = 1; + _vm->_dialogs->show(10632); + break; + + default: + break; + } + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 4, 65); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 67); + break; + + case 65: + _vm->_sound->command(24); + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 5); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 66); + break; + + case 66: { + int idx = _globals._sequenceIndexes[2]; + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 5); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[2], SYNC_SEQ, idx); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + } + break; + + case 67: + _game._player._visible = true; + _game._player.walk(Common::Point(180, 60), FACING_NORTH); + _game._player.setWalkTrigger(68); + break; + + case 68: + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 69); + break; + + case 69: + _vm->_sound->command(25); + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); + _scene->_nextSceneId = 109; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(10610); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_STAGE_RIGHT_WING)) { + _vm->_dialogs->show(10611); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_STAGE_LEFT_WING)) { + _vm->_dialogs->show(10612); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_IN_TWO)) { + _vm->_dialogs->show(10613); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CYCLORAMA)) { + _vm->_dialogs->show(10614); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_STAGE)) { + _vm->_dialogs->show(10615); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PEDESTAL)) { + _vm->_dialogs->show(10616); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PLANT_PROP)) { + _vm->_dialogs->show(10617); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SANDBAG)) { + if (_scene->_customDest.y < 60) { + _vm->_dialogs->show(10618); + _action._inProgress = false; + return; + } else if (_game._objects.isInRoom(OBJ_SANDBAG)) { + _vm->_dialogs->show(10633); + _action._inProgress = false; + return; + } + } + + if (_action.isObject(NOUN_STATUE)) { + _vm->_dialogs->show(10619); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CIRCULAR_STAIRCASE)) { + _vm->_dialogs->show(10620); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BATTEN)) { + _vm->_dialogs->show(10621); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR)) { + _vm->_dialogs->show(10622); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BOXES) || _action.isObject(NOUN_BOX)) { + _vm->_dialogs->show(10623); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BIG_PROP)) { + _vm->_dialogs->show(10624); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CRATE)) { + _vm->_dialogs->show(10625); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CASE)) { + if (_globals[kCurrentYear] == 1881) + _vm->_dialogs->show(10638); + else + _vm->_dialogs->show(10636); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_VENTILATION_DUCT)) { + _vm->_dialogs->show(10626); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_JUNK)) { + _vm->_dialogs->show(10627); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FLATS)) { + _vm->_dialogs->show(10628); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(10629); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CABLE_HOOK) && _game._objects.isInRoom(OBJ_CABLE_HOOK)) { + _vm->_dialogs->show(10639); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TALK_TO, NOUN_STATUE)) { + _vm->_dialogs->show(10630); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLOSE, NOUN_DOOR)) { + _vm->_dialogs->show(10634); + _action._inProgress = false; + return; + } +} + +void Scene106::preActions() { + if (_action.isAction(VERB_EXIT_TO, NOUN_STAGE_LEFT_WING)) + _game._player._walkOffScreenSceneId = 108; + + if (_action.isAction(VERB_OPEN, NOUN_DOOR)) + _game._player.walk(Common::Point(179, 63), FACING_NORTHWEST); +} + +/*------------------------------------------------------------------------*/ + +Scene107::Scene107(MADSEngine *vm) : Scene1xx(vm) { +} + +void Scene107::synchronize(Common::Serializer &s) { + Scene1xx::synchronize(s); +} + +void Scene107::setup() { + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene107::enter() { + if (_globals[kCurrentYear] == 1993) + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1)); + + if (_game._objects.isInRoom(OBJ_YELLOW_FRAME)) { + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 0)); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RRD_9"); + } + + if (_game._objects.isInRoom(OBJ_YELLOW_FRAME)) { + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + } else { + _scene->_hotspots.activate(NOUN_YELLOW_FRAME, false); + } + + if (_globals[kCurrentYear] == 1993) { + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_PROP_TABLE, false); + } else { + _scene->_hotspots.activate(NOUN_HEADSET, false); + } + + if (_scene->_priorSceneId == 106) { + _game._player._playerPos = Common::Point(276, 73); + _game._player._facing = FACING_SOUTHWEST; + _game._player.walk(Common::Point(248, 75), FACING_SOUTHWEST); + } else if ((_scene->_priorSceneId == 104) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + if (_game._player._playerPos.y > 128) { + _game._player._playerPos.x = 216; + _game._player._facing = FACING_NORTHWEST; + } else if (_game._player._playerPos.y > 99) { + _game._player._playerPos.x = 127; + _game._player._facing = FACING_NORTHWEST; + } else { + _game._player._playerPos.x = 44; + _game._player._facing = FACING_NORTHEAST; + } + _game._player._playerPos.y = 143; + } + + sceneEntrySound(); +} + +void Scene107::step() { +} + +void Scene107::actions() { + if (_action.isAction(VERB_WALK_ONTO, NOUN_STAGE)) { + _scene->_nextSceneId = 104; + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK, NOUN_BACKSTAGE)) { + _scene->_nextSceneId = 106; + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_YELLOW_FRAME) && (_game._objects.isInRoom(OBJ_YELLOW_FRAME) || _game._trigger)) { + switch (_game._trigger) { + case (0): + if (_globals[kCurrentYear] == 1881) { + int count = 0; + if (_game._objects.isInInventory(OBJ_GREEN_FRAME)) + ++count; + if (_game._objects.isInInventory(OBJ_RED_FRAME)) + ++count; + if (_game._objects.isInInventory(OBJ_BLUE_FRAME)) + ++count; + + if (count < 3) + _globals[kPlayerScore] += 5; + } + + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 5, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _scene->_hotspots.activate(NOUN_YELLOW_FRAME, false); + _game._objects.addToInventory(OBJ_YELLOW_FRAME); + _vm->_sound->command(26); + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[1]); + _game._player._visible = true; + _scene->_sequences.addTimer(20, 3); + break; + + case 3: + if (_globals[kCurrentYear] == 1881) + _vm->_dialogs->showItem(OBJ_YELLOW_FRAME, 843, 0); + else + _vm->_dialogs->showItem(OBJ_YELLOW_FRAME, 804, 0); + + _game._player._stepEnabled = true; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(10710); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_STAGE)) { + _vm->_dialogs->show(10711); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_IN_TWO)) { + _vm->_dialogs->show(10712); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_IN_ONE)) { + _vm->_dialogs->show(10713); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CYCLORAMA)) { + _vm->_dialogs->show(10714); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_COUNTERWEIGHT_SYSTEM)) { + _vm->_dialogs->show(10715); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PURCHASE_LINES)) { + _vm->_dialogs->show(10716); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LOCKRAIL)) { + _vm->_dialogs->show(10717); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_STAGE)) { + _vm->_dialogs->show(10718); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PROP_TABLE)) { + _vm->_dialogs->show(10719); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ACT_CURTAIN)) { + _vm->_dialogs->show(10720); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LEG)) { + _vm->_dialogs->show(10721); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_APRON)) { + _vm->_dialogs->show(10722); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PROSCENIUM_ARCH)) { + _vm->_dialogs->show(10723); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_STAGE)) { + _vm->_dialogs->show(10724); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BACKSTAGE)) { + _vm->_dialogs->show(10725); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_YELLOW_FRAME) && _game._objects.isInRoom(OBJ_YELLOW_FRAME)) { + if (_globals[kCurrentYear] == 1881) + _vm->_dialogs->show(10727); + else + _vm->_dialogs->show(10726); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_HEADSET)) { + _vm->_dialogs->show(10728); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(10730); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE, NOUN_HEADSET)) { + _vm->_dialogs->show(10729); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TALK_TO, NOUN_HEADSET)) { + _vm->_dialogs->show(10732); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_PULL, NOUN_PURCHASE_LINES)) { + _vm->_dialogs->show(10731); + _action._inProgress = false; + return; + } +} + +void Scene107::preActions() { +} + +/*------------------------------------------------------------------------*/ + +Scene108::Scene108(MADSEngine *vm) : Scene1xx(vm) { + _anim0ActvFl = false; + _handRaisedFl = false; + _shutUpCount = -1; + _maxTalkCount = -1; + _charAction = -1; + _charFrame = -1; + _charHotspotId = -1; + _charTalkCount = -1; + _conversationCount = -1; + _prevShutUpFrame = -1; +} + +void Scene108::synchronize(Common::Serializer &s) { + Scene1xx::synchronize(s); + + s.syncAsByte(_anim0ActvFl); + s.syncAsByte(_handRaisedFl); + s.syncAsSint16LE(_shutUpCount); + s.syncAsSint16LE(_maxTalkCount); + s.syncAsSint16LE(_charAction); + s.syncAsSint16LE(_charFrame); + s.syncAsSint16LE(_charHotspotId); + s.syncAsSint16LE(_charTalkCount); + s.syncAsSint16LE(_conversationCount); + s.syncAsSint16LE(_prevShutUpFrame); +} + +void Scene108::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + if (_globals[kCurrentYear] == 1993) + _scene->_variant = 1; + + _scene->addActiveVocab(NOUN_GENTLEMAN); + _scene->addActiveVocab(NOUN_CHARLES); +} + +void Scene108::enter() { + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _anim0ActvFl = false; + _handRaisedFl = false; + _charTalkCount = 0; + _shutUpCount = 40; + _maxTalkCount = 15; + } + + _vm->_gameConv->get(2); + + if (_globals[kCurrentYear] == 1993) { + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1)); + _scene->_hotspots.activate(NOUN_STOOL, false); + int idx = _scene->_dynamicHotspots.add(NOUN_STOOL, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(250, 68, 250 + 8, 68 + 21)); + _scene->_dynamicHotspots[idx]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(idx, Common::Point(253, 75), FACING_SOUTHEAST); + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + } else { + _scene->_hotspots.activate(NOUN_HEADSET, false); + int idx = _scene->_dynamicHotspots.add(NOUN_WALL, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(258, 58, 258 + 6, 58 + 10)); + _scene->_dynamicHotspots[idx]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(idx, Common::Point(236, 69), FACING_NORTHEAST); + } + + if ((_globals[kCurrentYear] == 1993) && (_globals[kDoneBrieConv203] == 0)) { + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('c', 1), 1); + _anim0ActvFl = true; + + if (_vm->_gameConv->_running == 2) { + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + _charAction = 0; + _vm->_gameConv->run(2); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + _vm->_gameConv->exportValue(_globals[kJulieNameIsKnown]); + _vm->_gameConv->exportValue(_globals[kObservedPhan104]); + _scene->setAnimFrame(_globals._animationIndexes[0], 55); + _shutUpCount = 40; + } else { + _charAction = 2; + } + + if (_globals[kCharlesNameIsKnown]) { + _charHotspotId = _scene->_dynamicHotspots.add(NOUN_CHARLES, VERB_WALK_TO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(253, 52, 253 + 15, 52 + 34)); + _scene->_dynamicHotspots[_charHotspotId]._articleNumber = PREP_ON; + } else { + _charHotspotId = _scene->_dynamicHotspots.add(NOUN_GENTLEMAN, VERB_WALK_TO, SYNTAX_MASC_NOT_PROPER, EXT_NONE, Common::Rect(253, 52, 253 + 15, 52 + 34)); + _scene->_dynamicHotspots[_charHotspotId]._articleNumber = PREP_ON; + } + _scene->_dynamicHotspots.setPosition(_charHotspotId, Common::Point(235, 102), FACING_NORTHEAST); + } + + if (_scene->_priorSceneId == 106) { + _game._player._playerPos = Common::Point(48, 81); + _game._player._facing = FACING_SOUTHEAST; + _game._player.walk(Common::Point(71, 76), FACING_SOUTHEAST); + } else if ((_scene->_priorSceneId == 104) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + if (_game._player._playerPos.y > 128) { + _game._player._playerPos.x = 124; + _game._player._facing = FACING_NORTHEAST; + } else if (_game._player._playerPos.y > 99) { + _game._player._playerPos.x = 185; + _game._player._facing = FACING_NORTHEAST; + } else { + _game._player._playerPos.x = 243; + _game._player._facing = FACING_NORTHWEST; + } + + _game._player._playerPos.y = 143; + } + + sceneEntrySound(); +} + +void Scene108::step() { + if (_anim0ActvFl) + handleCharAnimation(); + + if ((_globals[kWalkerConverse] == 2) || (_globals[kWalkerConverse] == 3)) { + ++_conversationCount; + if (_conversationCount > 200) + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + } +} + +void Scene108::actions() { + if (_vm->_gameConv->_running == 2) { + handleCharlesConversation(); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TALK_TO, NOUN_GENTLEMAN) || _action.isAction(VERB_TALK_TO, NOUN_CHARLES)) { + _charAction = 6; + _game._player._stepEnabled = false; + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_ONTO, NOUN_STAGE)) { + _scene->_nextSceneId = 104; + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK, NOUN_BACKSTAGE)) { + _scene->_nextSceneId = 106; + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(10810); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(10730); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_STAGE)) { + _vm->_dialogs->show(10811); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_IN_TWO)) { + _vm->_dialogs->show(10812); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_IN_ONE)) { + _vm->_dialogs->show(10813); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PROSCENIUM_ARCH)) { + _vm->_dialogs->show(10814); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ACT_CURTAIN)) { + _vm->_dialogs->show(10815); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LEG)) { + _vm->_dialogs->show(10816); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CYCLORAMA)) { + _vm->_dialogs->show(10817); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FLATS)) { + _vm->_dialogs->show(10818); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_STAGEMANAGERS_POST)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(10819); + else + _vm->_dialogs->show(10820); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_STOOL)) { + _vm->_dialogs->show(10821); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BACKSTAGE)) { + _vm->_dialogs->show(10822); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_STAGE)) { + _vm->_dialogs->show(10823); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_HEADSET)) { + _vm->_dialogs->show(10824); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(10826); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CHARLES) || _action.isObject(NOUN_GENTLEMAN)) { + _vm->_dialogs->show(10827); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE, NOUN_CHARLES) || _action.isAction(VERB_TAKE, NOUN_GENTLEMAN)) { + _vm->_dialogs->show(10828); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_HEADSET)) { + _vm->_dialogs->show(10825); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_STOOL) && (_globals[kCurrentYear] == 1993)) { + _vm->_dialogs->show(10829); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TALK_TO, NOUN_HEADSET)) { + _vm->_dialogs->show(10830); + _action._inProgress = false; + return; + } +} + +void Scene108::preActions() { +} + +void Scene108::handleCharAnimation() { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _charFrame) + return; + + _charFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + int resetFrame = -1; + int random = -1; + + switch (_charFrame) { + case 1: + case 2: + case 3: + case 4: + case 92: + if (_charAction == 2) + random = _vm->getRandomNumber(2, 15); + + if (_charAction == 6) { + _charTalkCount = 0; + _charAction = 1; + random = 1; + } + + switch (random) { + case 1: + resetFrame = 5; + break; + + case 2: + resetFrame = 0; + break; + + case 3: + resetFrame = 1; + break; + + case 4: + resetFrame = 2; + break; + + default: + resetFrame = 3; + break; + } + break; + + case 18: + case 19: + case 20: + case 21: + case 27: + case 33: + case 41: + case 51: + case 52: + case 53: + case 54: + case 55: + case 56: + case 57: + case 62: + case 73: + if (_charFrame == 18) { + _game._player._stepEnabled = true; + _vm->_gameConv->run(2); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + _vm->_gameConv->exportValue(_globals[kJulieNameIsKnown]); + _vm->_gameConv->exportValue(_globals[kObservedPhan104]); + } + + if (_charAction == 1) { + if (_handRaisedFl) { + random = _vm->getRandomNumber(1, 3); + } else { + random = _vm->getRandomNumber(1, 4); + if (random == 4) + random = _vm->getRandomNumber(1, 4); + } + + if (random == 4) + _handRaisedFl = true; + + ++_charTalkCount; + if (_charTalkCount > _maxTalkCount) { + _charAction = 0; + _shutUpCount = 0; + _prevShutUpFrame = 10; + random = 12; + } + } else if (_charAction == 0) { + int delay = _vm->getRandomNumber(10, 15); + ++_shutUpCount; + if (_shutUpCount > delay) { + random = _vm->getRandomNumber(10, 16); + _prevShutUpFrame = random; + if (random == 15) + _shutUpCount = 16; + else + _shutUpCount = 0; + } else { + random = _prevShutUpFrame; + } + } else if (_charAction == 7) { + _charAction = 1; + random = 5; + } else if (_charAction == 3) { + _charAction = 1; + random = 6; + } else if (_charAction == 5) { + _charAction = 1; + random = 7; + } else if (_charAction == 4) { + _charAction = 1; + random = 8; + } else if (_charAction == 2) { + random = 9; + } + + switch (random) { + case 1: + resetFrame = 18; + break; + + case 2: + resetFrame = 19; + break; + + case 3: + resetFrame = 20; + break; + + case 4: + resetFrame = 62; + _charTalkCount += 5; + break; + + case 5: + resetFrame = 21; + break; + + case 6: + resetFrame = 41; + break; + + case 7: + resetFrame = 33; + break; + + case 8: + resetFrame = 27; + break; + + case 9: + resetFrame = 74; + break; + + case 10: + resetFrame = 51; + break; + + case 11: + resetFrame = 53; + break; + + case 12: + resetFrame = 54; + break; + + case 13: + resetFrame = 55; + break; + + case 14: + resetFrame = 56; + break; + + case 15: + resetFrame = 57; + break; + + case 16: + resetFrame = 52; + break; + + default: + break; + } + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame); + _charFrame = resetFrame; + } +} + +void Scene108::handleCharlesConversation() { + switch (_action._activeAction._verbId) { + case 1: + case 25: + case 26: + _globals[kWalkerConverse] = 0; + _vm->_gameConv->setHeroTrigger(64); + if (_action._activeAction._verbId == 26) + _globals[kCharlesNameIsKnown] = 2; + break; + + case 2: + if (!_globals[kCharlesNameIsKnown]) { + _scene->_dynamicHotspots.remove(_charHotspotId); + _charHotspotId = _scene->_dynamicHotspots.add(NOUN_CHARLES, VERB_WALK_TO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(253, 52, 253 + 15, 52 + 34)); + _scene->_dynamicHotspots[_charHotspotId]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_charHotspotId, Common::Point(235, 102), FACING_NORTHEAST); + _globals[kCharlesNameIsKnown] = true; + } + break; + + case 5: + _vm->_gameConv->setInterlocutorTrigger(66); + _maxTalkCount = 35; + break; + + case 6: + case 8: + case 9: + case 10: + case 11: + case 12: + case 15: + _maxTalkCount = 35; + break; + + case 16: + _vm->_gameConv->setInterlocutorTrigger(68); + _maxTalkCount = 35; + break; + + case 19: + _vm->_gameConv->setInterlocutorTrigger(72); + break; + + case 22: + _vm->_gameConv->setInterlocutorTrigger(70); + break; + + default: + _maxTalkCount = 15; + break; + } + + switch (_game._trigger) { + case 60: + _charAction = 1; + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + break; + + case 62: + _globals[kWalkerConverse] = _vm->getRandomNumber(2, 3); + _conversationCount = 0; + _charAction = 0; + break; + + case 64: + _charAction = 2; + break; + + case 66: + _charAction = 5; + break; + + case 68: + _charAction = 4; + break; + + case 70: + _charAction = 7; + break; + + case 72: + _charAction = 3; + break; + + default: + break; + } + + if ((_action._activeAction._verbId != 1) && (_action._activeAction._verbId != 5) && + (_action._activeAction._verbId != 16) && (_action._activeAction._verbId != 19) && + (_action._activeAction._verbId != 22) && (_action._activeAction._verbId != 25) && + (_action._activeAction._verbId != 26) && (_charAction != 2)) { + _vm->_gameConv->setInterlocutorTrigger(60); + _vm->_gameConv->setHeroTrigger(62); + } + + _charTalkCount = 0; + _shutUpCount = 40; + _handRaisedFl = false; +} + +/*------------------------------------------------------------------------*/ + +Scene109::Scene109(MADSEngine *vm) : Scene1xx(vm) { + _anim0ActvFl = false; + _anim1ActvFl = false; + _anim2ActvFl = false; + _anim3ActvFl = false; + + _currentFloor = -1; +} + +void Scene109::synchronize(Common::Serializer &s) { + Scene1xx::synchronize(s); + + s.syncAsByte(_anim0ActvFl); + s.syncAsByte(_anim1ActvFl); + s.syncAsByte(_anim2ActvFl); + s.syncAsByte(_anim3ActvFl); + + s.syncAsSint16LE(_currentFloor); +} + +void Scene109::setup() { + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene109::enter() { + _anim0ActvFl = false; + _anim1ActvFl = false; + _anim2ActvFl = false; + _anim3ActvFl = false; + + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 2)); + _globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RDR_6"); + + if (_globals[kCurrentYear] == 1881) { + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1)); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3)); + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 4)); + + _scene->_hotspots.activate(NOUN_LIGHT_FIXTURE, false); + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + _globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14); + _scene->_sequences.addTimer(1, 70); + } else { + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('z', 0)); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('z', 1)); + _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('z', 2)); + + _scene->_hotspots.activate(NOUN_LAMP, false); + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1); + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 1); + _globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, 1); + } + + if (_scene->_priorSceneId == 106) { + _game._player._playerPos = Common::Point(31, 459); + _game._player._facing = FACING_NORTHEAST; + _scene->setCamera(Common::Point(0, 312)); + _scene->sceneScale(467, 95, 442, 78); + _currentFloor = 1; + } else if (_scene->_priorSceneId == 111) { + if (_globals[kLeaveAngelMusicOn]) { + _globals[kLeaveAngelMusicOn] = false; + sceneEntrySound(); + } + _game._player._playerPos = Common::Point(4, 136); + _game._player._facing = FACING_EAST; + _game._player.walk(Common::Point(32, 138), FACING_EAST); + _game._player.setWalkTrigger(60); + _game._player._stepEnabled = false; + _scene->setCamera(Common::Point(0, 0)); + _scene->sceneScale(155, 95, 130, 78); + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 3); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _currentFloor = 3; + } else if ((_scene->_priorSceneId == 110) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + _game._player._playerPos = Common::Point(3, 292); + _game._player._facing = FACING_EAST; + _game._player.walk(Common::Point(31, 295), FACING_EAST); + _game._player.setWalkTrigger(65); + _game._player._stepEnabled = false; + _scene->setCamera(Common::Point(0, 156)); + _scene->sceneScale(311, 95, 286, 78); + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 3); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + _currentFloor = 2; + } else if (_scene->_priorSceneId == RETURNING_FROM_LOADING) { + if (_currentFloor == 2) { + _scene->setCamera(Common::Point(0, 156)); + _scene->sceneScale(311, 95, 286, 78); + } else if (_currentFloor == 3) { + _scene->setCamera(Common::Point(0, 0)); + _scene->sceneScale(155, 95, 130, 78); + } else { + _scene->setCamera(Common::Point(0, 312)); + _scene->sceneScale(467, 95, 442, 78); + } + } + + sceneEntrySound(); +} + +void Scene109::step() { + if (_anim0ActvFl) { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 80) + _game._camY.camPanTo(156); + } + + if (_anim1ActvFl) { + if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == 80) + _game._camY.camPanTo(0); + } + + if (_anim2ActvFl) { + if (_scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame() == 7) + _game._camY.camPanTo(312); + } + + if (_anim3ActvFl) { + if (_scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame() == 14) + _game._camY.camPanTo(156); + } + + switch (_game._trigger) { + case 60: + _scene->deleteSequence(_globals._sequenceIndexes[0]); + _globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 3); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 61); + break; + + case 61: + _vm->_sound->command(25); + _game._player._stepEnabled = true; + break; + + default: + break; + } + + switch (_game._trigger) { + case 65: + _scene->deleteSequence(_globals._sequenceIndexes[1]); + _globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 3); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 66); + break; + + case 66: + _vm->_sound->command(25); _game._player._stepEnabled = true; + break; + + default: + break; + } + + if (_game._trigger == 70) { + int rndFrame = _vm->getRandomNumber(1, 3); + int rndDelay = _vm->getRandomNumber(4, 7); + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _scene->deleteSequence(_globals._sequenceIndexes[3]); + _scene->deleteSequence(_globals._sequenceIndexes[4]); + + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, rndFrame); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, rndFrame); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + + _globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, rndFrame); + _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14); + + _scene->_sequences.addTimer(rndDelay, 70); } } +void Scene109::actions() { + if (_action.isAction(VERB_WALK, NOUN_BACKSTAGE)) { + _scene->_nextSceneId = 106; + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLIMB_UP, NOUN_STAIRCASE)) { + if (_currentFloor == 2) { + switch (_game._trigger) { + case 0: + _game._player.walk(Common::Point(58, 295), FACING_EAST); + _game._player.setWalkTrigger(1); + break; + + case 1: + _anim1ActvFl = true; + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('w', 2), 2); + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[1], SYNC_PLAYER, 0); + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[1]); + _scene->sceneScale(155, 95, 130, 78); + _anim1ActvFl = false; + _game._player._visible = true; + _game._player._playerPos = Common::Point(261, 137); + _game._player.walk(Common::Point(281, 143), FACING_SOUTHWEST); + _game._player.setWalkTrigger(3); + break; + + case 3: + _game._player._stepEnabled = true; + _currentFloor = 3; + break; + + default: + break; + } + } else if (_currentFloor == 1) { + switch (_game._trigger) { + case 0: + _game._player.walk(Common::Point(58, 452), FACING_EAST); + _game._player.setWalkTrigger(1); + break; + + case 1: + _anim0ActvFl = true; + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('w', 1), 2); + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0); + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); + _scene->sceneScale(311, 95, 286, 78); + _anim0ActvFl = false; + _game._player._visible = true; + _game._player._playerPos = Common::Point(264, 295); + _game._player.walk(Common::Point(289, 299), FACING_SOUTHWEST); + _game._player.setWalkTrigger(3); + break; + + case 3: + _game._player._stepEnabled = true; + _currentFloor = 2; + break; + + default: + break; + } + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLIMB_DOWN, NOUN_STAIRCASE)) { + if (_currentFloor == 2) { + switch (_game._trigger) { + case 0: + _game._player.walk(Common::Point(287, 291), FACING_WEST); + _game._player.setWalkTrigger(1); + break; + + case 1: + _game._player.walk(Common::Point(269, 292), FACING_WEST); + _game._player.setWalkTrigger(2); + break; + + case 2: + _anim2ActvFl = true; + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('w', 3), 3); + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[2], SYNC_PLAYER, 0); + break; + + case 3: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[2]); + _scene->sceneScale(467, 95, 442, 78); + _anim2ActvFl = false; + _game._player._visible = true; + _game._player._playerPos = Common::Point(61, 450); + _game._player.walk(Common::Point(36, 450), FACING_SOUTHEAST); + _game._player.setWalkTrigger(4); + break; + + case 4: + _game._player._stepEnabled = true; + _currentFloor = 1; + break; + + default: + break; + } + } else if (_currentFloor == 3) { + switch (_game._trigger) { + case 0: + _game._player.walk(Common::Point(287, 137), FACING_WEST); + _game._player.setWalkTrigger(1); + break; + + case 1: + _game._player.walk(Common::Point(269, 138), FACING_WEST); + _game._player.setWalkTrigger(2); + break; + + case 2: + _anim3ActvFl = true; + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('w', 4), 3); + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[3], SYNC_PLAYER, 0); + break; + + case 3: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[3]); + _scene->sceneScale(311, 95, 286, 78); + _anim3ActvFl = false; + _game._player._visible = true; + _game._player._playerPos = Common::Point(59, 296); + _game._player.walk(Common::Point(40, 294), FACING_SOUTHEAST); + _game._player.setWalkTrigger(4); + break; + + case 4: + _game._player._stepEnabled = true; + _currentFloor = 2; + break; + + default: + break; + } + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR) || _game._trigger) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -1, -2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 4, 75); + break; + + case 2: + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]); + if (_currentFloor == 3) + _game._player.walk(Common::Point(2, 131), FACING_WEST); + else if (_currentFloor == 2) + _game._player.walk(Common::Point(2, 281), FACING_WEST); + + _scene->_sequences.addTimer(180, 3); + break; + + case 3: + if (_currentFloor == 3) + _scene->_nextSceneId = 111; + else if (_currentFloor == 2) + _scene->_nextSceneId = 110; + break; + + case 75: + _vm->_sound->command(24); + if (_currentFloor == 3) { + _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 3); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 76); + } else if (_currentFloor == 2) { + _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 3); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 76); + } + break; + + case 76: + if (_currentFloor == 3) { + int idx = _globals._sequenceIndexes[0]; + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 3); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[0], SYNC_SEQ, idx); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + } else if (_currentFloor == 2) { + int idx = _globals._sequenceIndexes[1]; + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 3); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[1], SYNC_SEQ, idx); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + } + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(10910); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_STAIRCASE)) { + if (_currentFloor == 1) + _vm->_dialogs->show(10911); + else if (_currentFloor == 2) + _vm->_dialogs->show(10921); + else if (_currentFloor == 3) + _vm->_dialogs->show(10922); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(10912); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BACKSTAGE)) { + _vm->_dialogs->show(10913); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR)) { + _vm->_dialogs->show(10914); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RAILING)) { + _vm->_dialogs->show(10915); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(10916); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LIGHT_FIXTURE)) { + _vm->_dialogs->show(10917); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LAMP)) { + _vm->_dialogs->show(10918); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_HOLE)) { + _vm->_dialogs->show(10919); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CEILING)) { + _vm->_dialogs->show(10920); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE, NOUN_LAMP)) { + _vm->_dialogs->show(10924); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLOSE, NOUN_DOOR)) { + _vm->_dialogs->show(10923); + _action._inProgress = false; + return; + } +} + +void Scene109::preActions() { + if (_action.isAction(VERB_OPEN, NOUN_DOOR)) { + if (_currentFloor == 3) + _game._player.walk(Common::Point(32, 138), FACING_WEST); + else if (_currentFloor == 2) + _game._player.walk(Common::Point(31, 295), FACING_WEST); + } +} + +/*------------------------------------------------------------------------*/ + +Scene110::Scene110(MADSEngine *vm) : Scene1xx(vm) { +} + +void Scene110::synchronize(Common::Serializer &s) { + Scene1xx::synchronize(s); +} + +void Scene110::setup() { + if (_globals[kCurrentYear] == 1993) + _scene->_variant = 1; + + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene110::enter() { + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 1)); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RDR_9"); + + if (_globals[kCurrentYear] == 1993) { + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1)); + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_POSTER, false); + _scene->_hotspots.activate(NOUN_WASTE_BASKET, false); + + if (_globals[kDoneBrieConv203] == 0) { + if (_globals[kJuliesDoor] == 0) { + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 3); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 8); + } + } else { + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 8); + } + } else { + _scene->_hotspots.activate(NOUN_BULLETIN_BOARD, false); + _scene->_hotspots.activate(NOUN_PAPER, false); + _scene->_hotspots.activate(NOUN_TRASH_BUCKET, false); + } + + if (_scene->_priorSceneId == 112) { + _game._player._playerPos = Common::Point(261, 121); + _game._player._facing = FACING_SOUTH; + _game._player.walk(Common::Point(221, 131), FACING_SOUTH); + } else if ((_scene->_priorSceneId == 109) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + _game._player.firstWalk(Common::Point(335, 150), FACING_WEST, Common::Point(310, 150), FACING_WEST, true); + } + + sceneEntrySound(); +} + +void Scene110::step() { +} + +void Scene110::actions() { + if ((_action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_RIGHT_DOOR) || _action.isAction(VERB_LOCK, NOUN_RIGHT_DOOR)) + && (_globals[kDoneBrieConv203] == 0) && (_globals[kCurrentYear] == 1993) && (_globals[kJuliesDoor] == 0)) { + _scene->_nextSceneId = 112; + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_LEFT_DOOR) || _action.isAction(VERB_OPEN, NOUN_LEFT_DOOR) + || _action.isAction(VERB_UNLOCK, NOUN_LEFT_DOOR) || _action.isAction(VERB_LOCK, NOUN_LEFT_DOOR)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 1); + break; + + case 1: { + int idx = _globals._sequenceIndexes[1]; + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 4); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[1], SYNC_SEQ, idx); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], false); + _scene->_sequences.addTimer(30, 2); + _vm->_sound->command(73); + } + break; + + case 2: + _scene->deleteSequence(_globals._sequenceIndexes[1]); + _globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], false); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 3); + break; + + case 3: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[1]); + _game._player._visible = true; + _game._player._stepEnabled = true; + if (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK)) + _vm->_dialogs->show(32); + else + _vm->_dialogs->show(11022); + + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_DOOR) || _action.isAction(VERB_OPEN, NOUN_RIGHT_DOOR) + || _action.isAction(VERB_UNLOCK, NOUN_RIGHT_DOOR) || _action.isAction(VERB_LOCK, NOUN_RIGHT_DOOR)) { + if (((_globals[kCurrentYear] == 1881) || (_globals[kDoneBrieConv203] >= 1)) + && !_action.isAction(VERB_UNLOCK, NOUN_RIGHT_DOOR) && !_action.isAction(VERB_LOCK, NOUN_RIGHT_DOOR)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 1); + break; + + case 1: { + int idx = _globals._sequenceIndexes[1]; + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 4); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[1], SYNC_SEQ, idx); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], false); + _scene->_sequences.addTimer(30, 2); + _vm->_sound->command(73); + } + break; + + case 2: + _scene->deleteSequence(_globals._sequenceIndexes[1]); + _globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], false); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 3); + break; + + case 3: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[1]); + _game._player._visible = true; + _game._player._stepEnabled = true; + if (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK)) + _vm->_dialogs->show(32); + else + _vm->_dialogs->show(11023); + break; + + default: + break; + } + _action._inProgress = false; + return; + } else if (_globals[kJuliesDoor] == 1) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 7, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 4, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 3); + break; + + case 1: + _vm->_sound->command(24); + _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 10, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 2: + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 3); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10); + break; + + case 3: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[1]); + _game._player._visible = true; + _game._player.walk(Common::Point(261, 121), FACING_NORTHEAST); + _game._player.setWalkTrigger(4); + break; + + case 4: + _scene->_nextSceneId = 112; + _globals[kJuliesDoor] = 0; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + } + + if (_action._lookFlag) { + _vm->_dialogs->show(11010); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(11011); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(11012); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CEILING)) { + _vm->_dialogs->show(11013); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_STAIRWELL)) { + _vm->_dialogs->show(11014); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RIGHT_DOOR)) { + if (_globals[kDoneBrieConv203] >= 1) + _vm->_dialogs->show(11016); + else if (_globals[kChrisFStatus] == 1) + _vm->_dialogs->show(11015); + else + _vm->_dialogs->show(11016); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LEFT_DOOR)) { + _vm->_dialogs->show(11016); + _action._inProgress = false; + return; + } + + if ((_action.isObject(NOUN_WASTE_BASKET)) || (_action.isObject(NOUN_TRASH_BUCKET))) { + _vm->_dialogs->show(11017); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_POSTER)) { + _vm->_dialogs->show(11018); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BULLETIN_BOARD)) { + _vm->_dialogs->show(11019); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PAPER)) { + _vm->_dialogs->show(11029); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_WASTE_BASKET) || _action.isAction(VERB_TAKE, NOUN_TRASH_BUCKET)) { + _vm->_dialogs->show(11020); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LIGHT_FIXTURE)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(11021); + else + _vm->_dialogs->show(11028); + + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE, NOUN_PAPER)) { + _vm->_dialogs->show(11030); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLOSE, NOUN_RIGHT_DOOR)) { + if (_globals[kDoneBrieConv203] >= 1) + _vm->_dialogs->show(11026); + else if (_globals[kChrisFStatus] == 1) + _vm->_dialogs->show(11024); + else + _vm->_dialogs->show(11026); + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLOSE, NOUN_LEFT_DOOR)) { + _vm->_dialogs->show(11025); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_OPEN, NOUN_RIGHT_DOOR)) { + if ((_globals[kChrisFStatus] == 1) && (_globals[kDoneBrieConv203] == 0)) + _vm->_dialogs->show(11027); + + _action._inProgress = false; + return; + } +} + +void Scene110::preActions() { + if (_action.isAction(VERB_EXIT_TO, NOUN_STAIRWELL)) + _game._player._walkOffScreenSceneId = 109; + + if (_action.isAction(VERB_OPEN, NOUN_LEFT_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_LEFT_DOOR) || _action.isAction(VERB_LOCK, NOUN_LEFT_DOOR)) + _game._player.walk(Common::Point(111, 126), FACING_NORTHEAST); + + if (_action.isAction(VERB_OPEN, NOUN_RIGHT_DOOR) || _action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_DOOR) + || _action.isAction(VERB_UNLOCK, NOUN_RIGHT_DOOR) || _action.isAction(VERB_LOCK, NOUN_RIGHT_DOOR)) { + if ((_globals[kCurrentYear] == 1881) || (_globals[kDoneBrieConv203] >= 1)) + _game._player.walk(Common::Point(221, 131), FACING_NORTHEAST); + else if ((_globals[kJuliesDoor] == 1) || _action.isAction(VERB_OPEN)) + _game._player.walk(Common::Point(223, 128), FACING_NORTHEAST); + else if (_globals[kJuliesDoor] == 0) + _game._player.walk(Common::Point(261, 120), FACING_NORTHEAST); + } + + if (_action.isAction(VERB_LOOK, NOUN_PAPER)) + _game._player._needToWalk = true; +} + +/*------------------------------------------------------------------------*/ + +Scene111::Scene111(MADSEngine *vm) : Scene1xx(vm) { + _removeAxe = false; + _anim0ActvFl = false; + _anim1ActvFl = false; + _closedFl = false; + _listenFrame = -1; + _listenStatus = -1; + +} + +void Scene111::synchronize(Common::Serializer &s) { + Scene1xx::synchronize(s); + + s.syncAsByte(_removeAxe); + s.syncAsByte(_anim0ActvFl); + s.syncAsByte(_anim1ActvFl); + s.syncAsByte(_closedFl); + s.syncAsSint16LE(_listenFrame); + s.syncAsSint16LE(_listenStatus); +} + +void Scene111::setup() { + if (_globals[kCurrentYear] == 1993) + _scene->_variant = 1; + + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene111::enter() { + _scene->_hotspots.activate(NOUN_HOOK, false); + + _removeAxe = false; + _anim0ActvFl = false; + _anim1ActvFl = false; + _closedFl = true; + + if (_globals[kCurrentYear] == 1881) { + if ((_globals[kJacquesNameIsKnown] == 2) && (_globals[kMadameNameIsKnown] == 2) && (_globals[kPanelIn206]) && + (_globals[kDoneRichConv203]) && (_game._objects.isInInventory(OBJ_LANTERN)) && + ((_game._objects.isInInventory(OBJ_CABLE_HOOK) && _game._objects.isInInventory(OBJ_ROPE)) || _game._objects.isInInventory(OBJ_ROPE_WITH_HOOK))) { + _closedFl = false; + } else + _closedFl = true; + } else + _closedFl = false; + + if (_globals[kJacquesStatus]) { + _scene->_hotspots.activate(NOUN_HOOK, true); + _scene->_hotspots.activate(NOUN_FIRE_AXE, false); + } + + _vm->_gameConv->get(14); + + _globals._spriteIndexes[0] = _scene->_sprites.addSprites("*RDR_9"); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('a', 1)); + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('a', 3)); + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 0)); + + if (_globals[kCurrentYear] == 1881) + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 2)); + + if (_globals[kCurrentYear] == 1993) { + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('z', -1)); + _scene->drawToBackground(_globals._spriteIndexes[1], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_LAMP, false); + int idx = _scene->_dynamicHotspots.add(NOUN_WALL, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(35, 82, 35 + 13, 82 + 11)); + _scene->_dynamicHotspots.setPosition(idx, Common::Point(78, 122), FACING_NORTHEAST); + } else { + _scene->_hotspots.activate(NOUN_LIGHT, false); + if (_globals[kChristineDoorStatus] == 2) { + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 10); + _scene->drawToBackground(_globals._spriteIndexes[4], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_FIRE_AXE, false); + _scene->_hotspots.activate(NOUN_DOOR_CHUNKS, true); + _scene->_hotspots.activate(NOUN_HANDLE, true); + _scene->_hotspots.activate(NOUN_AXE, true); + } + } + + if ((_globals[kChristineDoorStatus] == 0) && (_scene->_priorSceneId != 113) && !_closedFl) { + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 3); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14); + } + + if ((_globals[kCurrentYear] == 1993) || (_globals[kChristineDoorStatus] <= 1)) { + if (!_globals[kJacquesStatus]) { + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 5); + _scene->_hotspots.activate(NOUN_AXE, false); + } + _scene->_hotspots.activate(NOUN_DOOR_CHUNKS, false); + _scene->_hotspots.activate(NOUN_HANDLE, false); + } + + if (_scene->_priorSceneId == 113) { + _game._player._playerPos = Common::Point(146, 108); + _game._player.walk(Common::Point(112, 126), FACING_SOUTH); + + if (!_globals[kLeaveAngelMusicOn]) + sceneEntrySound(); + + if (_globals[kChristineDoorStatus] != 2) { + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 3); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14); + + if ((_globals[kCurrentYear] == 1881) && (_globals[kLeaveAngelMusicOn])) { + _game._player.setWalkTrigger(60); + _game._player._stepEnabled = false; + _globals[kChristineDoorStatus] = 1; + _globals[kChrisKickedRaoulOut] = true; + _globals[kHintThatDaaeIsHome1] = true; + _globals[kHintThatDaaeIsHome2] = true; + } + } + } else if ((_scene->_priorSceneId == 109) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) + _game._player.firstWalk(Common::Point(335, 150), FACING_WEST, Common::Point(311, 150), FACING_WEST, true); + + sceneEntrySound(); +} + +void Scene111::step() { + if (_anim0ActvFl) + handleListenAnimation(); + + if (!_removeAxe && _anim1ActvFl && (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == 5)) { + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _game._objects.addToInventory(OBJ_FIRE_AXE); + _removeAxe = true; + } + + if (_game._objects.isInInventory(OBJ_FIRE_AXE) && _anim1ActvFl && (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == 36)) + _game._objects.setRoom(OBJ_FIRE_AXE, NOWHERE); + + if (_game._player._playerPos == Common::Point(145, 108)) + _scene->_nextSceneId = 113; + + switch (_game._trigger) { + case 60: + _scene->deleteSequence(_globals._sequenceIndexes[5]); + _globals._sequenceIndexes[5] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[5], false, 7, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 62); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2); + break; + + case 62: + _vm->_sound->command(25); + _game._player._stepEnabled = true; + _vm->_gameConv->run(14); + if (_game._difficulty == DIFFICULTY_EASY) + _vm->_gameConv->exportValue(1); + else + _vm->_gameConv->exportValue(0); + + _game._player.walk(Common::Point(119, 124), FACING_EAST); + _game._player.setWalkTrigger(64); + break; + + case 64: + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('l', 1), 70); + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0); + _anim0ActvFl = true; + _listenStatus = 0; + _game._player._visible = false; + break; + + case 70: + _game._player._visible = true; + _anim0ActvFl = false; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); + _scene->_sequences.addTimer(30, 71); + break; + + case 71: + _vm->_gameConv->release(); + break; + + default: + break; + } +} + +void Scene111::actions() { + if (_vm->_gameConv->_running == 14) { + handleListenConversation(); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_DOOR) || _action.isAction(VERB_OPEN, NOUN_RIGHT_DOOR) || _action.isAction(VERB_UNLOCK) || _action.isAction(VERB_LOCK)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 1); + _action._inProgress = false; + return; + + case 1: { + int idx = _globals._sequenceIndexes[0]; + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 4); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[0], SYNC_SEQ, idx); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], false); + _scene->_sequences.addTimer(30, 2); + _vm->_sound->command(73); + _action._inProgress = false; + return; + } + + case 2: + _scene->deleteSequence(_globals._sequenceIndexes[0]); + _globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], false); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 3); + _action._inProgress = false; + return; + + case 3: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[0]); + _game._player._visible = true; + if (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK)) + _vm->_dialogs->show(32); + else + _vm->_dialogs->show(11123); + + _game._player._stepEnabled = true; + _action._inProgress = false; + return; + + default: + break; + } + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_LEFT_DOOR) || _action.isAction(VERB_OPEN, NOUN_LEFT_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_LEFT_DOOR) || _action.isAction(VERB_LOCK, NOUN_LEFT_DOOR)) { + if ((_globals[kChristineDoorStatus] == 1) || _closedFl || _action.isAction(VERB_UNLOCK, NOUN_LEFT_DOOR) || _action.isAction(VERB_LOCK, NOUN_LEFT_DOOR)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 1); + _action._inProgress = false; + return; + + case 1: { + int idx = _globals._sequenceIndexes[0]; + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 4); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[0], SYNC_SEQ, idx); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], false); + _scene->_sequences.addTimer(30, 2); + _vm->_sound->command(73); + _action._inProgress = false; + return; + } + + case 2: + _scene->deleteSequence(_globals._sequenceIndexes[0]); + _globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], false); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 3); + _action._inProgress = false; + return; + + case 3: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[0]); + _game._player._visible = true; + + if (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK)) + _vm->_dialogs->show(32); + else if ((_globals[kChrisKickedRaoulOut]) && (_globals[kTicketPeoplePresent] == 1) && (_globals[kJacquesStatus] == 0)) + _vm->_dialogs->show(11135); + else + _vm->_dialogs->show(11124); + + _game._player._stepEnabled = true; + _action._inProgress = false; + return; + + default: + break; + } + } else if (_globals[kChristineDoorStatus] == 2) { + _vm->_dialogs->show(11137); + _action._inProgress = false; + return; + } else { + _vm->_dialogs->show(11126); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE, NOUN_FIRE_AXE)) { + if ((_globals[kCurrentYear] == 1881) && (_globals[kJacquesStatus] == 0) && (_globals[kChristineDoorStatus] == 1) && (_globals[kChrisKickedRaoulOut])) { + switch (_game._trigger) { + case 0: + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('q', -1), 1); + _scene->_hotspots.activate(NOUN_FIRE_AXE, false); + _scene->_hotspots.activate(NOUN_DOOR_CHUNKS, true); + _scene->_hotspots.activate(NOUN_HANDLE, true); + _scene->_hotspots.activate(NOUN_AXE, true); + _anim1ActvFl = true; + _game._player._stepEnabled = false; + _game._player._visible = false; + break; + + case 1: + _globals[kChristineDoorStatus] = 2; + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_ANIM, _globals._animationIndexes[1]); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 10); + _scene->drawToBackground(_globals._spriteIndexes[4], 1, Common::Point(-32000, -32000), 0, 100); + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[1]); + _game._player._visible = true; + _game._player._playerPos = Common::Point(126, 126); + _anim1ActvFl = false; + _game._player.walk(Common::Point(145, 108), FACING_NORTHEAST); + _game._player.resetFacing(FACING_NORTHWEST); + break; + + default: + break; + } + } else if (_globals[kCurrentYear] == 1993 && _globals[kMakeBrieLeave203]) + _vm->_dialogs->show(11142); + else + _vm->_dialogs->show(11134); + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(11110); + else + _vm->_dialogs->show(11111); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(11112); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(11113); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CEILING)) { + _vm->_dialogs->show(11114); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_STAIRWELL)) { + _vm->_dialogs->show(11115); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TABLE)) { + _vm->_dialogs->show(11118); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PLANT)) { + _vm->_dialogs->show(11119); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FIRE_AXE)) { + _vm->_dialogs->show(11120); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_HANDLE)) { + _vm->_dialogs->show(11121); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_AXE)) { + _vm->_dialogs->show(11122); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR_CHUNKS)) { + _vm->_dialogs->show(11129); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LIGHT)) { + _vm->_dialogs->show(11131); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LAMP)) { + _vm->_dialogs->show(11132); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_HOOK)) { + _vm->_dialogs->show(11141); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LEFT_DOOR)) { + if (_globals[kJacquesStatus]) + _vm->_dialogs->show(11140); + else if (_globals[kChristineDoorStatus] == 2) + _vm->_dialogs->show(11130); + else if ((_globals[kChrisKickedRaoulOut]) && (_globals[kTicketPeoplePresent] == 1)) + _vm->_dialogs->show(11136); + else if ((_globals[kChristineDoorStatus] == 1) || _closedFl) + _vm->_dialogs->show(11117); + else if (_globals[kChristineDoorStatus] == 0) + _vm->_dialogs->show(11116); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RIGHT_DOOR)) { + _vm->_dialogs->show(11117); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_CLOSE, NOUN_RIGHT_DOOR)) { + _vm->_dialogs->show(11128); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLOSE, NOUN_LEFT_DOOR)) { + if (_closedFl) + _vm->_dialogs->show(11128); + else if ((_globals[kChristineDoorStatus] == 2) && (!_globals[kTicketPeoplePresent])) + _vm->_dialogs->show(11138); + else if (_globals[kChristineDoorStatus] == 1) + _vm->_dialogs->show(11127); + else if (_globals[kChristineDoorStatus] == 0) + _vm->_dialogs->show(11125); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_OPEN, NOUN_LEFT_DOOR)) { + if (_globals[kChristineDoorStatus] == 0) + _vm->_dialogs->show(11126); + _action._inProgress = false; + return; + } +} + +void Scene111::preActions() { + if (_action.isAction(VERB_EXIT_TO, NOUN_STAIRWELL)) { + if (_globals[kLeaveAngelMusicOn]) { + _vm->_dialogs->show(11139); + _game._player._needToWalk = false; + _game._player.cancelCommand(); + } else + _game._player._walkOffScreenSceneId = 109; + } + + if (_action.isAction(VERB_TAKE, NOUN_FIRE_AXE) && _game._objects.isInRoom(OBJ_FIRE_AXE) && (_globals[kCurrentYear] == 1881) + && (_globals[kChristineDoorStatus] == 1) && (_globals[kChrisKickedRaoulOut]) && (_globals[kJacquesStatus] == 0)) + _game._player.walk(Common::Point(119, 124), FACING_EAST); + + if (_action.isAction(VERB_OPEN, NOUN_RIGHT_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_RIGHT_DOOR) || _action.isAction(VERB_LOCK, NOUN_RIGHT_DOOR)) + _game._player.walk(Common::Point(219, 131), FACING_NORTHEAST); + + if (_action.isAction(VERB_OPEN, NOUN_LEFT_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_LEFT_DOOR) || _action.isAction(VERB_LOCK, NOUN_LEFT_DOOR)) + _game._player.walk(Common::Point(109, 124), FACING_NORTHEAST); + + if ((_action.isAction(VERB_WALK_THROUGH, NOUN_LEFT_DOOR) || _action.isAction(VERB_UNLOCK, NOUN_LEFT_DOOR) || _action.isAction(VERB_LOCK, NOUN_LEFT_DOOR)) + && !_closedFl && ((_globals[kChristineDoorStatus] == 2) || (_globals[kChristineDoorStatus] == 0))) + _game._player.walk(Common::Point(145, 108), FACING_NORTHEAST); +} + +void Scene111::handleListenAnimation() { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _listenFrame) + return; + + int nextFrame = -1; + _listenFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + + if (_listenFrame == 6) { + if (_listenStatus == 0) + nextFrame = 5; + else if (_listenStatus == 1) + nextFrame = 7; + } + + if (nextFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[0], nextFrame); + _listenFrame = nextFrame; + } +} + +void Scene111::handleListenConversation() { + if (_action._activeAction._verbId == 1) + _vm->_gameConv->setInterlocutorTrigger(66); + + if (_action._activeAction._verbId == 7) + _vm->_gameConv->setInterlocutorTrigger(68); + + if (_game._trigger == 66) + _listenStatus = 0; + + if (_game._trigger == 68) { + _listenStatus = 1; + _vm->_gameConv->hold(); + } + + if ((_action._activeAction._verbId != 1) && (_action._activeAction._verbId != 7)) + _vm->_gameConv->setInterlocutorTrigger(72); +} + +/*------------------------------------------------------------------------*/ + +Scene112::Scene112(MADSEngine *vm) : Scene1xx(vm) { + _anim0ActvFl = false; + _anim1ActvFl = false; + _raoulAction = -1; + _raoulFrame = -1; + _didOptionFl = -1; + _julieFrame = -1; + _julieAction = -1; + _julieHotspotId = -1; + _julieCounter = -1; +} + +void Scene112::synchronize(Common::Serializer &s) { + Scene1xx::synchronize(s); + + s.syncAsByte(_anim0ActvFl); + s.syncAsByte(_anim1ActvFl); + s.syncAsSint16LE(_raoulAction); + s.syncAsSint16LE(_raoulFrame); + s.syncAsSint16LE(_didOptionFl); + s.syncAsSint16LE(_julieFrame); + s.syncAsSint16LE(_julieAction); + s.syncAsSint16LE(_julieCounter); +} + +void Scene112::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + _scene->addActiveVocab(NOUN_WOMAN); + _scene->addActiveVocab(NOUN_JULIE); +} + +void Scene112::enter() { + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _raoulAction = 2; + _didOptionFl = 0; + } + + _vm->_gameConv->get(3); + + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('j', 1), 1); + _anim0ActvFl = true; + _julieAction = 2; + _scene->setAnimFrame(_globals._animationIndexes[0], 3); + if (_globals[kJulieNameIsKnown] == 2) { + _julieHotspotId = _scene->_dynamicHotspots.add(NOUN_JULIE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(255, 82, 255 + 30, 82 + 44)); + _scene->_dynamicHotspots[_julieHotspotId]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_julieHotspotId, Common::Point(216, 137), FACING_NORTHEAST); + _scene->_hotspots.activate(NOUN_WOMAN, false); + } + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('r', 1), 1); + _anim1ActvFl = true; + _scene->setAnimFrame(_globals._animationIndexes[1], 82); + _raoulAction = 2; + + if (_vm->_gameConv->_restoreRunning == 3) { + _vm->_gameConv->run(3); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + _scene->setAnimFrame(_globals._animationIndexes[1], 17); + _raoulAction = 1; + _game._player._playerPos = Common::Point(53, 128); + _game._player._facing = FACING_EAST; + _game._player._visible = false; + } else if ((_scene->_priorSceneId == 110) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + _game._player._playerPos = Common::Point(128, 145); + _game._player._facing = FACING_NORTH; + } + + sceneEntrySound(); +} + +void Scene112::step() { + if (_anim0ActvFl) + handleJulieAnimation(); + + if (_anim1ActvFl) + handleRaoulChair(); +} + +void Scene112::actions() { + if (_vm->_gameConv->_running == 3) { + handleConversation(); + _action._inProgress = false; + return; + } + + if ((_action.isAction(VERB_TALK_TO, NOUN_JULIE)) || (_action.isAction(VERB_TALK_TO, NOUN_WOMAN))) { + if (_globals[kJulieNameIsKnown] > 0) { + _game._player._visible = false; + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[1], SYNC_PLAYER, 0); + _scene->setAnimFrame(_globals._animationIndexes[1], 1); + _raoulAction = 1; + } + _vm->_gameConv->run(3); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_EXIT_TO, NOUN_CORRIDOR)) { + _scene->_nextSceneId = 110; + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(11210); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(11211); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(11212); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MIRROR)) { + _vm->_dialogs->show(11213); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BALLET_BAR)) { + _vm->_dialogs->show(11214); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CORRIDOR)) { + _vm->_dialogs->show(11215); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_THROW_RUGS)) { + _vm->_dialogs->show(11216); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DRESSING_SCREEN)) { + _vm->_dialogs->show(11217); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DRESSING_TABLE)) { + _vm->_dialogs->show(11218); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CHAIR)) { + _vm->_dialogs->show(11219); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PLANT)) { + _vm->_dialogs->show(11220); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_COAT_RACK)) { + _vm->_dialogs->show(11221); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_UMBRELLA)) { + _vm->_dialogs->show(11222); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PAINTINGS)) { + _vm->_dialogs->show(11223); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TRASH_BUCKET)) { + _vm->_dialogs->show(11224); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SHELF)) { + _vm->_dialogs->show(11225); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CONTAINER)) { + _vm->_dialogs->show(11226); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TORN_POSTER)) { + _vm->_dialogs->show(11227); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_POSTER)) { + _vm->_dialogs->show(11228); + _action._inProgress = false; + return; + } + + if ((_action.isObject(NOUN_REVIEW)) || (_action.isObject(NOUN_REVIEWS))) { + _vm->_dialogs->show(11229); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_JULIE)) { + _vm->_dialogs->show(11231); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_COSTUME_RACK)) { + _vm->_dialogs->show(11232); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LIGHT_FIXTURE)) { + _vm->_dialogs->show(11233); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WARDROBE)) { + _vm->_dialogs->show(11234); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WOMAN)) { + _vm->_dialogs->show(11237); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE)) { + if (_action.isObject(NOUN_WOMAN) || _action.isObject(NOUN_JULIE)) { + _vm->_dialogs->show(11238); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_OPEN, NOUN_WARDROBE)) { + _vm->_dialogs->show(11235); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_OPEN, NOUN_CONTAINER)) { + _vm->_dialogs->show(11236); + _action._inProgress = false; + return; + } +} + +void Scene112::preActions() { + if ((_action.isAction(VERB_TALK_TO, NOUN_JULIE) || _action.isAction(VERB_TALK_TO, NOUN_WOMAN)) && (_globals[kJulieNameIsKnown] > 0)) + _game._player.walk(Common::Point(53, 128), FACING_EAST); +} + +void Scene112::handleConversation() { + switch (_action._activeAction._verbId) { + case 1: + if (!_game._trigger && (_raoulAction == 2)) + _vm->_gameConv->setInterlocutorTrigger(68); + break; + + case 3: + case 4: + if (_globals[kJulieNameIsKnown] < 2) { + _globals[kJulieNameIsKnown] = 2; + _scene->_hotspots.activate(NOUN_WOMAN, false); + _julieHotspotId = _scene->_dynamicHotspots.add(NOUN_JULIE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(255, 82, 255 + 30, 82 + 44)); + _scene->_dynamicHotspots[_julieHotspotId]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_julieHotspotId, Common::Point(216, 137), FACING_NORTHEAST); + } + break; + + case 5: + _vm->_gameConv->setInterlocutorTrigger(74); + _globals[kJulieNameIsKnown] = 1; + break; + + case 6: + case 7: + case 10: + case 23: + case 27: + _vm->_gameConv->setInterlocutorTrigger(74); + _globals[kJulieNameIsKnown] = 2; + break; + + case 13: + _julieAction = 1; + _raoulAction = 1; + break; + + case 14: + case 15: + case 16: + _julieAction = 0; + _raoulAction = 1; + break; + + default: + break; + } + + switch (_game._trigger) { + case 60: + _julieAction = 0; + _raoulAction = 1; + break; + + case 62: + _julieAction = 2; + if (_raoulAction != 2) + _raoulAction = 0; + break; + + case 68: + _scene->_sequences.addTimer(120, 70); + _vm->_gameConv->hold(); + break; + + case 70: + _game._player.walk(Common::Point(53, 128), FACING_EAST); + _game._player.setWalkTrigger(72); + break; + + case 72: + _vm->_gameConv->release(); + _game._player._visible = false; + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[1], SYNC_PLAYER, 0); + _scene->setAnimFrame(_globals._animationIndexes[1], 1); + _raoulAction = 1; + break; + + case 74: + _raoulAction = 3; + _vm->_gameConv->hold(); + break; + + default: + break; + } + + if ((_action._activeAction._verbId != 0) && (_action._activeAction._verbId != 1) && + (_action._activeAction._verbId != 2) && (_action._activeAction._verbId != 5) && + (_action._activeAction._verbId != 6) && (_action._activeAction._verbId != 7) && + (_action._activeAction._verbId != 10) && (_action._activeAction._verbId != 23) && + (_action._activeAction._verbId != 27)) { + _vm->_gameConv->setInterlocutorTrigger(60); + _vm->_gameConv->setHeroTrigger(62); + } + + if (_action._activeAction._verbId == 18) + _globals[kCanFindBookInLibrary] = true; + + _julieCounter = 0; +} + +void Scene112::handleJulieAnimation() { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _julieFrame) + return; + + _julieFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + int random = -1; + int resetFrame = -1; + + switch (_julieFrame) { + case 1: + case 2: + case 3: + case 22: + case 39: + case 71: + case 107: + switch (_julieAction) { + case 0: + random = _vm->getRandomNumber(4, 6); + ++_julieCounter; + if (_julieCounter > 25) + _julieAction = 2; + break; + + case 1: + random = 3; + break; + + case 2: + random = _vm->getRandomNumber(1, 3); + while (_didOptionFl == random) + random = _vm->getRandomNumber(1, 3); + _didOptionFl = random; + break; + + default: + break; + } + + switch (random) { + case 1: + resetFrame = 22; + break; + + case 2: + resetFrame = 39; + break; + + case 3: + resetFrame = 83; + break; + + case 4: + resetFrame = 0; + break; + + case 5: + resetFrame = 1; + break; + + case 6: + resetFrame = 2; + break; + + default: + break; + } + break; + case 56: + case 77: + case 83: + random = _vm->getRandomNumber(1, 3); + while (_didOptionFl == random) + random = _vm->getRandomNumber(1, 3); + _didOptionFl = random; + + if ((_julieAction == 0) || (_julieAction == 1)) + random = 3; + + switch (random) { + case 1: + resetFrame = 71; + break; + + case 2: + resetFrame = 77; + break; + + case 3: + resetFrame = 56; + break; + + default: + break; + } + + break; + + case 95: + if (_julieAction == 1) + random = 2; + else + random = 1; + + switch (random) { + case 1: + resetFrame = 95; + break; + + case 2: + resetFrame = 107; + break; + + default: + break; + } + break; + + case 130: + resetFrame = 95; + _julieAction = 2; + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame); + _julieFrame = resetFrame; + } +} + +void Scene112::handleRaoulChair() { + if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _raoulFrame) + return; + + _raoulFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame(); + int resetFrame = -1; + int random = -1; + + switch (_raoulFrame) { + case 18: + case 30: + case 41: + case 49: + case 56: + case 65: + switch (_raoulAction) { + case 0: + random = _vm->getRandomNumber(1, 4); + _raoulAction = 1; + break; + + case 2: + random = 6; + break; + + case 3: + random = 5; + _raoulAction = 2; + break; + + default: + random = _vm->getRandomNumber(7, 50); + while (_didOptionFl == random) + random = _vm->getRandomNumber(7, 50); + _didOptionFl = random; + break; + } + + switch (random) { + case 1: + resetFrame = 49; + break; + + case 2: + resetFrame = 41; + break; + + case 3: + resetFrame = 18; + break; + + case 4: + resetFrame = 30; + break; + + case 5: + resetFrame = 65; + break; + + case 6: + resetFrame = 82; + break; + + case 7: + resetFrame = 56; + break; + + default: + resetFrame = 17; + break; + } + break; + + case 61: + if (_raoulAction == 1) + random = 1; + else + random = 2; + + switch (random) { + case 1: + resetFrame = 60; + break; + + case 2: + resetFrame = 61; + break; + + default: + break; + } + break; + + case 82: + _raoulAction = 2; + _game._player._visible = true; + _vm->_gameConv->release(); + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[1]); + break; + + case 83: + if (_raoulAction == 2) + random = 1; + else + random = 2; + + switch (random) { + case 1: + resetFrame = 82; + break; + + case 2: + resetFrame = 0; + break; + + default: + break; + } + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[1], resetFrame); + _raoulFrame = resetFrame; + } +} + +/*------------------------------------------------------------------------*/ + +Scene113::Scene113(MADSEngine *vm) : Scene1xx(vm) { + _standingAndTalking = false; + _dayWantsToTalk = false; + _musicPlaying = false; + _afterKissFl = false; + _anim0ActvFl = false; + _anim1ActvFl = false; + _anim2ActvFl = false; + _anim3ActvFl = false; + _anim4ActvFl = false; + _prevent1 = false; + _prevent2 = false; + _raoulStandingFl = false; + _armsOutFl = false; + + _dayStatus = -1; + _raoulAction = -1; + _christineHotspotId1 = -1; + _christineHotspotId2 = -1; + _raoulCount = -1; + _dayCount = -1; + _standCount = -1; + _julieStatus = -1; + _florentStatus = -1; + _florentFrame = -1; + _florentCount = -1; + _dayFrame = -1; + _lastDayResetFrame = -1; + _raoulFrame = -1; + _julieFrame = -1; + _julieCount = -1; +} + +void Scene113::synchronize(Common::Serializer &s) { + Scene1xx::synchronize(s); + + s.syncAsByte(_standingAndTalking); + s.syncAsByte(_dayWantsToTalk); + s.syncAsByte(_musicPlaying); + s.syncAsByte(_afterKissFl); + s.syncAsByte(_anim0ActvFl); + s.syncAsByte(_anim1ActvFl); + s.syncAsByte(_anim2ActvFl); + s.syncAsByte(_anim3ActvFl); + s.syncAsByte(_anim4ActvFl); + s.syncAsByte(_prevent1); + s.syncAsByte(_prevent2); + s.syncAsByte(_raoulStandingFl); + s.syncAsByte(_armsOutFl); + + s.syncAsSint16LE(_dayStatus); + s.syncAsSint16LE(_raoulAction); + s.syncAsSint16LE(_christineHotspotId1); + s.syncAsSint16LE(_christineHotspotId2); + s.syncAsSint16LE(_raoulCount); + s.syncAsSint16LE(_dayCount); + s.syncAsSint16LE(_standCount); + s.syncAsSint16LE(_julieStatus); + s.syncAsSint16LE(_florentStatus); + s.syncAsSint16LE(_florentFrame); + s.syncAsSint16LE(_florentCount); + s.syncAsSint16LE(_dayFrame); + s.syncAsSint16LE(_lastDayResetFrame); + s.syncAsSint16LE(_raoulFrame); + s.syncAsSint16LE(_julieFrame); + s.syncAsSint16LE(_julieCount); +} + +void Scene113::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + _scene->addActiveVocab(NOUN_CHRISTINE); + _scene->addActiveVocab(NOUN_WOMAN); + _scene->addActiveVocab(NOUN_JULIE); +} + +void Scene113::enter() { + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _standingAndTalking = false; + _dayWantsToTalk = false; + _musicPlaying = false; + _afterKissFl = false; + _anim0ActvFl = false; + _anim1ActvFl = false; + _anim2ActvFl = false; + _anim3ActvFl = false; + _anim4ActvFl = false; + _prevent1 = false; + _prevent2 = false; + _raoulStandingFl = false; + _armsOutFl = false; + } + + _scene->_hotspots.activate(NOUN_SMALL_NOTE, false); + _scene->_hotspots.activate(NOUN_DRESSING_GOWN, false); + _scene->_hotspots.activate(NOUN_CHRISTINE, false); + _scene->_hotspots.activate(NOUN_JULIE, false); + _scene->_hotspots.activate(NOUN_LIGHT_FIXTURE, false); + + if (_globals[kCurrentYear] == 1993) { + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('z', -1)); + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('f', 0)); + + if (_game._objects.isInRoom(OBJ_SMALL_NOTE)) + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 1)); + + if ((_globals[kDoneBrieConv203] == 1) || (_globals[kDoneBrieConv203] == 3)) + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 3)); + } + + if (_globals[kCurrentYear] == 1993) { + _vm->_gameConv->get(4); + if ((_globals[kDoneBrieConv203] == 1) || (_globals[kDoneBrieConv203] == 3)) + _vm->_gameConv->get(6); + } else { + _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*faceral", false); + _globals._spriteIndexes[5] = _scene->_sprites.addSprites("*facecrsd", false); + _vm->_gameConv->get(13); + } + + if (_globals[kCurrentYear] == 1993) { + _scene->drawToBackground(_globals._spriteIndexes[3], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_VASE, false); + _scene->_hotspots.activate(NOUN_FAN, false); + _scene->_hotspots.activateAtPos(NOUN_LIGHT_FIXTURE, true, Common::Point(155, 17)); + } else { + _scene->_hotspots.activateAtPos(NOUN_LIGHT_FIXTURE, true, Common::Point(150, 46)); + _scene->_hotspots.activate(NOUN_NOTICE, false); + } + + if (_scene->_priorSceneId == RETURNING_FROM_LOADING) { + if (_globals[kCurrentYear] == 1881) { + if (_dayStatus <= 3) { + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('r', 1), 1); + _anim1ActvFl = true; + } + + if (_raoulAction == 3) + _scene->setAnimFrame(_globals._animationIndexes[1], 33); + else { + _raoulAction = 1; + _game._player._visible = false; + _scene->setAnimFrame(_globals._animationIndexes[1], 8); + } + + if (_musicPlaying) { + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 2), 0); + _anim0ActvFl = true; + _christineHotspotId1 = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots[_christineHotspotId1]._articleNumber = PREP_ON; + _scene->setDynamicAnim(_christineHotspotId1, _globals._animationIndexes[0], 13); + _scene->setDynamicAnim(_christineHotspotId1, _globals._animationIndexes[0], 14); + _scene->setDynamicAnim(_christineHotspotId1, _globals._animationIndexes[0], 16); + _scene->setAnimFrame(_globals._animationIndexes[0], 212); + _game._player._visible = true; + _anim1ActvFl = false; + } else { + switch (_dayStatus) { + case 0: + case 1: + case 2: + case 3: + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 0); + _anim0ActvFl = true; + _dayStatus = 2; + _scene->setAnimFrame(_globals._animationIndexes[0], 208); + _scene->_hotspots.activate(NOUN_CHRISTINE, true); + _scene->_hotspots.activateAtPos(NOUN_CHRISTINE, false, Common::Point(220, 130)); + break; + + default: + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 2), 0); + _anim0ActvFl = true; + _dayStatus = 7; + _game._player._visible = false; + _scene->setAnimFrame(_globals._animationIndexes[0], 165); + break; + } + _christineHotspotId1 = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots[_christineHotspotId1]._articleNumber = PREP_ON; + _scene->setDynamicAnim(_christineHotspotId1, _globals._animationIndexes[0], 13); + _scene->setDynamicAnim(_christineHotspotId1, _globals._animationIndexes[0], 14); + _scene->setDynamicAnim(_christineHotspotId1, _globals._animationIndexes[0], 16); + } + + if (_dayStatus == 2) { + _scene->_hotspots.activate(NOUN_CHRISTINE, true); + _scene->_hotspots.activateAtPos(NOUN_CHRISTINE, false, Common::Point(220, 130)); + } else { + _game._player._playerPos = Common::Point(175, 148); + _game._player._facing = FACING_NORTHEAST; + } + + } else if ((_globals[kDoneBrieConv203] == 1) || (_globals[kDoneBrieConv203] == 3)) { + _globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('x', 1), 1); + _julieStatus = 0; + _anim4ActvFl = true; + _globals[kMakeBrieLeave203] = true; + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1); + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + _scene->_hotspots.activate(NOUN_DRESSING_GOWN, true); + _scene->_hotspots.activate(NOUN_JULIE, true); + _scene->_hotspots.activateAtPos(NOUN_CHRISTINE, true, Common::Point(220, 130)); + } else if (_globals[kCurrentYear] == 1993) { + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('f', 1), 1); + _anim2ActvFl = true; + + if (_florentStatus != 3) + _florentStatus = 1; + + _globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('r', 1), 1); + _anim3ActvFl = true; + + if (_raoulAction == 3) + _scene->setAnimFrame(_globals._animationIndexes[3], 33); + else { + _scene->setAnimFrame(_globals._animationIndexes[3], 8); + _raoulAction = 1; + _game._player._playerPos = Common::Point(201, 120); + _game._player._facing = FACING_SOUTH; + _game._player._visible = false; + } + + if (_florentStatus == 3) + _scene->setAnimFrame(_globals._animationIndexes[2], 41); + + if (_globals[kFlorentNameIsKnown] >= 1) { + _christineHotspotId2 = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(43, 118, 43 + 15, 118 + 29)); + _scene->_dynamicHotspots[_christineHotspotId2]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_christineHotspotId2, Common::Point(106, 127), FACING_SOUTHWEST); + } else { + _christineHotspotId2 = _scene->_dynamicHotspots.add(NOUN_WOMAN, VERB_WALK_TO, SYNTAX_FEM_NOT_PROPER, EXT_NONE, Common::Rect(43, 118, 43 + 15, 118 + 29)); + _scene->_dynamicHotspots[_christineHotspotId2]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_christineHotspotId2, Common::Point(106, 127), FACING_SOUTHWEST); + } + + _scene->_hotspots.activate(NOUN_DRESSING_GOWN, true); + + if (_game._objects.isInRoom(OBJ_SMALL_NOTE)) { + _scene->_hotspots.activate(NOUN_SMALL_NOTE, true); + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 13); + } + } + } else if (_globals[kCurrentYear] == 1993) { + if ((_globals[kDoneBrieConv203] == 1) || (_globals[kDoneBrieConv203] == 3)) { + if (!(_globals[kPlayerScoreFlags] & 4)) { + _globals[kPlayerScoreFlags] = _globals[kPlayerScoreFlags] | 4; + _globals[kPlayerScore] += 5; + } + + _globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('x', 1), 1); + _julieStatus = 0; + _anim4ActvFl = true; + _globals[kMakeBrieLeave203] = true; + _game._player._playerPos = Common::Point(190, 148); + _game._player._facing = FACING_NORTH; + _game._player._stepEnabled = false; + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1); + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + _scene->_hotspots.activate(NOUN_DRESSING_GOWN, true); + _scene->_hotspots.activate(NOUN_JULIE, true); + _scene->_hotspots.activateAtPos(NOUN_CHRISTINE, true, Common::Point(220, 130)); + _game._player.walk(Common::Point(175, 128), FACING_NORTHEAST); + _game._player.setWalkTrigger(102); + } else { + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + + _globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('f', 1), 1); + _florentStatus = 1; + _anim2ActvFl = true; + + _globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('r', 1), 1); + _raoulAction = 3; + _anim3ActvFl = true; + _scene->setAnimFrame(_globals._animationIndexes[3], 33); + + if (_globals[kFlorentNameIsKnown] >= 1) { + _christineHotspotId2 = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(43, 118, 43 + 15, 118 + 29)); + _scene->_dynamicHotspots[_christineHotspotId2]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_christineHotspotId2, Common::Point(106, 127), FACING_SOUTHWEST); + } else { + _christineHotspotId2 = _scene->_dynamicHotspots.add(NOUN_WOMAN, VERB_WALK_TO, SYNTAX_FEM_NOT_PROPER, EXT_NONE, Common::Rect(43, 118, 43 + 15, 118 + 29)); + _scene->_dynamicHotspots[_christineHotspotId2]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_christineHotspotId2, Common::Point(106, 127), FACING_SOUTHWEST); + } + + _game._player._playerPos = Common::Point(190, 148); + _game._player._facing = FACING_NORTH; + + _scene->_hotspots.activate(NOUN_DRESSING_GOWN, true); + if (_game._objects.isInRoom(OBJ_SMALL_NOTE)) { + _scene->_hotspots.activate(NOUN_SMALL_NOTE, true); + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 13); + } + } + } else if ((_globals[kCurrentYear] == 1881) && (! _globals[kChrisKickedRaoulOut])) { + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('r', 1), 1); + _raoulAction = 3; + _anim1ActvFl = true; + _scene->setAnimFrame(_globals._animationIndexes[1], 33); + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 1); + _dayStatus = 2; + _anim0ActvFl = true; + + _scene->_hotspots.activate(NOUN_CHRISTINE, true); + _scene->_hotspots.activateAtPos(NOUN_CHRISTINE, false, Common::Point(220, 130)); + _scene->_sequences.addTimer(60, 60); + _game._player._playerPos = Common::Point(190, 148); + _game._player._facing = FACING_NORTH; + } else if ((_globals[kCurrentYear] == 1881) && _globals[kChrisKickedRaoulOut]) { + _globals[kChrisKickedRaoulOut] = 2; + _game._player._playerPos = Common::Point(190, 148); + _game._player._facing = FACING_NORTH; + _globals[kCameFromFade] = true; + _game._player._stepEnabled = false; + _globals[kPlayerScore] += 8; + _scene->_sequences.addTimer(60, 110); + } else if (_scene->_priorSceneId == 111) { + _game._player._playerPos = Common::Point(190, 148); + _game._player._facing = FACING_NORTH; + } + + switch (_vm->_gameConv->_restoreRunning) { + case 4: + _vm->_gameConv->run(4); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + break; + + case 6: + _vm->_gameConv->run(6); + break; + + case 13: + _vm->_gameConv->run(13); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + break; + + default: + break; + } + + sceneEntrySound(); +} + +void Scene113::step() { + if (_anim1ActvFl) + handleRaoulAnimation2(); + + if (_anim4ActvFl) + handleJulieAnimation(); + + if (_anim2ActvFl) + handleFlorentAnimation(); + + if (_anim3ActvFl) { + handleRaoulAnimation(); + + if ((!_game._objects.isInInventory(OBJ_SMALL_NOTE)) && (_scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame() == 26)) { + _scene->_hotspots.activate(NOUN_SMALL_NOTE, false); + _game._objects.addToInventory(OBJ_SMALL_NOTE); + _scene->deleteSequence(_globals._sequenceIndexes[1]); + _vm->_sound->command(26); + _vm->_dialogs->showItem(OBJ_SMALL_NOTE, 806, 2); + } + } + + if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 86) && (!_prevent2)) { + _scene->freeAnimation(_globals._animationIndexes[0]); + _prevent2 = true; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 2), 0); + _scene->setAnimFrame (_globals._animationIndexes[0], 86); + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_CLOCK, 0); + _scene->animations_tick(); + } + + if (_anim0ActvFl) { + handleDayAnimation(); + + if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 95) && (!_armsOutFl)) { + _standingAndTalking = true; + _dayStatus = 7; + _raoulAction = 3; + _armsOutFl = true; + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_ANIM, _globals._animationIndexes[1]); + } + + if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 165) && !_afterKissFl) + _afterKissFl = true; + } + + switch (_game._trigger) { + case 60: + if (!_game._visitedScenes._sceneRevisited) + _vm->_dialogs->show(11342); + break; + + case 102: + _game._player._stepEnabled = true; + _vm->_gameConv->run(6); + break; + + case 108: + _vm->_dialogs->show(11332); + _vm->_dialogs->show(11333); + _scene->_nextSceneId = 150; + _globals[kLeaveAngelMusicOn] = false; + break; + + case 110: + _vm->_dialogs->show(11331); + _game._player.walk(Common::Point(272, 138), FACING_EAST); + _game._player.setWalkTrigger(108); + break; + + default: + break; + } +} + +void Scene113::actions() { + if (_vm->_gameConv->_running == 13) { + handleLoveConversation(); + _action._inProgress = false; + return; + } + + if (_vm->_gameConv->_running == 4) { + handleFlorentConversation(); + _action._inProgress = false; + return; + } + + if (_vm->_gameConv->_running == 6) { + handleDeadConversation(); + _action._inProgress = false; + return; + } + + if ((_action.isAction(VERB_TALK_TO, NOUN_WOMAN)) || (_action.isAction(VERB_TALK_TO, NOUN_CHRISTINE))) { + if (_globals[kCurrentYear] == 1881) { + _game._player._stepEnabled = true; + _vm->_gameConv->run(13); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + } else if (_globals[kDoneBrieConv203]) { + _vm->_dialogs->show(11348); + } else { + _game._player._stepEnabled = true; + _vm->_gameConv->run(4); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_EXIT_TO, NOUN_CORRIDOR)) { + if (_globals[kDoneBrieConv203] == 1) + _globals[kDoneBrieConv203] = 3; + + _scene->_nextSceneId = 111; + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + if (_globals[kCurrentYear] == 1993) { + if (_globals[kDoneBrieConv203]) + _vm->_dialogs->show(11340); + else + _vm->_dialogs->show(11310); + } else { + _vm->_dialogs->show(11311); + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(11312); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RUG)) { + _vm->_dialogs->show(11313); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(11314); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_COUCH)) { + _vm->_dialogs->show(11315); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MURAL)) { + _vm->_dialogs->show(11316); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PAINTING)) { + if (_globals[kCurrentYear] == 1881) + _vm->_dialogs->show(11317); + else + _vm->_dialogs->show(11343); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PAINTING)) { + _vm->_dialogs->show(11317); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DRESSING_TABLE)) { + _vm->_dialogs->show(11318); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CHAIR)) { + _vm->_dialogs->show(11319); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MIRROR)) { + if (_globals[kCurrentYear] == 1993) { + _vm->_dialogs->show(11344); + } else { + _vm->_dialogs->show(11320); + } + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FAN)) { + _vm->_dialogs->show(11321); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_VASE)) { + _vm->_dialogs->show(11322); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_HAT_RACK)) { + _vm->_dialogs->show(11323); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LIGHT_FIXTURE)) { + _vm->_dialogs->show(11324); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CEILING)) { + _vm->_dialogs->show(11325); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WARDROBE)) { + _vm->_dialogs->show(11326); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DRESSING_SCREEN)) { + _vm->_dialogs->show(11327); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CORRIDOR)) { + _vm->_dialogs->show(11328); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DRESSING_GOWN)) { + _vm->_dialogs->show(11330); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SMALL_NOTE) && _game._objects.isInRoom(OBJ_SMALL_NOTE)) { + _vm->_dialogs->show(11349); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CHRISTINE) && _globals[kDoneBrieConv203]) { + _vm->_dialogs->show(11338); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_JULIE)) { + _vm->_dialogs->show(11339); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_NOTICE)) { + _vm->_dialogs->show(11347); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CLOTHES_DUMMY)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(11345); + else + _vm->_dialogs->show(11346); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WOMAN) || _action.isObject(NOUN_CHRISTINE)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(11341); + else { + if (_musicPlaying) + _vm->_dialogs->show(11336); + else + _vm->_dialogs->show(11342); + } + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_OPEN, NOUN_WARDROBE)) { + _vm->_dialogs->show(11329); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_SMALL_NOTE) && _game._objects.isInRoom(OBJ_SMALL_NOTE)) { + _vm->_dialogs->show(11334); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_DRESSING_GOWN)) { + _vm->_dialogs->show(11335); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_CHRISTINE) || _action.isAction(VERB_TAKE, NOUN_WOMAN)) { + _vm->_dialogs->show(11337); + _action._inProgress = false; + return; + } +} + +void Scene113::preActions() { + if (_action.isAction(VERB_WALK_UP, NOUN_AISLE)) + _game._player._walkOffScreenSceneId = 101; + + if (_action.isAction(VERB_LOOK, NOUN_MIRROR)) + _game._player.walk(Common::Point(272, 138), FACING_EAST); + + if (! _action.isAction(VERB_EXIT_TO, NOUN_CORRIDOR) && !_globals[kChrisKickedRaoulOut] + && !_action.isAction(VERB_LOOK, NOUN_CHRISTINE) && !_action.isAction(VERB_TAKE, NOUN_CHRISTINE) && _musicPlaying) { + _vm->_gameConv->run(13); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + _game._player.cancelCommand(); + } else if (_action.isAction(VERB_TALK_TO, NOUN_WOMAN) || _action.isAction(VERB_TALK_TO, NOUN_CHRISTINE)) { + _game._player.walk(Common::Point(106, 127), FACING_SOUTHWEST); + } + + if (!_action.isAction(VERB_EXIT_TO, NOUN_CORRIDOR) && !_action.isAction(VERB_LOOK, NOUN_JULIE) + && !_action.isAction(VERB_LOOK, NOUN_CHRISTINE) && !_action._lookFlag && (_globals[kDoneBrieConv203] != 0) + && (_globals[kCurrentYear] == 1993)) { + if (_action.isAction(VERB_TALK_TO, NOUN_CHRISTINE)) { + _game._player._needToWalk = false; + + } else if (_action.isAction(VERB_LOOK)) { + _game._player._needToWalk = false; + + } else if (_action.isAction(VERB_TALK_TO, NOUN_JULIE)) { + _game._player._needToWalk = false; + _vm->_gameConv->run(6); + _game._player.cancelCommand(); + + } else { + _vm->_dialogs->show(11350); + _game._player._needToWalk = false; + _game._player.cancelCommand(); + } + } +} + +void Scene113::handleFlorentAnimation() { + if (_scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame() == _florentFrame) + return; + + int random; + _florentFrame = _scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame(); + int resetFrame = -1; + + switch (_florentFrame) { + case 1: + case 11: + case 23: + case 38: + case 45: + random = _vm->getRandomNumber(4, 30); + + if (_florentStatus == 2) { + random = 1; + } + + if (_florentStatus == 0) { + random = 2; + } + + if (_florentStatus == 3) { + random = 3; + } + + switch (random) { + case 1: + resetFrame = 2; + _florentStatus = 1; + break; + + case 2: + resetFrame = 28; + break; + + case 3: + resetFrame = 39; + break; + + case 4: + resetFrame = 12; + break; + + default: + resetFrame = 0; + break; + } + break; + + case 24: + case 25: + case 26: + case 27: + case 33: + random = _vm->getRandomNumber(5, 20); + + if (_florentStatus == 0) { + random = _vm->getRandomNumber(1, 4); + ++_florentCount; + if (_florentCount > 5) { + _florentStatus = 1; + random = 5; + } + } + + if ((_florentStatus == 2) || + (_florentStatus == 3)) { + random = 5; + } + + switch (random) { + case 1: + resetFrame = 23; + break; + + case 2: + resetFrame = 24; + break; + + case 3: + resetFrame = 25; + break; + + case 4: + resetFrame = 26; + break; + + case 5: + resetFrame = 34; + break; + + default: + resetFrame = 32; + break; + } + break; + + case 42: + if (_florentStatus == 3) + resetFrame = 41; + + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[2], resetFrame); + _florentFrame = resetFrame; + } +} + +void Scene113::handleDayAnimation() { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _dayFrame) + return; + + _dayFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + int random; + int resetFrame = -1; + switch (_dayFrame) { + case 1: + case 4: + case 14: + case 17: + case 20: + case 26: + case 166: + case 206: + case 207: + case 208: + case 209: + case 210: + case 211: + case 219: + case 231: + case 253: + switch (_dayStatus) { + case 0: + random = _vm->getRandomNumber(1, 3); + ++_dayCount; + if (_dayCount < 6) { + if (random == 1) { + resetFrame = 1; + } else if (random == 2) { + resetFrame = 15; + } else { + resetFrame = 18; + } + } else { + _dayStatus = 1; + resetFrame = 25; + _dayWantsToTalk = false; + } + break; + + case 1: + if (_dayWantsToTalk) { + _dayStatus = 0; + _dayWantsToTalk = false; + resetFrame = 1; + } else { + resetFrame = 25; + } + break; + + case 2: + random = _vm->getRandomNumber(1, 50); + switch (random) { + case 1: + resetFrame = 212; + break; + + case 2: + resetFrame = 219; + break; + + case 3: + resetFrame = 231; + break; + + default: + resetFrame = 0; + break; + } + break; + + case 3: + resetFrame = 5; + _dayStatus = 0; + break; + + case 4: + resetFrame = 31; + break; + + case 5: + resetFrame = _vm->getRandomNumber(205, 207); + ++_standCount; + if (_standCount > 18) { + _dayStatus = 7; + resetFrame = 165; + } + if (_musicPlaying) + resetFrame = 167; + break; + + case 6: + resetFrame = _vm->getRandomNumber(208, 210); + while (_lastDayResetFrame == resetFrame) + resetFrame = _vm->getRandomNumber(208, 210); + + _lastDayResetFrame = resetFrame; + + ++_standCount; + if (_standCount > 18) { + _dayStatus = 7; + resetFrame = 165; + } + + if (_musicPlaying) + resetFrame = 167; + break; + + case 7: + resetFrame = 165; + if (_musicPlaying) + resetFrame = 167; + break; + + default: + break; + } + break; + + case 182: + _game._player._visible = true; + _vm->_gameConv->release(); + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[1]); + _game._player._playerPos = Common::Point(175, 148); + _game._player._turnToFacing = FACING_NORTHEAST; + _game._player.resetFacing(FACING_SOUTHEAST); + _game._player._turnToFacing = FACING_NORTHEAST; + break; + + case 205: + case 212: + resetFrame = 211; + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame); + _dayFrame = resetFrame; + } +} + +void Scene113::handleRaoulAnimation() { + if (_globals[kFlorentNameIsKnown] == 2) + _raoulAction = 3; + + if (_scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame() == _raoulFrame) + return; + + _raoulFrame = _scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame(); + int resetFrame = -1; + + switch (_raoulFrame) { + case 9: + case 10: + case 11: + case 34: + case 33: + if (_raoulFrame == 33) + _vm->_gameConv->release(); + + switch (_raoulAction) { + case 0: + resetFrame = _vm->getRandomNumber(7, 9); + ++_raoulCount; + + if (_raoulCount > 17) { + _raoulAction = 1; + resetFrame = 8; + } + break; + + case 1: + resetFrame = 8; + break; + + case 2: + resetFrame = 11; + break; + + case 3: + resetFrame = 33; + break; + + case 4: + resetFrame = 38; + _raoulStandingFl = true; + _vm->_gameConv->hold(); + break; + + case 5: + resetFrame = 20; + _raoulAction = 1; + break; + + default: + break; + } + break; + + case 19: + if ((_raoulAction == 5) && (!_game._objects.isInInventory(OBJ_SMALL_NOTE))) { + resetFrame = 20; + _raoulAction = 1; + } else if (_raoulAction == 4) { + resetFrame = 38; + _raoulStandingFl = true; + } else if (_raoulAction == 0) { + resetFrame = 9; + } else { + resetFrame = 8; + _raoulAction = 1; + } + break; + + case 42: + if (_raoulAction == 4) { + if (!_prevent2) { + _vm->_gameConv->release(); + } + resetFrame = 33; + _raoulAction = 3; + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[3]); + } + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[3], resetFrame); + _raoulFrame = resetFrame; + } +} + +void Scene113::handleRaoulAnimation2() { + if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _raoulFrame) + return; + + _raoulFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame(); + int resetFrame = -1; + switch (_raoulFrame) { + case 9: + case 10: + case 11: + case 34: + switch (_raoulAction) { + case 0: + resetFrame = _vm->getRandomNumber(7, 9); + ++_raoulCount; + + if (_raoulCount > 17) { + _raoulAction = 1; + resetFrame = 8; + } + break; + + case 1: + resetFrame = 8; + break; + + case 2: + resetFrame = 11; + break; + + case 3: + resetFrame = 33; + break; + + default: + break; + } + break; + + case 19: + if (_raoulAction == 0) + resetFrame = 9; + else { + resetFrame = 8; + _raoulAction = 1; + } + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[1], resetFrame); + _raoulFrame = resetFrame; + } +} + +void Scene113::handleJulieAnimation() { + if (_scene->_animation[_globals._animationIndexes[4]]->getCurrentFrame() == _julieFrame) + return; + + _julieFrame = _scene->_animation[_globals._animationIndexes[4]]->getCurrentFrame(); + int resetFrame = -1; + int random; + + switch (_julieFrame) { + case 1: + case 2: + case 3: + case 11: + case 16: + case 17: + switch (_julieStatus) { + case 0: + random = _vm->getRandomNumber(4, 20); + break; + + case 1: + random = _vm->getRandomNumber(1, 3); + ++_julieCount; + if (_julieCount > 20) { + _julieStatus = 0; + random = 6; + } + break; + + default: + random = -1; + break; + } + + switch (random) { + case 1: + resetFrame = 0; + break; + + case 2: + resetFrame = 1; + break; + + case 3: + resetFrame = 2; + break; + + case 4: + resetFrame = 12; + break; + + case 5: + resetFrame = 4; + break; + + default: + resetFrame = 16; + break; + } + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[4], resetFrame); + _julieFrame = resetFrame; + } +} + +void Scene113::handleDeadConversation() { + switch (_game._trigger) { + case 106: + _julieStatus = 1; + break; + + case 104: + _julieStatus = 0; + break; + + default: + break; + } + + _vm->_gameConv->setInterlocutorTrigger(106); + _vm->_gameConv->setHeroTrigger(104); + + _julieCount = 0; +} + +void Scene113::handleFlorentConversation() { + switch (_action._activeAction._verbId) { + case 3: + case 4: + if (!_prevent1) { + _globals[kFlorentNameIsKnown] = 1; + _vm->_gameConv->setInterlocutorTrigger(82); + _scene->_dynamicHotspots.remove(_christineHotspotId2); + _christineHotspotId2 = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(43, 118, 43 + 15, 118 + 29)); + _scene->_dynamicHotspots[_christineHotspotId2]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(_christineHotspotId2, Common::Point(106, 127), FACING_SOUTHWEST); + _prevent1 = true; + } + break; + + case 19: + _florentStatus = 2; + _vm->_gameConv->setInterlocutorTrigger(86); + break; + + case 25: + if (_raoulAction != 3) + _raoulAction = 4; + break; + + case 26: + if (!_prevent2) { + _scene->_sequences.addTimer(120, 92); + _vm->_gameConv->setInterlocutorTrigger(96); + _florentStatus = 0; + _prevent2 = true; + } + break; + + case 27: + case 30: + _vm->_gameConv->setInterlocutorTrigger(98); + break; + + case 28: + case 29: + _vm->_gameConv->setInterlocutorTrigger(100); + break; + + default: + break; + } + + switch (_game._trigger) { + case 62: + if ((_action._activeAction._verbId != 3) && (_action._activeAction._verbId != 4) && (_action._activeAction._verbId != 19) && + (_action._activeAction._verbId != 27) && (_action._activeAction._verbId != 28) && (_action._activeAction._verbId != 29)) { + if ((_raoulAction != 5) && (_raoulAction != 4) && !_raoulStandingFl) + _raoulAction = 0; + + if ((_florentStatus != 3) && (_florentStatus != 2)) + _florentStatus = 1; + } + break; + + case 66: + if ((_florentStatus != 3) && + (_florentStatus != 2)) { + if (_vm->getRandomNumber(1, 5) == 1) + _florentStatus = 0; + } + + if ((_raoulAction != 3) && (_raoulAction != 5) && (_raoulAction != 4) && (!_raoulStandingFl)) { + _raoulAction = 1; + if (_vm->getRandomNumber(1, 2) == 1) + _raoulAction = 2; + } + break; + + case 80: + _vm->_gameConv->release(); + _game._player._visible = false; + _raoulAction = 1; + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[3], SYNC_PLAYER, 0); + _scene->setAnimFrame(_globals._animationIndexes[3], 1); + break; + + case 82: + _florentStatus = 0; + _scene->_sequences.addTimer(120, 84); + _vm->_gameConv->hold(); + break; + + case 84: + _game._player.walk(Common::Point(201, 120), FACING_SOUTH); + _game._player.setWalkTrigger(80); + break; + + case 86: + _raoulAction = 5; + _vm->_gameConv->hold(); + break; + + case 92: + _game._player.walk(Common::Point(68, 142), FACING_SOUTHWEST); + _game._player.setWalkTrigger(94); + break; + + case 94: + _globals[kStopWalkerDisabled] = true; + _globals[kFlorentNameIsKnown] = 2; + _vm->_gameConv->release(); + break; + + case 96: + _vm->_gameConv->hold(); + break; + + case 98: + _florentStatus = 3; + break; + + case 100: + _florentStatus = 1; + _globals[kStopWalkerDisabled] = false; + break; + + default: + break; + } + + if ((_action._activeAction._verbId != 3) && (_action._activeAction._verbId != 4) && (_action._activeAction._verbId != 19) && + (_action._activeAction._verbId != 28) && (_action._activeAction._verbId != 29) && (_action._activeAction._verbId != 27) && + (_action._activeAction._verbId != 30) && (_action._activeAction._verbId != 26)) + _vm->_gameConv->setInterlocutorTrigger(66); + + _vm->_gameConv->setHeroTrigger(62); + _raoulCount = 0; + _florentCount = 0; +} + +void Scene113::handleLoveConversation() { + switch (_action._activeAction._verbId) { + case 1: + case 2: + if (!_prevent1) { + _vm->_gameConv->setInterlocutorTrigger(82); + _prevent1 = true; + } + break; + + case 21: + if (!_armsOutFl) { + _dayStatus = 4; + _scene->_sequences.addTimer(1, 70); + _scene->_userInterface.emptyConversationList(); + _scene->_userInterface.setup(kInputConversation); + _scene->_hotspots.activate(NOUN_CHRISTINE, false); + _vm->_gameConv->hold(); + } + break; + + case 27: + _vm->_sound->command(34); + _globals[kLeaveAngelMusicOn] = true; + break; + + case 31: + if (!_musicPlaying) { + _vm->_gameConv->hold(); + _dayStatus = 7; + _musicPlaying = true; + _christineHotspotId1 = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots[_christineHotspotId1]._articleNumber = PREP_ON; + _scene->setDynamicAnim(_christineHotspotId1, _globals._animationIndexes[0], 14); + _scene->setDynamicAnim(_christineHotspotId1, _globals._animationIndexes[0], 16); + } + break; + } + + switch (_game._trigger) { + case 62: + if (_action._activeAction._verbId != 0) { + if (_standingAndTalking) { + _dayStatus = 6; + } else if (_dayStatus != 4) { + _dayStatus = 1; + _raoulAction = 0; + _dayWantsToTalk = false; + } + } + break; + + case 66: + if (_standingAndTalking) { + _dayStatus = 5; + + } else { + if (_action._activeAction._verbId == 19) { + _dayStatus = 3; + } else { + _dayStatus = 1; + _dayWantsToTalk = true; + } + + if (_raoulAction != 3) { + _raoulAction = 1; + if (_vm->getRandomNumber(1, 2) == 1) + _raoulAction = 2; + } + } + break; + + case 70: + if (_armsOutFl) { + _vm->_gameConv->release(); + _vm->_gameConv->setInterlocutorTrigger(76); + } + break; + + case 72: + if (_afterKissFl) + _vm->_gameConv->release(); + else + _scene->_sequences.addTimer(1, 72); + break; + + case 76: + _vm->_gameConv->hold(); + _scene->_sequences.addTimer(1, 72); + break; + + case 78: + if (_armsOutFl) { + _vm->_gameConv->release(); + _vm->_gameConv->setInterlocutorTrigger(76); + } + break; + + case 80: + _vm->_gameConv->release(); + _game._player._visible = false; + _raoulAction = 1; + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[1], SYNC_PLAYER, 0); + _scene->setAnimFrame(_globals._animationIndexes[1], 1); + break; + + case 82: + _scene->_sequences.addTimer(120, 84); + _vm->_gameConv->hold(); + _dayStatus = 1; + _dayWantsToTalk = true; + break; + + case 84: + _game._player.walk(Common::Point(201, 120), FACING_SOUTH); + _game._player.setWalkTrigger(80); + break; + + default: + break; + } + + if ((_action._activeAction._verbId != 21) && (_action._activeAction._verbId != 1) && (_action._activeAction._verbId != 2)) + _vm->_gameConv->setInterlocutorTrigger(66); + + _vm->_gameConv->setHeroTrigger(62); + + _raoulCount = 0; + _dayCount = 0; + _standCount = 0; +} + +/*------------------------------------------------------------------------*/ + +Scene114::Scene114(MADSEngine *vm) : Scene1xx(vm) { +} + +void Scene114::synchronize(Common::Serializer &s) { + Scene1xx::synchronize(s); +} + +void Scene114::setup() { + if (_globals[kCurrentYear] == 1993) + _scene->_variant = 1; + + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene114::enter() { + if (_globals[kCurrentYear] == 1993) { + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1)); + } else if (_game._objects.isInRoom(OBJ_ROPE) && !_game._objects.isInInventory(OBJ_ROPE_WITH_HOOK)) { + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 0)); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RDR_9"); + } + + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 0)); + + if ((_game._objects.isInRoom(OBJ_ROPE)) && (_globals[kCurrentYear] == 1881) && !_game._objects.isInInventory(OBJ_ROPE_WITH_HOOK)) { + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 2); + } else + _scene->_hotspots.activate(NOUN_ROPE, false); + + if (_globals[kCurrentYear] == 1993) { + _scene->_hotspots.activate(NOUN_CYLINDER, false); + _scene->_hotspots.activate(NOUN_MANNEQUINS, false); + _scene->_hotspots.activate(NOUN_PROP, false); + _scene->_hotspots.activate(NOUN_BUST, false); + _scene->_hotspots.activate(NOUN_SCAFFOLDING, false); + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + } else { + _scene->_hotspots.activate(NOUN_BOXES, false); + _scene->_hotspots.activate(NOUN_DINETTE_SET, false); + _scene->_hotspots.activate(NOUN_CRATE, false); + _scene->_hotspots.activate(NOUN_CASES, false); + } + + if ((_scene->_priorSceneId == 105) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + _game._player._playerPos = Common::Point(218, 123); + _game._player._facing = FACING_WEST; + } + + sceneEntrySound(); +} + +void Scene114::step() { +} + +void Scene114::actions() { + if (_action.isAction(VERB_CLIMB_UP, NOUN_CIRCULAR_STAIRCASE)) { + switch (_game._trigger) { + case 0: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 1), 1); + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0); + break; + + case 1: + _scene->_nextSceneId = 105; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLIMB_UP, NOUN_CIRCULAR_STAIRCASE)) { + _scene->_nextSceneId = 105; + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_ROPE) && (_game._objects.isInRoom(OBJ_ROPE) || _game._trigger)) { + switch (_game._trigger) { + case (0): + _globals[kPlayerScore] += 5; + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 6, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 3); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 3, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _scene->_hotspots.activate(NOUN_ROPE, false); + _game._objects.addToInventory(OBJ_ROPE); + _vm->_sound->command(26); + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[1]); + _game._player._visible = true; + _scene->_sequences.addTimer(20, 3); + break; + + case 3: + _vm->_dialogs->showItem(OBJ_ROPE, 807, 0); + _game._player._stepEnabled = true; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(11410); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(11411); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CIRCULAR_STAIRCASE)) { + _vm->_dialogs->show(11412); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ROPE) && _game._objects.isInRoom(OBJ_ROPE)) { + _vm->_dialogs->show(11413); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(11414); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MANNEQUINS)) { + _vm->_dialogs->show(11415); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FLAT)) { + _vm->_dialogs->show(11416); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SCAFFOLDING)) { + _vm->_dialogs->show(11417); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MUMMY_PROP)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(11418); + else + _vm->_dialogs->show(11433); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CRATES)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(11419); + else + _vm->_dialogs->show(11434); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CRATE)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(11420); + else + _vm->_dialogs->show(11435); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CARTONS)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(11421); + else + _vm->_dialogs->show(11436); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CARTON)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(11422); + else + _vm->_dialogs->show(11437); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PROP)) { + _vm->_dialogs->show(11423); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BUST)) { + _vm->_dialogs->show(11424); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MUG)) { + _vm->_dialogs->show(11425); + _action._inProgress = false; + return; + } + + if ((_action.isObject(NOUN_CASES)) || (_action.isObject(NOUN_CASE))) { + _vm->_dialogs->show(11426); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BOXES) || _action.isObject(NOUN_BOX)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(11427); + else + _vm->_dialogs->show(11439); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BOX)) { + if (_globals[kCurrentYear] == 1881) { + _vm->_dialogs->show(11439); + _action._inProgress = false; + return; + } + } + + if (_action.isObject(NOUN_DINETTE_SET)) { + _vm->_dialogs->show(11428); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CYLINDER)) { + _vm->_dialogs->show(11429); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_OPEN, NOUN_CARTONS)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(11421); + else + _vm->_dialogs->show(11436); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_OPEN, NOUN_CARTON)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(11422); + else + _vm->_dialogs->show(11437); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_OPEN, NOUN_CRATES)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(11419); + else + _vm->_dialogs->show(11434); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_OPEN, NOUN_CRATE)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(11419); + else + _vm->_dialogs->show(11435); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_OPEN, NOUN_CASES)) { + _vm->_dialogs->show(11426); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_OPEN, NOUN_BOXES) || _action.isAction(VERB_OPEN, NOUN_BOX)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(11427); + else + _vm->_dialogs->show(11439); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_MUG)) { + _vm->_dialogs->show(11430); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_OPEN, NOUN_MUMMY_PROP)) { + _vm->_dialogs->show(11431); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TALK_TO, NOUN_MUMMY_PROP)) { + _vm->_dialogs->show(11432); + _action._inProgress = false; + return; + } +} + +void Scene114::preActions() { +} + +/*------------------------------------------------------------------------*/ + +Scene150::Scene150(MADSEngine *vm) : Scene1xx(vm) { +} + +void Scene150::synchronize(Common::Serializer &s) { + Scene1xx::synchronize(s); +} + +void Scene150::setup() { + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene150::enter() { + warning("TODO: Switch to letter box view. See definition of MADS_MENU_Y"); + + _game._player._stepEnabled = false; + _game._player._visible = false; + + if (_scene->_priorSceneId == 113) + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('l', 1), 1); + else if (_scene->_priorSceneId == 203) { + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('f', 1), 2); + sceneEntrySound(); + } else if (_scene->_priorSceneId == 306) + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('e', 1), 4); + else if (_scene->_priorSceneId == 208) + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('h', 1), 3); + else + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('q', 1), 5); +} + +void Scene150::step() { + if (_game._trigger == 1) + _scene->_nextSceneId = 203; + + if (_game._trigger == 2) + _scene->_nextSceneId = 111; + + if (_game._trigger == 4) + _scene->_nextSceneId = 204; + + if (_game._trigger == 3) { + _globals[kJacquesStatus] = 1; + _scene->_nextSceneId = 205; + } + + if (_game._trigger == 5) + _game._winStatus = 1; + + if (_scene->_nextSceneId != _scene->_currentSceneId) { + byte pal[768]; + _vm->_palette->getFullPalette(pal); + Common::fill(&pal[12], &pal[756], 0); + _vm->_palette->setFullPalette(pal); + } +} + +void Scene150::actions() { +} + +void Scene150::preActions() { +} /*------------------------------------------------------------------------*/ diff --git a/engines/mads/phantom/phantom_scenes1.h b/engines/mads/phantom/phantom_scenes1.h index 0f5f56a4cf..cadfcefbef 100644 --- a/engines/mads/phantom/phantom_scenes1.h +++ b/engines/mads/phantom/phantom_scenes1.h @@ -55,8 +55,20 @@ public: class Scene101 : public Scene1xx { private: - // TODO - + int _chanStatus; + int _wipeStatus; + int _callingStatus; + int _chandelierStatus; + int _callingFrame; + int _chandelierFrame; + int _talkCounter; + int _convCounter; + int _brieAnimId; + bool _startWalkingFl; + bool _startWalking0Fl; + bool _anim0Running; + bool _anim1Running; + bool _startSittingFl; public: Scene101(MADSEngine *vm); virtual void synchronize(Common::Serializer &s); @@ -66,11 +78,16 @@ public: virtual void step(); virtual void preActions(); virtual void actions(); + + void handleConversation0(); + void handleConversation1(); + void handleAnimation0(); + void handleAnimation1(); }; class Scene102 : public Scene1xx { private: - bool _animRunningFl; + bool _anim0Running; public: Scene102(MADSEngine *vm); @@ -83,6 +100,321 @@ public: virtual void actions(); }; +class Scene103 : public Scene1xx { +private: + int _jacquesAction; + int _lastRandom; + int _standPosition; + int _hotspotPrompt1; + int _hotspotPrompt2; + int _hotspotPrompt3; + int _hotspotPrompt4; + int _hotspotPrompt5; + int _hotspotRightFloor1; + int _hotspotRightFloor2; + int _hotspotLeftFloor1; + int _hotspotLeftFloor2; + int _hotspotGentleman; + int _convCount; + int _lastStairFrame; + int _lastJacquesFrame; + int _talkCount; + + bool _anim0ActvFl; + bool _anim1ActvFl; + bool _anim2ActvFl; + bool _anim3ActvFl; + bool _anim4ActvFl; + bool _anim5ActvFl; + bool _anim6ActvFl; + bool _climbThroughTrapFl; + bool _guardFrameFl; + bool _sitFl; + + void adjustRails(int variant); + void handleJacquesAnim(); + void climbRightStairs(); + void climbLeftStairs(); + void descendRightStairs(); + void descendLeftStairs(); + void process_conv_jacques(); + +public: + Scene103(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene104 : public Scene1xx { +private: + bool _anim0ActvFl; + bool _anim1ActvFl; + bool _anim2ActvFl; + bool _needToGetUp; + bool _needToStandUp; + bool _needToTalk; + bool _sittingUp; + bool _beforeSheLeaves; + bool _beforeHeLeaves; + + int _walkStatus; + int _walkFrame; + int _coupleStatus; + int _coupleFrame; + int _richStatus; + int _richFrame; + int _manTalkCount; + int _womanTalkCount; + int _lookCount; + int _richTalkCount; + int _lastPlayerFrame; + + void cleanInventory(); + void processConversations(); + void handleWalkAnimation(); + void handleCoupleAnimations(); + void handleRichAnimations(); + void handlePlayerWalk(); + +public: + Scene104(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene105 : public Scene1xx { +public: + Scene105(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene106 : public Scene1xx { +private: + int _sandbagHostpotId; +public: + Scene106(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene107 : public Scene1xx { +public: + Scene107(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene108 : public Scene1xx { +private: + bool _anim0ActvFl; + bool _handRaisedFl; + int _shutUpCount; + int _maxTalkCount; + int _charAction; + int _charFrame; + int _charTalkCount; + int _charHotspotId; + int _conversationCount; + int _prevShutUpFrame; + + void handleCharAnimation(); + void handleCharlesConversation(); + +public: + Scene108(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene109 : public Scene1xx { +private: + bool _anim0ActvFl; + bool _anim1ActvFl; + bool _anim2ActvFl; + bool _anim3ActvFl; + int _currentFloor; + +public: + Scene109(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene110 : public Scene1xx { +public: + Scene110(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene111 : public Scene1xx { +private: + bool _removeAxe; + bool _anim0ActvFl; + bool _anim1ActvFl; + bool _closedFl; + int _listenFrame; + int _listenStatus; + + void handleListenAnimation(); + void handleListenConversation(); + +public: + Scene111(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene112 : public Scene1xx { +private: + bool _anim0ActvFl; + bool _anim1ActvFl; + + int _raoulAction; + int _raoulFrame; + int _didOptionFl; + int _julieFrame; + int _julieAction; + int _julieCounter; + int _julieHotspotId; + + void handleConversation(); + void handleJulieAnimation(); + void handleRaoulChair(); + +public: + Scene112(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene113 : public Scene1xx { +private: + bool _standingAndTalking; + bool _dayWantsToTalk; + bool _musicPlaying; + bool _afterKissFl; + bool _anim0ActvFl; + bool _anim1ActvFl; + bool _anim2ActvFl; + bool _anim3ActvFl; + bool _anim4ActvFl; + bool _prevent1; + bool _prevent2; + bool _raoulStandingFl; + bool _armsOutFl; + + int _christineHotspotId1; + int _christineHotspotId2; + int _dayStatus; + int _dayFrame; + int _dayCount; + int _florentStatus; + int _florentFrame; + int _florentCount; + int _julieStatus; + int _julieFrame; + int _julieCount; + int _raoulAction; + int _raoulFrame; + int _raoulCount; + int _lastDayResetFrame; + int _standCount; + + void handleFlorentAnimation(); + void handleDayAnimation(); + void handleRaoulAnimation(); + void handleRaoulAnimation2(); + void handleJulieAnimation(); + void handleDeadConversation(); + void handleFlorentConversation(); + void handleLoveConversation(); + +public: + Scene113(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene114 : public Scene1xx { +public: + Scene114(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene150 : public Scene1xx { +public: + Scene150(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; } // End of namespace Phantom } // End of namespace MADS diff --git a/engines/mads/phantom/phantom_scenes2.cpp b/engines/mads/phantom/phantom_scenes2.cpp new file mode 100644 index 0000000000..eff0bf8db9 --- /dev/null +++ b/engines/mads/phantom/phantom_scenes2.cpp @@ -0,0 +1,7001 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/scummsys.h" +#include "mads/mads.h" +#include "mads/conversations.h" +#include "mads/scene.h" +#include "mads/phantom/phantom_scenes.h" +#include "mads/phantom/phantom_scenes2.h" + +namespace MADS { + +namespace Phantom { + +void Scene2xx::setAAName() { + _game._aaName = Resources::formatAAName(_globals[kTempInterface]); + _vm->_palette->setEntry(254, 43, 47, 51); +} + +void Scene2xx::sceneEntrySound() { + if (!_vm->_musicFlag) + return; + + switch (_scene->_nextSceneId) { + case 206: + if (!_globals[kKnockedOverHead]) + _vm->_sound->command(16); + break; + + case 208: + _vm->_sound->command(34); + break; + + default: + if (_scene->_nextSceneId != 250) + _vm->_sound->command(16); + break; + } +} + +void Scene2xx::setPlayerSpritesPrefix() { + _vm->_sound->command(5); + + if (_scene->_nextSceneId == 208) + _game._player._spritesPrefix = ""; + else { + Common::String oldName = _game._player._spritesPrefix; + if (!_game._player._forcePrefix) + _game._player._spritesPrefix = "RAL"; + if (oldName != _game._player._spritesPrefix) + _game._player._spritesChanged = true; + } + + _game._player._scalingVelocity = true; +} + +/*------------------------------------------------------------------------*/ + +Scene201::Scene201(MADSEngine *vm) : Scene2xx(vm) { + _anim0ActvFl = false; + _anim1ActvFl = false; + _needHoldFl = false; + _sellerCount = -1; + _sellerStatus = -1; + _sellerFrame = -1; + _raoulFrame = -1; + _raoulStatus = -1; +} + +void Scene201::synchronize(Common::Serializer &s) { + Scene2xx::synchronize(s); + + s.syncAsByte(_anim0ActvFl); + s.syncAsByte(_anim1ActvFl); + s.syncAsByte(_needHoldFl); + s.syncAsSint16LE(_sellerCount); + s.syncAsSint16LE(_sellerStatus); + s.syncAsSint16LE(_sellerFrame); + s.syncAsSint16LE(_raoulFrame); + s.syncAsSint16LE(_raoulStatus); +} + +void Scene201::setup() { + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene201::enter() { + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _anim0ActvFl = false; + _anim1ActvFl = false; + } + + _sellerCount = 0; + _needHoldFl = false; + + _vm->_gameConv->get(16); + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 0)); + + if (_globals[kTicketPeoplePresent]) { + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('s', 1), 0); + _anim1ActvFl = true; + _sellerStatus = 2; + _scene->setAnimFrame(_globals._animationIndexes[1], 5); + } else { + _scene->_hotspots.activate(NOUN_TICKET_SELLER, false); + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + } + + if (_vm->_gameConv->_restoreRunning == 16) { + _game._player._playerPos = Common::Point(72, 101); + _game._player._facing = FACING_NORTHWEST; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('r', 1), 0); + _anim0ActvFl = true; + _raoulStatus = 1; + _game._player._visible = false; + + _vm->_gameConv->run(16); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + _vm->_gameConv->exportPointer(&_globals[kChristineToldEnvelope]); + } + + if ((_scene->_priorSceneId == 202) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + _game._player._playerPos = Common::Point(314, 86); + _game._player.walk(Common::Point(266, 98), FACING_SOUTHWEST); + } + + sceneEntrySound(); +} + +void Scene201::step() { + if (_anim0ActvFl) + handleRaoulAnimation(); + + if (_anim1ActvFl) + handleSellerAnimation(); + + if ((_needHoldFl) && (_vm->_gameConv->_running != 16)) { + _game._player._stepEnabled = false; + _needHoldFl = false; + } +} + +void Scene201::actions() { + if (_vm->_gameConv->_running == 16) { + handleConversation(); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY)) { + _scene->_nextSceneId = 202; + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TALK_TO, NOUN_TICKET_SELLER)) { + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('r', 1), 0); + _anim0ActvFl = true; + _raoulStatus = 1; + _vm->_gameConv->run(16); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + _vm->_gameConv->exportPointer(&_globals[kChristineToldEnvelope]); + _game._player._visible = false; + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(20110); + else + _vm->_dialogs->show(20111); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(20112); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(20113); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BUST)) { + _vm->_dialogs->show(20114); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PEDESTAL)) { + _vm->_dialogs->show(20115); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BARRIER)) { + _vm->_dialogs->show(20116); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PLACARD)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(20117); + else + _vm->_dialogs->show(20118); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TICKET_WINDOW)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(20119); + else + _vm->_dialogs->show(20120); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ARCHWAY)) { + _vm->_dialogs->show(20121); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TICKET_SELLER)) { + _vm->_dialogs->show(20123); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE, NOUN_TICKET_SELLER)) { + _vm->_dialogs->show(20124); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TALK_TO, NOUN_BUST)) { + _vm->_dialogs->show(20122); + _action._inProgress = false; + return; + } +} + +void Scene201::preActions() { + if ((_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) && _action.isObject(NOUN_PLACARD)) + _game._player.walk(Common::Point(147, 104), FACING_NORTHWEST); +} + +void Scene201::handleRaoulAnimation() { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _raoulFrame) + return; + + _raoulFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + int random = -1; + int resetFrame = -1; + + switch (_raoulFrame) { + case 1: + case 19: + case 49: + random = _vm->getRandomNumber(4, 50); + + switch (_raoulStatus) { + case 0: + random = 1; + break; + + case 2: + random = 2; + _game._player._stepEnabled = false; + break; + + case 3: + random = 3; + break; + } + + switch (random) { + case 1: + resetFrame = 9; + _raoulStatus = 1; + break; + + case 2: + resetFrame = 1; + break; + + case 3: + _game._player._visible = true; + _sellerStatus = 2; + _anim0ActvFl = false; + resetFrame = 49; + _game._player._stepEnabled = true; + _needHoldFl = false; + break; + + case 4: + resetFrame = 19; + break; + + default: + resetFrame = 0; + break; + + } + break; + + case 5: + _scene->deleteSequence(_globals._sequenceIndexes[1]); + _game._objects.addToInventory(OBJ_ENVELOPE); + _vm->_sound->command(26); + _vm->_dialogs->showItem(OBJ_ENVELOPE, 834, 0); + break; + + case 9: + _game._player._visible = true; + _anim0ActvFl = false; + _game._player._stepEnabled = true; + resetFrame = 49; + break; + + case 23: + case 35: + case 45: + random = _vm->getRandomNumber(3, 70); + + switch (_raoulStatus) { + case 0: + random = 2; + break; + + case 2: + case 3: + random = 1; + break; + + default: + break; + } + + switch (random) { + case 1: + resetFrame = 45; + break; + + case 2: + resetFrame = 23; + _raoulStatus = 1; + break; + + case 3: + resetFrame = 35; + break; + + default: + resetFrame = 22; + break; + } + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame); + _raoulFrame = resetFrame; + } +} + +void Scene201::handleSellerAnimation() { + if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _sellerFrame ) + return; + + int random = -1; + int resetFrame = -1; + _sellerFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame(); + + switch (_sellerFrame ) { + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 10: + if (_sellerFrame == 10) + _raoulStatus = 2; + + switch (_sellerStatus) { + case 0: + random = 1; + break; + + case 1: + random = _vm->getRandomNumber(1, 5); + ++_sellerCount; + if (_sellerCount > 30) { + _sellerStatus = 0; + random = 6; + } + break; + + case 2: + if (_sellerFrame == 6) + random = 6; + else if (_sellerFrame == 7) + random = 7; + else + random = _vm->getRandomNumber(6, 7); + + ++_sellerCount; + if (_sellerCount > 30) { + _sellerCount = 0; + random = _vm->getRandomNumber(6, 7); + } + break; + + case 3: + random = 8; + break; + + default: + break; + } + + switch (random) { + case 1: + resetFrame = 0; + break; + + case 2: + resetFrame = 1; + break; + + case 3: + resetFrame = 2; + break; + + case 4: + resetFrame = 3; + break; + + case 5: + resetFrame = 4; + break; + + case 6: + resetFrame = 5; + break; + + case 7: + resetFrame = 6; + break; + + case 8: + resetFrame = 7; + break; + + default: + break; + } + break; + + case 9: + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1); + _sellerStatus = 2; + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[1], resetFrame); + _sellerFrame = resetFrame; + } +} + +void Scene201::handleConversation() { + bool interlocutorFl = false; + bool heroFl = false; + + switch (_action._activeAction._verbId) { + case 4: + case 12: + case 13: + case 14: + _vm->_gameConv->setInterlocutorTrigger(90); + _needHoldFl = true; + interlocutorFl = true; + break; + + case 6: + _sellerStatus = 3; + _needHoldFl = true; + interlocutorFl = true; + heroFl = true; + break; + + default: + break; + } + + switch (_game._trigger) { + case 65: + if (_sellerStatus != 3) + _sellerStatus = 1; + break; + + case 70: + if (_sellerStatus != 3) { + _sellerStatus = 0; + _raoulStatus = 0; + } + break; + + case 90: + _vm->_gameConv->setHeroTrigger(91); + heroFl = true; + break; + + case 91: + _raoulStatus = 3; + heroFl = true; + interlocutorFl = true; + break; + + default: + break; + } + + if (!heroFl) + _vm->_gameConv->setHeroTrigger(70); + + if (!interlocutorFl) + _vm->_gameConv->setInterlocutorTrigger(65); + + _sellerCount = 0; +} + +/*------------------------------------------------------------------------*/ + +Scene202::Scene202(MADSEngine *vm) : Scene2xx(vm) { + _ticketGivenFl = false; + _anim0ActvFl = false; + _anim1ActvFl = false; + _skipWalkFl = false; + + for (int i = 0; i < 5; i++) { + _chandeliersPosX[i] = -1; + _chandeliersHotspotId[i] = -1; + } + + _conversationCount = -1; + _usherStatus = -1; + _usherFrame = -1; + _usherCount = -1; + _degasStatus = -1; + _degasFrame = -1; +} + +void Scene202::synchronize(Common::Serializer &s) { + Scene2xx::synchronize(s); + + s.syncAsByte(_ticketGivenFl); + s.syncAsByte(_anim0ActvFl); + s.syncAsByte(_anim1ActvFl); + s.syncAsByte(_skipWalkFl); + + for (int i = 0; i < 5; i++) { + s.syncAsSint16LE(_chandeliersPosX[i]); + s.syncAsSint16LE(_chandeliersHotspotId[i]); + } + + s.syncAsSint16LE(_conversationCount); + s.syncAsSint16LE(_usherStatus); + s.syncAsSint16LE(_usherFrame); + s.syncAsSint16LE(_usherCount); + s.syncAsSint16LE(_degasStatus); + s.syncAsSint16LE(_degasFrame); +} + +void Scene202::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + if (_globals[kTicketPeoplePresent] == 2) + _scene->_variant = 1; + + _scene->addActiveVocab(NOUN_CHANDELIER); + _scene->addActiveVocab(NOUN_EDGAR_DEGAS); +} + +void Scene202::enter() { + _vm->_disableFastwalk = true; + _ticketGivenFl = false; + _chandeliersPosX[0] = 77; + _chandeliersPosX[1] = 192; + _chandeliersPosX[2] = 319; + _chandeliersPosX[3] = 445; + _chandeliersPosX[4] = 560; + + if (_globals[kTicketPeoplePresent] == 2) + _globals[kMakeRichLeave203] = true; + + if ((_globals[kDegasNameIsKnown]) || (_globals[kCurrentYear] == 1993)) + _scene->_hotspots.activate(NOUN_GENTLEMAN, false); + + for (int i = 0; i < 5; i++) { + _globals._sequenceIndexes[2 + i] = -1; + _chandeliersHotspotId[i] = -1; + } + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _anim0ActvFl = false; + _anim1ActvFl = false; + _skipWalkFl = false; + } + + _conversationCount = 0; + _vm->_gameConv->get(17); + _vm->_gameConv->get(9); + + _globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RDR_9"); + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 0)); + + if (_globals[kTicketPeoplePresent] == 2) { + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 0), 0); + _anim0ActvFl = true; + _usherStatus = 2; + } else + _scene->_hotspots.activate(NOUN_USHER, false); + + if (_globals[kDegasNameIsKnown]) + _anim1ActvFl = false; + + if ((_globals[kCurrentYear] == 1881) && (!_globals[kDegasNameIsKnown])) { + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('d', 1), 100); + _anim1ActvFl = true; + _degasStatus = 4; + } + + if (_vm->_gameConv->_restoreRunning == 17) { + _vm->_gameConv->run(17); + _vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_TICKET)); + _vm->_gameConv->exportValue(0); + _game._player._playerPos = Common::Point(569, 147); + _game._player._facing = FACING_NORTHEAST; + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + } + + if (_vm->_gameConv->_restoreRunning == 9) { + _vm->_gameConv->run(9); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + _game._player._playerPos = Common::Point(400, 141); + _game._player._facing = FACING_NORTHWEST; + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + } + + if (_scene->_priorSceneId == 201) { + _game._player._playerPos = Common::Point(3, 141); + _game._player.walk(Common::Point(40, 141), FACING_EAST); + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + } else if (_scene->_priorSceneId == 203) { + _game._player._playerPos = Common::Point(134, 112); + _game._player._facing = FACING_SOUTH; + _game._player._stepEnabled = false; + _game._player.walk(Common::Point(126, 123), FACING_SOUTH); + _game._player.setWalkTrigger(60); + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 5); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + } else if (_scene->_priorSceneId == 204) { + _game._player._playerPos = Common::Point(253, 117); + _game._player.walk(Common::Point(255, 133), FACING_SOUTH); + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _scene->setCamera(Common::Point(70, 0)); + } else if (_scene->_priorSceneId == 205) { + _game._player._playerPos = Common::Point(510, 117); + _game._player.walk(Common::Point(512, 133), FACING_SOUTH); + _scene->setCamera(Common::Point(320, 0)); + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + } else if ((_scene->_priorSceneId == 101) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + _game._player._playerPos = Common::Point(636, 143); + _game._player.walk(Common::Point(598, 143), FACING_WEST); + _scene->setCamera(Common::Point(320, 0)); + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + } else if (_scene->_priorSceneId == RETURNING_FROM_LOADING) { + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + } + + handleChandeliersPositions(); + sceneEntrySound(); +} + +void Scene202::step() { + if (_game._camX._currentFrameFl) + handleChandeliersPositions(); + + if (_anim0ActvFl) + handleUsherAnimation(); + + if (_game._trigger == 100) + _anim1ActvFl = false; + + if (_anim1ActvFl) + handleDegasAnimation(); + + if ((_globals[kCurrentYear] == 1881) && !_globals[kDegasNameIsKnown] && (_game._player._playerPos.x < 405) && !_skipWalkFl) { + _game._player.walk(Common::Point(400, 141), FACING_NORTHWEST); + _game._player.setWalkTrigger(90); + _game._player._stepEnabled = false; + _skipWalkFl = true; + } + + if (_game._trigger == 90) { + _game._player._stepEnabled = true; + _vm->_gameConv->run(9); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + } + + switch (_game._trigger) { + case 60: + _scene->deleteSequence(_globals._sequenceIndexes[0]); + _globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 61); + break; + + case 61: + _vm->_sound->command(25); + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _game._player._stepEnabled = true; + break; + + default: + break; + } + + if ((_globals[kWalkerConverse] == 2) || (_globals[kWalkerConverse] == 3)) { + ++_conversationCount; + if (_conversationCount > 200) + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + } +} + +void Scene202::actions() { + if (_vm->_gameConv->_running == 17) { + handleConversation1(); + _action._inProgress = false; + return; + } + + if (_vm->_gameConv->_running == 9) { + handleConversation2(); + _action._inProgress = false; + return; + } + + if ((_globals[kTicketPeoplePresent] == 2) && (_action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_ARCHWAY) || _action.isAction(VERB_TALK_TO, NOUN_USHER))) { + _vm->_gameConv->run(17); + _vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_TICKET)); + _vm->_gameConv->exportValue(0); + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_GIVE, NOUN_TICKET, NOUN_USHER)) { + _ticketGivenFl = true; + _vm->_gameConv->run(17); + _vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_TICKET)); + _vm->_gameConv->exportValue(1); + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TALK_TO, NOUN_GENTLEMAN) || _action.isAction(VERB_TALK_TO, NOUN_EDGAR_DEGAS)) { + if (!_globals[kDegasNameIsKnown] ) { + _vm->_gameConv->run(9); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + } else + _vm->_dialogs->show(20224); + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_LEFT_DOOR) || _action.isAction(VERB_OPEN, NOUN_LEFT_DOOR)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 4, 80); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 82); + break; + + case 80: + _scene->deleteSequence(_globals._sequenceIndexes[0]); + _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 81); + _vm->_sound->command(24); + break; + + case 81: { + int idx = _globals._sequenceIndexes[0]; + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 5); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[0], SYNC_SEQ, idx); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _game._player.walk(Common::Point(134, 112), FACING_NORTH); + _game._player.setWalkTrigger(83); + } + break; + + case 82: + _game._player._visible = true; + break; + + case 83: + _scene->deleteSequence(_globals._sequenceIndexes[0]); + _globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 84); + _vm->_sound->command(25); + break; + + case 84: + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 5); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 1); + _scene->_nextSceneId = 203; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_LEFT_ARCHWAY)) { + _scene->_nextSceneId = 201; + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_ARCHWAY)) { + _scene->_nextSceneId = 101; + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_MIDDLE_DOOR)) { + _scene->_nextSceneId = 204; + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_DOOR)) { + _scene->_nextSceneId = 205; + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(20210); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(20211); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(20212); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LEFT_ARCHWAY)) { + _vm->_dialogs->show(20213); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RIGHT_ARCHWAY)) { + _vm->_dialogs->show(20214); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LEFT_DOOR)) { + _vm->_dialogs->show(20215); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MIDDLE_DOOR)) { + _vm->_dialogs->show(20216); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RIGHT_DOOR)) { + _vm->_dialogs->show(20217); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LIGHT_FIXTURE)) { + _vm->_dialogs->show(20218); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_OVERDOOR_MEDALLION)) { + _vm->_dialogs->show(20219); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DECORATIVE_MOLDING)) { + _vm->_dialogs->show(20220); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PAINTING)) { + _vm->_dialogs->show(20221); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_EDGAR_DEGAS) || _action.isObject(NOUN_GENTLEMAN)) { + _vm->_dialogs->show(20223); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_USHER)) { + _vm->_dialogs->show(20225); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CHANDELIER)) { + _vm->_dialogs->show(20218); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE) && (_action.isObject(NOUN_GENTLEMAN) || _action.isObject(NOUN_EDGAR_DEGAS))) { + _vm->_dialogs->show(20226); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_USHER)) { + _vm->_dialogs->show(20227); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLOSE, NOUN_DOOR)) { + _vm->_dialogs->show(20222); + _action._inProgress = false; + return; + } +} + +void Scene202::preActions() { + if (_action.isAction(VERB_OPEN, NOUN_LEFT_DOOR)) + _game._player.walk(Common::Point(126, 123), FACING_NORTHEAST); + + if ((_globals[kTicketPeoplePresent] == 2) && _action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_ARCHWAY)) + _game._player.walk(Common::Point(569, 147), FACING_NORTHEAST); + + if (_action.isAction(VERB_TAKE, NOUN_GENTLEMAN) || _action.isAction(VERB_TAKE, NOUN_EDGAR_DEGAS)) + _game._player._needToWalk = false; +} + +void Scene202::handleConversation1() { + bool interlocutorFl = false; + bool heroFl = false; + + switch (_action._activeAction._verbId) { + case 0: + if (!_ticketGivenFl) + _usherStatus = 4; + + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + interlocutorFl = true; + heroFl = true; + break; + + case 3: + _vm->_gameConv->setInterlocutorTrigger(72); + _vm->_gameConv->setHeroTrigger(76); + interlocutorFl = true; + heroFl = true; + break; + + case 4: + _vm->_gameConv->setHeroTrigger(76); + heroFl = true; + interlocutorFl = true; + break; + + default: + break; + } + + switch (_game._trigger) { + case 70: + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + _usherStatus = 0; + break; + + case 72: + _usherStatus = 17; + break; + + case 74: + _globals[kWalkerConverse] = _vm->getRandomNumber(2, 3); + _usherStatus = 2; + _conversationCount = 0; + break; + + case 76: + _globals[kWalkerConverse] = 0; + _ticketGivenFl = false; + heroFl = true; + interlocutorFl = true; + break; + + default: + break; + } + + if (!heroFl) + _vm->_gameConv->setHeroTrigger(74); + + if (!interlocutorFl) + _vm->_gameConv->setInterlocutorTrigger(70); + + _usherCount = 0; +} + +void Scene202::handleConversation2() { + bool interlocutorFl = false; + bool heroFl = false; + + switch (_action._activeAction._verbId) { + case 1: + _globals[kDegasNameIsKnown] = 1; + break; + + case 10: + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + _vm->_gameConv->setHeroTrigger(96); + interlocutorFl = true; + heroFl = true; + break; + + default: + break; + } + + switch (_game._trigger) { + case 74: + _globals[kWalkerConverse] = _vm->getRandomNumber(2, 3); + _degasStatus = 4; + _conversationCount = 0; + break; + + case 93: + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + switch (_action._activeAction._verbId) { + case 1: + _degasStatus = 1; + break; + + case 2: + _degasStatus = 2; + break; + + default: + if ((_action._activeAction._verbId != 11) && (_action._activeAction._verbId != 12)) + _degasStatus = 0; + break; + } + break; + + case 96: + _vm->_gameConv->setInterlocutorTrigger(97); + interlocutorFl = true; + heroFl = true; + break; + + case 97: + _vm->_gameConv->setHeroTrigger(98); + _degasStatus = 0; + interlocutorFl = true; + heroFl = true; + break; + + case 98: + _globals[kWalkerConverse] = 0; + _degasStatus = 3; + + if (_globals[kDegasNameIsKnown] == 1) { + int idx = _scene->_dynamicHotspots.add(NOUN_EDGAR_DEGAS, VERB_WALK_TO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots[idx]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(idx, Common::Point(596, 144), FACING_EAST); + _scene->setDynamicAnim(idx, _globals._animationIndexes[1], 1); + } else { + int idx = _scene->_dynamicHotspots.add(NOUN_GENTLEMAN, VERB_WALK_TO, SYNTAX_SINGULAR_MASC, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots[idx]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(idx, Common::Point(596, 144), FACING_EAST); + _scene->setDynamicAnim(idx, _globals._animationIndexes[1], 1); + } + + _globals[kDegasNameIsKnown] = 2; + interlocutorFl = true; + heroFl = true; + _scene->_hotspots.activate(NOUN_GENTLEMAN, false); + _game._player._stepEnabled = false; + _vm->_gameConv->hold(); + break; + + default: + break; + } + + if (!heroFl) + _vm->_gameConv->setHeroTrigger(74); + + if (!interlocutorFl) + _vm->_gameConv->setInterlocutorTrigger(93); +} + +void Scene202::handleChandeliersPositions() { + int center = _scene->_posAdjust.x + 160; + + for (int chandelier = 0; chandelier < 5; chandelier++) { + if (_globals._sequenceIndexes[chandelier + 2] >= 0) + _scene->deleteSequence(_globals._sequenceIndexes[chandelier + 2]); + + int diff = center - _chandeliersPosX[chandelier]; + int dir = 0; + + if (diff < 0) + dir = 1; + else if (diff > 0) + dir = -1; + + int shiftBase = (int)(abs(diff) / 5); + if (dir < 0) + shiftBase = -shiftBase; + + int posX = _chandeliersPosX[chandelier] + shiftBase - 1; + int posY = _scene->_sprites[_globals._spriteIndexes[2]]->getFrameHeight(0) - 1; + int frameWidth = _scene->_sprites[_globals._spriteIndexes[2]]->getFrameWidth(0); + + if (((posX - ((frameWidth >> 1) + 1)) >= (_scene->_posAdjust.x + 320)) || ((posX + ((frameWidth >> 1) + 1)) < _scene->_posAdjust.x)) + _globals._sequenceIndexes[chandelier + 2] = -1; + else { + if (_chandeliersHotspotId[chandelier] != -1) + _scene->_dynamicHotspots.remove(_chandeliersHotspotId[chandelier]); + + _chandeliersHotspotId[chandelier] = _scene->_dynamicHotspots.add(NOUN_CHANDELIER, VERB_LOOK_AT, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(posX - 8, posY - 12, posX + 8, posY + 1)); + + _globals._sequenceIndexes[chandelier + 2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setPosition(_globals._sequenceIndexes[chandelier + 2], Common::Point(posX, posY)); + _scene->_sequences.setDepth(_globals._sequenceIndexes[chandelier + 2], 1); + } + } +} + +void Scene202::handleUsherAnimation() { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _usherFrame) + return; + + _usherFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + int resetFrame = -1; + int random; + switch (_usherFrame) { + case 1: + case 13: + case 35: + case 51: + case 52: + case 53: + case 54: + switch (_usherStatus) { + case 0: + random = _vm->getRandomNumber(1, 3); + ++_usherCount; + if (_usherCount > 15) { + if (_action._activeAction._verbId == 0) { + _usherStatus = 3; + random = 5; + } else { + _usherStatus = 2; + random = 7; + } + } + break; + + case 3: + random = 5; + break; + + case 4: + random = 6; + break; + + case 17: + random = 4; + break; + + default: + random = 7; + break; + } + + switch (random) { + case 1: + resetFrame = 51; + break; + + case 2: + resetFrame = 52; + break; + + case 3: + resetFrame = 53; + break; + + case 4: + resetFrame = 21; + _usherStatus = 17; + break; + + case 5: + resetFrame = 1; + break; + + case 6: + resetFrame = 35; + _usherStatus = 0; + break; + + default: + resetFrame = 0; + break; + } + break; + + case 7: + if (_usherStatus == 3) + random = 1; + else + random = 2; + + if (random == 1) + resetFrame = 6; + else + resetFrame = 7; + + break; + + case 28: + if (_usherStatus == 17) { + random = 1; + ++_usherCount; + if (_usherCount > 15) { + _usherStatus = 2; + random = 2; + } + } else + random = 2; + + if (random == 1) + resetFrame = 27; + else + resetFrame = 28; + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame); + _usherFrame = resetFrame; + } +} + +void Scene202::handleDegasAnimation() { + if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _degasFrame) + return; + + _degasFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame(); + int resetFrame = -1; + int random; + + switch (_degasFrame) { + case 1: + case 17: + case 58: + switch (_degasStatus) { + case 0: + _degasStatus = 4; + random = 1; + break; + + case 1: + case 2: + case 3: + random = 2; + break; + + default: + random = _vm->getRandomNumber(3, 50); + break; + } + + switch (random) { + case 1: + resetFrame = 1; + break; + + case 2: + resetFrame = 58; + break; + + case 3: + resetFrame = 58; + break; + + default: + resetFrame = 0; + break; + } + break; + + case 33: + case 40: + case 55: + case 62: + switch (_degasStatus) { + case 0: + _degasStatus = 4; + random = 1; + break; + + case 1: + _degasStatus = 4; + random = 2; + break; + + case 2: + _degasStatus = 4; + random = 3; + break; + + case 3: + random = 4; + break; + + default: + random = _vm->getRandomNumber(5, 50); + break; + } + + switch (random) { + case 1: + resetFrame = 33; + break; + + case 2: + resetFrame = 17; + break; + + case 3: + resetFrame = 42; + break; + + case 4: + resetFrame = 62; + break; + + case 5: + resetFrame = 41; + break; + + case 6: + resetFrame = 55; + break; + + default: + resetFrame = 39; + break; + } + break; + + case 42: + switch (_degasStatus) { + case 0: + case 1: + case 2: + case 3: + random = 1; + break; + + default: + random = _vm->getRandomNumber(1, 50); + break; + } + + if (random == 1) + resetFrame = 39; + else + resetFrame = 41; + + break; + + case 110: + _vm->_gameConv->release(); + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[1], resetFrame); + _degasFrame = resetFrame; + } +} + +/*------------------------------------------------------------------------*/ + +Scene203::Scene203(MADSEngine *vm) : Scene2xx(vm) { + _anim0ActvFl = false; + _anim1ActvFl = false; + _anim2ActvFl = false; + _anim3ActvFl = false; + _showNoteFl = false; + + _brieStatus = -1; + _brieFrame = -1; + _brieCount = -1; + _raoulStatus = -1; + _raoulFrame = -1; + _raoulCount = -1; + _richardStatus = -1; + _richardFrame = -1; + _daaeStatus = -1; + _daaeFrame = -1; + _conversationCount = -1; +} + +void Scene203::synchronize(Common::Serializer &s) { + Scene2xx::synchronize(s); + + s.syncAsByte(_anim0ActvFl); + s.syncAsByte(_anim1ActvFl); + s.syncAsByte(_anim2ActvFl); + s.syncAsByte(_anim3ActvFl); + s.syncAsByte(_showNoteFl); + + s.syncAsSint16LE(_brieStatus); + s.syncAsSint16LE(_brieFrame); + s.syncAsSint16LE(_brieCount); + s.syncAsSint16LE(_raoulStatus); + s.syncAsSint16LE(_raoulFrame); + s.syncAsSint16LE(_raoulCount); + s.syncAsSint16LE(_richardStatus); + s.syncAsSint16LE(_richardFrame); + s.syncAsSint16LE(_daaeStatus); + s.syncAsSint16LE(_daaeFrame); + s.syncAsSint16LE(_conversationCount); +} + +void Scene203::setup() { + if (_globals[kCurrentYear] == 1993) + _scene->_variant = 1; + + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene203::enter() { + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _anim0ActvFl = false; + _anim1ActvFl = false; + _anim2ActvFl = false; + _anim3ActvFl = false; + _showNoteFl = false; + } + + _conversationCount = 0; + _scene->_hotspots.activate(NOUN_LETTER, false); + _scene->_hotspots.activate(NOUN_PARCHMENT, false); + _scene->_hotspots.activate(NOUN_NOTICE, false); + + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('p', 1)); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('p', 0)); + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RDR_6"); + + if (_globals[kCurrentYear] == 1993) { + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1)); + _vm->_gameConv->get(5); + } else { + _vm->_gameConv->get(8); + _vm->_gameConv->get(15); + } + + if (_globals[kCurrentYear] == 1993) { + if (_game._objects.isInRoom(OBJ_PARCHMENT)) { + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 3); + _scene->_hotspots.activate(NOUN_PARCHMENT, true); + } + + _scene->_hotspots.activate(NOUN_MONSIEUR_RICHARD, false); + _scene->_hotspots.activate(NOUN_MANAGERS_CHAIR, false); + + if (!_globals[kMakeBrieLeave203]) { + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 9), 1); + _anim0ActvFl = true; + _brieStatus = 4; + } else { + _scene->_hotspots.activate(NOUN_MONSIEUR_BRIE, false); + _scene->_hotspots.activate(NOUN_MANAGERS_CHAIR, true); + } + + if ((_scene->_priorSceneId == RETURNING_FROM_LOADING) && (_vm->_gameConv->_restoreRunning == 5)) { + _brieStatus = 4; + _raoulStatus = 0; + _anim1ActvFl = true; + _game._player._visible = false; + _game._player._stepEnabled = false; + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('c', 1), 0); + _scene->setAnimFrame(_globals._animationIndexes[1], 9); + _vm->_gameConv->run(5); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + _vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_SMALL_NOTE)); + _vm->_gameConv->exportValue(_globals[kReadBook]); + _vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_LARGE_NOTE)); + _vm->_gameConv->exportValue(_globals[kLookedAtCase]); + _vm->_gameConv->exportValue(_globals[kCharlesNameIsKnown]); + _vm->_gameConv->exportValue(_globals[kCanFindBookInLibrary]); + _vm->_gameConv->exportValue(_globals[kFlorentNameIsKnown]); + _vm->_gameConv->exportValue(_globals[kSandbagStatus]); + _vm->_gameConv->exportValue(_globals[kObservedPhan104]); + } + + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_CANDLE, false); + } else if (_globals[kJacquesStatus] == 0) { + _scene->_hotspots.activate(NOUN_DESK_LAMP, false); + _scene->_hotspots.activate(NOUN_MONSIEUR_BRIE, false); + _scene->_hotspots.activate(NOUN_MANAGERS_CHAIR, false); + + if (!_globals[kMakeRichLeave203]) { + _globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('r', 1), 1); + _anim2ActvFl = true; + _richardStatus = 4; + } else { + _scene->_hotspots.activate(NOUN_MONSIEUR_RICHARD, false); + _scene->_hotspots.activate(NOUN_MANAGERS_CHAIR, true); + } + + if ((_scene->_priorSceneId == RETURNING_FROM_LOADING) && (_vm->_gameConv->_restoreRunning == 8)) { + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('c', 1), 0); + _scene->setAnimFrame(_globals._animationIndexes[1], 9); + _anim1ActvFl = true; + _game._player._visible = false; + _raoulStatus = 0; + _vm->_gameConv->run(8); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + } + + if (_game._objects.isInRoom(OBJ_LETTER)) { + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3); + _scene->_hotspots.activate(NOUN_LETTER, true); + } + + if (_game._objects.isInRoom(OBJ_NOTICE)) { + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 3); + _scene->_hotspots.activate(NOUN_NOTICE, true); + } + } else { + _scene->_hotspots.activate(NOUN_MONSIEUR_BRIE, false); + _scene->_hotspots.activate(NOUN_MONSIEUR_RICHARD, false); + _scene->_hotspots.activate(NOUN_DESK_LAMP, false); + } + + if (_vm->_gameConv->_restoreRunning == 15) { + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14); + _game._player._playerPos = Common::Point(98, 137); + _game._player._facing = FACING_NORTHEAST; + _vm->_gameConv->run(15); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + _vm->_gameConv->exportPointer(&_globals[kChristineToldEnvelope]); + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + } + + if (_scene->_priorSceneId == RETURNING_FROM_LOADING) { + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14); + } else if (_scene->_priorSceneId == 202) { + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14); + _game._player._playerPos = Common::Point(195, 147); + _game._player._facing = FACING_NORTH; + } else if (_scene->_priorSceneId == 150) { + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14); + _game._player._playerPos = Common::Point(98, 137); + _game._player._facing = FACING_NORTHEAST; + _vm->_gameConv->run(15); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + _vm->_gameConv->exportPointer(&_globals[kChristineToldEnvelope]); + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + } else if ((_scene->_priorSceneId == 204) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1); + _game._player._playerPos = Common::Point(319, 123); + _game._player._facing = FACING_SOUTHWEST; + _game._player.walk(Common::Point(276, 123), FACING_WEST); + _game._player.setWalkTrigger(95); + _game._player._stepEnabled = false; + } + + sceneEntrySound(); +} + +void Scene203::step() { + if (_anim0ActvFl) + handleBrieAnimation(); + + if (_anim1ActvFl) + handleRaoulAnimation(); + + if (_anim2ActvFl) + handleRichardAnimation(); + + if (_anim3ActvFl) + handleDaaeAnimation(); + + if ((_globals[kWalkerConverse] == 2) || (_globals[kWalkerConverse] == 3)) { + ++_conversationCount; + if (_conversationCount > 200) + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + } + + switch (_game._trigger) { + case 95: + _scene->deleteSequence(_globals._sequenceIndexes[5]); + _globals._sequenceIndexes[5] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[5], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 10); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 96); + break; + + case 96: + _vm->_sound->command(25); + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14); + if (_vm->_gameConv->_running != 15) + _game._player._stepEnabled = true; + break; + + default: + break; + } +} + +void Scene203::actions() { + if (_vm->_gameConv->_running == 5) { + handleBrieConversation(); + _action._inProgress = false; + return; + } + + if (_vm->_gameConv->_running == 8) { + handleRichardConversation(); + _action._inProgress = false; + return; + } + + if (_vm->_gameConv->_running == 15) { + handleRichardAndDaaeConversation(); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR) || _game._trigger) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[4], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 4, 90); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 92); + break; + + case 90: + _vm->_sound->command(24); + _scene->deleteSequence(_globals._sequenceIndexes[5]); + _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 91); + break; + + case 91: + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1); + break; + + case 92: + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[4]); + _game._player.walk(Common::Point(319, 123), FACING_WEST); + _game._player.setWalkTrigger(93); + break; + + case 93: + _scene->_nextSceneId = 204; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TALK_TO, NOUN_MONSIEUR_BRIE)) { + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('c', 1), 0); + _anim1ActvFl = true; + _game._player._visible = false; + _raoulStatus = 0; + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[1], SYNC_PLAYER, 0); + + _vm->_gameConv->run(5); + _vm->_gameConv->hold(); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + _vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_SMALL_NOTE)); + _vm->_gameConv->exportValue(_globals[kReadBook]); + _vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_LARGE_NOTE)); + _vm->_gameConv->exportValue(_globals[kLookedAtCase]); + if (_globals[kCharlesNameIsKnown] == 2) + _vm->_gameConv->exportValue(1); + else + _vm->_gameConv->exportValue(0); + + _vm->_gameConv->exportValue(_globals[kCanFindBookInLibrary]); + _vm->_gameConv->exportValue(_globals[kFlorentNameIsKnown]); + _vm->_gameConv->exportValue(_globals[kSandbagStatus]); + _vm->_gameConv->exportValue(_globals[kObservedPhan104]); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TALK_TO, NOUN_MONSIEUR_RICHARD)) { + if (_globals[kCameFromFade]) { + _vm->_gameConv->run(15); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + _vm->_gameConv->exportPointer(&_globals[kChristineToldEnvelope]); + } else { + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('c', 1), 0); + _anim1ActvFl = true; + _game._player._visible = false; + _game._player._stepEnabled = false; + _raoulStatus = 0; + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[1], SYNC_PLAYER, 0); + + _vm->_gameConv->run(8); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + _vm->_gameConv->hold(); + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_EXIT_TO, NOUN_GRAND_FOYER)) { + _scene->_nextSceneId = 202; + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + if (_globals[kMakeBrieLeave203]) + _vm->_dialogs->show(20337); + else + _vm->_dialogs->show(20310); + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(20311); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(20312); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BOOKCASE)) { + _vm->_dialogs->show(20313); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOORWAY)) { + _vm->_dialogs->show(20314); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_COMFY_CHAIR)) { + _vm->_dialogs->show(20315); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DESK)) { + _vm->_dialogs->show(20316); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MANAGERS_CHAIR)) { + _vm->_dialogs->show(20317); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DESK_LAMP)) { + _vm->_dialogs->show(20318); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LAMP)) { + _vm->_dialogs->show(20319); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LIGHT_FIXTURE)) { + _vm->_dialogs->show(20320); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WINDOW)) { + _vm->_dialogs->show(20321); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SHEERS)) { + _vm->_dialogs->show(20322); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TAPESTRY)) { + _vm->_dialogs->show(20323); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GRAND_FOYER)) { + _vm->_dialogs->show(20324); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TABLE)) { + _vm->_dialogs->show(20325); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CANDLE)) { + _vm->_dialogs->show(20326); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MONSIEUR_BRIE)) { + _vm->_dialogs->show(20327); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MONSIEUR_RICHARD)) { + _vm->_dialogs->show(20328); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PARCHMENT) && _game._objects.isInRoom(OBJ_PARCHMENT)) { + _vm->_dialogs->show(20329); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LETTER) && _game._objects.isInRoom(OBJ_LETTER)) { + _vm->_dialogs->show(20331); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_NOTICE) && _game._objects.isInRoom(OBJ_NOTICE)) { + _vm->_dialogs->show(20333); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE, NOUN_PARCHMENT)) { + _vm->_dialogs->show(20330); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_LETTER)) { + _vm->_dialogs->show(20332); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_NOTICE)) { + _vm->_dialogs->show(20334); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_MONSIEUR_BRIE)) { + _vm->_dialogs->show(20335); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_MONSIEUR_RICHARD)) { + _vm->_dialogs->show(20336); + _action._inProgress = false; + return; + } +} + +void Scene203::preActions() { + if (_action.isAction(VERB_TALK_TO, NOUN_MONSIEUR_RICHARD)) { + if (_globals[kCameFromFade]) + _game._player.walk(Common::Point(98, 137), FACING_NORTHEAST); + else + _game._player.walk(Common::Point(154, 131), FACING_NORTHWEST); + } + + if (_action.isAction(VERB_TALK_TO, NOUN_MONSIEUR_BRIE)) + _game._player.walk(Common::Point(154, 131), FACING_NORTHWEST); + + if (_action.isAction(VERB_OPEN, NOUN_DOOR)) + _game._player.walk(Common::Point(276, 123), FACING_EAST); +} + +void Scene203::handleBrieConversation() { + bool interlocutorFl = false; + bool heroFl = false; + + switch (_action._activeAction._verbId) { + case 9: + case 12: + case 35: + case 42: + _vm->_gameConv->setInterlocutorTrigger(70); + interlocutorFl = true; + heroFl = true; + break; + + case 14: + if (!_game._trigger) { + _vm->_gameConv->hold(); + _raoulStatus = 5; + } + break; + + case 17: + _raoulStatus = 0; + _vm->_gameConv->hold(); + break; + + case 24: + _vm->_gameConv->setInterlocutorTrigger(78); + interlocutorFl = true; + break; + + case 20: + case 25: + _vm->_gameConv->setInterlocutorTrigger(76); + interlocutorFl = true; + break; + + case 37: + if (!_game._trigger) { + _vm->_gameConv->hold(); + if (_vm->_sound->_preferRoland) + _vm->_sound->command(65); + else + _scene->playSpeech(1); + + _scene->_sequences.addTimer(60, 110); + } + break; + + case 41: + _globals[kDoneBrieConv203] = 1; + _globals[kChrisFStatus] = 0; + break; + + case 44: + if (!_game._trigger) { + _vm->_gameConv->hold(); + _raoulStatus = 3; + } + break; + + default: + break; + } + + switch (_game._trigger) { + case 60: + _brieStatus = 0; + break; + + case 65: + _brieStatus = 4; + break; + + case 70: + _vm->_gameConv->setHeroTrigger(71); + interlocutorFl = true; + heroFl = true; + break; + + case 71: + _raoulStatus = 2; + break; + + case 74: + _vm->_gameConv->hold(); + _raoulStatus = 3; + break; + + case 76: + _brieStatus = 1; + break; + + case 78: + _brieStatus = 2; + break; + + case 110: + _vm->_gameConv->release(); + break; + + default: + break; + } + + if (!heroFl && (_raoulStatus != 5)) + _vm->_gameConv->setHeroTrigger(65); + + if (!interlocutorFl) + _vm->_gameConv->setInterlocutorTrigger(60); + + _brieCount = 0; + _raoulCount = 0; +} + +void Scene203::handleRichardConversation() { + bool interlocutorFl = false; + bool heroFl = false; + + switch (_action._activeAction._verbId) { + case 4: + _vm->_gameConv->setInterlocutorTrigger(83); + interlocutorFl = true; + break; + + case 5: + case 15: + case 20: + case 21: + case 27: + _vm->_gameConv->setInterlocutorTrigger(70); + interlocutorFl = true; + heroFl = true; + break; + + case 7: + if (_game._objects.isInRoom(OBJ_NOTICE) && !_game._trigger) { + _vm->_gameConv->hold(); + _raoulStatus = 3; + } + break; + + case 9: + if (_game._objects.isInRoom(OBJ_LETTER) && !_game._trigger) { + _vm->_gameConv->hold(); + _raoulStatus = 4; + } + break; + + case 17: + _vm->_gameConv->setInterlocutorTrigger(85); + interlocutorFl = true; + break; + + case 19: + _vm->_gameConv->setInterlocutorTrigger(81); + interlocutorFl = true; + break; + + default: + break; + } + + switch (_game._trigger) { + case 65: + _richardStatus = 4; + break; + + case 70: + _vm->_gameConv->setHeroTrigger(71); + interlocutorFl = true; + heroFl = true; + break; + + case 71: { + _raoulStatus = 2; + int *val1 = _vm->_gameConv->getVariable(24); + int *val2 = _vm->_gameConv->getVariable(26); + if ((*val1) && (*val2)) { + _globals[kDoneRichConv203] = true; + _globals[kMadameGiryShowsUp] = true; + } + } + break; + + case 74: + _vm->_gameConv->hold(); + _raoulStatus = 3; + break; + + case 81: + _richardStatus = 2; + break; + + case 83: + _richardStatus = 1; + break; + + case 85: + _richardStatus = 3; + break; + + case 100: + _richardStatus = 0; + break; + + default: + break; + } + + if (!heroFl && (_raoulStatus != 5)) + _vm->_gameConv->setHeroTrigger(65); + + if (!interlocutorFl) + _vm->_gameConv->setInterlocutorTrigger(100); + + _brieCount = 0; + _raoulCount = 0; +} + +void Scene203::handleRichardAndDaaeConversation() { + bool interlocutorFl = false; + bool heroFl = false; + + switch (_action._activeAction._verbId) { + case 5: + if (!_game._trigger) { + _vm->_gameConv->hold(); + + _vm->_sound->command(24); + _scene->deleteSequence(_globals._sequenceIndexes[5]); + _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 90); + interlocutorFl = true; + heroFl = true; + } + break; + + case 11: + if (!_game._trigger) { + _vm->_gameConv->hold(); + _daaeStatus = 3; + } + break; + + case 13: + case 14: + case 15: + _globals[kChristineDoorStatus] = 1; + _globals[kTicketPeoplePresent] = 2; + heroFl = true; + interlocutorFl = true; + _vm->_gameConv->setInterlocutorTrigger(115); + break; + + default: + break; + } + + switch (_game._trigger) { + case 65: + if (_globals[kWalkerConverse] != 0) + _globals[kWalkerConverse] = _vm->getRandomNumber(2, 3); + + if ((_richardStatus != 5) && (_richardStatus != 7)) + _richardStatus = 4; + + _conversationCount = 0; + break; + + case 90: + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1); + _globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('d', 1), 0); + _anim3ActvFl = true; + _daaeStatus = 0; + break; + + case 100: + if (_globals[kWalkerConverse] != 0) + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + + if ((_action._activeAction._verbId == 7) || (_action._activeAction._verbId == 9)) + _daaeStatus = 1; + else if (_richardStatus == 7) + _richardStatus = 5; + else if (_richardStatus != 5) + _richardStatus = 0; + + break; + + case 115: + _globals[kWalkerConverse] = 0; + heroFl = true; + interlocutorFl = true; + break; + + default: + break; + } + + if (!heroFl) + _vm->_gameConv->setHeroTrigger(65); + + if (!interlocutorFl) + _vm->_gameConv->setInterlocutorTrigger(100); + + _brieCount = 0; + _raoulCount = 0; +} + +void Scene203::handleBrieAnimation() { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _brieFrame) + return; + + _brieFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + int resetFrame = -1; + int random = -1; + + switch (_brieFrame) { + case 1: + case 2: + case 4: + case 11: + case 22: + case 31: + case 35: + case 29: + random = _vm->getRandomNumber(6, 45); + + switch (_brieStatus) { + case 0: + random = _vm->getRandomNumber(1, 2); + ++_brieCount; + if (_brieCount > 20) { + _brieStatus = 4; + random = 45; + } + break; + + case 1: + random = 5; + break; + + case 2: + random = 4; + break; + + case 3: + random = 3; + _brieStatus = 0; + break; + + default: + break; + } + + switch (random) { + case 1: + resetFrame = 0; + break; + + case 2: + resetFrame = 1; + break; + + case 3: + resetFrame = 2; + break; + + case 4: + resetFrame = 22; + _brieStatus = 0; + break; + + case 5: + resetFrame = 13; + break; + + case 6: + resetFrame = 4; + break; + + case 7: + resetFrame = 29; + break; + + case 8: + resetFrame = 31; + break; + + default: + resetFrame = 0; + break; + } + break; + + case 30: + random = _vm->getRandomNumber(1, 45); + + switch (_brieStatus) { + case 0: + case 1: + case 2: + case 3: + random = 1; + break; + } + + if (random == 1) + resetFrame = 30; + else + resetFrame = 29; + + break; + + case 8: + random = _vm->getRandomNumber(1, 45); + + switch (_brieStatus) { + case 0: + case 1: + case 2: + case 3: + random = 3; + break; + } + + switch (random) { + case 1: + resetFrame = 11; + break; + + case 2: + resetFrame = 12; + break; + + case 3: + resetFrame = 8; + break; + + default: + resetFrame = 7; + break; + } + break; + + case 12: + random = _vm->getRandomNumber(1, 45); + + switch (_brieStatus) { + case 0: + case 1: + case 2: + case 3: + random = 1; + break; + } + + if (random == 1) + resetFrame = 7; + else + resetFrame = 11; + + break; + + case 13: + random = _vm->getRandomNumber(1, 45); + + switch (_brieStatus) { + case 0: + case 1: + case 2: + case 3: + random = 1; + break; + } + + if (random == 1) + resetFrame = 7; + else + resetFrame = 12; + + break; + + case 17: + case 18: + switch (_brieStatus) { + case 0: + case 2: + case 3: + random = 3; + break; + case 1: + random = _vm->getRandomNumber(1, 2); + ++_brieCount; + if (_brieCount > 20) { + _brieStatus = 4; + random = 3; + } + break; + + default: + break; + } + + switch (random) { + case 1: + resetFrame = 16; + break; + + case 2: + resetFrame = 17; + break; + + case 3: + resetFrame = 18; + break; + + default: + break; + } + break; + + case 33: + case 40: + random = _vm->getRandomNumber(1, 45); + + switch (_brieStatus) { + case 0: + case 1: + case 2: + case 3: + random = 1; + break; + } + + switch (random) { + case 1: + resetFrame = 33; + break; + + case 2: + resetFrame = 35; + break; + + default: + resetFrame = 32; + break; + } + break; + + case 38: + random = _vm->getRandomNumber(1, 45); + + switch (_brieStatus) { + case 0: + case 1: + case 2: + case 3: + random = 1; + break; + } + + if (random == 1) + resetFrame = 38; + else + resetFrame = 37; + + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame); + _brieFrame = resetFrame; + } +} + +void Scene203::handleRichardAnimation() { + if (_scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame() == _richardFrame) + return; + + _richardFrame = _scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame(); + int resetFrame = -1; + int random = -1; + + switch (_richardFrame) { + case 1: + case 2: + case 3: + case 7: + case 15: + case 25: + case 37: + case 53: + case 59: + case 63: + case 67: + case 69: + case 79: + case 87: + case 108: + random = _vm->getRandomNumber(8, 45); + + switch (_richardStatus) { + case 0: + random = _vm->getRandomNumber(1, 3); + ++_brieCount; + if (_brieCount > 20) { + _richardStatus = 4; + random = 45; + } + break; + + case 1: + random = 4; + _richardStatus = 0; + break; + + case 2: + random = 5; + _richardStatus = 0; + break; + + case 3: + random = 6; + _richardStatus = 0; + break; + + case 5: + random = 7; + break; + + default: + break; + } + + switch (random) { + case 1: + resetFrame = 0; + break; + + case 2: + resetFrame = 1; + break; + + case 3: + resetFrame = 2; + break; + + case 4: + resetFrame = 69; + break; + + case 5: + resetFrame = 53; + _richardStatus = 0; + break; + + case 6: + resetFrame = 42; + break; + + case 7: + resetFrame = 87; + break; + + case 8: + resetFrame = 25; + break; + + case 9: + resetFrame = 15; + break; + + case 10: + resetFrame = 3; + break; + + case 11: + resetFrame = 7; + break; + + case 12: + resetFrame = 59; + break; + + case 13: + resetFrame = 63; + break; + + case 14: + resetFrame = 67; + break; + + case 15: + resetFrame = 79; + break; + + default: + resetFrame = 0; + break; + } + break; + + case 5: + random = _vm->getRandomNumber(1, 45); + + switch (_richardStatus) { + case 0: + case 1: + case 2: + case 3: + case 5: + random = 1; + break; + } + + if (random == 1) + resetFrame = 5; + else + resetFrame = 4; + + break; + + case 11: + random = _vm->getRandomNumber(1, 45); + + switch (_richardStatus) { + case 0: + case 1: + case 2: + case 3: + case 5: + random = 1; + break; + } + + if (random == 1) + resetFrame = 11; + else + resetFrame = 10; + + break; + + case 61: + random = _vm->getRandomNumber(1, 45); + + switch (_richardStatus) { + case 0: + case 1: + case 2: + case 3: + case 5: + random = 1; + break; + } + + if (random == 1) + resetFrame = 61; + else + resetFrame = 60; + + break; + + case 65: + random = _vm->getRandomNumber(1, 45); + + switch (_richardStatus) { + case 0: + case 1: + case 2: + case 3: + case 5: + random = 1; + break; + } + + if (random == 1) + resetFrame = 65; + else + resetFrame = 64; + + break; + + case 68: + random = _vm->getRandomNumber(1, 45); + + switch (_richardStatus) { + case 0: + case 1: + case 2: + case 3: + case 5: + random = 1; + break; + } + + if (random == 1) + resetFrame = 68; + else + resetFrame = 67; + + break; + + case 83: + random = _vm->getRandomNumber(1, 45); + + switch (_richardStatus) { + case 0: + case 1: + case 2: + case 3: + case 5: + random = 1; + break; + } + + if (random == 1) + resetFrame = 83; + else + resetFrame = 82; + + break; + + case 92: + _vm->_gameConv->release(); + break; + + case 93: + case 94: + case 95: + if (_richardStatus == 5) { + random = _vm->getRandomNumber(1, 3); + ++_brieCount; + if (_brieCount > 20) { + _richardStatus = 7; + random = 4; + } + } else + random = 4; + + switch (random) { + case 1: + resetFrame = 92; + break; + + case 2: + resetFrame = 93; + break; + + case 3: + resetFrame = 94; + break; + + case 4: + resetFrame = 95; + break; + } + break; + + case 100: + case 101: + case 102: + switch (_richardStatus) { + case 5: + random = _vm->getRandomNumber(1, 3); + ++_brieCount; + if (_brieCount > 20) { + _richardStatus = 7; + random = 1; + } + break; + + case 7: + random = 1; + break; + + default: + random = 4; + break; + } + + switch (random) { + case 1: + resetFrame = 99; + break; + + case 2: + resetFrame = 100; + break; + + case 3: + resetFrame = 101; + break; + + case 4: + resetFrame = 102; + break; + + default: + break; + } + break; + + case 31: + random = _vm->getRandomNumber(1, 45); + + switch (_richardStatus) { + case 0 : + case 1: + case 2: + case 3: + case 5: + random = 1; + break; + } + + if (random == 1) + resetFrame = 31; + else + resetFrame = 30; + + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[2], resetFrame); + _richardFrame = resetFrame; + } +} + +void Scene203::handleRaoulAnimation() { + if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _raoulFrame) + return; + + _raoulFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame(); + int resetFrame = -1; + int random = -1; + + switch (_raoulFrame) { + case 9: + case 21: + case 57: + _vm->_gameConv->release(); + break; + + case 10: + case 22: + case 30: + case 34: + case 58: + if (_raoulFrame == 22) + _raoulStatus = 0; + + random = _vm->getRandomNumber(5, 45); + + switch (_raoulStatus) { + case 1: + random = 1; + break; + + case 2: + _game._player._stepEnabled = false; + random = 2; + break; + + case 3: + case 5: + random = 3; + break; + + case 4: + random = 4; + break; + + default: + random = _vm->getRandomNumber(5, 100); + break; + } + + switch (random) { + case 1: + resetFrame = 22; + break; + + case 2: + resetFrame = 34; + break; + + case 3: + resetFrame = 10; + break; + + case 4: + resetFrame = 45; + break; + + case 5: + resetFrame = 30; + break; + + default: + resetFrame = 9; + break; + } + break; + + case 16: + switch (_raoulStatus) { + case 3: + random = 1; + break; + + case 0: + case 2: + random = 2; + break; + + case 5: + random = 3; + break; + + default: + break; + } + + switch (random) { + case 1: + if (_globals[kCurrentYear] == 1881) { + resetFrame = 16; + _scene->deleteSequence(_globals._sequenceIndexes[1]); + _scene->_hotspots.activate(NOUN_NOTICE, false); + _game._objects.addToInventory(OBJ_NOTICE); + _vm->_sound->command(26); + _scene->_speechReady = -1; + _vm->_dialogs->showItem(OBJ_NOTICE, 814, 5); + _raoulStatus = 0; + } else { + resetFrame = 16; + _scene->deleteSequence(_globals._sequenceIndexes[1]); + _scene->_hotspots.activate(NOUN_PARCHMENT, false); + _game._objects.addToInventory(OBJ_PARCHMENT); + _vm->_sound->command(26); + _scene->_speechReady = -1; + _vm->_dialogs->showItem(OBJ_PARCHMENT, 812, 3); + _raoulStatus = 0; + } + break; + + case 2: + if (_showNoteFl) { + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _showNoteFl = false; + } + break; + + default: + if (!_showNoteFl) { + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], true, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 3); + _vm->_gameConv->release(); + _showNoteFl = true; + } + resetFrame = 15; + break; + } + break; + + case 26: + random = _vm->getRandomNumber(1, 45); + + switch (_raoulStatus) { + case 0: + case 2: + case 3: + case 4: + case 5: + random = 1; + break; + + case 1: + random = 2; + break; + } + + if (random == 1) + resetFrame = 26; + else + resetFrame = 25; + + break; + + case 45: + _anim1ActvFl = false; + _game._player._visible = true; + _game._player._stepEnabled = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[1]); + resetFrame = 58; + if (_globals[kDoneBrieConv203] && (_globals[kCurrentYear] == 1993)) { + _globals[kPrompterStandStatus] = 1; + _scene->_nextSceneId = 150; + } + break; + + case 52: + _scene->deleteSequence(_globals._sequenceIndexes[3]); + _scene->_hotspots.activate(NOUN_LETTER, false); + _game._objects.addToInventory(OBJ_LETTER); + _vm->_sound->command(26); + _scene->_speechReady = -1; + _vm->_dialogs->showItem(OBJ_LETTER, 813, 4); + _raoulStatus = 0; + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[1], resetFrame); + _raoulFrame = resetFrame; + } +} + +void Scene203::handleDaaeAnimation() { + if (_scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame() == _daaeFrame) + return; + + _daaeFrame = _scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame(); + int resetFrame = -1; + int random = -1; + + switch (_daaeFrame) { + case 20: + _vm->_gameConv->release(); + _richardStatus = 5; + break; + + case 175: + _richardStatus = 4; + break; + + case 198: + _vm->_gameConv->release(); + break; + + case 201: + _scene->_sequences.addTimer(1, 95); + break; + + case 76: + case 92: + case 102: + case 123: + switch (_daaeStatus) { + case 1: + random = _vm->getRandomNumber(1, 2); + _daaeStatus = 2; + break; + + case 2: + random = 3; + _daaeStatus = 0; + break; + + case 3: + random = 4; + break; + + default: + random = 5; + break; + } + + switch (random) { + case 1: + resetFrame = 79; + break; + + case 2: + resetFrame = 92; + break; + + case 3: + resetFrame = 102; + break; + + case 4: + resetFrame = 123; + break; + + case 5: + resetFrame = 75; + break; + + default: + break; + } + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[3], resetFrame); + _daaeFrame = resetFrame; + } +} + +/*------------------------------------------------------------------------*/ + +Scene204::Scene204(MADSEngine *vm) : Scene2xx(vm) { + _anim0ActvFl = false; + _anim1ActvFl = false; + _anim2ActvFl = false; + _anim3ActvFl = false; + _raoulDown = false; + _florentGone = false; + _skip1Fl = false; + _skip2Fl = false; + _skip3Fl = false; + _endGameFl = false; + + _brieStatus = -1; + _brieFrame = -1; + _florStatus = -1; + _florFrame = -1; + _raoulStatus = -1; + _raoulFrame = -1; + _raoulCount = -1; +} + +void Scene204::synchronize(Common::Serializer &s) { + Scene2xx::synchronize(s); + + s.syncAsByte(_anim0ActvFl); + s.syncAsByte(_anim1ActvFl); + s.syncAsByte(_anim2ActvFl); + s.syncAsByte(_anim3ActvFl); + s.syncAsByte(_raoulDown); + s.syncAsByte(_florentGone); + s.syncAsByte(_skip1Fl); + s.syncAsByte(_skip2Fl); + s.syncAsByte(_skip3Fl); + s.syncAsByte(_endGameFl); + + s.syncAsSint16LE(_brieStatus); + s.syncAsSint16LE(_brieFrame); + s.syncAsSint16LE(_florStatus); + s.syncAsSint16LE(_florFrame); + s.syncAsSint16LE(_raoulStatus); + s.syncAsSint16LE(_raoulFrame); + s.syncAsSint16LE(_raoulCount); +} + +void Scene204::setup() { + if ((_globals[kCurrentYear] == 1993) || _globals[kRightDoorIsOpen504]) + _scene->_variant = 1; + + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene204::enter() { + _skip3Fl = false; + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _anim0ActvFl = false; + _anim1ActvFl = false; + _anim2ActvFl = false; + _anim3ActvFl = false; + _florentGone = false; + _skip1Fl = false; + _skip2Fl = false; + _endGameFl = false; + _raoulDown = true; + } + + if (_globals[kTicketPeoplePresent] == 2) + _globals[kMakeRichLeave203] = true; + + if (_globals[kRightDoorIsOpen504]) + _endGameFl = true; + + warning("TODO: If end of game, remove the walking areas"); + + _scene->_hotspots.activate(NOUN_BOOK, false); + _vm->_gameConv->get(22); + + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 0)); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 6)); + _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RALRH_9"); + _globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RDRR_6"); + + if (_game._objects.isInRoom(OBJ_BOOK) || (_globals[kCurrentYear] == 1881) || _endGameFl) { + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 5); + if (_globals[kScannedBookcase] && (_globals[kCurrentYear] == 1993)) + _scene->_hotspots.activate(NOUN_BOOK, true); + } + + if ((_globals[kCurrentYear] == 1993) || _endGameFl) { + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1)); + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_sprites.remove(_globals._spriteIndexes[0]); + _scene->_hotspots.activate(NOUN_CANDLE, false); + _scene->_hotspots.activate(NOUN_BUST, false); + _scene->_hotspots.activate(NOUN_COFFEE_TABLE, false); + + int idx = _scene->_dynamicHotspots.add(NOUN_COFFEE_TABLE, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(83, 140, 83 + 45, 140 + 12)); + _scene->_dynamicHotspots.setPosition(idx, Common::Point(84, 150), FACING_SOUTHEAST); + + idx = _scene->_dynamicHotspots.add(NOUN_GRAND_FOYER, VERB_EXIT_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(199, 147, 199 + 52, 147 + 8)); + _scene->_dynamicHotspots.setPosition(idx, Common::Point(224, 152), FACING_SOUTH); + _scene->_dynamicHotspots.setCursor(idx, CURSOR_GO_DOWN); + + idx = _scene->_dynamicHotspots.add(NOUN_GRAND_FOYER, VERB_EXIT_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(145, 147, 145 + 54, 147 + 8)); + _scene->_dynamicHotspots.setPosition(idx, Common::Point(175, 152), FACING_SOUTH); + _scene->_dynamicHotspots.setCursor(idx, CURSOR_GO_DOWN); + } else { + _scene->_hotspots.activate(NOUN_LIGHT, false); + _scene->_hotspots.activate(NOUN_GLASS_CASE, false); + + int idx = _scene->_dynamicHotspots.add(NOUN_COMFY_CHAIR, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(220, 147, 220 + 6, 147 + 8)); + _scene->_dynamicHotspots.setPosition(idx, Common::Point(220, 150), FACING_SOUTHEAST); + + idx = _scene->_dynamicHotspots.add(NOUN_COMFY_CHAIR, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(226, 134, 226 + 12, 134 + 21)); + _scene->_dynamicHotspots.setPosition(idx, Common::Point(220, 150), FACING_SOUTHEAST); + + idx = _scene->_dynamicHotspots.add(NOUN_COMFY_CHAIR, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(238, 128, 238 + 13, 128 + 27)); + _scene->_dynamicHotspots.setPosition(idx, Common::Point(220, 150), FACING_SOUTHEAST); + + idx = _scene->_dynamicHotspots.add(NOUN_GRAND_FOYER, VERB_EXIT_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(199, 147, 199 + 19, 147 + 8)); + _scene->_dynamicHotspots.setPosition(idx, Common::Point(209, 152), FACING_SOUTH); + _scene->_dynamicHotspots.setCursor(idx, CURSOR_GO_DOWN); + + idx = _scene->_dynamicHotspots.add(NOUN_GRAND_FOYER, VERB_EXIT_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(84, 147, 84 + 61, 147 + 8)); + _scene->_dynamicHotspots.setPosition(idx, Common::Point(115, 152), FACING_SOUTH); + _scene->_dynamicHotspots.setCursor(idx, CURSOR_GO_DOWN); + } + + if ((_scene->_priorSceneId == 306) || (_endGameFl)) { + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('f', 0)); + _scene->drawToBackground(_globals._spriteIndexes[6], 1, Common::Point(-32000, -32000), 0, 100); + } else if (_globals[kCurrentYear] == 1993) { + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 1)); + _scene->drawToBackground(_globals._spriteIndexes[1], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_sprites.remove(_globals._spriteIndexes[1]); + } + + if (_scene->_priorSceneId == RETURNING_FROM_LOADING) { + if (_endGameFl) { + _game.loadQuoteSet(0x75, 0); + + _globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('r', 1), 0); + _anim2ActvFl = true; + + if (_florentGone) { + _scene->setAnimFrame(_globals._animationIndexes[2], 9); + _raoulStatus = 1; + } else { + _scene->setAnimFrame(_globals._animationIndexes[2], 32); + _raoulStatus = 4; + } + + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('m', 1), 0); + _anim0ActvFl = true; + _brieStatus = 2; + + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('f', 1), 0); + _anim1ActvFl = true; + _florStatus = 2; + + if (_florentGone) + _scene->setAnimFrame(_globals._animationIndexes[1], 172); + else if (!_raoulDown) + _scene->setAnimFrame(_globals._animationIndexes[1], 21); + + _game._player._visible = false; + _vm->_gameConv->run(22); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + } else { + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 5); + } + } else if (_scene->_priorSceneId == 202) { + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 5); + if (_globals[kCurrentYear] == 1993) + _game._player._playerPos = Common::Point(175, 145); + else + _game._player._playerPos = Common::Point(115, 147); + + _game._player._facing = FACING_NORTHWEST; + } else if (_scene->_priorSceneId == 150) { + int size = _game._objects.size(); + for (int i = 0; i < size; i++) + _game._objects.setRoom(i, 1); + + _game.loadQuoteSet(0x75, 0); + + _globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('r', 1), 0); + _anim2ActvFl = true; + _raoulStatus = 4; + _scene->setAnimFrame(_globals._animationIndexes[2], 32); + + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('m', 1), 0); + _anim0ActvFl = true; + _brieStatus = 2; + + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('f', 1), 0); + _anim1ActvFl = true; + _raoulDown = true; + _florStatus = 2; + + _game._player._visible = false; + _endGameFl = true; + + _vm->_gameConv->run(22); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + } else if ((_scene->_priorSceneId == 203) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + _game._player.firstWalk(Common::Point(-10, 136), FACING_EAST, Common::Point(30, 140), FACING_EAST, true); + _game._player.setWalkTrigger(70); + _game._player._stepEnabled = false; + } + + sceneEntrySound(); +} + +void Scene204::step() { + if (_anim0ActvFl) + handleBrieAnimation(); + + if (_anim1ActvFl) + handleFlorAnimation(); + + if (_anim2ActvFl) + handleRaoulAnimation(); + + if (_anim3ActvFl) + handleEndAnimation(); + + if (_game._trigger == 85) + _scene->_nextSceneId = 250; + + if ((_vm->_gameConv->_running != 22) && !_skip1Fl && _endGameFl) { + _game._player._stepEnabled = false; + _skip1Fl = true; + } + + if (_game._trigger == 70) { + _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 10); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 71); + } else if (_game._trigger == 71) { + _vm->_sound->command(25); + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 5); + _game._player._stepEnabled = true; + } +} + +void Scene204::actions() { + if (_vm->_gameConv->_running == 22) { + handleConversation(); + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 4, 60); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 61); + break; + + case 60: + _vm->_sound->command(24); + _scene->deleteSequence(_globals._sequenceIndexes[3]); + _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2); + break; + + case 61: + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[5]); + _game._player.walk(Common::Point(0, 136), FACING_WEST); + _game._player.setWalkTrigger(62); + break; + + case 62: + _scene->_nextSceneId = 203; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_BOOK) && (_game._objects.isInRoom(OBJ_BOOK) || _game._trigger)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -1, -2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[4], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 8, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _scene->_hotspots.activate(NOUN_BOOK, false); + _game._objects.addToInventory(OBJ_BOOK); + _vm->_sound->command(26); + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[4]); + _game._player._visible = true; + _scene->_sequences.addTimer(20, 3); + break; + + case 3: + _vm->_dialogs->showItem(OBJ_BOOK, 815, 0); + _globals[kReadBook] = true; + _globals[kPlayerScore] += 5; + _game._player._stepEnabled = true; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_EXIT_TO, NOUN_GRAND_FOYER)) { + _scene->_nextSceneId = 202; + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(20410); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(20411); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(20412); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RUG)) { + _vm->_dialogs->show(20413); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GLASS_CASE)) { + _vm->_dialogs->show(20414); + _globals[kLookedAtCase] = true; + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CEILING)) { + if (_globals[kSandbagStatus] == 0) + _vm->_dialogs->show(20429); + else + _vm->_dialogs->show(20416); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BOOKCASE)) { + if (_globals[kCanFindBookInLibrary] && (_globals[kCurrentYear] == 1993)) { + if ((_scene->_customDest.x < 46) && !_game._objects.isInInventory(OBJ_BOOK)) { + if (!_globals[kScannedBookcase]) { + _vm->_dialogs->show(20433); + _scene->_hotspots.activate(NOUN_BOOK, true); + _globals[kScannedBookcase] = true; + } else { + _vm->_dialogs->show(20437); + } + } else { + _vm->_dialogs->show(20417); + } + } else { + _vm->_dialogs->show(20417); + } + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SOFA)) { + _vm->_dialogs->show(20418); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_END_TABLE)) { + _vm->_dialogs->show(20419); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LAMP)) { + _vm->_dialogs->show(20420); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BUST)) { + _vm->_dialogs->show(20421); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_COFFEE_TABLE)) { + _vm->_dialogs->show(20422); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_COMFY_CHAIR)) { + _vm->_dialogs->show(20423); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DECORATIVE_VASE )) { + _vm->_dialogs->show(20424); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PAINTING)) { + _vm->_dialogs->show(20425); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GRAND_FOYER)) { + _vm->_dialogs->show(20426); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR)) { + _vm->_dialogs->show(20427); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WINDOW)) { + _vm->_dialogs->show(20428); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BOOK) && _game._objects.isInRoom(OBJ_BOOK)) { + _vm->_dialogs->show(20434); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TALK_TO, NOUN_BUST)) { + _vm->_dialogs->show(20436); + _action._inProgress = false; + return; + } +} + +void Scene204::preActions() { + if (_action.isAction(VERB_LOOK, NOUN_BOOKCASE)) + _game._player._needToWalk = true; + + if (_action.isAction(VERB_LOOK, NOUN_BOOK) && _game._objects.isInRoom(OBJ_BOOK)) + _game._player._needToWalk = true; + + if (_action.isAction(VERB_OPEN, NOUN_DOOR)) + _game._player.walk(Common::Point(27, 139), FACING_WEST); +} + +void Scene204::handleConversation() { + bool interlocutorFl = false; + bool heroFl = false; + + switch (_action._activeAction._verbId) { + case 6: + case 7: + case 8: + if (_raoulDown) { + _vm->_gameConv->hold(); + _raoulDown = false; + } + break; + + case 17: + if (!_game._trigger) { + _florStatus = 3; + _florentGone = true; + interlocutorFl = true; + heroFl = true; + _vm->_gameConv->hold(); + } + break; + + case 25: + if (!_game._trigger) { + _raoulStatus = 5; + _florStatus = 5; + interlocutorFl = true; + heroFl = true; + _vm->_gameConv->hold(); + } + break; + + case 29: + interlocutorFl = true; + heroFl = true; + if (!_game._trigger) { + _brieStatus = 3; + _vm->_gameConv->hold(); + } + break; + + default: + break; + } + + switch (_game._trigger) { + case 75: + if (_florentGone) { + if (_raoulStatus != 2) + _raoulStatus = 0; + } else + _florStatus = 4; + + break; + + case 80: + if (_florentGone) { + if ((_action._activeAction._verbId != 18) && (_action._activeAction._verbId != 23)) + _brieStatus = 0; + } else { + switch (_action._activeAction._verbId) { + case 1: + case 7: + case 8: + case 9: + case 13: + case 15: + case 19: + case 20: + case 21: + case 22: + _brieStatus = 0; + break; + + default: + _florStatus = 0; + break; + } + } + break; + + default: + break; + } + + if (!heroFl && !_raoulDown) + _vm->_gameConv->setHeroTrigger(75); + + if (!interlocutorFl) + _vm->_gameConv->setInterlocutorTrigger(80); + + _raoulCount = 0; +} + +void Scene204::handleBrieAnimation() { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _brieFrame) + return; + + _brieFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + int resetFrame = -1; + int random; + + switch (_brieFrame) { + case 80: + _vm->_gameConv->release(); + _raoulStatus = 2; + break; + + case 173: + _game._player._stepEnabled = true; + _vm->_dialogs->show(20430); + _game._player._stepEnabled = false; + break; + + case 174: + _raoulStatus = 3; + resetFrame = 173; + break; + + case 1: + case 22: + case 49: + case 7: + case 13: + case 33: + case 61: + switch (_brieStatus) { + case 0: + random = _vm->getRandomNumber(1, 4); + _brieStatus = 2; + break; + + case 1: + random = 5; + break; + + case 3: + random = 6; + break; + + case 4: + random = 7; + break; + + default: + random = 8; + break; + } + + switch (random) { + case 1: + resetFrame = 1; + _brieStatus = 2; + break; + + case 2: + resetFrame = 7; + _brieStatus = 2; + break; + + case 3: + resetFrame = 22; + _brieStatus = 2; + break; + + case 4: + resetFrame = 49; + _brieStatus = 2; + break; + + case 5: + resetFrame = 13; + _brieStatus = 2; + break; + + case 6: + resetFrame = 61; + break; + + default: + resetFrame = 0; + break; + } + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame); + _brieFrame = resetFrame; + } +} + +void Scene204::handleFlorAnimation() { + if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _florFrame) + return; + + _florFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame(); + int resetFrame = -1; + int random; + + switch (_florFrame) { + case 80: + _scene->setAnimFrame(_globals._animationIndexes[2], 1); + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[2], SYNC_ANIM, _globals._animationIndexes[1]); + _raoulStatus = 1; + break; + + case 86: + _vm->_gameConv->release(); + break; + + case 173: + resetFrame = 172; + break; + + case 1: + case 2: + case 3: + if (_raoulDown) { + random = _vm->getRandomNumber(1, 1000); + if (random < 300) + resetFrame = 0; + else if (random < 600) + resetFrame = 1; + else + resetFrame = 2; + } + break; + + case 21: + case 180: + _vm->_gameConv->release(); + break; + + case 22: + case 50: + case 30: + case 174: + case 175: + case 176: + case 181: + switch (_florStatus) { + case 0: + random = 1; + _florStatus = 2; + break; + + case 1: + random = 2; + _florStatus = 2; + break; + + case 3: + random = 3; + break; + + case 5: + random = 4; + _florStatus = 2; + break; + + case 4: + random = _vm->getRandomNumber(5, 7); + ++_raoulCount; + if (_raoulCount > 17) { + _florStatus = 2; + random = 8; + } + break; + + default: + random = 7; + break; + } + + switch (random) { + case 1: + resetFrame = 22; + break; + + case 2: + resetFrame = 30; + break; + + case 3: + resetFrame = 53; + break; + + case 4: + resetFrame = 176; + break; + + case 5: + resetFrame = 173; + break; + + case 6: + resetFrame = 174; + break; + + case 7: + resetFrame = 175; + break; + + default: + resetFrame = 21; + break; + } + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[1], resetFrame); + _florFrame = resetFrame; + } +} + +void Scene204::handleRaoulAnimation() { + if (_scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame() == _raoulFrame) + return; + + _raoulFrame = _scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame(); + int resetFrame = -1; + int random; + + switch (_raoulFrame) { + case 1: + if (_raoulStatus == 4) + resetFrame = 0; + + break; + + case 10: + case 14: + case 20: + case 258: + switch (_raoulStatus) { + case 0: + random = _vm->getRandomNumber(1, 2); + _raoulStatus = 1; + break; + + case 2: + random = 3; + break; + + case 5: + random = 4; + break; + + default: + random = 5; + break; + } + + switch (random) { + case 1: + resetFrame = 10; + _raoulStatus = 1; + break; + + case 2: + resetFrame = 14; + _raoulStatus = 1; + break; + + case 3: + resetFrame = 20; + break; + + case 4: + resetFrame = 253; + _raoulStatus = 1; + break; + + default: + resetFrame = 9; + break; + } + break; + + case 31: + if (_raoulStatus == 3) + resetFrame = 33; + else + resetFrame = 30; + + break; + + case 33: + resetFrame = 32; + break; + + case 114: + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _game._objects.addToInventory(OBJ_BOOK); + break; + + case 213: + _game._player._stepEnabled = true; + _vm->_dialogs->showItem(OBJ_BOOK, 20431, 0); + _game._player._stepEnabled = false; + break; + + case 229: + _game._player._stepEnabled = true; + _vm->_dialogs->showItem(OBJ_BOOK, 20432, 0); + _game._player._stepEnabled = false; + break; + + case 237: + _scene->freeAnimation(_globals._animationIndexes[1]); + _scene->freeAnimation(_globals._animationIndexes[0]); + _anim0ActvFl = false; + _anim1ActvFl = false; + _anim3ActvFl = true; + _globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('e', 1), 0); + _scene->loadSpeech(9); + break; + + case 253: + resetFrame = 244; + break; + + case 257: + _vm->_gameConv->release(); + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[2], resetFrame); + _raoulFrame = resetFrame; + } +} + +void Scene204::handleEndAnimation() { + if ((_scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame() == 15) && !_skip3Fl) { + _scene->playSpeech(9); + _skip3Fl = true; + } + + if ((_scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame() == 26) && !_skip2Fl) { + _scene->_sequences.addTimer(300, 85); + _scene->_kernelMessages.add(Common::Point(123, 137), 0x1110, 0, 0, 360, _game.getQuote(0x75)); + _skip2Fl = true; + } + + if (_scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame() == 27) + _scene->setAnimFrame(_globals._animationIndexes[3], 12); +} + +/*------------------------------------------------------------------------*/ + +Scene205::Scene205(MADSEngine *vm) : Scene2xx(vm) { + _anim0ActvFl = false; + _anim1ActvFl = false; + _noConversationHold = false; + _giveTicketFl = false; + + _richardFrame = -1; + _richardStatus = -1; + _richardCount = -1; + _giryFrame = -1; + _giryStatus = -1; + _giryCount = -1; + _conversationCounter = -1; + _lastRandom = -1; +} + +void Scene205::synchronize(Common::Serializer &s) { + Scene2xx::synchronize(s); + + s.syncAsByte(_anim0ActvFl); + s.syncAsByte(_anim1ActvFl); + s.syncAsByte(_noConversationHold); + s.syncAsByte(_giveTicketFl); + + s.syncAsSint16LE(_richardFrame); + s.syncAsSint16LE(_richardStatus); + s.syncAsSint16LE(_richardCount); + s.syncAsSint16LE(_giryFrame); + s.syncAsSint16LE(_giryStatus); + s.syncAsSint16LE(_giryCount); + s.syncAsSint16LE(_conversationCounter); + s.syncAsSint16LE(_lastRandom); +} + +void Scene205::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + if (_globals[kCurrentYear] != 1881) + return; + + if (_globals[kJacquesStatus] == 1) + _scene->_variant = 3; + else if (_globals[kJacquesStatus] == 0) { + if (_globals[kMadameGiryLocation] == 0) + _scene->_variant = 2; + else if (_globals[kMadameGiryLocation] == 1) + _scene->_variant = 1; + } +} + +void Scene205::enter() { + _vm->_disableFastwalk = true; + + if (_globals[kJacquesStatus] != 1) { + _scene->_rails.disableNode(6); + _scene->_rails.disableNode(7); + _scene->_rails.disableNode(8); + _scene->_rails.disableNode(9); + } + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _lastRandom = -1; + _anim0ActvFl = false; + _anim1ActvFl = false; + } + + _conversationCounter = 0; + _noConversationHold = false; + _giveTicketFl = false; + + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('f', 0)); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 1)); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RDR_9"); + + _scene->_hotspots.activate(NOUN_MONSIEUR_RICHARD, false); + _scene->_hotspots.activate(NOUN_MADAME_GIRY, false); + _scene->_hotspots.activate(NOUN_WOMAN, false); + + _vm->_gameConv->get(18); + _vm->_gameConv->get(10); + _vm->_gameConv->get(11); + + if (_globals[kCurrentYear] == 1881) { + if ((_globals[kMadameGiryShowsUp]) && (_globals[kJacquesStatus] == 0)) { + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('g', 1), 1); + _anim1ActvFl = true; + _giryStatus = 2; + + int idx = _scene->_dynamicHotspots.add(NOUN_MADAME_GIRY, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots[idx]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(idx, Common::Point(75, 84), FACING_NORTHWEST); + _scene->setDynamicAnim(idx, _globals._animationIndexes[1], 1); + _scene->setDynamicAnim(idx, _globals._animationIndexes[1], 2); + + switch (_globals[kMadameGiryLocation]) { + case 0: + _scene->setAnimFrame(_globals._animationIndexes[1], 138); + _scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(62, 54)); + _scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(62, 66)); + break; + + case 1: + if (_globals[kMadameNameIsKnown] >= 1) { + _scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(113, 44)); + _scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(107, 66)); + } else + _scene->_hotspots.activate(NOUN_WOMAN, true); + + break; + + case 2: + _scene->setAnimFrame(_globals._animationIndexes[1], 273); + _scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(283, 51)); + _scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(289, 62)); + break; + + default: + break; + } + } + + if (_scene->_priorSceneId == RETURNING_FROM_LOADING) { + if (_vm->_gameConv->_restoreRunning == 10) { + int count = 0; + + if (_game._objects.isInInventory(OBJ_RED_FRAME)) + ++count; + if (_game._objects.isInInventory(OBJ_GREEN_FRAME)) + ++count; + if (_game._objects.isInInventory(OBJ_YELLOW_FRAME)) + ++count; + if (_game._objects.isInInventory(OBJ_BLUE_FRAME)) + ++count; + + _vm->_gameConv->run(10); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + _vm->_gameConv->exportValue(_game._difficulty); + + if (count > 2) + _vm->_gameConv->exportValue(1); + else + _vm->_gameConv->exportValue(0); + + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + _noConversationHold = true; + + if (_giryStatus == 4) + _scene->setAnimFrame(_globals._animationIndexes[1], 66); + else + _giryStatus = 2; + } else if (_vm->_gameConv->_restoreRunning == 11) { + _vm->_gameConv->run(11); + _vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_TICKET)); + _vm->_gameConv->exportValue(0); + _vm->_gameConv->exportValue(0); + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + } + } + } + + if (_scene->_priorSceneId == RETURNING_FROM_LOADING) { + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + + if (_globals[kJacquesStatus] == 1) { + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 9), 1); + _anim0ActvFl = true; + _richardStatus = 3; + _scene->_hotspots.activate(NOUN_MONSIEUR_RICHARD, true); + + if (_vm->_gameConv->_restoreRunning == 18) { + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + _richardStatus = 3; + _vm->_gameConv->run(18); + _scene->setAnimFrame(_globals._animationIndexes[0], 1); + } + } + } + + if (_scene->_priorSceneId == 206) { + _game._player._playerPos = Common::Point(37, 64); + _game._player._facing = FACING_SOUTH; + _game._player.walk(Common::Point(41, 67), FACING_SOUTH); + _game._player.setWalkTrigger(90); + _game._player._stepEnabled = false; + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + if (_globals[kJacquesStatus] == 1) { + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 9), 1); + _anim0ActvFl = true; + _richardStatus = 3; + _scene->_hotspots.activate(NOUN_MONSIEUR_RICHARD, true); + } + } else if (_scene->_priorSceneId == 207) { + _game._player._playerPos = Common::Point(263, 59); + _game._player._facing = FACING_SOUTH; + _game._player.walk(Common::Point(262, 63), FACING_SOUTH); + _game._player.setWalkTrigger(95); + _game._player._stepEnabled = false; + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + } else if (_scene->_priorSceneId == 150) { + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 9), 1); + _anim0ActvFl = true; + _richardStatus = 3; + _game._player._playerPos = Common::Point(132, 112); + _game._player._facing = FACING_NORTHWEST; + _globals[kDoorsIn205] = 1; + _globals[kTicketPeoplePresent] = 0; + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1); + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _scene->_hotspots.activate(NOUN_MONSIEUR_RICHARD, true); + _vm->_gameConv->run(18); + } else if ((_scene->_priorSceneId == 202) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + if (_globals[kJacquesStatus] == 1) { + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 9), 1); + _anim0ActvFl = true; + _richardStatus = 3; + _scene->_hotspots.activate(NOUN_MONSIEUR_RICHARD, true); + } + + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + + _game._player.firstWalk(Common::Point(-20, 144), FACING_EAST, Common::Point(19, 144), FACING_NORTHEAST, true); + } + + sceneEntrySound(); +} + +void Scene205::step() { + if (_anim0ActvFl) + handleRichardAnimation(); + + if (_anim1ActvFl) + handleGiryAnimation(); + + if ((_globals[kWalkerConverse] == 2) || (_globals[kWalkerConverse] == 3)) { + ++_conversationCounter; + if (_conversationCounter > 200) + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + } + + if (_giveTicketFl && !_action.isAction(VERB_GIVE)) { + _globals[kWalkerConverse] = 0; + _game._player.walk(Common::Point(_game._player._playerPos.x + 5, _game._player._playerPos.y - 10), FACING_NORTHWEST); + _game._player.setWalkTrigger(100); + _giveTicketFl = false; + } + + switch (_game._trigger) { + case 100: + _game._player._visible = false; + _globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 102); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 4, 101); + break; + + case 101: + _game._objects.setRoom(OBJ_TICKET, NOWHERE); + _giryStatus = 2; + break; + + case 102: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[2]); + _game._player._visible = true; + _game._player._stepEnabled = true; + _vm->_gameConv->release(); + break; + + default: + break; + } + + switch (_game._trigger) { + case 90: + _scene->deleteSequence(_globals._sequenceIndexes[0]); + _globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 91); + break; + + case 91: + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _vm->_sound->command(25); + _game._player._stepEnabled = true; + break; + + case 95: + _scene->deleteSequence(_globals._sequenceIndexes[1]); + _globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 96); + break; + + case 96: + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + _vm->_sound->command(25); + _game._player._stepEnabled = true; + break; + + default: + break; + } +} + +void Scene205::actions() { + if (_vm->_gameConv->_running == 18) { + handleConversation18(); + _action._inProgress = false; + return; + } + + if (_vm->_gameConv->_running == 10) { + handleConversation10(); + _action._inProgress = false; + return; + } + + if (_vm->_gameConv->_running == 11) { + handleConversation11(); + _action._inProgress = false; + return; + } + + if ((_action.isAction(VERB_OPEN, NOUN_BOX_FIVE)) || (_action.isAction(VERB_ENTER, NOUN_BOX_FIVE))) { + if (_globals[kTicketPeoplePresent] == 2) { + if (_globals[kMadameGiryLocation] == 2) { + _vm->_gameConv->run(11); + _vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_TICKET)); + _vm->_gameConv->exportValue(3); + _vm->_gameConv->exportValue(0); + } else { + _vm->_gameConv->run(11); + _vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_TICKET)); + _vm->_gameConv->exportValue(4); + _vm->_gameConv->exportValue(0); + } + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_WALK_DOWN_STAIRS_TO, NOUN_GRAND_FOYER)) { + if (_globals[kTicketPeoplePresent] == 2) { + if (_globals[kMadameGiryLocation] == 2) { + _vm->_gameConv->run(11); + _vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_TICKET)); + _vm->_gameConv->exportValue(1); + _vm->_gameConv->exportValue(0); + } else { + _vm->_gameConv->run(11); + _vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_TICKET)); + _vm->_gameConv->exportValue(2); + _vm->_gameConv->exportValue(0); + } + _action._inProgress = false; + return; + } + } + + if ((_action.isAction(VERB_ENTER)) || (_action.isAction(VERB_OPEN)) || _action.isAction(VERB_UNLOCK) || _action.isAction(VERB_LOCK)) { + if (((_action.isObject(NOUN_BOX_FIVE) && ((_globals[kDoorsIn205] == 0) || (_globals[kDoorsIn205] == 2))) + || _action.isAction(VERB_UNLOCK) || _action.isAction(VERB_LOCK)) + || ((_action.isObject(NOUN_BOX_NINE) && ((_globals[kDoorsIn205] == 0) || (_globals[kDoorsIn205] == 1)))) + || (_action.isObject(NOUN_BOX_SIX)) || (_action.isObject(NOUN_BOX_SEVEN)) || (_action.isObject(NOUN_BOX_EIGHT))) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 1); + _action._inProgress = false; + return; + + case 1: { + int idx = _globals._sequenceIndexes[2]; + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 4); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[2], SYNC_SEQ, idx); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], false); + _vm->_sound->command(72); + _scene->_sequences.addTimer(15, 2); + _action._inProgress = false; + return; + } + + case 2: + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], false); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 3); + _action._inProgress = false; + return; + + case 3: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[2]); + _game._player._visible = true; + _game._player._stepEnabled = true; + if (_action.isAction(VERB_UNLOCK) || _action.isAction(VERB_LOCK)) + _vm->_dialogs->show(20528); + else + _vm->_dialogs->show(20527); + + _action._inProgress = false; + return; + + default: + break; + } + } else if (((_action.isObject(NOUN_BOX_FIVE)) && ((_globals[kDoorsIn205] == 3) || (_globals[kDoorsIn205] == 1))) + || ((_action.isObject(NOUN_BOX_NINE)) && ((_globals[kDoorsIn205] == 3) || (_globals[kDoorsIn205] == 2)))) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], false, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[2], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 4, 80); + _action._inProgress = false; + return; + + case 80: + _vm->_sound->command(24); + if (_action.isObject(NOUN_BOX_FIVE)) { + _scene->deleteSequence(_globals._sequenceIndexes[0]); + _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 81); + } else if (_action.isObject(NOUN_BOX_NINE)) { + _scene->deleteSequence(_globals._sequenceIndexes[1]); + _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 81); + } + _action._inProgress = false; + return; + + case 81: + if (_action.isObject(NOUN_BOX_FIVE)) { + int idx = _globals._sequenceIndexes[0]; + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -2); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[0], SYNC_SEQ, idx); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + } else if (_action.isObject(NOUN_BOX_NINE)) { + int idx = _globals._sequenceIndexes[1]; + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -2); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[1], SYNC_SEQ, idx); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + } + _action._inProgress = false; + return; + + case 2: + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[2]); + if (_action.isObject(NOUN_BOX_FIVE)) { + _game._player.walk(Common::Point(37, 64), FACING_NORTH); + _game._player.setWalkTrigger(3); + + } else if (_action.isObject(NOUN_BOX_NINE)) { + _game._player.walk(Common::Point(263, 59), FACING_NORTH); + _game._player.setWalkTrigger(3); + } + _action._inProgress = false; + return; + + case 3: + if (_action.isObject(NOUN_BOX_FIVE)) { + _scene->_nextSceneId = 206; + _globals[kMadameGiryLocation] = 1; + } else if (_action.isObject(NOUN_BOX_NINE)) { + _scene->_nextSceneId = 207; + _globals[kMadameGiryLocation] = 1; + } + _action._inProgress = false; + return; + + default: + break; + } + } + } + + if (_action.isAction(VERB_TALK_TO, NOUN_MONSIEUR_RICHARD)) { + _vm->_gameConv->run(18); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TALK_TO, NOUN_MADAME_GIRY) || _action.isAction(VERB_TALK_TO, NOUN_WOMAN) || _action.isAction(VERB_GIVE, NOUN_TICKET, NOUN_MADAME_GIRY)) { + if (_globals[kTicketPeoplePresent] == 2) { + if ((_globals[kDoorsIn205] == 2) || (_globals[kDoorsIn205] == 3)) { + if (_globals[kMadameGiryLocation] == 2) { + _vm->_gameConv->run(11); + _vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_TICKET)); + _vm->_gameConv->exportValue(1); + + if (_action.isAction(VERB_GIVE)) + _vm->_gameConv->exportValue(1); + else + _vm->_gameConv->exportValue(0); + } else { + _vm->_gameConv->run(11); + _vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_TICKET)); + _vm->_gameConv->exportValue(2); + + if (_action.isAction(VERB_GIVE)) + _vm->_gameConv->exportValue(1); + else + _vm->_gameConv->exportValue(0); + } + } else { + _vm->_gameConv->run(11); + _vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_TICKET)); + _vm->_gameConv->exportValue(0); + + if (_action.isAction(VERB_GIVE)) + _vm->_gameConv->exportValue(1); + else + _vm->_gameConv->exportValue(0); + } + } else { + int count = 0; + + if (_game._objects.isInInventory(OBJ_RED_FRAME)) + ++count; + if (_game._objects.isInInventory(OBJ_GREEN_FRAME)) + ++count; + if (_game._objects.isInInventory(OBJ_YELLOW_FRAME)) + ++count; + if (_game._objects.isInInventory(OBJ_BLUE_FRAME)) + ++count; + + _vm->_gameConv->run(10); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + _vm->_gameConv->exportValue(_game._difficulty); + + if (count > 2) + _vm->_gameConv->exportValue(1); + else + _vm->_gameConv->exportValue(0); + + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + } + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(20510); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_BOX_SIX)) { + _vm->_dialogs->show(20511); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BOX_SEVEN)) { + _vm->_dialogs->show(20512); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BOX_EIGHT)) { + _vm->_dialogs->show(20513); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BOX_NINE)) { + if ((_globals[kDoorsIn205] == 0) || (_globals[kDoorsIn205] == 1)) + _vm->_dialogs->show(20516); + else + _vm->_dialogs->show(20517); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BOX_FIVE)) { + if ((_globals[kDoorsIn205] == 0) || (_globals[kDoorsIn205] == 2)) + _vm->_dialogs->show(20514); + else + _vm->_dialogs->show(20515); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(20518); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MARBLE_COLUMN)) { + _vm->_dialogs->show(20519); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CEILING)) { + _vm->_dialogs->show(20520); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(20521); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BUST)) { + _vm->_dialogs->show(20522); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CARPET)) { + _vm->_dialogs->show(20523); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GRAND_FOYER)) { + _vm->_dialogs->show(20524); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WOMAN) || _action.isObject(NOUN_MADAME_GIRY)) { + _vm->_dialogs->show(20525); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MONSIEUR_RICHARD)) { + _vm->_dialogs->show(20526); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TALK_TO, NOUN_BUST)) { + _vm->_dialogs->show(20529); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_OPEN, NOUN_BOX_TEN) || _action.isAction(VERB_ENTER, NOUN_BOX_TEN) || _action.isAction(VERB_LOOK, NOUN_BOX_TEN)) { + _vm->_dialogs->show(20513); + _action._inProgress = false; + return; + } + + // FIX: the original was doing a | between the two 'objects' + if (_action.isAction(VERB_TAKE) && (_action.isObject(NOUN_WOMAN) || _action.isObject(NOUN_MADAME_GIRY))) { + _vm->_dialogs->show(20530); + _action._inProgress = false; + return; + } +} + +void Scene205::preActions() { + if (_action.isObject(NOUN_BOX_FIVE) && (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK) || _action.isAction(VERB_OPEN))) + _game._player.walk(Common::Point(37, 67), FACING_NORTHEAST); + + if (_action.isObject(NOUN_BOX_SIX) && (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK) || _action.isAction(VERB_OPEN))) + _game._player.walk(Common::Point(80, 68), FACING_NORTHEAST); + + if (_action.isObject(NOUN_BOX_SEVEN) && (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK) || _action.isAction(VERB_OPEN))) + _game._player.walk(Common::Point(167, 65), FACING_NORTHEAST); + + if (_action.isObject(NOUN_BOX_EIGHT) && (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK) || _action.isAction(VERB_OPEN))) + _game._player.walk(Common::Point(212, 64), FACING_NORTHEAST); + + if (_action.isObject(NOUN_BOX_NINE) && (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK) || _action.isAction(VERB_OPEN))) + _game._player.walk(Common::Point(258, 63), FACING_NORTHEAST); + + if (_action.isAction(VERB_WALK_DOWN_STAIRS_TO, NOUN_GRAND_FOYER) && (_globals[kDoorsIn205] != 2) && (_globals[kDoorsIn205] != 3)) { + _game._player._walkOffScreenSceneId = 202; + _globals[kMadameGiryLocation] = 1; + } +} + +void Scene205::handleConversation18() { + int interlocutorFl = false; + int heroFl = false; + + switch (_action._activeAction._verbId) { + case 0: + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + _richardStatus = 0; + break; + + case 3: + case 4: + _vm->_gameConv->setHeroTrigger(64); + _globals[kRanConvIn205] = true; + heroFl = true; + interlocutorFl = true; + break; + + default: + break; + } + + switch (_game._trigger) { + case 64: + _globals[kWalkerConverse] = 0; + heroFl = true; + interlocutorFl = true; + break; + + case 62: + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + _richardStatus = 0; + break; + + case 60: + _globals[kWalkerConverse] = _vm->getRandomNumber(2, 3); + _richardStatus = 3; + _conversationCounter = 0; + break; + + default: + break; + } + + if (!heroFl) + _vm->_gameConv->setHeroTrigger(60); + + if (!interlocutorFl) + _vm->_gameConv->setInterlocutorTrigger(62); + + _richardCount = 0; +} + +void Scene205::handleConversation10() { + int interlocutorFl = false; + int heroFl = false; + + switch (_action._activeAction._verbId) { + case 9: + _vm->_gameConv->setInterlocutorTrigger(68); + interlocutorFl = true; + _globals[kMadameNameIsKnown] = 1; + _scene->_hotspots.activate(NOUN_WOMAN, false); + _scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(113, 44)); + _scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(107, 66)); + break; + + case 10: + _globals[kMadameNameIsKnown] = 1; + _scene->_hotspots.activate(NOUN_WOMAN, false); + _scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(113, 44)); + _scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(107, 66)); + break; + + case 7: + if (!_game._trigger) { + _giryStatus = 6; + _globals[kMadameNameIsKnown] = 2; + _globals[kMadameGiryLocation] = 0; + _scene->changeVariant(2); + _scene->_rails.disableNode(6); + _scene->_rails.disableNode(7); + _scene->_rails.disableNode(8); + _scene->_rails.disableNode(9); + _scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, false, Common::Point(113, 44)); + _scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, false, Common::Point(107, 66)); + interlocutorFl = true; + heroFl = true; + if (_globals[kDoorsIn205] == 0) + _globals[kDoorsIn205] = 1; + else if (_globals[kDoorsIn205] == 2) + _globals[kDoorsIn205] = 3; + } + break; + + case 13: + case 45: + _vm->_gameConv->setInterlocutorTrigger(70); + interlocutorFl = true; + break; + + case 21: + if (!_game._trigger && !_noConversationHold) { + _vm->_gameConv->hold(); + _giryStatus = 4; + } else + _noConversationHold = false; + + break; + + case 17: + _vm->_gameConv->setInterlocutorTrigger(72); + interlocutorFl = true; + break; + + case 11: + if (!_game._trigger) { + _vm->_gameConv->setInterlocutorTrigger(74); + } + heroFl = true; + interlocutorFl = true; + break; + + case 23: + case 25: + if ((!_game._trigger) && (_giryStatus == 4)) { + _vm->_gameConv->hold(); + _giryStatus = 0; + } + break; + + case 4: + case 5: + case 8: + case 14: + case 16: + case 19: + case 40: + case 46: + _vm->_gameConv->setInterlocutorTrigger(64); + interlocutorFl = true; + break; + + default: + break; + } + + switch (_game._trigger) { + case 64: + switch (_action._activeAction._verbId) { + case 5: + case 14: + case 16: + case 19: + case 40: + case 46: + _giryStatus = 0; + break; + } + _globals[kWalkerConverse] = 0; + heroFl = true; + interlocutorFl = true; + break; + + case 68: + _giryStatus = 5; + break; + + case 74: + _giryStatus = 8; + _globals[kWalkerConverse] = 0; + heroFl = true; + interlocutorFl = true; + break; + + case 72: + _giryStatus = 3; + break; + + case 70: + if (_action._activeAction._verbId == 13) { + _globals[kWalkerConverse] = 0; + heroFl = true; + interlocutorFl = true; + } + _giryStatus = 1; + break; + + case 66: + if (_globals[kWalkerConverse] != 0) + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + + if ((_giryStatus != 4) && (_giryStatus != 6) && (_giryStatus != 7)) + _giryStatus = 0; + break; + + case 60: + if (_globals[kWalkerConverse] != 0) + _globals[kWalkerConverse] = _vm->getRandomNumber(2, 3); + + if ((_giryStatus != 4) && (_giryStatus != 6) && (_giryStatus != 7)) + _giryStatus = 2; + + _conversationCounter = 0; + break; + } + + if (!heroFl) + _vm->_gameConv->setHeroTrigger(60); + + if (!interlocutorFl) + _vm->_gameConv->setInterlocutorTrigger(66); + + _giryCount = 0; +} + +void Scene205::handleConversation11() { + int interlocutorFl = false; + int heroFl = false; + + switch (_action._activeAction._verbId) { + case 5: + if (!_game._trigger) { + _vm->_gameConv->hold(); + _giryStatus = 9; + } + break; + + case 8: + if (!_game._trigger) { + _vm->_gameConv->hold(); + _giryStatus = 7; + _vm->_gameConv->setInterlocutorTrigger(64); + _game._player.walk(Common::Point(225,79), FACING_NORTHEAST); + interlocutorFl = true; + _globals[kMadameGiryLocation] = 2; + _scene->changeVariant(4); + _scene->_rails.disableNode(6); + _scene->_rails.disableNode(7); + _scene->_rails.disableNode(8); + _scene->_rails.disableNode(9); + _scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, false, Common::Point(113, 44)); + _scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, false, Common::Point(107, 66)); + if (_globals[kDoorsIn205] == 0) + _globals[kDoorsIn205] = 2; + else if (_globals[kDoorsIn205] == 1) + _globals[kDoorsIn205] = 3; + } + break; + + case 9: + case 10: + case 12: + case 13: + case 14: + _vm->_gameConv->setInterlocutorTrigger(64); + interlocutorFl = true; + break; + } + + switch (_game._trigger) { + case 64: + switch (_action._activeAction._verbId) { + case 6: + case 10: + case 12: + case 13: + case 14: + _giryStatus = 0; + break; + } + _globals[kWalkerConverse] = 0; + heroFl = true; + interlocutorFl = true; + break; + + case 110: + _vm->_gameConv->hold(); + _giryStatus = 7; + break; + + case 66: + if (_globals[kWalkerConverse] != 0) + _globals[kWalkerConverse] = _vm->getRandomNumber(1, 4); + + if (_giryStatus != 9) + _giryStatus = 0; + break; + + case 60: + if (_globals[kWalkerConverse] != 0) + _globals[kWalkerConverse] = _vm->getRandomNumber(2, 3); + + if (_giryStatus != 9) + _giryStatus = 2; + + _conversationCounter = 0; + break; + } + + if (!heroFl) + _vm->_gameConv->setHeroTrigger(60); + + if (!interlocutorFl) + _vm->_gameConv->setInterlocutorTrigger(66); + + _giryCount = 0; +} + +void Scene205::handleRichardAnimation() { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _richardFrame) + return; + + _richardFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + int random; + int resetFrame = -1; + + switch (_richardFrame) { + case 1: + case 2: + case 3: + case 11: + case 19: + case 35: + case 47: + case 57: + case 69: + switch (_richardStatus) { + case 0: + random = _vm->getRandomNumber(1, 3); + ++_richardCount; + if (_richardCount > 30) { + _richardStatus = 3; + random = 9; + } + break; + + case 1: + random = 4; + _richardStatus = 0; + break; + + case 2: + random = 6; + break; + + case 4: + random = 5; + _richardStatus = 0; + break; + + default: + random = _vm->getRandomNumber(7, 50); + while (_lastRandom == random) + random = _vm->getRandomNumber(7, 50); + + _lastRandom = random; + break; + } + + switch (random) { + case 1: + resetFrame = 0; + break; + + case 2: + resetFrame = 1; + break; + + case 3: + resetFrame = 2; + break; + + case 4: + resetFrame = 11; + break; + + case 5: + resetFrame = 3; + break; + + case 6: + resetFrame = 57; + break; + + case 7: + resetFrame = 23; + break; + + case 8: + resetFrame = 19; + break; + + case 9: + resetFrame = 21; + break; + + case 10: + resetFrame = 25; + break; + + case 11: + resetFrame = 35; + break; + + case 12: + resetFrame = 47; + break; + + default: + resetFrame = 0; + break; + } + break; + + case 30: + switch (_richardStatus) { + case 0: + case 1: + case 2: + case 4: + random = 1; + break; + + default: + random = _vm->getRandomNumber(1, 50); + break; + } + + if (random == 1) + resetFrame = 30; + else + resetFrame = 29; + + break; + + case 24: + switch (_richardStatus) { + case 1: + case 2: + case 4: + case 0: + random = 1; + break; + + default: + random = _vm->getRandomNumber(1, 30); + break; + } + + if (random == 1) + resetFrame = 0; + else + resetFrame = 23; + + break; + + case 20: + switch (_richardStatus) { + case 1: + case 2: + case 4: + case 0: + random = 1; + break; + + default: + random = _vm->getRandomNumber(1, 50); + break; + } + + if (random == 1) + resetFrame = 0; + else + resetFrame = 19; + + break; + + case 22: + switch (_richardStatus) { + case 1: + case 2: + case 4: + case 0: + random = 1; + break; + + default: + random = _vm->getRandomNumber(1, 50); + break; + } + + if (random == 1) + resetFrame = 0; + else + resetFrame = 21; + + break; + + case 41: + switch (_richardStatus) { + case 1: + case 2: + case 4: + case 0: + random = 1; + break; + + default: + random = _vm->getRandomNumber(1, 50); + break; + } + + if (random == 1) + resetFrame = 41; + else + resetFrame = 40; + + break; + + case 52: + switch (_richardStatus) { + case 0: + case 1: + case 2: + case 4: + random = 1; + break; + + default: + random = _vm->getRandomNumber(1, 50); + break; + } + + if (random == 1) + resetFrame = 52; + else + resetFrame = 51; + + break; + + case 65: + switch (_richardStatus) { + case 0: + case 1: + case 2: + case 4: + random = 1; + break; + + default: + random = _vm->getRandomNumber(1, 50); + break; + } + + if (random == 1) + resetFrame = 65; + else + resetFrame = 64; + + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame); + _richardFrame = resetFrame; + } +} + +void Scene205::handleGiryAnimation() { + if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _giryFrame) + return; + + _giryFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame(); + int random; + int resetFrame = -1; + + switch (_giryFrame) { + case 77: + _vm->_gameConv->release(); + break; + + case 1: + case 2: + case 3: + case 44: + case 14: + case 21: + case 35: + case 56: + case 78: + case 284: + switch (_giryStatus) { + case 0: + random = _vm->getRandomNumber(1, 3); + ++_giryCount; + if (_giryCount > 30) { + _giryStatus = 2; + random = 100; + } + break; + + case 8: + random = 4; + _giryStatus = 0; + break; + + case 3: + random = 5; + _giryStatus = 0; + break; + + case 1: + random = 6; + break; + + case 5: + _giryStatus = 0; + random = 7; + break; + + case 4: + random = 8; + break; + + case 6: + random = 9; + _giryStatus = 2; + break; + + case 7: + random = 10; + _giryStatus = 2; + break; + + case 9: + random = 11; + break; + + default: + random = _vm->getRandomNumber(12, 100); + break; + } + + switch (random) { + case 1: + resetFrame = 0; + break; + + case 2: + resetFrame = 1; + break; + + case 3: + resetFrame = 2; + break; + + case 4: + resetFrame = 3; + break; + + case 5: + resetFrame = 16; + break; + + case 6: + resetFrame = 21; + break; + + case 7: + resetFrame = 44; + break; + + case 8: + resetFrame = 56; + break; + + case 9: + resetFrame = 78; + _vm->_gameConv->hold(); + break; + + case 10: + resetFrame = 140; + break; + + case 11: + resetFrame = 276; + break; + + case 12: + resetFrame = 35; + break; + + default: + resetFrame = 0; + break; + } + break; + + case 27: + case 28: + case 29: + switch (_giryStatus) { + case 0: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + random = 4; + break; + + default: + random = _vm->getRandomNumber(1, 3); + ++_giryCount; + if (_giryCount > 30) { + _giryStatus = 2; + random = 100; + } + break; + } + + switch (random) { + case 1: + resetFrame = 26; + break; + + case 2: + resetFrame = 27; + break; + + case 3: + resetFrame = 28; + break; + + default: + resetFrame = 29; + break; + } + break; + + case 265: + _scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(283, 51)); + _scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(289, 62)); + _vm->_gameConv->release(); + break; + + case 274: + case 275: + case 276: + if (_giryStatus == 0) { + random = _vm->getRandomNumber(1, 3); + ++_giryCount; + if (_giryCount > 30) { + _giryStatus = 2; + random = 100; + } + } else + random = 100; + + switch (random) { + case 1: + resetFrame = 273; + break; + + case 2: + resetFrame = 274; + break; + + case 3: + resetFrame = 275; + break; + + default: + resetFrame = 273; + break; + } + break; + + case 85: + _vm->_gameConv->release(); + break; + + case 110: + _scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(62, 54)); + _scene->_hotspots.activateAtPos(NOUN_MADAME_GIRY, true, Common::Point(62, 66)); + break; + + case 138: + case 139: + case 140: + switch (_giryStatus) { + case 0: + case 1: + random = _vm->getRandomNumber(1, 3); + ++_giryCount; + if (_giryCount > 30) { + _giryStatus = 2; + random = 100; + } + break; + + default: + random = 100; + break; + } + + switch (random) { + case 1: + resetFrame = 137; + break; + + case 2: + resetFrame = 138; + break; + + case 3: + resetFrame = 139; + break; + + default: + resetFrame = 137; + break; + } + break; + + case 66: + _vm->_gameConv->release(); + break; + + case 67: + switch (_giryStatus) { + case 0: + case 9: + case 2: + case 3: + case 5: + case 6: + case 7: + case 8: + random = 1; + break; + + default: + random = 100; + break; + } + + if (random == 1) + resetFrame = 67; + else + resetFrame = 66; + + break; + + case 8: + case 9: + switch (_giryStatus) { + case 0: + case 9: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + random = 1; + break; + + default: + random = 100; + break; + } + + if (random == 1) + resetFrame = 9; + else + resetFrame = 8; + + break; + + case 280: + _giveTicketFl = true; + break; + + case 281: + switch (_giryStatus) { + case 0: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + random = 1; + break; + + default: + random = 100; + break; + } + + if (random == 1) + resetFrame = 281; + else + resetFrame = 280; + + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[1], resetFrame); + _giryFrame = resetFrame; + } +} + +/*------------------------------------------------------------------------*/ + +Scene206::Scene206(MADSEngine *vm) : Scene2xx(vm) { + _anim0ActvFl = false; + _skip1Fl = false; + _skip2Fl = false; +} + +void Scene206::synchronize(Common::Serializer &s) { + Scene2xx::synchronize(s); + + s.syncAsByte(_anim0ActvFl); + s.syncAsByte(_skip1Fl); + s.syncAsByte(_skip2Fl); +} + +void Scene206::setup() { + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene206::enter() { + _anim0ActvFl = false; + _skip1Fl = false; + _skip2Fl = false; + + _scene->loadSpeech(1); + _vm->_gameConv->get(26); + + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1)); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2)); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3)); + _globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RDR_9"); + + if (_scene->_priorSceneId != 308) { + if (_globals[kPanelIn206] == 0) { + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + } else { + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 3); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 13); + } + } + + if (_globals[kPanelIn206] == 0) { + _scene->_hotspots.activate(NOUN_PANEL, false); + _scene->_hotspots.activate(NOUN_KEYHOLE, false); + } + + if (_game._objects.isInRoom(OBJ_CRUMPLED_NOTE)) { + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('p', 0)); + _globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 10); + } else + _scene->_hotspots.activate(NOUN_CRUMPLED_NOTE, false); + + if (_globals[kTrapDoorStatus] == 0) { + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + } + + if (_globals[kRightDoorIsOpen504] && !_globals[kKnockedOverHead]) { + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('h', 1), 88); + _game._player._visible = false; + _game._player._stepEnabled = false; + _anim0ActvFl = true; + } else if (_scene->_priorSceneId == 308) { + _game._player._playerPos = Common::Point(67, 127); + _game._player._stepEnabled = false; + _game._player.walk(Common::Point(108, 137), FACING_EAST); + _game._player.setWalkTrigger(82); + } else if ((_scene->_priorSceneId == 205) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + _game._player._playerPos = Common::Point(153, 148); + _game._player._facing = FACING_NORTH; + } + + sceneEntrySound(); +} + +void Scene206::step() { + switch (_game._trigger) { + case 82: + _vm->_sound->command(24); + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 83); + break; + + case 83: + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 3); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 13); + _game._player._stepEnabled = true; + break; + + case 88: + _game._player._playerPos = Common::Point(168, 138); + _game._player._visible = true; + _game._player._stepEnabled = true; + _anim0ActvFl = false; + _game._player.resetFacing(FACING_WEST); + break; + + default: + break; + } + + if (_anim0ActvFl && !_skip1Fl) { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 118) { + _globals[kKnockedOverHead] = true; + _skip1Fl = true; + _scene->_sequences.addTimer(1, 84); + } + } + + if (_anim0ActvFl && !_skip2Fl) { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 61) { + if (_vm->_sound->_preferRoland) + _vm->_sound->command(65); + else + _scene->playSpeech(1); + + _skip2Fl = true; + } + } + + switch (_game._trigger) { + case 84: + _vm->_sound->command(24); + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 85); + break; + + case 85: + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 3); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 13); + break; + + default: + break; + } +} + +void Scene206::actions() { + if (_action.isAction(VERB_EXIT_TO, NOUN_LOGE_CORRIDOR)) { + if (_globals[kRightDoorIsOpen504]) { + if (_vm->_sound->_preferRoland) + _vm->_sound->command(65); + else + _scene->playSpeech(1); + + _vm->_gameConv->run(26); + _vm->_gameConv->exportValue(4); + } else + _scene->_nextSceneId = 205; + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_CRUMPLED_NOTE) && (_game._objects.isInRoom(OBJ_CRUMPLED_NOTE) || _game._trigger)) { + switch (_game._trigger) { + case (0): + _globals[kPlayerScore] += 5; + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], false, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 4, 77); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 78); + _action._inProgress = false; + return; + + case 77: + _scene->deleteSequence(_globals._sequenceIndexes[4]); + _scene->_hotspots.activate(NOUN_CRUMPLED_NOTE, false); + _game._objects.addToInventory(OBJ_CRUMPLED_NOTE); + _vm->_sound->command(26); + _action._inProgress = false; + return; + + case 78: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[5]); + _game._player._visible = true; + _scene->_sequences.addTimer(20, 79); + _action._inProgress = false; + return; + + case 79: + _vm->_dialogs->showItem(OBJ_CRUMPLED_NOTE, 816, 6); + _game._player._stepEnabled = true; + _action._inProgress = false; + return; + + default: + break; + } + } + + if (_action.isAction(VERB_WALK_BEHIND, NOUN_PANEL) || _action.isAction(VERB_OPEN, NOUN_PANEL) + || ((_game._trigger >= 70) && (_game._trigger < 77))) { + if (_globals[kPanelIn206] == 3) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], true, 7, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 3); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 3, 70); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 71); + break; + + case 70: + _vm->_sound->command(24); + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2); + break; + + case 71: + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + _game._player._stepEnabled = true; + _game._player._visible = true; + _game._player.walk(Common::Point(67, 127), FACING_NORTHWEST); + _game._player.setWalkTrigger(72); + break; + + case 72: + _vm->_sound->command(24); + _scene->deleteSequence(_globals._sequenceIndexes[3]); + _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 73); + break; + + case 73: + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + _scene->_nextSceneId = 308; + break; + + default: + break; + } + } else { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], true, 7, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 3); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 74); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 3, 75); + break; + + case 74: + _game._player._stepEnabled = true; + _game._player._visible = true; + _vm->_dialogs->show(20625); + break; + + case 75: + _vm->_sound->command(72); + break; + + default: + break; + } + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_UNLOCK, NOUN_PANEL) || _action.isAction(VERB_LOCK, NOUN_PANEL) || _action.isAction(VERB_PUT, NOUN_KEY, NOUN_KEYHOLE) + || _action.isAction(VERB_UNLOCK, NOUN_KEYHOLE) || _action.isAction(VERB_LOCK, NOUN_KEYHOLE) || (_game._trigger >= 64)) { + if (_globals[kPanelIn206] >= 1) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], true, 7, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 3); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 64); + break; + + case 64: { + _vm->_sound->command(71); + int idx = _globals._sequenceIndexes[5]; + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], true, -2); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[5], SYNC_SEQ, idx); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], false); + _scene->_sequences.addTimer(30, 65); + } + break; + + case 65: + _scene->deleteSequence(_globals._sequenceIndexes[5]); + _globals._sequenceIndexes[5] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[5], true, 7, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 3); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[5], false); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 66); + break; + + case 66: + if (_action.isAction(VERB_LOCK)) { + _globals[kPanelIn206] = 2; + _vm->_dialogs->show(20629); + } else if (_action.isAction(VERB_UNLOCK)) { + _globals[kPanelIn206] = 3; + _vm->_dialogs->show(20628); + } + + if (_action.isAction(VERB_PUT)) { + if (_globals[kPanelIn206] <= 2) { + _globals[kPanelIn206] = 3; + _vm->_dialogs->show(20628); + } else { + _globals[kPanelIn206] = 2; + _vm->_dialogs->show(20629); + } + } + + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[5]); + _game._player._stepEnabled = true; + _game._player._visible = true; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + } + + if (_action._lookFlag) { + _vm->_dialogs->show(20610); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(20611); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(20612); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RIGHT_COLUMN)) { + _vm->_dialogs->show(20614); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_KEYHOLE)) { + _vm->_dialogs->show(20615); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RAIL)) { + _vm->_dialogs->show(20616); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SEAT)) { + _vm->_dialogs->show(20617); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LOGE_CORRIDOR)) { + _vm->_dialogs->show(20618); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_STAGE)) { + if (_globals[kJacquesStatus]) + _vm->_dialogs->show(20630); + else + _vm->_dialogs->show(20619); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_HOUSE)) { + _vm->_dialogs->show(20620); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CEILING)) { + _vm->_dialogs->show(20621); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_HOUSE_LIGHT)) { + _vm->_dialogs->show(20622); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PANEL)) { + if (_globals[kPanelIn206] == 3) + _vm->_dialogs->show(20624); + else + _vm->_dialogs->show(20626); + + _action._inProgress = false; + return; + } + + if ((_action.isObject(NOUN_LEFT_COLUMN)) && (!_game._trigger)) { + if (_globals[kPanelIn206] == 0) { + _vm->_dialogs->show(20613); + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('k', 1), 95); + _game._player._stepEnabled = false; + _game._player._visible = false; + } else + _vm->_dialogs->show(20623); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CRUMPLED_NOTE) && _game._objects.isInRoom(OBJ_CRUMPLED_NOTE)) { + _vm->_dialogs->show(20627); + _action._inProgress = false; + return; + } + } + + switch (_game._trigger) { + case 95: + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); + _scene->_hotspots.activate(NOUN_PANEL, true); + _scene->_hotspots.activate(NOUN_KEYHOLE, true); + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 3); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 13); + if (!(_globals[kPlayerScoreFlags] & 8)) { + _globals[kPlayerScoreFlags] |= 8; + _globals[kPlayerScore] += 5; + } + _scene->_sequences.addTimer(15, 96); + + _action._inProgress = false; + return; + + case 96: + _game._player._stepEnabled = true; + _globals[kPanelIn206] = 1; + _vm->_dialogs->show(20623); + _action._inProgress = false; + return; + + default: + break; + } +} + +void Scene206::preActions() { + if (_action.isAction(VERB_LOOK, NOUN_LEFT_COLUMN)) + _game._player._needToWalk = true; + + if (_action.isAction(VERB_UNLOCK, NOUN_PANEL) || _action.isAction(VERB_WALK_BEHIND, NOUN_PANEL) + || _action.isAction(VERB_LOCK, NOUN_PANEL) || _action.isAction(VERB_OPEN, NOUN_PANEL)) + _game._player.walk(Common::Point(108, 137), FACING_NORTHWEST); + + if (_action.isObject(NOUN_LEFT_COLUMN) && (_globals[kPanelIn206] == 0)) + _game._player.walk(Common::Point(103, 137), FACING_NORTHWEST); +} + +/*------------------------------------------------------------------------*/ + +Scene207::Scene207(MADSEngine *vm) : Scene2xx(vm) { + _skip1Fl = false; + _anim0ActvFl = false; +} + +void Scene207::synchronize(Common::Serializer &s) { + Scene2xx::synchronize(s); + + s.syncAsByte(_skip1Fl); + s.syncAsByte(_anim0ActvFl); +} + +void Scene207::setup() { + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene207::enter() { + _scene->loadSpeech(2); + _skip1Fl = false; + _anim0ActvFl = false; + + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('a', 0)); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 0)); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0)); + + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10); + + if ((_scene->_priorSceneId == 205) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + _game._player._playerPos = Common::Point(159, 147); + _game._player._facing = FACING_NORTH; + } + + sceneEntrySound(); +} + +void Scene207::step() { + if (_anim0ActvFl && !_skip1Fl) { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 6) { + if (_vm->_sound->_preferRoland) + _vm->_sound->command(69); + else + _scene->playSpeech(2); + + _skip1Fl = true; + } + } +} + +void Scene207::actions() { + if (_action.isAction(VERB_TAKE, NOUN_SEAT)) { + switch (_game._trigger) { + case 0: + _globals[kPlayerScore] += 5; + _game._player._stepEnabled = false; + _game._player._visible = false; + _vm->_sound->command(3); + _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 7, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 1); + break; + + case 1: + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10); + _scene->_sequences.addTimer(120, 2); + _scene->_sequences.addTimer(240, 3); + break; + + case 2: + _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 4); + break; + + case 3: + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('s', 1), 5); + _anim0ActvFl = true; + _scene->deleteSequence(_globals._sequenceIndexes[1]); + break; + + case 4: + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); + break; + + case 5: + _scene->_nextSceneId = 208; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_EXIT_TO, NOUN_LOGE_CORRIDOR)) { + _scene->_nextSceneId = 205; + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(20710); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(20711); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(20712); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LEFT_COLUMN)) { + _vm->_dialogs->show(20713); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RIGHT_COLUMN)) { + _vm->_dialogs->show(20714); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RAIL)) { + _vm->_dialogs->show(20715); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SEAT)) { + _vm->_dialogs->show(20716); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LOGE_CORRIDOR)) { + _vm->_dialogs->show(20717); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_STAGE)) { + _vm->_dialogs->show(20718); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_HOUSE)) { + _vm->_dialogs->show(20719); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CEILING)) { + _vm->_dialogs->show(20720); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_HOUSE_LIGHT)) { + _vm->_dialogs->show(20721); + _action._inProgress = false; + return; + } + } +} + +void Scene207::preActions() { + if (_action.isAction(VERB_TAKE, NOUN_SEAT)) + _game._player.walk(Common::Point(139, 124), FACING_NORTH); +} + +/*------------------------------------------------------------------------*/ + +Scene208::Scene208(MADSEngine *vm) : Scene2xx(vm) { + _skip1Fl = false; + _skip2Fl = false; + + _topLeftPeopleFrame = -1; + _topRightPeopleFrame = -1; + _middleLeftPeopleFrame = -1; + _centerPeopleFrame = -1; + _middleRightPeopleFrame = -1; + _bottomLeftPeopleFrame = -1; + _bottomMiddlePeopleFrame = -1; + _bottomRightPeopleFrame = -1; + _direction = -1; +} + +void Scene208::synchronize(Common::Serializer &s) { + Scene2xx::synchronize(s); + + s.syncAsByte(_skip1Fl); + s.syncAsByte(_skip2Fl); + + s.syncAsSint16LE(_topLeftPeopleFrame); + s.syncAsSint16LE(_topRightPeopleFrame); + s.syncAsSint16LE(_middleLeftPeopleFrame); + s.syncAsSint16LE(_centerPeopleFrame); + s.syncAsSint16LE(_middleRightPeopleFrame); + s.syncAsSint16LE(_bottomLeftPeopleFrame); + s.syncAsSint16LE(_bottomMiddlePeopleFrame); + s.syncAsSint16LE(_bottomRightPeopleFrame); + s.syncAsSint16LE(_direction); +} + +void Scene208::setup() { + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene208::enter() { + _scene->loadSpeech(1); + + _skip1Fl = false; + _skip2Fl = false; + + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1)); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2)); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3)); + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 4)); + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 5)); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 6)); + _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('x', 7)); + + _scene->_userInterface.emptyConversationList(); + _scene->_userInterface.setup(kInputConversation); + + _scene->loadSpeech(1); + + _game._player._stepEnabled = false; + _game._player._visible = false; + + _topLeftPeopleFrame = 2; + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, _topLeftPeopleFrame); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 1); + _scene->_sequences.addTimer(120, 60); + + _topRightPeopleFrame = 2; + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, _topRightPeopleFrame); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1); + _scene->_sequences.addTimer(30, 62); + + _middleLeftPeopleFrame = 2; + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, _middleLeftPeopleFrame); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); + _scene->_sequences.addTimer(30, 64); + + _centerPeopleFrame = 1; + _direction = 1; + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, _centerPeopleFrame); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + _scene->_sequences.addTimer(300, 66); + + _middleRightPeopleFrame = 3; + _globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, _middleRightPeopleFrame); + _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1); + _scene->_sequences.addTimer(60, 68); + + _bottomLeftPeopleFrame = 4; + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, _bottomLeftPeopleFrame); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1); + _scene->_sequences.addTimer(60, 70); + + _bottomMiddlePeopleFrame = 4; + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, _bottomMiddlePeopleFrame); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14); + _scene->_sequences.addTimer(30, 72); + + _bottomRightPeopleFrame = 3; + _globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, _bottomRightPeopleFrame); + _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1); + _scene->_sequences.addTimer(15, 74); + + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('p', 1), 80); + + sceneEntrySound(); +} + +void Scene208::step() { + animateTopLeftPeople(); + animateTopRightPeople(); + animateMiddleLeftPeople(); + animateCenterPeople(); + animateMiddleRightPeople(); + animateBottomLeftPeople(); + animateBottomMiddlePeople(); + animateBottomRightPeople(); + + if (!_skip1Fl) { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 49) { + if (_vm->_sound->_preferRoland) + _vm->_sound->command(65); + else + _scene->playSpeech(1); + + _skip1Fl = true; + } + } + + if (!_skip2Fl) { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 68) { + if (_vm->_sound->_preferRoland) + _vm->_sound->command(65); + else + _scene->playSpeech(1); + + _skip2Fl = true; + } + } + + if (_game._trigger == 80) + _scene->_nextSceneId = 150; +} + +void Scene208::actions() { +} + +void Scene208::preActions() { +} + +void Scene208::animateTopLeftPeople() { + + if (_game._trigger != 60) + return; + + _scene->deleteSequence(_globals._sequenceIndexes[0]); + + int triggerVal; + int rndVal = _vm->getRandomNumber(1, 2); + if (_topLeftPeopleFrame == 3) + triggerVal = 1; + else + triggerVal = rndVal; + + if (rndVal == triggerVal) { + _topLeftPeopleFrame += _vm->getRandomNumber(-1, 1); + if (_topLeftPeopleFrame == 0) + _topLeftPeopleFrame = 1; + else if (_topLeftPeopleFrame == 4) + _topLeftPeopleFrame = 3; + } + + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, _topLeftPeopleFrame); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 1); + int delay = _vm->getRandomNumber(15, 60); + _scene->_sequences.addTimer(delay, 60); +} + +void Scene208::animateTopRightPeople() { + if (_game._trigger != 62) + return; + + _scene->deleteSequence(_globals._sequenceIndexes[1]); + + int triggerVal; + int rndVal = _vm->getRandomNumber(1, 2); + if (_topRightPeopleFrame == 4) + triggerVal = 1; + else + triggerVal = rndVal; + + if (rndVal == triggerVal) { + _topRightPeopleFrame += _vm->getRandomNumber(-1, 1); + if (_topRightPeopleFrame == 0) + _topRightPeopleFrame = 1; + else if (_topRightPeopleFrame == 5) + _topRightPeopleFrame = 4; + } + + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, _topRightPeopleFrame); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1); + int delay = _vm->getRandomNumber(15, 60); + _scene->_sequences.addTimer(delay, 62); +} + +void Scene208::animateMiddleLeftPeople() { + if (_game._trigger != 64) + return; + + _scene->deleteSequence(_globals._sequenceIndexes[2]); + int delay = _vm->getRandomNumber(60, 120); + + int triggerVal; + int rndVal = _vm->getRandomNumber(1, 2); + if (_middleLeftPeopleFrame == 2) + triggerVal = 1; + else + triggerVal = rndVal; + + if (rndVal == triggerVal) { + _middleLeftPeopleFrame += _vm->getRandomNumber(-1, 1); + if (_middleLeftPeopleFrame == 0) + _middleLeftPeopleFrame = 1; + else if (_middleLeftPeopleFrame == 5) + _middleLeftPeopleFrame = 4; + } + + if ((_centerPeopleFrame == 3) && (_middleLeftPeopleFrame < 4)) { + ++_middleLeftPeopleFrame; + delay = 10; + } + + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, _middleLeftPeopleFrame); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); + _scene->_sequences.addTimer(delay, 64); +} + + +void Scene208::animateCenterPeople() { + if (_game._trigger != 66) + return; + + _scene->deleteSequence(_globals._sequenceIndexes[3]); + + int delay; + + if (_direction) { + ++_centerPeopleFrame; + delay = 15; + if (_centerPeopleFrame == 4) { + delay = _vm->getRandomNumber(300, 420); + --_centerPeopleFrame; + _direction = 0; + } + } else { + --_centerPeopleFrame; + delay = 15; + if (_centerPeopleFrame == 0) { + delay = _vm->getRandomNumber(600, 900); + ++_centerPeopleFrame; + _direction = 1; + } + } + + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, _centerPeopleFrame); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + _scene->_sequences.addTimer(delay, 66); +} + +void Scene208::animateMiddleRightPeople() { + if (_game._trigger != 68) + return; + + _scene->deleteSequence(_globals._sequenceIndexes[4]); + + int triggerVal; + int rndVal = _vm->getRandomNumber(1, 2); + if (_middleRightPeopleFrame == 1) + triggerVal = 1; + else + triggerVal = rndVal; + + if (rndVal == triggerVal) { + _middleRightPeopleFrame += _vm->getRandomNumber(-1, 1); + if (_middleRightPeopleFrame == 0) + _middleRightPeopleFrame = 1; + else if (_middleRightPeopleFrame == 4) + _middleRightPeopleFrame = 3; + + if (_centerPeopleFrame == 3) + _middleRightPeopleFrame = 3; + } + + _globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, _middleRightPeopleFrame); + _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1); + int delay = _vm->getRandomNumber(15, 60); + _scene->_sequences.addTimer(delay, 68); +} + +void Scene208::animateBottomLeftPeople() { + if (_game._trigger != 70) + return; + + _scene->deleteSequence(_globals._sequenceIndexes[5]); + + int triggerVal; + int rndVal = _vm->getRandomNumber(1, 2); + if (_bottomLeftPeopleFrame == 4) + triggerVal = 1; + else + triggerVal = rndVal; + + if (rndVal == triggerVal) { + _bottomLeftPeopleFrame += _vm->getRandomNumber(-1, 1); + if (_bottomLeftPeopleFrame == 0) + _bottomLeftPeopleFrame = 1; + else if (_bottomLeftPeopleFrame == 5) + _bottomLeftPeopleFrame = 4; + } + + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, _bottomLeftPeopleFrame); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1); + int delay = _vm->getRandomNumber(15, 60); + _scene->_sequences.addTimer(delay, 70); +} + +void Scene208::animateBottomMiddlePeople() { + if (_game._trigger != 72) + return; + + _scene->deleteSequence(_globals._sequenceIndexes[6]); + + int triggerVal; + int rndVal = _vm->getRandomNumber(1, 2); + if (_bottomMiddlePeopleFrame == 4) + triggerVal = 1; + else + triggerVal = rndVal; + + if (rndVal == triggerVal) { + _bottomMiddlePeopleFrame += _vm->getRandomNumber(-1, 1); + if (_bottomMiddlePeopleFrame == 0) + _bottomMiddlePeopleFrame = 1; + else if (_bottomMiddlePeopleFrame == 5) + _bottomMiddlePeopleFrame = 4; + } + + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, _bottomMiddlePeopleFrame); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14); + int delay = _vm->getRandomNumber(15, 60); + _scene->_sequences.addTimer(delay, 72); +} + +void Scene208::animateBottomRightPeople() { + if (_game._trigger != 74) + return; + + _scene->deleteSequence(_globals._sequenceIndexes[7]); + + int triggerVal; + int rndVal = _vm->getRandomNumber(1, 2); + if ((_bottomRightPeopleFrame == 3) || (_bottomRightPeopleFrame == 1)) + triggerVal = 1; + else + triggerVal = rndVal; + + if (rndVal == triggerVal) { + _bottomRightPeopleFrame += _vm->getRandomNumber(-1, 1); + if (_bottomRightPeopleFrame == 0) + _bottomRightPeopleFrame = 1; + else if (_bottomRightPeopleFrame == 4) + _bottomRightPeopleFrame = 3; + } + + _globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, _bottomRightPeopleFrame); + _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1); + int delay = _vm->getRandomNumber(15, 60); + _scene->_sequences.addTimer(delay, 74); +} + +/*------------------------------------------------------------------------*/ + +Scene250::Scene250(MADSEngine *vm) : Scene2xx(vm) { +} + +void Scene250::synchronize(Common::Serializer &s) { + Scene2xx::synchronize(s); +} + +void Scene250::setup() { + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene250::enter() { + warning("TODO: Switch to letter box view. See definition of MADS_MENU_Y"); + + _game._player._stepEnabled = false; + _game._player._visible = false; + + _game.loadQuoteSet(0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0); + _globals._animationIndexes[0] = _scene->loadAnimation("*RM150Q1", 1); +} + +void Scene250::step() { + if (_game._trigger == 1) + _scene->_sequences.addTimer(12, 2); + + if (_game._trigger == 2) { + int y = 68; + + _scene->_kernelMessages.add(Common::Point(160, y), 0x1110, 0x20, 0, 900, _game.getQuote(0x36)); + y += 16; + + if (_globals[kPlayerScore] > 250) + _globals[kPlayerScore] = 250; + + Common::String message = Common::String::format("%d", _globals[kPlayerScore]); + message += " "; + message += _game.getQuote(0x37); + message += " 250 "; + message += _game.getQuote(0x38); + + _scene->_kernelMessages.add(Common::Point(160, y), 0x1110, 0x20, 3, 900, message); + y += 16; + + _scene->_kernelMessages.add(Common::Point(160, y), 0x1110, 0x20, 0, 900, _game.getQuote(0x39)); + y += 16; + + int score = _globals[kPlayerScore]; + int messageId; + + if (score <= 25) + // Score level: Stage sweeper + messageId = 0x3A; + else if (score <= 50) + // Score level: Dresser + messageId = 0x3B; + else if (score <= 75) + // Score level: Usher + messageId = 0x3C; + else if (score <= 100) + // Score level: Stagehand + messageId = 0x3D; + else if (score <= 150) + // Score level: Chorus member + messageId = 0x3E; + else if (score <= 200) + // Score level: Supporting player + messageId = 0x3F; + else if (score <= 249) + // Score level: Star player + messageId = 0x40; + else + // Score level: Director + messageId = 0x41; + + _scene->_kernelMessages.add(Common::Point(160, y), 0x1110, 0x20, 0, 900, _game.getQuote(messageId)); + _scene->_sequences.addTimer(930, 3); + } + + if (_game._trigger == 3) + _game._winStatus = 1; +} + +void Scene250::actions() { +} + +void Scene250::preActions() { +} + +/*------------------------------------------------------------------------*/ + +} // End of namespace Phantom +} // End of namespace MADS diff --git a/engines/mads/phantom/phantom_scenes2.h b/engines/mads/phantom/phantom_scenes2.h new file mode 100644 index 0000000000..7e86e2ce0f --- /dev/null +++ b/engines/mads/phantom/phantom_scenes2.h @@ -0,0 +1,307 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef MADS_PHANTOM_SCENES2_H +#define MADS_PHANTOM_SCENES2_H + +#include "common/scummsys.h" +#include "common/serializer.h" +#include "mads/game.h" +#include "mads/scene.h" +#include "mads/phantom/phantom_scenes.h" + +namespace MADS { + +namespace Phantom { + +class Scene2xx : public PhantomScene { +protected: + /** + * Plays an appropriate sound when entering a scene + */ + void sceneEntrySound(); + + /** + *Sets the AA file to use for the scene + */ + void setAAName(); + + /** + * Updates the prefix used for getting player sprites for the scene + */ + void setPlayerSpritesPrefix(); +public: + Scene2xx(MADSEngine *vm) : PhantomScene(vm) {} +}; + +class Scene201 : public Scene2xx { +private: + bool _anim0ActvFl; + bool _anim1ActvFl; + bool _needHoldFl; + int _sellerCount; + int _sellerStatus; + int _sellerFrame; + int _raoulFrame; + int _raoulStatus; + + void handleSellerAnimation(); + void handleRaoulAnimation(); + void handleConversation(); + +public: + Scene201(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene202 : public Scene2xx { +private: + bool _ticketGivenFl; + bool _anim0ActvFl; + bool _anim1ActvFl; + bool _skipWalkFl; + int _chandeliersPosX[5]; + int _chandeliersHotspotId[5]; + int _conversationCount; + int _usherStatus; + int _usherFrame; + int _usherCount; + int _degasStatus; + int _degasFrame; + + void handleConversation1(); + void handleConversation2(); + void handleUsherAnimation(); + void handleDegasAnimation(); + void handleChandeliersPositions(); + +public: + Scene202(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene203 : public Scene2xx { +private: + bool _anim0ActvFl; + bool _anim1ActvFl; + bool _anim2ActvFl; + bool _anim3ActvFl; + bool _showNoteFl; + + int _brieStatus; + int _brieFrame; + int _brieCount; + int _raoulStatus; + int _raoulFrame; + int _raoulCount; + int _richardStatus; + int _richardFrame; + int _daaeStatus; + int _daaeFrame; + int _conversationCount; + + void handleBrieConversation(); + void handleRichardConversation(); + void handleRichardAndDaaeConversation(); + void handleBrieAnimation(); + void handleRichardAnimation(); + void handleRaoulAnimation(); + void handleDaaeAnimation(); + +public: + Scene203(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene204 : public Scene2xx { +private: + bool _anim0ActvFl; + bool _anim1ActvFl; + bool _anim2ActvFl; + bool _anim3ActvFl; + bool _raoulDown; + bool _florentGone; + bool _skip1Fl; + bool _skip2Fl; + bool _skip3Fl; + bool _endGameFl; + + int _brieStatus; + int _brieFrame; + int _florStatus; + int _florFrame; + int _raoulStatus; + int _raoulFrame; + int _raoulCount; + + void handleConversation(); + void handleBrieAnimation(); + void handleFlorAnimation(); + void handleRaoulAnimation(); + void handleEndAnimation(); + +public: + Scene204(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene205 : public Scene2xx { +private: + bool _anim0ActvFl; + bool _anim1ActvFl; + bool _noConversationHold; + bool _giveTicketFl; + + int _richardFrame; + int _richardStatus; + int _richardCount; + int _giryFrame; + int _giryStatus; + int _giryCount; + int _conversationCounter; + int _lastRandom; + + void handleConversation18(); + void handleConversation10(); + void handleConversation11(); + void handleRichardAnimation(); + void handleGiryAnimation(); + +public: + Scene205(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene206 : public Scene2xx { +private: + bool _anim0ActvFl; + bool _skip1Fl; + bool _skip2Fl; + +public: + Scene206(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene207 : public Scene2xx { +private: + bool _skip1Fl; + bool _anim0ActvFl; + +public: + Scene207(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene208 : public Scene2xx { +private: + bool _skip1Fl; + bool _skip2Fl; + + int _topLeftPeopleFrame; + int _topRightPeopleFrame; + int _middleLeftPeopleFrame; + int _centerPeopleFrame; + int _middleRightPeopleFrame; + int _bottomLeftPeopleFrame; + int _bottomMiddlePeopleFrame; + int _bottomRightPeopleFrame; + int _direction; + + void animateTopLeftPeople(); + void animateTopRightPeople(); + void animateMiddleLeftPeople(); + void animateCenterPeople(); + void animateMiddleRightPeople(); + void animateBottomLeftPeople(); + void animateBottomMiddlePeople(); + void animateBottomRightPeople(); + +public: + Scene208(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene250 : public Scene2xx { +public: + Scene250(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +} // End of namespace Phantom +} // End of namespace MADS + +#endif /* MADS_PHANTOM_SCENES2_H */ diff --git a/engines/mads/phantom/phantom_scenes3.cpp b/engines/mads/phantom/phantom_scenes3.cpp new file mode 100644 index 0000000000..bb9bcee80c --- /dev/null +++ b/engines/mads/phantom/phantom_scenes3.cpp @@ -0,0 +1,2767 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/scummsys.h" +#include "mads/mads.h" +#include "mads/conversations.h" +#include "mads/scene.h" +#include "mads/phantom/phantom_scenes.h" +#include "mads/phantom/phantom_scenes3.h" + +namespace MADS { + +namespace Phantom { + +void Scene3xx::setAAName() { + _game._aaName = Resources::formatAAName(_globals[kTempInterface]); + _vm->_palette->setEntry(254, 43, 47, 51); +} + +void Scene3xx::sceneEntrySound() { + if (!_vm->_musicFlag) + return; + + switch (_scene->_nextSceneId) { + case 303: + case 304: + case 305: + case 307: + case 308: + if (_globals[kKnockedOverHead]) + _vm->_sound->command(33); + else + _vm->_sound->command(16); + break; + + case 310: + case 320: + case 330: + case 340: + _vm->_sound->command(36); + break; + + default: + if (_scene->_nextSceneId != 306) + _vm->_sound->command(16); + break; + } +} + +void Scene3xx::setPlayerSpritesPrefix() { + _vm->_sound->command(5); + + if ((_scene->_nextSceneId == 304) || (_scene->_nextSceneId == 305) || (_scene->_nextSceneId == 306) || (_scene->_nextSceneId == 310)) + _game._player._spritesPrefix = ""; + else { + Common::String oldName = _game._player._spritesPrefix; + if (!_game._player._forcePrefix) + _game._player._spritesPrefix = "RAL"; + if (oldName != _game._player._spritesPrefix) + _game._player._spritesChanged = true; + } + + _game._player._scalingVelocity = true; +} + +/*------------------------------------------------------------------------*/ + +Scene301::Scene301(MADSEngine *vm) : Scene3xx(vm) { + _anim0ActvFl = false; + _skip1Fl = false; + _skip2Fl = false; + + _lightingHotspotId = -1; + _sandbagHotspotId = -1; +} + +void Scene301::synchronize(Common::Serializer &s) { + Scene3xx::synchronize(s); + + s.syncAsByte(_anim0ActvFl); + s.syncAsByte(_skip1Fl); + s.syncAsByte(_skip2Fl); + + s.syncAsSint16LE(_lightingHotspotId); + s.syncAsSint16LE(_sandbagHotspotId); +} + +void Scene301::setup() { + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene301::enter() { + _vm->_disableFastwalk = true; + + _anim0ActvFl = false; + _skip2Fl = false; + _skip1Fl = false; + + _scene->loadSpeech(6); + + _scene->_hotspots.activate(NOUN_CABLE, false); + _scene->_hotspots.activate(NOUN_STOOL, false); + + _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 0)); + + if (_globals[kCurrentYear] == 1993) { + _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 1)); + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', 0)); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('z', 1)); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('z', 2)); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('z', 3)); + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('z', 4)); + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('z', 5)); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('z', 6)); + + _lightingHotspotId = _scene->_dynamicHotspots.add(NOUN_LIGHTING_INSTRUMENT, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(50, 116, 50 + 19, 116 + 10)); + _scene->_dynamicHotspots.setPosition(_lightingHotspotId, Common::Point(67, 129), FACING_NORTHWEST); + _lightingHotspotId = _scene->_dynamicHotspots.add(NOUN_LIGHTING_INSTRUMENT, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(126, 118, 126 + 29, 118 + 8)); + _scene->_dynamicHotspots.setPosition(_lightingHotspotId, Common::Point(152, 129), FACING_NORTHWEST); + + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + + _globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14); + + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14); + + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14); + + _scene->_hotspots.activate(NOUN_CABLE, true); + } else { + _sandbagHotspotId = _scene->_dynamicHotspots.add(NOUN_SANDBAG, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(464, 114, 464 + 11, 114 + 9)); + _scene->_dynamicHotspots.setPosition(_sandbagHotspotId, Common::Point(475, 125), FACING_NORTHWEST); + _scene->_dynamicHotspots.add(NOUN_SANDBAG, VERB_LOOK_AT, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(468, 42, 468 + 6, 42 + 13)); + _scene->_hotspots.activate(NOUN_STOOL, true); + _scene->_hotspots.activate(NOUN_BIG_PROP, false); + } + + if (_scene->_priorSceneId == 302) { + _game._player.firstWalk(Common::Point(-20, 132), FACING_WEST, Common::Point(19, 132), FACING_EAST, true); + _scene->setCamera(Common::Point(0, 0)); + } else if ((_scene->_priorSceneId == 106) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + _game._player._playerPos = Common::Point(568, 133); + _game._player._facing = FACING_WEST; + _scene->setCamera(Common::Point(320, 0)); + } + + if (!_game._visitedScenes._sceneRevisited) { + _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 7, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 5); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 64); + } + + sceneEntrySound(); +} + +void Scene301::step() { + if ((_globals[kDoneBrieConv203] == 3) && (_scene->_posAdjust.x < 320) && (_game._player._playerPos.x < 350)) { + _game._player.cancelCommand(); + _game._player.walk(Common::Point(256, 130), FACING_NORTHWEST); + _game._player.setWalkTrigger(60); + _globals[kDoneBrieConv203] = 0; + _game._player._stepEnabled = false; + } + + if (_game._trigger == 60) { + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('p', 1), 0); + _anim0ActvFl = true; + _game._player._visible = false; + _globals[kPlayerScore] += 10; + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0); + } + + if (_anim0ActvFl && !_skip1Fl) { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 50) { + _scene->playSpeech(6); + _skip1Fl = true; + } + } + + if (_anim0ActvFl) { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 61) { + _scene->setAnimFrame(_globals._animationIndexes[0], 60); + if (!_skip2Fl) { + _vm->_sound->command(1); + _scene->_sequences.addTimer(420, 70); + _skip2Fl = true; + } + } + } + + if (_game._trigger == 70) { + _scene->_userInterface.noInventoryAnim(); + // CHECKME: Not sure about the next function call + _scene->_userInterface.refresh(); + _scene->_nextSceneId = 104; + } + + if (_game._trigger == 64) + _scene->_sequences.addTimer(60, 65); + + if (_game._trigger == 65) + _vm->_dialogs->show(30137); +} + +void Scene301::actions() { + if (_action.isAction(VERB_CLIMB_DOWN, NOUN_CIRCULAR_STAIRCASE)) { + switch (_game._trigger) { + case 0: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 1); + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0); + break; + + case 1: + _scene->_nextSceneId = 106; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(30110); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_GRID)) { + _vm->_dialogs->show(30111); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CATWALK)) { + _vm->_dialogs->show(30112); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SIDE_WALL)) { + _vm->_dialogs->show(30113); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BACK_WALL)) { + _vm->_dialogs->show(30114); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SUPPORT)) { + _vm->_dialogs->show(30115); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ACT_CURTAIN)) { + _vm->_dialogs->show(30116); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_HOUSE)) { + _vm->_dialogs->show(30117); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_OTHER_CATWALK)) { + _vm->_dialogs->show(30118); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GRIDWORK)) { + _vm->_dialogs->show(30119); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BEAM_POSITION)) { + _vm->_dialogs->show(30120); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LIGHTING_INSTRUMENT)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(30121); + else + _vm->_dialogs->show(30122); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TARP)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(30123); + else + _vm->_dialogs->show(30140); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_COUNTERWEIGHT_SYSTEM)) { + _vm->_dialogs->show(30124); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SANDBAG) && (_action._mainObjectSource == CAT_HOTSPOT)) { + _vm->_dialogs->show(30125); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BATTEN)) { + _vm->_dialogs->show(30126); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_STOOL)) { + _vm->_dialogs->show(30127); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_HEMP)) { + _vm->_dialogs->show(30128); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CIRCULAR_STAIRCASE)) { + _vm->_dialogs->show(30129); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CATWALK_OVER_HOUSE)) { + _vm->_dialogs->show(30130); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_STAIRCASE_POST)) { + _vm->_dialogs->show(30131); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RAILING)) { + _vm->_dialogs->show(30132); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CYCLORAMA)) { + _vm->_dialogs->show(30133); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BIG_PROP)) { + _vm->_dialogs->show(30134); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PROSCENIUM_ARCH)) { + _vm->_dialogs->show(30135); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CABLE)) { + _vm->_dialogs->show(30136); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE, NOUN_HEMP)) { + _vm->_dialogs->show(30138); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_PULL, NOUN_HEMP)) { + _vm->_dialogs->show(30141); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_SANDBAG) && (_action._mainObjectSource == CAT_HOTSPOT)) { + _vm->_dialogs->show(30139); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_TARP)) { + _vm->_dialogs->show(30142); + _action._inProgress = false; + return; + } +} + +void Scene301::preActions() { + if (_action.isAction(VERB_EXIT_TO, NOUN_CATWALK_OVER_HOUSE)) + _game._player._walkOffScreenSceneId = 302; +} + +/*------------------------------------------------------------------------*/ + +Scene302::Scene302(MADSEngine *vm) : Scene3xx(vm) { +} + +void Scene302::synchronize(Common::Serializer &s) { + Scene3xx::synchronize(s); +} + +void Scene302::setup() { + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene302::enter() { + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 0)); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RRD_9"); + + if (_game._objects.isInRoom(OBJ_BLUE_FRAME)) { + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + } else + _scene->_hotspots.activate(NOUN_BLUE_FRAME, false); + + if (_globals[kCurrentYear] == 1993) { + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1)); + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + } + + if (_scene->_priorSceneId == 303) + _game._player.firstWalk(Common::Point(-20, 134), FACING_WEST, Common::Point(15, 134), FACING_EAST, true); + else if ((_scene->_priorSceneId == 301) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) + _game._player.firstWalk(Common::Point(340, 134), FACING_WEST, Common::Point(297, 134), FACING_WEST, true); + + sceneEntrySound(); +} + +void Scene302::step() { +} + +void Scene302::actions() { + if (_action.isAction(VERB_TAKE, NOUN_BLUE_FRAME) && (_game._objects.isInRoom(OBJ_BLUE_FRAME) || _game._trigger)) { + switch (_game._trigger) { + case (0): + if (_globals[kCurrentYear] == 1881) { + int count = 0; + if (_game._objects.isInInventory(OBJ_YELLOW_FRAME)) + ++count; + if (_game._objects.isInInventory(OBJ_RED_FRAME)) + ++count; + if (_game._objects.isInInventory(OBJ_GREEN_FRAME)) + ++count; + if (count < 3) + _globals[kPlayerScore] += 5; + } + + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 5, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _scene->_hotspots.activate(NOUN_BLUE_FRAME, false); + _game._objects.addToInventory(OBJ_BLUE_FRAME); + _vm->_sound->command(26); + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[1]); + _game._player._visible = true; + _scene->_sequences.addTimer(20, 3); + break; + + case 3: + if (_globals[kCurrentYear] == 1881) + _vm->_dialogs->showItem(OBJ_BLUE_FRAME, 844, 0); + else + _vm->_dialogs->showItem(OBJ_BLUE_FRAME, 817, 0); + + _game._player._stepEnabled = true; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(30210); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_CATWALK)) { + _vm->_dialogs->show(30211); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GRID)) { + _vm->_dialogs->show(30212); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_HEMP)) { + _vm->_dialogs->show(30213); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SIDE_WALL)) { + _vm->_dialogs->show(30214); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CATWALK)) { + _vm->_dialogs->show(30215); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RAILING)) { + _vm->_dialogs->show(30216); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BEAM_POSITION)) { + _vm->_dialogs->show(30217); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LIGHTING_INSTRUMENT)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(30218); + else + _vm->_dialogs->show(30219); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BLUE_FRAME) && _game._objects.isInRoom(OBJ_BLUE_FRAME)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(30220); + else + _vm->_dialogs->show(30221); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SUPPORT)) { + _vm->_dialogs->show(30222); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_OTHER_CATWALK)) { + _vm->_dialogs->show(30223); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE, NOUN_HEMP)) { + _vm->_dialogs->show(30224); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_PULL, NOUN_HEMP)) { + _vm->_dialogs->show(30141); + _action._inProgress = false; + return; + } +} + +void Scene302::preActions() { + if (_action.isAction(VERB_EXIT_TO, NOUN_CATWALK)) { + if (_scene->_customDest.x > 160) + _game._player._walkOffScreenSceneId = 301; + else + _game._player._walkOffScreenSceneId = 303; + } +} + +/*------------------------------------------------------------------------*/ + +Scene303::Scene303(MADSEngine *vm) : Scene3xx(vm) { + _anim0ActvFl = false; + _hempHotspotId = -1; + _skipFrameCheckFl = -1; +} + +void Scene303::synchronize(Common::Serializer &s) { + Scene3xx::synchronize(s); + + s.syncAsByte(_anim0ActvFl); + s.syncAsSint16LE(_hempHotspotId); + s.syncAsSint16LE(_skipFrameCheckFl); +} + +void Scene303::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + _scene->addActiveVocab(NOUN_CHANDELIER_CABLE); + _scene->addActiveVocab(VERB_CLIMB_DOWN); +} + +void Scene303::enter() { + _anim0ActvFl = false; + _skipFrameCheckFl = false; + + if (_globals[kRightDoorIsOpen504]) + _vm->_gameConv->get(26); + + if (_globals[kCurrentYear] == 1993) { + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1)); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 0)); + } + + if ((_game._objects.isInRoom(OBJ_LARGE_NOTE)) && (_globals[kCurrentYear] == 1993)) { + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4); + } else + _scene->_hotspots.activate(NOUN_LARGE_NOTE, false); + + if (_globals[kCurrentYear] == 1993) + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + else { + _hempHotspotId = _scene->_dynamicHotspots.add(NOUN_CHANDELIER_CABLE, VERB_CLIMB_DOWN, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(74, 92, 74 + 7, 92 + 12)); + _scene->_dynamicHotspots.setPosition(_hempHotspotId, Common::Point(95, 107), FACING_NORTHWEST); + _scene->_dynamicHotspots[_hempHotspotId]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setCursor(_hempHotspotId, CURSOR_GO_DOWN); + } + + if (_scene->_priorSceneId == 307) + _game._player.firstWalk(Common::Point(-20, 135), FACING_EAST, Common::Point(16, 135), FACING_EAST, true); + else if (_scene->_priorSceneId == 304) { + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 1), 60); + _game._player._stepEnabled = false; + _game._player._visible = false; + } else if (_scene->_priorSceneId == 305) { + _game._objects.addToInventory(OBJ_SWORD); + _game._player._playerPos = Common::Point(117, 92); + _game._player._facing = FACING_SOUTHWEST; + } else if ((_scene->_priorSceneId == 302) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) + _game._player.firstWalk(Common::Point(340, 136), FACING_WEST, Common::Point(303, 136), FACING_WEST, true); + + _scene->_rails.disableLine(5, 9); + _scene->_rails.disableLine(5, 12); + _scene->_rails.disableLine(5, 8); + _scene->_rails.disableLine(6, 3); + _scene->_rails.disableLine(6, 2); + _scene->_rails.disableLine(11, 3); + _scene->_rails.disableLine(11, 4); + _scene->_rails.disableLine(10, 2); + _scene->_rails.disableLine(4, 9); + _scene->_rails.disableLine(8, 0); + + sceneEntrySound(); +} + +void Scene303::step() { + if (_game._trigger == 60) { + _game._player._playerPos = Common::Point(110, 95); + _game._player._stepEnabled = true; + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); + _game._player.resetFacing(FACING_SOUTHWEST); + } + + if (_anim0ActvFl) { + if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() >= 6) && !_skipFrameCheckFl) { + _skipFrameCheckFl = true; + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _scene->_hotspots.activate(NOUN_LARGE_NOTE, false); + _game._objects.addToInventory(OBJ_LARGE_NOTE); + _vm->_sound->command(26); + } + } +} + +void Scene303::actions() { + if ((_action.isAction(VERB_TAKE, NOUN_LARGE_NOTE) && _game._objects.isInRoom(OBJ_LARGE_NOTE)) || ((_game._trigger > 0) && _game._trigger < 3)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('n', 1), 1); + _anim0ActvFl = true; + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0); + _globals[kPlayerScore] += 5; + break; + + case 1: + _anim0ActvFl = false; + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); + _scene->_sequences.addTimer(20, 2); + break; + + case 2: + _vm->_dialogs->showItem(OBJ_LARGE_NOTE, 818, 7); + _game._player._stepEnabled = true; + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLIMB_INTO, NOUN_HOLE) || _action.isAction(VERB_CLIMB_DOWN, NOUN_CHANDELIER_CABLE)) { + if (_globals[kCurrentYear] == 1881) { + switch (_game._trigger) { + case 0: + if (_globals[kRightDoorIsOpen504]) + _vm->_dialogs->show(30331); + + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 3); + _game._player._stepEnabled = false; + _game._player._visible = false; + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0); + break; + + case 3: + _scene->_nextSceneId = 304; + break; + + default: + break; + } + } else + _vm->_dialogs->show(30325); + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_EXIT_TO, NOUN_CATWALK)) { + if (_globals[kRightDoorIsOpen504]) { + if (_vm->_sound->_preferRoland) + _vm->_sound->command(74); + else + _scene->playSpeech(1); + + _vm->_gameConv->run(26); + _vm->_gameConv->exportValue(4); + _action._inProgress = false; + return; + } + } + + if (_action._lookFlag) { + _vm->_dialogs->show(30310); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + // CHECKME: That's illogical, the check is always false... Should be out of the big 'look' check + // It looks to me like an original bug + if (_action.isAction(VERB_EXIT_TO, NOUN_CATWALK)) { + _vm->_dialogs->show(30316); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CATWALK)) { + _vm->_dialogs->show(30311); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GRID)) { + _vm->_dialogs->show(30312); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CHANDELIER_CABLE)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(30317); + else if (_globals[kRightDoorIsOpen504]) + _vm->_dialogs->show(30330); + else + _vm->_dialogs->show(30329); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_HEMP)) { + _vm->_dialogs->show(30313); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BACK_WALL)) { + _vm->_dialogs->show(30314); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DUCTWORK)) { + _vm->_dialogs->show(30315); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CRATE)) { + _vm->_dialogs->show(30318); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SUPPORT)) { + _vm->_dialogs->show(30319); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PIECE_OF_WOOD)) { + _vm->_dialogs->show(30320); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RAILING)) { + _vm->_dialogs->show(30321); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CHANDELIER_TRAP)) { + _vm->_dialogs->show(30322); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_HOLE)) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(30326); + else + _vm->_dialogs->show(30323); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LARGE_NOTE) && _game._objects.isInRoom(OBJ_LARGE_NOTE)) { + _vm->_dialogs->show(30324); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_WALK_TO, NOUN_HOLE)) { + _vm->_dialogs->show(30325); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_HEMP)) { + _vm->_dialogs->show(30327); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_PULL, NOUN_HEMP)) { + _vm->_dialogs->show(30141); + _action._inProgress = false; + return; + } +} + +void Scene303::preActions() { + if (_action.isAction(VERB_EXIT_TO, NOUN_CATWALK) && !_globals[kRightDoorIsOpen504]) { + if (_scene->_customDest.x > 160) + _game._player._walkOffScreenSceneId = 302; + else + _game._player._walkOffScreenSceneId = 307; + } + + if (_action.isAction(VERB_CLIMB_INTO, NOUN_HOLE) || _action.isAction(VERB_CLIMB_DOWN, NOUN_CHANDELIER_CABLE)) + _game._player.walk(Common::Point(110, 95), FACING_SOUTHWEST); +} + +/*------------------------------------------------------------------------*/ + +Scene304::Scene304(MADSEngine *vm) : Scene3xx(vm) { + _anim0ActvFl = false; + _anim1ActvFl = false; + _anim2ActvFl = false; + + _raoulFrame = -1; + _raoulStatus = -1; + _fightFrame = -1; + _fightStatus = -1; + _fightCount = -1; + _phantomFrame = -1; + _phantomStatus = -1; +} + +void Scene304::synchronize(Common::Serializer &s) { + Scene3xx::synchronize(s); + + s.syncAsByte(_anim0ActvFl); + s.syncAsByte(_anim1ActvFl); + s.syncAsByte(_anim2ActvFl); + + s.syncAsSint16LE(_raoulFrame); + s.syncAsSint16LE(_raoulStatus); + s.syncAsSint16LE(_fightFrame); + s.syncAsSint16LE(_fightStatus); + s.syncAsSint16LE(_fightCount); + s.syncAsSint16LE(_phantomFrame); + s.syncAsSint16LE(_phantomStatus); +} + +void Scene304::setup() { + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene304::enter() { + _game._player._playerPos.x = 0; + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _anim0ActvFl = false; + _anim1ActvFl = false; + _anim2ActvFl = false; + } + + if (_globals[kRightDoorIsOpen504]) + _vm->_gameConv->get(23); + + if (!_globals[kRightDoorIsOpen504]) { + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 1)); + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1); + + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('n', 1), 0); + _anim0ActvFl = true; + _raoulStatus = 1; + _game._player._stepEnabled = false; + } else { + _scene->_userInterface.setup(kInputLimitedSentences); + + if (_scene->_priorSceneId == 305) { + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('f', 0)); + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + + _game._player._stepEnabled = false; + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('f', 1), 0); + _anim1ActvFl = true; + _scene->setAnimFrame(_globals._animationIndexes[1], 138); + + } else { + + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('f', 0)); + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('f', 1), 0); + _anim1ActvFl = true; + _phantomStatus = 0; + + _globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('r', 1), 0); + _anim2ActvFl = true; + _fightStatus = 0; + + _game._player._stepEnabled = false; + _fightCount = 0; + + _globals[kPlayerScore] += 10; + + _vm->_gameConv->run(23); + _vm->_gameConv->hold(); + } + } + + + if ((_scene->_priorSceneId == RETURNING_FROM_LOADING) && !_globals[kRightDoorIsOpen504]) { + _scene->setAnimFrame(_globals._animationIndexes[0], 53); + _game._player._stepEnabled = true; + } + + _game._player._visible = false; + + sceneEntrySound(); +} + +void Scene304::step() { + if (_anim0ActvFl) + handleRaoulAnimation(); + + if (_anim1ActvFl) + handlePhantomAnimation(); + + if (_anim2ActvFl) + handleFightAnimation(); +} + +void Scene304::actions() { + if (_vm->_gameConv->_running == 23) { + handleConversation23(); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLIMB_THROUGH, NOUN_OPENING) || _action.isAction(VERB_CLIMB, NOUN_CHANDELIER_CABLE)) { + _raoulStatus = 0; + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(30410); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_CEILING)) { + _vm->_dialogs->show(30411); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOME)) { + _vm->_dialogs->show(30412); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LATTICEWORK)) { + _vm->_dialogs->show(30413); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_OPENING)) { + _vm->_dialogs->show(30414); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CHANDELIER)) { + _vm->_dialogs->show(30415); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CHANDELIER_CABLE)) { + _vm->_dialogs->show(30416); + _action._inProgress = false; + return; + } + } +} + +void Scene304::preActions() { +} + +void Scene304::handleConversation23() { + switch (_action._activeAction._verbId) { + case 5: + _phantomStatus = 1; + _vm->_gameConv->hold(); + break; + + case 6: + if (_phantomStatus != 1) + _fightStatus = 0; + + _vm->_gameConv->hold(); + break; + + case 9: + if (_phantomStatus != 1) + _fightStatus = 2; + + break; + + case 12: + _phantomStatus = 2; + break; + + default: + break; + } + + _fightCount = 0; +} + +void Scene304::handleRaoulAnimation() { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _raoulFrame) + return; + + _raoulFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + int resetFrame = -1; + + switch (_raoulFrame) { + case 20: + _game._player._stepEnabled = true; + resetFrame = 53; + break; + + case 53: + _scene->_nextSceneId = 303; + break; + + case 54: + case 55: + case 56: + if (_raoulStatus == 0) { + resetFrame = 20; + _game._player._stepEnabled = false; + } else { + int random = _vm->getRandomNumber(1, 50); + switch (_raoulFrame) { + case 54: + if (random == 1) + resetFrame = 54; + else if (random == 2) + resetFrame = 55; + else + resetFrame = _raoulFrame - 1; + + break; + + case 55: + if (random == 1) + resetFrame = 54; + else if (random == 2) + resetFrame = 53; + else + resetFrame = _raoulFrame - 1; + + break; + + case 56: + if (random == 1) + resetFrame = 55; + else if (random == 2) + resetFrame = 53; + else + resetFrame = _raoulFrame - 1; + + break; + + default: + break; + } + } + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame); + _raoulFrame = resetFrame; + } +} + +void Scene304::handlePhantomAnimation() { + if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _phantomFrame) + return; + + _phantomFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame(); + int resetFrame = -1; + + switch (_phantomFrame) { + case 7: + case 11: + resetFrame = _vm->getRandomNumber(6, 7); + + if (_phantomStatus == 1) + resetFrame = 7; + + break; + + case 9: + case 15: + switch (_vm->getRandomNumber(1, 3)) { + case 1: + resetFrame = 8; + break; + + case 2: + resetFrame = 9; + break; + + case 3: + resetFrame = 11; + break; + } + + if (_phantomStatus == 1) + resetFrame = 11; + + break; + + case 13: + case 24: + switch (_vm->getRandomNumber(1, 3)) { + case 1: + resetFrame = 12; + break; + + case 2: + resetFrame = 13; + break; + + case 3: + resetFrame = 16; + break; + } + + if (_phantomStatus == 1) + resetFrame = 16; + + break; + + case 20: + if (_vm->getRandomNumber(1, 2) == 1) + resetFrame = 19; + else + resetFrame = 20; + + if (_phantomStatus == 1) + resetFrame = 24; + + break; + + case 25: + _vm->_gameConv->release(); + break; + + case 47: + _fightStatus = 0; + break; + + case 59: + if (_phantomStatus == 2) + resetFrame = 59; + else + resetFrame = 58; + break; + + case 60: + _game._player._stepEnabled = false; + break; + + case 80: + _game._objects.setRoom(OBJ_SWORD, NOWHERE); + break; + + case 137: + _game._player._playerPos.x = 100; + _scene->_nextSceneId = 305; + break; + + case 176: + _game._player._playerPos.x = 200; + _scene->_nextSceneId = 305; + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[1], resetFrame); + _phantomFrame = resetFrame; + } +} + +void Scene304::handleFightAnimation() { + if (_scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame() == _fightFrame) + return; + + _fightFrame = _scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame(); + int resetFrame = -1; + + switch (_fightFrame) { + case 22: + _vm->_gameConv->release(); + break; + + case 23: + if (_fightStatus != 2) + resetFrame = 22; + break; + + case 25: + case 26: + case 27: + if (_fightStatus == 2) { + resetFrame = _vm->getRandomNumber(24, 26); + ++_fightCount; + if (_fightCount > 17) + resetFrame = 24; + } + break; + + case 28: + _fightStatus = 2; + break; + + case 45: + _vm->_gameConv->release(); + break; + + case 46: + case 47: + case 48: + if (_fightStatus == 2) { + resetFrame = _vm->getRandomNumber(45, 47); + ++_fightCount; + if (_fightCount > 17) + resetFrame = 45; + } + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[2], resetFrame); + _fightFrame = resetFrame; + } +} + +/*------------------------------------------------------------------------*/ + +Scene305::Scene305(MADSEngine *vm) : Scene3xx(vm) { + _anim0ActvFl = false; + _anim1ActvFl = false; + _skipFl = false; + _unmaskFl = false; + + _unmaskFrame = -1; +} + +void Scene305::synchronize(Common::Serializer &s) { + Scene3xx::synchronize(s); + + s.syncAsByte(_anim0ActvFl); + s.syncAsByte(_anim1ActvFl); + s.syncAsByte(_skipFl); + s.syncAsByte(_unmaskFl); + + s.syncAsSint16LE(_unmaskFrame); +} + +void Scene305::setup() { + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene305::enter() { + _unmaskFl = false; + _skipFl = false; + _game._player._visible = false; + _anim0ActvFl = false; + _anim1ActvFl = false; + + _scene->_userInterface.setup(kInputLimitedSentences); + _scene->loadSpeech(5); + _game.loadQuoteSet(0x64, 0x65, 0); + + if (_game._player._playerPos.x == 100) { + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('r', 1), 60); + _scene->_hotspots.activate(NOUN_MASK, false); + _anim1ActvFl = true; + } else if (_game._player._playerPos.x == 200) { + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 1), 0); + _anim0ActvFl = true; + _scene->_hotspots.activate(NOUN_CANE, false); + } + + sceneEntrySound(); +} + +void Scene305::step() { + if (_anim0ActvFl) + handle_animation_unmask (); + + if (_anim1ActvFl) { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 53) + _game._player._stepEnabled = false; + + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 54 && !_skipFl) { + _scene->playSpeech(5); + _skipFl = true; + } + } + + if (_game._trigger == 60) { + _globals[kPlayerScore] -= 10; + _scene->_userInterface.noInventoryAnim(); + // CHECKME: Not sure about the next function call + _scene->_userInterface.refresh(); + _scene->_nextSceneId = 303; + } +} + +void Scene305::actions() { + if (_action.isAction(VERB_PUSH, NOUN_CANE)) { + _scene->_nextSceneId = 304; + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_MASK)) { + _unmaskFl = true; + _game._player._stepEnabled = false; + _action._inProgress = false; + } +} + +void Scene305::preActions() { +} + +void Scene305::handle_animation_unmask() { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _unmaskFrame) + return; + + _unmaskFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + int resetFrame = -1; + + switch (_unmaskFrame) { + case 25: + if (!_unmaskFl) + resetFrame = 0; + + break; + + case 60: + _scene->playSpeech(10); + _scene->_kernelMessages.add(Common::Point(176, 53), 0x1110, 0, 0, 360, _game.getQuote(0x64)); + _scene->_kernelMessages.add(Common::Point(176, 68), 0x1110, 0, 0, 360, _game.getQuote(0x65)); + break; + + case 95: + _scene->_nextSceneId = 306; + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame); + _unmaskFrame = resetFrame; + } +} + +/*------------------------------------------------------------------------*/ + +Scene306::Scene306(MADSEngine *vm) : Scene3xx(vm) { + _speechDoneFl = false; +} + +void Scene306::synchronize(Common::Serializer &s) { + Scene3xx::synchronize(s); + + s.syncAsByte(_speechDoneFl); +} + +void Scene306::setup() { + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene306::enter() { + _scene->loadSpeech(6); + _speechDoneFl = false; + + warning("TODO: Switch to letter box view. See definition of MADS_MENU_Y"); + + _game._player._visible = false; + _game._player._stepEnabled = false; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('a', 1), 60); + + sceneEntrySound(); +} + +void Scene306::step() { + if (_game._trigger == 60) { + if (_vm->_sound->_preferRoland) + _scene->_sequences.addTimer(120, 61); + else + _scene->_sequences.addTimer(300, 61); + } + + if (!_speechDoneFl && (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 3)) { + _scene->playSpeech(6); + _speechDoneFl = true; + } + + if (_game._trigger == 61) { + _vm->_sound->command(1); + _vm->_sound->command(66); + _scene->_sequences.addTimer(120, 62); + } + + if (_game._trigger == 62) + _scene->_nextSceneId = 150; +} + +void Scene306::actions() { +} + +void Scene306::preActions() { +} + +/*------------------------------------------------------------------------*/ + +Scene307::Scene307(MADSEngine *vm) : Scene3xx(vm) { +} + +void Scene307::synchronize(Common::Serializer &s) { + Scene3xx::synchronize(s); +} + +void Scene307::setup() { + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene307::enter() { + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 0)); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RRD_9"); + _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RDR_9"); + + if (_globals[kRightDoorIsOpen504]) + _scene->_hotspots.activate(NOUN_DOOR, true); + else + _scene->_hotspots.activate(NOUN_DOOR, false); + + if (_game._objects.isInRoom(OBJ_GREEN_FRAME) && (_game._difficulty == DIFFICULTY_EASY)) { + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + } else + _scene->_hotspots.activate(NOUN_GREEN_FRAME, false); + + if (_scene->_priorSceneId == 308) { + _game._player._playerPos = Common::Point(18, 134); + _game._player._facing = FACING_SOUTHEAST; + _game._player._stepEnabled = false; + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -2); + if (!(_globals[kPlayerScoreFlags] & 16)) { + _globals[kPlayerScoreFlags] |= 16; + _globals[kPlayerScore] += 5; + } + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4); + _game._player.walk(Common::Point(41, 137), FACING_EAST); + _game._player.setWalkTrigger(60); + } else if ((_scene->_priorSceneId == 303) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) + _game._player.firstWalk(Common::Point(340, 137), FACING_WEST, Common::Point(304, 137), FACING_WEST, true); + + sceneEntrySound(); +} + +void Scene307::step() { + switch (_game._trigger) { + case 60: + _scene->deleteSequence(_globals._sequenceIndexes[3]); + _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 10); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 61); + break; + + case 61: + _vm->_sound->command(25); + _game._player._stepEnabled = true; + break; + + default: + break; + } +} + +void Scene307::actions() { + if (_action.isAction(VERB_TAKE, NOUN_GREEN_FRAME) && (_game._objects.isInRoom(OBJ_GREEN_FRAME) || _game._trigger)) { + switch (_game._trigger) { + case (0): + if (_globals[kCurrentYear] == 1881) { + int count = 0; + if (_game._objects.isInInventory(OBJ_YELLOW_FRAME)) + ++count; + if (_game._objects.isInInventory(OBJ_RED_FRAME)) + ++count; + if (_game._objects.isInInventory(OBJ_BLUE_FRAME)) + ++count; + + if (count < 3) + _globals[kPlayerScore] += 5; + } + + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 5, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _scene->_hotspots.activate(NOUN_GREEN_FRAME, false); + _game._objects.addToInventory(OBJ_GREEN_FRAME); + _vm->_sound->command(26); + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[1]); + _game._player._visible = true; + _scene->_sequences.addTimer(20, 3); + break; + + case 3: + if (_globals[kCurrentYear] == 1881) + _vm->_dialogs->showItem(OBJ_GREEN_FRAME, 845, 0); + else + _vm->_dialogs->showItem(OBJ_GREEN_FRAME, 819, 0); + + _game._player._stepEnabled = true; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[4], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 4, 70); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 72); + break; + + case 70: + _vm->_sound->command(24); + _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 71); + break; + + case 71: { + int idx = _globals._sequenceIndexes[3]; + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -2); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_SEQ, idx); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + _scene->_sequences.addTimer(10, 73); + } + break; + + case 72: + _game._player._visible = true; + break; + + case 73: + _scene->_nextSceneId = 308; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(30710); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_COLUMN)) { + if (_globals[kRightDoorIsOpen504]) + _vm->_dialogs->show(30725); + else + _vm->_dialogs->show(30711); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CATWALK)) { + _vm->_dialogs->show(30712); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GRID)) { + _vm->_dialogs->show(30713); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GIRDER)) { + _vm->_dialogs->show(30714); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GRIDWORK)) { + _vm->_dialogs->show(30715); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_HEMP)) { + _vm->_dialogs->show(30716); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BACK_WALL)) { + _vm->_dialogs->show(30717); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DUCTWORK)) { + _vm->_dialogs->show(30718); + _action._inProgress = false; + return; + } + + if ((_action.isObject(NOUN_GREEN_FRAME)) && (_game._objects.isInRoom(OBJ_GREEN_FRAME))) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(30719); + else + _vm->_dialogs->show(30720); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ALCOVE)) { + _vm->_dialogs->show(30721); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RAILING)) { + _vm->_dialogs->show(30722); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR)) { + _vm->_dialogs->show(30726); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE, NOUN_HEMP)) { + _vm->_dialogs->show(30723); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_PULL, NOUN_HEMP)) { + _vm->_dialogs->show(30141); + _action._inProgress = false; + } +} + +void Scene307::preActions() { + if (_action.isAction(VERB_EXIT_TO, NOUN_ALCOVE)) + _game._player._walkOffScreenSceneId = 303; + + if (_action.isAction(VERB_OPEN, NOUN_DOOR)) + _game._player.walk(Common::Point(28, 137), FACING_NORTHWEST); +} + +/*------------------------------------------------------------------------*/ + +Scene308::Scene308(MADSEngine *vm) : Scene3xx(vm) { + _anim0ActvFl = false; + _anim1ActvFl = false; + _anim2ActvFl = false; + _anim3ActvFl = false; + _skip1Fl = false; + _skip2Fl = false; + + _currentFloor = -1; +} + +void Scene308::synchronize(Common::Serializer &s) { + Scene3xx::synchronize(s); + + s.syncAsByte(_anim0ActvFl); + s.syncAsByte(_anim1ActvFl); + s.syncAsByte(_anim2ActvFl); + s.syncAsByte(_anim3ActvFl); + s.syncAsByte(_skip1Fl); + s.syncAsByte(_skip2Fl); + + s.syncAsSint16LE(_currentFloor); +} + +void Scene308::setup() { + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene308::enter() { + _scene->loadSpeech(4); + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _anim0ActvFl = false; + _anim1ActvFl = false; + _anim2ActvFl = false; + _anim3ActvFl = false; + } + + _skip1Fl = false; + _skip2Fl = false; + + _vm->_gameConv->get(26); + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('a', 0)); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('b', 0)); + _scene->_userInterface.setup(kInputLimitedSentences); + _game._player._visible = false; + + if (_scene->_priorSceneId == RETURNING_FROM_LOADING) { + switch (_currentFloor) { + case 1: + if (_globals[kRightDoorIsOpen504]) { + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10); + _scene->_sequences.setPosition(_globals._sequenceIndexes[0], Common::Point(160, 104)); + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10); + _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(161, 124)); + } else { + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10); + _scene->_sequences.setPosition(_globals._sequenceIndexes[0], Common::Point(160, 127)); + } + break; + + case 2: + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10); + _scene->_sequences.setPosition(_globals._sequenceIndexes[0], Common::Point(160, 76)); + break; + + case 3: + if (_globals[kRightDoorIsOpen504] && !_globals[kKnockedOverHead]) { + _anim0ActvFl = true; + _skip1Fl = true; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 2), 2); + _scene->setAnimFrame(_globals._animationIndexes[0], 76); + } else { + _anim0ActvFl = true; + _skip1Fl = true; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 2), 2); + _scene->setAnimFrame(_globals._animationIndexes[0], 96); + } + break; + + default: + break; + } + } else if (_scene->_priorSceneId == 309) { + _currentFloor = 1; + if (_globals[kRightDoorIsOpen504]) { + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10); + _scene->_sequences.setPosition(_globals._sequenceIndexes[0], Common::Point(160, 104)); + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10); + _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(161, 124)); + } else { + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10); + _scene->_sequences.setPosition(_globals._sequenceIndexes[0], Common::Point(160, 127)); + } + } else if (_scene->_priorSceneId == 206) { + _currentFloor = 2; + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10); + _scene->_sequences.setPosition(_globals._sequenceIndexes[0], Common::Point(160, 76)); + } else if (_scene->_priorSceneId == 307) { + _currentFloor = 3; + _anim0ActvFl = true; + _skip1Fl = true; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 2), 2); + _scene->setAnimFrame(_globals._animationIndexes[0], 96); + } + + if (!_game._visitedScenes._sceneRevisited) { + _globals[kPlayerScore] += 5; + _scene->_sequences.addTimer(1, 60); + } + + sceneEntrySound(); +} + +void Scene308::step() { + if (_game._trigger == 60) + _vm->_dialogs->show(30810); + + if (_anim2ActvFl) { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 77) { + _scene->setAnimFrame(_globals._animationIndexes[0], 76); + if (!_skip1Fl) { + _game._player._stepEnabled = true; + _vm->_dialogs->show(30811); + _skip1Fl = true; + } + } + } + + if (_anim0ActvFl) { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 97) { + if (_globals[kTopFloorLocked]) { + _scene->setAnimFrame(_globals._animationIndexes[0], 96); + if (!_skip1Fl) { + _game._player._stepEnabled = true; + _vm->_dialogs->show(30811); + _skip1Fl = true; + } + } + } else if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 116) { + _globals[kTopFloorLocked] = true; + _scene->_nextSceneId = 307; + } + } + + if (_anim1ActvFl) { + if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 51) && _globals[kTopFloorLocked]) { + _scene->setAnimFrame(_globals._animationIndexes[0], 50); + if (!_skip1Fl) { + _game._player._stepEnabled = true; + _vm->_dialogs->show(30811); + _skip1Fl = true; + } + } + } +} + +void Scene308::actions() { + switch (_game._trigger) { + case 1: + _scene->_nextSceneId = 206; + _action._inProgress = false; + return; + + case 2: + _scene->_nextSceneId = 307; + _action._inProgress = false; + return; + + case 3: + _scene->_nextSceneId = 309; + _action._inProgress = false; + return; + + default: + break; + } + + if (_action.isAction(VERB_EXIT_TO, NOUN_MIDDLE_LEVEL)) { + switch (_currentFloor) { + case 1: + if (_globals[kRightDoorIsOpen504]) { + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 1), 1); + _scene->deleteSequence(_globals._sequenceIndexes[0]); + _scene->deleteSequence(_globals._sequenceIndexes[1]); + _game._player._stepEnabled = false; + } else { + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 1), 1); + _scene->deleteSequence(_globals._sequenceIndexes[0]); + _game._player._stepEnabled = false; + } + _action._inProgress = false; + return; + + case 2: + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('m', 1), 1); + _scene->deleteSequence(_globals._sequenceIndexes[0]); + _game._player._stepEnabled = false; + _action._inProgress = false; + return; + + case 3: + if (_globals[kRightDoorIsOpen504] && !_globals[kKnockedOverHead]) { + _scene->freeAnimation(_globals._animationIndexes[0]); + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 4), 1); + _game._player._stepEnabled = false; + _anim2ActvFl = false; + + } else { + _scene->freeAnimation(_globals._animationIndexes[0]); + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('x', 1), 1); + _game._player._stepEnabled = false; + _anim0ActvFl = false; + _anim1ActvFl = false; + } + _action._inProgress = false; + return; + + default: + break; + } + } + + if (_action.isAction(VERB_EXIT_TO, NOUN_UPPER_LEVEL)) { + switch (_currentFloor) { + case 1: + if (_globals[kRightDoorIsOpen504]) { + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 2), 1); + _scene->deleteSequence(_globals._sequenceIndexes[0]); + _scene->deleteSequence(_globals._sequenceIndexes[1]); + _game._player._stepEnabled = false; + _anim2ActvFl = true; + _currentFloor = 3; + } else { + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 2), 2); + _scene->deleteSequence(_globals._sequenceIndexes[0]); + _game._player._stepEnabled = false; + _anim0ActvFl = true; + _currentFloor = 3; + } + _action._inProgress = false; + return; + + case 2: + if (_globals[kRightDoorIsOpen504]) { + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 3), 2); + _scene->deleteSequence(_globals._sequenceIndexes[0]); + _game._player._stepEnabled = false; + } else { + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 3), 2); + _scene->deleteSequence(_globals._sequenceIndexes[0]); + _game._player._stepEnabled = false; + _anim1ActvFl = true; + _currentFloor = 3; + } + _action._inProgress = false; + return; + + case 3: + if (_globals[kRightDoorIsOpen504]) + _globals[kTopFloorLocked] = false; + else { + _skip2Fl = false; + _skip1Fl = false; + } + _action._inProgress = false; + return; + + default: + break; + } + } + + if (_action.isAction(VERB_EXIT_TO, NOUN_LOWER_LEVEL)) { + switch (_currentFloor) { + case 1: + if (_globals[kRightDoorIsOpen504]) { + _vm->_gameConv->run(26); + _vm->_gameConv->exportValue(1); + } else { + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('l', 1), 3); + _scene->deleteSequence(_globals._sequenceIndexes[0]); + _game._player._stepEnabled = false; + } + _action._inProgress = false; + return; + + case 2: + if (_globals[kRightDoorIsOpen504]) { + if (_vm->_sound->_preferRoland) + _vm->_sound->command(74); + else + _scene->playSpeech(1); + + _vm->_gameConv->run(26); + _vm->_gameConv->exportValue(6); + + } else { + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 3); + _scene->deleteSequence(_globals._sequenceIndexes[0]); + _game._player._stepEnabled = false; + } + _action._inProgress = false; + return; + + case 3: + if (_globals[kRightDoorIsOpen504] && !_globals[kKnockedOverHead]) { + _vm->_gameConv->run(26); + _vm->_gameConv->exportValue(5); + } else if (_globals[kRightDoorIsOpen504] && _globals[kKnockedOverHead]) { + if (_vm->_sound->_preferRoland) + _vm->_sound->command(74); + else + _scene->playSpeech(1); + + _vm->_gameConv->run(26); + _vm->_gameConv->exportValue(6); + } else { + _scene->freeAnimation(_globals._animationIndexes[0]); + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('x', 2), 3); + _game._player._stepEnabled = false; + _anim0ActvFl = false; + _anim1ActvFl = false; + } + _action._inProgress = false; + return; + + default: + break; + } + } +} + +void Scene308::preActions() { +} + +/*------------------------------------------------------------------------*/ + +Scene309::Scene309(MADSEngine *vm) : Scene3xx(vm) { + _anim0ActvFl = false; + + _boatStatus = -1; + _boatFrame = -1; + _talkCount = -1; +} + +void Scene309::synchronize(Common::Serializer &s) { + Scene3xx::synchronize(s); + + s.syncAsByte(_anim0ActvFl); + + s.syncAsSint16LE(_boatStatus); + s.syncAsSint16LE(_boatFrame); + s.syncAsSint16LE(_talkCount); +} + +void Scene309::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + if (_globals[kRightDoorIsOpen504]) + _scene->_variant = 1; +} + +void Scene309::enter() { + _scene->_hotspots.activate(NOUN_CHRISTINE, false); + _scene->_hotspots.activate(NOUN_BOAT, false); + + _anim0ActvFl = false; + _boatStatus = 1; + _vm->_gameConv->get(26); + + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1)); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RDR_9"); + + if (_scene->_priorSceneId == RETURNING_FROM_LOADING) { + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10); + + if (_game._visitedScenes.exists(310)) { + _anim0ActvFl = true; + + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 1), 70); + _scene->setAnimFrame(_globals._animationIndexes[0], 184); + int id = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots.setPosition(id, Common::Point(62, 146), FACING_NORTHWEST); + _scene->_dynamicHotspots[id]._articleNumber = PREP_ON; + + _scene->setDynamicAnim(id, _globals._animationIndexes[0], 10); + _scene->setDynamicAnim(id, _globals._animationIndexes[0], 11); + _scene->setDynamicAnim(id, _globals._animationIndexes[0], 12); + _scene->setDynamicAnim(id, _globals._animationIndexes[0], 13); + _scene->setDynamicAnim(id, _globals._animationIndexes[0], 14); + _scene->setDynamicAnim(id, _globals._animationIndexes[0], 15); + _scene->setDynamicAnim(id, _globals._animationIndexes[0], 16); + _scene->setDynamicAnim(id, _globals._animationIndexes[0], 17); + _scene->setDynamicAnim(id, _globals._animationIndexes[0], 18); + _scene->_hotspots.activate(NOUN_CHRISTINE, true); + _scene->_hotspots.activate(NOUN_BOAT, true); + } + } + + if (_scene->_priorSceneId == 404) { + _game._player._playerPos = Common::Point(319, 136); + _game._player._facing = FACING_SOUTHWEST; + _game._player.walk(Common::Point(281, 148), FACING_SOUTHWEST); + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10); + } else if (_scene->_priorSceneId == 310) { + _game._player._playerPos = Common::Point(209, 144); + _game._player._facing = FACING_SOUTH; + _game._player._stepEnabled = false; + _game._player._visible = false; + _anim0ActvFl = true; + + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 1), 70); + int id = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots.setPosition(id, Common::Point(63, 146), FACING_NORTHWEST); + _scene->_dynamicHotspots[id]._articleNumber = PREP_ON; + + _scene->setDynamicAnim(id, _globals._animationIndexes[0], 10); + _scene->setDynamicAnim(id, _globals._animationIndexes[0], 11); + _scene->setDynamicAnim(id, _globals._animationIndexes[0], 12); + _scene->setDynamicAnim(id, _globals._animationIndexes[0], 13); + _scene->setDynamicAnim(id, _globals._animationIndexes[0], 14); + _scene->setDynamicAnim(id, _globals._animationIndexes[0], 15); + _scene->setDynamicAnim(id, _globals._animationIndexes[0], 16); + _scene->setDynamicAnim(id, _globals._animationIndexes[0], 17); + _scene->setDynamicAnim(id, _globals._animationIndexes[0], 18); + _scene->_hotspots.activate(NOUN_CHRISTINE, true); + _scene->_hotspots.activate(NOUN_BOAT, true); + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10); + } else if ((_scene->_priorSceneId == 308) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + _game._player._playerPos = Common::Point(0, 121); + _game._player._facing = FACING_SOUTHEAST; + _game._player.walk(Common::Point(28, 142), FACING_SOUTHEAST); + _game._player.setWalkTrigger(65); + _game._player._stepEnabled = false; + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10); + } + + sceneEntrySound(); +} + +void Scene309::step() { + if (_anim0ActvFl) + handleBoatAnimation (); + + switch (_game._trigger) { + case 65: + _scene->deleteSequence(_globals._sequenceIndexes[0]); + _globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 66); + break; + + case 66: + _vm->_sound->command(25); + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10); + _game._player._stepEnabled = true; + break; + + default: + break; + } +} + +void Scene309::actions() { + if (_action.isAction(VERB_WALK_THROUGH, NOUN_STONE_ARCHWAY)) { + if (_globals[kRightDoorIsOpen504]) { + _vm->_gameConv->run(26); + _vm->_gameConv->exportValue(1); + _boatStatus = 0; + _talkCount = 0; + } else if (_globals[kLanternStatus] == 1) + _game.enterCatacombs(false); + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TALK_TO, NOUN_CHRISTINE)) { + _vm->_gameConv->run(26); + _vm->_gameConv->exportValue(1); + _boatStatus = 0; + _talkCount = 0; + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 4, 60); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 62); + break; + + case 60: + _scene->deleteSequence(_globals._sequenceIndexes[0]); + _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 61); + _vm->_sound->command(24); + break; + + case 61: { + int idx = _globals._sequenceIndexes[0]; + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 5); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[0], SYNC_SEQ, idx); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _game._player.walk(Common::Point(0, 121), FACING_NORTHWEST); + _game._player.setWalkTrigger(63); + } + break; + + case 62: + _game._player._visible = true; + break; + + case 63: + if (!_globals[kRightDoorIsOpen504]) { + _scene->deleteSequence(_globals._sequenceIndexes[0]); + _globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 64); + _vm->_sound->command(25); + } else + _scene->setAnimFrame(_globals._animationIndexes[0], 186); + + break; + + case 64: + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 5); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 1); + _scene->_nextSceneId = 308; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(30910); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_STONE_WALL)) { + _vm->_dialogs->show(30911); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LAKE)) { + _vm->_dialogs->show(30912); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_STONE_COLUMN)) { + _vm->_dialogs->show(30913); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOORWAY)) { + _vm->_dialogs->show(30914); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_STONE_ARCHWAY)) { + _vm->_dialogs->show(30915); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_STONE_FLOOR)) { + _vm->_dialogs->show(30916); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CATACOMBS)) { + _vm->_dialogs->show(30917); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CHRISTINE)) { + _vm->_dialogs->show(30919); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BOAT)) { + _vm->_dialogs->show(30921); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_CLIMB_INTO, NOUN_BOAT)) { + _vm->_dialogs->show(30920); + _action._inProgress = false; + } +} + +void Scene309::preActions() { + if (_action.isAction(VERB_WALK_THROUGH, NOUN_STONE_ARCHWAY) && (_globals[kLanternStatus] == 0)) { + _game._player._needToWalk = false; + _vm->_dialogs->show(30918); + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_STONE_ARCHWAY) && _globals[kRightDoorIsOpen504]) + _game._player.walk(Common::Point(285, 147), FACING_NORTHEAST); + + if (_action.isAction(VERB_OPEN, NOUN_DOOR)) + _game._player.walk(Common::Point(16, 139), FACING_NORTHEAST); +} + +void Scene309::handleBoatAnimation() { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _boatFrame) + return; + + _boatFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + int resetFrame = -1; + + switch (_boatFrame) { + case 72: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); + _game._player._visible = true; + break; + + case 130: + _game._player._stepEnabled = true; + break; + + case 185: + if (_boatStatus == 0) + resetFrame = 244; + else + resetFrame = 184; + + break; + + case 244: + _scene->_nextSceneId = 308; + break; + + case 245: + case 246: + case 247: + resetFrame = _vm->getRandomNumber(244, 246); + ++_talkCount; + if (_talkCount > 10) { + resetFrame = 184; + _boatStatus = 1; + } + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame); + _boatFrame = resetFrame; + } +} + +/*------------------------------------------------------------------------*/ + +Scene310::Scene310(MADSEngine *vm) : Scene3xx(vm) { + _raoulMessageColor = -1; + _chrisMessageColor = -1; + _lakeFrame = -1; + for (int i = 0; i < 4; i++) + _multiplanePosX[i] = -1; +} + +void Scene310::synchronize(Common::Serializer &s) { + Scene3xx::synchronize(s); + + s.syncAsSint16LE(_raoulMessageColor); + s.syncAsSint16LE(_chrisMessageColor); + s.syncAsSint16LE(_lakeFrame); + for (int i = 0; i < 4; i++) + s.syncAsSint16LE(_multiplanePosX[i]); +} + +void Scene310::setup() { + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene310::enter() { + warning("TODO: Switch to letter box view. See definition of MADS_MENU_Y"); + + for (int i = 0; i < 4; i++) { + _globals._spriteIndexes[i] = _scene->_sprites.addSprites(formAnimName('f', i)); + _globals._sequenceIndexes[i] = -1; + } + + _multiplanePosX[0] = 100; + _multiplanePosX[1] = 210; + _multiplanePosX[2] = 320; + _multiplanePosX[3] = 472; + + _game.loadQuoteSet(0x66, 0x67, 0x69, 0x6A, 0x6C, 0x6D, 0x6E, 0x6F, 0x71, 0x72, 0x74, 0x70, 0x68, 0x73, 0x6B, 0); + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('l', 1), 80); + _scene->_animation[_globals._animationIndexes[0]]->_canChangeView = true; + _game._camX._manualFl = true; + + _raoulMessageColor = 0x102; + _chrisMessageColor = 0x1110; + + _scene->_userInterface.emptyConversationList(); + _scene->_userInterface.setup(kInputConversation); + + sceneEntrySound(); +} + +void Scene310::step() { + handleLakeAnimation(); + + if (_game._trigger == 80) + _scene->_nextSceneId = 309; + + bool positionsSetFl = false; + + if (_globals._animationIndexes[0] >= 0) { + MADS::Animation *anim = _scene->_animation[_globals._animationIndexes[0]]; + int curFrame = anim->getCurrentFrame(); + uint32 clock = anim->getNextFrameTimer(); + if ((curFrame > 0) && (_scene->_frameStartTime >= clock)) { + Common::Point pos = anim->getFramePosAdjust(curFrame); + if (pos.x != _scene->_posAdjust.x) { + setMultiplanePos(pos.x); + positionsSetFl = true; + } + } + } + + if (!positionsSetFl && (_game._fx != kTransitionNone)) + setMultiplanePos(320); +} + +void Scene310::actions() { +} + +void Scene310::preActions() { +} + +void Scene310::setMultiplanePos(int x_new) { + int center = x_new + 160; + + for (int i = 0; i < 4; i++) { + if (_globals._sequenceIndexes[i] >= 0) + _scene->deleteSequence(_globals._sequenceIndexes[i]); + + int difference = center - _multiplanePosX[i]; + + int direction = 0; + if (difference < 0) + direction = 1; + else if (difference > 0) + direction = -1; + + int displace = abs(difference); + if (direction < 0) + displace = -displace; + + int x = _multiplanePosX[i] + displace - 1; + int y = _scene->_sprites[_globals._spriteIndexes[i]]->getFrameWidth(0) + 29; + int halfWidth = 1 + (_scene->_sprites[_globals._spriteIndexes[i]]->getFrameHeight(0) / 2); + + if (((x - halfWidth) >= (x_new + 320)) || ((x + halfWidth) < x_new)) + _globals._sequenceIndexes[i] = -1; + else { + _globals._sequenceIndexes[i] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[i], false, 1); + _scene->_sequences.setPosition(_globals._sequenceIndexes[i], Common::Point(x, y)); + _scene->_sequences.setDepth(_globals._sequenceIndexes[i], 1); + } + } +} + +void Scene310::handleLakeAnimation() { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _lakeFrame) + return; + + _lakeFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + int id; + + switch (_lakeFrame) { + case 60: + id = _scene->_kernelMessages.add(Common::Point(-142, 0), _chrisMessageColor, 0, 61, 600, _game.getQuote(0x66)); + _scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0); + id = _scene->_kernelMessages.add(Common::Point(-142, 15), _chrisMessageColor, 0, 0, 600, _game.getQuote(0x67)); + _scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0); + id = _scene->_kernelMessages.add(Common::Point(-142, 30), _chrisMessageColor, 0, 0, 600, _game.getQuote(0x68)); + _scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0); + break; + + case 120: + _scene->_kernelMessages.reset(); + break; + + case 140: + id = _scene->_kernelMessages.add(Common::Point(-120, 0), _chrisMessageColor, 0, 63, 360, _game.getQuote(0x69)); + _scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0); + id = _scene->_kernelMessages.add(Common::Point(-120, 15), _chrisMessageColor, 0, 0, 360, _game.getQuote(0x6A)); + _scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0); + id = _scene->_kernelMessages.add(Common::Point(-120, 30), _chrisMessageColor, 0, 0, 360, _game.getQuote(0x6B)); + _scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0); + break; + + case 200: + _scene->_kernelMessages.reset(); + break; + + case 220: + id = _scene->_kernelMessages.add(Common::Point(-32, 30), _chrisMessageColor, 0, 65, 240, _game.getQuote(0x6C)); + _scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0); + id = _scene->_kernelMessages.add(Common::Point(-32, 45), _chrisMessageColor, 0, 0, 240, _game.getQuote(0x6D)); + _scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0); + break; + + case 280: + _scene->_kernelMessages.reset(); + break; + + case 300: + id = _scene->_kernelMessages.add(Common::Point(101, 0), _raoulMessageColor, 0, 67, 360, _game.getQuote(0x6E)); + _scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0); + id = _scene->_kernelMessages.add(Common::Point(101, 15), _raoulMessageColor, 0, 0, 360, _game.getQuote(0x6F)); + _scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0); + id = _scene->_kernelMessages.add(Common::Point(101, 30), _raoulMessageColor, 0, 0, 360, _game.getQuote(0x70)); + _scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0); + break; + + case 360: + _scene->_kernelMessages.reset(); + break; + + case 380: + id = _scene->_kernelMessages.add(Common::Point(107, 0), _chrisMessageColor, 0, 69, 360, _game.getQuote(0x71)); + _scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0); + id = _scene->_kernelMessages.add(Common::Point(107, 15), _chrisMessageColor, 0, 0, 360, _game.getQuote(0x72)); + _scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0); + id = _scene->_kernelMessages.add(Common::Point(107, 30), _chrisMessageColor, 0, 0, 360, _game.getQuote(0x73)); + _scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0); + break; + + case 440: + _scene->_kernelMessages.reset(); + break; + + case 460: + id = _scene->_kernelMessages.add(Common::Point(107, 7), _chrisMessageColor, 0, 0, 180, _game.getQuote(0x74)); + _scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0); + break; + + case 510: + _scene->_kernelMessages.reset(); + break; + + default: + break; + } +} + +/*------------------------------------------------------------------------*/ + +} // End of namespace Phantom +} // End of namespace MADS diff --git a/engines/mads/phantom/phantom_scenes3.h b/engines/mads/phantom/phantom_scenes3.h new file mode 100644 index 0000000000..9f58ad12bf --- /dev/null +++ b/engines/mads/phantom/phantom_scenes3.h @@ -0,0 +1,248 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef MADS_PHANTOM_SCENES3_H +#define MADS_PHANTOM_SCENES3_H + +#include "common/scummsys.h" +#include "common/serializer.h" +#include "mads/game.h" +#include "mads/scene.h" +#include "mads/phantom/phantom_scenes.h" + +namespace MADS { + +namespace Phantom { + +class Scene3xx : public PhantomScene { +protected: + /** + * Plays an appropriate sound when entering a scene + */ + void sceneEntrySound(); + + /** + *Sets the AA file to use for the scene + */ + void setAAName(); + + /** + * Updates the prefix used for getting player sprites for the scene + */ + void setPlayerSpritesPrefix(); +public: + Scene3xx(MADSEngine *vm) : PhantomScene(vm) {} +}; + +class Scene301 : public Scene3xx { +private: + bool _anim0ActvFl; + bool _skip1Fl; + bool _skip2Fl; + + int _lightingHotspotId; + int _sandbagHotspotId; + +public: + Scene301(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene302 : public Scene3xx { +public: + Scene302(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene303 : public Scene3xx { +private: + bool _anim0ActvFl; + int _hempHotspotId; + int _skipFrameCheckFl; +public: + Scene303(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene304 : public Scene3xx { +private: + bool _anim0ActvFl; + bool _anim1ActvFl; + bool _anim2ActvFl; + + int _raoulFrame; + int _raoulStatus; + int _fightFrame; + int _fightStatus; + int _fightCount; + int _phantomFrame; + int _phantomStatus; + + void handleConversation23(); + void handleRaoulAnimation(); + void handlePhantomAnimation(); + void handleFightAnimation(); + +public: + Scene304(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene305 : public Scene3xx { +private: + bool _anim0ActvFl; + bool _anim1ActvFl; + bool _skipFl; + bool _unmaskFl; + + int _unmaskFrame; + + void handle_animation_unmask(); + +public: + Scene305(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene306 : public Scene3xx { +private: + bool _speechDoneFl; + +public: + Scene306(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene307 : public Scene3xx { +public: + Scene307(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene308 : public Scene3xx { +private: + bool _anim0ActvFl; + bool _anim1ActvFl; + bool _anim2ActvFl; + bool _anim3ActvFl; + bool _skip1Fl; + bool _skip2Fl; + int _currentFloor; + +public: + Scene308(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene309 : public Scene3xx { +private: + bool _anim0ActvFl; + + int _boatStatus; + int _boatFrame; + int _talkCount; + + void handleBoatAnimation(); + +public: + Scene309(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene310 : public Scene3xx { +private: + int _raoulMessageColor; + int _chrisMessageColor; + int _multiplanePosX[4]; + int _lakeFrame; + + void setMultiplanePos(int x_new); + void handleLakeAnimation(); + +public: + Scene310(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; +} // End of namespace Phantom +} // End of namespace MADS + +#endif /* MADS_PHANTOM_SCENES3_H */ diff --git a/engines/mads/phantom/phantom_scenes4.cpp b/engines/mads/phantom/phantom_scenes4.cpp new file mode 100644 index 0000000000..618677beda --- /dev/null +++ b/engines/mads/phantom/phantom_scenes4.cpp @@ -0,0 +1,4975 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/scummsys.h" +#include "mads/mads.h" +#include "mads/conversations.h" +#include "mads/scene.h" +#include "mads/phantom/phantom_scenes.h" +#include "mads/phantom/phantom_scenes4.h" + +namespace MADS { + +namespace Phantom { + +void Scene4xx::setAAName() { + _game._aaName = Resources::formatAAName(1); + _vm->_palette->setEntry(254, 43, 47, 51); +} + +void Scene4xx::sceneEntrySound() { + if (!_vm->_musicFlag) + return; + + _vm->_sound->command(16); +} + +void Scene4xx::setPlayerSpritesPrefix() { + _vm->_sound->command(5); + + Common::String oldName = _game._player._spritesPrefix; + if (!_game._player._forcePrefix) + _game._player._spritesPrefix = "RAL"; + if (oldName != _game._player._spritesPrefix) + _game._player._spritesChanged = true; + + _game._player._scalingVelocity = true; +} + +/*------------------------------------------------------------------------*/ + +Scene401::Scene401(MADSEngine *vm) : Scene4xx(vm) { + _anim0ActvFl = false; + _frameInRoomFl = false; + _takingFrameInRoomFl = false; + + _redFrameHotspotId = -1; + _greenFrameHostpotId = -1; + _blueFrameHotspotId = -1; + _yellowFrameHotspotId = -1; +} + +void Scene401::synchronize(Common::Serializer &s) { + Scene4xx::synchronize(s); + + s.syncAsByte(_anim0ActvFl); + s.syncAsByte(_frameInRoomFl); + s.syncAsByte(_takingFrameInRoomFl); + + s.syncAsSint16LE(_redFrameHotspotId); + s.syncAsSint16LE(_greenFrameHostpotId); + s.syncAsSint16LE(_blueFrameHotspotId); + s.syncAsSint16LE(_yellowFrameHotspotId); +} + +void Scene401::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + if (_globals[kCatacombsMisc] & MAZE_EVENT_PUDDLE) + _scene->_variant = 1; + + _scene->addActiveVocab(NOUN_RED_FRAME); + _scene->addActiveVocab(NOUN_YELLOW_FRAME); + _scene->addActiveVocab(NOUN_BLUE_FRAME); + _scene->addActiveVocab(NOUN_GREEN_FRAME); +} + +void Scene401::enter() { + _game.initCatacombs(); + _anim0ActvFl = false; + + _scene->_hotspots.activate(NOUN_PUDDLE, false); + _scene->_hotspots.activate(NOUN_RATS_NEST, false); + _scene->_hotspots.activate(NOUN_SKULL, false); + _scene->_hotspots.activate(NOUN_POT, false); + + _globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RRD_9"); + _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('f', 0)); + _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('f', 1)); + _globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('f', 2)); + _globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('f', 3)); + + if (_game.exitCatacombs(0) == -1) { + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 1)); + _scene->drawToBackground(_globals._spriteIndexes[1], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_ARCHWAY_TO_NORTH, false); + } + + if (_game.exitCatacombs(3) == -1) { + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('c', 0)); + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_ARCHWAY_TO_WEST, false); + } + + if (_game.exitCatacombs(1) == -1) { + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 2)); + _scene->drawToBackground(_globals._spriteIndexes[2], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_ARCHWAY_TO_EAST, false); + } + + if (_game.exitCatacombs(2) == -1) + _scene->_hotspots.activate(NOUN_MORE_CATACOMBS, false); + + if (_globals[kCatacombsMisc] & MAZE_EVENT_RAT_NEST) { + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('c', 4)); + _scene->drawToBackground(_globals._spriteIndexes[4], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_RATS_NEST, true); + } + + if (_globals[kCatacombsMisc] & MAZE_EVENT_SKULL) { + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('c', 5)); + _scene->drawToBackground(_globals._spriteIndexes[5], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_SKULL, true); + } + + if (_globals[kCatacombsMisc] & MAZE_EVENT_POT) { + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('c', 6)); + _scene->drawToBackground(_globals._spriteIndexes[6], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_POT, true); + } + + if (_globals[kCatacombsMisc] & MAZE_EVENT_BRICK) { + _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', 7)); + _scene->drawToBackground(_globals._spriteIndexes[7], 1, Common::Point(-32000, -32000), 0, 100); + } + + if (_globals[kCatacombsMisc] & MAZE_EVENT_PUDDLE) { + _scene->_hotspots.activate(NOUN_PUDDLE, true); + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 0); + _anim0ActvFl = true; + } + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + switch (_globals[kCatacombsFrom]) { + case 0: + _game._player._playerPos = Common::Point(128, 78); + _game._player._facing = FACING_SOUTH; + _game._player.walk(Common::Point(128, 91), FACING_SOUTH); + break; + + case 1: + _game._player._playerPos = Common::Point(311, 115); + _game._player._facing = FACING_WEST; + _game._player.walk(Common::Point(271, 123), FACING_WEST); + break; + + case 2: + _game._player._playerPos = Common::Point(142, 146); + _game._player._facing = FACING_NORTH; + break; + + case 3: + _game._player._playerPos = Common::Point(4, 113); + _game._player._facing = FACING_SOUTH; + _game._player.walk(Common::Point(48, 113), FACING_EAST); + break; + + default: + break; + } + } + + if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _greenFrameHostpotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_greenFrameHostpotId , Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + sceneEntrySound(); +} + +void Scene401::step() { + if (_anim0ActvFl) { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 20) + _scene->setAnimFrame(_globals._animationIndexes[0], 0); + } +} + +void Scene401::actions() { + if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR)) { + if (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME)) { + if (_frameInRoomFl) + _vm->_dialogs->show(29); + else { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 5, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + if (_action.isObject(NOUN_RED_FRAME)) { + _game._objects.setRoom(OBJ_RED_FRAME, NOWHERE); + _game._objects[OBJ_RED_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_GREEN_FRAME)) { + _game._objects.setRoom(OBJ_GREEN_FRAME, NOWHERE); + _game._objects[OBJ_GREEN_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _greenFrameHostpotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_greenFrameHostpotId , Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_BLUE_FRAME)) { + _game._objects.setRoom(OBJ_BLUE_FRAME, NOWHERE); + _game._objects[OBJ_BLUE_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_YELLOW_FRAME)) { + _game._objects.setRoom(OBJ_YELLOW_FRAME, NOWHERE); + _game._objects[OBJ_YELLOW_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]); + _game._player._visible = true; + _game._player._stepEnabled = true; + break; + + default: + break; + } + } + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE)) { + if (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_GREEN_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME)) { + if ((_takingFrameInRoomFl || _game._trigger)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 5, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + if (_action.isObject(NOUN_RED_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[9]); + _scene->_dynamicHotspots.remove(_redFrameHotspotId); + _game._objects.addToInventory(OBJ_RED_FRAME); + } + + if (_action.isObject(NOUN_GREEN_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[10]); + _scene->_dynamicHotspots.remove(_greenFrameHostpotId ); + _game._objects.addToInventory(OBJ_GREEN_FRAME); + } + + if (_action.isObject(NOUN_BLUE_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[11]); + _scene->_dynamicHotspots.remove(_blueFrameHotspotId); + _game._objects.addToInventory(OBJ_BLUE_FRAME); + } + + if (_action.isObject(NOUN_YELLOW_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[12]); + _scene->_dynamicHotspots.remove(_yellowFrameHotspotId); + _game._objects.addToInventory(OBJ_YELLOW_FRAME); + } + + _vm->_sound->command(26); + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]); + _game._player._visible = true; + _game._player._stepEnabled = true; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + } + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_NORTH)) { + _game.moveCatacombs(0); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_WEST)) { + _game.moveCatacombs(3); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_EXIT_TO, NOUN_MORE_CATACOMBS)) { + _game.moveCatacombs(2); + if ((_game._difficulty == DIFFICULTY_HARD) && (_globals[kCatacombsRoom] == 31)) + _globals[kPriestPistonPuke] = true; + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_EAST)) { + _game.moveCatacombs(1); + if ((_game._difficulty == DIFFICULTY_EASY) && (_globals[kCatacombsRoom] == 24)) + _globals[kPriestPistonPuke] = true; + + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(40110); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(40111); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(40112); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ARCHWAY)) { + _vm->_dialogs->show(40113); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_EXPOSED_BRICK)) { + _vm->_dialogs->show(40114); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MORE_CATACOMBS)) { + _vm->_dialogs->show(40115); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BLOCKED_ARCHWAY)) { + _vm->_dialogs->show(40116); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PUDDLE)) { + _vm->_dialogs->show(40117); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RATS_NEST)) { + _vm->_dialogs->show(40118); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SKULL)) { + _vm->_dialogs->show(40120); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RED_FRAME) && !_game._objects.isInInventory(OBJ_RED_FRAME)) { + _vm->_dialogs->showItem(OBJ_RED_FRAME, 802, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GREEN_FRAME) && !_game._objects.isInInventory(OBJ_GREEN_FRAME)) { + _vm->_dialogs->showItem(OBJ_GREEN_FRAME, 819, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BLUE_FRAME) && !_game._objects.isInInventory(OBJ_BLUE_FRAME)) { + _vm->_dialogs->showItem(OBJ_BLUE_FRAME, 817, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_YELLOW_FRAME) && !_game._objects.isInInventory(OBJ_YELLOW_FRAME)) { + _vm->_dialogs->showItem(OBJ_YELLOW_FRAME, 804, 0); + _action._inProgress = false; + return; + } + + + if (_action.isObject(NOUN_BROKEN_POT)) { + _vm->_dialogs->show(40122); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE, NOUN_RATS_NEST)) { + _vm->_dialogs->show(40119); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_SKULL)) { + _vm->_dialogs->show(40121); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_BROKEN_POT)) { + _vm->_dialogs->show(40123); + _action._inProgress = false; + } +} + +void Scene401::preActions() { + _frameInRoomFl = false; + _takingFrameInRoomFl = false; + + if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_RED_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_YELLOW_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_BLUE_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_GREEN_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR) + && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) + || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) { + if (_frameInRoomFl) + _game._player._needToWalk = false; + else { + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _game._player.walk(Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + } +} + +/*------------------------------------------------------------------------*/ + +Scene403::Scene403(MADSEngine *vm) : Scene4xx(vm) { + _frameInRoomFl = false; + _takingFrameInRoomFl = false; + + _redFrameHotspotId = -1; + _greenFrameHostpotId = -1; + _blueFrameHotspotId = -1; + _yellowFrameHotspotId = -1; +} + +void Scene403::synchronize(Common::Serializer &s) { + Scene4xx::synchronize(s); + + s.syncAsByte(_frameInRoomFl); + s.syncAsByte(_takingFrameInRoomFl); + + s.syncAsSint16LE(_redFrameHotspotId); + s.syncAsSint16LE(_greenFrameHostpotId); + s.syncAsSint16LE(_blueFrameHotspotId); + s.syncAsSint16LE(_yellowFrameHotspotId); +} + +void Scene403::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + if (_globals[kCatacombsMisc] & MAZE_EVENT_HOLE) + _scene->_variant = 1; + + if (_globals[kCatacombsMisc] & MAZE_EVENT_PLANK) + _scene->_variant = 2; + + _scene->addActiveVocab(NOUN_RED_FRAME); + _scene->addActiveVocab(NOUN_YELLOW_FRAME); + _scene->addActiveVocab(NOUN_BLUE_FRAME); + _scene->addActiveVocab(NOUN_GREEN_FRAME); +} + +void Scene403::enter() { + _game.initCatacombs(); + + _scene->_hotspots.activate(NOUN_HOLE, false); + _scene->_hotspots.activate(NOUN_WEB, false); + _scene->_hotspots.activate(NOUN_RATS_NEST, false); + _scene->_hotspots.activate(NOUN_SKULL, false); + _scene->_hotspots.activate(NOUN_PLANK, false); + _scene->_hotspots.activate(NOUN_GATE, false); + + _globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RRD_9"); + _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('f', 0)); + _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('f', 1)); + _globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('f', 2)); + _globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('f', 3)); + + if (_game.exitCatacombs(0) == -1) { + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 1)); + _scene->drawToBackground(_globals._spriteIndexes[1], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_ARCHWAY_TO_NORTH, false); + } + + if (_game.exitCatacombs(3) == -1) { + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('c', 0)); + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_ARCHWAY_TO_WEST, false); + } + + if (_game.exitCatacombs(1) == -1) { + _scene->_hotspots.activate(NOUN_MORE_CATACOMBS, false); + _scene->_hotspots.activate(NOUN_GATE, true); + _globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('c', 9)); + _scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100); + } + + if (_globals[kCatacombsMisc] & MAZE_EVENT_HOLE) { + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 3)); + _scene->drawToBackground(_globals._spriteIndexes[2], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_HOLE, true); + } + + if (_globals[kCatacombsMisc] & MAZE_EVENT_WEB) { + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('c', 4)); + _scene->drawToBackground(_globals._spriteIndexes[3], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_WEB, true); + } + + if (_globals[kCatacombsMisc] & MAZE_EVENT_BRICK) { + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('c', 5)); + _scene->drawToBackground(_globals._spriteIndexes[4], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activateAtPos(NOUN_EXPOSED_BRICK, false, Common::Point(178, 35)); + } + + if (_globals[kCatacombsMisc] & MAZE_EVENT_RAT_NEST) { + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('c', 6)); + _scene->drawToBackground(_globals._spriteIndexes[5], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_RATS_NEST, true); + } + + if (_globals[kCatacombsMisc] & MAZE_EVENT_SKULL) { + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('c', 7)); + _scene->drawToBackground(_globals._spriteIndexes[6], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_SKULL, true); + } + + if (_globals[kCatacombsMisc] & MAZE_EVENT_PLANK) { + _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', 8)); + _scene->drawToBackground(_globals._spriteIndexes[7], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_PLANK, true); + } + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + switch (_globals[kCatacombsFrom]) { + case 0: + _game._player._playerPos = Common::Point(212, 86); + _game._player._facing = FACING_SOUTH; + _game._player.walk(Common::Point(212, 100), FACING_SOUTH); + break; + + case 1: + _game._player.firstWalk(Common::Point(330, 126), FACING_EAST, Common::Point(305, 126), FACING_WEST, true); + break; + + case 3: + _game._player._playerPos = Common::Point(3, 128); + _game._player._facing = FACING_SOUTH; + _game._player.walk(Common::Point(40, 128), FACING_EAST); + break; + + default: + break; + } + } + + if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _greenFrameHostpotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_greenFrameHostpotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if ((_game._difficulty == DIFFICULTY_EASY) && (_globals[kCatacombsRoom] == 19)) + _scene->_sequences.addTimer(120, 60); + + sceneEntrySound(); +} + +void Scene403::step() { + if (_game._trigger == 60) + _vm->_dialogs->show(31); +} + +void Scene403::actions() { + if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR) + && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) { + if (_frameInRoomFl) + _vm->_dialogs->show(29); + else { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 5, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + if (_action.isObject(NOUN_RED_FRAME)) { + _game._objects.setRoom(OBJ_RED_FRAME, NOWHERE); + _game._objects[OBJ_RED_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_GREEN_FRAME)) { + _game._objects.setRoom(OBJ_GREEN_FRAME, NOWHERE); + _game._objects[OBJ_GREEN_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _greenFrameHostpotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_greenFrameHostpotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_BLUE_FRAME)) { + _game._objects.setRoom(OBJ_BLUE_FRAME, NOWHERE); + _game._objects[OBJ_BLUE_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_YELLOW_FRAME)) { + _game._objects.setRoom(OBJ_YELLOW_FRAME, NOWHERE); + _game._objects[OBJ_YELLOW_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]); + _game._player._visible = true; + _game._player._stepEnabled = true; + break; + + default: + break; + } + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE) + && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_GREEN_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME))) { + if ((_takingFrameInRoomFl || _game._trigger)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 5, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + if (_action.isObject(NOUN_RED_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[9]); + _scene->_dynamicHotspots.remove(_redFrameHotspotId); + _game._objects.addToInventory(OBJ_RED_FRAME); + } + + if (_action.isObject(NOUN_GREEN_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[10]); + _scene->_dynamicHotspots.remove(_greenFrameHostpotId); + _game._objects.addToInventory(OBJ_GREEN_FRAME); + } + + if (_action.isObject(NOUN_BLUE_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[11]); + _scene->_dynamicHotspots.remove(_blueFrameHotspotId); + _game._objects.addToInventory(OBJ_BLUE_FRAME); + } + + if (_action.isObject(NOUN_YELLOW_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[12]); + _scene->_dynamicHotspots.remove(_yellowFrameHotspotId); + _game._objects.addToInventory(OBJ_YELLOW_FRAME); + } + + _vm->_sound->command(26); + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]); + _game._player._visible = true; + _game._player._stepEnabled = true; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_NORTH)) { + _game.moveCatacombs(0); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_WEST)) { + _game.moveCatacombs(3); + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(40310); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(40311); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(40312); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ARCHWAY)) { + _vm->_dialogs->show(40313); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_EXPOSED_BRICK)) { + _vm->_dialogs->show(40314); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MORE_CATACOMBS)) { + _vm->_dialogs->show(40315); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BLOCKED_ARCHWAY)) { + _vm->_dialogs->show(40316); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RATS_NEST)) { + _vm->_dialogs->show(40318); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SKULL)) { + _vm->_dialogs->show(40320); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_HOLE)) { + _vm->_dialogs->show(40323); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WEB)) { + _vm->_dialogs->show(40324); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RED_FRAME) && !_game._objects.isInInventory(OBJ_RED_FRAME)) { + _vm->_dialogs->showItem(OBJ_RED_FRAME, 802, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GREEN_FRAME) && !_game._objects.isInInventory(OBJ_GREEN_FRAME)) { + _vm->_dialogs->showItem(OBJ_GREEN_FRAME, 819, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BLUE_FRAME) && !_game._objects.isInInventory(OBJ_BLUE_FRAME)) { + _vm->_dialogs->showItem(OBJ_BLUE_FRAME, 817, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_YELLOW_FRAME) && !_game._objects.isInInventory(OBJ_YELLOW_FRAME)) { + _vm->_dialogs->showItem(OBJ_YELLOW_FRAME, 804, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GATE)) { + _vm->_dialogs->show(45330); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PLANK)) { + _vm->_dialogs->show(40325); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_OPEN, NOUN_GATE)) { + _vm->_dialogs->show(45331); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_RATS_NEST)) { + _vm->_dialogs->show(40319); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_SKULL)) { + _vm->_dialogs->show(40321); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_PLANK)) { + _vm->_dialogs->show(40326); + _action._inProgress = false; + return; + } +} + +void Scene403::preActions() { + if (_action.isAction(VERB_EXIT_TO, NOUN_MORE_CATACOMBS)) + _game.moveCatacombs(1); + + _frameInRoomFl = false; + _takingFrameInRoomFl = false; + + if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_RED_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_YELLOW_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_BLUE_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_GREEN_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR) + && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) { + if (_frameInRoomFl) + _game._player._needToWalk = false; + else { + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _game._player.walk(Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + } +} + +/*------------------------------------------------------------------------*/ + +Scene404::Scene404(MADSEngine *vm) : Scene4xx(vm) { + _frameInRoomFl = false; + _takingFrameInRoomFl = false; + _anim0ActvFl = false; + + _redFrameHotspotId = -1; + _greenFrameHostpotId = -1; + _blueFrameHotspotId = -1; + _yellowFrameHotspotId = -1; +} + +void Scene404::synchronize(Common::Serializer &s) { + Scene4xx::synchronize(s); + + s.syncAsByte(_frameInRoomFl); + s.syncAsByte(_takingFrameInRoomFl); + s.syncAsByte(_anim0ActvFl); + + s.syncAsSint16LE(_redFrameHotspotId); + s.syncAsSint16LE(_greenFrameHostpotId); + s.syncAsSint16LE(_blueFrameHotspotId); + s.syncAsSint16LE(_yellowFrameHotspotId); +} + +void Scene404::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + if (_globals[kCatacombsMisc] & MAZE_EVENT_BLOCK) + _scene->_variant = 1; + + _scene->addActiveVocab(NOUN_RED_FRAME); + _scene->addActiveVocab(NOUN_YELLOW_FRAME); + _scene->addActiveVocab(NOUN_BLUE_FRAME); + _scene->addActiveVocab(NOUN_GREEN_FRAME); +} + +void Scene404::enter() { + _game.initCatacombs(); + + _scene->_hotspots.activate(NOUN_RATS_NEST, false); + _scene->_hotspots.activate(NOUN_WEB, false); + _scene->_hotspots.activate(NOUN_BROKEN_POT, false); + _scene->_hotspots.activate(NOUN_BLOCK, false); + _scene->_hotspots.activate(NOUN_PUDDLE, false); + + _anim0ActvFl = false; + + _globals._spriteIndexes[9] = _scene->_sprites.addSprites("*RRD_9"); + _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('f', 0)); + _globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('f', 1)); + _globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('f', 2)); + _globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('f', 3)); + + + if (_game.exitCatacombs(0) == -1) { + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 1)); + _scene->drawToBackground(_globals._spriteIndexes[1], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_ARCHWAY_TO_NORTH, false); + } + + if (_game.exitCatacombs(3) == -1) { + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('c', 0)); + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_ARCHWAY_TO_WEST, false); + } + + if (_game.exitCatacombs(1) == -1) { + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 2)); + _scene->drawToBackground(_globals._spriteIndexes[2], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_ARCHWAY_TO_EAST, false); + } + + if (_game.exitCatacombs(2) == -1) + _scene->_hotspots.activate(NOUN_MORE_CATACOMBS, false); + + if (_globals[kCatacombsMisc] & MAZE_EVENT_RAT_NEST) { + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('c', 3)); + _scene->drawToBackground(_globals._spriteIndexes[3], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_RATS_NEST, true); + } + + if (_globals[kCatacombsMisc] & MAZE_EVENT_WEB) { + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('c', 4)); + _scene->drawToBackground(_globals._spriteIndexes[4], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_WEB, true); + } + + if (_globals[kCatacombsMisc] & MAZE_EVENT_POT) { + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('c', 5)); + _scene->drawToBackground(_globals._spriteIndexes[5], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_BROKEN_POT, true); + } + + if (_globals[kCatacombsMisc] & MAZE_EVENT_BLOCK) { + _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', 7)); + _scene->drawToBackground(_globals._spriteIndexes[7], 1, Common::Point(-32000, -32000), 0, 100); + } + + if (_globals[kCatacombsMisc] & MAZE_EVENT_FALLEN_BLOCK) { + _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('c', 8)); + _scene->drawToBackground(_globals._spriteIndexes[8], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_BLOCK, true); + } + + if (_globals[kCatacombsMisc] & MAZE_EVENT_PUDDLE) { + _scene->_hotspots.activate(NOUN_PUDDLE, true); + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 0); + _anim0ActvFl = true; + } + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + switch (_globals[kCatacombsFrom]) { + case 0: + _game._player._playerPos = Common::Point(156, 98); + _game._player._facing = FACING_SOUTH; + _game._player.walk(Common::Point(156, 117), FACING_SOUTH); + break; + + case 1: + _game._player._playerPos = Common::Point(319, 135); + _game._player._facing = FACING_WEST; + _game._player.walk(Common::Point(279, 135), FACING_WEST); + break; + + case 2: + _game._player._playerPos = Common::Point(175, 147); + _game._player._facing = FACING_NORTH; + break; + + case 3: + _game._player._playerPos = Common::Point(17, 131); + _game._player._facing = FACING_SOUTH; + _game._player.walk(Common::Point(60, 131), FACING_EAST); + break; + + default: + break; + } + } + + if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14); + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[10]]->getFramePos(0); + _redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[10]]->getFramePos(0); + _greenFrameHostpotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_greenFrameHostpotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[10]]->getFramePos(0); + _blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[13] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[13], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[10]]->getFramePos(0); + _yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_globals[kPriestPistonPuke]) + _scene->_sequences.addTimer(120, 60); + + sceneEntrySound(); +} + +void Scene404::step() { + if (_anim0ActvFl) { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 20) + _scene->setAnimFrame(_globals._animationIndexes[0], 0); + } + + if (_game._trigger == 60) { + _vm->_dialogs->show(30); + _globals[kPriestPistonPuke] = false; + } +} + +void Scene404::actions() { + if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR) + && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) { + if (_frameInRoomFl) + _vm->_dialogs->show(29); + else { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[9] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[9], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[9], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_SPRITE, 5, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + if (_action.isObject(NOUN_RED_FRAME)) { + _game._objects.setRoom(OBJ_RED_FRAME, NOWHERE); + _game._objects[OBJ_RED_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[10]]->getFramePos(0); + _redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_GREEN_FRAME)) { + _game._objects.setRoom(OBJ_GREEN_FRAME, NOWHERE); + _game._objects[OBJ_GREEN_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[10]]->getFramePos(0); + _greenFrameHostpotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_greenFrameHostpotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_BLUE_FRAME)) { + _game._objects.setRoom(OBJ_BLUE_FRAME, NOWHERE); + _game._objects[OBJ_BLUE_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[10]]->getFramePos(0); + _blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_YELLOW_FRAME)) { + _game._objects.setRoom(OBJ_YELLOW_FRAME, NOWHERE); + _game._objects[OBJ_YELLOW_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[13] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[13], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[10]]->getFramePos(0); + _yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[9]); + _game._player._visible = true; + _game._player._stepEnabled = true; + break; + + default: + break; + } + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE)) { + if ((_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_GREEN_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME)) && (_takingFrameInRoomFl || _game._trigger)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[9] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[9], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[9], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_SPRITE, 5, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + if (_action.isObject(NOUN_RED_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[10]); + _scene->_dynamicHotspots.remove(_redFrameHotspotId); + _game._objects.addToInventory(OBJ_RED_FRAME); + } + + if (_action.isObject(NOUN_GREEN_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[11]); + _scene->_dynamicHotspots.remove(_greenFrameHostpotId); + _game._objects.addToInventory(OBJ_GREEN_FRAME); + } + + if (_action.isObject(NOUN_BLUE_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[12]); + _scene->_dynamicHotspots.remove(_blueFrameHotspotId); + _game._objects.addToInventory(OBJ_BLUE_FRAME); + } + + if (_action.isObject(NOUN_YELLOW_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[13]); + _scene->_dynamicHotspots.remove(_yellowFrameHotspotId); + _game._objects.addToInventory(OBJ_YELLOW_FRAME); + } + + _vm->_sound->command(26); + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[9]); + _game._player._visible = true; + _game._player._stepEnabled = true; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_NORTH)) { + _game.moveCatacombs(0); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_WEST)) { + _game.moveCatacombs(3); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_EXIT_TO, NOUN_MORE_CATACOMBS)) { + _game.moveCatacombs(2); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_EAST)) { + _game.moveCatacombs(1); + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(40410); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(40411); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(40412); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ARCHWAY)) { + _vm->_dialogs->show(40413); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_EXPOSED_BRICK)) { + _vm->_dialogs->show(40414); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MORE_CATACOMBS)) { + _vm->_dialogs->show(40415); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PUDDLE)) { + _vm->_dialogs->show(40417); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RATS_NEST)) { + _vm->_dialogs->show(40418); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BROKEN_POT)) { + _vm->_dialogs->show(40421); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WEB)) { + _vm->_dialogs->show(40424); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RED_FRAME) && !_game._objects.isInInventory(OBJ_RED_FRAME)) { + _vm->_dialogs->showItem(OBJ_RED_FRAME, 802, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GREEN_FRAME) && !_game._objects.isInInventory(OBJ_GREEN_FRAME)) { + _vm->_dialogs->showItem(OBJ_GREEN_FRAME, 819, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BLUE_FRAME) && !_game._objects.isInInventory(OBJ_BLUE_FRAME)) { + _vm->_dialogs->showItem(OBJ_BLUE_FRAME, 817, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_YELLOW_FRAME) && !_game._objects.isInInventory(OBJ_YELLOW_FRAME)) { + _vm->_dialogs->showItem(OBJ_YELLOW_FRAME, 804, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BLOCK)) { + _vm->_dialogs->show(40430); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE, NOUN_RATS_NEST)) { + _vm->_dialogs->show(40419); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_BROKEN_POT)) { + _vm->_dialogs->show(40422); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_BLOCK)) { + _vm->_dialogs->show(40431); + _action._inProgress = false; + return; + } +} + +void Scene404::preActions() { + _frameInRoomFl = false; + _takingFrameInRoomFl = false; + + if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_RED_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_YELLOW_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_BLUE_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_GREEN_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR) + && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) { + if (_frameInRoomFl) + _game._player._needToWalk = false; + else { + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[10]]->getFramePos(0); + _game._player.walk(Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + } +} + +/*------------------------------------------------------------------------*/ + +Scene406::Scene406(MADSEngine *vm) : Scene4xx(vm) { + _frameInRoomFl = false; + _takingFrameInRoomFl = false; + + _redFrameHotspotId = -1; + _greenFrameHostpotId = -1; + _blueFrameHotspotId = -1; + _yellowFrameHotspotId = -1; +} + +void Scene406::synchronize(Common::Serializer &s) { + Scene4xx::synchronize(s); + + s.syncAsByte(_frameInRoomFl); + s.syncAsByte(_takingFrameInRoomFl); + + s.syncAsSint16LE(_redFrameHotspotId); + s.syncAsSint16LE(_greenFrameHostpotId); + s.syncAsSint16LE(_blueFrameHotspotId); + s.syncAsSint16LE(_yellowFrameHotspotId); +} + +void Scene406::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + _scene->addActiveVocab(NOUN_RED_FRAME); + _scene->addActiveVocab(NOUN_YELLOW_FRAME); + _scene->addActiveVocab(NOUN_BLUE_FRAME); + _scene->addActiveVocab(NOUN_GREEN_FRAME); +} + +void Scene406::enter() { + _game.initCatacombs(); + + _globals._spriteIndexes[0] = _scene->_sprites.addSprites("*RRD_9"); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 0)); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 1)); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 2)); + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 3)); + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + switch (_globals[kCatacombsFrom]) { + case 1: + _game._player._playerPos = Common::Point(310, 118); + _game._player._facing = FACING_WEST; + _game._player.walk(Common::Point(271, 118), FACING_WEST); + break; + + case 3: + _game._player._playerPos = Common::Point(20, 122); + _game._player._facing = FACING_SOUTH; + _game._player.walk(Common::Point(66, 122), FACING_EAST); + break; + + default: + break; + } + } + + if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0); + _redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0); + _greenFrameHostpotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_greenFrameHostpotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0); + _blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0); + _yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + sceneEntrySound(); +} + +void Scene406::step() { +} + +void Scene406::actions() { + if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR) + && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) { + if (_frameInRoomFl) + _vm->_dialogs->show(29); + else { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[0] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[0], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_SPRITE, 5, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + if (_action.isObject(NOUN_RED_FRAME)) { + _game._objects.setRoom(OBJ_RED_FRAME, NOWHERE); + _game._objects[OBJ_RED_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0); + _redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_GREEN_FRAME)) { + _game._objects.setRoom(OBJ_GREEN_FRAME, NOWHERE); + _game._objects[OBJ_GREEN_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0); + _greenFrameHostpotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_greenFrameHostpotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_BLUE_FRAME)) { + _game._objects.setRoom(OBJ_BLUE_FRAME, NOWHERE); + _game._objects[OBJ_BLUE_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0); + _blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_YELLOW_FRAME)) { + _game._objects.setRoom(OBJ_YELLOW_FRAME, NOWHERE); + _game._objects[OBJ_YELLOW_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0); + _yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[0]); + _game._player._visible = true; + _game._player._stepEnabled = true; + break; + + default: + break; + } + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE) + && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_GREEN_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME))) { + if ((_takingFrameInRoomFl || _game._trigger)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[0] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[0], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_SPRITE, 5, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + if (_action.isObject(NOUN_RED_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[1]); + _scene->_dynamicHotspots.remove(_redFrameHotspotId); + _game._objects.addToInventory(OBJ_RED_FRAME); + } + + if (_action.isObject(NOUN_GREEN_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _scene->_dynamicHotspots.remove(_greenFrameHostpotId); + _game._objects.addToInventory(OBJ_GREEN_FRAME); + } + + if (_action.isObject(NOUN_BLUE_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[3]); + _scene->_dynamicHotspots.remove(_blueFrameHotspotId); + _game._objects.addToInventory(OBJ_BLUE_FRAME); + } + + if (_action.isObject(NOUN_YELLOW_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[4]); + _scene->_dynamicHotspots.remove(_yellowFrameHotspotId); + _game._objects.addToInventory(OBJ_YELLOW_FRAME); + } + + _vm->_sound->command(26); + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[0]); + _game._player._visible = true; + _game._player._stepEnabled = true; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_WEST)) { + _game.moveCatacombs(3); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_EAST)) { + _game.moveCatacombs(1); + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(40610); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(40611); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(40612); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ARCHWAY)) { + _vm->_dialogs->show(40613); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_EXPOSED_BRICK)) { + _vm->_dialogs->show(40614); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MORE_CATACOMBS)) { + _vm->_dialogs->show(40615); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BLOCKED_ARCHWAY)) { + _vm->_dialogs->show(40616); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RED_FRAME) && !_game._objects.isInInventory(OBJ_RED_FRAME)) { + _vm->_dialogs->showItem(OBJ_RED_FRAME, 802, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GREEN_FRAME) && !_game._objects.isInInventory(OBJ_GREEN_FRAME)) { + _vm->_dialogs->showItem(OBJ_GREEN_FRAME, 819, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BLUE_FRAME) && !_game._objects.isInInventory(OBJ_BLUE_FRAME)) { + _vm->_dialogs->showItem(OBJ_BLUE_FRAME, 817, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_YELLOW_FRAME) && !_game._objects.isInInventory(OBJ_YELLOW_FRAME)) { + _vm->_dialogs->showItem(OBJ_YELLOW_FRAME, 804, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GRATE)) { + _vm->_dialogs->show(40617); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_OPEN, NOUN_GRATE) || _action.isAction(VERB_PUSH, NOUN_GRATE) || _action.isAction(VERB_PULL, NOUN_GRATE)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], true, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 2: + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], true, -2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true); + _scene->_sequences.addTimer(30, 3); + break; + + case 3: + _scene->deleteSequence(_globals._sequenceIndexes[0]); + _globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], true, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], false); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 4); + break; + + case 4: + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[0]); + _scene->_sequences.addTimer(6, 5); + break; + + case 5: + _game._player._stepEnabled = true; + _vm->_dialogs->show(40618); + break; + + default: + break; + } + _action._inProgress = false; + } +} + +void Scene406::preActions() { + _frameInRoomFl = false; + _takingFrameInRoomFl = false; + + if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_RED_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_YELLOW_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_BLUE_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_GREEN_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR) + && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) { + if (_frameInRoomFl) + _game._player._needToWalk = false; + else { + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0); + pos.x += 12; + _game._player.walk(pos, FACING_NORTHWEST); + } + } +} + +/*------------------------------------------------------------------------*/ + +Scene407::Scene407(MADSEngine *vm) : Scene4xx(vm) { + _frameInRoomFl = false; + _takingFrameInRoomFl = false; + + _redFrameHotspotId = -1; + _greenFrameHotspotId = -1; + _blueFrameHotspotId = -1; + _yellowFrameHotspotId = -1; +} + +void Scene407::synchronize(Common::Serializer &s) { + Scene4xx::synchronize(s); + + s.syncAsByte(_frameInRoomFl); + s.syncAsByte(_takingFrameInRoomFl); + + s.syncAsSint16LE(_redFrameHotspotId); + s.syncAsSint16LE(_greenFrameHotspotId); + s.syncAsSint16LE(_blueFrameHotspotId); + s.syncAsSint16LE(_yellowFrameHotspotId); +} + +void Scene407::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + _scene->addActiveVocab(NOUN_RED_FRAME); + _scene->addActiveVocab(NOUN_YELLOW_FRAME); + _scene->addActiveVocab(NOUN_BLUE_FRAME); + _scene->addActiveVocab(NOUN_GREEN_FRAME); +} + +void Scene407::enter() { + _game.initCatacombs(); + + _globals._spriteIndexes[0] = _scene->_sprites.addSprites("*RRD_9"); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 0)); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 1)); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 2)); + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 3)); + + if (_game.exitCatacombs(3) == -1) { + _scene->_hotspots.activateAtPos(NOUN_MORE_CATACOMBS, false, Common::Point(9, 46)); + _scene->_hotspots.activateAtPos(NOUN_MORE_CATACOMBS, false, Common::Point(8, 138)); + _scene->_hotspots.activateAtPos(NOUN_MORE_CATACOMBS, false, Common::Point(12, 149)); + _scene->_hotspots.activateAtPos(NOUN_MORE_CATACOMBS, false, Common::Point(0, 151)); + } + + if (_game.exitCatacombs(1) == -1) { + _scene->_hotspots.activateAtPos(NOUN_MORE_CATACOMBS, false, Common::Point(310, 107)); + _scene->_hotspots.activateAtPos(NOUN_MORE_CATACOMBS, false, Common::Point(308, 175)); + _scene->_hotspots.activateAtPos(NOUN_MORE_CATACOMBS, false, Common::Point(308, 146)); + _scene->_hotspots.activateAtPos(NOUN_MORE_CATACOMBS, false, Common::Point(309, 152)); + } + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + switch (_globals[kCatacombsFrom]) { + case 0: + _game._player._playerPos = Common::Point(197, 14); + _game._player._facing = FACING_WEST; + _game._player.walk(Common::Point(181, 14), FACING_WEST); + break; + + case 1: + _game._player.firstWalk(Common::Point(330, 146), FACING_WEST, Common::Point(298, 146), FACING_WEST, true); + break; + + case 2: + _game._player._playerPos = Common::Point(147, 14); + _game._player._facing = FACING_EAST; + _game._player.walk(Common::Point(165, 14), FACING_EAST); + break; + + case 3: + _game._player.firstWalk(Common::Point(-20, 143), FACING_WEST, Common::Point(20, 143), FACING_WEST, true); + break; + + default: + break; + } + } + + if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0); + _redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0); + _greenFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_greenFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0); + _blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0); + _yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + sceneEntrySound(); +} + +void Scene407::step() { +} + +void Scene407::actions() { + if (_action.isAction(VERB_WALK_TO, NOUN_WALL) && (_game._player._playerPos.y > 30) && (_scene->_customDest.x > 160) && (_scene->_customDest.x < 190)) { + _vm->_dialogs->show(40718); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_TO) && (_scene->_customDest.x < 130) && (_game._player._playerPos.y < 30)) { + _vm->_dialogs->show(40718); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_TO) && (_scene->_customDest.x > 203) && (_game._player._playerPos.y < 30)) { + _vm->_dialogs->show(40718); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_TO, NOUN_FLOOR)) { + if ((_game._player._playerPos.y < 30) && (_scene->_customDest.y > 29)) { + _vm->_dialogs->show(40718); + _action._inProgress = false; + return; + } else if ((_game._player._playerPos.y > 29) && (_scene->_customDest.y < 30)) { + _vm->_dialogs->show(40718); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR)) { + if (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME)) { + if ((_game._player._playerPos.y < 30) && (_scene->_customDest.y < 30)) + _vm->_dialogs->show(40717); + else if ((_game._player._playerPos.y < 30) && (_scene->_customDest.y > 29)) + _vm->_dialogs->show(40718); + else if (_frameInRoomFl) + _vm->_dialogs->show(29); + else { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[0] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[0], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_SPRITE, 5, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + if (_action.isObject(NOUN_RED_FRAME)) { + _game._objects.setRoom(OBJ_RED_FRAME, NOWHERE); + _game._objects[OBJ_RED_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0); + _redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_GREEN_FRAME)) { + _game._objects.setRoom(OBJ_GREEN_FRAME, NOWHERE); + _game._objects[OBJ_GREEN_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0); + _greenFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_greenFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_BLUE_FRAME)) { + _game._objects.setRoom(OBJ_BLUE_FRAME, NOWHERE); + _game._objects[OBJ_BLUE_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0); + _blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_YELLOW_FRAME)) { + _game._objects.setRoom(OBJ_YELLOW_FRAME, NOWHERE); + _game._objects[OBJ_YELLOW_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0); + _yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[0]); + _game._player._visible = true; + _game._player._stepEnabled = true; + break; + + default: + break; + } + } + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE)) { + if (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_GREEN_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME)) { + if ((_takingFrameInRoomFl || _game._trigger)) { + if (_game._player._playerPos.y < 30) + _vm->_dialogs->show(40718); + else { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[0] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[0], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_SPRITE, 5, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + if (_action.isObject(NOUN_RED_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[1]); + _scene->_dynamicHotspots.remove(_redFrameHotspotId); + _game._objects.addToInventory(OBJ_RED_FRAME); + } + + if (_action.isObject(NOUN_GREEN_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _scene->_dynamicHotspots.remove(_greenFrameHotspotId); + _game._objects.addToInventory(OBJ_GREEN_FRAME); + } + + if (_action.isObject(NOUN_BLUE_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[3]); + _scene->_dynamicHotspots.remove(_blueFrameHotspotId); + _game._objects.addToInventory(OBJ_BLUE_FRAME); + } + + if (_action.isObject(NOUN_YELLOW_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[4]); + _scene->_dynamicHotspots.remove(_yellowFrameHotspotId); + _game._objects.addToInventory(OBJ_YELLOW_FRAME); + } + + _vm->_sound->command(26); + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[0]); + _game._player._visible = true; + _game._player._stepEnabled = true; + break; + + default: + break; + } + } + _action._inProgress = false; + return; + } + } + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_WEST)) { + if (_game._player._playerPos.y < 30) + _game.moveCatacombs(2); + else + _vm->_dialogs->show(40718); + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_EAST)) { + if (_game._player._playerPos.y < 30) + _game.moveCatacombs(0); + else + _vm->_dialogs->show(40718); + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_EXIT_TO, NOUN_MORE_CATACOMBS) && (_game._player._playerPos.y < 30)) { + _vm->_dialogs->show(40718); + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(40710); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(40711); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(40712); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ARCHWAY)) { + _vm->_dialogs->show(40713); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MORE_CATACOMBS)) { + _vm->_dialogs->show(40714); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_COLUMN)) { + _vm->_dialogs->show(40715); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RED_FRAME) && !_game._objects.isInInventory(OBJ_RED_FRAME)) { + _vm->_dialogs->showItem(OBJ_RED_FRAME, 802, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GREEN_FRAME) && !_game._objects.isInInventory(OBJ_GREEN_FRAME)) { + _vm->_dialogs->showItem(OBJ_GREEN_FRAME, 818, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BLUE_FRAME) && !_game._objects.isInInventory(OBJ_BLUE_FRAME)) { + _vm->_dialogs->showItem(OBJ_BLUE_FRAME, 817, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_YELLOW_FRAME) && !_game._objects.isInInventory(OBJ_YELLOW_FRAME)) { + _vm->_dialogs->showItem(OBJ_YELLOW_FRAME, 804, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LAKE)) { + _vm->_dialogs->show(40716); + _action._inProgress = false; + } + } +} + +void Scene407::preActions() { + if (_action.isAction(VERB_EXIT_TO, NOUN_MORE_CATACOMBS)) { + if (_game._player._playerPos.y > 30) { + if (_scene->_customDest.x < 100) + _game.moveCatacombs(3); + else + _game.moveCatacombs(1); + } else + _game._player._needToWalk = false; + } + + if (_action.isAction(VERB_WALK_THROUGH) && (_game._player._playerPos.y > 30)) + _game._player._needToWalk = false; + + _frameInRoomFl = false; + _takingFrameInRoomFl = false; + + if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_RED_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_YELLOW_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_BLUE_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_GREEN_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR) + && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) { + if ((_frameInRoomFl) || (_game._player._playerPos.y < 30) || (_scene->_customDest.y < 30)) + _game._player._needToWalk = false; + else { + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0); + _game._player.walk(Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + } + + if (_action.isAction(VERB_TAKE) + && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_GREEN_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME))) { + if (_takingFrameInRoomFl && (_game._player._playerPos.y < 30)) + _game._player._needToWalk = false; + } + + if (_action.isAction(VERB_WALK_ACROSS, NOUN_FLOOR) && (_game._player._playerPos.y < 30) && (_scene->_customDest.y > 29)) + _game._player._needToWalk = false; + + if (_action.isAction(VERB_WALK_TO, NOUN_LAKE) && (_game._player._playerPos.y < 30)) + _game._player.walk(Common::Point(172, 18), FACING_SOUTH); + + if (_action.isAction(VERB_WALK_TO) && (_scene->_customDest.x < 130) && (_game._player._playerPos.y < 30)) + _game._player._needToWalk = false; + + if (_action.isAction(VERB_WALK_TO) && (_scene->_customDest.x > 203) && (_game._player._playerPos.y < 30)) + _game._player._needToWalk = false; + + if (_action.isAction(VERB_WALK_TO, NOUN_WALL) && (_game._player._playerPos.y > 30) && (_scene->_customDest.x > 160) && (_scene->_customDest.x < 190)) + _game._player._needToWalk = false; +} + +/*------------------------------------------------------------------------*/ + +Scene408::Scene408(MADSEngine *vm) : Scene4xx(vm) { + _frameInRoomFl = false; + _takingFrameInRoomFl = false; + + _redFrameHotspotId = -1; + _greenFrameHotspotId = -1; + _blueFrameHotspotId = -1; + _yellowFrameHotspotId = -1; +} + +void Scene408::synchronize(Common::Serializer &s) { + Scene4xx::synchronize(s); + + s.syncAsByte(_frameInRoomFl); + s.syncAsByte(_takingFrameInRoomFl); + + s.syncAsSint16LE(_redFrameHotspotId); + s.syncAsSint16LE(_greenFrameHotspotId); + s.syncAsSint16LE(_blueFrameHotspotId); + s.syncAsSint16LE(_yellowFrameHotspotId); +} + +void Scene408::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + if ((_globals[kCatacombsMisc] & MAZE_EVENT_WEB) && (!_globals[kCobwebIsCut])) + _scene->_variant = 1; + + _scene->addActiveVocab(NOUN_RED_FRAME); + _scene->addActiveVocab(NOUN_YELLOW_FRAME); + _scene->addActiveVocab(NOUN_BLUE_FRAME); + _scene->addActiveVocab(NOUN_GREEN_FRAME); +} + +void Scene408::enter() { + _game.initCatacombs(); + _scene->_hotspots.activate(NOUN_COBWEB, false); + + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('c', 0)); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RRD_9"); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 0)); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 1)); + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 2)); + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('f', 3)); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('c', 1)); + _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', 2)); + + if (_game.exitCatacombs(0) == -1) { + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_ARCHWAY_TO_NORTH, false); + _scene->_hotspots.activateAtPos(NOUN_FLOOR, false, Common::Point(147, 121)); + _scene->_hotspots.activateAtPos(NOUN_FLOOR, false, Common::Point(153, 121)); + _scene->_hotspots.activateAtPos(NOUN_FLOOR, false, Common::Point(154, 115)); + _scene->_hotspots.activateAtPos(NOUN_FLOOR, false, Common::Point(161, 101)); + _scene->_hotspots.activateAtPos(NOUN_FLOOR, false, Common::Point(162, 106)); + _scene->_hotspots.activateAtPos(NOUN_FLOOR, false, Common::Point(187, 107)); + _scene->_hotspots.activateAtPos(NOUN_FLOOR, false, Common::Point(185, 101)); + _scene->_hotspots.activateAtPos(NOUN_FLOOR, false, Common::Point(192, 119)); + _scene->_hotspots.activateAtPos(NOUN_WALL, false, Common::Point(147, 76)); + _scene->_hotspots.activateAtPos(NOUN_WALL, false, Common::Point(159, 108)); + _scene->_hotspots.activateAtPos(NOUN_WALL, false, Common::Point(185, 93)); + _scene->_hotspots.activateAtPos(NOUN_WALL, false, Common::Point(199, 91)); + _scene->changeVariant(1); + } else + _scene->_hotspots.activate(NOUN_GATE, false); + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + switch (_globals[kCatacombsFrom]) { + case 0: + _game._player._playerPos = Common::Point(174, 100); + _game._player._facing = FACING_SOUTH; + _game._player.walk(Common::Point(174, 106), FACING_SOUTH); + break; + + case 2: + _game._player._playerPos = Common::Point(175, 145); + _game._player._facing = FACING_NORTH; + break; + + default: + break; + } + } + + if (_globals[kCatacombsMisc] & MAZE_EVENT_WEB) { + _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('x', -1)); + if (!_globals[kCobwebIsCut]) { + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('c', 1)); + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 10); + _scene->_hotspots.activate(NOUN_COBWEB, true); + } else { + _globals._sequenceIndexes[8] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[8], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 10); + + int idx = _scene->_dynamicHotspots.add(NOUN_COBWEB, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(199, 112, 199 + 6, 112 + 12)); + _scene->_dynamicHotspots.setPosition(idx, Common::Point(194, 125), FACING_NORTHEAST); + idx = _scene->_dynamicHotspots.add(NOUN_COBWEB, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(202, 81, 202 + 5, 81 + 31)); + _scene->_dynamicHotspots.setPosition(idx, Common::Point(194, 125), FACING_NORTHEAST); + + idx = _scene->_dynamicHotspots.add(NOUN_COBWEB, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(138, 74, 138 + 7, 74 + 33)); + _scene->_dynamicHotspots.setPosition(idx, Common::Point(154, 124), FACING_NORTHWEST); + idx = _scene->_dynamicHotspots.add(NOUN_COBWEB, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(143, 107, 143 + 6, 107 + 15)); + _scene->_dynamicHotspots.setPosition(idx, Common::Point(154, 124), FACING_NORTHWEST); + } + } + + if (_globals[kCatacombsMisc] & MAZE_EVENT_BRICK) { + _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', 2)); + _scene->drawToBackground(_globals._spriteIndexes[7], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_EXPOSED_BRICK, false); + } + + if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _greenFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_greenFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if ((_game._difficulty == DIFFICULTY_HARD) && (_globals[kCatacombsRoom] == 52)) + _scene->_sequences.addTimer(120, 60); + + sceneEntrySound(); +} + +void Scene408::step() { + if (_game._trigger == 60) + _vm->_dialogs->show(31); +} + +void Scene408::actions() { + if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR) + && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) { + if (_frameInRoomFl) + _vm->_dialogs->show(29); + else { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 5, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + if (_action.isObject(NOUN_RED_FRAME)) { + _game._objects.setRoom(OBJ_RED_FRAME, NOWHERE); + _game._objects[OBJ_RED_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0); + _redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_GREEN_FRAME)) { + _game._objects.setRoom(OBJ_GREEN_FRAME, NOWHERE); + _game._objects[OBJ_GREEN_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _greenFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_greenFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_BLUE_FRAME)) { + _game._objects.setRoom(OBJ_BLUE_FRAME, NOWHERE); + _game._objects[OBJ_BLUE_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_YELLOW_FRAME)) { + _game._objects.setRoom(OBJ_YELLOW_FRAME, NOWHERE); + _game._objects[OBJ_YELLOW_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[1]); + _game._player._visible = true; + _game._player._stepEnabled = true; + break; + + default: + break; + } + } + _action._inProgress = false; + return; + } + + + if (_action.isAction(VERB_TAKE) + && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_GREEN_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME))) { + if ((_takingFrameInRoomFl || _game._trigger)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 5, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + if (_action.isObject(NOUN_RED_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _scene->_dynamicHotspots.remove(_redFrameHotspotId); + _game._objects.addToInventory(OBJ_RED_FRAME); + } + + if (_action.isObject(NOUN_GREEN_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[3]); + _scene->_dynamicHotspots.remove(_greenFrameHotspotId); + _game._objects.addToInventory(OBJ_GREEN_FRAME); + } + + if (_action.isObject(NOUN_BLUE_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[4]); + _scene->_dynamicHotspots.remove(_blueFrameHotspotId); + _game._objects.addToInventory(OBJ_BLUE_FRAME); + } + + if (_action.isObject(NOUN_YELLOW_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[5]); + _scene->_dynamicHotspots.remove(_yellowFrameHotspotId); + _game._objects.addToInventory(OBJ_YELLOW_FRAME); + } + + _vm->_sound->command(26); + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[1]); + _game._player._visible = true; + _game._player._stepEnabled = true; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_NORTH)) { + _game.moveCatacombs(0); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_EXIT_TO, NOUN_MORE_CATACOMBS)) { + _game.moveCatacombs(2); + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(40810); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(40811); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(40812); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ARCHWAY)) { + _vm->_dialogs->show(40813); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_EXPOSED_BRICK)) { + _vm->_dialogs->show(40814); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MORE_CATACOMBS)) { + _vm->_dialogs->show(40815); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CEILING)) { + _vm->_dialogs->show(40816); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RED_FRAME) && !_game._objects.isInInventory(OBJ_RED_FRAME)) { + _vm->_dialogs->showItem(OBJ_RED_FRAME, 802, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GREEN_FRAME) && !_game._objects.isInInventory(OBJ_GREEN_FRAME)) { + _vm->_dialogs->showItem(OBJ_GREEN_FRAME, 819, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BLUE_FRAME) && !_game._objects.isInInventory(OBJ_BLUE_FRAME)) { + _vm->_dialogs->showItem(OBJ_BLUE_FRAME, 817, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_YELLOW_FRAME) && !_game._objects.isInInventory(OBJ_YELLOW_FRAME)) { + _vm->_dialogs->showItem(OBJ_YELLOW_FRAME, 804, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GATE)) { + _vm->_dialogs->show(40817); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_COBWEB)) { + if (_globals[kCobwebIsCut]) + _vm->_dialogs->show(40820); + else + _vm->_dialogs->show(40819); + + _action._inProgress = false; + return; + } + } + + if ((_action.isAction(VERB_ATTACK, NOUN_COBWEB) && !_globals[kCobwebIsCut])) { + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('W', 1), 70); + _game._player._visible = false; + _game._player._stepEnabled = false; + _globals[kCobwebIsCut] = true; + _scene->deleteSequence(_globals._sequenceIndexes[6]); + _action._inProgress = false; + return; + } + + if (_game._trigger == 70) { + _globals._sequenceIndexes[8] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[8], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 14); + _scene->changeVariant(0); + _scene->_hotspots.activate(NOUN_COBWEB, false); + _game._player._visible = true; + _game._player._stepEnabled = true; + + int idx = _scene->_dynamicHotspots.add(NOUN_COBWEB, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(199, 112, 199 + 6, 112 + 12)); + _scene->_dynamicHotspots.setPosition(idx, Common::Point(194, 125), FACING_NORTHEAST); + idx = _scene->_dynamicHotspots.add(NOUN_COBWEB, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(202, 81, 202 + 5, 81 + 31)); + _scene->_dynamicHotspots.setPosition(idx, Common::Point(194, 125), FACING_NORTHEAST); + + idx = _scene->_dynamicHotspots.add(NOUN_COBWEB, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(138, 74, 138 + 7, 74 + 33)); + _scene->_dynamicHotspots.setPosition(idx, Common::Point(154, 124), FACING_NORTHWEST); + idx = _scene->_dynamicHotspots.add(NOUN_COBWEB, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(143, 107, 143 + 6, 107 + 15)); + _scene->_dynamicHotspots.setPosition(idx, Common::Point(154, 124), FACING_NORTHWEST); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_OPEN, NOUN_GATE)) { + _vm->_dialogs->show(40818); + _action._inProgress = false; + } +} + +void Scene408::preActions() { + _frameInRoomFl = false; + _takingFrameInRoomFl = false; + + if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_RED_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_YELLOW_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_BLUE_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_GREEN_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR) + && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) { + if (_frameInRoomFl) + _game._player._needToWalk = false; + else { + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _game._player.walk(Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + } +} + +/*------------------------------------------------------------------------*/ + +Scene409::Scene409(MADSEngine *vm) : Scene4xx(vm) { + _frameInRoomFl = false; + _takingFrameInRoomFl = false; + + _redFrameHotspotId = -1; + _greenFrameHotspotId = -1; + _blueFrameHotspotId = -1; + _yellowFrameHotspotId = -1; +} + +void Scene409::synchronize(Common::Serializer &s) { + Scene4xx::synchronize(s); + + s.syncAsByte(_frameInRoomFl); + s.syncAsByte(_takingFrameInRoomFl); + + s.syncAsSint16LE(_redFrameHotspotId); + s.syncAsSint16LE(_greenFrameHotspotId); + s.syncAsSint16LE(_blueFrameHotspotId); + s.syncAsSint16LE(_yellowFrameHotspotId); +} + +void Scene409::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + _scene->addActiveVocab(NOUN_RED_FRAME); + _scene->addActiveVocab(NOUN_YELLOW_FRAME); + _scene->addActiveVocab(NOUN_BLUE_FRAME); + _scene->addActiveVocab(NOUN_GREEN_FRAME); +} + +void Scene409::enter() { + _game.initCatacombs(); + + _scene->loadSpeech(3); + _scene->_hotspots.activate(NOUN_SWORD, false); + + _globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RDR_9"); + _globals._spriteIndexes[0] = _scene->_sprites.addSprites("*RRD_9"); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 0)); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 1)); + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 2)); + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('f', 3)); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 0)); + + if (_game._objects.isInRoom(OBJ_SWORD)) { + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('p', 0)); + _globals._spriteIndexes[0] = _scene->_sprites.addSprites("*RRD_9"); + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + _scene->_hotspots.activate(NOUN_SWORD, true); + } + + if (!_globals[kDoorIn409IsOpen]) { + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14); + _scene->_hotspots.activate(NOUN_ARCHWAY_TO_NORTH, false); + } else + _scene->_hotspots.activate(NOUN_DOOR, false); + + if (_scene->_priorSceneId == 410) { + _game._player._facing = FACING_NORTH; + _game._player._playerPos = Common::Point(229, 106); + + if (_globals[kFlickedLever1] && _globals[kFlickedLever2] && _globals[kFlickedLever3] && _globals[kFlickedLever4]) { + if ((_globals[kFlickedLever1] == 5) && (_globals[kFlickedLever2] == 18) && (_globals[kFlickedLever3] == 9) && (_globals[kFlickedLever4] == 11)) { + if (!_globals[kDoorIn409IsOpen]) { + _globals[kPlayerScore] += 5; + _vm->_sound->command(24); + _scene->deleteSequence(_globals._sequenceIndexes[6]); + _game._player._stepEnabled = false; + _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 7, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 65); + } + } else { + _globals[kFlickedLever1] = 0; + _globals[kFlickedLever2] = 0; + _globals[kFlickedLever3] = 0; + _globals[kFlickedLever4] = 0; + _game._player._stepEnabled = false; + _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 9, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_SPRITE, 15, 60); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 61); + _vm->_sound->command(68); + } + } else { + _globals[kFlickedLever1] = 0; + _globals[kFlickedLever2] = 0; + _globals[kFlickedLever3] = 0; + _globals[kFlickedLever4] = 0; + } + } else if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + switch (_globals[kCatacombsFrom]) { + case 0: + _game._player._playerPos = Common::Point(195, 92); + _game._player._facing = FACING_SOUTH; + _game._player.walk(Common::Point(195, 107), FACING_SOUTH); + break; + + case 2: + _game._player._playerPos = Common::Point(184, 45); + _game._player._facing = FACING_NORTH; + break; + + default: + break; + } + } + + if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0); + _redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0); + _greenFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_greenFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0); + _blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0); + _yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + sceneEntrySound(); +} + +void Scene409::step() { + if (_game._trigger == 60) { + _game._player._visible = false; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[7]); + _scene->playSpeech(3); + } + + if (_game._trigger == 61) { + _globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1); + _scene->_sequences.addTimer(60, 62); + _vm->_sound->command(27); + } + + if (_game._trigger == 62) + _scene->_reloadSceneFlag = true; + + if (_game._trigger == 65) { + _game._player._stepEnabled = true; + _globals[kDoorIn409IsOpen] = true; + _scene->_hotspots.activate(NOUN_DOOR, false); + _scene->_hotspots.activate(NOUN_ARCHWAY_TO_NORTH, true); + } +} + +void Scene409::actions() { + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 4, 4); + _action._inProgress = false; + return; + + case 1: { + int syncIdx = _globals._sequenceIndexes[8]; + _globals._sequenceIndexes[8] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[8], false, 4); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[8], SYNC_SEQ, syncIdx); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], false); + _scene->_sequences.addTimer(30, 2); + _action._inProgress = false; + } + return; + + case 2: + _scene->deleteSequence(_globals._sequenceIndexes[8]); + _globals._sequenceIndexes[8] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[8], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], false); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 3); + _action._inProgress = false; + return; + + case 3: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]); + _game._player._visible = true; + _vm->_dialogs->show(40923); + _game._player._stepEnabled = true; + _action._inProgress = false; + return; + + case 4: + _vm->_sound->command(70); + _action._inProgress = false; + return; + + default: + break; + } + } + + if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR)) { + if (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME)) { + if (_frameInRoomFl) { + _vm->_dialogs->show(29); + } else { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[0] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[0], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_SPRITE, 5, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + if (_action.isObject(NOUN_RED_FRAME)) { + _game._objects.setRoom(OBJ_RED_FRAME, NOWHERE); + _game._objects[OBJ_RED_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0); + _redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_GREEN_FRAME)) { + _game._objects.setRoom(OBJ_GREEN_FRAME, NOWHERE); + _game._objects[OBJ_GREEN_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0); + _greenFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_greenFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_BLUE_FRAME)) { + _game._objects.setRoom(OBJ_BLUE_FRAME, NOWHERE); + _game._objects[OBJ_BLUE_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0); + _blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_YELLOW_FRAME)) { + _game._objects.setRoom(OBJ_YELLOW_FRAME, NOWHERE); + _game._objects[OBJ_YELLOW_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0); + _yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[0]); + _game._player._visible = true; + _game._player._stepEnabled = true; + break; + + default: + break; + } + } + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE)) { + if ((_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_GREEN_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME)) + && (_takingFrameInRoomFl || _game._trigger)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[0] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[0], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_SPRITE, 5, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + if (_action.isObject(NOUN_RED_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _scene->_dynamicHotspots.remove(_redFrameHotspotId); + _game._objects.addToInventory(OBJ_RED_FRAME); + } + + if (_action.isObject(NOUN_GREEN_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[3]); + _scene->_dynamicHotspots.remove(_greenFrameHotspotId); + _game._objects.addToInventory(OBJ_GREEN_FRAME); + } + + if (_action.isObject(NOUN_BLUE_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[4]); + _scene->_dynamicHotspots.remove(_blueFrameHotspotId); + _game._objects.addToInventory(OBJ_BLUE_FRAME); + } + + if (_action.isObject(NOUN_YELLOW_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[5]); + _scene->_dynamicHotspots.remove(_yellowFrameHotspotId); + _game._objects.addToInventory(OBJ_YELLOW_FRAME); + } + + _vm->_sound->command(26); + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[0]); + _game._player._visible = true; + _game._player._stepEnabled = true; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_NORTH)) { + _game.enterCatacombs(true); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_EXIT_TO, NOUN_MORE_CATACOMBS)) { + _game.enterCatacombs(false); + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(40910); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_SWORD) && (_game._objects.isInRoom(OBJ_SWORD) || _game._trigger)) { + switch (_game._trigger) { + case (0): + _globals[kPlayerScore] += 5; + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[0] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[0], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_SPRITE, 5, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + _scene->deleteSequence(_globals._sequenceIndexes[1]); + _scene->_hotspots.activate(NOUN_SWORD, false); + _game._objects.addToInventory(OBJ_SWORD); + _vm->_sound->command(26); + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[0]); + _game._player._visible = true; + _scene->_sequences.addTimer(20, 3); + break; + + case 3: + _vm->_dialogs->showItem(OBJ_SWORD, 808, 0); + _game._player._stepEnabled = true; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(40911); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(40912); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ARCHWAY)) { + _vm->_dialogs->show(40913); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_EXPOSED_BRICK)) { + _vm->_dialogs->show(40914); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MORE_CATACOMBS)) { + _vm->_dialogs->show(40915); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BLOCKED_ARCHWAY)) { + _vm->_dialogs->show(40916); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GRATE)) { + _vm->_dialogs->show(40917); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_UNLUCKY_ADVENTURER)) { + _vm->_dialogs->show(40920); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RED_FRAME) && !_game._objects.isInInventory(OBJ_RED_FRAME)) { + _vm->_dialogs->showItem(OBJ_RED_FRAME, 802, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GREEN_FRAME) && !_game._objects.isInInventory(OBJ_GREEN_FRAME)) { + _vm->_dialogs->showItem(OBJ_GREEN_FRAME, 819, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BLUE_FRAME) && !_game._objects.isInInventory(OBJ_BLUE_FRAME)) { + _vm->_dialogs->showItem(OBJ_BLUE_FRAME, 817, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_YELLOW_FRAME) && !_game._objects.isInInventory(OBJ_YELLOW_FRAME)) { + _vm->_dialogs->showItem(OBJ_YELLOW_FRAME, 804, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SWORD) && _game._objects.isInRoom(OBJ_SWORD)) { + _vm->_dialogs->show(40921); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_LOOK, NOUN_SWITCH_PANEL)) { + _vm->_dialogs->show(40919); + _scene->_nextSceneId = 410; + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_TO, NOUN_SWITCH_PANEL)) { + _scene->_nextSceneId = 410; + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_OPEN, NOUN_GRATE) || _action.isAction(VERB_PUSH, NOUN_GRATE) || _action.isAction(VERB_PULL, NOUN_GRATE)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 2: + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true); + _scene->_sequences.addTimer(30, 3); + break; + + case 3: + _scene->deleteSequence(_globals._sequenceIndexes[0]); + _globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], false); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 4); + break; + + case 4: + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[0]); + _scene->_sequences.addTimer(6, 5); + break; + + case 5: + _game._player._stepEnabled = true; + _vm->_dialogs->show(40918); + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TALK_TO, NOUN_UNLUCKY_ADVENTURER)) { + _vm->_dialogs->show(40924); + _action._inProgress = false; + } +} + +void Scene409::preActions() { + _frameInRoomFl = false; + _takingFrameInRoomFl = false; + + if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_RED_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_YELLOW_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_BLUE_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_GREEN_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR) + && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) { + if (_frameInRoomFl) + _game._player._needToWalk = false; + else { + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0); + _game._player.walk(Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + } + + if (_action.isAction(VERB_LOOK, NOUN_SWITCH_PANEL)) + _game._player.walk(Common::Point(229, 106), FACING_NORTH); + + if (_action.isAction(VERB_OPEN, NOUN_DOOR)) + _game._player.walk(Common::Point(191, 104), FACING_NORTHEAST); + + if (_action.isAction(VERB_OPEN, NOUN_GRATE)) + _game._player._needToWalk = true; +} + +/*------------------------------------------------------------------------*/ + +Scene410::Scene410(MADSEngine *vm) : Scene4xx(vm) { + for (int i = 0; i < 26; i++) + _skullSequence[i]; +} + +void Scene410::synchronize(Common::Serializer &s) { + Scene4xx::synchronize(s); + + for (int i = 0; i < 26; i++) + s.syncAsSint16LE(_skullSequence[i]); +} + +void Scene410::setup() { + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene410::enter() { + _game._player._visible = false; + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('l', 0)); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('l', 1)); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('l', 2)); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 0)); + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 0)); + + for (int i = 1; i < 27; i++) { + Common::Point pos; + int type; + + getLeverInfo(&pos, &type, i, NULL); + int stampType = -1; + + switch (type) { + case 1: + stampType = _globals._spriteIndexes[0]; + break; + + case 2: + stampType = _globals._spriteIndexes[1]; + break; + + case 3: + stampType = _globals._spriteIndexes[2]; + break; + + default: + break; + } + + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(stampType, false, 1); + _scene->_sequences.setPosition(_globals._sequenceIndexes[0], pos); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2); + _skullSequence[i - 1] = _globals._sequenceIndexes[0]; + } + + if (_globals[kFlickedLever1]) { + Common::Point pos; + int type; + + getLeverInfo(&pos, &type, _globals[kFlickedLever1], NULL); + int stampType = -1; + + switch (type) { + case 1: + stampType = _globals._spriteIndexes[0]; + break; + + case 2: + stampType = _globals._spriteIndexes[1]; + break; + + case 3: + stampType = _globals._spriteIndexes[2]; + break; + + default: + break; + } + _scene->deleteSequence(_skullSequence[_globals[kFlickedLever1] - 1]); + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(stampType, false, -2); + _scene->_sequences.setPosition(_globals._sequenceIndexes[0], pos); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2); + } + + if (_globals[kFlickedLever2]) { + Common::Point pos; + int type; + + getLeverInfo(&pos, &type, _globals[kFlickedLever2], NULL); + int stampType = -1; + switch (type) { + case 1: + stampType = _globals._spriteIndexes[0]; + break; + + case 2: + stampType = _globals._spriteIndexes[1]; + break; + + case 3: + stampType = _globals._spriteIndexes[2]; + break; + + default: + break; + } + _scene->deleteSequence(_skullSequence[_globals[kFlickedLever2] - 1]); + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(stampType, false, -2); + _scene->_sequences.setPosition(_globals._sequenceIndexes[0], pos); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2); + } + + if (_globals[kFlickedLever3]) { + Common::Point pos; + int type; + + getLeverInfo(&pos, &type, _globals[kFlickedLever3], NULL); + int stampType = -1; + switch (type) { + case 1: + stampType = _globals._spriteIndexes[0]; + break; + + case 2: + stampType = _globals._spriteIndexes[1]; + break; + + case 3: + stampType = _globals._spriteIndexes[2]; + break; + + default: + break; + } + _scene->deleteSequence(_skullSequence[_globals[kFlickedLever3] - 1]); + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(stampType, false, -2); + _scene->_sequences.setPosition(_globals._sequenceIndexes[0], pos); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2); + } + + if (_globals[kFlickedLever4]) { + Common::Point pos; + int type; + + getLeverInfo(&pos, &type, _globals[kFlickedLever4], NULL); + int stampType = -1; + switch (type) { + case 1: + stampType = _globals._spriteIndexes[0]; + break; + + case 2: + stampType = _globals._spriteIndexes[1]; + break; + + case 3: + stampType = _globals._spriteIndexes[2]; + break; + + default: + break; + } + _scene->deleteSequence(_skullSequence[_globals[kFlickedLever4] - 1]); + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(stampType, false, -2); + _scene->_sequences.setPosition(_globals._sequenceIndexes[0], pos); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2); + } + + sceneEntrySound(); +} + +void Scene410::step() { +} + +void Scene410::actions() { + if (_action._lookFlag) { + _vm->_dialogs->show(41013); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) { + if (_globals[kDoorIn409IsOpen]) + _vm->_dialogs->show(41014); + else { + Common::Point pos; + int type; + int number; + + switch (_game._trigger) { + case 0: + _game._player._stepEnabled = false; + getLeverInfo(&pos, &type, 0, &number); + _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 4, 2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2); + if (pos.y == 46) + pos.y = 48; + + _scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(pos.x + 4, pos.y + 107)); + if (!_globals[kDoorIn409IsOpen]) + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 16, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + getLeverInfo(&pos, &type, 0, &number); + + if ((_globals[kFlickedLever1] != number) && (_globals[kFlickedLever2] != number) && (_globals[kFlickedLever3] != number) && (_globals[kFlickedLever4] != number)) { + _vm->_sound->command(65); + + if (!_globals[kFlickedLever1]) { + _globals[kFlickedLever1] = number; + if (_globals[kFlickedLever1] == 5) + _vm->_sound->command(66); + } else if (!_globals[kFlickedLever2]) { + _globals[kFlickedLever2] = number; + if ((_globals[kFlickedLever1] == 5) && (_globals[kFlickedLever2] == 18)) + _vm->_sound->command(66); + } else if (!_globals[kFlickedLever3]) { + _globals[kFlickedLever3] = number; + if ((_globals[kFlickedLever1] == 5) && (_globals[kFlickedLever2] == 18) && (_globals[kFlickedLever3] == 9)) + _vm->_sound->command(66); + } else if (!_globals[kFlickedLever4]) { + _globals[kFlickedLever4] = number; + if ((_globals[kFlickedLever1] == 5) && (_globals[kFlickedLever2] == 18) && (_globals[kFlickedLever3] == 9) && (_globals[kFlickedLever4] == 11)) + _vm->_sound->command(66); + } + + if (_game._difficulty == DIFFICULTY_EASY) + _scene->drawToBackground(_globals._spriteIndexes[4], number, Common::Point(-32000, -32000), 0, 100); + + switch (type) { + case 1: + _scene->deleteSequence(_skullSequence[number - 1]); + _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 4, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 4); + _scene->_sequences.setPosition(_globals._sequenceIndexes[0], pos); + break; + + case 2: + _scene->deleteSequence(_skullSequence[number - 1]); + _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 4, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 4); + _scene->_sequences.setPosition(_globals._sequenceIndexes[1], pos); + break; + + case 3: + _scene->deleteSequence(_skullSequence[number - 1]); + _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 4, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 4); + _scene->_sequences.setPosition(_globals._sequenceIndexes[2], pos); + break; + + default: + break; + } + } + break; + + case 2: + _game._player._stepEnabled = true; + + if ((_globals[kFlickedLever1] == 5) && (_globals[kFlickedLever2] == 18) && (_globals[kFlickedLever3] == 9) && (_globals[kFlickedLever4] == 11) && !_globals[kDoorIn409IsOpen]) + _vm->_sound->command(67); + + if (_globals[kFlickedLever1] && _globals[kFlickedLever2] && _globals[kFlickedLever3] && _globals[kFlickedLever4]) + _scene->_nextSceneId = 409; + + break; + + case 4: + getLeverInfo(&pos, &type, 0, &number); + _globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 2); + _scene->_sequences.setPosition(_globals._sequenceIndexes[0], pos); + break; + + case 5: + getLeverInfo(&pos, &type, 0, &number); + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 2); + _scene->_sequences.setPosition(_globals._sequenceIndexes[1], pos); + break; + + case 6: + getLeverInfo(&pos, &type, 0, &number); + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 2); + _scene->_sequences.setPosition(_globals._sequenceIndexes[2], pos); + break; + + default: + break; + } + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(41011); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SWITCH_PANEL)) { + _vm->_dialogs->show(41011); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CATACOMB_ROOM)) { + _vm->_dialogs->show(41015); + _action._inProgress = false; + return; + } + + switch (_action._activeAction._objectNameId) { + case NOUN_SKULL_SWITCH_1: + case NOUN_SKULL_SWITCH_2: + case NOUN_SKULL_SWITCH_3: + case NOUN_SKULL_SWITCH_4: + case NOUN_SKULL_SWITCH_5: + case NOUN_SKULL_SWITCH_6: + case NOUN_SKULL_SWITCH_7: + case NOUN_SKULL_SWITCH_8: + case NOUN_SKULL_SWITCH_9: + case NOUN_SKULL_SWITCH_10: + case NOUN_SKULL_SWITCH_11: + case NOUN_SKULL_SWITCH_12: + case NOUN_SKULL_SWITCH_13: + case NOUN_SKULL_SWITCH_14: + case NOUN_SKULL_SWITCH_15: + case NOUN_SKULL_SWITCH_16: + case NOUN_SKULL_SWITCH_17: + case NOUN_SKULL_SWITCH_18: + case NOUN_SKULL_SWITCH_19: + case NOUN_SKULL_SWITCH_20: + case NOUN_SKULL_SWITCH_21: + case NOUN_SKULL_SWITCH_22: + case NOUN_SKULL_SWITCH_23: + case NOUN_SKULL_SWITCH_24: + case NOUN_SKULL_SWITCH_25: + case NOUN_SKULL_SWITCH_26: + _vm->_dialogs->show(41012); + _action._inProgress = false; + return; + break; + } + } + + if (_action.isAction(VERB_EXIT_TO, NOUN_CATACOMB_ROOM)) { + _scene->_nextSceneId = 409; + _action._inProgress = false; + } +} + +void Scene410::preActions() { +} + +void Scene410::getLeverInfo(Common::Point *pos, int *type, int lever, int *noun) { + if (noun != NULL) { + switch (_action._activeAction._objectNameId) { + case NOUN_SKULL_SWITCH_1: + lever = 1; + break; + + case NOUN_SKULL_SWITCH_2: + lever = 2; + break; + + case NOUN_SKULL_SWITCH_3: + lever = 3; + break; + + case NOUN_SKULL_SWITCH_4: + lever = 4; + break; + + case NOUN_SKULL_SWITCH_5: + lever = 5; + break; + + case NOUN_SKULL_SWITCH_6: + lever = 6; + break; + + case NOUN_SKULL_SWITCH_7: + lever = 7; + break; + + case NOUN_SKULL_SWITCH_8: + lever = 8; + break; + + case NOUN_SKULL_SWITCH_9: + lever = 9; + break; + + case NOUN_SKULL_SWITCH_10: + lever = 10; + break; + + case NOUN_SKULL_SWITCH_11: + lever = 11; + break; + + case NOUN_SKULL_SWITCH_12: + lever = 12; + break; + + case NOUN_SKULL_SWITCH_13: + lever = 13; + break; + + case NOUN_SKULL_SWITCH_14: + lever = 14; + break; + + case NOUN_SKULL_SWITCH_15: + lever = 15; + break; + + case NOUN_SKULL_SWITCH_16: + lever = 16; + break; + + case NOUN_SKULL_SWITCH_17: + lever = 17; + break; + + case NOUN_SKULL_SWITCH_18: + lever = 18; + break; + + case NOUN_SKULL_SWITCH_19: + lever = 19; + break; + + case NOUN_SKULL_SWITCH_20: + lever = 20; + break; + + case NOUN_SKULL_SWITCH_21: + lever = 21; + break; + + case NOUN_SKULL_SWITCH_22: + lever = 22; + break; + + case NOUN_SKULL_SWITCH_23: + lever = 23; + break; + + case NOUN_SKULL_SWITCH_24: + lever = 24; + break; + + case NOUN_SKULL_SWITCH_25: + lever = 25; + break; + + case NOUN_SKULL_SWITCH_26: + lever = 26; + break; + + default: + break; + } + *noun = lever; + } + + switch (lever) { + case 1: + *pos = Common::Point(124, 46); + *type = 3; + break; + + case 2: + *pos = Common::Point(143, 46); + *type = 2; + break; + + case 3: + *pos = Common::Point(162, 46); + *type = 1; + break; + + case 4: + *pos = Common::Point(181, 46); + *type = 3; + break; + + case 5: + *pos = Common::Point(200, 46); + *type = 1; + break; + + case 6: + *pos = Common::Point(219, 46); + *type = 2; + break; + + case 7: + *pos = Common::Point(238, 46); + *type = 1; + break; + + case 8: + *pos = Common::Point(133, 71); + *type = 3; + break; + + case 9: + *pos = Common::Point(152, 71); + *type = 2; + break; + + case 10: + *pos = Common::Point(171, 71); + *type = 1; + break; + + case 11: + *pos = Common::Point(190, 71); + *type = 3; + break; + + case 12: + *pos = Common::Point(209, 71); + *type = 2; + break; + + case 13: + *pos = Common::Point(228, 71); + *type = 1; + break; + + case 14: + *pos = Common::Point(124, 98); + *type = 1; + break; + + case 15: + *pos = Common::Point(143, 98); + *type = 3; + break; + + case 16: + *pos = Common::Point(162, 98); + *type = 2; + break; + + case 17: + *pos = Common::Point(181, 98); + *type = 1; + break; + + case 18: + *pos = Common::Point(200, 98); + *type = 1; + break; + + case 19: + *pos = Common::Point(219, 98); + *type = 2; + break; + + case 20: + *pos = Common::Point(238, 98); + *type = 1; + break; + + case 21: + *pos = Common::Point(133, 125); + *type = 3; + break; + + case 22: + *pos = Common::Point(152, 125); + *type = 1; + break; + + case 23: + *pos = Common::Point(171, 125); + *type = 3; + break; + + case 24: + *pos = Common::Point(190, 125); + *type = 2; + break; + + case 25: + *pos = Common::Point(209, 125); + *type = 1; + break; + + case 26: + *pos = Common::Point(228, 125); + *type = 2; + break; + + default: + *pos = Common::Point(-1, -1); + *type = -1; + break; + } +} + +/*------------------------------------------------------------------------*/ + +Scene453::Scene453(MADSEngine *vm) : Scene4xx(vm) { + _frameInRoomFl = false; + _takingFrameInRoomFl = false; + + _redFrameHotspotId = -1; + _greenFrameHotspotId = -1; + _blueFrameHotspotId = -1; + _yellowFrameHotspotId = -1; +} + +void Scene453::synchronize(Common::Serializer &s) { + Scene4xx::synchronize(s); + + s.syncAsByte(_frameInRoomFl); + s.syncAsByte(_takingFrameInRoomFl); + + s.syncAsSint16LE(_redFrameHotspotId); + s.syncAsSint16LE(_greenFrameHotspotId); + s.syncAsSint16LE(_blueFrameHotspotId); + s.syncAsSint16LE(_yellowFrameHotspotId); +} + +void Scene453::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + if (_globals[kCatacombsMisc] & MAZE_EVENT_STONE) + _scene->_variant = 1; + + _scene->addActiveVocab(NOUN_RED_FRAME); + _scene->addActiveVocab(NOUN_YELLOW_FRAME); + _scene->addActiveVocab(NOUN_BLUE_FRAME); + _scene->addActiveVocab(NOUN_GREEN_FRAME); +} + +void Scene453::enter() { + _game.initCatacombs(); + + _scene->_hotspots.activate(NOUN_SKULL, false); + _scene->_hotspots.activate(NOUN_DRAIN, false); + _scene->_hotspots.activate(NOUN_RATS_NEST, false); + _scene->_hotspots.activate(NOUN_WEB, false); + _scene->_hotspots.activate(NOUN_STONE, false); + _scene->_hotspots.activate(NOUN_HOLE, false); + _scene->_hotspots.activate(NOUN_GATE, false); + + _globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RRD_9"); + _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('f', 0)); + _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('f', 1)); + _globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('f', 2)); + _globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('f', 3)); + + + if (_game.exitCatacombs(0) == -1) { + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 1)); + _scene->drawToBackground(_globals._spriteIndexes[1], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_ARCHWAY_TO_NORTH, false); + } + + if (_game.exitCatacombs(3) == -1) { + _globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('c', 8)); + _scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_MORE_CATACOMBS, false); + _scene->_hotspots.activate(NOUN_GATE, true); + } + + if (_game.exitCatacombs(1) == -1) { + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 2)); + _scene->drawToBackground(_globals._spriteIndexes[2], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_ARCHWAY_TO_EAST, false); + } + + if (_globals[kCatacombsMisc] & MAZE_EVENT_DRAIN) { + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('c', 3)); + _scene->drawToBackground(_globals._spriteIndexes[3], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_DRAIN, true); + } + + if (_globals[kCatacombsMisc] & MAZE_EVENT_RAT_NEST) { + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('c', 4)); + _scene->drawToBackground(_globals._spriteIndexes[4], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_SKULL, true); + _scene->_hotspots.activate(NOUN_RATS_NEST, true); + } + + if (_globals[kCatacombsMisc] & MAZE_EVENT_WEB) { + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('c', 5)); + _scene->drawToBackground(_globals._spriteIndexes[5], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_WEB, true); + } + + if (_globals[kCatacombsMisc] & MAZE_EVENT_BRICK) { + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('c', 6)); + _scene->drawToBackground(_globals._spriteIndexes[6], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activateAtPos(NOUN_EXPOSED_BRICK, false, Common::Point(138, 35)); + _scene->_hotspots.activateAtPos(NOUN_EXPOSED_BRICK, false, Common::Point(84, 27)); + } + + if (_globals[kCatacombsMisc] & MAZE_EVENT_STONE) { + _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', 7)); + _scene->drawToBackground(_globals._spriteIndexes[7], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_HOLE, true); + _scene->_hotspots.activate(NOUN_STONE, true); + } + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + switch (_globals[kCatacombsFrom]) { + case 0: + _game._player._playerPos = Common::Point(107, 87); + _game._player._facing = FACING_SOUTH; + _game._player.walk(Common::Point(107, 98), FACING_SOUTH); + break; + + case 1: + _game._player._playerPos = Common::Point(316, 129); + _game._player._facing = FACING_WEST; + _game._player.walk(Common::Point(277, 129), FACING_WEST); + break; + + case 3: + _game._player.firstWalk(Common::Point(-20, 128), FACING_EAST, Common::Point(19, 128), FACING_EAST, true); + break; + + default: + break; + } + } + + if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _greenFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_greenFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + sceneEntrySound(); +} + +void Scene453::step() { +} + +void Scene453::actions() { + if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR)) { + if (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME)) { + if (_frameInRoomFl) + _vm->_dialogs->show(29); + else { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 5, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + if (_action.isObject(NOUN_RED_FRAME)) { + _game._objects.setRoom(OBJ_RED_FRAME, NOWHERE); + _game._objects[OBJ_RED_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_GREEN_FRAME)) { + _game._objects.setRoom(OBJ_GREEN_FRAME, NOWHERE); + _game._objects[OBJ_GREEN_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _greenFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_greenFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_BLUE_FRAME)) { + _game._objects.setRoom(OBJ_BLUE_FRAME, NOWHERE); + _game._objects[OBJ_BLUE_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_YELLOW_FRAME)) { + _game._objects.setRoom(OBJ_YELLOW_FRAME, NOWHERE); + _game._objects[OBJ_YELLOW_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]); + _game._player._visible = true; + _game._player._stepEnabled = true; + break; + + default: + break; + } + } + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE)) { + if (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_GREEN_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME)) { + if ((_takingFrameInRoomFl || _game._trigger)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 5, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + if (_action.isObject(NOUN_RED_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[9]); + _scene->_dynamicHotspots.remove(_redFrameHotspotId); + _game._objects.addToInventory(OBJ_RED_FRAME); + } + + if (_action.isObject(NOUN_GREEN_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[10]); + _scene->_dynamicHotspots.remove(_greenFrameHotspotId); + _game._objects.addToInventory(OBJ_GREEN_FRAME); + } + + if (_action.isObject(NOUN_BLUE_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[11]); + _scene->_dynamicHotspots.remove(_blueFrameHotspotId); + _game._objects.addToInventory(OBJ_BLUE_FRAME); + } + + if (_action.isObject(NOUN_YELLOW_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[12]); + _scene->_dynamicHotspots.remove(_yellowFrameHotspotId); + _game._objects.addToInventory(OBJ_YELLOW_FRAME); + } + + _vm->_sound->command(26); + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]); + _game._player._visible = true; + _game._player._stepEnabled = true; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + } + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_NORTH)) { + _game.moveCatacombs(0); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_EAST)) { + _game.moveCatacombs(1); + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(45310); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(45311); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(45312); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ARCHWAY)) { + _vm->_dialogs->show(45313); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_EXPOSED_BRICK)) { + _vm->_dialogs->show(45314); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_HOLE)) { + _vm->_dialogs->show(45317); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SKULL)) { + _vm->_dialogs->show(45318); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WEB)) { + _vm->_dialogs->show(45324); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RATS_NEST)) { + _vm->_dialogs->show(45325); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DRAIN)) { + _vm->_dialogs->show(45327); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_STONE)) { + _vm->_dialogs->show(45328); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RED_FRAME) && !_game._objects.isInInventory(OBJ_RED_FRAME)) { + _vm->_dialogs->showItem(OBJ_RED_FRAME, 802, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GREEN_FRAME) && !_game._objects.isInInventory(OBJ_GREEN_FRAME)) { + _vm->_dialogs->showItem(OBJ_GREEN_FRAME, 819, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BLUE_FRAME) && !_game._objects.isInInventory(OBJ_BLUE_FRAME)) { + _vm->_dialogs->showItem(OBJ_BLUE_FRAME, 817, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_YELLOW_FRAME) && !_game._objects.isInInventory(OBJ_YELLOW_FRAME)) { + _vm->_dialogs->showItem(OBJ_YELLOW_FRAME, 804, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MORE_CATACOMBS)) { + _vm->_dialogs->show(45315); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GATE)) { + _vm->_dialogs->show(45330); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE, NOUN_SKULL)) { + _vm->_dialogs->show(45319); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_OPEN, NOUN_GATE)) { + _vm->_dialogs->show(45331); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_RATS_NEST)) { + _vm->_dialogs->show(45326); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_STONE)) { + _vm->_dialogs->show(45329); + _action._inProgress = false; + } +} + +void Scene453::preActions() { + if (_action.isAction(VERB_EXIT_TO, NOUN_MORE_CATACOMBS)) + _game.moveCatacombs(3); + + _frameInRoomFl = false; + _takingFrameInRoomFl = false; + + if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_RED_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_YELLOW_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_BLUE_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_GREEN_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR) && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) { + if (_frameInRoomFl) + _game._player._needToWalk = false; + else { + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[9]]->getFramePos(0); + _game._player.walk(Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + } +} + +/*------------------------------------------------------------------------*/ + +Scene456::Scene456(MADSEngine *vm) : Scene4xx(vm) { + _frameInRoomFl = false; + _takingFrameInRoomFl = false; + + _redFrameHotspotId = -1; + _greenFrameHotspotId = -1; + _blueFrameHotspotId = -1; + _yellowFrameHotspotId = -1; +} + +void Scene456::synchronize(Common::Serializer &s) { + Scene4xx::synchronize(s); + + s.syncAsByte(_frameInRoomFl); + s.syncAsByte(_takingFrameInRoomFl); + + s.syncAsSint16LE(_redFrameHotspotId); + s.syncAsSint16LE(_greenFrameHotspotId); + s.syncAsSint16LE(_blueFrameHotspotId); + s.syncAsSint16LE(_yellowFrameHotspotId); +} + +void Scene456::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + _scene->addActiveVocab(NOUN_RED_FRAME); + _scene->addActiveVocab(NOUN_YELLOW_FRAME); + _scene->addActiveVocab(NOUN_BLUE_FRAME); + _scene->addActiveVocab(NOUN_GREEN_FRAME); +} + +void Scene456::enter() { + _game.initCatacombs(); + + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('c', 1)); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RRD_9"); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 0)); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 1)); + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 2)); + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('f', 3)); + + if (_game.exitCatacombs(1) == -1) { + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_ARCHWAY_TO_EAST, false); + } + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + switch (_globals[kCatacombsFrom]) { + case 1: + _game._player._playerPos = Common::Point(298, 123); + _game._player._facing = FACING_WEST; + _game._player.walk(Common::Point(254, 123), FACING_WEST); + break; + + case 3: + _game._player._playerPos = Common::Point(14, 117); + _game._player._facing = FACING_SOUTH; + _game._player.walk(Common::Point(46, 117), FACING_EAST); + break; + + default: + break; + } + } + + if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0); + _redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0); + _greenFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_greenFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0); + _blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0); + _yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + sceneEntrySound(); +} + +void Scene456::step() { +} + +void Scene456::actions() { + if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR)) { + if (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME)) { + if (_frameInRoomFl) { + _vm->_dialogs->show(29); + } else { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 5, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + if (_action.isObject(NOUN_RED_FRAME)) { + _game._objects.setRoom(OBJ_RED_FRAME, NOWHERE); + _game._objects[OBJ_RED_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0); + _redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_GREEN_FRAME)) { + _game._objects.setRoom(OBJ_GREEN_FRAME, NOWHERE); + _game._objects[OBJ_GREEN_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0); + _greenFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_greenFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_BLUE_FRAME)) { + _game._objects.setRoom(OBJ_BLUE_FRAME, NOWHERE); + _game._objects[OBJ_BLUE_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0); + _blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_YELLOW_FRAME)) { + _game._objects.setRoom(OBJ_YELLOW_FRAME, NOWHERE); + _game._objects[OBJ_YELLOW_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0); + _yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[1]); + _game._player._visible = true; + _game._player._stepEnabled = true; + break; + + default: + break; + } + } + _action._inProgress = false; + return; + } + } + + + if (_action.isAction(VERB_TAKE) + && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_GREEN_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME))) { + if ((_takingFrameInRoomFl || _game._trigger)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 5, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: + if (_action.isObject(NOUN_RED_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _scene->_dynamicHotspots.remove(_redFrameHotspotId); + _game._objects.addToInventory(OBJ_RED_FRAME); + } + + if (_action.isObject(NOUN_GREEN_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[3]); + _scene->_dynamicHotspots.remove(_greenFrameHotspotId); + _game._objects.addToInventory(OBJ_GREEN_FRAME); + } + + if (_action.isObject(NOUN_BLUE_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[4]); + _scene->_dynamicHotspots.remove(_blueFrameHotspotId); + _game._objects.addToInventory(OBJ_BLUE_FRAME); + } + + if (_action.isObject(NOUN_YELLOW_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[5]); + _scene->_dynamicHotspots.remove(_yellowFrameHotspotId); + _game._objects.addToInventory(OBJ_YELLOW_FRAME); + } + + _vm->_sound->command(26); + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[1]); + _game._player._visible = true; + _game._player._stepEnabled = true; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_WEST)) { + _game.moveCatacombs(3); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_EAST)) { + _game.moveCatacombs(1); + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(45610); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(45611); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(45612); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ARCHWAY)) { + _vm->_dialogs->show(45613); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_EXPOSED_BRICK)) { + _vm->_dialogs->show(45614); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RED_FRAME) && !_game._objects.isInInventory(OBJ_RED_FRAME)) { + _vm->_dialogs->showItem(OBJ_RED_FRAME, 802, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GREEN_FRAME) && !_game._objects.isInInventory(OBJ_GREEN_FRAME)) { + _vm->_dialogs->showItem(OBJ_GREEN_FRAME, 819, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BLUE_FRAME) && !_game._objects.isInInventory(OBJ_BLUE_FRAME)) { + _vm->_dialogs->showItem(OBJ_BLUE_FRAME, 817, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_YELLOW_FRAME) && !_game._objects.isInInventory(OBJ_YELLOW_FRAME)) { + _vm->_dialogs->showItem(OBJ_YELLOW_FRAME, 804, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MORE_CATACOMBS)) { + _vm->_dialogs->show(45615); + _action._inProgress = false; + } + } +} + +void Scene456::preActions() { + _frameInRoomFl = false; + _takingFrameInRoomFl = false; + + if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_RED_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_YELLOW_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_BLUE_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_GREEN_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR) + && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) { + if (_frameInRoomFl) + _game._player._needToWalk = false; + else { + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[2]]->getFramePos(0); + _game._player.walk(Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + } +} + +/*------------------------------------------------------------------------*/ + +} // End of namespace Phantom +} // End of namespace MADS diff --git a/engines/mads/phantom/phantom_scenes4.h b/engines/mads/phantom/phantom_scenes4.h new file mode 100644 index 0000000000..5aece98cd6 --- /dev/null +++ b/engines/mads/phantom/phantom_scenes4.h @@ -0,0 +1,265 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef MADS_PHANTOM_SCENES4_H +#define MADS_PHANTOM_SCENES4_H + +#include "common/scummsys.h" +#include "common/serializer.h" +#include "mads/game.h" +#include "mads/scene.h" +#include "mads/phantom/phantom_scenes.h" + +namespace MADS { + +namespace Phantom { + +class Scene4xx : public PhantomScene { +protected: + /** + * Plays an appropriate sound when entering a scene + */ + void sceneEntrySound(); + + /** + *Sets the AA file to use for the scene + */ + void setAAName(); + + /** + * Updates the prefix used for getting player sprites for the scene + */ + void setPlayerSpritesPrefix(); +public: + Scene4xx(MADSEngine *vm) : PhantomScene(vm) {} +}; + +class Scene401 : public Scene4xx { +private: + bool _anim0ActvFl; + bool _frameInRoomFl; + bool _takingFrameInRoomFl; + + int _redFrameHotspotId; + int _greenFrameHostpotId; + int _blueFrameHotspotId; + int _yellowFrameHotspotId; + +public: + Scene401(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene403 : public Scene4xx { +private: + bool _frameInRoomFl; + bool _takingFrameInRoomFl; + + int _redFrameHotspotId; + int _greenFrameHostpotId; + int _blueFrameHotspotId; + int _yellowFrameHotspotId; + +public: + Scene403(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene404 : public Scene4xx { +private: + bool _frameInRoomFl; + bool _takingFrameInRoomFl; + bool _anim0ActvFl; + + int _redFrameHotspotId; + int _greenFrameHostpotId; + int _blueFrameHotspotId; + int _yellowFrameHotspotId; + +public: + Scene404(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene406 : public Scene4xx { +private: + bool _frameInRoomFl; + bool _takingFrameInRoomFl; + + int _redFrameHotspotId; + int _greenFrameHostpotId; + int _blueFrameHotspotId; + int _yellowFrameHotspotId; + +public: + Scene406(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene407 : public Scene4xx { +private: + bool _frameInRoomFl; + bool _takingFrameInRoomFl; + + int _redFrameHotspotId; + int _greenFrameHotspotId; + int _blueFrameHotspotId; + int _yellowFrameHotspotId; + +public: + Scene407(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene408 : public Scene4xx { +private: + bool _frameInRoomFl; + bool _takingFrameInRoomFl; + + int _redFrameHotspotId; + int _greenFrameHotspotId; + int _blueFrameHotspotId; + int _yellowFrameHotspotId; + +public: + Scene408(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene409 : public Scene4xx { +private: + bool _frameInRoomFl; + bool _takingFrameInRoomFl; + + int _redFrameHotspotId; + int _greenFrameHotspotId; + int _blueFrameHotspotId; + int _yellowFrameHotspotId; + +public: + Scene409(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene410 : public Scene4xx { +private: + int _skullSequence[26]; + void getLeverInfo(Common::Point *pos, int *type, int lever_number, int *noun); + +public: + Scene410(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene453 : public Scene4xx { +private: + bool _frameInRoomFl; + bool _takingFrameInRoomFl; + + int _redFrameHotspotId; + int _greenFrameHotspotId; + int _blueFrameHotspotId; + int _yellowFrameHotspotId; + +public: + Scene453(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene456 : public Scene4xx { +private: + bool _frameInRoomFl; + bool _takingFrameInRoomFl; + + int _redFrameHotspotId; + int _greenFrameHotspotId; + int _blueFrameHotspotId; + int _yellowFrameHotspotId; + +public: + Scene456(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; +} // End of namespace Phantom +} // End of namespace MADS + +#endif /* MADS_PHANTOM_SCENES4_H */ diff --git a/engines/mads/phantom/phantom_scenes5.cpp b/engines/mads/phantom/phantom_scenes5.cpp new file mode 100644 index 0000000000..2daaed9a90 --- /dev/null +++ b/engines/mads/phantom/phantom_scenes5.cpp @@ -0,0 +1,4308 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/scummsys.h" +#include "mads/mads.h" +#include "mads/conversations.h" +#include "mads/scene.h" +#include "mads/phantom/phantom_scenes.h" +#include "mads/phantom/phantom_scenes5.h" + +namespace MADS { + +namespace Phantom { + +void Scene5xx::setAAName() { + _game._aaName = Resources::formatAAName(1); + _vm->_palette->setEntry(254, 43, 47, 51); +} + +void Scene5xx::sceneEntrySound() { + if (!_vm->_musicFlag) + return; + + if ((_globals[kCoffinStatus] == 2) && !_game._visitedScenes.exists(506) && (_globals[kFightStatus] == 0) && (_scene->_currentSceneId == 504)) + _vm->_sound->command(33); + else if (_scene->_currentSceneId == 505) + _vm->_sound->command((_vm->_gameConv->_restoreRunning == 20) ? 39 : 16); + else + _vm->_sound->command(16); +} + +void Scene5xx::setPlayerSpritesPrefix() { + _vm->_sound->command(5); + + Common::String oldName = _game._player._spritesPrefix; + if (!_game._player._forcePrefix) + _game._player._spritesPrefix = "RAL"; + if (oldName != _game._player._spritesPrefix) + _game._player._spritesChanged = true; + + _game._player._scalingVelocity = true; +} + +/*------------------------------------------------------------------------*/ + +Scene501::Scene501(MADSEngine *vm) : Scene5xx(vm) { + _anim0ActvFl = false; + _skipFl = false; +} + +void Scene501::synchronize(Common::Serializer &s) { + Scene5xx::synchronize(s); + + s.syncAsByte(_anim0ActvFl); + s.syncAsByte(_skipFl); +} + +void Scene501::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + _scene->addActiveVocab(NOUN_CHRISTINE); + _scene->addActiveVocab(VERB_LOOK_AT); + _scene->addActiveVocab(VERB_WALK_TO); +} + +void Scene501::enter() { + _scene->_hotspots.activate(NOUN_CHRISTINE, false); + _scene->_hotspots.activate(NOUN_BOAT, false); + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _anim0ActvFl = false; + _skipFl = false; + } + + _vm->_gameConv->get(26); + + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1)); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2)); + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('a', 1)); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('a', 0)); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_6", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_9", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_8", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RDRR_6"); + + _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 6); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2); + + if (_scene->_priorSceneId == RETURNING_FROM_LOADING) { + if (_globals[kChristineIsInBoat]) { + _anim0ActvFl = true; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 1), 100); + _scene->setAnimFrame(_globals._animationIndexes[0], 124); + _scene->_hotspots.activateAtPos(NOUN_CHRISTINE, true, Common::Point(113, 93)); + _scene->_hotspots.activate(NOUN_BOAT, true); + } + + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 4); + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4); + } + + if (_scene->_priorSceneId == 506) { + _game._player._playerPos = Common::Point(305, 112); + _game._player._facing = FACING_WEST; + _game._player._stepEnabled = false; + + if (_globals[kChristineIsInBoat]) { + _anim0ActvFl = true; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 1), 100); + _scene->setAnimFrame(_globals._animationIndexes[0], 124); + _scene->_hotspots.activateAtPos(NOUN_CHRISTINE, true, Common::Point(113, 93)); + _scene->_hotspots.activate(NOUN_BOAT, true); + _game._player.walk(Common::Point(260, 112), FACING_SOUTHWEST); + _game._player.setWalkTrigger(80); + _game._player.setWalkTrigger(55); + } else { + _anim0ActvFl = true; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 1), 100); + _globals[kChristineIsInBoat] = true; + _scene->_hotspots.activate(NOUN_BOAT, true); + _game._player.walk(Common::Point(260, 112), FACING_SOUTHWEST); + _game._player.setWalkTrigger(80); + } + + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 4); + + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); + } else if ((_scene->_priorSceneId == 401) || (_scene->_priorSceneId == 408) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + _game._player.firstWalk(Common::Point(-20, 109), FACING_EAST, Common::Point(24, 109), FACING_EAST, true); + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 4); + + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4); + } + + sceneEntrySound(); +} + +void Scene501::step() { + switch (_game._trigger) { + case 55: + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 56); + break; + + case 56: + _vm->_sound->command(25); + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10); + if (!_globals[kChrisWillTakeSeat]) + _game._player._stepEnabled = true; + + _globals[kChrisWillTakeSeat] = false; + break; + + default: + break; + } + + + switch (_game._trigger) { + case 60: + _globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 4); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 61); + break; + + case 61: + _vm->_sound->command(25); + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 4); + _game._player._stepEnabled = true; + break; + + case 80: { + _game._player.walk(Common::Point(255, 118), FACING_NORTHWEST); + _scene->setAnimFrame(_globals._animationIndexes[0], 2); + int idx = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->setDynamicAnim(idx, _globals._animationIndexes[0], 0); + _scene->setDynamicAnim(idx, _globals._animationIndexes[0], 1); + _scene->setDynamicAnim(idx, _globals._animationIndexes[0], 2); + _scene->setDynamicAnim(idx, _globals._animationIndexes[0], 3); + } + break; + + case 90: + _globals[kPlayerScore] += 5; + _scene->_nextSceneId = 310; + break; + + case 100: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 9, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 90); + break; + + default: + break; + } + + if (_anim0ActvFl) { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 103) + _scene->_hotspots.activateAtPos(NOUN_CHRISTINE, true, Common::Point(125, 94)); + + if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 28) && !_skipFl) { + _skipFl = true; + _scene->_sequences.addTimer(1, 55); + } + + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 124) { + _scene->_hotspots.activateAtPos(NOUN_CHRISTINE, false, Common::Point(125, 94)); + _scene->_hotspots.activateAtPos(NOUN_CHRISTINE, true , Common::Point(113, 93)); + } + + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 125) + _scene->setAnimFrame(_globals._animationIndexes[0], 124); + + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 1) + _scene->setAnimFrame(_globals._animationIndexes[0], 0); + + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 84) + _game._player._stepEnabled = true; + } +} + +void Scene501::actions() { + if (_vm->_gameConv->_running == 26) { + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_WEST) && (_globals[kChristineIsInBoat])) { + _vm->_gameConv->run(26); + _vm->_gameConv->exportValue(3); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TALK_TO, NOUN_CHRISTINE)) { + _vm->_gameConv->run(26); + _vm->_gameConv->exportValue(1); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLIMB_INTO, NOUN_BOAT)) { + if (_game._objects.isInInventory(OBJ_OAR)) + _anim0ActvFl = false; + else + _vm->_dialogs->show(50123); + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_UNLOCK, NOUN_DOOR) || _action.isAction(VERB_LOCK, NOUN_DOOR)) { + switch (_game._trigger) { + case 0: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 1); + break; + + case 1: { + int idx = _globals._sequenceIndexes[3]; + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 4); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_SEQ, idx); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], false); + _scene->_sequences.addTimer(15, 2); + _vm->_sound->command(74); + } + break; + + case 2: + _scene->deleteSequence(_globals._sequenceIndexes[3]); + _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], false); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 3); + break; + + case 3: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[3]); + _game._player._visible = true; + _vm->_dialogs->show(50122); + _game._player._stepEnabled = true; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR)) { + if (_scene->_customDest.x < 287) { + if (!_globals[kChristineIsInBoat]) { + switch (_game._trigger) { + case 0: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 1); + break; + + case 1: { + int idx = _globals._sequenceIndexes[3]; + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 4); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_SEQ, idx); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], false); + _scene->_sequences.addTimer(15, 2); + _vm->_sound->command(74); + } + break; + + case 2: + _scene->deleteSequence(_globals._sequenceIndexes[3]); + _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], false); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 3); + break; + + case 3: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[3]); + _game._player._visible = true; + _vm->_dialogs->show(50120); + _game._player._stepEnabled = true; + break; + + default: + break; + } + } else { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 4, 65); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 67); + break; + + case 65: + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 66); + _vm->_sound->command(24); + break; + + case 66: + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); + _game._player.walk(Common::Point(305, 112), FACING_EAST); + _game._player.setWalkTrigger(68); + break; + + case 67: + _game._player._visible = true; + break; + + case 68: + _vm->_gameConv->abortConv(); + _scene->_nextSceneId = 506; + break; + } + } + } else { + if (!_globals[kChristineIsInBoat]) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 4, 65); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 67); + break; + + case 65: { + int idx = _globals._sequenceIndexes[1]; + _scene->deleteSequence(_globals._sequenceIndexes[1]); + _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[1], SYNC_SEQ, idx); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 4); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 66); + _vm->_sound->command(24); + } + break; + + case 66: + _game._player.walk(Common::Point(319, 116), FACING_NORTHWEST); + _game._player.setWalkTrigger(68); + break; + + case 67: + _game._player._visible = true; + break; + + case 68: + _globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 69); + _vm->_sound->command(25); + break; + + case 69: + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 5); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1); + _scene->_nextSceneId = 502; + break; + } + } else { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 1); + break; + + case 1: { + int idx = _globals._sequenceIndexes[3]; + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 4); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_SEQ, idx); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], false); + _scene->_sequences.addTimer(15, 2); + _vm->_sound->command(73); + } + break; + + case 2: + _scene->deleteSequence(_globals._sequenceIndexes[3]); + _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], false); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 3); + break; + + case 3: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[3]); + _game._player._visible = true; + _vm->_dialogs->show(50120); + _game._player._stepEnabled = true; + break; + + default: + break; + } + } + } + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(50110); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(50111); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(50112); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CEILING)) { + _vm->_dialogs->show(50113); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LAKE)) { + _vm->_dialogs->show(50114); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BOAT)) { + _vm->_dialogs->show(50126); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TORCH)) { + _vm->_dialogs->show(50117); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ARCHWAY_TO_WEST)) { + _vm->_dialogs->show(50118); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR)) { + if (_scene->_customDest.x < 287) { + if (_game._visitedScenes.exists(506)) + _vm->_dialogs->show(50127); + else + _vm->_dialogs->show(50119); + } else { + if (_game._visitedScenes.exists(506)) + _vm->_dialogs->show(50128); + else + _vm->_dialogs->show(50119); + } + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_COLUMN)) { + _vm->_dialogs->show(50121); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CHRISTINE)) { + _vm->_dialogs->show(50124); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE, NOUN_TORCH)) { + _vm->_dialogs->show(50125); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_CHRISTINE)) { + _vm->_dialogs->show(50129); + _action._inProgress = false; + } +} + +void Scene501::preActions() { + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_WEST)) { + if (_globals[kLanternStatus] == 0) { + _game._player._needToWalk = false; + _vm->_dialogs->show(30918); + _game._player.cancelCommand(); + } else if (!_globals[kChristineIsInBoat]) + _game.enterCatacombs(0); + } + + if ((_action.isObject(NOUN_DOOR)) && (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK) || _action.isAction(VERB_OPEN))) { + if (_scene->_customDest.x < 287) + _game._player.walk(Common::Point(266, 112), FACING_EAST); + else + _game._player.walk(Common::Point(287, 118), FACING_EAST); + } + + if ((_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR)) && _game._visitedScenes.exists(506) && _scene->_customDest.x < 287) { + switch (_game._trigger) { + case 0: + _game._player._readyToWalk = false; + _game._player._needToWalk = false; + _game._player._stepEnabled = false; + _vm->_gameConv->run(26); + _vm->_gameConv->exportValue(2); + _scene->_sequences.addTimer(6, 1); + break; + + case 1: + if (_vm->_gameConv->_running >= 0) + _scene->_sequences.addTimer(6, 1); + else { + _game._player._stepEnabled = true; + _action._inProgress = true; + _game._player._needToWalk = true; + _game._player._readyToWalk = true; + } + break; + + default: + break; + } + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_WEST) && _globals[kLanternStatus] && _globals[kRightDoorIsOpen504]) + _game._player.walk(Common::Point(24, 110), FACING_WEST); +} + +/*------------------------------------------------------------------------*/ + +Scene502::Scene502(MADSEngine *vm) : Scene5xx(vm) { + _fire1ActiveFl = false; + _fire2ActiveFl = false; + _fire3ActiveFl = false; + _fire4ActiveFl = false; + _panelTurningFl = false; + _trapDoorHotspotEnabled = false; + _acceleratedFireActivationFl = false; + + for (int i = 0; i < 16; i++) { + _puzzlePictures[i] = -1; + _puzzleSprites[i] = -1; + _puzzleSequences[i] = -1; + } + + _panelPushedNum = -1; + _messageLevel = -1; + _cycleStage = -1; + + _nextPos = Common::Point(-1, -1); + + _lastFrameTime = 0; + _timer = 0; + _deathTimer = 0; + + _cyclePointer = nullptr; +} + +Scene502::~Scene502() { + if (_cyclePointer) + delete(_cyclePointer); +} + +void Scene502::synchronize(Common::Serializer &s) { + Scene5xx::synchronize(s); + + s.syncAsByte(_fire1ActiveFl); + s.syncAsByte(_fire2ActiveFl); + s.syncAsByte(_fire3ActiveFl); + s.syncAsByte(_fire4ActiveFl); + s.syncAsByte(_panelTurningFl); + s.syncAsByte(_trapDoorHotspotEnabled); + s.syncAsByte(_acceleratedFireActivationFl); + + for (int i = 0; i < 16; i++) { + s.syncAsSint16LE(_puzzlePictures[i]); + s.syncAsSint16LE(_puzzleSprites[i]); + s.syncAsSint16LE(_puzzleSequences[i]); + } + + s.syncAsSint16LE(_panelPushedNum); + s.syncAsSint16LE(_messageLevel); + s.syncAsSint16LE(_cycleStage); + + s.syncAsSint16LE(_nextPos.x); + s.syncAsSint16LE(_nextPos.y); + + s.syncAsUint32LE(_lastFrameTime); + s.syncAsUint32LE(_timer); + s.syncAsUint32LE(_deathTimer); + + warning("more syncing required"); +} + +void Scene502::setup() { + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene502::enter() { + loadCyclingInfo(); + _scene->loadSpeech(7); + + _panelPushedNum = -1; + _panelTurningFl = false; + _fire1ActiveFl = false; + _fire2ActiveFl = false; + _fire3ActiveFl = false; + _fire4ActiveFl = false; + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _lastFrameTime = _scene->_frameStartTime; + _cycleStage = 0; + _timer = 0; + _deathTimer = 0; + _messageLevel = 1; + _acceleratedFireActivationFl = true; + _trapDoorHotspotEnabled = false; + } + + _scene->_hotspots.activate(NOUN_ROPE, false); + _scene->_hotspots.activateAtPos(NOUN_TRAP_DOOR, false, Common::Point(225, 28)); + + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 2)); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 3)); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 4)); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 5)); + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('a', 2)); + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 1)); + _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 1)); + _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 3)); + _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('x', 6)); + _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('a', 0)); + _globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('j', 0)); + _globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('k', 0)); + _globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('l', 0)); + _globals._spriteIndexes[14] = _scene->_sprites.addSprites(formAnimName('m', 0)); + _globals._spriteIndexes[16] = _scene->_sprites.addSprites(formAnimName('h', 0)); + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14); + } else + _scene->drawToBackground(_globals._spriteIndexes[5], -2, Common::Point(-32000, -32000), 0, 100); + + if ((_scene->_priorSceneId == 501) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + if (!_game._visitedScenes._sceneRevisited) { + if (_game._objects.isInInventory(OBJ_ROPE)) + _globals[kCableHookWasSeparate] = true; + else + _globals[kCableHookWasSeparate] = false; + } else if (_globals[kCableHookWasSeparate]) { + _game._objects.addToInventory(OBJ_ROPE); + _game._objects.addToInventory(OBJ_CABLE_HOOK); + _game._objects.setRoom(OBJ_ROPE_WITH_HOOK, NOWHERE); + } else { + _game._objects.setRoom(OBJ_ROPE, NOWHERE); + _game._objects.setRoom(OBJ_CABLE_HOOK, NOWHERE); + _game._objects.addToInventory(OBJ_ROPE_WITH_HOOK); + } + + _game._player._playerPos = Common::Point(43, 154); + _game._player._facing = FACING_EAST; + _game._player._stepEnabled = false; + _game._player.walk(Common::Point(87, 153), FACING_EAST); + _game._player.setWalkTrigger(77); + } + + room_502_initialize_panels(); + + if (_trapDoorHotspotEnabled) { + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 6); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1); + _scene->_hotspots.activate(NOUN_TRAP_DOOR, false); + _scene->_hotspots.activateAtPos(NOUN_TRAP_DOOR, true, Common::Point(225, 28)); + if (!_game._objects.isInInventory(OBJ_ROPE_WITH_HOOK) && !_game._objects.isInInventory(OBJ_CABLE_HOOK)) { + _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 12); + _scene->_hotspots.activate(NOUN_ROPE, true); + } + } else { + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14); + } + + sceneEntrySound(); +} + +void Scene502::step() { + if (_acceleratedFireActivationFl) { + int32 diff = _scene->_frameStartTime - _lastFrameTime; + if ((diff >= 0) && (diff <= 4)) { + _timer += diff; + _deathTimer += diff; + } else { + _timer += 1; + _deathTimer += 1; + } + _lastFrameTime = _scene->_frameStartTime; + + if (_timer >= 300) { + _timer = 0; + if (_cycleStage < 8) + ++_cycleStage; + } + } + + if ((_deathTimer >= 7200) && !_panelTurningFl) { + _vm->_dialogs->show(50215); + _game._player.walk(Common::Point(160, 148), FACING_NORTH); + _game._player.setWalkTrigger(71); + _game._player._stepEnabled = false; + _panelTurningFl = true; + _deathTimer = 0; + } + + if ((_deathTimer > 900) && (_messageLevel == 1) && !_panelTurningFl) { + _messageLevel = 2; + _vm->_dialogs->show(50212); + } + + if ((_deathTimer > 3600) && (_messageLevel == 2) && !_panelTurningFl) { + _messageLevel = 3; + _vm->_dialogs->show(50213); + } + + if ((_deathTimer > 5400) && (_messageLevel == 3) && !_panelTurningFl) { + _messageLevel = 4; + _vm->_dialogs->show(50214); + } + + switch (_game._trigger) { + case 71: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 72); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 44, 73); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 51, 74); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 32, 75); + break; + + case 72: + _globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1); + _scene->_userInterface.noInventoryAnim(); + // CHECKME: Not sure about the next function call + _scene->_userInterface.refresh(); + _scene->_sequences.addTimer(120, 76); + break; + + case 73: + _vm->_sound->command(1); + _vm->_sound->command(67); + break; + + case 74: + _vm->_sound->command(27); + break; + + case 75: + _scene->playSpeech(7); + break; + + case 76: + _scene->_reloadSceneFlag = true; + break; + + case 77: + _scene->deleteSequence(_globals._sequenceIndexes[5]); + _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 7, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 78); + break; + + case 78: + _vm->_dialogs->show(50211); + _scene->drawToBackground(_globals._spriteIndexes[5], -2, Common::Point(-32000, -32000), 0, 100); + _game._player._stepEnabled = true; + break; + + default: + break; + } + + if (!_trapDoorHotspotEnabled) + animateFireBursts(); + + setPaletteCycle(); +} + +void Scene502::actions() { + if (_game._trigger >= 110) { + handlePanelAnimation(); + _action._inProgress = false; + return; + } + + switch (_game._trigger) { + case 80: + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 6); + _scene->_hotspots.activateAtPos(NOUN_ROPE, true, Common::Point(225, 28)); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1); + _scene->_hotspots.activate(NOUN_TRAP_DOOR, false); + _scene->_hotspots.activateAtPos(NOUN_TRAP_DOOR, true, Common::Point(225, 28)); + if (!_panelTurningFl) + _vm->_dialogs->show(50216); + + _action._inProgress = false; + return; + + case 90: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[10] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[10], false, 7, 2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[10], true); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 14, 18); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 91); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_SPRITE, 18, 110); + _action._inProgress = false; + return; + + case 91: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[10]); + _game._player._visible = true; + _game._player._stepEnabled = true; + _scene->_sequences.addTimer(5, 102); + _action._inProgress = false; + return; + + case 95: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[10] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[10], false, 7, 2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[10], true); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 8, 13); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 96); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_SPRITE, 13, 110); + _action._inProgress = false; + return; + + case 96: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[10]); + _game._player._visible = true; + _game._player._stepEnabled = true; + _scene->_sequences.addTimer(5, 102); + _action._inProgress = false; + return; + + case 100: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[10] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[10], false, 9, 2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[10], true); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 5, 7); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 101); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_SPRITE, 7, 110); + _action._inProgress = false; + return; + + case 101: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[10]); + _game._player._visible = true; + _scene->_sequences.addTimer(5, 102); + _action._inProgress = false; + return; + + case 102: + _panelTurningFl = false; + _game._player._stepEnabled = true; + _action._inProgress = false; + return; + + case 105: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[10] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[10], false, 8, 2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[10], true); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 1, 4); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 106); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_SPRITE, 4, 110); + _action._inProgress = false; + return; + + case 106: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[10]); + _game._player._visible = true; + _scene->_sequences.addTimer(5, 102); + _action._inProgress = false; + return; + + default: + break; + } + + if (_action.isAction(VERB_PUSH, NOUN_PANEL)) { + if (_panelTurningFl) { + _action._inProgress = false; + return; + } + + Common::Point walkToPos; + getPanelInfo(&walkToPos, &_panelPushedNum, _scene->_customDest, &_nextPos); + _panelTurningFl = true; + + switch (_panelPushedNum) { + case 0: + case 1: + case 2: + case 3: + _scene->_sequences.addTimer(1, 90); + break; + + case 4: + case 5: + case 6: + case 7: + _scene->_sequences.addTimer(1, 95); + break; + + case 8: + case 9: + case 10: + case 11: + _scene->_sequences.addTimer(1, 100); + break; + + default: + _scene->_sequences.addTimer(1, 105); + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_THROW, NOUN_ROPE_WITH_HOOK, NOUN_TRAP_DOOR) || _action.isAction(VERB_GRAPPLE, NOUN_TRAP_DOOR)) { + if (_trapDoorHotspotEnabled) { + switch (_game._trigger) { + case 0: + _game._player._stepEnabled = false; + _game._player._visible = false; + _panelTurningFl = true; + _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 13); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 82); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_SPRITE, 10, 83); + _game._objects.setRoom(OBJ_ROPE_WITH_HOOK, NOWHERE); + break; + + case 82: + _game._player._stepEnabled = true; + _game._player._visible = true; + _panelTurningFl = false; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[7]); + _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 13); + _scene->_hotspots.activate(NOUN_ROPE, true); + break; + + case 83: + _vm->_sound->command(69); + break; + + default: + break; + } + } else + _vm->_dialogs->show(50229); + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLIMB_THROUGH, NOUN_TRAP_DOOR) + && (_game._objects.isInInventory(OBJ_ROPE_WITH_HOOK) || _game._objects.isInInventory(OBJ_CABLE_HOOK))) { + _vm->_dialogs->show(50228); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_THROW, NOUN_ROPE, NOUN_TRAP_DOOR)) { + _vm->_dialogs->show(50226); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_THROW, NOUN_CABLE_HOOK, NOUN_TRAP_DOOR)) { + _vm->_dialogs->show(50227); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLIMB, NOUN_ROPE) || _action.isAction(VERB_CLIMB_THROUGH, NOUN_TRAP_DOOR)) { + switch (_game._trigger) { + case 0: + _globals[kPlayerScore] += 5; + _game._player._stepEnabled = false; + _game._player._visible = false; + _panelTurningFl = true; + _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 10); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 82); + break; + + case 82: + _scene->_nextSceneId = 504; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(50210); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(50217); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TRAP_DOOR)) { + _vm->_dialogs->show(_trapDoorHotspotEnabled ? 50220 : 50225); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(50219); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR)) { + _vm->_dialogs->show(50221); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PANELS)) { + _vm->_dialogs->show(50222); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PANEL)) { + _vm->_dialogs->show(50223); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CEILING)) { + _vm->_dialogs->show(50224); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ROPE) && !_game._objects.isInInventory(OBJ_ROPE) + && !_game._objects.isInInventory(OBJ_CABLE_HOOK) && !_game._objects.isInInventory(OBJ_ROPE_WITH_HOOK)) { + _vm->_dialogs->show(50233); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_OPEN, NOUN_TRAP_DOOR)) { + _vm->_dialogs->show(_trapDoorHotspotEnabled ? 50230 : 50228); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLOSE, NOUN_TRAP_DOOR)) { + _vm->_dialogs->show(_trapDoorHotspotEnabled ? 50228 : 50231); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_ROPE) && !_game._objects.isInInventory(OBJ_ROPE) + && !_game._objects.isInInventory(OBJ_CABLE_HOOK) && !_game._objects.isInInventory(OBJ_ROPE_WITH_HOOK)) { + _vm->_dialogs->show(50234); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LASSO, NOUN_TRAP_DOOR)) { + _vm->_dialogs->show(50232); + _action._inProgress = false; + return; + } +} + +void Scene502::preActions() { + int panel; + + if (_action.isAction(VERB_PUSH, NOUN_PANEL)) { + Common::Point walkToPos; + Common::Point tmpPos; + getPanelInfo(&walkToPos, &panel, _scene->_customDest, &tmpPos); + _game._player.walk(walkToPos, FACING_NORTH); + } + + if (_trapDoorHotspotEnabled && (_action.isAction(VERB_CLIMB, NOUN_ROPE) || _action.isAction(VERB_CLIMB_THROUGH, NOUN_TRAP_DOOR))) + _game._player.walk(Common::Point(211, 149), FACING_NORTH); + + if (_trapDoorHotspotEnabled && (_action.isAction(VERB_THROW, NOUN_ROPE_WITH_HOOK, NOUN_TRAP_DOOR) || _action.isAction(VERB_GRAPPLE, NOUN_TRAP_DOOR))) + _game._player.walk(Common::Point(200, 149), FACING_NORTH); +} + +void Scene502::room_502_initialize_panels() { + for (int i = 0, curPuzzleSprite = 2, count = 1; i < 16; i++) { + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) + _puzzlePictures[i] = _vm->getRandomNumber(1, 4); + + curPuzzleSprite += (_puzzlePictures[i] * 3) - 3; + _puzzleSprites[i] = curPuzzleSprite; + + int sprIdx; + + switch (i) { + case 0: + case 1: + case 2: + case 3: + sprIdx = _globals._spriteIndexes[11]; + break; + + case 4: + case 5: + case 6: + case 7: + sprIdx = _globals._spriteIndexes[12]; + break; + + case 8: + case 9: + case 10: + case 11: + sprIdx = _globals._spriteIndexes[13]; + break; + + default: + sprIdx = _globals._spriteIndexes[14]; + break; + } + + _globals._sequenceIndexes[15] = _scene->_sequences.addStampCycle(sprIdx, false, curPuzzleSprite); + _scene->_sequences.setDepth(_globals._sequenceIndexes[15], 14); + _puzzleSequences[i] = _globals._sequenceIndexes[15]; + + ++count; + if (count >= 5) + count = 1; + + switch (count) { + case 1: + curPuzzleSprite = 2; + break; + + case 2: + curPuzzleSprite = 14; + break; + + case 3: + curPuzzleSprite = 26; + break; + + case 4: + curPuzzleSprite = 38; + break; + } + } +} + +void Scene502::loadCyclingInfo() { + warning("TODO: loadCyclingInfo"); +} + +void Scene502::animateFireBursts() { + int rndTrigger; + + if (_acceleratedFireActivationFl) + rndTrigger = _vm->getRandomNumber(1, 50); + else + rndTrigger = _vm->getRandomNumber(1, 400); + + if (rndTrigger == 1) { + rndTrigger = _vm->getRandomNumber(1, 4); + + switch (rndTrigger) { + case 1: + if (!_fire1ActiveFl) { + _scene->_sequences.addTimer(_vm->getRandomNumber(300, 600), 60); + _fire1ActiveFl = true; + } + break; + + case 2: + if (!_fire2ActiveFl) { + _scene->_sequences.addTimer(_vm->getRandomNumber(300, 600), 63); + _fire2ActiveFl = true; + } + break; + + case 3: + if (!_fire3ActiveFl) { + _scene->_sequences.addTimer(_vm->getRandomNumber(300, 600), 66); + _fire3ActiveFl = true; + } + break; + + case 4: + if (!_fire4ActiveFl) { + _scene->_sequences.addTimer(_vm->getRandomNumber(300, 600), 69); + _fire4ActiveFl = true; + } + break; + } + } + + switch (_game._trigger) { + case 60: + if ((_game._player._playerPos.x < 198) || (_game._player._playerPos.y > 150)) { + _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 5, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 10); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 61); + } + break; + + case 61: + _fire1ActiveFl = false; + break; + + case 63: + if ((_game._player._playerPos.x > 127) || (_game._player._playerPos.y < 150)) { + _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 10); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 64); + } + break; + + case 64: + _fire2ActiveFl = false; + break; + + case 66: + if (_game._player._playerPos.x < 198) { + _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 5, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 10); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 67); + } + break; + + case 67: + _fire3ActiveFl = false; + break; + + case 69: + if ((_game._player._playerPos.x > 110) || (_game._player._playerPos.y > 150)) { + _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 5, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 10); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 70); + } + break; + + case 70: + _fire4ActiveFl = false; + break; + + default: + break; + } +} + +void Scene502::setPaletteCycle() { + warning("TODO: setPaletteCycle"); +} + +void Scene502::getPanelInfo(Common::Point *walkToPos, int *panel, Common::Point mousePos, Common::Point *interimPos) { + walkToPos->y = 148; + + if ((mousePos.x < 120) || (mousePos.y < 75) || (mousePos.y > 137)) + return; + + if (mousePos.x <= 139) { + interimPos->x = 129; + if (mousePos.y <= 90) { + *panel = 0; + interimPos->y = 90; + walkToPos->x = 107; + } else if (mousePos.y <= 106) { + *panel = 4; + interimPos->y = 106; + walkToPos->x = 107; + } else if (mousePos.y <= 122) { + *panel = 8; + interimPos->y = 122; + walkToPos->x = 107; + } else { + *panel = 12; + interimPos->y = 138; + walkToPos->x = 107; + } + } else if (mousePos.x <= 159) { + interimPos->x = 149; + if (mousePos.y <= 90) { + *panel = 1; + interimPos->y = 90; + walkToPos->x = 127; + } else if (mousePos.y <= 106) { + *panel = 5; + interimPos->y = 106; + walkToPos->x = 127; + } else if (mousePos.y <= 122) { + *panel = 9; + interimPos->y = 122; + walkToPos->x = 127; + } else { + *panel = 13; + interimPos->y = 138; + walkToPos->x = 127; + } + } else if (mousePos.x <= 179) { + interimPos->x = 169; + if (mousePos.y <= 90) { + *panel = 2; + interimPos->y = 90; + walkToPos->x = 147; + } else if (mousePos.y <= 106) { + *panel = 6; + interimPos->y = 106; + walkToPos->x = 147; + } else if (mousePos.y <= 122) { + *panel = 10; + interimPos->y = 122; + walkToPos->x = 147; + } else { + *panel = 14; + interimPos->y = 138; + walkToPos->x = 147; + } + } else if (mousePos.x <= 199) { + interimPos->x = 189; + if (mousePos.y <= 90) { + *panel = 3; + interimPos->y = 90; + walkToPos->x = 167; + } else if (mousePos.y <= 106) { + *panel = 7; + interimPos->y = 106; + walkToPos->x = 167; + } else if (mousePos.y <= 122) { + *panel = 11; + interimPos->y = 122; + walkToPos->x = 167; + } else { + *panel = 15; + interimPos->y = 138; + walkToPos->x = 167; + } + } +} + +void Scene502::handlePanelAnimation() { + switch (_game._trigger) { + case 110: + _vm->_sound->command(65); + _scene->deleteSequence(_puzzleSequences[_panelPushedNum]); + switch (_panelPushedNum) { + case 0: + case 1: + case 2: + case 3: + _globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, _puzzleSprites[_panelPushedNum] - 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14); + _scene->_sequences.addTimer(5, 111); + break; + + case 4: + case 5: + case 6: + case 7: + _globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, _puzzleSprites[_panelPushedNum] - 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14); + _scene->_sequences.addTimer(5, 111); + break; + + case 8: + case 9: + case 10: + case 11: + _globals._sequenceIndexes[13] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[13], false, _puzzleSprites[_panelPushedNum] - 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 14); + _scene->_sequences.addTimer(5, 111); + break; + + default: + _globals._sequenceIndexes[14] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[14], false, _puzzleSprites[_panelPushedNum] - 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[14], 14); + _scene->_sequences.addTimer(5, 111); + break; + } + break; + + case 111: + switch (_panelPushedNum) { + case 0: + case 1: + case 2: + case 3: + _scene->deleteSequence(_globals._sequenceIndexes[11]); + break; + + case 4: + case 5: + case 6: + case 7: + _scene->deleteSequence(_globals._sequenceIndexes[12]); + break; + + case 8: + case 9: + case 10: + case 11: + _scene->deleteSequence(_globals._sequenceIndexes[13]); + break; + + default: + _scene->deleteSequence(_globals._sequenceIndexes[14]); + break; + } + + _globals._sequenceIndexes[16] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[16], false, 5, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[16], 14); + _scene->_sequences.setPosition(_globals._sequenceIndexes[16], _nextPos); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[16], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[16], SEQUENCE_TRIGGER_EXPIRE, 0, 112); + break; + + case 112: { + int idx = _globals._sequenceIndexes[16]; + int newSprId = _puzzleSprites[_panelPushedNum] + 4; + + switch (_panelPushedNum) { + case 0: + case 4: + case 8: + case 12: + if (newSprId > 12) + newSprId = 3; + break; + + case 1: + case 5: + case 9: + case 13: + if (newSprId > 24) + newSprId = 15; + break; + + case 2: + case 6: + case 10: + case 14: + if (newSprId > 36) + newSprId = 27; + break; + + default: + if (newSprId > 48) + newSprId = 39; + break; + } + + switch (_panelPushedNum) { + case 0: + case 1: + case 2: + case 3: + _globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, newSprId); + _scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[11], SYNC_SEQ, idx); + _scene->_sequences.addTimer(5, 113); + break; + + case 4: + case 5: + case 6: + case 7: + _globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, newSprId); + _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[12], SYNC_SEQ, idx); + _scene->_sequences.addTimer(5, 113); + break; + + case 8: + case 9: + case 10: + case 11: + _globals._sequenceIndexes[13] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[13], false, newSprId); + _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 14); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[13], SYNC_SEQ, idx); + _scene->_sequences.addTimer(5, 113); + break; + + default: + _globals._sequenceIndexes[14] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[14], false, newSprId); + _scene->_sequences.setDepth(_globals._sequenceIndexes[14], 14); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[14], SYNC_SEQ, idx); + _scene->_sequences.addTimer(5, 113); + break; + } + } + break; + + case 113: { + switch (_panelPushedNum) { + case 0: + case 1: + case 2: + case 3: + _scene->deleteSequence(_globals._sequenceIndexes[11]); + break; + + case 4: + case 5: + case 6: + case 7: + _scene->deleteSequence(_globals._sequenceIndexes[12]); + break; + + case 8: + case 9: + case 10: + case 11: + _scene->deleteSequence(_globals._sequenceIndexes[13]); + break; + + default: + _scene->deleteSequence(_globals._sequenceIndexes[14]); + break; + } + + int newSprId = _puzzleSprites[_panelPushedNum] + 3; + + switch (_panelPushedNum) { + case 0: + case 4: + case 8: + case 12: + if (newSprId > 12) + newSprId = 2; + break; + + case 1: + case 5: + case 9: + case 13: + if (newSprId > 24) + newSprId = 14; + break; + + case 2: + case 6: + case 10: + case 14: + if (newSprId > 36) + newSprId = 26; + break; + + default: + if (newSprId > 48) + newSprId = 38; + break; + } + _puzzleSprites[_panelPushedNum] = newSprId; + ++_puzzlePictures[_panelPushedNum]; + if (_puzzlePictures[_panelPushedNum] >= 5) + _puzzlePictures[_panelPushedNum] = 1; + + switch (_panelPushedNum) { + case 0: + case 1: + case 2: + case 3: + _globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, newSprId); + _scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14); + _puzzleSequences[_panelPushedNum] = _globals._sequenceIndexes[11]; + break; + + case 4: + case 5: + case 6: + case 7: + _globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, newSprId); + _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14); + _puzzleSequences[_panelPushedNum] = _globals._sequenceIndexes[12]; + break; + + case 8: + case 9: + case 10: + case 11: + _globals._sequenceIndexes[13] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[13], false, newSprId); + _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 14); + _puzzleSequences[_panelPushedNum] = _globals._sequenceIndexes[13]; + break; + + default: + _globals._sequenceIndexes[14] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[14], false, newSprId); + _scene->_sequences.setDepth(_globals._sequenceIndexes[14], 14); + _puzzleSequences[_panelPushedNum] = _globals._sequenceIndexes[14]; + break; + } + + int puzzleSolvedFl = true; + for (int i = 0; i < 16; i++) { + if (_puzzlePictures[i] != 1) + puzzleSolvedFl = false; + } + + if (puzzleSolvedFl && !_trapDoorHotspotEnabled) { + _trapDoorHotspotEnabled = true; + _scene->deleteSequence(_globals._sequenceIndexes[6]); + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('t', 1), 80); + } + } + break; + + default: + break; + } +} + +/*------------------------------------------------------------------------*/ + +Scene504::Scene504(MADSEngine *vm) : Scene5xx(vm) { + _anim0ActvFl = false; + _anim1ActvFl = false; + _anim2ActvFl = false; + _anim3ActvFl = false; + _anim4ActvFl = false; + _anim5ActvFl = false; + _playingMusicFl = false; + _chairDialogDoneFl = false; + _fireBreathFl = false; + + _songNum = -1; + _input3Count = -1; + _playCount = -1; + _listenStatus = -1; + _listenFrame = -1; + _chairStatus = -1; + _chairFrame = -1; + _playStatus = -1; + _playFrame = -1; + _phantomStatus = -1; + _phantomFrame = -1; + _christineTalkCount = -1; + _deathCounter = -1; +} + +void Scene504::synchronize(Common::Serializer &s) { + Scene5xx::synchronize(s); + + s.syncAsByte(_anim0ActvFl); + s.syncAsByte(_anim1ActvFl); + s.syncAsByte(_anim2ActvFl); + s.syncAsByte(_anim3ActvFl); + s.syncAsByte(_anim4ActvFl); + s.syncAsByte(_anim5ActvFl); + s.syncAsByte(_playingMusicFl); + s.syncAsByte(_chairDialogDoneFl); + s.syncAsByte(_fireBreathFl); + + s.syncAsSint16LE(_songNum); + s.syncAsSint16LE(_input3Count); + s.syncAsSint16LE(_playCount); + s.syncAsSint16LE(_listenStatus); + s.syncAsSint16LE(_listenFrame); + s.syncAsSint16LE(_chairStatus); + s.syncAsSint16LE(_chairFrame); + s.syncAsSint16LE(_playStatus); + s.syncAsSint16LE(_playFrame); + s.syncAsSint16LE(_phantomStatus); + s.syncAsSint16LE(_phantomFrame); + s.syncAsSint16LE(_christineTalkCount); + s.syncAsSint16LE(_deathCounter); +} + +void Scene504::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + _scene->addActiveVocab(NOUN_PHANTOM); + _scene->addActiveVocab(NOUN_CHRISTINE); +} + +void Scene504::enter() { + _vm->_disableFastwalk = true; + + _input3Count = 0; + _deathCounter = 0; + _anim2ActvFl = false; + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _playCount = 0; + _anim0ActvFl = false; + _anim1ActvFl = false; + _anim3ActvFl = false; + _anim4ActvFl = false; + _anim5ActvFl = false; + _playingMusicFl = false; + _fireBreathFl = false; + _chairDialogDoneFl = false; + _songNum = 0; + _phantomStatus = 0; + } + + _scene->_hotspots.activate(NOUN_CHRISTINE, false); + + if (!_globals[kRightDoorIsOpen504]) { + _vm->_gameConv->get(19); + _vm->_gameConv->get(27); + } else + _vm->_gameConv->get(21); + + _vm->_gameConv->get(26); + + _globals._spriteIndexes[14] = _scene->_sprites.addSprites("*RDR_9"); + _globals._spriteIndexes[15] = _scene->_sprites.addSprites(formAnimName('x', 8)); + + if (!_game._objects.isInRoom(OBJ_MUSIC_SCORE)) { + _globals._sequenceIndexes[15] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[15], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[15], 14); + _scene->_hotspots.activate(NOUN_MUSIC_SCORE, false); + } + + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 2)); + _globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('x', 7), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + + if (_globals[kFightStatus] == 0) + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1)); + + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3)); + + if ((_scene->_priorSceneId == 505) || ((_scene->_priorSceneId == 504) && _globals[kRightDoorIsOpen504])) { + if ((_globals[kFightStatus] == 0) && (_globals[kCoffinStatus] == 2)) { + _scene->_hotspots.activate(NOUN_CHRISTINE, true); + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + + _globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('x', 7), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('b', 0)); + + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_6", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACERAL", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEXDFR", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEPHN", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + + _globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('a', 5)); + _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('a', 3), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 6), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 7), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('a', 0), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + + _globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('p', 1), 0); + int hotspotIdx = _scene->_dynamicHotspots.add(NOUN_PHANTOM, VERB_LOOK_AT, SYNTAX_MASC_NOT_PROPER, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots[hotspotIdx]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(hotspotIdx, Common::Point(-2, -2), FACING_NONE); + + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 4); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 8); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 13); + + _phantomStatus = 0; + _game._player._stepEnabled = false; + _game._player._visible = false; + _anim3ActvFl = true; + } else { + if (_globals[kFightStatus]) + _scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100); + + if (_globals[kCoffinStatus] != 2) { + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + } + + _game._player._playerPos = Common::Point(317, 115); + _game._player._facing = FACING_SOUTHWEST; + _game._player.walk(Common::Point(279, 121), FACING_SOUTHWEST); + + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + + if (!_game._visitedScenes.exists(506) && (_globals[kCoffinStatus] == 2)) { + _scene->changeVariant(1); + + _scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100); + _anim5ActvFl = true; + + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_2"); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACERAL", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEXDFR",PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEPHN", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + + _globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('p', 3), 0); + int hotspotIdx = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _phantomStatus = 5; + _scene->_dynamicHotspots[hotspotIdx]._articleNumber = PREP_ON; + _scene->setAnimFrame(_globals._animationIndexes[3], 79); + _scene->_dynamicHotspots.setPosition(hotspotIdx, Common::Point(66, 119), FACING_NORTHWEST); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 0); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 1); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 2); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 3); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 4); + } + } + } else if (_scene->_priorSceneId == 506) { + _game._player._playerPos = Common::Point(0, 109); + _game._player._facing = FACING_SOUTHEAST; + _game._player.walk(Common::Point(39, 118), FACING_SOUTHEAST); + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + _scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100); + } else if (_scene->_priorSceneId == 504) { + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + + _game._player._playerPos = Common::Point(147, 131); + _game._player._facing = FACING_EAST; + } else if ((_scene->_priorSceneId == 502) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('t', 1), 60); + _game._player._stepEnabled = false; + _game._player._visible = false; + _game._player._playerPos = Common::Point(147, 131); + _game._player._facing = FACING_EAST; + } + + if (_scene->_priorSceneId == RETURNING_FROM_LOADING) { + if (!_globals[kRightDoorIsOpen504]) { + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + } + + if (_vm->_gameConv->_restoreRunning == 19) { + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('l', 1), 67); + _anim0ActvFl = true; + _game._player._visible = false; + _game._player._stepEnabled = false; + _game._player._playerPos = Common::Point(286, 120); + _game._player._facing = FACING_EAST; + _listenStatus = 0; + _scene->setAnimFrame(_globals._animationIndexes[0], 8); + _vm->_gameConv->run(19); + _vm->_gameConv->exportValue(_game._difficulty); + } else if (_vm->_gameConv->_restoreRunning == 27) { + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 4), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 5), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('o', 1), 100); + + _scene->setAnimFrame(_globals._animationIndexes[1], 22); + _game._player._stepEnabled = false; + _game._player._visible = false; + _playingMusicFl = false; + _anim1ActvFl = true; + _playStatus = 0; + _vm->_gameConv->run(27); + } else if ((_globals[kFightStatus] <= 1) && (_globals[kCoffinStatus] == 2)) { + if ((_phantomStatus == 1) || (_phantomStatus == 2)) { + _scene->_hotspots.activate(NOUN_CHRISTINE, true); + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('b', 0)); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_6", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACERAL", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEXDFR", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEPHN", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + + _globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('a', 5)); + _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('a', 3), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 6), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 7), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('a', 0), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + + _globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('p', 1), 0); + int hotspotIdx = _scene->_dynamicHotspots.add(NOUN_PHANTOM, VERB_LOOK_AT, SYNTAX_MASC_NOT_PROPER, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots[hotspotIdx]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(hotspotIdx, Common::Point(-2, -2), FACING_NONE); + + if (_phantomStatus == 1) + _scene->setAnimFrame(_globals._animationIndexes[3], _vm->getRandomNumber(109, 112)); + else if (_phantomStatus == 2) { + _scene->setAnimFrame(_globals._animationIndexes[3], _vm->getRandomNumber(148, 150)); + _scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100); + } + + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 4); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 8); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 13); + + _game._player._visible = false; + _anim3ActvFl = true; + + if (_vm->_gameConv->_restoreRunning == 21) { + _game._player._stepEnabled = false; + _vm->_gameConv->run(21); + _vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_MUSIC_SCORE)); + } + } else if (_phantomStatus == 4) { + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + _scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100); + + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_3"); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACERAL", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEXDFR", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEPHN", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('a', 8), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + + _globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('p', 2), 130); + _scene->setAnimFrame(_globals._animationIndexes[3], 159); + + _game._player._playerPos = Common::Point(130, 135); + _game._player._facing = FACING_NORTHEAST; + _game._player._visible = true; + _anim4ActvFl = true; + + _game._player._stepEnabled = false; + _vm->_gameConv->run(21); + _vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_MUSIC_SCORE)); + } + } else if (_globals[kFightStatus] == 2) { + if (!_game._visitedScenes.exists(506)) { + _scene->changeVariant(1); + + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + _scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100); + _anim5ActvFl = true; + + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_3"); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACERAL", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEXDFR",PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEPHN", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + + _globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('p', 3), 0); + int hotspotIdx = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _phantomStatus = 5; + _scene->_dynamicHotspots[hotspotIdx]._articleNumber = PREP_ON; + _scene->setAnimFrame(_globals._animationIndexes[3], 79); + _scene->_dynamicHotspots.setPosition(hotspotIdx, Common::Point(66, 119), FACING_NORTHWEST); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 0); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 1); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 2); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 3); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 4); + } else { + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + _scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100); + } + } else { + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + if (!_globals[kHeListened]) + _scene->_sequences.addTimer(30, 62); + } + } + + sceneEntrySound(); +} + +void Scene504::step() { + if (_anim0ActvFl) + handleListenAnimation(); + + if (_anim1ActvFl) + handleOrganAnimation(); + + if (_anim2ActvFl) + handleChairAnimation(); + + if (_anim3ActvFl) + handlePhantomAnimation1(); + + if (_anim4ActvFl) + handlePhantomAnimation2(); + + if (_anim5ActvFl) + handlePhantomAnimation3(); + + if (_game._trigger == 120) { + _game._player._stepEnabled = false; + _vm->_gameConv->run(21); + _vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_MUSIC_SCORE)); + _vm->_gameConv->exportValue(1); + _globals[kFightStatus] = 1; + } + + if (_game._trigger == 60) { + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_sequences.addTimer(30, 61); + } + + if (_game._trigger == 61) { + _game._player._stepEnabled = true; + _scene->_sequences.addTimer(60, 62); + } + + if (_game._trigger == 62) { + _globals[kHeListened] = true; + _game._player._stepEnabled = false; + _vm->_gameConv->run(19); + _vm->_gameConv->exportValue(_game._difficulty); + } + + if (_game._trigger == 80) { + _vm->_sound->command(73); + _globals[kRightDoorIsOpen504] = true; + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2); + + _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 90); + } + + if (_game._trigger == 90) { + _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 91); + } + + if (_game._trigger == 91) { + _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 92); + } + + if (_game._trigger == 92) + _fireBreathFl = true; + + if (_fireBreathFl) { + _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2); + _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -1, -2); + _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2); + _fireBreathFl = false; + } + + if (_game._trigger == 130) { + _scene->freeAnimation(_globals._animationIndexes[3]); + _scene->_sprites.remove(_globals._spriteIndexes[12]); + + _anim4ActvFl = false; + _anim5ActvFl = true; + + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_2", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_3", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + + _scene->changeVariant(1); + + _globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('p', 3), 0); + int hotspotIdx = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots[hotspotIdx]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(hotspotIdx, Common::Point(66, 119), FACING_NORTHWEST); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 0); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 1); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 2); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 3); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 4); + } + + if (_game._trigger == 67) { + _game._player._stepEnabled = true; + _game._player._visible = true; + _anim0ActvFl = false; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); + } + + if (_game._trigger == 136) + _scene->_nextSceneId = 506; + + if (_game._trigger == 100) { + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[1]); + _game._player._playerPos = Common::Point(156, 114); + _game._player._visible = true; + _anim1ActvFl = false; + _game._player.resetFacing(FACING_EAST); + _scene->_sequences.addTimer(10, 101); + } + + if (_game._trigger == 101) { + _game._player._stepEnabled = true; + _scene->_sprites.remove(_globals._spriteIndexes[5]); + _scene->_sprites.remove(_globals._spriteIndexes[4]); + } +} + +void Scene504::actions() { + if (_vm->_gameConv->_running == 26) { + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_SIT_IN, NOUN_LARGE_CHAIR)) { + if (!_anim2ActvFl) { + _chairStatus = 0; + _game._player._stepEnabled = false; + _game._player._visible = false; + _anim2ActvFl = true; + _globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('c', 1), 0); + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0); + } else + _vm->_dialogs->show(50436); + _action._inProgress = false; + return; + } + + if (_game._trigger == 95) { + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('l', 1), 67); + _listenStatus = 0; + _game._player._stepEnabled = false; + _game._player._visible = false; + _anim0ActvFl = true; + _globals[kHeListened] = true; + _vm->_gameConv->run(19); + _vm->_gameConv->exportValue(_game._difficulty); + _action._inProgress = false; + return; + } + + if (_game._trigger == 67) { + _game._player._stepEnabled = true; + _game._player._visible = true; + _anim0ActvFl = false; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); + _action._inProgress = false; + return; + } + + if (_vm->_gameConv->_running == 19) { + handleListenConversation(); + _action._inProgress = false; + return; + } + + if (_vm->_gameConv->_running == 27) { + handlePlayConversation(); + _action._inProgress = false; + return; + } + + if (_vm->_gameConv->_running == 21) { + handleFightConversation(); + _action._inProgress = false; + return; + } + + if (_game._trigger == 100) { + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[1]); + _game._player._playerPos = Common::Point(156, 114); + _game._player._visible = true; + _anim1ActvFl = false; + _game._player.resetFacing(FACING_EAST); + _scene->_sequences.addTimer(10, 101); + _action._inProgress = false; + return; + } + + if (_game._trigger == 101) { + _game._player._stepEnabled = true; + _scene->_sprites.remove(_globals._spriteIndexes[5]); + _scene->_sprites.remove(_globals._spriteIndexes[4]); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_SIT_ON, NOUN_ORGAN_BENCH)) { + if (_globals[kRightDoorIsOpen504]) + _vm->_dialogs->show(50427); + else { + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 4), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 5), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('o', 1), 100); + _game._player._stepEnabled = false; + _game._player._visible = false; + _playingMusicFl = false; + _anim1ActvFl = true; + _playStatus = 0; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_DOOR) || _action.isAction(VERB_OPEN, NOUN_RIGHT_DOOR)) { + if (_globals[kRightDoorIsOpen504]) { + if (_vm->_gameConv->_running == 26) + _vm->_gameConv->abortConv(); + + _scene->_nextSceneId = 505; + } else + _vm->_dialogs->show(50418); + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_LEFT_DOOR) || _action.isAction(VERB_OPEN, NOUN_LEFT_DOOR)) { + if (_globals[kFightStatus]) { + if (_game._visitedScenes.exists(506)) + _scene->_nextSceneId = 506; + else if (!_game._objects.isInInventory(OBJ_MUSIC_SCORE)) + _vm->_dialogs->show(50425); + else { + _phantomStatus = 6; + _game._player._stepEnabled = false; + } + } else + _vm->_dialogs->show(50418); + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_MUSIC_SCORE)) { + switch (_game._trigger) { + case (0): + if (_game._objects.isInRoom(OBJ_MUSIC_SCORE)) { + _globals[kPlayerScore] += 5; + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[14] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[14], false, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[14], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[14], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[14], SEQUENCE_TRIGGER_SPRITE, 4, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[14], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + _action._inProgress = false; + return; + } + break; + + case 1: + _globals._sequenceIndexes[15] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[15], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[15], 14); + _scene->_hotspots.activate(NOUN_MUSIC_SCORE, false); + _game._objects.addToInventory(OBJ_MUSIC_SCORE); + _vm->_sound->command(26); + _action._inProgress = false; + return; + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[14]); + _game._player._visible = true; + _scene->_sequences.addTimer(20, 3); + _action._inProgress = false; + return; + break; + + case 3: + _vm->_dialogs->showItem(OBJ_MUSIC_SCORE, 820, 0); + _game._player._stepEnabled = true; + _action._inProgress = false; + return; + break; + + default: + break; + } + } + + if (_action._lookFlag) { + _vm->_dialogs->show(50410); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(50411); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(50412); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ORGAN)) { + _vm->_dialogs->show(50413); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ORGAN_BENCH)) { + _vm->_dialogs->show(50414); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MUSIC_SCORE) && _game._objects.isInRoom(OBJ_MUSIC_SCORE)) { + _vm->_dialogs->show(50415); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LEFT_DOOR)) { + _vm->_dialogs->show(50416); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RIGHT_DOOR)) { + _vm->_dialogs->show(_globals[kRightDoorIsOpen504] ? 50434 : 50417); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TABLE)) { + _vm->_dialogs->show(50419); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TRAP_DOOR)) { + _vm->_dialogs->show(50420); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LARGE_CHAIR)) { + _vm->_dialogs->show(50422); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CHRISTINE)) { + _vm->_dialogs->show(_globals[kFightStatus] ? 50426 : 50429); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PHANTOM)) { + _vm->_dialogs->show(50428); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_OPEN, NOUN_TRAP_DOOR)) { + _vm->_dialogs->show(50421); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLOSE) && _action.isObject(NOUN_RIGHT_DOOR) && !_globals[kRightDoorIsOpen504]) { + _vm->_dialogs->show(50433); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLOSE) && _action.isObject(NOUN_LEFT_DOOR) && !_globals[kFightStatus] && !_game._visitedScenes.exists(506)) { + _vm->_dialogs->show(50433); + _action._inProgress = false; + return; + } + + if (_anim3ActvFl && (_action.isAction(VERB_TAKE, NOUN_SWORD) || _action.isAction(VERB_ATTACK, NOUN_PHANTOM))) { + _game._player._stepEnabled = false; + _input3Count = 0; + _phantomStatus = 4; + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TALK_TO, NOUN_CHRISTINE)) { + _vm->_gameConv->run(21); + _vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_MUSIC_SCORE)); + _vm->_gameConv->exportValue(0); + _phantomStatus = 7; + _christineTalkCount = 0; + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TALK_TO, NOUN_PHANTOM)) { + _vm->_dialogs->show(50431); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_CHRISTINE)) { + _vm->_dialogs->show(50435); + _action._inProgress = false; + return; + } +} + +void Scene504::preActions() { + if (_action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_DOOR) || _action.isAction(VERB_OPEN, NOUN_RIGHT_DOOR)) { + if (_globals[kRightDoorIsOpen504]) { + if ((_globals[kFightStatus] == 2) && !_game._visitedScenes.exists(506)) { + switch (_game._trigger) { + case 0: + _game._player.walk(Common::Point(317, 115), FACING_NORTHEAST); + _game._player._readyToWalk = false; + _game._player._needToWalk = false; + _game._player._stepEnabled = false; + _vm->_gameConv->run(26); + _vm->_gameConv->exportValue(2); + _scene->_sequences.addTimer(6, 1); + break; + + case 1: + if (_vm->_gameConv->_running >= 0) + _scene->_sequences.addTimer(6, 1); + else { + _game._player._stepEnabled = true; + _action._inProgress = true; + _game._player._needToWalk = true; + _game._player._readyToWalk = true; + } + break; + + default: + break; + } + } else + _game._player.walk(Common::Point(317, 115), FACING_NORTHEAST); + } else if (_globals[kHeListened] || (_globals[kFightStatus] == 0)) + _game._player.walk(Common::Point(286, 120), FACING_NORTHEAST); + } + + if (_anim2ActvFl && !_action.isAction(VERB_SIT_IN) && _game._player._needToWalk) { + _chairStatus = 1; + _game._player._stepEnabled = false; + _game._player._readyToWalk = false; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_LEFT_DOOR) || _action.isAction(VERB_OPEN, NOUN_LEFT_DOOR)) { + if ((_globals[kFightStatus] == 0) && (_globals[kCoffinStatus] == 2) && !_game._visitedScenes.exists(506)) { + _vm->_dialogs->show(50432); + _game._player.cancelCommand(); + return; + } else if (_game._visitedScenes.exists(506)) + _game._player.walk(Common::Point(0, 109), FACING_NORTHWEST); + else if (!_game._objects.isInInventory(OBJ_MUSIC_SCORE) || (_globals[kFightStatus] == 0)) + _game._player.walk(Common::Point(33, 116), FACING_NORTHWEST); + } + + if ((_globals[kFightStatus] == 0) && (_globals[kCoffinStatus] == 2) && !_game._visitedScenes.exists(506) + && !_action.isAction(VERB_LOOK) && !_action.isAction(VERB_LOOK_AT) && !_action.isAction(VERB_ATTACK) + && !_action.isAction(VERB_TAKE, NOUN_SWORD) && !_action.isAction(VERB_TALK_TO, NOUN_PHANTOM)) { + _vm->_dialogs->show(50430); + _game._player.cancelCommand(); + } +} + +void Scene504::handleListenAnimation() { + int curFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + if (curFrame == _listenFrame) + return; + + _listenFrame = curFrame; + int resetFrame = -1; + + switch (_listenFrame) { + case 8: + _vm->_gameConv->release(); + break; + + case 9: + resetFrame = (_listenStatus == 0) ? 8 : 9; + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame); + _listenFrame = resetFrame; + } +} + +void Scene504::handleOrganAnimation() { + int curFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame(); + if (curFrame == _playFrame) + return; + + _playFrame = curFrame; + int resetFrame = -1; + + switch (_playFrame) { + case 22: + _game._player._stepEnabled = true; + _vm->_gameConv->run(27); + break; + + case 23: + if (_playStatus == 0) + resetFrame = 22; + else { + _game._player._stepEnabled = false; + if (_songNum == 5) { + _playingMusicFl = false; + _fireBreathFl = false; + resetFrame = 104; + } + } + break; + + case 28: + if (!_playingMusicFl) { + _playingMusicFl = true; + _fireBreathFl = true; + _game._player._stepEnabled = false; + + switch (_songNum) { + case 1: + _vm->_sound->command(34); + break; + + case 2: + _vm->_sound->command(37); + break; + + case 3: + _vm->_sound->command(35); + break; + + case 4: + _vm->_sound->command(36); + break; + + default: + break; + } + } + break; + + case 69: + if ((_globals[kRightDoorIsOpen504]) && (_playCount >= 2)) { + _playCount = 0; + resetFrame = 102; + _vm->_sound->command(2); + _vm->_sound->command(16); + } else if (_songNum != _globals[kMusicSelected]) { + _vm->_sound->command(2); + _fireBreathFl = true; + resetFrame = 75; + } else { + resetFrame = 25; + ++_playCount; + if (!_globals[kRightDoorIsOpen504]) { + _scene->_sequences.addTimer(1, 80); + _globals[kPlayerScore] += 5; + } + } + break; + + case 76: + _scene->playSpeech(7); + break; + + case 90: + _vm->_sound->command(27); + break; + + case 102: + ++_deathCounter; + if (_deathCounter >= 17) + _scene->_reloadSceneFlag = true; + else + resetFrame = 101; + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[1], resetFrame); + _playFrame = resetFrame; + } +} + +void Scene504::handlePhantomAnimation1() { + int curFrame = _scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame(); + if (curFrame == _phantomFrame) + return; + + _phantomFrame = curFrame; + int resetFrame = -1; + + switch (_phantomFrame) { + case 41: + _vm->_gameConv->run(21); + _vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_MUSIC_SCORE)); + _vm->_gameConv->exportValue(0); + break; + + case 52: + case 53: + case 54: + case 55: + resetFrame = (_phantomStatus == 0) ? _vm->getRandomNumber(51, 54) : 55; + break; + + case 78: + _vm->_gameConv->release(); + break; + + case 110: + case 111: + case 112: + case 113: + resetFrame = (_phantomStatus == 1) ? _vm->getRandomNumber(109, 112) : 113; + break; + + case 142: + _scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100); + break; + + case 143: + _game._player._stepEnabled = true; + break; + + case 149: + case 150: + case 151: + ++_input3Count; + + if (_phantomStatus == 4) { + _game._player._stepEnabled = false; + resetFrame = 200; + } else if (_input3Count >= 9) { + _game._player._stepEnabled = false; + resetFrame = 151; + } else if (_phantomStatus == 2) + resetFrame = _vm->getRandomNumber(148, 150); + break; + + case 169: + _vm->_sound->command(1); + _scene->playSpeech(7); + break; + + case 180: + _vm->_sound->command(27); + break; + + case 187: + _deathCounter = 0; + break; + + case 189: + ++_deathCounter; + if (_deathCounter >= 29) + _scene->_reloadSceneFlag = true; + else + resetFrame = 188; + break; + + case 227: + + _scene->freeAnimation(_globals._animationIndexes[3]); + _scene->_sprites.remove(_globals._spriteIndexes[9]); + _scene->_sprites.remove(_globals._spriteIndexes[8]); + _scene->_sprites.remove(_globals._spriteIndexes[7]); + _scene->_sprites.remove(_globals._spriteIndexes[10]); + _scene->_sprites.remove(_globals._spriteIndexes[11]); + + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_3", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('a', 8), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('p', 2), 130); + + _scene->setAnimFrame(_globals._animationIndexes[3], 27); + resetFrame = -1; + _anim3ActvFl = false; + _anim4ActvFl = true; + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[3], resetFrame); + _phantomFrame = resetFrame; + } +} + +void Scene504::handlePhantomAnimation2() { + int curFrame = _scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame(); + if (curFrame == _phantomFrame) + return; + + _phantomFrame = curFrame; + int resetFrame = -1; + + switch (_phantomFrame) { + case 78: + _scene->playSpeech(9); + break; + + case 119: + _game._player._playerPos = Common::Point(114, 137); + _game._player._facing = FACING_WEST; + _game._player._visible = true; + _globals[kPlayerScore] += 5; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[3]); + _game._player.walk(Common::Point(130, 135), FACING_NORTHEAST); + _scene->_hotspots.activate(NOUN_CHRISTINE, false); + _game._player.setWalkTrigger(120); + _vm->_sound->command(1); + break; + + case 150: + _vm->_sound->command(16); + break; + + case 160: + switch (_playStatus) { + case 5: + resetFrame = 164; + break; + + case 7: + resetFrame = 160; + break; + + default: + resetFrame = 159; + break; + } + break; + + case 161: + case 162: + case 163: + case 164: + resetFrame = (_phantomStatus == 5) ? 159 : _vm->getRandomNumber(160, 162); + + ++_christineTalkCount; + if (_christineTalkCount > 10) { + resetFrame = 159; + if (_phantomStatus != 5) + _phantomStatus = 4; + } + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[3], resetFrame); + _phantomFrame = resetFrame; + } +} + +void Scene504::handlePhantomAnimation3() { + int curFrame = _scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame(); + if (curFrame == _phantomFrame) + return; + + _phantomFrame = curFrame; + int resetFrame = -1; + + switch (_phantomFrame) { + case 58: + _game._player._stepEnabled = true; + break; + + case 80: + if (_phantomStatus == 7) + resetFrame = 116; + else if (_phantomStatus != 6) + resetFrame = 79; + break; + + case 115: + _game._player.walk(Common::Point(0, 109), FACING_NORTHWEST); + _game._player.setWalkTrigger(136); + break; + + case 116: + resetFrame = 115; + break; + + case 117: + case 118: + case 119: + resetFrame = _vm->getRandomNumber(116, 118); + ++_christineTalkCount; + if (_christineTalkCount > 10) { + resetFrame = 79; + if (_phantomStatus != 6) + _phantomStatus = 5; + } + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[3], resetFrame); + _phantomFrame = resetFrame; + } +} + +void Scene504::handleChairAnimation() { + int curFrame = _scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame(); + if (curFrame == _chairFrame) + return; + + _chairFrame = curFrame; + int resetFrame = -1; + + switch (_chairFrame) { + case 24: + _game._player._stepEnabled = true; + break; + + case 25: + case 26: + case 30: + case 31: + if (!_chairDialogDoneFl) { + _chairDialogDoneFl = true; + _vm->_dialogs->show(50424); + } + + if (_chairStatus == 0) { + if (_vm->getRandomNumber(1,5) == 1) + resetFrame = _vm->getRandomNumber(24, 30); + else + resetFrame = _chairFrame - 1; + } else + resetFrame = 31; + break; + + case 47: + resetFrame = -1; + _game._player._stepEnabled = true; + _game._player._visible = true; + _game._player._readyToWalk = true; + _anim2ActvFl = false; + _chairDialogDoneFl = false; + _scene->freeAnimation(_globals._animationIndexes[2]); + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[2], resetFrame); + _chairFrame = resetFrame; + } +} + +void Scene504::handleListenConversation() { + if ((_action._activeAction._verbId == 2) && !_game._trigger) { + _game._player.walk(Common::Point(286, 120), FACING_EAST); + _game._player.setWalkTrigger(95); + } + + if (_action._activeAction._verbId == 12) + _listenStatus = 1; +} + +void Scene504::handlePlayConversation() { + switch (_action._activeAction._verbId) { + case 2: + *_vm->_gameConv->_nextStartNode = 1; + _vm->_gameConv->abortConv(); + _playStatus = 1; + _songNum = 1; + break; + + case 3: + *_vm->_gameConv->_nextStartNode = 1; + _vm->_gameConv->abortConv(); + _playStatus = 1; + _songNum = 2; + break; + + case 4: + *_vm->_gameConv->_nextStartNode = 1; + _vm->_gameConv->abortConv(); + _playStatus = 1; + _songNum = 3; + break; + + case 5: + *_vm->_gameConv->_nextStartNode = 1; + _vm->_gameConv->abortConv(); + _playStatus = 1; + _songNum = 4; + break; + + case 6: + *_vm->_gameConv->_nextStartNode = 1; + _vm->_gameConv->abortConv(); + _playStatus = 1; + _songNum = 5; + break; + + case 8: + *_vm->_gameConv->_nextStartNode = 1; + _vm->_gameConv->abortConv(); + _playStatus = 1; + break; + + default: + break; + } +} + +void Scene504::handleFightConversation() { + switch (_action._activeAction._verbId) { + case 3: + _vm->_gameConv->hold(); + _phantomStatus = 1; + break; + + case 8: + _phantomStatus = 2; + break; + + case 10: + case 11: + case 12: + case 15: + _vm->_gameConv->setInterlocutorTrigger(145); + break; + + case 14: + case 17: + _phantomStatus = 5; + _globals[kFightStatus] = 2; + break; + + default: + break; + } + + if ((_game._trigger == 145) && (_phantomStatus != 5)) { + _phantomStatus = 7; + _christineTalkCount = 0; + } +} + +/*------------------------------------------------------------------------*/ + +Scene505::Scene505(MADSEngine *vm) : Scene5xx(vm) { + _anim0ActvFl = false; + _anim1ActvFl = false; + _anim2ActvFl = false; + _checkFrame106 = false; + _leaveRoomFl = false; + _partedFl = false; + + _raoulStatus = -1; + _raoulFrame = -1; + _raoulCount = -1; + _bothStatus = -1; + _bothFrame = -1; + _bothCount = -1; + _partStatus = -1; + _partFrame = -1; + _partCount = -1; +} + +void Scene505::synchronize(Common::Serializer &s) { + Scene5xx::synchronize(s); + + s.syncAsByte(_anim0ActvFl); + s.syncAsByte(_anim1ActvFl); + s.syncAsByte(_anim2ActvFl); + s.syncAsByte(_checkFrame106); + s.syncAsByte(_leaveRoomFl); + s.syncAsByte(_partedFl); + + s.syncAsSint16LE(_raoulStatus); + s.syncAsSint16LE(_raoulFrame); + s.syncAsSint16LE(_raoulCount); + s.syncAsSint16LE(_bothStatus); + s.syncAsSint16LE(_bothFrame); + s.syncAsSint16LE(_bothCount); + s.syncAsSint16LE(_partStatus); + s.syncAsSint16LE(_partFrame); + s.syncAsSint16LE(_partCount); +} + +void Scene505::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + if ((_globals[kCoffinStatus] == 2) && (!_globals[kChrisLeft505])) + _scene->_variant = 1; + + _scene->addActiveVocab(NOUN_CHRISTINE); +} + +void Scene505::enter() { + _vm->_disableFastwalk = true; + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _partedFl = false; + _leaveRoomFl = false; + _anim0ActvFl = false; + _anim1ActvFl = false; + _anim2ActvFl = false; + _checkFrame106 = false; + } + + _vm->_gameConv->get(20); + _scene->_hotspots.activateAtPos(NOUN_LID, false, Common::Point(216, 44)); + _scene->_hotspots.activate(NOUN_CHRISTINE, false); + + _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('x', 6)); + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('a', 1)); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1)); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 2)); + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 3)); + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 4)); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 5)); + _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 4)); + + if (_scene->_priorSceneId == RETURNING_FROM_LOADING) { + if (_vm->_gameConv->_restoreRunning == 20) { + _scene->_hotspots.activate(NOUN_LID, false); + _scene->_hotspots.activateAtPos(NOUN_LID, true, Common::Point(216, 44)); + _globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, 12); + _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1); + + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('c', 1), 65); + _scene->setAnimFrame(_globals._animationIndexes[1], 109); + _anim1ActvFl = true; + _game._player._visible = false; + _game._player._stepEnabled = false; + _bothStatus = 3; + + _vm->_gameConv->run(20); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + } else if (_partedFl && (_globals[kFightStatus] == 0)) { + _scene->_hotspots.activate(NOUN_LID, false); + _scene->_hotspots.activateAtPos(NOUN_LID, true, Common::Point(216, 44)); + _globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, 12); + _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1); + + _anim2ActvFl = true; + _bothStatus = 3; + _globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('b', 1), 0); + int hotspotIdx = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots[hotspotIdx]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(hotspotIdx, Common::Point(91, 108), FACING_NORTHWEST); + _scene->setAnimFrame(_globals._animationIndexes[2], 89); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[2], 3); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[2], 4); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[2], 5); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[2], 6); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[2], 7); + } else if (_globals[kFightStatus]) { + _scene->_hotspots.activate(NOUN_LID, false); + _scene->_hotspots.activateAtPos(NOUN_LID, true, Common::Point(216, 44)); + _globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, 12); + _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1); + } else { + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('c', 1), 65); + _anim1ActvFl = true; + _bothStatus = 0; + _scene->_hotspots.activate(NOUN_CHRISTINE, true); + } + } + + if ((_scene->_priorSceneId == 504) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + _game._player._playerPos = Common::Point(5, 87); + _game._player._facing = FACING_EAST; + _game._player._stepEnabled = false; + _game._player.walk(Common::Point(58, 104), FACING_SOUTHEAST); + if (_globals[kCoffinStatus] != 2) { + _game._player.setWalkTrigger(70); + _anim1ActvFl = true; + _bothStatus = 0; + _scene->_hotspots.activate(NOUN_CHRISTINE, true); + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('c', 1), 65); + } else { + _scene->_hotspots.activate(NOUN_LID, false); + _scene->_hotspots.activateAtPos(NOUN_LID, true, Common::Point(216, 44)); + _globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, 12); + _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1); + _game._player._stepEnabled = true; + } + } + + sceneEntrySound(); +} + +void Scene505::step() { + if (_anim0ActvFl) + handleRaoulAnimation(); + + if (_anim1ActvFl) + handleBothanimation(); + + if (_anim2ActvFl) + handlePartedAnimation(); + + if (_game._trigger == 65) { + _scene->freeAnimation(_globals._animationIndexes[1]); + _vm->_sound->command(1); + _partedFl = true; + _anim2ActvFl = true; + _anim1ActvFl = false; + _globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('b', 1), 0); + + int hotspotIDx = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots.setPosition(hotspotIDx, Common::Point(91, 108), FACING_NORTHWEST); + _scene->_dynamicHotspots[hotspotIDx]._articleNumber = PREP_ON; + _scene->setDynamicAnim(hotspotIDx, _globals._animationIndexes[2], 3); + _scene->setDynamicAnim(hotspotIDx, _globals._animationIndexes[2], 4); + _scene->setDynamicAnim(hotspotIDx, _globals._animationIndexes[2], 5); + _scene->setDynamicAnim(hotspotIDx, _globals._animationIndexes[2], 6); + _scene->setDynamicAnim(hotspotIDx, _globals._animationIndexes[2], 7); + } + + if (_game._trigger == 70) { + _game._player._stepEnabled = true; + if (!_game._visitedScenes._sceneRevisited) { + _vm->_gameConv->run(20); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + } + } +} + +void Scene505::actions() { + if (_game._trigger == 80) { + _bothStatus = 2; + _action._inProgress = false; + return; + } + + if (_vm->_gameConv->_running == 20) { + handleCoffinDialog(); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TALK_TO, NOUN_CHRISTINE)) { + if (_globals[kCoffinStatus] != 2) + _vm->_dialogs->show(50536); + else { + _vm->_gameConv->run(20); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + _partStatus = 10; + _partCount = 0; + } + _action._inProgress = false; + return; + } + + if ((_action.isAction(VERB_UNLOCK, NOUN_SARCOPHAGUS) || _action.isAction(VERB_UNLOCK, NOUN_LID)) && !_globals[kLookedAtSkullFace]) { + _vm->_dialogs->show(50539); + _action._inProgress = false; + return; + } + + if ((_action.isAction(VERB_UNLOCK, NOUN_SKULL_FACE) || _action.isAction(VERB_PUT, NOUN_KEY, NOUN_SKULL_FACE)) || ((_action.isAction(VERB_UNLOCK, NOUN_SARCOPHAGUS) || _action.isAction(VERB_UNLOCK, NOUN_LID)) && _globals[kLookedAtSkullFace])) { + if (_globals[kCoffinStatus] == 0) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], false, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -1, -2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 9, 95); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 96); + _action._inProgress = false; + return; + + case 95: + _vm->_sound->command(76); + _vm->_dialogs->show(50528); + _action._inProgress = false; + return; + + case 96: + _game._player._visible = true; + _game._player._stepEnabled = true; + _globals[kCoffinStatus] = 1; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]); + _action._inProgress = false; + return; + + default: + break; + } + } else { + _vm->_dialogs->show(50534); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_PUSH, NOUN_SKULL) && (_scene->_customDest.x >= 19)) { + switch (_game._trigger) { + case 0: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[0] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[0], false, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_SPRITE, 6, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: { + int sprIdx; + _vm->_sound->command(77); + if (_scene->_customDest.x <= 44) + sprIdx = _globals._spriteIndexes[4]; + else if (_scene->_customDest.x <= 58) + sprIdx = _globals._spriteIndexes[3]; + else if (_scene->_customDest.x <= 71) + sprIdx = _globals._spriteIndexes[2]; + else if (_scene->_customDest.x <= 84) { + sprIdx = _globals._spriteIndexes[1]; + if (_globals[kCoffinStatus] == 1) { + _bothStatus = 1; + _scene->_hotspots.activate(NOUN_LID, false); + _scene->_hotspots.activate(NOUN_CHRISTINE, false); + _scene->_hotspots.activateAtPos(NOUN_LID, true, Common::Point(216, 44)); + _scene->changeVariant(1); + } + } else if (_scene->_customDest.x <= 100) + sprIdx = _globals._spriteIndexes[5]; + else + sprIdx = _globals._spriteIndexes[6]; + + int skullSeqIdx = _scene->_sequences.startPingPongCycle(sprIdx, false, 5, 2); + _scene->_sequences.setAnimRange(skullSeqIdx, -1, -2); + _scene->_sequences.setDepth(skullSeqIdx, 1); + } + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[0]); + _game._player._visible = true; + _game._player._stepEnabled = true; + if (_bothStatus == 1) { + _game._player.walk(Common::Point(136, 126), FACING_EAST); + _game._player.setWalkTrigger(80); + _game._player._stepEnabled = false; + } + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR)) { + if (_anim2ActvFl) { + _leaveRoomFl = true; + _game._player._stepEnabled = false; + } else { + _globals[kChrisLeft505] = true; + _scene->_nextSceneId = 504; + } + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(50510); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(50511); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(50512); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SARCOPHAGUS)) { + _vm->_dialogs->show((_globals[kCoffinStatus] <= 1) ? 50513 : 50514); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SKULL_FACE)) { + _globals[kLookedAtSkullFace] = true; + _vm->_dialogs->show(50529); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR)) { + _vm->_dialogs->show(50519); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SKULL)) { + _vm->_dialogs->show((_scene->_customDest.x < 19) ? 50521 : 50520); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SKULLS)) { + _vm->_dialogs->show(50521); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TOTEM)) { + _vm->_dialogs->show(50522); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DESK)) { + _vm->_dialogs->show(50523); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_POLE)) { + _vm->_dialogs->show(50524); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CURTAIN)) { + _vm->_dialogs->show(50525); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CHRISTINE)) { + _vm->_dialogs->show((_globals[kCoffinStatus] == 2) ? 50530 : 50537); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LID)) { + _vm->_dialogs->show((_globals[kCoffinStatus] == 2) ? 50531 : 50532); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_LOCK, NOUN_SARCOPHAGUS) || _action.isAction(VERB_LOCK, NOUN_LID) || _action.isAction(VERB_LOCK, NOUN_SKULL_FACE)) { + _vm->_dialogs->show(50535); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_OPEN, NOUN_SARCOPHAGUS) || _action.isAction(VERB_OPEN, NOUN_LID)) { + if (_globals[kCoffinStatus] == 2) + _vm->_dialogs->show(50533); + else if (_globals[kCoffinStatus] == 1) + _vm->_dialogs->show(50518); + else + _vm->_dialogs->show(50515); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_CHRISTINE) && (_globals[kCoffinStatus] != 2)) { + _vm->_dialogs->show(50538); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_CHRISTINE)) { + _vm->_dialogs->show((_globals[kCoffinStatus] <= 1) ? 50538 : 50540); + _action._inProgress = false; + } +} + +void Scene505::preActions() { + if ((_globals[kCoffinStatus] == 0) && (_action.isAction(VERB_UNLOCK, NOUN_SKULL_FACE) || _action.isAction(VERB_UNLOCK, NOUN_SARCOPHAGUS) || _action.isAction(VERB_PUT, NOUN_KEY, NOUN_SKULL_FACE) || _action.isAction(VERB_UNLOCK, NOUN_LID))) { + if (_action.isObject(NOUN_SKULL_FACE) || _globals[kLookedAtSkullFace]) + _game._player.walk(Common::Point(279, 150), FACING_SOUTHWEST); + } + + if (_action.isObject(NOUN_SKULL_FACE) && (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT))) + _game._player.walk(Common::Point(279, 150), FACING_SOUTHWEST); + + if (_action.isObject(NOUN_CURTAIN) && (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT))) + _game._player._needToWalk = true; + + if (_action.isObject(NOUN_SKULL) && (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT))) + _game._player._needToWalk = true; +} + +void Scene505::handleCoffinDialog() { + int interlocutorFl = false; + int heroFl = false; + + switch (_action._activeAction._verbId) { + case 8: + heroFl = true; + interlocutorFl = true; + _bothStatus = 6; + break; + + case 14: + heroFl = true; + interlocutorFl = true; + if (!_checkFrame106) + _vm->_gameConv->hold(); + break; + + case 17: + heroFl = true; + interlocutorFl = true; + if (!_game._trigger) { + _vm->_gameConv->hold(); + _raoulStatus = 2; + } + break; + + case 20: + heroFl = true; + interlocutorFl = true; + if (!_game._trigger) { + _vm->_gameConv->hold(); + _game._player.walk(Common::Point(244, 130), FACING_SOUTHWEST); + _game._player.setWalkTrigger(71); + } + break; + + case 22: + heroFl = true; + interlocutorFl = true; + if (!_game._trigger) { + _vm->_gameConv->hold(); + _bothStatus = 7; + } + break; + + default: + break; + } + + switch (_game._trigger) { + case 70: + case 76: + _vm->_gameConv->release(); + break; + + case 71: + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('r', 1), 75); + _anim0ActvFl = true; + _raoulStatus = 0; + _raoulCount = 0; + _game._player._visible = false; + break; + + case 75: + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); + _scene->_sequences.addTimer(10, 76); + break; + + case 85: + if ((_bothStatus != 6) && (_bothStatus != 0)) + _bothStatus = 5; + break; + + case 90: + if ((_bothStatus != 6) && (_bothStatus != 0)) + _bothStatus = 4; + break; + + default: + break; + } + + if (!heroFl) + _vm->_gameConv->setHeroTrigger(85); + + if (!interlocutorFl) + _vm->_gameConv->setInterlocutorTrigger(90); + + _bothCount = 0; +} + +void Scene505::handleRaoulAnimation() { + int curFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + if (curFrame == _raoulFrame) + return; + + _raoulFrame = curFrame; + int resetFrame = -1; + + switch (_raoulFrame) { + case 3: + _vm->_gameConv->release(); + break; + + case 4: + case 5: + case 6: + if (_raoulStatus == 0) { + resetFrame = _vm->getRandomNumber(3, 5); + ++_raoulCount; + if (_raoulCount > 20) { + _raoulStatus = 1; + resetFrame = 3; + } + break; + } + + if (_raoulStatus == 1) + resetFrame = 3; + + if (_raoulStatus == 2) + resetFrame = 6; + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame); + _raoulFrame = resetFrame; + } +} + +void Scene505::handleBothanimation() { + int curFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame(); + if (curFrame == _bothFrame) + return; + + _bothFrame = curFrame; + int resetFrame = -1; + + switch (_bothFrame) { + case 1: + case 20: + case 39: + if (_bothStatus == 0) { + if (_vm->getRandomNumber(1, 35) == 1) { + if (_vm->getRandomNumber(1, 2) == 1) + resetFrame = 1; + else + resetFrame = 20; + } else + resetFrame = 0; + } else if (_bothStatus == 1) + resetFrame = 39; + else + resetFrame = 0; + break; + + case 14: + if (_vm->getRandomNumber(1, 3) == 1) + resetFrame = 8; + break; + + case 32: + if (_vm->getRandomNumber(1, 2) == 1) + resetFrame = 28; + break; + + case 41: + _vm->_sound->command(39); + break; + + case 51: + _globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, 12); + _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1); + _globals[kCoffinStatus] = 2; + break; + + case 66: + _game._player._stepEnabled = false; + _vm->_gameConv->run(20); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + break; + + case 67: + if (_bothStatus == 1) + resetFrame = 66; + break; + + case 68: + _game._player._visible = false; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[1]); + break; + + case 106: + _checkFrame106 = true; + _vm->_gameConv->release(); + break; + + case 109: + case 130: + _vm->_gameConv->release(); + break; + + case 110: + case 111: + case 112: + case 113: + case 114: + case 115: + case 131: + switch (_bothStatus) { + case 4: + resetFrame = _vm->getRandomNumber(112, 114); + ++_bothCount; + if (_bothCount > 20) { + _bothStatus = 3; + resetFrame = 109; + } + break; + + case 5: + resetFrame = _vm->getRandomNumber(109, 111); + ++_bothCount; + if (_bothCount > 20) { + _bothStatus = 3; + resetFrame = 109; + } + break; + + case 6: + resetFrame = 131; + _bothStatus = 8; + _game._player._stepEnabled = false; + break; + + case 7: + resetFrame = 115; + _bothStatus = 3; + break; + + default: + resetFrame = 109; + break; + } + break; + + case 127: + _vm->_sound->command(26); + _game._objects.addToInventory(OBJ_WEDDING_RING); + _vm->_dialogs->showItem(OBJ_WEDDING_RING, 821, 0); + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[1], resetFrame); + _bothFrame = resetFrame; + } +} + +void Scene505::handlePartedAnimation() { + int curFrame = _scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame(); + if (curFrame == _partFrame) + return; + + _partFrame = curFrame; + int resetFrame = -1; + + switch (_partFrame) { + case 20: + _vm->_sound->command(16); + break; + + case 25: + _game._player._playerPos = Common::Point(93, 133); + _game._player.resetFacing(FACING_WEST); + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[2]); + break; + + case 70: + _game._player._stepEnabled = true; + break; + + case 90: + if (_partStatus == 10) + resetFrame = 146; + else if (!_leaveRoomFl) + resetFrame = 89; + break; + + case 145: + _scene->_nextSceneId = 504; + break; + + case 147: + case 148: + case 149: + resetFrame = _vm->getRandomNumber(146, 148); + ++_partCount; + if (_partCount > 10) { + resetFrame = 89; + _partStatus = 8; + } + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[2], resetFrame); + _partFrame = resetFrame; + } +} + +/*------------------------------------------------------------------------*/ + +Scene506::Scene506(MADSEngine *vm) : Scene5xx(vm) { + _anim0ActvFl = false; + _skipFl = false; + _ascendingFl = false; +} + +void Scene506::synchronize(Common::Serializer &s) { + Scene5xx::synchronize(s); + + s.syncAsByte(_anim0ActvFl); + s.syncAsByte(_skipFl); + s.syncAsByte(_ascendingFl); +} + +void Scene506::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + _scene->addActiveVocab(NOUN_CHRISTINE); + _scene->addActiveVocab(VERB_LOOK_AT); + + if (!_globals[kChristineIsInBoat]) + _scene->_variant = 1; +} + +void Scene506::enter() { + _vm->_disableFastwalk = true; + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _anim0ActvFl = false; + _skipFl = false; + _ascendingFl = false; + } + + _vm->_gameConv->get(26); + + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1)); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2)); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3)); + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('p', 0)); + _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 1)); + _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 0)); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('b', 0), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RDR_9"); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_6", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_3", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_2", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + + if (_game._objects.isInRoom(OBJ_OAR)) { + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14); + } else + _scene->_hotspots.activate(NOUN_OAR, false); + + _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 6, 0); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2); + + _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 0); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2); + + _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 0); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2); + + if (_scene->_priorSceneId == RETURNING_FROM_LOADING) { + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + if (!_globals[kChristineIsInBoat]) { + _anim0ActvFl = true; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('r', 1), 0); + _scene->setAnimFrame(_globals._animationIndexes[0], 239); + int hotspotIdx = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots[hotspotIdx]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(hotspotIdx, Common::Point(79, 133), FACING_SOUTHWEST); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[0], 6); + } + } else if (_scene->_priorSceneId == 504) { + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + + if (_game._visitedScenes._sceneRevisited) { + _game._player._playerPos = Common::Point(189, 123); + _game._player._facing = FACING_SOUTHWEST; + _game._player._stepEnabled = false; + _game._player._visible = false; + + if (!_globals[kChristineIsInBoat]) { + _anim0ActvFl = true; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('r', 1), 0); + _scene->setAnimFrame(_globals._animationIndexes[0], 239); + int hotspotIdx = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots[hotspotIdx]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(hotspotIdx, Common::Point(79, 133), FACING_SOUTHWEST); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[0], 6); + } + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('r', 2), 95); + } else { + _game._player._playerPos = Common::Point(186, 122); + _game._player._facing = FACING_SOUTHWEST; + _game._player._stepEnabled = false; + _game._player._visible = false; + _anim0ActvFl = true; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('r', 1), 0); + int hotspotIdx = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots[hotspotIdx]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(hotspotIdx, Common::Point(79, 133), FACING_SOUTHWEST); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[0], 2); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[0], 3); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[0], 4); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[0], 5); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[0], 6); + } + } else if ((_scene->_priorSceneId == 501) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + _game._player._playerPos = Common::Point(0, 142); + _game._player._facing = FACING_EAST; + _game._player._stepEnabled = false; + _game._player.walk(Common::Point(23, 145), FACING_EAST); + _game._player.setWalkTrigger(60); + } + + sceneEntrySound(); +} + +void Scene506::step() { + switch (_game._trigger) { + case 60: + _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 61); + break; + + case 61: + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + _game._player._stepEnabled = true; + break; + + case 95: + _game._player._visible = true; + _game._player._stepEnabled = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[1]); + break; + + default: + break; + } + + if (_anim0ActvFl) { + int curFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + if ((curFrame == 141) && !_skipFl) { + _game._player._visible = true; + _skipFl = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); + } + + if (curFrame == 240) + _scene->setAnimFrame(_globals._animationIndexes[0], 239); + + if (curFrame == 300) + _scene->setAnimFrame(_globals._animationIndexes[0], 239); + + if (curFrame == 168) + _game._player._stepEnabled = true; + + if (curFrame == 289) + _scene->_nextSceneId = 501; + } + + if (_ascendingFl && (_vm->_gameConv->_running != 26)) { + _ascendingFl = false; + _game._player._stepEnabled = false; + } +} + +void Scene506::actions() { + if (_action.isAction(VERB_TALK_TO, NOUN_CHRISTINE)) { + _vm->_gameConv->run(26); + _vm->_gameConv->exportValue(1); + _scene->setAnimFrame(_globals._animationIndexes[0], 290); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_OAR)) { + switch (_game._trigger) { + case (0): + if (_game._objects.isInRoom(OBJ_OAR)) { + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[4], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 4, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + } + break; + + case 1: + _scene->deleteSequence(_globals._sequenceIndexes[5]); + _scene->_hotspots.activate(NOUN_OAR, false); + _game._objects.addToInventory(OBJ_OAR); + _vm->_sound->command(26); + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[4]); + _game._player._visible = true; + _scene->_sequences.addTimer(20, 3); + break; + + case 3: + _vm->_dialogs->showItem(OBJ_OAR, 824, 0); + _game._player._stepEnabled = true; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR)) { + if (_scene->_customDest.x < 150) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[4], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 4, 65); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 67); + break; + + case 65: + _scene->deleteSequence(_globals._sequenceIndexes[3]); + _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 66); + _vm->_sound->command(24); + break; + + case 66: + _game._player.walk(Common::Point(0, 142), FACING_WEST); + _game._player.setWalkTrigger(68); + break; + + case 67: + _game._player._visible = true; + break; + + case 68: + if (_globals[kChristineIsInBoat]) + _scene->_nextSceneId = 501; + else + _scene->setAnimFrame(_globals._animationIndexes[0], 241); + break; + + default: + break; + } + } else { + switch (_game._trigger) { + case (0): + if (!_globals[kChristineIsInBoat]) { + _vm->_gameConv->run(26); + _vm->_gameConv->exportValue(2); + int curFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + if (curFrame == 240 || curFrame == 239) + _scene->setAnimFrame(_globals._animationIndexes[0], 290); + _ascendingFl = true; + } + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], -1, -2); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[7], SYNC_PLAYER, 0); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 90); + break; + + case 90: + _vm->_gameConv->abortConv(); + _scene->_nextSceneId = 504; + break; + + default: + break; + } + } + _action._inProgress = false; + return; + } + + if (_vm->_gameConv->_running == 26) { + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(50610); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(50611); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(50612); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TORCH)) { + _vm->_dialogs->show(50613); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_COLUMN)) { + _vm->_dialogs->show(50614); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CEILING)) { + _vm->_dialogs->show(50615); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RAMP)) { + _vm->_dialogs->show(50616); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR)) { + if (_scene->_customDest.x < 150) + _vm->_dialogs->show(50617); + else + _vm->_dialogs->show(50618); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_OAR) && _game._objects.isInRoom(OBJ_OAR)) { + _vm->_dialogs->show(50619); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CHRISTINE)) { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() < 235) + _vm->_dialogs->show(50621); + else + _vm->_dialogs->show(50620); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE, NOUN_TORCH)) { + _vm->_dialogs->show(50613); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_CHRISTINE)) { + _vm->_dialogs->show(50622); + _action._inProgress = false; + } +} + +void Scene506::preActions() { + if (_action.isAction(VERB_UNLOCK, NOUN_DOOR) || _action.isAction(VERB_LOCK, NOUN_DOOR)) + _game._player.walk(Common::Point(33, 142), FACING_NORTHWEST); + + if (_action.isAction(VERB_OPEN, NOUN_DOOR)) { + if (_scene->_customDest.x < 150) + _game._player.walk(Common::Point(33, 142), FACING_NORTHWEST); + else + _game._player.walk(Common::Point(191, 118), FACING_EAST); + } +} + +/*------------------------------------------------------------------------*/ + +} // End of namespace Phantom +} // End of namespace MADS diff --git a/engines/mads/phantom/phantom_scenes5.h b/engines/mads/phantom/phantom_scenes5.h new file mode 100644 index 0000000000..33478304f3 --- /dev/null +++ b/engines/mads/phantom/phantom_scenes5.h @@ -0,0 +1,219 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef MADS_PHANTOM_SCENES5_H +#define MADS_PHANTOM_SCENES5_H + +#include "common/scummsys.h" +#include "common/serializer.h" +#include "mads/game.h" +#include "mads/scene.h" +#include "mads/phantom/phantom_scenes.h" + +namespace MADS { + +namespace Phantom { + +class Scene5xx : public PhantomScene { +protected: + /** + * Plays an appropriate sound when entering a scene + */ + void sceneEntrySound(); + + /** + *Sets the AA file to use for the scene + */ + void setAAName(); + + /** + * Updates the prefix used for getting player sprites for the scene + */ + void setPlayerSpritesPrefix(); +public: + Scene5xx(MADSEngine *vm) : PhantomScene(vm) {} +}; + +class Scene501 : public Scene5xx { +private: + bool _anim0ActvFl; + bool _skipFl; + +public: + Scene501(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene502 : public Scene5xx { +private: + bool _fire1ActiveFl; + bool _fire2ActiveFl; + bool _fire3ActiveFl; + bool _fire4ActiveFl; + bool _panelTurningFl; + bool _trapDoorHotspotEnabled; + bool _acceleratedFireActivationFl; + + int _panelPushedNum; + int _puzzlePictures[16]; + int _puzzleSprites[16]; + int _puzzleSequences[16]; + int _messageLevel; + int _cycleStage; + + Common::Point _nextPos; + + uint32 _lastFrameTime; + uint32 _timer; + uint32 _deathTimer; + + byte *_cyclePointer; + + void room_502_initialize_panels(); + void loadCyclingInfo(); + void animateFireBursts(); + void setPaletteCycle(); + void handlePanelAnimation(); + void getPanelInfo(Common::Point *walkToPos, int *panel, Common::Point mousePos, Common::Point *interimPos); + +public: + Scene502(MADSEngine *vm); + ~Scene502(); + + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene504 : public Scene5xx { +private: + bool _anim0ActvFl; + bool _anim1ActvFl; + bool _anim2ActvFl; + bool _anim3ActvFl; + bool _anim4ActvFl; + bool _anim5ActvFl; + bool _playingMusicFl; + bool _chairDialogDoneFl; + bool _fireBreathFl; + + int _songNum; + int _input3Count; + int _playCount; + int _listenStatus; + int _listenFrame; + int _chairStatus; + int _chairFrame; + int _playStatus; + int _playFrame; + int _phantomStatus; + int _phantomFrame; + int _christineTalkCount; + int _deathCounter; + + void handleListenAnimation(); + void handleOrganAnimation(); + void handleChairAnimation(); + void handlePhantomAnimation1(); + void handlePhantomAnimation2(); + void handlePhantomAnimation3(); + void handleListenConversation(); + void handlePlayConversation(); + void handleFightConversation(); + +public: + Scene504(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene505 : public Scene5xx { +private: + bool _anim0ActvFl; + bool _anim1ActvFl; + bool _anim2ActvFl; + bool _checkFrame106; + bool _leaveRoomFl; + bool _partedFl; + + int _raoulStatus; + int _raoulFrame; + int _raoulCount; + int _bothStatus; + int _bothFrame; + int _bothCount; + int _partStatus; + int _partFrame; + int _partCount; + + void handleRaoulAnimation(); + void handleBothanimation(); + void handlePartedAnimation(); + void handleCoffinDialog(); + +public: + Scene505(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +class Scene506 : public Scene5xx { +private: + bool _anim0ActvFl; + bool _skipFl; + bool _ascendingFl; + +public: + Scene506(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; + +} // End of namespace Phantom +} // End of namespace MADS + +#endif /* MADS_PHANTOM_SCENES5_H */ diff --git a/engines/mads/player.cpp b/engines/mads/player.cpp index bb747f4b52..09a961825e 100644 --- a/engines/mads/player.cpp +++ b/engines/mads/player.cpp @@ -56,7 +56,6 @@ Player::Player(MADSEngine *vm) _special = 0; _ticksAmount = 0; _priorTimer = 0; - _trigger = 0; _scalingVelocity = false; _spritesChanged = false; _forceRefresh = false; @@ -80,6 +79,10 @@ Player::Player(MADSEngine *vm) _moving = false; _walkOffScreen = 0; _walkOffScreenSceneId = -1; + _forcePrefix = false; + _commandsAllowed = false; + _enableAtTarget = false; + _walkTrigger = 0; Common::fill(&_stopWalkerList[0], &_stopWalkerList[12], 0); Common::fill(&_stopWalkerTrigger[0], &_stopWalkerTrigger[12], 0); @@ -186,8 +189,10 @@ void Player::changeFacing() { (Facing)_directionListIndexes[_facing + 10]; selectSeries(); - if ((_facing == _turnToFacing) && !_moving) + if ((_facing == _turnToFacing) && !_moving) { updateFrame(); + activateTrigger(); + } _priorTimer += 1; } @@ -242,8 +247,8 @@ void Player::updateFrame() { Scene &scene = _vm->_game->_scene; assert(scene._sprites[idx] != nullptr); SpriteAsset &spriteSet = *scene._sprites[idx]; - - // WORKAROUND: Certain cutscenes set up player sprites that don't have any + + // WORKAROUND: Certain cutscenes set up player sprites that don't have any // character info. In such cases, simply ignore player updates if (!spriteSet._charInfo) return; @@ -278,6 +283,16 @@ void Player::updateFrame() { _forceRefresh = true; } +void Player::activateTrigger() { + // TODO: Finish this! + // TODO: Also sync _walkTrigger, if necessary + + if (_walkTrigger) { + _vm->_game->_trigger = _walkTrigger; + _walkTrigger = 0; + } +} + void Player::update() { Scene &scene = _vm->_game->_scene; @@ -289,7 +304,7 @@ void Player::update() { int newDepth = 1; int yp = MIN(_playerPos.y, (int16)(MADS_SCENE_HEIGHT - 1)); - for (int idx = 1; idx < 15; ++idx) { + for (int idx = 1; idx < DEPTH_BANDS_SIZE; ++idx) { if (scene._sceneInfo->_depthList[newDepth] >= yp) newDepth = idx + 1; } @@ -441,10 +456,12 @@ void Player::move() { if (newFacing && _moving) startMovement(); - if (_turnToFacing != _facing) + if (_turnToFacing != _facing) { changeFacing(); - else if (!_moving) + } else if (!_moving) { updateFrame(); + activateTrigger(); + } int velocity = _velocity; if (_scalingVelocity && (_totalDistance > 0)) { @@ -797,4 +814,26 @@ void Player::removePlayerSprites() { _visible = false; } +void Player::firstWalk(Common::Point fromPos, Facing fromFacing, Common::Point destPos, Facing destFacing, bool enableFl) { + _playerPos = fromPos; + _facing = fromFacing; + + walk(destPos, destFacing); + _walkAnywhere = true; + + _commandsAllowed = false; + _enableAtTarget = enableFl; +} + +void Player::setWalkTrigger(int val) { + _walkTrigger = val; + warning("TODO: Player::setWalkTrigger"); +} + +void Player::resetFacing(Facing facing) { + _facing = facing; + _turnToFacing = facing; + selectSeries(); +} + } // End of namespace MADS diff --git a/engines/mads/player.h b/engines/mads/player.h index e5765a9bca..55000047fb 100644 --- a/engines/mads/player.h +++ b/engines/mads/player.h @@ -95,6 +95,8 @@ private: void startMovement(); void changeFacing(); + + void activateTrigger(); public: MADSAction *_action; @@ -131,13 +133,17 @@ public: int _trigger; bool _scalingVelocity; bool _forceRefresh; + bool _forcePrefix; bool _needToWalk; bool _readyToWalk; + bool _commandsAllowed; + bool _enableAtTarget; int _stopWalkerIndex; int _centerOfGravity; int _currentDepth; int _currentScale; Common::String _spritesPrefix; + int _walkTrigger; public: Player(MADSEngine *vm); @@ -221,6 +227,13 @@ public: } void removePlayerSprites(); + + void firstWalk(Common::Point fromPos, Facing fromFacing, Common::Point destPos, Facing destFacing, bool enableFl); + + void setWalkTrigger(int val); + + void resetFacing(Facing facing); + }; } // End of namespace MADS diff --git a/engines/mads/rails.cpp b/engines/mads/rails.cpp index 9b2ec71de6..ee0ca98cd3 100644 --- a/engines/mads/rails.cpp +++ b/engines/mads/rails.cpp @@ -274,4 +274,18 @@ void Rails::synchronize(Common::Serializer &s) { } } +void Rails::disableNode(int nodeIndex) { + _nodes[nodeIndex]._active = false; + + for (uint16 i = 0; i < _nodes.size(); i++) { + if (i != nodeIndex) + disableLine(i, nodeIndex); + } +} + +void Rails::disableLine(int from, int to) { + _nodes[from]._distances[to] = 0x3FFF; + _nodes[to]._distances[from] = 0x3FFF; +} + } // End of namespace MADS diff --git a/engines/mads/rails.h b/engines/mads/rails.h index c95f5c47a6..ea12177038 100644 --- a/engines/mads/rails.h +++ b/engines/mads/rails.h @@ -127,6 +127,10 @@ public: * Synchronize the data for the route */ void synchronize(Common::Serializer &s); + + void disableNode(int idx); + void disableLine(int from, int to); + }; } // End of namespace MADS diff --git a/engines/mads/resources.cpp b/engines/mads/resources.cpp index 3b7cf2cab0..16019a4b07 100644 --- a/engines/mads/resources.cpp +++ b/engines/mads/resources.cpp @@ -79,7 +79,7 @@ private: */ ResourceType getResourceType(const Common::String &resourceName) const; public: - HagArchive(MADSEngine *vm); + explicit HagArchive(MADSEngine *vm); virtual ~HagArchive(); // Archive implementation diff --git a/engines/mads/scene.cpp b/engines/mads/scene.cpp index ee5f1a5440..2875bc0b56 100644 --- a/engines/mads/scene.cpp +++ b/engines/mads/scene.cpp @@ -24,6 +24,7 @@ #include "mads/scene.h" #include "mads/compression.h" #include "mads/mads.h" +#include "mads/audio.h" #include "mads/dragonsphere/dragonsphere_scenes.h" #include "mads/nebular/nebular_scenes.h" #include "mads/phantom/phantom_scenes.h" @@ -49,7 +50,8 @@ Scene::Scene(MADSEngine *vm) _reloadSceneFlag = false; _freeAnimationFlag = false; _animationData = nullptr; - _activeAnimation = nullptr; + for (int i = 0; i < 10; i++) + _animation[i] = nullptr; _textSpacing = -1; _frameStartTime = 0; _mode = SCREENMODE_VGA; @@ -60,6 +62,8 @@ Scene::Scene(MADSEngine *vm) _spritesCount = 0; _variant = 0; + _speechReady = -1; + _paletteUsageF.push_back(PaletteUsage::UsageEntry(0xF)); // Set up a scene surface that maps to our physical screen drawing surface @@ -150,6 +154,8 @@ void Scene::loadScene(int sceneId, const Common::String &prefix, bool palFlag) { _sequences.clear(); _kernelMessages.clear(); _vm->_palette->_paletteUsage.load(&_scenePaletteUsage); + if (_vm->getGameID() != GType_RexNebular) + setCamera(Common::Point(0, 0)); int flags = SCENEFLAG_LOAD_SHADOW; if (_vm->_dithering) @@ -385,6 +391,7 @@ void Scene::doFrame() { !_vm->_game->_fx); } + _vm->_game->camUpdate(); if (_action._selectedAction && player._stepEnabled && !player._needToWalk && !_vm->_game->_trigger && !player._trigger) { _action.startAction(); @@ -430,8 +437,7 @@ void Scene::doFrame() { _sequences.tick(); // Handle any active animation - if (_activeAnimation) - _activeAnimation->update(); + animations_tick(); } // If the debugget flag is set, show the mouse position @@ -480,8 +486,10 @@ void Scene::doFrame() { _vm->_game->_fx = kTransitionNone; // Handle freeing animation if necessary - if (_activeAnimation && _activeAnimation->freeFlag()) - _freeAnimationFlag = true; + for (int i = 0; i < 10; i++) { + if (_animation[i] && _animation[i]->freeFlag()) + _freeAnimationFlag = true; + } if (_freeAnimationFlag) freeAnimation(); } @@ -605,19 +613,29 @@ void Scene::checkKeyboard() { } } -void Scene::loadAnimation(const Common::String &resName, int trigger) { +int Scene::loadAnimation(const Common::String &resName, int trigger) { // WORKAROUND: If there's already a previous active animation used by the // scene, then free it before we create the new one - if (_activeAnimation) - freeAnimation(); + if ((_vm->getGameID() == GType_RexNebular) && _animation[0]) + freeAnimation(0); DepthSurface depthSurface; UserInterface interfaceSurface(_vm); - _activeAnimation = Animation::init(_vm, this); - _activeAnimation->load(interfaceSurface, depthSurface, resName, - _vm->_dithering ? ANIMFLAG_DITHER : 0, nullptr, nullptr); - _activeAnimation->startAnimation(trigger); + for (int i = 0; i < 10; i++) { + if (!_animation[i]) { + _animation[i] = Animation::init(_vm, this); + _animation[i]->load(interfaceSurface, depthSurface, resName, + _vm->_dithering ? ANIMFLAG_DITHER : 0, nullptr, nullptr); + _animation[i]->startAnimation(trigger); + + return i; + } + } + + error("Unable to find an available animation slot"); + + return -1; } void Scene::updateCursor() { @@ -658,9 +676,12 @@ void Scene::freeCurrentScene() { delete _animationData; _animationData = nullptr; } - if (_activeAnimation) { - delete _activeAnimation; - _activeAnimation = nullptr; + + for (int i = 0; i < 10; i++) { + if (_animation[i]) { + delete _animation[i]; + _animation[i] = nullptr; + } } _vm->_palette->_paletteUsage.load(nullptr); @@ -692,33 +713,40 @@ void Scene::resetScene() { } void Scene::freeAnimation() { - if (_activeAnimation) { - Player &player = _vm->_game->_player; + for (int j = 0; j < 10; j++) + freeAnimation(j); - if (!_freeAnimationFlag) { - _spriteSlots.fullRefresh(true); - _sequences.scan(); - } + _freeAnimationFlag = false; +} + +void Scene::freeAnimation(int idx) { + if (_animation[idx]) { + if (idx == 0) { + Player &player = _vm->_game->_player; + + if (!_freeAnimationFlag) { + _spriteSlots.fullRefresh(true); + _sequences.scan(); + } - // Refresh the player - if (player._visible) { - player._forceRefresh = true; - player.update(); + // Refresh the player + if (player._visible) { + player._forceRefresh = true; + player.update(); + } } // Remove any kernel messages in use by the animation - for (uint i = 0; i < _activeAnimation->_messages.size(); ++i) { - int msgIndex = _activeAnimation->_messages[i]._kernelMsgIndex; + for (uint i = 0; i < _animation[idx]->_messages.size(); ++i) { + int msgIndex = _animation[idx]->_messages[i]._kernelMsgIndex; if (msgIndex >= 0) _kernelMessages.remove(msgIndex); } // Delete the animation - delete _activeAnimation; - _activeAnimation = nullptr; + delete _animation[idx]; + _animation[idx] = nullptr; } - - _freeAnimationFlag = false; } void Scene::synchronize(Common::Serializer &s) { @@ -729,7 +757,107 @@ void Scene::synchronize(Common::Serializer &s) { s.syncAsByte(_roomChanged); s.syncAsUint16LE(_nextSceneId); s.syncAsUint16LE(_priorSceneId); + s.syncAsSint16LE(_variant); _dynamicHotspots.synchronize(s); } +void Scene::setAnimFrame(int id, int val) { + if ((id >= 0) && _animation[id]) + _animation[id]->setCurrentFrame(val); +} + +int Scene::getAnimFrame(int id) { + if ((id >= 0) && _animation[id]) + return _animation[id]->getCurrentFrame(); + + return -1; +} + +void Scene::setDynamicAnim(int id, int anim_id, int segment) { + if (id >= 0 && id <= DYNAMIC_HOTSPOTS_SIZE && _animation[anim_id]) { + _animation[anim_id]->_dynamicHotspotIndex = id; + if (_dynamicHotspots[id]._animIndex < 0) + _dynamicHotspots[id]._active = false; + _dynamicHotspots[id]._animIndex = anim_id; + + // TODO: Anim segments + + // NOTE: Only remove the TODO below when _dynamicHotspotIndex + // in the Animation class is actually used in the engine! + + warning("TODO: Scene::setDynamicAnim"); + } +} + +void Scene::setCamera(Common::Point pos) { + _posAdjust = pos; + warning("setCamera: Incomplete function"); +} + +void Scene::drawToBackground(int spriteId, int frameId, Common::Point pos, int depth, int scale) { + SpriteAsset &asset = *_sprites[spriteId]; + + if (pos.x == -32000) + pos.x = asset.getFramePos(frameId - 1).x; + if (pos.y == -32000) + pos.y = asset.getFramePos(frameId - 1).y; + + int slotIndex = _spriteSlots.add(); + SpriteSlot &slot = _spriteSlots[slotIndex]; + slot._spritesIndex = spriteId; + slot._frameNumber = frameId; + slot._seqIndex = 1; + slot._position = pos; + slot._depth = depth; + slot._scale = scale; + slot._flags = IMG_DELTA; +} + +void Scene::deleteSequence(int idx) { + if (_sequences[idx]._active && _sequences[idx]._dynamicHotspotIndex >= 0) + _dynamicHotspots.remove(_sequences[idx]._dynamicHotspotIndex); + + _sequences[idx]._active = false; + + if (!_sequences[idx]._doneFlag) { + warning("TODO: deleteSequence: Sequence %d not done", idx); + // TODO: This is wrong, and crashes Phantom at scene 102 when the door is opened + //doFrame(); // FIXME/CHECKME: Is this correct? + } else { + _sequences.remove(idx); + } +} + +void Scene::loadSpeech(int idx) { + _vm->_audio->setDefaultSoundGroup(); + // NOTE: The original actually preloads the speech sample here, but the samples + // are so small that it's not really worth it... + + // TODO: As the speech samples aren't cached anymore, _speechReady should be remove + _speechReady = idx; +} + +void Scene::playSpeech(int idx) { + _vm->_audio->stop(); + _vm->_audio->playSound(idx - 1); +} + +void Scene::sceneScale(int yFront, int maxScale, int yBack, int minScale) { + _sceneInfo->_yBandsEnd = yFront; + _sceneInfo->_maxScale = maxScale; + _sceneInfo->_yBandsStart = yBack; + _sceneInfo->_minScale = minScale; + + _bandsRange = _sceneInfo->_yBandsEnd - _sceneInfo->_yBandsStart; + _scaleRange = _sceneInfo->_maxScale - _sceneInfo->_minScale; +} + +void Scene::animations_tick() { + //warning("TODO: Implement _animations as an AnimationList and refactor (and check implementation)"); + for (int i = 0; i < 10; i++) { + if (_animation[i]) + _animation[i]->update(); + } +} + } // End of namespace MADS diff --git a/engines/mads/scene.h b/engines/mads/scene.h index c0784c3812..79e0fd4029 100644 --- a/engines/mads/scene.h +++ b/engines/mads/scene.h @@ -111,7 +111,7 @@ public: Common::Array<PaletteCycle> _paletteCycles; Common::StringArray _vocabStrings; Animation *_animationData; - Animation *_activeAnimation; + Animation *_animation[10]; bool _freeAnimationFlag; int _depthStyle; int _bandsRange; @@ -128,7 +128,6 @@ public: Common::Point _customDest; Common::Array<PaletteUsage::UsageEntry> _paletteUsageF; Common::Array<PaletteUsage::UsageEntry> _scenePaletteUsage; - /** * Constructor */ @@ -214,7 +213,7 @@ public: /** * Load an animation */ - void loadAnimation(const Common::String &resName, int trigger = 0); + int loadAnimation(const Common::String &resName, int trigger = 0); /** * Returns a vocab entry @@ -245,9 +244,28 @@ public: void freeAnimation(); /** + * Frees any given active animation for the scene + */ + void freeAnimation(int idx); + + /** * Synchronize the game */ void synchronize(Common::Serializer &s); + + void setAnimFrame(int id, int val); + int getAnimFrame(int id); + + void setDynamicAnim(int id, int anim_id, int segment); + void setCamera(Common::Point pos); + void drawToBackground(int spriteId, int frameId, Common::Point pos, int depth, int scale); + void deleteSequence(int idx); + void loadSpeech(int idx); + void playSpeech(int idx); + void sceneScale(int yFront, int maxScale, int yBack, int minScale); + void animations_tick(); + + int _speechReady; }; } // End of namespace MADS diff --git a/engines/mads/scene_data.cpp b/engines/mads/scene_data.cpp index e48bcd8c6f..7b0e64c1fe 100644 --- a/engines/mads/scene_data.cpp +++ b/engines/mads/scene_data.cpp @@ -108,7 +108,7 @@ SceneInfo::SceneInfo(MADSEngine *vm) : _vm(vm) { _minScale = 0; _field4A = 0; _usageIndex = 0; - for (int i = 0; i < 15; ++i) + for (int i = 0; i < DEPTH_BANDS_SIZE; ++i) _depthList[i] = 0; } @@ -145,6 +145,15 @@ void SceneInfo::load(int sceneId, int variant, const Common::String &resName, // Read in basic data Common::SeekableReadStream *infoStream = infoPack.getItemStream(0); + + /* + byte *data = new byte[infoStream->size()]; + infoStream->read(data, infoStream->size()); + Common::hexdump(data, infoStream->size()); + infoStream->seek(0); + delete[] data; + */ + if (_vm->getGameID() == GType_RexNebular) { _sceneId = infoStream->readUint16LE(); } else { @@ -161,22 +170,28 @@ void SceneInfo::load(int sceneId, int variant, const Common::String &resName, _height = infoStream->readUint16LE(); infoStream->skip(24); - - nodeCount = infoStream->readUint16LE(); - _yBandsEnd = infoStream->readUint16LE(); - _yBandsStart = infoStream->readUint16LE(); - _maxScale = infoStream->readUint16LE(); - _minScale = infoStream->readUint16LE(); - for (int i = 0; i < DEPTH_BANDS_SIZE; ++i) - _depthList[i] = infoStream->readUint16LE(); - _field4A = infoStream->readUint16LE(); } else { _artFileNum = sceneId; _depthStyle = 0; _width = 320; _height = 156; - infoStream->skip(140); + infoStream->skip(98); + } + + nodeCount = infoStream->readUint16LE(); + _yBandsEnd = infoStream->readUint16LE(); + _yBandsStart = infoStream->readUint16LE(); + _maxScale = infoStream->readUint16LE(); + _minScale = infoStream->readUint16LE(); + for (int i = 0; i < DEPTH_BANDS_SIZE; ++i) + _depthList[i] = infoStream->readUint16LE(); + _field4A = infoStream->readUint16LE(); + + // HACK for V2 games + if (_vm->getGameID() != GType_RexNebular) { + _minScale = _maxScale = 100; + memset(_depthList, 0, DEPTH_BANDS_SIZE * sizeof(int)); } // Load the scene's walk nodes @@ -184,27 +199,29 @@ void SceneInfo::load(int sceneId, int variant, const Common::String &resName, WalkNode node; node.load(infoStream); - if (i < nodeCount) + if (i < nodeCount) { _nodes.push_back(node); + //debug("Node %d: %d,%d", i, node._walkPos.x, node._walkPos.y); + } } - int spriteSetsCount = infoStream->readUint16LE(); - int spriteInfoCount = infoStream->readUint16LE(); - - // Load in sprite sets Common::StringArray setNames; - for (int i = 0; i < 10; ++i) { - char name[64]; - infoStream->read(name, 64); - - if (i < spriteSetsCount) - setNames.push_back(Common::String(name)); - } - - // Load in sprite draw information Common::Array<SpriteInfo> spriteInfo; - // TODO: The following isn't quite right for V2 games + if (_vm->getGameID() == GType_RexNebular) { + int spriteSetsCount = infoStream->readUint16LE(); + int spriteInfoCount = infoStream->readUint16LE(); + + // Load in sprite sets + for (int i = 0; i < 10; ++i) { + char name[64]; + infoStream->read(name, 64); + + if (i < spriteSetsCount) + setNames.push_back(Common::String(name)); + } + + // Load in sprite draw information for (int i = 0; i < 50; ++i) { SpriteInfo info; info.load(infoStream); @@ -212,6 +229,12 @@ void SceneInfo::load(int sceneId, int variant, const Common::String &resName, if (i < spriteInfoCount) spriteInfo.push_back(info); } + } else { + uint16 shadowColors = infoStream->readUint16LE(); + uint16 shadowR = infoStream->readUint16LE(); + uint16 shadowG = infoStream->readUint16LE(); + uint16 shadowB = infoStream->readUint16LE(); + debug("Shadow colors: %d (%d, %d, %d)", shadowColors, shadowR, shadowG, shadowB); } delete infoStream; @@ -422,6 +445,18 @@ void SceneInfo::loadMadsV2Background(int sceneId, const Common::String &resName, assert(screenWidth == _width); assert(screenHeight <= _height); + // Resize the background surface to hold all of the tiles + uint16 newWidth = bgSurface.w; + uint16 newHeight = bgSurface.h; + + if (tileWidth < screenWidth && bgSurface.w != tileCount * tileWidth) + newWidth = tileCount * tileWidth; + if (tileHeight < screenHeight && bgSurface.h != tileCount * tileHeight) + newHeight = tileCount * tileHeight; + + if (bgSurface.w != newWidth || bgSurface.h != newHeight) + bgSurface.setSize(newWidth, newHeight); + // -------------------------------------------------------------------------------- // Get tile data @@ -474,6 +509,8 @@ void SceneInfo::loadMadsV2Background(int sceneId, const Common::String &resName, } tileSet.clear(); tileDataFile.close(); + + delete[] tileMap; } /*------------------------------------------------------------------------*/ diff --git a/engines/mads/screen.cpp b/engines/mads/screen.cpp index 3c27001ae0..90fbbe7e2a 100644 --- a/engines/mads/screen.cpp +++ b/engines/mads/screen.cpp @@ -687,7 +687,6 @@ void ScreenSurface::panTransition(MSurface &newScreen, byte *palData, int entryS int y1, y2; int startX = 0; int deltaX; - int xAt; int loopStart; // uint32 baseTicks, currentTicks; byte paletteMap[256]; @@ -720,7 +719,7 @@ void ScreenSurface::panTransition(MSurface &newScreen, byte *palData, int entryS loopStart = throughBlack == THROUGH_BLACK1 ? 0 : 1; for (int loop = loopStart; loop < 2; ++loop) { - xAt = startX; + int xAt = startX; for (int xCtr = 0; xCtr < size.x; ++xCtr, xAt += deltaX) { if (!loop) { fillRect(Common::Rect(xAt + destPos.x, y1 + destPos.y, @@ -732,7 +731,7 @@ void ScreenSurface::panTransition(MSurface &newScreen, byte *palData, int entryS srcPos.x + xAt + 1, srcPos.y + size.y)); } else { newScreen.copyRectToSurface(*this, xAt, destPos.y, - Common::Rect(srcPos.x + xAt, srcPos.y, + Common::Rect(srcPos.x + xAt, srcPos.y, srcPos.x + xAt + 1, srcPos.y + size.y)); } @@ -778,8 +777,8 @@ void ScreenSurface::swapForeground(byte newPalette[PALETTE_SIZE], byte *paletteM Common::Rect oldClip = _clipBounds; resetClipBounds(); - - copyRectTranslate(*this, oldMap, Common::Point(0, 0), + + copyRectTranslate(*this, oldMap, Common::Point(0, 0), Common::Rect(0, 0, MADS_SCREEN_WIDTH, MADS_SCREEN_HEIGHT)); palette.setFullPalette(oldPalette); @@ -789,9 +788,9 @@ void ScreenSurface::swapForeground(byte newPalette[PALETTE_SIZE], byte *paletteM /** * Translates a given palette into a mapping table. * Palettes consist of 128 RGB entries for the foreground and background - * respectively, with the two interleaved together. So the start + * respectively, with the two interleaved together. So the start */ -void ScreenSurface::swapPalette(const byte *palData, byte swapTable[PALETTE_COUNT], +void ScreenSurface::swapPalette(const byte *palData, byte swapTable[PALETTE_COUNT], bool foreground) { int start = foreground ? 1 : 0; const byte *dynamicList = &palData[start * RGB_SIZE]; @@ -807,7 +806,7 @@ void ScreenSurface::swapPalette(const byte *palData, byte swapTable[PALETTE_COUN // Handle the 128 palette entries for the foreground or background for (int idx = 0; idx < (PALETTE_COUNT / 2); ++idx) { if (start >= PALETTE_START && start <= PALETTE_END) { - swapTable[start] = Palette::closestColor(dynamicList, staticList, + swapTable[start] = Palette::closestColor(dynamicList, staticList, 2 * RGB_SIZE, PALETTE_COUNT / 2) * 2 + staticStart; } diff --git a/engines/mads/sequence.cpp b/engines/mads/sequence.cpp index e5bf1631c2..50b37de7ea 100644 --- a/engines/mads/sequence.cpp +++ b/engines/mads/sequence.cpp @@ -259,7 +259,7 @@ bool SequenceList::loadSprites(int seqIndex) { } if (seqEntry._flags & 2) { - // Check for object having moved off-scren + // Check for object having moved off-screen if ((pt.x + width) < 0 || (pt.x + width) >= MADS_SCREEN_WIDTH || pt.y < 0 || (pt.y - height) >= MADS_SCENE_HEIGHT) { result = true; @@ -550,4 +550,26 @@ void SequenceList::setMotion(int seqIndex, int flags, int deltaX, int deltaY) { se._posAccum.x = se._posAccum.y = 0; } +int SequenceList::addStampCycle(int srcSpriteIdx, bool flipped, int sprite) { + int id; + + id = addSpriteCycle(srcSpriteIdx, flipped, 32767, 0, 0, 0); + if (id >= 0) { + setAnimRange(id, sprite, sprite); + _entries[id]._animType = ANIMTYPE_STAMP; + } + return (id); +} + +void SequenceList::setSeqPlayer(int idx, bool flag) { + Player &player = _vm->_game->_player; + int yp = player._playerPos.y + (player._centerOfGravity * player._currentScale) / 100; + setPosition(idx, Common::Point(player._playerPos.x, yp)); + setDepth(idx, player._currentDepth); + setScale(idx, player._currentScale); + + if (flag) + _vm->_game->syncTimers(SYNC_SEQ, idx, SYNC_PLAYER, 0); +} + } // End of namespace diff --git a/engines/mads/sequence.h b/engines/mads/sequence.h index c3a277c5a5..05a7b616aa 100644 --- a/engines/mads/sequence.h +++ b/engines/mads/sequence.h @@ -38,7 +38,7 @@ enum SequenceTrigger { SEQUENCE_TRIGGER_SPRITE = 2 // Trigger when sequence reaches specific sprite }; -enum SpriteAnimType { ANIMTYPE_NONE = 0, ANIMTYPE_CYCLED = 1, ANIMTYPE_PING_PONG = 2 }; +enum SpriteAnimType { ANIMTYPE_NONE = 0, ANIMTYPE_CYCLED = 1, ANIMTYPE_PING_PONG = 2, ANIMTYPE_STAMP = 9 }; #define SEQUENCE_ENTRY_SUBSET_MAX 5 @@ -125,6 +125,9 @@ public: void setMsgLayout(int seqIndex); void setDone(int seqIndex); void setMotion(int seqIndex, int flags, int deltaX, int deltaY); + + int addStampCycle(int srcSpriteIdx, bool flipped, int sprite); + void setSeqPlayer(int idx, bool flag); }; } // End of namespace MADS diff --git a/engines/mads/sound.cpp b/engines/mads/sound.cpp index 4a35edb80f..c96fd01882 100644 --- a/engines/mads/sound.cpp +++ b/engines/mads/sound.cpp @@ -39,6 +39,8 @@ SoundManager::SoundManager(MADSEngine *vm, Audio::Mixer *mixer) { _newSoundsPaused = false; _masterVolume = 255; + _preferRoland = false; + _opl = OPL::Config::create(); _opl->init(); diff --git a/engines/mads/sound.h b/engines/mads/sound.h index 9882f65e5a..a9cdeddb37 100644 --- a/engines/mads/sound.h +++ b/engines/mads/sound.h @@ -48,6 +48,8 @@ public: SoundManager(MADSEngine *vm, Audio::Mixer *mixer); ~SoundManager(); + bool _preferRoland; + /** * Initializes the sound driver for a given game section */ diff --git a/engines/mads/user_interface.cpp b/engines/mads/user_interface.cpp index 62fd036c03..e4b09ff54c 100644 --- a/engines/mads/user_interface.cpp +++ b/engines/mads/user_interface.cpp @@ -733,7 +733,7 @@ void UserInterface::loadElements() { _categoryIndexes[CAT_HOTSPOT - 1] = _vm->_game->_screenObjects.size() + 1; for (int hotspotIdx = scene._hotspots.size() - 1; hotspotIdx >= 0; --hotspotIdx) { Hotspot &hs = scene._hotspots[hotspotIdx]; - ScreenObject *so = _vm->_game->_screenObjects.add(hs._bounds, SCREENMODE_VGA, + ScreenObject *so = _vm->_game->_screenObjects.add(hs._bounds, SCREENMODE_VGA, CAT_HOTSPOT, hotspotIdx); so->_active = hs._active; } diff --git a/engines/mads/user_interface.h b/engines/mads/user_interface.h index 1366aa2c32..60cc1f736d 100644 --- a/engines/mads/user_interface.h +++ b/engines/mads/user_interface.h @@ -191,8 +191,6 @@ private: */ void writeVocab(ScrCategory category, int id); - void refresh(); - void updateRect(const Common::Rect &bounds); public: MSurface _surface; @@ -304,6 +302,8 @@ public: * Synchronize the data */ void synchronize(Common::Serializer &s); + + void refresh(); }; } // End of namespace MADS diff --git a/engines/mortevielle/utils.cpp b/engines/mortevielle/utils.cpp index cbc22e4886..651bd5bf57 100644 --- a/engines/mortevielle/utils.cpp +++ b/engines/mortevielle/utils.cpp @@ -1728,12 +1728,12 @@ void MortevielleEngine::showMoveMenuAlert() { void MortevielleEngine::showConfigScreen() { // FIXME: need a DOS palette, index 9 (light blue). Also we should show DOS font here Common::String tmpStr; - int width, cy = 0; + int cy = 0; clearScreen(); do { ++cy; tmpStr = getString(cy + kStartingScreenStringIndex); - width = _screenSurface->getStringWidth(tmpStr); + int width = _screenSurface->getStringWidth(tmpStr); _text->displayStr(tmpStr, 320 - width / 2, cy * 8, 80, 1, 2); } while (cy != 20); diff --git a/engines/prince/graphics.cpp b/engines/prince/graphics.cpp index f556d81eab..3482d79f69 100644 --- a/engines/prince/graphics.cpp +++ b/engines/prince/graphics.cpp @@ -375,30 +375,30 @@ byte GraphicsMan::getBlendTableColor(byte pixelColor, byte backgroundPixelColor, const byte *originalPalette = _vm->_roomBmp->getPalette(); int redFirstOrg = originalPalette[pixelColor * 3] * _vm->_mst_shadow / 256; - CLIP(redFirstOrg, 0, 255); + redFirstOrg = CLIP(redFirstOrg, 0, 255); if (_vm->_mst_shadow <= 256) { int redFirstBack = originalPalette[backgroundPixelColor * 3] * (256 - _vm->_mst_shadow) / 256; - CLIP(redFirstBack, 0, 255); + redFirstBack = CLIP(redFirstBack, 0, 255); redFirstOrg += redFirstBack; - CLIP(redFirstOrg, 0, 255); + redFirstOrg = CLIP(redFirstOrg, 0, 255); } int greenFirstOrg = originalPalette[pixelColor * 3 + 1] * _vm->_mst_shadow / 256; - CLIP(greenFirstOrg, 0, 255); + greenFirstOrg = CLIP(greenFirstOrg, 0, 255); if (_vm->_mst_shadow <= 256) { int greenFirstBack = originalPalette[backgroundPixelColor * 3 + 1] * (256 - _vm->_mst_shadow) / 256; - CLIP(greenFirstBack, 0, 255); + greenFirstBack = CLIP(greenFirstBack, 0, 255); greenFirstOrg += greenFirstBack; - CLIP(greenFirstOrg, 0, 255); + greenFirstOrg = CLIP(greenFirstOrg, 0, 255); } int blueFirstOrg = originalPalette[pixelColor * 3 + 2] * _vm->_mst_shadow / 256; - CLIP(blueFirstOrg, 0, 255); + blueFirstOrg = CLIP(blueFirstOrg, 0, 255); if (_vm->_mst_shadow <= 256) { int blueFirstBack = originalPalette[backgroundPixelColor * 3 + 2] * (256 - _vm->_mst_shadow) / 256; - CLIP(blueFirstBack, 0, 255); + blueFirstBack = CLIP(blueFirstBack, 0, 255); blueFirstOrg += blueFirstBack; - CLIP(blueFirstOrg, 0, 255); + blueFirstOrg = CLIP(blueFirstOrg, 0, 255); } int bigValue = PrinceEngine::kIntMax; // infinity diff --git a/engines/scumm/dialogs.cpp b/engines/scumm/dialogs.cpp index c22525b6f2..21c7428621 100644 --- a/engines/scumm/dialogs.cpp +++ b/engines/scumm/dialogs.cpp @@ -308,6 +308,8 @@ void HelpDialog::reflowLayout() { int16 x, y; uint16 w, h; + assert(lineHeight); + g_gui.xmlEval()->getWidgetData("ScummHelp.HelpText", x, y, w, h); // Make sure than we don't have more lines than what we can fit diff --git a/engines/scumm/he/logic/puttrace.cpp b/engines/scumm/he/logic/puttrace.cpp index 1c3317b131..ba62c118fe 100644 --- a/engines/scumm/he/logic/puttrace.cpp +++ b/engines/scumm/he/logic/puttrace.cpp @@ -256,7 +256,7 @@ int32 LogicHErace::op_1102(int32 *args) { } int32 LogicHErace::op_1103(int32 *args) { - double angle = args[0] / args[1] * DEG2RAD; + double angle = (double)args[0] / (double)args[1] * DEG2RAD; writeScummVar(108, (int32)(sin(angle) * args[2])); writeScummVar(109, (int32)(cos(angle) * args[2])); diff --git a/engines/scumm/players/player_v2.cpp b/engines/scumm/players/player_v2.cpp index f0aaa4a3be..c7ebd8abff 100644 --- a/engines/scumm/players/player_v2.cpp +++ b/engines/scumm/players/player_v2.cpp @@ -77,7 +77,7 @@ void Player_V2::setMusicVolume (int vol) { vol = 255; /* scale to int16, FIXME: find best value */ - double out = vol * 128 / 3; + double out = vol * 128.0 / 3.0; /* build volume table (2dB per step) */ for (int i = 0; i < 15; i++) { diff --git a/engines/sherlock/decompress.cpp b/engines/sherlock/decompress.cpp deleted file mode 100644 index 8e02da3212..0000000000 --- a/engines/sherlock/decompress.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "sherlock/decompress.h" - -namespace Sherlock { - -/** - * Decompresses an LZW compressed resource. If no outSize is specified, it will - * decompress the entire resource. If, however, an explicit size is specified, - * then it means we're already within a resource, and only want to decompress - * part of it. - */ -Common::SeekableReadStream *decompressLZ(Common::SeekableReadStream &source, int32 outSize) { - if (outSize == -1) { - source.seek(5); - outSize = source.readSint32LE(); - } - - byte lzWindow[4096]; - uint16 lzWindowPos; - uint16 cmd; - - byte *outBuffer = new byte[outSize]; - byte *outBufferEnd = outBuffer + outSize; - Common::MemoryReadStream *outS = new Common::MemoryReadStream(outBuffer, outSize, DisposeAfterUse::YES); - - memset(lzWindow, 0xFF, 0xFEE); - lzWindowPos = 0xFEE; - cmd = 0; - - do { - cmd >>= 1; - if (!(cmd & 0x100)) - cmd = source.readByte() | 0xFF00; - - if (cmd & 1) { - byte literal = source.readByte(); - *outBuffer++ = literal; - lzWindow[lzWindowPos] = literal; - lzWindowPos = (lzWindowPos + 1) & 0x0FFF; - } else { - int copyPos, copyLen; - copyPos = source.readByte(); - copyLen = source.readByte(); - copyPos = copyPos | ((copyLen & 0xF0) << 4); - copyLen = (copyLen & 0x0F) + 3; - while (copyLen--) { - byte literal = lzWindow[copyPos]; - copyPos = (copyPos + 1) & 0x0FFF; - *outBuffer++ = literal; - lzWindow[lzWindowPos] = literal; - lzWindowPos = (lzWindowPos + 1) & 0x0FFF; - } - } - } while (outBuffer < outBufferEnd); - - return outS; -} - - -/** - * Decompresses a Rose Tattoo resource - * -Common::SeekableReadStream *decompress32(Common::SeekableReadStream &source, int32 outSize) { - if (outSize == -1) { - outSize = source.readSint32LE(); - } - - byte lzWindow[8192]; - byte *outBuffer = new byte[outSize]; - byte *outBufferEnd = outBuffer + outSize; - Common::MemoryReadStream *outS = new Common::MemoryReadStream(outBuffer, outSize, DisposeAfterUse::YES); - - memset(lzWindow, 0xFF, 8192); - int lzWindowPos = 0xFEE; - int cmd = 0; - - do { - cmd >>= 1; - if (!(cmd & 0x100)) - cmd = source.readByte() | 0xFF00; - - if (cmd & 1) { - byte literal = source.readByte(); - *outBuffer++ = literal; - lzWindow[lzWindowPos] = literal; - lzWindowPos = (lzWindowPos + 1) & 0x0FFF; - } else { - int copyPos, copyLen; - copyPos = source.readByte(); - copyLen = source.readByte(); - copyPos = copyPos | ((copyLen & 0xF0) << 4); - copyLen = (copyLen & 0x0F) + 3; - while (copyLen--) { - byte literal = lzWindow[copyPos]; - copyPos = (copyPos + 1) & 0x0FFF; - *outBuffer++ = literal; - lzWindow[lzWindowPos] = literal; - lzWindowPos = (lzWindowPos + 1) & 0x0FFF; - } - } - } while (outBuffer < outBufferEnd); - - return outS; -} -*/ - -} // namespace Sherlock diff --git a/engines/sherlock/music.cpp b/engines/sherlock/music.cpp index 8b8f359de3..43b7275f2d 100644 --- a/engines/sherlock/music.cpp +++ b/engines/sherlock/music.cpp @@ -518,7 +518,6 @@ void Music::freeSong() { _midiParser->unloadMusic(); } - delete[] _midiMusicData; _midiMusicData = nullptr; _musicPlaying = false; } diff --git a/engines/sherlock/scalpel/scalpel_debugger.cpp b/engines/sherlock/scalpel/scalpel_debugger.cpp index 7f5e1efa69..1495c76b43 100644 --- a/engines/sherlock/scalpel/scalpel_debugger.cpp +++ b/engines/sherlock/scalpel/scalpel_debugger.cpp @@ -42,7 +42,7 @@ bool ScalpelDebugger::cmd3DO_PlayMovie(int argc, const char **argv) { return true; } - // play gets postboned until debugger is closed + // play gets postponed until debugger is closed Common::String filename = argv[1]; _3doPlayMovieFile = filename; diff --git a/engines/sherlock/talk.cpp b/engines/sherlock/talk.cpp index e9c52276f6..b239fd9fb7 100644 --- a/engines/sherlock/talk.cpp +++ b/engines/sherlock/talk.cpp @@ -994,6 +994,10 @@ OpcodeReturn Talk::cmdAdjustObjectSequence(const byte *&str) { _seqCount = str[1]; str += (str[0] & 127) + 2; + // WORKAROUND: Original German Scalpel crash when moving box at Tobacconists + if (_vm->getLanguage() == Common::DE_DEU && _scriptName == "Alfr30Z") + _seqCount = 16; + // Copy in the new sequence for (int idx = 0; idx < _seqCount; ++idx, ++str) scene._bgShapes[objId]._sequences[idx] = str[0] - 1; diff --git a/engines/sword25/detection_tables.h b/engines/sword25/detection_tables.h index 644b8ef366..b58f430fcf 100644 --- a/engines/sword25/detection_tables.h +++ b/engines/sword25/detection_tables.h @@ -29,7 +29,7 @@ static const ADGameDescription gameDescriptions[] = { AD_ENTRY1s("data.b25c", "f8b6e03ada2d2f6cf27fbc11ad1572e9", 654310588), Common::EN_ANY, Common::kPlatformUnknown, - ADGF_UNSTABLE, + ADGF_TESTING, GUIO1(GUIO_NOASPECT) }, { @@ -38,7 +38,7 @@ static const ADGameDescription gameDescriptions[] = { AD_ENTRY1s("lang_fr.b25c", "690caf157387e06d2c3d1ca53c43f428", 1006043), Common::FR_FRA, Common::kPlatformUnknown, - ADGF_UNSTABLE, + ADGF_TESTING, GUIO1(GUIO_NOASPECT) }, { @@ -47,7 +47,7 @@ static const ADGameDescription gameDescriptions[] = { AD_ENTRY1s("data.b25c", "f8b6e03ada2d2f6cf27fbc11ad1572e9", 654310588), Common::DE_DEU, Common::kPlatformUnknown, - ADGF_UNSTABLE, + ADGF_TESTING, GUIO1(GUIO_NOASPECT) }, { @@ -56,7 +56,7 @@ static const ADGameDescription gameDescriptions[] = { AD_ENTRY1s("lang_hr.b25c", "e881054d1f8ec1e527422fc521c25405", 1273217), Common::HR_HRV, Common::kPlatformUnknown, - ADGF_UNSTABLE, + ADGF_TESTING, GUIO1(GUIO_NOASPECT) }, { @@ -65,7 +65,7 @@ static const ADGameDescription gameDescriptions[] = { AD_ENTRY1s("lang_it.b25c", "f3325666da0515cc2b42062e953c0889", 996197), Common::IT_ITA, Common::kPlatformUnknown, - ADGF_UNSTABLE, + ADGF_TESTING, GUIO1(GUIO_NOASPECT) }, { @@ -74,7 +74,7 @@ static const ADGameDescription gameDescriptions[] = { AD_ENTRY1s("lang_pl.b25c", "49dc1a20f95391a808e475c49be2bac0", 1281799), Common::PL_POL, Common::kPlatformUnknown, - ADGF_UNSTABLE, + ADGF_TESTING, GUIO1(GUIO_NOASPECT) }, { @@ -83,7 +83,7 @@ static const ADGameDescription gameDescriptions[] = { AD_ENTRY1s("lang_pt.b25c", "1df701432f9e13dcefe1adeb890b9c69", 993812), Common::PT_BRA, Common::kPlatformUnknown, - ADGF_UNSTABLE, + ADGF_TESTING, GUIO1(GUIO_NOASPECT) }, { @@ -92,7 +92,7 @@ static const ADGameDescription gameDescriptions[] = { AD_ENTRY1s("lang_ru.b25c", "deb33dd2f90a71ff60181918a8ce5063", 1235378), Common::RU_RUS, Common::kPlatformUnknown, - ADGF_UNSTABLE, + ADGF_TESTING, GUIO1(GUIO_NOASPECT) }, { @@ -101,7 +101,7 @@ static const ADGameDescription gameDescriptions[] = { AD_ENTRY1s("lang_es.b25c", "384c19072d83725f351bb9ecb4d3f02b", 987965), Common::ES_ESP, Common::kPlatformUnknown, - ADGF_UNSTABLE, + ADGF_TESTING, GUIO1(GUIO_NOASPECT) }, // Hungarian "psylog" version. @@ -112,7 +112,7 @@ static const ADGameDescription gameDescriptions[] = { AD_ENTRY1s("lang_hu.b25c", "7de51a3b4926a192549e75b1a7d81667", 1864915), Common::HU_HUN, Common::kPlatformUnknown, - ADGF_UNSTABLE, + ADGF_TESTING, GUIO1(GUIO_NOASPECT) }, @@ -126,7 +126,7 @@ static const ADGameDescription gameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformUnknown, - GF_EXTRACTED | ADGF_UNSTABLE, + GF_EXTRACTED | ADGF_TESTING, GUIO1(GUIO_NOASPECT) }, @@ -138,7 +138,7 @@ static const ADGameDescription gameDescriptions[] = { AD_ENTRY1s("data.b25c", "880a8a67faf4a4e7ab62cf114b771428", 827397764), Common::EN_ANY, Common::kPlatformUnknown, - ADGF_UNSTABLE, + ADGF_TESTING, GUIO1(GUIO_NOASPECT) }, diff --git a/engines/sword25/gfx/animation.cpp b/engines/sword25/gfx/animation.cpp index e2662fb2b3..541c44662b 100644 --- a/engines/sword25/gfx/animation.cpp +++ b/engines/sword25/gfx/animation.cpp @@ -119,6 +119,10 @@ void Animation::initMembers() { _animationResourcePtr = 0; _animationTemplateHandle = 0; _framesLocked = false; + + _loopPointCallback = 0; + _actionCallback = 0; + _deleteCallback = 0; } Animation::~Animation() { diff --git a/engines/sword25/gfx/graphicengine.h b/engines/sword25/gfx/graphicengine.h index cf4289b8bb..cca87b491c 100644 --- a/engines/sword25/gfx/graphicengine.h +++ b/engines/sword25/gfx/graphicengine.h @@ -310,8 +310,6 @@ private: uint _frameTimeSampleSlot; private: - byte *_backBuffer; - RenderObjectPtr<Panel> _mainPanelPtr; Common::ScopedPtr<RenderObjectManager> _renderObjectManagerPtr; diff --git a/engines/testbed/testbed.cpp b/engines/testbed/testbed.cpp index 635fd09bac..885429cafd 100644 --- a/engines/testbed/testbed.cpp +++ b/engines/testbed/testbed.cpp @@ -152,6 +152,9 @@ void TestbedEngine::invokeTestsuites(TestbedConfigManager &cfMan) { Common::Point pt = Testsuite::getDisplayRegionCoordinates(); int numSuitesEnabled = cfMan.getNumSuitesEnabled(); + if (!numSuitesEnabled) + return; + for (iter = _testsuiteList.begin(); iter != _testsuiteList.end(); iter++) { if (shouldQuit()) { return; diff --git a/engines/testbed/testsuite.cpp b/engines/testbed/testsuite.cpp index 7729c4911b..853f1288b3 100644 --- a/engines/testbed/testsuite.cpp +++ b/engines/testbed/testsuite.cpp @@ -283,6 +283,9 @@ void Testsuite::execute() { pt.y += getLineSeparation(); int numEnabledTests = getNumTestsEnabled(); + if (!numEnabledTests) + return; + for (Common::Array<Test *>::iterator i = _testsToExecute.begin(); i != _testsToExecute.end(); ++i) { if (!(*i)->enabled) { logPrintf("Info! Skipping Test: %s, Skipped by configuration.\n", ((*i)->featureName).c_str()); diff --git a/engines/tinsel/tinsel.cpp b/engines/tinsel/tinsel.cpp index 6dc8e3bb35..77932a5cdf 100644 --- a/engines/tinsel/tinsel.cpp +++ b/engines/tinsel/tinsel.cpp @@ -528,8 +528,6 @@ void SetNewScene(SCNHANDLE scene, int entrance, int transition) { * Store a scene as hooked */ void SetHookScene(SCNHANDLE scene, int entrance, int transition) { - assert(g_HookScene.scene == 0); // scene already hooked - g_HookScene.scene = scene; g_HookScene.entry = entrance; g_HookScene.trans = transition; diff --git a/engines/voyeur/voyeur.cpp b/engines/voyeur/voyeur.cpp index dad634c9bb..cbb6846340 100644 --- a/engines/voyeur/voyeur.cpp +++ b/engines/voyeur/voyeur.cpp @@ -33,8 +33,6 @@ namespace Voyeur { -VoyeurEngine *g_vm; - VoyeurEngine::VoyeurEngine(OSystem *syst, const VoyeurGameDescription *gameDesc) : Engine(syst), _gameDescription(gameDesc), _randomSource("Voyeur"), _defaultFontInfo(3, 0xff, 0xff, 0, 0, ALIGN_LEFT, 0, Common::Point(), 1, 1, diff --git a/engines/wintermute/ad/ad_game.cpp b/engines/wintermute/ad/ad_game.cpp index 3c4383f55e..df0328ce5e 100644 --- a/engines/wintermute/ad/ad_game.cpp +++ b/engines/wintermute/ad/ad_game.cpp @@ -2261,7 +2261,7 @@ bool AdGame::onMouseRightUp() { bool AdGame::displayDebugInfo() { char str[100]; if (_gameRef->_debugDebugMode) { - sprintf(str, "Mouse: %d, %d (scene: %d, %d)", _mousePos.x, _mousePos.y, _mousePos.x + _scene->getOffsetLeft(), _mousePos.y + _scene->getOffsetTop()); + sprintf(str, "Mouse: %d, %d (scene: %d, %d)", _mousePos.x, _mousePos.y, _mousePos.x + (_scene ? _scene->getOffsetLeft() : 0), _mousePos.y + (_scene ? _scene->getOffsetTop() : 0)); _systemFont->drawText((byte *)str, 0, 90, _renderer->getWidth(), TAL_RIGHT); sprintf(str, "Scene: %s (prev: %s)", (_scene && _scene->getName()) ? _scene->getName() : "???", _prevSceneName ? _prevSceneName : "???"); diff --git a/engines/wintermute/base/file/base_save_thumb_file.cpp b/engines/wintermute/base/file/base_save_thumb_file.cpp index acd5363e89..54f7ee7c62 100644 --- a/engines/wintermute/base/file/base_save_thumb_file.cpp +++ b/engines/wintermute/base/file/base_save_thumb_file.cpp @@ -70,11 +70,12 @@ bool BaseSaveThumbFile::open(const Common::String &filename) { delete[] tempFilename; BasePersistenceManager *pm = new BasePersistenceManager(); - Common::String slotFilename = pm->getFilenameForSlot(slot); if (!pm) { return STATUS_FAILED; } + Common::String slotFilename = pm->getFilenameForSlot(slot); + if (DID_FAIL(pm->initLoad(slotFilename))) { delete pm; return STATUS_FAILED; |