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>> haveGubaoPieceDict = new Dictionary>>(); Dictionary>> chooseGubaoPieceDict = new Dictionary>>(); public Dictionary qualityToStarCountDict = new Dictionary(); //古宝品质碎片可被当做通用碎片使用的最低古宝星级 public Action UpdateInfoAction; PackModel packModel { get { return ModelCenter.Instance.GetModelEx(); } } 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>> GetInfoDictByType(GubaoPieceInfoType type) { return type == GubaoPieceInfoType.Choose ? chooseGubaoPieceDict : haveGubaoPieceDict; } public bool TryGetPieceDictInfo(GubaoPieceInfoType type, int gubaoId, int star, int quality, out Dictionary result) { int index = gubaoId * 1000 + star; result = new Dictionary(); 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 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()) { WindowCenter.Instance.Open(); } } //清除所有记录信息 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>(); infoDict[index] = qualityDict; } if (!qualityDict.TryGetValue(quality, out var pieceList)) { pieceList = new Dictionary(); 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(); 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 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; } } }