//-------------------------------------------------------- // [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; bool autoSelect = false; int defaultSelect = 0; #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(); GlobalTimeEvent.Instance.secondEvent += SecondEvent; model.bossSelectedEvent += BossSelectedEvent; model.bossProgressUpdate += BossProgressUpdate; model.bossAllProgressUpdate += BossAllProgressUpdate; model.stateUpdate += StateUpdate; m_Timer = 0; } protected override void OnActived() { base.OnActived(); DisplayBosses(); defaultSelect = model.selectBoss; autoSelect = false; model.QueryGrabBossProgress(); } protected override void OnAfterOpen() { } protected override void OnPreClose() { GlobalTimeEvent.Instance.secondEvent -= SecondEvent; model.bossSelectedEvent -= BossSelectedEvent; model.bossProgressUpdate -= BossProgressUpdate; model.bossAllProgressUpdate -= BossAllProgressUpdate; 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 (model.TestEnterDungeon(model.selectBoss, out error)) { if (IsBossKilled(model.selectBoss)) { SysNotifyMgr.Instance.ShowTip("FairyGrabBossOver"); } WindowJumpMgr.Instance.ClearJumpData(); WindowCenter.Instance.Close(); MapTransferUtility.Instance.MoveToNPC(model.selectBoss); } else { model.DisplayErrorTip(error); } } bool IsBossKilled(int bossId) { FairyGrabBossModel.BossProgressInfo bossProgress; bool killed = false; if (model.TryGetBossProgress(bossId, out bossProgress)) { var progress = 1 - (float)bossProgress.currentHp / bossProgress.totalHp; killed = progress >= 1; } return killed; } private void KillRecord() { findPreciousModel.ViewKillRecordsBoss = model.selectBoss; WindowCenter.Instance.Open(); } private void SecondEvent() { DisplaySurplusTime(); } private void BossSelectedEvent(int bossId) { if (defaultSelect != bossId) { autoSelect = true; } DisplayBossInfo(); DisplayHighestFairy(); } private void BossProgressUpdate(int bossId) { if (bossId == model.selectBoss) { DisplayHighestFairy(); } } void BossAllProgressUpdate() { if (!autoSelect && model.InActivityTime) { AutoSelect(); } autoSelect = true; } private void StateUpdate() { DisplayHighestFairy(); } void AutoSelect() { var index = 0; for (int i = 0; i < model.bosses.Count; i++) { FairyGrabBossModel.BossProgressInfo bossProgress; if (model.TryGetBossProgress(model.bosses[i], out bossProgress)) { var progress = (float)bossProgress.currentHp / bossProgress.totalHp; if (progress > 0) { index = i; break; } } else { index = i; break; } } m_Bosses.MoveToCenter(index); } } }