using System.Collections;  
 | 
using System.Collections.Generic;  
 | 
using UnityEngine;  
 | 
using System;  
 | 
  
 | 
  
 | 
namespace Snxxz.UI  
 | 
{  
 | 
      
 | 
    public class BossHomeModel : Model  
 | 
    {  
 | 
        public const int BOSSHOME_MAPID = 31270;  
 | 
        public const int BOSSHOME_REDPOINT = 76002;  
 | 
  
 | 
        int m_SelectedFloor = 0;  
 | 
        public int selectedFloor {  
 | 
            get {  
 | 
                return this.m_SelectedFloor;  
 | 
            }  
 | 
            set {  
 | 
                if (this.m_SelectedFloor != value)  
 | 
                {  
 | 
                    this.m_SelectedFloor = value;  
 | 
                    if (bossHomeFloorSelectedEvent != null)  
 | 
                    {  
 | 
                        bossHomeFloorSelectedEvent(this.m_SelectedFloor);  
 | 
                    }  
 | 
                }  
 | 
            }  
 | 
        }  
 | 
  
 | 
        int m_SelectedBoss = 0;  
 | 
        public int selectedBoss {  
 | 
            get {  
 | 
                return this.m_SelectedBoss;  
 | 
            }  
 | 
            set {  
 | 
                if (this.m_SelectedBoss != value)  
 | 
                {  
 | 
                    this.m_SelectedBoss = value;  
 | 
                    if (bossSelectedEvent != null)  
 | 
                    {  
 | 
                        bossSelectedEvent(value);  
 | 
                    }  
 | 
                }  
 | 
            }  
 | 
        }  
 | 
  
 | 
        int m_WearyValue = 0;  
 | 
        public int wearyValue {  
 | 
            get { return m_WearyValue; }  
 | 
            set {  
 | 
                m_WearyValue = value;  
 | 
                UpdateRedpoint();  
 | 
                if (bossWearyValueChangeEvent != null)  
 | 
                {  
 | 
                    bossWearyValueChangeEvent();  
 | 
                }  
 | 
            }  
 | 
        }  
 | 
  
 | 
        int m_BoughtTimes = 0;  
 | 
        public int boughtTimes {  
 | 
            get { return m_BoughtTimes; }  
 | 
            set {  
 | 
                m_BoughtTimes = value;  
 | 
                UpdateRedpoint();  
 | 
                if (boughtTimeChangeEvent != null)  
 | 
                {  
 | 
                    boughtTimeChangeEvent();  
 | 
                }  
 | 
            }  
 | 
        }  
 | 
  
 | 
        public int remindTimes {  
 | 
            get {  
 | 
                var wearyValueLimit = vipModel.GetVipPrivilegeCnt(VipPrivilegeType.BossHomeAwardLimit);  
 | 
                return wearyValueLimit + boughtTimes - wearyValue;  
 | 
            }  
 | 
        }  
 | 
  
 | 
        public event Action<int> bossHomeFloorSelectedEvent;  
 | 
        public event Action<int> bossSelectedEvent;  
 | 
        public event Action bossWearyValueChangeEvent;  
 | 
        public event Action boughtTimeChangeEvent;  
 | 
  
 | 
        public Redpoint bossHomeRedpoint = new Redpoint(FindPreciousModel.FINDPRECIOUS_REDPOINTID, BOSSHOME_REDPOINT);  
 | 
        Dictionary<int, BossHomeData> bossHomes = new Dictionary<int, BossHomeData>();  
 | 
        Dictionary<int, int> vipLackFloorCost = new Dictionary<int, int>();  
 | 
        List<int> sortedBosses = new List<int>();  
 | 
        VipModel vipModel { get { return ModelCenter.Instance.GetModel<VipModel>(); } }  
 | 
        FindPreciousModel findPreciousModel { get { return ModelCenter.Instance.GetModel<FindPreciousModel>(); } }  
 | 
  
 | 
        public override void Init()  
 | 
        {  
 | 
            ParseConfig();  
 | 
            PlayerDatas.Instance.playerDataRefreshEvent += OnPlayerDataChange;  
 | 
            FuncOpen.Instance.OnFuncStateChangeEvent += OnFunctionOpenChange;  
 | 
        }  
 | 
  
 | 
        public override void UnInit()  
 | 
        {  
 | 
            PlayerDatas.Instance.playerDataRefreshEvent -= OnPlayerDataChange;  
 | 
            FuncOpen.Instance.OnFuncStateChangeEvent -= OnFunctionOpenChange;  
 | 
        }  
 | 
  
 | 
        public bool TryGetBossHomeData(int _layer, out BossHomeData _data)  
 | 
        {  
 | 
            return bossHomes.TryGetValue(_layer, out _data);  
 | 
        }  
 | 
  
 | 
        public int GetRecommendFloor()  
 | 
        {  
 | 
            var vipLevel = PlayerDatas.Instance.baseData.VIPLv;  
 | 
            var vipNeedFloor1 = GetFloorVipRequirement(1);  
 | 
            if (vipLevel < vipNeedFloor1)  
 | 
            {  
 | 
                return 1;  
 | 
            }  
 | 
  
 | 
            if (PlayerDatas.Instance.baseData.MapID == BOSSHOME_MAPID)  
 | 
                return PlayerDatas.Instance.baseData.FBID + 1;  
 | 
  
 | 
  
 | 
            for (int i = sortedBosses.Count - 1; i >= 0; i--)  
 | 
            {  
 | 
                var bossId = sortedBosses[i];  
 | 
                var bossHomeConfig = BossHomeConfig.Get(bossId);  
 | 
                if (!findPreciousModel.IsBossUnlock(bossId))  
 | 
                    continue;  
 | 
  
 | 
                if (vipLevel < GetFloorVipRequirement(bossHomeConfig.FloorNum))  
 | 
                    continue;  
 | 
  
 | 
                if (NPCConfig.Get(bossId).NPCLV > PlayerDatas.Instance.baseData.LV)  
 | 
                    continue;  
 | 
  
 | 
                return bossHomeConfig.FloorNum;  
 | 
            }  
 | 
  
 | 
            return 1;  
 | 
        }  
 | 
  
 | 
        public int GetFloorVipRequirement(int _floor)  
 | 
        {  
 | 
            return -1;  
 | 
            //var vipFloors = VipPrivilegeConfig.GetVipPrivilegeDic(VipPrivilegeType.BossHome);  
 | 
            //foreach (var key in vipFloors.Keys)  
 | 
            //{  
 | 
            //    if (vipFloors[key] == _floor)  
 | 
            //    {  
 | 
            //        return key;  
 | 
            //    }  
 | 
            //}  
 | 
  
 | 
            //return 16;  
 | 
        }  
 | 
  
 | 
        public int GetVipLackCost(int _floor)  
 | 
        {  
 | 
            if (vipLackFloorCost.ContainsKey(_floor))  
 | 
            {  
 | 
                return vipLackFloorCost[_floor];  
 | 
            }  
 | 
            else  
 | 
            {  
 | 
                return 0;  
 | 
            }  
 | 
        }  
 | 
  
 | 
        private void OnPlayerDataChange(PlayerDataType _type)  
 | 
        {  
 | 
            if (_type == PlayerDataType.VIPLv)  
 | 
            {  
 | 
                UpdateRedpoint();  
 | 
            }  
 | 
        }  
 | 
  
 | 
        private void OnFunctionOpenChange(int id)  
 | 
        {  
 | 
            if (id == 23)  
 | 
            {  
 | 
                UpdateRedpoint();  
 | 
            }  
 | 
        }  
 | 
  
 | 
        private void UpdateRedpoint()  
 | 
        {  
 | 
            if (FuncOpen.Instance.IsFuncOpen(23))  
 | 
            {  
 | 
                var count = remindTimes;  
 | 
                bossHomeRedpoint.count = count;  
 | 
                bossHomeRedpoint.state = count > 0 ? RedPointState.Quantity : RedPointState.None;  
 | 
            }  
 | 
            else  
 | 
            {  
 | 
                bossHomeRedpoint.count = 0;  
 | 
                bossHomeRedpoint.state = RedPointState.None;  
 | 
            }  
 | 
        }  
 | 
  
 | 
        private void ParseConfig()  
 | 
        {  
 | 
            var bossHomeConfigs = BossHomeConfig.GetValues();  
 | 
            foreach (var config in bossHomeConfigs)  
 | 
            {  
 | 
                BossHomeData bossHomeData;  
 | 
                if (bossHomes.ContainsKey(config.FloorNum))  
 | 
                {  
 | 
                    bossHomeData = bossHomes[config.FloorNum];  
 | 
                }  
 | 
                else  
 | 
                {  
 | 
                    bossHomeData = bossHomes[config.FloorNum] = new BossHomeData(config.FloorNum);  
 | 
                }  
 | 
  
 | 
                bossHomeData.bossIds.Add(config.NPCID);  
 | 
                if (config.MonsterType == 2)  
 | 
                {  
 | 
                    sortedBosses.Add(config.NPCID);  
 | 
                }  
 | 
            }  
 | 
  
 | 
            sortedBosses.Sort((int a, int b) =>  
 | 
            {  
 | 
                var npcConfigA = NPCConfig.Get(a);  
 | 
                var npcConfigB = NPCConfig.Get(b);  
 | 
                if (npcConfigA.NPCLV == npcConfigB.NPCLV)  
 | 
                {  
 | 
                    var bossHomeConfigA = BossHomeConfig.Get(a);  
 | 
                    var bossHomeConfigB = BossHomeConfig.Get(b);  
 | 
  
 | 
                    return bossHomeConfigA.FloorNum > bossHomeConfigB.FloorNum ? -1 : 1;  
 | 
                }  
 | 
                else  
 | 
                {  
 | 
                    return npcConfigA.NPCLV < npcConfigB.NPCLV ? -1 : 1;  
 | 
                }  
 | 
            });  
 | 
  
 | 
            foreach (var bossHomeData in bossHomes.Values)  
 | 
            {  
 | 
                bossHomeData.bossIds.Sort(  
 | 
                    (int a, int b) =>  
 | 
                    {  
 | 
                        var bossHomeConfigA = BossHomeConfig.Get(a);  
 | 
                        var bossHomeConfigB = BossHomeConfig.Get(b);  
 | 
                        if (bossHomeConfigA.MonsterType != bossHomeConfigB.MonsterType)  
 | 
                        {  
 | 
                            return bossHomeConfigA.MonsterType < bossHomeConfigB.MonsterType ? -1 : 1;  
 | 
                        }  
 | 
  
 | 
                        return FindPreciousModel.BossCompare(a, b);  
 | 
                    });  
 | 
            }  
 | 
  
 | 
            var configString = FuncConfigConfig.Get("BossHomeCost").Numerical1;  
 | 
            var keyValues = configString.Split('|');  
 | 
            for (int i = 0; i < keyValues.Length; i++)  
 | 
            {  
 | 
                var stringArray = keyValues[i].Split('_');  
 | 
                var floor = int.Parse(stringArray[0]);  
 | 
                var cost = int.Parse(stringArray[1]);  
 | 
                vipLackFloorCost[floor] = cost;  
 | 
            }  
 | 
  
 | 
        }  
 | 
  
 | 
        //public void OnMapInitOk()  
 | 
        //{  
 | 
        //    var dataMapId = MapUtility.GetDataMapId(PlayerDatas.Instance.baseData.MapID);  
 | 
        //    if (dataMapId == BOSSHOME_MAPID)  
 | 
        //    {  
 | 
        //        MapTransferUtility.Instance.MoveToNPC(selectedBoss);  
 | 
        //    }  
 | 
        //}  
 | 
    }  
 | 
  
 | 
    public class BossHomeData  
 | 
    {  
 | 
        public int id { get; private set; }  
 | 
        public List<int> bossIds = new List<int>();  
 | 
  
 | 
        FindPreciousModel findPreciousModel { get { return ModelCenter.Instance.GetModel<FindPreciousModel>(); } }  
 | 
  
 | 
        public BossHomeData(int _id)  
 | 
        {  
 | 
            this.id = _id;  
 | 
        }  
 | 
  
 | 
        public List<int> GetShowBosses()  
 | 
        {  
 | 
            var bosses = new List<int>();  
 | 
            var lockedCount = 0;  
 | 
            for (var i = 0; i < bossIds.Count; i++)  
 | 
            {  
 | 
                var bossId = bossIds[i];  
 | 
                var bossHomeConfig = BossHomeConfig.Get(bossId);  
 | 
                if (bossHomeConfig.MonsterType == 1)  
 | 
                {  
 | 
                    bosses.Add(bossId);  
 | 
                }  
 | 
                else  
 | 
                {  
 | 
                    if (findPreciousModel.IsBossUnlock(bossId))  
 | 
                    {  
 | 
                        bosses.Add(bossId);  
 | 
                    }  
 | 
                    else  
 | 
                    {  
 | 
                        if (lockedCount < FindPreciousModel.ShowLockBossCnt)  
 | 
                        {  
 | 
                            bosses.Add(bossId);  
 | 
                            lockedCount++;  
 | 
                        }  
 | 
                    }  
 | 
                }  
 | 
            }  
 | 
  
 | 
            if (bosses.Count == 0)  
 | 
            {  
 | 
                bosses.Add(bossIds[0]);  
 | 
            }  
 | 
  
 | 
            return bosses;  
 | 
        }  
 | 
  
 | 
        public int GetRecommendNpc()  
 | 
        {  
 | 
            for (var i = bossIds.Count - 1; i >= 0; i--)  
 | 
            {  
 | 
                var bossId = bossIds[i];  
 | 
                var bossHomeConfig = BossHomeConfig.Get(bossId);  
 | 
                if (bossHomeConfig.MonsterType == 2  
 | 
                    && findPreciousModel.IsBossUnlock(bossId)  
 | 
                    && findPreciousModel.IsPlayerLevelLargerOrBiggerThanBoss(bossId))  
 | 
                {  
 | 
                    return bossIds[i];  
 | 
                }  
 | 
            }  
 | 
  
 | 
            return bossIds[0];  
 | 
        }  
 | 
    }  
 | 
  
 | 
}  
 |