diff --git a/Source/scrollrt.cpp b/Source/scrollrt.cpp index 71cf13142..9be1dbe5a 100644 --- a/Source/scrollrt.cpp +++ b/Source/scrollrt.cpp @@ -596,49 +596,48 @@ void DrawDeadPlayer(const Surface &out, Point tilePosition, Point targetBufferPo */ void DrawObject(const Surface &out, Point tilePosition, Point targetBufferPosition, bool pre) { - int8_t bv = dObject[tilePosition.x][tilePosition.y]; - if (bv == 0 || LightTableIndex >= LightsMax) + if (LightTableIndex >= LightsMax) { return; + } - Point objectPosition {}; + auto objectId = abs(dObject[tilePosition.x][tilePosition.y]) - 1; + if (objectId < 0) { + return; + } - if (bv > 0) { - bv = bv - 1; - if (Objects[bv]._oPreFlag != pre) - return; - objectPosition = targetBufferPosition - Displacement { CalculateWidth2(Objects[bv]._oAnimWidth), 0 }; - } else { - bv = -(bv + 1); - if (Objects[bv]._oPreFlag != pre) - return; - int xx = Objects[bv].position.x - tilePosition.x; - int yy = Objects[bv].position.y - tilePosition.y; - objectPosition.x = (xx * TILE_WIDTH / 2) + targetBufferPosition.x - CalculateWidth2(Objects[bv]._oAnimWidth) - (yy * TILE_WIDTH / 2); - objectPosition.y = targetBufferPosition.y + (yy * TILE_HEIGHT / 2) + (xx * TILE_HEIGHT / 2); + Object &objectToDraw = Objects[objectId]; + if (objectToDraw._oPreFlag != pre) { + return; } - assert(bv >= 0 && bv < MAXOBJECTS); + Point screenPosition = targetBufferPosition - Displacement { CalculateWidth2(objectToDraw._oAnimWidth), 0 }; + if (objectToDraw.position != tilePosition) { + // drawing a large or offset object, calculate the correct position for the center of the sprite + Displacement screenOffset = objectToDraw.position - tilePosition; + screenPosition -= screenOffset.WorldToScreen(); + } - byte *pCelBuff = Objects[bv]._oAnimData; + byte *pCelBuff = objectToDraw._oAnimData; if (pCelBuff == nullptr) { - Log("Draw Object type {}: NULL Cel Buffer", Objects[bv]._otype); + Log("Draw Object type {}: NULL Cel Buffer", objectToDraw._otype); return; } - uint32_t nCel = Objects[bv]._oAnimFrame; + uint32_t nCel = objectToDraw._oAnimFrame; uint32_t frames = LoadLE32(pCelBuff); if (nCel < 1 || frames > 50 || nCel > frames) { - Log("Draw Object: frame {} of {}, object type=={}", nCel, frames, Objects[bv]._otype); + Log("Draw Object: frame {} of {}, object type=={}", nCel, frames, objectToDraw._otype); return; } - CelSprite cel { Objects[bv]._oAnimData, Objects[bv]._oAnimWidth }; - if (bv == pcursobj) - CelBlitOutlineTo(out, 194, objectPosition, cel, Objects[bv]._oAnimFrame); - if (Objects[bv]._oLight) { - CelClippedDrawLightTo(out, objectPosition, cel, Objects[bv]._oAnimFrame); + CelSprite cel { objectToDraw._oAnimData, objectToDraw._oAnimWidth }; + if (pcursobj != -1 && &objectToDraw == &Objects[pcursobj]) { + CelBlitOutlineTo(out, 194, screenPosition, cel, objectToDraw._oAnimFrame); + } + if (objectToDraw._oLight) { + CelClippedDrawLightTo(out, screenPosition, cel, objectToDraw._oAnimFrame); } else { - CelClippedDrawTo(out, objectPosition, cel, Objects[bv]._oAnimFrame); + CelClippedDrawTo(out, screenPosition, cel, objectToDraw._oAnimFrame); } }