1
This commit is contained in:
parent
de775e0671
commit
efe851c627
@ -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& list : vattr_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_add_) {
|
||||||
|
std::get<0>(tuple) = 0.0f;
|
||||||
|
}
|
||||||
for (auto& tuple : attr_dec_) {
|
for (auto& tuple : attr_dec_) {
|
||||||
std::get<0>(tuple) = 0.0f;
|
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 : vattr_add_) {
|
for (auto& tuple : vattr_add_) {
|
||||||
std::get<0>(tuple) = 0.0f;
|
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 : vattr_dec_) {
|
for (auto& tuple : vattr_dec_) {
|
||||||
std::get<0>(tuple) = 0.0f;
|
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 (p->IsAdd()) {
|
||||||
if (IsValidHumanAttr(attr_id)) {
|
if (IsValidHumanAttr(attr_id)) {
|
||||||
list_add_tail(&p->entry, &std::get<1>(attr_add_[attr_id]));
|
list_add_tail(&p->entry, &std::get<1>(attr_add_[attr_id]));
|
||||||
} else {
|
} else {
|
||||||
list_add_tail(&p->entry, &std::get<1>(vattr_add_[attr_id - kHVAT_Begin]));
|
list_add_tail(&p->entry, &std::get<1>(vattr_add_[attr_id - kHVAT_Begin]));
|
||||||
}
|
}
|
||||||
RecalcAttrAddition(attr_id);
|
RecalcAttrAddition(attr_id);
|
||||||
|
} else {
|
||||||
|
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);
|
||||||
|
}
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
return AttrHandle();
|
return AttrHandle();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user