diff options
author | Willem Jan Palenstijn | 2013-04-18 23:35:23 +0200 |
---|---|---|
committer | Willem Jan Palenstijn | 2013-05-08 20:40:58 +0200 |
commit | 9c2341678ef4984bf92b3878295250faf980b066 (patch) | |
tree | 2fb4805e05e16b9924e80c9947e6bad723b28c4b /engines/dreamweb/backdrop.cpp | |
parent | 8172d679df5148a4a32f46074b20cb6caf91844f (diff) | |
parent | a5f4ff36ffc386d48f2da49387a9655ce9295a4d (diff) | |
download | scummvm-rg350-9c2341678ef4984bf92b3878295250faf980b066.tar.gz scummvm-rg350-9c2341678ef4984bf92b3878295250faf980b066.tar.bz2 scummvm-rg350-9c2341678ef4984bf92b3878295250faf980b066.zip |
Merge branch 'master'
Diffstat (limited to 'engines/dreamweb/backdrop.cpp')
-rw-r--r-- | engines/dreamweb/backdrop.cpp | 300 |
1 files changed, 123 insertions, 177 deletions
diff --git a/engines/dreamweb/backdrop.cpp b/engines/dreamweb/backdrop.cpp index ffcad5b6bf..1db2663624 100644 --- a/engines/dreamweb/backdrop.cpp +++ b/engines/dreamweb/backdrop.cpp @@ -22,24 +22,20 @@ #include "dreamweb/dreamweb.h" -namespace DreamGen { - -void DreamGenContext::doblocks() { - uint16 dstOffset = data.word(kMapady) * 320 + data.word(kMapadx); - uint16 mapOffset = kMap + data.byte(kMapy) * kMapwidth + data.byte(kMapx); - ds = data.word(kMapdata); - const uint8 *mapData = ds.ptr(mapOffset, 0); - ds = data.word(kBackdrop); - const uint8 *blocks = ds.ptr(kBlocks, 0); - es = data.word(kWorkspace); - uint8 *dstBuffer = es.ptr(dstOffset, 0); +namespace DreamWeb { + +void DreamWebEngine::doBlocks() { + uint16 dstOffset = _mapAdY * 320 + _mapAdX; + uint16 mapOffset = _mapY * kMapWidth + _mapX; + const uint8 *mapData = _mapData + mapOffset; + uint8 *dstBuffer = workspace() + dstOffset; for (size_t i = 0; i < 10; ++i) { for (size_t j = 0; j < 11; ++j) { uint16 blockType = mapData[j]; if (blockType != 0) { uint8 *dst = dstBuffer + i * 320 * 16 + j * 16; - const uint8 *block = blocks + blockType * 256; + const uint8 *block = _backdropBlocks + blockType * 256; for (size_t k = 0; k < 4; ++k) { memcpy(dst, block, 16); block += 16; @@ -52,7 +48,6 @@ void DreamGenContext::doblocks() { dst += 320; } dst += 4; - ax = 0x0dfdf; memset(dst, 0xdf, 16); dst += 320; memset(dst, 0xdf, 16); @@ -62,272 +57,223 @@ void DreamGenContext::doblocks() { memset(dst, 0xdf, 16); } } - mapData += kMapwidth; + mapData += kMapWidth; } } -uint8 DreamGenContext::getxad(const uint8 *setData, uint8 *result) { +uint8 DreamWebEngine::getXAd(const uint8 *setData, uint8 *result) { uint8 v0 = setData[0]; uint8 v1 = setData[1]; uint8 v2 = setData[2]; if (v0 != 0) return 0; - if (v1 < data.byte(kMapx)) + if (v1 < _mapX) return 0; - v1 -= data.byte(kMapx); + v1 -= _mapX; if (v1 >= 11) return 0; *result = (v1 << 4) | v2; return 1; } -uint8 DreamGenContext::getyad(const uint8 *setData, uint8 *result) { +uint8 DreamWebEngine::getYAd(const uint8 *setData, uint8 *result) { uint8 v0 = setData[3]; uint8 v1 = setData[4]; - if (v0 < data.byte(kMapy)) + if (v0 < _mapY) return 0; - v0 -= data.byte(kMapy); + v0 -= _mapY; if (v0 >= 10) return 0; *result = (v0 << 4) | v1; return 1; } -void DreamGenContext::getmapad() { - ch = getmapad((const uint8 *)es.ptr(si, 5)); -} - -uint8 DreamGenContext::getmapad(const uint8 *setData) { +uint8 DreamWebEngine::getMapAd(const uint8 *setData, uint16 *x, uint16 *y) { uint8 xad, yad; - if (getxad(setData, &xad) == 0) + if (getXAd(setData, &xad) == 0) return 0; - data.word(kObjectx) = xad; - if (getyad(setData, &yad) == 0) + *x = xad; + if (getYAd(setData, &yad) == 0) return 0; - data.word(kObjecty) = yad; + *y = yad; return 1; } -void DreamGenContext::calcfrframe() { - uint8 width, height; - calcfrframe(&width, &height); - cl = width; - ch = height; -} - -void DreamGenContext::calcfrframe(uint8* width, uint8* height) { - const Frame *frame = (const Frame *)segRef(data.word(kFrsegment)).ptr(data.word(kCurrentframe) * 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; - *width = frame->width; - *height = frame->height; -} +void DreamWebEngine::calcFrFrame(const Frame &frame, uint8 *width, uint8 *height, uint16 x, uint16 y, ObjPos *objPos) { + *width = frame.width; + *height = frame.height; -void DreamGenContext::finalframe() { - uint16 x, y; - finalframe(&x, &y); - di = x; - bx = y; + 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 DreamGenContext::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); +void DreamWebEngine::makeBackOb(SetObject *objData, uint16 x, uint16 y) { + if (_vars._newObs == 0) + return; + uint8 priority = objData->priority; + uint8 type = objData->type; + Sprite *sprite = makeSprite(x, y, false, &_setFrames); + + sprite->_objData = objData; + if (priority == 255) + priority = 0; + sprite->priority = priority; + sprite->type = type; + sprite->delay = 0; + sprite->animFrame = 0; } -void DreamGenContext::showallobs() { - data.word(kListpos) = kSetlist; - memset(segRef(data.word(kBuffers)).ptr(kSetlist, 0), 0xff, 128 * 5); - data.word(kFrsegment) = data.word(kSetframes); - data.word(kDataad) = kFramedata; - data.word(kFramesad) = kFrames; +void DreamWebEngine::showAllObs() { + _setList.clear(); - const Frame *frames = (const Frame *)segRef(data.word(kFrsegment)).ptr(0, 0); - SetObject *setEntries = (SetObject *)segRef(data.word(kSetdat)).ptr(0, 128 * sizeof(SetObject)); + const GraphicsFile &frameBase = _setFrames; for (size_t i = 0; i < 128; ++i) { - SetObject *setEntry = setEntries + i; - if (getmapad(setEntry->mapad) == 0) + SetObject *setEntry = &_setDat[i]; + uint16 x, y; + if (getMapAd(setEntry->mapad, &x, &y) == 0) continue; - uint8 currentFrame = setEntry->b18[0]; - data.word(kCurrentframe) = currentFrame; + uint8 currentFrame = setEntry->frames[0]; if (currentFrame == 0xff) continue; - calcfrframe(); - uint16 x, y; - finalframe(&x, &y); - setEntry->index = setEntry->b18[0]; + uint8 width, height; + ObjPos objPos; + calcFrFrame(frameBase._frames[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, data.word(kCurrentframe), 0); + x += _mapAdX; + y += _mapAdY; + showFrame(frameBase, x, y, currentFrame, 0); } else - makebackob(setEntry); - - ObjPos *objPos = (ObjPos *)segRef(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); -void DreamGenContext::getdimension() -{ - uint8 mapXstart, mapYstart; - uint8 mapXsize, mapYsize; - getdimension(&mapXstart, &mapYstart, &mapXsize, &mapYsize); - cl = mapXstart; - ch = mapYstart; - dl = mapXsize; - dh = mapYsize; + objPos.index = i; + _setList.push_back(objPos); + } } -bool DreamGenContext::addalong(const uint8 *mapFlags) { +static bool addAlong(const MapFlag *mapFlags) { for (size_t i = 0; i < 11; ++i) { - if (mapFlags[3 * i] != 0) + if (mapFlags[i]._flag != 0) return true; } return false; } -bool DreamGenContext::addlength(const uint8 *mapFlags) { +static bool addLength(const MapFlag *mapFlags) { for (size_t i = 0; i < 10; ++i) { - if (mapFlags[3 * 11 * i] != 0) + if (mapFlags[11 * i]._flag != 0) return true; } return false; } -void DreamGenContext::getdimension(uint8 *mapXstart, uint8 *mapYstart, uint8 *mapXsize, uint8 *mapYsize) { - const uint8 *mapFlags = segRef(data.word(kBuffers)).ptr(kMapflags, 0); - +void DreamWebEngine::getDimension(uint8 *mapXstart, uint8 *mapYstart, uint8 *mapXsize, uint8 *mapYsize) { uint8 yStart = 0; - while (! addalong(mapFlags + 3 * 11 * yStart)) + while (! addAlong(_mapFlags + 11 * yStart)) ++yStart; uint8 xStart = 0; - while (! addlength(mapFlags + 3 * xStart)) + while (! addLength(_mapFlags + xStart)) ++xStart; uint8 yEnd = 10; - while (! addalong(mapFlags + 3 * 11 * (yEnd - 1))) + while (! addAlong(_mapFlags + 11 * (yEnd - 1))) --yEnd; uint8 xEnd = 11; - while (! addlength(mapFlags + 3 * (xEnd - 1))) + while (! addLength(_mapFlags + (xEnd - 1))) --xEnd; *mapXstart = xStart; *mapYstart = yStart; *mapXsize = xEnd - xStart; *mapYsize = yEnd - yStart; - data.word(kMapxstart) = xStart << 4; - data.word(kMapystart) = yStart << 4; - data.byte(kMapxsize) = *mapXsize << 4; - data.byte(kMapysize) = *mapYsize << 4; + _mapXStart = xStart << 4; + _mapYStart = yStart << 4; + _mapXSize = *mapXsize << 4; + _mapYSize = *mapYsize << 4; } -void DreamGenContext::calcmapad() { +void DreamWebEngine::calcMapAd() { uint8 mapXstart, mapYstart; uint8 mapXsize, mapYsize; - getdimension(&mapXstart, &mapYstart, &mapXsize, &mapYsize); - data.word(kMapadx) = data.word(kMapoffsetx) - 8 * (mapXsize + 2 * mapXstart - 11); - data.word(kMapady) = data.word(kMapoffsety) - 8 * (mapYsize + 2 * mapYstart - 10); + getDimension(&mapXstart, &mapYstart, &mapXsize, &mapYsize); + _mapAdX = _mapOffsetX - 8 * (mapXsize + 2 * mapXstart - 11); + _mapAdY = _mapOffsetY - 8 * (mapYsize + 2 * mapYstart - 10); } -void DreamGenContext::showallfree() { - data.word(kListpos) = kFreelist; - ObjPos *listPos = (ObjPos *)segRef(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 DynObject *freeObjects = (const DynObject *)segRef(data.word(kFreedat)).ptr(0, 0); - for(size_t i = 0; i < 80; ++i) { - uint8 mapad = getmapad(freeObjects[i].mapad); - if (mapad != 0) { - data.word(kCurrentframe) = 3 * data.byte(kCurrentfree); +void DreamWebEngine::showAllFree() { + const unsigned int count = 80; + + _freeList.clear(); + + const DynObject *freeObjects = _freeDat; + const GraphicsFile &frameBase = _freeFrames; + 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; - calcfrframe(&width, &height); - uint16 x, y; - finalframe(&x, &y); + ObjPos objPos; + uint16 currentFrame = 3 * i; + calcFrFrame(frameBase._frames[currentFrame], &width, &height, x, y, &objPos); if ((width != 0) || (height != 0)) { - x += data.word(kMapadx); - y += data.word(kMapady); - showframe((Frame *)segRef(data.word(kFrsegment)).ptr(0, 0), x, y, data.word(kCurrentframe) & 0xff, 0); - ObjPos *objPos = (ObjPos *)segRef(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); + x += _mapAdX; + y += _mapAdY; + assert(currentFrame < 256); + showFrame(frameBase, x, y, currentFrame, 0); + objPos.index = i; + _freeList.push_back(objPos); } } - - ++data.byte(kCurrentfree); } } -void DreamGenContext::drawflags() { - uint8 *mapFlags = segRef(data.word(kBuffers)).ptr(kMapflags, 0); - const uint8 *mapData = segRef(data.word(kMapdata)).ptr(kMap + data.byte(kMapy) * kMapwidth + data.byte(kMapx), 0); - const uint8 *backdropFlags = segRef(data.word(kBackdrop)).ptr(kFlags, 0); +void DreamWebEngine::drawFlags() { + MapFlag *mapFlag = _mapFlags; + uint16 mapOffset = _mapY * kMapWidth + _mapX; + const uint8 *mapData = _mapData + mapOffset; for (size_t i = 0; i < 10; ++i) { for (size_t j = 0; j < 11; ++j) { - uint8 tile = mapData[i * kMapwidth + j]; - mapFlags[0] = backdropFlags[2 * tile + 0]; - mapFlags[1] = backdropFlags[2 * tile + 1]; - mapFlags[2] = tile; - mapFlags += 3; + uint8 tile = mapData[i * kMapWidth + j]; + mapFlag->_flag = _backdropFlags[tile]._flag; + mapFlag->_flagEx = _backdropFlags[tile]._flagEx; + mapFlag->_type = tile; + mapFlag++; } } } -void DreamGenContext::showallex() { - data.word(kListpos) = kExlist; - memset(segRef(data.word(kBuffers)).ptr(kExlist, 100 * 5), 0xff, 100 * 5); +void DreamWebEngine::showAllEx() { + 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 *)segRef(data.word(kExtras)).ptr(kExdata, sizeof(DynObject)); - for (size_t i = 0; i < 100; ++i, ++data.byte(kCurrentex)) { + DynObject *objects = _exData; + const GraphicsFile &frameBase = _exFrames; + for (size_t i = 0; i < count; ++i) { DynObject *object = objects + i; if (object->mapad[0] == 0xff) continue; - if (object->currentLocation != data.byte(kReallocation)) + if (object->currentLocation != _realLocation) continue; - if (getmapad(object->mapad) == 0) + uint16 x, y; + if (getMapAd(object->mapad, &x, &y) == 0) continue; - data.word(kCurrentframe) = 3 * data.byte(kCurrentex); uint8 width, height; - calcfrframe(&width, &height); - uint16 x, y; - finalframe(&x, &y); + ObjPos objPos; + uint16 currentFrame = 3 * i; + calcFrFrame(frameBase._frames[currentFrame], &width, &height, x, y, &objPos); if ((width != 0) || (height != 0)) { - showframe((Frame *)segRef(data.word(kFrsegment)).ptr(0, 0), x + data.word(kMapadx), y + data.word(kMapady), data.word(kCurrentframe) & 0xff, 0); - ObjPos *objPos = (ObjPos *)segRef(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); + assert(currentFrame < 256); + showFrame(frameBase, x + _mapAdX, y + _mapAdY, currentFrame, 0); + objPos.index = i; + _exList.push_back(objPos); } } } -} /*namespace dreamgen */ - +} // End of namespace DreamWeb |