Esempio n. 1
0
        /// <summary>
        /// 加载数据
        /// </summary>
        public static void InitBoss(UserGuild userGuild)
        {
            try
            {
                if (_userGuildList.ContainsKey(userGuild.GuildID))
                {
                    _userGuildList[userGuild.GuildID] = userGuild;
                }
                else
                {
                    _userGuildList.Add(userGuild.GuildID, userGuild);
                }

                CombatGeneral general = CreateBossGeneral(userGuild);
                if (!_bossGeneralList.ContainsKey(userGuild.GuildID))
                {
                    _bossGeneralList.Add(userGuild.GuildID, new BossDictionary {
                        BossGeneral = general
                    });
                }
                else
                {
                    _bossGeneralList[userGuild.GuildID].BossGeneral = general;
                }
            }
            catch (Exception ex)
            {
                new BaseLog().SaveLog(ex);
            }
        }
Esempio n. 2
0
 private void SetEmbattle(EmbattleQueue combatGrid, CacheList <CombatEmbattle> list)
 {
     IGeneral[] generalList = combatGrid.FindAll(true);
     foreach (IGeneral general in generalList)
     {
         if (general != null && general is CombatGeneral)
         {
             CombatGeneral cgeneral = (CombatGeneral)general;
             list.Add(new CombatEmbattle
             {
                 UserID         = cgeneral.UserID,
                 GeneralID      = cgeneral.GeneralID,
                 GeneralName    = cgeneral.GeneralName,
                 GeneralLv      = cgeneral.Lv,
                 HeadID         = cgeneral.HeadID,
                 AbilityID      = cgeneral.TempAbility == null ? 0 : cgeneral.TempAbility.AbilityID,
                 LiveNum        = cgeneral.LifeNum,
                 LiveMaxNum     = cgeneral.LifeMaxNum,
                 MomentumNum    = cgeneral.Momentum,
                 MaxMomentumNum = CombatGeneral.MomentumOut,
                 Position       = cgeneral.Position,
                 IsWait         = cgeneral.IsWait,
                 BattleHead     = cgeneral.BattleHeadID
             });
         }
     }
     if (list.Count == 0)
     {
         new BaseLog().SaveDebugLog("战斗异常,未能加载佣兵数据");
     }
 }
Esempio n. 3
0
 /// <summary>
 /// 检查攻击方式
 /// </summary>
 /// <returns></returns>
 public static CombatBaseAttack CheckAttack(CombatGeneral general)
 {
     //return !general.IsHunluanStatus && general.IsRelease
     //           ? (CombatBaseAttack)new CombatAbilityAttack(general)
     //           : new CombatPhysicalAttack(general);
     if (!general.IsHunluanStatus && general.IsRelease)
     {
         general.IsSelfAbility = 1;
         return((CombatBaseAttack) new CombatAbilityAttack(general));
     }
     else
     {
         var ability = AbilityDispose.TriggerAbilityList(general.AbilityInfoList);
         if (ability != null)
         {
             general.IsSelfAbility  = 2;
             general.TriggerAbility = ability;
             return((CombatBaseAttack) new CombatAbilityAttack(general));
         }
         else
         {
             return(new CombatPhysicalAttack(general));
         }
     }
 }
Esempio n. 4
0
        /// <summary>
        /// 初始化BOSS数据
        /// </summary>
        /// <returns></returns>
        private static CombatGeneral CreateBossGeneral(UserGuild guild)
        {
            CombatGeneral boss = null;

            if (guild != null)
            {
                GuildBossInfo bossInfo = guild.GuildBossInfo;
                if (bossInfo != null)
                {
                    var plotNpcInfoList = new ConfigCacheSet <PlotNPCInfo>().FindAll(m => m.PlotID == gameActive.BossPlotID);
                    if (plotNpcInfoList.Count > 0)
                    {
                        var embattleList = new ConfigCacheSet <PlotEmbattleInfo>().FindAll(m => m.PlotNpcID == plotNpcInfoList[0].PlotNpcID);
                        if (embattleList.Count > 0)
                        {
                            boss    = (CombatGeneral)MonsterQueue.Create(embattleList[0]);
                            boss.Lv = (short)MathUtils.Subtraction(bossInfo.BossLv, 0, gameActive.BossDefLv);
                            int bossLiftNum = MonsterQueue.BossProperty(embattleList[0].PlotNpcID, AbilityType.ShengMing).ToInt();
                            int lifeNum     = boss.LifeNum + (boss.Lv - gameActive.BossDefLv) * bossLiftNum; //ConfigEnvSet.GetInt("BossCombat.IncreaseLiveNum");
                            boss.LifeMaxNum = lifeNum;
                            boss.LifeNum    = lifeNum;
                        }
                    }
                    else
                    {
                        throw new Exception(string.Format("公会战未配置BOSS:{0}", gameActive.BossPlotID));
                    }
                }
            }
            if (boss == null)
            {
                throw new Exception("Loading guid boss faild.");
            }
            return(boss);
        }
Esempio n. 5
0
        public static TList <SkillLvInfo> CreateSkillLvInfo(CombatGeneral general)
        {
            TList <SkillLvInfo> _skillLvList = new TList <SkillLvInfo>();

            if (general.GeneralID == LanguageManager.GetLang().GameUserGeneralID)
            {
                var       abilityCacheSet = new ConfigCacheSet <AbilityInfo>();
                var       skillLvSet      = new ConfigCacheSet <SkillLvInfo>();
                UserTrump userTrump       = new GameDataCacheSet <UserTrump>().FindKey(general.UserID, TrumpInfo.CurrTrumpID) ?? new UserTrump();
                if (userTrump.LiftNum > 0)
                {
                    userTrump.SkillInfo.Foreach(obj =>
                    {
                        var abilityInfo = abilityCacheSet.FindKey(obj.AbilityID) ?? new AbilityInfo();
                        if (abilityInfo.AttackType == AttackType.Trigger)
                        {
                            var temp = skillLvSet.FindKey(obj.AbilityID, obj.AbilityLv);
                            if (temp != null)
                            {
                                _skillLvList.Add(temp);
                            }
                        }
                        return(true);
                    });
                }
            }
            return(_skillLvList);
        }
Esempio n. 6
0
 public CombatCenter(EmbattleRole role, CombatGeneral general, EmbattleRole targerRole, TargetHandle targetHandle)
 {
     _role         = role;
     _attrGeneral  = general;
     _targerRole   = targerRole;
     _targerHandle = targetHandle;
     _processLog   = new CombatProcess();
 }
Esempio n. 7
0
        /// <summary>
        /// 破盾
        /// </summary>
        /// <param name="general"></param>
        /// <param name="abilityType"></param>
        /// <returns></returns>
        public static bool AttackPoDun(CombatGeneral general, AbilityType abilityType)
        {
            SkillLvInfo skillLvInfo = CreateSkillLvInfo(general).Find(m => m.EffType == abilityType);

            if (skillLvInfo != null && RandomUtils.IsHit(skillLvInfo.Probability))
            {
                return(true);
            }
            return(false);
        }
Esempio n. 8
0
        /// <summary>
        /// 触发爆击概率
        /// </summary>
        /// <param name="tagetGeneral"></param>
        /// <param name="baojiPercent"></param>
        /// <returns></returns>
        public bool TriggerBaojiPercent(CombatGeneral tagetGeneral, out decimal baojiPercent)
        {
            decimal tpLvPercent = GetLvPercent(tagetGeneral);

            baojiPercent = this.BaojiNum + TriggerAbilityEffectNum(AbilityType.BaoJi, 1);
            decimal renxingPercent = tagetGeneral.RenxingNum + tagetGeneral.TriggerAbilityEffectNum(AbilityType.RenXing, 1);

            baojiPercent = baojiPercent.Subtraction(renxingPercent, 0).Subtraction(tpLvPercent, 0);
            return(RandomHelper.IsHit(baojiPercent));
        }
Esempio n. 9
0
        /// <summary>
        /// 触发格挡概率
        /// </summary>
        /// <param name="tagetGeneral"></param>
        /// <param name="gedangPercent"></param>
        /// <returns></returns>
        public bool TriggerGeDangPercent(CombatGeneral tagetGeneral, out decimal gedangPercent)
        {
            decimal tpLvPercent = GetLvPercent(tagetGeneral);

            gedangPercent = this.GedangNum + TriggerAbilityEffectNum(AbilityType.GeDang, 1);
            decimal pojiNumPercent = tagetGeneral.PojiNum + tagetGeneral.TriggerAbilityEffectNum(AbilityType.PoJi, 1);

            gedangPercent = gedangPercent.Subtraction(pojiNumPercent, 0).Subtraction(tpLvPercent, 0);
            return(RandomHelper.IsHit(gedangPercent));
        }
Esempio n. 10
0
 public CombatBaseAttack(CombatGeneral general)
 {
     General              = general;
     ProcessLog           = new CombatProcess();
     ProcessLog.GeneralID = general.GeneralID;
     ProcessLog.Position  = general.Position.ToShort();
     ProcessLog.LiveNum   = general.LifeNum;
     ProcessLog.Momentum  = general.Momentum;
     ProcessLog.AttStatus = general.BattleStatus;
 }
Esempio n. 11
0
        /// <summary>
        /// 触发命中概率
        /// </summary>
        /// <param name="general"></param>
        /// <param name="tpLvPercent"></param>
        /// <param name="percent"></param>
        /// <returns></returns>
        public bool TriggerHitPercent(CombatGeneral tagetGeneral, out decimal hitPercent)
        {
            decimal tpLvPercent = GetLvPercent(tagetGeneral);

            hitPercent = HitNum + TriggerAbilityEffectNum(AbilityType.MingZhong, 1);
            decimal shanbiPercent = tagetGeneral.ShanbiNum + tagetGeneral.TriggerAbilityEffectNum(AbilityType.ShanBi, 1);

            hitPercent = hitPercent.Subtraction(shanbiPercent, 0).Subtraction(tpLvPercent, 0);

            return(RandomHelper.IsHit(hitPercent));
        }
Esempio n. 12
0
        /// <summary>
        /// 属相克制伤害
        /// </summary>
        /// <param name="userID1"></param>
        /// <param name="userID2"></param>
        /// <returns></returns>
        public static decimal TrumpZodiacHarm(CombatGeneral general, string userID2)
        {
            if (general.GeneralID != LanguageManager.GetLang().GameUserGeneralID)
            {
                return(0);
            }
            ZodiacType zodiacType1 = GetZodiacType(general.UserID);
            ZodiacType zodiacType2 = GetZodiacType(userID2);

            return(ZodiacRestraint(zodiacType1, zodiacType2));
        }
Esempio n. 13
0
        private static decimal GetEffTypeNum(CombatGeneral general, AbilityType abilityType)
        {
            TList <SkillLvInfo> skillLvList = CreateSkillLvInfo(general);

            foreach (SkillLvInfo info in skillLvList)
            {
                if (info.EffType == abilityType && RandomUtils.IsHit(info.Probability))
                {
                    return(info.EffNum);
                }
            }
            return(0);
        }
Esempio n. 14
0
        public CombatAbilityAttack(CombatGeneral general)
            : base(general)
        {
            if (general.IsSelfAbility == 2)
            {
                _ability            = General.TriggerAbility;
                General.TempAbility = General.TriggerAbility;
            }
            else
            {
                _ability            = General.Ability;
                General.TempAbility = General.Ability;
            }

            general.IsSelfAbility = 0;
        }
Esempio n. 15
0
        public static decimal GetEffect(CombatGeneral general, AbilityType abilityType)
        {
            decimal effNum = 1;

            if (general.GeneralID != LanguageManager.GetLang().GameUserGeneralID)
            {
                return(0);
            }
            switch (abilityType)
            {
            case AbilityType.BaoJiJiaCheng:
                effNum = MathUtils.Addition(effNum, GetEffTypeNum(general, abilityType));
                break;

            case AbilityType.IsBaoJiReduce:
                effNum = MathUtils.Subtraction(effNum, GetEffTypeNum(general, abilityType));
                break;

            case AbilityType.Resurrect:
                effNum = GetEffTypeNum(general, abilityType);
                break;

            case AbilityType.AttackLife:
                effNum = GetEffTypeNum(general, abilityType);
                break;

            case AbilityType.Furious:
                effNum = LifeLowerTnumEffNum(general, abilityType);
                break;

            case AbilityType.NormalAttackPoFang:
                effNum = GetEffTypeNum(general, abilityType);
                break;

            case AbilityType.AttackPoDun:
                //effNum = GetEffTypeNum(general, abilityType);
                break;

            case AbilityType.FanShang:
                effNum = GetEffTypeNum(general, abilityType);
                break;

            default:
                return(effNum);
            }
            return(effNum);
        }
Esempio n. 16
0
        /// <summary>
        /// 初始化BOSS数据
        /// </summary>
        /// <param name="active"></param>
        /// <returns></returns>
        private static CombatGeneral CreateBossGeneral(GameActive active)
        {
            CombatGeneral boss = null;

            if (active != null)
            {
                var plotNpcInfoList = new ConfigCacheSet <PlotNPCInfo>().FindAll(m => m.PlotID == active.BossPlotID);
                if (plotNpcInfoList.Count > 0)
                {
                    var embattleList = new ConfigCacheSet <PlotEmbattleInfo>().FindAll(m => m.PlotNpcID == plotNpcInfoList[0].PlotNpcID);
                    if (embattleList.Count > 0)
                    {
                        int npcId = plotNpcInfoList[0].PlotNpcID;
                        boss    = (CombatGeneral)MonsterQueue.Create(embattleList[0]);
                        boss.Lv = (short)MathUtils.Subtraction(active.BossLv, 0, active.BossDefLv);
                        int bossLiftNum = MonsterQueue.BossProperty(embattleList[0].PlotNpcID, AbilityType.ShengMing).ToInt();
                        int lv          = (boss.Lv - active.BossDefLv);
                        int lifeNum     = boss.LifeNum + lv * bossLiftNum; //ConfigEnvSet.GetInt("BossCombat.IncreaseLiveNum");
                        boss.LifeMaxNum = lifeNum;
                        boss.LifeNum    = lifeNum;
                        if (lv > 0)
                        {
                            boss.PowerNum      = MathUtils.Addition((lv * MonsterQueue.BossProperty(npcId, AbilityType.PowerNum)).ToInt(), boss.PowerNum).ToInt();
                            boss.SoulNum       = MathUtils.Addition((lv * MonsterQueue.BossProperty(npcId, AbilityType.SoulNum).ToInt()), boss.SoulNum).ToInt();
                            boss.IntellectNum  = MathUtils.Addition((lv * MonsterQueue.BossProperty(npcId, AbilityType.IntelligenceNum).ToInt()), boss.IntellectNum).ToInt();
                            boss.PhyAttackNum  = MathUtils.Addition((lv * MonsterQueue.BossProperty(npcId, AbilityType.WuLiGongJi).ToInt()), boss.PhyAttackNum);
                            boss.AbiAttackNum  = MathUtils.Addition((lv * MonsterQueue.BossProperty(npcId, AbilityType.HunJiGongJi).ToInt()), boss.AbiAttackNum);
                            boss.MagAttackNum  = MathUtils.Addition((lv * MonsterQueue.BossProperty(npcId, AbilityType.MoFaGongJi).ToInt()), boss.MagAttackNum);
                            boss.PhyDefenseNum = MathUtils.Addition((lv * MonsterQueue.BossProperty(npcId, AbilityType.WuLiFangYu).ToInt()), boss.PhyDefenseNum);
                            boss.AbiDefenseNum = MathUtils.Addition((lv * MonsterQueue.BossProperty(npcId, AbilityType.HunJiFangYu).ToInt()), boss.AbiDefenseNum);
                            boss.MagDefenseNum = MathUtils.Addition((lv * MonsterQueue.BossProperty(npcId, AbilityType.MoFaFangYu).ToInt()), boss.MagDefenseNum);
                        }
                        TraceLog.WriteComplement("世界BOSS属性值---血量:{0}、上限血量:{1}、力量:{2}、魂力:{3}、智力:{4}、物理攻击:{5}、魂技攻击:{6}、魔法攻击:{7}、物理防御:{8}、魂技防御:{9}、魔法防御:{10}", boss.LifeNum, boss.LifeMaxNum, boss.PowerNum, boss.SoulNum, boss.IntellectNum, (boss.ExtraAttack.WuliNum + boss.PhyAttackNum), (boss.ExtraAttack.HunjiNum + boss.AbiAttackNum), (boss.ExtraAttack.MofaNum + boss.MagAttackNum), (boss.ExtraDefense.WuliNum + boss.PhyDefenseNum), (boss.ExtraDefense.HunjiNum + boss.AbiDefenseNum), (boss.ExtraDefense.MofaNum + boss.MagDefenseNum));
                    }
                }
                else
                {
                    throw new Exception(string.Format("公会战未配置BOSS:{0}", active.BossPlotID));
                }
            }
            if (boss == null)
            {
                throw new Exception("Loading boss faild.");
            }
            return(boss);
        }
Esempio n. 17
0
        /// <summary>
        /// 获取攻击单位
        /// </summary>
        /// <param name="position">攻击方的位置</param>
        /// <param name="attackType">攻击方式</param>
        /// <param name="attackTaget">攻击目标</param>
        /// <param name="targetEmbattle"></param>
        private static CombatGeneral[] GetTargetUnit(int position, AttackUnit attackType, AttackTaget attackTaget, EmbattleQueue targetEmbattle)
        {
            IGeneral[]           generalList       = new IGeneral[0];
            List <CombatGeneral> targetGeneralList = new List <CombatGeneral>();

            switch (attackType)
            {
            case AttackUnit.Single:
                CombatGeneral cg = null;
                if (attackTaget == AttackTaget.Self)
                {
                    cg = (CombatGeneral)targetEmbattle.GetGeneral(position);
                }
                else
                {
                    cg = (CombatGeneral)targetEmbattle.FindGeneral(position);
                }
                if (cg != null)
                {
                    generalList = new IGeneral[] { cg };
                }
                break;

            case AttackUnit.Horizontal:
                generalList = targetEmbattle.FindHorizontal(position);
                break;

            case AttackUnit.Vertical:
                generalList = targetEmbattle.FindVertical(position);
                break;

            case AttackUnit.All:
                generalList = targetEmbattle.FindAll();
                break;

            default:
                break;
            }
            foreach (IGeneral general in generalList)
            {
                targetGeneralList.Add((CombatGeneral)general);
            }
            return(targetGeneralList.ToArray());
        }
Esempio n. 18
0
        /// <summary>
        /// 血量低于特定值时加成
        /// </summary>
        /// <param name="abilityType"></param>
        /// <returns></returns>
        private static decimal LifeLowerTnumEffNum(CombatGeneral general, AbilityType abilityType)
        {
            SkillLvInfo skillLvInfo = CreateSkillLvInfo(general).Find(m => m.EffType == abilityType);

            if (skillLvInfo != null)
            {
                if (skillLvInfo.Tnum > 1 && general.LifeNum <= skillLvInfo.Tnum && RandomUtils.IsHit(skillLvInfo.Probability))
                {
                    return(skillLvInfo.EffNum);
                }
                else if (skillLvInfo.Tnum < 1)
                {
                    decimal tnum = skillLvInfo.Tnum * general.LifeMaxNum;
                    if (tnum >= general.LifeNum && RandomUtils.IsHit(skillLvInfo.Probability))
                    {
                        return(skillLvInfo.EffNum);
                    }
                }
            }
            return(0);
        }
Esempio n. 19
0
        /// <summary>
        /// 计算伤害公式
        /// 攻击伤害 = 攻击力 - 物理防御力
        /// </summary>
        /// <param name="tagetGeneral">加血等辅助技能时可能为空值</param>
        /// <returns></returns>
        protected int GetPhysicalDamageNum(CombatGeneral tagetGeneral)
        {
            AbilityProperty property = General.AbilityProperty;

            ProcessLog.AbilityProperty = property;
            int     damageNum;
            int     attackNum;
            int     defenseNum = 0;
            decimal harmNum    = 0; //法宝属相克制伤害 --技能攻击

            attackNum = General.GetAttackNum(property);
            if (tagetGeneral != null)
            {
                harmNum    = TrumpAbilityAttack.TrumpZodiacHarm(General, tagetGeneral.UserID);
                defenseNum = tagetGeneral.GetDefenseNum(property, tagetGeneral);
                //普通攻击破防
                decimal normalAttackPoFang = TrumpAbilityAttack.GetEffect(General, AbilityType.NormalAttackPoFang);
                if (normalAttackPoFang > 0)
                {
                    ProcessLog.TrumpStatusList.Add(TrumpAbilityAttack.GetSkillprocess(AbilityType.NormalAttackPoFang, 0));
                }
                defenseNum = (int)Math.Floor(MathUtils.Subtraction(defenseNum, defenseNum * normalAttackPoFang));
            }
            General.MinDamageNum = (int)Math.Ceiling(attackNum * ConfigEnvSet.GetDouble("Combat.MinDamagePencent"));

            damageNum = MathUtils.Subtraction(attackNum, defenseNum, General.MinDamageNum);

            //加固定伤害
            damageNum = MathUtils.Addition(damageNum, General.FixedDamageNum, int.MaxValue);

            //法宝属相克制伤害 --技能攻击
            if (harmNum > 0 && !isPyharm)
            {
                damageNum = (int)(damageNum * MathUtils.Addition(1, (harmNum + General.EffectValue)));
                isPyharm  = true;
            }

            return(damageNum);
        }
Esempio n. 20
0
        /// <summary>
        /// 加载数据
        /// </summary>
        public static void InitBoss(GameActive gameActive)
        {
            if (_gameActiveList.ContainsKey(gameActive.ActiveId))
            {
                _gameActiveList[gameActive.ActiveId] = gameActive;
            }
            else
            {
                _gameActiveList.Add(gameActive.ActiveId, gameActive);
            }

            CombatGeneral general = CreateBossGeneral(gameActive);

            if (!_bossGeneralList.ContainsKey(gameActive.ActiveId))
            {
                _bossGeneralList.Add(gameActive.ActiveId, new BossDictionary {
                    BossGeneral = general
                });
            }
            else
            {
                _bossGeneralList[gameActive.ActiveId].BossGeneral = general;
            }
        }
Esempio n. 21
0
 /// <summary>
 /// 等级差压制
 /// </summary>
 /// <param name="tagetGeneral"></param>
 /// <returns></returns>
 private decimal GetLvPercent(CombatGeneral tagetGeneral)
 {
     return(tagetGeneral.Lv.Subtraction(this.Lv, 0) * ConfigEnvSet.GetDecimal("Combat.LvPercentRate"));
 }
Esempio n. 22
0
        /// <summary>
        /// 计算技能伤害公式,不产生负数
        /// </summary>
        /// <param name="tagetGeneral"></param>
        /// <returns></returns>
        protected int GetAbilityDamageNum(CombatGeneral tagetGeneral)
        {
            string traceStr = string.Empty;
            int    damageNum;
            int    attackNum;
            int    defenseNum = 0;

            decimal         harmNum  = 0; //法宝属相克制伤害 --技能攻击
            AbilityProperty property = General.AbilityProperty;

            ProcessLog.AbilityProperty = property;
            attackNum = General.GetAttackNum(AbilityProperty.Ability) + General.GetAttackNum(property);
            if (tagetGeneral != null)
            {
                //法宝属相克制伤害 --技能攻击
                harmNum = TrumpAbilityAttack.TrumpZodiacHarm(General, tagetGeneral.UserID);

                defenseNum = tagetGeneral.GetDefenseNum(AbilityProperty.Ability, tagetGeneral) + tagetGeneral.GetDefenseNum(property, tagetGeneral);
            }
            General.MinDamageNum = (int)Math.Ceiling(attackNum * ConfigEnvSet.GetDouble("Combat.MinDamagePencent"));
            damageNum            = MathUtils.Subtraction(attackNum, defenseNum, General.MinDamageNum);

            decimal ratioNum = General.TempAbility.RatioNum > 0 ? General.TempAbility.RatioNum : 1;

            damageNum = (int)Math.Floor(damageNum * ratioNum); //计算伤害系数
            //气势加成=气势/{100-(气势-100)*2/3}*100%
            if (General != null)
            {
                var qishiNum = General.Momentum == 0 ? (short)100 : General.Momentum;
                traceStr += "qishiNum:" + qishiNum;
                decimal qishiPercent = (decimal)qishiNum / 100;
                traceStr += "qishiPercent:" + qishiNum;
                damageNum = (int)Math.Floor(damageNum * qishiPercent);
                traceStr += "damageNum:" + qishiNum;
                //加固定伤害
                damageNum = MathUtils.Addition(damageNum, General.FixedDamageNum, int.MaxValue);
                traceStr += "FixedDamageNum:" + qishiNum;
            }
            //技能伤害,负数是增加,
            //damageNum = General != null && General.Ability.IsIncrease ? -damageNum : damageNum;
            if (damageNum == 0)
            {
                new BaseLog().SaveLog(new Exception("释放技能:" + General.TempAbility.AbilityName + General.TempAbility.AbilityID + "伤害为0,Trace:" + traceStr));
            }
            if (damageNum < General.MinDamageNum)
            {
                damageNum = General.MinDamageNum;
            }
            //法宝属相克制伤害 --技能攻击
            if (!isharm && harmNum > 0)
            {
                damageNum = (int)(damageNum * MathUtils.Addition(1, harmNum));
                isharm    = true;
            }
            //魂技等级与自身魂技加成

            int     abilityID   = General.TempAbility != null ? General.TempAbility.AbilityID : 0;
            decimal effectValue = AbilityDispose.GetAbilityEffect(General.UserID, General.GeneralID, abilityID);

            if (effectValue > 0)
            {
                damageNum = MathUtils.ToCeilingInt(damageNum * MathUtils.Addition(1, (effectValue)));
            }
            return(damageNum);
        }
Esempio n. 23
0
        /// <summary>
        /// 佣兵属性集合
        /// </summary>
        /// <param name="userID"></param>
        /// <param name="generalID"></param>
        /// <returns></returns>
        public static List <GeneralProperty> GetAbility(string userID, int generalID, UserGeneral userGeneral)
        {
            List <GeneralProperty> gPropertyList = new List <GeneralProperty>();
            var             cacheSetUserEmbattle = new PersonalCacheStruct <UserEmbattle>();
            GeneralProperty generalProperty      = new GeneralProperty();
            var             userMagic            = new PersonalCacheStruct <UserMagic>().Find(userID, s => s.IsEnabled);
            CombatGeneral   combatGeneral        = new CombatGeneral()
            {
                UserID       = userID,
                GeneralID    = generalID,
                ExtraAttack  = new CombatProperty(),
                ExtraDefense = new CombatProperty(),
                LifeNum      = userGeneral.LifeNum,
                LifeMaxNum   = userGeneral.LifeMaxNum
            };


            var userEmbattleList = cacheSetUserEmbattle.FindAll(userID,
                                                                s =>
                                                                s.MagicID == (userMagic != null ? userMagic.MagicID : 0));

            UserEmbattleQueue.embattleList = userEmbattleList;
            UserEmbattleQueue.KarmaAddition(userID, combatGeneral);
            userGeneral.TLifeNum    = combatGeneral.LifeNum;
            userGeneral.TLifeMaxNun = combatGeneral.LifeMaxNum;
            //int LifeReply = 0; // 生命回复
            //物理攻击
            generalProperty = GetAbilityProperty(userID, generalID, AbilityType.WuLiGongJi);
            generalProperty.AbilityValue = MathUtils.Addition(generalProperty.AbilityValue, generalProperty.AbilityValue * combatGeneral.ExtraAttack.AdditionWuliNum);
            gPropertyList.Add(generalProperty);
            //物理防御
            generalProperty = GetAbilityProperty(userID, generalID, AbilityType.WuLiFangYu);
            generalProperty.AbilityValue = MathUtils.Addition(generalProperty.AbilityValue, generalProperty.AbilityValue * combatGeneral.ExtraDefense.AdditionWuliNum);
            gPropertyList.Add(generalProperty);
            //魂技攻击
            generalProperty = GetAbilityProperty(userID, generalID, AbilityType.HunJiGongJi);
            generalProperty.AbilityValue = MathUtils.Addition(generalProperty.AbilityValue, generalProperty.AbilityValue * combatGeneral.ExtraAttack.AdditionHunjiNum);
            gPropertyList.Add(generalProperty);
            //魂技防御
            generalProperty = GetAbilityProperty(userID, generalID, AbilityType.HunJiFangYu);
            generalProperty.AbilityValue = MathUtils.Addition(generalProperty.AbilityValue, generalProperty.AbilityValue * combatGeneral.ExtraDefense.AdditionHunjiNum);
            gPropertyList.Add(generalProperty);
            //魔法攻击
            generalProperty = GetAbilityProperty(userID, generalID, AbilityType.MoFaGongJi);
            generalProperty.AbilityValue = MathUtils.Addition(generalProperty.AbilityValue, generalProperty.AbilityValue * combatGeneral.ExtraAttack.AdditionMofaNum);
            gPropertyList.Add(generalProperty);
            //魔法防御
            generalProperty = GetAbilityProperty(userID, generalID, AbilityType.MoFaFangYu);
            generalProperty.AbilityValue = MathUtils.Addition(generalProperty.AbilityValue, generalProperty.AbilityValue * combatGeneral.ExtraDefense.AdditionMofaNum);
            gPropertyList.Add(generalProperty);

            //暴击
            gPropertyList.Add(GetAbilityProperty(userID, generalID, AbilityType.BaoJi));
            //命中
            gPropertyList.Add(GetAbilityProperty(userID, generalID, AbilityType.MingZhong));
            //破击
            gPropertyList.Add(GetAbilityProperty(userID, generalID, AbilityType.PoJi));
            //韧性
            gPropertyList.Add(GetAbilityProperty(userID, generalID, AbilityType.RenXing));
            //闪避
            gPropertyList.Add(GetAbilityProperty(userID, generalID, AbilityType.ShanBi));
            //格挡
            gPropertyList.Add(GetAbilityProperty(userID, generalID, AbilityType.GeDang));
            //必杀
            gPropertyList.Add(GetAbilityProperty(userID, generalID, AbilityType.BiSha));

            //先攻
            gPropertyList.Add(new GeneralProperty()
            {
                AbilityType = AbilityType.FirstStrike, AbilityValue = (decimal)TotalPriorityNum(userID, generalID)
            });

            return(gPropertyList);
        }
Esempio n. 24
0
        /// <summary>
        /// 触发战斗
        /// </summary>
        /// <param name="user"></param>
        /// <param name="bossCombatProcess"></param>
        /// <returns></returns>
        public bool Combat(GameUser user, BossCombatProcess bossCombatProcess)
        {
            CombatGeneral bossGeneral = Boss;

            bossGeneral.LossLifeNum = 0;

            BossUser          bossUser       = GetCombatUser(user.UserID);
            ICombatController controller     = CombatControllerFactory.Create();
            ISingleCombat     plotCombater   = controller.GetSingleCombat(CombatType.BossPlot);
            double            inspirePercent = bossUser.InspirePercent + bossUser.ReliveInspirePercent;

            plotCombater.SetAttack(new UserEmbattleQueue(user.UserID, user.UseMagicID, inspirePercent, CombatType.BossPlot));
            plotCombater.SetDefend(new MonsterQueue(Boss));

            bool isWin = plotCombater.Doing();

            bossCombatProcess.ProcessContainer = (CombatProcessContainer)plotCombater.GetProcessResult();
            bossUser.CombatNum         += 1;
            bossUser.DamageNum          = MathUtils.Addition(bossUser.DamageNum, bossGeneral.LossLifeNum, int.MaxValue);
            bossCombatProcess.LiveNum   = bossGeneral.LifeNum;
            bossCombatProcess.DamageNum = bossGeneral.LossLifeNum;
            bossCombatProcess.IsWin     = isWin;
            bossCombatProcess.UserId    = user.UserID;

            DoDamagePrize(user, bossGeneral.LossLifeNum, bossCombatProcess);
            if (isWin && bossGeneral.IsOver)
            {
                GameActive active   = GameActive;
                short      lv       = MathUtils.Subtraction(bossGeneral.Lv, (short)active.BossPrize.KillBossLv, (short)1);
                int        killCoin = lv * active.BossPrize.KillBossRate;
                user.GameCoin = MathUtils.Addition(user.GameCoin, killCoin, int.MaxValue);

                new TjxChatService().SystemSend(ChatType.World, string.Format(LanguageManager.GetLang().St5405_CombatKillReward, user.NickName, killCoin));
                TraceLog.ReleaseWriteDebug(string.Format(LanguageManager.GetLang().St5405_CombatKillReward, user.NickName, killCoin));
                bossCombatProcess.KillGameCoin = killCoin;

                ServerEnvSet.Set(ServerEnvKey.KillBossUserID, user.UserID);
                DoKillPrize(user);

                int tempMinute = active.Minutes - ConfigEnvSet.GetInt("BossCombat.KillTime");
                if (new TimeSpan(0, tempMinute, 0).TotalSeconds - active.ColdTime < 0)
                {
                    //Boss自动升级
                    active.BossLv = MathUtils.Addition(active.BossLv, (short)1);
                    //active.Update();
                }
                active.CombatStatus = CombatStatus.Killed;
                CombatHelper.BossKillDate(); //增加boss被杀时间
            }
            else
            {
                bossUser.IsRelive        = true;
                bossUser.ReliveBeginDate = DateTime.Now;
            }
            //日志
            var log = new UserCombatLog
            {
                CombatLogID   = Guid.NewGuid().ToString(),
                UserID        = user.UserID,
                CityID        = user.CityID,
                PlotID        = GameActive == null ? 0 : GameActive.BossPlotID,
                NpcID         = bossGeneral.GeneralID,
                CombatType    = CombatType.BossPlot,
                HostileUser   = string.Empty,
                IsWin         = isWin,
                CombatProcess = JsonUtils.Serialize(bossCombatProcess),
                CreateDate    = DateTime.Now
            };
            var sender = DataSyncManager.GetDataSender();

            sender.Send(log);

            //user.Update();

            return(isWin);
        }
Esempio n. 25
0
        /// <summary>
        /// 触发战斗
        /// </summary>
        /// <param name="user"></param>
        /// <param name="bossCombatProcess"></param>
        /// <returns></returns>
        public bool Combat(GameUser user, BossCombatProcess bossCombatProcess)
        {
            CombatGeneral bossGeneral = Boss;

            bossGeneral.LossLifeNum = 0;
            bool     isWin    = false;
            BossUser bossUser = GetCombatUser(user.UserID);

            ICombatController controller     = CombatControllerFactory.Create();
            ISingleCombat     plotCombater   = controller.GetSingleCombat(CombatType.BossPlot);
            double            inspirePercent = bossUser.InspirePercent + bossUser.ReliveInspirePercent;

            plotCombater.SetAttack(new UserEmbattleQueue(user.UserID, user.UseMagicID, inspirePercent,
                                                         CombatType.BossPlot));
            plotCombater.SetDefend(new MonsterQueue(bossGeneral));

            isWin = plotCombater.Doing();
            bossCombatProcess.ProcessContainer = (CombatProcessContainer)plotCombater.GetProcessResult();
            bossUser.CombatNum         += 1;
            bossUser.DamageNum          = MathUtils.Addition(bossUser.DamageNum, bossGeneral.LossLifeNum, int.MaxValue);
            bossCombatProcess.LiveNum   = bossGeneral.LifeNum;
            bossCombatProcess.DamageNum = bossGeneral.LossLifeNum;
            bossCombatProcess.IsWin     = isWin;
            bossCombatProcess.UserId    = user.UserID;

            DoDamagePrize(user, bossGeneral.LossLifeNum, bossCombatProcess);
            if (isWin && bossGeneral.IsOver)
            {
                //GameActive active = GameActive;
                UserGuild guild        = UserGuild;
                short     bossprizeLv  = 0;
                int       killbossrate = 0;
                if (guild.BossPrize != null)
                {
                    bossprizeLv  = (short)guild.BossPrize.KillBossLv;
                    killbossrate = guild.BossPrize.KillBossRate;
                    //击杀奖
                    BossActivePrize bossPrize    = UserGuild.BossPrize;
                    string          prizeItemMsg = string.Empty;
                    DoTopThreePrize(0, user, bossPrize.KillReward, bossPrize.Items, out prizeItemMsg);
                }

                short lv       = MathUtils.Subtraction(bossGeneral.Lv, bossprizeLv, (short)1);
                int   killCoin = lv * killbossrate;
                user.GameCoin = MathUtils.Addition(user.GameCoin, killCoin, int.MaxValue);
                // new CacheChat().SystemSend(ChatType.World, string.Format("{0}玩家获得公会Boss战击杀奖,奖励{1}金币", user.NickName, killCoin));
                new TjxChatService(user).SystemGuildSend(ChatType.Guild,
                                                         string.Format(LanguageManager.GetLang().St6105_CombatKillReward, user.NickName, killCoin));
                bossCombatProcess.KillGameCoin = killCoin;

                DoKillPrize();


                int tempMinute = gameActive.Minutes - ConfigEnvSet.GetInt("BossCombat.KillTime");
                int subSeconds = (int)new TimeSpan(0, tempMinute, 0).TotalSeconds;
                if (subSeconds - guild.ColdTime < 0)
                {
                    //Boss自动升级
                    guild.GuildBossInfo.UpdateNotify(obj =>
                    {
                        guild.GuildBossInfo.BossLv = MathUtils.Addition(guild.GuildBossInfo.BossLv, (short)1, short.MaxValue);
                        return(true);
                    });
                    //guild.Update();
                }
                guild.CombatStatus = CombatStatus.Killed;
                CombatHelper.UpdateGuildBossKill(guild.GuildID); //公会boss已被杀
            }
            else
            {
                bossUser.IsRelive        = true;
                bossUser.ReliveBeginDate = DateTime.Now;
            }
            //日志
            var log = new UserCombatLog
            {
                CombatLogID   = Guid.NewGuid().ToString(),
                UserID        = user.UserID,
                CityID        = user.CityID,
                PlotID        = gameActive == null ? 0 : gameActive.BossPlotID,
                NpcID         = bossGeneral.GeneralID,
                CombatType    = CombatType.BossPlot,
                HostileUser   = string.Empty,
                IsWin         = isWin,
                CombatProcess = JsonUtils.Serialize(bossCombatProcess),
                CreateDate    = DateTime.Now
            };

            var sender = DataSyncManager.GetDataSender();

            sender.Send(log);

            //user.Update();

            return(isWin);
        }
Esempio n. 26
0
        public static IGeneral Create(SJTPlotEmbattleInfo embattle)
        {
            var monster = new ConfigCacheSet <SJTMonsterInfo>().FindKey(embattle.MonsterID);

            if (monster == null)
            {
                throw new Exception("Plot monster:" + embattle.MonsterID + " is not exist");
            }

            CareerInfo  career    = new ConfigCacheSet <CareerInfo>().FindKey(monster.CareerID);
            AbilityInfo ability   = new ConfigCacheSet <AbilityInfo>().FindKey(monster.AbilityID);
            var         abilityLv = new ConfigCacheSet <AbilityLvInfo>().FindKey(monster.AbilityLv);

            if (career == null || ability == null || abilityLv == null)
            {
                throw new Exception("career or ability or AbilityLv is null.");
            }

            CombatGeneral general = new CombatGeneral()
            {
                UserID      = null,
                Position    = embattle.GridSeqNo,
                GeneralID   = embattle.MonsterID,
                GeneralName = monster.GeneralName,
                HeadID      = monster.HeadID,
                CareerID    = monster.CareerID,
                CareerType  = career.CareerType,
                IsMove      = career.IsMove,
                LifeNum     = monster.LifeNum,
                LifeMaxNum  = monster.LifeNum,
                Lv          = monster.GeneralLv,
                Momentum    = (short)monster.MomentumNum,
                Ability     = ability,
                IsAttrMove  = ability.IsMove,
                BaojiNum    = monster.BaojiNum,
                BishaNum    = monster.BishaNum,
                RenxingNum  = monster.RenxingNum,
                HitNum      =
                    monster.HitNum == 0
                        ? ConfigEnvSet.GetDecimal("Combat.HitiNum")
                        : monster.HitNum,
                ShanbiNum      = monster.ShanbiNum,
                GedangNum      = monster.GedangNum,
                PojiNum        = monster.PojiNum,
                BattleStatus   = BattleStatus.Normal,
                PowerNum       = monster.PowerNum,
                SoulNum        = monster.SoulNum,
                IntellectNum   = monster.IntellectNum,
                FixedDamageNum = 0,
                //怪物没有附加属性
                ExtraAttack   = new CombatProperty(),
                ExtraDefense  = new CombatProperty(),
                IsMonster     = true,
                IsWait        = false,
                PhyAttackNum  = monster.PhyAttackNum,
                PhyDefenseNum = monster.PhyDefenseNum,
                MagAttackNum  = monster.MagAttackNum,
                MagDefenseNum = monster.MagDefenseNum,
                AbiAttackNum  = monster.AbiAttackNum,
                AbiDefenseNum = monster.AbiDefenseNum
            };

            general.PhyAttackNum = MathUtils.Addition(general.PhyAttackNum,
                                                      (general.PhyAttackNum * abilityLv.EffectValue)).ToInt();
            general.PhyDefenseNum = MathUtils.Addition(general.PhyDefenseNum,
                                                       (general.PhyDefenseNum * abilityLv.EffectValue)).ToInt();
            general.MagAttackNum = MathUtils.Addition(general.MagAttackNum,
                                                      (general.MagAttackNum * abilityLv.EffectValue)).ToInt();
            general.MagDefenseNum = MathUtils.Addition(general.MagDefenseNum,
                                                       (general.MagDefenseNum * abilityLv.EffectValue)).ToInt();
            general.AbiAttackNum = MathUtils.Addition(general.AbiAttackNum,
                                                      (general.AbiAttackNum * abilityLv.EffectValue)).ToInt();
            general.AbiDefenseNum = MathUtils.Addition(general.AbiDefenseNum,
                                                       (general.AbiDefenseNum * abilityLv.EffectValue)).ToInt();
            return(general);
        }
Esempio n. 27
0
 public CombatPhysicalAttack(CombatGeneral general)
     : base(general)
 {
 }
Esempio n. 28
0
        public static IGeneral Create(SJTPlotEmbattleInfo embattle, double difficultNum)
        {
            SJTMonsterInfo monster = new ShareCacheStruct <SJTMonsterInfo>().FindKey(embattle.MonsterID);

            if (monster == null)
            {
                throw new Exception("Plot monster:" + embattle.MonsterID + " is not exist");
            }

            CareerInfo  career  = new ShareCacheStruct <CareerInfo>().FindKey(monster.CareerID);
            AbilityInfo ability = new ShareCacheStruct <AbilityInfo>().FindKey(monster.AbilityID);

            if (career == null || ability == null)
            {
                throw new Exception("career or ability is null.");
            }
            CombatGeneral general = new CombatGeneral()
            {
                UserID      = null,
                Position    = embattle.GridSeqNo,
                GeneralID   = embattle.MonsterID,
                GeneralName = monster.GeneralName,
                HeadID      = monster.HeadID,
                CareerID    = monster.CareerID,
                CareerType  = career.CareerType,
                IsMove      = career.IsMove,
                LifeNum     = monster.LifeNum,
                LifeMaxNum  = monster.LifeNum,
                Lv          = monster.GeneralLv,
                Momentum    = (short)monster.MomentumNum,
                Ability     = ability,
                IsAttrMove  = ability.IsMove,
                BaojiNum    = monster.BaojiNum,
                BishaNum    = monster.BishaNum,
                RenxingNum  = monster.RenxingNum,
                HitNum      =
                    monster.HitNum == 0
                        ? ConfigEnvSet.GetDecimal("Combat.HitiNum")
                        : monster.HitNum,
                ShanbiNum    = monster.ShanbiNum,
                GedangNum    = monster.GedangNum,
                PojiNum      = monster.PojiNum,
                BattleStatus = BattleStatus.Normal,
                PowerNum     = monster.PowerNum,
                SoulNum      = monster.SoulNum,
                IntellectNum = monster.IntellectNum,
                //todo 圣吉塔怪物表未配置固定伤害值
                FixedDamageNum = 1, //monster.DamageNum,
                //怪物没有附加属性
                ExtraAttack   = new CombatProperty(),
                ExtraDefense  = new CombatProperty(),
                IsMonster     = true,
                IsWait        = false,
                PhyAttackNum  = (monster.PhyAttackNum * difficultNum).ToInt(),
                PhyDefenseNum = (monster.PhyDefenseNum * difficultNum).ToInt(),
                MagAttackNum  = (monster.MagAttackNum * difficultNum).ToInt(),
                MagDefenseNum = (monster.MagDefenseNum * difficultNum).ToInt(),
                AbiAttackNum  = (monster.AbiAttackNum * difficultNum).ToInt(),
                AbiDefenseNum = (monster.AbiDefenseNum * difficultNum).ToInt()
            };

            return(general);
        }