/// <summary>
 /// 被动魂技效果
 /// </summary>
 /// <param name="userId"></param>
 /// <returns></returns>
 public static List<SelfAbilityEffect> GetSelfAbilityEffectList(string userId, short role)
 {
     List<SelfAbilityEffect> selfAbilityEffectList = new List<SelfAbilityEffect>();
     var cacheSetUserAbility = new PersonalCacheStruct<UserAbility>();
     var cacheSetUserEmbattle = new PersonalCacheStruct<UserEmbattle>();
     var cacheSetAbilityInfo = new ShareCacheStruct<AbilityInfo>();
     var userAbility = cacheSetUserAbility.FindKey(userId);
     var userMagic = new PersonalCacheStruct<UserMagic>().Find(userId, s => s.IsEnabled);
     if (userAbility != null && userAbility.AbilityList != null)
     {
         var userEmbattleList = cacheSetUserEmbattle.FindAll(userId, s => s.MagicID == userMagic.MagicID);
         userEmbattleList.ForEach(obj =>
         {
             if (obj.GeneralID > 0)
             {
                 var abilityList =
                     userAbility.AbilityList.FindAll(s => s.GeneralID == obj.GeneralID);
                 abilityList.ForEach(ability =>
                 {
                     var abilityInfo = cacheSetAbilityInfo.FindKey(ability.AbilityID);
                     if (abilityInfo != null && abilityInfo.IsActive == 1)
                     {
                         SelfAbilityEffect selfAbilityEffect = new SelfAbilityEffect();
                         selfAbilityEffect.GeneralID = obj.GeneralID;
                         selfAbilityEffect.EffectID1 = abilityInfo.EffectID1;
                         selfAbilityEffect.FntHeadID = abilityInfo.FntHeadID;
                         selfAbilityEffect.IsIncrease = abilityInfo.IsIncrease;
                         selfAbilityEffect.Position = obj.Position;
                         selfAbilityEffect.Role = role;
                         selfAbilityEffectList.Add(selfAbilityEffect);
                     }
                 });
             }
         });
     }
     return selfAbilityEffectList;
 }
Beispiel #2
0
        public bool Doing()
        {
            TList<EmbattleQueue> queueList = GetPriorityQueue();
            if (queueList.Count != 2) return false;
            EmbattleQueue roleA = queueList[0];
            EmbattleQueue roleD = queueList[1];
            //原因:空阵BUG
            if (roleA.GeneralCount == 0 && roleD.GeneralCount == 0)
            {
                new BaseLog().SaveLog("战斗双方佣兵不存在");
                return false;
            }
            if (roleA.Role == EmbattleRole.RoleA)
            {
                if (roleA.GeneralCount > 0 && roleD.GeneralCount == 0)
                {
                    return true;
                }
                if (roleA.GeneralCount == 0 && roleD.GeneralCount > 0)
                {
                    return false;
                }
            }
            else if (roleA.Role == EmbattleRole.RoleD)
            {
                if (roleA.GeneralCount > 0 && roleD.GeneralCount == 0)
                {
                    return false;
                }
                if (roleA.GeneralCount == 0 && roleD.GeneralCount > 0)
                {
                    return true;
                }
            }

            queueList.Foreach(item =>
            {
                var general = (CombatGeneral)item.NextGeneral();

                if (general != null)
                {
                    general.SelfAbilityInfoList.ForEach(SelfAbility =>
                    {
                        SelfAbilityEffect selfAbilityEffect = new SelfAbilityEffect();
                        selfAbilityEffect.GeneralID = general.GeneralID;
                        selfAbilityEffect.EffectID1 = SelfAbility.EffectID1;
                        selfAbilityEffect.FntHeadID = SelfAbility.FntHeadID;
                        selfAbilityEffect.IsIncrease = SelfAbility.IsIncrease;
                        selfAbilityEffect.Position = general.Position;
                        selfAbilityEffect.Role = item.Role.ToShort();
                        processContainer.SelfAbilityEffectList.Add(selfAbilityEffect);
                    });
                }
            });
            //原因:闪避高时死锁
            bool isCombatOut = false;
            int index = 0;
            while (roleA.HasCombat() && roleD.HasCombat())
            {
                if (index >= MaxCount)
                {
                    isCombatOut = true;
                    //防止死锁
                    new BaseLog().SaveLog(string.Format("[{0}]战斗超出最大回合数,判攻方输", _combatType));
                    break;
                }
                //设置重新一轮
                roleA.ResetGeneralQueue();
                roleD.ResetGeneralQueue();

                DoSingle(queueList);

                index++;
            }

            foreach (var item in priorityList)
            {
                if (item.Number > BoutNum) BoutNum = item.Number;
                //恢复血量
                double resumeLife = ConfigEnvSet.GetDouble("Combat.ResumeLifeNum");
                //领土战直接恢复100%
                if (_combatType == CombatType.Country && item.IsOver)
                {
                    resumeLife = 1;
                }

                if ((_combatType == CombatType.Country && item.IsOver) ||
                    (_combatType != CombatType.Country && item.IsOver))
                {
                    if (item.Role == EmbattleRole.RoleA)
                    {
                        DoResumeLife(processContainer.AttackList, resumeLife);
                    }
                    else
                    {
                        DoResumeLife(processContainer.DefenseList, resumeLife);
                    }

                }
            };
            //超出判断攻方输
            if (isCombatOut && roleA.Role == EmbattleRole.RoleA)
            {
                return false;
            }
            if (isCombatOut && roleA.Role == EmbattleRole.RoleD)
            {
                return true;
            }
            return !priorityList.Find(m => m.Role == EmbattleRole.RoleA).IsOver;
        }