通知処理ワールド対応

This commit is contained in:
kimura 2022-10-20 13:34:39 +09:00
parent 48411e0421
commit b17092b303
1 changed files with 115 additions and 110 deletions

View File

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