Initial commit
This commit is contained in:
535
engines/access/amazon/amazon_scripts.cpp
Normal file
535
engines/access/amazon/amazon_scripts.cpp
Normal file
@@ -0,0 +1,535 @@
|
||||
/* 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#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 = _data->readString();
|
||||
|
||||
if (_game->_helpLevel == 0) {
|
||||
_game->_timers.saveTimers();
|
||||
_game->_useItem = 0;
|
||||
|
||||
if (_game->_noHints) {
|
||||
printString(AMRES.NO_HELP_MESSAGE);
|
||||
return;
|
||||
} else if (_game->_hintLevel == 0) {
|
||||
printString(AMRES.NO_HINTS_MESSAGE);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
int level = _game->_hintLevel - 1;
|
||||
if (level < _game->_helpLevel)
|
||||
_game->_moreHelp = 0;
|
||||
|
||||
_game->drawHelp(helpMessage);
|
||||
|
||||
const Common::Rect butn1 = Common::Rect(HELP1COORDS[0][0], HELP1COORDS[0][2], HELP1COORDS[0][1], HELP1COORDS[0][3]);
|
||||
const Common::Rect butn2 = Common::Rect(HELP1COORDS[1][0], HELP1COORDS[1][2], HELP1COORDS[1][1], HELP1COORDS[1][3]);
|
||||
|
||||
while (!_vm->shouldQuit()) {
|
||||
while (!_vm->shouldQuit() && !_vm->_events->_leftButton)
|
||||
_vm->_events->pollEventsAndWait();
|
||||
|
||||
_vm->_events->debounceLeft();
|
||||
|
||||
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)
|
||||
continue;
|
||||
++_game->_helpLevel;
|
||||
_game->_useItem = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
findNull();
|
||||
}
|
||||
|
||||
void AmazonScripts::cmdCycleBack() {
|
||||
if (_vm->_startup == -1)
|
||||
_vm->_screen->cyclePaletteBackwards();
|
||||
}
|
||||
|
||||
void AmazonScripts::cmdChapter() {
|
||||
Resource *activeScript = nullptr;
|
||||
|
||||
if (_vm->isDemo()) {
|
||||
cmdSetHelp();
|
||||
} else {
|
||||
int chapter = _data->readByte();
|
||||
|
||||
if (!_vm->isCD()) {
|
||||
// For floppy version, the current script remains active even
|
||||
// after the end of the chapter start, so we need to save it
|
||||
activeScript = _resource;
|
||||
_resource = nullptr;
|
||||
_data = nullptr;
|
||||
}
|
||||
|
||||
_game->startChapter(chapter);
|
||||
|
||||
if (!_vm->isCD()) {
|
||||
assert(!_resource);
|
||||
setScript(activeScript, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
Reference in New Issue
Block a user