/// <summary> /// 检测进攻武将,武将特性是否触发 /// </summary> /// <returns></returns> private bool CheckAttackRoleSkill(AttackRoles role, List <int> nowcondition, WarFight fight, DefenseRoles defenserole, WarFightRoleVo rolevo, WarFightSkillType type) { var skills = role.skills.Where(q => q.type == type).ToList(); foreach (var skill in skills) { var ismatch = CheckAttackRoleCondition(role, nowcondition, fight, defenserole, skill); if (!ismatch) { continue; } if (type == WarFightSkillType.Katha && role.buffs.Any(q => q.type == (int)WarFightEffectType.StartKatha) && role.buffs.All(q => q.type != (int)WarFightEffectType.StopKatha)) //是否立即释放奥义 { AttackRoleEffectsAdd(role, skill.FightSkillEffects, defenserole, rolevo, (int)type); return(true); } AttackRoleEffectsAdd(role, skill.FightSkillEffects, defenserole, rolevo, (int)type); if (type == WarFightSkillType.Skill) //气力清零 { role.qili -= 0; } return(true); } return(false); }
/// <summary> /// 验证是否出发地形效果 /// </summary> /// <param name="fight"></param> /// <param name="attackrole"></param> /// <param name="rolevo"></param> /// <param name="role"></param> /// <returns></returns> private bool CheckArea(DefenseRoles role, WarFight fight, AttackRoles attackrole, WarFightRoleVo rolevo) { var type = (int)WarFightSkillType.Area; var area = fight.Area.FirstOrDefault(q => q.X == role.X && q.Y == role.Y); if (area == null) { return(false); } var effectstring = fight.Weather == (int)WeatherType.Rain ? area.raineffect : area.suneffect; if (effectstring == "") { return(false); } var effects = WarSkillEffect.GetEffectStringInit(effectstring, true); if (area.type == (int)AreaType.陷阱) { type = (int)WarFightSkillType.Trap; } DefenseRoleEffectsAdd(role, effects, attackrole, rolevo, type); fight.Area.Remove(area); return(true); }
/// <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="planid"></param> /// <param name="lines"></param> /// <param name="attackroles"></param> /// <param name="attackUserId"></param> /// <param name="cityid"></param> /// <param name="frontid"></param> /// <param name="morale"></param> /// <returns></returns> public Tuple <int, WarFightVo> GetFightProcess(Int64 planid, List <WarRolesLinesVo> lines, List <tg_war_role> attackroles, Int64 attackUserId, Int32 cityid, Int32 frontid, int morale, string username) { WarFight fight = new WarFight(planid, lines, attackroles, attackUserId, cityid, frontid, morale); if (!fight.isInitSuccess) { return(null); } return(GetFightProcess(fight)); }
/// <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="role">防守武将实体</param> /// <param name="fight">战斗实体</param> /// <returns></returns> private bool CheckDefenseRoleBlood(DefenseRoles role, WarFight fight) { if (role.SoldierCount <= 0) { role.SoldierCount = 0; //lock (this) //{ // fight.DefenseRoles.Remove(role); //} fight.AttackSort.FirstOrDefault(q => q.RoleId == role.RoleId).isDie = true; //tg_war_role.UpdateRoleSoldierCount(0, role.RoleId); } return(false); }
/// <summary> /// 验证进攻武将是否死亡 /// </summary> /// <param name="role">进攻武将实体</param> /// <param name="fight">战斗实体</param> /// <returns></returns> private bool CheckAttackRoleBlood(AttackRoles role, WarFight fight) { if (role.SoldierCount <= 0) { role.SoldierCount = 0; //lock (this) //{ // fight.AttackRoles.Remove(role); //} fight.AttackSort.FirstOrDefault(q => q.RoleId == role.RoleId).isDie = true; } if (fight.AttackRoles.All(q => q.SoldierCount == 0)) { return(true); } 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="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"></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> /// 武将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> /// <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> /// 进攻武将移动 /// </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)); }
/// <summary> /// 防守武将技能释放条件验证 /// </summary> /// <param name="role">防守武将</param> /// <param name="nowcondition"></param> /// <param name="fight"></param> /// <param name="attrole"></param> /// <param name="conditions"></param> /// <returns></returns> private bool CheckDefenseRoleCondition(DefenseRoles role, List <int> nowcondition, WarFight fight, AttackRoles attrole, List <string> conditions) { var ismatch = true; foreach (var item in conditions) { var condition = Convert.ToInt32(item); #region 技能条件验证 switch (condition) { case (int)WarFightCondition.Attack: if (nowcondition.Contains(condition)) { ismatch = false; } break; case (int)WarFightCondition.Rain: { if (fight.Weather != condition) { ismatch = false; } } break; case (int)WarFightCondition.Attacked: { if (nowcondition.Contains(condition)) { ismatch = false; } } break; case (int)WarFightCondition.FirstAttack: { if (nowcondition.Contains(condition)) { ismatch = false; } } break; case (int)WarFightCondition.DarkRoleFirstAttack: { if (nowcondition.Contains(condition)) { ismatch = false; } } break; case (int)WarFightCondition.FiveSame: { if (fight.FiveSharp != condition) { ismatch = false; } } break; case (int)WarFightCondition.SkillAttack: { if (nowcondition.Contains(condition)) { ismatch = false; } } break; // case (int)WarFightCondition.BloodLess: { if (role.SoldierCount > skill.effectBaseInfo.)ismatch = false; } break; case (int)WarFightCondition.CharmLessMe: { if (role.Role.base_charm < attrole.Role.base_charm) { ismatch = false; } } break; case (int)WarFightCondition.ForceLessMe: { if (role.Role.base_force < attrole.Role.base_force) { ismatch = false; } } break; case (int)WarFightCondition.BrainLessMe: { if (role.Role.base_brains < attrole.Role.base_brains) { ismatch = false; } } break; case (int)WarFightCondition.AreaSlope: { if (!fight.Area.Any(q => q.type == (int)AreaType.高坡 && q.X == role.X && role.Y == q.Y)) { ismatch = false; } } break; case (int)WarFightCondition.AreaRiver: { if (!fight.Area.Any(q => q.type == (int)AreaType.河滩 && q.X == role.X && role.Y == q.Y)) { ismatch = false; } } break; case (int)WarFightCondition.AreaSwamp: { if (!fight.Area.Any(q => q.type == (int)AreaType.沼泽 && q.X == role.X && role.Y == q.Y)) { ismatch = false; } } break; case (int)WarFightCondition.AreaForest: { if (!fight.Area.Any(q => q.type == (int)AreaType.密林 && q.X == role.X && role.Y == q.Y)) { ismatch = false; } } break; case (int)WarFightCondition.FancyAttack: { if (nowcondition.Contains(condition)) { ismatch = false; } } break; } #endregion } return(ismatch); }
/// <summary> /// 初始合战武将值 /// </summary> /// <param name="fight">战斗实体</param> /// <param name="vo">战斗vo</param> private void GetFightRoles(WarFight fight, WarFightVo vo) { vo.roles = new List <WarFightRoleVo>(); vo.roles.AddRange(fight.AttackRoles.Select(q => new WarFightRoleVo() { roleId = q.RoleId, type = 0, campType = 0, lines = null, effects = null, baseId = q.Role.role_id, blood = q.SoldierCount, roleName = q.roleName, point = new PointVo() { x = q.X, y = q.Y }, armyBaseId = q.SoldierId, })); vo.roles.AddRange(fight.DefenseRoles.Select(q => new WarFightRoleVo() { baseId = q.Role.role_id, roleId = q.RoleId, campType = 1, type = q.type, lines = null, effects = null, isNpc = q.isNpc, blood = q.SoldierCount, point = new PointVo() { x = q.X, y = q.Y }, armyBaseId = q.SoldierId, roleName = q.roleName })); vo.roles.Add(new WarFightRoleVo() { roleId = fight.Door.RoleId, campType = 1, type = fight.Door.type, blood = fight.Door.SoldierCount, lines = null, effects = null, point = new PointVo() { x = 2, y = 2 } }); vo.roles.Add(new WarFightRoleVo() { campType = 1, roleId = fight.City.RoleId, type = fight.City.type, blood = fight.City.SoldierCount, lines = null, effects = null, point = new PointVo() { x = 0, y = 4 } }); }
/// <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); }
/// <summary> 合战战斗 </summary> public ASObject CommandStart(TGGSession session, ASObject data) { if (!data.ContainsKey("frontId") || !data.ContainsKey("cityid") || !data.ContainsKey("type")) { return(null); } var userid = session.Player.User.id; var username = session.Player.User.player_name; var user = session.Player.User.CloneEntity(); // var roles = data.FirstOrDefault(m => m.Key == "roles").Value as List<ASObject>; //测试模拟数据 // var roles = data.FirstOrDefault(m => m.Key == "roles").Value as object[]; var sendfrontid = data.FirstOrDefault(m => m.Key == "frontId").Value.ToString(); var baseid = Convert.ToInt32(data.FirstOrDefault(m => m.Key == "cityid").Value); var type = Convert.ToInt32(data.FirstOrDefault(m => m.Key == "type").Value); Int32 frontid; Int32.TryParse(sendfrontid, out frontid); var lines = GetSendRoles(type, user.id); //验证武将 var tuple = CheckRoles(lines); if (!tuple.Item1) { return(null); } if (!Variable.FightPlan.ContainsKey(userid)) { return(null); } var value = Variable.FightPlan[userid]; var splitstring = value.Split("_"); var planid = Convert.ToInt64(splitstring[3]); //npc城攻打时为防守地形基表id var defenseuserid = Convert.ToInt64(splitstring[2]); if (type == 0) { var queueid = Convert.ToInt64(splitstring[0]); //出征队列 var queue = tg_war_battle_queue.FindByid(queueid); if (queue == null || frontid == 0 || !lines.Any()) { return(null); } var city = tg_war_city.GetEntityByBaseId(queue.end_CityId); //据点处于保护时间内 if (city.guard_time > (DateTime.Now.Ticks - 621355968000000000) / 10000) { return(null); } //验证坐标 if (!Common.GetInstance().CheckPoint(lines, planid)) { return(null); } //得到战斗过程 var fightvo = new FightProcess().GetFightProcess(planid, lines, tuple.Item2, session.Player.User.id, queue.end_CityId, frontid, queue.morale, username); GetFightEnd(session.Player.CloneEntity(), city, defenseuserid, fightvo.Item2, queue); return(BuildData(fightvo.Item2)); } else { var shiqi = Common.GetInstance().GetRule("32112"); var warfightentity = new WarFight(baseid, lines, tuple.Item2, frontid, shiqi, (int)planid, username); var fightvo = new FightProcess().GetFightProcess(warfightentity); //游戏战报 // WarReportInsert(player.User.id, 100043, cityinfo.base_id, defenseuserid, player.User.player_name); return(BuildData(fightvo.Item2)); } }
/// <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="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); } }
//private static WAR_COPY_ATTACK _objInstance; ///// <summary>WAR_COPY_ATTACK单体模式</summary> //public static WAR_COPY_ATTACK GetInstance() //{ // return _objInstance ?? (_objInstance = new WAR_COPY_ATTACK()); //} /// <summary> 出阵 </summary> public ASObject CommandStart(TGGSession session, ASObject data) { var planId = session.Player.War.planId; if (planId == 0) { return(CommonHelper.ErrorResult(ResultType.BASE_TABLE_ERROR)); } var _id = data.ContainsKey("id") ? data["id"] : null; var _zhenId = data.ContainsKey("zhenId") ? data["zhenId"] : null; var _list = data.ContainsKey("list") ? data["list"] : null; if (_id == null || _zhenId == null || _list == null) { return(CommonHelper.ErrorResult(ResultType.FRONT_DATA_ERROR)); } var id = Convert.ToInt32(_id); var zhenId = Convert.ToInt32(_zhenId); var objs = _list as object[]; var list = new List <WarRolesLinesVo>(); var userid = session.Player.User.id; var level = session.Player.Role.Kind.role_level; var username = session.Player.User.player_name; var baseWarCopy = Variable.BASE_WAR_COPY.FirstOrDefault(m => m.id == id); if (baseWarCopy == null) { return(CommonHelper.ErrorResult(ResultType.BASE_TABLE_ERROR)); } if (level < baseWarCopy.level) { return(CommonHelper.ErrorResult(ResultType.WAR_LEVEL_ERROR)); } var warroles = new List <tg_war_role>(); var result = BuildWarRole(objs, userid, ref list, ref warroles); if (result != ResultType.SUCCESS) { return(CommonHelper.ErrorResult(result)); } if (!warroles.Any()) { return(CommonHelper.ErrorResult(ResultType.WAR_COPY_ROLE_ERROR)); } var count = warroles.Sum(m => m.army_soldier); var model = tg_war_copy.GetFindByUserId(userid); var temp = tg_war_copy_count.GetEntityBySceneId(userid, baseWarCopy.sceneId); if (model == null || temp == null) { return(CommonHelper.ErrorResult(ResultType.WAR_COPY_SOLDIER_NULL)); } if (count <= 0) { return(CommonHelper.ErrorResult(ResultType.WAR_COPY_SOLDIER_COUNT_ERROR)); } if (temp.count <= 0) { return(CommonHelper.ErrorResult(ResultType.WAR_COPY_COUNT_ERROR)); } if (model.forces < count) { return(CommonHelper.ErrorResult(ResultType.WAR_COPY_SOLDIER_COUNT_ERROR)); } var entity = new WarFight(planId, baseWarCopy, list, warroles, zhenId, model.morale, username); var fightvo = new FightProcess().GetFightProcess(entity); //调用合战战斗 if (fightvo == null) { return(CommonHelper.ErrorResult(ResultType.WAR_FIGHT_ERROR)); } if (fightvo.Item2.result.isWin == 1) //胜利 { var rewards = GetReward(baseWarCopy.reward); //组装获取奖励 var str = GetReward(rewards); //获取邮件通用奖励字符串 model.score += baseWarCopy.integral; model.latest_time = DateTime.Now.Ticks; var flag = new RandomSingle().IsTrue(baseWarCopy.dropProbability); if (flag) //是否获得筑城令 { var prop = GetProp(baseWarCopy, userid); if (prop != null) { str = str + "|" + (int)GoodsType.TYPE_PROP + "_" + prop.base_id + "_" + prop.bind + "_" + prop.count; rewards.Add(new RewardVo { goodsType = (int)GoodsType.TYPE_PROP, increases = new List <ASObject> { AMFConvert.ToASObject(EntityToVo.ToPropVo(prop)) }, }); } } (new Share.Message()).BuildMessagesSend(userid, "挑战合战副本胜利奖励", "挑战合战副本胜利奖励", str); temp.count -= 1; temp.Update(); fightvo.Item2.result.reward = rewards; } model.forces -= fightvo.Item2.result.myDieCount; if (model.forces < 0) { model.forces = 0; } model.Update(); return(BuildData(fightvo.Item2)); }