diff --git a/Source/inv.cpp b/Source/inv.cpp index 1e0722e8a..27c0d78cc 100644 --- a/Source/inv.cpp +++ b/Source/inv.cpp @@ -1478,39 +1478,24 @@ static void CheckBookLevel(PlayerStruct &player) static void CheckNaKrulNotes(PlayerStruct &player) { int idx = player.HoldItem.IDidx; + _item_indexes notes[] = { IDI_NOTE1, IDI_NOTE2, IDI_NOTE3 }; if (idx != IDI_NOTE1 && idx != IDI_NOTE2 && idx != IDI_NOTE3) { return; } - int n1; - if (idx != IDI_NOTE1 && !player.HasItem(IDI_NOTE1, &n1)) { - return; - } - - int n2; - if (idx != IDI_NOTE2 && !player.HasItem(IDI_NOTE2, &n2)) { - return; - } - - int n3; - if (idx != IDI_NOTE3 && !player.HasItem(IDI_NOTE3, &n3)) { - return; + for (auto note : notes) { + if (idx != note && !player.HasItem(note)) { + return; // the player doesn't have all notes + } } plr[myplr].Say(HeroSpeech::JustWhatIWasLookingFor, 10); - if (idx != IDI_NOTE1) { - player.HasItem(IDI_NOTE1, &n1); - player.RemoveInvItem(n1); - } - if (idx != IDI_NOTE2) { - player.HasItem(IDI_NOTE2, &n2); - player.RemoveInvItem(n2); - } - if (idx != IDI_NOTE3) { - player.HasItem(IDI_NOTE3, &n3); - player.RemoveInvItem(n3); + for (auto note : notes) { + if (idx != note) { + player.TryRemoveInvItemById(note); + } } int itemNum = itemactive[0]; diff --git a/Source/monster.cpp b/Source/monster.cpp index 1d2318ada..4efbff33e 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -5348,16 +5348,15 @@ void TalktoMonster(int i) int pnum = Monst->_menemy; Monst->_mmode = MM_TALK; if (Monst->_mAi == AI_SNOTSPIL || Monst->_mAi == AI_LACHDAN) { - int itm; - if (QuestStatus(Q_LTBANNER) && quests[Q_LTBANNER]._qvar1 == 2 && plr[pnum].HasItem(IDI_BANNER, &itm)) { - plr[pnum].RemoveInvItem(itm); - quests[Q_LTBANNER]._qactive = QUEST_DONE; - Monst->mtalkmsg = TEXT_BANNER12; - Monst->_mgoal = MGOAL_INQUIRING; + if (QuestStatus(Q_LTBANNER) && quests[Q_LTBANNER]._qvar1 == 2) { + if (plr[pnum].TryRemoveInvItemById(IDI_BANNER)) { + quests[Q_LTBANNER]._qactive = QUEST_DONE; + Monst->mtalkmsg = TEXT_BANNER12; + Monst->_mgoal = MGOAL_INQUIRING; + } } if (QuestStatus(Q_VEIL) && Monst->mtalkmsg >= TEXT_VEIL9) { - if (plr[pnum].HasItem(IDI_GLDNELIX, &itm)) { - plr[pnum].RemoveInvItem(itm); + if (plr[pnum].TryRemoveInvItemById(IDI_GLDNELIX)) { Monst->mtalkmsg = TEXT_VEIL11; Monst->_mgoal = MGOAL_INQUIRING; } diff --git a/Source/objects.cpp b/Source/objects.cpp index 82808495c..696d1c49b 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -3291,12 +3291,10 @@ void OperatePedistal(int pnum, int i) return; } - int iv; - if (object[i]._oVar6 == 3 || !plr[pnum].HasItem(IDI_BLDSTONE, &iv)) { + if (object[i]._oVar6 == 3 || !plr[pnum].TryRemoveInvItemById(IDI_BLDSTONE)) { return; } - plr[pnum].RemoveInvItem(iv); object[i]._oAnimFrame++; object[i]._oVar6++; if (object[i]._oVar6 == 1) { diff --git a/Source/player.cpp b/Source/player.cpp index 3f96dad52..9040437e6 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -265,6 +265,16 @@ void PlayerStruct::RemoveInvItem(int iv, bool calcScrolls) CalcScrolls(); } +bool PlayerStruct::TryRemoveInvItemById(int item) +{ + int idx; + if (HasItem(item, &idx)) { + RemoveInvItem(idx); + return true; + } + return false; +} + void PlayerStruct::RemoveSpdBarItem(int iv) { SpdList[iv]._itype = ITYPE_NONE; diff --git a/Source/player.h b/Source/player.h index 4a2b3ed01..77cbaca71 100644 --- a/Source/player.h +++ b/Source/player.h @@ -146,15 +146,15 @@ enum player_weapon_type : uint8_t { WT_RANGED, }; -/* +/** * @brief Contains Data (CelSprites) for a player graphic (player_graphic) */ struct PlayerAnimationData { - /* + /** * @brief CelSprites for the different directions */ std::array, 8> CelSpritesForDirections; - /* + /** * @brief Raw Data (binary) of the CL2 file. * Is referenced from CelSprite in CelSpritesForDirections */ @@ -178,7 +178,7 @@ struct PlayerStruct { ActorPosition position; Direction _pdir; // Direction faced by player (direction enum) int _pgfxnum; // Bitmask indicating what variant of the sprite the player is using. Lower byte define weapon (anim_weapon_id) and higher values define armour (starting with anim_armor_id) - /* + /** * @brief Contains Information for current Animation */ AnimationInfo AnimInfo; @@ -249,7 +249,7 @@ struct PlayerStruct { int deathFrame; bool _pLvlVisited[NUMLEVELS]; bool _pSLvlVisited[NUMLEVELS]; // only 10 used - /* + /** * @brief Contains Data (Sprites) for the different Animations */ std::array::value> AnimationData; @@ -305,13 +305,18 @@ struct PlayerStruct { bool HasItem(int item, int *idx = nullptr) const; /** - * @brief Remove an item from player inventory - * @param pnum Player index - * @param iv invList index of item to be removed - * @param calcScrolls If true, CalcScrolls() gets called after removing item - */ + * @brief Remove an item from player inventory + * @param iv invList index of item to be removed + * @param calcScrolls If true, CalcScrolls() gets called after removing item + */ void RemoveInvItem(int iv, bool calcScrolls = true); + /** + * @brief Remove an item from player inventory and return true if the player has the item, return false otherwise + * @param item IDidx of item to be removed + */ + bool TryRemoveInvItemById(int item); + void RemoveSpdBarItem(int iv); /** @@ -387,12 +392,12 @@ struct PlayerStruct { /** * @brief Is the player currently walking? - */ + */ bool IsWalking() const; /** * @brief Resets all Data of the current PlayerStruct - */ + */ void Reset(); }; diff --git a/Source/towners.cpp b/Source/towners.cpp index 61cb023e2..49feea0a7 100644 --- a/Source/towners.cpp +++ b/Source/towners.cpp @@ -354,11 +354,10 @@ void TalkToBarOwner(PlayerStruct &player, TownerStruct &barOwner) InitQTextMsg(TEXT_BANNER2); return; } - int i; - if (quests[Q_LTBANNER]._qvar2 == 1 && player.HasItem(IDI_BANNER, &i)) { + + if (quests[Q_LTBANNER]._qvar2 == 1 && player.TryRemoveInvItemById(IDI_BANNER)) { quests[Q_LTBANNER]._qactive = QUEST_DONE; quests[Q_LTBANNER]._qvar1 = 3; - player.RemoveInvItem(i); SpawnUnique(UITEM_HARCREST, barOwner.position + DIR_SW); InitQTextMsg(TEXT_BANNER3); return; @@ -401,10 +400,9 @@ void TalkToBlackSmith(PlayerStruct &player, TownerStruct &blackSmith) InitQTextMsg(TEXT_INFRA5); return; } - int i; - if (quests[Q_ROCK]._qvar2 == 1 && player.HasItem(IDI_ROCK, &i)) { + + if (quests[Q_ROCK]._qvar2 == 1 && player.TryRemoveInvItemById(IDI_ROCK)) { quests[Q_ROCK]._qactive = QUEST_DONE; - player.RemoveInvItem(i); SpawnUnique(UITEM_INFRARING, blackSmith.position + DIR_SW); InitQTextMsg(TEXT_INFRA7); return; @@ -422,10 +420,9 @@ void TalkToBlackSmith(PlayerStruct &player, TownerStruct &blackSmith) InitQTextMsg(TEXT_ANVIL5); return; } - int i; - if (quests[Q_ANVIL]._qvar2 == 1 && player.HasItem(IDI_ANVIL, &i)) { + + if (quests[Q_ANVIL]._qvar2 == 1 && player.TryRemoveInvItemById(IDI_ANVIL)) { quests[Q_ANVIL]._qactive = QUEST_DONE; - player.RemoveInvItem(i); SpawnUnique(UITEM_GRISWOLD, blackSmith.position + DIR_SW); InitQTextMsg(TEXT_ANVIL7); return; @@ -440,9 +437,7 @@ void TalkToBlackSmith(PlayerStruct &player, TownerStruct &blackSmith) void TalkToWitch(PlayerStruct &player, TownerStruct & /*witch*/) { if (quests[Q_MUSHROOM]._qactive != QUEST_NOTAVAIL) { - int i; - if (quests[Q_MUSHROOM]._qactive == QUEST_INIT && player.HasItem(IDI_FUNGALTM, &i)) { - player.RemoveInvItem(i); + if (quests[Q_MUSHROOM]._qactive == QUEST_INIT && player.TryRemoveInvItemById(IDI_FUNGALTM)) { quests[Q_MUSHROOM]._qactive = QUEST_ACTIVE; quests[Q_MUSHROOM]._qlog = true; quests[Q_MUSHROOM]._qvar1 = QS_TOMEGIVEN; @@ -451,9 +446,7 @@ void TalkToWitch(PlayerStruct &player, TownerStruct & /*witch*/) } if (quests[Q_MUSHROOM]._qactive == QUEST_ACTIVE) { if (quests[Q_MUSHROOM]._qvar1 >= QS_TOMEGIVEN && quests[Q_MUSHROOM]._qvar1 < QS_MUSHGIVEN) { - int i; - if (player.HasItem(IDI_MUSHROOM, &i)) { - player.RemoveInvItem(i); + if (player.TryRemoveInvItemById(IDI_MUSHROOM)) { quests[Q_MUSHROOM]._qvar1 = QS_MUSHGIVEN; Qtalklist[TOWN_HEALER][Q_MUSHROOM] = TEXT_MUSH3; Qtalklist[TOWN_WITCH][Q_MUSHROOM] = TEXT_NONE; @@ -524,10 +517,8 @@ void TalkToHealer(PlayerStruct &player, TownerStruct &healer) return; } } - int i; if (quests[Q_MUSHROOM]._qactive == QUEST_ACTIVE) { - if (quests[Q_MUSHROOM]._qvar1 >= QS_MUSHGIVEN && quests[Q_MUSHROOM]._qvar1 < QS_BRAINGIVEN && player.HasItem(IDI_BRAIN, &i)) { - player.RemoveInvItem(i); + if (quests[Q_MUSHROOM]._qvar1 >= QS_MUSHGIVEN && quests[Q_MUSHROOM]._qvar1 < QS_BRAINGIVEN && player.TryRemoveInvItemById(IDI_BRAIN)) { SpawnQuestItem(IDI_SPECELIX, healer.position + Point { 0, 1 }, 0, 0); InitQTextMsg(TEXT_MUSH4); quests[Q_MUSHROOM]._qvar1 = QS_BRAINGIVEN; @@ -549,13 +540,11 @@ void TalkToBoy(PlayerStruct & /*player*/, TownerStruct & /*boy*/) void TalkToStoryteller(PlayerStruct &player, TownerStruct & /*storyteller*/) { if (!gbIsMultiplayer) { - int i; - if (quests[Q_BETRAYER]._qactive == QUEST_INIT && player.HasItem(IDI_LAZSTAFF, &i)) { + if (quests[Q_BETRAYER]._qactive == QUEST_INIT && player.TryRemoveInvItemById(IDI_LAZSTAFF)) { InitQTextMsg(TEXT_VILE1); quests[Q_BETRAYER]._qlog = true; quests[Q_BETRAYER]._qactive = QUEST_ACTIVE; quests[Q_BETRAYER]._qvar1 = 2; - player.RemoveInvItem(i); return; } } else { @@ -663,15 +652,12 @@ void TalkToFarmer(PlayerStruct &player, TownerStruct &farmer) void TalkToCowFarmer(PlayerStruct &player, TownerStruct &cowFarmer) { - int i; - if (player.HasItem(IDI_GREYSUIT, &i)) { + if (player.TryRemoveInvItemById(IDI_GREYSUIT)) { InitQTextMsg(TEXT_JERSEY7); - player.RemoveInvItem(i); } - if (player.HasItem(IDI_BROWNSUIT, &i)) { + if (player.TryRemoveInvItemById(IDI_BROWNSUIT)) { SpawnUnique(UITEM_BOVINE, cowFarmer.position + DIR_SE); - player.RemoveInvItem(i); InitQTextMsg(TEXT_JERSEY8); quests[Q_JERSEY]._qactive = QUEST_DONE; return; @@ -747,10 +733,8 @@ void TalkToCowFarmer(PlayerStruct &player, TownerStruct &cowFarmer) void TalkToGirl(PlayerStruct &player, TownerStruct &girl) { - int i; - if (player.HasItem(IDI_THEODORE, &i) && quests[Q_GIRL]._qactive != QUEST_DONE) { + if (quests[Q_GIRL]._qactive != QUEST_DONE && player.TryRemoveInvItemById(IDI_THEODORE)) { InitQTextMsg(TEXT_GIRL4); - player.RemoveInvItem(i); CreateAmulet(girl.position, 13, false, true); quests[Q_GIRL]._qlog = false; quests[Q_GIRL]._qactive = QUEST_DONE;