Browse Source

HasItem/RemoveInvItem combo refactor

pull/2146/head
qndel 5 years ago committed by Anders Jenbo
parent
commit
816b244689
  1. 33
      Source/inv.cpp
  2. 15
      Source/monster.cpp
  3. 4
      Source/objects.cpp
  4. 10
      Source/player.cpp
  5. 29
      Source/player.h
  6. 42
      Source/towners.cpp

33
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];

15
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;
}

4
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) {

10
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;

29
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<std::optional<CelSprite>, 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<PlayerAnimationData, enum_size<player_graphic>::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();
};

42
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;

Loading…
Cancel
Save