diff --git a/Source/engine/render/scrollrt.cpp b/Source/engine/render/scrollrt.cpp index dfdd273d1..bd300d728 100644 --- a/Source/engine/render/scrollrt.cpp +++ b/Source/engine/render/scrollrt.cpp @@ -353,8 +353,13 @@ void DrawMonster(const Surface &out, Point tilePosition, Point targetBufferPosit /** * @brief Helper for rendering a specific player icon (Mana Shield or Reflect) */ -void DrawPlayerIconHelper(const Surface &out, MissileGraphicID missileGraphicId, Point position, bool lighting, bool infraVision) +void DrawPlayerIconHelper(const Surface &out, MissileGraphicID missileGraphicId, Point position, const Player &player, bool infraVision) { + bool lighting = &player != MyPlayer; + + if (player.isWalking()) + position += GetOffsetForWalking(player.AnimInfo, player._pdir); + position.x -= GetMissileSpriteData(missileGraphicId).animWidth2; const ClxSprite sprite = (*GetMissileSpriteData(missileGraphicId).sprites).list()[0]; @@ -382,9 +387,9 @@ void DrawPlayerIconHelper(const Surface &out, MissileGraphicID missileGraphicId, void DrawPlayerIcons(const Surface &out, const Player &player, Point position, bool infraVision) { if (player.pManaShield) - DrawPlayerIconHelper(out, MissileGraphicID::ManaShield, position, &player != MyPlayer, infraVision); + DrawPlayerIconHelper(out, MissileGraphicID::ManaShield, position, player, infraVision); if (player.wReflections > 0) - DrawPlayerIconHelper(out, MissileGraphicID::Reflect, position + Displacement { 0, 16 }, &player != MyPlayer, infraVision); + DrawPlayerIconHelper(out, MissileGraphicID::Reflect, position + Displacement { 0, 16 }, player, infraVision); } /** @@ -400,9 +405,8 @@ void DrawPlayer(const Surface &out, const Player &player, Point tilePosition, Po return; } - const ClxSprite sprite = player.previewCelSprite ? *player.previewCelSprite : player.AnimInfo.currentSprite(); - - Point spriteBufferPosition = targetBufferPosition - Displacement { CalculateWidth2(sprite.width()), 0 }; + const ClxSprite sprite = player.currentSprite(); + Point spriteBufferPosition = targetBufferPosition + player.getRenderingOffset(sprite); if (static_cast(pcursplr) < Players.size() && &player == &Players[pcursplr]) ClxDrawOutlineSkipColorZero(out, 165, spriteBufferPosition, sprite); @@ -473,14 +477,9 @@ void DrawObject(const Surface &out, Point tilePosition, Point targetBufferPositi return; } - const ClxSprite sprite = (*objectToDraw._oAnimData)[objectToDraw._oAnimFrame - 1]; + const ClxSprite sprite = objectToDraw.currentSprite(); - Point screenPosition = targetBufferPosition - Displacement { CalculateWidth2(sprite.width()), 0 }; - if (objectToDraw.position != tilePosition) { - // drawing a large or offset object, calculate the correct position for the center of the sprite - Displacement worldOffset = objectToDraw.position - tilePosition; - screenPosition -= worldOffset.worldToScreen(); - } + Point screenPosition = targetBufferPosition + objectToDraw.getRenderingOffset(sprite, tilePosition); if (&objectToDraw == ObjectUnderCursor) { ClxDrawOutlineSkipColorZero(out, 194, screenPosition, sprite); @@ -659,8 +658,7 @@ void DrawItem(const Surface &out, Point tilePosition, Point targetBufferPosition return; const ClxSprite sprite = item.AnimInfo.currentSprite(); - int px = targetBufferPosition.x - CalculateWidth2(sprite.width()); - const Point position { px, targetBufferPosition.y }; + const Point position = targetBufferPosition + item.getRenderingOffset(sprite); if (stextflag == TalkID::None && (bItem - 1 == pcursitem || AutoMapShowItems)) { ClxDrawOutlineSkipColorZero(out, GetOutlineColor(item, false), position, sprite); } @@ -685,8 +683,7 @@ void DrawMonsterHelper(const Surface &out, Point tilePosition, Point targetBuffe if (isNegativeMonster) return; auto &towner = Towners[mi]; - int px = targetBufferPosition.x - CalculateWidth2(towner._tAnimWidth); - const Point position { px, targetBufferPosition.y }; + const Point position = targetBufferPosition + towner.getRenderingOffset(); const ClxSprite sprite = towner.currentSprite(); if (mi == pcursmonst) { ClxDrawOutlineSkipColorZero(out, 166, position, sprite); @@ -710,21 +707,20 @@ void DrawMonsterHelper(const Surface &out, Point tilePosition, Point targetBuffe const ClxSprite sprite = monster.animInfo.currentSprite(); - Displacement offset = {}; + Displacement offset = monster.getRenderingOffset(sprite); if (monster.isWalking()) { bool isSideWalkingToLeft = monster.mode == MonsterMode::MoveSideways && monster.direction == Direction::West; if (isNegativeMonster && !isSideWalkingToLeft) return; if (!isNegativeMonster && isSideWalkingToLeft) return; - offset = GetOffsetForWalking(monster.animInfo, monster.direction); if (isSideWalkingToLeft) offset -= Displacement { 64, 0 }; } else if (isNegativeMonster) { return; } - const Point monsterRenderPosition { targetBufferPosition + offset - Displacement { CalculateWidth2(sprite.width()), 0 } }; + const Point monsterRenderPosition = targetBufferPosition + offset; if (mi == pcursmonst) { ClxDrawOutlineSkipColorZero(out, 233, monsterRenderPosition, sprite); } @@ -740,14 +736,7 @@ void DrawMonsterHelper(const Surface &out, Point tilePosition, Point targetBuffe */ void DrawPlayerHelper(const Surface &out, const Player &player, Point tilePosition, Point targetBufferPosition) { - Displacement offset = {}; - if (player.isWalking()) { - offset = GetOffsetForWalking(player.AnimInfo, player._pdir); - } - - const Point playerRenderPosition { targetBufferPosition + offset }; - - DrawPlayer(out, player, tilePosition, playerRenderPosition); + DrawPlayer(out, player, tilePosition, targetBufferPosition); } /** diff --git a/Source/items.h b/Source/items.h index 5e862bfbf..15004fcf8 100644 --- a/Source/items.h +++ b/Source/items.h @@ -454,6 +454,11 @@ struct Item { /** @brief Returns the translated item name to display (respects identified flag) */ StringOrView getName() const; + + [[nodiscard]] Displacement getRenderingOffset(const ClxSprite sprite) const + { + return { -CalculateWidth2(sprite.width()), 0 }; + } }; struct ItemGetRecordStruct { diff --git a/Source/monster.h b/Source/monster.h index a8dba5a46..21c18ae86 100644 --- a/Source/monster.h +++ b/Source/monster.h @@ -445,6 +445,14 @@ struct Monster { // note: missing field _mAFNum * But for graphics and rendering we show the old/real mode. */ [[nodiscard]] MonsterMode getVisualMonsterMode() const; + + [[nodiscard]] Displacement getRenderingOffset(const ClxSprite sprite) const + { + Displacement offset = { -CalculateWidth2(sprite.width()), 0 }; + if (isWalking()) + offset += GetOffsetForWalking(animInfo, direction); + return offset; + } }; extern size_t LevelMonsterTypeCount; diff --git a/Source/objects.h b/Source/objects.h index 241559ce3..3e9edfd6d 100644 --- a/Source/objects.h +++ b/Source/objects.h @@ -252,6 +252,21 @@ struct Object { * @brief Returns the name of the object as shown in the info box */ [[nodiscard]] StringOrView name() const; + + [[nodiscard]] ClxSprite currentSprite() const + { + return (*_oAnimData)[_oAnimFrame - 1]; + } + [[nodiscard]] Displacement getRenderingOffset(const ClxSprite sprite, Point tilePosition) const + { + Displacement offset = Displacement { -CalculateWidth2(sprite.width()), 0 }; + if (position != tilePosition) { + // drawing a large or offset object, calculate the correct position for the center of the sprite + Displacement worldOffset = position - tilePosition; + offset -= worldOffset.worldToScreen(); + } + return offset; + } }; extern DVL_API_FOR_TEST Object Objects[MAXOBJECTS]; diff --git a/Source/player.h b/Source/player.h index 662490682..e7a1cf455 100644 --- a/Source/player.h +++ b/Source/player.h @@ -729,6 +729,18 @@ struct Player { void getAnimationFramesAndTicksPerFrame(player_graphic graphics, int8_t &numberOfFrames, int8_t &ticksPerFrame) const; + [[nodiscard]] ClxSprite currentSprite() const + { + return previewCelSprite ? *previewCelSprite : AnimInfo.currentSprite(); + } + [[nodiscard]] Displacement getRenderingOffset(const ClxSprite sprite) const + { + Displacement offset = { -CalculateWidth2(sprite.width()), 0 }; + if (isWalking()) + offset += GetOffsetForWalking(AnimInfo, _pdir); + return offset; + } + /** * @brief Updates previewCelSprite according to new requested command * @param cmdId What command is requested diff --git a/Source/towners.h b/Source/towners.h index 0a3c1b5e0..18e62f3b7 100644 --- a/Source/towners.h +++ b/Source/towners.h @@ -61,10 +61,14 @@ struct Towner { uint8_t animOrderSize; _talker_id _ttype; - ClxSprite currentSprite() const + [[nodiscard]] ClxSprite currentSprite() const { return (*anim)[_tAnimFrame]; } + [[nodiscard]] Displacement getRenderingOffset() const + { + return { -CalculateWidth2(_tAnimWidth), 0 }; + } }; extern Towner Towners[NUM_TOWNERS];