diff --git a/Source/inv.h b/Source/inv.h index 4a1d56c70f1..f475e3cc263 100644 --- a/Source/inv.h +++ b/Source/inv.h @@ -384,6 +384,24 @@ inline bool RemoveInventoryOrBeltItemById(Player &player, _item_indexes id) return RemoveInventoryItemById(player, id) || RemoveBeltItemById(player, id); } +/** + * @brief Marks all Spectral Elixir items in the player's inventory as permanently usable + * by setting the CF_USEFUL flag in the item's creation info. + * + * This ensures that Spectral Elixirs remain usable across game sessions, regardless of + * quest status, while maintaining reverse compatibility with the original game. + * + * @param player The player whose inventory is being updated. + */ +inline void SetSpectralUsable(Player &player) +{ + for (Item &item : player.InvList) { + if (item.IDidx == IDI_SPECELIX) { + item._iCreateInfo |= CF_ONLYGOOD; // Set the unused flag to mark as permanently usable + } + } +} + /** * @brief Removes the first inventory or belt scroll with the player's current spell. */ diff --git a/Source/items.cpp b/Source/items.cpp index bb817163d8b..2875bf2c4a0 100644 --- a/Source/items.cpp +++ b/Source/items.cpp @@ -4779,8 +4779,13 @@ void PutItemRecord(uint32_t nSeed, uint16_t wCI, int nIndex) bool Item::isUsable() const { - if (IDidx == IDI_SPECELIX && Quests[Q_MUSHROOM]._qactive != QUEST_DONE) + // If the item is a Spectral Elixir + if (IDidx == IDI_SPECELIX) { + if ((_iCreateInfo & CF_ONLYGOOD) != 0 || Quests[Q_MUSHROOM]._qactive == QUEST_DONE) + return true; return false; + } + return AllItemsList[IDidx].iUsable; } diff --git a/Source/towners.cpp b/Source/towners.cpp index d07d45cfbdf..842b08e9a64 100644 --- a/Source/towners.cpp +++ b/Source/towners.cpp @@ -450,6 +450,7 @@ void TalkToWitch(Player &player, Towner & /*witch*/) return; } if (HasInventoryOrBeltItemWithId(player, IDI_SPECELIX)) { + SetSpectralUsable(player); Quests[Q_MUSHROOM]._qactive = QUEST_DONE; NetSendCmdQuest(true, Quests[Q_MUSHROOM]); InitQTextMsg(TEXT_MUSH12);