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("战斗结束"); } }
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; }
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)); }
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); }); }
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; }
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); }); }
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); } }