//-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Monday, August 27, 2018 //-------------------------------------------------------- using System; using System.Collections; using System.Collections.Generic; using TableConfig; using UnityEngine; using UnityEngine.UI; namespace Snxxz.UI { public class FairyGrabBossWin : Window { [SerializeField] CyclicScroll m_Bosses; [SerializeField] Text m_FairyName; [SerializeField] Text m_NoneFairy; [SerializeField] ItemCell[] m_DropItems; [SerializeField] Button m_KillRecord; [SerializeField] Button m_Goto; [SerializeField] RectTransform m_ContainerUnOpen; [SerializeField] RectTransform m_ContainerOpen; [SerializeField] Text m_SurplusTime; FairyGrabBossModel model { get { return ModelCenter.Instance.GetModel(); } } DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel(); } } BossHomeModel bossHomeModel { get { return ModelCenter.Instance.GetModel(); } } FindPreciousModel findPreciousModel { get { return ModelCenter.Instance.GetModel(); } } float m_Timer = 0f; const float Interval = 10f; #region Built-in protected override void BindController() { } protected override void AddListeners() { m_KillRecord.onClick.AddListener(KillRecord); m_Goto.onClick.AddListener(Goto); } protected override void OnPreOpen() { DisplaySurplusTime(); DisplayBossInfo(); DisplayHighestFairy(); model.QueryGrabBossProgress(true); GlobalTimeEvent.Instance.secondEvent += SecondEvent; model.bossSelectedEvent += BossSelectedEvent; model.bossProgressUpdate += BossProgressUpdate; model.stateUpdate += StateUpdate; m_Timer = 0; } protected override void OnActived() { base.OnActived(); DisplayBosses(); } protected override void OnAfterOpen() { } protected override void OnPreClose() { GlobalTimeEvent.Instance.secondEvent -= SecondEvent; model.bossSelectedEvent -= BossSelectedEvent; model.bossProgressUpdate -= BossProgressUpdate; model.stateUpdate -= StateUpdate; } protected override void OnAfterClose() { } protected override void LateUpdate() { base.LateUpdate(); m_Timer += Time.deltaTime; if (m_Timer >= Interval) { m_Timer = 0; model.QueryGrabBossProgress(); } } #endregion void DisplayBosses() { var bosses = new List(); bosses.AddRange(model.bosses); model.selectBoss = DefaultSelect(); m_Bosses.Init(bosses); m_Bosses.MoveToCenter(bosses.IndexOf(model.selectBoss)); } void DisplayBossInfo() { List dropItems; model.TryGetDropItems(model.selectBoss, out dropItems); for (int i = 0; i < m_DropItems.Length; i++) { m_DropItems[i].cellBtn.RemoveAllListeners(); if (dropItems != null && i < dropItems.Count) { m_DropItems[i].gameObject.SetActive(true); var item = dropItems[i]; ItemCellModel itemCellModel = new ItemCellModel(item.id, true, (ulong)item.count, item.bind ? 1 : 0); m_DropItems[i].Init(itemCellModel); m_DropItems[i].cellBtn.AddListener(() => { ItemAttrData itemAttrData = new ItemAttrData(item.id, true, (ulong)item.count, -1, item.bind ? 1 : 0); ModelCenter.Instance.GetModel().SetItemTipsModel(itemAttrData); }); } else { m_DropItems[i].gameObject.SetActive(false); } } } void DisplayHighestFairy() { m_FairyName.text = string.Empty; m_NoneFairy.gameObject.SetActive(true); if (!model.IsOpen) { return; } FairyGrabBossModel.BossProgressInfo bossProgress; if (model.TryGetBossProgress(model.selectBoss, out bossProgress)) { m_FairyName.text = bossProgress.FamilyName; m_NoneFairy.gameObject.SetActive(string.IsNullOrEmpty(bossProgress.FamilyName)); } } int DefaultSelect() { return model.bosses[0]; } void DisplaySurplusTime() { var seconds = model.surplusSeconds; if (seconds > 0) { if (!m_ContainerOpen.gameObject.activeSelf || m_ContainerUnOpen.gameObject.activeSelf) { m_ContainerOpen.gameObject.SetActive(true); m_ContainerUnOpen.gameObject.SetActive(false); } m_SurplusTime.text = TimeUtility.SecondsToDHMSCHS(seconds); } else { if (!m_ContainerUnOpen.gameObject.activeSelf || m_ContainerOpen.gameObject.activeSelf) { m_ContainerUnOpen.gameObject.SetActive(true); m_ContainerOpen.gameObject.SetActive(false); } } } private void Goto() { var error = 0; if (TestEnterDungeon(out error)) { WindowJumpMgr.Instance.ClearJumpData(); WindowCenter.Instance.Close(); MapTransferUtility.Instance.MoveToNPC(model.selectBoss); } else { switch (error) { case 1: SysNotifyMgr.Instance.ShowTip("FairyGrabBossNoFairy"); break; case 3: SysNotifyMgr.Instance.ShowTip("FairyGrabBossUnOpen"); break; case 2: FuncOpen.Instance.ProcessorFuncErrorTip(139); break; case 4: var dataMapId = dungeonModel.GetDungeonDataIdByMapId(PlayerDatas.Instance.baseData.MapID); var config = Config.Instance.Get(dataMapId); var tip = string.Empty; if (dataMapId == BossHomeModel.BOSSHOME_MAPID) { var vipLevel = PlayerDatas.Instance.baseData.VIPLv; var vipNeed = bossHomeModel.GetFloorVipRequirement(PlayerDatas.Instance.baseData.dungeonLineId + 1); if (vipLevel < vipNeed) { var moneyNeed = bossHomeModel.GetVipLackCost(PlayerDatas.Instance.baseData.dungeonLineId + 1); var dungeonId = dungeonModel.DungeonMap(BossHomeModel.BOSSHOME_MAPID, PlayerDatas.Instance.baseData.dungeonLineId); var dungeonConfig = Config.Instance.Get(dungeonId); tip = Language.Get("QuitRemindBossHome", dungeonConfig.FBName, vipNeed, moneyNeed); } else { tip = Language.Get(config.ExitDescription); } } else { tip = Language.Get(config.ExitDescription); } ConfirmCancel.ShowPopConfirm( Language.Get("Mail101"), tip, (bool _ok) => { if (_ok) { WindowCenter.Instance.Close(); MapTransferUtility.Instance.MoveToNPC(model.selectBoss); } } ); break; case 5: SysNotifyMgr.Instance.ShowTip("InDungeon_CantGo"); break; } } } private bool TestEnterDungeon(out int _error) { if (!model.InActivityTime) { _error = 3; return false; } if (!PlayerDatas.Instance.fairyData.HasFairy) { _error = 1; return false; } if (!FuncOpen.Instance.IsFuncOpen(139)) { _error = 2; return false; } var mapId = PlayerDatas.Instance.baseData.MapID; var dataMapId = dungeonModel.GetDungeonDataIdByMapId(mapId); if (dataMapId == BossHomeModel.BOSSHOME_MAPID || dataMapId == ElderGodAreaModel.ELDERGODAREA_MAPID) { _error = 4; return false; } var mapConfig = Config.Instance.Get(mapId); if (mapConfig.MapFBType != (int)MapType.OpenCountry) { _error = 5; return false; } _error = 0; return true; } private void KillRecord() { findPreciousModel.ViewKillRecordsBoss = model.selectBoss; WindowCenter.Instance.Open(); } private void SecondEvent() { DisplaySurplusTime(); } private void BossSelectedEvent(int bossId) { DisplayBossInfo(); DisplayHighestFairy(); } private void BossProgressUpdate(int bossId) { if (bossId == model.selectBoss) { DisplayHighestFairy(); } } private void StateUpdate() { DisplayHighestFairy(); } } }