ミニゲーム報酬表示改善

This commit is contained in:
kimura 2022-08-31 13:09:42 +09:00
parent ae1d93913f
commit 5c180fb212
2 changed files with 86 additions and 30 deletions

View File

@ -116,10 +116,9 @@ namespace MyGame.Scenes.MiniGame.Scripts
var customizeDataList = SpreadsheetDataManager.Instance.GetBaseDataList<ShopCustomizeData>(Const.ShopCustomizeDataSheet); var customizeDataList = SpreadsheetDataManager.Instance.GetBaseDataList<ShopCustomizeData>(Const.ShopCustomizeDataSheet);
var sortedPlaceList = placeList.Where(data => data.itemId == 0).OrderBy(data => data.NeedScore).ToList(); var sortedPlaceList = placeList.Where(data => data.itemId == 0).OrderBy(data => data.NeedScore).ToList();
// 最新のスコアで獲得可能な範囲の報酬を取得
var achievedList = sortedPlaceList var achievedList = sortedPlaceList
.Where(data => data.NeedScore > prevPlaceScore)
.Where(data => data.NeedScore <= placeScoreData.Score); .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)>(); var progressList = new List<(string name, Transform prefab, int needScore, bool isRecipe)>();
foreach (var placeData in achievedList) foreach (var placeData in achievedList)
@ -131,36 +130,58 @@ namespace MyGame.Scenes.MiniGame.Scripts
{ {
continue; continue;
} }
var shopData = shopDataList.FirstOrDefault(data => data.itemId == placeData.recipeId && data.Category == ItemCategory.Recipe);
if (shopData is null)
{
continue;
}
gameData.MyRecipes = new List<int>(gameData.MyRecipes){placeData.recipeId}.ToArray(); gameData.MyRecipes = new List<int>(gameData.MyRecipes){placeData.recipeId}.ToArray();
gameData.DailyRecipeGetCount++; 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, shopData.GetPrefab(), placeData.NeedScore, true));
progressList.Add((shopData.Name, recipeMalaImagePrefab, placeData.NeedScore, true)); progressList.Add((shopData.Name, recipeMalaImagePrefab, placeData.NeedScore, true));
} }
else if (placeData.customizeId != 0) 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); ShopCustomize.GetItem(customizeData);
progressList.Add((customizeData.Name, customizeData.GetIconPrefab(), placeData.NeedScore, false)); 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); foreach (var placeData in sortedPlaceList.Where(data => data.NeedScore > placeScoreData.Score))
if (nextAchievement != null)
{ {
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); var shopData = shopDataList.FirstOrDefault(data => data.itemId == placeData.recipeId && data.Category == ItemCategory.Recipe);
// progressList.Add((shopData.Name, shopData.GetPrefab(), nextAchievement.NeedScore, true)); if (shopData is null)
progressList.Add((shopData.Name, recipeMalaImagePrefab, nextAchievement.NeedScore, true)); {
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); var customizeData = customizeDataList.FirstOrDefault(data => data.id == placeData.customizeId);
progressList.Add((customizeData.Name, customizeData.GetIconPrefab(), nextAchievement.NeedScore, false)); if (customizeData is null)
{
continue;
}
progressList.Add((customizeData.Name, customizeData.GetIconPrefab(), placeData.NeedScore, false));
} }
} }
GameDataManager.SaveGameData(); GameDataManager.SaveGameData();
// view // view
@ -171,15 +192,26 @@ namespace MyGame.Scenes.MiniGame.Scripts
meterObject.SetActive(progressList.Count > 0); meterObject.SetActive(progressList.Count > 0);
var basePlaceScore = prevNeedScore; var basePlaceScore = prevNeedScore;
/*
*
*
* 0
*/
var prevScore = 0;
if (basePlaceScore < prevPlaceScore && prevPlaceScore < progressList[0].needScore)
{
prevScore = prevPlaceScore - basePlaceScore;
}
var nextItemSubject = new Subject<Unit>().AddTo(this); var nextItemSubject = new Subject<Unit>().AddTo(this);
progressList.ToObservable() progressList.ToObservable()
.Zip(nextItemSubject.StartWith(Unit.Default).Take(progressList.Count), (x, _) => x) .Zip(nextItemSubject.StartWith(Unit.Default).Take(progressList.Count), (x, _) => x)
.ForEachAsync(x => .ForEachAsync(x =>
{ {
SetSilhouette(x.prefab, x.isRecipe); SetSilhouette(x.prefab, x.isRecipe);
var prevScore = prevPlaceScore > basePlaceScore ? prevPlaceScore - basePlaceScore : 0; // オフセット計算
var needScore = x.needScore == basePlaceScore ? 1 : x.needScore - basePlaceScore; var needScore = x.needScore <= basePlaceScore ? 1 : x.needScore - basePlaceScore;
var newScore = x.needScore == basePlaceScore ? 1 : placeScoreData.Score - basePlaceScore; var newScore = x.needScore <= basePlaceScore ? 1 : placeScoreData.Score - basePlaceScore;
basePlaceScore = x.needScore; basePlaceScore = x.needScore;
SetProgress((float)prevScore / needScore, false).ToObservable() SetProgress((float)prevScore / needScore, false).ToObservable()
.Delay(TimeSpan.FromSeconds(waitProgress)) .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)); ShopItemExchangeView.ShowDialog(x.name, x.prefab, x.isRecipe, () => nextItemSubject.OnNext(Unit.Default));
}).AddTo(this); }).AddTo(this);
// 初回のみ0以外の値が入るため・・・
prevScore = 0;
}) })
.SelectMany(nextItemSubject) .SelectMany(nextItemSubject)
.Delay(TimeSpan.FromSeconds(waitButtonActive)) .Delay(TimeSpan.FromSeconds(waitButtonActive))

View File

@ -23,11 +23,11 @@ namespace MyGame.Scenes.MiniGame.Scripts
private ScrollGamePlaceData[] sortedPlaceDataListByNeedScore; private ScrollGamePlaceData[] sortedPlaceDataListByNeedScore;
public IObservable<Unit> OnClick => selectButton.OnClickAsObservable().TakeUntilDestroy(this); public IObservable<Unit> OnClick => selectButton.OnClickAsObservable().TakeUntilDestroy(this);
public void SetStageHiScore(int num) => stageHiScore.text = $"{LocalizationManager.GetTranslation("UI/HiScore")}{num}"; 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}"; totalScore.text = $"{LocalizationManager.GetTranslation("UI/TotalScore")}{newScore}";
achievementObject.SetActive(num < sortedPlaceDataListByNeedScore.Max(data => data.NeedScore)); var hasUpdate = UpdateAchievement();
UpdateAchievement(num); achievementObject.SetActive(hasUpdate);
} }
public void SetPlaceData(ScrollGamePlaceData[] placeDataList) public void SetPlaceData(ScrollGamePlaceData[] placeDataList)
@ -40,23 +40,45 @@ namespace MyGame.Scenes.MiniGame.Scripts
itemText.text = $"{LocalizationManager.GetTranslation("UI/EarnItem")}{shopData.Name}"; 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) if (placeData is null)
{ {
return; return false;
} }
SetAchievement(placeData); SetAchievement(placeData);
return true;
} }
private static ScrollGamePlaceData GetCurrentAchievement(ScrollGamePlaceData[] placeDataList, int score, bool sorted = false) private static ScrollGamePlaceData GetCurrentAchievement(IEnumerable<ScrollGamePlaceData> 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<ProductData>(Const.ProductDataSheet);
var customizeDataList = SpreadsheetDataManager.Instance.GetBaseDataList<ShopCustomizeData>(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) private void SetAchievement(ScrollGamePlaceData placeData)
@ -67,7 +89,7 @@ namespace MyGame.Scenes.MiniGame.Scripts
var customizeDataList = SpreadsheetDataManager.Instance.GetBaseDataList<ShopCustomizeData>(Const.ShopCustomizeDataSheet); var customizeDataList = SpreadsheetDataManager.Instance.GetBaseDataList<ShopCustomizeData>(Const.ShopCustomizeDataSheet);
if (placeData.recipeId != 0) 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); SetAchievementText(productData.Name, placeData.NeedScore);
var rt = recipeObject.transform; var rt = recipeObject.transform;
rt.DestroyAllChildrens(); rt.DestroyAllChildrens();
@ -75,7 +97,7 @@ namespace MyGame.Scenes.MiniGame.Scripts
} }
else if (placeData.customizeId != 0) 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); SetAchievementText(customizeData.Name, placeData.NeedScore);
var ct = customizeObject.transform; var ct = customizeObject.transform;
ct.DestroyAllChildrens(); ct.DestroyAllChildrens();