From b7997a723105534dcefe50ae5b1448638480f0da Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sat, 8 Jul 2006 16:37:23 +0000 Subject: - Fixed a few mistakes that added up to look correct, fixing bargon's cursor - Updated cursor drawing in general svn-id: r23429 --- engines/gob/draw.cpp | 132 ---------------------------------- engines/gob/draw.h | 9 ++- engines/gob/draw_v1.cpp | 132 ++++++++++++++++++++++++++++++++++ engines/gob/draw_v2.cpp | 175 ++++++++++++++++++++++++++++++++++++++++++++-- engines/gob/game_v2.cpp | 2 +- engines/gob/goblin_v2.cpp | 2 +- engines/gob/inter.h | 1 + engines/gob/inter_v1.cpp | 15 +++- engines/gob/inter_v2.cpp | 37 +++++++--- engines/gob/map.h | 4 +- engines/gob/map_v2.cpp | 2 +- engines/gob/mult.cpp | 17 ----- engines/gob/mult.h | 1 - engines/gob/mult_v2.cpp | 4 +- engines/gob/scenery.cpp | 2 +- engines/gob/util.h | 16 ----- 16 files changed, 360 insertions(+), 191 deletions(-) diff --git a/engines/gob/draw.cpp b/engines/gob/draw.cpp index ff023640af..4d305c49a1 100644 --- a/engines/gob/draw.cpp +++ b/engines/gob/draw.cpp @@ -306,138 +306,6 @@ void Draw::clearPalette(void) { } } -void Draw::blitCursor(void) { - if (_cursorIndex == -1) - return; - - _cursorIndex = -1; - - if (_noInvalidated) { - _vm->_video->drawSprite(_backSurface, _frontSurface, - _cursorX, _cursorY, - _cursorX + _cursorWidth - 1, - _cursorY + _cursorHeight - 1, _cursorX, - _cursorY, 0); - } else { - invalidateRect(_cursorX, _cursorY, - _cursorX + _cursorWidth - 1, - _cursorY + _cursorHeight - 1); - } -} - -void Draw::animateCursor(int16 cursor) { - int16 newX = 0; - int16 newY = 0; - Game::Collision *ptr; - int16 minX; - int16 minY; - int16 maxX; - int16 maxY; - int16 cursorIndex; - - cursorIndex = cursor; - - if (cursorIndex == -1) { - cursorIndex = 0; - for (ptr = _vm->_game->_collisionAreas; ptr->left != -1; ptr++) { - if (ptr->flags & 0xfff0) - continue; - - if (ptr->left > _vm->_global->_inter_mouseX) - continue; - - if (ptr->right < _vm->_global->_inter_mouseX) - continue; - - if (ptr->top > _vm->_global->_inter_mouseY) - continue; - - if (ptr->bottom < _vm->_global->_inter_mouseY) - continue; - - if ((ptr->flags & 0xf) < 3) - cursorIndex = 1; - else - cursorIndex = 3; - break; - } - if (_cursorAnimLow[cursorIndex] == -1) - cursorIndex = 1; - } - - if (_cursorAnimLow[cursorIndex] != -1) { - if (cursorIndex == _cursorIndex) { - if (_cursorAnimDelays[_cursorIndex] != 0 && - _cursorAnimDelays[_cursorIndex] * 10 + - _cursorTimeKey <= _vm->_util->getTimeKey()) { - _cursorAnim++; - _cursorTimeKey = _vm->_util->getTimeKey(); - } else { -/* if (_noInvalidated && - inter_mouseX == _cursorX && inter_mouseY == _cursorY) - return;*/ - } - } else { - _cursorIndex = cursorIndex; - if (_cursorAnimDelays[_cursorIndex] != 0) { - _cursorAnim = - _cursorAnimLow[_cursorIndex]; - _cursorTimeKey = _vm->_util->getTimeKey(); - } else { - _cursorAnim = _cursorIndex; - } - } - - if (_cursorAnimDelays[_cursorIndex] != 0 && - (_cursorAnimHigh[_cursorIndex] < _cursorAnim || - _cursorAnimLow[_cursorIndex] > - _cursorAnim)) { - _cursorAnim = _cursorAnimLow[_cursorIndex]; - } - - newX = _vm->_global->_inter_mouseX; - newY = _vm->_global->_inter_mouseY; - if (_cursorXDeltaVar != -1) { - newX -= (uint16)VAR_OFFSET(_cursorIndex * 4 + (_cursorXDeltaVar / 4) * 4); - newY -= (uint16)VAR_OFFSET(_cursorIndex * 4 + (_cursorYDeltaVar / 4) * 4); - } - - minX = MIN(newX, _cursorX); - minY = MIN(newY, _cursorY); - maxX = MAX(_cursorX, newX) + _cursorWidth - 1; - maxY = MAX(_cursorY, newY) + _cursorHeight - 1; - _vm->_video->drawSprite(_backSurface, _cursorBack, - newX, newY, newX + _cursorWidth - 1, - newY + _cursorHeight - 1, 0, 0, 0); - - _vm->_video->drawSprite(_cursorSprites, _backSurface, - _cursorWidth * _cursorAnim, 0, - _cursorWidth * (_cursorAnim + 1) - 1, - _cursorHeight - 1, newX, newY, _transparentCursor); - - if (_noInvalidated == 0) { - cursorIndex = _cursorIndex; - _cursorIndex = -1; - blitInvalidated(); - _cursorIndex = cursorIndex; - } else { - _vm->_video->waitRetrace(_vm->_global->_videoMode); - } - - _vm->_video->drawSprite(_backSurface, _frontSurface, - minX, minY, maxX, maxY, minX, minY, 0); - - _vm->_video->drawSprite(_cursorBack, _backSurface, - 0, 0, _cursorWidth - 1, _cursorHeight - 1, - newX, newY, 0); - } else { - blitCursor(); - } - - _cursorX = newX; - _cursorY = newY; -} - void Draw::freeSprite(int16 index) { int i; diff --git a/engines/gob/draw.h b/engines/gob/draw.h index f9350b816d..7010f95425 100644 --- a/engines/gob/draw.h +++ b/engines/gob/draw.h @@ -113,9 +113,6 @@ public: void blitInvalidated(void); void setPalette(void); void clearPalette(void); - void blitCursor(void); - - void animateCursor(int16 cursor); void freeSprite(int16 index); void adjustCoords(char adjust, int16 *coord1, int16 *coord2); @@ -135,6 +132,8 @@ public: virtual void initBigSprite(int16 index, int16 width, int16 height, int16 flags) = 0; virtual void printText(void) = 0; virtual void spriteOperation(int16 operation) = 0; + virtual void blitCursor(void) = 0; + virtual void animateCursor(int16 cursor) = 0; Draw(GobEngine *vm); virtual ~Draw() {}; @@ -148,6 +147,8 @@ public: virtual void initBigSprite(int16 index, int16 width, int16 height, int16 flags); virtual void printText(void); virtual void spriteOperation(int16 operation); + virtual void blitCursor(void); + virtual void animateCursor(int16 cursor); Draw_v1(GobEngine *vm); virtual ~Draw_v1() {}; @@ -158,6 +159,8 @@ public: virtual void initBigSprite(int16 index, int16 width, int16 height, int16 flags); virtual void printText(void); virtual void spriteOperation(int16 operation); + virtual void blitCursor(void); + virtual void animateCursor(int16 cursor); Draw_v2(GobEngine *vm); virtual ~Draw_v2() {}; diff --git a/engines/gob/draw_v1.cpp b/engines/gob/draw_v1.cpp index 31377059b7..e355ebcfcb 100644 --- a/engines/gob/draw_v1.cpp +++ b/engines/gob/draw_v1.cpp @@ -489,4 +489,136 @@ void Draw_v1::spriteOperation(int16 operation) { } } +void Draw_v1::blitCursor(void) { + if (_cursorIndex == -1) + return; + + _cursorIndex = -1; + + if (_noInvalidated) { + _vm->_video->drawSprite(_backSurface, _frontSurface, + _cursorX, _cursorY, + _cursorX + _cursorWidth - 1, + _cursorY + _cursorHeight - 1, _cursorX, + _cursorY, 0); + } else { + invalidateRect(_cursorX, _cursorY, + _cursorX + _cursorWidth - 1, + _cursorY + _cursorHeight - 1); + } +} + +void Draw_v1::animateCursor(int16 cursor) { + int16 newX = 0; + int16 newY = 0; + Game::Collision *ptr; + int16 minX; + int16 minY; + int16 maxX; + int16 maxY; + int16 cursorIndex; + + cursorIndex = cursor; + + if (cursorIndex == -1) { + cursorIndex = 0; + for (ptr = _vm->_game->_collisionAreas; ptr->left != -1; ptr++) { + if (ptr->flags & 0xfff0) + continue; + + if (ptr->left > _vm->_global->_inter_mouseX) + continue; + + if (ptr->right < _vm->_global->_inter_mouseX) + continue; + + if (ptr->top > _vm->_global->_inter_mouseY) + continue; + + if (ptr->bottom < _vm->_global->_inter_mouseY) + continue; + + if ((ptr->flags & 0xf) < 3) + cursorIndex = 1; + else + cursorIndex = 3; + break; + } + if (_cursorAnimLow[cursorIndex] == -1) + cursorIndex = 1; + } + + if (_cursorAnimLow[cursorIndex] != -1) { + if (cursorIndex == _cursorIndex) { + if (_cursorAnimDelays[_cursorIndex] != 0 && + _cursorAnimDelays[_cursorIndex] * 10 + + _cursorTimeKey <= _vm->_util->getTimeKey()) { + _cursorAnim++; + _cursorTimeKey = _vm->_util->getTimeKey(); + } else { +/* if (_noInvalidated && + inter_mouseX == _cursorX && inter_mouseY == _cursorY) + return;*/ + } + } else { + _cursorIndex = cursorIndex; + if (_cursorAnimDelays[_cursorIndex] != 0) { + _cursorAnim = + _cursorAnimLow[_cursorIndex]; + _cursorTimeKey = _vm->_util->getTimeKey(); + } else { + _cursorAnim = _cursorIndex; + } + } + + if (_cursorAnimDelays[_cursorIndex] != 0 && + (_cursorAnimHigh[_cursorIndex] < _cursorAnim || + _cursorAnimLow[_cursorIndex] > + _cursorAnim)) { + _cursorAnim = _cursorAnimLow[_cursorIndex]; + } + + newX = _vm->_global->_inter_mouseX; + newY = _vm->_global->_inter_mouseY; + if (_cursorXDeltaVar != -1) { + newX -= (uint16)VAR_OFFSET(_cursorIndex * 4 + (_cursorXDeltaVar / 4) * 4); + newY -= (uint16)VAR_OFFSET(_cursorIndex * 4 + (_cursorYDeltaVar / 4) * 4); + } + + minX = MIN(newX, _cursorX); + minY = MIN(newY, _cursorY); + maxX = MAX(_cursorX, newX) + _cursorWidth - 1; + maxY = MAX(_cursorY, newY) + _cursorHeight - 1; + _vm->_video->drawSprite(_backSurface, _cursorBack, + newX, newY, newX + _cursorWidth - 1, + newY + _cursorHeight - 1, 0, 0, 0); + + _vm->_video->drawSprite(_cursorSprites, _backSurface, + _cursorWidth * _cursorAnim, 0, + _cursorWidth * (_cursorAnim + 1) - 1, + _cursorHeight - 1, newX, newY, _transparentCursor); + + if (_noInvalidated == 0) { + cursorIndex = _cursorIndex; + _cursorIndex = -1; + blitInvalidated(); + _cursorIndex = cursorIndex; + } else { + _vm->_video->waitRetrace(_vm->_global->_videoMode); + } + + _vm->_video->drawSprite(_backSurface, _frontSurface, + minX, minY, maxX, maxY, minX, minY, 0); + + _vm->_video->drawSprite(_cursorBack, _backSurface, + 0, 0, _cursorWidth - 1, _cursorHeight - 1, + newX, newY, 0); + } else { + blitCursor(); + } + + _cursorX = newX; + _cursorY = newY; +} + } // End of namespace Gob diff --git a/engines/gob/draw_v2.cpp b/engines/gob/draw_v2.cpp index b9795153ca..af1d61fbb3 100644 --- a/engines/gob/draw_v2.cpp +++ b/engines/gob/draw_v2.cpp @@ -542,7 +542,8 @@ void Draw_v2::spriteOperation(int16 operation) { _spriteBottom -= _frontSurface->height; } if (_destSurface == 21) - invalidateRect(0, _frontSurface->height, 319, _frontSurface->height+_vm->_game->_off_2E51B->height-1); + invalidateRect(0, _frontSurface->height, 319, + _frontSurface->height + _vm->_game->_off_2E51B->height - 1); destSurface += 4; } if ((_frontSurface->height <= _spriteTop) && (operation == DRAW_BLITSURF) @@ -653,7 +654,8 @@ void Draw_v2::spriteOperation(int16 operation) { break; case DRAW_INVALIDATE: - _vm->_video->drawCircle(_spritesArray[_destSurface], _destSpriteX, _destSpriteY, _spriteRight, _frontColor); + _vm->_video->drawCircle(_spritesArray[_destSurface], _destSpriteX, + _destSpriteY, _spriteRight, _frontColor); if (_destSurface == 21) { invalidateRect(_destSpriteX - _spriteRight, _destSpriteY - _spriteBottom, // !! _destSpriteX + _spriteRight, @@ -734,8 +736,8 @@ void Draw_v2::spriteOperation(int16 operation) { _vm->_video->drawLetter(_textToPrint[i], _destSpriteX, _destSpriteY, _fonts[_fontIndex], _transparency, _frontColor, _backColor, _spritesArray[_destSurface]); - _destSpriteX += - *(((char*)_fonts[_fontIndex]->extraData) + (_textToPrint[i] - _fonts[_fontIndex]->startItem)); + _destSpriteX += *(((char*)_fonts[_fontIndex]->extraData) + + (_textToPrint[i] - _fonts[_fontIndex]->startItem)); } } else { // loc_DBE9 warning("Untested, does that work?"); @@ -874,4 +876,169 @@ void Draw_v2::spriteOperation(int16 operation) { } } +void Draw_v2::blitCursor(void) { + int16 width; + int16 height; + + if (_cursorIndex == -1) + return; + + _cursorIndex = -1; + width = _cursorWidth; + height = _cursorHeight; + if(_backSurface->width < (_cursorX + _cursorWidth)) + width -= _cursorX; + if(_backSurface->height < (_cursorY + _cursorHeight)) + height -= _cursorY; + if (_frontSurface == _backSurface) + _vm->_video->drawSprite(_cursorBack, _frontSurface, 0, 0, width - 1, height - 1, + _cursorX, _cursorY, 0); + else if (_noInvalidated == 0) + invalidateRect(_cursorX, _cursorY, _cursorX + width - 1, _cursorY + height - 1); + else + _vm->_video->drawSprite(_backSurface, _frontSurface, _cursorX, _cursorY, + _cursorX + width - 1, _cursorY + height - 1, _cursorX, _cursorY, 0); +} + +void Draw_v2::animateCursor(int16 cursor) { + int16 newX = 0; + int16 newY = 0; + Game::Collision *ptr; + int16 minX; + int16 minY; + int16 maxX; + int16 maxY; + int16 cursorIndex; + bool oldCursor; + + oldCursor = _cursorIndex != -1; + + if (((_backSurface->width - 9) < _vm->_global->_inter_mouseX) || + ((_backSurface->height - 4) < _vm->_global->_inter_mouseY)) { + _vm->_global->_inter_mouseX = MIN((int) _vm->_global->_inter_mouseX, _backSurface->width - 9); + _vm->_global->_inter_mouseY = MIN((int) _vm->_global->_inter_mouseY, _backSurface->height - 4); + _vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY); + } + + // .-- _draw_animateCursorSUB1 --- + cursorIndex = cursor; + if (cursorIndex == -1) { + cursorIndex = 0; + for (ptr = _vm->_game->_collisionAreas; ptr->left != -1; ptr++) { + if ((ptr->flags & 0xF00) || (ptr->flags & 0x4000)) + continue; + + if (ptr->left > _vm->_global->_inter_mouseX) + continue; + + if (ptr->right < _vm->_global->_inter_mouseX) + continue; + + if (ptr->top > _vm->_global->_inter_mouseY) + continue; + + if (ptr->bottom < _vm->_global->_inter_mouseY) + continue; + + if ((ptr->flags & 0xF000) == 0) { + if ((ptr->flags & 0xF) >= 3) { + cursorIndex = 3; + break; + } else if (((ptr->flags & 0xF0) != 0x10) && (cursorIndex == 0)) + cursorIndex = 1; + } else if (cursorIndex == 0) + cursorIndex = (ptr->flags >> 12) & 0xF; + } + if (_cursorAnimLow[cursorIndex] == -1) + cursorIndex = 1; + } + // '------ + + if (_cursorAnimLow[cursorIndex] != -1) { + // .-- _draw_animateCursorSUB2 --- + if (cursorIndex == _cursorIndex) { + if ((_cursorAnimDelays[_cursorIndex] != 0) && + ((_cursorTimeKey + (_cursorAnimDelays[_cursorIndex] * 10)) <= + _vm->_util->getTimeKey())) { + _cursorAnim++; + if ((_cursorAnimHigh[_cursorIndex] < _cursorAnim) || + (_cursorAnimLow[_cursorIndex] > _cursorAnim)) + _cursorAnim = _cursorAnimLow[_cursorIndex]; + _cursorTimeKey = _vm->_util->getTimeKey(); + } else { + if ((_noInvalidated != 0) && (_vm->_global->_inter_mouseX == _cursorX) && + (_vm->_global->_inter_mouseY == _cursorY)) { + _vm->_video->waitRetrace(_vm->_global->_videoMode); + return; + } + } + } else { + _cursorIndex = cursorIndex; + if (_cursorAnimDelays[cursorIndex] != 0) { + _cursorAnim = _cursorAnimLow[cursorIndex]; + _cursorTimeKey = _vm->_util->getTimeKey(); + } + } + + if (_cursorAnimDelays[_cursorIndex] != 0) { + if ((_cursorAnimHigh[_cursorIndex] < _cursorAnim) || + (_cursorAnimLow[_cursorIndex] > _cursorAnim)) + _cursorAnim = _cursorAnimLow[_cursorIndex]; + + cursorIndex = _cursorAnim; + } + // '------ + + newX = _vm->_global->_inter_mouseX; + newY = _vm->_global->_inter_mouseY; + if (_cursorXDeltaVar != -1) { + newX -= (uint16)VAR(_cursorIndex + _cursorXDeltaVar); + newY -= (uint16)VAR(_cursorIndex + _cursorYDeltaVar); + } + + minX = MIN(newX, _cursorX); + minY = MIN(newY, _cursorY); + maxX = MAX(_cursorX, newX) + _cursorWidth - 1; + maxY = MAX(_cursorY, newY) + _cursorHeight - 1; + if (_frontSurface == _backSurface) { // loc_177C2 + if ((newX != _cursorX) || (newY != _cursorY)) { + if (oldCursor) + _vm->_video->drawSprite(_cursorBack, _frontSurface, 0, 0, + _cursorWidth - 1, _cursorHeight - 1, _cursorX, _cursorY, 0); + _vm->_video->drawSprite(_frontSurface, _cursorBack, newX, newY, + newX + _cursorWidth - 1, newY + _cursorHeight - 1, 0, 0, 0); + _vm->_video->drawSprite(_cursorSprites, _frontSurface, + cursorIndex * _cursorWidth, 0, + (cursorIndex * _cursorWidth) + _cursorWidth - 1, _cursorHeight - 1, + newX, newY, _transparentCursor); + } + } else { // loc_1787D + _vm->_video->drawSprite(_backSurface, _cursorBack, newX, newY, + newX + _cursorWidth - 1, newY + _cursorHeight - 1, 0, 0, 0); + _vm->_video->drawSprite(_cursorSprites, _backSurface, + cursorIndex * _cursorWidth, 0, + (cursorIndex * _cursorWidth) + _cursorWidth - 1, _cursorHeight - 1, + newX, newY, _transparentCursor); + if (_noInvalidated == 0) { + int16 tmp = _cursorIndex; + _cursorIndex = -1; + blitInvalidated(); + _cursorIndex = tmp; + } else { + _vm->_video->waitRetrace(_vm->_global->_videoMode); + if (minY < 50) + _vm->_util->delay(5); + } + _vm->_video->drawSprite(_backSurface, _frontSurface, + minX, minY, maxX, maxY, minX, minY, 0); + _vm->_video->drawSprite(_cursorBack, _backSurface, 0, 0, + _cursorWidth - 1, _cursorHeight - 1, newX, newY, 0); + } + } else + blitCursor(); + + _cursorX = newX; + _cursorY = newY; +} + } // End of namespace Gob diff --git a/engines/gob/game_v2.cpp b/engines/gob/game_v2.cpp index ab14eec6de..ec0ef0a27b 100644 --- a/engines/gob/game_v2.cpp +++ b/engines/gob/game_v2.cpp @@ -782,7 +782,7 @@ void Game_v2::collisionsBlock(void) { cmd &= 0x7f; debugC(1, DEBUG_COLLISIONS, "collisionsBlock(%d)", cmd); - switch(cmd) { + switch (cmd) { case 0: _vm->_global->_inter_execPtr += 6; startIP = _vm->_global->_inter_execPtr; diff --git a/engines/gob/goblin_v2.cpp b/engines/gob/goblin_v2.cpp index d52300a8d9..d8f9ab4aa3 100644 --- a/engines/gob/goblin_v2.cpp +++ b/engines/gob/goblin_v2.cpp @@ -339,7 +339,7 @@ void Goblin_v2::moveAdvance(Mult::Mult_Object *obj, Gob_Object *gobDesc, break; } - switch(animData->state) { + switch (animData->state) { case 0: case 1: case 7: diff --git a/engines/gob/inter.h b/engines/gob/inter.h index 7a365a5544..a539173200 100644 --- a/engines/gob/inter.h +++ b/engines/gob/inter.h @@ -338,6 +338,7 @@ protected: void o2_multSub(void); void o2_setRenderFlags(void); void o2_initMult(void); + void o2_getObjAnimSize(void); void o2_loadCurLayer(void); void o2_playCDTrack(void); void o2_stopCD(void); diff --git a/engines/gob/inter_v1.cpp b/engines/gob/inter_v1.cpp index 1db6498945..c83e76874a 100644 --- a/engines/gob/inter_v1.cpp +++ b/engines/gob/inter_v1.cpp @@ -1594,7 +1594,20 @@ void Inter_v1::o1_storeParams(void) { } void Inter_v1::o1_getObjAnimSize(void) { - _vm->_mult->interGetObjAnimSize(); + Mult::Mult_AnimData *pAnimData; + int16 objIndex; + + evalExpr(&objIndex); + pAnimData = _vm->_mult->_objects[objIndex].pAnimData; + if (pAnimData->isStatic == 0) { + _vm->_scenery->updateAnim(pAnimData->layer, pAnimData->frame, + pAnimData->animation, 0, *(_vm->_mult->_objects[objIndex].pPosX), + *(_vm->_mult->_objects[objIndex].pPosY), 0); + } + WRITE_VAR_OFFSET(_vm->_parse->parseVarIndex(), _vm->_scenery->_toRedrawLeft); + WRITE_VAR_OFFSET(_vm->_parse->parseVarIndex(), _vm->_scenery->_toRedrawTop); + WRITE_VAR_OFFSET(_vm->_parse->parseVarIndex(), _vm->_scenery->_toRedrawRight); + WRITE_VAR_OFFSET(_vm->_parse->parseVarIndex(), _vm->_scenery->_toRedrawBottom); } void Inter_v1::o1_loadStatic(void) { diff --git a/engines/gob/inter_v2.cpp b/engines/gob/inter_v2.cpp index 5a692e9aaf..2c3454e406 100644 --- a/engines/gob/inter_v2.cpp +++ b/engines/gob/inter_v2.cpp @@ -156,7 +156,7 @@ void Inter_v2::setupOpcodes(void) { OPCODE(o1_multLoadMult), /* 18 */ OPCODE(o1_storeParams), - OPCODE(o1_getObjAnimSize), + OPCODE(o2_getObjAnimSize), OPCODE(o1_loadStatic), OPCODE(o1_freeStatic), /* 1C */ @@ -1078,11 +1078,11 @@ void Inter_v2::o2_writeGoblinPos(void) { int16 var2; int16 index; - var1 = _vm->_parse->parseVarIndex() >> 2; - var2 = _vm->_parse->parseVarIndex() >> 2; + var1 = _vm->_parse->parseVarIndex(); + var2 = _vm->_parse->parseVarIndex(); index = _vm->_parse->parseValExpr(); - WRITE_VAR(var1, _vm->_mult->_objects[index].goblinX); - WRITE_VAR(var2, _vm->_mult->_objects[index].goblinY); + WRITE_VAR_OFFSET(var1, _vm->_mult->_objects[index].goblinX); + WRITE_VAR_OFFSET(var2, _vm->_mult->_objects[index].goblinY); } void Inter_v2::o2_multSub(void) { @@ -1707,6 +1707,25 @@ void Inter_v2::o2_initMult(void) { debugC(4, DEBUG_GRAPHICS, " _vm->_mult->_objCount = %d, animation data size = %d", _vm->_mult->_objCount, _vm->_global->_inter_animDataSize); } +void Inter_v2::o2_getObjAnimSize(void) { + Mult::Mult_AnimData *pAnimData; + int16 objIndex; + + objIndex = _vm->_parse->parseValExpr(); + pAnimData = _vm->_mult->_objects[objIndex].pAnimData; + if (pAnimData->isStatic == 0) { + _vm->_scenery->updateAnim(pAnimData->layer, pAnimData->frame, + pAnimData->animation, 0, *(_vm->_mult->_objects[objIndex].pPosX), + *(_vm->_mult->_objects[objIndex].pPosY), 0); + } + _vm->_scenery->_toRedrawLeft = MAX(_vm->_scenery->_toRedrawLeft, (int16) 0); + _vm->_scenery->_toRedrawTop = MAX(_vm->_scenery->_toRedrawTop, (int16) 0); + WRITE_VAR_OFFSET(_vm->_parse->parseVarIndex(), _vm->_scenery->_toRedrawLeft); + WRITE_VAR_OFFSET(_vm->_parse->parseVarIndex(), _vm->_scenery->_toRedrawTop); + WRITE_VAR_OFFSET(_vm->_parse->parseVarIndex(), _vm->_scenery->_toRedrawRight); + WRITE_VAR_OFFSET(_vm->_parse->parseVarIndex(), _vm->_scenery->_toRedrawBottom); +} + void Inter_v2::o2_loadCurLayer(void) { _vm->_scenery->_curStatic = _vm->_parse->parseValExpr(); _vm->_scenery->_curStaticLayer = _vm->_parse->parseValExpr(); @@ -1806,10 +1825,10 @@ void Inter_v2::o2_initCursor(void) { if (count > 0x80) count -= 0x80; - _vm->_draw->_cursorSprites = - _vm->_video->initSurfDesc(_vm->_global->_videoMode, _vm->_draw->_cursorWidth * count, - _vm->_draw->_cursorHeight, 2); - _vm->_draw->_spritesArray[23] = _vm->_draw->_cursorSprites; + _vm->_draw->initBigSprite(23, _vm->_draw->_cursorWidth * count, + _vm->_draw->_cursorHeight, 2); + _vm->_draw->_cursorSpritesBack = _vm->_draw->_spritesArray[23]; + _vm->_draw->_cursorSprites = _vm->_draw->_cursorSpritesBack; _vm->_draw->_cursorBack = _vm->_video->initSurfDesc(_vm->_global->_videoMode, _vm->_draw->_cursorWidth, diff --git a/engines/gob/map.h b/engines/gob/map.h index c550fe0add..606af141d0 100644 --- a/engines/gob/map.h +++ b/engines/gob/map.h @@ -142,13 +142,13 @@ public: virtual inline int8 getPass(int x, int y, int heightOff = -1) { if (heightOff == -1) heightOff = _passWidth; - return _vm->_util->readVariableByte((char *) (_passMap + y * heightOff + x)); + return _passMap[y * heightOff + x]; } virtual inline void setPass(int x, int y, int8 pass, int heightOff = -1) { if (heightOff == -1) heightOff = _passWidth; - _vm->_util->writeVariableByte((char *) (_passMap + y * heightOff + x) , pass); + _passMap[y * heightOff + x] = pass; } Map_v2(GobEngine *vm); diff --git a/engines/gob/map_v2.cpp b/engines/gob/map_v2.cpp index aca3f0eae1..561f13a8d1 100644 --- a/engines/gob/map_v2.cpp +++ b/engines/gob/map_v2.cpp @@ -112,12 +112,12 @@ void Map_v2::loadMapObjects(char *avjFile) { // In the original asm, this writes byte-wise into the variables-array dataPos1 = mapData.pos(); + mapData.seek(dataPos2); if (variables != _vm->_global->_inter_variables) { _passMap = (int8 *) variables; mapHeight = 200 / _tilesHeight; mapWidth = _screenWidth / _tilesWidth; for (i = 0; i < mapHeight; i++) { - mapData.seek(dataPos2 + (mapWidth * i)); for (j = 0; j < mapWidth; j++) { setPass(j, i, mapData.readSByte()); } diff --git a/engines/gob/mult.cpp b/engines/gob/mult.cpp index 1ff363ef9a..710fa7bfc5 100644 --- a/engines/gob/mult.cpp +++ b/engines/gob/mult.cpp @@ -121,23 +121,6 @@ Mult::Mult(GobEngine *vm) : _vm(vm) { _orderArray = 0; } -void Mult::interGetObjAnimSize(void) { - Mult_AnimData *pAnimData; - int16 objIndex; - - _vm->_inter->evalExpr(&objIndex); - pAnimData = _objects[objIndex].pAnimData; - if (pAnimData->isStatic == 0) { - _vm->_scenery->updateAnim(pAnimData->layer, pAnimData->frame, - pAnimData->animation, 0, *(_objects[objIndex].pPosX), - *(_objects[objIndex].pPosY), 0); - } - WRITE_VAR_OFFSET(_vm->_parse->parseVarIndex(), _vm->_scenery->_toRedrawLeft); - WRITE_VAR_OFFSET(_vm->_parse->parseVarIndex(), _vm->_scenery->_toRedrawTop); - WRITE_VAR_OFFSET(_vm->_parse->parseVarIndex(), _vm->_scenery->_toRedrawRight); - WRITE_VAR_OFFSET(_vm->_parse->parseVarIndex(), _vm->_scenery->_toRedrawBottom); -} - void Mult::freeAll(void) { int16 i; diff --git a/engines/gob/mult.h b/engines/gob/mult.h index c5e252cd40..54c2526a32 100644 --- a/engines/gob/mult.h +++ b/engines/gob/mult.h @@ -231,7 +231,6 @@ public: void zeroMultData(void); void checkFreeMult(void); - void interGetObjAnimSize(void); void freeAll(void); void initAll(void); diff --git a/engines/gob/mult_v2.cpp b/engines/gob/mult_v2.cpp index ff5ee59757..b73ed50eb6 100644 --- a/engines/gob/mult_v2.cpp +++ b/engines/gob/mult_v2.cpp @@ -957,7 +957,7 @@ void Mult_v2::sub_62DD(int16 index) { _multData2->someKeysIndices[i] = j - 1; } else _multData2->someKeysIndices[i] = -1; - } else if(someKey1->frame > frame) + } else if (someKey1->frame > frame) break; } } @@ -988,7 +988,7 @@ void Mult_v2::sub_62DD(int16 index) { if ((_multData2->field_124[index][i] != -1) && (_multData2->field_124[index][i] != 1024)) _objects[_multData2->field_124[index][i]].pAnimData->animType = _objects[_multData2->field_124[index][i]].pAnimData->field_17; - } else if(_multData2->animDirection == 1) + } else if (_multData2->animDirection == 1) frame++; else frame--; diff --git a/engines/gob/scenery.cpp b/engines/gob/scenery.cpp index 29c4db41d5..281049edb7 100644 --- a/engines/gob/scenery.cpp +++ b/engines/gob/scenery.cpp @@ -451,7 +451,7 @@ int16 Scenery::loadAnim(char search) { framesCount = 0; layerData.seek(4, SEEK_CUR); for (j = 0; j < ptr->layers[i].framesCount; j++, framesCount++, layerData.seek(4, SEEK_CUR)) { - while(layerData.readByte() == 1) { + while (layerData.readByte() == 1) { framesCount++; layerData.seek(4, SEEK_CUR); } diff --git a/engines/gob/util.h b/engines/gob/util.h index 17c3c09155..1b9b40b72e 100644 --- a/engines/gob/util.h +++ b/engines/gob/util.h @@ -88,22 +88,6 @@ public: static const char trStr2[]; static const char trStr3[]; - inline uint8 readVariableByte(char *address) { - int16 whichVar = address - _vm->_global->_inter_variables; - int16 whichVarByte = whichVar % 4; - - whichVar >>= 2; - return ((VAR(whichVar) >> 8 * (3-whichVarByte)) & 0xFF); - } - inline void writeVariableByte(char *address, uint8 value) { - int16 whichVar = address - _vm->_global->_inter_variables; - int16 whichVarByte = whichVar % 4; - - whichVar >>= 2; - VAR(whichVar) &= ~(0xFF << 8 * (3-whichVarByte)); - VAR(whichVar) |= ((uint32) value) << 8 * (3-whichVarByte); - } - Util(GobEngine *vm); protected: -- cgit v1.2.3