//--------------------------------------------------------
|
// [Author]: 第二世界
|
// [ Date ]: Wednesday, February 20, 2019
|
//--------------------------------------------------------
|
|
using System;
|
using System.Collections;
|
using System.Collections.Generic;
|
using UnityEngine;
|
using UnityEngine.UI;
|
|
namespace Snxxz.UI
|
{
|
[XLua.Hotfix]
|
public class TreasureSkillWin : Window
|
{
|
[SerializeField] ScrollerController m_Controller;
|
|
[SerializeField] SkillWidget m_SkillNow;
|
[SerializeField] Transform m_ContainerMax;
|
|
[SerializeField] Button m_SkillExpertBtn;
|
[SerializeField] SkillExpertWidget m_SkillExpert;
|
[SerializeField] RedpointBehaviour m_SelectRedpoint;
|
[SerializeField] SkillExpertBehaviour[] m_SkillExpertBehaviours;
|
|
[SerializeField] Button m_LevelUp;
|
[SerializeField] Text m_LevelUpLabel;
|
[SerializeField] RedpointBehaviour m_LevelRedpoint;
|
|
[SerializeField] Image m_DragSkillIcon;
|
|
TreasureSkillModel model
|
{
|
get { return ModelCenter.Instance.GetModel<TreasureSkillModel>(); }
|
}
|
|
PackModel packModel
|
{
|
get { return ModelCenter.Instance.GetModel<PackModel>(); }
|
}
|
|
SkillModel skillModel { get { return ModelCenter.Instance.GetModel<SkillModel>(); } }
|
|
#region Built-in
|
protected override void BindController()
|
{
|
}
|
|
protected override void AddListeners()
|
{
|
m_Controller.OnRefreshCell += OnRefreshCell;
|
m_LevelUp.AddListener(LevelUp);
|
m_SkillExpertBtn.AddListener(OpenExpert);
|
}
|
|
protected override void OnPreOpen()
|
{
|
SetDefaultSelect();
|
|
model.selectActivePriority = false;
|
|
m_DragSkillIcon.gameObject.SetActive(false);
|
|
Display();
|
|
List<int> list;
|
if (model.TryGetSkills(out list))
|
{
|
var index = list.IndexOf(model.selectSkill);
|
if (index != -1)
|
{
|
m_Controller.JumpIndex(index);
|
}
|
}
|
|
model.treasureSkillRefresh += TreasureSkillRefresh;
|
model.selectRefresh += SelectRefresh;
|
model.skillLevelUpRefresh += SkillLevelUpRefresh;
|
packModel.refreshItemCountEvent += RefreshItemCountEvent;
|
model.expertSkillRefresh += ExpertSkillRefresh;
|
WindowCenter.Instance.windowAfterCloseEvent += WindowAfterCloseEvent;
|
FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
|
}
|
|
protected override void OnAfterOpen()
|
{
|
}
|
|
protected override void OnPreClose()
|
{
|
model.treasureSkillRefresh -= TreasureSkillRefresh;
|
model.selectRefresh -= SelectRefresh;
|
model.skillLevelUpRefresh -= SkillLevelUpRefresh;
|
packModel.refreshItemCountEvent -= RefreshItemCountEvent;
|
model.expertSkillRefresh -= ExpertSkillRefresh;
|
WindowCenter.Instance.windowAfterCloseEvent -= WindowAfterCloseEvent;
|
FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
|
model.SetAlreadyRemind();
|
}
|
|
protected override void OnAfterClose()
|
{
|
}
|
#endregion
|
|
void SetDefaultSelect()
|
{
|
var _skill = 0;
|
List<int> list;
|
if (model.TryGetSkills(out list))
|
{
|
foreach (var skillId in list)
|
{
|
TreasureSkill skill;
|
if (model.TryGetSkill(skillId, out skill))
|
{
|
if (_skill == 0 && skill.level > 0)
|
{
|
_skill = skillId;
|
}
|
if (skill.redpoint.state == RedPointState.Simple)
|
{
|
_skill = skillId;
|
}
|
if (model.selectActivePriority && skill.expertRedpoint.state == RedPointState.Simple)
|
{
|
_skill = skillId;
|
break;
|
}
|
}
|
}
|
if (_skill == 0)
|
{
|
_skill = list[0];
|
}
|
}
|
model.selectSkill = _skill;
|
}
|
|
private void Display()
|
{
|
DisplaySkills();
|
DisplaySkillDetial();
|
DisplayExpertSkill();
|
DisplayButtonState();
|
|
TryStartGuide();
|
}
|
|
private void DisplaySkills()
|
{
|
List<int> list;
|
m_Controller.Refresh();
|
if (model.TryGetSkills(out list))
|
{
|
for (int i = 0; i < list.Count; i++)
|
{
|
m_Controller.AddCell(ScrollerDataType.Header, list[i]);
|
}
|
}
|
m_Controller.Restart();
|
}
|
|
void DisplayButtonState()
|
{
|
m_LevelUp.SetColorful(m_LevelUpLabel, FuncOpen.Instance.IsFuncOpen(177));
|
}
|
|
void DisplaySkillDetial()
|
{
|
TreasureSkill skill;
|
if (model.TryGetSkill(model.selectSkill, out skill))
|
{
|
m_LevelRedpoint.redpointId = skill.levelUpRedpoint.id;
|
m_SelectRedpoint.redpointId = skill.expertSelectRedpoint.id;
|
|
var config = skill.GetSkillConfig(skill.level);
|
if (config == null)
|
{
|
return;
|
}
|
|
m_SkillNow.Display(skill.skillId, skill.level);
|
|
bool isMax = skill.level >= skill.maxLevel;
|
m_ContainerMax.gameObject.SetActive(isMax);
|
m_LevelUp.gameObject.SetActive(!isMax);
|
}
|
}
|
|
void DisplayExpertSkill()
|
{
|
var skillId = 0;
|
var level = 0;
|
if (model.TryGetExpertSkill(model.selectSkill, out skillId))
|
{
|
TreasurePotential potential;
|
if (model.TryGetPotential(skillId, out potential))
|
{
|
level = potential.level;
|
}
|
}
|
m_SkillExpert.Display(skillId, level);
|
|
DisplayExpertSkills();
|
}
|
|
void DisplayExpertSkills()
|
{
|
TreasureSkill skill;
|
if (model.TryGetSkill(model.selectSkill, out skill))
|
{
|
for (int i = 0; i < m_SkillExpertBehaviours.Length; i++)
|
{
|
var potential = skill.potentials[i];
|
var level = 0;
|
var isUnlock = model.TryGetExpertActiveLevel(potential.id, out level) && level > 0;
|
m_SkillExpertBehaviours[i].Display(potential.id, isUnlock);
|
}
|
}
|
}
|
|
private void ExpertSelect()
|
{
|
ExpertSkillSelectWin.skillId = model.selectSkill;
|
WindowCenter.Instance.Open<ExpertSkillSelectWin>();
|
}
|
|
private void LevelUp()
|
{
|
if (!FuncOpen.Instance.IsFuncOpen(177))
|
{
|
FuncOpen.Instance.ProcessorFuncErrorTip(177);
|
return;
|
}
|
TreasureSkillLevelUpWin.skillId = model.selectSkill;
|
WindowCenter.Instance.Open<TreasureSkillLevelUpWin>();
|
}
|
|
private void OnRefreshCell(ScrollerDataType type, CellView cell)
|
{
|
var skillCell = cell as TreasureSkillCell;
|
skillCell.Display(cell.index);
|
}
|
|
private void WindowAfterCloseEvent(Window win)
|
{
|
if (win is ExpertSkillSelectWin)
|
{
|
TryStartGuide();
|
}
|
}
|
|
private void TreasureSkillRefresh(int skillId)
|
{
|
m_Controller.m_Scorller.RefreshActiveCellViews();
|
if (skillId == model.selectSkill)
|
{
|
DisplaySkillDetial();
|
}
|
}
|
|
private void SelectRefresh()
|
{
|
m_Controller.m_Scorller.RefreshActiveCellViews();
|
DisplaySkillDetial();
|
DisplayExpertSkill();
|
|
TryStartGuide();
|
}
|
|
private void SkillLevelUpRefresh(int id)
|
{
|
if (model.selectSkill == id)
|
{
|
m_Controller.m_Scorller.RefreshActiveCellViews();
|
DisplaySkillDetial();
|
}
|
}
|
|
private void ExpertSkillRefresh()
|
{
|
DisplayExpertSkill();
|
m_Controller.m_Scorller.RefreshActiveCellViews();
|
|
TryStartGuide();
|
}
|
|
private void RefreshItemCountEvent(PackType packType, int arg2, int itemId)
|
{
|
if (packType == PackType.Item && model.skillLevelUpItems.Contains(itemId))
|
{
|
DisplaySkillDetial();
|
}
|
}
|
|
private void OnFuncStateChangeEvent(int id)
|
{
|
if (id == 177)
|
{
|
DisplayButtonState();
|
}
|
}
|
|
void TrySwitchExpertSkill()
|
{
|
var des = RectTransformUtility.CalculateRelativeRectTransformBounds(this.transform, m_SkillExpert.dragAccepter);
|
var src = RectTransformUtility.CalculateRelativeRectTransformBounds(this.transform, m_DragSkillIcon.rectTransform);
|
var dis = Vector3.Distance(des.center, src.center);
|
if (dis < m_SkillExpert.dragAccepter.rect.width / 2)
|
{
|
var skillId = 0;
|
if (model.TryGetExpertSkill(model.selectSkill, out skillId)
|
&& skillId == skillModel.skillDragId)
|
{
|
return;
|
}
|
|
var pak = new CA516_tagCMSelectSkillElement();
|
pak.SkillTypeID = (uint)skillModel.skillDragId;
|
pak.DoType = 1;
|
GameNetSystem.Instance.SendInfo(pak);
|
}
|
}
|
|
void TryStartGuide()
|
{
|
if (NewBieCenter.Instance.inGuiding)
|
{
|
return;
|
}
|
if (!NewBieCenter.Instance.IsGuideCompleted(62))
|
{
|
var skill = 0;
|
if (model.ExistAnyActiveExpert(model.selectSkill)
|
&& !WindowCenter.Instance.IsOpen<ExpertSkillSelectWin>()
|
&& !model.TryGetExpertSkill(model.selectSkill, out skill))
|
{
|
NewBieCenter.Instance.StartNewBieGuide(62);
|
}
|
}
|
}
|
|
private void OpenExpert()
|
{
|
var skillId = 0;
|
if (model.TryGetExpertSkill(model.selectSkill, out skillId))
|
{
|
ExpertSkillSelectWin.skillId = skillId;
|
WindowCenter.Instance.Open<ExpertSkillSelectWin>();
|
}
|
}
|
|
protected override void LateUpdate()
|
{
|
base.LateUpdate();
|
if (skillModel.skillDraging)
|
{
|
if (!m_DragSkillIcon.gameObject.activeSelf)
|
{
|
m_DragSkillIcon.gameObject.SetActive(true);
|
var config = SkillConfig.Get(skillModel.skillDragId);
|
if (config != null)
|
{
|
m_DragSkillIcon.SetSprite(config.IconName);
|
}
|
}
|
Vector2 _pos;
|
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(this.transform as RectTransform,
|
Input.mousePosition, CameraManager.uiCamera, out _pos))
|
{
|
m_DragSkillIcon.rectTransform.localPosition = _pos;
|
}
|
|
if (Input.GetMouseButtonUp(0))
|
{
|
skillModel.skillDraging = false;
|
TrySwitchExpertSkill();
|
m_DragSkillIcon.gameObject.SetActive(false);
|
}
|
}
|
}
|
|
[Serializable]
|
public class SkillWidget
|
{
|
[SerializeField] Transform m_Container;
|
[SerializeField] Text m_SkillLevel;
|
[SerializeField] Text m_SkillCoolDown;
|
[SerializeField] Text m_SkillDesc;
|
|
TreasureSkillModel model { get { return ModelCenter.Instance.GetModel<TreasureSkillModel>(); } }
|
|
public void Display(int skillId, int level)
|
{
|
m_SkillLevel.text = Language.Get("SkillActLevel", level);
|
TreasureSkill skill;
|
model.TryGetSkill(skillId, out skill);
|
var skillConfig = skill.GetSkillConfig(level);
|
m_SkillCoolDown.text = skillConfig.CoolDownTime == 0 ? string.Empty
|
: Language.Get("L1065", skillConfig.CoolDownTime / 1000);
|
m_SkillDesc.text = skillConfig.Description;
|
}
|
|
public void SetActive(bool active)
|
{
|
m_Container.gameObject.SetActive(active);
|
}
|
}
|
|
[Serializable]
|
public class SkillExpertWidget
|
{
|
[SerializeField] RectTransform m_DragAccepter;
|
[SerializeField] Image m_SkillIcon;
|
[SerializeField] Text m_SkillName;
|
[SerializeField] Transform m_ContainerReikiIcon;
|
[SerializeField] Image[] m_ReikiIcons;
|
[SerializeField] Text m_UnSelectRemind;
|
[SerializeField] Text m_Description;
|
|
public RectTransform dragAccepter
|
{
|
get { return m_DragAccepter; }
|
}
|
|
TreasureSkillModel model { get { return ModelCenter.Instance.GetModel<TreasureSkillModel>(); } }
|
|
public void Display(int skillId, int level)
|
{
|
m_SkillIcon.gameObject.SetActive(skillId != 0);
|
m_SkillName.gameObject.SetActive(skillId != 0);
|
m_UnSelectRemind.gameObject.SetActive(skillId == 0);
|
m_Description.gameObject.SetActive(false);
|
|
|
m_ContainerReikiIcon.gameObject.SetActive(skillId != 0);
|
|
if (skillId != 0)
|
{
|
SkillConfig skillConfig;
|
if (level == 0)
|
{
|
skillConfig = SkillConfig.Get(skillId);
|
}
|
else
|
{
|
skillConfig = SkillConfig.Get(skillId + level - 1);
|
}
|
|
m_SkillIcon.SetSprite(skillConfig.IconName);
|
m_SkillName.text = skillConfig.SkillName;
|
|
var property = skillConfig.RequireProperty();
|
var propertyConfig = PlayerPropertyConfig.Get(property);
|
|
m_ReikiIcons[0].gameObject.SetActive(property == (int)PropertyType.Mater);
|
m_ReikiIcons[1].gameObject.SetActive(property == (int)PropertyType.Wood);
|
m_ReikiIcons[2].gameObject.SetActive(property == (int)PropertyType.Water);
|
m_ReikiIcons[3].gameObject.SetActive(property == (int)PropertyType.Fire);
|
m_ReikiIcons[4].gameObject.SetActive(property == (int)PropertyType.Earth);
|
|
if (level == 0)
|
{
|
var conditionLabel = string.Format("({0}{1}激活)", propertyConfig.Name, skillConfig.RequirePropertyValue());
|
conditionLabel = UIHelper.AppendColor(TextColType.Red, conditionLabel, true);
|
m_Description.text = StringUtility.Contact(skillConfig.Description, conditionLabel);
|
m_Description.color = UIHelper.s_BrightWhiteColor;
|
}
|
else
|
{
|
m_Description.text = skillConfig.Description;
|
m_Description.color = UIHelper.s_NavyBrown;
|
}
|
}
|
}
|
}
|
}
|
}
|
|
|
|
|