aboutsummaryrefslogtreecommitdiff
path: root/engines/dreamweb/sprite.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/dreamweb/sprite.cpp')
-rw-r--r--engines/dreamweb/sprite.cpp1476
1 files changed, 795 insertions, 681 deletions
diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp
index 3b67bfbd72..3df324abe1 100644
--- a/engines/dreamweb/sprite.cpp
+++ b/engines/dreamweb/sprite.cpp
@@ -22,215 +22,184 @@
#include "dreamweb/dreamweb.h"
-namespace DreamGen {
+namespace DreamWeb {
-Sprite *DreamGenContext::spritetable() {
- Sprite *sprite = (Sprite *)segRef(data.word(kBuffers)).ptr(kSpritetable, 16 * sizeof(Sprite));
- return sprite;
-}
-
-void DreamGenContext::printsprites() {
+void DreamWebEngine::printSprites() {
for (size_t priority = 0; priority < 7; ++priority) {
- Sprite *sprites = spritetable();
- for (size_t j = 0; j < 16; ++j) {
- const Sprite &sprite = sprites[j];
- if (sprite.updateCallback() == 0x0ffff)
- continue;
+ Common::List<Sprite>::const_iterator i;
+ for (i = _spriteTable.begin(); i != _spriteTable.end(); ++i) {
+ const Sprite &sprite = *i;
if (priority != sprite.priority)
continue;
if (sprite.hidden == 1)
continue;
- printasprite(&sprite);
+ printASprite(&sprite);
}
}
}
-void DreamGenContext::printasprite(const Sprite *sprite) {
+void DreamWebEngine::printASprite(const Sprite *sprite) {
uint16 x, y;
if (sprite->y >= 220) {
- y = data.word(kMapady) - (256 - sprite->y);
+ y = _mapAdY - (256 - sprite->y);
} else {
- y = sprite->y + data.word(kMapady);
+ y = sprite->y + _mapAdY;
}
if (sprite->x >= 220) {
- x = data.word(kMapadx) - (256 - sprite->x);
+ x = _mapAdX - (256 - sprite->x);
} else {
- x = sprite->x + data.word(kMapadx);
+ x = sprite->x + _mapAdX;
}
uint8 c;
- if (sprite->b29 != 0)
+ if (sprite->walkFrame != 0)
c = 8;
else
c = 0;
- showframe((const Frame *)segRef(sprite->frameData()).ptr(0, 0), x, y, sprite->b15, c);
+ showFrame(*sprite->_frameData, x, y, sprite->frameNumber, c);
}
-void DreamGenContext::clearsprites() {
- memset(spritetable(), 0xff, sizeof(Sprite) * 16);
+void DreamWebEngine::clearSprites() {
+ _spriteTable.clear();
}
-Sprite *DreamGenContext::makesprite(uint8 x, uint8 y, uint16 updateCallback, uint16 frameData, uint16 somethingInDi) {
- Sprite *sprite = spritetable();
- while (sprite->b15 != 0xff) { // NB: No boundchecking in the original code either
- ++sprite;
- }
+Sprite *DreamWebEngine::makeSprite(uint8 x, uint8 y, bool mainManCallback, const GraphicsFile *frameData) {
+ // Note: the original didn't append sprites here, but filled up the
+ // first unused entry. This can change the order of entries, but since they
+ // are drawn based on the priority field, this shouldn't matter.
+ _spriteTable.push_back(Sprite());
+ Sprite *sprite = &_spriteTable.back();
- sprite->setUpdateCallback(updateCallback);
+ memset(sprite, 0xff, sizeof(Sprite));
+
+ sprite->_mainManCallback = mainManCallback;
sprite->x = x;
sprite->y = y;
- sprite->setFrameData(frameData);
- WRITE_LE_UINT16(&sprite->w8, somethingInDi);
- sprite->w2 = 0xffff;
- sprite->b15 = 0;
+ sprite->_frameData = frameData;
+ sprite->frameNumber = 0;
sprite->delay = 0;
+ sprite->_objData = 0;
return sprite;
}
-void DreamGenContext::spriteupdate() {
- Sprite *sprites = spritetable();
- sprites[0].hidden = data.byte(kRyanon);
-
- Sprite *sprite = sprites;
- for (size_t i=0; i < 16; ++i) {
- uint16 updateCallback = sprite->updateCallback();
- if (updateCallback != 0xffff) {
- sprite->w24 = sprite->w2;
- if (updateCallback == addr_mainman) // NB : Let's consider the callback as an enum while more code is not ported to C++
- mainman(sprite);
- else {
- assert(updateCallback == addr_backobject);
- backobject(sprite);
- }
+void DreamWebEngine::spriteUpdate() {
+ // During the intro the sprite table can be empty
+ if (!_spriteTable.empty())
+ _spriteTable.front().hidden = _vars._ryanOn;
+
+ Common::List<Sprite>::iterator i;
+ for (i = _spriteTable.begin(); i != _spriteTable.end(); ++i) {
+ Sprite &sprite = *i;
+ if (sprite._mainManCallback)
+ mainMan(&sprite);
+ else {
+ backObject(&sprite);
}
- if (data.byte(kNowinnewroom) == 1)
+ if (_nowInNewRoom == 1)
break;
- ++sprite;
}
}
-void DreamGenContext::initman() {
- Sprite *sprite = makesprite(data.byte(kRyanx), data.byte(kRyany), addr_mainman, data.word(kMainsprites), 0);
+void DreamWebEngine::initMan() {
+ Sprite *sprite = makeSprite(_ryanX, _ryanY, true, &_mainSprites);
sprite->priority = 4;
- sprite->b22 = 0;
- sprite->b29 = 0;
-}
-
-void DreamGenContext::mainman() {
- assert(false);
+ sprite->speed = 0;
+ sprite->walkFrame = 0;
}
-void DreamGenContext::mainman(Sprite *sprite) {
- push(es);
- push(ds);
-
- // Recover es:bx from sprite
- es = data.word(kBuffers);
- bx = kSpritetable;
- Sprite *sprites = (Sprite *)es.ptr(bx, sizeof(Sprite) * 16);
- bx += 32 * (sprite - sprites);
- //
-
- if (data.byte(kResetmanxy) == 1) {
- data.byte(kResetmanxy) = 0;
- sprite->x = data.byte(kRyanx);
- sprite->y = data.byte(kRyany);
- sprite->b29 = 0;
+void DreamWebEngine::mainMan(Sprite *sprite) {
+ if (_resetManXY == 1) {
+ _resetManXY = 0;
+ sprite->x = _ryanX;
+ sprite->y = _ryanY;
+ sprite->walkFrame = 0;
}
- --sprite->b22;
- if (sprite->b22 != 0xff) {
- ds = pop();
- es = pop();
+
+ --sprite->speed;
+ if (sprite->speed != 0xff)
return;
- }
- sprite->b22 = 0;
- if (data.byte(kTurntoface) != data.byte(kFacing)) {
- aboutturn(sprite);
+ sprite->speed = 0;
+
+ if (_turnToFace != _facing) {
+ aboutTurn(sprite);
} else {
- if ((data.byte(kTurndirection) != 0) && (data.byte(kLinepointer) == 254)) {
- data.byte(kReasseschanges) = 1;
- if (data.byte(kFacing) == data.byte(kLeavedirection))
- checkforexit();
+ if ((_turnDirection != 0) && (_linePointer == 254)) {
+ _reAssesChanges = 1;
+ if (_facing == _leaveDirection)
+ checkForExit(sprite);
}
- data.byte(kTurndirection) = 0;
- if (data.byte(kLinepointer) == 254) {
- sprite->b29 = 0;
+ _turnDirection = 0;
+ if (_linePointer == 254) {
+ sprite->walkFrame = 0;
} else {
- ++sprite->b29;
- if (sprite->b29 == 11)
- sprite->b29 = 1;
+ ++sprite->walkFrame;
+ if (sprite->walkFrame == 11)
+ sprite->walkFrame = 1;
walking(sprite);
- if (data.byte(kLinepointer) != 254) {
- if ((data.byte(kFacing) & 1) == 0)
+ if (_linePointer != 254) {
+ if ((_facing & 1) == 0)
walking(sprite);
- else if ((sprite->b29 != 2) && (sprite->b29 != 7))
+ else if ((sprite->walkFrame != 2) && (sprite->walkFrame != 7))
walking(sprite);
}
- if (data.byte(kLinepointer) == 254) {
- if (data.byte(kTurntoface) == data.byte(kFacing)) {
- data.byte(kReasseschanges) = 1;
- if (data.byte(kFacing) == data.byte(kLeavedirection))
- checkforexit();
+ if (_linePointer == 254) {
+ if (_turnToFace == _facing) {
+ _reAssesChanges = 1;
+ if (_facing == _leaveDirection)
+ checkForExit(sprite);
}
}
}
}
static const uint8 facelist[] = { 0,60,33,71,11,82,22,93 };
- sprite->b15 = sprite->b29 + facelist[data.byte(kFacing)];
- data.byte(kRyanx) = sprite->x;
- data.byte(kRyany) = sprite->y;
-
- ds = pop();
- es = pop();
+ sprite->frameNumber = sprite->walkFrame + facelist[_facing];
+ _ryanX = sprite->x;
+ _ryanY = sprite->y;
}
-void DreamGenContext::walking(Sprite *sprite) {
+void DreamWebEngine::walking(Sprite *sprite) {
uint8 comp;
- if (data.byte(kLinedirection) != 0) {
- --data.byte(kLinepointer);
+ if (_lineDirection != 0) {
+ --_linePointer;
comp = 200;
} else {
- ++data.byte(kLinepointer);
- comp = data.byte(kLinelength);
+ ++_linePointer;
+ comp = _lineLength;
}
- if (data.byte(kLinepointer) < comp) {
- sprite->x = data.byte(kLinedata + data.byte(kLinepointer) * 2 + 0);
- sprite->y = data.byte(kLinedata + data.byte(kLinepointer) * 2 + 1);
+ if (_linePointer < comp) {
+ sprite->x = (uint8)_lineData[_linePointer].x;
+ sprite->y = (uint8)_lineData[_linePointer].y;
return;
}
- data.byte(kLinepointer) = 254;
- data.byte(kManspath) = data.byte(kDestination);
- if (data.byte(kDestination) == data.byte(kFinaldest)) {
- facerightway();
+ _linePointer = 254;
+ _mansPath = _destination;
+ if (_destination == _finalDest) {
+ faceRightWay();
return;
}
- data.byte(kDestination) = data.byte(kFinaldest);
- push(es);
- push(bx);
- autosetwalk();
- bx = pop();
- es = pop();
+ _destination = _finalDest;
+ autoSetWalk();
}
-void DreamGenContext::aboutturn(Sprite *sprite) {
+void DreamWebEngine::aboutTurn(Sprite *sprite) {
bool incdir = true;
- if (data.byte(kTurndirection) == 1)
+ if (_turnDirection == 1)
incdir = true;
- else if ((int8)data.byte(kTurndirection) == -1)
+ else if ((int8)_turnDirection == -1)
incdir = false;
else {
- if (data.byte(kFacing) < data.byte(kTurntoface)) {
- uint8 delta = data.byte(kTurntoface) - data.byte(kFacing);
+ if (_facing < _turnToFace) {
+ uint8 delta = _turnToFace - _facing;
if (delta >= 4)
incdir = false;
else
incdir = true;
} else {
- uint8 delta = data.byte(kFacing) - data.byte(kTurntoface);
+ uint8 delta = _facing - _turnToFace;
if (delta >= 4)
incdir = true;
else
@@ -239,22 +208,18 @@ void DreamGenContext::aboutturn(Sprite *sprite) {
}
if (incdir) {
- data.byte(kTurndirection) = 1;
- data.byte(kFacing) = (data.byte(kFacing) + 1) & 7;
- sprite->b29 = 0;
+ _turnDirection = 1;
+ _facing = (_facing + 1) & 7;
+ sprite->walkFrame = 0;
} else {
- data.byte(kTurndirection) = (uint8)-1;
- data.byte(kFacing) = (data.byte(kFacing) - 1) & 7;
- sprite->b29 = 0;
+ _turnDirection = (uint8)-1;
+ _facing = (_facing - 1) & 7;
+ sprite->walkFrame = 0;
}
}
-void DreamGenContext::backobject() {
- assert(false);
-}
-
-void DreamGenContext::backobject(Sprite *sprite) {
- SetObject *objData = (SetObject *)segRef(data.word(kSetdat)).ptr(sprite->objData(), 0);
+void DreamWebEngine::backObject(Sprite *sprite) {
+ SetObject *objData = sprite->_objData;
if (sprite->delay != 0) {
--sprite->delay;
@@ -262,646 +227,795 @@ void DreamGenContext::backobject(Sprite *sprite) {
}
sprite->delay = objData->delay;
- if (objData->type == 6)
- widedoor(sprite, objData);
- else if (objData->type == 5)
- random(sprite, objData);
- else if (objData->type == 4)
- lockeddoorway(sprite, objData);
- else if (objData->type == 3)
- liftsprite(sprite, objData);
- else if (objData->type == 2)
+ switch (objData->type) {
+ case 6:
+ wideDoor(sprite, objData);
+ break;
+ case 5:
+ randomSprite(sprite, objData);
+ break;
+ case 4:
+ lockedDoorway(sprite, objData);
+ break;
+ case 3:
+ liftSprite(sprite, objData);
+ break;
+ case 2:
doorway(sprite, objData);
- else if (objData->type == 1)
+ break;
+ case 1:
constant(sprite, objData);
- else
+ break;
+ default:
steady(sprite, objData);
+ break;
+ }
}
-void DreamGenContext::constant(Sprite *sprite, SetObject *objData) {
- ++sprite->frame;
- if (objData->b18[sprite->frame] == 255) {
- sprite->frame = 0;
+void DreamWebEngine::constant(Sprite *sprite, SetObject *objData) {
+ ++sprite->animFrame;
+ if (objData->frames[sprite->animFrame] == 255) {
+ sprite->animFrame = 0;
}
- uint8 b18 = objData->b18[sprite->frame];
- objData->index = b18;
- sprite->b15 = b18;
+ uint8 frame = objData->frames[sprite->animFrame];
+ objData->index = frame;
+ sprite->frameNumber = frame;
}
-void DreamGenContext::random(Sprite *sprite, SetObject *objData) {
- randomnum1();
- uint16 r = ax;
- sprite->b15 = objData->b18[r&7];
+void DreamWebEngine::randomSprite(Sprite *sprite, SetObject *objData) {
+ uint8 r = _rnd.getRandomNumber(7);
+ sprite->frameNumber = objData->frames[r];
}
-void DreamGenContext::doorway(Sprite *sprite, SetObject *objData) {
- data.byte(kDoorcheck1) = (uint8)-24;
- data.byte(kDoorcheck2) = 10;
- data.byte(kDoorcheck3) = (uint8)-30;
- data.byte(kDoorcheck4) = 10;
- dodoor(sprite, objData);
+void DreamWebEngine::doorway(Sprite *sprite, SetObject *objData) {
+ Common::Rect check(-24, -30, 10, 10);
+ doDoor(sprite, objData, check);
}
-void DreamGenContext::widedoor(Sprite *sprite, SetObject *objData) {
- data.byte(kDoorcheck1) = (uint8)-24;
- data.byte(kDoorcheck2) = 24;
- data.byte(kDoorcheck3) = (uint8)-30;
- data.byte(kDoorcheck4) = 24;
- dodoor(sprite, objData);
+void DreamWebEngine::wideDoor(Sprite *sprite, SetObject *objData) {
+ Common::Rect check(-24, -30, 24, 24);
+ doDoor(sprite, objData, check);
}
-void DreamGenContext::dodoor() {
- Sprite *sprite = (Sprite *)es.ptr(bx, sizeof(Sprite));
- SetObject *objData = (SetObject *)ds.ptr(di, 0);
- dodoor(sprite, objData);
-}
+void DreamWebEngine::doDoor(Sprite *sprite, SetObject *objData, Common::Rect check) {
+ int ryanx = _ryanX;
+ int ryany = _ryanY;
+
+ // Automatically opening doors: check if Ryan is in range
+
+ check.translate(sprite->x, sprite->y);
+ bool openDoor = check.contains(ryanx, ryany);
+
+ if (openDoor) {
+
+ if ((_vars._throughDoor == 1) && (sprite->animFrame == 0))
+ sprite->animFrame = 6;
+
+ ++sprite->animFrame;
+ if (sprite->animFrame == 1) { // doorsound2
+ uint8 soundIndex;
+ if (_realLocation == 5) // hoteldoor2
+ soundIndex = 13;
+ else
+ soundIndex = 0;
+ playChannel1(soundIndex);
+ }
+ if (objData->frames[sprite->animFrame] == 255)
+ --sprite->animFrame;
+
+ sprite->frameNumber = objData->index = objData->frames[sprite->animFrame];
+ _vars._throughDoor = 1;
-void DreamGenContext::dodoor(Sprite *sprite, SetObject *objData) {
- uint8 ryanx = data.byte(kRyanx);
- uint8 ryany = data.byte(kRyany);
- if (ryanx < sprite->x) {
- if (ryanx < sprite->x + (int8)data.byte(kDoorcheck1))
- goto shutdoor;
- } else {
- if (ryanx >= sprite->x + data.byte(kDoorcheck2))
- goto shutdoor;
- }
- if (ryany < sprite->y) {
- if (ryany < sprite->y + (int8)data.byte(kDoorcheck3))
- goto shutdoor;
} else {
- if (ryany >= sprite->y + data.byte(kDoorcheck4))
- goto shutdoor;
- }
-//opendoor:
- if ((data.byte(kThroughdoor) == 1) && (sprite->frame == 0))
- sprite->frame = 6;
-
- ++sprite->frame;
- if (sprite->frame == 1) { //doorsound2
- if (data.byte(kReallocation) == 5) //hoteldoor2
- al = 13;
- else
- al = 0;
- playchannel1();
- }
- if (objData->b18[sprite->frame] == 255) {
- --sprite->frame;
- }
- sprite->b15 = objData->index = objData->b18[sprite->frame];
- data.byte(kThroughdoor) = 1;
- return;
-shutdoor:
- if (sprite->frame == 5) { //doorsound1;
- if (data.byte(kReallocation) == 5) //hoteldoor1
- al = 13;
- else
- al = 1;
- playchannel1();
- }
- if (sprite->frame != 0) {
- --sprite->frame;
+ // shut door
+
+ if (sprite->animFrame == 5) { // doorsound1;
+ uint8 soundIndex;
+ if (_realLocation == 5) // hoteldoor1
+ soundIndex = 13;
+ else
+ soundIndex = 1;
+ playChannel1(soundIndex);
+ }
+ if (sprite->animFrame != 0)
+ --sprite->animFrame;
+
+ sprite->frameNumber = objData->index = objData->frames[sprite->animFrame];
+ if (sprite->animFrame == 5) // nearly
+ _vars._throughDoor = 0;
}
- sprite->b15 = objData->index = objData->b18[sprite->frame];
- if (sprite->frame == 5) //nearly
- data.byte(kThroughdoor) = 0;
}
-void DreamGenContext::steady(Sprite *sprite, SetObject *objData) {
- uint8 b18 = objData->b18[0];
- objData->index = b18;
- sprite->b15 = b18;
+void DreamWebEngine::steady(Sprite *sprite, SetObject *objData) {
+ uint8 frame = objData->frames[0];
+ objData->index = frame;
+ sprite->frameNumber = frame;
}
-void DreamGenContext::lockeddoorway(Sprite *sprite, SetObject *objData) {
- if (data.byte(kRyanx) < sprite->x) {
- if (sprite->x - data.byte(kRyanx) > 24)
- goto shutdoor2;
- } else {
- if (data.byte(kRyanx) - sprite->x >= 10)
- goto shutdoor2;
- }
+void DreamWebEngine::lockedDoorway(Sprite *sprite, SetObject *objData) {
+ int ryanx = _ryanX;
+ int ryany = _ryanY;
- if (data.byte(kRyany) < sprite->y) {
- if (sprite->y - data.byte(kRyany) > 30)
- goto shutdoor2;
- } else {
- if (data.byte(kRyany) - sprite->y >= 12)
- goto shutdoor2;
- }
+ Common::Rect check(-24, -30, 10, 12);
+ check.translate(sprite->x, sprite->y);
+ bool openDoor = check.contains(ryanx, ryany);
- if (data.byte(kThroughdoor) != 1) {
- if (data.byte(kLockstatus) == 1)
- goto shutdoor2;
- }
+ if (_vars._throughDoor != 1 && _vars._lockStatus == 1)
+ openDoor = false;
- if (sprite->frame == 1) {
- al = 0;
- playchannel1();
- }
+ if (openDoor) {
- if (sprite->frame == 6) {
- turnpathon(data.byte(kDoorpath));
- }
+ if (sprite->animFrame == 1) {
+ playChannel1(0);
+ }
- if ((data.byte(kThroughdoor) == 1) && (sprite->frame == 0)) {
- sprite->frame = 6;
- }
+ if (sprite->animFrame == 6)
+ turnPathOn(_vars._doorPath);
- ++sprite->frame;
- if (objData->b18[sprite->frame] == 255) {
- --sprite->frame;
- }
+ if (_vars._throughDoor == 1 && sprite->animFrame == 0)
+ sprite->animFrame = 6;
- sprite->b15 = objData->index = objData->b18[sprite->frame];
- if (sprite->frame == 5)
- data.byte(kThroughdoor) = 1;
- return;
+ ++sprite->animFrame;
+ if (objData->frames[sprite->animFrame] == 255)
+ --sprite->animFrame;
-shutdoor2:
- if (sprite->frame == 5) {
- al = 1;
- playchannel1();
- }
+ sprite->frameNumber = objData->index = objData->frames[sprite->animFrame];
+ if (sprite->animFrame == 5)
+ _vars._throughDoor = 1;
- if (sprite->frame != 0) {
- --sprite->frame;
- }
+ } else {
+ // shut door
- data.byte(kThroughdoor) = 0;
- sprite->b15 = objData->index = objData->b18[sprite->frame];
+ if (sprite->animFrame == 5) {
+ playChannel1(1);
+ }
- if (sprite->frame == 0) {
- turnpathoff(data.byte(kDoorpath));
- data.byte(kLockstatus) = 1;
+ if (sprite->animFrame != 0)
+ --sprite->animFrame;
+
+ _vars._throughDoor = 0;
+ sprite->frameNumber = objData->index = objData->frames[sprite->animFrame];
+
+ if (sprite->animFrame == 0) {
+ turnPathOff(_vars._doorPath);
+ _vars._lockStatus = 1;
+ }
}
}
-void DreamGenContext::liftsprite(Sprite *sprite, SetObject *objData) {
- uint8 liftFlag = data.byte(kLiftflag);
+void DreamWebEngine::liftSprite(Sprite *sprite, SetObject *objData) {
+ uint8 liftFlag = _vars._liftFlag;
if (liftFlag == 0) { //liftclosed
- turnpathoff(data.byte(kLiftpath));
+ turnPathOff(_vars._liftPath);
- if (data.byte(kCounttoopen) != 0) {
- _dec(data.byte(kCounttoopen));
- if (data.byte(kCounttoopen) == 0)
- data.byte(kLiftflag) = 3;
+ if (_vars._countToOpen != 0) {
+ _vars._countToOpen--;
+ if (_vars._countToOpen == 0)
+ _vars._liftFlag = 3;
}
- sprite->frame = 0;
- sprite->b15 = objData->index = objData->b18[sprite->frame];
+ sprite->animFrame = 0;
+ sprite->frameNumber = objData->index = objData->frames[sprite->animFrame];
}
else if (liftFlag == 1) { //liftopen
- turnpathon(data.byte(kLiftpath));
+ turnPathOn(_vars._liftPath);
- if (data.byte(kCounttoclose) != 0) {
- _dec(data.byte(kCounttoclose));
- if (data.byte(kCounttoclose) == 0)
- data.byte(kLiftflag) = 2;
+ if (_vars._countToClose != 0) {
+ _vars._countToClose--;
+ if (_vars._countToClose == 0)
+ _vars._liftFlag = 2;
}
- sprite->frame = 12;
- sprite->b15 = objData->index = objData->b18[sprite->frame];
+ sprite->animFrame = 12;
+ sprite->frameNumber = objData->index = objData->frames[sprite->animFrame];
}
else if (liftFlag == 3) { //openlift
- if (sprite->frame == 12) {
- data.byte(kLiftflag) = 1;
+ if (sprite->animFrame == 12) {
+ _vars._liftFlag = 1;
return;
}
- ++sprite->frame;
- if (sprite->frame == 1) {
- al = 2;
- liftnoise();
+ ++sprite->animFrame;
+ if (sprite->animFrame == 1) {
+ liftNoise(2);
}
- sprite->b15 = objData->index = objData->b18[sprite->frame];
+ sprite->frameNumber = objData->index = objData->frames[sprite->animFrame];
} else { //closeLift
assert(liftFlag == 2);
- if (sprite->frame == 0) {
- data.byte(kLiftflag) = 0;
+ if (sprite->animFrame == 0) {
+ _vars._liftFlag = 0;
return;
}
- --sprite->frame;
- if (sprite->frame == 11) {
- al = 3;
- liftnoise();
+ --sprite->animFrame;
+ if (sprite->animFrame == 11) {
+ liftNoise(3);
}
- sprite->b15 = objData->index = objData->b18[sprite->frame];
+ sprite->frameNumber = objData->index = objData->frames[sprite->animFrame];
}
}
-void DreamGenContext::facerightway() {
- PathNode *paths = getroomspaths()->nodes;
- uint8 dir = paths[data.byte(kManspath)].dir;
- data.byte(kTurntoface) = dir;
- data.byte(kLeavedirection) = dir;
+Reel *DreamWebEngine::getReelStart(uint16 reelPointer) {
+ Reel *reel = &_reelList[reelPointer * 8];
+ return reel;
}
-void DreamGenContext::findsource() {
- uint16 currentFrame = data.word(kCurrentframe);
- if (currentFrame < 160) {
- ds = data.word(kReel1);
- data.word(kTakeoff) = 0;
- } else if (currentFrame < 320) {
- ds = data.word(kReel2);
- data.word(kTakeoff) = 160;
+// Locate the reel segment (reel1, reel2, reel3) this frame is stored in,
+// and adjust the frame number relative to this segment.
+const GraphicsFile *DreamWebEngine::findSource(uint16 &frame) {
+ if (frame < 160) {
+ return &_reel1;
+ } else if (frame < 320) {
+ frame -= 160;
+ return &_reel2;
} else {
- ds = data.word(kReel3);
- data.word(kTakeoff) = 320;
+ frame -= 320;
+ return &_reel3;
}
}
-Frame *DreamGenContext::findsourceCPP() {
- push(ds);
- findsource();
- Frame *result = (Frame *)ds.ptr(0, 0);
- ds = pop();
- return result;
+void DreamWebEngine::showReelFrame(Reel *reel) {
+ uint16 x = reel->x + _mapAdX;
+ uint16 y = reel->y + _mapAdY;
+ uint16 frame = reel->frame();
+ const GraphicsFile *base = findSource(frame);
+ showFrame(*base, x, y, frame, 8);
}
-Reel *DreamGenContext::getreelstart() {
- Reel *reel = (Reel *)segRef(data.word(kReels)).ptr(kReellist + data.word(kReelpointer) * sizeof(Reel) * 8, sizeof(Reel));
- return reel;
-}
-
-void DreamGenContext::showreelframe() {
- Reel *reel = (Reel *)es.ptr(si, sizeof(Reel));
- showreelframe(reel);
-}
-
-void DreamGenContext::showreelframe(Reel *reel) {
- uint16 x = reel->x + data.word(kMapadx);
- uint16 y = reel->y + data.word(kMapady);
- data.word(kCurrentframe) = reel->frame();
- Frame *source = findsourceCPP();
- uint16 frame = data.word(kCurrentframe) - data.word(kTakeoff);
- showframe(source, x, y, frame, 8);
+void DreamWebEngine::showGameReel(ReelRoutine *routine) {
+ uint16 reelPointer = routine->reelPointer();
+ if (reelPointer >= 512)
+ return;
+ plotReel(reelPointer);
+ routine->setReelPointer(reelPointer);
}
-void DreamGenContext::showgamereel() {
- showgamereel((ReelRoutine *)es.ptr(bx, sizeof(ReelRoutine)));
+const Frame *DreamWebEngine::getReelFrameAX(uint16 frame) {
+ const GraphicsFile *base = findSource(frame);
+ return &base->_frames[frame];
}
-void DreamGenContext::showgamereel(ReelRoutine *routine) {
- uint16 reelpointer = routine->reelPointer();
- if (reelpointer >= 512)
- return;
- data.word(kReelpointer) = reelpointer;
- plotreel();
- routine->setReelPointer(data.word(kReelpointer));
+void DreamWebEngine::moveMap(uint8 param) {
+ switch (param) {
+ case 32:
+ _mapY -= 20;
+ break;
+ case 16:
+ _mapY -= 10;
+ break;
+ case 8:
+ _mapY += 10;
+ break;
+ case 2:
+ _mapX += 11;
+ break;
+ default:
+ _mapX -= 11;
+ break;
+ }
+ _nowInNewRoom = 1;
}
-const Frame *DreamGenContext::getreelframeax(uint16 frame) {
- data.word(kCurrentframe) = frame;
- Frame *source = findsourceCPP();
- uint16 offset = data.word(kCurrentframe) - data.word(kTakeoff);
- return source + offset;
+void DreamWebEngine::checkOne(uint8 x, uint8 y, uint8 *flag, uint8 *flagEx, uint8 *type, uint8 *flagX, uint8 *flagY) {
+ *flagX = x / 16;
+ *flagY = y / 16;
+ const MapFlag &tileData = _mapFlags[*flagY * 11 + *flagX];
+ *flag = tileData._flag;
+ *flagEx = tileData._flagEx;
+ *type = tileData._type;
}
-void DreamGenContext::showrain() {
- ds = data.word(kMainsprites);
- si = 6*58;
- ax = ds.word(si+2);
- si = ax + 2080;
- Rain *rain = (Rain *)segRef(data.word(kBuffers)).ptr(kRainlist, 0);
- if (rain->x == 255)
+void DreamWebEngine::intro1Text() {
+ if (_introCount != 2 && _introCount != 4 && _introCount != 6)
return;
- while (true) {
- if (rain->x == 255) {
- if (data.word(kCh1blockstocopy) != 0)
- return;
- if ((data.byte(kReallocation) == 2) && (data.byte(kBeenmugged) != 1))
- return;
- if (data.byte(kReallocation) == 55)
- return;
- randomnum1();
- if (al >= 1)
- return;
- if (data.byte(kCh0playing) != 6)
- al = 4;
- else
- al = 7;
- playchannel1();
- return;
- }
- uint16 y = rain->y + data.word(kMapady) + data.word(kMapystart);
- uint16 x = rain->x + data.word(kMapadx) + data.word(kMapxstart);
- uint16 size = rain->size;
- ax = ((uint16)(rain->w3() - rain->b5)) & 511;
- rain->setW3(ax);
- ++rain;
- const uint8 *src = ds.ptr(si, 0) + ax;
- uint8 *dst = workspace() + y * 320 + x;
- for(uint16 i = 0; i < size; ++i) {
- uint8 v = src[i];
- if (v != 0)
- *dst = v;
- dst += 320-1;
- }
- }
-}
-void DreamGenContext::updatepeople() {
- data.word(kListpos) = kPeoplelist;
- memset(segRef(data.word(kBuffers)).ptr(kPeoplelist, 12 * sizeof(People)), 0xff, 12 * sizeof(People));
- ++data.word(kMaintimer);
- es = cs;
- bx = kReelroutines;
- const ReelRoutine *reelRoutine = (const ReelRoutine *)cs.ptr(bx, 0);
- const uint16 *callbacks = (const uint16 *)cs.ptr(kReelcalls, 0);
- while (true) {
- uint8 realLocation = reelRoutine->reallocation;
- if (realLocation == 255)
- return;
- if ((realLocation == data.byte(kReallocation)) &&
- (reelRoutine->mapX == data.byte(kMapx)) &&
- (reelRoutine->mapY == data.byte(kMapy))) {
- uint16 callback = READ_LE_UINT16(callbacks);
- //dw gamer,sparkydrip,eden,edeninbath,sparky,smokebloke
- if (callback == addr_gamer)
- gamer();
- else if (callback == addr_sparkydrip)
- sparkydrip();
- else if (callback == addr_eden)
- eden();
- else if (callback == addr_edeninbath)
- edeninbath();
- else if (callback == addr_sparky)
- sparky();
- else if (callback == addr_smokebloke)
- smokebloke();
- //dw manasleep,drunk,receptionist,malefan,femalefan
- else if (callback == addr_manasleep)
- manasleep();
- else if (callback == addr_drunk)
- drunk();
- else if (callback == addr_receptionist)
- receptionist();
- else if (callback == addr_malefan)
- malefan();
- else if (callback == addr_femalefan)
- femalefan();
- //dw louis,louischair,soldier1,bossman,interviewer
- else if (callback == addr_louis)
- louis();
- else if (callback == addr_louischair)
- louischair();
- else if (callback == addr_soldier1)
- soldier1();
- else if (callback == addr_bossman)
- bossman();
- else if (callback == addr_interviewer)
- interviewer();
- //dw heavy,manasleep2,mansatstill,drinker,bartender
- else if (callback == addr_heavy)
- heavy();
- else if (callback == addr_manasleep2)
- manasleep2();
- else if (callback == addr_mansatstill)
- mansatstill();
- else if (callback == addr_drinker)
- drinker();
- else if (callback == addr_bartender)
- bartender();
- //dw othersmoker,tattooman,attendant,keeper,candles1
- else if (callback == addr_othersmoker)
- othersmoker();
- else if (callback == addr_tattooman)
- tattooman();
- else if (callback == addr_attendant)
- attendant();
- else if (callback == addr_keeper)
- keeper();
- else if (callback == addr_candles1)
- candles1();
- //dw smallcandle,security,copper,poolguard,rockstar
- else if (callback == addr_smallcandle)
- smallcandle();
- else if (callback == addr_security)
- security();
- else if (callback == addr_copper)
- copper();
- else if (callback == addr_poolguard)
- poolguard();
- else if (callback == addr_rockstar)
- rockstar();
- //dw businessman,train,aide,mugger,helicopter
- else if (callback == addr_businessman)
- businessman();
- else if (callback == addr_train)
- train();
- else if (callback == addr_aide)
- aide();
- else if (callback == addr_mugger)
- mugger();
- else if (callback == addr_helicopter)
- helicopter();
- //dw intromagic1,intromusic,intromagic2,candles2,gates
- else if (callback == addr_intromagic1)
- intromagic1();
- else if (callback == addr_intromusic)
- intromusic();
- else if (callback == addr_intromagic2)
- intromagic2();
- else if (callback == addr_candles2)
- candles2();
- else if (callback == addr_gates)
- gates();
- //dw intromagic3,intromonks1,candles,intromonks2
- else if (callback == addr_intromagic3)
- intromagic3();
- else if (callback == addr_intromonks1)
- intromonks1();
- else if (callback == addr_candles)
- candles();
- else if (callback == addr_intromonks2)
- intromonks2();
- //dw handclap,monkandryan,endgameseq,priest,madman
- else if (callback == addr_handclap)
- handclap();
- else if (callback == addr_monkandryan)
- monkandryan();
- else if (callback == addr_endgameseq)
- endgameseq();
- else if (callback == addr_priest)
- priest();
- else if (callback == addr_madman)
- madman();
- //dw madmanstelly,alleybarksound,foghornsound
- else if (callback == addr_madmanstelly)
- madmanstelly();
- else if (callback == addr_alleybarksound)
- alleybarksound();
- else if (callback == addr_foghornsound)
- foghornsound();
- //dw carparkdrip,carparkdrip,carparkdrip,carparkdrip
- else if (callback == addr_carparkdrip)
- carparkdrip();
- else
- assert(false); // Oops I forgot something in the dispatch table
+ if (hasSpeech() && _channel1Playing != 255) {
+ _introCount--;
+ } else {
+ if (_introCount == 2)
+ setupTimedTemp(40, 82, 34, 130, 90, 1);
+ else if (_introCount == 4)
+ setupTimedTemp(41, 82, 34, 130, 90, 1);
+ else if (_introCount == 6)
+ setupTimedTemp(42, 82, 34, 130, 90, 1);
+ }
+}
+
+void DreamWebEngine::intro2Text(uint16 nextReelPointer) {
+ if (nextReelPointer == 5)
+ setupTimedTemp(43, 82, 34, 40, 90, 1);
+ else if (nextReelPointer == 15)
+ setupTimedTemp(44, 82, 34, 40, 90, 1);
+}
+
+void DreamWebEngine::intro3Text(uint16 nextReelPointer) {
+ if (nextReelPointer == 107)
+ setupTimedTemp(45, 82, 36, 56, 100, 1);
+ else if (nextReelPointer == (hasSpeech() ? 108 : 109))
+ setupTimedTemp(46, 82, 36, 56, 100, 1);
+}
+
+void DreamWebEngine::monks2text() {
+ bool isGermanCD = hasSpeech() && getLanguage() == Common::DE_DEU;
+
+ if (_introCount == 1)
+ setupTimedTemp(8, 82, 36, 160, 120, 1);
+ else if (_introCount == (isGermanCD ? 5 : 4))
+ setupTimedTemp(9, 82, 36, 160, 120, 1);
+ else if (_introCount == (isGermanCD ? 9 : 7))
+ setupTimedTemp(10, 82, 36, 160, 120, 1);
+ else if (_introCount == 10 && !isGermanCD) {
+ if (hasSpeech())
+ _introCount = 12;
+ setupTimedTemp(11, 82, 0, 105, 120, 1);
+ } else if (_introCount == 13 && isGermanCD) {
+ _introCount = 14;
+ setupTimedTemp(11, 82, 0, 105, 120, 1);
+ } else if (_introCount == 13 && !isGermanCD) {
+ if (hasSpeech())
+ _introCount = 17;
+ else
+ setupTimedTemp(12, 82, 0, 120, 120, 1);
+ } else if (_introCount == 16 && !isGermanCD)
+ setupTimedTemp(13, 82, 0, 135, 120, 1);
+ else if (_introCount == 19)
+ setupTimedTemp(14, 82, 36, 160, 100, 1);
+ else if (_introCount == (isGermanCD ? 23 : 22))
+ setupTimedTemp(15, 82, 36, 160, 120, 1);
+ else if (_introCount == (isGermanCD ? 27 : 25))
+ setupTimedTemp(16, 82, 36, 160, 120, 1);
+ else if (_introCount == (hasSpeech() ? 27 : 28) && !isGermanCD)
+ setupTimedTemp(17, 82, 36, 160, 120, 1);
+ else if (_introCount == 30 && isGermanCD)
+ setupTimedTemp(17, 82, 36, 160, 120, 1);
+ else if (_introCount == (isGermanCD ? 35 : 31))
+ setupTimedTemp(18, 82, 36, 160, 120, 1);
+}
+
+void DreamWebEngine::textForEnd() {
+ if (_introCount == 20)
+ setupTimedTemp(0, 83, 34, 20, 60, 1);
+ else if (_introCount == (hasSpeech() ? 50 : 65))
+ setupTimedTemp(1, 83, 34, 20, 60, 1);
+ else if (_introCount == (hasSpeech() ? 85 : 110))
+ setupTimedTemp(2, 83, 34, 20, 60, 1);
+}
+
+void DreamWebEngine::textForMonkHelper(uint8 textIndex, uint8 voiceIndex, uint8 x, uint8 y, uint16 countToTimed, uint16 timeCount) {
+ if (hasSpeech() && _channel1Playing != 255)
+ _introCount--;
+ else
+ setupTimedTemp(textIndex, voiceIndex, x, y, countToTimed, timeCount);
+}
+
+void DreamWebEngine::textForMonk() {
+ if (_introCount == 1)
+ textForMonkHelper(19, 82, 68, 154, 120, 1);
+ else if (_introCount == 5)
+ textForMonkHelper(20, 82, 68, 38, 120, 1);
+ else if (_introCount == 9)
+ textForMonkHelper(21, 82, 48, 154, 120, 1);
+ else if (_introCount == 13)
+ textForMonkHelper(22, 82, 68, 38, 120, 1);
+ else if (_introCount == (hasSpeech() ? 15 : 17))
+ textForMonkHelper(23, 82, 68, 154, 120, 1);
+ else if (_introCount == 21)
+ textForMonkHelper(24, 82, 68, 38, 120, 1);
+ else if (_introCount == 25)
+ textForMonkHelper(25, 82, 68, 154, 120, 1);
+ else if (_introCount == 29)
+ textForMonkHelper(26, 82, 68, 38, 120, 1);
+ else if (_introCount == 33)
+ textForMonkHelper(27, 82, 68, 154, 120, 1);
+ else if (_introCount == 37)
+ textForMonkHelper(28, 82, 68, 154, 120, 1);
+ else if (_introCount == 41)
+ textForMonkHelper(29, 82, 68, 38, 120, 1);
+ else if (_introCount == 45)
+ textForMonkHelper(30, 82, 68, 154, 120, 1);
+ else if (_introCount == (hasSpeech() ? 52 : 49))
+ textForMonkHelper(31, 82, 68, 154, 220, 1);
+ else if (_introCount == 53) {
+ fadeScreenDowns();
+ if (hasSpeech()) {
+ _volumeTo = 7;
+ _volumeDirection = 1;
}
- bx += 8;
- ++reelRoutine;
- ++callbacks;
}
}
-void DreamGenContext::madmantext() {
- if (isCD()) {
- if (data.byte(kSpeechcount) >= 63)
- return;
- if (data.byte(kCh1playing) != 255)
- return;
- al = data.byte(kSpeechcount);
- ++data.byte(kSpeechcount);
- } else {
- if (data.byte(kCombatcount) >= 61)
- return;
- al = data.byte(kCombatcount);
- _and(al, 3);
- if (!flags.z())
- return;
- al = data.byte(kCombatcount) / 4;
- }
- setuptimedtemp(47 + al, 82, 72, 80, 90, 1);
+void DreamWebEngine::reelsOnScreen() {
+ reconstruct();
+ updatePeople();
+ watchReel();
+ showRain();
+ useTimedText();
}
-void DreamGenContext::madman() {
- data.word(kWatchingtime) = 2;
- checkspeed();
- if (flags.z()) {
- ax = es.word(bx+3);
- if (ax >= 364) {
- data.byte(kMandead) = 2;
- showgamereel();
+void DreamWebEngine::reconstruct() {
+ if (_haveDoneObs == 0)
+ return;
+ _vars._newObs = 1;
+ drawFloor();
+ spriteUpdate();
+ printSprites();
+ if (_foreignRelease && (_realLocation == 20))
+ underTextLine();
+ _haveDoneObs = 0;
+}
+
+
+
+struct ReelSound {
+ uint8 _sample;
+ uint16 _reelPointer;
+};
+
+static const ReelSound g_roomSound0[] = {
+ { 255,0 }
+};
+
+static const ReelSound g_roomSound1[] = {
+ { 15, 257 },
+ { 255,0 }
+};
+
+static const ReelSound g_roomSound2[] = {
+ { 12, 5 },
+ { 13, 21 },
+ { 15, 35 }, // hitting floor?
+ { 17, 50 },
+ { 18, 103 },
+ { 19, 108 },
+ { 255,0 }
+};
+
+static const ReelSound g_roomSound6[] = {
+ { 18, 19 },
+ { 19, 23 },
+ { 255,0 }
+};
+static const ReelSound g_roomSound8[] = {
+
+ { 12, 51 },
+ { 13, 53 },
+ { 14, 14 },
+ { 15, 20 },
+ { 0, 78 },
+ { 255,0 }
+};
+static const ReelSound g_roomSound9[] = {
+
+ { 12, 119 },
+ { 12, 145 },
+ { 255,0 }
+};
+
+static const ReelSound g_roomSound10[] = {
+ { 13, 16 },
+ { 255,0 }
+};
+
+static const ReelSound g_roomSound11[] = {
+ { 13, 20 },
+ { 255,0 }
+};
+
+static const ReelSound g_roomSound12[] = {
+ { 14, 16 },
+ { 255,0 }
+};
+
+static const ReelSound g_roomSound13[] = {
+ { 15, 4 },
+ { 16, 8 },
+ { 17, 134 },
+ { 18, 153 },
+ { 255,0 }
+};
+
+static const ReelSound g_roomSound14[] = {
+ { 13, 108 },
+ { 15, 326 },
+ { 15, 331 },
+ { 15, 336 },
+ { 15, 342 },
+ { 15, 348 },
+ { 15, 354 },
+ { 18, 159 },
+ { 18, 178 },
+ { 19+128, 217 },
+ { 20+64, 228 },
+ { 255,0 }
+};
+
+static const ReelSound g_roomSound20[] = {
+ { 13, 20 },
+ { 13, 21 },
+ { 15, 34 },
+ { 13, 52 },
+ { 13, 55 },
+ { 25, 57 },
+ { 21, 73 },
+ { 255,0 }
+};
+
+static const ReelSound g_roomSound22[] = {
+ { 13, 196 },
+ { 13, 234 },
+ { 13, 156 },
+ { 14, 129 },
+ { 13, 124 },
+ { 15, 162 },
+ { 15, 200 },
+ { 15, 239 },
+ { 17, 99 },
+ { 12, 52 },
+ { 255,0 }
+};
+
+static const ReelSound g_roomSound23[] = {
+ { 15, 56 },
+ { 16, 64 },
+ { 19, 22 },
+ { 20, 33 },
+ { 255,0 }
+};
+
+static const ReelSound g_roomSound25[] = {
+ { 20, 11 },
+ { 20, 15 },
+ { 15, 28 },
+ { 13, 80 },
+ { 21, 82 },
+ { 19+128, 87 },
+ { 23+64, 128 },
+ { 255,0 }
+};
+
+static const ReelSound g_roomSound26[] = {
+ { 12, 13 },
+ { 14, 39 },
+ { 12, 67 },
+ { 12, 75 },
+ { 12, 83 },
+ { 12, 91 },
+ { 15, 102 }, // was 90, should be mine cart
+ { 255,0 }
+};
+
+static const ReelSound g_roomSound27[] = {
+ { 22, 36 },
+ { 13, 125 },
+ { 18, 88 },
+ { 15, 107 },
+ { 14, 127 },
+ { 14, 154 },
+ { 19+128, 170 },
+ { 23+64, 232 },
+ { 255,0 }
+};
+
+static const ReelSound g_roomSound28[] = {
+ { 21, 16 },
+ { 21, 72 },
+ { 21, 205 },
+ { 22, 63 }, // 65
+ { 23+128, 99 },
+ { 24+64, 158 },
+ { 255,0 }
+};
+
+static const ReelSound g_roomSound29[] = {
+ { 13, 21 },
+ { 14, 24 },
+ { 19+128, 50 },
+ { 23+64, 75 },
+ { 24, 128 },
+ { 255,0 }
+};
+
+static const ReelSound g_roomSound29_German[] = {
+ { 13, 21 },
+ { 14, 24 },
+ { 19+128, 50 },
+ { 23+64, 75 },
+ { 255,0 }
+};
+
+
+static const ReelSound g_roomSound45[] = {
+ { 19+64, 46 },
+ { 16, 167 },
+ { 255,0 }
+};
+
+static const ReelSound g_roomSound46[] = {
+ { 16, 19 },
+ { 14, 36 },
+ { 16, 50 },
+ { 14, 65 },
+ { 16, 81 },
+ { 14, 96 },
+ { 16, 114 },
+ { 14, 129 },
+ { 16, 147 },
+ { 14, 162 },
+ { 16, 177 },
+ { 14, 191 },
+ { 255,0 }
+};
+
+static const ReelSound g_roomSound47[] = {
+ { 13, 48 },
+ { 14, 41 },
+ { 15, 78 },
+ { 16, 92 },
+ { 255,0 }
+};
+
+static const ReelSound g_roomSound52[] = {
+ { 16, 115 },
+ { 255,0 }
+};
+
+static const ReelSound g_roomSound53[] = {
+ { 21, 103 },
+ { 20, 199 },
+ { 255,0 }
+};
+
+static const ReelSound g_roomSound55[] = {
+ { 17, 53 },
+ { 17, 54 },
+ { 17, 55 },
+ { 17, 56 },
+ { 17, 57 },
+ { 17, 58 },
+ { 17, 59 },
+ { 17, 61 },
+ { 17, 63 },
+ { 17, 64 },
+ { 17, 65 },
+ { 255,0 }
+};
+
+static const ReelSound *g_roomByRoom[] = {
+ g_roomSound0,g_roomSound1,g_roomSound2,g_roomSound0,g_roomSound0,
+ g_roomSound0,g_roomSound6,g_roomSound0,g_roomSound8,g_roomSound9,
+ g_roomSound10,g_roomSound11,g_roomSound12,g_roomSound13,g_roomSound14,
+ g_roomSound0,g_roomSound0,g_roomSound0,g_roomSound0,g_roomSound0,
+ g_roomSound20,g_roomSound0,g_roomSound22,g_roomSound23,g_roomSound0,
+ g_roomSound25,g_roomSound26,g_roomSound27,g_roomSound28,g_roomSound29,
+ g_roomSound0,g_roomSound0,g_roomSound0,g_roomSound0,g_roomSound0,
+ g_roomSound0,g_roomSound0,g_roomSound0,g_roomSound0,g_roomSound0,
+ g_roomSound0,g_roomSound0,g_roomSound0,g_roomSound0,g_roomSound0,
+ g_roomSound45,g_roomSound46,g_roomSound47,g_roomSound0,g_roomSound0,
+ g_roomSound0,g_roomSound0,g_roomSound52,g_roomSound53,g_roomSound0,
+ g_roomSound55
+};
+
+
+void DreamWebEngine::soundOnReels(uint16 reelPointer) {
+ const ReelSound *r = g_roomByRoom[_realLocation];
+
+ if (getLanguage() == Common::DE_DEU && r == g_roomSound29)
+ r = g_roomSound29_German;
+
+ for (; r->_sample != 255; ++r) {
+ if (r->_reelPointer != reelPointer)
+ continue;
+ if (r->_reelPointer == _lastSoundReel)
+ continue;
+ _lastSoundReel = r->_reelPointer;
+ if (r->_sample < 64) {
+ playChannel1(r->_sample);
return;
}
- if (ax == 10) {
- push(es);
- push(bx);
- push(ax);
- dx = kIntrotextname;
- loadtemptext();
- ax = pop();
- bx = pop();
- es = pop();
- data.byte(kCombatcount) = (uint8)-1;
- data.byte(kSpeechcount) = 0;
- }
- ++ax;
- if (ax == 294) {
- if (data.byte(kWongame) == 1)
- return;
- data.byte(kWongame) = 1;
- push(es);
- push(bx);
- getridoftemptext();
- bx = pop();
- es = pop();
+ if (r->_sample < 128) {
+ playChannel0(r->_sample & 63, 0);
return;
}
- if (ax == 66) {
- ++data.byte(kCombatcount);
- push(es);
- push(bx);
- madmantext();
- bx = pop();
- es = pop();
- ax = 53;
- if (data.byte(kCombatcount) >= (isCD() ? 64 : 62)) {
- if (data.byte(kCombatcount) == (isCD() ? 70 : 68))
- ax = 310;
- else {
- if (data.byte(kLastweapon) == 8) {
- data.byte(kCombatcount) = isCD() ? 72 : 70;
- data.byte(kLastweapon) = (uint8)-1;
- data.byte(kMadmanflag) = 1;
- ax = 67;
- }
- }
- }
- }
- es.word(bx+3) = ax;
+ playChannel0(r->_sample & 63, 255);
}
- showgamereel();
- es.byte(bx+1) = data.byte(kMapx);
- madmode();
-}
-void DreamGenContext::madmode() {
- data.word(kWatchingtime) = 2;
- data.byte(kPointermode) = 0;
- if (data.byte(kCombatcount) < (isCD() ? 65 : 63))
- return;
- if (data.byte(kCombatcount) >= (isCD() ? 70 : 68))
- return;
- data.byte(kPointermode) = 2;
+ if (_lastSoundReel != reelPointer)
+ _lastSoundReel = (uint16)-1;
}
-void DreamGenContext::movemap(uint8 param) {
- switch (param) {
- case 32:
- data.byte(kMapy) -= 20;
- break;
- case 16:
- data.byte(kMapy) -= 10;
- break;
- case 8:
- data.byte(kMapy) += 10;
- break;
- case 2:
- data.byte(kMapx) += 11;
- break;
- default:
- data.byte(kMapx) -= 11;
- break;
- }
- data.byte(kNowinnewroom) = 1;
-}
+void DreamWebEngine::clearBeforeLoad() {
+ if (_roomLoaded != 1)
+ return; // noclear
-void DreamGenContext::checkone() {
- uint8 flag, flagEx, type, flagX, flagY;
- checkone(cl, ch, &flag, &flagEx, &type, &flagX, &flagY);
+ clearReels();
- cl = flag;
- ch = flagEx;
- dl = flagX;
- dh = flagY;
- al = type;
+ //clearRest
+ memset(_mapData, 0, kLengthOfMap);
+ delete[] _backdropBlocks;
+ _backdropBlocks = 0;
+ _setFrames.clear();
+ delete[] _reelList;
+ _reelList = 0;
+ _personText.clear();
+ _setDesc.clear();
+ _blockDesc.clear();
+ _roomDesc.clear();
+ _freeFrames.clear();
+ _freeDesc.clear();
+
+ _roomLoaded = 0;
}
-void DreamGenContext::checkone(uint8 x, uint8 y, uint8 *flag, uint8 *flagEx, uint8 *type, uint8 *flagX, uint8 *flagY) {
- *flagX = x / 16;
- *flagY = y / 16;
- const uint8 *tileData = segRef(data.word(kBuffers)).ptr(kMapflags + (*flagY * 11 + *flagX) * 3, 3);
- *flag = tileData[0];
- *flagEx = tileData[1];
- *type = tileData[2];
+void DreamWebEngine::clearReels() {
+ _reel1.clear();
+ _reel2.clear();
+ _reel3.clear();
}
-void DreamGenContext::getblockofpixel() {
- al = getblockofpixel(cl, ch);
+void DreamWebEngine::getRidOfReels() {
+ if (_roomLoaded)
+ clearReels();
}
-uint8 DreamGenContext::getblockofpixel(uint8 x, uint8 y) {
- uint8 flag, flagEx, type, flagX, flagY;
- checkone(x + data.word(kMapxstart), y + data.word(kMapystart), &flag, &flagEx, &type, &flagX, &flagY);
- if (flag & 1)
- return 0;
+void DreamWebEngine::liftNoise(uint8 index) {
+ if (_realLocation == 5 || _realLocation == 21)
+ playChannel1(13); // hiss noise
else
- return type;
+ playChannel1(index);
}
-void DreamGenContext::addtopeoplelist() {
- addtopeoplelist((ReelRoutine *)es.ptr(bx, sizeof(ReelRoutine)));
-}
+void DreamWebEngine::checkForExit(Sprite *sprite) {
+ uint8 flag, flagEx, type, flagX, flagY;
+ checkOne(_ryanX + 12, _ryanY + 12, &flag, &flagEx, &type, &flagX, &flagY);
+ _lastFlag = flag;
+
+ if (flag & 64) {
+ _autoLocation = flagEx;
+ return;
+ }
-void DreamGenContext::addtopeoplelist(ReelRoutine *routine) {
- uint16 routinePointer = (const uint8 *)routine - cs.ptr(0, 0);
+ if (!(flag & 32)) {
+ if (flag & 4) {
+ // adjust left
+ _lastFlag = 0;
+ _mapX -= 11;
+ sprite->x = 16 * flagEx;
+ _nowInNewRoom = 1;
+ } else if (flag & 2) {
+ // adjust right
+ _mapX += 11;
+ sprite->x = 16 * flagEx - 2;
+ _nowInNewRoom = 1;
+ } else if (flag & 8) {
+ // adjust down
+ _mapY += 10;
+ sprite->y = 16 * flagEx;
+ _nowInNewRoom = 1;
+ } else if (flag & 16) {
+ // adjust up
+ _mapY -= 10;
+ sprite->y = 16 * flagEx;
+ _nowInNewRoom = 1;
+ }
+
+ return;
+ }
+
+ if (_realLocation == 2) {
+ // Can't leave Louis' until you found shoes
+
+ int shoeCount = 0;
+ if (isRyanHolding("WETA")) shoeCount++;
+ if (isRyanHolding("WETB")) shoeCount++;
+
+ if (shoeCount < 2) {
+ uint8 text = shoeCount ? 43 : 42;
+ setupTimedUse(text, 80, 10, 68, 64);
+
+ _turnToFace = (_facing + 4) & 7;
+ return;
+ }
+
+ }
- People *people = (People *)segRef(data.word(kBuffers)).ptr(data.word(kListpos), sizeof(People));
- people->setReelPointer(routine->reelPointer());
- people->setRoutinePointer(routinePointer);
- people->b4 = routine->b7;
- data.word(kListpos) += sizeof(People);
+ _vars._needToTravel = 1;
}
-} /*namespace dreamgen */
+} // End of namespace DreamWeb