using System; using XUtliPoolLib; namespace XMainClient { internal class AttackApplyCritical : AttackApplyState { public override int GetStateMask() { return XFastEnumIntEqualityComparer.ToInt(DamageFlag.DMGFLAG_CRITICAL); } public override bool IsApplyState(XEntity entity) { double num = XSingleton.singleton.GetBaseCriticalProb(entity.Attributes, entity.Attributes.GetAttr(XAttributeDefine.XAttr_Critical_Total)); bool flag = num > XSingleton.singleton.CriticalLimit; if (flag) { num = XSingleton.singleton.CriticalLimit; } float num2 = XSingleton.singleton.RandomFloat(0f, 1f); return (double)num2 < num; } public override bool IsDefenseState(XEntity entity) { XAttributes attributes = entity.Attributes; double attr = attributes.GetAttr(XAttributeDefine.XAttr_CritResist_Total); CombatParamTable.RowData combatParam = XSingleton.singleton.GetCombatParam(attributes.Level); double num = attr / (attr + (double)combatParam.CritResistBase); bool flag = num > XSingleton.singleton.CritResistLimit; if (flag) { num = XSingleton.singleton.CritResistLimit; } float num2 = XSingleton.singleton.RandomFloat(0f, 1f); return (double)num2 < num; } public override void ApplyState(XEntity caster, ProjectDamageResult result) { base.ApplyState(caster, result); result.Value *= XSingleton.singleton.GetCritialRatio(caster.Attributes); } } }