using Cal; using System; namespace ET { public class SkillOptionLogic_伤害 : SkillOptionLogicBase { public override SkillOptionType skillOptionType => SkillOptionType.伤害; public override SkillOptionBase skillOptionBase { get; set; } public override void Clear() { } public override void HandleEvent(ISkillSender skillSender) { SkillOption_伤害 skillOption = skillOptionBase.As(); SelectTargetHelper.GetTarget(skillOption.selectTarget, skillSender, (target, skillSender) => { var owner = skillSender.caster; var modifierContainer = owner.GetComponent(); var (optionList, __modifierLogic) = modifierContainer.GetSkillOptionBaseArr(ModifierEventCondition.当拥有modifier的单位攻击到某个目标时); if (optionList != null) foreach (var item in optionList) { var skillOptionLogicBase = SkillOptionFactory.AcquireSkillOptionLogic(item); skillSender.skillLogic.skillOptionLogics.Add(skillOptionLogicBase); skillOptionLogicBase.HandleEvent(new ModifierSkillSender { caster = owner, target = target, skillLogic = __modifierLogic.skillLogic, modifierLogic = __modifierLogic }); } var attacker = owner.GetComponent(); bool isCrit = false; ModifierSkillSender modifierSkillSender = default; ModifierLogic modifierLogic = null; BattleHelper.Calculate(skillOption.damageType, skillSender, target, skillOption.damageCalculate_Self, skillOption.damageCalculate_Target, out BallisticData data); float finalValue = data.value; if (skillSender is ModifierSkillSender _modifierSkillSender) { modifierLogic = _modifierSkillSender.modifierLogic; if (modifierLogic != null) { finalValue *= modifierLogic.overlay; isCrit = skillOption.isCritEvent && data.isCrit; if (isCrit) modifierSkillSender = _modifierSkillSender; } } if (skillOption.damageType == SkillDamageType.真实伤害) { var num = owner.GetComponent(); int pAtk = num.GetAsInt(NumericType.PhyAtk); int sAtk = num.GetAsInt(NumericType.SpiAtk); int atk = pAtk > sAtk ? pAtk : sAtk; finalValue = Math.Clamp(finalValue, 1, atk * ConstDefine.RealDamageRate); } data.ChangeValue(finalValue * skillSender.skillLogic.multipleDamageX10000); attacker.AttackTarget(target, data, skillSender); if (isCrit) { var dic = modifierLogic.modifierConfig.modifierEventDic; if (dic != null && dic.TryGetValue(ModifierEventCondition.当拥有modifier的单位暴击时, out var optionBaseList1)) foreach (var item in optionBaseList1) { var skillOptionLogicBase = SkillOptionFactory.AcquireSkillOptionLogic(item); skillSender.skillLogic.skillOptionLogics.Add(skillOptionLogicBase); skillOptionLogicBase.HandleEvent(modifierSkillSender); } if (dic != null && dic.TryGetValue(ModifierEventCondition.当拥有modifier的单位被暴击时, out var optionBaseList2)) foreach (var item in optionBaseList2) { var skillOptionLogicBase = SkillOptionFactory.AcquireSkillOptionLogic(item); skillSender.skillLogic.skillOptionLogics.Add(skillOptionLogicBase); skillOptionLogicBase.HandleEvent(modifierSkillSender); } } }); } } }