diff options
Diffstat (limited to 'engines/access/amazon/amazon_scripts.cpp')
-rw-r--r-- | engines/access/amazon/amazon_scripts.cpp | 518 |
1 files changed, 518 insertions, 0 deletions
diff --git a/engines/access/amazon/amazon_scripts.cpp b/engines/access/amazon/amazon_scripts.cpp new file mode 100644 index 0000000000..d8f4663401 --- /dev/null +++ b/engines/access/amazon/amazon_scripts.cpp @@ -0,0 +1,518 @@ +/* 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 "access/access.h" +#include "access/resources.h" +#include "access/amazon/amazon_game.h" +#include "access/amazon/amazon_resources.h" +#include "access/amazon/amazon_scripts.h" + +namespace Access { + +namespace Amazon { + +AmazonScripts::AmazonScripts(AccessEngine *vm) : Scripts(vm) { + _game = (AmazonEngine *)_vm; + + setOpcodes_v2(); +} + +void AmazonScripts::cLoop() { + searchForSequence(); + _vm->_images.clear(); + _vm->_buffer2.blitFrom(_vm->_buffer1); + _vm->_oldRects.clear(); + _vm->_scripts->executeScript(); + _vm->plotList1(); + _vm->copyBlocks(); +} + +void AmazonScripts::mWhile1() { + _vm->_screen->setDisplayScan(); + _vm->_screen->fadeOut(); + _vm->_events->hideCursor(); + + _vm->_files->loadScreen(14, 0); + _vm->_buffer2.blitFrom(*_vm->_screen); + _vm->_buffer1.blitFrom(*_vm->_screen); + _vm->_events->showCursor(); + + _vm->_screen->setIconPalette(); + _vm->_screen->forceFadeIn(); + + Resource *spriteData = _vm->_files->loadFile(14, 6); + _vm->_objectsTable[0] = new SpriteResource(_vm, spriteData); + delete spriteData; + + _vm->_images.clear(); + _vm->_oldRects.clear(); + _sequence = 2100; + + do { + cLoop(); + _sequence = 2100; + } while (_vm->_flags[52] == 1); + + _vm->_buffer1.copyTo(_vm->_screen); + _vm->_buffer2.copyTo(&_vm->_buffer1); + + _game->establish(-1, 14); + + spriteData = _vm->_files->loadFile(14, 7); + _vm->_objectsTable[1] = new SpriteResource(_vm, spriteData); + delete spriteData; + + _vm->_sound->playSound(0); + _vm->_screen->setDisplayScan(); + _vm->_events->hideCursor(); + + _vm->_files->loadScreen(14, 1); + _vm->_screen->setPalette(); + _vm->_buffer2.blitFrom(*_vm->_screen); + _vm->_buffer1.blitFrom(*_vm->_screen); + _vm->_events->showCursor(); + + _vm->_screen->setIconPalette(); + _vm->_images.clear(); + _vm->_oldRects.clear(); + _sequence = 2200; + + _vm->_sound->loadSoundTable(0, 14, 15); + + do { + cLoop(); + _sequence = 2200; + } while (_vm->_flags[52] == 2); + + _vm->_screen->setDisplayScan(); + _vm->_events->hideCursor(); + + _vm->_files->loadScreen(14, 2); + _vm->_screen->setPalette(); + _vm->_buffer2.blitFrom(*_vm->_screen); + _vm->_buffer1.blitFrom(*_vm->_screen); + _vm->_events->showCursor(); + + _vm->_screen->setIconPalette(); + _vm->freeCells(); + + spriteData = _vm->_files->loadFile(14, 8); + _vm->_objectsTable[2] = new SpriteResource(_vm, spriteData); + delete spriteData; + + _vm->_images.clear(); + _vm->_oldRects.clear(); + _sequence = 2300; + _vm->_sound->playSound(0); + + do { + cLoop(); + _sequence = 2300; + } while (_vm->_flags[52] == 3); + + _vm->freeCells(); + spriteData = _vm->_files->loadFile(14, 9); + _vm->_objectsTable[3] = new SpriteResource(_vm, spriteData); + delete spriteData; + + _vm->_screen->setDisplayScan(); + _vm->_events->hideCursor(); + + _vm->_files->loadScreen(14, 3); + _vm->_screen->setPalette(); + _vm->_buffer2.blitFrom(*_vm->_screen); + _vm->_buffer1.blitFrom(*_vm->_screen); + _vm->_events->showCursor(); + + _vm->_screen->setIconPalette(); + _vm->_images.clear(); + _vm->_oldRects.clear(); + _sequence = 2400; + + do { + cLoop(); + _sequence = 2400; + } while (_vm->_flags[52] == 4); +} + +void AmazonScripts::mWhile2() { + _vm->_screen->setDisplayScan(); + _vm->_screen->fadeOut(); + _vm->_events->hideCursor(); + + _vm->_files->loadScreen(14, 0); + _vm->_buffer2.blitFrom(*_vm->_screen); + _vm->_buffer1.blitFrom(*_vm->_screen); + _vm->_events->showCursor(); + + _vm->_screen->setIconPalette(); + _vm->_screen->forceFadeIn(); + + Resource *spriteData = _vm->_files->loadFile(14, 6); + _vm->_objectsTable[0] = new SpriteResource(_vm, spriteData); + delete spriteData; + + _vm->_images.clear(); + _vm->_oldRects.clear(); + _sequence = 2100; + + do { + cLoop(); + _sequence = 2100; + } while (_vm->_flags[52] == 1); + + _vm->_screen->fadeOut(); + _vm->freeCells(); + spriteData = _vm->_files->loadFile(14, 9); + _vm->_objectsTable[3] = new SpriteResource(_vm, spriteData); + delete spriteData; + + _vm->_screen->setDisplayScan(); + _vm->_events->hideCursor(); + + _vm->_files->loadScreen(14, 3); + _vm->_screen->setPalette(); + _vm->_buffer2.blitFrom(*_vm->_screen); + _vm->_buffer1.blitFrom(*_vm->_screen); + _vm->_events->showCursor(); + + _vm->_screen->setIconPalette(); + _vm->_images.clear(); + _vm->_oldRects.clear(); + _sequence = 2400; + + do { + cLoop(); + _sequence = 2400; + } while (_vm->_flags[52] == 4); +} + +void AmazonScripts::mWhile(int param1) { + switch(param1) { + case 1: + mWhile1(); + break; + case 2: + _game->_plane->mWhileFly(); + break; + case 3: + _game->_plane->mWhileFall(); + break; + case 4: + _game->_jungle->mWhileJWalk(); + break; + case 5: + _game->_jungle->mWhileDoOpen(); + break; + case 6: + _game->_river->mWhileDownRiver(); + break; + case 7: + mWhile2(); + break; + case 8: + _game->_jungle->mWhileJWalk2(); + break; + default: + break; + } +} + +void AmazonScripts::loadBackground(int param1, int param2) { + _vm->_files->_setPaletteFlag = false; + _vm->_files->loadScreen(param1, param2); + + _vm->_buffer2.blitFrom(*_vm->_screen); + _vm->_buffer1.blitFrom(*_vm->_screen); + + _vm->_screen->forceFadeIn(); +} + +void AmazonScripts::loadNSound(int param1, int param2) { + Resource *sound = _vm->_files->loadFile(param1, param2); + _vm->_sound->_soundTable.push_back(SoundEntry(sound, 1)); +} + +void AmazonScripts::setInactive() { + _game->_rawInactiveX = _vm->_player->_rawPlayer.x; + _game->_rawInactiveY = _vm->_player->_rawPlayer.y; + _game->_charSegSwitch = false; + + mWhile(_game->_rawInactiveY); +} + +void AmazonScripts::boatWalls(int param1, int param2) { + if (param1 == 1) + _vm->_room->_plotter._walls[42] = Common::Rect(96, 27, 96 + 87, 27 + 42); + else { + _vm->_room->_plotter._walls[39].bottom = _vm->_room->_plotter._walls[41].bottom = 106; + _vm->_room->_plotter._walls[40].left = 94; + } +} + +void AmazonScripts::plotInactive() { + Player &player = *_vm->_player; + InactivePlayer &inactive = _game->_inactive; + + if (_game->_charSegSwitch) { + _game->_currentCharFlag = true; + SWAP(inactive._altSpritesPtr, player._playerSprites); + _game->_charSegSwitch = false; + } else if (_game->_jasMayaFlag != (_game->_currentCharFlag ? 1 : 0)) { + if (player._playerOff) { + _game->_jasMayaFlag = (_game->_currentCharFlag ? 1 : 0); + } else { + _game->_currentCharFlag = (_game->_jasMayaFlag == 1); + int tmpX = _game->_rawInactiveX; + int tmpY = _game->_rawInactiveY; + _game->_rawInactiveX = player._rawPlayer.x; + _game->_rawInactiveY = player._rawPlayer.y; + player._rawPlayer.x = tmpX; + player._rawPlayer.y = tmpY; + _game->_inactiveYOff = player._playerOffset.y; + player.calcManScale(); + + SWAP(inactive._altSpritesPtr, player._playerSprites); + _vm->_room->setWallCodes(); + } + } + + _game->_flags[155] = 0; + if (_game->_rawInactiveX >= 152 && _game->_rawInactiveX <= 167 && + _game->_rawInactiveY >= 158 && _game->_rawInactiveY <= 173) { + _game->_flags[155] = 1; + } else { + _game->_flags[160] = 0; + if (!_game->_jasMayaFlag && _game->_rawInactiveX >= 266 && _game->_rawInactiveX <= 290 + && _game->_rawInactiveY >= 70 && _game->_rawInactiveY <= 87) { + _game->_flags[160] = 1; + } + } + + inactive._flags &= ~IMGFLAG_UNSCALED; + inactive._flags &= ~IMGFLAG_BACKWARDS; + inactive._position.x = _game->_rawInactiveX; + inactive._position.y = _game->_rawInactiveY - _game->_inactiveYOff; + inactive._offsetY = _game->_inactiveYOff; + inactive._spritesPtr = inactive._altSpritesPtr; + + _vm->_images.addToList(_game->_inactive); +} + +void AmazonScripts::executeSpecial(int commandIndex, int param1, int param2) { + switch (commandIndex) { + case 0: + warning("TODO: DEMO - RESETAN"); + break; + case 1: + _vm->establish(param1, param2); + break; + case 2: + loadBackground(param1, param2); + break; + case 3: + if (_vm->isDemo()) + warning("TODO: DEMO - LOADCELLSET"); + else + _game->_cast->doCast(param1); + break; + case 4: + if (_vm->isDemo()) + loadNSound(param1, param2); + else + setInactive(); + break; + case 5: + warning("TODO: DEMO - UNLOADCELLSET"); + break; + case 6: + mWhile(param1); + break; + case 7: + warning("TODO: DEMO - ADDMONEY"); + break; + case 8: + warning("TODO: DEMO - CHKMONEY"); + break; + case 9: + _game->_guard->doGuard(); + break; + case 10: + _vm->_midi->newMusic(param1, param2); + break; + case 11: + plotInactive(); + break; + case 13: + _game->_river->doRiver(); + break; + case 14: + _game->_ant->doAnt(); + break; + case 15: + boatWalls(param1, param2); + break; + default: + warning("Unexpected Special code %d - Skipped", commandIndex); + } +} + +typedef void(AmazonScripts::*AmazonScriptMethodPtr)(); + +void AmazonScripts::executeCommand(int commandIndex) { + static const AmazonScriptMethodPtr AMAZON_COMMAND_LIST[] = { + &AmazonScripts::cmdHelp_v2, &AmazonScripts::cmdCycleBack, + &AmazonScripts::cmdChapter, &AmazonScripts::cmdSetHelp, + &AmazonScripts::cmdCenterPanel, &AmazonScripts::cmdMainPanel, + &AmazonScripts::CMDRETFLASH + }; + + if (commandIndex >= 73) + (this->*AMAZON_COMMAND_LIST[commandIndex - 73])(); + else + Scripts::executeCommand(commandIndex); +} + +void AmazonScripts::cmdHelp_v2() { + Common::String helpMessage = readString(); + + if (_game->_helpLevel == 0) { + _game->_timers.saveTimers(); + _game->_useItem = 0; + + if (_game->_noHints) { + printString(NO_HELP_MESSAGE); + return; + } else if (_game->_hintLevel == 0) { + printString(NO_HINTS_MESSAGE); + return; + } + } + + int level = _game->_hintLevel - 1; + if (level < _game->_helpLevel) + _game->_moreHelp = 0; + + _game->drawHelp(helpMessage); + + while (!_vm->shouldQuit()) { + while (!_vm->shouldQuit() && !_vm->_events->_leftButton) + _vm->_events->pollEventsAndWait(); + + _vm->_events->debounceLeft(); + + static const Common::Rect butn1 = Common::Rect(HELP1COORDS[0][0], HELP1COORDS[0][2], HELP1COORDS[0][1], HELP1COORDS[0][3]); + static const Common::Rect butn2 = Common::Rect(HELP1COORDS[1][0], HELP1COORDS[1][2], HELP1COORDS[1][1], HELP1COORDS[1][3]); + const Common::Point pt = _vm->_events->_mousePos; + + int choice = -1; + if (butn1.contains(pt)) + choice = 0; + else if (butn2.contains(pt)) + choice = 1; + + if (choice < 0) + continue; + + if (choice == 1) { + // Done button selected + _game->_helpLevel = 0; + _game->_moreHelp = 1; + _game->_useItem = 0; + _vm->_events->hideCursor(); + if (_vm->_screen->_vesaMode) { + _vm->_screen->restoreScreen(); + _vm->_screen->setPanel(0); + } else { + _vm->_screen->fadeOut(); + _vm->_screen->clearBuffer(); + } + + _vm->_buffer2.copyTo(_vm->_screen); + _vm->_screen->restorePalette(); + _vm->_screen->setPalette(); + _vm->_events->showCursor(); + + delete _vm->_objectsTable[45]; + _vm->_objectsTable[45] = nullptr; + _vm->_timers.restoreTimers(); + break; + } else { + // More button selected + if ((_game->_moreHelp == 0) || (choice != 0)) + continue; + ++_game->_helpLevel; + _game->_useItem = 1; + break; + } + } + findNull(); +} + +void AmazonScripts::cmdCycleBack() { + if (_vm->_startup == -1) + _vm->_screen->cyclePaletteBackwards(); +} +void AmazonScripts::cmdChapter() { + if (_vm->isDemo()) { + cmdSetHelp(); + } else { + int chapter = _data->readByte(); + _game->startChapter(chapter); + } +} + +void AmazonScripts::cmdSetHelp() { + int arrayId = (_data->readUint16LE() & 0xFF) - 1; + int helpId = _data->readUint16LE() & 0xFF; + + byte *help = _game->_helpTbl[arrayId]; + help[helpId] = 1; + + if (_vm->_useItem == 0) { + _sequence = 11000; + searchForSequence(); + } +} + +void AmazonScripts::cmdCenterPanel() { + if (_vm->_screen->_vesaMode) { + _vm->_screen->clearScreen(); + _vm->_screen->setPanel(3); + } +} + +void AmazonScripts::cmdMainPanel() { + if (_vm->_screen->_vesaMode) { + _vm->_room->init4Quads(); + _vm->_screen->setPanel(0); + } +} + +void AmazonScripts::CMDRETFLASH() { + error("TODO CMDRETFLASH"); +} + +} // End of namespace Amazon + +} // End of namespace Access |