diff --git a/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/CookingResult.cs b/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/CookingResult.cs index 41a438b5..b915a576 100644 --- a/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/CookingResult.cs +++ b/popcorn/Assets/MyGame/Scenes/Cooking/Scripts/CookingResult.cs @@ -44,19 +44,21 @@ public class CookingResult : MonoBehaviour var viewType = LocalCacheManager.Load(Const.ProductViewTypeTag, ProductViewType.Default); var productData = LocalCacheManager.Load(PopcornGameManager.CookingDataTag); var (rarityData, resultData, successAction) = LocalCacheManager.Load<(RarityData, CornResult, Action)>(PopcornGameManager.CookingResultDataTag); + var cityGameData = GameDataManager.GetCurrentCityGameData(); + var globalGameData = GameDataManager.GameData; result.Value = resultData; SetData(productData, rarityData, viewType); // 材料消費&仮獲得 - RecipeDetailView.ConsumeMaterial(productData); + RecipeDetailView.ConsumeMaterial(productData, GameDataManager.GameData.CurrentCityId); if (viewType == ProductViewType.Default) { result.Subscribe(cornResult => { // 仮獲得データ登録 - GameDataManager.GameData.WaitAddStock.FlavorId = productData.id; - GameDataManager.GameData.WaitAddStock.Stock = cornResult == CornResult.Failure ? 0 : productData.volume; - GameDataManager.GameData.WaitAddStock.Rarity = cornResult == CornResult.Perfect ? rarityData.Rarity : ProductRarity.Normal; + cityGameData.WaitAddStock.FlavorId = productData.id; + cityGameData.WaitAddStock.Stock = cornResult == CornResult.Failure ? 0 : productData.volume; + cityGameData.WaitAddStock.Rarity = cornResult == CornResult.Perfect ? rarityData.Rarity : ProductRarity.Normal; GameDataManager.SaveGameData(); }).AddTo(this); } @@ -66,13 +68,13 @@ public class CookingResult : MonoBehaviour var materialNumber = LocalCacheManager.Load(BulkOrder.MaterialNumberTag); result.Where(x => x != CornResult.Failure ).Subscribe(cornResult => { - if (!(GameDataManager.GameData.CompletedProductList.FirstOrDefault(data => data.Number == materialNumber) is BulkOrderResultData bulkOrderResultData)) + if (!(cityGameData.CompletedProductList.FirstOrDefault(data => data.Number == materialNumber) is BulkOrderResultData bulkOrderResultData)) { bulkOrderResultData = new BulkOrderResultData { Number = materialNumber }; - GameDataManager.GameData.CompletedProductList.Add(bulkOrderResultData); + cityGameData.CompletedProductList.Add(bulkOrderResultData); } // レア上書き bulkOrderResultData.Rarity = cornResult == CornResult.Perfect ? rarityData.Rarity : ProductRarity.Normal; @@ -81,7 +83,7 @@ public class CookingResult : MonoBehaviour } // チュートリアル時 - if (!GameDataManager.GameData.FinishedFlags.HasFlag(TutorialFlag.FirstPlay)) + if (!globalGameData.FinishedFlags.HasFlag(TutorialFlag.FirstPlay)) { // ボタン非表示 SetUI(resultData, viewType, CheckMakeOne(resultData, productData), true); @@ -107,7 +109,7 @@ public class CookingResult : MonoBehaviour okButton.OnClickAsObservable().Take(1).Subscribe(_ => { // 獲得、遷移 - MoveStock(GameDataManager.GameData.WaitAddStock); + MoveStock(cityGameData.WaitAddStock, GameDataManager.GameData.CurrentCityId); GameDataManager.SaveGameData(); TransitionManager.Instance.LoadScene(GameScenes.Main); }).AddTo(this); @@ -141,11 +143,11 @@ public class CookingResult : MonoBehaviour okButton.OnClickAsObservable().Take(1).Subscribe(_ => { // 獲得、遷移 - MoveStock(GameDataManager.GameData.WaitAddStock); + MoveStock(cityGameData.WaitAddStock, GameDataManager.GameData.CurrentCityId); // 獲得後、確率でVip宣伝 - var shopStock = GameDataManager.GameData.ShopStock.Count; - var tankStock = GameDataManager.GameData.StorageTanks.Sum(x => x.Stock); + var shopStock = cityGameData.ShopStock.Count; + var tankStock = cityGameData.StorageTanks.Sum(x => x.Stock); var totalStock = shopStock + tankStock; if (totalStock >= Const.VipCustomerRewardStock) { @@ -154,8 +156,8 @@ public class CookingResult : MonoBehaviour #if UNITY_EDITOR Debug.Log($"flag VipReward"); #endif - GameDataManager.GameData.vipCustomerFirstOpen = true; - GameDataManager.GameData.vipCustomerLimitTime = DateTime.UtcNow.AddSeconds(60).ToBinary(); + globalGameData.vipCustomerFirstOpen = true; + globalGameData.vipCustomerLimitTime = DateTime.UtcNow.AddSeconds(60).ToBinary(); } } GameDataManager.SaveGameData(); @@ -167,7 +169,7 @@ public class CookingResult : MonoBehaviour makeOneButton.OnClickAsObservable().Take(1).Subscribe(_ => { // 獲得、遷移 - MoveStock(GameDataManager.GameData.WaitAddStock); + MoveStock(cityGameData.WaitAddStock, GameDataManager.GameData.CurrentCityId); GameDataManager.SaveGameData(); WorldMarketManager.Instance.IsPause.Value = false; SoundManager.Instance.ChangeVolumeUniqueBGM(1f); @@ -256,37 +258,40 @@ public class CookingResult : MonoBehaviour // まだ在庫追加前なのでレシピvolumeを2倍にしてタンクの空きを確認 doubleProductData = new ProductData(productData, 1){volume = productData.volume * 2}; } - var hasSpace = RecipeDetailView.CheckTank(doubleProductData); + var hasSpace = RecipeDetailView.CheckTank(doubleProductData, GameDataManager.GameData.CurrentCityId); //素材確認 - var checkResult = RecipeDetailView.CheckAmount(productData); + var checkResult = RecipeDetailView.CheckAmount(productData, GameDataManager.GameData.CurrentCityId); var hasMaterials = checkResult.material1 && checkResult.material2 && checkResult.material3; return hasSpace && hasMaterials; } - public static void MoveStock(ProductStockData productStockData) + public static void MoveStock(ProductStockData productStockData, int cityId) { - AddStock(productStockData); + AddStock(productStockData, cityId); productStockData.Stock = 0; } - public static void AddStock(ProductData productData, ProductRarity rarity = ProductRarity.Normal) + public static void AddStock(ProductData productData, ProductRarity rarity = ProductRarity.Normal) => + AddStock(productData, rarity, GameDataManager.GameData.CurrentCityId); + + public static void AddStock(ProductData productData, ProductRarity rarity, int cityId) { - AddStock(new ProductStockData{FlavorId = productData.id, Stock = productData.volume, Rarity = rarity}); + AddStock(new ProductStockData{FlavorId = productData.id, Stock = productData.volume, Rarity = rarity}, cityId); GameDataManager.SaveGameData(); } - public static void AddStock(ProductStockData productStockData) + public static void AddStock(ProductStockData productStockData, int cityId) { if (productStockData.Stock == 0) { return; } - var gameData = GameDataManager.GameData; + var cityGameData = GameDataManager.GetCityGameData(cityId); // 店頭の空きに追加 var remain = productStockData.Stock; - var shopSpace = WorldMarketManager.ShopStockCount - gameData.ShopStock.Count; + var shopSpace = WorldMarketManager.ShopStockCount - cityGameData.ShopStock.Count; var stockCount = Mathf.Min(shopSpace, remain); - gameData.ShopStock.AddRange(Enumerable.Repeat(new ProductStockData + cityGameData.ShopStock.AddRange(Enumerable.Repeat(new ProductStockData { FlavorId = productStockData.FlavorId, Rarity = productStockData.Rarity, @@ -295,15 +300,16 @@ public class CookingResult : MonoBehaviour // ShopStockに補充された場合、DisplayFlavors更新 if (stockCount > 0) { - var market = WorldMarketManager.Instance.GetCurrentCityMarket(); - market.RefillDisplayFlavors(gameData.ShopStock); - market.CheckStock(gameData.ShopStock); + var market = WorldMarketManager.Instance.GetMarket(cityId); + market.RefillDisplayFlavors(); + market.UpdateShopState(); + market.CheckPartTimerMode(); } // 空タンク並び替え - gameData.StorageTanks = gameData.StorageTanks.OrderBy(tank => tank.IsEmpty).ToList(); + cityGameData.StorageTanks = cityGameData.StorageTanks.OrderBy(tank => tank.IsEmpty).ToList(); // 空きのタンクを確認 - gameData.StorageTanks + cityGameData.StorageTanks .Select((tank, i) => (tank, i)) .Where(x => x.tank.IsEmpty || x.tank.FlavorId == productStockData.FlavorId && !x.tank.IsFull) .Select(x => (x.i, space: x.tank.Capacity - x.tank.Stock)) @@ -316,13 +322,13 @@ public class CookingResult : MonoBehaviour return; } // タンクが空ならフレーバー設定 - if (gameData.StorageTanks[x.i].IsEmpty) + if (cityGameData.StorageTanks[x.i].IsEmpty) { - gameData.StorageTanks[x.i].FlavorId = productStockData.FlavorId; + cityGameData.StorageTanks[x.i].FlavorId = productStockData.FlavorId; } // タンクに追加 stockCount = Mathf.Min(x.space, remain); - gameData.StorageTanks[x.i].AddStock(productStockData.Rarity, stockCount); + cityGameData.StorageTanks[x.i].AddStock(productStockData.Rarity, stockCount); remain -= stockCount; }); } diff --git a/popcorn/Assets/MyGame/Scenes/recipe/Scripts/PanSelector.cs b/popcorn/Assets/MyGame/Scenes/recipe/Scripts/PanSelector.cs index fbab8344..8d2d7849 100644 --- a/popcorn/Assets/MyGame/Scenes/recipe/Scripts/PanSelector.cs +++ b/popcorn/Assets/MyGame/Scenes/recipe/Scripts/PanSelector.cs @@ -21,9 +21,10 @@ public class PanSelector : MonoBehaviour selectedPanData.AddTo(this); selectedIndex.AddTo(this); var panList = SpreadsheetDataManager.Instance.GetBaseDataList(Const.PanDataSheet); - var myPanList = panList.Where(data => GameDataManager.GameData.Pans.Contains(data.id)).ToList(); + var globalGameData = GameDataManager.GameData; + var myPanList = panList.Where(data => globalGameData.Pans.Contains(data.id)).ToList(); var panCount = myPanList.Count; - var initIndex = myPanList.FindIndex(data => data.id == GameDataManager.GameData.SelectedPanId); + var initIndex = myPanList.FindIndex(data => data.id == globalGameData.SelectedPanId); if (initIndex == -1) { initIndex = 0; @@ -32,7 +33,7 @@ public class PanSelector : MonoBehaviour selectedPanData.SkipLatestValueOnSubscribe().Subscribe(data => { SetData(data); - GameDataManager.GameData.SelectedPanId = data.id; + globalGameData.SelectedPanId = data.id; }).AddTo(this); selectedIndex.Subscribe(x => { diff --git a/popcorn/Assets/MyGame/Scenes/recipe/Scripts/RecipeDetailView.cs b/popcorn/Assets/MyGame/Scenes/recipe/Scripts/RecipeDetailView.cs index 80b333fe..00c067d7 100644 --- a/popcorn/Assets/MyGame/Scenes/recipe/Scripts/RecipeDetailView.cs +++ b/popcorn/Assets/MyGame/Scenes/recipe/Scripts/RecipeDetailView.cs @@ -36,15 +36,17 @@ public class RecipeDetailView : MonoBehaviour [SerializeField] private GameObject flavor2View; private Color redColor; + private GameData cityGameData; private void Start() { ColorUtility.TryParseHtmlString(Const.RedColorString, out redColor); var viewType = LocalCacheManager.Load(Const.ProductViewTypeTag, ProductViewType.Default); var data = LocalCacheManager.Load(PopcornGameManager.CookingDataTag); - var gameData = GameDataManager.GameData; + cityGameData = GameDataManager.GetCurrentCityGameData(); + var globalGameData = GameDataManager.GameData; - if (!gameData.FinishedFlags.HasFlag(TutorialFlag.FirstPlay)) + if (!globalGameData.FinishedFlags.HasFlag(TutorialFlag.FirstPlay)) { // マスク表示 var go = TutorialManager.Instance.ShowTutorialMask(transform.parent.parent, nextButton.transform as RectTransform); @@ -73,7 +75,7 @@ public class RecipeDetailView : MonoBehaviour SetRecipe(data, viewType); var isPassedAmount = CheckAmountAndChangeTextColor(data); - var isPassedTank = CheckTank(data); + var isPassedTank = CheckTank(data, GameDataManager.GameData.CurrentCityId); switch (viewType) { @@ -94,28 +96,26 @@ public class RecipeDetailView : MonoBehaviour } } - public static void ConsumeMaterial(ProductData productData) + public static void ConsumeMaterial(ProductData productData, int cityId) { - var gameData = GameDataManager.GameData; - gameData.CornSeed -= productData.MaterialList[0].amount; - if (gameData.Material.FirstOrDefault(x => x.Id == productData.MaterialList[1].id) is MaterialData material1) + var cityGameData = GameDataManager.GetCityGameData(cityId); + cityGameData.CornSeed -= productData.MaterialList[0].amount; + if (cityGameData.Material.FirstOrDefault(x => x.Id == productData.MaterialList[1].id) is MaterialData material1) { material1.Amount -= productData.MaterialList[1].amount; } - if (productData.GetMaterialCount() == 3 && gameData.Material.FirstOrDefault(x => x.Id == productData.MaterialList[2].id) is MaterialData material2) + if (productData.GetMaterialCount() == 3 && cityGameData.Material.FirstOrDefault(x => x.Id == productData.MaterialList[2].id) is MaterialData material2) { material2.Amount -= productData.MaterialList[2].amount; } GameDataManager.SaveGameData(); } - public void SetRecipe(ProductData data, ProductViewType viewType) + private void SetRecipe(ProductData data, ProductViewType viewType) { - var gameData = GameDataManager.GameData; - // 在庫 - var shopStock = gameData.ShopStock.Count(stockData => stockData.FlavorId == data.id); - var tankStock = gameData.StorageTanks.FindAll(x => x.FlavorId == data.id).Sum(x => x.Stock); + var shopStock = cityGameData.ShopStock.Count(stockData => stockData.FlavorId == data.id); + var tankStock = cityGameData.StorageTanks.FindAll(x => x.FlavorId == data.id).Sum(x => x.Stock); flavorStock.text = $"{ScriptLocalization.UI.RecipeChoiceMyStockPrefix}{shopStock + tankStock}"; flavorName.text = data.Name; flavorPrice.text = data.price.ToString(); @@ -123,7 +123,7 @@ public class RecipeDetailView : MonoBehaviour flavorText.text = data.Text; flavorImageTarget.DestroyAllChildrens(); Instantiate(data.GetIconPrefab(), flavorImageTarget); - cornAmountText.text = string.Format(cornAmountFormat, gameData.CornSeed, data.MaterialList[0].amount); + cornAmountText.text = string.Format(cornAmountFormat, cityGameData.CornSeed, data.MaterialList[0].amount); switch (viewType) { @@ -143,14 +143,14 @@ public class RecipeDetailView : MonoBehaviour } var shopData = SpreadsheetDataManager.Instance.GetBaseDataList(Const.ShopDataSheet); - var flavor1Amount = gameData.Material.FirstOrDefault(x => x.Id == data.MaterialList[1].id)?.Amount ?? 0; + var flavor1Amount = cityGameData.Material.FirstOrDefault(x => x.Id == data.MaterialList[1].id)?.Amount ?? 0; flavor1AmountText.text = string.Format(flavorAmountFormat, flavor1Amount, data.MaterialList[1].amount); if (shopData.FirstOrDefault(sData => sData.itemId == data.MaterialList[1].id)?.GetIconPrefab() is Transform prefab1) { flavor1IconTarget.DestroyAllChildrens(); Instantiate(prefab1, flavor1IconTarget); } - var flavor2Amount = gameData.Material.FirstOrDefault(x => x.Id == data.MaterialList[2].id)?.Amount ?? 0; + var flavor2Amount = cityGameData.Material.FirstOrDefault(x => x.Id == data.MaterialList[2].id)?.Amount ?? 0; flavor2AmountText.text = string.Format(flavorAmountFormat, flavor2Amount, data.MaterialList[2].amount); if (shopData.FirstOrDefault(sData => sData.itemId == data.MaterialList[2].id)?.GetIconPrefab() is Transform prefab2) { @@ -162,7 +162,7 @@ public class RecipeDetailView : MonoBehaviour private bool CheckAmountAndChangeTextColor(ProductData productData) { - var checkResult = CheckAmount(productData); + var checkResult = CheckAmount(productData, GameDataManager.GameData.CurrentCityId); if (!checkResult.material1) { cornAmountText.color = redColor; @@ -178,36 +178,36 @@ public class RecipeDetailView : MonoBehaviour return checkResult.material1 && checkResult.material2 && checkResult.material3; } - public static (bool material1, bool material2, bool material3) CheckAmount(ProductData productData) + public static (bool material1, bool material2, bool material3) CheckAmount(ProductData productData, int cityId) { (bool a, bool b, bool c) flags = (true, true, true); - var gameData = GameDataManager.GameData; - if (gameData.CornSeed < productData.MaterialList[0].amount) + var cityGameData = GameDataManager.GetCityGameData(cityId); + if (cityGameData.CornSeed < productData.MaterialList[0].amount) { flags.a = false; } - if ((gameData.Material.FirstOrDefault(data => data.Id == productData.MaterialList[1].id)?.Amount ?? 0) < productData.MaterialList[1].amount) + if ((cityGameData.Material.FirstOrDefault(data => data.Id == productData.MaterialList[1].id)?.Amount ?? 0) < productData.MaterialList[1].amount) { flags.b = false; } - if (productData.GetMaterialCount() == 3 && (gameData.Material.FirstOrDefault(data => data.Id == productData.MaterialList[2].id)?.Amount ?? 0) < productData.MaterialList[2].amount) + if (productData.GetMaterialCount() == 3 && (cityGameData.Material.FirstOrDefault(data => data.Id == productData.MaterialList[2].id)?.Amount ?? 0) < productData.MaterialList[2].amount) { flags.c = false; } return flags; } - public static bool CheckTank(ProductData data) + public static bool CheckTank(ProductData data, int cityId) { - var gameData = GameDataManager.GameData; + var cityGameData = GameDataManager.GetCityGameData(cityId); // 店頭の空き確認 - if (data.volume <= WorldMarketManager.ShopStockCount - gameData.ShopStock.Count) + if (data.volume <= WorldMarketManager.ShopStockCount - cityGameData.ShopStock.Count) { return true; } // 空のタンク、同じフレーバーのタンク空き確認 - return gameData.StorageTanks + return cityGameData.StorageTanks .Where(tank => tank.IsEmpty || tank.FlavorId == data.id && !tank.IsFull) .Any(tank => data.volume <= tank.Capacity - tank.Stock); } diff --git a/popcorn/Assets/MyGame/Scenes/recipe/Scripts/RecipeSelectDialog.cs b/popcorn/Assets/MyGame/Scenes/recipe/Scripts/RecipeSelectDialog.cs index cca70a69..aa966bab 100644 --- a/popcorn/Assets/MyGame/Scenes/recipe/Scripts/RecipeSelectDialog.cs +++ b/popcorn/Assets/MyGame/Scenes/recipe/Scripts/RecipeSelectDialog.cs @@ -20,7 +20,7 @@ public class RecipeSelectDialog : MonoBehaviour // Start is called before the first frame update void Start() { - var gameData = GameDataManager.GameData; + var globalGameData = GameDataManager.GameData; closeButton.OnClickAsObservable().Take(1).Subscribe(_ => { transform.SetLocalScale(0); @@ -40,7 +40,7 @@ public class RecipeSelectDialog : MonoBehaviour var ownedRecipesList = shopDataList.Where(data => data.Category == ItemCategory.Recipe).Select(data => data.itemId).ToList(); var targetList = productDataList .Where(data => data.shopLevel != Const.SpecialShopLevel || ownedRecipesList.Contains(data.id)) - .OrderByDescending(data => gameData.MyRecipes.Contains(data.id)) + .OrderByDescending(data => globalGameData.MyRecipes.Contains(data.id)) .ThenBy(data => ownedRecipesList.Contains(data.id)) .ToList(); @@ -49,7 +49,7 @@ public class RecipeSelectDialog : MonoBehaviour var view = Instantiate(recipePrefab, content.transform); view.SetRecipe(productData); // 所持レシピ確認 - if (gameData.MyRecipes.Contains(productData.id)) + if (globalGameData.MyRecipes.Contains(productData.id)) { view.SetLockPanel(false); view.RecipeClickObservable.ThrottleFirst(TimeSpan.FromSeconds(.3f)).Subscribe(_ => @@ -66,7 +66,7 @@ public class RecipeSelectDialog : MonoBehaviour LayoutRebuilder.ForceRebuildLayoutImmediate(content); scrollRect.verticalNormalizedPosition = 1; - if (!gameData.FinishedFlags.HasFlag(TutorialFlag.FirstPlay)) + if (!globalGameData.FinishedFlags.HasFlag(TutorialFlag.FirstPlay)) { scrollRect.vertical = false; // マスク表示 diff --git a/popcorn/Assets/MyGame/Scripts/InitializeUnitySettings.cs b/popcorn/Assets/MyGame/Scripts/InitializeUnitySettings.cs index cf3f0ee7..e9f4467d 100644 --- a/popcorn/Assets/MyGame/Scripts/InitializeUnitySettings.cs +++ b/popcorn/Assets/MyGame/Scripts/InitializeUnitySettings.cs @@ -1,3 +1,5 @@ +using System.Collections.Generic; +using System.Linq; using UnityEngine; public sealed class InitializeUnitySettings : MonoBehaviour { @@ -27,11 +29,14 @@ public sealed class InitializeUnitySettings : MonoBehaviour { Application.targetFrameRate = 60; Input.multiTouchEnabled = false; - - // 遅延させていたパラメータを追加 - GameDataManager.GameData.MoveAllWaitValue(); - // 調理後リザルトでの仮獲得データを反映(タスクキル対策) - CookingResult.MoveStock(GameDataManager.GameData.WaitAddStock); + + foreach (var (cityId, cityGameData) in GameDataManager.GameData.CityGameDataDict.Prepend(new(Const.DefaultCityId, GameDataManager.GameData))) + { + // 遅延させていたパラメータを追加 + cityGameData.MoveAllWaitValue(); + // 調理後リザルトでの仮獲得データを反映(タスクキル対策) + CookingResult.MoveStock(cityGameData.WaitAddStock, cityId); + } GameDataManager.SaveGameData(); } }