Пример #1
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("战斗异常,未能加载佣兵数据");
     }
 }
Пример #2
0
        /// <summary>
        /// 处理单轮
        /// </summary>
        private void DoSingle(List <EmbattleQueue> queueList)
        {
            int index = 0;

            while (true)
            {
                if (index >= queueList.Count)
                {
                    index = 0;
                }
                EmbattleQueue item          = queueList[index];
                EmbattleQueue tagetEmbattle = queueList[(index == 0 ? 1 : 0)];

                if (!item.HasGeneral && !tagetEmbattle.HasGeneral)
                {
                    //当前轮双方阵列都打完才结束
                    break;
                }
                if (!tagetEmbattle.HasCombat())
                {
                    //对方阵列是否可战斗,原因:目标为空时,佣兵被跳过
                    break;
                }
                var general = (CombatGeneral)item.NextGeneral();

                if (general != null)
                {
                    CombatCenter combatCenter = new CombatCenter(item.Role, general, tagetEmbattle.Role, targerHandle);
                    if (combatCenter.HasDoing())
                    {
                        var combatLog = combatCenter.GetProcess();
                        if (combatLog != null)
                        {
                            processContainer.ProcessList.Add(combatLog);
                        }
                    }
                    else
                    {
                        TraceLog.ReleaseWriteFatal("General:{0}-{1}佣兵被跳过", general.GeneralName, general.GeneralID);
                        //是否结束
                        break;
                    }
                }
                index++;
            }
        }
Пример #3
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());
        }
Пример #4
0
        public bool Doing()
        {
            List <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);
        }
Пример #5
0
 public void SetDefend(EmbattleQueue combatGrid)
 {
     combatGrid.Role = EmbattleRole.RoleD;
     priorityList.Add(combatGrid);
     SetEmbattle(combatGrid, processContainer.DefenseList);
 }
Пример #6
0
 public void SetAttack(EmbattleQueue combatGrid)
 {
     combatGrid.Role = EmbattleRole.RoleA;
     priorityList.Add(combatGrid);
     SetEmbattle(combatGrid, processContainer.AttackList);
 }