using System.Collections.Generic; using System.Linq; using Excel2Json; using Fort23.UTool; using GameLogic.Bag; using UnityEngine; using UnityEngine.UIElements; using Utility; namespace GameLogic.Player { public class SummonManager { public Map summonDataMap = new Map(); //积分规则 public Map> openBoxScoreRuleMap = new Map>(); public void CustomInit() { OpenBoxConfig[] openBoxConfigs = ConfigComponent.Instance.GetAll(); //每次进游戏检查是否有新的抽卡 foreach (var openBoxConfig in openBoxConfigs) { if (AccountFileInfo.Instance.playerData.SummonDatas.FirstOrDefault(s => s.id == openBoxConfig.ID) == null) { AccountFileInfo.SummonData summonData = new AccountFileInfo.SummonData(); summonData.id = openBoxConfig.ID; AccountFileInfo.Instance.playerData.SummonDatas.Add(summonData); } } OpenBoxScoreRule[] openBoxScoreRules = ConfigComponent.Instance.GetAll(); foreach (var openBoxScoreRule in openBoxScoreRules) { List openBoxScoreRuleList; if (!openBoxScoreRuleMap.ContainsKey(openBoxScoreRule.openBoxID)) { openBoxScoreRuleList = new List(); openBoxScoreRuleMap[openBoxScoreRule.openBoxID] = openBoxScoreRuleList; } openBoxScoreRuleList = openBoxScoreRuleMap[openBoxScoreRule.openBoxID]; openBoxScoreRuleList.Add(openBoxScoreRule); } foreach (var playerDataSummonData in AccountFileInfo.Instance.playerData.SummonDatas) { if (!summonDataMap.ContainsKey(playerDataSummonData.id)) { summonDataMap.Add(playerDataSummonData.id, playerDataSummonData); } } AccountFileInfo.Instance.SavePlayerData(); } public List Summon(int id, int count) { AccountFileInfo.SummonData summonData = summonDataMap[id]; OpenBoxConfig openBoxConfig = ConfigComponent.Instance.Get(summonData.id); List allIitem = new List(); //单抽 if (count == 1) { //有免费次数,并且让到时间了就免费抽 if (summonData.oneFreeCount < openBoxConfig.oneConsumeFreePara[1] && PlayerManager.Instance.serverTime >= summonData.nextOneFreeTime) { allIitem = Summon(summonData, 1); summonData.oneFreeCount++; summonData.onePayCount++; summonData.nextOneFreeTime = PlayerManager.Instance.serverTime + openBoxConfig.oneConsumeFreePara[0] * 1000; } else { //验证道具是否足够 if (PlayerManager.Instance.BagController.IsEnough(openBoxConfig.CostItemID, openBoxConfig.oneConsume)) { PlayerManager.Instance.BagController.DeductCoin(openBoxConfig.oneConsume); allIitem = Summon(summonData, 1); summonData.onePayCount++; summonData.nextOneFreeTime = PlayerManager.Instance.serverTime + openBoxConfig.oneConsumeFreePara[0] * 1000; } else { return null; } } } //十连抽 else if (count == 10) { //有免费次数,并且让到时间了就免费抽 if (summonData.tenFreeCount < openBoxConfig.oneConsumeFreePara_1[1] && PlayerManager.Instance.serverTime >= summonData.nextTenFreeTime) { allIitem = Summon(summonData, 10); //记录抽卡道具 用于成就检测 List drawHistory = new List(); foreach (var itemInfo in allIitem) { drawHistory.Add(itemInfo.itemID); } summonData.drawHistory.Add(drawHistory); summonData.tenFreeCount++; summonData.tenPayCount++; summonData.nextTenFreeTime = PlayerManager.Instance.serverTime + openBoxConfig.oneConsumeChargePara[0] * 1000; } else { //验证道具是否足够 if (PlayerManager.Instance.BagController.IsEnough(openBoxConfig.CostItemID, openBoxConfig.tenConsume)) { PlayerManager.Instance.BagController.DeductCoin(openBoxConfig.tenConsume); allIitem = Summon(summonData, 10); //记录抽卡道具 用于成就检测 List drawHistory = new List(); foreach (var itemInfo in allIitem) { drawHistory.Add(itemInfo.itemID); } summonData.drawHistory.Add(drawHistory); summonData.tenPayCount++; summonData.nextTenFreeTime = PlayerManager.Instance.serverTime + openBoxConfig.oneConsumeChargePara[0] * 1000; CheckAchievements(summonData); } else { return null; } } } AccountFileInfo.Instance.SavePlayerData(); return allIitem; } public List Summon(AccountFileInfo.SummonData summonData, int count) { List allIitem = new List(); OpenBoxConfig openBoxConfig = ConfigComponent.Instance.Get(summonData.id); bool isBoadi2 = false; //找到保底池子所有道具 List baodiItems = new List(); DropConfig dropConfig = ConfigComponent.Instance.Get(openBoxConfig.reward2); for (var i = 0; i < dropConfig.dropGroupID.Length; i++) { DropGroupConfig dropGroupConfig = ConfigComponent.Instance.Get(dropConfig.dropGroupID[i]); for (var i1 = 0; i1 < dropGroupConfig.dropItemID.Length; i1++) { DropItemConfig dropItemConfig = ConfigComponent.Instance.Get(dropGroupConfig.dropItemID[i1]); for (var i2 = 0; i2 < dropItemConfig.itemID.Length; i2++) { baodiItems.Add(dropItemConfig.itemID[i2]); } } } for (int i = 0; i < count; i++) { isBoadi2 = false; //十连保底1 每10次十连必出这个池子 if (summonData.baodiCount1 >= 10) { List addItem = DropManager.Instance.DropItem(openBoxConfig.reward1); PlayerManager.Instance.BagController.AddItem(addItem); allIitem.AddRange(addItem); summonData.baodiCount1 = 0; foreach (var baodiItem in baodiItems) { //除了保底2池子里的道具直接重置保底2 if (addItem.FirstOrDefault(i => i.itemID == baodiItem) != null) { summonData.baodiCount2 = 0; break; } } continue; } //十连保底2 每reward2para1次十连必出这个池子 if (summonData.baodiCount2 >= openBoxConfig.reward2para1) { List addItem1 = DropManager.Instance.DropItem(openBoxConfig.reward2); PlayerManager.Instance.BagController.AddItem(addItem1); summonData.baodiCount2 = 0; continue; } List addItem2 = DropManager.Instance.DropItem(openBoxConfig.reward); PlayerManager.Instance.BagController.AddItem(addItem2); allIitem.AddRange(addItem2); summonData.baodiCount1++; foreach (var baodiItem in baodiItems) { //除了保底2池子里的道具直接重置保底2 if (addItem2.FirstOrDefault(i => i.itemID == baodiItem) != null) { summonData.baodiCount2 = 0; isBoadi2 = true; break; } } if (!isBoadi2) { summonData.baodiCount2++; } } AccountFileInfo.Instance.SavePlayerData(); return allIitem; } // 检查成就匹配 private void CheckAchievements(AccountFileInfo.SummonData summonData) { List openBoxScoreRuleList = openBoxScoreRuleMap[summonData.id]; List daChengOpenBoxScoreRuleList = new List(); foreach (var openBoxScoreRule in openBoxScoreRuleList) { // 检查连续 Para0 次十连 if (summonData.drawHistory.Count < openBoxScoreRule.para0) continue; bool allDrawsSatisfy = true; // 检查最近 Para0 次十连是否都满足条件 for (int i = summonData.drawHistory.Count - openBoxScoreRule.para0; i < summonData.drawHistory.Count; i++) { if (!CheckSingleDraw(openBoxScoreRule, summonData.drawHistory[i])) { allDrawsSatisfy = false; break; } } if (allDrawsSatisfy) { daChengOpenBoxScoreRuleList.Add(openBoxScoreRule); } } if (daChengOpenBoxScoreRuleList.Count > 0) { int id = daChengOpenBoxScoreRuleList.Max(obsr => obsr.ID); OpenBoxScoreRule openBoxScoreRule = ConfigComponent.Instance.Get(id); summonData.score += openBoxScoreRule.score; LogTool.Log($"达成成就 ID: {openBoxScoreRule.ID}, 分数: {openBoxScoreRule.score}, 描述: 连续{openBoxScoreRule.para0}次十连获得{openBoxScoreRule.para1}个品质{openBoxScoreRule.para3}的道具"); } } // 检查单次十连是否满足成就条件 private bool CheckSingleDraw(OpenBoxScoreRule openBoxScoreRule, List drawResult) { // 统计符合条件的道具数量 int validItemCount = 0; foreach (var item in drawResult) { ItemConfig itemConfig = ConfigComponent.Instance.Get(item); // 检查道具标签 if (!openBoxScoreRule.para4.Contains(itemConfig.itemTag)) continue; // 检查品质是否符合 bool qualityMatch = false; switch (openBoxScoreRule.para2) { case 1: // 等于 qualityMatch = itemConfig.quality == openBoxScoreRule.para3; break; case 2: // 大于等于 qualityMatch = itemConfig.quality >= openBoxScoreRule.para3; break; case 3: // 小于等于 qualityMatch = itemConfig.quality <= openBoxScoreRule.para3; break; } if (qualityMatch) validItemCount++; } // 根据 Para1 判断是否满足数量要求 return validItemCount >= openBoxScoreRule.para1; } } }