// *********************************************************************** // Assembly : Game // Author : Kimch // Created : 2021-04-26 // Description : // Last Modified By : // Last Modified On : // *********************************************************************** // // // *********************************************************************** using System.Collections; using System.Collections.Generic; using UnityEngine; namespace G { /// /// 类功能描述 /// public class BattlePassProxy : F.GameProxy { public class BattlePassLevelInfo { public readonly ItemBattlePassLevel item; public int id => item.id; /// /// /// public int status { get { return GlobalUtils.CombineNumber824(adStatus, freeStatus); } set { GlobalUtils.SplitNumber824(value, out int ad, out int free); adStatus = ad; freeStatus = free; } } /// /// 0 等级不够 1 可以领取 2 已经领取 /// public int freeStatus { get; set; } /// /// /// public int adStatus { get; set; } /// /// /// public bool isUnlock; /// /// /// public bool hasRewardCollect { get { return freeStatus == 1 || adStatus == 1; } } /// /// /// /// public bool CollectFreeReward() { if (freeStatus == 1) { freeStatus = 2; return true; } return false; } public bool CollectAdReward() { if (adStatus == 1) { adStatus = 2; return true; } return false; } public void SyncLevel(int level, bool activeAd) { if (id <= level) { isUnlock = true; if (freeStatus == 0) freeStatus = 1; if (activeAd && adStatus == 0) adStatus = 1; } else isUnlock = false; } public void Reset() { freeStatus = 0; adStatus = 0; isUnlock = false; } public BattlePassLevelInfo(ItemBattlePassLevel battlePassLevelItem) { this.item = battlePassLevelItem; } } #region Field private BattlePassLevelInfo[] _battlePassLevelInfos; private ItemBattlePass _battlePass; private bool _isActivation; public int level; public int exp; public int expMax; #endregion #region Property public bool isActivation => _isActivation; public string remainTimeString { get { return F.Utils.Time.ToTimeString(_battlePass.date - Launch.Timestamp); } } public int tokenCount { get { return MoneyProxy.Instance.GetMoney(_battlePass.unlockToken[0]); } } public int tokenCountMax { get { return _battlePass.unlockToken[1]; } } #endregion #region Method /// /// 同步经验值 /// public void SyncExp() { int t = MoneyProxy.Instance.GetMoney(Item.Id.kBattlePassExp); int index = 0; int curExpAcc = 0; int lastExpAcc = 0; do { level = index + 1; exp = t - curExpAcc; curExpAcc = _battlePassLevelInfos[index++].item.exp; expMax = curExpAcc - lastExpAcc; lastExpAcc = curExpAcc; } while (curExpAcc <= t && index < _battlePassLevelInfos.Length); SyncLevelInfo(); SaveBattlePass(); } private void SyncLevelInfo() { for (int i = 0; i < _battlePassLevelInfos.Length; i++) { _battlePassLevelInfos[i].SyncLevel(level, isActivation); } } public bool Activation() { var unlockToken = _battlePass.unlockToken; if (MoneyProxy.Instance.CheckAndCostMoney(unlockToken, GlobalDefine.COST_MONEY_BATTLE_PASS)) { _isActivation = true; SaveBattlePass(); return true; } else { PostNotification(GlobalDefine.EVENT_SHOW_TOAST, KLocalization.GetLocalString(3)); return false; } } public void ResetAll() { MoneyProxy.Instance.AddMoney(Item.Id.kBattlePassExp, -MoneyProxy.Instance.GetMoney(Item.Id.kBattlePassExp)); MoneyProxy.Instance.AddMoney(Item.Id.kBattlePassToken, -MoneyProxy.Instance.GetMoney(Item.Id.kBattlePassToken)); _isActivation = false; level = 0; exp = 0; expMax = 1; for (int i = 0; i < _battlePassLevelInfos.Length; i++) { _battlePassLevelInfos[i].Reset(); } SaveBattlePass(); } public BattlePassLevelInfo[] GetBattlePassLevelInfos() { SyncLevelInfo(); return _battlePassLevelInfos; } public void CollecReward(int id, bool ad, System.Action callback) { var rewards = F.ListPool.Get(); var info = _battlePassLevelInfos[id - 1]; if (info.id == id) { if (info.CollectFreeReward()) { rewards.AddRange(info.item.freeRewardInfos); //Item.ItemInfo.FromArray(rewards, info.item.freeAwards); } if (ad && info.CollectAdReward()) { rewards.AddRange(info.item.adRewardInfos); //Item.ItemInfo.FromArray(rewards, info.item.adAwards); } } if (rewards.Count > 0) { SaveBattlePass(); RewardProxy.Instance.GetRewardsWithUI(rewards, (error, message) => { }); } F.ListPool.Release(rewards); callback?.Invoke(0); } /// /// 领取batpass 奖励 /// public void CollectAllRewards(Callback2 callback) { var rewards = F.ListPool.Get(); for (int i = 0; i < _battlePassLevelInfos.Length; i++) { var info = _battlePassLevelInfos[i]; if (info.CollectFreeReward()) { rewards.AddRange(info.item.freeRewardInfos); //Item.ItemInfo.FromArray(rewards, info.item.freeAwards); } if (info.CollectAdReward()) { rewards.AddRange(info.item.adRewardInfos); //Item.ItemInfo.FromArray(rewards, info.item.adAwards); } } if (rewards.Count > 0) { SaveBattlePass(); RewardProxy.Instance.GetRewardsWithUI(rewards, callback); } F.ListPool.Release(rewards); } /// /// RedPointConst.BattlePassActivation /// /// public int GetRedPoint1() { if (!_isActivation) { var unlockToken = _battlePass.unlockToken; if (MoneyProxy.Instance.CheckMoney(unlockToken)) { return 1; } } return 0; } /// /// RedPointConst.BattlePassMission /// /// public int GetRedPoint2() { return MissionProxy.Instance.GetRedPointWeek(); } /// /// RedPointConst.BattlePassReward /// /// public int GetRedPoint3() { for (int i = 0; i < _battlePassLevelInfos.Length; i++) { if (_battlePassLevelInfos[i].hasRewardCollect) { return 1; } } return 0; } public int GetRedPoint4() { if (GetRedPoint2() == 1) { return 1; } else { return GetRedPoint3(); } } ItemBattlePass GetValidBattleBass() { var battlePasses = ItemProxy.Instance.GetStaticItems(); var result = battlePasses[0]; for (int i = 0; i < battlePasses.Count; i++) { if (Launch.Timestamp < battlePasses[i].date) { result = battlePasses[i]; return result; } } return result; } private const string ARCHIVE_KEY_V1 = "battle_pass"; /// /// /// private void InitBattlePass() { _battlePass = GetValidBattleBass(); if (_battlePassLevelInfos == null) { var bpLevels = ItemProxy.Instance.GetStaticItems(); if (bpLevels != null) { _battlePassLevelInfos = new BattlePassLevelInfo[bpLevels.Count]; for (int i = _battlePassLevelInfos.Length - 1; i >= 0; i--) { _battlePassLevelInfos[i] = new BattlePassLevelInfo(bpLevels[i]); } } else { #if UNITY_EDITOR Debug.LogError("battlepass error"); #endif } } else { for (int i = _battlePassLevelInfos.Length - 1; i >= 0; i--) { _battlePassLevelInfos[i].Reset(); } } } /// /// /// private void LoadBattlePass() { var dataList = ArchiveProxy.Instance.GetIntList(ARCHIVE_KEY_V1); if (dataList != null && dataList.Count > 0) { int index = 0; GlobalUtils.SplitNumber824(dataList.SafeGet(index++), out int ac, out int id); if (_battlePass.id != id) { ResetAll(); return; //reset } _battlePass = ItemProxy.Instance.GetStaticItem(id); _isActivation = ac != 0; for (int i = 0; i < _battlePassLevelInfos.Length; i++) { _battlePassLevelInfos[i].status = dataList.SafeGet(index++); } } SyncExp(); } /// /// /// private void SaveBattlePass() { var dataList = ArchiveProxy.Instance.GetIntList(ARCHIVE_KEY_V1); if (dataList != null) { dataList.Clear(); var bpInfo = GlobalUtils.CombineNumber824(_isActivation ? 1 : 0, _battlePass.id); dataList.Add(bpInfo); for (int i = 0; i < _battlePassLevelInfos.Length; i++) { dataList.Add(_battlePassLevelInfos[i].status); } ArchiveProxy.Instance.SetIntList(ARCHIVE_KEY_V1, dataList); } } #endregion #region Proxy public static BattlePassProxy Instance => GetInstance(); public override void ReadArchive() { InitBattlePass(); LoadBattlePass(); } #endregion } }