diff --git a/popcorn/Assets/MyGame/Scenes/MiniGame/Scripts/ResultManager.cs b/popcorn/Assets/MyGame/Scenes/MiniGame/Scripts/ResultManager.cs index 58a07b16..28830d5b 100644 --- a/popcorn/Assets/MyGame/Scenes/MiniGame/Scripts/ResultManager.cs +++ b/popcorn/Assets/MyGame/Scenes/MiniGame/Scripts/ResultManager.cs @@ -116,10 +116,9 @@ namespace MyGame.Scenes.MiniGame.Scripts var customizeDataList = SpreadsheetDataManager.Instance.GetBaseDataList(Const.ShopCustomizeDataSheet); var sortedPlaceList = placeList.Where(data => data.itemId == 0).OrderBy(data => data.NeedScore).ToList(); + // 最新のスコアで獲得可能な範囲の報酬を取得 var achievedList = sortedPlaceList - .Where(data => data.NeedScore > prevPlaceScore) .Where(data => data.NeedScore <= placeScoreData.Score); - var prevNeedScore = sortedPlaceList.LastOrDefault(data => data.NeedScore <= prevPlaceScore)?.NeedScore ?? 0; var progressList = new List<(string name, Transform prefab, int needScore, bool isRecipe)>(); foreach (var placeData in achievedList) @@ -131,36 +130,58 @@ namespace MyGame.Scenes.MiniGame.Scripts { continue; } + var shopData = shopDataList.FirstOrDefault(data => data.itemId == placeData.recipeId && data.Category == ItemCategory.Recipe); + if (shopData is null) + { + continue; + } gameData.MyRecipes = new List(gameData.MyRecipes){placeData.recipeId}.ToArray(); gameData.DailyRecipeGetCount++; - var shopData = shopDataList.First(data => data.itemId == placeData.recipeId && data.Category == ItemCategory.Recipe); // progressList.Add((shopData.Name, shopData.GetPrefab(), placeData.NeedScore, true)); progressList.Add((shopData.Name, recipeMalaImagePrefab, placeData.NeedScore, true)); } else if (placeData.customizeId != 0) { - var customizeData = customizeDataList.First(data => data.id == placeData.customizeId); + if (gameData.ShopCustomizeMyItems.Contains(placeData.customizeId)) + { + continue; + } + var customizeData = customizeDataList.FirstOrDefault(data => data.id == placeData.customizeId); + if (customizeData is null) + { + continue; + } ShopCustomize.GetItem(customizeData); progressList.Add((customizeData.Name, customizeData.GetIconPrefab(), placeData.NeedScore, false)); } } + + // 前回獲得時の必要スコアを取得 + var prevNeedScore = sortedPlaceList.LastOrDefault(data => data.NeedScore < progressList[0].needScore)?.NeedScore ?? 0; - var nextAchievement = sortedPlaceList.FirstOrDefault(data => data.NeedScore > placeScoreData.Score); - if (nextAchievement != null) + foreach (var placeData in sortedPlaceList.Where(data => data.NeedScore > placeScoreData.Score)) { - if (nextAchievement.recipeId != 0 && !gameData.MyRecipes.Contains(nextAchievement.recipeId)) + if (placeData.recipeId != 0 && !gameData.MyRecipes.Contains(placeData.recipeId)) { - var shopData = shopDataList.First(data => data.itemId == nextAchievement.recipeId && data.Category == ItemCategory.Recipe); - // progressList.Add((shopData.Name, shopData.GetPrefab(), nextAchievement.NeedScore, true)); - progressList.Add((shopData.Name, recipeMalaImagePrefab, nextAchievement.NeedScore, true)); + var shopData = shopDataList.FirstOrDefault(data => data.itemId == placeData.recipeId && data.Category == ItemCategory.Recipe); + if (shopData is null) + { + continue; + } + // progressList.Add((shopData.Name, shopData.GetPrefab(), placeData.NeedScore, true)); + progressList.Add((shopData.Name, recipeMalaImagePrefab, placeData.NeedScore, true)); } - else if (nextAchievement.customizeId != 0) + else if (placeData.customizeId != 0) { - var customizeData = customizeDataList.First(data => data.id == nextAchievement.customizeId); - progressList.Add((customizeData.Name, customizeData.GetIconPrefab(), nextAchievement.NeedScore, false)); + var customizeData = customizeDataList.FirstOrDefault(data => data.id == placeData.customizeId); + if (customizeData is null) + { + continue; + } + progressList.Add((customizeData.Name, customizeData.GetIconPrefab(), placeData.NeedScore, false)); } } - + GameDataManager.SaveGameData(); // view @@ -171,15 +192,26 @@ namespace MyGame.Scenes.MiniGame.Scripts meterObject.SetActive(progressList.Count > 0); var basePlaceScore = prevNeedScore; + /* + * 進捗を途中表示するための計算 + * ただしデータ追加などで前回スコアより小さい必要スコアの報酬が存在する場合は + * 進捗を0からスタートさせる + */ + var prevScore = 0; + if (basePlaceScore < prevPlaceScore && prevPlaceScore < progressList[0].needScore) + { + prevScore = prevPlaceScore - basePlaceScore; + } + var nextItemSubject = new Subject().AddTo(this); progressList.ToObservable() .Zip(nextItemSubject.StartWith(Unit.Default).Take(progressList.Count), (x, _) => x) .ForEachAsync(x => { SetSilhouette(x.prefab, x.isRecipe); - var prevScore = prevPlaceScore > basePlaceScore ? prevPlaceScore - basePlaceScore : 0; - var needScore = x.needScore == basePlaceScore ? 1 : x.needScore - basePlaceScore; - var newScore = x.needScore == basePlaceScore ? 1 : placeScoreData.Score - basePlaceScore; + // オフセット計算 + var needScore = x.needScore <= basePlaceScore ? 1 : x.needScore - basePlaceScore; + var newScore = x.needScore <= basePlaceScore ? 1 : placeScoreData.Score - basePlaceScore; basePlaceScore = x.needScore; SetProgress((float)prevScore / needScore, false).ToObservable() .Delay(TimeSpan.FromSeconds(waitProgress)) @@ -195,6 +227,8 @@ namespace MyGame.Scenes.MiniGame.Scripts } ShopItemExchangeView.ShowDialog(x.name, x.prefab, x.isRecipe, () => nextItemSubject.OnNext(Unit.Default)); }).AddTo(this); + // 初回のみ0以外の値が入るため・・・ + prevScore = 0; }) .SelectMany(nextItemSubject) .Delay(TimeSpan.FromSeconds(waitButtonActive)) diff --git a/popcorn/Assets/MyGame/Scenes/MiniGame/Scripts/StageSelectView.cs b/popcorn/Assets/MyGame/Scenes/MiniGame/Scripts/StageSelectView.cs index 7987302f..4582a1f9 100644 --- a/popcorn/Assets/MyGame/Scenes/MiniGame/Scripts/StageSelectView.cs +++ b/popcorn/Assets/MyGame/Scenes/MiniGame/Scripts/StageSelectView.cs @@ -23,11 +23,11 @@ namespace MyGame.Scenes.MiniGame.Scripts private ScrollGamePlaceData[] sortedPlaceDataListByNeedScore; public IObservable OnClick => selectButton.OnClickAsObservable().TakeUntilDestroy(this); public void SetStageHiScore(int num) => stageHiScore.text = $"{LocalizationManager.GetTranslation("UI/HiScore")}{num}"; - public void SetTotalScore(int num) + public void SetTotalScore(int newScore) { - totalScore.text = $"{LocalizationManager.GetTranslation("UI/TotalScore")}{num}"; - achievementObject.SetActive(num < sortedPlaceDataListByNeedScore.Max(data => data.NeedScore)); - UpdateAchievement(num); + totalScore.text = $"{LocalizationManager.GetTranslation("UI/TotalScore")}{newScore}"; + var hasUpdate = UpdateAchievement(); + achievementObject.SetActive(hasUpdate); } public void SetPlaceData(ScrollGamePlaceData[] placeDataList) @@ -40,23 +40,45 @@ namespace MyGame.Scenes.MiniGame.Scripts itemText.text = $"{LocalizationManager.GetTranslation("UI/EarnItem")}{shopData.Name}"; } - private void UpdateAchievement(int score) + private bool UpdateAchievement() { - var placeData = GetCurrentAchievement(sortedPlaceDataListByNeedScore, score, true); + var placeData = GetCurrentAchievement(sortedPlaceDataListByNeedScore, true); if (placeData is null) { - return; + return false; } SetAchievement(placeData); + return true; } - private static ScrollGamePlaceData GetCurrentAchievement(ScrollGamePlaceData[] placeDataList, int score, bool sorted = false) + private static ScrollGamePlaceData GetCurrentAchievement(IEnumerable placeDataList, bool sorted = false) { - if (sorted) + if (!sorted) { - return placeDataList.FirstOrDefault(data => data.itemId == 0 && data.NeedScore > score); + placeDataList = placeDataList.OrderBy(data => data.NeedScore); } - return placeDataList.OrderBy(data => data.NeedScore).FirstOrDefault(data => data.itemId == 0 && data.NeedScore > score); + + var productDataList = SpreadsheetDataManager.Instance.GetBaseDataList(Const.ProductDataSheet); + var customizeDataList = SpreadsheetDataManager.Instance.GetBaseDataList(Const.ShopCustomizeDataSheet); + + foreach (var placeData in placeDataList) + { + if (placeData.recipeId != 0 && !GameDataManager.GameData.MyRecipes.Contains(placeData.recipeId)) + { + if (productDataList.Exists(data => data.id == placeData.recipeId)) + { + return placeData; + } + } + if (placeData.customizeId != 0 && !GameDataManager.GameData.ShopCustomizeMyItems.Contains(placeData.customizeId)) + { + if (customizeDataList.Exists(data => data.id == placeData.customizeId)) + { + return placeData; + } + } + } + return null; } private void SetAchievement(ScrollGamePlaceData placeData) @@ -67,7 +89,7 @@ namespace MyGame.Scenes.MiniGame.Scripts var customizeDataList = SpreadsheetDataManager.Instance.GetBaseDataList(Const.ShopCustomizeDataSheet); if (placeData.recipeId != 0) { - var productData = productDataList.FirstOrDefault(data => data.id == placeData.recipeId); + var productData = productDataList.First(data => data.id == placeData.recipeId); SetAchievementText(productData.Name, placeData.NeedScore); var rt = recipeObject.transform; rt.DestroyAllChildrens(); @@ -75,7 +97,7 @@ namespace MyGame.Scenes.MiniGame.Scripts } else if (placeData.customizeId != 0) { - var customizeData = customizeDataList.FirstOrDefault(data => data.id == placeData.customizeId); + var customizeData = customizeDataList.First(data => data.id == placeData.customizeId); SetAchievementText(customizeData.Name, placeData.NeedScore); var ct = customizeObject.transform; ct.DestroyAllChildrens();