diff options
Diffstat (limited to 'engines/agi/sprite.cpp')
-rw-r--r-- | engines/agi/sprite.cpp | 67 |
1 files changed, 31 insertions, 36 deletions
diff --git a/engines/agi/sprite.cpp b/engines/agi/sprite.cpp index 63ac880267..569481d772 100644 --- a/engines/agi/sprite.cpp +++ b/engines/agi/sprite.cpp @@ -241,6 +241,14 @@ void SpritesMgr::objsRestoreArea(Sprite *s) { q += xSize; pos0 += _WIDTH; } + + // WORKAROUND (see ScummVM bug #1945716) + // When set.view command is called, current code cannot detect this situation while updating + // Thus we force removal of the old sprite + if (s->v && s->v->viewReplaced) { + commitBlock(xPos, yPos, xPos + xSize, yPos + ySize); + s->v->viewReplaced = false; + } } @@ -332,6 +340,8 @@ void SpritesMgr::buildList(SpriteList &l, bool (*test)(VtEntry *, AgiEngine *)) } } + debugC(5, kDebugLevelSprites, "buildList() --> entries %d", i); + // now look for the smallest y value in the array and put that // sprite in the list for (j = 0; j < i; j++) { @@ -381,38 +391,20 @@ void SpritesMgr::freeList(SpriteList &l) { * Copy sprites from the pic buffer to the screen buffer, and check if * sprites of the given list have moved. */ -void SpritesMgr::commitSprites(SpriteList &l) { +void SpritesMgr::commitSprites(SpriteList &l, bool immediate) { SpriteList::iterator iter; for (iter = l.begin(); iter != l.end(); ++iter) { Sprite *s = *iter; - int x1, y1, x2, y2, w, h; + int x1, y1, x2, y2; - w = (s->v->celData->width > s->v->celData2->width) ? - s->v->celData->width : s->v->celData2->width; - - h = (s->v->celData->height > - s->v->celData2->height) ? s->v->celData-> - height : s->v->celData2->height; + x1 = MIN((int)MIN(s->v->xPos, s->v->xPos2), MIN(s->v->xPos + s->v->celData->width, s->v->xPos2 + s->v->celData2->width)); + x2 = MAX((int)MAX(s->v->xPos, s->v->xPos2), MAX(s->v->xPos + s->v->celData->width, s->v->xPos2 + s->v->celData2->width)); + y1 = MIN((int)MIN(s->v->yPos, s->v->yPos2), MIN(s->v->yPos - s->v->celData->height, s->v->yPos2 - s->v->celData2->height)); + y2 = MAX((int)MAX(s->v->yPos, s->v->yPos2), MAX(s->v->yPos - s->v->celData->height, s->v->yPos2 - s->v->celData2->height)); s->v->celData2 = s->v->celData; - if (s->v->xPos < s->v->xPos2) { - x1 = s->v->xPos; - x2 = s->v->xPos2 + w - 1; - } else { - x1 = s->v->xPos2; - x2 = s->v->xPos + w - 1; - } - - if (s->v->yPos < s->v->yPos2) { - y1 = s->v->yPos - h + 1; - y2 = s->v->yPos2; - } else { - y1 = s->v->yPos2 - h + 1; - y2 = s->v->yPos; - } - - commitBlock(x1, y1, x2, y2); + commitBlock(x1, y1, x2, y2, immediate); if (s->v->stepTimeCount != s->v->stepTime) continue; @@ -452,7 +444,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); + debugC(8, kDebugLevelSprites, "blitSprites(): s->v->entry = %d (prio %d)", s->v->entry, s->v->priority); 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 @@ -528,7 +520,7 @@ void SpritesMgr::eraseBoth() { * @see blit_both() */ void SpritesMgr::blitUpdSprites() { - debugC(7, kDebugLevelSprites, "blit updating"); + debugC(7, kDebugLevelSprites, "blitUpdSprites()"); buildUpdBlitlist(); blitSprites(_sprUpd); } @@ -542,7 +534,7 @@ void SpritesMgr::blitUpdSprites() { * @see blit_both() */ void SpritesMgr::blitNonupdSprites() { - debugC(7, kDebugLevelSprites, "blit non-updating"); + debugC(7, kDebugLevelSprites, "blitNonupdSprites()"); buildNonupdBlitlist(); blitSprites(_sprNonupd); } @@ -578,7 +570,7 @@ void SpritesMgr::addToPic(int view, int loop, int cel, int x, int y, int pri, in int x1, y1, x2, y2, y3; uint8 *p1, *p2; - debugC(3, kDebugLevelSprites, "v=%d, l=%d, c=%d, x=%d, y=%d, p=%d, m=%d", view, loop, cel, x, y, pri, mar); + debugC(3, kDebugLevelSprites, "addToPic(view=%d, loop=%d, cel=%d, x=%d, y=%d, pri=%d, mar=%d)", view, loop, cel, x, y, pri, mar); _vm->recordImageStackCall(ADD_VIEW, view, loop, cel, x, y, pri, mar); @@ -609,7 +601,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); + debugC(4, kDebugLevelSprites, "blitCel(%d, %d, %d, c)", x, y, pri); 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 @@ -659,8 +651,7 @@ void SpritesMgr::addToPic(int view, int loop, int cel, int x, int y, int pri, in blitBoth(); - debugC(4, kDebugLevelSprites, "commit_block (%d, %d, %d, %d)", x1, y1, x2, y2); - commitBlock(x1, y1, x2, y2); + commitBlock(x1, y1, x2, y2, true); } /** @@ -688,18 +679,19 @@ void SpritesMgr::showObj(int n) { s.xSize = c->width; s.ySize = c->height; s.buffer = (uint8 *)malloc(s.xSize * s.ySize); + s.v = 0; objsSaveArea(&s); blitCel(x1, y1, 15, c, _vm->_game.views[n].agi256_2); - commitBlock(x1, y1, x2, y2); + commitBlock(x1, y1, x2, y2, true); _vm->messageBox(_vm->_game.views[n].descr); objsRestoreArea(&s); - commitBlock(x1, y1, x2, y2); + commitBlock(x1, y1, x2, y2, true); free(s.buffer); } -void SpritesMgr::commitBlock(int x1, int y1, int x2, int y2) { +void SpritesMgr::commitBlock(int x1, int y1, int x2, int y2, bool immediate) { int i, w, offset; uint8 *q; @@ -711,7 +703,7 @@ void SpritesMgr::commitBlock(int x1, int y1, int x2, int y2) { y1 = CLIP(y1, 0, _HEIGHT - 1); y2 = CLIP(y2, 0, _HEIGHT - 1); - debugC(7, kDebugLevelSprites, "%d, %d, %d, %d", x1, y1, x2, y2); + debugC(7, kDebugLevelSprites, "commitBlock(%d, %d, %d, %d)", x1, y1, x2, y2); w = x2 - x1 + 1; q = &_vm->_game.sbuf16c[x1 + _WIDTH * y1]; @@ -723,6 +715,9 @@ void SpritesMgr::commitBlock(int x1, int y1, int x2, int y2) { } _gfx->flushBlockA(x1, y1 + offset, x2, y2 + offset); + + if (immediate) + _gfx->doUpdate(); } SpritesMgr::SpritesMgr(AgiEngine *agi, GfxMgr *gfx) { |