aboutsummaryrefslogtreecommitdiff
path: root/engines/access/amazon/amazon_scripts.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/access/amazon/amazon_scripts.cpp')
-rw-r--r--engines/access/amazon/amazon_scripts.cpp516
1 files changed, 516 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..92acb3686d
--- /dev/null
+++ b/engines/access/amazon/amazon_scripts.cpp
@@ -0,0 +1,516 @@
+/* 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;
+}
+
+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 COMMAND_LIST[] = {
+ &AmazonScripts::cmdHelp, &AmazonScripts::cmdCycleBack,
+ &AmazonScripts::cmdChapter, &AmazonScripts::cmdSetHelp,
+ &AmazonScripts::cmdCenterPanel, &AmazonScripts::cmdMainPanel,
+ &AmazonScripts::CMDRETFLASH
+ };
+
+ if (commandIndex >= 73)
+ (this->*COMMAND_LIST[commandIndex - 73])();
+ else
+ Scripts::executeCommand(commandIndex);
+}
+
+void AmazonScripts::cmdHelp() {
+ 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