aboutsummaryrefslogtreecommitdiff
path: root/engines/agi/sprite.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/agi/sprite.cpp')
-rw-r--r--engines/agi/sprite.cpp30
1 files changed, 17 insertions, 13 deletions
diff --git a/engines/agi/sprite.cpp b/engines/agi/sprite.cpp
index 2d8bb38741..3d69968075 100644
--- a/engines/agi/sprite.cpp
+++ b/engines/agi/sprite.cpp
@@ -117,7 +117,11 @@ void SpritesMgr::blitPixel(uint8 *p, uint8 *end, uint8 col, int spr, int width,
/* Keep control line information visible, but put our
* priority over water (0x30) surface
*/
- *p = (pr < 0x30 ? pr : spr) | col;
+ if (_vm->getFeatures() & (GF_AGI256 | GF_AGI256_2))
+ *(p + FROM_SBUF16_TO_SBUF256_OFFSET) = col; // Write to 256 color buffer
+ else
+ *p = (pr < 0x30 ? pr : spr) | col; // Write to 16 color (+control line/priority info) buffer
+
*hidden = false;
/* Except if our priority is 15, which should never happen
@@ -132,7 +136,7 @@ void SpritesMgr::blitPixel(uint8 *p, uint8 *end, uint8 col, int spr, int width,
}
-int SpritesMgr::blitCel(int x, int y, int spr, ViewCel *c) {
+int SpritesMgr::blitCel(int x, int y, int spr, ViewCel *c, bool agi256_2) {
uint8 *p0, *p, *q = NULL, *end;
int i, j, t, m, col;
int hidden = true;
@@ -151,15 +155,15 @@ int SpritesMgr::blitCel(int x, int y, int spr, ViewCel *c) {
t = c->transparency;
m = c->mirror;
spr <<= 4;
- p0 = &_vm->_game.sbuf[x + y * _WIDTH + m * (c->width - 1)];
+ p0 = &_vm->_game.sbuf16c[x + y * _WIDTH + m * (c->width - 1)];
- end = _vm->_game.sbuf + _WIDTH * _HEIGHT;
+ end = _vm->_game.sbuf16c + _WIDTH * _HEIGHT;
for (i = 0; i < c->height; i++) {
p = p0;
while (*q) {
- col = (*q & 0xf0) >> 4;
- for (j = *q & 0x0f; j; j--, p += 1 - 2 * m) {
+ col = agi256_2 ? *q : (*q & 0xf0) >> 4; // Uses whole byte for color info with AGI256-2
+ for (j = agi256_2 ? 1 : *q & 0x0f; j; j--, p += 1 - 2 * m) { // No RLE with AGI256-2
if (col != t) {
blitPixel(p, end, col, spr, _WIDTH, &hidden);
}
@@ -451,7 +455,7 @@ void SpritesMgr::blitSprites(SpriteList& l) {
Sprite *s = *iter;
objsSaveArea(s);
debugC(8, kDebugLevelSprites, "s->v->entry = %d (prio %d)", s->v->entry, s->v->priority);
- hidden = blitCel(s->xPos, s->yPos, s->v->priority, s->v->celData);
+ hidden = blitCel(s->xPos, s->yPos, s->v->priority, s->v->celData, s->v->viewData->agi256_2);
if (s->v->entry == 0) { /* if ego, update f1 */
_vm->setflag(fEgoInvisible, hidden);
}
@@ -609,7 +613,7 @@ void SpritesMgr::addToPic(int view, int loop, int cel, int x, int y, int pri, in
eraseBoth();
debugC(4, kDebugLevelSprites, "blit_cel (%d, %d, %d, c)", x, y, pri);
- blitCel(x1, y1, pri, c);
+ blitCel(x1, y1, pri, c, _vm->_game.views[view].agi256_2);
/* If margin is 0, 1, 2, or 3, the base of the cel is
* surrounded with a rectangle of the corresponding priority.
@@ -629,8 +633,8 @@ void SpritesMgr::addToPic(int view, int loop, int cel, int x, int y, int pri, in
// don't let box extend below y.
if (y3 > y2) y3 = y2;
- p1 = &_vm->_game.sbuf[x1 + y3 * _WIDTH];
- p2 = &_vm->_game.sbuf[x2 + y3 * _WIDTH];
+ p1 = &_vm->_game.sbuf16c[x1 + y3 * _WIDTH];
+ p2 = &_vm->_game.sbuf16c[x2 + y3 * _WIDTH];
for (y = y3; y <= y2; y++) {
if ((*p1 >> 4) >= 4)
@@ -642,8 +646,8 @@ void SpritesMgr::addToPic(int view, int loop, int cel, int x, int y, int pri, in
}
debugC(4, kDebugLevelSprites, "pri box: %d %d %d %d (%d)", x1, y3, x2, y2, mar);
- p1 = &_vm->_game.sbuf[x1 + y3 * _WIDTH];
- p2 = &_vm->_game.sbuf[x1 + y2 * _WIDTH];
+ p1 = &_vm->_game.sbuf16c[x1 + y3 * _WIDTH];
+ p2 = &_vm->_game.sbuf16c[x1 + y2 * _WIDTH];
for (x = x1; x <= x2; x++) {
if ((*p1 >> 4) >= 4)
*p1 = (mar << 4) | (*p1 & 0x0f);
@@ -687,7 +691,7 @@ void SpritesMgr::showObj(int n) {
s.buffer = (uint8 *)malloc(s.xSize * s.ySize);
objsSaveArea(&s);
- blitCel(x1, y1, s.xSize, c);
+ blitCel(x1, y1, s.xSize, c, _vm->_game.views[n].agi256_2);
commitBlock(x1, y1, x2, y2);
_vm->messageBox(_vm->_game.views[n].descr);
objsRestoreArea(&s);