hch
2025-12-31 6fae2f660ac6cdf5be45261caa0d31afc544ff95
121 【武将】武将系统 - 重生
4个文件已添加
3个文件已修改
390 ■■■■ 已修改文件
Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB239_tagCSHeroRebirth.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/HeroUI/HeroRebornCell.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/HeroUI/HeroRebornCell.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/HeroUI/HeroRebornWin.cs 238 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/HeroUI/HeroRebornWin.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/HeroUI/HeroUIManager.Reborn.cs 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/HeroUI/HeroUIManager.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB239_tagCSHeroRebirth.cs
@@ -5,6 +5,9 @@
public class CB239_tagCSHeroRebirth : GameNetPackBasic {
    public ushort ItemIndex;    //武将物品所在武将背包位置索引
    public byte LVReset;    //重置等级
    public byte BreakReset;    //重置突破
    public byte AwakeReset;    //重置觉醒
    public CB239_tagCSHeroRebirth () {
        combineCmd = (ushort)0x03FE;
@@ -13,6 +16,9 @@
    public override void WriteToBytes () {
        WriteBytes (ItemIndex, NetDataType.WORD);
        WriteBytes (LVReset, NetDataType.BYTE);
        WriteBytes (BreakReset, NetDataType.BYTE);
        WriteBytes (AwakeReset, NetDataType.BYTE);
    }
}
Main/System/HeroUI/HeroRebornCell.cs
New file
@@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class HeroRebornCell : CellView
{
    [SerializeField] ItemCell itemCell;
    [SerializeField] Text itemName;
    public void Display(int index, string replaceItemName, List<Item> items)
    {
        int itemID = items[index].id;
        itemCell.Init(new ItemCellModel(itemID, false, items[index].countEx));
        itemCell.button.SetListener(() =>
        {
            ItemTipUtility.Show(itemID);
        });
        itemName.text = replaceItemName;
    }
}
Main/System/HeroUI/HeroRebornCell.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1057fbe6aa0422f45b5540032f6baa5b
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/HeroUI/HeroRebornWin.cs
New file
@@ -0,0 +1,238 @@
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
//带有多个物品的操作提示
public class HeroRebornWin : UIBase
{
    [SerializeField] Text m_Info2;  //物品列表下方提示
    [SerializeField] ScrollerController m_Scroller;
    [SerializeField] Button m_ConfirmBtn;
    [SerializeField] Button m_CancleBtn;
    [SerializeField] Transform moneyObj;
    [SerializeField] Text moneyText;
    [SerializeField] Image moneyIcon;
    [SerializeField] Toggle lvToggle;
    [SerializeField] Toggle breakToggle;
    [SerializeField] Toggle awakeToggle;
    #region Built-in
    string replaceItemName;
    int costCnt;
    List<Item> items = new List<Item>();
    protected override void InitComponent()
    {
        m_ConfirmBtn.AddListener(ConfirmBtn);
        m_CancleBtn.AddListener(() =>
        {
            CloseWindow();
        });
        lvToggle.onValueChanged.AddListener((bool isOn) =>
        {
            var hero = HeroManager.Instance.GetHero(HeroUIManager.Instance.selectRebornHeroGuid);
            if (hero == null)
            {
                return;
            }
            Display(hero);
            if (lvToggle.isOn == true)
            {
                breakToggle.isOn = true;
            }
        });
        breakToggle.onValueChanged.AddListener((bool isOn) =>
        {
            var hero = HeroManager.Instance.GetHero(HeroUIManager.Instance.selectRebornHeroGuid);
            if (hero == null)
            {
                return;
            }
            Display(hero);
            if (!breakToggle.isOn)
            {
                lvToggle.isOn = false;
            }
        });
        awakeToggle.onValueChanged.AddListener((bool isOn) =>
        {
            var hero = HeroManager.Instance.GetHero(HeroUIManager.Instance.selectRebornHeroGuid);
            if (hero == null)
            {
                return;
            }
            Display(hero);
        });
        lvToggle.isOn = true;
        breakToggle.isOn = true;
    }
    protected override void OnPreOpen()
    {
        m_Scroller.OnRefreshCell += OnRefreshCell;
        var hero = HeroManager.Instance.GetHero(HeroUIManager.Instance.selectRebornHeroGuid);
        if (hero == null)
        {
            return;
        }
        Display(hero);
    }
    protected override void OnPreClose()
    {
        m_Scroller.OnRefreshCell -= OnRefreshCell;
    }
    #endregion
    void Display(HeroInfo hero)
    {
        items.Clear();
        replaceItemName = $"( {HeroUIManager.Instance.rebornPayBackPer}% )";
        costCnt = 0;
        Dictionary<string, double> rebornParam = new Dictionary<string, double>();  //重生消耗公式参数
        var payBack1 = new Dictionary<int, long>();
        if (hero.heroLevel == 0)
        {
            lvToggle.isOn = false;
        }
        if (hero.breakLevel == 0)
        {
            breakToggle.isOn = false;
        }
        if (lvToggle.isOn)
        {
            payBack1 = HeroUIManager.Instance.GetHeroLVPayBack(hero.Quality, hero.heroLevel);
            //先计算有没消耗
            rebornParam.Add("heroLV", hero.heroLevel);
            costCnt = (int)JaceCalculator.Calculate(HeroUIManager.Instance.rebornFormula, rebornParam);
        }
        if (breakToggle.isOn)
        {
            payBack1 = CommonFunc.AddDict(payBack1, HeroUIManager.Instance.GetHeroBreakPayBack(hero.Quality, hero.breakLevel));
            rebornParam.Clear();
            //先计算有没消耗
            rebornParam.Add("breakLV", hero.breakLevel);
            costCnt += (int)JaceCalculator.Calculate(HeroUIManager.Instance.rebornBreakFormula, rebornParam);
        }
        //重生等级重置的消耗,参数 heroLV武将等级,最终消耗为公式+觉醒消耗
        if (hero.awakeLevel == 0)
        {
            awakeToggle.isOn = false;
            awakeToggle.SetActive(false);
            m_Info2.SetActive(false);
        }
        else
        {
            awakeToggle.SetActive(true);
            if (awakeToggle.isOn)
            {
                payBack1 = CommonFunc.AddDict(payBack1, HeroUIManager.Instance.GetHeroQualityAwakePayBack(hero.Quality, hero.awakeLevel));
                costCnt += HeroQualityAwakeConfig.GetQualityAwakeConfig(hero.Quality, hero.awakeLevel).RebirthCostMoney;
            }
            m_Info2.SetActive(true);
            m_Info2.text = Language.Get("herocard44", HeroUIManager.Instance.rebornAwakeHeroMaxCount - HeroUIManager.Instance.awakeRebirthCnt);
        }
        //计算返还比例
        var _list = payBack1.Keys.ToList();
        foreach (var key in _list)
        {
            payBack1[key] = Math.Max((long)(payBack1[key] * HeroUIManager.Instance.rebornPayBackPer / 100.0), 1);
        }
        items = CommonFunc.ChangeToItemList(payBack1);
        if (costCnt == 0)
        {
            moneyObj.SetActive(false);
        }
        else
        {
            moneyObj.SetActive(true);
            moneyText.text = UIHelper.ShowUseMoney(HeroUIManager.Instance.payBackMoneyType, costCnt);
            moneyIcon.SetIconWithMoneyType(HeroUIManager.Instance.payBackMoneyType);
        }
        if (!lvToggle.isOn && !breakToggle.isOn && !awakeToggle.isOn)
        {
            m_Scroller.SetActive(false);
        }
        else
        {
            m_Scroller.SetActive(true);
            m_Scroller.Refresh();
            for (int i = 0; i < items.Count; i++)
            {
                m_Scroller.AddCell(ScrollerDataType.Header, i);
            }
            m_Scroller.Restart();
        }
    }
    private void ConfirmBtn()
    {
        if (HeroUIManager.Instance.awakeRebirthCnt >= HeroUIManager.Instance.rebornAwakeHeroMaxCount)
        {
            SysNotifyMgr.Instance.ShowTip("HeroRebornAwakeMax");
            return;
        }
        if (!lvToggle.isOn && !breakToggle.isOn && !awakeToggle.isOn)
        {
            SysNotifyMgr.Instance.ShowTip("HeroReborn4");
            return;
        }
        if (UIHelper.GetMoneyCnt(HeroUIManager.Instance.payBackMoneyType) < costCnt)
        {
            ItemTipUtility.ShowMoneyTip(HeroUIManager.Instance.payBackMoneyType);
            return;
        }
        var hero = HeroManager.Instance.GetHero(HeroUIManager.Instance.selectRebornHeroGuid);
        if (hero == null)
        {
            return;
        }
        HeroUIManager.Instance.SendReborn(hero, lvToggle.isOn, breakToggle.isOn, awakeToggle.isOn);
        CloseWindow();
    }
    void OnRefreshCell(ScrollerDataType type, CellView cell)
    {
        var _cell = cell as HeroRebornCell;
        _cell?.Display(cell.index, replaceItemName, items);
    }
}
Main/System/HeroUI/HeroRebornWin.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 229033777efa2f94099831442f119256
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/HeroUI/HeroUIManager.Reborn.cs
@@ -12,7 +12,8 @@
    public int awakeRebirthCnt { get; private set; }
    public int payBackMoneyType;
    public int rebornAwakeHeroMaxCount; //觉醒武将每日的最大重生次数
    public string rebornFormula;    //重生等级重置的消耗,参数 heroLV武将等级,最终消耗为公式+觉醒消耗
    public string rebornFormula;    //重生等级重置的消耗,参数 heroLV武将等级
    public string rebornBreakFormula;   //重生突破
    public int rebornPayBackPer;    //重生返还的百分比
    public int deletePayBackPer;    //遣散返还的百分比
@@ -235,7 +236,7 @@
        return heroB.heroId.CompareTo(heroA.heroId);
    }
    public string selectRebornHeroGuid = "";
    public void ResetBtnClick(HeroInfo hero)
    {
        //升级、突破、觉醒
@@ -258,101 +259,17 @@
            return;
        }
        List<Item> items = new List<Item>();
        var payBack1 = CommonFunc.AddDict(GetHeroLVPayBack(hero.Quality, hero.heroLevel), GetHeroBreakPayBack(hero.Quality, hero.breakLevel));
        Dictionary<string, double> rebornParam = new Dictionary<string, double>();  //重生消耗公式参数
        //先计算有没消耗
        rebornParam.Add("heroLV", hero.heroLevel);
        int costCnt = (int)JaceCalculator.Calculate(rebornFormula, rebornParam);
        //重生等级重置的消耗,参数 heroLV武将等级,最终消耗为公式+觉醒消耗
        if (hero.awakeLevel == 0)
        {
            //计算返还比例
            var _list = payBack1.Keys.ToList();
            foreach (var key in _list)
            {
                payBack1[key] = Math.Max((long)(payBack1[key] * rebornPayBackPer / 100.0), 1);
        selectRebornHeroGuid = hero.itemHero.guid;
        UIManager.Instance.OpenWindow<HeroRebornWin>();
            }
            items = CommonFunc.ChangeToItemList(payBack1);
            if (costCnt == 0)
            {
                //无消耗显示
                ConfirmCancel.ShowItemsConfirm(items, Language.Get("herocard42"), Language.Get("herocard43"), (bool isOk) =>
                {
                    if (isOk)
                    {
                        //发包
                        SendReborn(hero);
                    }
                }, itemName: $"( {rebornPayBackPer}% )");
            }
            else
            {
                //有消耗显示
                ConfirmCancel.ShowItemsConfirm(items, Language.Get("herocard42"), Language.Get("herocard43"), (bool isOk) =>
                {
                    if (isOk)
                    {
                        if (UIHelper.GetMoneyCnt(payBackMoneyType) < costCnt)
                        {
                            ItemTipUtility.ShowMoneyTip(payBackMoneyType);
                            return;
                        }
                        //发包
                        SendReborn(hero);
                    }
                }, "", "", costCnt, payBackMoneyType, $"( {rebornPayBackPer}% )");
            }
        }
        else
        {
            if (awakeRebirthCnt >= rebornAwakeHeroMaxCount)
            {
                SysNotifyMgr.Instance.ShowTip("HeroRebornAwakeMax");
                return;
            }
            payBack1 = CommonFunc.AddDict(payBack1, GetHeroQualityAwakePayBack(hero.Quality, hero.awakeLevel));
            //计算返还比例
            var _list = payBack1.Keys.ToList();
            foreach (var key in _list)
            {
                payBack1[key] = Math.Max((long)(payBack1[key] * rebornPayBackPer / 100.0), 1);
            }
            items = CommonFunc.ChangeToItemList(payBack1);
            var info2 = Language.Get("herocard44", rebornAwakeHeroMaxCount - awakeRebirthCnt);
            var payBackMoney = HeroQualityAwakeConfig.GetQualityAwakeConfig(hero.Quality, hero.awakeLevel).RebirthCostMoney + costCnt;
            ConfirmCancel.ShowItemsConfirm(items, Language.Get("herocard42"), Language.Get("herocard43"), (bool isOk) =>
            {
                if (isOk)
                {
                    if (UIHelper.GetMoneyCnt(payBackMoneyType) < payBackMoney)
                    {
                        ItemTipUtility.ShowMoneyTip(payBackMoneyType);
                        return;
                    }
                    //发包
                    SendReborn(hero);
                }
            }, info2, "", payBackMoney, payBackMoneyType, $"( {rebornPayBackPer}% )");
        }
    }
    void SendReborn(HeroInfo hero)
    public void SendReborn(HeroInfo hero, bool islvon, bool isbreakon, bool isawakeon)
    {
        var pack = new CB239_tagCSHeroRebirth();
        pack.ItemIndex = (ushort)hero.itemHero.gridIndex;
        pack.LVReset = (byte)(islvon ? 1 : 0);
        pack.BreakReset = (byte)(isbreakon ? 1 : 0);
        pack.AwakeReset = (byte)(isawakeon ? 1 : 0);
        GameNetSystem.Instance.SendInfo(pack);
        lastFightPower = new KeyValuePair<string, long>(hero.itemHero.guid, hero.CalculateFightPower(false));
Main/System/HeroUI/HeroUIManager.cs
@@ -70,6 +70,9 @@
        rebornPayBackPer = int.Parse(config.Numerical4);
        deletePayBackPer = int.Parse(config.Numerical5);
        config = FuncConfigConfig.Get("HeroRebirth2");
        rebornBreakFormula = config.Numerical1;
        ParseGiftConfig();
        config = FuncConfigConfig.Get("HeroRedpoint");