diff --git a/Source/items.cpp b/Source/items.cpp index 71054acc2..10911012b 100644 --- a/Source/items.cpp +++ b/Source/items.cpp @@ -2237,26 +2237,8 @@ void GetItemBonus(int i, int minlvl, int maxlvl, bool onlygood, bool allowspells void SetupItem(int i) { - int it; - - it = ItemCAnimTbl[items[i]._iCurs]; - int numberOfFrames = ItemAnimLs[it]; - auto *pCelSprite = itemanims[it] ? &*itemanims[it] : nullptr; - if (items[i]._iCurs != ICURS_MAGIC_ROCK) - items[i].AnimInfo.SetNewAnimation(pCelSprite, numberOfFrames, 0, AnimationDistributionFlags::ProcessAnimationPending, 0, numberOfFrames); - else - items[i].AnimInfo.SetNewAnimation(pCelSprite, numberOfFrames, 0); + items[i].SetNewAnimation(!plr[myplr].pLvlLoad); items[i]._iIdentified = false; - items[i]._iPostDraw = false; - - if (!plr[myplr].pLvlLoad) { - items[i]._iAnimFlag = true; - items[i]._iSelFlag = 0; - } else { - items[i].AnimInfo.CurrentFrame = items[i].AnimInfo.NumberOfFrames; - items[i]._iAnimFlag = false; - items[i]._iSelFlag = 1; - } } int RndItem(int m) @@ -2912,11 +2894,9 @@ void SpawnRewardItem(int itemid, Point position) dItem[position.x][position.y] = ii + 1; int curlv = items_get_currlevel(); GetItemAttrs(ii, itemid, curlv); - SetupItem(ii); + items[ii].SetNewAnimation(true); items[ii]._iSelFlag = 2; items[ii]._iPostDraw = true; - items[ii].AnimInfo.CurrentFrame = 1; - items[ii]._iAnimFlag = true; items[ii]._iIdentified = true; } @@ -2937,25 +2917,9 @@ void SpawnTheodore(Point position) void RespawnItem(ItemStruct *item, bool FlipFlag) { - int it; - - it = ItemCAnimTbl[item->_iCurs]; - int numberOfFrames = ItemAnimLs[it]; - auto *pCelSprite = &*itemanims[it]; - if (item->_iCurs != ICURS_MAGIC_ROCK) - item->AnimInfo.SetNewAnimation(pCelSprite, numberOfFrames, 0, AnimationDistributionFlags::ProcessAnimationPending, 0, numberOfFrames); - else - item->AnimInfo.SetNewAnimation(pCelSprite, numberOfFrames, 0); - item->_iPostDraw = false; + int it = ItemCAnimTbl[item->_iCurs]; + item->SetNewAnimation(FlipFlag); item->_iRequest = false; - if (FlipFlag) { - item->_iAnimFlag = true; - item->_iSelFlag = 0; - } else { - item->AnimInfo.CurrentFrame = item->AnimInfo.NumberOfFrames; - item->_iAnimFlag = false; - item->_iSelFlag = 1; - } if (item->_iCurs == ICURS_MAGIC_ROCK) { item->_iSelFlag = 1; @@ -4995,4 +4959,25 @@ void PutItemRecord(int nSeed, uint16_t wCI, int nIndex) } } +void ItemStruct::SetNewAnimation(bool showAnimation) +{ + int it = ItemCAnimTbl[_iCurs]; + int numberOfFrames = ItemAnimLs[it]; + auto *pCelSprite = itemanims[it] ? &*itemanims[it] : nullptr; + if (_iCurs != ICURS_MAGIC_ROCK) + AnimInfo.SetNewAnimation(pCelSprite, numberOfFrames, 0, AnimationDistributionFlags::ProcessAnimationPending, 0, numberOfFrames); + else + AnimInfo.SetNewAnimation(pCelSprite, numberOfFrames, 0); + _iPostDraw = false; + _iRequest = false; + if (showAnimation) { + _iAnimFlag = true; + _iSelFlag = 0; + } else { + AnimInfo.CurrentFrame = AnimInfo.NumberOfFrames; + _iAnimFlag = false; + _iSelFlag = 1; + } +} + } // namespace devilution diff --git a/Source/items.h b/Source/items.h index 4d9d62710..1d35534f3 100644 --- a/Source/items.h +++ b/Source/items.h @@ -371,6 +371,12 @@ struct ItemStruct { return UIS_RED; return getTextColor(); } + + /** + * @brief Sets the current Animation for the Item + * @param showAnimation Definies if the Animation (Flipping) is shown or if only the final Frame (item on the ground) is shown + */ + void SetNewAnimation(bool showAnimation); }; struct ItemGetRecordStruct {