mirror of
https://github.com/libretro/scummvm.git
synced 2025-03-05 17:57:14 +00:00
Patch from Quietust for MM NES:
o Fix all actor mask bugs o Simplify masking considerably o Moved the decodesNESObject call from object.cpp into gfx.cpp svn-id: r18177
This commit is contained in:
parent
d92c3c7c72
commit
7fb2eda235
@ -656,8 +656,7 @@ byte NESCostumeRenderer::drawLimb(const Actor *a, int limb) {
|
||||
|
||||
bool flipped = (newDirToOldDir(a->getFacing()) == 1);
|
||||
int left = 239, right = 0, top = 239, bottom = 0;
|
||||
byte *bgTransBuf = _vm->getMaskBuffer(0, 0, 0);
|
||||
byte *gfxMaskBuf = _vm->getMaskBuffer(0, 0, 1);
|
||||
byte *maskBuf = _vm->getMaskBuffer(0, 0, 1);
|
||||
|
||||
for (int spr = 0; spr < numSprites; spr++) {
|
||||
byte mask, tile, sprpal;
|
||||
@ -685,8 +684,6 @@ byte NESCostumeRenderer::drawLimb(const Actor *a, int limb) {
|
||||
if ((_actorY + y < 0) || (_actorY + y + 8 >= _out.h))
|
||||
continue;
|
||||
|
||||
bool doMask = (_zbuf && gfxMaskBuf[(_actorY + y) * _numStrips + (_actorX + x + 4) / 8 - 2]);
|
||||
|
||||
for (int ty = 0; ty < 8; ty++) {
|
||||
byte c1 = _vm->_NESPatTable[0][tile * 16 + ty];
|
||||
byte c2 = _vm->_NESPatTable[0][tile * 16 + ty + 8];
|
||||
@ -704,7 +701,7 @@ byte NESCostumeRenderer::drawLimb(const Actor *a, int limb) {
|
||||
continue;
|
||||
int my = _actorY + y + ty;
|
||||
int mx = _actorX + x + tx;
|
||||
if (!doMask || !(bgTransBuf[my * _numStrips + mx / 8] & revBitMask(mx & 7)))
|
||||
if (!(_zbuf && (maskBuf[my * _numStrips + mx / 8] & revBitMask(mx & 7))))
|
||||
*((byte *)_out.pixels + my * _out.pitch + mx) = palette[c];
|
||||
}
|
||||
}
|
||||
|
@ -1367,7 +1367,7 @@ void Gdi::drawBitmap(const byte *ptr, VirtScreen *vs, int x, int y, const int wi
|
||||
|
||||
if (_objectMode && _vm->_version == 1) {
|
||||
if (_vm->_platform == Common::kPlatformNES) {
|
||||
// TODO: Maybe call decodeNESObject here?
|
||||
decodeNESObject(ptr, x, y, width, height);
|
||||
} else {
|
||||
decodeC64Gfx(ptr, _C64.objectMap, (width / 8) * (height / 8) * 3);
|
||||
}
|
||||
@ -1442,7 +1442,7 @@ void Gdi::drawBitmap(const byte *ptr, VirtScreen *vs, int x, int y, const int wi
|
||||
|
||||
if (_vm->_version == 1) {
|
||||
if (_vm->_platform == Common::kPlatformNES) {
|
||||
mask_ptr = getMaskBuffer(x + k, y, 0);
|
||||
mask_ptr = getMaskBuffer(x + k, y, 1);
|
||||
drawStripNES(dstPtr, mask_ptr, vs->pitch, stripnr, y, height);
|
||||
}
|
||||
else if (_objectMode)
|
||||
@ -1494,7 +1494,7 @@ void Gdi::drawBitmap(const byte *ptr, VirtScreen *vs, int x, int y, const int wi
|
||||
if (_vm->_version == 1) {
|
||||
mask_ptr = getMaskBuffer(x + k, y, 1);
|
||||
if (_vm->_platform == Common::kPlatformNES) {
|
||||
drawStripNESMask(mask_ptr, stripnr, height);
|
||||
drawStripNESMask(mask_ptr, stripnr, y, height);
|
||||
} else {
|
||||
drawStripC64Mask(mask_ptr, stripnr, width, height);
|
||||
}
|
||||
@ -1971,7 +1971,7 @@ void Gdi::decodeNESGfx(const byte *room) {
|
||||
}
|
||||
_NES.nametable[i][width+2] = _NES.nametable[i][width+3] = 0;
|
||||
}
|
||||
memcpy(_NES.nametableObj,_NES.nametable, 16 * 64);
|
||||
memcpy(_NES.nametableObj,_NES.nametable, 16*64);
|
||||
|
||||
const byte *adata = room + READ_LE_UINT16(room + 0x0C);
|
||||
for (n = 0; n < 64;) {
|
||||
@ -2005,7 +2005,7 @@ void Gdi::decodeNESGfx(const byte *room) {
|
||||
mdata++;
|
||||
}
|
||||
}
|
||||
memcpy(_NES.masktableObj, _NES.masktable, 16 * 8);
|
||||
memcpy(_NES.masktableObj, _NES.masktable, 16*8);
|
||||
}
|
||||
|
||||
void Gdi::decodeNESObject(const byte *ptr, int xpos, int ypos, int width, int height) {
|
||||
@ -2014,8 +2014,10 @@ void Gdi::decodeNESObject(const byte *ptr, int xpos, int ypos, int width, int he
|
||||
_NES.objX = xpos;
|
||||
|
||||
// decode tile update data
|
||||
width /= 8;
|
||||
ypos /= 8;
|
||||
height /= 8;
|
||||
|
||||
for (y = ypos; y < ypos + height; y++) {
|
||||
x = xpos;
|
||||
while (x < xpos + width) {
|
||||
@ -2073,12 +2075,14 @@ void Gdi::decodeNESObject(const byte *ptr, int xpos, int ypos, int width, int he
|
||||
y = 0;
|
||||
do {
|
||||
byte *dest = &_NES.masktableObj[y + ypos][mx];
|
||||
*dest++ = (*dest & lmask) | *ptr++;
|
||||
*dest = (*dest & lmask) | *ptr++;
|
||||
dest++;
|
||||
for (x = 1; x < mwidth; x++) {
|
||||
if (x + 1 == mwidth)
|
||||
*dest++ = (*dest & rmask) | *ptr++;
|
||||
*dest = (*dest & rmask) | *ptr++;
|
||||
else
|
||||
*dest++ = *ptr++;
|
||||
*dest = *ptr++;
|
||||
dest++;
|
||||
}
|
||||
y++;
|
||||
} while (y < height);
|
||||
@ -2111,11 +2115,12 @@ void Gdi::drawStripNES(byte *dst, byte *mask, int dstPitch, int stripnr, int top
|
||||
}
|
||||
}
|
||||
|
||||
void Gdi::drawStripNESMask(byte *dst, int stripnr, int height) const {
|
||||
void Gdi::drawStripNESMask(byte *dst, int stripnr, int top, int height) const {
|
||||
if (!_NES.hasmask)
|
||||
return;
|
||||
top /= 8;
|
||||
height /= 8;
|
||||
int x = stripnr + 2;
|
||||
int x = stripnr; // masks, unlike room graphics, should NOT be adjusted
|
||||
|
||||
if (_objectMode)
|
||||
x += _NES.objX; // for objects, need to start at the left edge of the object, not the screen
|
||||
@ -2123,10 +2128,10 @@ void Gdi::drawStripNESMask(byte *dst, int stripnr, int height) const {
|
||||
debug(0,"NES tried to mask invalid strip %i",stripnr);
|
||||
return;
|
||||
}
|
||||
for (int y = 0; y < height; y++) {
|
||||
for (int y = top; y < top + height; y++) {
|
||||
byte c = (((_objectMode ? _NES.masktableObj : _NES.masktable)[y][x >> 3] >> (x & 7)) & 1) ? 0xFF : 0x00;
|
||||
for (int i = 0; i < 8; i++) {
|
||||
*dst = c;
|
||||
*dst &= c;
|
||||
dst += _numStrips;
|
||||
}
|
||||
}
|
||||
|
@ -255,7 +255,7 @@ protected:
|
||||
|
||||
/* Mask decompressors */
|
||||
void drawStripC64Mask(byte *dst, int stripnr, int width, int height) const;
|
||||
void drawStripNESMask(byte *dst, int stripnr, int height) const;
|
||||
void drawStripNESMask(byte *dst, int stripnr, int top, int height) const;
|
||||
void decompressMaskImgOr(byte *dst, const byte *src, int height) const;
|
||||
void decompressMaskImg(byte *dst, const byte *src, int height) const;
|
||||
|
||||
|
@ -484,11 +484,6 @@ void ScummEngine::drawObject(int obj, int arg) {
|
||||
if (numstrip != 0) {
|
||||
byte flags = od.flags | Gdi::dbObjectMode;
|
||||
|
||||
if (_version == 1) {
|
||||
if (_platform == Common::kPlatformNES) {
|
||||
gdi.decodeNESObject(ptr, xpos, ypos, width, height);
|
||||
}
|
||||
}
|
||||
// Sam & Max needs this to fix object-layering problems with
|
||||
// the inventory and conversation icons.
|
||||
if ((_version >= 7 || _gameId == GID_SAMNMAX) && getClass(od.obj_nr, kObjectClassIgnoreBoxes))
|
||||
|
Loading…
x
Reference in New Issue
Block a user