//--------------------------------------------------------
|
// [Author]: 第二世界
|
// [ Date ]: Tuesday, July 31, 2018
|
//--------------------------------------------------------
|
|
using System;
|
using System.Collections;
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
using UnityEngine.UI;
|
|
namespace Snxxz.UI {
|
|
public class TalentWin : Window
|
{
|
[SerializeField] TalentSeriesBehaviour[] m_TalentSeries;
|
[SerializeField] TalentTreeScriptable[] m_TalentConfigs;
|
[SerializeField] RectTransform m_ContainerSelect;
|
[SerializeField] Button m_TalentTypeSelect;
|
[SerializeField] Text m_TalentType;
|
[SerializeField] Text m_TalentTitle;
|
|
[SerializeField] float m_AutoSelectOffset = 62f;
|
[SerializeField] ScrollRect m_Scroller;
|
[SerializeField] List<TalentSkillBehaviour> m_TalentSkills;
|
[SerializeField] List<Image> m_Arrows;
|
|
[SerializeField] RectTransform m_ContainerSelectSkill;
|
[SerializeField] Image m_SelectSkillIcon;
|
[SerializeField] Text m_SelectSkillLevel;
|
[SerializeField] Text m_SelectSkillName;
|
|
[SerializeField] RectTransform m_ContainerUnActive;
|
[SerializeField] RectTransform m_ContainerActive;
|
[SerializeField] RectTransform m_ContainerBetter;
|
[SerializeField] RectTransform m_ContainerMax;
|
|
[SerializeField] Text[] m_SelectConditions;
|
[SerializeField] Text m_SelectSkillEffect;
|
[SerializeField] Text m_SelectNextEffect;
|
|
|
[SerializeField] Button m_ResetPoint;
|
[SerializeField] Button m_AddPoint;
|
[SerializeField] Text m_AddPointBtnText;
|
[SerializeField] Text m_SurplusPoint;
|
|
#if UNITY_EDITOR
|
[SerializeField] TalentTreeScriptable m_EditorScriptable;
|
[SerializeField] bool m_EditorMode;
|
[SerializeField] string m_StraightArrowName;
|
[SerializeField] string m_TurnArrowName;
|
#endif
|
|
TalentModel model { get { return ModelCenter.Instance.GetModel<TalentModel>(); } }
|
PackModel pack { get { return ModelCenter.Instance.GetModel<PackModel>(); } }
|
#region Built-in
|
protected override void BindController()
|
{
|
}
|
|
protected override void AddListeners()
|
{
|
m_TalentTypeSelect.onClick.AddListener(SelectTalentType);
|
m_ResetPoint.onClick.AddListener(ResetPoint);
|
m_AddPoint.onClick.AddListener(AddPoint);
|
}
|
|
protected override void OnPreOpen()
|
{
|
model.selectSeries = 1;
|
model.selectTalentType = model.GetTalentType(0);
|
Display();
|
model.selectTalentTypeEvnet += OnSelectTalentTypeEvnet;
|
model.selectSeriesEvent += OnSelectSeriesEvent;
|
model.selectSkillEvent += OnSelectSkillEvent;
|
model.talentSkillUpdate += TalentSkillUpdate;
|
model.talentPointUpdate += TalentPointUpdate;
|
PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefreshInfoEvent;
|
PlayerSkillDatas.OnRefreshSkill += OnRefreshSkill;
|
}
|
|
protected override void OnAfterOpen()
|
{
|
}
|
|
protected override void OnPreClose()
|
{
|
model.selectTalentTypeEvnet -= OnSelectTalentTypeEvnet;
|
model.selectSeriesEvent -= OnSelectSeriesEvent;
|
model.selectSkillEvent -= OnSelectSkillEvent;
|
model.talentSkillUpdate -= TalentSkillUpdate;
|
model.talentPointUpdate -= TalentPointUpdate;
|
PlayerSkillDatas.OnRefreshSkill -= OnRefreshSkill;
|
PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefreshInfoEvent;
|
for (int i = 0; i < m_TalentSeries.Length; i++)
|
{
|
m_TalentSeries[i].Dispose();
|
}
|
for (int i = 0; i < m_TalentSkills.Count; i++)
|
{
|
m_TalentSkills[i].Dispose();
|
}
|
|
#if UNITY_EDITOR
|
if (m_EditorScriptable != null)
|
{
|
m_EditorScriptable = null;
|
}
|
#endif
|
}
|
|
protected override void OnAfterClose()
|
{
|
}
|
#endregion
|
|
protected override void LateUpdate()
|
{
|
base.LateUpdate();
|
#if UNITY_EDITOR
|
if (m_EditorMode && m_EditorScriptable != null)
|
{
|
DisplayTalentLayout(m_EditorScriptable);
|
}
|
#endif
|
}
|
|
void Display()
|
{
|
for (int i = 0; i < m_TalentSeries.Length; i++)
|
{
|
m_TalentSeries[i].Display();
|
}
|
|
DisplaySkills();
|
DisplayTalentType();
|
DisplaySelectSkill();
|
DisplayTalentPoint();
|
DisplayLevelUp();
|
}
|
|
void DisplaySkills()
|
{
|
var job = PlayerDatas.Instance.baseData.Job;
|
List<int> talents = null;
|
model.TryGetTalents(job, model.selectTalentType, model.selectSeries, out talents);
|
|
TalentTreeScriptable selectScriptable = null;
|
for (int i = 0; i < m_TalentConfigs.Length; i++)
|
{
|
if (m_TalentConfigs[i].Belong(job, model.selectTalentType, model.selectSeries))
|
{
|
selectScriptable = m_TalentConfigs[i];
|
DisplayTalentLayout(selectScriptable);
|
break;
|
}
|
}
|
|
List<int> sortTalents = new List<int>(talents);
|
sortTalents.Sort(Compare);
|
|
var index = 0;
|
if (sortTalents != null && sortTalents.Count > 0)
|
{
|
index = 0;
|
}
|
model.selectSkill = sortTalents[index];
|
if (selectScriptable != null)
|
{
|
var rect = m_Scroller.transform as RectTransform;
|
var skillRect = m_TalentSkills[0].transform as RectTransform;
|
m_Scroller.verticalNormalizedPosition = selectScriptable.GetPercentBySkillElement(index, rect.sizeDelta.y, m_AutoSelectOffset);
|
}
|
for (int i = 0; i < m_TalentSkills.Count; i++)
|
{
|
if (sortTalents != null && i < sortTalents.Count)
|
{
|
m_TalentSkills[i].gameObject.SetActive(true);
|
m_TalentSkills[i].Display(sortTalents[i]);
|
}
|
else
|
{
|
m_TalentSkills[i].Dispose();
|
m_TalentSkills[i].gameObject.SetActive(false);
|
}
|
}
|
|
var talentTypeDisplay = Language.Get(StringUtility.Contact("TalentType_", model.selectTalentType));
|
var seriesDisplay = Language.Get(StringUtility.Contact("TalentSeries_", model.selectSeries));
|
m_TalentTitle.text = StringUtility.Contact(talentTypeDisplay, "·", seriesDisplay);
|
}
|
|
void DisplayTalentType()
|
{
|
m_ContainerSelect.gameObject.SetActive(model.talentTypeCount > 1);
|
if (model.talentTypeCount > 1)
|
{
|
var unselectTalentType = model.selectTalentType == model.GetTalentType(0) ? model.GetTalentType(1) : model.GetTalentType(0);
|
var point = model.GetTalentTypePoint(unselectTalentType);
|
var job = PlayerDatas.Instance.baseData.Job;
|
var talentTypeDisplay = Language.Get(StringUtility.Contact("TalentBtnType_", unselectTalentType));
|
m_TalentType.text = StringUtility.Contact(talentTypeDisplay, "(", point, ")");
|
}
|
}
|
|
void DisplaySelectSkill()
|
{
|
DisplaySkillInfo();
|
DisplayConditions();
|
DisplaySkillEffect();
|
}
|
|
private void PlayerDataRefreshInfoEvent(PlayerDataType refreshType)
|
{
|
switch (refreshType)
|
{
|
case PlayerDataType.STR:
|
case PlayerDataType.PNE:
|
case PlayerDataType.PHY:
|
case PlayerDataType.CON:
|
DisplayConditions();
|
break;
|
}
|
}
|
|
private void OnRefreshSkill()
|
{
|
DisplayConditions();
|
}
|
|
void DisplayConditions()
|
{
|
TalentSkill talent;
|
var index = 0;
|
if (model.TryGetTalent(model.selectSkill, out talent))
|
{
|
var talentConfig = talent.GetTalentConfig(talent.level + 1);
|
var skillConfig = talent.GetSkillConfig(talent.level + 1);
|
if (talentConfig != null)
|
{
|
var requireSeriesPoint = skillConfig.RequireTalentSeriesPoint();
|
if (requireSeriesPoint != 0 && index < m_SelectConditions.Length)
|
{
|
m_SelectConditions[index].gameObject.SetActive(true);
|
var requireSeries = skillConfig.RequireTalentSeries();
|
var point = model.GetSeriesPoint(talentConfig.type, requireSeries);
|
var requireDisplay = StringUtility.Contact(point, "/", requireSeriesPoint);
|
requireDisplay = UIHelper.AppendColor(point >= requireSeriesPoint ?
|
TextColType.Green : TextColType.Red, requireDisplay);
|
var seriesDisplay = Language.Get("TalentSeriesCondition", Language.Get(StringUtility.Contact("TalentSeries_", requireSeries)));
|
m_SelectConditions[index].text = StringUtility.Contact(seriesDisplay, requireDisplay);
|
index++;
|
}
|
var requireProperty = skillConfig.RequireProperty();
|
if (requireProperty != 0 && index < m_SelectConditions.Length)
|
{
|
m_SelectConditions[index].gameObject.SetActive(true);
|
var requirePropertyValue = skillConfig.RequirePropertyValue();
|
var propertyValue = UIHelper.GetPropertyValue((PropertyType)requireProperty);
|
var requireDisplay = StringUtility.Contact(propertyValue, "/", requirePropertyValue);
|
requireDisplay = UIHelper.AppendColor(propertyValue >= requirePropertyValue ?
|
TextColType.Green : TextColType.Red, requireDisplay);
|
var propertyConfig = PlayerPropertyConfig.Get(requireProperty);
|
var propertyDisplay = Language.Get("TalentPropertyCondition", propertyConfig.Name);
|
m_SelectConditions[index].text = StringUtility.Contact(propertyDisplay, requireDisplay);
|
index++;
|
}
|
}
|
if (skillConfig != null && index < m_SelectConditions.Length)
|
{
|
var learnSkillConfig = SkillConfig.Get(skillConfig.LearnSkillReq);
|
if (skillConfig.LearnSkillReq != 0)
|
{
|
if (learnSkillConfig.FuncType == 1)
|
{
|
m_SelectConditions[index].gameObject.SetActive(true);
|
var treasureModel = ModelCenter.Instance.GetModel<TreasureModel>();
|
var treasureId = treasureModel.GetTreasureBySkillId(skillConfig.LearnSkillReq);
|
var treasureConfig = TreasureConfig.Get(treasureId);
|
bool satisfy = PlayerDatas.Instance.skill.GetSKillById(skillConfig.LearnSkillReq) != null;
|
var requireDisplay = StringUtility.Contact(learnSkillConfig.SkillName, "(", treasureConfig.Name, ")");
|
requireDisplay = UIHelper.AppendColor(satisfy ? TextColType.Green : TextColType.Red, requireDisplay);
|
m_SelectConditions[index].text = StringUtility.Contact(Language.Get("TalentPreTreasureSkillCondition"), requireDisplay);
|
index++;
|
}
|
else
|
{
|
TalentSkill learnTalent;
|
if (model.TryGetTalent(skillConfig.LearnSkillReq, out learnTalent))
|
{
|
m_SelectConditions[index].gameObject.SetActive(true);
|
var requireDisplay = StringUtility.Contact(learnSkillConfig.SkillName, " ", learnTalent.level, "/", skillConfig.LearnSkillLV);
|
requireDisplay = UIHelper.AppendColor(learnTalent.level >= skillConfig.LearnSkillLV ?
|
TextColType.Green : TextColType.Red, requireDisplay);
|
m_SelectConditions[index].text = StringUtility.Contact(Language.Get("TalentPreSkillCondition"), requireDisplay);
|
index++;
|
}
|
}
|
}
|
}
|
}
|
for (int i = index; i < m_SelectConditions.Length; i++)
|
{
|
m_SelectConditions[i].gameObject.SetActive(false);
|
}
|
}
|
|
void DisplaySkillInfo()
|
{
|
TalentSkill talent;
|
m_ContainerSelectSkill.gameObject.SetActive(false);
|
if (model.TryGetTalent(model.selectSkill, out talent))
|
{
|
m_ContainerSelectSkill.gameObject.SetActive(true);
|
var config = talent.GetSkillConfig(talent.level);
|
m_SelectSkillIcon.SetSprite(config.IconName);
|
m_SelectSkillLevel.text = StringUtility.Contact(Language.Get("TalentLevel"), talent.level, "/", talent.maxLevel);
|
m_SelectSkillName.text = config.SkillName;
|
m_SelectSkillLevel.color = UIHelper.GetUIColor(talent.level >= talent.maxLevel ? TextColType.Green : TextColType.NavyBrown, true);
|
}
|
}
|
|
void DisplaySkillEffect()
|
{
|
TalentSkill talent;
|
if (model.TryGetTalent(model.selectSkill, out talent))
|
{
|
m_ContainerUnActive.gameObject.SetActive(talent.level == 0);
|
m_ContainerActive.gameObject.SetActive(talent.level > 0);
|
m_ContainerBetter.gameObject.SetActive(talent.level < talent.maxLevel);
|
m_ContainerMax.gameObject.SetActive(talent.level >= talent.maxLevel);
|
|
if (talent.level > 0)
|
{
|
var config = talent.GetSkillConfig(talent.level);
|
m_SelectSkillEffect.text = config.Description;
|
}
|
if (talent.level < talent.maxLevel)
|
{
|
var nextConfig = talent.GetSkillConfig(talent.level + 1);
|
m_SelectNextEffect.text = nextConfig.Description;
|
}
|
}
|
}
|
|
bool TryGetTalentConfig(out TalentTreeScriptable config)
|
{
|
config = null;
|
for (int i = 0; i < m_TalentConfigs.Length; i++)
|
{
|
if (m_TalentConfigs[i].Belong(PlayerDatas.Instance.baseData.Job, model.selectTalentType, model.selectSeries))
|
{
|
config = m_TalentConfigs[i];
|
return true;
|
}
|
}
|
return false;
|
}
|
|
void DisplayTalentPoint()
|
{
|
m_SurplusPoint.text = model.talentPoint.ToString();
|
}
|
|
private void TalentSkillUpdate(int _skillId)
|
{
|
if (_skillId == model.selectSkill)
|
{
|
DisplaySkillInfo();
|
DisplayConditions();
|
DisplaySkillEffect();
|
DisplayLevelUp();
|
}
|
}
|
|
private void TalentPointUpdate()
|
{
|
DisplayTalentPoint();
|
}
|
|
private void OnSelectTalentTypeEvnet()
|
{
|
model.selectSeries = 1;
|
DisplaySkills();
|
DisplaySelectSkill();
|
DisplayTalentType();
|
}
|
|
private void OnSelectSeriesEvent()
|
{
|
DisplaySkills();
|
DisplaySelectSkill();
|
}
|
|
private void OnSelectSkillEvent()
|
{
|
DisplaySelectSkill();
|
DisplayLevelUp();
|
}
|
|
private void SelectTalentType()
|
{
|
if (model.talentTypeCount > 1)
|
{
|
model.selectTalentType = model.selectTalentType == model.GetTalentType(0) ?
|
model.GetTalentType(1) : model.GetTalentType(0);
|
}
|
}
|
|
private void DisplayLevelUp()
|
{
|
TalentSkill talent;
|
if (model.TryGetTalent(model.selectSkill, out talent))
|
{
|
m_AddPointBtnText.text = talent.level >= talent.maxLevel ? Language.Get("TalentHighestLevel") : Language.Get("TalentLevelUp");
|
}
|
}
|
|
private void AddPoint()
|
{
|
TalentSkill talent;
|
if (model.TryGetTalent(model.selectSkill, out talent))
|
{
|
int error;
|
if (!model.SatisfyLevelUp(model.selectSkill, out error))
|
{
|
model.ProcessLevelUpError(model.selectSkill, error);
|
return;
|
}
|
else
|
{
|
C0304_tagCAddSkillPoint pak = new C0304_tagCAddSkillPoint();
|
pak.SkillID = (ushort)model.selectSkill;
|
GameNetSystem.Instance.SendInfo(pak);
|
}
|
}
|
}
|
|
private void ResetPoint()
|
{
|
if (model.GetAllTalentPoint() <= 0)
|
{
|
SysNotifyMgr.Instance.ShowTip("NoNeedResetTalentPoint");
|
return;
|
}
|
var count = pack.GetItemCountByID(PackType.Item, model.talentResetBook);
|
var config = ItemConfig.Get(model.talentResetBook);
|
if (count > 0)
|
{
|
ConfirmCancel.ShowItemConfirm(Language.Get("TalentResetRequire", config.ItemName), model.talentResetBook, 1, () =>
|
{
|
CA550_tagCMResetMasterSkill pak = new CA550_tagCMResetMasterSkill();
|
GameNetSystem.Instance.SendInfo(pak);
|
});
|
}
|
else
|
{
|
ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"), Language.Get("LackTalentBook",
|
config.ItemName, model.talentResetBookCost), (bool isOk) =>
|
{
|
if (isOk)
|
{
|
if (UIHelper.GetMoneyCnt(1) < (ulong)model.talentResetBookCost)
|
{
|
WindowCenter.Instance.Open<RechargeTipWin>();
|
}
|
else
|
{
|
CA550_tagCMResetMasterSkill pak = new CA550_tagCMResetMasterSkill();
|
GameNetSystem.Instance.SendInfo(pak);
|
}
|
}
|
});
|
}
|
}
|
|
void DisplayTalentLayout(TalentTreeScriptable config)
|
{
|
m_Scroller.content.sizeDelta = config.contentSizeDelta;
|
for (int i = 0; i < config.skillCount; i++)
|
{
|
var element = config.GetTalentElement(i);
|
if (i < m_TalentSkills.Count)
|
{
|
m_TalentSkills[i].transform.localPosition = element.position;
|
}
|
}
|
var index = 0;
|
for (int i = 0; i < config.arrowCount; i++)
|
{
|
var element = config.GetArrowElement(i);
|
if (i < m_Arrows.Count)
|
{
|
var arrow = m_Arrows[i];
|
arrow.gameObject.SetActive(true);
|
arrow.transform.localPosition = element.position;
|
arrow.transform.localEulerAngles = element.rotation;
|
arrow.rectTransform.sizeDelta = element.sizeDelta;
|
arrow.SetSprite(element.iconKey);
|
index++;
|
}
|
}
|
for (int i = index; i < m_Arrows.Count; i++)
|
{
|
m_Arrows[i].gameObject.SetActive(false);
|
}
|
}
|
|
int Compare(int x, int y)
|
{
|
var configx = TalentConfig.Get(x);
|
var configy = TalentConfig.Get(y);
|
if (configx != null && configy != null)
|
{
|
return configx.order.CompareTo(configy.order);
|
}
|
return 0;
|
}
|
|
#if UNITY_EDITOR
|
[ContextMenu("应用位置数据")]
|
void ApplyPositionToScriptable()
|
{
|
if (m_EditorScriptable == null)
|
{
|
return;
|
}
|
var count = 0;
|
for (int i = 0; i < m_TalentSkills.Count; i++)
|
{
|
if (m_TalentSkills[i].gameObject.activeSelf)
|
{
|
m_EditorScriptable.ApplyTalentElement(count, m_TalentSkills[i].transform.localPosition);
|
count++;
|
}
|
}
|
m_EditorScriptable.SyncTalentElementsCount(count);
|
count = 0;
|
if (m_Arrows != null)
|
{
|
for (int i = 0; i < m_Arrows.Count; i++)
|
{
|
if (m_Arrows[i].gameObject.activeSelf)
|
{
|
m_EditorScriptable.ApplyArrowElement(count, m_Arrows[i].transform.localPosition,
|
m_Arrows[i].rectTransform.sizeDelta, m_Arrows[i].transform.localEulerAngles,
|
m_Arrows[i].sprite.name.Equals(m_StraightArrowName) ? "Talent_StraightArrow" : "Talent_TurnArrow");
|
count++;
|
}
|
}
|
m_EditorScriptable.SyncArrowElementsCount(count);
|
}
|
}
|
#endif
|
}
|
}
|
|
|
|
|