372 lines
7.5 KiB
C#
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
|
|
}
|
|
}
|