private int CalcElementDamage(IObject attacker, IObject defender, EElementDamageType eEDT, double dmgAddPercent = 0.0, double dmgSubPercent = 0.0, double penetAddPercent = 0.0) { double AtkPenetration = this.GetElementDamagePenetration(attacker, eEDT) + penetAddPercent; double DefPenetration = this.GetDeElementDamagePenetration(defender, eEDT); double AtkEnhance = this.GetElementEnhance(attacker, eEDT); double DefReduce = this.GetDeElementReduce(defender, eEDT); double rate = 1.0 + (AtkPenetration - DefPenetration); double factor = Global.GMax(0.0, 1.0 + AtkEnhance - DefReduce); factor = Global.GMin(2.0, factor); rate = Global.GMax(0.01, rate); rate = Global.GMin(1.0, rate); rate *= factor; int nElementInjure = this.GetElementAttack(attacker, eEDT); nElementInjure = (int)((double)nElementInjure * rate); if (attacker.ObjectType == ObjectTypes.OT_CLIENT) { double percent = 1.0 + RoleAlgorithm.GetExtPropValue(attacker as GameClient, ExtPropIndexes.ElementInjurePercent); if (defender.ObjectType == ObjectTypes.OT_CLIENT) { percent -= RoleAlgorithm.GetExtPropValue(defender as GameClient, ExtPropIndexes.ElementAttackInjurePercent); percent -= dmgSubPercent; } percent += dmgAddPercent; nElementInjure = (int)((double)nElementInjure * percent); } return((nElementInjure > 0) ? nElementInjure : 0); }
/// <summary> /// 计算元素伤害 /// </summary> /// <param name="attacker">攻击者</param> /// <param name="defender">防守者</param> /// <param name="eEDT">元素伤害类型</param> /// <returns>元素伤害</returns> private int CalcElementDamage(IObject attacker, IObject defender, EElementDamageType eEDT) { int nElementInjure = 0; // 造成的元素伤害 // 攻击者的穿透百分比 double AtkPenetration = GetElementDamagePenetration(attacker, eEDT); // 防守者的抗性百分比 double DefPenetration = GetDeElementDamagePenetration(defender, eEDT); // 1 + 元素穿透 - 元素抗性 double rate = 1 + (AtkPenetration - DefPenetration); // 穿透抗性比 rate = Global.GMax(0.01, rate); // 最小1% rate = Global.GMin(1, rate); // 最大100% // 获取元素固定伤害 [XSea 2015/5/29] nElementInjure = GetElementAttack(attacker, eEDT); // 最终元素伤害 = 元素伤害 *(1+攻方元素穿透-防方元素抗性) nElementInjure = (int)(nElementInjure * rate); if (attacker.ObjectType == ObjectTypes.OT_CLIENT) { nElementInjure = (int)(nElementInjure * (1 + RoleAlgorithm.GetExtPropValue(attacker as GameClient, ExtPropIndexes.ElementInjurePercent))); } return(nElementInjure); }
public double GetDeElementReduce(IObject attacker, EElementDamageType eEDT) { double val = 0.0; if (attacker is GameClient) { GameClient attackClient = attacker as GameClient; if (null == attackClient) { return(val); } switch (eEDT) { case EElementDamageType.EEDT_Fire: val = RoleAlgorithm.GetExtProp(attackClient, 112); break; case EElementDamageType.EEDT_Water: val = RoleAlgorithm.GetExtProp(attackClient, 113); break; case EElementDamageType.EEDT_Lightning: val = RoleAlgorithm.GetExtProp(attackClient, 114); break; case EElementDamageType.EEDT_Soil: val = RoleAlgorithm.GetExtProp(attackClient, 115); break; case EElementDamageType.EEDT_Ice: val = RoleAlgorithm.GetExtProp(attackClient, 116); break; case EElementDamageType.EEDT_Wind: val = RoleAlgorithm.GetExtProp(attackClient, 117); break; } } return(val); }
/// <summary> /// 获取元素固定伤害 /// </summary> /// <param name="attacker">攻击者</param> /// <param name="eEDT">元素伤害类型</param> /// <returns></returns> public int GetElementAttack(IObject attacker, EElementDamageType eEDT) { int val = 0; // 目前只有角色与竞技场机器人才有元素固定伤害 if (attacker is GameClient) { GameClient attackClient = attacker as GameClient; // 判空 if (null == attackClient) { return(val); } // 根据元素类型获取角色固定伤害 switch (eEDT) { case EElementDamageType.EEDT_Water: // 水 val += (int)attackClient.ClientData.EquipProp.ExtProps[(int)ExtPropIndexes.WaterAttack]; val += (int)attackClient.ClientData.PropsCacheManager.GetExtProp((int)ExtPropIndexes.WaterAttack); break; case EElementDamageType.EEDT_Fire: // 火 val += (int)attackClient.ClientData.EquipProp.ExtProps[(int)ExtPropIndexes.FireAttack]; val += (int)attackClient.ClientData.PropsCacheManager.GetExtProp((int)ExtPropIndexes.FireAttack); break; case EElementDamageType.EEDT_Wind: // 风 val += (int)attackClient.ClientData.EquipProp.ExtProps[(int)ExtPropIndexes.WindAttack]; val += (int)attackClient.ClientData.PropsCacheManager.GetExtProp((int)ExtPropIndexes.WindAttack); break; case EElementDamageType.EEDT_Soil: // 土 val += (int)attackClient.ClientData.EquipProp.ExtProps[(int)ExtPropIndexes.SoilAttack]; val += (int)attackClient.ClientData.PropsCacheManager.GetExtProp((int)ExtPropIndexes.SoilAttack); break; case EElementDamageType.EEDT_Ice: // 冰 val += (int)attackClient.ClientData.EquipProp.ExtProps[(int)ExtPropIndexes.IceAttack]; val += (int)attackClient.ClientData.PropsCacheManager.GetExtProp((int)ExtPropIndexes.IceAttack); break; case EElementDamageType.EEDT_Lightning: // 雷 val += (int)attackClient.ClientData.EquipProp.ExtProps[(int)ExtPropIndexes.LightningAttack]; val += (int)attackClient.ClientData.PropsCacheManager.GetExtProp((int)ExtPropIndexes.LightningAttack); break; } } else if (attacker is Robot) // 机器人元素固定伤害 { Robot attackRobot = attacker as Robot; // 判空 if (null == attackRobot) { return(val); } // 根据元素类型获取机器人元素固定伤害 switch (eEDT) { case EElementDamageType.EEDT_Water: // 水 val = attackRobot.WaterAttack; break; case EElementDamageType.EEDT_Fire: // 火 val = attackRobot.FireAttack; break; case EElementDamageType.EEDT_Wind: // 风 val = attackRobot.WindAttack; break; case EElementDamageType.EEDT_Soil: // 土 val = attackRobot.SoilAttack; break; case EElementDamageType.EEDT_Ice: // 冰 val = attackRobot.IceAttack; break; case EElementDamageType.EEDT_Lightning: // 雷 val = attackRobot.LightningAttack; break; } } return(Math.Max(val, 0)); }
/// <summary> /// 获取元素伤害抗性 /// </summary> /// <param name="defender">防守者</param> /// <param name="eEDT">元素伤害类型</param> /// <returns></returns> public double GetDeElementDamagePenetration(IObject defender, EElementDamageType eEDT) { double val = 0.0; // 目前只有角色与竞技场机器人才有抵抗百分比 if (defender is GameClient) { GameClient defenderClient = defender as GameClient; // 判空 if (null == defenderClient) { return(val); } // 根据元素类型获取角色元素伤害抗性 switch (eEDT) { case EElementDamageType.EEDT_Water: // 水 val += defenderClient.ClientData.EquipProp.ExtProps[(int)ExtPropIndexes.DeWaterPenetration]; val += defenderClient.ClientData.PropsCacheManager.GetExtProp((int)ExtPropIndexes.DeWaterPenetration); break; case EElementDamageType.EEDT_Fire: // 火 val += defenderClient.ClientData.EquipProp.ExtProps[(int)ExtPropIndexes.DeFirePenetration]; val += defenderClient.ClientData.PropsCacheManager.GetExtProp((int)ExtPropIndexes.DeFirePenetration); break; case EElementDamageType.EEDT_Wind: // 风 val += defenderClient.ClientData.EquipProp.ExtProps[(int)ExtPropIndexes.DeWindPenetration]; val += defenderClient.ClientData.PropsCacheManager.GetExtProp((int)ExtPropIndexes.DeWindPenetration); break; case EElementDamageType.EEDT_Soil: // 土 val += defenderClient.ClientData.EquipProp.ExtProps[(int)ExtPropIndexes.DeSoilPenetration]; val += defenderClient.ClientData.PropsCacheManager.GetExtProp((int)ExtPropIndexes.DeSoilPenetration); break; case EElementDamageType.EEDT_Ice: // 冰 val += defenderClient.ClientData.EquipProp.ExtProps[(int)ExtPropIndexes.DeIcePenetration]; val += defenderClient.ClientData.PropsCacheManager.GetExtProp((int)ExtPropIndexes.DeIcePenetration); break; case EElementDamageType.EEDT_Lightning: // 雷 val += defenderClient.ClientData.EquipProp.ExtProps[(int)ExtPropIndexes.DeLightningPenetration]; val += defenderClient.ClientData.PropsCacheManager.GetExtProp((int)ExtPropIndexes.DeLightningPenetration); break; } } else if (defender is Robot) // 对方机器人抵抗百分比 { Robot defenderRobot = defender as Robot; // 判空 if (null == defenderRobot) { return(val); } // 根据元素类型获取机器人元素伤害抗性 switch (eEDT) { case EElementDamageType.EEDT_Water: // 水 val = defenderRobot.DeWaterPenetration; break; case EElementDamageType.EEDT_Fire: // 火 val = defenderRobot.DeFirePenetration; break; case EElementDamageType.EEDT_Wind: // 风 val = defenderRobot.DeWindPenetration; break; case EElementDamageType.EEDT_Soil: // 土 val = defenderRobot.DeSoilPenetration; break; case EElementDamageType.EEDT_Ice: // 冰 val = defenderRobot.DeIcePenetration; break; case EElementDamageType.EEDT_Lightning: // 雷 val = defenderRobot.DeLightningPenetration; break; } } return(Math.Max(val, 0)); }
/// <summary> /// 获取元素伤害穿透 /// </summary> /// <param name="attacker">攻击者</param> /// <param name="eEDT">元素伤害类型</param> /// <returns></returns> public double GetElementDamagePenetration(IObject attacker, EElementDamageType eEDT) { double val = 0.0; // 目前只有角色与竞技场机器人才有穿透百分比 if (attacker is GameClient) { GameClient attackClient = attacker as GameClient; // 判空 if (null == attackClient) { return(val); } // 根据元素类型获取角色伤害穿透 switch (eEDT) { case EElementDamageType.EEDT_Water: // 水 val += attackClient.ClientData.EquipProp.ExtProps[(int)ExtPropIndexes.WaterPenetration]; val += attackClient.ClientData.PropsCacheManager.GetExtProp((int)ExtPropIndexes.WaterPenetration); break; case EElementDamageType.EEDT_Fire: // 火 val += attackClient.ClientData.EquipProp.ExtProps[(int)ExtPropIndexes.FirePenetration]; val += attackClient.ClientData.PropsCacheManager.GetExtProp((int)ExtPropIndexes.FirePenetration); break; case EElementDamageType.EEDT_Wind: // 风 val += attackClient.ClientData.EquipProp.ExtProps[(int)ExtPropIndexes.WindPenetration]; val += attackClient.ClientData.PropsCacheManager.GetExtProp((int)ExtPropIndexes.WindPenetration); break; case EElementDamageType.EEDT_Soil: // 土 val += attackClient.ClientData.EquipProp.ExtProps[(int)ExtPropIndexes.SoilPenetration]; val += attackClient.ClientData.PropsCacheManager.GetExtProp((int)ExtPropIndexes.SoilPenetration); break; case EElementDamageType.EEDT_Ice: // 冰 val += attackClient.ClientData.EquipProp.ExtProps[(int)ExtPropIndexes.IcePenetration]; val += attackClient.ClientData.PropsCacheManager.GetExtProp((int)ExtPropIndexes.IcePenetration); break; case EElementDamageType.EEDT_Lightning: // 雷 val += attackClient.ClientData.EquipProp.ExtProps[(int)ExtPropIndexes.LightningPenetration]; val += attackClient.ClientData.PropsCacheManager.GetExtProp((int)ExtPropIndexes.LightningPenetration); break; } } else if (attacker is Robot) // 机器人穿透百分比 { Robot attackRobot = attacker as Robot; // 判空 if (null == attackRobot) { return(val); } // 根据元素类型获取机器人伤害穿透 switch (eEDT) { case EElementDamageType.EEDT_Water: // 水 val = attackRobot.WaterPenetration; break; case EElementDamageType.EEDT_Fire: // 火 val = attackRobot.FirePenetration; break; case EElementDamageType.EEDT_Wind: // 风 val = attackRobot.WindPenetration; break; case EElementDamageType.EEDT_Soil: // 土 val = attackRobot.SoilPenetration; break; case EElementDamageType.EEDT_Ice: // 冰 val = attackRobot.IcePenetration; break; case EElementDamageType.EEDT_Lightning: // 雷 val = attackRobot.LightningPenetration; break; } } return(Math.Max(val, 0)); }
public double GetElementDamagePenetration(IObject attacker, EElementDamageType eEDT) { double val = 0.0; if (attacker is GameClient) { GameClient attackClient = attacker as GameClient; if (null == attackClient) { return(val); } switch (eEDT) { case EElementDamageType.EEDT_Fire: val += attackClient.ClientData.EquipProp.ExtProps[75]; val += attackClient.ClientData.PropsCacheManager.GetExtProp(75); val += RoleAlgorithm.GetExtProp(attackClient, 118); break; case EElementDamageType.EEDT_Water: val += attackClient.ClientData.EquipProp.ExtProps[76]; val += attackClient.ClientData.PropsCacheManager.GetExtProp(76); val += RoleAlgorithm.GetExtProp(attackClient, 118); break; case EElementDamageType.EEDT_Lightning: val += attackClient.ClientData.EquipProp.ExtProps[77]; val += attackClient.ClientData.PropsCacheManager.GetExtProp(77); val += RoleAlgorithm.GetExtProp(attackClient, 118); break; case EElementDamageType.EEDT_Soil: val += attackClient.ClientData.EquipProp.ExtProps[78]; val += attackClient.ClientData.PropsCacheManager.GetExtProp(78); val += RoleAlgorithm.GetExtProp(attackClient, 118); break; case EElementDamageType.EEDT_Ice: val += attackClient.ClientData.EquipProp.ExtProps[79]; val += attackClient.ClientData.PropsCacheManager.GetExtProp(79); val += RoleAlgorithm.GetExtProp(attackClient, 118); break; case EElementDamageType.EEDT_Wind: val += attackClient.ClientData.EquipProp.ExtProps[80]; val += attackClient.ClientData.PropsCacheManager.GetExtProp(80); val += RoleAlgorithm.GetExtProp(attackClient, 118); break; } } else if (attacker is Robot) { Robot attackRobot = attacker as Robot; if (null == attackRobot) { return(val); } switch (eEDT) { case EElementDamageType.EEDT_Fire: val = attackRobot.FirePenetration; val += (attacker as Robot).ElementPenetration; break; case EElementDamageType.EEDT_Water: val = attackRobot.WaterPenetration; val += (attacker as Robot).ElementPenetration; break; case EElementDamageType.EEDT_Lightning: val = attackRobot.LightningPenetration; val += (attacker as Robot).ElementPenetration; break; case EElementDamageType.EEDT_Soil: val = attackRobot.SoilPenetration; val += (attacker as Robot).ElementPenetration; break; case EElementDamageType.EEDT_Ice: val = attackRobot.IcePenetration; val += (attacker as Robot).ElementPenetration; break; case EElementDamageType.EEDT_Wind: val = attackRobot.WindPenetration; val += (attacker as Robot).ElementPenetration; break; } } return(Math.Max(val, 0.0)); }
public int GetElementAttack(IObject attacker, EElementDamageType eEDT) { int val = 0; if (attacker is GameClient) { GameClient attackClient = attacker as GameClient; if (null == attackClient) { return(val); } switch (eEDT) { case EElementDamageType.EEDT_Fire: val += (int)attackClient.ClientData.EquipProp.ExtProps[69]; val += (int)attackClient.ClientData.PropsCacheManager.GetExtProp(69); break; case EElementDamageType.EEDT_Water: val += (int)attackClient.ClientData.EquipProp.ExtProps[70]; val += (int)attackClient.ClientData.PropsCacheManager.GetExtProp(70); break; case EElementDamageType.EEDT_Lightning: val += (int)attackClient.ClientData.EquipProp.ExtProps[71]; val += (int)attackClient.ClientData.PropsCacheManager.GetExtProp(71); break; case EElementDamageType.EEDT_Soil: val += (int)attackClient.ClientData.EquipProp.ExtProps[72]; val += (int)attackClient.ClientData.PropsCacheManager.GetExtProp(72); break; case EElementDamageType.EEDT_Ice: val += (int)attackClient.ClientData.EquipProp.ExtProps[73]; val += (int)attackClient.ClientData.PropsCacheManager.GetExtProp(73); break; case EElementDamageType.EEDT_Wind: val += (int)attackClient.ClientData.EquipProp.ExtProps[74]; val += (int)attackClient.ClientData.PropsCacheManager.GetExtProp(74); break; } } else if (attacker is Robot) { Robot attackRobot = attacker as Robot; if (null == attackRobot) { return(val); } switch (eEDT) { case EElementDamageType.EEDT_Fire: val = attackRobot.FireAttack; break; case EElementDamageType.EEDT_Water: val = attackRobot.WaterAttack; break; case EElementDamageType.EEDT_Lightning: val = attackRobot.LightningAttack; break; case EElementDamageType.EEDT_Soil: val = attackRobot.SoilAttack; break; case EElementDamageType.EEDT_Ice: val = attackRobot.IceAttack; break; case EElementDamageType.EEDT_Wind: val = attackRobot.WindAttack; break; } } return(Math.Max(val, 0)); }
public double GetDeElementDamagePenetration(IObject defender, EElementDamageType eEDT) { double val = 0.0; if (defender is GameClient) { GameClient defenderClient = defender as GameClient; if (null == defenderClient) { return(val); } switch (eEDT) { case EElementDamageType.EEDT_Fire: val += defenderClient.ClientData.EquipProp.ExtProps[81]; val += defenderClient.ClientData.PropsCacheManager.GetExtProp(81); break; case EElementDamageType.EEDT_Water: val += defenderClient.ClientData.EquipProp.ExtProps[82]; val += defenderClient.ClientData.PropsCacheManager.GetExtProp(82); break; case EElementDamageType.EEDT_Lightning: val += defenderClient.ClientData.EquipProp.ExtProps[83]; val += defenderClient.ClientData.PropsCacheManager.GetExtProp(83); break; case EElementDamageType.EEDT_Soil: val += defenderClient.ClientData.EquipProp.ExtProps[84]; val += defenderClient.ClientData.PropsCacheManager.GetExtProp(84); break; case EElementDamageType.EEDT_Ice: val += defenderClient.ClientData.EquipProp.ExtProps[85]; val += defenderClient.ClientData.PropsCacheManager.GetExtProp(85); break; case EElementDamageType.EEDT_Wind: val += defenderClient.ClientData.EquipProp.ExtProps[86]; val += defenderClient.ClientData.PropsCacheManager.GetExtProp(86); break; } } else if (defender is Robot) { Robot defenderRobot = defender as Robot; if (null == defenderRobot) { return(val); } switch (eEDT) { case EElementDamageType.EEDT_Fire: val = defenderRobot.DeFirePenetration; break; case EElementDamageType.EEDT_Water: val = defenderRobot.DeWaterPenetration; break; case EElementDamageType.EEDT_Lightning: val = defenderRobot.DeLightningPenetration; break; case EElementDamageType.EEDT_Soil: val = defenderRobot.DeSoilPenetration; break; case EElementDamageType.EEDT_Ice: val = defenderRobot.DeIcePenetration; break; case EElementDamageType.EEDT_Wind: val = defenderRobot.DeWindPenetration; break; } } return(Math.Max(val, 0.0)); }