/// <summary> /// 攻打城门 /// </summary> /// <param name="moves"></param> /// <param name="attackrole"></param> /// <param name="fight"></param> private void AttackDoorFight(WarMovesVo moves, AttackRoles attackrole, WarFight fight) { if (fight.Door.SoldierCount == 0) { return; } var type = GetHurt(attackrole, fight.Door); if (fight.Door.SoldierCount <= 0) { fight.Door.SoldierCount = 0; for (int i = 0; i < fight.AttackRoles.Count; i++) { fight.AttackRoles[i].AttackRange = Common.GetInstance().Sacked(attackrole.X, attackrole.Y); if (fight.AttackRoles[i].isFightDoor) { fight.AttackRoles[i].isFightDoor = false; } } } var rolevo = AddNewRoleVo(attackrole, moves); WarFightRoleVoAddEffect(rolevo, fight.Door.RoleId, (int)EffectFaceTo.Rival, type, attackrole.SoldierCount, fight.Door.SoldierCount, 0, 0, 0); //防守武将回归 DefenseRolesBack(fight, moves); }
/// <summary> /// 进攻武将攻打防守武将 /// </summary> /// <param name="moves"></param> /// <param name="attackrole"></param> /// <param name="denfenserole"></param> /// <param name="fight"></param> private void AttackRolesFight(AttackRoles attackrole, WarMovesVo moves, DefenseRoles denfenserole, WarFight fight) { try { var condition = new List <int>(); var rolevo = AddNewRoleVo(attackrole, moves); //是否出发地形地形效果 // var isArea = CheckArea(defrole, fight, attrole, rolevo); if (attackrole.isFirstAttack) { condition.Add((int)WarFightCondition.FirstAttack); } condition.Add((int)WarFightCondition.Attack); CheckAttackRoleSkill(attackrole, condition, fight, denfenserole, rolevo, WarFightSkillType.Character); CheckAttackRoleSkill(attackrole, condition, fight, denfenserole, rolevo, WarFightSkillType.NinjaSkill); CheckAttackRoleSkill(attackrole, condition, fight, denfenserole, rolevo, WarFightSkillType.NinjaMystery); if (CheckAttackRoleSkill(attackrole, condition, fight, denfenserole, rolevo, WarFightSkillType.Skill)) //秘技释放以后气力值清零 { attackrole.qili = 0; } CheckAttackRoleSkill(attackrole, condition, fight, denfenserole, rolevo, WarFightSkillType.Katha); AttackRoleAttack(attackrole, denfenserole, rolevo); CheckDefenseRoleBlood(denfenserole, fight); } catch (Exception e) { XTrace.WriteLine("进攻武将技能出错{0}", e.Message); throw; } }
/// <summary> /// 进攻武将加入到回合中 /// </summary> /// <param name="role">进攻武将</param> /// <param name="moves">回合数据</param> /// <returns></returns> private WarFightRoleVo AddNewRoleVo(AttackRoles role, WarMovesVo moves) { var vo = moves.roles.FirstOrDefault(q => q.roleId == role.RoleId); if (vo == null) { vo = EntityToRoleVo(role); moves.roles.Add(vo); } return(vo); }
/// <summary> /// 生成天气和五常 /// </summary> /// <param name="fight"></param> /// <param name="vo"></param> /// <param name="times"></param> private void GetWeatherAndFive(WarFight fight, WarMovesVo vo, int times) { //回合开始 ,初始天气和五常 fight.Times = times; fight.Weather = GetWeather(fight.Weather, times, fight.WeatherState); fight.FiveSharp = GetFive(fight.FiveSharp, times, fight.FiveState); vo.times = times; vo.weather = fight.Weather; vo.fiveSharp = fight.FiveSharp; #if DEBUG XTrace.WriteLine("天气:{0},五常{1}", vo.weather, vo.fiveSharp); #endif }
/// <summary> /// 验证武将是否需要攻击 /// </summary> /// <param name="fight"></param> /// <param name="rid"></param> /// <param name="moves"></param> /// <returns>1.是否需要攻击 2.是否战斗结束</returns> private bool CheckIsAttack(WarFight fight, Int64 rid, WarMovesVo moves) { var attackrole = fight.AttackRoles.FirstOrDefault(q => q.RoleId == rid); if (attackrole == null) { return(false); } if (attackrole.isFightDoor) //是否攻打城门 { AttackDoorFight(moves, attackrole, fight); return(true);; } if (attackrole.isFightCity) //是否攻打本丸 { if (AttackHomeFight(moves, attackrole, fight)) { return(true); } } //验证进攻武将攻击范围内是否有防守武将 var defrole = CheckIsDefenseRole(GetDefenseRoles(fight.DefenseRoles), attackrole, fight.Door, fight.City); if (defrole != null) //有防守武将 { if (defrole.type == (int)WarFightRoleType.武将) { AttackRolesFight(attackrole, moves, defrole, fight); } if (attackrole.isFightDoor) //是否攻打城门 { AttackDoorFight(moves, attackrole, fight); } if (attackrole.isFightCity) //是否攻打本丸 { AttackHomeFight(moves, attackrole, fight); } return(true); } return(false); }
/// <summary> /// 攻打本丸 /// </summary> /// <param name="moves"></param> /// <param name="attackrole"></param> /// <param name="fight"></param> private bool AttackHomeFight(WarMovesVo moves, AttackRoles attackrole, WarFight fight) { if (fight.City.SoldierCount == 0) { return(true); } var type = GetHurt(attackrole, fight.City); if (fight.City.SoldierCount < 0) { fight.City.SoldierCount = 0; return(true); } var rolevo = AddNewRoleVo(attackrole, moves); WarFightRoleVoAddEffect(rolevo, fight.City.RoleId, (int)EffectFaceTo.Rival, type, attackrole.SoldierCount, fight.City.SoldierCount, 0, 0, 0); return(false); }
/// <summary> /// 进攻武将战斗验证 /// </summary> /// <param name="fight">战斗实体</param> /// <param name="rid">防守武将id</param> /// <param name="moves">回合实体</param> /// <returns>1:战斗返回结果 2:是否战斗结束 true结束</returns> private Tuple <int, bool> CheckAttackRole(WarFight fight, Int64 rid, WarMovesVo moves) { var attackrole = fight.AttackRoles.FirstOrDefault(q => q.RoleId == rid); if (attackrole == null) { return(Tuple.Create(-1, false)); } GetAttackRoleMoraleAndQili(attackrole); var tuple = CheckIsAttack(fight, rid, moves); if (!tuple) //没有防守武将 { if (RolesMove(moves, fight, rid)) //武将移动成功 { if (fight.City.SoldierCount == 0) { return(Tuple.Create((int)ResultType.SUCCESS, true)); } //验证是否有伏兵 var darkroles = CheckDarkRole(fight.DefenseRoles.Where(q => q.type == 4 && q.isShow == false).ToList(), attackrole, fight.DefenseRange.Where(q => q.type == 4).ToList()); foreach (var darkrole in darkroles) { var isend = DefenseRolesFight(darkrole, moves, attackrole, fight); if (isend) { return(Tuple.Create((int)ResultType.SUCCESS, true)); } } } } else { if (fight.City.SoldierCount == 0) { return(Tuple.Create((int)ResultType.SUCCESS, true)); } } return(Tuple.Create((int)ResultType.SUCCESS, false)); }
/// <summary> /// 防守武将攻打进攻武将 /// </summary> /// <param name="defrole"></param> /// <param name="moves"></param> /// <param name="attrole"></param> /// <param name="fight"></param> private bool DefenseRolesFight(DefenseRoles defrole, WarMovesVo moves, AttackRoles attrole, WarFight fight) { try { if (defrole.SoldierCount <= 0 || attrole.SoldierCount <= 0) { return(false); } var condition = new List <int>(); var rolevo = AddNewRoleVo(defrole, moves); if (defrole.type == (int)WarFightRoleType.伏兵) //伏兵 { condition.Add((int)WarFightCondition.DarkRoleFirstAttack); WarFightRoleVoAddEffect(rolevo, defrole.RoleId, (int)EffectFaceTo.Me, (int)WarFightEffectVoType.伏兵, attrole.SoldierCount, defrole.SoldierCount, 0, 0, 0); defrole.isShow = true; } //是否出发地形地形效果 var isArea = CheckArea(defrole, fight, attrole, rolevo); if (defrole.isFirstAttack) { condition.Add((int)WarFightCondition.FirstAttack); } condition.Add((int)WarFightCondition.Attack); CheckSkill(defrole, condition, fight, attrole, rolevo, WarFightSkillType.Character); CheckSkill(defrole, condition, fight, attrole, rolevo, WarFightSkillType.NinjaSkill); CheckSkill(defrole, condition, fight, attrole, rolevo, WarFightSkillType.NinjaMystery); CheckSkill(defrole, condition, fight, attrole, rolevo, WarFightSkillType.Skill); CheckSkill(defrole, condition, fight, attrole, rolevo, WarFightSkillType.Katha); //最后进攻 DefenseRoleAttack(defrole, attrole, rolevo); var isend = CheckAttackRoleBlood(attrole, fight); return(isend); } catch (Exception e) { XTrace.WriteLine(e.Message); return(false); } }
/// <summary> /// 防守武将战斗验证 /// </summary> /// <param name="fight">战斗实体</param> /// <param name="rid">防守武将id</param> /// <param name="moves">回合实体</param> /// <returns>1:战斗返回结果 2:是否战斗结束</returns> private Tuple <int, bool> CheckDefenseRole(WarFight fight, Int64 rid, WarMovesVo moves) { var defenserole = fight.DefenseRoles.FirstOrDefault(q => q.RoleId == rid); if (defenserole == null) { return(Tuple.Create(-1, false)); } if (defenserole.type == (int)WarFightRoleType.伏兵) { return(Tuple.Create((int)ResultType.SUCCESS, false)); } //士气和气力值改变 GetDefenseRoleMoraleAndQili(defenserole); //验证本回合是否静止 if (defenserole.stoptimes != null && defenserole.stoptimes.Contains(moves.times)) { return(Tuple.Create((int)ResultType.SUCCESS, false)); } var defenserange = fight.DefenseRange.Where(q => q.RoleId == rid).ToList(); //验证防守范围内是否有武将 var attrole = CheckIsAttackRole(defenserange, fight.AttackRoles); if (attrole == null) { return(Tuple.Create((int)ResultType.SUCCESS, false)); } #if DEBUG DisplayGlobal.log.Write(string.Format("武将{0}攻击武将{1}", rid, attrole.RoleId)); DisplayGlobal.log.Write(string.Format("武将{0}被攻击前血量{1}", attrole.RoleId, attrole.SoldierCount)); #endif var isend = DefenseRolesFight(defenserole, moves, attrole, fight); return(isend ? Tuple.Create((int)ResultType.SUCCESS, true) : Tuple.Create((int)ResultType.SUCCESS, false)); }
/// <summary> /// 武将buff添加 /// </summary> /// <param name="fight"></param> /// <param name="times"></param> private void GetRoleBuff(WarFight fight, WarMovesVo times) { times.buffs = new List <WarBuffVo>(); foreach (var defenserole in fight.DefenseRoles) { if (defenserole.buffs == null || !defenserole.buffs.Any()) { continue; } defenserole.buffs.RemoveAll(q => q.times <= 1); var rid = defenserole.RoleId; times.buffs.AddRange(defenserole.buffs.Where(q => q.usertype != (int)WarFightSkillType.Area).Select(q => new WarBuffVo() { type = q.type, value = q.value, rid = rid })); } foreach (var attrole in fight.AttackRoles) { if (attrole.buffs == null || !attrole.buffs.Any()) { continue; } attrole.buffs.RemoveAll(q => q.times <= 1); var rid = attrole.RoleId; times.buffs.AddRange(attrole.buffs.Where(q => q.usertype != (int)WarFightSkillType.Area).Select(q => new WarBuffVo() { type = q.type, value = q.value, rid = rid })); } }
/// <summary> /// 空闲武将回归本丸 /// </summary> /// <param name="fight"></param> private void DefenseRolesBack(WarFight fight, WarMovesVo moves) { if (!fight.DefenseRoles.Any()) { return; } for (int i = 0; i < fight.DefenseRoles.Count; i++) { if (fight.DefenseRoles[i].SoldierCount <= 0) { continue; } //已经在回归位置 if ((fight.DefenseRoles[i].X == 1 && fight.DefenseRoles[i].Y == 4) || (fight.DefenseRoles[i].X == 1 && fight.DefenseRoles[i].Y == 3) || (fight.DefenseRoles[i].X == 1 && fight.DefenseRoles[i].Y == 5) || (fight.DefenseRoles[i].X == 0 && fight.DefenseRoles[i].Y == 3) || (fight.DefenseRoles[i].X == 0 && fight.DefenseRoles[i].Y == 5)) { continue; } #region 回归本丸 if (!fight.DefenseRoles.Any(q => q.X == 1 && q.Y == 3) && !fight.AttackRoles.Any(q => q.X == 1 && q.Y == 3)) { fight.DefenseRoles[i].X = 1; fight.DefenseRoles[i].Y = 3; fight.DefenseRoles[i].buffs.Add(new WarFightSkillBuff() { type = (int)WarFightEffectType.StopAction, times = 2 }); //fight.DefenseRoles[i].type = (int)WarFightRoleType.武将; var rolevo = AddNewRoleVo(fight.DefenseRoles[i], moves); WarFightRoleVoAddEffect(rolevo, fight.DefenseRoles[i].RoleId, (int)EffectFaceTo.Me, (int)WarFightEffectVoType.伏兵, fight.DefenseRoles[i].SoldierCount, 0, 0, 0, 0); continue; } if (!fight.DefenseRoles.Any(q => q.X == 1 && q.Y == 4) && !fight.AttackRoles.Any(q => q.X == 1 && q.Y == 4)) { fight.DefenseRoles[i].X = 1; fight.DefenseRoles[i].Y = 4; fight.DefenseRoles[i].buffs.Add(new WarFightSkillBuff() { type = (int)WarFightEffectType.StopAction, times = 2 }); //fight.DefenseRoles[i].type = (int)WarFightRoleType.武将; fight.DefenseRoles[i].isShow = true; var rolevo = AddNewRoleVo(fight.DefenseRoles[i], moves); WarFightRoleVoAddEffect(rolevo, fight.DefenseRoles[i].RoleId, (int)EffectFaceTo.Me, (int)WarFightEffectVoType.伏兵, fight.DefenseRoles[i].SoldierCount, 0, 0, 0, 0); continue; } if (!fight.DefenseRoles.Any(q => q.X == 1 && q.Y == 5) && !fight.AttackRoles.Any(q => q.X == 1 && q.Y == 5)) { fight.DefenseRoles[i].X = 1; fight.DefenseRoles[i].Y = 5; fight.DefenseRoles[i].buffs.Add(new WarFightSkillBuff() { type = (int)WarFightEffectType.StopAction, times = 2 }); // fight.DefenseRoles[i].type = (int)WarFightRoleType.武将; fight.DefenseRoles[i].isShow = true; var rolevo = AddNewRoleVo(fight.DefenseRoles[i], moves); WarFightRoleVoAddEffect(rolevo, fight.DefenseRoles[i].RoleId, (int)EffectFaceTo.Me, (int)WarFightEffectVoType.伏兵, fight.DefenseRoles[i].SoldierCount, 0, 0, 0, 0); continue; } if (!fight.DefenseRoles.Any(q => q.X == 0 && q.Y == 3) && !fight.AttackRoles.Any(q => q.X == 0 && q.Y == 3)) { fight.DefenseRoles[i].X = 0; fight.DefenseRoles[i].Y = 3; fight.DefenseRoles[i].buffs.Add(new WarFightSkillBuff() { type = (int)WarFightEffectType.StopAction, times = 2 }); // fight.DefenseRoles[i].type = (int)WarFightRoleType.武将; fight.DefenseRoles[i].isShow = true; var rolevo = AddNewRoleVo(fight.DefenseRoles[i], moves); WarFightRoleVoAddEffect(rolevo, fight.DefenseRoles[i].RoleId, (int)EffectFaceTo.Me, (int)WarFightEffectVoType.伏兵, fight.DefenseRoles[i].SoldierCount, 0, 0, 0, 0); continue; } if (!fight.DefenseRoles.Any(q => q.X == 0 && q.Y == 5) && !fight.AttackRoles.Any(q => q.X == 0 && q.Y == 5)) { fight.DefenseRoles[i].X = 0; fight.DefenseRoles[i].Y = 5; fight.DefenseRoles[i].buffs.Add(new WarFightSkillBuff() { type = (int)WarFightEffectType.StopAction, times = 2 }); //fight.DefenseRoles[i].type = (int)WarFightRoleType.武将; fight.DefenseRoles[i].isShow = true; var rolevo = AddNewRoleVo(fight.DefenseRoles[i], moves); WarFightRoleVoAddEffect(rolevo, fight.DefenseRoles[i].RoleId, (int)EffectFaceTo.Me, (int)WarFightEffectVoType.伏兵, fight.DefenseRoles[i].SoldierCount, 0, 0, 0, 0); continue; } #endregion fight.DefenseRange.RemoveAll(q => q.RoleId == fight.DefenseRoles[i].RoleId); } //防守范围重新初始 fight.DefenseRange = Common.GetInstance().GetDefenseRangeInit(fight.DefenseRoles); }
private void RemoveNewRoleVo(Int64 rid, WarMovesVo moves) { var vo = moves.roles.FirstOrDefault(q => q.roleId == rid); moves.roles.Remove(vo); }
/// <summary> /// 进攻武将移动 /// </summary> /// <param name="moves">回合</param> /// <param name="fight">合战实体</param> /// <param name="rid">武将id</param> private bool RolesMove(WarMovesVo moves, WarFight fight, Int64 rid) { var role = fight.AttackRoles.FirstOrDefault(q => q.RoleId == rid); if (role == null) { return(false); } var attackrole = fight.AttackRoles; var defenseRoles = fight.DefenseRoles; #if DEBUG XTrace.WriteLine("buff:{0}", role.buffs.Count); #endif if (role.buffs.Any(q => q.type == (int)WarFightEffectType.StopAction)) { return(false); } var rolevo = AddNewRoleVo(role, moves); if (rolevo.lines == null) { rolevo.lines = new List <PointVo>(); } for (var i = 1; i <= role.speed; i++) { var p = role.Index + 1; if (p > role.Lines.Count - 1) { return(false); } var r_x = role.Lines[p].x; var r_y = role.Lines[p].y; //该位置是否有其他进攻武将 var c_1 = attackrole.Any(q => q.SoldierCount > 0 && q.X == r_x && q.Y == r_y); #if DEBUG XTrace.WriteLine("role:{4} p:{0} x:{1} y:{2} c:{3}", p, r_x, r_y, c_1, role.RoleId); #endif if (c_1) { RemoveNewRoleVo(rid, moves); return(false); } //该位置是否有其他武将 var c_2 = defenseRoles.Any(q => q.SoldierCount > 0 && q.X == r_x && q.Y == r_y); if (c_2) { return(false); } //不能移动到本丸 if (r_x == 0 && r_y == 4) { RemoveNewRoleVo(rid, moves); return(false); } rolevo.lines.Add(new PointVo() { x = r_x, y = r_y, }); role.Index++; role.X = r_x; role.Y = r_y; //进攻城门或者城门已破 进攻范围变为1格 if (role.isFightDoor || fight.Door.SoldierCount == 0) { role.AttackRange = Common.GetInstance().Sacked(role.X, role.Y); } else { role.AttackRange = Common.GetInstance().GetAttackRangeInit(role.SoldierId, role.X, role.Y); } var isattack = CheckIsAttack(fight, rid, moves); if (isattack) { return(true); } } return(true); }
/// <summary> /// 通过战斗模型得到战斗过程 /// </summary> /// <returns></returns> public Tuple <int, WarFightVo> GetFightProcess(WarFight fight) { WarFightVo vo = new WarFightVo(); vo.moves = new List <WarMovesVo>(); vo.result = new WarFightResultVo(); //初始武将 GetFightRoles(fight, vo); //回合开始 for (int i = 1; i < 51; i++) { #if DEBUG XTrace.WriteLine("--------- 回合数:{0}", i); #endif var times = new WarMovesVo(); times.roles = new List <WarFightRoleVo>(); GetRoleBuff(fight, times); //天气和五常生成 GetWeatherAndFive(fight, times, i); GetDarkRoleShow(fight.DefenseRoles); //循环武将 for (var j = 0; j < fight.AttackSort.Count; j++) { #if DEBUG var t = vo.roles.Where(m => m.roleId == fight.AttackSort[j].RoleId).FirstOrDefault(); XTrace.WriteLine("武将id:{0} name:{4} 攻击值:{1} x:{2} y:{3}", t.baseId, t.blood, t.point.x, t.point.y, t.roleName ); #endif if (fight.AttackSort[j].isDie) { continue; } if (fight.AttackSort[j].type == 2) //防守武将 { var tuple = CheckDefenseRole(fight, fight.AttackSort[j].RoleId, times); if (tuple.Item1 < 0) { return(null); } if (tuple.Item2) { vo.moves.Add(times); var defensedie = fight.DefenseSoldierCount - fight.DefenseRoles.Sum(q => q.SoldierCount); var attackdie = fight.AttackSoldierCount - fight.AttackRoles.Sum(q => q.SoldierCount); RolesCountUpdate(fight.DefenseRoles, fight.AttackRoles); vo.result.myDieCount = attackdie; vo.result.rivalDieCount = defensedie; if (fight.City.SoldierCount <= 0) { vo.result.isWin = 1; } return(Tuple.Create((int)ResultType.SUCCESS, vo)); } } else { var tuple = CheckAttackRole(fight, fight.AttackSort[j].RoleId, times); if (tuple.Item1 < 0) { return(null); } if (tuple.Item2) { vo.moves.Add(times); var defensedie1 = fight.DefenseSoldierCount - fight.DefenseRoles.Sum(q => q.SoldierCount); var attackdie1 = fight.AttackSoldierCount - fight.AttackRoles.Sum(q => q.SoldierCount); RolesCountUpdate(fight.DefenseRoles, fight.AttackRoles); if (fight.City.SoldierCount <= 0) { vo.result.isWin = 1; } vo.result.myDieCount = attackdie1; vo.result.rivalDieCount = defensedie1; return(Tuple.Create((int)ResultType.SUCCESS, vo)); } } } vo.moves.Add(times); } vo.result.isWin = 0; var defensedie2 = fight.DefenseSoldierCount - fight.DefenseRoles.Sum(q => q.SoldierCount); var attackdie2 = fight.AttackSoldierCount - fight.AttackRoles.Sum(q => q.SoldierCount); RolesCountUpdate(fight.DefenseRoles, fight.AttackRoles); vo.result.myDieCount = defensedie2; vo.result.rivalDieCount = attackdie2; return(Tuple.Create((int)ResultType.SUCCESS, vo)); }