2014-11-28 21:02:12 -05:00
|
|
|
/* 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/screen.h"
|
|
|
|
#include "access/amazon/amazon_game.h"
|
|
|
|
#include "access/amazon/amazon_logic.h"
|
|
|
|
|
|
|
|
namespace Access {
|
|
|
|
|
|
|
|
namespace Amazon {
|
|
|
|
|
|
|
|
PannedScene::PannedScene(AmazonEngine *vm): AmazonManager(vm) {
|
|
|
|
for (int i = 0; i < PAN_SIZE; ++i) {
|
|
|
|
_pan[i]._pObject = nullptr;
|
|
|
|
_pan[i]._pImgNum = 0;
|
|
|
|
_pan[i]._pObjX = _pan[i]._pObjY = _pan[i]._pObjZ = 0;
|
|
|
|
_pan[i]._pObjXl = _pan[i]._pObjYl = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
_xCount = 0;
|
|
|
|
_xTrack = _yTrack = _zTrack = 0;
|
|
|
|
_xCam = _yCam = _zCam = 0;
|
|
|
|
_pNumObj = 0;
|
|
|
|
_screenVertX = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void PannedScene::pan() {
|
|
|
|
_zCam += _zTrack;
|
|
|
|
_xCam += _xTrack;
|
|
|
|
int tx = (_xTrack << 8) / _zCam;
|
|
|
|
_yCam += _yTrack;
|
|
|
|
int ty = (_yTrack << 8) / _zCam;
|
|
|
|
|
|
|
|
if (_vm->_timers[24]._flag != 1) {
|
|
|
|
++_vm->_timers[24]._flag;
|
|
|
|
for (int i = 0; i < _pNumObj; i++) {
|
|
|
|
_pan[i]._pObjZ += _zTrack;
|
|
|
|
_pan[i]._pObjXl += (_pan[i]._pObjZ * tx) & 0xff;
|
|
|
|
_pan[i]._pObjX += ((_pan[i]._pObjZ * tx) >> 8) + (_pan[i]._pObjXl >> 8);
|
|
|
|
_pan[i]._pObjXl &= 0xff;
|
|
|
|
|
|
|
|
_pan[i]._pObjYl += (_pan[i]._pObjZ * ty) & 0xff;
|
|
|
|
_pan[i]._pObjY += ((_pan[i]._pObjZ * ty) >> 8) + (_pan[i]._pObjYl >> 8);
|
|
|
|
_pan[i]._pObjYl &= 0xff;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = 0; i < _pNumObj; i++) {
|
|
|
|
ImageEntry ie;
|
|
|
|
ie._flags = IMGFLAG_UNSCALED;
|
|
|
|
ie._position = Common::Point(_pan[i]._pObjX, _pan[i]._pObjY);
|
|
|
|
ie._offsetY = 255;
|
|
|
|
ie._spritesPtr = _pan[i]._pObject;
|
|
|
|
ie._frameNumber = _pan[i]._pImgNum;
|
|
|
|
|
|
|
|
_vm->_images.addToList(ie);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
|
2014-11-29 11:53:50 -05:00
|
|
|
CampScene::CampScene(AmazonEngine *vm) : PannedScene(vm) {
|
|
|
|
_skipStart = false;
|
2014-11-28 21:02:12 -05:00
|
|
|
}
|
|
|
|
|
2014-11-29 11:53:50 -05:00
|
|
|
void CampScene::mWhileDoOpen() {
|
2014-11-28 21:02:12 -05:00
|
|
|
Screen &screen = *_vm->_screen;
|
|
|
|
EventsManager &events = *_vm->_events;
|
|
|
|
|
|
|
|
screen.setBufferScan();
|
|
|
|
events.hideCursor();
|
|
|
|
screen.forceFadeOut();
|
2014-11-29 11:53:50 -05:00
|
|
|
_skipStart = false;
|
2014-11-28 21:02:12 -05:00
|
|
|
if (_vm->_conversation != 2) {
|
|
|
|
// Cutscene at start of chapter 1
|
|
|
|
screen.setPanel(3);
|
|
|
|
_vm->startChapter(1);
|
|
|
|
_vm->establishCenter(0, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
Resource *data = _vm->_files->loadFile(1, 0);
|
|
|
|
_vm->_objectsTable[1] = new SpriteResource(_vm, data);
|
|
|
|
delete data;
|
|
|
|
|
|
|
|
_vm->_files->_setPaletteFlag = false;
|
|
|
|
_vm->_files->loadScreen(1, 2);
|
|
|
|
_vm->_buffer2.copyFrom(*_vm->_screen);
|
|
|
|
_vm->_buffer1.copyFrom(*_vm->_screen);
|
|
|
|
|
|
|
|
// Load animation data
|
|
|
|
_vm->_animation->freeAnimationData();
|
|
|
|
Resource *animResource = _vm->_files->loadFile(1, 1);
|
|
|
|
_vm->_animation->loadAnimations(animResource);
|
|
|
|
delete animResource;
|
|
|
|
|
|
|
|
_xTrack = 8;
|
|
|
|
_yTrack = -3;
|
|
|
|
_zTrack = 0;
|
|
|
|
_xCam = _yCam = 0;
|
|
|
|
_zCam = 270;
|
|
|
|
_vm->_timers[24]._timer = _vm->_timers[24]._initTm = 1;
|
|
|
|
++_vm->_timers[24]._flag;
|
|
|
|
_vm->_timers.updateTimers();
|
|
|
|
|
|
|
|
_pNumObj = 10;
|
|
|
|
for (int i = 0; i < _pNumObj; i++) {
|
|
|
|
_pan[i]._pObject = _vm->_objectsTable[1];
|
|
|
|
_pan[i]._pImgNum = OPENING_OBJS[i][0];
|
|
|
|
_pan[i]._pObjX = OPENING_OBJS[i][1];
|
|
|
|
_pan[i]._pObjY = OPENING_OBJS[i][2];
|
|
|
|
_pan[i]._pObjZ = OPENING_OBJS[i][3];
|
|
|
|
_pan[i]._pObjXl = _pan[i]._pObjYl = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
_vm->_oldRects.clear();
|
|
|
|
_vm->_newRects.clear();
|
|
|
|
Animation *anim = _vm->_animation->setAnimation(0);
|
|
|
|
_vm->_animation->setAnimTimer(anim);
|
|
|
|
anim = _vm->_animation->setAnimation(1);
|
|
|
|
_vm->_animation->setAnimTimer(anim);
|
2014-12-01 07:49:26 +01:00
|
|
|
_vm->_midi->newMusic(10, 0);
|
2014-11-28 21:02:12 -05:00
|
|
|
|
|
|
|
bool startFl = false;
|
|
|
|
while (!_vm->shouldQuit()) {
|
|
|
|
_vm->_images.clear();
|
|
|
|
_vm->_animation->animate(0);
|
|
|
|
_vm->_animation->animate(1);
|
|
|
|
pan();
|
|
|
|
_vm->_buffer2.copyFrom(_vm->_buffer1);
|
|
|
|
_vm->_newRects.clear();
|
|
|
|
_vm->plotList();
|
|
|
|
_vm->copyBlocks();
|
|
|
|
if (!startFl) {
|
|
|
|
startFl = true;
|
|
|
|
screen.forceFadeIn();
|
|
|
|
}
|
|
|
|
|
|
|
|
events.pollEventsAndWait();
|
|
|
|
|
|
|
|
if (events._leftButton || events._rightButton || events._keypresses.size() > 0) {
|
2014-11-29 11:53:50 -05:00
|
|
|
_skipStart = true;
|
2014-12-01 07:49:26 +01:00
|
|
|
_vm->_midi->newMusic(10, 1);
|
2014-11-28 21:02:12 -05:00
|
|
|
|
|
|
|
events.debounceLeft();
|
|
|
|
events.zeroKeys();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_xCam > 680) {
|
|
|
|
events._vbCount = 125;
|
|
|
|
|
|
|
|
while (!_vm->shouldQuit() && !events.isKeyMousePressed() && events._vbCount > 0) {
|
|
|
|
events.pollEventsAndWait();
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
events.showCursor();
|
|
|
|
_vm->_buffer2.copyFrom(*_vm->_screen);
|
|
|
|
_vm->_buffer1.copyFrom(*_vm->_screen);
|
|
|
|
|
|
|
|
_vm->freeCells();
|
|
|
|
_vm->_oldRects.clear();
|
|
|
|
_vm->_newRects.clear();
|
|
|
|
_vm->_numAnimTimers = 0;
|
|
|
|
_vm->_images.clear();
|
|
|
|
|
|
|
|
if (_vm->_conversation == 2) {
|
|
|
|
// Cutscene at end of Chapter 6
|
|
|
|
Resource *spriteData = _vm->_files->loadFile(28, 37);
|
|
|
|
_vm->_objectsTable[28] = new SpriteResource(_vm, spriteData);
|
|
|
|
delete spriteData;
|
|
|
|
|
|
|
|
_vm->_animation->freeAnimationData();
|
|
|
|
animResource = _vm->_files->loadFile(28, 38);
|
|
|
|
_vm->_animation->loadAnimations(animResource);
|
|
|
|
delete animResource;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
|
2014-11-29 11:53:50 -05:00
|
|
|
Opening::Opening(AmazonEngine *vm) : CampScene(vm) {
|
|
|
|
_pCount = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Opening::doIntroduction() {
|
|
|
|
_vm->_screen->setInitialPalettte();
|
|
|
|
_vm->_events->setCursor(CURSOR_ARROW);
|
|
|
|
_vm->_events->showCursor();
|
|
|
|
_vm->_screen->setPanel(0);
|
|
|
|
_vm->_screen->setPalette();
|
|
|
|
|
|
|
|
_vm->_events->setCursor(CURSOR_ARROW);
|
|
|
|
_vm->_events->showCursor();
|
|
|
|
_vm->_screen->setPanel(3);
|
|
|
|
doTitle();
|
|
|
|
|
|
|
|
if (_vm->shouldQuit() || _skipStart)
|
|
|
|
return;
|
|
|
|
|
|
|
|
_vm->_screen->setPanel(3);
|
|
|
|
mWhileDoOpen();
|
|
|
|
|
|
|
|
if (_vm->shouldQuit() || _skipStart)
|
|
|
|
return;
|
|
|
|
|
|
|
|
doTent();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Opening::doCredit() {
|
|
|
|
if (_pCount < 15)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (_pCount <= 75)
|
2014-12-03 00:33:08 +01:00
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], _vm->isDemo()? 24 : 0, Common::Point(90, 35));
|
|
|
|
else if (_pCount <= 210) {
|
|
|
|
if (_vm->isDemo())
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 25, Common::Point(82, 35));
|
|
|
|
else
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 1, Common::Point(65, 35));
|
|
|
|
} else if (_pCount <= 272) {
|
|
|
|
if (_vm->isDemo()) {
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 23, Common::Point(77, 20));
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 4, Common::Point(50, 35));
|
|
|
|
} else
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 2, Common::Point(96, 45));
|
|
|
|
} else if (_pCount <= 334) {
|
|
|
|
if (_vm->isDemo()) {
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 16, Common::Point(200, 70));
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 4, Common::Point(170, 85));
|
|
|
|
} else
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 3, Common::Point(68, 54));
|
|
|
|
} else if (_pCount <= 396) {
|
|
|
|
if (_vm->isDemo()) {
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 15, Common::Point(65, 15));
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 2, Common::Point(30, 30));
|
|
|
|
} else
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 4, Common::Point(103, 54));
|
|
|
|
} else if (_pCount <= 458) {
|
|
|
|
if (_vm->isDemo()) {
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 19, Common::Point(123, 40));
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 10, Common::Point(115, 55));
|
|
|
|
} else {
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 5, Common::Point(8, 5));
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 12, Common::Point(88, 55));
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 6, Common::Point(194, 98));
|
|
|
|
}
|
2014-11-29 11:53:50 -05:00
|
|
|
} else if (_pCount <= 520) {
|
2014-12-03 00:33:08 +01:00
|
|
|
if (_vm->isDemo()) {
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 18, Common::Point(50, 15));
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 9, Common::Point(40, 30));
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 0, Common::Point(40, 55));
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 20, Common::Point(198, 95));
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 3, Common::Point(160, 110));
|
|
|
|
} else {
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 7, Common::Point(32, 13));
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 8, Common::Point(162, 80));
|
|
|
|
}
|
2014-11-29 11:53:50 -05:00
|
|
|
} else if (_pCount <= 580) {
|
2014-12-03 00:33:08 +01:00
|
|
|
if (_vm->isDemo()) {
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 21, Common::Point(40, 10));
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 6, Common::Point(20, 25));
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 22, Common::Point(145, 50));
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 7, Common::Point(125, 65));
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 12, Common::Point(207, 90));
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 5, Common::Point(200, 105));
|
|
|
|
} else {
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 9, Common::Point(18, 15));
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 10, Common::Point(164, 81));
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (_vm->isDemo()) {
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 11, Common::Point(125, 30));
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 4, Common::Point(115, 45));
|
|
|
|
} else
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], 11, Common::Point(106, 55));
|
|
|
|
}
|
2014-11-29 11:53:50 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
void Opening::scrollTitle() {
|
|
|
|
_vm->copyBF1BF2();
|
|
|
|
_vm->_newRects.clear();
|
|
|
|
doCredit();
|
|
|
|
_vm->copyRects();
|
|
|
|
_vm->copyBF2Vid();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Opening::doTitle() {
|
|
|
|
_vm->_screen->setDisplayScan();
|
|
|
|
|
|
|
|
_vm->_screen->forceFadeOut();
|
|
|
|
_vm->_events->hideCursor();
|
|
|
|
|
2014-12-02 16:29:42 +01:00
|
|
|
if (!_vm->isDemo()) {
|
|
|
|
_vm->_sound->queueSound(0, 98, 30);
|
|
|
|
_vm->_sound->queueSound(1, 98, 8);
|
|
|
|
|
|
|
|
_vm->_files->_setPaletteFlag = false;
|
|
|
|
_vm->_files->loadScreen(0, 3);
|
|
|
|
|
|
|
|
_vm->_buffer2.copyFrom(*_vm->_screen);
|
|
|
|
_vm->_buffer1.copyFrom(*_vm->_screen);
|
|
|
|
_vm->_screen->forceFadeIn();
|
|
|
|
_vm->_sound->playSound(1);
|
|
|
|
|
|
|
|
// WORKAROUND: This delay has been added to replace original game delay that
|
|
|
|
// came from loading resources, since nowadays it would be too fast to be visible
|
|
|
|
// nowadays to be visible.
|
|
|
|
_vm->_events->_vbCount = 70;
|
|
|
|
while (!_vm->shouldQuit() && _vm->_events->_vbCount > 0)
|
|
|
|
_vm->_events->pollEventsAndWait();
|
|
|
|
if (_vm->shouldQuit())
|
|
|
|
return;
|
2014-11-29 11:53:50 -05:00
|
|
|
|
2014-12-02 16:29:42 +01:00
|
|
|
Resource *spriteData = _vm->_files->loadFile(0, 2);
|
|
|
|
_vm->_objectsTable[0] = new SpriteResource(_vm, spriteData);
|
|
|
|
delete spriteData;
|
2014-11-29 11:53:50 -05:00
|
|
|
|
2014-12-02 16:29:42 +01:00
|
|
|
_vm->_sound->playSound(1);
|
|
|
|
|
|
|
|
_vm->_files->_setPaletteFlag = false;
|
|
|
|
_vm->_files->loadScreen(0, 4);
|
|
|
|
_vm->_sound->playSound(1);
|
|
|
|
|
|
|
|
_vm->_buffer2.copyFrom(*_vm->_screen);
|
|
|
|
_vm->_buffer1.copyFrom(*_vm->_screen);
|
|
|
|
_vm->_sound->playSound(1);
|
|
|
|
|
|
|
|
const int COUNTDOWN[6] = { 2, 0x80, 1, 0x7d, 0, 0x87 };
|
|
|
|
for (_pCount = 0; _pCount < 3 && !_vm->shouldQuit(); ++_pCount) {
|
|
|
|
_vm->_buffer2.copyFrom(_vm->_buffer1);
|
|
|
|
int id = COUNTDOWN[_pCount * 2];
|
|
|
|
int xp = COUNTDOWN[_pCount * 2 + 1];
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[0], id, Common::Point(xp, 71));
|
|
|
|
_vm->_screen->copyFrom(_vm->_buffer2);
|
|
|
|
|
|
|
|
_vm->_events->_vbCount = 70;
|
|
|
|
while (!_vm->shouldQuit() && _vm->_events->_vbCount > 0 && !_skipStart) {
|
|
|
|
_vm->_sound->playSound(1);
|
|
|
|
_vm->_events->pollEventsAndWait();
|
|
|
|
if (_vm->_events->_rightButton)
|
|
|
|
_skipStart = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (_vm->shouldQuit())
|
|
|
|
return;
|
2014-11-29 11:53:50 -05:00
|
|
|
|
2014-12-02 16:29:42 +01:00
|
|
|
_vm->_sound->playSound(0);
|
|
|
|
_vm->_screen->forceFadeOut();
|
|
|
|
_vm->_events->_vbCount = 100;
|
|
|
|
while (!_vm->shouldQuit() && _vm->_events->_vbCount > 0)
|
|
|
|
_vm->_events->pollEventsAndWait();
|
|
|
|
if (_vm->shouldQuit())
|
|
|
|
return;
|
|
|
|
|
|
|
|
_vm->_sound->freeSounds();
|
|
|
|
delete _vm->_objectsTable[0];
|
|
|
|
_vm->_objectsTable[0] = nullptr;
|
|
|
|
|
|
|
|
_vm->_files->_setPaletteFlag = false;
|
|
|
|
_vm->_files->loadScreen(0, 5);
|
|
|
|
_vm->_buffer2.copyFrom(*_vm->_screen);
|
|
|
|
_vm->_buffer1.copyFrom(*_vm->_screen);
|
|
|
|
_vm->_screen->forceFadeIn();
|
|
|
|
_vm->_midi->newMusic(1, 0);
|
|
|
|
_vm->_events->_vbCount = 700;
|
|
|
|
while (!_vm->shouldQuit() && (_vm->_events->_vbCount > 0) && !_vm->_events->isKeyMousePressed()) {
|
2014-11-29 12:19:41 -05:00
|
|
|
_vm->_events->pollEventsAndWait();
|
2014-12-01 15:01:47 +01:00
|
|
|
}
|
2014-11-29 11:53:50 -05:00
|
|
|
|
2014-12-02 16:29:42 +01:00
|
|
|
if (_vm->_events->_rightButton) {
|
|
|
|
_skipStart = true;
|
|
|
|
_vm->_room->clearRoom();
|
|
|
|
_vm->_events->showCursor();
|
|
|
|
return;
|
|
|
|
}
|
2014-11-29 11:53:50 -05:00
|
|
|
|
2014-12-02 16:29:42 +01:00
|
|
|
_vm->_midi->newMusic(1, 1);
|
|
|
|
_vm->_midi->setLoop(false);
|
|
|
|
_vm->_events->zeroKeys();
|
2014-11-29 11:53:50 -05:00
|
|
|
}
|
|
|
|
_vm->_room->loadRoom(0);
|
|
|
|
_vm->_screen->clearScreen();
|
|
|
|
_vm->_screen->setBufferScan();
|
|
|
|
_vm->_screen->_scrollRow = _vm->_screen->_scrollCol = 0;
|
|
|
|
_vm->_screen->_scrollX = _vm->_screen->_scrollY = 0;
|
|
|
|
_vm->_player->_rawPlayer = Common::Point(0, 0);
|
|
|
|
_vm->_screen->forceFadeOut();
|
|
|
|
_vm->_screen->_scrollX = 0;
|
|
|
|
_vm->_room->buildScreen();
|
|
|
|
_vm->copyBF2Vid();
|
|
|
|
_vm->_screen->forceFadeIn();
|
|
|
|
_vm->_oldRects.clear();
|
|
|
|
_vm->_newRects.clear();
|
2014-12-01 15:18:21 +01:00
|
|
|
_vm->_events->clearEvents();
|
2014-11-29 11:53:50 -05:00
|
|
|
_vm->_player->_scrollAmount = 1;
|
|
|
|
_pCount = 0;
|
|
|
|
|
|
|
|
while (!_vm->shouldQuit()) {
|
2014-12-01 15:18:21 +01:00
|
|
|
if (_vm->_events->isKeyMousePressed()) {
|
2014-11-29 11:53:50 -05:00
|
|
|
if (_vm->_events->_rightButton)
|
|
|
|
_skipStart = true;
|
|
|
|
_vm->_room->clearRoom();
|
|
|
|
_vm->_events->showCursor();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
_vm->_events->_vbCount = 4;
|
|
|
|
if (_vm->_screen->_scrollCol + _vm->_screen->_vWindowWidth != _vm->_room->_playFieldWidth) {
|
|
|
|
_vm->_screen->_scrollX += _vm->_player->_scrollAmount;
|
|
|
|
|
|
|
|
while (_vm->_screen->_scrollX >= TILE_WIDTH) {
|
|
|
|
_vm->_screen->_scrollX -= TILE_WIDTH;
|
|
|
|
++_vm->_screen->_scrollCol;
|
|
|
|
|
|
|
|
_vm->_buffer1.moveBufferLeft();
|
|
|
|
_vm->_room->buildColumn(_vm->_screen->_scrollCol + _vm->_screen->_vWindowWidth, _vm->_screen->_vWindowBytesWide);
|
|
|
|
}
|
|
|
|
scrollTitle();
|
|
|
|
++_pCount;
|
|
|
|
|
|
|
|
while (!_vm->shouldQuit() && (_vm->_events->_vbCount > 0)) {
|
2014-11-29 12:19:41 -05:00
|
|
|
_vm->_events->pollEventsAndWait();
|
2014-11-29 11:53:50 -05:00
|
|
|
}
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
_vm->_events->_vbCount = 120;
|
2014-11-29 12:19:41 -05:00
|
|
|
while (!_vm->shouldQuit() && (_vm->_events->_vbCount > 0))
|
|
|
|
_vm->_events->pollEventsAndWait();
|
2014-11-29 11:53:50 -05:00
|
|
|
|
|
|
|
while (!_vm->shouldQuit()) {
|
|
|
|
_pCount = 0;
|
|
|
|
_vm->_events->_vbCount = 3;
|
|
|
|
if (_vm->_screen->_scrollRow + _vm->_screen->_vWindowHeight >= _vm->_room->_playFieldHeight) {
|
|
|
|
_vm->_room->clearRoom();
|
|
|
|
_vm->_events->showCursor();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
_vm->_screen->_scrollY = _vm->_screen->_scrollY + _vm->_player->_scrollAmount;
|
|
|
|
|
|
|
|
while (_vm->_screen->_scrollY >= TILE_HEIGHT && !_vm->shouldQuit()) {
|
|
|
|
_vm->_screen->_scrollY -= TILE_HEIGHT;
|
|
|
|
++_vm->_screen->_scrollRow;
|
|
|
|
_vm->_buffer1.moveBufferUp();
|
|
|
|
|
|
|
|
// WORKAROUND: the original was using _vm->_screen->_vWindowBytesWide * _vm->_screen->_vWindowLinesTall
|
|
|
|
_vm->_room->buildRow(_vm->_screen->_scrollRow + _vm->_screen->_vWindowHeight, _vm->_screen->_vWindowLinesTall);
|
|
|
|
|
|
|
|
if (_vm->_screen->_scrollRow + _vm->_screen->_vWindowHeight >= _vm->_room->_playFieldHeight) {
|
|
|
|
_vm->_room->clearRoom();
|
|
|
|
_vm->_events->showCursor();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
scrollTitle();
|
2014-11-29 12:19:41 -05:00
|
|
|
while (!_vm->shouldQuit() && (_vm->_events->_vbCount > 0))
|
|
|
|
_vm->_events->pollEventsAndWait();
|
2014-11-29 11:53:50 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Opening::doTent() {
|
|
|
|
int step = 0;
|
|
|
|
_vm->_screen->setDisplayScan();
|
|
|
|
_vm->_screen->forceFadeOut();
|
|
|
|
_vm->_events->hideCursor();
|
|
|
|
_vm->_sound->_soundTable.push_back(SoundEntry(_vm->_sound->loadSound(98, 39), 1));
|
|
|
|
_vm->_sound->_soundTable.push_back(SoundEntry(_vm->_sound->loadSound(98, 14), 1));
|
|
|
|
_vm->_sound->_soundTable.push_back(SoundEntry(_vm->_sound->loadSound(98, 15), 1));
|
|
|
|
_vm->_sound->_soundTable.push_back(SoundEntry(_vm->_sound->loadSound(98, 16), 1));
|
|
|
|
_vm->_sound->_soundTable.push_back(SoundEntry(_vm->_sound->loadSound(98, 31), 2));
|
|
|
|
_vm->_sound->_soundTable.push_back(SoundEntry(_vm->_sound->loadSound(98, 52), 2));
|
|
|
|
_vm->_sound->playSound(0);
|
|
|
|
|
|
|
|
_vm->_files->_setPaletteFlag = false;
|
|
|
|
_vm->_files->loadScreen(2, 0);
|
|
|
|
_vm->_buffer2.copyFrom(*_vm->_screen);
|
|
|
|
_vm->_buffer1.copyFrom(*_vm->_screen);
|
|
|
|
_vm->_screen->forceFadeIn();
|
|
|
|
|
|
|
|
_vm->_video->setVideo(_vm->_screen, Common::Point(126, 73), FileIdent(2, 1), 10);
|
|
|
|
while (!_vm->shouldQuit() && !_vm->_video->_videoEnd) {
|
|
|
|
_vm->_video->playVideo();
|
|
|
|
if ((_vm->_video->_videoFrame == 32) || (_vm->_video->_videoFrame == 34))
|
|
|
|
_vm->_sound->playSound(4);
|
|
|
|
else if (_vm->_video->_videoFrame == 36) {
|
|
|
|
if (step != 2) {
|
|
|
|
_vm->_sound->playSound(2);
|
|
|
|
step = 2;
|
|
|
|
}
|
|
|
|
} else if (_vm->_video->_videoFrame == 18) {
|
|
|
|
if (step != 1) {
|
2014-12-01 07:49:26 +01:00
|
|
|
_vm->_midi->newMusic(73, 1);
|
|
|
|
_vm->_midi->newMusic(11, 0);
|
2014-11-29 11:53:50 -05:00
|
|
|
step = 1;
|
|
|
|
_vm->_sound->playSound(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-11-29 12:19:41 -05:00
|
|
|
_vm->_events->pollEventsAndWait();
|
2014-11-29 11:53:50 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
_vm->_sound->playSound(5);
|
|
|
|
_vm->_video->setVideo(_vm->_screen, Common::Point(43, 11), FileIdent(2, 2), 10);
|
|
|
|
while (!_vm->shouldQuit() && !_vm->_video->_videoEnd) {
|
|
|
|
_vm->_video->playVideo();
|
|
|
|
if (_vm->_video->_videoFrame == 26) {
|
|
|
|
_vm->_sound->playSound(5);
|
|
|
|
} else if (_vm->_video->_videoFrame == 15) {
|
|
|
|
if (step !=3) {
|
|
|
|
_vm->_sound->playSound(3);
|
|
|
|
step = 3;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-11-29 12:19:41 -05:00
|
|
|
_vm->_events->pollEventsAndWait();
|
2014-11-29 11:53:50 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
_vm->_events->_vbCount = 200;
|
2014-11-29 12:19:41 -05:00
|
|
|
while (!_vm->shouldQuit() && _vm->_events->_vbCount > 0)
|
|
|
|
_vm->_events->pollEventsAndWait();
|
|
|
|
|
2014-11-29 11:53:50 -05:00
|
|
|
_vm->_events->showCursor();
|
2014-12-01 07:49:26 +01:00
|
|
|
_vm->_midi->newMusic(11, 1);
|
2014-11-29 11:53:50 -05:00
|
|
|
_vm->_sound->_soundTable.clear();
|
|
|
|
|
|
|
|
_vm->establishCenter(0, 4);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
|
2014-11-28 21:02:12 -05:00
|
|
|
Plane::Plane(AmazonEngine *vm): PannedScene(vm) {
|
|
|
|
_pCount = 0;
|
|
|
|
_planeCount = 0;
|
|
|
|
_propCount = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Plane::doFlyCell() {
|
|
|
|
SpriteResource *sprites = _vm->_objectsTable[15];
|
|
|
|
|
|
|
|
if (_pCount <= 40) {
|
|
|
|
_vm->_buffer2.plotImage(sprites, 3, Common::Point(70, 74));
|
|
|
|
} else if (_pCount <= 80) {
|
|
|
|
_vm->_buffer2.plotImage(sprites, 6, Common::Point(70, 74));
|
|
|
|
} else if (_pCount <= 120) {
|
|
|
|
_vm->_buffer2.plotImage(sprites, 2, Common::Point(50, 76));
|
|
|
|
} else if (_pCount <= 160) {
|
|
|
|
_vm->_buffer2.plotImage(sprites, 14, Common::Point(63, 78));
|
|
|
|
} else if (_pCount <= 200) {
|
|
|
|
_vm->_buffer2.plotImage(sprites, 5, Common::Point(86, 74));
|
|
|
|
} else if (_pCount <= 240) {
|
|
|
|
_vm->_buffer2.plotImage(sprites, 0, Common::Point(103, 76));
|
|
|
|
} else if (_pCount <= 280) {
|
|
|
|
_vm->_buffer2.plotImage(sprites, 4, Common::Point(119, 77));
|
|
|
|
} else {
|
|
|
|
_vm->_buffer2.plotImage(sprites, 1, Common::Point(111, 77));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_planeCount == 11 || _planeCount == 12)
|
|
|
|
++_position.y;
|
|
|
|
else if (_planeCount >= 28)
|
|
|
|
--_position.y;
|
|
|
|
|
|
|
|
_vm->_buffer2.plotImage(sprites, 7, _position);
|
|
|
|
_vm->_buffer2.plotImage(sprites, 8 + _propCount, Common::Point(
|
|
|
|
_position.x + 99, _position.y + 10));
|
|
|
|
_vm->_buffer2.plotImage(sprites, 11 + _propCount, Common::Point(
|
|
|
|
_position.x + 104, _position.y + 18));
|
|
|
|
|
|
|
|
if (++_planeCount >= 30)
|
|
|
|
_planeCount = 0;
|
|
|
|
if (++_propCount >= 3)
|
|
|
|
_propCount = 0;
|
|
|
|
|
|
|
|
++_xCount;
|
|
|
|
if (_xCount == 1)
|
|
|
|
++_position.x;
|
|
|
|
else
|
|
|
|
_xCount = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Plane::doFallCell() {
|
|
|
|
if (_vm->_scaleI <= 20)
|
|
|
|
return;
|
|
|
|
|
|
|
|
SpriteFrame *frame = _vm->_objectsTable[20]->getFrame(_planeCount / 6);
|
|
|
|
Common::Rect r(115, 11, 115 + _vm->_screen->_scaleTable1[frame->w],
|
|
|
|
11 + _vm->_screen->_scaleTable1[frame->h]);
|
|
|
|
_vm->_buffer2.sPlotF(frame, r);
|
|
|
|
|
|
|
|
_vm->_scaleI -= 3;
|
|
|
|
_vm->_scale = _vm->_scaleI;
|
|
|
|
_vm->_screen->setScaleTable(_vm->_scale);
|
|
|
|
++_xCount;
|
|
|
|
if (_xCount == 5)
|
|
|
|
return;
|
|
|
|
_xCount = 0;
|
|
|
|
if (_planeCount == 18)
|
|
|
|
_planeCount = 0;
|
|
|
|
else
|
|
|
|
_planeCount += 6;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Plane::scrollFly() {
|
|
|
|
_vm->copyBF1BF2();
|
|
|
|
_vm->_newRects.clear();
|
|
|
|
doFlyCell();
|
|
|
|
_vm->copyRects();
|
|
|
|
_vm->copyBF2Vid();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Plane::scrollFall() {
|
|
|
|
_vm->copyBF1BF2();
|
|
|
|
_vm->_newRects.clear();
|
|
|
|
doFallCell();
|
|
|
|
_vm->copyRects();
|
|
|
|
_vm->copyBF2Vid();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Plane::mWhileFly() {
|
|
|
|
Screen &screen = *_vm->_screen;
|
|
|
|
Player &player = *_vm->_player;
|
|
|
|
EventsManager &events = *_vm->_events;
|
|
|
|
|
|
|
|
events.hideCursor();
|
|
|
|
screen.clearScreen();
|
|
|
|
screen.setBufferScan();
|
|
|
|
screen.fadeOut();
|
|
|
|
screen._scrollX = 0;
|
|
|
|
|
|
|
|
_vm->_room->buildScreen();
|
|
|
|
_vm->copyBF2Vid();
|
|
|
|
screen.fadeIn();
|
|
|
|
_vm->_oldRects.clear();
|
|
|
|
_vm->_newRects.clear();
|
2014-12-01 15:18:21 +01:00
|
|
|
_vm->_events->clearEvents();
|
2014-11-28 21:02:12 -05:00
|
|
|
|
|
|
|
screen._scrollRow = screen._scrollCol = 0;
|
|
|
|
screen._scrollX = screen._scrollY = 0;
|
|
|
|
player._rawPlayer = Common::Point(0, 0);
|
|
|
|
player._scrollAmount = 1;
|
|
|
|
|
|
|
|
_pCount = 0;
|
|
|
|
_planeCount = 0;
|
|
|
|
_propCount = 0;
|
|
|
|
_xCount = 0;
|
|
|
|
_position = Common::Point(20, 29);
|
|
|
|
|
|
|
|
while (!_vm->shouldQuit() && !events.isKeyMousePressed() &&
|
|
|
|
((screen._scrollCol + screen._vWindowWidth) != _vm->_room->_playFieldWidth)) {
|
|
|
|
events._vbCount = 4;
|
|
|
|
screen._scrollX += player._scrollAmount;
|
|
|
|
|
|
|
|
while (screen._scrollX >= TILE_WIDTH) {
|
|
|
|
screen._scrollX -= TILE_WIDTH;
|
|
|
|
++screen._scrollCol;
|
|
|
|
|
|
|
|
_vm->_buffer1.moveBufferLeft();
|
|
|
|
_vm->_room->buildColumn(screen._scrollCol + screen._vWindowWidth, screen._vWindowBytesWide);
|
|
|
|
}
|
|
|
|
|
|
|
|
scrollFly();
|
|
|
|
++_pCount;
|
|
|
|
|
|
|
|
while (!_vm->shouldQuit() && events._vbCount > 0) {
|
|
|
|
// To be rewritten when NEWTIMER is done
|
|
|
|
events.checkForNextFrameCounter();
|
|
|
|
_vm->_sound->playSound(0);
|
|
|
|
|
|
|
|
events.pollEventsAndWait();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
events.showCursor();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Plane::mWhileFall() {
|
|
|
|
Screen &screen = *_vm->_screen;
|
|
|
|
EventsManager &events = *_vm->_events;
|
|
|
|
|
|
|
|
events.hideCursor();
|
|
|
|
screen.clearScreen();
|
|
|
|
screen.setBufferScan();
|
|
|
|
screen.fadeOut();
|
|
|
|
screen._scrollX = 0;
|
|
|
|
|
|
|
|
_vm->_room->buildScreen();
|
|
|
|
_vm->copyBF2Vid();
|
|
|
|
screen.fadeIn();
|
|
|
|
_vm->_oldRects.clear();
|
|
|
|
_vm->_newRects.clear();
|
2014-12-01 15:18:21 +01:00
|
|
|
_vm->_events->clearEvents();
|
2014-11-28 21:02:12 -05:00
|
|
|
|
|
|
|
screen._scrollRow = screen._scrollCol = 0;
|
|
|
|
screen._scrollX = screen._scrollY = 0;
|
|
|
|
_vm->_player->_scrollAmount = 3;
|
|
|
|
_vm->_scaleI = 255;
|
|
|
|
|
|
|
|
_xCount = 0;
|
|
|
|
_planeCount = 0;
|
|
|
|
|
|
|
|
while (!_vm->shouldQuit() && !events.isKeyMousePressed() &&
|
|
|
|
(screen._scrollCol + screen._vWindowWidth != _vm->_room->_playFieldWidth)) {
|
|
|
|
events._vbCount = 4;
|
|
|
|
screen._scrollX += _vm->_player->_scrollAmount;
|
|
|
|
|
|
|
|
while (screen._scrollX >= TILE_WIDTH) {
|
|
|
|
screen._scrollX -= TILE_WIDTH;
|
|
|
|
++screen._scrollCol;
|
|
|
|
|
|
|
|
_vm->_buffer1.moveBufferLeft();
|
|
|
|
_vm->_room->buildColumn(screen._scrollCol + screen._vWindowWidth, screen._vWindowBytesWide);
|
|
|
|
}
|
|
|
|
|
|
|
|
scrollFall();
|
|
|
|
|
|
|
|
while (!_vm->shouldQuit() && events._vbCount > 0) {
|
|
|
|
events.pollEventsAndWait();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
events.showCursor();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
|
2014-11-29 11:53:50 -05:00
|
|
|
Jungle::Jungle(AmazonEngine *vm) : CampScene(vm) {
|
2014-11-28 21:02:12 -05:00
|
|
|
for (int i = 0; i < JUNGLE_SIZE; ++i) {
|
|
|
|
_jCnt[i] = _jungleX[i] = -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Jungle::jungleMove() {
|
|
|
|
const static int jungleY[3] = { 27, 30, 29 };
|
|
|
|
int count = 1;
|
|
|
|
int frameOffset = 0;
|
|
|
|
|
|
|
|
if (!_vm->_timers[0]._flag) {
|
|
|
|
++_vm->_timers[0]._flag;
|
|
|
|
_vm->_screen->_scrollX += _vm->_player->_scrollAmount;
|
|
|
|
|
|
|
|
for (int i = 0; i < 3; ++i) {
|
|
|
|
int newJCnt = (_jCnt[i] + 1) % 8;
|
|
|
|
_jCnt[i] = newJCnt;
|
|
|
|
_jungleX[i] += 5;
|
|
|
|
}
|
|
|
|
|
|
|
|
frameOffset = 4;
|
|
|
|
count = (_vm->_allenFlag != 1) ? 2 : 3;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = 0; i < count; ++i) {
|
|
|
|
ImageEntry ie;
|
|
|
|
ie._flags = IMGFLAG_UNSCALED;
|
|
|
|
ie._spritesPtr = _vm->_objectsTable[24];
|
|
|
|
ie._frameNumber = _jCnt[i] + frameOffset;
|
|
|
|
ie._position = Common::Point(_jungleX[i], jungleY[i]);
|
|
|
|
ie._offsetY = jungleY[i];
|
|
|
|
|
|
|
|
_vm->_images.addToList(ie);
|
|
|
|
frameOffset += 8;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Jungle::initJWalk2() {
|
|
|
|
const int JUNGLE1OBJ[7][4] = {
|
|
|
|
{ 2, 470, 0, 20 },
|
|
|
|
{ 0, 290, 0, 50 },
|
|
|
|
{ 1, 210, 0, 40 },
|
|
|
|
{ 0, 500, 0, 30 },
|
|
|
|
{ 1, 550, 0, 20 },
|
|
|
|
{ 0, 580, 0, 60 },
|
|
|
|
{ 1, 650, 0, 30 }
|
|
|
|
};
|
|
|
|
_vm->_screen->fadeOut();
|
|
|
|
_vm->_events->hideCursor();
|
|
|
|
_vm->_screen->clearScreen();
|
|
|
|
_vm->_buffer2.clearBuffer();
|
|
|
|
_vm->_screen->setBufferScan();
|
|
|
|
|
|
|
|
_vm->_screen->_scrollX = _vm->_screen->_scrollY;
|
|
|
|
_vm->_screen->_scrollCol = _vm->_screen->_scrollRow;
|
|
|
|
_vm->_room->buildScreen();
|
|
|
|
_vm->copyBF2Vid();
|
|
|
|
_vm->_screen->fadeIn();
|
2014-12-01 15:18:21 +01:00
|
|
|
_vm->_events->clearEvents();
|
2014-11-28 21:02:12 -05:00
|
|
|
|
|
|
|
_xCount = 2;
|
|
|
|
_vm->_player->_scrollAmount = 5;
|
|
|
|
_xTrack = -10;
|
|
|
|
_yTrack = _zTrack = 0;
|
|
|
|
_xCam = 480;
|
|
|
|
_yCam = 0;
|
|
|
|
_zCam = 80;
|
|
|
|
|
|
|
|
_vm->_timers[24]._timer = 1;
|
|
|
|
_vm->_timers[24]._initTm = 1;
|
|
|
|
++_vm->_timers[24]._flag;
|
|
|
|
|
|
|
|
_pNumObj = 7;
|
|
|
|
for (int i = 0; i < _pNumObj; i++) {
|
|
|
|
_pan[i]._pObject = _vm->_objectsTable[24];
|
|
|
|
_pan[i]._pImgNum = JUNGLE1OBJ[i][0];
|
|
|
|
_pan[i]._pObjX = JUNGLE1OBJ[i][1];
|
|
|
|
_pan[i]._pObjY = JUNGLE1OBJ[i][2];
|
|
|
|
_pan[i]._pObjZ = JUNGLE1OBJ[i][3];
|
|
|
|
_pan[i]._pObjXl = _pan[i]._pObjYl = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
_jCnt[0] = 0;
|
|
|
|
_jCnt[1] = 3;
|
|
|
|
_jCnt[2] = 5;
|
|
|
|
|
|
|
|
_jungleX[0] = 50;
|
|
|
|
_jungleX[1] = 16;
|
|
|
|
_jungleX[2] = 93;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Jungle::mWhileJWalk() {
|
|
|
|
Screen &screen = *_vm->_screen;
|
|
|
|
EventsManager &events = *_vm->_events;
|
|
|
|
Player &player = *_vm->_player;
|
|
|
|
|
|
|
|
static const int JUNGLE_OBJ[7][4] = {
|
|
|
|
{ 2, 77, 0, 40 },
|
|
|
|
{ 0, 290, 0, 50 },
|
|
|
|
{ 1, 210, 0, 70 },
|
|
|
|
{ 0, 50, 0, 30 },
|
|
|
|
{ 1, 70, 0, 20 },
|
|
|
|
{ 0, -280, 0, 60 },
|
|
|
|
{ 1, -150, 0, 30 },
|
|
|
|
};
|
|
|
|
|
|
|
|
screen.fadeOut();
|
|
|
|
events.hideCursor();
|
|
|
|
screen.clearScreen();
|
|
|
|
_vm->_buffer2.clearBuffer();
|
|
|
|
screen.setBufferScan();
|
|
|
|
screen._scrollX = 0;
|
|
|
|
|
|
|
|
// Build the initial jungle scene and fade it in
|
|
|
|
_vm->_room->buildScreen();
|
|
|
|
_vm->copyBF2Vid();
|
|
|
|
screen.fadeIn();
|
|
|
|
|
|
|
|
// Set up the player to walk horizontally
|
|
|
|
player._xFlag = 1;
|
|
|
|
player._yFlag = 0;
|
|
|
|
player._moveTo.x = 160;
|
|
|
|
player._playerMove = true;
|
|
|
|
|
|
|
|
_xCount = 2;
|
|
|
|
_xTrack = 10;
|
|
|
|
_yTrack = _zTrack = 0;
|
|
|
|
_xCam = 480;
|
|
|
|
_yCam = 0;
|
|
|
|
_zCam = 80;
|
|
|
|
|
|
|
|
TimerEntry *te = &_vm->_timers[24];
|
|
|
|
te->_initTm = te->_timer = 1;
|
|
|
|
te->_flag++;
|
|
|
|
|
|
|
|
_pNumObj = 7;
|
|
|
|
for (int i = 0; i < _pNumObj; i++) {
|
|
|
|
_pan[i]._pObject = _vm->_objectsTable[24];
|
|
|
|
_pan[i]._pImgNum = JUNGLE_OBJ[i][0];
|
|
|
|
_pan[i]._pObjX = JUNGLE_OBJ[i][1];
|
|
|
|
_pan[i]._pObjY = JUNGLE_OBJ[i][2];
|
|
|
|
_pan[i]._pObjZ = JUNGLE_OBJ[i][3];
|
|
|
|
_pan[i]._pObjXl = _pan[i]._pObjYl = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
while (!_vm->shouldQuit() && !events.isKeyMousePressed() && (player._xFlag != 2)) {
|
|
|
|
_vm->_images.clear();
|
|
|
|
events._vbCount = 6;
|
|
|
|
|
|
|
|
_pan[0]._pImgNum = _xCount;
|
|
|
|
if (_xCount == 2)
|
|
|
|
++_xCount;
|
|
|
|
else
|
|
|
|
--_xCount;
|
|
|
|
|
|
|
|
player.checkMove();
|
|
|
|
player.checkScroll();
|
|
|
|
pan();
|
|
|
|
scrollJWalk();
|
|
|
|
|
|
|
|
while (!_vm->shouldQuit() && events._vbCount > 0) {
|
|
|
|
events.pollEventsAndWait();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
_vm->_images.clear();
|
|
|
|
events.showCursor();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Jungle::mWhileJWalk2() {
|
|
|
|
Screen &screen = *_vm->_screen;
|
|
|
|
|
|
|
|
initJWalk2();
|
|
|
|
|
|
|
|
while (!_vm->shouldQuit() && !_vm->_events->isKeyMousePressed() &&
|
|
|
|
(screen._scrollCol + screen._vWindowWidth) != _vm->_room->_playFieldWidth) {
|
|
|
|
_vm->_images.clear();
|
|
|
|
_vm->_events->_vbCount = 6;
|
|
|
|
_pan[0]._pImgNum = _xCount;
|
|
|
|
|
|
|
|
jungleMove();
|
|
|
|
while (screen._scrollX >= TILE_WIDTH) {
|
|
|
|
screen._scrollX -= TILE_WIDTH;
|
|
|
|
++screen._scrollCol;
|
|
|
|
_vm->_buffer1.moveBufferLeft();
|
|
|
|
_vm->_room->buildColumn(screen._scrollCol + screen._vWindowWidth, screen._vWindowBytesWide);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_xCount == 2)
|
|
|
|
++_xCount;
|
|
|
|
else
|
|
|
|
--_xCount;
|
|
|
|
|
|
|
|
pan();
|
|
|
|
scrollJWalk();
|
|
|
|
|
|
|
|
while (!_vm->shouldQuit() && _vm->_events->_vbCount > 0) {
|
|
|
|
_vm->_events->pollEventsAndWait();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
_vm->_events->showCursor();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Jungle::scrollJWalk() {
|
|
|
|
_vm->copyBF1BF2();
|
|
|
|
_vm->_newRects.clear();
|
|
|
|
_vm->plotList();
|
|
|
|
_vm->copyRects();
|
|
|
|
_vm->copyBF2Vid();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
Guard::Guard(AmazonEngine *vm): PannedScene(vm) {
|
|
|
|
_guardCel = 0;
|
|
|
|
_gCode1 = _gCode2 = 0;
|
|
|
|
_xMid = _yMid = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Guard::setVerticalCode() {
|
|
|
|
_gCode1 = 0;
|
|
|
|
_gCode2 = 0;
|
|
|
|
if (_topLeft.x < _vm->_screen->_orgX1)
|
|
|
|
_gCode1 |= 8;
|
|
|
|
else if (_topLeft.x == _vm->_screen->_orgX1) {
|
|
|
|
_gCode1 |= 8;
|
|
|
|
_gCode1 |= 2;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
_gCode1 |= 2;
|
|
|
|
|
|
|
|
if (_bottomRight.x < _vm->_screen->_orgX1)
|
|
|
|
_gCode2 |= 8;
|
|
|
|
else if (_bottomRight.x == _vm->_screen->_orgX1) {
|
|
|
|
_gCode2 |= 8;
|
|
|
|
_gCode2 |= 2;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
_gCode2 |= 2;
|
|
|
|
|
|
|
|
if (_topLeft.y < _vm->_screen->_orgY1)
|
|
|
|
_gCode1 |= 4;
|
|
|
|
else if (_topLeft.y > _vm->_screen->_orgY2)
|
|
|
|
_gCode1 |= 1;
|
|
|
|
|
|
|
|
if (_bottomRight.y < _vm->_screen->_orgY1)
|
|
|
|
_gCode2 |= 4;
|
|
|
|
else if (_bottomRight.y > _vm->_screen->_orgY2)
|
|
|
|
_gCode2 |= 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Guard::setHorizontalCode() {
|
|
|
|
_gCode1 = 0;
|
|
|
|
_gCode2 = 0;
|
|
|
|
|
|
|
|
if (_topLeft.y < _vm->_screen->_orgY1)
|
|
|
|
_gCode1 |= 4;
|
|
|
|
else if (_topLeft.x == _vm->_screen->_orgX1) {
|
|
|
|
_gCode1 |= 4;
|
|
|
|
_gCode1 |= 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
_gCode1 |= 1;
|
|
|
|
|
|
|
|
if (_bottomRight.y < _vm->_screen->_orgY1)
|
|
|
|
_gCode2 |= 4;
|
|
|
|
else if (_bottomRight.x == _vm->_screen->_orgX1) {
|
|
|
|
_gCode2 |= 4;
|
|
|
|
_gCode2 |= 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
_gCode2 |= 1;
|
|
|
|
|
|
|
|
if (_topLeft.x < _vm->_screen->_orgX1)
|
|
|
|
_gCode1 |= 8;
|
|
|
|
else if (_topLeft.x > _vm->_screen->_orgX2)
|
|
|
|
_gCode1 |= 2;
|
|
|
|
|
|
|
|
if (_bottomRight.x < _vm->_screen->_orgX1)
|
|
|
|
_gCode2 |= 8;
|
|
|
|
else if (_bottomRight.y > _vm->_screen->_orgX2)
|
|
|
|
_gCode2 |= 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Guard::chkVLine() {
|
|
|
|
if (_position.x > _vm->_player->_rawPlayer.x) {
|
|
|
|
_topLeft = _vm->_player->_rawPlayer;
|
|
|
|
_bottomRight = _position;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
_topLeft = _position;
|
|
|
|
_bottomRight = _vm->_player->_rawPlayer;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_vm->_screen->_orgY1 > _vm->_screen->_orgY2)
|
|
|
|
SWAP(_vm->_screen->_orgY1, _vm->_screen->_orgY2);
|
|
|
|
|
|
|
|
for (;;) {
|
|
|
|
setVerticalCode();
|
|
|
|
int code = _gCode1 | _gCode2;
|
|
|
|
if (code == 10) {
|
|
|
|
_vm->_guardFind = 0;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
int code2 = _gCode1 & _gCode2;
|
|
|
|
code2 &= 5;
|
|
|
|
if (((code & 10) == 8) || ((code & 10) == 2) || (code2 != 0))
|
|
|
|
return;
|
|
|
|
|
|
|
|
int midX = (_topLeft.x + _bottomRight.x) / 2;
|
|
|
|
int midY = (_topLeft.y + _bottomRight.y) / 2;
|
|
|
|
|
|
|
|
if (midX < _vm->_screen->_orgX1) {
|
|
|
|
if ((midX == _topLeft.x) && (midY == _topLeft.y))
|
|
|
|
return;
|
|
|
|
|
|
|
|
_topLeft.x = midX;
|
|
|
|
_topLeft.y = midY;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if ((midX == _bottomRight.x) && (midY == _bottomRight.y))
|
|
|
|
return;
|
|
|
|
|
|
|
|
_bottomRight.x = midX;
|
|
|
|
_bottomRight.y = midY;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Guard::chkHLine() {
|
|
|
|
if (_position.y > _vm->_player->_rawPlayer.y) {
|
|
|
|
_topLeft = _vm->_player->_rawPlayer;
|
|
|
|
_bottomRight = _position;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
_topLeft = _position;
|
|
|
|
_bottomRight = _vm->_player->_rawPlayer;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_vm->_screen->_orgX1 > _vm->_screen->_orgX2)
|
|
|
|
SWAP(_vm->_screen->_orgX1, _vm->_screen->_orgX2);
|
|
|
|
|
|
|
|
while (true) {
|
|
|
|
setHorizontalCode();
|
|
|
|
int code = _gCode1 | _gCode2;
|
|
|
|
if (code == 5) {
|
|
|
|
_vm->_guardFind = 0;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
int code2 = _gCode1 & _gCode2;
|
|
|
|
code2 &= 10;
|
|
|
|
if (((code & 5) == 4) || ((code & 5) == 1) || (code2 != 0))
|
|
|
|
return;
|
|
|
|
|
|
|
|
int midX = (_topLeft.x + _bottomRight.x) / 2;
|
|
|
|
int midY = (_topLeft.y + _bottomRight.y) / 2;
|
|
|
|
|
|
|
|
if (midY < _vm->_screen->_orgY1) {
|
|
|
|
if ((midX == _topLeft.x) && (midY == _topLeft.y))
|
|
|
|
return;
|
|
|
|
|
|
|
|
_topLeft.x = midX;
|
|
|
|
_topLeft.y = midY;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if ((midX == _bottomRight.x) && (midY == _bottomRight.y))
|
|
|
|
return;
|
|
|
|
|
|
|
|
_bottomRight.x = midX;
|
|
|
|
_bottomRight.y = midY;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Guard::guardSee() {
|
|
|
|
int tmpY = (_vm->_screen->_scrollRow << 4) + _vm->_screen->_scrollY;
|
|
|
|
_vm->_flags[140] = 0;
|
|
|
|
if (tmpY > _position.y)
|
|
|
|
return;
|
|
|
|
|
|
|
|
tmpY += _vm->_screen->_vWindowLinesTall;
|
|
|
|
tmpY -= 11;
|
|
|
|
|
|
|
|
if (tmpY < _position.y)
|
|
|
|
return;
|
|
|
|
|
|
|
|
_vm->_guardFind = 1;
|
|
|
|
_vm->_flags[140] = 1;
|
|
|
|
|
|
|
|
for (uint16 idx = 0; idx < _vm->_room->_plotter._walls.size(); idx++) {
|
|
|
|
_vm->_screen->_orgX1 = _vm->_room->_plotter._walls[idx].left;
|
|
|
|
_vm->_screen->_orgY1 = _vm->_room->_plotter._walls[idx].top;
|
|
|
|
_vm->_screen->_orgX2 = _vm->_room->_plotter._walls[idx].right;
|
|
|
|
_vm->_screen->_orgY2 = _vm->_room->_plotter._walls[idx].bottom;
|
|
|
|
if (_vm->_screen->_orgX1 == _vm->_screen->_orgX2) {
|
|
|
|
chkVLine();
|
|
|
|
if (_vm->_guardFind == 0)
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else if (_vm->_screen->_orgY1 == _vm->_screen->_orgY2) {
|
|
|
|
chkHLine();
|
|
|
|
if (_vm->_guardFind == 0)
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Guard::setGuardFrame() {
|
|
|
|
ImageEntry ie;
|
|
|
|
ie._flags = IMGFLAG_UNSCALED;
|
|
|
|
|
|
|
|
if (_vm->_guardLocation == 4)
|
|
|
|
ie._flags |= IMGFLAG_BACKWARDS;
|
|
|
|
ie._spritesPtr = _vm->_objectsTable[37];
|
|
|
|
ie._frameNumber = _guardCel;
|
|
|
|
ie._position = _position;
|
|
|
|
ie._offsetY = 10;
|
|
|
|
_vm->_images.addToList(ie);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Guard::doGuard() {
|
|
|
|
if (_vm->_timers[8]._flag) {
|
|
|
|
setGuardFrame();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
++_vm->_timers[8]._flag;
|
|
|
|
++_guardCel;
|
|
|
|
int curCel = _guardCel;
|
|
|
|
|
|
|
|
switch (_vm->_guardLocation) {
|
|
|
|
case 1:
|
|
|
|
// Guard walking down
|
|
|
|
if (curCel <= 8 || curCel > 13)
|
|
|
|
_guardCel = curCel = 8;
|
|
|
|
|
|
|
|
_position.y += _vm->_player->_walkOffDown[curCel - 8];
|
|
|
|
guardSee();
|
|
|
|
if (_position.y >= 272) {
|
|
|
|
_position.y = 272;
|
|
|
|
_vm->_guardLocation = 2;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
// Guard walking left
|
|
|
|
if (curCel <= 43 || curCel > 48)
|
|
|
|
_guardCel = curCel = 43;
|
|
|
|
|
|
|
|
_position.x -= _vm->_player->_walkOffLeft[curCel - 43];
|
|
|
|
guardSee();
|
|
|
|
if (_position.x <= 56) {
|
|
|
|
_position.x = 56;
|
|
|
|
_vm->_guardLocation = 3;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
// Guard walking up
|
|
|
|
if (curCel <= 0 || curCel > 5)
|
|
|
|
_guardCel = curCel = 0;
|
|
|
|
|
|
|
|
_position.y -= _vm->_player->_walkOffUp[curCel];
|
|
|
|
guardSee();
|
|
|
|
if (_position.y <= 89) {
|
|
|
|
_position.y = 89;
|
|
|
|
_vm->_guardLocation = 4;
|
|
|
|
if (_vm->_flags[121] == 1)
|
|
|
|
_vm->_guardLocation = 5;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
// Guard walking right
|
|
|
|
if (curCel <= 43 || curCel > 48)
|
|
|
|
_guardCel = curCel = 43;
|
|
|
|
|
|
|
|
_position.x += _vm->_player->_walkOffRight[curCel - 43];
|
|
|
|
guardSee();
|
|
|
|
if (_position.x >= 127) {
|
|
|
|
_position.x = 127;
|
|
|
|
_vm->_guardLocation = 1;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
setGuardFrame();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Guard::setPosition(const Common::Point &pt) {
|
|
|
|
_position = pt;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
Cast::Cast(AmazonEngine *vm) : PannedScene(vm) {
|
|
|
|
}
|
|
|
|
|
|
|
|
void Cast::doCast(int param1) {
|
|
|
|
_vm->_screen->setDisplayScan();
|
|
|
|
_vm->_events->hideCursor();
|
|
|
|
_vm->_screen->forceFadeOut();
|
|
|
|
_vm->_screen->_clipHeight = 173;
|
|
|
|
_vm->_screen->clearScreen();
|
|
|
|
_vm->_chapter = 16;
|
|
|
|
_vm->tileScreen();
|
|
|
|
_vm->updateSummary(param1);
|
|
|
|
_vm->_screen->setPanel(3);
|
|
|
|
_vm->_chapter = 14;
|
|
|
|
|
|
|
|
Resource *spriteData = _vm->_files->loadFile(91, 0);
|
|
|
|
_vm->_objectsTable[0] = new SpriteResource(_vm, spriteData);
|
|
|
|
delete spriteData;
|
|
|
|
spriteData = _vm->_files->loadFile(91, 1);
|
|
|
|
_vm->_objectsTable[1] = new SpriteResource(_vm, spriteData);
|
|
|
|
delete spriteData;
|
|
|
|
|
|
|
|
_vm->_files->_setPaletteFlag = false;
|
|
|
|
_vm->_files->loadScreen(58, 1);
|
|
|
|
_vm->_buffer2.copyFrom(*_vm->_screen);
|
|
|
|
_vm->_buffer1.copyFrom(*_vm->_screen);
|
|
|
|
|
|
|
|
_xTrack = 0;
|
|
|
|
_yTrack = -6;
|
|
|
|
_zTrack = 0;
|
|
|
|
_xCam = _yCam = 0;
|
|
|
|
_zCam = 60;
|
|
|
|
|
|
|
|
_vm->_timers[24]._timer = 1;
|
|
|
|
_vm->_timers[24]._initTm = 1;
|
|
|
|
++_vm->_timers[24]._flag;
|
|
|
|
|
|
|
|
_pNumObj = 26;
|
|
|
|
for (int i = 0; i < _pNumObj; i++) {
|
|
|
|
_pan[i]._pObject = _vm->_objectsTable[0];
|
|
|
|
_pan[i]._pImgNum = CAST_END_OBJ[i][0];
|
|
|
|
_pan[i]._pObjX = CAST_END_OBJ[i][1];
|
|
|
|
_pan[i]._pObjY = CAST_END_OBJ[i][2];
|
|
|
|
_pan[i]._pObjZ = CAST_END_OBJ[i][3];
|
|
|
|
_pan[i]._pObjXl = _pan[i]._pObjYl = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
_pNumObj = 4;
|
|
|
|
for (int i = 0; i < _pNumObj; i++) {
|
|
|
|
_pan[26 + i]._pObject = _vm->_objectsTable[1];
|
|
|
|
_pan[26 + i]._pImgNum = CAST_END_OBJ1[i][0];
|
|
|
|
_pan[26 + i]._pObjX = CAST_END_OBJ1[i][1];
|
|
|
|
_pan[26 + i]._pObjY = CAST_END_OBJ1[i][2];
|
|
|
|
_pan[26 + i]._pObjZ = CAST_END_OBJ1[i][3];
|
|
|
|
_pan[26 + i]._pObjXl = _pan[26 + i]._pObjYl = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
_vm->_oldRects.clear();
|
|
|
|
_vm->_newRects.clear();
|
|
|
|
_vm->_numAnimTimers = 0;
|
|
|
|
|
2014-12-01 07:49:26 +01:00
|
|
|
_vm->_midi->newMusic(58, 0);
|
2014-11-28 21:02:12 -05:00
|
|
|
_vm->_screen->forceFadeIn();
|
|
|
|
|
|
|
|
while (!_vm->shouldQuit()) {
|
|
|
|
_vm->_images.clear();
|
|
|
|
pan();
|
|
|
|
_vm->_buffer2.copyFrom(_vm->_buffer1);
|
|
|
|
_vm->_newRects.clear();
|
|
|
|
_vm->plotList();
|
|
|
|
_vm->copyBlocks();
|
|
|
|
|
|
|
|
_vm->_events->pollEvents();
|
|
|
|
if (_vm->_events->isKeyMousePressed())
|
|
|
|
break;
|
|
|
|
|
|
|
|
if (_yCam < -7550) {
|
|
|
|
_vm->_events->_vbCount = 50;
|
|
|
|
|
|
|
|
while (!_vm->shouldQuit() && !_vm->_events->isKeyMousePressed() && _vm->_events->_vbCount > 0) {
|
|
|
|
_vm->_events->pollEventsAndWait();
|
|
|
|
}
|
|
|
|
|
2014-12-01 07:49:26 +01:00
|
|
|
while (!_vm->shouldQuit() && !_vm->_midi->checkMidiDone())
|
2014-11-28 21:02:12 -05:00
|
|
|
_vm->_events->pollEventsAndWait();
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-12-01 07:49:26 +01:00
|
|
|
_vm->_midi->newMusic(58, 1);
|
2014-11-28 21:02:12 -05:00
|
|
|
_vm->_events->showCursor();
|
|
|
|
|
|
|
|
_vm->freeCells();
|
|
|
|
_vm->_oldRects.clear();
|
|
|
|
_vm->_newRects.clear();
|
|
|
|
_vm->_numAnimTimers = 0;
|
|
|
|
_vm->_images.clear();
|
|
|
|
_vm->_screen->forceFadeOut();
|
|
|
|
|
|
|
|
_vm->quitGame();
|
|
|
|
_vm->_events->pollEvents();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
River::River(AmazonEngine *vm): PannedScene(vm) {
|
|
|
|
_CHICKENOUTFLG = false;
|
|
|
|
_rScrollRow = 0;
|
|
|
|
_rScrollCol = 0;
|
|
|
|
_rScrollX = 0;
|
|
|
|
_rScrollY = 0;
|
|
|
|
_rOldRectCount = 0;
|
|
|
|
_rNewRectCount = 0;
|
|
|
|
_rKeyFlag = 0;
|
|
|
|
_mapOffset = 0;
|
|
|
|
_screenVirtX = 0;
|
2014-11-28 22:12:45 -05:00
|
|
|
_saveRiver = false;
|
2014-11-28 21:02:12 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
void River::setRiverPan() {
|
|
|
|
int delta = (_vm->_screen->_scrollCol * 16) + _vm->_screen->_scrollX;
|
|
|
|
|
|
|
|
_xTrack = 9;
|
|
|
|
_yTrack = _zTrack = 0;
|
|
|
|
_xCam = 160;
|
|
|
|
_yCam = 0;
|
|
|
|
_zCam = 80;
|
|
|
|
|
|
|
|
_vm->_timers[24]._timer = 1;
|
|
|
|
_vm->_timers[24]._initTm = 1;
|
|
|
|
++_vm->_timers[24]._flag;
|
|
|
|
|
|
|
|
_pNumObj = 23;
|
|
|
|
for (int i = 0; i < _pNumObj; i++) {
|
|
|
|
_pan[i]._pObject = _vm->_objectsTable[45];
|
|
|
|
_pan[i]._pImgNum = RIVER1OBJ[i][0];
|
|
|
|
_pan[i]._pObjX = RIVER1OBJ[i][1] + delta;
|
|
|
|
_pan[i]._pObjY = RIVER1OBJ[i][2];
|
|
|
|
_pan[i]._pObjZ = RIVER1OBJ[i][3];
|
|
|
|
_pan[i]._pObjXl = _pan[i]._pObjYl = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void River::initRiver() {
|
|
|
|
static const int RIVERVXTBL[3] = { 6719, 7039, 8319 };
|
|
|
|
|
|
|
|
_vm->_events->centerMousePos();
|
|
|
|
_vm->_events->restrictMouse();
|
|
|
|
_vm->_screen->setDisplayScan();
|
|
|
|
_vm->_screen->clearScreen();
|
|
|
|
_vm->_screen->savePalette();
|
|
|
|
_vm->_screen->forceFadeOut();
|
|
|
|
|
|
|
|
_vm->_files->_setPaletteFlag = false;
|
|
|
|
_vm->_files->loadScreen(95, 4);
|
|
|
|
_vm->_buffer2.copyFrom(*_vm->_screen);
|
|
|
|
|
|
|
|
_vm->_screen->restorePalette();
|
|
|
|
_vm->_screen->setBufferScan();
|
|
|
|
_vm->_destIn = &_vm->_buffer2;
|
|
|
|
_vm->_room->roomMenu();
|
|
|
|
|
2014-11-28 22:12:45 -05:00
|
|
|
if (_saveRiver) {
|
2014-11-28 21:02:12 -05:00
|
|
|
// Restoring a savegame, so set properties from saved fields
|
|
|
|
_vm->_screen->_scrollRow = _rScrollRow;
|
|
|
|
_vm->_screen->_scrollCol = _rScrollCol;
|
|
|
|
_vm->_screen->_scrollX = _rScrollX;
|
|
|
|
_vm->_screen->_scrollY = _rScrollY;
|
|
|
|
} else {
|
|
|
|
// Set initial scene state
|
|
|
|
_vm->_screen->_scrollRow = 0;
|
|
|
|
_vm->_screen->_scrollCol = 140;
|
|
|
|
_vm->_screen->_scrollX = 0;
|
|
|
|
_vm->_screen->_scrollY = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
_vm->_room->buildScreen();
|
|
|
|
_vm->copyBF2Vid();
|
|
|
|
_vm->_screen->forceFadeIn();
|
|
|
|
|
2014-11-28 22:12:45 -05:00
|
|
|
if (_saveRiver) {
|
2014-11-28 21:02:12 -05:00
|
|
|
// Restore draw rects from savegame
|
|
|
|
_vm->_oldRects.resize(_rOldRectCount);
|
|
|
|
_vm->_newRects.resize(_rNewRectCount);
|
|
|
|
// KEYFLG = _vm->_rKeyFlag
|
|
|
|
} else {
|
|
|
|
// Reset draw rects
|
|
|
|
_vm->_oldRects.clear();
|
|
|
|
_vm->_newRects.clear();
|
2014-12-01 15:18:21 +01:00
|
|
|
_vm->_events->clearEvents();
|
|
|
|
|
2014-11-28 21:02:12 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
_vm->_player->_scrollAmount = 2;
|
|
|
|
setRiverPan();
|
|
|
|
_vm->_timers[3]._timer = 1;
|
|
|
|
_vm->_timers[3]._initTm = 1;
|
|
|
|
++_vm->_timers[3]._flag;
|
|
|
|
|
|
|
|
_canoeFrame = 0;
|
|
|
|
_mapPtr = (const byte *)MAPTBL[_vm->_riverFlag] + 1;
|
2014-11-28 22:12:45 -05:00
|
|
|
if (_saveRiver) {
|
2014-11-28 21:02:12 -05:00
|
|
|
_mapPtr--;
|
|
|
|
_mapPtr += _mapOffset;
|
|
|
|
} else {
|
|
|
|
_screenVertX = RIVERVXTBL[_vm->_riverFlag] - 320;
|
|
|
|
_canoeLane = 3;
|
|
|
|
_hitCount = 0;
|
|
|
|
_hitSafe = 0;
|
|
|
|
_canoeYPos = 71;
|
|
|
|
}
|
|
|
|
|
|
|
|
_riverIndex = _vm->_riverFlag;
|
|
|
|
_topList = RIVEROBJECTTBL[_riverIndex];
|
|
|
|
updateObstacles();
|
|
|
|
riverSetPhysX();
|
|
|
|
_canoeDir = 0;
|
|
|
|
_vm->_deathFlag = 0;
|
|
|
|
_vm->_deathCount = 0;
|
|
|
|
|
|
|
|
_vm->_timers[11]._timer = 1200;
|
|
|
|
_vm->_timers[11]._initTm = 1200;
|
|
|
|
++_vm->_timers[11]._flag;
|
|
|
|
_vm->_timers[12]._timer = 1500;
|
|
|
|
_vm->_timers[12]._initTm = 1500;
|
|
|
|
++_vm->_timers[12]._flag;
|
|
|
|
|
|
|
|
_vm->_maxHits = 2 - _vm->_riverFlag;
|
2014-11-28 22:12:45 -05:00
|
|
|
_saveRiver = false;
|
2014-11-28 21:02:12 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
void River::resetPositions() {
|
|
|
|
riverSetPhysX();
|
|
|
|
int val = (_vm->_screen->_scrollCol + 1 - _vm->_oldScrollCol) * 16;
|
|
|
|
if (val > 256) {
|
|
|
|
val &= 0x7F;
|
|
|
|
val |= 0x80;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = 0; i < _pNumObj; i++)
|
|
|
|
_pan[i]._pObjX += val;
|
|
|
|
}
|
|
|
|
|
|
|
|
void River::checkRiverPan() {
|
|
|
|
int val = (_vm->_screen->_scrollCol + 20) * 16;
|
|
|
|
|
|
|
|
for (int i = 0; i < _pNumObj; i++) {
|
|
|
|
if (_pan[i]._pObjX < val)
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
setRiverPan();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool River::riverJumpTest() {
|
|
|
|
if (_vm->_screen->_scrollCol == 120 || _vm->_screen->_scrollCol == 60 || _vm->_screen->_scrollCol == 0) {
|
|
|
|
int val = _mapPtr[0];
|
|
|
|
++_mapPtr;
|
|
|
|
if (val == 0xFF)
|
|
|
|
return true;
|
|
|
|
_vm->_oldScrollCol = _vm->_screen->_scrollCol;
|
|
|
|
|
|
|
|
if (val == 0) {
|
|
|
|
_vm->_screen->_scrollCol = 139;
|
|
|
|
_vm->_screen->_scrollX = 14;
|
|
|
|
_vm->_room->buildScreen();
|
|
|
|
resetPositions();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
} else if (_vm->_screen->_scrollCol == 105) {
|
|
|
|
int val1 = _mapPtr[1];
|
|
|
|
int val2 = _mapPtr[2];
|
|
|
|
_mapPtr += 3;
|
|
|
|
if (_canoeLane < 3) {
|
|
|
|
if (val1 != 0) {
|
|
|
|
_vm->_deathFlag = true;
|
|
|
|
_vm->_deathCount = 300;
|
|
|
|
_vm->_deathType = val2;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (val1 != 1) {
|
|
|
|
_vm->_deathFlag = true;
|
|
|
|
_vm->_deathCount = 300;
|
|
|
|
_vm->_deathType = val2;
|
|
|
|
}
|
|
|
|
_vm->_oldScrollCol = _vm->_screen->_scrollCol;
|
|
|
|
_vm->_screen->_scrollCol = 44;
|
|
|
|
_vm->_screen->_scrollX = 14;
|
|
|
|
_vm->_room->buildScreen();
|
|
|
|
resetPositions();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
_vm->_screen->_scrollX = 14;
|
|
|
|
--_vm->_screen->_scrollCol;
|
|
|
|
_vm->_buffer1.moveBufferRight();
|
|
|
|
_vm->_room->buildColumn(_vm->_screen->_scrollCol, 0);
|
|
|
|
checkRiverPan();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void River::riverSound() {
|
|
|
|
if (_vm->_timers[11]._flag == 0) {
|
|
|
|
++_vm->_timers[11]._flag;
|
|
|
|
_vm->_sound->playSound(2);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_vm->_timers[12]._flag == 0) {
|
|
|
|
++_vm->_timers[12]._flag;
|
|
|
|
_vm->_sound->playSound(3);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((_xCam >= 1300) && (_xCam <= 1320))
|
|
|
|
_vm->_sound->playSound(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
void River::moveCanoe() {
|
|
|
|
Screen &screen = *_vm->_screen;
|
|
|
|
EventsManager &events = *_vm->_events;
|
|
|
|
Common::Point pt = events.calcRawMouse();
|
|
|
|
|
|
|
|
// Do an event polling
|
|
|
|
_vm->_canSaveLoad = true;
|
|
|
|
events.pollEvents();
|
|
|
|
_vm->_canSaveLoad = false;
|
|
|
|
if (_vm->_room->_function == FN_CLEAR1)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (_canoeDir) {
|
|
|
|
// Canoe movement in progress
|
|
|
|
moveCanoe2();
|
|
|
|
} else {
|
|
|
|
if (events._leftButton && pt.y >= 140) {
|
|
|
|
if (pt.x < RMOUSE[8][0]) {
|
|
|
|
// Disk icon wasn't clicked
|
|
|
|
_vm->_scripts->printString(BAR_MESSAGE);
|
|
|
|
} else {
|
|
|
|
// Clicked on the Disc icon
|
2014-11-28 22:12:45 -05:00
|
|
|
_saveRiver = true;
|
2014-11-28 21:02:12 -05:00
|
|
|
_rScrollRow = screen._scrollRow;
|
|
|
|
_rScrollCol = screen._scrollCol;
|
|
|
|
_rScrollX = screen._scrollX;
|
|
|
|
_rScrollY = screen._scrollY;
|
|
|
|
_mapOffset = _mapPtr - MAPTBL[_vm->_riverFlag];
|
|
|
|
|
|
|
|
// Show the ScummVM menu
|
|
|
|
_vm->_room->handleCommand(9);
|
|
|
|
|
|
|
|
if (_vm->_room->_function != FN_CLEAR1) {
|
2014-11-28 22:12:45 -05:00
|
|
|
_saveRiver = false;
|
2014-11-28 21:02:12 -05:00
|
|
|
_vm->_room->buildScreen();
|
|
|
|
_vm->copyBF2Vid();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if ((events._leftButton && pt.y <= _canoeYPos) ||
|
|
|
|
(!events._leftButton && _vm->_player->_move == UP)) {
|
|
|
|
// Move canoe up
|
|
|
|
if (_canoeLane > 0) {
|
|
|
|
_canoeDir = -1;
|
|
|
|
_canoeMoveCount = 0;
|
|
|
|
|
|
|
|
moveCanoe2();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (events._leftButton || _vm->_player->_move == DOWN) {
|
|
|
|
// Move canoe down
|
|
|
|
if (_canoeLane < 7) {
|
|
|
|
_canoeDir = 1;
|
|
|
|
_canoeMoveCount = 0;
|
|
|
|
|
|
|
|
moveCanoe2();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void River::moveCanoe2() {
|
|
|
|
_canoeYPos += _canoeDir;
|
|
|
|
|
|
|
|
if (++_canoeMoveCount == 5) {
|
|
|
|
_canoeLane += _canoeDir;
|
|
|
|
_canoeDir = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void River::updateObstacles() {
|
|
|
|
RiverStruct *cur;
|
|
|
|
for (cur = _topList; cur < RIVEROBJECTTBL[_riverIndex + 1]; ++cur) {
|
|
|
|
int val = cur->_field1 + cur->_field3 - 1;
|
|
|
|
if (val < _screenVertX)
|
|
|
|
break;
|
|
|
|
|
|
|
|
if (cur->_field3 < (_screenVirtX + 319)) {
|
|
|
|
_topList = cur;
|
|
|
|
_botList = cur;
|
|
|
|
|
|
|
|
while (cur < RIVEROBJECTTBL[_riverIndex + 1]) {
|
|
|
|
++cur;
|
|
|
|
val = cur->_field1 + cur->_field3 - 1;
|
|
|
|
if (val < _screenVertX || (cur->_field3 >= (_screenVirtX + 319)))
|
|
|
|
break;
|
|
|
|
|
|
|
|
_botList = cur;
|
|
|
|
}
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
cur = _topList;
|
|
|
|
cur--;
|
|
|
|
_botList = cur;
|
|
|
|
}
|
|
|
|
|
|
|
|
void River::riverSetPhysX() {
|
|
|
|
int val = (_vm->_screen->_scrollCol * 16) + _vm->_screen->_scrollX;
|
|
|
|
RiverStruct *cur = _topList;
|
|
|
|
while (cur <= _botList) {
|
|
|
|
cur[0]._field5 = val - (_screenVertX - cur[0]._field3);
|
|
|
|
++cur;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool River::checkRiverCollide() {
|
|
|
|
if (_hitSafe)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
_canoeVXPos = _screenVertX + 170;
|
|
|
|
|
|
|
|
for (RiverStruct *si = _topList; si <= _botList; ++si) {
|
|
|
|
if (si[0]._lane < _canoeLane)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if ((si[0]._lane == _canoeLane) || (si[0]._lane == _canoeLane + 1)) {
|
|
|
|
if (si[0]._field1 + si[0]._field3 - 1 >= _canoeVXPos) {
|
|
|
|
if (_canoeVXPos + 124 >= si[0]._field3) {
|
|
|
|
_vm->_sound->playSound(4);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void River::plotRiver() {
|
|
|
|
if (_vm->_timers[3]._flag == 0) {
|
|
|
|
++_vm->_timers[3]._flag;
|
|
|
|
if (_canoeFrame == 12)
|
|
|
|
_canoeFrame = 0;
|
|
|
|
else
|
|
|
|
++_canoeFrame;
|
|
|
|
}
|
|
|
|
|
|
|
|
ImageEntry ie;
|
|
|
|
ie._flags = IMGFLAG_UNSCALED;
|
|
|
|
ie._spritesPtr = _vm->_objectsTable[45];
|
|
|
|
ie._frameNumber = _canoeFrame;
|
|
|
|
ie._position.x = (_vm->_screen->_scrollCol * 16) + _vm->_screen->_scrollX + 160;
|
|
|
|
ie._position.y = _canoeYPos - 41;
|
|
|
|
ie._offsetY = 41;
|
|
|
|
_vm->_images.addToList(ie);
|
|
|
|
|
|
|
|
RiverStruct *cur = _topList;
|
|
|
|
while (cur <= _botList) {
|
|
|
|
if (cur[0]._id != -1) {
|
|
|
|
ie._flags = IMGFLAG_UNSCALED;
|
|
|
|
ie._spritesPtr = _vm->_objectsTable[45];
|
|
|
|
ie._frameNumber = 0;
|
|
|
|
ie._position.x = cur[0]._field5;
|
|
|
|
int val = (cur[0]._lane * 5) + 56;
|
|
|
|
ie._position.y = val - cur[0]._field8;
|
|
|
|
ie._offsetY = cur[0]._field8;
|
|
|
|
_vm->_images.addToList(ie);
|
|
|
|
}
|
|
|
|
++cur;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void River::mWhileDownRiver() {
|
|
|
|
_vm->_events->hideCursor();
|
|
|
|
_vm->_screen->setDisplayScan();
|
|
|
|
_vm->_screen->clearScreen();
|
|
|
|
_vm->_screen->savePalette();
|
|
|
|
|
|
|
|
_vm->_files->loadScreen(95, 4);
|
|
|
|
_vm->_buffer2.copyFrom(*_vm->_screen);
|
|
|
|
_vm->_screen->restorePalette();
|
|
|
|
_vm->_screen->setPalette();
|
|
|
|
_vm->_screen->setBufferScan();
|
|
|
|
_vm->_screen->_scrollX = 0;
|
|
|
|
_vm->_room->buildScreen();
|
|
|
|
_vm->copyBF2Vid();
|
|
|
|
|
|
|
|
_vm->_player->_scrollAmount = 2;
|
|
|
|
_vm->_destIn = &_vm->_buffer2;
|
|
|
|
_xTrack = -7;
|
|
|
|
_yTrack = _zTrack = 0;
|
|
|
|
_xCam = _yCam = 0;
|
|
|
|
_zCam = 80;
|
|
|
|
|
|
|
|
_vm->_timers[24]._timer = 1;
|
|
|
|
_vm->_timers[24]._initTm = 1;
|
|
|
|
++_vm->_timers[24]._flag;
|
|
|
|
|
|
|
|
_pNumObj = 14;
|
|
|
|
for (int i = 0; i <_pNumObj; i++) {
|
|
|
|
_pan[i]._pObject = _vm->_objectsTable[33];
|
|
|
|
_pan[i]._pImgNum = DOWNRIVEROBJ[i][0];
|
|
|
|
_pan[i]._pObjX = DOWNRIVEROBJ[i][1];
|
|
|
|
_pan[i]._pObjY = DOWNRIVEROBJ[i][2];
|
|
|
|
_pan[i]._pObjZ = DOWNRIVEROBJ[i][3];
|
|
|
|
_pan[i]._pObjXl = _pan[i]._pObjYl = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
_vm->_timers[3]._timer = 200;
|
|
|
|
_vm->_timers[3]._initTm = 200;
|
|
|
|
++_vm->_timers[3]._flag;
|
|
|
|
_vm->_timers[4]._timer = 350;
|
|
|
|
_vm->_timers[4]._initTm = 350;
|
|
|
|
++_vm->_timers[4]._flag;
|
|
|
|
|
|
|
|
while (!_vm->shouldQuit() && !_vm->_events->isKeyMousePressed() &&
|
|
|
|
(_vm->_screen->_scrollCol + _vm->_screen->_vWindowWidth != _vm->_room->_playFieldWidth)) {
|
|
|
|
_vm->_images.clear();
|
|
|
|
_vm->_events->_vbCount = 6;
|
|
|
|
|
|
|
|
_vm->_screen->_scrollX += _vm->_player->_scrollAmount;
|
|
|
|
while (_vm->_screen->_scrollX >= TILE_WIDTH) {
|
|
|
|
_vm->_screen->_scrollX -= TILE_WIDTH;
|
|
|
|
++_vm->_screen->_scrollCol;
|
|
|
|
_vm->_buffer1.moveBufferLeft();
|
|
|
|
_vm->_room->buildColumn(_vm->_screen->_scrollCol + _vm->_screen->_vWindowWidth, _vm->_screen->_vWindowBytesWide);
|
|
|
|
}
|
|
|
|
|
|
|
|
pan();
|
|
|
|
scrollRiver();
|
|
|
|
|
|
|
|
if (!_vm->_timers[3]._flag) {
|
|
|
|
++_vm->_timers[3]._flag;
|
|
|
|
_vm->_sound->playSound(1);
|
|
|
|
}
|
|
|
|
else if (!_vm->_timers[4]._flag) {
|
|
|
|
++_vm->_timers[4]._flag;
|
|
|
|
_vm->_sound->playSound(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
while (!_vm->shouldQuit() && _vm->_events->_vbCount > 0) {
|
|
|
|
_vm->_events->pollEventsAndWait();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
_vm->_events->showCursor();
|
|
|
|
}
|
|
|
|
|
|
|
|
void River::scrollRiver() {
|
|
|
|
_vm->copyBF1BF2();
|
|
|
|
_vm->_newRects.clear();
|
|
|
|
_vm->_buffer2.plotImage(_vm->_objectsTable[33], 0, Common::Point(66, 30));
|
|
|
|
_vm->plotList();
|
|
|
|
_vm->copyRects();
|
|
|
|
_vm->copyBF2Vid();
|
|
|
|
}
|
|
|
|
|
|
|
|
void River::scrollRiver1() {
|
|
|
|
_vm->copyBF1BF2();
|
|
|
|
_vm->_newRects.clear();
|
|
|
|
plotRiver();
|
|
|
|
_vm->plotList();
|
|
|
|
_vm->copyRects();
|
|
|
|
_vm->copyBF2Vid();
|
|
|
|
}
|
|
|
|
|
|
|
|
void River::river() {
|
|
|
|
static const int RIVERDEATH[5] = { 22, 23, 24, 25, 26 };
|
|
|
|
|
|
|
|
initRiver();
|
|
|
|
_vm->_events->showCursor();
|
|
|
|
|
|
|
|
while (!_vm->shouldQuit()) {
|
|
|
|
_vm->_events->_vbCount = 4;
|
|
|
|
|
|
|
|
// int bx = _vm->_player->_scrollAmount - _screenVertX;
|
|
|
|
if (_vm->_screen->_scrollX == 0) {
|
2014-12-01 07:49:26 +01:00
|
|
|
_vm->_midi->midiRepeat();
|
2014-11-28 21:02:12 -05:00
|
|
|
if (riverJumpTest()) {
|
|
|
|
_CHICKENOUTFLG = false;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
_vm->_screen->_scrollX -= _vm->_player->_scrollAmount;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_CHICKENOUTFLG) {
|
|
|
|
_CHICKENOUTFLG = false;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
_vm->_images.clear();
|
|
|
|
_vm->_animation->animate(0);
|
|
|
|
|
|
|
|
riverSound();
|
|
|
|
pan();
|
|
|
|
moveCanoe();
|
|
|
|
|
|
|
|
if (_vm->_room->_function != FN_CLEAR1) {
|
|
|
|
updateObstacles();
|
|
|
|
riverSetPhysX();
|
|
|
|
bool checkCollide = checkRiverCollide();
|
|
|
|
if (_hitSafe != 0)
|
|
|
|
_hitSafe -= 2;
|
|
|
|
|
|
|
|
if (checkCollide) {
|
|
|
|
_vm->dead(RIVERDEATH[0]);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_vm->_deathFlag) {
|
|
|
|
_vm->_deathCount--;
|
|
|
|
if (_vm->_deathCount == 0) {
|
|
|
|
_vm->dead(RIVERDEATH[_vm->_deathType]);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Scroll the river
|
|
|
|
scrollRiver1();
|
|
|
|
|
|
|
|
// Allow time for new scrolled river position to be shown
|
|
|
|
_vm->_canSaveLoad = true;
|
|
|
|
while (!_vm->shouldQuit() && _vm->_room->_function == FN_NONE &&
|
|
|
|
_vm->_events->_vbCount > 0) {
|
|
|
|
_vm->_events->pollEventsAndWait();
|
|
|
|
}
|
|
|
|
_vm->_canSaveLoad = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_vm->_room->_function == FN_CLEAR1) {
|
|
|
|
_vm->_scripts->_endFlag = true;
|
|
|
|
_vm->_scripts->_returnCode = 0;
|
|
|
|
_CHICKENOUTFLG = false;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void River::synchronize(Common::Serializer &s) {
|
2014-11-28 21:12:59 -05:00
|
|
|
if (_vm->_player->_roomNumber == 45) {
|
|
|
|
s.syncAsSint16LE(_canoeLane);
|
|
|
|
s.syncAsSint16LE(_canoeYPos);
|
|
|
|
s.syncAsSint16LE(_hitCount);
|
|
|
|
s.syncAsSint16LE(_riverIndex);
|
|
|
|
s.syncAsSint16LE(_hitSafe);
|
|
|
|
s.syncAsUint16LE(_rScrollRow);
|
|
|
|
s.syncAsUint16LE(_rScrollCol);
|
|
|
|
s.syncAsSint16LE(_rScrollX);
|
|
|
|
s.syncAsSint16LE(_rScrollY);
|
|
|
|
s.syncAsUint16LE(_rOldRectCount);
|
|
|
|
s.syncAsUint16LE(_rNewRectCount);
|
|
|
|
s.syncAsUint16LE(_rKeyFlag);
|
|
|
|
s.syncAsUint16LE(_mapOffset);
|
|
|
|
s.syncAsUint16LE(_screenVirtX);
|
|
|
|
warning("TODO: s.syncAsSint16LE(_topList);");
|
|
|
|
warning("TODO: s.syncAsSint16LE(_botList);");
|
2014-11-28 22:12:45 -05:00
|
|
|
|
|
|
|
_saveRiver = s.isLoading();
|
2014-11-28 21:12:59 -05:00
|
|
|
}
|
2014-11-28 21:02:12 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
Ant::Ant(AmazonEngine *vm) : AmazonManager(vm) {
|
|
|
|
_antDirection = NONE;
|
|
|
|
_pitDirection = NONE;
|
|
|
|
_antCel = 0;
|
|
|
|
_torchCel = 0;
|
|
|
|
_pitCel = 0;
|
|
|
|
_stabCel = 0;
|
|
|
|
_antPos = Common::Point(0, 0);
|
|
|
|
_antDieFl = _antEatFl = false;
|
|
|
|
_stabFl = false;
|
|
|
|
_pitPos = Common::Point(0, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Ant::plotTorchSpear(int indx, const int *&buf) {
|
|
|
|
int idx = indx;
|
|
|
|
|
|
|
|
ImageEntry ie;
|
|
|
|
ie._flags = IMGFLAG_UNSCALED;
|
|
|
|
ie._spritesPtr = _vm->_objectsTable[62];
|
|
|
|
ie._frameNumber = buf[(idx / 2)];
|
|
|
|
ie._position = Common::Point(_pitPos.x + buf[(idx / 2) + 1], _pitPos.y + buf[(idx / 2) + 2]);
|
|
|
|
ie._offsetY = 255;
|
|
|
|
_vm->_images.addToList(ie);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Ant::plotPit(int indx, const int *&buf) {
|
|
|
|
int idx = indx;
|
|
|
|
ImageEntry ie;
|
|
|
|
ie._flags = IMGFLAG_UNSCALED;
|
|
|
|
ie._spritesPtr = _vm->_objectsTable[62];
|
|
|
|
ie._frameNumber = buf[(idx / 2)];
|
|
|
|
ie._position = Common::Point(_pitPos.x, _pitPos.y);
|
|
|
|
ie._offsetY = _pitPos.y;
|
|
|
|
_vm->_images.addToList(ie);
|
|
|
|
|
|
|
|
_vm->_player->_rawPlayer = _pitPos;
|
|
|
|
if (_vm->_inventory->_inv[76]._value == 1) {
|
|
|
|
idx = _torchCel;
|
|
|
|
buf = Amazon::TORCH;
|
|
|
|
_vm->_timers[14]._flag = 1;
|
|
|
|
idx += 6;
|
|
|
|
if (buf[idx / 2] == -1)
|
|
|
|
idx = 0;
|
|
|
|
_torchCel = idx;
|
|
|
|
plotTorchSpear(idx, buf);
|
|
|
|
}
|
|
|
|
else if (!_stabFl && (_vm->_inventory->_inv[78]._value == 1)) {
|
|
|
|
idx = 0;
|
|
|
|
buf = Amazon::SPEAR;
|
|
|
|
plotTorchSpear(idx, buf);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int Ant::antHandleRight(int indx, const int *&buf) {
|
|
|
|
int retval = indx;
|
|
|
|
if (_pitDirection == NONE) {
|
|
|
|
_pitDirection = UP;
|
|
|
|
_pitPos.y = 127;
|
|
|
|
}
|
|
|
|
retval = _pitCel;
|
|
|
|
buf = Amazon::PITWALK;
|
|
|
|
if (_pitPos.x < 230) {
|
|
|
|
if (retval == 0) {
|
|
|
|
retval = 48;
|
|
|
|
_pitPos.y = 127;
|
|
|
|
}
|
|
|
|
retval -= 6;
|
|
|
|
_pitPos.x -= buf[(retval / 2) + 1];
|
|
|
|
_pitPos.y -= buf[(retval / 2) + 2];
|
|
|
|
_pitCel = retval;
|
|
|
|
}
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
|
|
|
|
int Ant::antHandleLeft(int indx, const int *&buf) {
|
|
|
|
int retval = indx;
|
|
|
|
if (_pitDirection == UP) {
|
|
|
|
_pitDirection = NONE;
|
|
|
|
_pitPos.y = 127;
|
|
|
|
}
|
|
|
|
retval = _pitCel;
|
|
|
|
buf = Amazon::PITWALK;
|
|
|
|
retval += 6;
|
|
|
|
if (buf[retval / 2] == -1) {
|
|
|
|
retval = 0;
|
|
|
|
_pitPos.y = 127;
|
|
|
|
}
|
|
|
|
_pitPos.x += buf[(retval / 2) + 1];
|
|
|
|
_pitPos.y += buf[(retval / 2) + 2];
|
|
|
|
_pitCel = retval;
|
|
|
|
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
|
|
|
|
int Ant::antHandleStab(int indx, const int *&buf) {
|
|
|
|
int retval = indx;
|
|
|
|
if (_vm->_inventory->_inv[78]._value != 1) {
|
|
|
|
if (_stabFl) {
|
|
|
|
buf = Amazon::PITSTAB;
|
|
|
|
retval = _stabCel;
|
|
|
|
if (_vm->_timers[13]._flag == 0) {
|
|
|
|
_vm->_timers[13]._flag = 1;
|
|
|
|
retval += 6;
|
|
|
|
if (Amazon::PITSTAB[retval] == -1) {
|
|
|
|
_stabFl = false;
|
|
|
|
_pitCel = 0;
|
|
|
|
_pitPos.y = 127;
|
|
|
|
retval = 0;
|
|
|
|
buf = Amazon::PITWALK;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
_pitPos.x += buf[(retval / 2) + 1];
|
|
|
|
_pitPos.y += buf[(retval / 2) + 2];
|
|
|
|
_pitCel = retval;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
_stabFl = true;
|
|
|
|
_pitCel = 0;
|
|
|
|
retval = 0;
|
|
|
|
_stabCel = 0;
|
|
|
|
int dist = _pitPos.x - _antPos.x;
|
|
|
|
if (_antEatFl && !_antDieFl && (dist <= 80)) {
|
|
|
|
_antDieFl = true;
|
|
|
|
_antCel = 0;
|
|
|
|
_antPos.y = 123;
|
|
|
|
_vm->_sound->playSound(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Ant::doAnt() {
|
|
|
|
_antDirection = NONE;
|
|
|
|
if (_vm->_aniFlag != 1) {
|
|
|
|
_vm->_aniFlag = 1;
|
|
|
|
_antCel = 0;
|
|
|
|
_torchCel = 0;
|
|
|
|
_pitCel = 0;
|
|
|
|
|
|
|
|
_vm->_timers[15]._timer = 16;
|
|
|
|
_vm->_timers[15]._initTm = 16;
|
|
|
|
_vm->_timers[15]._flag = 1;
|
|
|
|
|
|
|
|
_vm->_timers[13]._timer = 5;
|
|
|
|
_vm->_timers[13]._initTm = 5;
|
|
|
|
_vm->_timers[13]._flag = 1;
|
|
|
|
|
|
|
|
_vm->_timers[14]._timer = 10;
|
|
|
|
_vm->_timers[14]._initTm = 10;
|
|
|
|
_vm->_timers[14]._flag = 1;
|
|
|
|
|
|
|
|
_antPos = Common::Point(-40, 123);
|
|
|
|
_antDieFl = _antEatFl = false;
|
|
|
|
_stabFl = false;
|
|
|
|
_pitPos = Common::Point(_vm->_player->_rawPlayer.x, 127);
|
|
|
|
}
|
|
|
|
|
|
|
|
const int *buf = nullptr;
|
|
|
|
if (_antDieFl) {
|
|
|
|
buf = Amazon::ANTDIE;
|
|
|
|
}
|
|
|
|
else if (_antEatFl) {
|
|
|
|
buf = Amazon::ANTEAT;
|
|
|
|
}
|
|
|
|
else if (_antPos.x > 120 && _vm->_flags[198] == 1) {
|
|
|
|
_antEatFl = true;
|
|
|
|
_vm->_flags[235] = 1;
|
|
|
|
_antCel = 0;
|
|
|
|
buf = Amazon::ANTEAT;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
buf = Amazon::ANTWALK;
|
|
|
|
if (_vm->_inventory->_inv[76]._value == 1)
|
|
|
|
_antDirection = UP;
|
|
|
|
}
|
|
|
|
|
|
|
|
int idx = _antCel;
|
|
|
|
if (_vm->_timers[15]._flag == 0) {
|
|
|
|
_vm->_timers[15]._flag = 1;
|
|
|
|
if (_antDirection == UP) {
|
|
|
|
if (_antPos.x > 10) {
|
|
|
|
if (idx == 0)
|
|
|
|
idx = 36;
|
|
|
|
else
|
|
|
|
idx -= 6;
|
|
|
|
|
|
|
|
_antPos = Common::Point(buf[(idx / 2) + 1], buf[(idx / 2) + 2]);
|
|
|
|
_antCel = idx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
idx += 6;
|
|
|
|
if (buf[(idx / 2)] != -1) {
|
|
|
|
_antPos = Common::Point(buf[(idx / 2) + 1], buf[(idx / 2) + 2]);
|
|
|
|
_antCel = idx;
|
|
|
|
}
|
|
|
|
else if (!_antDieFl) {
|
|
|
|
idx = 0;
|
|
|
|
_antPos = Common::Point(buf[(idx / 2) + 1], buf[(idx / 2) + 2]);
|
|
|
|
_antCel = idx;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
idx -= 6;
|
|
|
|
if (_vm->_flags[200] == 0)
|
|
|
|
_vm->_flags[200] = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ImageEntry ie;
|
|
|
|
ie._flags = IMGFLAG_UNSCALED;
|
|
|
|
ie._spritesPtr = _vm->_objectsTable[61];
|
|
|
|
ie._frameNumber = buf[(idx / 2)];
|
|
|
|
ie._position = Common::Point(_antPos.x, _antPos.y);
|
|
|
|
ie._offsetY = _antPos.y - 70;
|
|
|
|
_vm->_images.addToList(ie);
|
|
|
|
_antCel = idx;
|
|
|
|
|
|
|
|
if (_vm->_flags[196] != 1) {
|
|
|
|
idx = _pitCel;
|
|
|
|
if (_stabFl == 1) {
|
|
|
|
idx = antHandleStab(idx, buf);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
buf = Amazon::PITWALK;
|
|
|
|
if (_vm->_timers[13]._flag == 0) {
|
|
|
|
_vm->_timers[13]._flag = 1;
|
|
|
|
_vm->_events->pollEvents();
|
|
|
|
if (_vm->_events->_leftButton) {
|
|
|
|
Common::Point pt = _vm->_events->calcRawMouse();
|
|
|
|
if (pt.x < _pitPos.x)
|
|
|
|
idx = antHandleLeft(idx, buf);
|
|
|
|
else if (pt.x > _pitPos.x)
|
|
|
|
idx = antHandleRight(idx, buf);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
buf = Amazon::PITWALK;
|
|
|
|
if (_vm->_player->_playerDirection == UP)
|
|
|
|
idx = antHandleStab(idx, buf);
|
|
|
|
else if (_vm->_player->_playerDirection == LEFT)
|
|
|
|
idx = antHandleLeft(idx, buf);
|
|
|
|
else if (_vm->_player->_playerDirection == RIGHT)
|
|
|
|
idx = antHandleRight(idx, buf);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
plotPit(idx, buf);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!_antDieFl) {
|
|
|
|
int dist = _pitPos.x - _antPos.x;
|
|
|
|
if ((_antEatFl && (dist <= 45)) || (!_antEatFl && (dist <= 80))) {
|
|
|
|
_vm->_flags[199] = 1;
|
|
|
|
_vm->_aniFlag = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
} // End of namespace Amazon
|
|
|
|
|
|
|
|
} // End of namespace Access
|