92 lines
4.4 KiB
C#
92 lines
4.4 KiB
C#
|
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<SkillOption_伤害>();
|
|||
|
SelectTargetHelper.GetTarget(skillOption.selectTarget, skillSender, (target, skillSender) =>
|
|||
|
{
|
|||
|
|
|||
|
var owner = skillSender.caster;
|
|||
|
|
|||
|
var modifierContainer = owner.GetComponent<ModifierContainerComponent>();
|
|||
|
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<AttackComponent>();
|
|||
|
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<NumericComponent>();
|
|||
|
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);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
}
|