示例#1
0
        public async Task Battle(BattleTask task, string questId, LoginResult res, IActorRef battleSetup, IActorRef battleResult)
        {
            var serverApi = task.serverApi;
            var data      = task.roleData;

            task.task_data["questId"] = questId;
            var decks = JsonConvert.DeserializeObject <List <Unreal.FGO.Core.Api.ToploginUserdeck> >(data.deck_info);

            task.task_data["deckId"] = decks.First().id.ToString();
            task.deckId = task.task_data["deckId"];

            var questChecker = new QuestChecker()
            {
                TimetampSecond = serverApi.TimetampSecond,
                userQuest      = serverApi.userQuest == null ? new List <Core.Api.HomeUserquest>() : serverApi.userQuest
            };
            var questList = questChecker.GetUserQuestList();
            var quest     = questList.Where(q => questId == q.id).FirstOrDefault();

            if (quest == null)
            {
                return;
            }

            var count     = AssetManage.Database.mstQuestPhase.Where(p => p.questId == quest.id).Count();
            var userQuest = serverApi.userQuest.FirstOrDefault(u => u.questId == quest.id);

            if (count > 0 && userQuest != null && userQuest.questPhase < count)
            {
                task.task_data["questPhase"] = (++userQuest.questPhase).ToString();
            }
            else
            {
                task.task_data["questPhase"] = "1";
            }
            task.task_data["questId"] = quest.id;

            if (res.code != 0)
            {
                Sender.Tell(res);
                return;
            }
            var sleepTime = await battleSetup.Ask <TimeSpan>(task);

            if (sleepTime.TotalMilliseconds == 0)
            {
                res.code    = -1;
                res.message = "战斗开始失败:" + questId;
                Sender.Tell(res);
                return;
            }
            logger.Info("战斗开始:" + questId);
            logger.Info("战斗开始,等待" + sleepTime.Minutes + "分" + sleepTime.Seconds + "秒");
            await Task.Delay(sleepTime);

            if (await battleResult.Ask <bool>(task))
            {
                logger.Info("战斗结束");
            }
        }
示例#2
0
    void Start()
    {
        string [] questIndices = quests.Split(';');
        questList = new QuestChecker [questIndices.Length];
        for(int i = 0; i< questIndices.Length; i++ )
        {
            string quest = questIndices[i];
            questIndex = Int32.Parse(quest);

            switch((whichQuest) questIndex)
            {
            case whichQuest.Fire:
                questObject = new FireQuestChecker();
                break;
            case whichQuest.PickUp:
                questObject = new PickUpQuestChecker();
                break;
            case whichQuest.River:
                questObject = new RiverQuestChecker();
                break;
            case whichQuest.Extinguish:
                questObject = new ExtinguishQuestChecker();
                break;
            case whichQuest.Levitate:
                questObject = new LevitateQuestChecker();
                break;
            case whichQuest.Fly:
                questObject = new FlyQuestChecker();
                break;
            case whichQuest.Transport:
                questObject = new TransportQuestChecker();
                break;
            case whichQuest.Staff:
                questObject = new StaffUnlocker();
                break;
            case whichQuest.Unlevitate:
                questObject = new UnlevitateUnlocker();
                break;
            case whichQuest.SummonObject:
                questObject = new SummonObjectUnlocker();
                break;
            default:
                questObject = new NonQuestChecker();
                break;
            }
            questList[i] = questObject;
        }

        string [] conversation_files = convo_files.Split(';');
        conversationList = new Conversation [conversation_files.Length];
        for(int i = 0; i< conversation_files.Length; i++ )
        {
            convo = new GraphConversation(conversation_files[i]);
            conversationList[i] = convo;
        }
        currentQuest = 0;
    }
示例#3
0
        public async Task <IHttpActionResult> questList(int roleId)
        {
            var res = InitDatabase();

            if (res.Content.code != 0)
            {
                return(res);
            }

            var roleData = db.GetRoleDataByRoleId(roleId);

            if (roleData == null || string.IsNullOrEmpty(roleData.quest_info))
            {
                var role = db.GetUserRoleById(roleId);
                if (role == null)
                {
                    return(Json(-1, "帐号不存在"));
                }
                var device = db.GetDeviceById(role.device_id);
                if (device == null)
                {
                    return(Json(-1, "帐号平台信息不存在"));
                }
                var result = await Login(role, device);

                if (result.Content.code == 0)
                {
                    roleData = db.GetRoleDataByRoleId(roleId);
                }
                else
                {
                    return(result);
                }
            }
            if (roleData == null || string.IsNullOrEmpty(roleData.quest_info))
            {
                return(Json(-1, "获取副本信息失败,该账号可能没有创建角色"));
            }

            var questChecker = new QuestChecker()
            {
                TimetampSecond = new ServerApi().TimetampSecond,
                userQuest      = JsonConvert.DeserializeObject <List <HomeUserquest> >(roleData.quest_info)
            };
            var list       = questChecker.GetUserQuestList();
            var userQuests = list.Select(q =>
            {
                var uq = questChecker.userQuest.FirstOrDefault(q2 => q2.questId == q.id);
                return(new UserQuest()
                {
                    id = q.id, phase = uq != null ? uq.questPhase : 0
                });
            }).ToList();

            return(Json(userQuests));
        }
示例#4
0
        protected void BattleSetup()
        {
            ReceiveAsync <BattleTask>(
                new Predicate <BattleTask>(task => task.action == GameAction.HOME || task.action == GameAction.ITEMUSE),
                async task =>
            {
                if (task.excuteType == ExcuteType.Expires)
                {
                    Log(task.id, GameAction.BATTLERESULT, "正在准备战斗超时重试");
                }
                else if (task.excuteType == ExcuteType.ErrorReStart)
                {
                    Log(task.id, GameAction.BATTLERESULT, "正在准备战斗错误重试");
                }
                if (task.serverApi == null && (task.excuteType == ExcuteType.ErrorReStart || task.excuteType == ExcuteType.Expires))
                {
                    task.action = GameAction.unknown;
                    Self.Tell(task, Sender);
                    return;
                }
                if (task.serverApi == null)
                {
                    task.serverApi = InitServerApi(task);
                }
                var serverApi = task.serverApi;
                var deckId    = task.deckId;

                if (string.IsNullOrEmpty(task.deckId) && serverApi.userDeck == null && !task.task_data.ContainsKey("deckId"))
                {
                    Log(task.id, GameAction.BATTLERESULT, "没有战斗编队信息, 战斗失败");
                    await taskResultActor.Ask(new TaskResult()
                    {
                        id         = task.id,
                        nextAction = GameAction.unknown,
                        state      = TaskState.GAME_ERROR,
                    });
                    await TaskErrorBack(task.id, GameAction.BATTLERESULT, serverApi.LastResponse, "serverApi.userDeck && task_data[deckId] IS NULL");
                    return;
                }

                await Context.ActorOf <CheckDeckActor>().Ask <bool>(task);

                Log(task.id, GameAction.BATTLERESULT, "正在准备战斗数据");
                if (string.IsNullOrEmpty(task.deckId))
                {
                    if (serverApi.userDeck != null)
                    {
                        deckId = serverApi.userDeck.First().id.ToString();
                        task.task_data["deckId"] = deckId;
                        Log(task.id, GameAction.BATTLERESULT, "没有设置战斗编队, 使用第一编队战斗");
                    }
                    else
                    {
                        deckId = task.task_data["deckId"];
                        Log(task.id, GameAction.BATTLERESULT, "从保存数据中读取战斗编队");
                    }
                }
                else
                {
                    deckId = serverApi.userDeck[int.Parse(task.deckId)].id.ToString();
                }
                var follower = GetFollower(serverApi, task.followerId);
                Log(task.id, GameAction.BATTLERESULT, follower.message);
                Log(task.id, GameAction.BATTLESETUP, serverApi.userGame.name + "  lv : " + serverApi.userGame.lv + "    " + "ap : " + serverApi.ApNum);
                bool hasQuest         = false;
                string questId        = null;
                int ap                = serverApi.ApNum;
                int minAp             = 10000000;
                mstQuest mstQuestData = null;
                var questList         = new QuestChecker()
                {
                    TimetampSecond = serverApi.TimetampSecond,
                    userQuest      = serverApi.userQuest
                }.GetUserQuestList();
                var activeQuestList = questList.Where(q => task.questIds.Contains(q.id)).OrderByDescending(q => q.actConsume).ToList();
                foreach (var questData in activeQuestList)
                {
                    mstQuestData   = questData;
                    hasQuest       = true;
                    var actConsume = questData.actConsume;
                    if (actConsume > ap)
                    {
                        minAp = actConsume < minAp ? actConsume : minAp;
                        continue;
                    }
                    questId = questData.id;
                    break;
                }

                ///剧情check
                if (!hasQuest && task.questIds.Contains("1000000"))
                {
                    foreach (var quest in questList)
                    {
                        if (quest.type != "1")
                        {
                            continue;
                        }
                        var spot = AssetManage.Database.mstSpot.FirstOrDefault(s => s.id == quest.spotId);
                        if (spot == null)
                        {
                            continue;
                        }
                        var war = AssetManage.Database.mstWar.FirstOrDefault(w => w.id == spot.warId && w.status == "0");
                        if (war == null)
                        {
                            continue;
                        }
                        hasQuest = true;
                        if (quest.actConsume < ap)
                        {
                            questId      = quest.id;
                            mstQuestData = quest;
                            break;
                        }
                        else
                        {
                            minAp = quest.actConsume < minAp ? quest.actConsume : minAp;
                        }
                    }
                    if (!hasQuest)
                    {
                        await Context.ActorOf <RoleChapteredActor>().Ask <bool>(task.role.id);
                        logger.Info(task.role.username + " 章节清除完成");
                    }
                }

                if (!hasQuest)
                {
                    if (serverApi.userQuest == null || serverApi.userQuest.Count < 3)
                    {
                        Log(task.id, GameAction.BATTLESETUP, "找不到匹配的副本。尝试重新获取");
                        await taskResultActor.Ask(new TaskResult()
                        {
                            id            = task.id,
                            nextAction    = GameAction.unknown,
                            state         = TaskState.STOP,
                            nextStartTime = DateTime.Now
                        });
                        Sender.Tell(true);
                        return;
                    }
                    var mstQuests = AssetManage.Database.mstQuest.Where(q => task.questIds.Contains(q.id)).ToList();
                    if (mstQuests.Any(q => AssetManage.Database.mstQuestRelease.Where(p => p.questId == q.id).Any(p => p.type == 13 || p.type == 11)))
                    {
                        Log(task.id, GameAction.BATTLESETUP, "找不到匹配的副本。等待一小时后启动");
                        await taskResultActor.Ask(new TaskResult()
                        {
                            id            = task.id,
                            nextAction    = GameAction.unknown,
                            state         = TaskState.STOP,
                            nextStartTime = DateTime.Now.AddHours(1)
                        });
                    }
                    else
                    {
                        Log(task.id, GameAction.BATTLESETUP, "找不到匹配的副本。任务结束");
                        await taskResultActor.Ask(new TaskResult()
                        {
                            id         = task.id,
                            nextAction = GameAction.unknown,
                            state      = TaskState.STOP,
                            enable     = false
                        });
                    }
                    Sender.Tell(false);
                    return;
                }

                if (string.IsNullOrEmpty(questId))
                {
                    var item = serverApi.userItem.Where(u => u.itemId == "100" || u.itemId == "102" || u.itemId == "101").FirstOrDefault();
                    if (item != null && item.num != 0 && task.useitem)
                    {
                        task.task_data["itemId"] = item.itemId;
                        task.task_data["num"]    = "1";
                        if (await Context.ActorOf <ItemUseActor>().Ask <bool>(task))
                        {
                            Log(task.id, GameAction.BATTLESETUP, "Ap不足,消耗了一个苹果,总共" + item.num + "个");
                            task.action = GameAction.ITEMUSE;
                            Self.Tell(task);
                            return;
                        }
                    }
                    var t = TimeSpan.FromMilliseconds((minAp - ap) * 300 * 1000);
                    Log(task.id, GameAction.BATTLESETUP, "Ap不足,等待 " + t.Hours + "小时" + t.Minutes + "分" + t.Seconds + "秒");
                    if (t.TotalMinutes > 10)
                    {
                        await taskResultActor.Ask(new TaskResult()
                        {
                            id         = task.id,
                            nextAction = GameAction.HOME,
                            state      = TaskState.RUNNING
                        });
                    }
                    else
                    {
                        await Task.Delay(t);
                    }
                    Sender.Tell(true);
                    return;
                }
                var count     = AssetManage.Database.mstQuestPhase.Where(p => p.questId == questId).Count();
                var userQuest = serverApi.userQuest.FirstOrDefault(u => u.questId == questId);
                if (count > 0 && userQuest != null && userQuest.questPhase < count)
                {
                    task.task_data["questPhase"] = (++userQuest.questPhase).ToString();
                }
                else
                {
                    task.task_data["questPhase"] = "1";
                }


                if (mstQuestData.type == "1")
                {
                    var npcFlower = AssetManage.Database.npcFollower.FirstOrDefault(f => f.questId == questId && f.questPhase == task.task_data["questPhase"]);
                    if (npcFlower != null)
                    {
                        follower.id    = npcFlower.id;
                        follower.index = 0;
                    }
                }

                task.task_data["questId"]       = questId;
                task.task_data["followerId"]    = follower.id;
                task.task_data["followerIndex"] = follower.index.ToString();
                task.task_data["deckId"]        = deckId;

                Log(task.id, GameAction.BATTLESETUP, "战斗准备开始,战斗副本: " + mstQuestData.name);
                var sleepTime = await Context.ActorOf <BattleSetupActor>().Ask <TimeSpan>(task);
                if (sleepTime.TotalMilliseconds == 0)
                {
                    Log(task.id, GameAction.BATTLESETUP, "战斗开始失败");
                    Sender.Tell(false);
                    return;
                }
                Log(task.id, GameAction.BATTLESETUP, "战斗开始成功,等待" + sleepTime.Minutes + "分" + sleepTime.Seconds + "秒");
                await Task.Delay(sleepTime);
                task.action = GameAction.BATTLESETUP;
                Self.Tell(task, Sender);
            });
        }
示例#5
0
    void Start()
    {
        string [] questIndices = quests.Split(';');
        questList = new QuestChecker [questIndices.Length];
        for (int i = 0; i < questIndices.Length; i++)
        {
            string quest = questIndices[i];
            questIndex = Int32.Parse(quest);

            switch ((whichQuest)questIndex)
            {
            case whichQuest.Fire:
                questObject = new FireQuestChecker();
                break;

            case whichQuest.PickUp:
                questObject = new PickUpQuestChecker();
                break;

            case whichQuest.River:
                questObject = new RiverQuestChecker();
                break;

            case whichQuest.Extinguish:
                questObject = new ExtinguishQuestChecker();
                break;

            case whichQuest.Levitate:
                questObject = new LevitateQuestChecker();
                break;

            case whichQuest.Fly:
                questObject = new FlyQuestChecker();
                break;

            case whichQuest.Transport:
                questObject = new TransportQuestChecker();
                break;

            case whichQuest.Staff:
                questObject = new StaffUnlocker();
                break;

            case whichQuest.Unlevitate:
                questObject = new UnlevitateUnlocker();
                break;

            case whichQuest.SummonObject:
                questObject = new SummonObjectUnlocker();
                break;

            default:
                questObject = new NonQuestChecker();
                break;
            }
            questList[i] = questObject;
        }

        string [] conversation_files = convo_files.Split(';');
        conversationList = new Conversation [conversation_files.Length];
        for (int i = 0; i < conversation_files.Length; i++)
        {
            convo = new GraphConversation(conversation_files[i]);
            conversationList[i] = convo;
        }
        currentQuest = 0;
    }
示例#6
0
        public BattleSetup()
        {
            ReceiveAsync <BattleSetupParam>(async param =>
            {
                var db     = new Db();
                var result = new BattleSetupResult();
                try
                {
                    var role   = db.GetUserRoleById(param.roleId);
                    var device = getDevice(role.device_id);

                    db.Dispose();
                    var questChecker = new QuestChecker();
                    var loginRes     = await Context.ActorOf <InitRole>().Ask <LoginResult>(new InitRoleParam()
                    {
                        role = role
                    });

                    if (loginRes.code != 0)
                    {
                        result.code    = -500;
                        result.message = loginRes.message;
                        Sender.Tell(result);
                        return;
                    }

                    var roleData = getRoleData(role.id);
                    if (roleData.quest_info == null)
                    {
                        result.code    = -1;
                        result.message = "获取副本信息失败,该账号可能没有创建角色";
                        Sender.Tell(result);
                        return;
                    }
                    if (roleData.deck_info == null)
                    {
                        result.code    = -1;
                        result.message = "获取队伍信息失败,该账号可能没有创建角色";
                        Sender.Tell(result);
                        return;
                    }
                    var userDeck  = JsonConvert.DeserializeObject <List <ToploginUserdeck> >(roleData.deck_info);
                    var serverApi = InitServerApi(role, device, roleData);
                    questChecker.TimetampSecond = serverApi.TimetampSecond;
                    questChecker.userQuest      = JsonConvert.DeserializeObject <List <HomeUserquest> >(roleData.quest_info);
                    var questList = questChecker.GetUserQuestList();
                    var mstQuest  = questList.FirstOrDefault(q => q.id == param.questId);
                    logger.Info(serverApi.userGame.name + "  lv : " + serverApi.userGame.lv + "    " + "ap : " + serverApi.ApNum);

                    var ap = serverApi.ApNum;
                    if (mstQuest == null && param.questId == "1000000")
                    {
                        foreach (var quest in questList)
                        {
                            if (quest.type != "1")
                            {
                                continue;
                            }
                            var spot = AssetManage.Database.mstSpot.FirstOrDefault(s => s.id == quest.spotId);
                            if (spot == null)
                            {
                                continue;
                            }
                            var war = AssetManage.Database.mstWar.FirstOrDefault(w => w.id == spot.warId && w.status == "0");
                            if (war == null)
                            {
                                continue;
                            }
                            if (quest.actConsume < ap)
                            {
                                logger.Info("剧情:" + war.name + " " + spot.name + " " + quest.name);
                                mstQuest      = quest;
                                param.questId = quest.id;
                                break;
                            }
                            else
                            {
                                result.code    = -10;
                                result.message = "Ap不足";
                                Sender.Tell(result);
                                return;
                            }
                        }
                        if (mstQuest == null)
                        {
                            db             = new Db();
                            role           = db.userRoles.Find(role.id);
                            role.chaptered = true;
                            db.SaveChanges();
                            db.Dispose();
                            logger.Info(role.username + " 章节清除完成");
                        }
                    }
                    if (mstQuest == null)
                    {
                        result.code    = -2;
                        result.message = "没有找到该副本,可能副本没有开启";
                        Sender.Tell(result);
                        return;
                    }
                    if (mstQuest.actConsume > ap)
                    {
                        result.code    = -10;
                        result.message = "Ap不足";
                        Sender.Tell(result);
                        return;
                    }

                    var deckId     = userDeck.First().id.ToString();
                    var phase      = "1";
                    var phaseCount = AssetManage.Database.mstQuestPhase.Where(p => p.questId == param.questId).Count();
                    var userQuest  = serverApi.userQuest.FirstOrDefault(u => u.questId == param.questId);
                    if (phaseCount > 0 && userQuest != null && userQuest.questPhase < phaseCount)
                    {
                        phase = (++userQuest.questPhase).ToString();
                    }

                    if (!await Context.ActorOf <CheckDeckActor>().Ask <bool>(new LoginTask()
                    {
                        role = role,
                        serverApi = serverApi,
                        roleData = roleData,
                        device = device
                    }))
                    {
                        result.code    = -4;
                        result.message = "设置队伍失败";
                        Sender.Tell(result);
                        return;
                    }

                    var npcFlower = AssetManage.Database.npcFollower.FirstOrDefault(f => f.questId == mstQuest.id && f.questPhase == phase);
                    var flowerId  = npcFlower == null ? "0" : npcFlower.id;
                    var setup     = await serverApi.Battlesetup(deckId, flowerId, param.questId, phase);

                    if (setup.code != 0)
                    {
                        logger.Error("战斗开始失败");
                        logger.Error(setup.message);
                        logger.Error(setup.RequestMessage);
                        result.code    = -500;
                        result.message = "战斗开始失败";
                        Sender.Tell(result);
                        return;
                    }
                    result.battleId = setup.cache.replaced.battle[0].id;
                    db                    = new Db();
                    roleData              = db.roleData.Find(roleData.id);
                    roleData.battle_id    = result.battleId;
                    role                  = db.userRoles.Find(role.id);
                    role.last_update_time = DateTime.Now;
                    roleData.usk          = setup.response[0].usk;
                    db.SaveChanges();
                    db.Dispose();
                }
                catch (Exception ex)
                {
                    logger.Error(ex);
                    result.code    = -500;
                    result.message = ex.Message;
                }
                Sender.Tell(result);
            });
        }
示例#7
0
        public async Task Home(ServerApi serverApi, role_data data, user_role role)
        {
            logger.Info("登陆首页领取礼物");
            try
            {
                var home = await serverApi.Home();

                if (home.cache != null && home.cache.replaced != null && home.cache.replaced.userQuest != null)
                {
                    data.quest_info = JsonConvert.SerializeObject(home.cache.replaced.userQuest);
                }
                if (home.cache != null && home.cache.replaced != null && home.cache.replaced.userSvt != null)
                {
                    data.svt_info = JsonConvert.SerializeObject(home.cache.replaced.userSvt);
                }
                if (home.cache != null && home.cache.replaced != null && home.cache.replaced.userGame != null)
                {
                    data.user_game = JsonConvert.SerializeObject(home.cache.replaced.userGame[0]);
                }

                //检查章节完成情况
                if (!string.IsNullOrEmpty(data.quest_info) && !role.chaptered && role.id != 0)
                {
                    logger.Info(role.username + " 检查章节完成情况");
                    var questChecker = new QuestChecker()
                    {
                        TimetampSecond = serverApi.TimetampSecond,
                        userQuest      = JsonConvert.DeserializeObject <List <HomeUserquest> >(data.quest_info)
                    };
                    var hasQuest  = false;
                    var questList = questChecker.GetUserQuestList();
                    foreach (var quest in questList)
                    {
                        if (quest.type != "1")
                        {
                            continue;
                        }
                        var spot = AssetManage.Database.mstSpot.FirstOrDefault(s => s.id == quest.spotId);
                        if (spot == null)
                        {
                            continue;
                        }
                        var war = AssetManage.Database.mstWar.FirstOrDefault(w => w.id == spot.warId && w.status == "0");
                        if (war == null)
                        {
                            continue;
                        }
                        hasQuest = true;
                        break;
                    }
                    if (!hasQuest)
                    {
                        await Context.ActorOf <RoleChapteredActor>().Ask <bool>(role.id);

                        logger.Info(role.username + " 章节清除完成");
                    }
                }

                var list = await serverApi.Presentlist();

                var receiveRes = await serverApi.Presentreceive(list.cache.replaced.userPresentBox.Select(b => b.presentId).ToArray());

                if (receiveRes.cache != null && receiveRes.cache.updated != null && receiveRes.cache.updated.userGame != null)
                {
                    data.user_game = JsonConvert.SerializeObject(receiveRes.cache.updated.userGame[0]);
                }

                data.usk                  = serverApi.PlatfromInfos.ContainsKey("usk") ? serverApi.PlatfromInfos["usk"] : null;
                data.rguid                = serverApi.PlatfromInfos["rguid"];
                data.game_user_id         = serverApi.PlatfromInfos["userId"];
                data.access_token         = serverApi.PlatfromInfos["access_token"];
                data.access_token_expires = long.Parse(serverApi.PlatfromInfos["expires"]);
                data.bilibili_id          = serverApi.PlatfromInfos["uid"];
                await SaveActionData(data, GameAction.HOME);

                logger.Info("id:" + data.role_id + " name:" + home.cache.replaced.userGame[0].name + " stone:" + home.cache.replaced.userGame[0].stone);
            }
            catch (Exception ex)
            {
                logger.Error(ex);
            }
        }