174 lines
3.7 KiB
C#
174 lines
3.7 KiB
C#
// ***********************************************************************
|
|
// Assembly : Game
|
|
// Author : Kimch
|
|
// Created : 2021-07-03
|
|
// Description :
|
|
// Last Modified By :
|
|
// Last Modified On :
|
|
// ***********************************************************************
|
|
// <copyright file= "RandomProxy" company="Kunpo"></copyright>
|
|
// <summary></summary>
|
|
// ***********************************************************************
|
|
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using CodeStage.AntiCheat.ObscuredTypes;
|
|
using UnityEngine;
|
|
|
|
namespace G
|
|
{
|
|
/// <summary>
|
|
/// 随机模块
|
|
/// </summary>
|
|
public class RandomProxy : F.GameProxy
|
|
{
|
|
class RandomInfo
|
|
{
|
|
public readonly ItemRandom item;
|
|
|
|
private ObscuredInt _curCount;
|
|
private ObscuredInt _maxCount;
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public int curCount
|
|
{
|
|
get { return _curCount; }
|
|
set { _curCount = value; }
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
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<int, RandomInfo> _randomInfos = new Dictionary<int, RandomInfo>();
|
|
|
|
#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<RandomProxy>();
|
|
|
|
public override void ReadArchive()
|
|
{
|
|
_randomInfos.Clear();
|
|
var randomItems = ItemProxy.Instance.GetStaticItems<ItemRandom>();
|
|
foreach (var item in randomItems)
|
|
{
|
|
_randomInfos.Add(item.id, new RandomInfo(item));
|
|
}
|
|
LoadRandom();
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|