//--------------------------------------------------------  
 | 
//    [Author]:           第二世界  
 | 
//    [  Date ]:           Tuesday, October 31, 2017  
 | 
//--------------------------------------------------------  
 | 
  
 | 
using System;  
 | 
using System.Collections;  
 | 
using System.Collections.Generic;  
 | 
using UnityEngine;  
 | 
using UnityEngine.UI;  
 | 
  
 | 
  
 | 
namespace vnxbqy.UI  
 | 
{  
 | 
  
 | 
    public class BossHomeWin : Window  
 | 
    {  
 | 
        [SerializeField] CyclicScroll m_Bosses;  
 | 
        [SerializeField] Transform m_ContainerMonster;  
 | 
        [SerializeField] Text m_MonsterLevel;  
 | 
        [SerializeField] RawImage m_MonsterPortrait;  
 | 
        [SerializeField] BossIntroduceBehaviour m_BossIntroduce;  
 | 
        [SerializeField] BossHomeFloorGroup m_FloorGroup;  
 | 
        [SerializeField] Text m_Vip;  
 | 
        [SerializeField] Text m_VipLackTip;  
 | 
        [SerializeField] Button m_Goto;  
 | 
        [SerializeField] Button m_KillRecord;  
 | 
        [SerializeField] Transform m_SurpassLevel;  
 | 
        [SerializeField] RectTransform m_NoDamageTip;  
 | 
        [SerializeField] ToggleButton m_Subscribe;  
 | 
        [SerializeField] RectTransform m_WearyContainer;  
 | 
        [SerializeField] TextEx m_WearyValue;  
 | 
  
 | 
        BossHomeModel model { get { return ModelCenter.Instance.GetModel<BossHomeModel>(); } }  
 | 
        FindPreciousModel findPreciousModel { get { return ModelCenter.Instance.GetModel<FindPreciousModel>(); } }  
 | 
        DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel<DungeonModel>(); } }  
 | 
        VipModel vipModel { get { return ModelCenter.Instance.GetModel<VipModel>(); } }  
 | 
  
 | 
        #region Built-in  
 | 
        protected override void BindController()  
 | 
        {  
 | 
        }  
 | 
  
 | 
        protected override void AddListeners()  
 | 
        {  
 | 
            m_Goto.AddListener(GotoKillBoss);  
 | 
            m_KillRecord.AddListener(ShowKillRecords);  
 | 
            m_Subscribe.AddListener(SwitchSubscribeBoss);  
 | 
        }  
 | 
  
 | 
        protected override void OnPreOpen()  
 | 
        {  
 | 
            model.selectedFloor = model.GetRecommendFloor();  
 | 
            m_FloorGroup.Init();  
 | 
            m_Vip.text = StringUtility.Contact("V", model.GetFloorVipRequirement(model.selectedFloor));  
 | 
  
 | 
            DisplayRemindTimes();  
 | 
        }  
 | 
  
 | 
        protected override void OnAfterOpen()  
 | 
        {  
 | 
            model.bossSelectedEvent += OnBossSelected;  
 | 
            model.bossHomeFloorSelectedEvent += OnFloorSelected;  
 | 
            model.boughtTimeChangeEvent += DisplayRemindTimes;  
 | 
            findPreciousModel.bossSubscribeChangeEvent += OnSubscribeBoss;  
 | 
        }  
 | 
  
 | 
        protected override void OnPreClose()  
 | 
        {  
 | 
            StopAllCoroutines();  
 | 
            m_FloorGroup.UnInit();  
 | 
            model.bossSelectedEvent -= OnBossSelected;  
 | 
            model.bossHomeFloorSelectedEvent -= OnFloorSelected;  
 | 
            model.boughtTimeChangeEvent -= DisplayRemindTimes;  
 | 
            findPreciousModel.bossSubscribeChangeEvent -= OnSubscribeBoss;  
 | 
        }  
 | 
  
 | 
        protected override void OnAfterClose()  
 | 
        {  
 | 
        }  
 | 
  
 | 
        protected override void OnActived()  
 | 
        {  
 | 
            base.OnActived();  
 | 
            OnFloorSelected(model.selectedFloor);  
 | 
        }  
 | 
        #endregion  
 | 
  
 | 
        private void ShowBosses()  
 | 
        {  
 | 
            BossHomeData bossHomeData;  
 | 
            if (model.TryGetBossHomeData(model.selectedFloor, out bossHomeData))  
 | 
            {  
 | 
                var bosses = new List<int>();  
 | 
                bosses.AddRange(bossHomeData.GetShowBosses());  
 | 
                model.selectedBoss = bossHomeData.GetRecommendNpc();  
 | 
                m_Bosses.Init(bosses);  
 | 
                m_Bosses.MoveToCenter(bosses.IndexOf(model.selectedBoss));  
 | 
  
 | 
                var config = BossHomeConfig.Get(model.selectedBoss);  
 | 
                var npcConfig = NPCConfig.Get(model.selectedBoss);  
 | 
                switch (config.MonsterType)  
 | 
                {  
 | 
                    case 1:  
 | 
                        m_KillRecord.SetActive(false);  
 | 
                        m_BossIntroduce.SetActive(false);  
 | 
                        m_ContainerMonster.SetActive(true);  
 | 
                        m_BossIntroduce.Dispose();  
 | 
                        UI3DModelExhibition.Instance.ShowNPC(model.selectedBoss, npcConfig.UIModeLOffset, npcConfig.UIModelRotation, m_MonsterPortrait);  
 | 
                        m_MonsterLevel.text = Language.Get("Z1024", npcConfig.NPCLV);  
 | 
                        break;  
 | 
                    case 2:  
 | 
                        m_KillRecord.SetActive(true);  
 | 
                        m_BossIntroduce.SetActive(true);  
 | 
                        m_BossIntroduce.Display(model.selectedBoss, true);  
 | 
                        m_ContainerMonster.SetActive(false);  
 | 
                        m_Subscribe.isOn = findPreciousModel.IsBossSubscribed(model.selectedBoss);  
 | 
                        break;  
 | 
                }  
 | 
  
 | 
                DisplayTip(model.selectedBoss);  
 | 
                DisplayGotoKillButton(model.selectedBoss);  
 | 
                DisplaySubscribe(model.selectedBoss);  
 | 
            }  
 | 
        }  
 | 
  
 | 
        private void ShowKillRecords()  
 | 
        {  
 | 
            findPreciousModel.ViewKillRecordsBoss = model.selectedBoss;  
 | 
            WindowCenter.Instance.Open<KillRecordsWin>();  
 | 
        }  
 | 
  
 | 
        private void SwitchSubscribeBoss()  
 | 
        {  
 | 
            if (findPreciousModel.IsBossSubscribed(model.selectedBoss))  
 | 
            {  
 | 
                findPreciousModel.RequestDeSubscribeBoss(model.selectedBoss);  
 | 
            }  
 | 
            else  
 | 
            {  
 | 
                findPreciousModel.RequestSubscribeBoss(model.selectedBoss, false);  
 | 
            }  
 | 
        }  
 | 
  
 | 
        //进入boss之家之前需要VIP,现通过VIP全配权限控制实现不提示需要vip进入地图的逻辑  
 | 
        //boss之家也从副本改成普通地图,部分逻辑依然保留,代码会比较混乱,需小心修改  
 | 
        private void GotoKillBoss()  
 | 
        {  
 | 
            var config = BossHomeConfig.Get(model.selectedBoss);  
 | 
            if (config.MonsterType == 2 && !findPreciousModel.IsBossUnlock(model.selectedBoss))  
 | 
            {  
 | 
                SysNotifyMgr.Instance.ShowTip("BossRealmHint2", RealmConfig.Get(NPCConfig.Get(model.selectedBoss).Realm).LvLarge);  
 | 
                return;  
 | 
            }  
 | 
  
 | 
            var dataMapId = dungeonModel.GetDataMapIdByMapId(PlayerDatas.Instance.baseData.MapID);  
 | 
            if (dataMapId != BossHomeModel.BOSSHOME_MAPID)  
 | 
            {  
 | 
                EnterBossHome();  
 | 
                return;  
 | 
            }  
 | 
  
 | 
            if (PlayerDatas.Instance.baseData.dungeonLineId + 1 == config.FloorNum)  
 | 
            {  
 | 
                WindowCenter.Instance.Close<FindPreciousFrameWin>();  
 | 
                MapTransferUtility.Instance.MoveToNPC(model.selectedBoss);  
 | 
                return;  
 | 
            }  
 | 
  
 | 
            var vipLevel = PlayerDatas.Instance.baseData.VIPLv;  
 | 
            var vipNeed = model.GetFloorVipRequirement(PlayerDatas.Instance.baseData.dungeonLineId + 1);  
 | 
            if (vipLevel >= vipNeed)  
 | 
            {  
 | 
                EnterBossHome();  
 | 
                return;  
 | 
            }  
 | 
  
 | 
            var moneyNeed = model.GetVipLackCost(PlayerDatas.Instance.baseData.dungeonLineId + 1);  
 | 
            var dungeonId = dungeonModel.GetDungeonId(BossHomeModel.BOSSHOME_MAPID, PlayerDatas.Instance.baseData.dungeonLineId);  
 | 
            var dungeonConfig = DungeonConfig.Get(dungeonId);  
 | 
            ConfirmCancel.ShowPopConfirm(  
 | 
                Language.Get("Mail101"),  
 | 
                Language.Get("QuitRemindBossHome", dungeonConfig.FBName, vipNeed, moneyNeed),  
 | 
                (bool _ok) =>  
 | 
                {  
 | 
                    if (_ok)  
 | 
                    {  
 | 
                        EnterBossHome();  
 | 
                    }  
 | 
                }  
 | 
                );  
 | 
        }  
 | 
  
 | 
        private void OnSubscribeBoss(int _bossId)  
 | 
        {  
 | 
            m_Subscribe.isOn = findPreciousModel.IsBossSubscribed(model.selectedBoss);  
 | 
        }  
 | 
  
 | 
        private void OnBossSelected(int bossId)  
 | 
        {  
 | 
            StopCoroutine("Co_DelayDisplayNpcBaseInfo");  
 | 
            StartCoroutine("Co_DelayDisplayNpcBaseInfo");  
 | 
        }  
 | 
  
 | 
        IEnumerator Co_DelayDisplayNpcBaseInfo()  
 | 
        {  
 | 
            yield return WaitingForSecondConst.WaitMS300;  
 | 
            var bossId = model.selectedBoss;  
 | 
            var config = BossHomeConfig.Get(bossId);  
 | 
  
 | 
            DisplayTip(model.selectedBoss);  
 | 
            DisplayGotoKillButton(model.selectedBoss);  
 | 
            DisplaySubscribe(model.selectedBoss);  
 | 
  
 | 
            switch (config.MonsterType)  
 | 
            {  
 | 
                case 1:  
 | 
                    m_KillRecord.SetActive(false);  
 | 
                    m_BossIntroduce.SetActive(false);  
 | 
                    m_ContainerMonster.SetActive(true);  
 | 
                    m_BossIntroduce.Dispose();  
 | 
                    var npcConfig = NPCConfig.Get(bossId);  
 | 
                    UI3DModelExhibition.Instance.ShowNPC(bossId, npcConfig.UIModeLOffset, npcConfig.UIModelRotation, m_MonsterPortrait);  
 | 
                    m_MonsterLevel.text = Language.Get("Z1024", npcConfig.NPCLV);  
 | 
                    break;  
 | 
                case 2:  
 | 
                    if (!m_BossIntroduce.gameObject.activeInHierarchy)  
 | 
                    {  
 | 
                        m_BossIntroduce.SetActive(true);  
 | 
                    }  
 | 
                    m_BossIntroduce.Display(bossId, true);  
 | 
  
 | 
                    m_KillRecord.SetActive(true);  
 | 
                    m_ContainerMonster.SetActive(false);  
 | 
                    m_Subscribe.isOn = findPreciousModel.IsBossSubscribed(bossId);  
 | 
                    break;  
 | 
            }  
 | 
        }  
 | 
  
 | 
        private void OnFloorSelected(int _floor)  
 | 
        {  
 | 
            ShowBosses();  
 | 
  
 | 
            var vipNeedFloor1 = model.GetFloorVipRequirement(1);  
 | 
            var vipNeed = model.GetFloorVipRequirement(model.selectedFloor);  
 | 
            m_Vip.text = StringUtility.Contact("V", vipNeed);  
 | 
  
 | 
            if (PlayerDatas.Instance.baseData.VIPLv < vipNeedFloor1)  
 | 
            {  
 | 
                m_VipLackTip.SetActive(true);  
 | 
                m_VipLackTip.text = Language.Get("BossHome_VipNoMeet");  
 | 
            }  
 | 
            else  
 | 
            {  
 | 
                if (_floor != 1)  
 | 
                {  
 | 
                    if (vipNeed > PlayerDatas.Instance.baseData.VIPLv)  
 | 
                    {  
 | 
                        m_VipLackTip.SetActive(true);  
 | 
                        var moneyNeed = model.GetVipLackCost(model.selectedFloor);  
 | 
                        m_VipLackTip.text = Language.Get("FightTreasure_BossHome", moneyNeed);  
 | 
                    }  
 | 
                    else  
 | 
                    {  
 | 
                        m_VipLackTip.SetActive(false);  
 | 
                    }  
 | 
                }  
 | 
                else  
 | 
                {  
 | 
                    m_VipLackTip.SetActive(false);  
 | 
                }  
 | 
            }  
 | 
  
 | 
        }  
 | 
  
 | 
        private void EnterBossHome()  
 | 
        {  
 | 
            var error = 0;  
 | 
            if (TestEnterDungeon(out error))  
 | 
            {  
 | 
                //dungeonModel.SingleChallenge(BossHomeModel.BOSSHOME_MAPID, model.selectedFloor - 1);  
 | 
                WindowCenter.Instance.Close<FindPreciousFrameWin>();  
 | 
                MapTransferUtility.Instance.MoveToNPC(model.selectedBoss);  
 | 
            }  
 | 
            else  
 | 
            {  
 | 
                ProcessEnterDungeonError(error);  
 | 
            }  
 | 
        }  
 | 
  
 | 
        private bool TestEnterDungeon(out int _error)  
 | 
        {  
 | 
            var vipLevel = PlayerDatas.Instance.baseData.VIPLv;  
 | 
            if (vipLevel < model.GetFloorVipRequirement(1))  
 | 
            {  
 | 
                _error = 1;  
 | 
                return false;  
 | 
            }  
 | 
  
 | 
            var vipNeed = model.GetFloorVipRequirement(model.selectedFloor);  
 | 
            if (vipLevel < vipNeed)  
 | 
            {  
 | 
                _error = 2;  
 | 
                return false;  
 | 
            }  
 | 
  
 | 
            var mapConfig = MapConfig.Get(PlayerDatas.Instance.baseData.MapID);  
 | 
            if (mapConfig.MapFBType != (int)MapType.OpenCountry)  
 | 
            {  
 | 
                _error = 4;  
 | 
                return false;  
 | 
            }  
 | 
  
 | 
            _error = 0;  
 | 
            return true;  
 | 
        }  
 | 
  
 | 
        private void ProcessEnterDungeonError(int _error)  
 | 
        {  
 | 
            switch (_error)  
 | 
            {  
 | 
                case 1:  
 | 
                    WindowCenter.Instance.Open<BossHomeVipLackWin>();  
 | 
                    break;  
 | 
                case 2:  
 | 
                    var moneyNeed = model.GetVipLackCost(model.selectedFloor);  
 | 
                    var title = Language.Get("Mail101");  
 | 
                    var tip = Language.Get("FightTreasure_BossHome", moneyNeed);  
 | 
                    ConfirmCancel.ShowPopConfirm(  
 | 
                        title,  
 | 
                        tip,  
 | 
                        (bool _ok) =>  
 | 
                        {  
 | 
                            if (_ok)  
 | 
                            {  
 | 
                                var moneyOwn = PlayerDatas.Instance.baseData.diamond;  
 | 
                                if (moneyOwn < moneyNeed)  
 | 
                                {  
 | 
                                    if (VersionConfig.Get().isBanShu)  
 | 
                                    {  
 | 
                                        SysNotifyMgr.Instance.ShowTip("GoldErr");  
 | 
                                        return;  
 | 
                                    }  
 | 
                                    WindowCenter.Instance.Open<RechargeTipWin>();  
 | 
                                }  
 | 
                                else  
 | 
                                {  
 | 
                                    var dungeonModel = ModelCenter.Instance.GetModel<DungeonModel>();  
 | 
                                    dungeonModel.SingleChallenge(BossHomeModel.BOSSHOME_MAPID, model.selectedFloor - 1);  
 | 
                                }  
 | 
                            }  
 | 
                        }  
 | 
                        );  
 | 
                    break;  
 | 
                case 3:  
 | 
                    WindowCenter.Instance.Close<FindPreciousFrameWin>();  
 | 
                    MapTransferUtility.Instance.MoveToNPC(model.selectedBoss);  
 | 
                    break;  
 | 
                case 4:  
 | 
                    SysNotifyMgr.Instance.ShowTip("DungeonNoGO");  
 | 
                    break;  
 | 
            }  
 | 
        }  
 | 
  
 | 
        private void DisplayTip(int bossId)  
 | 
        {  
 | 
            if (!findPreciousModel.IsBossUnlock(bossId))  
 | 
            {  
 | 
                m_NoDamageTip.SetActive(true);  
 | 
                m_SurpassLevel.SetActive(false);  
 | 
            }  
 | 
            else  
 | 
            {  
 | 
                m_NoDamageTip.SetActive(false);  
 | 
                var dropConfig = NPCDropItemConfig.Get(bossId);  
 | 
                var noDrop = dropConfig == null || (dropConfig.MaxLV != 0 && PlayerDatas.Instance.baseData.LV > dropConfig.MaxLV);  
 | 
                m_SurpassLevel.SetActive(noDrop);  
 | 
            }  
 | 
        }  
 | 
  
 | 
        private void DisplayRemindTimes()  
 | 
        {  
 | 
            var wearyValueLimit = vipModel.GetVipPrivilegeCnt(VipPrivilegeType.BossHomeAwardLimit);  
 | 
            m_WearyContainer.SetActive(wearyValueLimit > 0);  
 | 
            if (wearyValueLimit > 0)  
 | 
            {  
 | 
                var countInfo = string.Format("{0}/{1}", model.remindTimes, wearyValueLimit);  
 | 
                m_WearyValue.text = countInfo;  
 | 
                m_WearyValue.colorType = model.remindTimes <= 0 ? TextColType.Red : TextColType.DarkGreen;  
 | 
            }  
 | 
        }  
 | 
  
 | 
        private void DisplayGotoKillButton(int bossId)  
 | 
        {  
 | 
        }  
 | 
  
 | 
        private void DisplaySubscribe(int bossId)  
 | 
        {  
 | 
            var isUnLocked = findPreciousModel.IsBossUnlock(bossId);  
 | 
            m_Subscribe.SetActive(isUnLocked);  
 | 
            if (isUnLocked)  
 | 
            {  
 | 
                m_Subscribe.isOn = findPreciousModel.IsBossSubscribed(bossId);  
 | 
            }  
 | 
        }  
 | 
    }  
 | 
  
 | 
}  
 | 
  
 | 
  
 | 
  
 |