popcorn/popcorn/Assets/MyGame/Scripts/GameDataManager.cs

754 lines
26 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using UnityEngine;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using MyGame.Scenes.marketing.Scripts;
using MyGame.Scenes.MiniGame.Scripts;
using MyGame.Scripts;
public enum AdRewardType {
GachaCoin = 1,
Avatar = 2,
Count,
}
[DataContract(Name="KeyValueOfintint")]
public sealed class KeyValueOfintint {
[DataMember]
public int Key;
[DataMember]
public int Value;
public KeyValueOfintint(KeyValuePair<int, int> value){
Key = value.Key;
Value = value.Value;
}
}
[DataContract]
public sealed class GameData {
[DataMember(Name = "Data0")]
public long beginPlayTime = DateTime.UtcNow.ToBinary();
[DataMember(Name = "Data1")]
public string lastPlayedVersion = Const.DefaultAppVersion;
[DataMember(Name = "Data2")]
public long lastPlayTime = DateTime.UtcNow.ToBinary(); // 最終プレイ日時
[DataMember(Name = "Data3")]
public int dailyLoginCount = 0;
[DataMember(Name = "Data4")]
public int adCount;
[DataMember(Name = "Data5")]
public int stage = 1;
// [DataMember(Name = "Data6")]
// public int avatarId = Const.DefaultAvatarId;
[DataMember(Name = "Data7")]
private int coin;
public int Coin
{
get => coin;
set => ChangeCoin(value);
}
// [DataMember(Name = "Data8")]
// private int[] avatarIdArray;
// public List<int> avatarIdList;
// [DataMember(Name = "Data9")]
// public int gachaCount;
// [DataMember(Name = "Data10")]
// private int[] newAvatarIdArray;
// public List<int> newAvatarIdList;
// [DataMember(Name = "Data11")]
// public bool isRandomAvatar;
// CornField
[DataMember(Name = "Data12")]
public List<PlantLineData> PlantLineDataList = new List<PlantLineData>();
// [DataMember(Name = "Data13")]
[DataMember(Name = "Data14")]
public int MachineLevel = Const.DefaultMachineLevel;
[DataMember(Name = "Data15")]
public List<SeedlingProgressData> SeedlingDataList = new List<SeedlingProgressData>();
[DataMember(Name = "Data16")]
private int cornSeed;
public int CornSeed
{
get => cornSeed;
set => ChangeCornSeed(value);
}
// Main
// 所持レシピ
[DataMember(Name = "Data17")]
public int[] MyRecipes;
// 所持素材
[DataMember(Name = "Data18")]
public List<MaterialData> Material;
// 店頭ポップコーン在庫
[DataMember(Name = "Data19")]
public List<ProductStockData> ShopStock;
// タンクポップコーン在庫
[DataMember(Name = "Data20")]
public List<StorageTank> StorageTanks;
[DataMember(Name = "Data21")]
public int Heart = 0;
[DataMember(Name = "Data22")]
public int[] Pans;
[DataMember(Name = "Data23")]
public int ViewedShopLevel;
[DataMember(Name = "Data24")]
public ProductRefillMode RefillMode;
[DataMember(Name = "Data25")]
private int[] achievedMission;
public List<int> AchievedMission;
[DataMember(Name = "Data26")]
public int TastingCount;
// BulkOrder
[DataMember(Name = "Data27")]
public int OrderIconIndex;
[DataMember(Name = "Data28")]
public int OrderIdInProgress;
[DataMember(Name = "Data29")]
public int OrderTextId;
[DataMember(Name = "Data30")]
public int OrderConditionCount;
[DataMember(Name = "Data31")]
public int CancelOrderId;
[DataMember(Name = "Data32")]
public int AchievedOrderLevel;
[DataMember(Name = "Data33")]
public List<BulkOrderResultData> CompletedProductList;
[DataMember(Name = "Data34")]
private int[] deliveredOrder;
public List<int> DeliveredOrder;
// reward
[DataMember(Name = "Data35")]
public long fertilizerTime = DateTime.UtcNow.ToBinary();
[DataMember(Name = "Data36")]
public long increaseCustomerTime= DateTime.UtcNow.ToBinary();
[DataMember(Name = "Data37")]
public long kitchenRefreshTime= DateTime.UtcNow.ToBinary();
// tutorial
[DataMember(Name = "Data38")]
public TutorialFlag FinishedFlags = TutorialFlag.None;
// フライパン
[DataMember(Name = "Data39")]
public int SelectedPanId;
// 遅延追加用加算枠
[DataMember(Name = "Data40")]
public int WaitAddCoin;
[DataMember(Name = "Data41")]
public int WaitAddHeart;
[DataMember(Name = "Data42")]
public ProductStockData WaitAddStock;
// reward(v1.1追加)
[DataMember(Name = "Data51")]
public long vipCustomerLimitTime = DateTime.UtcNow.ToBinary();
[DataMember(Name = "Data52")]
public bool vipCustomerFirstOpen;
// 自動調理(v1.2追加)
[DataMember(Name = "Data53")]
public int AutoCookLevel;
[DataMember(Name = "Data54")]
public int AutoCookUsesCount;
[DataMember(Name = "Data55")]
public long AutoCookFinishTime = DateTime.UtcNow.ToBinary();
[DataMember(Name = "Data56")]
public int[] AutoCookProducts;
// カスタマイズ機能(v1.3追加)
[DataMember(Name = "Data57")]
public int ShopCustomizeCoin;
[DataMember(Name = "Data58")]
public int ShopCustomizePoint;
[DataMember(Name = "Data59")]
public int ShopCustomizeLevel;
[DataMember(Name = "Data60")]
public int[] ShopCustomizeMyItems;
[DataMember(Name = "Data61")]
public ShopCustomizeSettings ShopCustomizeSettings;
// スクロールゲーム
[DataMember(Name = "Data62")]
public int ScrollGameTodayPlayCount;
[DataMember(Name = "Data63")]
public long ScrollGameLastPlayTime = DateTime.UtcNow.ToBinary();
[DataMember(Name = "Data64")]
public List<ScrollGameScoreData> ScrollGamePlaceScoreList;
[DataMember(Name = "Data65")]
public List<ScrollGameScoreData> ScrollGameStageScoreList;
// ワールドマップ追加(v1.7.0)
// 1つ前の都市のBrotherHeart今の都市のハートで合計値を保存
public int BrotherHeart; // バイトを雇うまでに兄弟が獲得したハート(最新店舗でなくなったときの値で固定
public int CurrentCityId; // 選択中の都市
public CityGameDataDict CityGameDataDict; // 都市ごとのデータ
// 資金調達
public FundingDict FundingDict; // 国ごとの調達済み資金
public bool IsFundingCompleted; // 調達完了フラグ
// バイト君
public int PartTimerLevel;
public int PartTimerElapsed; // ゲーム起動中経過時間
// mission
[DataMember(Name = "Data1001")]
public int TotalAddCoin { get; private set; }
[DataMember(Name = "Data1002")]
public int TotalSubCoin { get; private set; }
[DataMember(Name = "Data1003")]
public int TotalAddCornSeed { get; private set; }
[DataMember(Name = "Data1004")]
public int TotalCustomerCount { get; private set; }
[DataMember(Name = "Data1005")]
public List<ProductStockData> TotalSalesList { get; private set; }
[DataMember(Name = "Data1006")]
public int BulkOrderDeliveredCount;
[DataMember(Name = "Data1007")]
public int TotalVipCustomer { get; private set; }
[DataMember(Name = "Data1008")]
public int TotalUseFertiliser { get; private set; }
[DataMember(Name = "Data1009")]
public int TotalUseAdWalker { get; private set; }
[DataMember(Name = "Data1010")]
public int TotalUseAutoCook { get; private set; }
public int TotalSales => TotalSalesList.Sum(data => data.Stock);
public int RareTotalSales => TotalSalesList.Where(data => data.Rarity != ProductRarity.Normal).Sum(data => data.Stock);
// daily mission
[DataMember(Name = "Data2001")]
public long lastDailyMissionSetTime = DateTime.MinValue.ToBinary();
[DataMember(Name = "Data2002")]
public int[] dailyMissionIdArray;
[DataMember(Name = "Data2003")]
public int[] dailyMissionAchievedIdArray;
[DataMember(Name = "Data2004")]
public bool dailyMissionCompleted;
// [DataMember(Name = "Data2100")]
[DataMember(Name = "Data2101")]
public int DailyTotalAddCoin { get; private set; }
[DataMember(Name = "Data2102")]
public int DailyTotalSubCoin { get; private set; }
[DataMember(Name = "Data2103")]
public int DailyTotalAddCornSeed { get; private set; }
[DataMember(Name = "Data2104")]
public int DailyTotalCustomerCount { get; private set; }
[DataMember(Name = "Data2105")]
public List<ProductStockData> DailyTotalSalesList { get; private set; }
[DataMember(Name = "Data2106")]
public int DailyRecipeGetCount;
[DataMember(Name = "Data2107")]
public int DailyBulkOrderDeliveredCount;
[DataMember(Name = "Data2108")]
public int DailyVipCustomer { get; private set; }
[DataMember(Name = "Data2109")]
public int DailyWatchVideo { get; private set; }
[DataMember(Name = "Data2110")]
public int DailyUseFertiliser { get; private set; }
[DataMember(Name = "Data2111")]
public int DailyUseAdWalker { get; private set; }
[DataMember(Name = "Data2112")]
public int DailyUseAutoCook { get; private set; }
public int DailyTotalSales => DailyTotalSalesList.Sum(data => data.Stock);
public int DailyRareTotalSales => DailyTotalSalesList.Where(data => data.Rarity != ProductRarity.Normal).Sum(data => data.Stock);
private void ChangeCornSeed(int value)
{
if (cornSeed < value)
{
TotalAddCornSeed += value - cornSeed;
DailyTotalAddCornSeed += value - cornSeed;
}
cornSeed = value;
}
private void ChangeCoin(int value)
{
// Debug.Log($"{coin} {value}");
if (coin < value)
{
TotalAddCoin += value - coin;
DailyTotalAddCoin += value - coin;
}
else
{
TotalSubCoin += coin - value;
DailyTotalSubCoin += coin - value;
}
coin = value;
}
public void AddCustomerCount(int value)
{
TotalCustomerCount += value;
DailyTotalCustomerCount += value;
}
public void AddVipCustomerCount(int value)
{
TotalVipCustomer += value;
DailyVipCustomer += value;
}
public void AddSalesCount(int id, int stock, ProductRarity rarity)
{
OrderConditionCount += stock;
if (!(TotalSalesList.FirstOrDefault(x => x.FlavorId == id && x.Rarity == rarity) is ProductStockData stockData))
{
stockData = new ProductStockData {FlavorId = id, Rarity = rarity, Stock = 0};
TotalSalesList.Add(stockData);
}
stockData.Stock += stock;
if (!(DailyTotalSalesList.FirstOrDefault(x => x.FlavorId == id && x.Rarity == rarity) is ProductStockData dailyStockData))
{
dailyStockData = new ProductStockData {FlavorId = id, Rarity = rarity, Stock = 0};
DailyTotalSalesList.Add(dailyStockData);
}
dailyStockData.Stock += stock;
}
public int GetTotalSalesByFlavor(int id)
{
return TotalSalesList.Where(data => data.FlavorId == id).Sum(data => data.Stock);
}
public int GetTotalSalesByFlavorWithRare(int id)
{
return TotalSalesList.Where(data => data.FlavorId == id && data.Rarity != ProductRarity.Normal).Sum(data => data.Stock);
}
public int GetDailyTotalSalesByFlavor(int id)
{
return DailyTotalSalesList.Where(data => data.FlavorId == id).Sum(data => data.Stock);
}
public int GetDailyTotalSalesByFlavorWithRare(int id)
{
return DailyTotalSalesList.Where(data => data.FlavorId == id && data.Rarity != ProductRarity.Normal).Sum(data => data.Stock);
}
public void ResetNormalTotalCount()
{
TotalAddCoin = 0;
TotalSubCoin = 0;
TotalAddCornSeed = 0;
TotalCustomerCount = 0;
TotalSalesList.Clear();
BulkOrderDeliveredCount = 0;
adCount = 0;
TotalVipCustomer = 0;
TotalUseFertiliser = 0;
TotalUseAdWalker = 0;
TotalUseAutoCook = 0;
}
public void ResetDailyTotalCount()
{
DailyTotalAddCoin = 0;
DailyTotalSubCoin = 0;
DailyTotalAddCornSeed = 0;
DailyTotalCustomerCount = 0;
DailyTotalSalesList.Clear();
DailyRecipeGetCount = 0;
DailyBulkOrderDeliveredCount = 0;
DailyWatchVideo = 0;
DailyVipCustomer = 0;
DailyUseFertiliser = 0;
DailyUseAdWalker = 0;
DailyUseAutoCook = 0;
}
public void AddTastingCustomerCount(int value)
{
TastingCount += Mathf.FloorToInt(value / 2f);
}
public TimeSpan GetDailyMissionLimitTime()
{
return DateTime.FromBinary(lastDailyMissionSetTime).ToLocalTime().AddHours(Const.DailyMissionResetOffset).Date
.AddDays(1).AddHours(-Const.DailyMissionResetOffset)
.Subtract(DateTime.UtcNow.ToLocalTime());
// return CalcLimitTime(lastDailyMissionSetTime, Const.DailyMissionResetOffset); // 要検証
}
public void FinishTutorial()
{
FinishedFlags |= TutorialFlag.FirstPlay;
fertilizerTime = DateTime.UtcNow.ToBinary();
increaseCustomerTime = DateTime.UtcNow.ToBinary();
kitchenRefreshTime = DateTime.UtcNow.ToBinary();
}
public void MoveCoin(int value)
{
// 退避していたコインを加算
WaitAddCoin -= value;
Coin += value;
}
public void MoveHeart(int value)
{
WaitAddHeart -= value;
Heart += value;
}
public void MoveAllWaitValue()
{
#if UNITY_EDITOR
Debug.Log($"WaitAddValue:{WaitAddCoin},{WaitAddHeart}");
#endif
MoveCoin(WaitAddCoin);
MoveHeart(WaitAddHeart);
}
public void AddAdCount(){
adCount++;
DailyWatchVideo++;
}
public void AddUseFertiliser()
{
TotalUseFertiliser++;
DailyUseFertiliser++;
}
public void AddUseAdWalker()
{
TotalUseAdWalker++;
DailyUseAdWalker++;
}
public void AddUseAutoCook()
{
TotalUseAutoCook++;
DailyUseAutoCook++;
}
public void InitTank()
{
StorageTanks.Clear();
StorageTanks.Add(new StorageTank
{
Capacity = Const.TankCapacity,
FlavorId = -1,
});
}
private TimeSpan CalcLimitTime(long time, int offsetHour) => DateTime.FromBinary(time).ToLocalTime()
.Date.AddDays(1).AddHours(offsetHour)
.Subtract(DateTime.UtcNow.ToLocalTime());
public TimeSpan GetScrollGameLimitTime() => CalcLimitTime(ScrollGameLastPlayTime, Const.ScrollGameDailyResetOffsetHours);
// public void ChangeAvatar(AvatarData avatarData){
// newAvatarIdList.Remove(avatarData.id);
// }
// public void AddAvatar(AvatarData avatarData){
// if(HasAvatar(avatarData)) return ;
// avatarIdList.Add(avatarData.id);
// newAvatarIdList.Add(avatarData.id);
// }
// public bool HasAvatar(AvatarData avatarData){
// return avatarIdList.Exists(id => id == avatarData.id);
// }
// public void SetRandom(bool isRandom, AvatarCategory category){
// }
// public bool GetRandom(AvatarCategory category){
// return false;
// }
// [OnDeserialized] Unityだと機能しない
public void OnDeserialized(){
PreDeserialize();
// if(avatarIdList.Count < 1){
// avatarIdList.Add(Const.DefaultAvatarId);
// }
if (MyRecipes.Length < 1)
{
MyRecipes = new[] {Const.DefaultRecipeId};
}
if (StorageTanks.Count < 1)
{
InitTank();
}
if (Pans.Length < 1)
{
Pans = new[] {Const.DefaultPanId};
}
if (AutoCookLevel < 1)
{
AutoCookLevel = 1;
}
if (ShopCustomizeLevel < 1)
{
ShopCustomizeLevel = 1;
}
if (ShopCustomizeMyItems.Length < 1)
{
ShopCustomizeMyItems = new[]
{
Const.ShopCustomizeDefaultCartId,
Const.ShopCustomizeDefaultDecoration1Id,
Const.ShopCustomizeDefaultDecoration2Id,
Const.ShopCustomizeDefaultStockId,
Const.ShopCustomizeDefaultSignBoardId,
};
}
if (CurrentCityId < 1)
{
CurrentCityId = 1;
}
// CityGameData
foreach (var cityGameData in CityGameDataDict.Values)
{
cityGameData.OnDeserialized();
}
if (PartTimerLevel < 1)
{
PartTimerLevel = 1;
}
// 追加した要素の初期化用
// TODO Release前にまっさらにする
}
public void PreDeserialize(){
// avatarIdList = avatarIdArray == null ? new List<int>() : avatarIdArray.ToList();
// newAvatarIdList = newAvatarIdArray == null ? new List<int>() : newAvatarIdArray.ToList();
// lastAdRewardTimeList = lastAdRewardTimeArray == null ? new List<long>() : lastAdRewardTimeArray.ToList();
MyRecipes = MyRecipes ?? new int[0];
Material = Material ?? new List<MaterialData>();
ShopStock = ShopStock ?? new List<ProductStockData>();
StorageTanks = StorageTanks ?? new List<StorageTank>();
Pans = Pans ?? new int[0];
TotalSalesList = TotalSalesList ?? new List<ProductStockData>();
AchievedMission = achievedMission?.ToList() ?? new List<int>();
CompletedProductList = CompletedProductList ?? new List<BulkOrderResultData>();
DeliveredOrder = deliveredOrder?.ToList() ?? new List<int>();
dailyMissionIdArray = dailyMissionIdArray ?? new int[0];
dailyMissionAchievedIdArray = dailyMissionAchievedIdArray ?? new int[0];
DailyTotalSalesList = DailyTotalSalesList ?? new List<ProductStockData>();
WaitAddStock = WaitAddStock ?? new ProductStockData{Rarity = ProductRarity.Normal};
AutoCookProducts = AutoCookProducts ?? Array.Empty<int>();
ShopCustomizeSettings = ShopCustomizeSettings ?? new ShopCustomizeSettings();
ShopCustomizeMyItems = ShopCustomizeMyItems ?? Array.Empty<int>();
ScrollGamePlaceScoreList = ScrollGamePlaceScoreList ?? new List<ScrollGameScoreData>();
ScrollGameStageScoreList = ScrollGameStageScoreList ?? new List<ScrollGameScoreData>();
CityGameDataDict ??= new CityGameDataDict();
FundingDict ??= new FundingDict();
}
private Dictionary<int, int> ArrayToDictionary(KeyValueOfintint[] array){
var dictionary = new Dictionary<int, int>();
if(array != null && array.Length > 0){
foreach(var kv in array){
dictionary.Add(kv.Key, kv.Value);
}
}
return dictionary;
}
public void PreSerialize(){
// avatarIdArray = avatarIdList.ToArray();
// newAvatarIdArray = newAvatarIdList.ToArray();
// lastAdRewardTimeArray = lastAdRewardTimeList.ToArray();
achievedMission = AchievedMission.ToArray();
deliveredOrder = DeliveredOrder.ToArray();
// CityGameData
foreach (var cityGameData in CityGameDataDict.Values)
{
cityGameData.PreSerialize();
}
}
private KeyValueOfintint[] DictionaryToArray(Dictionary<int, int> dictionary){
var array = new KeyValueOfintint[dictionary.Count];
int index = 0;
foreach(var kvp in dictionary){
array[index++] = new KeyValueOfintint(kvp);
}
return array;
}
}
public static class GameDataManager {
public enum LoadState {
NoFile,
ExistsClashed,
DeserializeFailed,
Old,
Succeeded,
}
// private static readonly int DiskFullTextId = 201;
// private static readonly int UnauthorizedAccessExceptionTextId = 202;
private static GameData dataCache = null;
public static GameData GameData {
get{ return dataCache ?? (dataCache = LoadGameData()); }
}
public static bool IsLoaded {
get{ return dataCache != null; }
}
public static bool ExistsGameData(){
return UsayaStorageManager.Exists(UsayaStorageFilename.Main_Data, Const.GameDataTag) || UsayaStorageManager.ExistsBackup(UsayaStorageFilename.Main_Data, Const.GameDataTag);
}
private static GameData LoadGameData(){
GameData data = null;
var loadState = LoadState.ExistsClashed;
try{
if(UsayaStorageManager.Exists(UsayaStorageFilename.Main_Data, Const.GameDataTag)){
loadState = LoadState.DeserializeFailed;
data = StringToGameData(UsayaStorageManager.Load<string>(UsayaStorageFilename.Main_Data, Const.GameDataTag));
loadState = LoadState.Succeeded;
}else{
loadState = LoadState.NoFile;
}
}catch(Exception){
}finally{
var backup = LoadGameDataBackup(loadState);
if(loadState != LoadState.Succeeded || (data.stage < backup.stage)){
data = backup;
if(loadState == LoadState.Succeeded){
// AnalyticsManager.DataLoadWarning(LoadState.Old);
}
}
}
data.OnDeserialized();
if(Application.version.CompareVersion(data.lastPlayedVersion) != 0){
data.lastPlayedVersion = Application.version;
}
return data;
}
private static GameData LoadGameDataBackup(LoadState mainLoadState){
GameData result = null;
var loadState = LoadState.ExistsClashed;
try{
if(UsayaStorageManager.ExistsBackup(UsayaStorageFilename.Main_Data, Const.GameDataTag)){
loadState = LoadState.DeserializeFailed;
result = StringToGameData(UsayaStorageManager.LoadBackup(UsayaStorageFilename.Main_Data, Const.GameDataTag));
loadState = LoadState.Succeeded;
if(mainLoadState != LoadState.Succeeded){
// AnalyticsManager.DataLoadWarning(mainLoadState);
}
}else{
loadState = LoadState.NoFile;
}
}catch(Exception){
}finally{
if(mainLoadState != LoadState.Succeeded && loadState != LoadState.NoFile){
// AnalyticsManager.DataLoadWarning(mainLoadState, loadState);
}
if(loadState != LoadState.Succeeded){
result = CreateData();
}
}
return result;
}
private static GameData CreateData(){
var data = new GameData();
data.lastPlayedVersion = Application.version;
return data;
}
public static bool OverWriteGameData(string dataString){
try{
dataCache = StringToGameData(dataString);
return true;
}catch{
return false;
}
}
public static void SaveGameData(){
string data = GameDataToString(GameData);
bool isMainSaved = false;
Exception exceptionMain = null;
try{
UsayaStorageManager.Save<string>(UsayaStorageFilename.Main_Data, Const.GameDataTag, data);
isMainSaved = true;
}catch(Exception e){
// TODO ログサーバが出来たらExceptionを送りたい
exceptionMain = e;
}finally{
bool isBackupSaved = false;
Exception exceptionBackup = null;
try{
UsayaStorageManager.SaveBackup(UsayaStorageFilename.Main_Data, Const.GameDataTag, data);
isBackupSaved = true;
}catch(Exception e){
// TODO ログサーバが出来たらExceptionを送りたい
exceptionBackup = e;
}finally{
if(!isMainSaved && !isBackupSaved){
// AnalyticsManager.DataSaveWarning("GameData", SaveState.MainAndBackupFailed);
// SaveFailedDialogManager.ShowDialog(exceptionMain, exceptionBackup);
}else if(!isMainSaved){
// AnalyticsManager.DataSaveWarning("GameData", SaveState.MainFailed);
}else if(!isBackupSaved){
// AnalyticsManager.DataSaveWarning("GameData", SaveState.BackupFailed);
}
}
}
}
public static string GetGameDataString(){
return GameDataToString(GameData);
}
private static string GameDataToString(GameData data){
data.PreSerialize();
return AvoEx.AesEncryptor.Encrypt(
StringExtensions.DataToXML<GameData>(data)
.Replace("KeyValueOfintint", "KVOii")
.Replace("KeyValueOfintlong", "KVOil")
.Replace("KeyValueOfintInfiniteFloat", "KVOiIF")
// .Compression()
);
}
private static GameData StringToGameData(string str){
str = AvoEx.AesEncryptor.DecryptString(str)
// .DeCompression()
.Replace("KVOii", "KeyValueOfintint")
.Replace("KVOil", "KeyValueOfintlong")
.Replace("KVOiIF", "KeyValueOfintInfiniteFloat");
return StringExtensions.XMLToData<GameData>(str);
}
/// <summary>
/// CityIdから都市セーブデータを取得
/// はじめの都市のみ、別クラスにより透過的にGameData上の値を直接参照
/// </summary>
/// <param name="cityId"></param>
/// <returns></returns>
public static GameData GetCityGameData(int cityId) =>
cityId switch
{
1 => GameData,
_ => GameData.CityGameDataDict.TryGetValue(cityId, out var result) ? result : default
};
public static GameData GetCurrentCityGameData() => GetCityGameData(GameData.CurrentCityId);
#if UNITY_EDITOR || DEVELOPMENT_BUILD
public static void ResetData(){
dataCache = CreateData();
dataCache.OnDeserialized();
}
#endif
}