From 88c90db6931233cf10213c6e7e4400ee29f980d0 Mon Sep 17 00:00:00 2001
From: lcy <1459594991@qq.com>
Date: 星期三, 22 四月 2026 17:16:06 +0800
Subject: [PATCH] 492 武将返场 高级战令
---
Main/System/HeroReturn/HeroReturnManager.cs | 402 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 400 insertions(+), 2 deletions(-)
diff --git a/Main/System/HeroReturn/HeroReturnManager.cs b/Main/System/HeroReturn/HeroReturnManager.cs
index d7930e8..5f5647d 100644
--- a/Main/System/HeroReturn/HeroReturnManager.cs
+++ b/Main/System/HeroReturn/HeroReturnManager.cs
@@ -6,9 +6,12 @@
public class HeroReturnManager : GameSystemManager<HeroReturnManager>, IOpenServerActivity
{
+ // 缂撳瓨鐨刏hanLingType鍒楄〃锛堜粠ActHeroAppearConfig鑾峰彇锛屽悗缁笉鍙橈級
+ private static List<int> zhanLingTypeList = null;
public int[] xbGridArr;
public Dictionary<int, int[][]> heroQaulityColor;
public int[][] seeArr;
+ public int subVulue;
public override void Init()
{
DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitializeEventOnRelogin;
@@ -22,15 +25,19 @@
GeneralActInfoManager.Instance.OnUpdateActSignInfosEvent += OnUpdateActSignInfosEvent;
HeroManager.Instance.onHeroChangeEvent += OnHeroChangeEvent;
TimeMgr.Instance.OnDayEvent += OnDayEvent;
+ BattlePassManager.Instance.BattlePassDataUpdateEvent += OnBattlePassDataUpdate;
var config = FuncConfigConfig.Get("HeroAppear");
xbGridArr = JsonMapper.ToObject<int[]>(config.Numerical1);
+ subVulue = int.Parse(config.Numerical4);
config = FuncConfigConfig.Get("HeroReturn");
heroQaulityColor = ConfigParse.ParseIntArray2Dict(config.Numerical1);
seeArr = JsonMapper.ToObject<int[][]>(config.Numerical2);
-
+
InitRedPointId();
+
+
}
public void SetheroQaulityColor(GradientText text, int qaulity)
@@ -53,6 +60,7 @@
GeneralActInfoManager.Instance.OnUpdateActSignInfosEvent -= OnUpdateActSignInfosEvent;
HeroManager.Instance.onHeroChangeEvent -= OnHeroChangeEvent;
TimeMgr.Instance.OnDayEvent -= OnDayEvent;
+ BattlePassManager.Instance.BattlePassDataUpdateEvent -= OnBattlePassDataUpdate;
}
private void OnDayEvent()
@@ -312,12 +320,14 @@
public Redpoint starUpRedpoint;
public Redpoint shopRedpoint;
public Redpoint giftRedpoint;
+ public Redpoint zhanLingRedpoint;
public void InitRedPointId()
{
checkInRedpoint ??= new Redpoint(MainRedDot.HeroReturnRepoint, GetRedPointId(HeroReturnRedPointType.CheckIn));
starUpRedpoint ??= new Redpoint(MainRedDot.HeroReturnRepoint, GetRedPointId(HeroReturnRedPointType.StarUp));
shopRedpoint ??= new Redpoint(MainRedDot.HeroReturnRepoint, GetRedPointId(HeroReturnRedPointType.Shop));
giftRedpoint ??= new Redpoint(MainRedDot.HeroReturnRepoint, GetRedPointId(HeroReturnRedPointType.Gift));
+ zhanLingRedpoint ??= new Redpoint(MainRedDot.HeroReturnRepoint, GetRedPointId(HeroReturnRedPointType.ZhanLing));
}
public void UpdateRedpoint()
@@ -327,6 +337,7 @@
starUpRedpoint.state = RedPointState.None;
shopRedpoint.state = RedPointState.None;
giftRedpoint.state = RedPointState.None;
+ zhanLingRedpoint.state = RedPointState.None;
if (!IsHeroReturnOpen()) return;
@@ -349,6 +360,10 @@
if (HasGiftCanHave())//鐨囨潈绀煎寘
{
giftRedpoint.state = RedPointState.Simple;
+ }
+ if (HasZhanLingCanHave())//鎴樹护
+ {
+ zhanLingRedpoint.state = RedPointState.Simple;
}
}
#endregion
@@ -834,7 +849,6 @@
LocalSave.SetBool(GetCallSkipKey(cfgID, startDate, endDate), value);
}
-
/// <summary>
/// 褰撳墠鎷涘嫙閫変腑鐨勬灏咺D
/// </summary>
@@ -847,6 +861,43 @@
if (config == null || config.ActHeroIDList?.Length <= callHeroIndex) return 0;
return config.ActHeroIDList[callHeroIndex];
+ }
+ public int GetLuckValueAward(int type)
+ {
+ XBTypeInfo typeInfo = HappyXBModel.Instance.GetXBInfoByType(type);
+ if (typeInfo == null) return 0;
+
+ var xbConfig = HappyXBModel.Instance.GetXBItemConfigByType(type);
+ var luckList = xbConfig.LuckyItemRateInfo.Keys.ToList();
+ luckList.Sort();
+ for (int i = 0; i < luckList.Count; i++)
+ {
+ var luckyValue = typeInfo.luckValue;
+ if (luckyValue < luckList[i])
+ {
+ return luckList[i];
+ }
+ }
+ return 0;
+ }
+
+ public int GetNextXBCountForBigAward(int type)
+ {
+ XBTypeInfo typeInfo = HappyXBModel.Instance.GetXBInfoByType(type);
+ if (typeInfo == null) return 0;
+
+ var xbConfig = HappyXBModel.Instance.GetXBItemConfigByType(type);
+ var luckList = xbConfig.LuckyItemRateInfo.Keys.ToList();
+ luckList.Sort();
+ for (int i = 0; i < luckList.Count; i++)
+ {
+ var luckyValue = typeInfo.luckValue;
+ if (luckyValue < luckList[i])
+ {
+ return luckList[i] - luckyValue;
+ }
+ }
+ return 0;
}
public int GetFirstHeroId()
@@ -1051,7 +1102,353 @@
}
#endregion
+ #region 鎴樹护
+ /// <summary>
+ /// 姝﹀皢鐧诲満鎴樹护绫诲瀷锛堜粠閰嶇疆瀹炴椂鑾峰彇锛�
+ /// </summary>
+ public int ZhanLingType => GetCurrentZhanLingType();
+ /// <summary>
+ /// 鑾峰彇褰撳墠鎴樹护绫诲瀷
+ /// </summary>
+ private int GetCurrentZhanLingType()
+ {
+ var act = GetOperationHeroAppearInfo();
+ if (act == null)
+ return 0;
+
+ var config = ActHeroAppearConfig.Get(act.CfgID);
+ return config?.ActZhanlingType ?? 0;
+ }
+
+ /// <summary>
+ /// 姝﹀皢鐧诲満鎴樹护鍔熻兘ID
+ /// </summary>
+ public const int ZhanLingFuncId = 63;
+
+ /// <summary>
+ /// 鎴樹护鏁版嵁鏇存柊浜嬩欢
+ /// </summary>
+ public event Action OnZhanLingUpdateEvent;
+
+ private void OnBattlePassDataUpdate(int type)
+ {
+ if (type == ZhanLingType)
+ {
+ OnZhanLingUpdateEvent?.Invoke();
+ }
+ }
+
+ /// <summary>
+ /// 鑾峰彇姝﹀皢鐧诲満鎴樹护鐨勫綋鍓嶈繘搴﹀��
+ /// </summary>
+ public int GetZhanLingValue()
+ {
+ var data = BattlePassManager.Instance.GetBattlePassData(ZhanLingType);
+ return data != null ? (int)data.value1 : 0;
+ }
+
+ /// <summary>
+ /// 鍒ゆ柇鎸囧畾绫诲瀷鏄惁涓篫hanLing绫诲瀷锛堢紦瀛樻煡璇級
+ /// </summary>
+ public static bool IsZhanLingType(int type)
+ {
+ if (zhanLingTypeList == null)
+ {
+ zhanLingTypeList = ActHeroAppearConfig.GetValues()
+ .Select(x => x.ActZhanlingType)
+ .Where(x => x > 0)
+ .Distinct()
+ .ToList();
+ }
+ return zhanLingTypeList.Contains(type);
+ }
+
+ /// <summary>
+ /// 鑾峰彇鎸囧畾ZhanLing绫诲瀷鐨勮繘搴﹀��
+ /// </summary>
+ public static int GetZhanLingValueByType(int zhanLingType)
+ {
+ var data = BattlePassManager.Instance.GetBattlePassData(zhanLingType);
+ return data != null ? (int)data.value1 : 0;
+ }
+
+ /// <summary>
+ /// 鍒ゆ柇姝﹀皢鐧诲満鎴樹护鐨勬寚瀹氱瓑绾ф槸鍚﹁揪鎴�
+ /// </summary>
+ public bool IsZhanLingNeedValueOk(int needValue)
+ {
+ return GetZhanLingValue() >= needValue;
+ }
+
+ /// <summary>
+ /// 鑾峰彇姝﹀皢鐧诲満鎴樹护鐨勮喘涔扮姸鎬�
+ /// 0 娌¤喘涔拌繘闃跺拰鐜勭骇 1 璐拱浜嗚繘闃舵病涔扮巹绾� 2 璐拱浜嗙巹绾ф病涔拌繘闃� 3 璐拱浜嗚繘闃跺拰鐜勭骇
+ /// </summary>
+ public int GetZhanLingBuyState()
+ {
+ var data = BattlePassManager.Instance.GetBattlePassData(ZhanLingType);
+ if (data == null)
+ return 0;
+
+ bool isBuyPaid = data.isActivite > 0;
+ bool isBuyPaidH = data.isActiviteH > 0;
+ if (isBuyPaid && isBuyPaidH)
+ return 3;
+ if (isBuyPaid)
+ return 1;
+ if (isBuyPaidH)
+ return 2;
+ return 0;
+ }
+
+ /// <summary>
+ /// 鏄惁鏈夊彲棰嗗彇鐨勬垬浠ゅ鍔�
+ /// </summary>
+ public bool HasZhanLingCanHave()
+ {
+ var data = BattlePassManager.Instance.GetBattlePassData(ZhanLingType);
+ if (data == null)
+ return false;
+
+ var dict = ZhanlingConfig.GetTypeToIDDict(ZhanLingType);
+ if (dict.IsNullOrEmpty())
+ return false;
+
+ int buyState = GetZhanLingBuyState();
+ bool isBuyPaid = buyState == 1 || buyState == 3;
+ bool isBuyPaidH = buyState == 2 || buyState == 3;
+
+ foreach (var kvp in dict)
+ {
+ int needValue = kvp.Key;
+ // 妫�鏌ュ厤璐瑰鍔�
+ int freeState = GetZhanLingFreeGiftState(needValue);
+ if (freeState == 1)
+ return true;
+
+ // 妫�鏌ユ櫘閫氬鍔憋紙闇�瑕佸凡璐拱杩涢樁锛�
+ if (isBuyPaid)
+ {
+ int paidState = GetZhanLingPaidGiftState(needValue);
+ if (paidState == 1)
+ return true;
+ }
+
+ // 妫�鏌ラ珮绾у鍔憋紙闇�瑕佸凡璐拱鐜勭骇锛�
+ if (isBuyPaidH)
+ {
+ int paidHState = GetZhanLingPaidGiftHState(needValue);
+ if (paidHState == 1)
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /// <summary>
+ /// 鑾峰彇姝﹀皢鐧诲満鎴樹护鍏嶈垂濂栧姳鐘舵��
+ /// 0 涓嶈兘棰� 1 鏈鍙� 2 宸查鍙�
+ /// </summary>
+ public int GetZhanLingFreeGiftState(int needValue)
+ {
+ var data = BattlePassManager.Instance.GetBattlePassData(ZhanLingType);
+ if (data == null)
+ return 0;
+ var totalValue = BattlePassManager.Instance.GetTotalValue(ZhanLingType);
+ return BattlePassManager.Instance.GetBPCellAwardState(data, totalValue, needValue, 0);
+ }
+
+ /// <summary>
+ /// 鑾峰彇姝﹀皢鐧诲満鎴樹护鏅�氬鍔辩姸鎬�
+ /// 0 涓嶈兘棰� 1 鏈鍙� 2 宸查鍙�
+ /// </summary>
+ public int GetZhanLingPaidGiftState(int needValue)
+ {
+ var data = BattlePassManager.Instance.GetBattlePassData(ZhanLingType);
+ if (data == null)
+ return 0;
+ var totalValue = BattlePassManager.Instance.GetTotalValue(ZhanLingType);
+ return BattlePassManager.Instance.GetBPCellAwardState(data, totalValue, needValue, 1);
+ }
+
+ /// <summary>
+ /// 鑾峰彇姝﹀皢鐧诲満鎴樹护楂樼骇濂栧姳鐘舵��
+ /// 0 涓嶈兘棰� 1 鏈鍙� 2 宸查鍙�
+ /// </summary>
+ public int GetZhanLingPaidGiftHState(int needValue)
+ {
+ var data = BattlePassManager.Instance.GetBattlePassData(ZhanLingType);
+ if (data == null)
+ return 0;
+ var totalValue = BattlePassManager.Instance.GetTotalValue(ZhanLingType);
+ return BattlePassManager.Instance.GetBPCellAwardState(data, totalValue, needValue, 2);
+ }
+
+ /// <summary>
+ /// 涓�閿鍙栨灏嗙櫥鍦烘垬浠ゆ墍鏈夊彲棰嗗彇濂栧姳
+ /// </summary>
+ public void HaveAllZhanLingGift()
+ {
+ var data = BattlePassManager.Instance.GetBattlePassData(ZhanLingType);
+ if (data == null)
+ return;
+
+ if (PackManager.Instance.GetEmptyGridCount(PackType.Item) < 1)
+ {
+ SysNotifyMgr.Instance.ShowTip("GeRen_lhs_202580");
+ return;
+ }
+
+ var totalValue = BattlePassManager.Instance.GetTotalValue(ZhanLingType);
+ BattlePassManager.Instance.GetAllAward(data, ZhanLingType, totalValue);
+ }
+ #endregion
+
+ #region 鎴樹护棰勮璐拱
+ /// <summary>
+ /// 褰撳墠棰勮鐨勬垬浠ょ被鍨�
+ /// </summary>
+ public int previewZhanLingType { get; private set; }
+
+ /// <summary>
+ /// 褰撳墠棰勮鐨勭ぜ鍖呯被鍨� 1 鏅�氭垬浠ょぜ鍖� 2 楂樼骇鎴樹护绀煎寘
+ /// </summary>
+ public int previewGiftType { get; private set; }
+
+ /// <summary>
+ /// 鏄剧ず鎴樹护璐拱棰勮鐣岄潰
+ /// </summary>
+ public void ShowZhanLingHBuy(int zhanLingType, int showGiftType)
+ {
+ previewZhanLingType = zhanLingType;
+ previewGiftType = showGiftType;
+
+ if (showGiftType == 1)
+ {
+ UIManager.Instance.OpenWindow<HeroReturnZhanLingPreviewWin>();
+ }
+ else if (showGiftType == 2)
+ {
+ UIManager.Instance.OpenWindow<HeroReturnZhanLingPreviewHWin>();
+ }
+ }
+
+ /// <summary>
+ /// 鑾峰彇褰撳墠棰勮绫诲瀷鐨勫厖鍊糏D
+ /// </summary>
+ public int GetPreviewCtgID()
+ {
+ int ctgid = 0;
+ if (previewGiftType == 1)
+ {
+ ctgid = BattlePassManager.Instance.GetCTGIDByType(previewZhanLingType);
+ }
+ else if (previewGiftType == 2)
+ {
+ // 楂樼骇鎴樹护浣跨敤 Numerical3
+ var config = FuncConfigConfig.Get("Zhanling");
+ if (config != null)
+ {
+ var dict = ConfigParse.ParseIntArrayDict(config.Numerical3);
+ if (dict.TryGetValue(previewZhanLingType, out var arr) && arr.Length > 0)
+ {
+ ctgid = arr[0];
+ }
+ }
+ }
+ return ctgid;
+ }
+
+ /// <summary>
+ /// 鑾峰彇璐拱鍚庢墍鏈夌瓑绾х殑濂栧姳
+ /// </summary>
+ /// <param name="maxCountPerSlot">姣忎釜鐩稿悓鐨刬temid姣忎釜鏍煎瓙鏈�澶у悓鏃舵樉绀虹殑鏁伴噺</param>
+ public List<Item> GetPreviewGiftAllItem(int maxCountPerSlot = 20)
+ {
+ List<int> collectList = new List<int>();
+ var dict = ZhanlingConfig.GetTypeToIDDict(previewZhanLingType);
+ if (dict.IsNullOrEmpty())
+ return new List<Item>();
+
+ var arr = dict.Keys.ToArray();
+ for (int i = 0; i < arr.Length; i++)
+ {
+ int needValue = arr[i];
+ int zhanLingId = dict[needValue];
+ collectList.Add(zhanLingId);
+ }
+ return CollectPreviewItems(collectList, maxCountPerSlot);
+ }
+
+ private List<Item> CollectPreviewItems(List<int> collectList, int maxCountPerSlot)
+ {
+ Dictionary<int, int> resultDict = new Dictionary<int, int>();
+ for (int i = 0; i < collectList.Count; i++)
+ {
+ int zhanLingId = collectList[i];
+ int[][] itemArr = GetPreviewItemArr(zhanLingId, previewGiftType);
+ if (itemArr.IsNullOrEmpty())
+ continue;
+
+ for (int j = 0; j < itemArr.Length; j++)
+ {
+ int itemID = itemArr[j][0];
+ int count = itemArr[j][1];
+ if (resultDict.ContainsKey(itemID))
+ resultDict[itemID] += count;
+ else
+ resultDict[itemID] = count;
+ }
+ }
+ List<Item> result = GetItemListByDict(resultDict, maxCountPerSlot);
+ result.Sort(CmpPreviewItem);
+ return result;
+ }
+
+ private int[][] GetPreviewItemArr(int zhanLingId, int showGiftType)
+ {
+ var config = ZhanlingConfig.Get(zhanLingId);
+ if (config == null)
+ return new int[][] { };
+
+ if (showGiftType == 1)
+ return config.ZLRewardItemList;
+ if (showGiftType == 2)
+ return config.ZLRewardItemListH;
+ return new int[][] { };
+ }
+
+ private List<Item> GetItemListByDict(Dictionary<int, int> dict, int maxCountPerSlot)
+ {
+ List<Item> result = new List<Item>();
+ var arr = dict.Keys.ToArray();
+ for (int i = 0; i < arr.Length; i++)
+ {
+ int itemID = arr[i];
+ int count = dict[itemID];
+
+ // 鏍规嵁maxCountPerSlot鎷嗗垎鏁伴噺锛屾瘡涓狪tem鏈�澶氭樉绀簃axCountPerSlot涓�
+ int slotCount = Mathf.CeilToInt((float)count / maxCountPerSlot);
+ for (int s = 0; s < slotCount; s++)
+ {
+ int itemCount = Mathf.Min(maxCountPerSlot, count - s * maxCountPerSlot);
+ result.Add(new Item(itemID, itemCount));
+ }
+ }
+ return result;
+ }
+
+ private int CmpPreviewItem(Item a, Item b)
+ {
+ int quality1 = ItemConfig.Get(a.id).ItemColor;
+ int quality2 = ItemConfig.Get(b.id).ItemColor;
+ if (quality1 != quality2)
+ return quality2.CompareTo(quality1);
+ return a.countEx.CompareTo(b.countEx);
+ }
+ #endregion
#region 鑾峰璁板綍
public static readonly int RecordType = 311;
@@ -1141,6 +1538,7 @@
StarUp = 2,
Shop = 3,
Gift = 4,
+ ZhanLing = 5,
}
public class HeroReturnGameRec
--
Gitblit v1.8.0