using System.Collections; using System.Collections.Generic; using UnityEngine; namespace Snxxz.UI { public class MainWinSkillController : Singleton { const int SKILL_COUNT_MAX = 7; public readonly LogicStruct skillcd0 = new LogicStruct(); public readonly LogicStruct skillcd1 = new LogicStruct(); public readonly LogicStruct skillcd2 = new LogicStruct(); public readonly LogicStruct skillcd3 = new LogicStruct(); public readonly LogicStruct skillcd4 = new LogicStruct(); public readonly LogicStruct skillcd5 = new LogicStruct(); public readonly LogicStruct skillcd6 = new LogicStruct(); public readonly LogicStruct skillcd7 = new LogicStruct(); public readonly LogicStruct skillcdxp = new LogicStruct(); public readonly LogicBool forbid0 = new LogicBool(); public readonly LogicBool forbid1 = new LogicBool(); public readonly LogicBool forbid2 = new LogicBool(); public readonly LogicBool forbid3 = new LogicBool(); public readonly LogicBool forbid4 = new LogicBool(); public readonly LogicBool forbid5 = new LogicBool(); public readonly LogicBool forbid6 = new LogicBool(); public readonly LogicBool forbid7 = new LogicBool(); public readonly LogicBool forbidxp = new LogicBool(); Dictionary skillPlaceMap = new Dictionary(); SkillModel model { get { return ModelCenter.Instance.GetModel(); } } public MainWinSkillController() { PlayerSkillDatas.OnRefreshSkill -= OnSkillRefresh; Skill.RefreshCD += OnSkillCDRefresh; GA_Hero.OnStateEnter += OnSkillStateEnter; GA_Hero.OnStateEnd += OnSkillStateEnd; StatusMgr.OnGainCantCastSkillStatus += OnGainCantCastSkillStatus; StatusMgr.OnReleaseCantCastSkillStatus += OnReleaseCantCastSkillStatus; } public void Reset() { skillcd0.value = default(SkillCD); skillcd1.value = default(SkillCD); skillcd2.value = default(SkillCD); skillcd3.value = default(SkillCD); skillcd4.value = default(SkillCD); skillcd5.value = default(SkillCD); skillcd6.value = default(SkillCD); skillcd7.value = default(SkillCD); skillcdxp.value = default(SkillCD); forbid0.value = false; forbid1.value = false; forbid2.value = false; forbid3.value = false; forbid4.value = false; forbid5.value = false; forbid6.value = false; forbid7.value = false; forbidxp.value = false; skillPlaceMap.Clear(); } public LogicStruct GetSkillCD(int index) { switch (index) { case 0: return skillcd0; case 1: return skillcd1; case 2: return skillcd2; case 3: return skillcd3; case 4: return skillcd4; case 5: return skillcd5; case 6: return skillcd6; case 7: return skillcd7; case 8: return skillcdxp; default: return null; } } public LogicBool GetSkillForbid(int index) { switch (index) { case 0: return forbid0; case 1: return forbid1; case 2: return forbid2; case 3: return forbid3; case 4: return forbid4; case 5: return forbid5; case 6: return forbid6; case 7: return forbid7; case 8: return forbidxp; default: return null; } } private void OnSkillRefresh() { skillPlaceMap.Clear(); for (int i = 0; i < SKILL_COUNT_MAX; i++) { var skillData = PlayerDatas.Instance.skill.GetQuickSkillByPos(i); if (skillData != null) { skillPlaceMap[skillData.id] = i + 1; } } var blinkSkill = PlayerDatas.Instance.skill.GetSKillById(190); if (blinkSkill != null) { skillPlaceMap[blinkSkill.id] = 0; } var skillXpId = model.GetXpSkillID(); if (skillXpId != 0) { skillPlaceMap[skillXpId] = 8; } } private void OnSkillCDRefresh(int skillId, float cd, float total) { if (skillPlaceMap.ContainsKey(skillId)) { var place = skillPlaceMap[skillId]; var skillcd = GetSkillCD(place); skillcd.value = skillcd.value.SetExclusiveCountDown(cd, total); } } private void OnSkillStateEnter(float time) { for (int i = 0; i <= 8; i++) { var skillcd = GetSkillCD(i); skillcd.value = skillcd.value.SetCommonCountDown(time); } } private void OnSkillStateEnd() { for (int i = 0; i <= 8; i++) { var skillcd = GetSkillCD(i); skillcd.value = skillcd.value.SetCommonCountDown(0); } } private void OnGainCantCastSkillStatus(float duration) { var forbid = !StatusMgr.Instance.CanCastSkill(PlayerDatas.Instance.baseData.PlayerID); for (int i = 0; i <= 8; i++) { var skillForbid = GetSkillForbid(i); skillForbid.value = forbid; } } private void OnReleaseCantCastSkillStatus() { var forbid = !StatusMgr.Instance.CanCastSkill(PlayerDatas.Instance.baseData.PlayerID); for (int i = 0; i <= 8; i++) { var skillForbid = GetSkillForbid(i); skillForbid.value = forbid; } } public struct SkillCD { public float exclusiveTotal; public float exclusiveOverTime; public float commonTotal; public float commonOverTime; public SkillCD SetCommonCountDown(float time) { commonTotal = time; commonOverTime = Time.realtimeSinceStartup + time; return this; } public SkillCD SetExclusiveCountDown(float cd, float total) { exclusiveTotal = total; exclusiveOverTime = Time.realtimeSinceStartup + cd; return this; } public bool IsCountDown() { if (exclusiveOverTime > Time.realtimeSinceStartup) { return true; } if (commonOverTime > Time.realtimeSinceStartup) { return true; } return false; } public float GetCountDownFillAmount() { if (exclusiveOverTime > Time.realtimeSinceStartup) { return exclusiveOverTime - Time.realtimeSinceStartup / exclusiveTotal; } if (commonOverTime > Time.realtimeSinceStartup) { return commonOverTime - Time.realtimeSinceStartup / commonTotal; } return 0f; } public float GetCountDown() { if (exclusiveOverTime > Time.realtimeSinceStartup) { return exclusiveOverTime - Time.realtimeSinceStartup; } return 0f; } } } }