diff --git a/popcorn/Assets/MyGame/Scripts/GameDataObserver.cs b/popcorn/Assets/MyGame/Scripts/GameDataObserver.cs index af3c041a..805ac07c 100644 --- a/popcorn/Assets/MyGame/Scripts/GameDataObserver.cs +++ b/popcorn/Assets/MyGame/Scripts/GameDataObserver.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using UniRx; using UnityEngine; +using UnityEngine.SceneManagement; public class GameDataObserver : SingletonMonoBehaviour { @@ -27,118 +28,77 @@ public class GameDataObserver : SingletonMonoBehaviour public IObservable SceneCounter => sceneCounter.DistinctUntilChanged(); public IObservable ShopLevelObserver => shopLevelObserver.AddTo(this); + private GameData globalGameData; + private GameData cityGameData; + private readonly List MissionDataList = SpreadsheetDataManager.Instance.GetBaseDataList(Const.MissionDataSheet); + private List latestNormalMissions; + private List normalMissionList; + + private static readonly MissionCondition[] StaticMissionConditions = { + MissionCondition.UseFertilizer, + MissionCondition.UseAdWalker, + MissionCondition.UseAutoCook, + }; + private void Start() { checkInterval.AddTo(this); updateMissionAchieved.AddTo(this); + ResetGameData(); var levelList = SpreadsheetDataManager.Instance.GetBaseDataList(Const.ShopLevelDataSheet); levelList = levelList.Where(data => data.shopLevel != Const.SpecialShopLevel).ToList(); checkInterval .Select(x => Observable.Interval(TimeSpan.FromSeconds(x))).Switch() .Subscribe(_ => { - var gameData = GameDataManager.GameData; - heartObserver.OnNext(gameData.Heart); - sceneCounter.OnNext(UnityEngine.SceneManagement.SceneManager.sceneCount); - shopLevelObserver.OnNext(gameData.ViewedShopLevel); - achievedMissionObserver.OnNext(gameData.AchievedMission.Count); - // addCoinObserver.OnNext(gameData.TotalAddCoin); - subCoinObserver.OnNext(gameData.TotalSubCoin); - addCornObserver.OnNext(gameData.TotalAddCornSeed); - addCustomerObserver.OnNext(gameData.TotalCustomerCount); - addSalesObserver.OnNext(gameData.TotalSales); - addRareSalesObserver.OnNext(gameData.RareTotalSales); - hasRecipeObserver.OnNext(gameData.MyRecipes.Length); - deliveredBulkOrderObserver.OnNext(gameData.BulkOrderDeliveredCount); + heartObserver.OnNext(globalGameData.Heart); + sceneCounter.OnNext(SceneManager.sceneCount); + shopLevelObserver.OnNext(globalGameData.ViewedShopLevel); + achievedMissionObserver.OnNext(cityGameData.AchievedMission.Count); + // addCoinObserver.OnNext(cityGameData.TotalAddCoin); + subCoinObserver.OnNext(cityGameData.TotalSubCoin); + addCornObserver.OnNext(cityGameData.TotalAddCornSeed); + addCustomerObserver.OnNext(cityGameData.TotalCustomerCount); + addSalesObserver.OnNext(cityGameData.TotalSales); + addRareSalesObserver.OnNext(cityGameData.RareTotalSales); + hasRecipeObserver.OnNext(cityGameData.MyRecipes.Length); + deliveredBulkOrderObserver.OnNext(cityGameData.BulkOrderDeliveredCount); }).AddTo(this); // ミッション達成チェッカー - var missionList = SpreadsheetDataManager.Instance.GetBaseDataList(Const.MissionDataSheet); - var normalMissionList = missionList.Where(data => data.Category == MissionCategory.Normal).ToList(); - var latestMissionList = GetLatestMissionList(); - // 各条件の最前の未達成のミッションのみにフィルタ - List GetLatestMissionList() => normalMissionList - .Where(data => data.shopLevel <= GameDataManager.GameData.ViewedShopLevel) - .Where(data => !GameDataManager.GameData.AchievedMission.Contains(data.id)) - .GroupBy(data => data.Condition, (_, list) => list.FirstOrDefault()).ToList(); + normalMissionList = MissionDataList.Where(data => data.Category == MissionCategory.Normal).ToList(); + UpdateLatestNormalMissions(); + // 店舗レベルアップorミッション達成でリスト更新して達成チェック - Observable.Merge( - shopLevelObserver.DistinctUntilChanged(), - achievedMissionObserver.DistinctUntilChanged(), + shopLevelObserver.DistinctUntilChanged().Merge(achievedMissionObserver.DistinctUntilChanged(), updateMissionProgress.Select(_ => 0)) .Subscribe(_ => { - latestMissionList = GetLatestMissionList(); - // ここで達成を再確認 - updateMissionAchieved.Value = latestMissionList - .Any(data => data.count <= MissionManager.GetProgressValue(data)); - - // dailyMission - var ids = GameDataManager.GameData.dailyMissionIdArray.Except(GameDataManager.GameData.dailyMissionAchievedIdArray); - if (missionList - .Where(data => ids.Contains(data.id)) - .Any(missionData => missionData.count <= MissionManager.GetDailyProgressValue(missionData))) - { - updateMissionAchieved.Value = true; - } - - // CheckDailyCompleteMission - if (!GameDataManager.GameData.dailyMissionCompleted) - { - if (GameDataManager.GameData.dailyMissionIdArray.Length <= GameDataManager.GameData.dailyMissionAchievedIdArray.Length) - { - updateMissionAchieved.Value = true; - } - } + // リスト更新 + UpdateLatestNormalMissions(); + // ここで達成を確認 + CheckNormalMissionNewAchieved(); + CheckDailyMissionNewAchieved(); + CheckDailyCompleteMission(); }); // 各種ポップコーン以外の達成を確認 - Observable.Merge( - subCoinObserver.DistinctUntilChanged().Select(_ => MissionCondition.CoinConsumeCount), - addCornObserver.DistinctUntilChanged().Select(_ => MissionCondition.CornCount), + subCoinObserver.DistinctUntilChanged().Select(_ => MissionCondition.CoinConsumeCount).Merge(addCornObserver.DistinctUntilChanged().Select(_ => MissionCondition.CornCount), addCustomerObserver.DistinctUntilChanged().Select(_ => MissionCondition.CustomerCount), hasRecipeObserver.DistinctUntilChanged().Select(_ => MissionCondition.RecipeCount), deliveredBulkOrderObserver.DistinctUntilChanged().Select(_ => MissionCondition.BulkOrderDeliveredCount)) .Subscribe(condition => { - if (latestMissionList - .Where(data => data.Condition == condition) - .Any(data => data.count <= MissionManager.GetProgressValue(data))) - { - updateMissionAchieved.Value = true; - } - - // dailyMission - var ids = GameDataManager.GameData.dailyMissionIdArray.Except(GameDataManager.GameData.dailyMissionAchievedIdArray); - if (missionList - .Where(data => ids.Contains(data.id)) - .Any(missionData => missionData.count <= MissionManager.GetDailyProgressValue(missionData))) - { - updateMissionAchieved.Value = true; - } + CheckNormalMissionNewAchieved(condition); + CheckDailyMissionNewAchieved(); }); // ポップコーン販売達成確認 - // CheckAvailableMissionは行わない - Observable.Merge( - addSalesObserver.DistinctUntilChanged(), - addRareSalesObserver.DistinctUntilChanged()) + addSalesObserver.DistinctUntilChanged().Merge(addRareSalesObserver.DistinctUntilChanged()) .Subscribe(_ => { - if (latestMissionList - .Any(data => data.count <= MissionManager.GetProgressValue(data))) - { - updateMissionAchieved.Value = true; - } - - // dailyMission - var ids = GameDataManager.GameData.dailyMissionIdArray.Except(GameDataManager.GameData.dailyMissionAchievedIdArray); - if (missionList - .Where(data => ids.Contains(data.id)) - .Any(missionData => missionData.count <= MissionManager.GetDailyProgressValue(missionData))) - { - updateMissionAchieved.Value = true; - } + CheckNormalMissionNewAchieved(); + CheckDailyMissionNewAchieved(); }); // デイリーミッション日付チェック @@ -146,13 +106,9 @@ public class GameDataObserver : SingletonMonoBehaviour .Where(x => x <= 1) .Subscribe(x => { - var gameData = GameDataManager.GameData; - if (gameData.ViewedShopLevel == 0) - { - return; - } + if (globalGameData.ViewedShopLevel == 0) return; - var lastSetDateUtc = DateTime.FromBinary(gameData.lastDailyMissionSetTime); + var lastSetDateUtc = DateTime.FromBinary(globalGameData.lastDailyMissionSetTime); // 現時刻が最後にデイリーミッションを設定した日より前の場合無視(時間操作対策) if (lastSetDateUtc > DateTime.UtcNow) { @@ -163,45 +119,94 @@ public class GameDataObserver : SingletonMonoBehaviour } // ミッションリセットチェック(0時) - if (gameData.GetDailyMissionLimitTime().TotalSeconds > 0) - { - return; - } + if (globalGameData.GetDailyMissionLimitTime().TotalSeconds > 0) return; #if UNITY_EDITOR - Debug.Log($"reset daily mission"); + Debug.Log("reset daily mission"); #endif // ミッション実績リセット - gameData.dailyMissionAchievedIdArray = Array.Empty(); - gameData.dailyMissionCompleted = false; - gameData.ResetDailyTotalCount(); + globalGameData.dailyMissionAchievedIdArray = Array.Empty(); + globalGameData.dailyMissionCompleted = false; + globalGameData.ResetDailyTotalCount(); // 新ミッション登録 - var targetList = missionList - .Where(data => data.Category == MissionCategory.Daily && data.shopLevel <= gameData.ViewedShopLevel) - .Where(data => MissionManager.CheckAvailableMission(data, GameDataManager.GameData.MyRecipes)) + var targetList = MissionDataList + .Where(data => data.Category == MissionCategory.Daily && data.shopLevel <= globalGameData.ViewedShopLevel) + .Where(data => MissionManager.CheckAvailableMission(data, globalGameData.MyRecipes)) .ToList(); - var staticMissionConditions = new[] - { - MissionCondition.UseFertilizer, - MissionCondition.UseAdWalker, - MissionCondition.UseAutoCook, - }; var staticMissionList = targetList - .Where(data => staticMissionConditions.Contains(data.Condition)) + .Where(data => StaticMissionConditions.Contains(data.Condition)) .ToList(); - gameData.dailyMissionIdArray = targetList - .Where(data => !staticMissionConditions.Contains(data.Condition)) + globalGameData.dailyMissionIdArray = targetList + .Where(data => !StaticMissionConditions.Contains(data.Condition)) .ToList() .RandomChoose(2) .Append(staticMissionList.RandomChoose()) // 固定ミッション広告視聴 .Select(data => data.id) .ToArray(); - gameData.lastDailyMissionSetTime = DateTime.UtcNow.ToBinary(); - gameData.dailyLoginCount++; + globalGameData.lastDailyMissionSetTime = DateTime.UtcNow.ToBinary(); + globalGameData.dailyLoginCount++; GameDataManager.SaveGameData(); }); } + + private void UpdateLatestNormalMissions() + { + // 各条件の最前の未達成のミッションのみにフィルタ + latestNormalMissions = normalMissionList + .Where(data => data.shopLevel <= cityGameData.ViewedShopLevel) + .Where(data => !cityGameData.AchievedMission.Contains(data.id)) + .GroupBy(data => data.Condition, (_, list) => list.FirstOrDefault()).ToList(); + } + + private void CheckNormalMissionNewAchieved(MissionCondition condition) + { + if (latestNormalMissions + .Where(data => data.Condition == condition) + .Any(data => data.count <= MissionManager.GetProgressValue(data))) + { + updateMissionAchieved.Value = true; + } + } + + private void CheckNormalMissionNewAchieved() + { + updateMissionAchieved.Value = latestNormalMissions + .Any(data => data.count <= MissionManager.GetProgressValue(data)); + } + + private void CheckDailyMissionNewAchieved() + { + var ids = globalGameData.dailyMissionIdArray + .Except(globalGameData.dailyMissionAchievedIdArray); + if (MissionDataList + .Where(data => ids.Contains(data.id)) + .Any(missionData => missionData.count <= MissionManager.GetDailyProgressValue(missionData))) + { + updateMissionAchieved.Value = true; + } + } + + private void CheckDailyCompleteMission() + { + if (globalGameData.dailyMissionCompleted) return; + if (globalGameData.dailyMissionIdArray.Length <= globalGameData.dailyMissionAchievedIdArray.Length) + { + updateMissionAchieved.Value = true; + } + } public void CheckMissionProgress(){ updateMissionProgress.OnNext(Unit.Default); } + + public void ChangeCity(int cityId) + { + // 監視対象リセット + cityGameData = GameDataManager.GetCityGameData(cityId); + } + + public void ResetGameData() + { + globalGameData = GameDataManager.GameData; + cityGameData = GameDataManager.GetCurrentCityGameData(); + } }