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
};
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_ROOT_FMT = "/data/logs/%s";

View File

@ -339,6 +339,35 @@ namespace MetaData
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()
{
const int MAX_LV = 20;
@ -905,6 +934,27 @@ namespace MetaData
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()
{
for (int j = 0; j < i->max_lv(); ++j) {

View File

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

View File

@ -20,59 +20,23 @@ void Trigger::UnInit()
void Trigger::TakeonWeapon(Weapon* old_weapon, Weapon* new_weapon)
{
MetaData::Equip* new_weapon_meta = new_weapon->meta;
{
for (int cond = kCondBuffUpdateWeaponId; cond <= kCondBuffUpdateWeaponType; cond++) {
TraverseCondBuffs
(kCondBuffUpdateWeaponId,
[this, new_weapon_meta] (Buff* buff, bool& stop)
(cond,
[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) {
case kWeaponOptTakeon:
case kWeaponOptKeep:
{
AddBuff(buff->meta->int_param1, buff->meta->int_param4);
}
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:
{
if (!owner_->GetBuffById(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;
default:
@ -87,32 +51,12 @@ void Trigger::TakeonWeapon(Weapon* old_weapon, Weapon* new_weapon)
void Trigger::Shot(MetaData::Equip* weapon_meta)
{
{
for (int cond = kCondBuffShotWeaponId; cond <= kCondBuffShotWeaponType; ++cond) {
TraverseCondBuffs
(kCondBuffShotWeaponId,
[this, weapon_meta] (Buff* buff, bool& stop)
(cond,
[this, cond, weapon_meta] (Buff* buff, bool& stop)
{
if (buff->meta->int_param2 == weapon_meta->i->id()) {
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()) {
if (weapon_meta->Match((CondAddBuff_e)cond, buff->meta->int_param2)) {
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)
{
{
++kill_num_;
TraverseCondBuffs
(kCondBuffKillTarget,
[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);
}
});
}
}
void Trigger::UseItemAction(int slot_id)
{
{
TraverseCondBuffs
(kCondBuffEatDrug,
@ -145,7 +87,6 @@ void Trigger::UseItemAction(int slot_id)
}
});
}
}
void Trigger::UseSkill(Skill* skill)
{
@ -161,7 +102,41 @@ void Trigger::UseSkill(Skill* skill)
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()
@ -219,39 +194,24 @@ void Trigger::AddBuff(int cond, int buff_id)
void Trigger::ActiveBuff(MetaData::Buff* buff_meta)
{
{
for (int cond = kCondBuffUpdateBuffId; cond <= kCondBuffUpdateBuffEffect; ++cond) {
TraverseCondBuffs
(kCondBuffUpdateBuffId,
[this, buff_meta] (Buff* buff, bool& stop)
(cond,
[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) {
case kBuffOptActive:
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 kBuffOptActive:
case kBuffOptKeep:
{
if (!owner_->GetBuffById(buff->meta->int_param4)) {
AddBuff(buff->meta->int_param1, buff->meta->int_param4);
}
}
break;
default:
{
@ -265,48 +225,19 @@ void Trigger::ActiveBuff(MetaData::Buff* buff_meta)
void Trigger::DeactiveBuff(MetaData::Buff* buff_meta)
{
{
for (int cond = kCondBuffUpdateBuffId; cond <= kCondBuffUpdateBuffEffect; ++cond) {
TraverseCondBuffs
(kCondBuffUpdateBuffId,
[this, buff_meta] (Buff* buff, bool& stop)
(cond,
[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) {
case kBuffOptDeactive:
{
owner_->RemoveBuffById(buff->meta->int_param4);
}
break;
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);
}
break;
case kBuffOptKeep:
{
AddBuff(buff->meta->int_param1, buff->meta->int_param4);
}
break;
default:
{
}

View File

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