From ec71fd8f46750666c6031cba722a8073775b604c Mon Sep 17 00:00:00 2001 From: gsemaj Date: Sat, 30 Jul 2022 21:46:17 -0700 Subject: [PATCH] Add overload to remove specific class of buff I initially added this because, despite the higher tickrate for composite condition calculations thanks to the last commit, there is still a slight status icon delay when rapidly switching nanos. I attempted to use this to make that problem go away and for whatever reason it wasn't effective, but I figure it would be useful to have anyway so I'm keeping it. --- src/Buffs.cpp | 12 ++++++++++++ src/Buffs.hpp | 1 + src/Combat.cpp | 12 ++++++++++++ src/Entities.hpp | 2 ++ src/Player.hpp | 1 + 5 files changed, 28 insertions(+) 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;