Ejemplo n.º 1
0
        public Dungeon MakeDungeon(Player p, DDungeon dd, Section section)
        {
            Dungeon dungeon = new Dungeon()
            {
                Id              = Guid.NewGuid().ToString("D"),
                PlayerId        = p.Id,
                Tid             = dd.id,
                Type            = dd.type,
                Section         = dd.section,
                Mission         = dd.mission,
                Star            = 0,
                FightTimes      = 0,
                LastRefreshTime = DateTime.Now,
                Next            = dd.next,
                ResetNumb       = 0,
                IsLast          = dd.next == 0,
                IsOpen          = true,
                SectionId       = section.Id
            };

            return(dungeon);
        }
Ejemplo n.º 2
0
        public int Call_FightEnd(FBFightResultRequest request)
        {
            if (request.token == null)
            {
                UnitListResponse er = new UnitListResponse();
                er.success = false;
                er.info    = GameErrorCode.副本战斗令牌错误或战斗已经失效.ToString();
                CurrentSession.SendAsync(er);
                //return (int)GameErrorCode.副本战斗令牌错误或战斗已经失效;
            }
            //Battle battle;
            //if (!this._battles.TryGetValue(request.token, out battle) || battle.PlayerId != CurrentSession.UserId || battle.Dungeon.Id != request.id)
            //{
            //    return (int)GameErrorCode.副本战斗令牌错误或战斗已经失效;
            //}
            //_battles.Remove(battle.Id);

            FBFightResultResponse response = new FBFightResultResponse();

            response.win     = request.win;
            response.id      = request.id;
            response.success = true;
            if (request.win)
            {
                var player = this.CurrentSession.GetBindPlayer();
                //Dungeon dungeon = battle.Dungeon;
                Dungeon  dungeon  = player.Sections.Select(x => x.Dungeons.FirstOrDefault(d => d.Id == request.id)).First(x => x != null);
                DDungeon ddungeon = DDungeons[dungeon.Type][dungeon.Section][dungeon.Mission];

                string reason = $"副本{ddungeon.id}:{ddungeon.name}战斗胜利";
                dungeon.FightTimes += 1;
                //副本评星
                int uscnt  = 0;
                int living = 0;

                if (request.units != null)
                {
                    foreach (FightUnitInfo u in request.units)
                    {
                        if (string.IsNullOrEmpty(u.unitId))
                        {
                            uscnt += 1;
                            if (!u.dead)
                            {
                                living += 1;
                            }
                        }
                    }
                }

                int star = 1;
                if (living != 0)
                {
                    star = _stars[uscnt - 1][living - 1];
                }

                if (dungeon.Star == 0)     //第一次通关
                {
                    if (dungeon.Next != 0) //开启下一关
                    {
                        var ddnext  = DDungeons[dungeon.Type][dungeon.Section][dungeon.Mission + 1];
                        var section = player.Sections.First(s => s.Id == dungeon.SectionId);
                        var dnext   = this.MakeDungeon(player, ddnext, section);
                        section.Dungeons.Add(dnext);
                    }
                    else//开启下一章
                    {
                        if (dungeon.Type == 1)//普通副本直接开启下一章,尝试打开精英副本当前章
                        {
                            Section secionNext = new Section()
                            {
                                Id       = Guid.NewGuid().ToString("D"),
                                PlayerId = player.Id,
                                Index    = dungeon.Section + 1,
                                Type     = dungeon.Type,
                                Dungeons = new List <Dungeon>()
                            };
                            player.Sections.Add(secionNext);
                            var dd    = DDungeons[dungeon.Type][secionNext.Index][1];
                            var dnext = this.MakeDungeon(player, dd, secionNext);
                            secionNext.Dungeons.Add(dnext);

                            //检查精英副本是否已经通关上一章
                            bool preExSectionPassed = this.CheckPassedSection(player, 2, dungeon.Section - 1);
                            if (preExSectionPassed)
                            {
                                Section secionEx = new Section()
                                {
                                    Id       = Guid.NewGuid().ToString("D"),
                                    PlayerId = player.Id,
                                    Index    = dungeon.Section,
                                    Type     = 2,
                                    Dungeons = new List <Dungeon>()
                                };
                                player.Sections.Add(secionEx);
                                var ddEx    = DDungeons[2][secionEx.Index][1];
                                var dnextEx = this.MakeDungeon(player, ddEx, secionEx);
                                secionEx.Dungeons.Add(dnextEx);
                            }
                        }
                        else//精英副本检查普通本是否通关下一章,通关则开启下一章
                        {
                            bool nextNormalSectionPassed = this.CheckPassedSection(player, 1, dungeon.Section + 1);
                            if (nextNormalSectionPassed)
                            {
                                Section secionEx = new Section()
                                {
                                    Id       = Guid.NewGuid().ToString("D"),
                                    PlayerId = player.Id,
                                    Index    = dungeon.Section + 1,
                                    Type     = 2,
                                    Dungeons = new List <Dungeon>()
                                };
                                player.Sections.Add(secionEx);
                                var ddEx    = DDungeons[2][secionEx.Index][1];
                                var dnextEx = this.MakeDungeon(player, ddEx, secionEx);
                                secionEx.Dungeons.Add(dnextEx);
                            }
                        }
                    }
                }

                if (dungeon.Star < star)
                {
                    dungeon.Star = star;
                }

                //派发奖励
                var playerController = this.Server.GetController <PlayerController>();
                //扣体力
                playerController.AddCurrency(player, CurrencyType.OIL, -ddungeon.oil_cost, reason);
                playerController.AddExp(player, ddungeon.exp, reason);

                //发放兵种经验
                response.units = new List <UnitInfo>();
                var campController = this.Server.GetController <CampController>();
                var team           = player.Teams.FirstOrDefault(t => t.IsSelected);
                if (team != null)
                {
                    foreach (var unit in player.Units.Where(u => team.Units.Object.Contains(u.Id)))
                    {
                        UnitInfo ui = campController.AddUnitExp(player, unit, ddungeon.exp_element, false, true, reason);
                        response.units.Add(ui);
                    }
                }
                var        pkgController = this.Server.GetController <PkgController>();
                RewardInfo reward        = pkgController.RandomReward(player, ddungeon.random_id, reason);

                _db.SaveChanges();

                reward.exp      = ddungeon.exp;
                response.reward = reward;
                response.lv     = player.Level;
                response.exp    = player.Exp;
                response.star   = dungeon.Star;
            }
            else
            {
                response.units = null;
            }
            response.id  = request.id;
            response.win = request.win;
            CurrentSession.SendAsync(response);
            return(0);
        }