1
This commit is contained in:
parent
de775e0671
commit
efe851c627
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user