// 毎秒ごとの処理を行う private async void HelperTaskS() { if (SaveScreenshotFlg.Value) { // ズレ検出・修正処理 if (!ScreenShotProvider.CanGetScreenshot()) { // スクショが取得できなくなったのでその旨を通知する PutLog("エラー:ゲーム画面の位置ズレを検出しました"); await AutoGetGameWindowPositionAsync(); return; } // スクショから得られる情報を用いた修正 using (var screenShot = ScreenShotProvider.GetScreenshot()) { switch (SceneRecognition.JudgeGameScene(screenShot)) { case "戦闘中": MainModel.SetBattleBombTimer(screenShot, ref oldGauge, ref remainTime); break; case "委託": MainModel.SetConsignTimer(screenShot); break; case "戦術教室": MainModel.SetLectureTimer(screenShot); break; case "寮舎": MainModel.SetFoodTimer(screenShot); break; } } } else { // 常時座標認識 if (AutoSearchPositionFlg.Value) { GetGameWindowPosition(); } } }
// 定期的にスクリーンショットを取得し、そこに起因する処理を行う private void HelperTaskF() { if (!SaveScreenshotFlg.Value) { return; } using (var screenShot = ScreenShotProvider.GetScreenshot()) { // スクショが取得できるとscreenShotがnullにならない if (screenShot != null) { // シーン文字列を取得し、表示する string judgedScene = SceneRecognition.JudgeGameScene(screenShot); JudgedScene.Value = $"シーン判定 : {judgedScene}"; // 資材量を取得する // (戦闘中なら各種ボムの分量と残り秒数を読み取る) if (SupplyStore.SupplyListEachScene.ContainsKey(judgedScene)) { foreach (string supplyName in SupplyStore.SupplyListEachScene[judgedScene]) { if (SupplyStore.UpdateSupplyValue(screenShot, supplyName, AutoSupplyScreenShotFlg.Value, PutCharacterRecognitionFlg.Value)) { PutLog($"資材量追記:{supplyName}"); } } } // 戦闘中でなくなった場合、速やかにボムタイマーをリセットする if (judgedScene != "戦闘中" && judgedScene != "不明") { SettingsStore.BombChageTime1 = null; SettingsStore.BombChageTime2 = null; SettingsStore.BombChageTime3 = null; } } else { // スクショが取得できなくなったのでその旨を通知する PutLog("エラー:スクショが取得できなくなりました"); SaveScreenshotFlg.Value = false; } } }
// ゲーム画面の座標を取得する private async void GetGameWindowPosition() { PutLog("座標取得開始..."); try { // ゲーム画面の座標候補を検出する var rectList = await ScreenShotProvider.GetGameWindowPositionAsync().ConfigureAwait(false); // 候補数によって処理を分岐させる switch (rectList.Count) { case 0: { // 候補なしと表示する ScreenShotProvider.GameWindowRect = null; PutLog("座標取得 : 失敗"); SaveScreenshotFlg.Value = false; } break; case 1: { // 即座にその候補で確定させる ScreenShotProvider.GameWindowRect = rectList[0]; PutLog("座標取得 : 成功"); PutLog($"ゲーム座標 : {Utility.GetRectStr((Rectangle)ScreenShotProvider.GameWindowRect)}"); SaveScreenshotFlg.Value = true; } break; default: { // 各座標についてシーン認識を行い、認識可能だった座標が // 0個→従来通りの選択画面を表示する // 1個→その結果で確定させる // 2個以上→認識可能だった座標だけで選択画面を表示する var rectList2 = rectList.Where(rect => { var bitmap = ScreenShotProvider.GetScreenBitmap(rect); string scene = SceneRecognition.JudgeGameScene(bitmap); return(scene != "不明"); }).ToList(); switch (rectList2.Count) { case 0: { // 選択画面を表示する // http://blogs.wankuma.com/naka/archive/2009/02/12/168020.aspx var dispatcher = Application.Current.Dispatcher; if (dispatcher.CheckAccess()) { ShowSelectGameWindow(rectList); } else { dispatcher.Invoke(() => { ShowSelectGameWindow(rectList); }); } } break; case 1: { // 即座にその候補で確定させる ScreenShotProvider.GameWindowRect = rectList2[0]; PutLog("座標取得 : 成功"); PutLog($"ゲーム座標 : {Utility.GetRectStr((Rectangle)ScreenShotProvider.GameWindowRect)}"); SaveScreenshotFlg.Value = true; } break; default: { // 選択画面を表示する // http://blogs.wankuma.com/naka/archive/2009/02/12/168020.aspx var dispatcher = Application.Current.Dispatcher; if (dispatcher.CheckAccess()) { ShowSelectGameWindow(rectList2); } else { dispatcher.Invoke(() => { ShowSelectGameWindow(rectList2); }); } } break; } } break; } } catch (Exception) { PutLog($"座標取得 : 失敗"); } }