// ***********************************************************************
// 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
}
}