114 lines
4.4 KiB
C#
114 lines
4.4 KiB
C#
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;
|
||
}
|
||
}
|
||
} |