コード例 #1
0
        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);
        }
コード例 #2
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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        /// <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));
        }
コード例 #5
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));
        }
コード例 #6
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));
        }
コード例 #7
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));
        }
コード例 #8
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));
        }
コード例 #9
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));
        }