// *********************************************************************** // Assembly : Game // Author : Kimch // Created : 2021-04-24 // Description : // Last Modified By : // Last Modified On : // *********************************************************************** // // // *********************************************************************** using System.Collections; using System.Collections.Generic; using CodeStage.AntiCheat.ObscuredTypes; using UnityEngine; namespace G { /// /// Vip /// public class VipProxy : F.GameProxy { public const int 变更次数 = 300; public const int 增加次数 = 301; public const int 角色体力上限 = 303; public const int 角色体力上限增加 = 304; public const int 局内战斗加速 = 307; public const int 穴位升级爆率提升 = 308; public const int 局内道具属性增加 = 309; public const int 道具出售增加 = 310; public const int 自动战斗 = 311; public const int 扫荡次数 = 312; public const int 角色活力上限 = 313; public const int 角色活力上限增加 = 314; public const int 免费复活 = 317; public const int 免广告 = 318; public class VipInfo { public readonly ItemVip item; public int id => item.id; /// /// 两种用途 /// private ObscuredInt _status; public int remainDay { get { return _status > 0 ? (_status - Launch.Timestamp) / 86400 : 0; } set { _status = Launch.Timestamp + value * 86400; } } /// /// /// public bool isValid => _status >= Launch.Timestamp; /// /// /// public int adGiftBoxId { get { return item.adGiftBox; } } /// /// /// public int freeGiftBoxId { get { return item.freeGiftBox; } } /// /// 免费永久一次 /// public bool canBuyFreeGiftBox { get { return _status == 0; } } /// /// 内部 /// internal int status { get { return _status; } } /// /// /// /// public void SetValidTimestamp(int value) { _status = value; } /// /// 内部调用 /// public void SetBuyStateInternal(int value) { _status = value; } public VipInfo(ItemVip vipItem) { this.item = vipItem; } } #region Field private readonly List _vipList = new List(12); private readonly List _extraVipList = new List(); #endregion #region Property private int _curVip { get => ArchiveProxy.Instance.GetInt(GlobalDefine.KEY_VIP, minVip); set => ArchiveProxy.Instance.SetInt(GlobalDefine.KEY_VIP, value); } public int curVip { get { var result = _curVip; if (CheckVip(result)) return result + 1; return result; } set { _curVip = Mathf.Clamp(value, minVip, maxVip); ApplyAllVip(true); } } public VipInfo curVipInfo { get { return _vipList[curVip - 1]; } } public int maxVip { get; private set; } public int minVip { get { return 1; } } #endregion #region Method /// /// /// /// /// public VipInfo GetVipInfo(int id) { if (id > 0 && id <= _vipList.Count) return _vipList[id - 1]; return null; } /// /// 获取权益信息 /// /// /// /// public void GetRightsInfo(int[] rights, out string rightName, out string rightValue) { rightName = null; rightValue = null; if (rights == null || rights.Length < 2) return; int id = rights[0]; if (id == VipProxy.变更次数 || id == 增加次数) { var timeItem = ItemProxy.Instance.GetStaticItem(rights[1]); if (timeItem != null) rightName = timeItem.description; if (rights.Length >= 3) rightValue = id == 变更次数 ? rights[2].ToString() : "+" + rights[2].ToString(); } else { rightName = KLocalization.GetLocalString(id); switch (id) { case VipProxy.局内战斗加速: var battleSpeed = rights[1]; if (battleSpeed >= 175f) rightValue = "x3倍"; else if (battleSpeed >= 150f) rightValue = "x2倍"; else if (battleSpeed >= 120f) rightValue = "x1倍"; else rightValue = ""; break; case VipProxy.穴位升级爆率提升: case VipProxy.局内道具属性增加: case VipProxy.道具出售增加: rightValue = $"{rights[1]}%"; break; case VipProxy.自动战斗: rightValue = "开启"; break; case VipProxy.免费复活: rightValue = "免费"; break; case 免广告: break; default: rightValue = rights[1].ToString(); break; } } } /// /// /// /// public bool CheckDailyAdRewards() { return TimeProxy.Instance.CheckTimes(506); } /// /// 检查贵族界面今日点击次数 /// /// public bool CheckDailyClickTime() { return TimeProxy.Instance.CheckTimes(507); } /// /// /// /// public void GetDailyAdRewards(Callback2 callback) { if (TimeProxy.Instance.CheckTimes(506)) AdProxy.Instance.PlayAdChange("vip", "vip_ad_daily", (error, message) => { if (error == 0) { TimeProxy.Instance.CostTimes(506); var vipInfo = GetVipInfo(curVip); var giftBoxInfo = RmbShopProxy.Instance.GetGiftBoxInfo(vipInfo.adGiftBoxId); RewardProxy.Instance.GetRewardsWithUI(giftBoxInfo.exchanges, callback); } }); else callback?.Invoke(ErrorCode.AD_TIMES_NOT_ENOUGH, ErrorMessage.AD_TIMES_NOT_ENOUGH); } /// /// /// /// /// public void GetFreeRewards(int vipId, Callback2 callback) { if (vipId <= curVip) { var vipInfo = GetVipInfo(vipId); if (vipInfo.canBuyFreeGiftBox) { var giftBoxInfo = RmbShopProxy.Instance.GetGiftBoxInfo(vipInfo.freeGiftBoxId); vipInfo.SetBuyStateInternal(1); SaveVip(); RewardProxy.Instance.GetRewardsWithUI(giftBoxInfo.exchanges, callback); } else { callback?.Invoke(1, ""); } } else { callback?.Invoke(1, ""); } } public static int[] GetUnlockMissions(ItemVip vipItem) { if (KPlatform.Instance.QueryPay()) { return vipItem.unlockB; } return vipItem.unlockA; } public int GetRedPoint() { if (CheckDailyClickTime()) return 1; int curVipId = this.curVip; for (int i = 0; i < curVipId; i++) { if (_vipList[i].canBuyFreeGiftBox) return 1; } return 0; } public bool isFreeGift() { int curVipId = this.curVip; for (int i = 0; i < curVipId; i++) { if (_vipList[i].canBuyFreeGiftBox) return true; } return false; } public bool CheckVip(int vip) { if (vip < maxVip) { var vipItem = ItemProxy.Instance.GetStaticItem(vip); if (vipItem != null) { var unlockMissions = GetUnlockMissions(vipItem); if (unlockMissions != null) for (int i = 0; i < unlockMissions.Length; i++) { var mission = MissionProxy.Instance.GetMission(unlockMissions[i]); if (mission == null || !mission.isCompleted) { return false; } } _curVip = vip + 1; ApplyAllVip(true); SaveVip(); PostNotification(GlobalDefine.EVENT_VIP_CHANGED); KStatistics.Instance.ReportEventLevelUp(2, vip, vip + 1, "mission", 0); return true; } } return false; } /// /// /// /// /// public void AddExtraVip(int id, int validityDay) { var vipItem = ItemProxy.Instance.GetStaticItem(id); var vipInfo = new VipInfo(vipItem) { remainDay = validityDay }; _extraVipList.Add(vipInfo); SaveVip(); ApplyVip(vipItem); } private void ApplyAllVip(bool applyChange = false) { if (applyChange) { ResetRights(); } ApplyVip(ItemProxy.Instance.GetStaticItem(_curVip)); foreach (var vipInfo in _extraVipList) { if (vipInfo.isValid) ApplyVip(vipInfo.item); } } private void ApplyVip(ItemVip vipItem) { if (vipItem != null) { var rights = vipItem.rights; if (rights != null) { for (int i = 0; i < rights.Length; i++) { var right = rights[i]; if (right != null && right.Length > 0) { int rId = right[0]; int rArg1 = right[1]; switch (rId) { case 变更次数: { int rArg2 = right[2]; TimeProxy.Instance.SetMaxTimes(rArg1, rArg2, false); break; } case 增加次数: { int rArg2 = right[2]; TimeProxy.Instance.AddMaxTimes(rArg1, rArg2, false); break; } case 角色体力上限: PlayerProxy.Instance.energyMax = rArg1; break; case 角色体力上限增加: PlayerProxy.Instance.energyMax += rArg1; break; case 角色活力上限: PlayerProxy.Instance.motilityMax = rArg1; break; case 角色活力上限增加: PlayerProxy.Instance.motilityMax += rArg1; break; case 局内战斗加速: GlobalVar.BattleSpeed = Mathf.Max(1f, rArg1 * 0.01f); break; case 穴位升级爆率提升: GlobalVar.TitleStudyDouble = 1f - rArg1 * 0.01f; break; case 局内道具属性增加: GlobalVar.BuffAddition = rArg1; break; case 道具出售增加: GlobalVar.PropSellAddition = rArg1 * 0.01f; break; case 免广告: //GlobalVar.RemoveAd = true; break; default: break; } } } } } } const string ARCHIVE_KEY_V1 = "vip_v1"; private void LoadVip() { _extraVipList.Clear(); var dataList = ArchiveProxy.Instance.GetIntList(ARCHIVE_KEY_V1); if (dataList != null && dataList.Count > 0) { int maxIndex = dataList.Count - 1; for (int i = 0; i < maxIndex; i += 2) { int id = dataList[i]; int status = dataList[i + 1]; var vipItem = ItemProxy.Instance.GetStaticItem(id); if (vipItem != null) { if (vipItem.type == 1) { _vipList[id - 1].SetBuyStateInternal(status); } else { var vipInfo = new VipInfo(vipItem); vipInfo.SetValidTimestamp(status); _extraVipList.Add(vipInfo); } } } } ApplyAllVip(true); } public void SaveVip() { var dataList = ArchiveProxy.Instance.GetIntList(ARCHIVE_KEY_V1); if (dataList != null) { dataList.Clear(); foreach (var item in _vipList) { dataList.Add(item.id); dataList.Add(item.status); } foreach (var item in _extraVipList) { if (item.isValid) { dataList.Add(item.id); dataList.Add(item.status); } } ArchiveProxy.Instance.SetIntList(ARCHIVE_KEY_V1, dataList); } } public void ResetRights() { PlayerProxy.Instance.energyMax = 0; PlayerProxy.Instance.motilityMax = 0; GlobalVar.Reset(); TimeProxy.Instance.ResetAllMaxTimes(); } #endregion #region Proxy //public override int priority => 996; public static VipProxy Instance => GetInstance(); public override void LoadCompleted() { var vipItems = ItemProxy.Instance.GetStaticItems(); int max = 0; foreach (var item in vipItems) { if (item.type == 1) { _vipList.Add(new VipInfo(item)); max++; } } this.maxVip = max; Debug.Log(_vipList.Count); } public override void ReadArchive() { LoadVip(); } #endregion } }