Browse Source

添加保底逻辑

lzx 1 day ago
parent
commit
55df35141e

+ 36 - 12
Assets/Scripts/GameLogic/Player/AccountFileInfo.cs

@@ -41,7 +41,7 @@ public class AccountFileInfo : Singleton<AccountFileInfo>
         /// 神识点
         /// 神识点
         /// </summary>
         /// </summary>
         public float divineSensePoint = 0;
         public float divineSensePoint = 0;
-        
+
         /// <summary>
         /// <summary>
         /// 今天回复的神识值
         /// 今天回复的神识值
         /// </summary>
         /// </summary>
@@ -68,7 +68,7 @@ public class AccountFileInfo : Singleton<AccountFileInfo>
         public int CurrentZuiZhongEventListId;
         public int CurrentZuiZhongEventListId;
 
 
         public List<DaoYouData> daoYouDatas = new List<DaoYouData>();
         public List<DaoYouData> daoYouDatas = new List<DaoYouData>();
-        
+
         public List<DaoYouGuaiJiData> daoYouGuaiJiDatas = new List<DaoYouGuaiJiData>();
         public List<DaoYouGuaiJiData> daoYouGuaiJiDatas = new List<DaoYouGuaiJiData>();
 
 
 
 
@@ -122,12 +122,16 @@ public class AccountFileInfo : Singleton<AccountFileInfo>
 
 
         //塔数据
         //塔数据
         public List<TowerData> TowerDatas = new List<TowerData>();
         public List<TowerData> TowerDatas = new List<TowerData>();
-        
+
         //掉落数据
         //掉落数据
         public List<QiankundaiData> QiankundaiDatas = new List<QiankundaiData>();
         public List<QiankundaiData> QiankundaiDatas = new List<QiankundaiData>();
-        
+
         public List<ItemData> QiankundaiItemDatas = new List<ItemData>();
         public List<ItemData> QiankundaiItemDatas = new List<ItemData>();
-        
+
+
+        //招募数据
+        public List<SummonData> SummonDatas = new List<SummonData>();
+
 
 
         /// <summary>
         /// <summary>
         /// 挂机掉落了多少时间
         /// 挂机掉落了多少时间
@@ -143,14 +147,13 @@ public class AccountFileInfo : Singleton<AccountFileInfo>
         public bool boxFree;
         public bool boxFree;
     }
     }
 
 
-    
+
     public class QiankundaiData
     public class QiankundaiData
     {
     {
         public int id;
         public int id;
         public long refenceTime;
         public long refenceTime;
         public int dropCount;
         public int dropCount;
         public int dropTime;
         public int dropTime;
-
     }
     }
 
 
     /// <summary>
     /// <summary>
@@ -393,7 +396,7 @@ public class AccountFileInfo : Singleton<AccountFileInfo>
         public int guid;
         public int guid;
 
 
         public int eventID;
         public int eventID;
-        
+
         public List<ItemData> itemInfos = new List<ItemData>();
         public List<ItemData> itemInfos = new List<ItemData>();
 
 
         public List<EventLinkData> eventLinks = new List<EventLinkData>();
         public List<EventLinkData> eventLinks = new List<EventLinkData>();
@@ -405,6 +408,28 @@ public class AccountFileInfo : Singleton<AccountFileInfo>
         public bool isCompleted;
         public bool isCompleted;
     }
     }
 
 
+    public class SummonData
+    {
+        // 招募ID
+        public int id;
+
+        //免费招募次数
+        public int freeCount;
+
+        //下一次免费招募时间
+        public long nextFreeTime;
+
+        //付费招募次数
+        public int payCount;
+
+        //下一次付费招募时间
+        public long nextPayTime;
+
+        //保底次数
+        public int baodiCount1;
+        public int baodiCount2;
+    }
+
 
 
     /// <summary>
     /// <summary>
     /// 重建索引表
     /// 重建索引表
@@ -621,12 +646,11 @@ public class AccountFileInfo : Singleton<AccountFileInfo>
         playerData.ItemListData.Add(new ItemData(1403, 10));
         playerData.ItemListData.Add(new ItemData(1403, 10));
         playerData.ItemListData.Add(new ItemData(1404, 10));
         playerData.ItemListData.Add(new ItemData(1404, 10));
         playerData.ItemListData.Add(new ItemData(1601, 10));
         playerData.ItemListData.Add(new ItemData(1601, 10));
-        
+
         playerData.ItemListData.Add(new ItemData(21012, 10));
         playerData.ItemListData.Add(new ItemData(21012, 10));
         playerData.ItemListData.Add(new ItemData(21013, 10));
         playerData.ItemListData.Add(new ItemData(21013, 10));
-        
-        
-        
+
+
         playerData.ItemListData.Add(new ItemData(21001, 10));
         playerData.ItemListData.Add(new ItemData(21001, 10));
         playerData.ItemListData.Add(new ItemData(21002, 10));
         playerData.ItemListData.Add(new ItemData(21002, 10));
         playerData.ItemListData.Add(new ItemData(21003, 10));
         playerData.ItemListData.Add(new ItemData(21003, 10));

+ 2 - 0
Assets/Scripts/GameLogic/Player/PlayerManager.cs

@@ -25,6 +25,7 @@ public class PlayerManager : Singleton<PlayerManager>
     public GongFaControl GongFaControl;
     public GongFaControl GongFaControl;
     public FaBaoControl FaBaoControl;
     public FaBaoControl FaBaoControl;
     public BagController BagController;
     public BagController BagController;
+    public SummonManager SummonManager = new SummonManager();
 
 
     // public Map<long, List<AccountFileInfo.DaoYouGuaiJiData>> GuaijiDaoYou = new Map<long, List<AccountFileInfo.DaoYouGuaiJiData>>();
     // public Map<long, List<AccountFileInfo.DaoYouGuaiJiData>> GuaijiDaoYou = new Map<long, List<AccountFileInfo.DaoYouGuaiJiData>>();
 
 
@@ -90,6 +91,7 @@ public class PlayerManager : Singleton<PlayerManager>
 
 
         CalculateOfflineRewards();
         CalculateOfflineRewards();
         AccountFileInfo.Instance.SavePlayerData();
         AccountFileInfo.Instance.SavePlayerData();
+        SummonManager.CustomInit();
         isLogin = true;
         isLogin = true;
     }
     }
 
 

+ 190 - 0
Assets/Scripts/GameLogic/Player/SummonManager.cs

@@ -0,0 +1,190 @@
+using System.Collections.Generic;
+using System.Linq;
+using Excel2Json;
+using Fort23.UTool;
+using GameLogic.Bag;
+using UnityEngine;
+using Utility;
+
+namespace GameLogic.Player
+{
+    public class SummonManager
+    {
+        public Map<int, AccountFileInfo.SummonData> summonDataMap = new Map<int, AccountFileInfo.SummonData>();
+
+        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);
+                }
+            }
+
+            foreach (var playerDataSummonData in AccountFileInfo.Instance.playerData.SummonDatas)
+            {
+                if (!summonDataMap.ContainsKey(playerDataSummonData.id))
+                {
+                    summonDataMap.Add(playerDataSummonData.id, playerDataSummonData);
+                }
+            }
+
+            AccountFileInfo.Instance.SavePlayerData();
+        }
+
+        public 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.freeCount < openBoxConfig.oneConsumeFreePara[1] && PlayerManager.Instance.serverTime >= summonData.nextFreeTime)
+                {
+                    allIitem = Summon(summonData, 1);
+
+                    summonData.nextFreeTime = 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.nextFreeTime = PlayerManager.Instance.serverTime + openBoxConfig.oneConsumeFreePara[0] * 1000;
+                    }
+                    else
+                    {
+                        return null;
+                    }
+                }
+            }
+            //十连抽
+            else if (count == 10)
+            {
+                //有免费次数,并且让到时间了就免费抽
+                if (summonData.payCount < openBoxConfig.oneConsumeFreePara_1[1] && PlayerManager.Instance.serverTime >= summonData.nextPayTime)
+                {
+                    allIitem = Summon(summonData, 10);
+
+                    summonData.nextPayTime = 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);
+                        summonData.nextPayTime = PlayerManager.Instance.serverTime + openBoxConfig.oneConsumeChargePara[0] * 1000;
+                    }
+                    else
+                    {
+                        return null;
+                    }
+                }
+            }
+
+            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]);
+                    }
+                }
+            }
+
+
+            for (int i = 0; i < count; i++)
+            {
+                
+                isBoadi2 = false;
+                
+                //十连保底1 每10次十连必出这个池子
+                if (summonData.baodiCount1 >= 10)
+                {
+                    List<ItemInfo> 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<ItemInfo> addItem1 = DropManager.Instance.DropItem(openBoxConfig.reward2);
+                    PlayerManager.Instance.BagController.AddItem(addItem1);
+                    summonData.baodiCount2 = 0;
+                    continue;
+                }
+
+
+                List<ItemInfo> 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;
+        }
+    }
+}

+ 3 - 0
Assets/Scripts/GameLogic/Player/SummonManager.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 6508541278844031b01c84a6e732d8b5
+timeCreated: 1755158730

+ 25 - 33
Assets/Scripts/GameUI/UI/BoxPanel/BoxPanel.cs

@@ -15,57 +15,49 @@ namespace Fort23.Mono
     {
     {
         public async static CTask<List<ItemInfo>> TenBox(int configId, bool isFree = false)
         public async static CTask<List<ItemInfo>> TenBox(int configId, bool isFree = false)
         {
         {
+            AccountFileInfo.SummonData summonData = PlayerManager.Instance.SummonManager.summonDataMap[configId];
             OpenBoxConfig openBoxConfig = ConfigComponent.Instance.Get<OpenBoxConfig>(configId);
             OpenBoxConfig openBoxConfig = ConfigComponent.Instance.Get<OpenBoxConfig>(configId);
-            if (PlayerManager.Instance.BagController.IsEnough(GlobalParam.Item_Coin_ID, openBoxConfig.tenConsume) || isFree)
+            //有免费次数,并且让到时间了就免费抽
+            if (summonData.payCount < openBoxConfig.oneConsumeFreePara_1[1] && PlayerManager.Instance.serverTime >= summonData.nextPayTime)
             {
             {
-                PlayerManager.Instance.BagController.DeductCoin(openBoxConfig.tenConsume);
-
-                List<ItemInfo> allIitem = new List<ItemInfo>();
-                for (int i = 0; i < 10; i++)
-                {
-                    List<ItemInfo> currItem = DropManager.Instance.DropItem(openBoxConfig.reward);
-                    allIitem.AddRange(currItem);
-                }
-
-                PlayerManager.Instance.BagController.AddItem(allIitem);
-
-                return allIitem;
+                return PlayerManager.Instance.SummonManager.Summon(configId, 10);
             }
             }
             else
             else
             {
             {
-                bool isOK = await TipsPanle.OpenPnael(1041);
-                if (isOK)
+                //验证道具是否足够
+                if (PlayerManager.Instance.BagController.IsEnough(openBoxConfig.CostItemID, openBoxConfig.tenConsume))
                 {
                 {
-                    ShopPanel.OpenPanel();
+                    return PlayerManager.Instance.SummonManager.Summon(configId, 10);
+                }
+                else
+                {
+                    TipMessagePanel.OpenTipMessagePanel("道具不足", Vector2.zero);
+                    return null;
                 }
                 }
-
-
-                return null;
             }
             }
         }
         }
 
 
         public async static CTask<List<ItemInfo>> OneBox(int configId)
         public async static CTask<List<ItemInfo>> OneBox(int configId)
         {
         {
+            AccountFileInfo.SummonData summonData = PlayerManager.Instance.SummonManager.summonDataMap[configId];
             OpenBoxConfig openBoxConfig = ConfigComponent.Instance.Get<OpenBoxConfig>(configId);
             OpenBoxConfig openBoxConfig = ConfigComponent.Instance.Get<OpenBoxConfig>(configId);
-
-            if (PlayerManager.Instance.BagController.IsEnough(GlobalParam.Item_Coin_ID, openBoxConfig.oneConsume))
+            //有免费次数,并且让到时间了就免费抽
+            if (summonData.freeCount < openBoxConfig.oneConsumeFreePara[1] && PlayerManager.Instance.serverTime >= summonData.nextFreeTime)
             {
             {
-                PlayerManager.Instance.BagController.DeductCoin(openBoxConfig.oneConsume);
-                List<ItemInfo> allIitem = DropManager.Instance.DropItem(openBoxConfig.reward);
-                PlayerManager.Instance.BagController.AddItem(allIitem);
-
-                return allIitem;
+                return PlayerManager.Instance.SummonManager.Summon(configId, 1);
             }
             }
             else
             else
             {
             {
-                bool isOK = await TipsPanle.OpenPnael(1041);
-                if (isOK)
+                //验证道具是否足够
+                if (PlayerManager.Instance.BagController.IsEnough(openBoxConfig.CostItemID, openBoxConfig.tenConsume))
                 {
                 {
-                    ShopPanel.OpenPanel();
+                    return PlayerManager.Instance.SummonManager.Summon(configId, 1);
+                }
+                else
+                {
+                    TipMessagePanel.OpenTipMessagePanel("道具不足", Vector2.zero);
+                    return null;
                 }
                 }
-
-                // TipMessagePanel.OpenTipMessagePanel(LanguageManager.Instance.Text(102), Vector2.zero);
-                return null;
             }
             }
         }
         }
     }
     }
@@ -77,7 +69,7 @@ namespace Fort23.Mono
 
 
         public static async void OpenBoxPanel()
         public static async void OpenBoxPanel()
         {
         {
-            BoxPanel boxPanel = await UIManager.Instance.LoadAndOpenPanel<BoxPanel>(null, layer: UILayer.Middle,isShowBG:true);
+            BoxPanel boxPanel = await UIManager.Instance.LoadAndOpenPanel<BoxPanel>(null, layer: UILayer.Middle, isShowBG: true);
             boxPanel.OpenPanel();
             boxPanel.OpenPanel();
         }
         }