diff --git a/src/Buffs.cpp b/src/Buffs.cpp index 33760f6..072001f 100644 --- a/src/Buffs.cpp +++ b/src/Buffs.cpp @@ -34,6 +34,18 @@ void Buff::clear() { } } +void Buff::clear(BuffClass buffClass) { + auto it = stacks.begin(); + while(it != stacks.end()) { + BuffStack& stack = *it; + if(stack.buffStackClass == buffClass) { + BuffStack deadStack = stack; + it = stacks.erase(it); + if(onUpdate) onUpdate(self, this, ETBU_DEL, &deadStack); + } else it++; + } +} + void Buff::addStack(BuffStack* stack) { stacks.push_back(*stack); if(onUpdate) onUpdate(self, this, ETBU_ADD, &stacks.back()); diff --git a/src/Buffs.hpp b/src/Buffs.hpp index 5f9bcbc..3247143 100644 --- a/src/Buffs.hpp +++ b/src/Buffs.hpp @@ -54,6 +54,7 @@ public: void tick(time_t); void combatTick(time_t); void clear(); + void clear(BuffClass buffClass); void addStack(BuffStack* stack); /* diff --git a/src/Combat.cpp b/src/Combat.cpp index ef5075e..4220b1e 100644 --- a/src/Combat.cpp +++ b/src/Combat.cpp @@ -48,6 +48,16 @@ void Player::removeBuff(int buffId) { } } +void Player::removeBuff(int buffId, int buffClass) { + if(hasBuff(buffId)) { + buffs[buffId]->clear((BuffClass)buffClass); + if(buffs[buffId]->isStale()) { + delete buffs[buffId]; + buffs.erase(buffId); + } + } +} + bool Player::hasBuff(int buffId) { auto buff = buffs.find(buffId); return buff != buffs.end() && !buff->second->isStale(); @@ -161,6 +171,8 @@ Buff* CombatNPC::getBuff(int buffId) { /* stubbed */ void CombatNPC::removeBuff(int buffId) { /* stubbed */ } +void CombatNPC::removeBuff(int buffId, int buffClass) { /* stubbed */ } + bool CombatNPC::hasBuff(int buffId) { /* stubbed */ return false; } diff --git a/src/Entities.hpp b/src/Entities.hpp index f7234af..9078d4f 100644 --- a/src/Entities.hpp +++ b/src/Entities.hpp @@ -50,6 +50,7 @@ public: virtual bool addBuff(int, BuffCallback, BuffCallback, BuffStack*) = 0; virtual Buff* getBuff(int) = 0; virtual void removeBuff(int) = 0; + virtual void removeBuff(int, int) = 0; virtual bool hasBuff(int) = 0; virtual int getCompositeCondition() = 0; virtual int takeDamage(EntityRef, int) = 0; @@ -124,6 +125,7 @@ struct CombatNPC : public BaseNPC, public ICombatant { virtual bool addBuff(int buffId, BuffCallback onUpdate, BuffCallback onTick, BuffStack* stack) override; virtual Buff* getBuff(int buffId) override; virtual void removeBuff(int buffId) override; + virtual void removeBuff(int buffId, int buffClass) override; virtual bool hasBuff(int buffId) override; virtual int getCompositeCondition() override; virtual int takeDamage(EntityRef src, int amt) override; diff --git a/src/Player.hpp b/src/Player.hpp index a697dae..224ea90 100644 --- a/src/Player.hpp +++ b/src/Player.hpp @@ -92,6 +92,7 @@ struct Player : public Entity, public ICombatant { virtual bool addBuff(int buffId, BuffCallback onUpdate, BuffCallback onTick, BuffStack* stack) override; virtual Buff* getBuff(int buffId) override; virtual void removeBuff(int buffId) override; + virtual void removeBuff(int buffId, int buffClass) override; virtual bool hasBuff(int buffId) override; virtual int getCompositeCondition() override; virtual int takeDamage(EntityRef src, int amt) override;