Initial commit
This commit is contained in:
285
engines/dreamweb/backdrop.cpp
Normal file
285
engines/dreamweb/backdrop.cpp
Normal file
@@ -0,0 +1,285 @@
|
||||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "dreamweb/dreamweb.h"
|
||||
|
||||
namespace DreamWeb {
|
||||
|
||||
void DreamWebEngine::doBlocks() {
|
||||
uint16 dstOffset = _mapAdY * kScreenwidth + _mapAdX;
|
||||
uint16 mapOffset = _mapY * kMapWidth + _mapX;
|
||||
const uint8 *mapData = _mapData + mapOffset;
|
||||
uint8 *dstBuffer = workspace() + dstOffset;
|
||||
|
||||
for (uint i = 0; i < 10; ++i) {
|
||||
for (uint j = 0; j < 11; ++j) {
|
||||
uint16 blockType = mapData[j];
|
||||
if (blockType != 0) {
|
||||
uint8 *dst = dstBuffer + i * kScreenwidth * 16 + j * 16;
|
||||
const uint8 *block = _backdropBlocks + blockType * 256;
|
||||
for (uint k = 0; k < 4; ++k) {
|
||||
memcpy(dst, block, 16);
|
||||
block += 16;
|
||||
dst += kScreenwidth;
|
||||
}
|
||||
for (uint k = 0; k < 12; ++k) {
|
||||
memcpy(dst, block, 16);
|
||||
memset(dst + 16, 0xdf, 4);
|
||||
block += 16;
|
||||
dst += kScreenwidth;
|
||||
}
|
||||
dst += 4;
|
||||
memset(dst, 0xdf, 16);
|
||||
dst += kScreenwidth;
|
||||
memset(dst, 0xdf, 16);
|
||||
dst += kScreenwidth;
|
||||
memset(dst, 0xdf, 16);
|
||||
dst += kScreenwidth;
|
||||
memset(dst, 0xdf, 16);
|
||||
}
|
||||
}
|
||||
mapData += kMapWidth;
|
||||
}
|
||||
}
|
||||
|
||||
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 < _mapX)
|
||||
return 0;
|
||||
v1 -= _mapX;
|
||||
if (v1 >= 11)
|
||||
return 0;
|
||||
*result = (v1 << 4) | v2;
|
||||
return 1;
|
||||
}
|
||||
|
||||
uint8 DreamWebEngine::getYAd(const uint8 *setData, uint8 *result) {
|
||||
uint8 v0 = setData[3];
|
||||
uint8 v1 = setData[4];
|
||||
if (v0 < _mapY)
|
||||
return 0;
|
||||
v0 -= _mapY;
|
||||
if (v0 >= 10)
|
||||
return 0;
|
||||
*result = (v0 << 4) | v1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
uint8 DreamWebEngine::getMapAd(const uint8 *setData, uint16 *x, uint16 *y) {
|
||||
uint8 xad, yad;
|
||||
if (getXAd(setData, &xad) == 0)
|
||||
return 0;
|
||||
*x = xad;
|
||||
if (getYAd(setData, &yad) == 0)
|
||||
return 0;
|
||||
*y = yad;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void DreamWebEngine::calcFrFrame(const Frame &frame, uint8 *width, uint8 *height, uint16 x, uint16 y, ObjPos *objPos) {
|
||||
*width = frame.width;
|
||||
*height = frame.height;
|
||||
|
||||
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 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 DreamWebEngine::showAllObs() {
|
||||
_setList.clear();
|
||||
|
||||
const GraphicsFile &frameBase = _setFrames;
|
||||
for (uint i = 0; i < 128; ++i) {
|
||||
SetObject *setEntry = &_setDat[i];
|
||||
uint16 x, y;
|
||||
if (getMapAd(setEntry->mapad, &x, &y) == 0)
|
||||
continue;
|
||||
uint8 currentFrame = setEntry->frames[0];
|
||||
if (currentFrame == 0xff)
|
||||
continue;
|
||||
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 += _mapAdX;
|
||||
y += _mapAdY;
|
||||
showFrame(frameBase, x, y, currentFrame, 0);
|
||||
} else
|
||||
makeBackOb(setEntry, x, y);
|
||||
|
||||
objPos.index = i;
|
||||
_setList.push_back(objPos);
|
||||
}
|
||||
}
|
||||
|
||||
static bool addAlong(const MapFlag *mapFlags) {
|
||||
for (uint i = 0; i < 11; ++i) {
|
||||
if (mapFlags[i]._flag != 0)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool addLength(const MapFlag *mapFlags) {
|
||||
for (uint i = 0; i < 10; ++i) {
|
||||
if (mapFlags[11 * i]._flag != 0)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void DreamWebEngine::getDimension(uint8 *mapXstart, uint8 *mapYstart, uint8 *mapXsize, uint8 *mapYsize) {
|
||||
uint8 yStart = 0;
|
||||
while (! addAlong(_mapFlags + 11 * yStart))
|
||||
++yStart;
|
||||
|
||||
uint8 xStart = 0;
|
||||
while (! addLength(_mapFlags + xStart))
|
||||
++xStart;
|
||||
|
||||
uint8 yEnd = 10;
|
||||
while (! addAlong(_mapFlags + 11 * (yEnd - 1)))
|
||||
--yEnd;
|
||||
|
||||
uint8 xEnd = 11;
|
||||
while (! addLength(_mapFlags + (xEnd - 1)))
|
||||
--xEnd;
|
||||
|
||||
*mapXstart = xStart;
|
||||
*mapYstart = yStart;
|
||||
*mapXsize = xEnd - xStart;
|
||||
*mapYsize = yEnd - yStart;
|
||||
_mapXStart = xStart << 4;
|
||||
_mapYStart = yStart << 4;
|
||||
_mapXSize = *mapXsize << 4;
|
||||
_mapYSize = *mapYsize << 4;
|
||||
}
|
||||
|
||||
void DreamWebEngine::calcMapAd() {
|
||||
uint8 mapXstart, mapYstart;
|
||||
uint8 mapXsize, mapYsize;
|
||||
getDimension(&mapXstart, &mapYstart, &mapXsize, &mapYsize);
|
||||
_mapAdX = _mapOffsetX - 8 * (mapXsize + 2 * mapXstart - 11);
|
||||
_mapAdY = _mapOffsetY - 8 * (mapYsize + 2 * mapYstart - 10);
|
||||
}
|
||||
|
||||
void DreamWebEngine::showAllFree() {
|
||||
const uint count = 80;
|
||||
|
||||
_freeList.clear();
|
||||
|
||||
const DynObject *freeObjects = _freeDat;
|
||||
const GraphicsFile &frameBase = _freeFrames;
|
||||
for (uint i = 0; i < count; ++i) {
|
||||
uint16 x, y;
|
||||
uint8 mapAd = getMapAd(freeObjects[i].mapad, &x, &y);
|
||||
if (mapAd != 0) {
|
||||
uint8 width, height;
|
||||
ObjPos objPos;
|
||||
uint16 currentFrame = 3 * i;
|
||||
calcFrFrame(frameBase._frames[currentFrame], &width, &height, x, y, &objPos);
|
||||
if ((width != 0) || (height != 0)) {
|
||||
x += _mapAdX;
|
||||
y += _mapAdY;
|
||||
assert(currentFrame < 256);
|
||||
showFrame(frameBase, x, y, currentFrame, 0);
|
||||
objPos.index = i;
|
||||
_freeList.push_back(objPos);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DreamWebEngine::drawFlags() {
|
||||
MapFlag *mapFlag = _mapFlags;
|
||||
uint16 mapOffset = _mapY * kMapWidth + _mapX;
|
||||
const uint8 *mapData = _mapData + mapOffset;
|
||||
|
||||
for (uint i = 0; i < 10; ++i) {
|
||||
for (uint j = 0; j < 11; ++j) {
|
||||
uint8 tile = mapData[i * kMapWidth + j];
|
||||
mapFlag->_flag = _backdropFlags[tile]._flag;
|
||||
mapFlag->_flagEx = _backdropFlags[tile]._flagEx;
|
||||
mapFlag->_type = tile;
|
||||
mapFlag++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DreamWebEngine::showAllEx() {
|
||||
const uint count = 100;
|
||||
|
||||
_exList.clear();
|
||||
|
||||
DynObject *objects = _exData;
|
||||
const GraphicsFile &frameBase = _exFrames;
|
||||
for (uint i = 0; i < count; ++i) {
|
||||
DynObject *object = objects + i;
|
||||
if (object->mapad[0] == 0xff)
|
||||
continue;
|
||||
if (object->currentLocation != _realLocation)
|
||||
continue;
|
||||
uint16 x, y;
|
||||
if (getMapAd(object->mapad, &x, &y) == 0)
|
||||
continue;
|
||||
uint8 width, height;
|
||||
ObjPos objPos;
|
||||
uint16 currentFrame = 3 * i;
|
||||
calcFrFrame(frameBase._frames[currentFrame], &width, &height, x, y, &objPos);
|
||||
if ((width != 0) || (height != 0)) {
|
||||
// FIXME: this was an assert() that failed during normal gameplay.
|
||||
// Now it's a warning, because it's unclear if the check is valid.
|
||||
// It could have been a copy/paste mistake from showAllFree,
|
||||
// where there are fewer iterations. See bugs: #15420, #15436
|
||||
if (currentFrame >= 256) {
|
||||
warning("showing extra frame %d >= 256", currentFrame);
|
||||
}
|
||||
|
||||
showFrame(frameBase, x + _mapAdX, y + _mapAdY, currentFrame, 0);
|
||||
objPos.index = i;
|
||||
_exList.push_back(objPos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // End of namespace DreamWeb
|
||||
Reference in New Issue
Block a user