diff --git a/Source/items.cpp b/Source/items.cpp index 2f6ce462c..7cacdbc06 100644 --- a/Source/items.cpp +++ b/Source/items.cpp @@ -3816,6 +3816,37 @@ void GetItemStr(Item &item) } } +bool IsItemIdentifiableByStoryteller(const Item &item) +{ + if (item.isEmpty()) { + return false; + } + if (item._iMagical == ITEM_QUALITY_NORMAL) { + return false; + } + return !item._iIdentified; +} + +int CountIdentifiablePlayerItems(const Player &player) +{ + return static_cast(std::count_if(PlayerItemsRange { player }.begin(), PlayerItemsRange { player }.end(), [](const Item &item) { + return IsItemIdentifiableByStoryteller(item); + })); +} + +int IdentifyPlayerItems(Player &player) +{ + const int identifiedItemCount = static_cast(std::count_if(PlayerItemsRange { player }.begin(), PlayerItemsRange { player }.end(), [](Item &item) { + if (!IsItemIdentifiableByStoryteller(item)) { + return false; + } + item._iIdentified = true; + return true; + })); + CalcPlrInv(player, true); + return identifiedItemCount; +} + void CheckIdentify(Player &player, int cii) { Item *pi; diff --git a/Source/items.h b/Source/items.h index 9c855a405..3695fe0c7 100644 --- a/Source/items.h +++ b/Source/items.h @@ -545,6 +545,9 @@ void ProcessItems(); void FreeItemGFX(); void GetItemFrm(Item &item); void GetItemStr(Item &item); +bool IsItemIdentifiableByStoryteller(const Item &item); +int CountIdentifiablePlayerItems(const Player &player); +int IdentifyPlayerItems(Player &player); void CheckIdentify(Player &player, int cii); void DoRepair(Player &player, int cii); void DoRecharge(Player &player, int cii); diff --git a/Source/objects.cpp b/Source/objects.cpp index b489fa3d7..54c7d342e 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -2745,13 +2745,7 @@ void OperateShrineGlimmering(Player &player) if (&player != MyPlayer) return; - for (Item &item : PlayerItemsRange { player }) { - if (item._iMagical != ITEM_QUALITY_NORMAL && !item._iIdentified) { - item._iIdentified = true; - } - } - - CalcPlrInv(player, true); + IdentifyPlayerItems(player); RedrawEverything(); InitDiabloMsg(EMSG_SHRINE_GLIMMERING);