add TraverseCondBuffs

This commit is contained in:
aozhiwei 2021-06-28 09:40:06 +00:00
parent 3ee4fb2175
commit 01b4b98c4c
6 changed files with 68 additions and 13 deletions

View File

@ -18,9 +18,28 @@ Buff::Buff()
}
void Buff::Initialize()
void Buff::Init()
{
INIT_LIST_HEAD(&effect_entry);
INIT_LIST_HEAD(&depend_entry);
INIT_LIST_HEAD(&cond_entry);
INIT_LIST_HEAD(&on_remove_contexts);
}
void Buff::UnInit()
{
list_del_init(&effect_entry);
if (!list_empty(&depend_entry)) {
list_del_init(&depend_entry);
}
if (!list_empty(&cond_entry)) {
list_del_init(&cond_entry);
}
while (!list_empty(&on_remove_contexts)) {
RemoveBuffCbConext* cb = list_last_entry(&on_remove_contexts, RemoveBuffCbConext, entry);
*cb->next = (*cb->next)->next;
list_del_init(&cb->entry);
}
}
int Buff::GetLeftTime()

View File

@ -17,6 +17,12 @@ namespace cs
class MFBuff;
}
struct RemoveBuffCbConext
{
list_head** next;
list_head entry;
};
class Human;
class Creature;
class Buff
@ -31,9 +37,11 @@ class Buff
list_head effect_entry;
list_head depend_entry;
list_head cond_entry;
list_head on_remove_contexts;
Buff();
void Initialize();
void Init();
void UnInit();
int GetLeftTime();
int GetLastingTime();
bool NeedSync(Human* hum);

View File

@ -205,15 +205,12 @@ void Creature::AddBuff(Creature* caster,
buff->skill_meta = buff_skill_meta;
buff->add_frameno = room->GetFrameNo();
buff->xtimer_attacher.xtimer = &room->xtimer;
buff->Init();
list_add_tail(&buff->effect_entry, &buff_effect_[buff->meta->i->buff_effect()]);
if (buff->meta->i->depend_effect() != 0 &&
IsValidBuffEffect(buff->meta->i->depend_effect())) {
list_add_tail(&buff->depend_entry, &depend_effect_[buff->meta->i->depend_effect()]);
} else {
INIT_LIST_HEAD(&buff->depend_entry);
}
INIT_LIST_HEAD(&buff->cond_entry);
buff->Initialize();
{
room->xtimer.AddDeadLineTimerAndAttach
(
@ -284,15 +281,9 @@ void Creature::RemoveBuffById(int buff_id)
for (auto itr = buff_list_.begin(); itr != buff_list_.end(); ++itr) {
Buff& buff = *itr;
if (buff.meta->i->buff_id() == buff_id) {
list_del_init(&buff.effect_entry);
if (!list_empty(&buff.depend_entry)) {
list_del_init(&buff.depend_entry);
}
if (!list_empty(&buff.cond_entry)) {
list_del_init(&buff.cond_entry);
}
removed_buffs.push_back(std::make_tuple(buff.meta, buff.GetCaster().Get()));
OnBuffRemove(buff);
buff.UnInit();
buff_list_.erase(itr);
break;
}

View File

@ -258,6 +258,7 @@ private:
std::map<int, Skill*> passive_skill_hash_;
std::array<Inventory, IS_END> inventory_ = {};
friend class Skill;
friend class Trigger;
};
void InternalShot(Creature* sender,

View File

@ -1,6 +1,9 @@
#include "precompile.h"
#include <a8/list.h>
#include "trigger.h"
#include "creature.h"
void Trigger::Init()
{
@ -44,3 +47,32 @@ void Trigger::Die()
{
}
void Trigger::TraverseCondBuffs(int cond, std::function<void (Buff*, bool&)> func)
{
if (!IsValidCondBuff(cond)) {
abort();
}
list_head* pos = nullptr;
list_head* next = nullptr;
list_head* head = &owner_->cond_buffs_[cond];
RemoveBuffCbConext cb;
cb.next = &next;
INIT_LIST_HEAD(&cb.entry);
list_for_each_safe(pos, next, head) {
if (list_empty(next)) {
Buff *next_buff = list_entry(next, Buff, cond_entry);
list_add_tail(&cb.entry, &next_buff->on_remove_contexts);
}
Buff *curr_buff = list_entry(pos, Buff, cond_entry);
bool stop = false;
func(curr_buff, stop);
if (!list_empty(&cb.entry)) {
list_del_init(&cb.entry);
}
if (stop) {
return;
}
}
}

View File

@ -3,6 +3,7 @@
class Weapon;
class Creature;
class Skill;
class Buff;
class Trigger
{
public:
@ -19,6 +20,9 @@ public:
void HpChg(float old_hp, float new_hp);
void Die();
private:
void TraverseCondBuffs(int cond, std::function<void (Buff*, bool&)> func);
private:
Creature* owner_ = nullptr;
};