aboutsummaryrefslogtreecommitdiff
path: root/engines/dreamweb/backdrop.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/dreamweb/backdrop.cpp')
-rw-r--r--engines/dreamweb/backdrop.cpp153
1 files changed, 60 insertions, 93 deletions
diff --git a/engines/dreamweb/backdrop.cpp b/engines/dreamweb/backdrop.cpp
index 38ccb0296c..875e16805e 100644
--- a/engines/dreamweb/backdrop.cpp
+++ b/engines/dreamweb/backdrop.cpp
@@ -89,46 +89,39 @@ uint8 DreamBase::getYAd(const uint8 *setData, uint8 *result) {
return 1;
}
-uint8 DreamBase::getMapAd(const uint8 *setData) {
+uint8 DreamBase::getMapAd(const uint8 *setData, uint16 *x, uint16 *y) {
uint8 xad, yad;
if (getXAd(setData, &xad) == 0)
return 0;
- data.word(kObjectx) = xad;
+ *x = xad;
if (getYAd(setData, &yad) == 0)
return 0;
- data.word(kObjecty) = yad;
+ *y = yad;
return 1;
}
-void DreamBase::calcFrFrame(uint16 frameNum, uint8* width, uint8* height) {
- const Frame *frame = (const Frame *)getSegment(data.word(kFrsegment)).ptr(frameNum * sizeof(Frame), sizeof(Frame));
- data.word(kSavesource) = data.word(kFramesad) + frame->ptr();
- data.byte(kSavesize+0) = frame->width;
- data.byte(kSavesize+1) = frame->height;
- data.word(kOffsetx) = frame->x;
- data.word(kOffsety) = frame->y;
+void DreamBase::calcFrFrame(const Frame *frameBase, uint16 frameNum, uint8 *width, uint8 *height, uint16 x, uint16 y, ObjPos *objPos) {
+ const Frame *frame = frameBase + frameNum;
*width = frame->width;
*height = frame->height;
-}
-void DreamBase::finalFrame(uint16 *x, uint16 *y) {
- data.byte(kSavex) = (data.word(kObjectx) + data.word(kOffsetx)) & 0xff;
- data.byte(kSavey) = (data.word(kObjecty) + data.word(kOffsety)) & 0xff;
- *x = data.word(kObjectx);
- *y = data.word(kObjecty);
+ objPos->xMin = (x + frame->x) & 0xff;
+ objPos->yMin = (y + frame->y) & 0xff;
+ objPos->xMax = objPos->xMin + frame->width;
+ objPos->yMax = objPos->yMin + frame->height;
}
-void DreamBase::makeBackOb(SetObject *objData) {
+void DreamBase::makeBackOb(SetObject *objData, uint16 x, uint16 y) {
if (data.byte(kNewobs) == 0)
return;
uint8 priority = objData->priority;
uint8 type = objData->type;
- Sprite *sprite = makeSprite(data.word(kObjectx), data.word(kObjecty), addr_backobject, data.word(kSetframes), 0);
+ Sprite *sprite = makeSprite(x, y, addr_backobject, data.word(kSetframes), 0);
uint16 objDataOffset = (uint8 *)objData - getSegment(data.word(kSetdat)).ptr(0, 0);
assert(objDataOffset % sizeof(SetObject) == 0);
assert(objDataOffset < 128 * sizeof(SetObject));
- sprite->setObjData(objDataOffset);
+ sprite->_objData = objDataOffset;
if (priority == 255)
priority = 0;
sprite->priority = priority;
@@ -139,40 +132,33 @@ void DreamBase::makeBackOb(SetObject *objData) {
}
void DreamBase::showAllObs() {
- data.word(kListpos) = kSetlist;
- memset(getSegment(data.word(kBuffers)).ptr(kSetlist, 0), 0xff, 128 * 5);
- data.word(kFrsegment) = data.word(kSetframes);
- data.word(kDataad) = kFramedata;
- data.word(kFramesad) = kFrames;
-
- const Frame *frames = (const Frame *)getSegment(data.word(kFrsegment)).ptr(0, 0);
- SetObject *setEntries = (SetObject *)getSegment(data.word(kSetdat)).ptr(0, 128 * sizeof(SetObject));
- for (size_t i = 0; i < 128; ++i) {
+ const unsigned int count = 128;
+
+ _setList.clear();
+
+ const Frame *frameBase = (const Frame *)getSegment(data.word(kSetframes)).ptr(0, 0);
+ SetObject *setEntries = (SetObject *)getSegment(data.word(kSetdat)).ptr(0, count * sizeof(SetObject));
+ for (size_t i = 0; i < count; ++i) {
SetObject *setEntry = setEntries + i;
- if (getMapAd(setEntry->mapad) == 0)
+ uint16 x, y;
+ if (getMapAd(setEntry->mapad, &x, &y) == 0)
continue;
uint8 currentFrame = setEntry->frames[0];
if (currentFrame == 0xff)
continue;
uint8 width, height;
- calcFrFrame(currentFrame, &width, &height);
- uint16 x, y;
- finalFrame(&x, &y);
+ ObjPos objPos;
+ calcFrFrame(frameBase, currentFrame, &width, &height, x, y, &objPos);
setEntry->index = setEntry->frames[0];
if ((setEntry->type == 0) && (setEntry->priority != 5) && (setEntry->priority != 6)) {
x += data.word(kMapadx);
y += data.word(kMapady);
- showFrame(frames, x, y, currentFrame, 0);
+ showFrame(frameBase, x, y, currentFrame, 0);
} else
- makeBackOb(setEntry);
-
- ObjPos *objPos = (ObjPos *)getSegment(data.word(kBuffers)).ptr(data.word(kListpos), sizeof(ObjPos));
- objPos->xMin = data.byte(kSavex);
- objPos->yMin = data.byte(kSavey);
- objPos->xMax = data.byte(kSavex) + data.byte(kSavesize+0);
- objPos->yMax = data.byte(kSavey) + data.byte(kSavesize+1);
- objPos->index = i;
- data.word(kListpos) += sizeof(ObjPos);
+ makeBackOb(setEntry, x, y);
+
+ objPos.index = i;
+ _setList.push_back(objPos);
}
}
@@ -193,22 +179,20 @@ bool DreamBase::addLength(const uint8 *mapFlags) {
}
void DreamBase::getDimension(uint8 *mapXstart, uint8 *mapYstart, uint8 *mapXsize, uint8 *mapYsize) {
- const uint8 *mapFlags = getSegment(data.word(kBuffers)).ptr(kMapflags, 0);
-
uint8 yStart = 0;
- while (! addAlong(mapFlags + 3 * 11 * yStart))
+ while (! addAlong(_mapFlags + 3 * 11 * yStart))
++yStart;
uint8 xStart = 0;
- while (! addLength(mapFlags + 3 * xStart))
+ while (! addLength(_mapFlags + 3 * xStart))
++xStart;
uint8 yEnd = 10;
- while (! addAlong(mapFlags + 3 * 11 * (yEnd - 1)))
+ while (! addAlong(_mapFlags + 3 * 11 * (yEnd - 1)))
--yEnd;
uint8 xEnd = 11;
- while (! addLength(mapFlags + 3 * (xEnd - 1)))
+ while (! addLength(_mapFlags + 3 * (xEnd - 1)))
--xEnd;
*mapXstart = xStart;
@@ -230,44 +214,34 @@ void DreamBase::calcMapAd() {
}
void DreamBase::showAllFree() {
- data.word(kListpos) = kFreelist;
- ObjPos *listPos = (ObjPos *)getSegment(data.word(kBuffers)).ptr(kFreelist, 80 * sizeof(ObjPos));
- memset(listPos, 0xff, 80 * sizeof(ObjPos));
-
- data.word(kFrsegment) = data.word(kFreeframes);
- data.word(kDataad) = kFrframedata;
- data.word(kFramesad) = kFrframes;
- data.byte(kCurrentfree) = 0;
+ const unsigned int count = 80;
+
+ _freeList.clear();
+
const DynObject *freeObjects = (const DynObject *)getSegment(data.word(kFreedat)).ptr(0, 0);
- for (size_t i = 0; i < 80; ++i) {
- uint8 mapAd = getMapAd(freeObjects[i].mapad);
+ const Frame *frameBase = (const Frame *)getSegment(data.word(kFreeframes)).ptr(0, 0);
+ for (size_t i = 0; i < count; ++i) {
+ uint16 x, y;
+ uint8 mapAd = getMapAd(freeObjects[i].mapad, &x, &y);
if (mapAd != 0) {
uint8 width, height;
- uint16 currentFrame = 3 * data.byte(kCurrentfree);
- calcFrFrame(currentFrame, &width, &height);
- uint16 x, y;
- finalFrame(&x, &y);
+ ObjPos objPos;
+ uint16 currentFrame = 3 * i;
+ calcFrFrame(frameBase, currentFrame, &width, &height, x, y, &objPos);
if ((width != 0) || (height != 0)) {
x += data.word(kMapadx);
y += data.word(kMapady);
assert(currentFrame < 256);
- showFrame((Frame *)getSegment(data.word(kFrsegment)).ptr(0, 0), x, y, currentFrame, 0);
- ObjPos *objPos = (ObjPos *)getSegment(data.word(kBuffers)).ptr(data.word(kListpos), sizeof(ObjPos));
- objPos->xMin = data.byte(kSavex);
- objPos->yMin = data.byte(kSavey);
- objPos->xMax = data.byte(kSavex) + data.byte(kSavesize+0);
- objPos->yMax = data.byte(kSavey) + data.byte(kSavesize+1);
- objPos->index = i;
- data.word(kListpos) += sizeof(ObjPos);
+ showFrame(frameBase, x, y, currentFrame, 0);
+ objPos.index = i;
+ _freeList.push_back(objPos);
}
}
-
- ++data.byte(kCurrentfree);
}
}
void DreamBase::drawFlags() {
- uint8 *mapFlags = getSegment(data.word(kBuffers)).ptr(kMapflags, 0);
+ uint8 *mapFlags = _mapFlags;
const uint8 *mapData = getSegment(data.word(kMapdata)).ptr(kMap + data.byte(kMapy) * kMapwidth + data.byte(kMapx), 0);
const uint8 *backdropFlags = getSegment(data.word(kBackdrop)).ptr(kFlags, 0);
@@ -283,37 +257,30 @@ void DreamBase::drawFlags() {
}
void DreamBase::showAllEx() {
- data.word(kListpos) = kExlist;
- memset(getSegment(data.word(kBuffers)).ptr(kExlist, 100 * 5), 0xff, 100 * 5);
+ const unsigned int count = 100;
+
+ _exList.clear();
- data.word(kFrsegment) = data.word(kExtras);
- data.word(kDataad) = kExframedata;
- data.word(kFramesad) = kExframes;
- data.byte(kCurrentex) = 0;
DynObject *objects = (DynObject *)getSegment(data.word(kExtras)).ptr(kExdata, sizeof(DynObject));
- for (size_t i = 0; i < 100; ++i, ++data.byte(kCurrentex)) {
+ const Frame *frameBase = (const Frame *)getSegment(data.word(kExtras)).ptr(0, 0);
+ for (size_t i = 0; i < count; ++i) {
DynObject *object = objects + i;
if (object->mapad[0] == 0xff)
continue;
if (object->currentLocation != data.byte(kReallocation))
continue;
- if (getMapAd(object->mapad) == 0)
+ uint16 x, y;
+ if (getMapAd(object->mapad, &x, &y) == 0)
continue;
uint8 width, height;
- uint16 currentFrame = 3 * data.byte(kCurrentex);
- calcFrFrame(currentFrame, &width, &height);
- uint16 x, y;
- finalFrame(&x, &y);
+ ObjPos objPos;
+ uint16 currentFrame = 3 * i;
+ calcFrFrame(frameBase, currentFrame, &width, &height, x, y, &objPos);
if ((width != 0) || (height != 0)) {
assert(currentFrame < 256);
- showFrame((Frame *)getSegment(data.word(kFrsegment)).ptr(0, 0), x + data.word(kMapadx), y + data.word(kMapady), currentFrame, 0);
- ObjPos *objPos = (ObjPos *)getSegment(data.word(kBuffers)).ptr(data.word(kListpos), sizeof(ObjPos));
- objPos->xMin = data.byte(kSavex);
- objPos->yMin = data.byte(kSavey);
- objPos->xMax = data.byte(kSavesize + 0) + data.byte(kSavex);
- objPos->yMax = data.byte(kSavesize + 1) + data.byte(kSavey);
- objPos->index = i;
- data.word(kListpos) += sizeof(ObjPos);
+ showFrame(frameBase, x + data.word(kMapadx), y + data.word(kMapady), currentFrame, 0);
+ objPos.index = i;
+ _exList.push_back(objPos);
}
}
}