This commit is contained in:
aozhiwei 2024-01-09 10:37:27 +08:00
parent de775e0671
commit efe851c627

View File

@ -11,6 +11,7 @@
struct AttrAddition struct AttrAddition
{ {
list_head entry; list_head entry;
list_head list_entry;
int attr_id; int attr_id;
float value; float value;
std::shared_ptr<AttrAddition> holder; std::shared_ptr<AttrAddition> holder;
@ -39,6 +40,9 @@ Ability::Ability(CreatureWeakPtr owner)
std::get<0>(tuple) = 0.0f; std::get<0>(tuple) = 0.0f;
INIT_LIST_HEAD(&std::get<1>(tuple)); INIT_LIST_HEAD(&std::get<1>(tuple));
} }
for (auto& list : attr_list_) {
INIT_LIST_HEAD(&list);
}
for (auto& tuple : vattr_add_) { for (auto& tuple : vattr_add_) {
std::get<0>(tuple) = 0.0f; std::get<0>(tuple) = 0.0f;
INIT_LIST_HEAD(&std::get<1>(tuple)); INIT_LIST_HEAD(&std::get<1>(tuple));
@ -47,6 +51,9 @@ Ability::Ability(CreatureWeakPtr owner)
std::get<0>(tuple) = 0.0f; std::get<0>(tuple) = 0.0f;
INIT_LIST_HEAD(&std::get<1>(tuple)); INIT_LIST_HEAD(&std::get<1>(tuple));
} }
for (auto& list : vattr_list_) {
INIT_LIST_HEAD(&list);
}
owner_ = owner; owner_ = owner;
} }
@ -57,48 +64,41 @@ Ability::~Ability()
void Ability::Clear() void Ability::Clear()
{ {
for (auto& tuple : attr_add_) { for (auto& list : attr_list_) {
std::get<0>(tuple) = 0.0f; while (!list_empty(&list)) {
while (!list_empty(&std::get<1>(tuple))) { AttrAddition* e = list_first_entry(&list,
AttrAddition* e = list_first_entry(&std::get<1>(tuple),
AttrAddition, AttrAddition,
entry); entry);
list_del_init(&e->entry); list_del_init(&e->entry);
list_del_init(&e->list_entry);
e->holder = nullptr; e->holder = nullptr;
} }
} }
for (auto& tuple : attr_dec_) { for (auto& list : vattr_list_) {
std::get<0>(tuple) = 0.0f; while (!list_empty(&list)) {
while (!list_empty(&std::get<1>(tuple))) { AttrAddition* e = list_first_entry(&list,
AttrAddition* e = list_first_entry(&std::get<1>(tuple),
AttrAddition, AttrAddition,
entry); entry);
list_del_init(&e->entry); list_del_init(&e->entry);
list_del_init(&e->list_entry);
e->holder = nullptr; e->holder = nullptr;
} }
} }
for (auto& tuple : vattr_add_) { {
std::get<0>(tuple) = 0.0f; for (auto& tuple : attr_add_) {
while (!list_empty(&std::get<1>(tuple))) { std::get<0>(tuple) = 0.0f;
AttrAddition* e = list_first_entry(&std::get<1>(tuple), }
AttrAddition, for (auto& tuple : attr_dec_) {
entry); std::get<0>(tuple) = 0.0f;
list_del_init(&e->entry); }
e->holder = nullptr; for (auto& tuple : vattr_add_) {
std::get<0>(tuple) = 0.0f;
}
for (auto& tuple : vattr_dec_) {
std::get<0>(tuple) = 0.0f;
} }
} }
for (auto& tuple : vattr_dec_) {
std::get<0>(tuple) = 0.0f;
while (!list_empty(&std::get<1>(tuple))) {
AttrAddition* e = list_first_entry(&std::get<1>(tuple),
AttrAddition,
entry);
list_del_init(&e->entry);
e->holder = nullptr;
}
}
switch_times_ = {}; switch_times_ = {};
immune_tags_.clear(); immune_tags_.clear();
} }
@ -147,12 +147,21 @@ AttrHandle Ability::AddAttr(int attr_id, float val)
IsValidHumanVirtualAttr(attr_id)) { IsValidHumanVirtualAttr(attr_id)) {
auto p = std::make_shared<AttrAddition>(attr_id, val); auto p = std::make_shared<AttrAddition>(attr_id, val);
p->holder = p; p->holder = p;
if (IsValidHumanAttr(attr_id)) { if (p->IsAdd()) {
list_add_tail(&p->entry, &std::get<1>(attr_add_[attr_id])); if (IsValidHumanAttr(attr_id)) {
list_add_tail(&p->entry, &std::get<1>(attr_add_[attr_id]));
} else {
list_add_tail(&p->entry, &std::get<1>(vattr_add_[attr_id - kHVAT_Begin]));
}
RecalcAttrAddition(attr_id);
} else { } else {
list_add_tail(&p->entry, &std::get<1>(vattr_add_[attr_id - kHVAT_Begin])); if (IsValidHumanAttr(attr_id)) {
list_add_tail(&p->entry, &std::get<1>(attr_dec_[attr_id]));
} else {
list_add_tail(&p->entry, &std::get<1>(vattr_dec_[attr_id - kHVAT_Begin]));
}
RecalcAttrRuduce(attr_id);
} }
RecalcAttrAddition(attr_id);
return p; return p;
} }
return AttrHandle(); return AttrHandle();