This commit is contained in:
aozhiwei 2021-06-30 09:17:21 +00:00
parent ea222aef76
commit 8364eeb6f6
5 changed files with 136 additions and 143 deletions

View File

@ -410,6 +410,15 @@ enum BuffOpt_e
kBuffOptEnd kBuffOptEnd
}; };
enum HpOpt_e
{
kHpOptLeAbs = 0,
kHpOptLeRate = 1,
kHpOptGeAbs = 2,
kHpOptGeRate = 3,
kHpOptEnd
};
const char* const PROJ_NAME_FMT = "game%d_gameserver"; const char* const PROJ_NAME_FMT = "game%d_gameserver";
const char* const PROJ_ROOT_FMT = "/data/logs/%s"; const char* const PROJ_ROOT_FMT = "/data/logs/%s";

View File

@ -339,6 +339,35 @@ namespace MetaData
return weapon_idx; return weapon_idx;
} }
bool Equip::Match(CondAddBuff_e cond, int val)
{
switch (cond) {
case kCondBuffUpdateWeaponId:
case kCondBuffShotWeaponId:
{
return val == i->id();
}
break;
case kCondBuffUpdateWeaponSlot:
case kCondBuffShotWeaponSlot:
{
return val == i->_inventory_slot();
}
break;
case kCondBuffUpdateWeaponType:
case kCondBuffShotWeaponType:
{
return val == i->equip_subtype();
}
break;
default:
{
return false;
}
break;
}
}
void EquipUpgrade::Init() void EquipUpgrade::Init()
{ {
const int MAX_LV = 20; const int MAX_LV = 20;
@ -905,6 +934,27 @@ namespace MetaData
return immune_buffeffect.find(buff_effect) != immune_buffeffect.end(); return immune_buffeffect.find(buff_effect) != immune_buffeffect.end();
} }
bool Buff::Match(CondAddBuff_e cond, int val)
{
switch (cond) {
case kCondBuffUpdateBuffId:
{
return val == i->buff_id();
}
break;
case kCondBuffUpdateBuffEffect:
{
return val == i->buff_effect();
}
break;
default:
{
return false;
}
break;
}
}
void Dress::Init() void Dress::Init()
{ {
for (int j = 0; j < i->max_lv(); ++j) { for (int j = 0; j < i->max_lv(); ++j) {

View File

@ -88,6 +88,7 @@ namespace MetaData
void Init(); void Init();
int GetWeaponIdx(); int GetWeaponIdx();
bool Match(CondAddBuff_e cond, int val);
}; };
struct EquipUpgrade struct EquipUpgrade
@ -196,6 +197,7 @@ namespace MetaData
void Init(); void Init();
bool EffectCanStack(); bool EffectCanStack();
bool IsImmuneBuffEffect(int buff_effect); bool IsImmuneBuffEffect(int buff_effect);
bool Match(CondAddBuff_e cond, int val);
float param1 = 0.0f; float param1 = 0.0f;
float param2 = 0.0f; float param2 = 0.0f;

View File

@ -20,59 +20,23 @@ void Trigger::UnInit()
void Trigger::TakeonWeapon(Weapon* old_weapon, Weapon* new_weapon) void Trigger::TakeonWeapon(Weapon* old_weapon, Weapon* new_weapon)
{ {
MetaData::Equip* new_weapon_meta = new_weapon->meta; MetaData::Equip* new_weapon_meta = new_weapon->meta;
{ for (int cond = kCondBuffUpdateWeaponId; cond <= kCondBuffUpdateWeaponType; cond++) {
TraverseCondBuffs TraverseCondBuffs
(kCondBuffUpdateWeaponId, (cond,
[this, new_weapon_meta] (Buff* buff, bool& stop) [this, cond, new_weapon_meta] (Buff* buff, bool& stop)
{ {
if (buff->meta->int_param2 == new_weapon_meta->i->id()) { if (new_weapon_meta->Match((CondAddBuff_e)cond, buff->meta->int_param2)) {
switch (buff->meta->int_param3) { switch (buff->meta->int_param3) {
case kWeaponOptTakeon: case kWeaponOptTakeon:
case kWeaponOptKeep:
{ {
AddBuff(buff->meta->int_param1, buff->meta->int_param4); AddBuff(buff->meta->int_param1, buff->meta->int_param4);
} }
break; break;
default:
{
}
break;
}
}
});
}
{
TraverseCondBuffs
(kCondBuffUpdateWeaponSlot,
[this, new_weapon_meta] (Buff* buff, bool& stop)
{
if (buff->meta->int_param2 == new_weapon_meta->i->_inventory_slot()) {
switch (buff->meta->int_param3) {
case kWeaponOptTakeon:
case kWeaponOptKeep: case kWeaponOptKeep:
{ {
if (!owner_->GetBuffById(buff->meta->int_param4)) {
AddBuff(buff->meta->int_param1, buff->meta->int_param4); AddBuff(buff->meta->int_param1, buff->meta->int_param4);
} }
break;
default:
{
}
break;
}
}
});
}
{
TraverseCondBuffs
(kCondBuffUpdateWeaponType,
[this, new_weapon_meta] (Buff* buff, bool& stop)
{
if (buff->meta->int_param2 == new_weapon_meta->i->equip_subtype()) {
switch (buff->meta->int_param3) {
case kWeaponOptTakeon:
case kWeaponOptKeep:
{
AddBuff(buff->meta->int_param1, buff->meta->int_param4);
} }
break; break;
default: default:
@ -87,32 +51,12 @@ void Trigger::TakeonWeapon(Weapon* old_weapon, Weapon* new_weapon)
void Trigger::Shot(MetaData::Equip* weapon_meta) void Trigger::Shot(MetaData::Equip* weapon_meta)
{ {
{ for (int cond = kCondBuffShotWeaponId; cond <= kCondBuffShotWeaponType; ++cond) {
TraverseCondBuffs TraverseCondBuffs
(kCondBuffShotWeaponId, (cond,
[this, weapon_meta] (Buff* buff, bool& stop) [this, cond, weapon_meta] (Buff* buff, bool& stop)
{ {
if (buff->meta->int_param2 == weapon_meta->i->id()) { if (weapon_meta->Match((CondAddBuff_e)cond, buff->meta->int_param2)) {
AddBuff(buff->meta->int_param1, buff->meta->int_param4);
}
});
}
{
TraverseCondBuffs
(kCondBuffShotWeaponSlot,
[this, weapon_meta] (Buff* buff, bool& stop)
{
if (buff->meta->int_param2 == weapon_meta->i->_inventory_slot()) {
AddBuff(buff->meta->int_param1, buff->meta->int_param4);
}
});
}
{
TraverseCondBuffs
(kCondBuffShotWeaponType,
[this, weapon_meta] (Buff* buff, bool& stop)
{
if (buff->meta->int_param2 == weapon_meta->i->equip_subtype()) {
AddBuff(buff->meta->int_param1, buff->meta->int_param4); AddBuff(buff->meta->int_param1, buff->meta->int_param4);
} }
}); });
@ -121,20 +65,18 @@ void Trigger::Shot(MetaData::Equip* weapon_meta)
void Trigger::Kill(Creature* target) void Trigger::Kill(Creature* target)
{ {
{ ++kill_num_;
TraverseCondBuffs TraverseCondBuffs
(kCondBuffKillTarget, (kCondBuffKillTarget,
[this] (Buff* buff, bool& stop) [this] (Buff* buff, bool& stop)
{ {
if (buff->meta->int_param2 >= 1) { if (buff->meta->int_param2 == kill_num_) {
AddBuff(buff->meta->int_param1, buff->meta->int_param4); AddBuff(buff->meta->int_param1, buff->meta->int_param4);
} }
}); });
} }
}
void Trigger::UseItemAction(int slot_id) void Trigger::UseItemAction(int slot_id)
{
{ {
TraverseCondBuffs TraverseCondBuffs
(kCondBuffEatDrug, (kCondBuffEatDrug,
@ -145,7 +87,6 @@ void Trigger::UseItemAction(int slot_id)
} }
}); });
} }
}
void Trigger::UseSkill(Skill* skill) void Trigger::UseSkill(Skill* skill)
{ {
@ -161,7 +102,41 @@ void Trigger::UseSkill(Skill* skill)
void Trigger::HpChg(float old_hp, float new_hp) void Trigger::HpChg(float old_hp, float new_hp)
{ {
TraverseCondBuffs
(kCondBuffHp,
[this] (Buff* buff, bool& stop)
{
bool match = false;
switch (buff->meta->int_param3) {
case kHpOptLeAbs:
{
match = owner_->GetHP() < buff->meta->int_param2;
}
break;
case kHpOptLeRate:
{
match = (owner_->GetHP() / owner_->GetMaxHP() * 100) < buff->meta->int_param2;
}
break;
case kHpOptGeAbs:
{
match = owner_->GetHP() > buff->meta->int_param2;
}
break;
case kHpOptGeRate:
{
match = (owner_->GetHP() / owner_->GetMaxHP() * 100) > buff->meta->int_param2;
}
break;
default:
{
}
break;
}
if (match && !owner_->GetBuffById(buff->meta->int_param4)) {
AddBuff(buff->meta->int_param1, buff->meta->int_param4);
}
});
} }
void Trigger::Die() void Trigger::Die()
@ -219,39 +194,24 @@ void Trigger::AddBuff(int cond, int buff_id)
void Trigger::ActiveBuff(MetaData::Buff* buff_meta) void Trigger::ActiveBuff(MetaData::Buff* buff_meta)
{ {
{ for (int cond = kCondBuffUpdateBuffId; cond <= kCondBuffUpdateBuffEffect; ++cond) {
TraverseCondBuffs TraverseCondBuffs
(kCondBuffUpdateBuffId, (cond,
[this, buff_meta] (Buff* buff, bool& stop) [this, cond, buff_meta] (Buff* buff, bool& stop)
{ {
if (buff->meta->int_param2 == buff_meta->i->buff_id()) { if (buff_meta->Match((CondAddBuff_e)cond, buff->meta->int_param2)) {
switch (buff->meta->int_param3) { switch (buff->meta->int_param3) {
case kBuffOptActive: case kBuffOptActive:
case kBuffOptKeep:
{ {
AddBuff(buff->meta->int_param1, buff->meta->int_param4); AddBuff(buff->meta->int_param1, buff->meta->int_param4);
} }
break; break;
default:
{
}
break;
}
}
});
}
{
TraverseCondBuffs
(kCondBuffUpdateBuffEffect,
[this, buff_meta] (Buff* buff, bool& stop)
{
if (buff->meta->int_param2 == buff_meta->i->buff_effect()) {
switch (buff->meta->int_param3) {
case kBuffOptActive:
case kBuffOptKeep: case kBuffOptKeep:
{ {
if (!owner_->GetBuffById(buff->meta->int_param4)) {
AddBuff(buff->meta->int_param1, buff->meta->int_param4); AddBuff(buff->meta->int_param1, buff->meta->int_param4);
} }
}
break; break;
default: default:
{ {
@ -265,48 +225,19 @@ void Trigger::ActiveBuff(MetaData::Buff* buff_meta)
void Trigger::DeactiveBuff(MetaData::Buff* buff_meta) void Trigger::DeactiveBuff(MetaData::Buff* buff_meta)
{ {
{ for (int cond = kCondBuffUpdateBuffId; cond <= kCondBuffUpdateBuffEffect; ++cond) {
TraverseCondBuffs TraverseCondBuffs
(kCondBuffUpdateBuffId, (cond,
[this, buff_meta] (Buff* buff, bool& stop) [this, cond, buff_meta] (Buff* buff, bool& stop)
{ {
if (buff->meta->int_param2 == buff_meta->i->buff_id()) { if (buff_meta->Match((CondAddBuff_e)cond, buff->meta->int_param2)) {
switch (buff->meta->int_param3) { switch (buff->meta->int_param3) {
case kBuffOptDeactive: case kBuffOptDeactive:
{
owner_->RemoveBuffById(buff->meta->int_param4);
}
break;
case kBuffOptKeep: case kBuffOptKeep:
{
AddBuff(buff->meta->int_param1, buff->meta->int_param4);
}
break;
default:
{
}
break;
}
}
});
}
{
TraverseCondBuffs
(kCondBuffUpdateBuffEffect,
[this, buff_meta] (Buff* buff, bool& stop)
{
if (buff->meta->int_param2 == buff_meta->i->buff_effect()) {
switch (buff->meta->int_param3) {
case kBuffOptDeactive:
{ {
owner_->RemoveBuffById(buff->meta->int_param4); owner_->RemoveBuffById(buff->meta->int_param4);
} }
break; break;
case kBuffOptKeep:
{
AddBuff(buff->meta->int_param1, buff->meta->int_param4);
}
break;
default: default:
{ {
} }

View File

@ -34,4 +34,5 @@ public:
private: private:
Creature* owner_ = nullptr; Creature* owner_ = nullptr;
int kill_num_ = 0;
}; };