通知処理ワールド対応
This commit is contained in:
parent
48411e0421
commit
b17092b303
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue