using vnxbqy.UI;
|
using System.Collections.Generic;
|
using System;
|
using LitJson;
|
using System.Linq;
|
|
public enum GubaoPieceInfoType
|
{
|
Choose,
|
Have,
|
}
|
|
public class TreasurePavilionUpgradeChooseModel : Model
|
{
|
public int nowGubaoId;
|
public int nowStar;
|
public int nowQuality;
|
|
//<索引(古宝 * 1000 + 星) <品质,<通用碎片的古宝Id,使用碎片数量>>>
|
Dictionary<int, Dictionary<int, Dictionary<int, int>>> haveGubaoPieceDict = new Dictionary<int, Dictionary<int, Dictionary<int, int>>>();
|
Dictionary<int, Dictionary<int, Dictionary<int, int>>> chooseGubaoPieceDict = new Dictionary<int, Dictionary<int, Dictionary<int, int>>>();
|
public Dictionary<int, int> qualityToStarCountDict = new Dictionary<int, int>(); //古宝品质碎片可被当做通用碎片使用的最低古宝星级
|
|
public Action UpdateInfoAction;
|
PackModel packModel { get { return ModelCenter.Instance.GetModelEx<PackModel>(); } }
|
public override void Init()
|
{
|
ParseTable();
|
}
|
|
public override void UnInit()
|
{
|
|
}
|
|
void ParseTable()
|
{
|
var json = JsonMapper.ToObject(FuncConfigConfig.Get("GubaoPiece").Numerical1);
|
var keys = json.Keys.ToArray();
|
for (int i = 0; i < keys.Length; i++)
|
{
|
string key = keys[i];
|
qualityToStarCountDict[int.Parse(key)] = int.Parse(json[key].ToString());
|
}
|
}
|
|
|
public Dictionary<int, Dictionary<int, Dictionary<int, int>>> GetInfoDictByType(GubaoPieceInfoType type)
|
{
|
return type == GubaoPieceInfoType.Choose ? chooseGubaoPieceDict : haveGubaoPieceDict;
|
}
|
|
public bool TryGetPieceDictInfo(GubaoPieceInfoType type, int gubaoId, int star, int quality, out Dictionary<int, int> result)
|
{
|
int index = gubaoId * 1000 + star;
|
result = new Dictionary<int, int>();
|
var infoDict = GetInfoDictByType(type);
|
if (!infoDict.TryGetValue(index, out var qualityDict))
|
return false;
|
if (!qualityDict.TryGetValue(quality, out var pieceDict))
|
return false;
|
if (pieceDict.IsNullOrEmpty())
|
return false;
|
result = pieceDict;
|
return true;
|
}
|
|
//获得指定品质古包碎片质量的总和
|
public int GetAllGuBaoPieceCountByQuality(GubaoPieceInfoType type, int gubaoId, int star, int quality)
|
{
|
Dictionary<int, int> dict;
|
if (!TryGetPieceDictInfo(type, gubaoId, star, quality, out dict))
|
return 0;
|
return dict.Values.Sum();
|
}
|
|
public void OpenChooseWin(int gubaoId, int star, int quality)
|
{
|
nowGubaoId = gubaoId;
|
nowStar = star;
|
nowQuality = quality;
|
if (!WindowCenter.Instance.IsOpen<TreasurePavilionUpgradeChooseWin>())
|
{
|
WindowCenter.Instance.Open<TreasurePavilionUpgradeChooseWin>();
|
}
|
}
|
|
//清除所有记录信息
|
public void ClearAllInfo()
|
{
|
haveGubaoPieceDict.Clear();
|
chooseGubaoPieceDict.Clear();
|
}
|
|
public void SetGubaoPieceDict(GubaoPieceInfoType type, int gubaoId, int star, int quality, int pieceGubaoId, int pieceCount)
|
{
|
int index = gubaoId * 1000 + star;
|
var infoDict = GetInfoDictByType(type);
|
if (!infoDict.TryGetValue(index, out var qualityDict))
|
{
|
qualityDict = new Dictionary<int, Dictionary<int, int>>();
|
infoDict[index] = qualityDict;
|
}
|
if (!qualityDict.TryGetValue(quality, out var pieceList))
|
{
|
pieceList = new Dictionary<int, int>();
|
qualityDict[quality] = pieceList;
|
}
|
pieceList[pieceGubaoId] = pieceCount;
|
}
|
|
|
public IL_CB217_tagCMGubaoStarUp.tagCMGubaoPieceUse[] GetSendInfo(int gubaoId, int star)
|
{
|
int index = gubaoId * 1000 + star;
|
if (!chooseGubaoPieceDict.TryGetValue(index, out var qualityDict))
|
return null;
|
var sendDict = new Dictionary<int, int>();
|
var list = qualityDict.Keys.ToList();
|
for (int i = 0; i < list.Count; i++)
|
{
|
int quality = list[i];
|
var infoDict = qualityDict[quality];
|
var keys = infoDict.Keys.ToList();
|
for (int j = 0; j < keys.Count; j++)
|
{
|
int pieceGubaoId = keys[j];
|
int count = infoDict[pieceGubaoId];
|
if (count > 0)
|
{
|
sendDict[pieceGubaoId] = count;
|
}
|
}
|
}
|
var info = new IL_CB217_tagCMGubaoStarUp.tagCMGubaoPieceUse[sendDict.Count];
|
var infoList = sendDict.Keys.ToList();
|
for (int i = 0; i < infoList.Count; i++)
|
{
|
info[i] = new IL_CB217_tagCMGubaoStarUp.tagCMGubaoPieceUse
|
{
|
GubaoID = (ushort)infoList[i],
|
PieceCount = (ushort)sendDict[infoList[i]],
|
};
|
}
|
return info;
|
}
|
|
//获得所有可用古宝通用碎片信息
|
public void UpdateGubaoPieceInfo()
|
{
|
var keys = ILGubaoConfig.GetKeys();
|
for (int i = 0; i < keys.Count; i++)
|
{
|
int gubaoID = int.Parse(keys[i]);
|
var gubaoConfig = ILGubaoConfig.Get(gubaoID);
|
int quality = gubaoConfig.GubaoQuality;
|
if (!IsPiece(gubaoID))
|
continue;
|
int hasCnt = GetGuBaoPieceCount(gubaoID);
|
if (hasCnt == 0)
|
continue;
|
SetGubaoPieceDict(GubaoPieceInfoType.Have, nowGubaoId, nowStar, quality, gubaoID, hasCnt);
|
}
|
}
|
|
//实时查询拥有指定品质的碎片数量
|
public int GetHaveGuBaoPieceCountByQuality(int nowQuality)
|
{
|
int count = 0;
|
var keys = ILGubaoConfig.GetKeys();
|
for (int i = 0; i < keys.Count; i++)
|
{
|
int gubaoID = int.Parse(keys[i]);
|
var gubaoConfig = ILGubaoConfig.Get(gubaoID);
|
int quality = gubaoConfig.GubaoQuality;
|
if (!IsPiece(gubaoID))
|
continue;
|
if (quality == nowQuality)
|
{
|
int hasCnt = GetGuBaoPieceCount(gubaoID);
|
count += hasCnt;
|
}
|
}
|
return count;
|
}
|
|
//这个古宝可作为万能碎片
|
bool IsPiece(int gubaoID)
|
{
|
var gubaoConfig = ILGubaoConfig.Get(gubaoID);
|
int quality = gubaoConfig.GubaoQuality;
|
//当前古宝品质不可作为通用碎片
|
if (!qualityToStarCountDict.TryGetValue(quality, out int requiredStarLevel))
|
return false;
|
var gubaoInfo = TreasurePavilionModel.Instance.TryGetGubaoInfo(gubaoID);
|
//当前古宝星级小于可用于通用碎片最低星级
|
if (gubaoInfo.IsNullOrEmpty() || gubaoInfo[0] < requiredStarLevel)
|
return false;
|
if (!ItemConfig.Has(gubaoConfig.UnlockItemID))
|
return false;
|
return true;
|
}
|
|
//获取古宝解锁材料数量
|
public int GetGuBaoPieceCount(int gubaoID)
|
{
|
int hasCnt = 0;
|
var gubaoConfig = ILGubaoConfig.Get(gubaoID);
|
var itemConfig = ItemConfig.Get(gubaoConfig.UnlockItemID);
|
if (itemConfig.Effect1 == 270)
|
{
|
hasCnt = TreasurePavilionModel.Instance.GetGubaoItemCount(itemConfig.EffectValueA1);
|
}
|
else
|
{
|
hasCnt = packModel.GetItemCountByID(PackType.Item, gubaoConfig.UnlockItemID);
|
}
|
return hasCnt;
|
}
|
|
Dictionary<int, int> autoChooseDict;
|
public void AutoChoose()
|
{
|
if (!TryGetPieceDictInfo(GubaoPieceInfoType.Have, nowGubaoId, nowStar, nowQuality, out autoChooseDict))
|
return;
|
|
int maxCount = ILGubaoStarConfig.GetNeedGubaPieceCountByQuality(nowGubaoId, nowStar, nowQuality);
|
int hasAllCount = autoChooseDict.Values.Sum();
|
int chooseCount = 0;
|
var list = autoChooseDict.Keys.ToList();
|
list.Sort(Cmp);
|
if (hasAllCount <= maxCount)
|
{
|
for (int i = 0; i < list.Count; i++)
|
{
|
int gubaoID = list[i];
|
int count = autoChooseDict[gubaoID];
|
SetGubaoPieceDict(GubaoPieceInfoType.Choose, nowGubaoId, nowStar, nowQuality, gubaoID, count);
|
}
|
}
|
else
|
{
|
for (int i = 0; i < list.Count; i++)
|
{
|
int gubaoID = list[i];
|
int count = autoChooseDict[gubaoID];
|
int nowCount = 0;
|
if (chooseCount < maxCount)
|
{
|
for (int j = 0; j < count; j++)
|
{
|
if (chooseCount < maxCount)
|
{
|
chooseCount += 1;
|
nowCount += 1;
|
SetGubaoPieceDict(GubaoPieceInfoType.Choose, nowGubaoId, nowStar, nowQuality, gubaoID, nowCount);
|
}
|
}
|
}
|
else
|
{
|
SetGubaoPieceDict(GubaoPieceInfoType.Choose, nowGubaoId, nowStar, nowQuality, gubaoID, 0);
|
}
|
}
|
}
|
}
|
|
//数量多 > 数量少
|
public int Cmp(int a, int b)
|
{
|
int count1 = autoChooseDict[a];
|
int count2 = autoChooseDict[b];
|
if (count1 > count2)
|
{
|
return -1;
|
}
|
else if (count1 < count2)
|
{
|
return 1;
|
}
|
else
|
{
|
return 0;
|
}
|
}
|
}
|