// *********************************************************************** // Assembly : Game // Author : Kimch // Created : 2021-07-03 // Description : // Last Modified By : // Last Modified On : // *********************************************************************** // // // *********************************************************************** using System.Collections; using System.Collections.Generic; using CodeStage.AntiCheat.ObscuredTypes; using UnityEngine; namespace G { /// /// 随机模块 /// public class RandomProxy : F.GameProxy { class RandomInfo { public readonly ItemRandom item; private ObscuredInt _curCount; private ObscuredInt _maxCount; /// /// /// public int curCount { get { return _curCount; } set { _curCount = value; } } /// /// /// public int maxCount => _maxCount; public RandomInfo(ItemRandom randomItem) { item = randomItem; _curCount = item.initCount; _maxCount = item.maxCount; } public bool GetRandomResult() { bool result = false; int tmpCurCount = this.curCount; int tmpMaxCount = this.maxCount; float rate = (item.rate + item.addRate * tmpCurCount) * 0.001f; tmpCurCount++; if (tmpCurCount >= tmpMaxCount) { result = true; tmpCurCount = 0; } else { result = Random.value < rate; } if (result && item.type == 1) { tmpCurCount = 0; } this.curCount = tmpCurCount; return result; } } #region Field public const int RACAST_RATE_ID = 1000; private readonly Dictionary _randomInfos = new Dictionary(); #endregion #region Method public bool GetRandom(int id) { if (_randomInfos.TryGetValue(id, out var randomInfo)) { var result = randomInfo.GetRandomResult(); SaveRandom(); return result; } return false; } public bool GetRandomNotSave(int id) { if (_randomInfos.TryGetValue(id, out var randomInfo)) { var result = randomInfo.GetRandomResult(); return result; } return false; } public Vector2Int GetRandomInfo(int id) { _randomInfos.TryGetValue(id, out var randomInfo); return new Vector2Int(randomInfo.curCount, randomInfo.maxCount); } private const string ARCHIVE_KEY_V1 = "rnd_v1"; private void SaveRandom() { var dataList = ArchiveProxy.Instance.GetIntList(ARCHIVE_KEY_V1); if (dataList != null) { dataList.Clear(); foreach (var item in _randomInfos) { int rndId = item.Key; int rndCount = item.Value.curCount; var status = GlobalUtils.CombineNumber_16_16(rndId, rndCount); dataList.Add(status); } ArchiveProxy.Instance.SetIntList(ARCHIVE_KEY_V1, dataList); } } private void LoadRandom() { var dataList = ArchiveProxy.Instance.GetIntList(ARCHIVE_KEY_V1); if (dataList != null && dataList.Count > 0) { for (int i = 0; i < dataList.Count; i++) { int status = dataList[i]; GlobalUtils.SplitNumber_16_16(status, out int rndId, out int rndCount); if (_randomInfos.TryGetValue(rndId, out var randomInfo)) { randomInfo.curCount = rndCount; } } } } #endregion #region Unity & Proxy public static RandomProxy Instance => GetInstance(); public override void ReadArchive() { _randomInfos.Clear(); var randomItems = ItemProxy.Instance.GetStaticItems(); foreach (var item in randomItems) { _randomInfos.Add(item.id, new RandomInfo(item)); } LoadRandom(); } #endregion } }