popcorn/popcorn/Assets/MyGame/Scripts/PartTimerManager.cs

114 lines
4.4 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 System;
using System.Collections.Generic;
using System.Linq;
using UniRx;
using UniRx.Triggers;
using UnityEngine;
using Random = UnityEngine.Random;
namespace MyGame.Scripts
{
public class PartTimerManager : SingletonMonoBehaviour<PartTimerManager>
{
[SerializeField] private int updateTiming = 2;
[SerializeField] private int saveTiming = 10;
private float saveElapsed;
private List<GameData> partTimerList;
private void Start()
{
/*
* 起動中の時間=バイト稼働時間とする仕組み
* データ更新は2秒保存は10秒ごと(updateTimingとsaveTimingで変更可能)
* 欠点、9秒時点でプレイヤーがタスクキルすると9秒間のバイト加算が無くなるその間に他のプレイ要素でセーブが入れば加算される
* 受け取りが発生した場合、その都市のみ経過時間をリセット
*/
partTimerList = GetPartTimerList();
Observable.Timer(TimeSpan.Zero, TimeSpan.FromSeconds(updateTiming)).Subscribe(_ =>
{
foreach (var cityGameData in partTimerList)
{
// 兄弟が在庫を抱えている場合バイトは稼働しない
if (cityGameData.ShopStock.Count > 0)
{
continue;
}
cityGameData.PartTimerElapsed += updateTiming;
}
saveElapsed += updateTiming;
if (saveTiming < saveElapsed)
{
return;
}
GameDataManager.SaveGameData();
saveElapsed = 0f;
}).AddTo(this);
}
public void UpdateList()
{
partTimerList = GetPartTimerList();
}
private static List<GameData> GetPartTimerList()
{
var newList = GameDataManager.GameData.CityGameDataDict.Values.Where(data => data.IsFundingCompleted).ToList();
if (newList.Count <= 0)
{
return newList;
}
newList = newList.SkipLast(1).ToList();
newList.Add(GameDataManager.GameData);
return newList;
}
public void ResetTimer()
{
saveElapsed = 0f;
}
/// <summary>
/// バイト報酬の羽を取得
/// アプリ起動中の報酬受取回数によって付与を決める
/// </summary>
/// <returns></returns>
public int GetCustomizeCoin()
{
// 達成リスト
var list = GetCustomizeCoinRewardList();
var rewardCount = 0;
list.ForEach(data =>
{
rewardCount += data.value;
ItemConditionUtils.Use(data);
});
return rewardCount;
}
public List<ItemConditionData> GetCustomizeCoinRewardList() => ItemConditionUtils.GetGlobalList(ItemCondition.PartTimerHeart, GameDataUtils.GetPartTimerHeart(Const.DefaultCityId), RewardActionType.CustomizeCoin, true);
/// <summary>
/// 受取可能チェック
/// checkCountがTargetCount以上になれば受取可能
/// </summary>
/// <returns></returns>
public int CheckEarningsCustomizeCoin() => GetCustomizeCoinRewardList().Sum(data => data.value);
public static (int coin, int heart) CalcEarnings(PartTimerData partTimerData, int elapsed)
{
var coin = (int)Mathf.Min((float)partTimerData.sales / 10 * elapsed, partTimerData.maxSales);
var heart = (int)Mathf.Min((float)partTimerData.heart / 10 * elapsed, partTimerData.maxHeart);
return (coin, heart);
}
public static bool CheckLevelUp(int cityId)
{
var cityGameData = GameDataManager.GetCityGameData(cityId);
var partTimersData = SpreadsheetDataManager.Instance.GetBaseDataList<PartTimerData>(Const.PartTimerDataSheet);
var nextLevelData = partTimersData.FirstOrDefault(data => data.level == cityGameData.PartTimerLevel + 1);
if (nextLevelData == null) return false;
if (nextLevelData.needHeart > GameDataUtils.GetPartTimerHeart(nextLevelData.cityId)) return false;
return nextLevelData.needAmount <= cityGameData.Coin;
}
}
}