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