少年修仙传客户端代码仓库
client_linchunjie
2019-03-20 41447bec568f887dbb9998f47fb15e347a602d31
3335 符印修改
1个文件已删除
1 文件已重命名
1个文件已添加
13个文件已修改
1375 ■■■■ 已修改文件
Core/NetworkPackage/DTCFile/ServerPack/HA2_Package/DTCA205_tagMCVPackClear.cs 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3BA_tagMCTrialTowerInfo.cs 60 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/GatheringSoul/VirtualPackModel.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/KnapSack/Logic/SelectBoxItemCell.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Rank/RankModel.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Rune/RuneBreakCell.cs 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Rune/RuneComposeModel.cs 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Rune/RuneComposeWin.cs 106 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Rune/RuneModel.cs 465 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Rune/RuneNewModel.cs 370 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Rune/RunePreviewCell.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Rune/RuneResolveCell.cs 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Rune/RuneResolveCell.cs.meta 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Rune/RuneResolveModel.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Rune/RuneResolveWin.cs 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/RuneTower/RunePreviewBehaviour.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/HA2_Package/DTCA205_tagMCVPackClear.cs
@@ -6,24 +6,17 @@
public class DTCA205_tagMCVPackClear : DtcBasic {
public class DTCA205_tagMCVPackClear : DtcBasic
{
    public override void Done(GameNetPackBasic vNetPack) {
    public override void Done(GameNetPackBasic vNetPack)
    {
        base.Done(vNetPack);
        HA205_tagMCVPackClear vNetData = vNetPack as HA205_tagMCVPackClear;
        if (vNetData != null) {
            switch ((PackType)vNetData.PackType) {
                case PackType.RunePack:
                    ModelCenter.Instance.GetModel<RuneModel>().OnRunePackClear(vNetData);
                    break;
                default:
                    ModelCenter.Instance.GetModel<VirtualPackModel>().OnReceiveServerPack(vNetData);
                    break;
            }
        }
        ModelCenter.Instance.GetModel<VirtualPackModel>().OnReceiveServerPack(vNetData);
    }
}
Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3BA_tagMCTrialTowerInfo.cs
@@ -1,30 +1,30 @@
using UnityEngine;
using System.Collections;
using Snxxz.UI;
// A3 BA 通知试炼之塔过关数 #tagMCTrialTowerInfo
public class DTCA3BA_tagMCTrialTowerInfo : DtcBasic
{
    public override void Done(GameNetPackBasic vNetPack)
    {
        base.Done(vNetPack);
        HA3BA_tagMCTrialTowerInfo vNetData = vNetPack as HA3BA_tagMCTrialTowerInfo;
        if (vNetData != null)
        {
            ModelCenter.Instance.GetModel<RuneModel>().OnRuneTowerRefresh(vNetData);
            ModelCenter.Instance.GetModel<RuneTowerModel>().yesterdayPassFloor = (int)vNetData.YesterDayPassLV;
        }
    }
}
using UnityEngine;
using System.Collections;
using Snxxz.UI;
// A3 BA 通知试炼之塔过关数 #tagMCTrialTowerInfo
public class DTCA3BA_tagMCTrialTowerInfo : DtcBasic
{
    public override void Done(GameNetPackBasic vNetPack)
    {
        base.Done(vNetPack);
        HA3BA_tagMCTrialTowerInfo vNetData = vNetPack as HA3BA_tagMCTrialTowerInfo;
        if (vNetData != null)
        {
            ModelCenter.Instance.GetModel<RuneNewModel>().ReceivePackage(vNetData);
            ModelCenter.Instance.GetModel<RuneTowerModel>().yesterdayPassFloor = (int)vNetData.YesterDayPassLV;
        }
    }
}
System/GatheringSoul/VirtualPackModel.cs
@@ -34,7 +34,7 @@
                var items = virtualPackItems[packType];
                foreach (var item in items)
                {
                    pool.Add(item);
                    pool.Release(item);
                }
            }
            virtualPackItems.Clear();
@@ -184,8 +184,8 @@
                    });
                    foreach (var item in items)
                    {
                        pool.Add(item);
                        list.Remove(item);
                        pool.Release(item);
                    }
                }
                if (virtualPackRefresh != null)
@@ -213,6 +213,7 @@
                    if (pool.inactivedCount > 0)
                    {
                        item = pool.Get();
                        list.Add(item);
                    }
                }
                if (item == null)
System/KnapSack/Logic/SelectBoxItemCell.cs
@@ -44,8 +44,6 @@
            switch(packType)
            {
                case PackType.RunePack:
                    haveCnt = ModelCenter.Instance.GetModel<RuneModel>().GetRuneCountById(id);
                    break;
                case PackType.GatherSoul:
                    haveCnt = ModelCenter.Instance.GetModel<VirtualPackModel>().GetItemCountById(packType,id);
                    break;
System/Rank/RankModel.cs
@@ -85,7 +85,7 @@
            {
                foreach (var item in rankDatas)
                {
                    m_RankDataPool.Add(item);
                    m_RankDataPool.Release(item);
                }
            }
            m_RankDatas.Clear();
@@ -191,7 +191,7 @@
            {
                RankData data = rankDatas[i];
                rankDatas.RemoveAt(i);
                m_RankDataPool.Add(data);
                m_RankDataPool.Release(data);
            }
            if (onRankRefresh != null)
            {
System/Rune/RuneBreakCell.cs
File was deleted
System/Rune/RuneComposeModel.cs
@@ -8,6 +8,10 @@
    [XLua.LuaCallCSharp]
    public class RuneComposeModel : Model, IPlayerLoginOk
    {
        RuneNewModel runeModel { get { return ModelCenter.Instance.GetModel<RuneNewModel>(); } }
        VirtualPackModel virtualPackModel { get { return ModelCenter.Instance.GetModel<VirtualPackModel>(); } }
        public override void Init()
        {
            presentSelectRuneQuality = 0;
@@ -15,9 +19,9 @@
            ParseConfig();
            PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefreshInfoEvent;
            runeModel.OnRefreshRuneTowerLv += OnRefreshRune;
            runeModel.OnRefreshRunePack += OnRefreshRune;
            runeModel.OnRefreshRuneHole += OnRefreshRune;
            runeModel.onRuneTowerRefresh += OnRefreshRune;
            virtualPackModel.virtualPackRefresh += VirtualPackRefresh;
            runeModel.onRuneHoleRefresh += OnRefreshRune;
            foreach (var _key in runeComposeDict.Keys)
            {
@@ -35,15 +39,15 @@
        public override void UnInit()
        {
            runeModel.onRuneTowerRefresh -= OnRefreshRune;
            runeModel.onRuneHoleRefresh -= OnRefreshRune;
            virtualPackModel.virtualPackRefresh -= VirtualPackRefresh;
        }
        public void OnPlayerLoginOk()
        {
            UpdateRedpoint();
        }
        RuneModel runeModel { get { return ModelCenter.Instance.GetModel<RuneModel>(); } }
        #region 配置
        public Dictionary<int, List<RuneComposeConfig>> runeComposeDict = new Dictionary<int, List<RuneComposeConfig>>();
@@ -96,6 +100,14 @@
            }
        }
        private void VirtualPackRefresh(PackType packType)
        {
            if (packType == PackType.RunePack)
            {
                UpdateRedpoint();
            }
        }
        private void OnRefreshRune()
        {
            UpdateRedpoint();
@@ -124,14 +136,14 @@
                for (int i = 0; i < _list.Count; i++)
                {
                    var _runeConfig = RuneConfig.Get(_list[i].TagItemID);
                    if (runeModel.RuneTowerOpenLV < _runeConfig.TowerID)
                    if (runeModel.passRuneTowerFloor < _runeConfig.TowerID)
                    {
                        continue;
                    }
                    var _runeComposeConfig = RuneComposeConfig.Get(_list[i].TagItemID);
                    RuneData _data;
                    var count1 = runeModel.GetMaxLevelRuneCnt(_runeComposeConfig.NeedItem[0], out _data);
                    var count2 = runeModel.GetMaxLevelRuneCnt(_runeComposeConfig.NeedItem[1], out _data);
                    RuneItem item;
                    var count1 = runeModel.TryGetComposeRuneCount(_runeComposeConfig.NeedItem[0], out item);
                    var count2 = runeModel.TryGetComposeRuneCount(_runeComposeConfig.NeedItem[1], out item);
                    var magicEssence = PlayerDatas.Instance.extersion.magicEssence;
                    if (count1 > 0 && count2 > 0 && magicEssence >= _runeComposeConfig.NeedMJ)
                    {
System/Rune/RuneComposeWin.cs
@@ -48,23 +48,14 @@
        [SerializeField] Button m_ComposeBtn;
        [SerializeField] RedpointBehaviour m_ComposeRedpoint;
        RuneComposeModel m_Model;
        RuneComposeModel model
        {
            get
            {
                return m_Model ?? (m_Model = ModelCenter.Instance.GetModel<RuneComposeModel>());
            }
        }
        RuneComposeModel model { get { return ModelCenter.Instance.GetModel<RuneComposeModel>(); } }
        RuneModel m_RuneModel;
        RuneModel runeModel
        {
            get
            {
                return m_RuneModel ?? (m_RuneModel = ModelCenter.Instance.GetModel<RuneModel>());
            }
        }
        RuneNewModel runeModel { get { return ModelCenter.Instance.GetModel<RuneNewModel>(); } }
        RuneResolveModel runeResolveModel { get { return ModelCenter.Instance.GetModel<RuneResolveModel>(); } }
        VirtualPackModel virtualPackModel { get { return ModelCenter.Instance.GetModel<VirtualPackModel>(); } }
        #region Built-in
        protected override void BindController()
        {
@@ -87,8 +78,8 @@
        protected override void OnPreOpen()
        {
            runeModel.OnRefreshRuneTowerLv += OnRefreshRuneTowerLv;
            runeModel.OnRefreshRunePack += RefreshRuneCompose;
            runeModel.onRuneTowerRefresh += OnRuneTowerRefresh;
            virtualPackModel.virtualPackRefresh += VirtualPackRefresh;
            PlayerDatas.Instance.playerDataRefreshEvent += OnRefreshPlayerInfo;
            DTC0721_tagMakeItemAnswer.MakeItemAnswerEvent += MakeItemAnswerEvent;
            RefreshRuneType();
@@ -101,8 +92,8 @@
        protected override void OnPreClose()
        {
            runeModel.OnRefreshRuneTowerLv -= OnRefreshRuneTowerLv;
            runeModel.OnRefreshRunePack -= RefreshRuneCompose;
            runeModel.onRuneTowerRefresh -= OnRuneTowerRefresh;
            virtualPackModel.virtualPackRefresh -= VirtualPackRefresh;
            PlayerDatas.Instance.playerDataRefreshEvent -= OnRefreshPlayerInfo;
            DTC0721_tagMakeItemAnswer.MakeItemAnswerEvent -= MakeItemAnswerEvent;
        }
@@ -111,7 +102,7 @@
        {
        }
        #endregion
        private void OnRefreshRuneTowerLv()
        private void OnRuneTowerRefresh()
        {
            scrollerController.m_Scorller.RefreshActiveCellViews();
        }
@@ -168,22 +159,22 @@
                ItemConfig _itemCfg = ItemConfig.Get(_cfg.NeedItem[0]);
                m_Rune1Img.SetSprite(_itemCfg.IconKey);
                RuneData _rune1 = null;
                var _runeCnt = runeModel.GetMaxLevelRuneCnt(_cfg.NeedItem[0], out _rune1);
                RuneItem _rune1 = null;
                var _runeCnt = runeModel.TryGetComposeRuneCount(_cfg.NeedItem[0], out _rune1);
                m_Rune1NumTxt.text = StringUtility.Contact(_runeCnt > 0 ? 
                    UIHelper.AppendColor(TextColType.White, _runeCnt.ToString()) :
                    UIHelper.AppendColor(TextColType.Red, _runeCnt.ToString()), "/", 1);
                m_Rune1NameTxt.text = StringUtility.Contact(_itemCfg.ItemName, " Lv.", _rune1 == null ? 1 : _rune1.lv);
                m_Rune1NameTxt.text = StringUtility.Contact(_itemCfg.ItemName, " Lv.", _rune1 == null ? 1 : _rune1.level);
                m_Rune1NameTxt.color = UIHelper.GetUIColor(_itemCfg.ItemColor, true);
                _itemCfg = ItemConfig.Get(_cfg.NeedItem[1]);
                m_Rune2Img.SetSprite(_itemCfg.IconKey);
                RuneData _rune2 = null;
                _runeCnt = runeModel.GetMaxLevelRuneCnt(_cfg.NeedItem[1], out _rune2);
                RuneItem _rune2 = null;
                _runeCnt = runeModel.TryGetComposeRuneCount(_cfg.NeedItem[1], out _rune2);
                m_Rune2NumTxt.text = StringUtility.Contact(_runeCnt > 0 ? 
                    UIHelper.AppendColor(TextColType.White, _runeCnt.ToString()) :
                    UIHelper.AppendColor(TextColType.Red, _runeCnt.ToString()), "/", 1);
                m_Rune2NameTxt.text = StringUtility.Contact(_itemCfg.ItemName, " Lv.", _rune2 == null ? 1 : _rune2.lv);
                m_Rune2NameTxt.text = StringUtility.Contact(_itemCfg.ItemName, " Lv.", _rune2 == null ? 1 : _rune2.level);
                m_Rune2NameTxt.color = UIHelper.GetUIColor(_itemCfg.ItemColor, true);
                _itemCfg = ItemConfig.Get(_cfg.TagItemID);
@@ -192,20 +183,20 @@
                if (_rune1 != null && _rune2 != null)
                {
                    float _exp = 0;
                    _exp += runeModel.GetRuneBreakExp(_rune1, true);
                    _exp += runeModel.GetRuneBreakExp(_rune2, true);
                    _composeLv = runeModel.GetRuneLevelByExp(_cfg.TagItemID, _exp);
                    _exp += runeResolveModel.GetRuneResolveGetSplinters(_rune1.id, _rune1.level, true);
                    _exp += runeResolveModel.GetRuneResolveGetSplinters(_rune2.id, _rune2.level, true);
                    _composeLv = runeModel.GetRuneLevelBySplinters(_cfg.TagItemID, _exp);
                }
                m_ComposeRuneNameTxt.text = StringUtility.Contact(_itemCfg.ItemName, " Lv.", _composeLv);
                RuneConfig _tagRuneModel = RuneConfig.Get(_itemCfg.ID);
                int[] _runeTypes = _tagRuneModel.AttrType;
                var _propertyCfg = PlayerPropertyConfig.Get(_runeTypes[0]);
                m_ComposeRuneProperty0.text = _propertyCfg.Name;
                m_ComposeRunePropertyValue0.text = StringUtility.Contact("+", UIHelper.ReplacePercentage(runeModel.GetRuneAttrVal(_itemCfg.ID,
                m_ComposeRunePropertyValue0.text = StringUtility.Contact("+", UIHelper.ReplacePercentage(runeModel.GetPropertyValue(_itemCfg.ID,
                    _composeLv, _runeTypes[0]), _propertyCfg.ISPercentage), _propertyCfg.ISPercentage == 1 ? "%" : string.Empty);
                _propertyCfg = PlayerPropertyConfig.Get(_runeTypes[1]);
                m_ComposeRuneProperty1.text = _propertyCfg.Name;
                m_ComposeRunePropertyValue1.text = StringUtility.Contact("+", UIHelper.ReplacePercentage(runeModel.GetRuneAttrVal(_itemCfg.ID,
                m_ComposeRunePropertyValue1.text = StringUtility.Contact("+", UIHelper.ReplacePercentage(runeModel.GetPropertyValue(_itemCfg.ID,
                    _composeLv, _runeTypes[1]), _propertyCfg.ISPercentage), _propertyCfg.ISPercentage == 1 ? "%" : string.Empty);
                m_ComposeRuneNameTxt.color = UIHelper.GetUIColor(_itemCfg.ItemColor, true);
            }
@@ -227,6 +218,15 @@
            }
            scrollerController.Restart();
        }
        private void VirtualPackRefresh(PackType packType)
        {
            if (packType == PackType.RunePack)
            {
                RefreshRuneCompose();
            }
        }
        private void OnComposeRuneClick(CellView cell)
        {
            if (model.presentSelectComposeRune == cell.index)
@@ -239,7 +239,7 @@
                return;
            }
            RuneConfig _runeCfg = RuneConfig.Get(_list[cell.index].TagItemID);
            bool _unlockTower = _runeCfg.TowerID <= runeModel.RuneTowerOpenLV;
            bool _unlockTower = _runeCfg.TowerID <= runeModel.passRuneTowerFloor;
            if (!_unlockTower)
            {
                return;
@@ -262,7 +262,7 @@
            if (_cfg != null)
            {
                var _itemPathModel = ModelCenter.Instance.GetModel<GetItemPathModel>();
                RuneConfig _runeCfg = RuneConfig.Get(_cfg.NeedItem[_index]);
                RuneTowerConfig _towerCfg = null;
                RuneTowerFloorConfig _runeTowerCfg = null;
@@ -271,36 +271,38 @@
                    _runeTowerCfg = RuneTowerFloorConfig.Get(_runeCfg.TowerID);
                    _towerCfg = RuneTowerConfig.Get(_runeTowerCfg.TowerId);
                }
                RuneData _rune = null;
                var _runeCnt = runeModel.GetMaxLevelRuneCnt(_cfg.NeedItem[_index], out _rune);
                _itemPathModel.SetRuneModel(_cfg.NeedItem[_index], _rune != null ? _rune.lv : 1, runeModel.GetRuneAttrStr(_cfg.NeedItem[_index], _rune != null ? _rune.lv : 1),
                    _runeCfg.TowerID == 0 ? Language.Get("L1062") : Language.Get("RuneItemOrigin", _towerCfg.TowerName, _runeTowerCfg.FloorName));
                RuneItem _rune = null;
                var _runeCnt = runeModel.TryGetComposeRuneCount(_cfg.NeedItem[_index], out _rune);
                var propertyDescrition = runeModel.GetRunePropertyDescription(_cfg.NeedItem[_index], _rune != null ? _rune.level : 1);
                var towerLabel = _runeCfg.TowerID == 0 ? Language.Get("L1062") :
                    Language.Get("RuneItemOrigin", _towerCfg.TowerName, _runeTowerCfg.FloorName);
                _itemPathModel.SetRuneModel(_cfg.NeedItem[_index], _rune != null ? _rune.level : 1, propertyDescrition, towerLabel);
            }
        }
        private void OnComposeBtn()
        {
            RuneComposeConfig _cfg = model.GetRuneCompose(model.presentSelectRuneQuality, model.presentSelectComposeRune);
            RuneData _rune1 = null;
            var _runeCnt = runeModel.GetMaxLevelRuneCnt(_cfg.NeedItem[0], out _rune1);
            RuneData _rune2 = null;
            _runeCnt = runeModel.GetMaxLevelRuneCnt(_cfg.NeedItem[1], out _rune2);
            RuneItem _rune1 = null;
            var _runeCnt = runeModel.TryGetComposeRuneCount(_cfg.NeedItem[0], out _rune1);
            RuneItem _rune2 = null;
            _runeCnt = runeModel.TryGetComposeRuneCount(_cfg.NeedItem[1], out _rune2);
            if (PlayerDatas.Instance.extersion.magicEssence < _cfg.NeedMJ)
            {
                return;
            }
            if (_rune1 != null && _rune2 != null)
            {
                CA578_tagCMRuneCompound _pak = new CA578_tagCMRuneCompound();
                _pak.TagItemID = (uint)_cfg.TagItemID;
                _pak.Cnt = 2;
                _pak.PackList = new byte[_pak.Cnt];
                _pak.IndexList = new byte[_pak.Cnt];
                _pak.PackList[0] = _rune1.packtype == (int)PackType.RunePack ? (byte)0 : (byte)1;
                _pak.IndexList[0] = (byte)_rune1.index;
                _pak.PackList[1] = _rune2.packtype == (int)PackType.RunePack ? (byte)0 : (byte)1;
                _pak.IndexList[1] = (byte)_rune2.index;
                GameNetSystem.Instance.SendInfo(_pak);
                CA578_tagCMRuneCompound pak = new CA578_tagCMRuneCompound();
                pak.TagItemID = (uint)_cfg.TagItemID;
                pak.Cnt = 2;
                pak.PackList = new byte[pak.Cnt];
                pak.IndexList = new byte[pak.Cnt];
                pak.PackList[0] = (byte)_rune1.placeType;
                pak.IndexList[0] = (byte)_rune1.index;
                pak.PackList[1] = (byte)_rune2.placeType;
                pak.IndexList[1] = (byte)_rune2.index;
                GameNetSystem.Instance.SendInfo(pak);
            }
        }
System/Rune/RuneModel.cs
@@ -187,78 +187,6 @@
            var config = ItemConfig.Get(_itemId);
            return config == null ? 0 : GetRuneMaxLevel(config.ItemColor);
        }
        public string GetRuneAttrStr(int id, int level)
        {
            _textBuilder.Length = 0;
            RuneConfig _tagRuneModel = RuneConfig.Get(id);
            int[] runeTypes = _tagRuneModel.AttrType;
            int i = 0;
            for (i = 0; i < runeTypes.Length; i++)
            {
                PlayerPropertyConfig playerPro = PlayerPropertyConfig.Get(runeTypes[i]);
                string _str = StringUtility.Contact(playerPro.Name, "+",
                    UIHelper.ReplacePercentage(GetRuneAttrVal(id, level, runeTypes[i]), playerPro.ISPercentage,
                    UIHelper.GetPropertyDecimalCount(playerPro.ID)),
                    playerPro.ISPercentage == 1 ? "%" : string.Empty, i == runeTypes.Length - 1 ? string.Empty : "\n");
                _textBuilder.Append(_str);
            }
            return _textBuilder.ToString();
        }
        public Dictionary<int, Dictionary<int, float>> runeAttrResultDict = new Dictionary<int, Dictionary<int, float>>();
        public int GetRuneAttrVal(int id, int level, int type)
        {
            ItemConfig _tagChinModel = ItemConfig.Get(id);
            RuneConfig _tagRuneModel = RuneConfig.Get(id);
            float runeValue = 0;
            if (_tagChinModel != null && _tagRuneModel != null)
            {
                float params1 = 0;
                Dictionary<int, float> _dict = null;
                if (runeAttrResultDict.TryGetValue(type, out _dict))
                {
                    if (_dict.ContainsKey(level))
                    {
                        params1 = _dict[level];
                    }
                }
                else
                {
                    _dict = new Dictionary<int, float>();
                    runeAttrResultDict.Add(type, _dict);
                }
                if (params1 == 0 && !_dict.ContainsKey(level))
                {
                    Equation.Instance.Clear();
                    Equation.Instance.AddKeyValue(replaceValStr, level);
                    FuncConfigConfig funcRune = FuncConfigConfig.GetRuneAttrFormula(type);
                    params1 = Equation.Instance.Eval<float>(funcRune.Numerical1);
                    _dict.Add(level, params1);
                }
                int[] runeTypes = _tagRuneModel.AttrType;
                float params2 = runeAttrDic[type][_tagChinModel.ItemColor];
                var baseValue = 0;
                if (runeBasePropretyDict.ContainsKey(type))
                {
                    var dict = runeBasePropretyDict[type];
                    if (dict.ContainsKey(_tagChinModel.ItemColor))
                    {
                        baseValue = dict[_tagChinModel.ItemColor];
                    }
                }
                if (runeTypes.Length > 1)
                {
                    float coe = runeAttrAdditionDic[type];
                    coe = coe == 0 ? 1 : coe;
                    runeValue = (params1 * params2 + baseValue) * coe;
                }
                else
                {
                    runeValue = params1 * params2 + baseValue;
                }
            }
            return Mathf.FloorToInt(runeValue);
        }
        private Dictionary<int, float> runeExpResultDict = new Dictionary<int, float>();
        public int GetRuneNeedExp(int id, int level)
        {
@@ -291,59 +219,6 @@
            return Mathf.FloorToInt(_levelUpExp);
        }
        public float GetRuneSoulBreakExp(RuneData _rune)
        {
            ItemConfig _itemCfg = ItemConfig.Get(_rune.id);
            var _treasureSoul = ModelCenter.Instance.GetModel<TreasureSoulModel>();
            var _upper = (float)_treasureSoul.GetTreasureSoulValue((int)TreasurePrivilege.RuneBreakExpAdd) / 10000;
            if (_itemCfg.Type == RUNE_CREAMTYPE)
            {
                return _itemCfg.EffectValueA1 * _upper;
            }
            else
            {
                return runeEliteAdditonDic[_itemCfg.ItemColor] * _upper;
            }
        }
        public float GetRuneBreakExp(RuneData _rune, bool _compose = false)
        {
            float _exp = 0;
            ItemConfig _itemCfg = ItemConfig.Get(_rune.id);
            var _treasureSoul = ModelCenter.Instance.GetModel<TreasureSoulModel>();
            var _upper = (float)_treasureSoul.GetTreasureSoulValue((int)TreasurePrivilege.RuneBreakExpAdd) / 10000;
            if (_itemCfg.Type == RUNE_CREAMTYPE)
            {
                return _itemCfg.EffectValueA1 + _itemCfg.EffectValueA1 * _upper;
            }
            for (int i = 1; i <= _rune.lv; i++)
            {
                if (i == 1 && !_compose)
                {
                    _exp += runeEliteAdditonDic[_itemCfg.ItemColor] + runeEliteAdditonDic[_itemCfg.ItemColor] * _upper;
                }
                else
                {
                    _exp += GetRuneNeedExp(_rune.id, i - 1);
                }
            }
            return _exp;
        }
        public int GetRuneLevelByExp(int id, float _exp)
        {
            float _totalExp = 0;
            var maxlevel = runeQualityMaxLevel != null ? runeQualityMaxLevel.Values.Last() : 0;
            for (int i = 1; i < maxlevel; i++)
            {
                _totalExp += GetRuneNeedExp(id, i);
                if (_totalExp > _exp)
                {
                    return i;
                }
            }
            return maxlevel;
        }
        #endregion
        public const int RUNE_REDPOINT_INTERVAL = 100;
        private Redpoint runeRedpoint = new Redpoint(1, 108);
@@ -504,20 +379,6 @@
                if (RuneSplinters > GetRuneNeedExp(runeData.id, runeData.lv)
                    && runeData.lv < GetRuneMaxLevelByItem(runeData.id))
                {
                    return true;
                }
            }
            return false;
        }
        public bool CanLevelUpRune(out int _hole)
        {
            _hole = 0;
            for (int i = 0; i < RUNE_HOLE_COUNT; i++)
            {
                if (CanLevelUpRune(i))
                {
                    _hole = i;
                    return true;
                }
            }
@@ -877,19 +738,6 @@
            }
        }
        public int GetRuneCountById(int _itemId)
        {
            var count = 0;
            foreach (var _rune in runePackData.Values)
            {
                if (_rune.id == _itemId)
                {
                    count += 1;
                }
            }
            return count;
        }
        /// <summary>
        ///得到所有的解锁符印Id
        /// </summary>
@@ -920,240 +768,6 @@
            return unlockDict;
        }
        public bool CanEquipRune(int _color, out int _hole)
        {
            _hole = 0;
            foreach (var _rune in runePackData.Values)
            {
                var _itemCfg = ItemConfig.Get(_rune.id);
                if (_itemCfg.Type == RUNE_CREAMTYPE)
                {
                    continue;
                }
                else
                {
                    if (_itemCfg.ItemColor >= _color)
                    {
                        if (CanEquipHoleRune(_itemCfg.ID, _itemCfg.ItemColor, out _hole))
                        {
                            return true;
                        }
                    }
                }
            }
            return false;
        }
        public bool CanEquipBetterRune(int _hole)
        {
            foreach (var rune in runePackData.Values)
            {
                if (IsBetterRune(rune, _hole))
                {
                    return true;
                }
            }
            return false;
        }
        public bool IsBetterRune(RuneData rune, int _hole)
        {
            if (rune.IsRuneCream)
            {
                return false;
            }
            var runeHole = GetHoleRune(_hole);
            if (runeHole == null)
            {
                return false;
            }
            var runeHoleConfig = RuneConfig.Get(runeHole.id);
            var itemHoleConfig = ItemConfig.Get(runeHole.id);
            var propertyType = runeHoleConfig.AttrType[0];
            if (runeHoleConfig == null)
            {
                return false;
            }
            var runeConfig = RuneConfig.Get(rune.id);
            bool same = false;
            for (int i = 0; i < runeConfig.AttrType.Length; i++)
            {
                if (runeConfig.AttrType[i] == propertyType)
                {
                    same = true;
                    break;
                }
            }
            if (!same)
            {
                return false;
            }
            bool isDoubleRuneHole = runeComposeModel.m_RuneBothPropertys.Contains(runeHole.id);
            bool isDoubleRune = runeComposeModel.m_RuneBothPropertys.Contains(rune.id);
            if (isDoubleRuneHole != isDoubleRune)
            {
                return isDoubleRune && GetCurrentDoublePropCount() < GetDoublePropLimitCount();
            }
            var itemConfig = ItemConfig.Get(rune.id);
            return itemConfig.ItemColor > itemHoleConfig.ItemColor;
        }
        public bool CanEquipHoleRune(int id, int _color, out int _hole)
        {
            _hole = 0;
            for (int i = 0; i < RUNE_HOLE_COUNT; i++)
            {
                if (!IsRuneHoleOpen(i))
                {
                    return false;
                }
                var _rune = GetHoleRune(i);
                if (runeComposeModel.m_RuneBothPropertys.Contains(id))
                {
                    if (GetDoublePropLimitCount() <= GetCurrentDoublePropCount())
                    {
                        return false;
                    }
                }
                if (_rune == null)
                {
                    if (IsSameInHoleRune(id, i))
                    {
                        continue;
                    }
                    _hole = i;
                    return true;
                }
                else
                {
                    var _itemCfg = ItemConfig.Get(_rune.id);
                    if (_itemCfg.ItemColor < _color && !IsSameInHoleRune(id, i))
                    {
                        _hole = i;
                        return true;
                    }
                }
            }
            return false;
        }
        public RuneData GetPackRune(int index)
        {
            RuneData data = null;
            runePackData.TryGetValue(index, out data);
            return data;
        }
        public List<RuneData> runePackList { get; set; }
        public void OnRuneTowerRefresh(HA3BA_tagMCTrialTowerInfo vNetData)
        {
            if (runeTowerOpenLv != vNetData.PassLV)
            {
                runeTowerOpenLv = vNetData.PassLV;
                if (OnRefreshRuneTowerLv != null)
                {
                    OnRefreshRuneTowerLv();
                }
            }
            UpdateRedpoint();
        }
        public bool IsSameInHoleRune(int id, int hole)
        {
            var _runeConfig = RuneConfig.Get(id);
            for (int i = 0; i < _runeConfig.AttrType.Length; i++)
            {
                if (IsSameRune(_runeConfig.AttrType[i], hole))
                {
                    return true;
                }
            }
            return false;
        }
        public bool IsSameRune(int type, int hole)
        {
            foreach (int key in runeHoleData.Keys)
            {
                if (key == hole)
                {
                    continue;
                }
                RuneConfig _runeCfg = RuneConfig.Get(runeHoleData[key].id);
                for (int i = 0; i < _runeCfg.AttrType.Length; i++)
                {
                    if (type == _runeCfg.AttrType[i])
                    {
                        return true;
                    }
                }
            }
            return false;
        }
        public void IsSameRune(int id, ref List<int> sameHoles)
        {
            sameHoles.Clear();
            var _runeConfig = RuneConfig.Get(id);
            if (_runeConfig == null)
            {
                return;
            }
            for (int i = 0; i < _runeConfig.AttrType.Length; i++)
            {
                var sameHole = SameRuneHole(_runeConfig.AttrType[i]);
                if (sameHole != -1)
                {
                    sameHoles.Add(sameHole);
                }
            }
        }
        public int SameRuneHole(int type)
        {
            foreach (int key in runeHoleData.Keys)
            {
                RuneConfig _runeCfg = RuneConfig.Get(runeHoleData[key].id);
                for (int i = 0; i < _runeCfg.AttrType.Length; i++)
                {
                    if (type == _runeCfg.AttrType[i])
                    {
                        return key;
                    }
                }
            }
            return -1;
        }
        public int GetOpenTowerCnt(bool includeSpecial = false)
        {
            int Cnt = 0;
            for (int i = 0; i < RUNE_HOLE_COUNT; i++)
            {
                if (IsSpeicalHole(i) && !includeSpecial)
                {
                    continue;
                }
                if (IsRuneHoleOpen(i))
                {
                    Cnt++;
                }
                else
                {
                    break;
                }
            }
            return Cnt;
        }
        public void ClearRuneData()
        {
            runePackData.Clear();
            runeHoleData.Clear();
        }
        public event Action JumpToComposeEvent;
        public void JumpToRuneCompose()
        {
@@ -1165,85 +779,6 @@
                }
            }
        }
        #region 符印分解选择品质记录
        bool specialItemColorMark = false;
        public bool IsQualityMark(int itemColor)
        {
            if (itemColor == 4)
            {
                return specialItemColorMark;
            }
            var playerId = PlayerDatas.Instance.baseData.PlayerID;
            return LocalSave.GetBool(StringUtility.Contact("RuneBreakSelect_", playerId, "_", itemColor), itemColor == 1);
        }
        public void SetQualityMark(int itemColor, bool mark)
        {
            if (itemColor == 4)
            {
                specialItemColorMark = mark;
                return;
            }
            var playerId = PlayerDatas.Instance.baseData.PlayerID;
            LocalSave.SetBool(StringUtility.Contact("RuneBreakSelect_", playerId, "_", itemColor), mark);
        }
        #endregion
        #region 符印合成
        public int GetMaxLevelRuneCnt(int _id, out RuneData _runeData)
        {
            int _Cnt = 0;
            _runeData = null;
            foreach (var _rune in runePackData.Values)
            {
                if (_rune.id == _id)
                {
                    if (_runeData == null || _rune.lv >= _runeData.lv)
                    {
                        _runeData = _rune;
                    }
                    _Cnt++;
                }
            }
            foreach (var _rune in runeHoleData.Values)
            {
                if (_rune.id == _id)
                {
                    if (_runeData == null || _rune.lv >= _runeData.lv)
                    {
                        _runeData = _rune;
                    }
                    _Cnt++;
                    break;
                }
            }
            return _Cnt;
        }
        #endregion
        #region 符印分解
        public List<RuneData> runeBreakList { get; set; }
        private Dictionary<int, bool> m_RuneBreakEnableDict = new Dictionary<int, bool>();
        public Dictionary<int, bool> runeBreakEnableDict {
            get {
                return m_RuneBreakEnableDict;
            }
        }
        private List<Transform> m_RuneBreakRects = new List<Transform>();
        public List<Transform> runeBreakRects {
            get {
                return m_RuneBreakRects;
            }
        }
        public event Action OnRefreshBreakRune;
        public void UpdateBreakRune()
        {
            if (OnRefreshBreakRune != null)
            {
                OnRefreshBreakRune();
            }
        }
        #endregion
    }
    public struct SpecialRuneHoleCondition
System/Rune/RuneNewModel.cs
@@ -10,12 +10,15 @@
        Dictionary<int, RuneItem> m_RuneHoleItems = new Dictionary<int, RuneItem>();
        Dictionary<int, PropertyCompute> m_PropertyComputeDict = new Dictionary<int, PropertyCompute>();
        Dictionary<int, RuneHoleCondition> m_RuneHoleConditions = new Dictionary<int, RuneHoleCondition>();
        Dictionary<int, RuneHoleRedpoint> m_RuneHoleRedpoints = new Dictionary<int, RuneHoleRedpoint>();
        Dictionary<int, List<int>> m_RunePropertys = new Dictionary<int, List<int>>();
        Dictionary<int, float> levelUpFormulaCostDict = new Dictionary<int, float>();
        Dictionary<int, float> levelUpQualityCostModulus;
        Dictionary<int, int> m_QualityMaxLevels;
        Dictionary<int, int> m_MultiPropertyRuneInlayDict;
        List<int> m_MultiPropertyRunes = new List<int>();
        int[] specialHoleRemindLevels = null;
        string levelUpCostFormula = string.Empty;
        float levelUpMultiPropertyModulus = 1f;
@@ -27,6 +30,9 @@
        public int passRuneTowerFloor { get; private set; }
        public bool unlockingSpecialHole { get; set; }
        public readonly Redpoint redpoint = new Redpoint(108, RUNE_REDPOINT_BASE);
        public readonly Redpoint specialHoleRedpoint = new Redpoint(RUNE_REDPOINT_BASE, redpointIndex++);
        int m_SelectHole = 0;
        public int selectHole
@@ -48,10 +54,14 @@
        public const int RUNE_TYPE = 30;
        public const int RUNE_CREAMTYPE = 31;
        public const int RUNE_HOLE_COUNT = 9;
        public const int RUNE_REDPOINT_BASE = 10801;
        public static int redpointIndex = 1080100;
        public event Action onRuneHoleRefresh;
        public event Action<int> onOpenNewHole;
        public event Action onSelectHoleRefresh;
        public event Action onRuneTowerRefresh;
        static StringBuilder sb = new StringBuilder();
@@ -61,6 +71,8 @@
        {
            ParseConfig();
            virtualPackModel.virtualPackRefresh += VirtualPackRefresh;
            FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
            PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefreshEvent;
        }
        public void OnBeforePlayerDataInitialize()
@@ -72,11 +84,15 @@
        public void OnPlayerLoginOk()
        {
            serverInited = true;
            RefreshRedpoint();
            RefreshSpecialHoleRedpoint();
        }
        public override void UnInit()
        {
            virtualPackModel.virtualPackRefresh -= VirtualPackRefresh;
            FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
            PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefreshEvent;
        }
        void ParseConfig()
@@ -123,11 +139,13 @@
            levelUpCostFormula = levelUpConfig.Numerical1;
            levelUpQualityCostModulus = ConfigParse.GetDic<int, float>(levelUpConfig.Numerical2);
            levelUpMultiPropertyModulus = float.Parse(levelUpConfig.Numerical3);
            //runeEliteAdditonDic = ConfigParse.GetDic<int, float>(levelUpConfig.Numerical4);
            {
                var funcConfig = FuncConfigConfig.Get("RuneDoubleInlayCnt");
                m_MultiPropertyRuneInlayDict = ConfigParse.GetDic<int, int>(funcConfig.Numerical1);
                funcConfig = FuncConfigConfig.Get("RuneSpecialRedLevel");
                specialHoleRemindLevels = ConfigParse.GetMultipleStr<int>(funcConfig.Numerical1);
            }
@@ -156,6 +174,11 @@
                specialHole = 8;
            }
            for (int i = 0; i < RUNE_HOLE_COUNT; i++)
            {
                m_RuneHoleRedpoints.Add(i, new RuneHoleRedpoint(RUNE_REDPOINT_BASE));
            }
        }
        public bool TryGetRuneHoleItem(int hole, out RuneItem runeItem)
@@ -171,6 +194,42 @@
        public bool TryGetRunePropertys(int id, out List<int> propertys)
        {
            return m_RunePropertys.TryGetValue(id, out propertys);
        }
        public int TryGetComposeRuneCount(int id, out RuneItem item)
        {
            var count = 0;
            item = null;
            List<int> items = null;
            if (virtualPackModel.TryGetItems(PackType.RunePack, out items))
            {
                foreach (var packIndex in items)
                {
                    RuneItem _item;
                    if (virtualPackModel.TryGetItem(PackType.RunePack, packIndex, out _item)
                        && _item.id == id)
                    {
                        if (item == null || _item.level >= item.level)
                        {
                            item = _item;
                        }
                        count++;
                    }
                }
            }
            foreach (var _item in m_RuneHoleItems.Values)
            {
                if (_item.id == id)
                {
                    if (item == null || _item.level >= item.level)
                    {
                        item = _item;
                    }
                    count++;
                    break;
                }
            }
            return count;
        }
        public int GetPropertyValue(int id, int level, int type)
@@ -268,6 +327,26 @@
            return count;
        }
        public int GetRuneLevelBySplinters(int id, float essence)
        {
            var totalEssence = 0f;
            var config = ItemConfig.Get(id);
            var maxlevel = 0;
            if (m_QualityMaxLevels.ContainsKey(config.ItemColor))
            {
                maxlevel = m_QualityMaxLevels[config.ItemColor];
            }
            for (int i = 1; i < maxlevel; i++)
            {
                totalEssence += GetLevelUpRequireRuneEssence(id, i);
                if (totalEssence > essence)
                {
                    return i;
                }
            }
            return maxlevel;
        }
        public bool IsRuneHoleOpen(int hole, uint state)
        {
            return MathUtility.GetBitValue(state, (ushort)hole);
@@ -327,6 +406,121 @@
            if (TryGetRuneHoleItem(hole, out item))
            {
                return item.IsExistSameProperty(id);
            }
            return false;
        }
        public bool IsBetterRuneWithHole(int id, int hole)
        {
            var itemConfig = ItemConfig.Get(id);
            if (itemConfig == null || itemConfig.Type == RUNE_CREAMTYPE)
            {
                return false;
            }
            RuneItem item = null;
            if (!TryGetRuneHoleItem(hole, out item))
            {
                return false;
            }
            if (!item.IsExistSameProperty(id))
            {
                return false;
            }
            var itemHoleConfig = ItemConfig.Get(item.id);
            return itemConfig.ItemColor > itemHoleConfig.ItemColor;
        }
        public bool SatisfyLevelUpHole(int hole)
        {
            if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Rune))
            {
                return false;
            }
            RuneItem item;
            if (TryGetRuneHoleItem(hole, out item))
            {
                var essence = PlayerDatas.Instance.extersion.runeEssence;
                if (!IsRuneMaxLevel(item.id, item.level)
                    && essence >= GetLevelUpRequireRuneEssence(item.id, item.level))
                {
                    return true;
                }
            }
            return false;
        }
        public bool SatisfyInlayHole(int hole)
        {
            if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Rune))
            {
                return false;
            }
            if (!IsRuneHoleOpen(hole, holeState) || m_RuneHoleItems.ContainsKey(hole))
            {
                return false;
            }
            virtualPackModel.GetItemIndexs(PackType.RunePack, ref cacheItemIndexs);
            foreach (var index in cacheItemIndexs)
            {
                RuneItem item;
                if (virtualPackModel.TryGetItem(PackType.RunePack, index, out item))
                {
                    if (item.itemType == RUNE_CREAMTYPE
                        || IsSameWithOtherRuneHole(item.id, hole))
                    {
                        continue;
                    }
                    if (IsMultiPropertyRune(item.id)
                        && GetMultiPropertyInlayCount() <= GetMultiPropertyHoleCount())
                    {
                        continue;
                    }
                    return true;
                }
            }
            return false;
        }
        public bool SatisfyInlayBetterHole(int hole)
        {
            if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Rune))
            {
                return false;
            }
            if (!IsRuneHoleOpen(hole, holeState) || !m_RuneHoleItems.ContainsKey(hole))
            {
                return false;
            }
            var runeHoleItem = m_RuneHoleItems[hole];
            var isDoubleRuneHole = IsMultiPropertyRune(runeHoleItem.id);
            var multiPropertyHoleCount = GetMultiPropertyHoleCount();
            var multiPropertyLimitCount = GetMultiPropertyInlayCount();
            virtualPackModel.GetItemIndexs(PackType.RunePack, ref cacheItemIndexs);
            foreach (var index in cacheItemIndexs)
            {
                RuneItem item;
                if (virtualPackModel.TryGetItem(PackType.RunePack, index, out item))
                {
                    if (!IsBetterRuneWithHole(item.id, hole))
                    {
                        continue;
                    }
                    var isDoubleRune = IsMultiPropertyRune(item.id);
                    if (!isDoubleRuneHole && isDoubleRune)
                    {
                        if (multiPropertyHoleCount >= multiPropertyLimitCount)
                        {
                            continue;
                        }
                    }
                    return true;
                }
            }
            return false;
        }
@@ -456,6 +650,18 @@
            {
                onRuneHoleRefresh();
            }
            RefreshRedpoint();
            RefreshSpecialHoleRedpoint();
        }
        public void ReceivePackage(HA3BA_tagMCTrialTowerInfo package)
        {
            passRuneTowerFloor = (int)package.PassLV;
            if (onRuneTowerRefresh != null)
            {
                onRuneTowerRefresh();
            }
        }
        private void VirtualPackRefresh(PackType packType)
@@ -466,9 +672,151 @@
            }
        }
        private void PlayerDataRefreshEvent(PlayerDataType dataType)
        {
            if (dataType == PlayerDataType.RuneSplinters)
            {
                RefreshRedpoint();
            }
            if (dataType == PlayerDataType.LV)
            {
                RefreshSpecialHoleRedpoint();
            }
        }
        private void OnFuncStateChangeEvent(int id)
        {
            if (id == (int)FuncOpenEnum.Rune)
            {
                RefreshRedpoint();
            }
        }
        /// <summary>
        ///1.有可操作的时候仅按优先级显示1个红点
        ///2.优先级:可镶嵌>可替换>可升级
        ///3.同时有可镶嵌,可替换,可升级的符印孔时,默认只显示1个红点在镶嵌孔上
        ///4.镶嵌:同时存在2个或以上的孔可镶嵌时,优先显示在孔位低的孔上,当孔上镶嵌了符印后,红点在下一个可镶嵌孔位置上显示,直至没有新符印可镶嵌,才继续判断更好品质符印的替换逻辑
        ///5.替换:同上,有可替换更好品质的符印时,显示红点,同时多个时,从孔位低的开始显示,直到没有可替换的孔,再判断符印可升级的逻辑
        ///6.升级:仅一个符印满足升级条件时,红点在该孔上;同时存在多个符印孔可升级时,红点显示在符印等级最低的孔上;符印等级相同时,红点显示在消耗少的孔上;升级需要的精华相同时,按孔位低的优先显示红点
        ///7.右下角操作按钮:可镶嵌时镶嵌按钮红点显示;替换和升级同时满足时,仅替换按钮显示红点;无镶嵌和替换时,升级按钮红点显示
        ///8.选中有红点的符印孔时,符印孔上的红点隐藏不显示
        /// </summary>
        List<int> cacheItemIndexs = new List<int>();
        List<int> levelUpSorts = new List<int>();
        void RefreshRedpoint()
        {
            var levelUpHole = 100;
            var replaceHole = 100;
            if (FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Rune))
            {
                replaceHole = ExistEmptyHoleSatisfyInlay();
                if (replaceHole != 100)
                {
                    RefreshRedpoint(replaceHole, levelUpHole);
                    return;
                }
                for (int i = 0; i < RUNE_HOLE_COUNT; i++)
                {
                    if (SatisfyInlayBetterHole(i))
                    {
                        replaceHole = i;
                        break;
                    }
                }
                if (replaceHole != 100)
                {
                    RefreshRedpoint(replaceHole, levelUpHole);
                    return;
                }
                for (int i = 0; i < RUNE_HOLE_COUNT; i++)
                {
                    if (SatisfyLevelUpHole(i))
                    {
                        levelUpSorts.Add(i);
                    }
                }
                if (levelUpSorts.Count > 0)
                {
                    levelUpSorts.Sort(CompareLevelUp);
                    levelUpHole = levelUpSorts[0];
                }
            }
            RefreshRedpoint(replaceHole, levelUpHole);
        }
        void RefreshRedpoint(int replaceHole, int levelUpHole)
        {
            for (int i = 0; i < RUNE_HOLE_COUNT; i++)
            {
                m_RuneHoleRedpoints[i].SetRedpoint(levelUpHole == i, replaceHole == i);
            }
        }
        int ExistEmptyHoleSatisfyInlay()
        {
            for (int i = 0; i < RUNE_HOLE_COUNT; i++)
            {
                if (SatisfyInlayHole(i))
                {
                    return i;
                }
            }
            return 100;
        }
        int CompareLevelUp(int lhs, int rhs)
        {
            RuneItem lhsItem;
            RuneItem rhsItem;
            if (TryGetRuneHoleItem(lhs, out lhsItem)
                && TryGetRuneHoleItem(rhs, out rhsItem))
            {
                if (lhsItem.level != rhsItem.level)
                {
                    return lhsItem.level.CompareTo(rhsItem.level);
                }
                var _cost_x = GetLevelUpRequireRuneEssence(lhsItem.id, lhsItem.level);
                var _cost_y = GetLevelUpRequireRuneEssence(rhsItem.id, rhsItem.level);
                if (_cost_x != _cost_y)
                {
                    return _cost_x.CompareTo(_cost_y);
                }
            }
            return lhs.CompareTo(rhs);
        }
        public void SetDayRemind()
        {
            if (specialHoleRedpoint.state == RedPointState.Simple)
            {
                DayRemind.Instance.SetDayRemind(DayRemind.RUNE_SPECIAL_HOLE, true);
                RefreshSpecialHoleRedpoint();
            }
        }
        private void RefreshSpecialHoleRedpoint()
        {
            var requireRemind = false;
            if (FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Rune))
            {
                if (!DayRemind.Instance.GetDayRemind(DayRemind.RUNE_SPECIAL_HOLE))
                {
                    RuneHoleCondition condition;
                    if (IsRuneHoleOpen(specialHole, holeState)
                        && TryGetRuneHoleCondition(specialHole, out condition))
                    {
                        if (PlayerDatas.Instance.baseData.LV >= condition.playerLevel
                        && PlayerDatas.Instance.baseData.LV >= specialHoleRemindLevels[0]
                        && PlayerDatas.Instance.baseData.LV < specialHoleRemindLevels[1])
                        {
                            requireRemind = true;
                        }
                    }
                }
            }
            specialHoleRedpoint.state = requireRemind ? RedPointState.Simple : RedPointState.None;
        }
        public class PropertyCompute
@@ -549,6 +897,26 @@
                }
            }
        }
        public class RuneHoleRedpoint
        {
            public readonly Redpoint redpoint;
            public readonly Redpoint levelUpRedpoint;
            public readonly Redpoint replaceRedpoint;
            public RuneHoleRedpoint(int baseId)
            {
                redpoint = new Redpoint(baseId, RuneNewModel.redpointIndex++);
                levelUpRedpoint = new Redpoint(redpoint.id, RuneNewModel.redpointIndex++);
                replaceRedpoint = new Redpoint(redpoint.id, RuneNewModel.redpointIndex++);
            }
            public void SetRedpoint(bool levelUp, bool replace)
            {
                levelUpRedpoint.state = levelUp ? RedPointState.Simple : RedPointState.None;
                replaceRedpoint.state = replace ? RedPointState.Simple : RedPointState.None;
            }
        }
    }
    public class RuneItem : VirtualPackItem
System/Rune/RunePreviewCell.cs
@@ -28,7 +28,7 @@
            [SerializeField] Button m_RuneBtn;
            [SerializeField] RectTransform m_Rune;
            RuneModel model { get { return ModelCenter.Instance.GetModel<RuneModel>(); } }
            RuneNewModel model { get { return ModelCenter.Instance.GetModel<RuneNewModel>(); } }
            public void Display(int _id)
            {
@@ -62,7 +62,7 @@
                    _runeTowerCfg = RuneTowerFloorConfig.Get(_runeCfg.TowerID);
                    _towerCfg = RuneTowerConfig.Get(_runeTowerCfg.TowerId);
                }
                _itemPathModel.SetRuneModel(itemCfg.ID, 1, model.GetRuneAttrStr(itemCfg.ID, 1),
                _itemPathModel.SetRuneModel(itemCfg.ID, 1, model.GetRunePropertyDescription(itemCfg.ID, 1),
                    _runeCfg.TowerID == 0 ? Language.Get("L1062") : Language.Get("RuneItemOrigin", _towerCfg.TowerName, _runeTowerCfg.FloorName));
            }
        }
System/Rune/RuneResolveCell.cs
New file
@@ -0,0 +1,122 @@
using Snxxz.UI;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;
namespace Snxxz.UI
{
    public class RuneResolveCell : CellView
    {
        [SerializeField] RuneResolveItem[] m_ResolveItems;
        RuneResolveModel runeResolveModel { get { return ModelCenter.Instance.GetModel<RuneResolveModel>(); } }
        List<int> itemIndexs { get { return runeResolveModel.itemIndexs; } }
        public void Display(int line)
        {
            for (int i = 0; i < m_ResolveItems.Length; i++)
            {
                var index = line * m_ResolveItems.Length + i;
                m_ResolveItems[i].SetActive(index < itemIndexs.Count);
                if (index < itemIndexs.Count)
                {
                    m_ResolveItems[i].Display(line, index);
                }
            }
        }
    }
    [Serializable]
    public class RuneResolveItem
    {
        [SerializeField] Transform m_Container;
        [SerializeField] Image m_Icon;
        [SerializeField] Text m_RuneName;
        [SerializeField] Text m_Property;
        [SerializeField] Transform m_ContainerSelect;
        [SerializeField] Button m_Select;
        RuneNewModel model { get { return ModelCenter.Instance.GetModel<RuneNewModel>(); } }
        RuneResolveModel runeResolveModel { get { return ModelCenter.Instance.GetModel<RuneResolveModel>(); } }
        VirtualPackModel virtualPackModel { get { return ModelCenter.Instance.GetModel<VirtualPackModel>(); } }
        List<Transform> resolveObjs { get { return runeResolveModel.resolveObjs; } }
        List<int> itemIndexs { get { return runeResolveModel.itemIndexs; } }
        Dictionary<int, bool> resolveSigns { get { return runeResolveModel.resolveSigns; } }
        public void Display(int line, int index)
        {
            if (index < itemIndexs.Count)
            {
                var packIndex = itemIndexs[index];
                RuneItem item;
                if (!virtualPackModel.TryGetItem(PackType.RunePack, packIndex, out item))
                {
                    return;
                }
                m_Select.SetListener(() =>
                {
                    OnSelect(line, index);
                });
                var config = ItemConfig.Get(item.id);
                if (item.itemType == RuneModel.RUNE_TYPE)
                {
                    m_RuneName.text = StringUtility.Contact(config.ItemName, " lv.", item.level);
                    m_Property.text = model.GetRunePropertyDescription(item.id, item.level);
                }
                else if (item.itemType == RuneModel.RUNE_CREAMTYPE)
                {
                    m_RuneName.text = config.ItemName;
                    m_Property.text = Language.Get("L1079", config.EffectValueA1);
                }
                m_RuneName.color = UIHelper.GetUIColor(config.ItemColor, true);
                m_Icon.SetSprite(config.IconKey);
                bool selected = resolveSigns.ContainsKey(index) && resolveSigns[index];
                m_ContainerSelect.gameObject.SetActive(selected);
                if (selected)
                {
                    if (!resolveObjs.Contains(m_Container))
                    {
                        resolveObjs.Add(m_Container);
                    }
                }
                else
                {
                    if (resolveObjs.Contains(m_Container))
                    {
                        resolveObjs.Remove(m_Container);
                    }
                }
            }
        }
        private void OnSelect(int line, int index)
        {
            if (resolveSigns.ContainsKey(index))
            {
                resolveSigns[index] = !resolveSigns[index];
            }
            runeResolveModel.RefreshResolveSelect(line);
        }
        public void SetActive(bool active)
        {
            m_Container.gameObject.SetActive(active);
            if (!active && resolveObjs.Contains(m_Container))
            {
                resolveObjs.Remove(m_Container);
            }
        }
    }
}
System/Rune/RuneResolveCell.cs.meta
File was renamed from System/Rune/RuneBreakCell.cs.meta
@@ -1,12 +1,12 @@
fileFormatVersion: 2
guid: 03abe2a6e856101419eddf66c4ac3e5f
timeCreated: 1515063903
licenseType: Free
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
fileFormatVersion: 2
guid: 03abe2a6e856101419eddf66c4ac3e5f
timeCreated: 1515063903
licenseType: Free
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
System/Rune/RuneResolveModel.cs
@@ -8,12 +8,22 @@
    {
        Dictionary<int, float> m_RuneBaseResolveSplinters;
        public List<ushort> resolveItems = new List<ushort>();
        public List<Transform> resolveObjs = new List<Transform>();
        public List<int> itemIndexs = new List<int>();
        public Dictionary<int, bool> resolveSigns = new Dictionary<int, bool>();
        bool specialItemColorSign = false;
        public readonly Redpoint redpoint = new Redpoint(108, 10802);
        public event Action<int> onResolveSelect;
        RuneNewModel runeModel { get { return ModelCenter.Instance.GetModel<RuneNewModel>(); } }
        public override void Init()
        {
            ParseConfig();
            StageLoad.Instance.onStageLoadFinish += OnStageLoadFinish;
        }
@@ -113,6 +123,14 @@
            var playerId = PlayerDatas.Instance.baseData.PlayerID;
            LocalSave.SetBool(StringUtility.Contact("RuneBreakSelect_", playerId, "_", itemColor), mark);
        }
        public void RefreshResolveSelect(int line)
        {
            if (onResolveSelect != null)
            {
                onResolveSelect(line);
            }
        }
    }
}
System/Rune/RuneResolveWin.cs
@@ -25,10 +25,10 @@
        [SerializeField] RectTransform m_ContainerRuneSoul;
        [SerializeField] Text m_RuneSoulAdd;
        List<ushort> resolveItems = new List<ushort>();
        List<Transform> resolveObjs = new List<Transform>();
        List<int> itemIndexs = new List<int>();
        Dictionary<int, bool> resolveSigns = new Dictionary<int, bool>();
        List<ushort> resolveItems { get { return runeResolveModel.resolveItems; } }
        List<Transform> resolveObjs { get { return runeResolveModel.resolveObjs; } }
        List<int> itemIndexs { get { return runeResolveModel.itemIndexs; } }
        Dictionary<int, bool> resolveSigns { get { return runeResolveModel.resolveSigns; } }
        bool doResolveItem = false;
@@ -57,12 +57,15 @@
            }
            m_JumpBtn0.onClick.AddListener(OnJumpRuneTower);
            m_JumpBtn1.onClick.AddListener(OnJumpRuneTower);
            m_Controller.OnRefreshCell += OnRefreshCell;
        }
        protected override void OnPreOpen()
        {
            virtualPackModel.virtualPackRefresh += VirtualPackRefresh;
            PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefreshInfoEvent;
            runeResolveModel.onResolveSelect += OnResolveSelect;
            doResolveItem = false;
@@ -81,6 +84,7 @@
            doResolveItem = false;
            virtualPackModel.virtualPackRefresh -= VirtualPackRefresh;
            PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefreshInfoEvent;
            runeResolveModel.onResolveSelect -= OnResolveSelect;
            StopAllCoroutines();
        }
@@ -104,7 +108,8 @@
            resolveItems.Clear();
            foreach (var key in resolveSigns.Keys)
            {
                if (key < itemIndexs.Count)
                if (resolveSigns[key]
                    && key < itemIndexs.Count)
                {
                    var index = itemIndexs[key];
                    RuneItem item;
@@ -178,6 +183,7 @@
                {
                    if (resolveObjs[i] != null)
                    {
                        resolveObjs[i].gameObject.SetActive(false);
                        var _uieffect = EffectMgr.Instance.PlayUIEffect(1007, 2500, resolveObjs[i].parent, false);
                        _time = _uieffect != null ? _uieffect.duration : 0.0f;
                        _uieffect.target.transform.localPosition = resolveObjs[i].localPosition;
@@ -236,7 +242,7 @@
        {
            m_Controller.Refresh();
            virtualPackModel.GetItemIndexs(PackType.RunePack, ref itemIndexs);
            virtualPackModel.GetItemIndexs(PackType.RunePack, ref runeResolveModel.itemIndexs);
            itemIndexs.Sort(Compare);
            int _line = Mathf.CeilToInt((float)itemIndexs.Count / 4);
            for (int i = 0; i < _line; i++)
@@ -285,6 +291,12 @@
            m_RuneSoulAdd.text = Language.Get("RuneSoul", UIHelper.ReplaceLargeNum((int)_soulCnt));
        }
        private void OnRefreshCell(ScrollerDataType type, CellView cell)
        {
            var resolveCell = cell as RuneResolveCell;
            resolveCell.Display(cell.index);
        }
        private void OnJumpRuneTower()
        {
            WindowJumpMgr.Instance.WindowJumpTo(JumpUIType.RuneTower);
@@ -299,6 +311,12 @@
            }
        }
        private void OnResolveSelect(int line)
        {
            m_Controller.RefreshSingleCellView(line);
            RefreshResolveGetItems();
        }
        void HandleAchievement()
        {
            if (AchievementGoto.achievementType == AchievementGoto.RuneResolve)
System/RuneTower/RunePreviewBehaviour.cs
@@ -48,8 +48,8 @@
                return;
            }
            var runeModel = ModelCenter.Instance.GetModel<RuneModel>();
            var propertyValue = runeModel.GetRuneAttrStr(runeId, 1);
            var runeModel = ModelCenter.Instance.GetModel<RuneNewModel>();
            var propertyValue = runeModel.GetRunePropertyDescription(runeId, 1);
            var model = ModelCenter.Instance.GetModel<GetItemPathModel>();
            model.SetRuneModel(runeId, 1, propertyValue, Language.Get("RuneItemOrigin", runeTowerConfig.TowerName, towerFloorConfig.FloorName));