2025-05-18 01:04:31 +08:00

372 lines
7.5 KiB
C#

// ***********************************************************************
// Assembly : Game
// Author : Kimch
// Created : 2021-05-01
// Description :
// Last Modified By :
// Last Modified On :
// ***********************************************************************
// <copyright file= "BoxProxy" company="Kunpo"></copyright>
// <summary></summary>
// ***********************************************************************
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace G
{
/// <summary>
/// 宝箱
/// </summary>
public class BoxProxy : F.GameProxy
{
public class BoxInfo
{
public readonly ItemBox item;
private int _maxWeight = -1;
/// <summary>
///
/// </summary>
private int maxWeight
{
get
{
if (_maxWeight < 0)
{
_maxWeight = 0;
var items = item.items;
if (items != null)
for (int i = 0; i < items.Length; i++)
{
if (GetWeight(items[i]) > 0)
_maxWeight += GetWeight(items[i]);
}
}
return _maxWeight;
}
}
/// <summary>
///
/// </summary>
/// <param name="boxItem"></param>
public BoxInfo(ItemBox boxItem)
{
this.item = boxItem;
}
/// <summary>
///
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
static int GetId(int[] data)
{
return data[0];
}
/// <summary>
///
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
static int GetWeight(int[] data)
{
return data[1];
}
/// <summary>
///
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
static int GetCount(int[] data)
{
int len = data.Length;
if (len <= 2)
return 1;
if (len == 3)
return data[2];
return Random.Range(data[2], data[3]);
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public Item.ItemInfo GetExtraItem()
{
var extra = item.extra;
if (extra != null)
{
return new Item.ItemInfo
{
id = GetId(extra),
count = GetCount(extra),
};
}
return default;
}
/// <summary>
/// 随机一个
/// </summary>
/// <returns></returns>
public Item.ItemInfo GetRndItem()
{
var curWeight = GlobalUtils.GetWeight(maxWeight);
var items = item.items;
if (items != null)
for (int i = 0, l = items.Length; i < l; i++)
{
var it = items[i];
if (GetWeight(it) <= 0)
{
continue;
}
curWeight -= GetWeight(it);
if (curWeight <= 0)
{
return new Item.ItemInfo
{
id = GetId(it),
count = GetCount(it),
};
}
}
return default;
}
/// <summary>
///
/// </summary>
/// <param name="extraWeight"></param>
/// <returns></returns>
public Item.ItemInfo GetRndItem(int extraWeight)
{
var items = item.items;
if (items != null)
{
int tmpMaxWeight = this.maxWeight;
for (int i = 0, l = items.Length; i < l; i++)
{
var it = items[i];
if (GetWeight(it) <= 0)
{
continue;
}
tmpMaxWeight += extraWeight;
}
var curWeight = GlobalUtils.GetWeight(tmpMaxWeight);
for (int i = 0, l = items.Length; i < l; i++)
{
var it = items[i];
if (GetWeight(it) <= 0)
{
continue;
}
curWeight -= (GetWeight(it) + extraWeight);
if (curWeight <= 0)
{
return new Item.ItemInfo
{
id = GetId(it),
count = GetCount(it),
};
}
}
}
return default;
}
/// <summary>
///
/// </summary>
/// <param name="result"></param>
private void GetRndItems(List<Item.ItemInfo> result)
{
int rndCount = item.typeArgs[0];
//处理必中逻辑
for (int i = 0; i < item.items.Length; i++)
{
var it = item.items[i];
if (GetWeight(it) == 0)
{
if (--rndCount < 0)
break;
result.Add(new Item.ItemInfo
{
id = GetId(it),
count = GetCount(it),
});
}
}
//
while (rndCount > 0)
{
rndCount--;
result.Add(GetRndItem());
}
}
/// <summary>
///
/// </summary>
/// <param name="result"></param>
/// <param name="extraWeight"></param>
private void GetRndItems(List<Item.ItemInfo> result, int extraWeight)
{
int rndCount = item.typeArgs[0];
//处理必中逻辑
for (int i = 0; i < item.items.Length; i++)
{
var it = item.items[i];
if (GetWeight(it) == 0)
{
if (--rndCount < 0)
break;
result.Add(new Item.ItemInfo
{
id = GetId(it),
count = GetCount(it),
});
}
}
//
while (rndCount > 0)
{
rndCount--;
result.Add(GetRndItem(extraWeight));
}
}
/// <summary>
///
/// </summary>
static List<Item.ItemInfo> _TempList = new List<Item.ItemInfo>(16);
/// <summary>
/// 线程不安全
/// </summary>
/// <returns></returns>
public IList<Item.ItemInfo> GetRndItems()
{
_TempList.Clear();
GetRndItems(_TempList);
return _TempList;
}
/// <summary>
///
/// </summary>
/// <param name="extraWeight"></param>
/// <returns></returns>
public IList<Item.ItemInfo> GetRndItems(int extraWeight)
{
_TempList.Clear();
GetRndItems(_TempList, extraWeight);
return _TempList;
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public IList<Item.ItemInfo> GetRndAndExtraItems()
{
_TempList.Clear();
var extra = GetExtraItem();
if (extra.id > 0)
_TempList.Add(extra);
GetRndItems(_TempList);
return _TempList;
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public Item.ItemInfo GetRndItemByChapter(int index = 0)
{
var chapterIndex = Mathf.Clamp(LevelProxy.Instance.currentChapterId - 1, 0, item.items.Length - 1);
index = Mathf.Clamp(index, 0, item.items[chapterIndex].Length - 1);
var chapterBox = BoxProxy.Instance.GetBoxInfo(item.items[chapterIndex][index]);
return chapterBox.GetRndItem();
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public IList<Item.ItemInfo> GetRndItemsByChapter(int index = 0)
{
var chapterIndex = Mathf.Clamp(LevelProxy.Instance.currentChapterId - 1, 0, item.items.Length - 1);
index = Mathf.Clamp(index, 0, item.items[chapterIndex].Length - 1);
var chapterBox = BoxProxy.Instance.GetBoxInfo(item.items[chapterIndex][index]);
return chapterBox.GetRndItems();
}
}
#region Field
Dictionary<int, BoxInfo> _boxInfoDict;
#endregion
#region Method
/// <summary>
/// 获取宝箱信息
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public BoxInfo GetBoxInfo(int id)
{
_boxInfoDict.TryGetValue(id, out var result);
return result;
}
/// <summary>
///
/// </summary>
void InitBox()
{
var boxes = ItemProxy.Instance.GetStaticItems<ItemBox>();
_boxInfoDict = new Dictionary<int, BoxInfo>(boxes.Count);
for (int i = 0; i < boxes.Count; i++)
{
var boxInfo = new BoxInfo(boxes[i]);
_boxInfoDict.Add(boxInfo.item.id, boxInfo);
}
}
private const string ARCHIVE_KEY_V1 = "box_v1";
public void LoadBox()
{
}
public void SaveBox()
{
}
#endregion
#region Proxy
public static BoxProxy Instance => GetInstance<BoxProxy>();
public override void LoadCompleted()
{
InitBox();
}
public override void ReadArchive()
{
LoadBox();
}
#endregion
}
}