Browse Source

Introduce Towner/Player/Object/Item/Monster::currentSprite/getRenderingOffset

pull/6458/head
obligaron 3 years ago committed by Anders Jenbo
parent
commit
578ce01432
  1. 45
      Source/engine/render/scrollrt.cpp
  2. 5
      Source/items.h
  3. 8
      Source/monster.h
  4. 15
      Source/objects.h
  5. 12
      Source/player.h
  6. 6
      Source/towners.h

45
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<size_t>(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);
}
/**

5
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 {

8
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;

15
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];

12
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

6
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];

Loading…
Cancel
Save