| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398 | using System.Collections.Generic;using System.Linq;using Excel2Json;using Fort23.Core;using Fort23.UTool;using GameLogic.Bag;using UnityEngine;using UnityEngine.UIElements;using Utility;namespace GameLogic.Player{    public class SummonManager    {        public Map<int, AccountFileInfo.SummonData> summonDataMap = new Map<int, AccountFileInfo.SummonData>();        //积分规则        public Map<int, List<OpenBoxScoreRule>> openBoxScoreRuleMap = new Map<int, List<OpenBoxScoreRule>>();        public void CustomInit()        {            OpenBoxConfig[] openBoxConfigs = ConfigComponent.Instance.GetAll<OpenBoxConfig>();            //每次进游戏检查是否有新的抽卡            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<OpenBoxScoreRule>();            foreach (var openBoxScoreRule in openBoxScoreRules)            {                List<OpenBoxScoreRule> openBoxScoreRuleList;                if (!openBoxScoreRuleMap.ContainsKey(openBoxScoreRule.openBoxID))                {                    openBoxScoreRuleList = new List<OpenBoxScoreRule>();                    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 async CTask<List<ItemInfo>> Summon(int id, int count)        {            AccountFileInfo.SummonData summonData = summonDataMap[id];            OpenBoxConfig openBoxConfig = ConfigComponent.Instance.Get<OpenBoxConfig>(summonData.id);            List<ItemInfo> allIitem = new List<ItemInfo>();            //单抽            if (count == 1)            {                //有免费次数,并且让到时间了就免费抽                if (summonData.oneFreeCount < openBoxConfig.oneConsumeFreePara[1] &&                    PlayerManager.Instance.serverTime >= summonData.nextOneFreeTime)                {                    allIitem = Summon(summonData, 1);                    summonData.oneFreeCount++;                    summonData.nextOneFreeTime =                        PlayerManager.Instance.serverTime + openBoxConfig.oneConsumeFreePara[0] * 1000;                }                else                {                    //验证道具是否足够                    if (openBoxConfig.CostItemID == 1007)                    {#if UNITY_ANDROID && !UNITY_EDITOR&& Taptap                        if (TakuSDKManager.Instance.IsReady())                        {                            bool isOK = await TakuSDKManager.Instance.ShowAutoAd();                            if (!isOK)                            {                                return null;                            }                        }                        else                        {                            return null;                        }#endif                    }                    else                    {                        //验证道具是否足够                        if (PlayerManager.Instance.BagController.IsEnough(openBoxConfig.CostItemID,                                openBoxConfig.oneConsume) || openBoxConfig.CostItemID == 1007)                        {                            PlayerManager.Instance.BagController.DeductCoin(openBoxConfig.oneConsume);                        }                        else                        {                            return null;                        }                    }                    allIitem = Summon(summonData, 1);                    summonData.onePayCount++;                }            }            //十连抽            else if (count == 10)            {                //有免费次数,并且让到时间了就免费抽                if (summonData.tenFreeCount < openBoxConfig.oneConsumeFreePara_1[1] &&                    PlayerManager.Instance.serverTime >= summonData.nextTenFreeTime)                {                    allIitem = Summon(summonData, 10);                    if (summonData.isSummonSocre)                    {                        //记录抽卡道具 用于成就检测                        List<int> drawHistory = new List<int>();                        foreach (var itemInfo in allIitem)                        {                            drawHistory.Add(itemInfo.itemID);                        }                        AccountFileInfo.IntList intList = new AccountFileInfo.IntList();                        intList.list = drawHistory;                        summonData.drawHistory.Add(intList);                        CheckAchievements(summonData);                    }                    summonData.tenFreeCount++;                    summonData.nextTenFreeTime =                        PlayerManager.Instance.serverTime + openBoxConfig.oneConsumeFreePara_1[0] * 1000;                }                else                {                    //验证道具是否足够                    if (openBoxConfig.CostItemID == 1007)                    {#if UNITY_ANDROID && !UNITY_EDITOR&& Taptap                        if (TakuSDKManager.Instance.IsReady())                        {                            bool isOK = await TakuSDKManager.Instance.ShowAutoAd();                            if (!isOK)                            {                                return null;                            }                        }                        else                        {                            return null;                        }#endif                    }                    else                    {                        if (PlayerManager.Instance.BagController.IsEnough(openBoxConfig.CostItemID,                                openBoxConfig.tenConsume) || openBoxConfig.CostItemID == 1007)                        {                            PlayerManager.Instance.BagController.DeductCoin(openBoxConfig.tenConsume);                        }                        else                        {                            return null;                        }                    }                    allIitem = Summon(summonData, 10);                    if (summonData.isSummonSocre)                    {                        //记录抽卡道具 用于成就检测                        List<int> drawHistory = new List<int>();                        foreach (var itemInfo in allIitem)                        {                            drawHistory.Add(itemInfo.itemID);                        }                        AccountFileInfo.IntList intList = new AccountFileInfo.IntList();                        intList.list = drawHistory;                        summonData.drawHistory.Add(intList);                        CheckAchievements(summonData);                    }                    summonData.tenPayCount++;                }            }            AccountFileInfo.Instance.SavePlayerData();            return allIitem;        }        public List<ItemInfo> Summon(AccountFileInfo.SummonData summonData, int count)        {            List<ItemInfo> allIitem = new List<ItemInfo>();            OpenBoxConfig openBoxConfig = ConfigComponent.Instance.Get<OpenBoxConfig>(summonData.id);            bool isBoadi2 = false;            //找到保底池子所有道具            List<int> baodiItems = new List<int>();            DropConfig dropConfig = ConfigComponent.Instance.Get<DropConfig>(openBoxConfig.reward2);            for (var i = 0; i < dropConfig.dropGroupID.Length; i++)            {                DropGroupConfig dropGroupConfig =                    ConfigComponent.Instance.Get<DropGroupConfig>(dropConfig.dropGroupID[i]);                for (var i1 = 0; i1 < dropGroupConfig.dropItemID.Length; i1++)                {                    DropItemConfig dropItemConfig =                        ConfigComponent.Instance.Get<DropItemConfig>(dropGroupConfig.dropItemID[i1]);                    for (var i2 = 0; i2 < dropItemConfig.itemID.Length; i2++)                    {                        baodiItems.Add(dropItemConfig.itemID[i2]);                    }                }            }            int index = 0;            for (int i = 0; i < count; i++)            {                isBoadi2 = false;                //十连保底1 每10次十连必出这个池子                if (summonData.baodiCount1 >= 9)                {                    List<ItemInfo> addItem = DropManager.Instance.DropItem(openBoxConfig.reward1);                    PlayerManager.Instance.BagController.AddItem(addItem);                    allIitem.AddRange(addItem);                    summonData.baodiCount1 = 0;                    summonData.baodiCount2++;                    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<ItemInfo> addItem1 = DropManager.Instance.DropItem(openBoxConfig.reward2);                    PlayerManager.Instance.BagController.AddItem(addItem1);                    summonData.baodiCount2 = 0;                    continue;                }                List<ItemInfo> addItem2;                if (count == 1)                {                    addItem2 = DropManager.Instance.DropItem(                        openBoxConfig.reward[Random.Range(0, openBoxConfig.reward.Length)]);                    PlayerManager.Instance.BagController.AddItem(addItem2);                    allIitem.AddRange(addItem2);                    summonData.baodiCount1++;                }                else                {                    addItem2 = DropManager.Instance.DropItem(openBoxConfig.reward[index]);                    PlayerManager.Instance.BagController.AddItem(addItem2);                    allIitem.AddRange(addItem2);                    summonData.baodiCount1++;                    index++;                }                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<OpenBoxScoreRule> openBoxScoreRuleList = openBoxScoreRuleMap[summonData.id];            List<OpenBoxScoreRule> daChengOpenBoxScoreRuleList = new List<OpenBoxScoreRule>();            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].list))                    {                        allDrawsSatisfy = false;                        break;                    }                }                if (allDrawsSatisfy)                {                    daChengOpenBoxScoreRuleList.Add(openBoxScoreRule);                }            }            if (daChengOpenBoxScoreRuleList.Count > 0)            {                int id = daChengOpenBoxScoreRuleList.Max(obsr => obsr.ID);                OpenBoxScoreRule openBoxScoreRule = ConfigComponent.Instance.Get<OpenBoxScoreRule>(id);                summonData.score += openBoxScoreRule.score;                AccountFileInfo.SummonSocreData summonSocreData =                    summonData.summonSocreData.FirstOrDefault(ss => ss.id == openBoxScoreRule.ID);                if (summonSocreData == null)                {                    summonSocreData = new AccountFileInfo.SummonSocreData();                    summonSocreData.id = id;                    summonData.summonSocreData.Add(summonSocreData);                }                summonSocreData.count++;                summonSocreData.currentCount++;                LogTool.Log(                    $"达成成就 ID: {openBoxScoreRule.ID}, 分数: {openBoxScoreRule.score}, 描述: 连续{openBoxScoreRule.para0}次十连获得{openBoxScoreRule.para1}个品质{openBoxScoreRule.para3}的道具");            }        }        // 检查单次十连是否满足成就条件        public bool CheckSingleDraw(OpenBoxScoreRule openBoxScoreRule, List<int> drawResult)        {            // 统计符合条件的道具数量            int validItemCount = 0;            foreach (var item in drawResult)            {                ItemConfig itemConfig = ConfigComponent.Instance.Get<ItemConfig>(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;        }    }}
 |