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("战斗异常,未能加载佣兵数据"); } }
/// <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++; } }
/// <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()); }
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); }
public void SetDefend(EmbattleQueue combatGrid) { combatGrid.Role = EmbattleRole.RoleD; priorityList.Add(combatGrid); SetEmbattle(combatGrid, processContainer.DefenseList); }
public void SetAttack(EmbattleQueue combatGrid) { combatGrid.Role = EmbattleRole.RoleA; priorityList.Add(combatGrid); SetEmbattle(combatGrid, processContainer.AttackList); }