デイリーミッション処理追加
This commit is contained in:
parent
9f56c50a0e
commit
70f1f2e221
File diff suppressed because it is too large
Load Diff
|
|
@ -73,7 +73,7 @@ public class Information : MonoBehaviour
|
||||||
var shopLevelData = shopLevelList.FirstOrDefault(data => data.shopLevel == gameData.ViewedShopLevel) ?? shopLevelList[0];
|
var shopLevelData = shopLevelList.FirstOrDefault(data => data.shopLevel == gameData.ViewedShopLevel) ?? shopLevelList[0];
|
||||||
var nextShopLevelData = shopLevelList.FirstOrDefault(data => data.shopLevel == gameData.ViewedShopLevel + 1);
|
var nextShopLevelData = shopLevelList.FirstOrDefault(data => data.shopLevel == gameData.ViewedShopLevel + 1);
|
||||||
var nextLevelHeart = nextShopLevelData?.heart ?? shopLevelData.heart;
|
var nextLevelHeart = nextShopLevelData?.heart ?? shopLevelData.heart;
|
||||||
totalDayText.text = String.Format(dayFormat, 1);
|
totalDayText.text = String.Format(dayFormat, gameData.dailyLoginCount);
|
||||||
totalSalesText.text = String.Format(salesFormat, gameData.TotalSales);
|
totalSalesText.text = String.Format(salesFormat, gameData.TotalSales);
|
||||||
totalCoinText.text = gameData.TotalAddCoin.ToString();
|
totalCoinText.text = gameData.TotalAddCoin.ToString();
|
||||||
achievementText.text = shopLevelData.achievement;
|
achievementText.text = shopLevelData.achievement;
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ public class MissionListView : MonoBehaviour
|
||||||
[SerializeField] private MissionTabView dailyTab;
|
[SerializeField] private MissionTabView dailyTab;
|
||||||
[SerializeField] private ScrollRect scrollRect;
|
[SerializeField] private ScrollRect scrollRect;
|
||||||
[SerializeField] private MissionView itemViewPrefab;
|
[SerializeField] private MissionView itemViewPrefab;
|
||||||
|
[SerializeField] private MissionView dailyCompleteItemViewPrefab;
|
||||||
|
|
||||||
private readonly ReactiveProperty<MissionCategory> selectedTab = new ReactiveProperty<MissionCategory>();
|
private readonly ReactiveProperty<MissionCategory> selectedTab = new ReactiveProperty<MissionCategory>();
|
||||||
public IReadOnlyReactiveProperty<MissionCategory> SelectedTab => selectedTab;
|
public IReadOnlyReactiveProperty<MissionCategory> SelectedTab => selectedTab;
|
||||||
|
|
@ -60,6 +61,18 @@ public class MissionListView : MonoBehaviour
|
||||||
return Instantiate(itemViewPrefab, tabs[index].content);
|
return Instantiate(itemViewPrefab, tabs[index].content);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public MissionView AddDailyCompleteItemView()
|
||||||
|
{
|
||||||
|
var index = tabs.FindIndex(x => x.category == MissionCategory.Daily);
|
||||||
|
if (index == -1)
|
||||||
|
{
|
||||||
|
index = tabs.Count;
|
||||||
|
var content = scrollRect.content;
|
||||||
|
tabs.Add((MissionCategory.Daily, Instantiate(content, content.parent)));
|
||||||
|
}
|
||||||
|
return Instantiate(dailyCompleteItemViewPrefab, tabs[index].content);
|
||||||
|
}
|
||||||
|
|
||||||
public void SetTab(MissionCategory category)
|
public void SetTab(MissionCategory category)
|
||||||
{
|
{
|
||||||
selectedTab.SetValueAndForceNotify(category);
|
selectedTab.SetValueAndForceNotify(category);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using UniRx;
|
using UniRx;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
|
|
@ -9,6 +11,7 @@ public class MissionManager : MonoBehaviour
|
||||||
private static readonly string TimeFormat = "更新まで:{0}時間{1}分{2}秒";
|
private static readonly string TimeFormat = "更新まで:{0}時間{1}分{2}秒";
|
||||||
private static readonly int OpenTrigger = Animator.StringToHash("OpenTrigger");
|
private static readonly int OpenTrigger = Animator.StringToHash("OpenTrigger");
|
||||||
private static readonly int CloseTrigger = Animator.StringToHash("CloseTrigger");
|
private static readonly int CloseTrigger = Animator.StringToHash("CloseTrigger");
|
||||||
|
private static readonly int dailyMissionCompleteRewardCoin = 50;
|
||||||
|
|
||||||
[SerializeField] private Animator backgroundAnimator;
|
[SerializeField] private Animator backgroundAnimator;
|
||||||
[SerializeField] private Button closeButton;
|
[SerializeField] private Button closeButton;
|
||||||
|
|
@ -33,11 +36,31 @@ public class MissionManager : MonoBehaviour
|
||||||
timeLimitText.gameObject.SetActive(category == MissionCategory.Daily);
|
timeLimitText.gameObject.SetActive(category == MissionCategory.Daily);
|
||||||
}).AddTo(this);
|
}).AddTo(this);
|
||||||
|
|
||||||
|
var gameData = GameDataManager.GameData;
|
||||||
|
|
||||||
|
// デイリーカウントダウン
|
||||||
|
var limitTime = gameData.GetDailyMissionLimitTime();
|
||||||
|
if (limitTime.TotalSeconds > 0)
|
||||||
|
{
|
||||||
|
timeLimitText.text = String.Format(TimeFormat, limitTime.Hours, limitTime.Minutes, limitTime.Seconds);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
timeLimitText.text = String.Format(TimeFormat, 0, 0, 0);
|
||||||
|
}
|
||||||
|
Observable.Timer(TimeSpan.Zero, TimeSpan.FromSeconds(1f))
|
||||||
|
.Select(x => limitTime.Add(TimeSpan.FromSeconds(-x)))
|
||||||
|
.TakeWhile(x => x.TotalSeconds > 0)
|
||||||
|
.Subscribe(x =>
|
||||||
|
{
|
||||||
|
timeLimitText.text = String.Format(TimeFormat, x.Hours, x.Minutes, x.Seconds);
|
||||||
|
}).AddTo(this);
|
||||||
|
|
||||||
// ミッション読み込み
|
// ミッション読み込み
|
||||||
var missionList = SpreadsheetDataManager.Instance.GetBaseDataList<MissionData>(Const.MissionDataSheet);
|
var missionList = SpreadsheetDataManager.Instance.GetBaseDataList<MissionData>(Const.MissionDataSheet);
|
||||||
|
|
||||||
// ミッション表示
|
// ミッション表示
|
||||||
foreach (var missionData in missionList)
|
foreach (var missionData in missionList.Where(data => data.Category == MissionCategory.Normal && data.shopLevel <= gameData.ViewedShopLevel))
|
||||||
{
|
{
|
||||||
var missionView = listView.AddItemView(missionData);
|
var missionView = listView.AddItemView(missionData);
|
||||||
var progressValue = GetProgressValue(missionData);
|
var progressValue = GetProgressValue(missionData);
|
||||||
|
|
@ -57,6 +80,60 @@ public class MissionManager : MonoBehaviour
|
||||||
missionView.SetRewarded();
|
missionView.SetRewarded();
|
||||||
// 達成ID保存
|
// 達成ID保存
|
||||||
GameDataManager.GameData.AchievedMission.Add(missionData.id);
|
GameDataManager.GameData.AchievedMission.Add(missionData.id);
|
||||||
|
GameDataManager.SaveGameData();
|
||||||
|
})));
|
||||||
|
TransitionManager.Instance.LoadSceneAdditive(GameScenes.MissionAchievement);
|
||||||
|
}).AddTo(missionView);
|
||||||
|
}
|
||||||
|
|
||||||
|
// dailyMission
|
||||||
|
// コンプリートミッション
|
||||||
|
{
|
||||||
|
var missionView = listView.AddDailyCompleteItemView();
|
||||||
|
var missionData = new MissionData(){count = 3, reward = dailyMissionCompleteRewardCoin, text = "デイリーミッションすべて完了で達成"};
|
||||||
|
var progressValue = gameData.dailyMissionAchievedIdArray.Length;
|
||||||
|
missionView.SetData(missionData, progressValue);
|
||||||
|
missionView.SetButtonActive(missionData.count <= progressValue);
|
||||||
|
if (gameData.dailyMissionCompleted) // 達成済み
|
||||||
|
{
|
||||||
|
missionView.SetRewarded();
|
||||||
|
}
|
||||||
|
|
||||||
|
// リワード獲得
|
||||||
|
missionView.RewardButton.ThrottleFirst(TimeSpan.FromSeconds(1f)).Subscribe(_ =>
|
||||||
|
{
|
||||||
|
LocalCacheManager.Save(MissionDataTag, (missionData, new Action(() =>
|
||||||
|
{
|
||||||
|
GetDailyMissionCompleteReward();
|
||||||
|
missionView.SetRewarded();
|
||||||
|
// 達成ID保存
|
||||||
|
gameData.dailyMissionCompleted = true;
|
||||||
|
GameDataManager.SaveGameData();
|
||||||
|
})));
|
||||||
|
TransitionManager.Instance.LoadSceneAdditive(GameScenes.MissionAchievement);
|
||||||
|
}).AddTo(missionView);
|
||||||
|
}
|
||||||
|
foreach (var missionData in missionList.Where(data => gameData.dailyMissionIdArray.Contains(data.id)))
|
||||||
|
{
|
||||||
|
var missionView = listView.AddItemView(missionData);
|
||||||
|
var progressValue = GetDailyProgressValue(missionData);
|
||||||
|
missionView.SetData(missionData, progressValue);
|
||||||
|
missionView.SetButtonActive(missionData.count <= progressValue);
|
||||||
|
if (gameData.dailyMissionAchievedIdArray.Contains(missionData.id)) // 達成済み
|
||||||
|
{
|
||||||
|
missionView.SetRewarded();
|
||||||
|
}
|
||||||
|
|
||||||
|
// リワード獲得
|
||||||
|
missionView.RewardButton.ThrottleFirst(TimeSpan.FromSeconds(1f)).Subscribe(_ =>
|
||||||
|
{
|
||||||
|
LocalCacheManager.Save(MissionDataTag, (missionData, new Action(() =>
|
||||||
|
{
|
||||||
|
GetReward(missionData);
|
||||||
|
missionView.SetRewarded();
|
||||||
|
// 達成ID保存
|
||||||
|
gameData.dailyMissionAchievedIdArray = new List<int>(gameData.dailyMissionIdArray){missionData.id}.ToArray();
|
||||||
|
GameDataManager.SaveGameData();
|
||||||
})));
|
})));
|
||||||
TransitionManager.Instance.LoadSceneAdditive(GameScenes.MissionAchievement);
|
TransitionManager.Instance.LoadSceneAdditive(GameScenes.MissionAchievement);
|
||||||
}).AddTo(missionView);
|
}).AddTo(missionView);
|
||||||
|
|
@ -312,4 +389,10 @@ public class MissionManager : MonoBehaviour
|
||||||
GameDataManager.GameData.Coin = CoinManager.Instance.OwnCoin;
|
GameDataManager.GameData.Coin = CoinManager.Instance.OwnCoin;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void GetDailyMissionCompleteReward()
|
||||||
|
{
|
||||||
|
CoinManager.Instance.AddCoinWithEffect(dailyMissionCompleteRewardCoin);
|
||||||
|
GameDataManager.GameData.Coin = CoinManager.Instance.OwnCoin;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -52,6 +52,49 @@ public class GameDataObserver : SingletonMonoBehaviour<GameDataObserver>
|
||||||
.DistinctUntilChanged()
|
.DistinctUntilChanged()
|
||||||
.Publish(false)
|
.Publish(false)
|
||||||
.RefCount();
|
.RefCount();
|
||||||
ShopLevelUpdate.Subscribe(x => { Debug.Log($"change:{x}"); });
|
#if UNITY_EDITOR
|
||||||
|
// ShopLevelUpdate.Subscribe(x => { Debug.Log($"change:{x}"); });
|
||||||
|
#endif
|
||||||
|
// デイリーミッション日付チェック
|
||||||
|
sceneCounter
|
||||||
|
.Where(x => x <= 1)
|
||||||
|
.Subscribe(x =>
|
||||||
|
{
|
||||||
|
if (gameData.ViewedShopLevel == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var lastSetDateUtc = DateTime.FromBinary(gameData.lastDailyMissionSetTime);
|
||||||
|
// 現時刻が最後にデイリーミッションを設定した日より前の場合無視(時間操作対策)
|
||||||
|
if (lastSetDateUtc > DateTime.UtcNow)
|
||||||
|
{
|
||||||
|
#if UNITY_EDITOR
|
||||||
|
Debug.Log($"不正な時刻 {lastSetDateUtc:s}");
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ミッションリセットチェック(0時)
|
||||||
|
if (gameData.GetDailyMissionLimitTime().TotalSeconds > 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#if UNITY_EDITOR
|
||||||
|
Debug.Log($"reset daily mission");
|
||||||
|
#endif
|
||||||
|
// ミッション実績リセット
|
||||||
|
gameData.dailyMissionAchievedIdArray = new int[0];
|
||||||
|
gameData.dailyMissionCompleted = false;
|
||||||
|
gameData.ResetDailyTotalCount();
|
||||||
|
// 新ミッション登録
|
||||||
|
var missionList = SpreadsheetDataManager.Instance.GetBaseDataList<MissionData>(Const.MissionDataSheet);
|
||||||
|
var targetList = missionList.Where(data =>
|
||||||
|
data.Category == MissionCategory.Daily && data.shopLevel <= gameData.ViewedShopLevel);
|
||||||
|
gameData.dailyMissionIdArray = targetList.ToList().RandomChoose(3).Select(data => data.id).ToArray();
|
||||||
|
gameData.lastDailyMissionSetTime = DateTime.UtcNow.ToBinary();
|
||||||
|
gameData.dailyLoginCount++;
|
||||||
|
GameDataManager.SaveGameData();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue