You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

711 lines
35 KiB

1 month ago
//using ProtoCSStruct;
//using Sog;
//using System;
//using System.Collections.Generic;
//using static Battle.BattleHero;
//namespace Battle
//{
// public static class BattleBuffEffect
// {
// private static Func<BuffParam, int>[] m_buff_effect_mth = new Func<BuffParam, int>[(int)EffectType.Max];
// public static void Init()
// {
// m_buff_effect_mth[(int)EffectType.None] = null;
// m_buff_effect_mth[(int)EffectType.AddEquipmentProp] = EffectAddEquipmentProp;
// m_buff_effect_mth[(int)EffectType.EquipmentBaseProp] = EffectEquipmentBaseProp;
// m_buff_effect_mth[(int)EffectType.AddProp] = EffectAddProp;
// //m_buff_effect_mth[(int)EffectType.Heal] = EffectHeal;
// m_buff_effect_mth[(int)EffectType.ConvertProp] = EffectConvertProp;
// m_buff_effect_mth[(int)EffectType.AttBackAtStun] = EffectAttBackAtStun;
// m_buff_effect_mth[(int)EffectType.AttackExtraTarget] = EffectAttackExtraTarget;
// m_buff_effect_mth[(int)EffectType.DamIgnore] = Effect08.DoEffect;
// m_buff_effect_mth[(int)EffectType.Dot] = EffectDot;
// m_buff_effect_mth[(int)EffectType.AddBuff] = Effect10.DoEffect;
// m_buff_effect_mth[(int)EffectType.DamUp] = EffectDamUp;
// m_buff_effect_mth[(int)EffectType.HightestPropUp] = EffectHightestPropUp;
// //m_buff_effect_mth[(int)EffectType.HightestPropAddByLowest] = EffectHightestPropAddByLowest;
// m_buff_effect_mth[(int)EffectType.AvergeUnExtraProp] = EffectAverageUnExtraProp;
// m_buff_effect_mth[(int)EffectType.UnExtraPropUp] = EffectUnExtraPropUp;
// //m_buff_effect_mth[(int)EffectType.AddPropByCurrent] = EffectAddPropByCurrent;
// m_buff_effect_mth[(int)EffectType.Relive] = EffectRelive;
// m_buff_effect_mth[(int)EffectType.HealRate] = EffectHealRate;
// m_buff_effect_mth[(int)EffectType.AddHighestProp] = EffectAddHighestProp;
// m_buff_effect_mth[(int)EffectType.UnHeal] = EffectUnHeal;
// //m_buff_effect_mth[(int)EffectType.RoundDot] = EffectRoundDot;
// m_buff_effect_mth[(int)EffectType.Reflect] = EffectReflect;
// //m_buff_effect_mth[(int)EffectType.AttackTargetChg] = EffectAttackTargetChg;
// //m_buff_effect_mth[(int)EffectType.TargetCurHpDamage] = EffectTargetCurHpDamage;
// //m_buff_effect_mth[(int)EffectType.SelfHpMaxDamage] = EffectSelfHpMaxDamage;
// //m_buff_effect_mth[(int)EffectType.UpdateBuffTime] = EffectUpdateBuffTime;
// //m_buff_effect_mth[(int)EffectType.Pursuit] = EffectPursuit;
// //m_buff_effect_mth[(int)EffectType.ReplyRateHp] = EffectReplyRateHp;
// //m_buff_effect_mth[(int)EffectType.PlayerDamUp] = EffectPlayerDamUp;
// m_buff_effect_mth[(int)EffectType.DamageDown] = EffectDamageDown;
// //m_buff_effect_mth[(int)EffectType.PlayerDamageDown] = EffectPlayerDamageDown;
// m_buff_effect_mth[(int)EffectType.PursuitTotalDamage] = Effect33.DoEffect;
// m_buff_effect_mth[(int)EffectType.UnExtraToMaxProp2] = EffectUnExtraToMaxProp2;
// m_buff_effect_mth[(int)EffectType.Prop2Multiply] = EffectProp2Multiply;
// m_buff_effect_mth[(int)EffectType.E36] = Effect36.DoEffect;
// m_buff_effect_mth[(int)EffectType.E37] = Effect37.DoEffect;
// m_buff_effect_mth[(int)EffectType.E38] = Effect38.DoEffect;
// m_buff_effect_mth[(int)EffectType.E39] = Effect39.DoEffect;
// m_buff_effect_mth[(int)EffectType.E40] = Effect40.DoEffect;
// m_buff_effect_mth[(int)EffectType.E41] = Effect41.DoEffect;
// m_buff_effect_mth[(int)EffectType.E42] = Effect42.DoEffect;
// m_buff_effect_mth[(int)EffectType.E43] = Effect43.DoEffect;
// m_buff_effect_mth[(int)EffectType.E44] = Effect44.DoEffect;
// m_buff_effect_mth[(int)EffectType.E45] = Effect45.DoEffect;
// m_buff_effect_mth[(int)EffectType.E46] = Effect46.DoEffect;
// m_buff_effect_mth[(int)EffectType.E47] = Effect47.DoEffect;
// m_buff_effect_mth[(int)EffectType.E48] = Effect48.DoEffect;
// m_buff_effect_mth[(int)EffectType.E49] = Effect49.DoEffect;
// m_buff_effect_mth[(int)EffectType.E50] = Effect50.DoEffect;
// m_buff_effect_mth[(int)EffectType.E51] = Effect51.DoEffect;
// m_buff_effect_mth[(int)EffectType.E52] = Effect52.DoEffect;
// m_buff_effect_mth[(int)EffectType.E53] = Effect53.DoEffect;
// m_buff_effect_mth[(int)EffectType.E54] = Effect54.DoEffect;
// m_buff_effect_mth[(int)EffectType.E55] = Effect55.DoEffect;
// m_buff_effect_mth[(int)EffectType.E56] = Effect56.DoEffect;
// m_buff_effect_mth[(int)EffectType.E57] = Effect57.DoEffect;
// m_buff_effect_mth[(int)EffectType.E58] = Effect58.DoEffect;
// m_buff_effect_mth[(int)EffectType.E59] = Effect59.DoEffect;
// m_buff_effect_mth[(int)EffectType.E60] = Effect60.DoEffect;
// m_buff_effect_mth[(int)EffectType.E61] = Effect61.DoEffect;
// m_buff_effect_mth[(int)EffectType.E62] = Effect62.DoEffect;
// }
// public static int BuffEffectMth(BattleObj battle, BattleHero caster, BattleHero _target, SkillDesc skillDesc, BattleHero.Buff buff
// , Dictionary<string, long> buffParam = null)
// {
// if (m_buff_effect_mth[buff.effect.type] == null)
// return -1;
// BuffParam param = new BuffParam(battle, caster, _target, skillDesc, buff,buffParam);
// return m_buff_effect_mth[buff.effect.type](param);
// }
// private static int EffectAddEquipmentProp(BuffParam param)
// {
// ref var heroInfo = ref BattleHeroSvc.GetHeroByBattleHero(param.battle, param.target);
// for (var i = 0; i < heroInfo.Dbhero.WearEquip.Count; i++)
// {
// if (heroInfo.Dbhero.WearEquip[i].Pos != param.effectDesc.Param1[param.buff.level - 1])
// {
// continue;
// }
// for (var j = 0; j < heroInfo.Dbhero.WearEquip[i].AddProp.Count; j++)
// {
// param.target.prop.AddValue((CSPropIDType)heroInfo.Dbhero.WearEquip[i].AddProp[j].Id,
// heroInfo.Dbhero.WearEquip[i].AddProp[j].Value * param.effectDesc.Param2[param.buff.level - 1] / 10000);
// }
// }
// return 0;
// }
// private static int EffectAddProp(BuffParam param)
// {
// int level = param.buff.level;
// if(param.effectDesc.Param1[level - 1] > 0)
// {
// param.target.AddProp(param.battle, (CSPropIDType)param.effectDesc.Param1[level - 1], param.effectDesc.Param2[level - 1]);
// //target.prop.AddValue((CSPropIDType)effectDesc.param1, effectDesc.param2);
// var idx = CreateBattleLog(param.battle, param.caster.objId, param.target.objId, BattleEventType.Buff, 0, 0, 0, param.skillDesc, param.effectDesc, param.buff.effectIdx);
// if (idx == -1)
// {
// param.battle.Result = CSBattleResult.Failed;
// return -1;
// }
// param.buff.targetId = param.target.objId;
// }
// return 0;
// }
// private static int EffectEquipmentBaseProp(BuffParam param)
// {
// ref var heroInfo = ref BattleHeroSvc.GetHeroByBattleHero(param.battle, param.target);
// for (var i = 0; i < heroInfo.Dbhero.WearEquip.Count; i++)
// {
// if (heroInfo.Dbhero.WearEquip[i].Pos != param.effectDesc.Param1[param.buff.level - 1])
// {
// continue;
// }
// for (var j = 0; j < (heroInfo.Dbhero.WearEquip[i].AddProp.Count > 4 ? 4 : heroInfo.Dbhero.WearEquip[i].AddProp.Count); j++)
// {
// param.target.prop.AddValue((CSPropIDType)heroInfo.Dbhero.WearEquip[i].AddProp[j].Id,
// heroInfo.Dbhero.WearEquip[i].AddProp[j].Value * param.effectDesc.Param2[param.buff.level - 1] / 10000);
// }
// }
// return 0;
// }
// private static int EffectConvertProp(BuffParam param)
// {
// var hr1 = HeroProp.GetPropRelation((CSPropIDType)param.effectDesc.Param1[param.buff.level - 1]);
// var value = param.target.prop.GetValue((CSPropIDType)hr1.PropFinal);
// param.target.prop.AddValue((CSPropIDType)param.effectDesc.Param2[param.buff.level - 1], value);
// param.target.prop.SetValue((CSPropIDType)hr1.PropBase, 0);
// param.target.prop.SetValue((CSPropIDType)hr1.PropBaseRate, 0);
// param.target.prop.SetValue((CSPropIDType)hr1.PropEquip, 0);
// param.target.prop.SetValue((CSPropIDType)hr1.PropEquipRate, 0);
// param.target.prop.SetValue((CSPropIDType)hr1.PropTotal, 0);
// param.target.prop.SetValue((CSPropIDType)hr1.PropTotalRate, 0);
// param.battle.Trace("Effect5 convert {0} to {1} value {2}", hr1.PropFinal, param.effectDesc.Param2[param.buff.level - 1], value);
// return 0;
// }
// private static int EffectAverageUnExtraProp(BuffParam param)
// {
// var total = 0L;
// HeroProp.GetUnExtraProp().ForEach(prop => total += param.target.prop.GetValue(prop));
// HeroProp.GetUnExtraProp().ForEach(prop => param.target.prop.SetValue(prop, total / 6));
// return 0;
// }
// private static int EffectHightestPropUp(BuffParam param)
// {
// var highest = HeroProp.GetExtraProp()[0];
// for (var i = 1; i < HeroProp.GetExtraProp().Count; i++)
// {
// if (param.target.GetProp(HeroProp.GetExtraProp()[i]) > param.target.GetProp(highest))
// {
// highest = HeroProp.GetExtraProp()[i];
// }
// }
// param.battle.Trace("Effect 12 add {0} value {1}, ovalue {2} ", highest, param.effectDesc.Param1[param.buff.level - 1], param.target.GetProp(highest));
// param.target.prop.AddValue(highest, param.effectDesc.Param1[param.buff.level - 1]);
// return 0;
// }
// private static int EffectHightestPropAddByLowest(SkillDesc.Effect effectDesc, BattleObj battle, BattleHero caster, BattleHero target, SkillDesc skillDesc, BattleHero.Buff buff)
// {
// var highest = HeroProp.GetExtraProp()[0];
// var lowest = HeroProp.GetExtraProp()[0];
// for (var i = 1; i < HeroProp.GetExtraProp().Count; i++)
// {
// if (target.GetProp(HeroProp.GetExtraProp()[i]) > target.GetProp(highest))
// {
// highest = HeroProp.GetExtraProp()[i];
// }
// if (target.GetProp(HeroProp.GetExtraProp()[i]) < target.GetProp(lowest))
// {
// lowest = HeroProp.GetExtraProp()[i];
// }
// }
// target.prop.AddValue(highest, target.GetProp(lowest) * effectDesc.Param1[buff.level - 1] / 10000);
// return 0;
// }
// private static int EffectUnExtraPropUp(BuffParam param)
// {
// HeroProp.GetUnExtraProp().ForEach(prop => param.target.prop.AddValue(prop, param.effectDesc.Param1[param.buff.level - 1]));
// return 0;
// }
// private static int EffectAttBackAtStun(BuffParam param)
// {
// param.target.prop.AddValue(CSPropIDType.AtkBackAtStun, 1);
// param.buff.targetId = param.target.objId;
// return 0;
// }
// // 这里复制了一份攻击时的代码 为了处理事件的递归调用, 举个例子 A 的普工触发AOE 如果还走原来的攻击的代码的话 又会有个攻击事件 导致递归
// // 同时还要处理战斗日志的问题 复制就复制吧
// private static int EffectAttackExtraTarget(BuffParam param)
// {
// if(param.caster.param.TryGetValue("EffectAttackExtraTarget", out var t) && t == 1)
// {
// return 1;
// }
// var targets = BattleHeroSvc.GetAliveEnemy(param.battle, param.caster);
// int resultCode = 0;
// for (int i = 0; i <= param.effectDesc.Param1[param.buff.level - 1]; i++)
// {
// if (i < targets.Count && targets[i].objId != param.target.objId)
// {
// //ref var log = ref BattleControl.GetBattleLog(param.battle, param.battle.curLogIdx);
// //log.ResultBit = BitUtils.BitSet(log.ResultBit, (int)BattleEventBit.MulTarget);
// param.caster.param["EffectAttackExtraTarget"] = 1;
// //resultCode += BattleBuff.AttackWithOutEvent(param.battle, param.caster, targets[i], false);
// BattleControl.Attack(param.battle, param.caster, targets[i], false, out _);
// param.caster.param["EffectAttackExtraTarget"] = 0;
// }
// }
// return resultCode;
// }
// private static int EffectDamIgnore(BuffParam param)
// {
// param.target.prop.AddValue(CSPropIDType.DamageIgnore, param.effectDesc.Param1[param.buff.level - 1]);
// return 0;
// }
// private static int EffectDot(BuffParam param)
// {
// param.target.AddHp(-param.effectDesc.Param1[param.buff.level - 1]);
// var idx = CreateBattleLog(param.battle, param.target.objId, param.target.objId, BattleEventType.Buff, 0,
// (uint)param.effectDesc.Param1[param.buff.level - 1], 0, param.skillDesc, param.effectDesc, param.buff.effectIdx);
// if (idx == -1)
// {
// param.battle.Result = CSBattleResult.Failed;
// return -1;
// }
// return 0;
// }
// private static int EffectAddBuff(BuffParam param)
// {
// //var buffIndex = -1;
// //for (var i = 0; i < target.buffs.Count; i++)
// //{
// // if (target.buffs[i].buffid != effectDesc.param1 || target.buffs[i].level != effectDesc.param2)
// // {
// // continue;
// // }
// // buffIndex = i;
// // break;
// //}
// //var buffDesc = SkillDescMgr.Instance.GetConfig(effectDesc.param1, effectDesc.param2);
// //if(buffDesc == null)
// //{
// // TraceLog.Error("BattleBuffEffect.EffectAddBuff skill {0} level {1}, buff id {2} {3} no buffDesc", skillDesc.id, skillDesc.level, effectDesc.param1, effectDesc.param2);
// // return -1;
// //}
// //if (buffIndex != -1)
// //{
// // if (buffDesc.maxlay != 0 && target.buffs[buffIndex].count >= buffDesc.maxlay) return 0;
// // target.buffs[buffIndex].count += 1;
// //}
// //else
// //{
// // var buff = new BattleHero.Buff
// // {
// // buffid = effectDesc.param1,
// // level = effectDesc.param2,
// // count = 1,
// // overTime = buffDesc.over == (int)BattleEventType.None ? -1 : buffDesc.time,
// // casterId = caster.objId
// // };
// // if (buffDesc.over == (int)EffectEvent.BattleStart)
// // {
// // buff.overTime = -1;
// // }
// // target.buffs.Add(buff);
// //}
// //if (buffDesc.showId != 0)
// //{
// // var idx = CreateBattleLog(battle, caster.objId, target.objId, BattleEventType.Buff, 0, 0, 0, skillDesc);
// // if (idx == -1)
// // {
// // battle.Result = CSBattleResult.Failed;
// // return -1;
// // }
// //}
// //if (buffDesc.isEffective == 0)
// //{
// // return 0;
// //}
// //var success = true;
// //// buff是加到target身上的 是target去effect 注意的是这里如果caster和target是同一个的时候 要另外取敌人
// //for (var i = 0; i < buffDesc.effectNum; i++)
// //{
// // success &= BattleBuff.ProcessEffectBuff(buffDesc.effectDesc[i], battle, target, caster, buffDesc) == 0;
// //}
// //return success ? 0 : -1;
// return 0;
// }
// private static int EffectDamUp(BuffParam param)
// {
// param.target.prop.AddValue(CSPropIDType.DamageRate, param.effectDesc.Param1[param.buff.level - 1]);
// param.buff.targetId = param.target.objId;
// var idx = CreateBattleLog(param.battle, param.caster.objId, param.target.objId, BattleEventType.Buff, 0, 0, 0, param.skillDesc, param.effectDesc, param.buff.effectIdx);
// if (idx == -1)
// {
// param.battle.Result = CSBattleResult.Failed;
// return -1;
// }
// return 0;
// }
// private static int EffectPlayerDamUp(SkillDesc.Effect effectDesc, BattleObj battle, BattleHero caster, BattleHero target, SkillDesc skillDesc, BattleHero.Buff buff)
// {
// //TraceLog.Trace("BattleBuffEffect.EffectPlayerDamUp caster={0} target={1} param1={2}", caster.objId, target.objId, effectDesc.param1);
// //target.prop.AddValue(CSPropIDType.DamageRatePlayer, effectDesc.param1);
// return 0;
// }
// private static int EffectDamageDown(BuffParam param)
// {
// TraceLog.Trace("BattleBuffEffect.EffectDamageDown caster={0} target={1} param1={2}", param.caster.objId, param.target.objId, param.effectDesc.Param1[param.buff.level - 1]);
// param.target.prop.AddValue(CSPropIDType.DamageDown, param.effectDesc.Param1[param.buff.level - 1]);
// return 0;
// }
// private static int EffectPlayerDamageDown(SkillDesc.Effect effectDesc, BattleObj battle, BattleHero caster, BattleHero target, SkillDesc skillDesc, BattleHero.Buff buff)
// {
// //TraceLog.Trace("BattleBuffEffect.EffectPlayerDamageDown caster={0} target={1} param1={2}", caster.objId, target.objId, effectDesc.param1);
// //target.prop.AddValue(CSPropIDType.DamageDownPlayer, effectDesc.param1);
// return 0;
// }
// private static int EffectAddPropByCurrent(SkillDesc.Effect effectDesc, BattleObj battle, BattleHero caster, BattleHero target, SkillDesc skillDesc, BattleHero.Buff buff)
// {
// //var value = target.GetProp((CSPropIDType)effectDesc.param1);
// //target.prop.AddValue((CSPropIDType)effectDesc.param1, value * effectDesc.param2 / 10000);
// //int idx = CreateBattleLog(battle, caster.objId, target.objId, BattleEventType.Buff, 0, 0, 0, skillDesc);
// //if (idx == -1)
// //{
// // battle.Result = CSBattleResult.Failed;
// // return -1;
// //}
// return 0;
// }
// private static int EffectHealRate(BuffParam param)
// {
// var healHp = param.target.GetHpMax() * param.effectDesc.Param1[param.buff.level - 1] / 10000;
// BattleControl.Heal(param.battle, param.caster, param.target, ref healHp, true, 18);
// return 0;
// }
// private static int EffectAddHighestProp(BuffParam param)
// {
// for (var i = 0; i < HeroProp.GetExtraProp().Count; i++)
// {
// param.target.prop.AddValue(HeroProp.GetExtraProp()[i], param.effectDesc.Param1[param.buff.level - 1]);
// }
// int idx = CreateBattleLog(param.battle, param.caster.objId, param.target.objId, BattleEventType.Buff, 0, 0, 0, param.skillDesc, param.effectDesc, param.buff.effectIdx);
// if (idx == -1)
// {
// param.battle.Result = CSBattleResult.Failed;
// return -1;
// }
// return 0;
// }
// private static int EffectUnHeal(BuffParam param)
// {
// param.target.prop.AddValue(CSPropIDType.HealRate, param.effectDesc.Param1[param.buff.level - 1]);
// param.buff.targetId = param.target.objId;
// CreateBattleLog(param.battle, param.caster.objId, param.target.objId, BattleEventType.Buff, 0, 0, 0, param.skillDesc, param.effectDesc, param.buff.effectIdx);
// return 0;
// }
// private static int EffectRelive(BuffParam param)
// {
// param.target.SetRelive();
// param.target.SetHp(param.target.GetHpMax() * param.effectDesc.Param1[param.buff.level - 1] / 10_000);
// CreateBattleLog(param.battle, param.caster.objId, param.target.objId, BattleEventType.Revive, 0, 0,
// param.target.GetHpMax() * param.effectDesc.Param1[param.buff.level - 1] / 10_000,
// param.skillDesc, param.buff.effect, param.buff.effectIdx);
// BattleBuff.BuffEvent(EffectEvent.Relive, param.battle, param.target);
// return 0;
// }
// private static int EffectHeal(SkillDesc.Effect effectDesc, BattleObj battle, BattleHero caster, BattleHero target, SkillDesc skillDesc, BattleHero.Buff buff)
// {
// //long healHp;
// //if (effectDesc.param1 / 10000 > target.prop.GetValueNoCheck(CSPropIDType.HpMax) - target.prop.GetValueNoCheck(CSPropIDType.Hp))
// //{
// // healHp = target.prop.GetValueNoCheck(CSPropIDType.HpMax) - target.prop.GetValueNoCheck(CSPropIDType.Hp);
// //}
// //else
// //{
// // healHp = effectDesc.param1 / 10000;
// //}
// //if (healHp == 0) return 0;
// // todo 群体回复resultBit设置multarget
// //return BattleControl.Heal(battle, caster, target, ref healHp);
// return 0;
// }
// // 回合掉血
// private static int EffectRoundDot(SkillDesc.Effect effectDesc, BattleObj battle, BattleHero caster, BattleHero target, SkillDesc skillDesc, BattleHero.Buff buff)
// {
// //var costHp = caster.GetHp() * effectDesc.param1 / 10000;
// //var atkVal = target.GetMinimumAtk() * effectDesc.param2 / 10000;
// //TraceLog.Trace("BattleBuffEffect.EffectRoundDot caster={0} target={1} GetHp={2} costHp={3} GetMinimumAtk={4} atkVal={5} param1={6} param2={7}",
// // caster.objId, target.objId, caster.GetHp(), costHp, target.GetMinimumAtk(), atkVal, effectDesc.param1, effectDesc.param2);
// ////损失自身当前生命值万分比,不超过攻击万分比值
// //if (costHp > atkVal)
// // costHp = atkVal;
// //if (costHp <= 0)
// // return 0;
// //var idx = CreateBattleLog(battle, caster.objId, target.objId, BattleEventType.Buff, 0, -costHp, 0, skillDesc);
// //if (idx == -1)
// //{
// // battle.Result = CSBattleResult.Failed;
// // return -1;
// //}
// //BuffDmg(battle, caster, target, idx, costHp);
// return 0;
// }
// // 增加反弹伤害属性
// private static int EffectReflect(BuffParam param)
// {
// TraceLog.Trace("BattleBuffEffect.EffectReflect caster={0} target={1} param1={2}",
// param.caster.objId, param.target.objId, param.effectDesc.Param1[0]);
// param.caster.prop.AddValue(CSPropIDType.ReflectDamage, param.effectDesc.Param1[param.buff.level - 1]);
// return 0;
// }
// // 攻击目标修改
// private static int EffectAttackTargetChg(BuffParam param)
// {
// //caster.lastAtkTarget = effectDesc.param1;
// //TraceLog.Trace("BattleBuffEffect.EffectAttackTargetChg caster={0} target={1} effectDesc.param1={2}", caster.objId, target.objId, effectDesc.param1);
// return 0;
// }
// // 额外造成敌人当前生命伤害万分比(需要普攻伤害 + 额外伤害汇总)
// private static int EffectTargetCurHpDamage(SkillDesc.Effect effectDesc, BattleObj battle, BattleHero caster, BattleHero target, SkillDesc skillDesc, BattleHero.Buff buff)
// {
// //var costHp = target.GetHp() * effectDesc.param1 / 10000;
// //var atkVal = caster.GetMinimumAtk() * effectDesc.param2 / 10000;
// //TraceLog.Trace("BattleBuffEffect.EffectTargetCurHpDamage caster={0} target={1} GetHp={2} costHp={3} GetMinimumAtk={4} atkVal={5} param1={6} param2={7}",
// // caster.objId, target.objId, target.GetHp(), costHp, caster.GetMinimumAtk(), atkVal, effectDesc.param1, effectDesc.param2);
// ////额外造成敌人,当前生命值万分比,不超过攻击万分比值
// //if (costHp > atkVal)
// // costHp = atkVal;
// //if (costHp <= 0)
// // return 0;
// ////先临时记录额外伤害值
// //caster.buffExtraDmgList.Add(new BuffExtraDamage
// //{
// // buffId = skillDesc.id,
// // targetObjId = target.objId,
// // dmg = costHp
// //});
// return 0;
// }
// // 额外造成敌人自身生命上限伤害万分比(需要普攻伤害 + 额外伤害汇总)
// private static int EffectSelfHpMaxDamage(SkillDesc.Effect effectDesc, BattleObj battle, BattleHero caster, BattleHero target, SkillDesc skillDesc, BattleHero.Buff buff)
// {
// //var costHp = target.GetHpMax() * effectDesc.param1 / 10000;
// //var atkVal = caster.GetMinimumAtk() * effectDesc.param2 / 10000;
// //TraceLog.Trace("BattleBuffEffect.EffectSelfHpMaxDamage caster={0} target={1} GetHpMax={2} costHp={3} GetMinimumAtk={4} atkVal={5} param1={6} param2={7}",
// // caster.objId, target.objId, caster.GetHpMax(), costHp, caster.GetMinimumAtk(), atkVal, effectDesc.param1, effectDesc.param2);
// ////额外造成敌人自身最大生命值万分比,不超过我方攻击万分比值
// //if (costHp > atkVal)
// // costHp = atkVal;
// //if (costHp <= 0)
// // return 0;
// ////先临时记录额外伤害值
// //caster.buffExtraDmgList.Add(new BuffExtraDamage
// //{
// // buffId = skillDesc.id,
// // targetObjId = target.objId,
// // dmg = costHp
// //});
// return 0;
// }
// // 更新目标buff的结束时间
// private static int EffectUpdateBuffTime(SkillDesc.Effect effectDesc, BattleObj battle, BattleHero caster, BattleHero target, SkillDesc skillDesc, BattleHero.Buff buff)
// {
// //TraceLog.Trace("BattleBuffEffect.EffectUpdateBuffTime caster={0} target={1} param1={2} param2={3}", caster.objId, target.objId, effectDesc.param1, effectDesc.param2);
// //return AddBuffOverTime(battle, caster, target, effectDesc.param1, effectDesc.param2);
// return 0;
// }
// // 对敌人额外追击额外伤害
// private static int EffectPursuit(SkillDesc.Effect effectDesc, BattleObj battle, BattleHero caster, BattleHero target, SkillDesc skillDesc, BattleHero.Buff buff)
// {
// //var costHp = caster.GetMinimumAtk() * effectDesc.param2 / 10000;
// //if (costHp <= 0)
// // return 0;
// ////追击x次
// //for (int i = 0; i < effectDesc.param1; i++)
// //{
// // TraceLog.Trace("BattleBuffEffect.EffectPursuit caster={0} target={1} param1={2} param2={3} costHp={4} buffId={5}", caster.objId, target.objId, effectDesc.param1, effectDesc.param2, costHp, skillDesc.id);
// // var idx = CreateBattleLog(battle, caster.objId, target.objId, BattleEventType.Buff, 0, -costHp, 0, skillDesc);
// // if (idx == -1)
// // {
// // battle.Result = CSBattleResult.Failed;
// // return -1;
// // }
// // BuffDmg(battle, caster, target, idx, costHp);
// // if (target.isDead)
// // break;
// //}
// return 0;
// }
// ////二级属性乘以万分比倍数
// private static int EffectProp2Multiply(BuffParam param)
// {
// CSPropIDType propid = (CSPropIDType)param.effectDesc.Param1[param.buff.level - 1];
// long v = param.target.GetProp(propid);
// v = (long)(v * (param.effectDesc.Param2[param.buff.level - 1] * 1.0D / 10_000));
// param.target.SetProp(propid, v);
// return 0;
// }
// ////所有忽视属性变成最高的2级属性
// private static int EffectUnExtraToMaxProp2(BuffParam param)
// {
// List<CSPropIDType> prop2 = HeroProp.GetExtraProp();
// List<CSPropIDType> unprop = HeroProp.GetUnExtraProp();
// long max = 0;
// //CSPropIDType maxid = CSPropIDType.None;
// for(int i = 0; i < prop2.Count; i++)
// {
// CSPropIDType p = prop2[i];
// int pid = HeroProp.GetPropRelation(p).PropFinal;
// long v = param.target.GetPropNoCheck((CSPropIDType)pid);
// if(v > max)
// {
// max = v;
// //maxid = p;
// }
// }
// for (int i = 0; i < unprop.Count; i++)
// {
// CSPropIDType p = unprop[i];
// int pid = HeroProp.GetPropRelation(p).PropFinal;
// param.target.SetProp((CSPropIDType)pid, max);
// }
// return 0;
// }
// // 对敌人额外追击汇总伤害(需要普攻伤害 + 额外伤害汇总)
// private static int EffectPursuitTotalDamage(BuffParam param)
// {
// var costHp = param.caster.GetMinimumAtk() * param.effectDesc.Param2[param.buff.level - 1] / 10000;
// if (costHp <= 0)
// return 0;
// //追击x次
// for (int i = 0; i < param.effectDesc.Param1[param.buff.level - 1]; i++)
// {
// TraceLog.Trace("BattleBuffEffect.EffectPursuitTotalDamage caster={0} target={1} param1={2} param2={3} costHp={4} buffId={5}", param.caster.objId, param.target.objId,
// param.effectDesc.Param1, param.effectDesc.Param2, costHp, param.skillDesc.id);
// //先临时记录额外伤害值
// param.caster.buffExtraDmgList.Add(new BuffExtraDamage
// {
// buffId = param.skillDesc.id,
// targetObjId = param.target.objId,
// dmg = costHp
// });
// }
// return 0;
// }
// // 回复目标自身生命上限万分比的生命
// private static int EffectReplyRateHp(SkillDesc.Effect effectDesc, BattleObj battle, BattleHero caster, BattleHero target, SkillDesc skillDesc, BattleHero.Buff buff)
// {
// var addHpVal = target.GetHpMax() * effectDesc.Param1[buff.level - 1] / 10000;
// var maxAddHp = caster.GetMinimumAtk() * effectDesc.Param2[buff.level - 1] / 10000;
// TraceLog.Trace("BattleBuffEffect.EffectReplyRateHp caster={0} target={1} param1={2} param2={3} addHpVal={4} GetHpMax={5} maxAddHp={6} GetMinimumAtk={7}", caster.objId,
// target.objId, effectDesc.Param1, effectDesc.Param2, addHpVal, caster.GetHpMax(), maxAddHp, caster.GetMinimumAtk());
// //回复目标自身生命上限万分比血,但不超过施法者攻击万分比值
// if (addHpVal > maxAddHp)
// addHpVal = maxAddHp;
// if (addHpVal == 0)
// return 0;
// return BattleControl.Heal(battle, caster, target, ref addHpVal);
// }
// // todo: 修改m_buff_effect_mth的buffId为buffDesc, 最后传日志的时候在做过滤
// private static int CreateBattleLog(BattleObj battle, int casterId, int targetId,
// BattleEventType evtType, uint resultBits, long dmg, long heal, SkillDesc skill, SkillDesc.Effect effect, int effectIdx)
// {
// if (effect.ShowID != 0)
// {
// return BattleControl.CreateBattleLog(battle, casterId, targetId, evtType, resultBits, dmg, heal, skill.id, effectIdx);
// }
// return 0;
// }
// //buff伤害
// public static void BuffDmg(BattleObj battle, BattleHero caster, BattleHero target, int idx, long dmg)
// {
// ref var evtLog = ref BattleControl.GetBattleLog(battle, idx);
// BattleControl.Hurt(battle, caster, target, dmg, ref evtLog);
// //BattleControl.LifeSteal(battle, caster, target, dmg, ref evtLog);
// BattleControl.Dead(battle, caster, target, ref evtLog);
// }
// //private static int AddBuffOverTime(BattleObj battle, BattleHero caster, BattleHero target, int buffId, int addVal)
// //{
// // for (var i = 0; i < target.buffs.Count; i++)
// // {
// // if (buffId == target.buffs[i].buffid)
// // {
// // if (target.buffs[i].overTime == -1)
// // {
// // continue;
// // }
// // target.buffs[i].overTime += addVal;
// // if (target.buffs[i].overTime < 0)
// // {
// // target.buffs[i].overTime = 0;
// // }
// // var idx = CreateBattleLog(battle, caster.objId, target.objId, BattleEventType.UpdateBuffOverTime, 0, target.buffs[i].overTime, 0, target.buffs[i].buffid);
// // if (idx == -1)
// // {
// // TraceLog.Trace("BattleBuffEffect.AddBuffOverTime caster={0} target={1} buffId={2} addVal = {3} overTime = {4} success = {5}"
// // , caster.objId, target.objId, target.buffs[i].buffid, addVal, target.buffs[i].overTime, false);
// // battle.Result = CSBattleResult.Failed;
// // return -1;
// // }
// // break;
// // }
// // }
// // return 0;
// //}
// }
//}