Browse Source

Introduce ItemStruct.SetNewAnimation(bool) to start Animations only at one location

pull/1340/head
obligaron 5 years ago committed by Anders Jenbo
parent
commit
ab3f3f3ee7
  1. 65
      Source/items.cpp
  2. 6
      Source/items.h

65
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

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

Loading…
Cancel
Save