Пример #1
0
        /// <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);
        }
Пример #2
0
        ///  <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);
        }
Пример #3
0
        /// <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);
        }
Пример #4
0
        /// <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));
        }
Пример #5
0
        /// <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
        }
Пример #6
0
 /// <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);
 }
Пример #7
0
 /// <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);
 }
Пример #8
0
        /// <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));
        }
Пример #9
0
        /// <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);
        }
Пример #10
0
        /// <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);
        }
Пример #11
0
        /// <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
                }));
            }
        }
Пример #12
0
        /// <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));
        }
Пример #13
0
        /// <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);
        }
Пример #14
0
        /// <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));
        }
Пример #15
0
        /// <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);
        }
Пример #16
0
        /// <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
                }
            });
        }
Пример #17
0
        /// <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);
        }
Пример #18
0
        /// <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));
            }
        }
Пример #19
0
        /// <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;
            }
        }
Пример #20
0
        /// <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);
            }
        }
Пример #21
0
        //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));
        }