diff options
-rw-r--r-- | engines/scumm/costume.cpp | 81 |
1 files changed, 38 insertions, 43 deletions
diff --git a/engines/scumm/costume.cpp b/engines/scumm/costume.cpp index 6bf737a6d8..af08f333a8 100644 --- a/engines/scumm/costume.cpp +++ b/engines/scumm/costume.cpp @@ -977,11 +977,17 @@ byte NESCostumeLoader::increaseAnim(Actor *a, int slot) { return (a->_cost.curpos[slot] != oldframe); } -static const byte actorColorsMMC64[] = { - 0, 7, 2, 6, 9, 1, 3, 7, 7, 1, 1, 9, 1, 4, 5, 5, - 4, 1, 0, 5, 4, 2, 2, 7, 7, 0, 6, 6, 6, 6, 6, 6 +static const byte actorColorsMMC64[25] = { + 0, 7, 2, 6, 9, 1, 3, 7, 7, 1, 1, 9, 1, 4, 5, 5, 4, 1, 0, 5, 4, 2, 2, 7, 7 }; +#define LINE(c,p) \ + pcolor = (color >> c) & 3; \ + if (pcolor) { \ + dst[p] = palette[pcolor]; \ + dst[p + 1] = palette[pcolor]; \ + } + byte C64CostumeRenderer::drawLimb(const Actor *a, int limb) { if (limb >= 8) return 0; @@ -1006,7 +1012,16 @@ byte C64CostumeRenderer::drawLimb(const Actor *a, int limb) { int off = (offH << 8) + offL; const byte *data = _loaded._baseptr + off; - const byte palette[] = {0, 10, actorColorsMMC64[_actorID], 0}; + + // Set up the palette data + byte palette[4] = { 0, 0, 0, 0 }; + if (!(_vm->VAR(_vm->VAR_CURRENT_LIGHTS) & LIGHTMODE_actor_color)) { + palette[2] = 11; + palette[3] = 11; + } else { + palette[1] = 10; + palette[2] = actorColorsMMC64[_actorID]; + } int width = *data++; int height = *data++; @@ -1041,51 +1056,29 @@ byte C64CostumeRenderer::drawLimb(const Actor *a, int limb) { ypos += _actorY - _loaded._maxHeight; // This code is very similar to procC64() - if (flipped) { - for (int y = 0; y < height; ++y) { - for (int x = 0; x < width; ++x) { - byte color = data[y * width + x]; - byte pcolor; - int realX = 0; + for (int y = 0; y < height; ++y) { + for (int x = 0; x < width; ++x) { + byte color = data[y * width + x]; + byte pcolor; + int realX = 0; + if (flipped) { if (offsetX == 0||offsetX == 1) { realX = width-(x+1); } else if (offsetX == 2) { realX = width-(x+2); } - - int destY = y + ypos; - int destX = realX * 8 + xpos; - if (destY >= 0 && destY < _out.h && destX >= 0 && destX < _out.w) { - byte *destPtr = &(((byte*)_out.pixels)[destY * _out.pitch + destX]); - for (int i = 0; i <= 6; i += 2) { - pcolor = (color >> i) & 3; - if (pcolor) { - destPtr[0] = palette[pcolor]; - destPtr[1] = palette[pcolor]; - } - destPtr += 2; - } - } + } else { + realX = x; } - } - } else { - for (int y = 0; y < height; ++y) { - for (int x = 0; x < width; ++x) { - byte color = data[y * width + x]; - byte pcolor; - - int destY = y + ypos; - int destX = x * 8 + xpos; - if (destY >= 0 && destY < _out.h && destX >= 0 && destX < _out.w) { - byte *destPtr = &(((byte*)_out.pixels)[destY * _out.pitch + destX]); - for (int i = 6; i >= 0; i -= 2) { - pcolor = (color >> i) & 3; - if (pcolor) { - destPtr[0] = palette[pcolor]; - destPtr[1] = palette[pcolor]; - } - destPtr += 2; - } + + int destY = y + ypos; + int destX = realX * 8 + xpos; + if (destY >= 0 && destY < _out.h && destX >= 0 && destX < _out.w) { + byte *dst = &(((byte*)_out.pixels)[destY * _out.pitch + destX]); + if (flipped) { + LINE(0, 0); LINE(2, 2); LINE(4, 4); LINE(6, 6); + } else { + LINE(6, 0); LINE(4, 2); LINE(2, 4); LINE(0, 6); } } } @@ -1100,6 +1093,8 @@ byte C64CostumeRenderer::drawLimb(const Actor *a, int limb) { return 0; } +#undef LINE + void C64CostumeRenderer::setCostume(int costume, int shadow) { _loaded.loadCostume(costume); } |