//--------------------------------------------------------
|
// [Author]: 第二世界
|
// [ Date ]: Monday, November 20, 2017
|
//--------------------------------------------------------
|
|
|
using System;
|
using System.Collections;
|
using System.Collections.Generic;
|
using UnityEngine;
|
using UnityEngine.UI;
|
|
using System.Linq;
|
|
namespace Snxxz.UI
|
{
|
|
public class RuneMosaicWin : Window
|
{
|
[SerializeField] List<RuneDisplay> runeHoleDatas;
|
[SerializeField] List<Button> runeHoleBtns;
|
[SerializeField] RectTransform m_ContainerSelectRune;
|
|
[SerializeField] Button m_RuneLevelUpBtn;
|
[SerializeField] Text m_LevelUpBtnTxt;
|
[SerializeField] Text m_ReplaceBtnTxt;
|
[SerializeField] Button m_RuneReplaceBtn;
|
[SerializeField] Button m_RunePreviewBtn;
|
|
[SerializeField] Image presentRuneImg;
|
[SerializeField] Text presentRuneNameTxt;
|
[SerializeField] Text presentRuneAttrTxt;
|
|
//[SerializeField] RectTransform m_ContainerLevelUp;
|
[SerializeField] RectTransform m_ContainerLvUp1;
|
[SerializeField] RectTransform m_ContainerLvUp2;
|
[SerializeField] RectTransform m_ContainerItem;
|
[SerializeField] RectTransform m_ContaienrMaxLevel;
|
[SerializeField] Text runeLevelUpAttr1;
|
[SerializeField] Text runeLevelUpAttr2;
|
[SerializeField] Text runeLevelUpAttrNum1;
|
[SerializeField] Text runeLevelUpAttrNum2;
|
[SerializeField] Text runeLevelUpItemNum;
|
|
[SerializeField] RectTransform m_ContainerGetRune;
|
[SerializeField] Button m_GotoGetRuneBtn;
|
[SerializeField] Button m_GotoFindRune;
|
|
[SerializeField] RectTransform m_ContainerSpecial;
|
[SerializeField] Button m_UnlockSpecialHole;
|
[SerializeField] Text m_SpecialCostRemind;
|
[SerializeField] Text m_SpecialLevelRemind;
|
|
[SerializeField] Text m_RuneUnlockTip;
|
[SerializeField] UIEffect m_RuneLvUpEffect;
|
[SerializeField] UIEffect m_SpecialHoleEffect;
|
|
Color m_LevelUpCacheColor;
|
|
bool selectSpeicalHole = false;
|
|
RuneModel m_Model;
|
RuneModel model
|
{
|
get
|
{
|
return m_Model ?? (m_Model = ModelCenter.Instance.GetModel<RuneModel>());
|
}
|
}
|
|
bool m_IsRuneLvUp = false;
|
int m_SpecialHoleUnlocking = -1;
|
Coroutine m_CacheCoroutine;
|
#region Built-in
|
protected override void BindController()
|
{
|
m_LevelUpCacheColor = m_LevelUpBtnTxt.color;
|
}
|
|
protected override void AddListeners()
|
{
|
m_RuneReplaceBtn.onClick.AddListener(OnRuneReplaceBtn);
|
m_RuneLevelUpBtn.onClick.AddListener(OnRuneUpBtn);
|
m_RunePreviewBtn.onClick.AddListener(OnRunePreviewBtn);
|
m_GotoGetRuneBtn.onClick.AddListener(OnGotoGetRune);
|
m_GotoFindRune.onClick.AddListener(GotoFindRune);
|
m_UnlockSpecialHole.onClick.AddListener(UnlockSpecialHole);
|
for (int i = 0; i < runeHoleBtns.Count; i++)
|
{
|
var _index = i;
|
runeHoleBtns[i].onClick.AddListener(() =>
|
{
|
OnRuneHoleClick(_index);
|
});
|
}
|
}
|
|
protected override void OnPreOpen()
|
{
|
model.OnRefreshRuneHole += OnRuneHoleRefresh;
|
model.OnRefreshRuneExp += OnUpdateRuneHoleInfo;
|
model.openNewHoleEvent += OpenNewHoleEvent;
|
|
m_RuneLevelUpBtn.gameObject.SetActive(false);
|
m_RuneReplaceBtn.gameObject.SetActive(false);
|
m_ContainerGetRune.gameObject.SetActive(false);
|
m_ContainerSpecial.gameObject.SetActive(false);
|
OpenOrCloseSelect(false);
|
model.sltRuneHole = -1;
|
m_SpecialHoleUnlocking = -1;
|
foreach (var _hole in runeHoleDatas)
|
{
|
_hole.SetSelect(false);
|
}
|
InitRuneHoles();
|
}
|
|
protected override void OnAfterOpen()
|
{
|
if (!HandleAchievement())
|
{
|
OnRuneHoleClick(CheckOpenSelect());
|
}
|
model.SetDayRemind();
|
}
|
|
protected override void OnPreClose()
|
{
|
model.OnRefreshRuneHole -= OnRuneHoleRefresh;
|
model.OnRefreshRuneExp -= OnUpdateRuneHoleInfo;
|
model.openNewHoleEvent -= OpenNewHoleEvent;
|
|
m_SpecialHoleUnlocking = -1;
|
|
if (m_CacheCoroutine != null)
|
{
|
StopCoroutine(m_CacheCoroutine);
|
m_CacheCoroutine = null;
|
}
|
}
|
|
protected override void OnAfterClose()
|
{
|
}
|
#endregion
|
|
private void OpenNewHoleEvent(int hole)
|
{
|
if (model.IsSpeicalHole(hole))
|
{
|
m_SpecialHoleUnlocking = hole;
|
EffectMgr.Instance.PlayUIEffect(3068, 2500, runeHoleDatas[hole].Container.parent, false);
|
m_CacheCoroutine = StartCoroutine(Co_RefreshHole());
|
}
|
}
|
|
IEnumerator Co_RefreshHole()
|
{
|
yield return WaitingForSecondConst.WaitMS800;
|
m_SpecialHoleUnlocking = -1;
|
OnRuneHoleRefresh();
|
}
|
|
private void UnlockSpecialHole()
|
{
|
model.UnlockSpecialHole(model.sltRuneHole);
|
}
|
|
private void OnGotoGetRune()
|
{
|
WindowJumpMgr.Instance.WindowJumpTo(JumpUIType.RuneTower);
|
}
|
|
private void GotoFindRune()
|
{
|
WindowJumpMgr.Instance.WindowJumpTo(JumpUIType.RuneXB);
|
}
|
|
bool HandleAchievement()
|
{
|
if (AchievementGoto.achievementType == AchievementGoto.RuneLevelUp)
|
{
|
int _hole = 0;
|
if (model.CanLevelUpRune(out _hole))
|
{
|
OnRuneHoleClick(_hole);
|
var _effect = AchievementGuideEffectPool.Require(1);
|
_effect.transform.SetParentEx(m_RuneLevelUpBtn.transform, Vector3.zero, Vector3.zero, Vector3.one);
|
return true;
|
}
|
else
|
{
|
SysNotifyMgr.Instance.ShowTip("Achievement_45");
|
}
|
AchievementGoto.achievementType = 0;
|
}
|
var _color = AchievementGoto.guideAchievementId == AchievementGoto.EquipRune1 ? 1 :
|
AchievementGoto.guideAchievementId == AchievementGoto.EquipRune2 ? 2 : 0;
|
if (_color > 0)
|
{
|
int _hole = 0;
|
if (model.CanEquipRune(_color, out _hole))
|
{
|
OnRuneHoleClick(_hole);
|
var _effect = AchievementGuideEffectPool.Require(1);
|
_effect.transform.SetParentEx(m_RuneReplaceBtn.transform, Vector3.zero, Vector3.zero, Vector3.one);
|
return true;
|
}
|
else
|
{
|
SysNotifyMgr.Instance.ShowTip("Achievement_44");
|
}
|
AchievementGoto.guideAchievementId = 0;
|
}
|
return false;
|
}
|
|
void OpenOrCloseSelect(bool _open)
|
{
|
m_ContainerSelectRune.gameObject.SetActive(_open);
|
m_RuneLevelUpBtn.interactable = _open;
|
m_LevelUpBtnTxt.color = _open ? m_LevelUpCacheColor : Color.grey;
|
}
|
|
int CheckOpenSelect()
|
{
|
if (model.specialRuneRemindRedpoint.state == RedPointState.Simple && !NewBieCenter.Instance.inGuiding)
|
{
|
foreach (var hole in model.specialHoles.Keys)
|
{
|
if (!model.IsRuneHoleOpen(hole))
|
{
|
return hole;
|
}
|
}
|
}
|
for (int i = 0; i < RuneModel.RUNE_HOLE_COUNT; i++)
|
{
|
if (model.GetRedpoint(i).state == RedPointState.Simple)
|
{
|
return i;
|
}
|
}
|
return 0;
|
}
|
|
void DisSelectAll()
|
{
|
for (int i = 0; i < RuneModel.RUNE_HOLE_COUNT; i++)
|
{
|
runeHoleDatas[i].SetSelect(false);
|
runeHoleDatas[i].redpoint.gameObject.SetActive(true);
|
}
|
}
|
|
void OnRuneHoleClick(int _hole)
|
{
|
if (model.IsRuneHoleOpen(_hole) && m_SpecialHoleUnlocking != _hole)
|
{
|
for (int i = 0; i < runeHoleDatas.Count; i++)
|
{
|
if (i != _hole)
|
{
|
runeHoleDatas[i].SetSelect(false);
|
runeHoleDatas[i].redpoint.gameObject.SetActive(true);
|
}
|
}
|
model.sltRuneHole = _hole;
|
m_RuneUnlockTip.gameObject.SetActive(true);
|
m_ContainerSpecial.gameObject.SetActive(false);
|
m_RuneLevelUpBtn.gameObject.SetActive(true);
|
m_RuneReplaceBtn.gameObject.SetActive(true);
|
OnUpdateRuneHoleInfo();
|
runeHoleDatas[_hole].SetSelect(true);
|
runeHoleDatas[_hole].redpoint.gameObject.SetActive(false);
|
m_ReplaceBtnTxt.text = model.GetHoleRune(_hole) != null ? Language.Get("RuneMosaic_6") : Language.Get("KnapS120");
|
}
|
else
|
{
|
if (model.IsSpeicalHole(_hole))
|
{
|
DisplaySpecialHole(_hole);
|
}
|
else
|
{
|
int[] towerArray = model.runeUnlockArray;
|
RuneTowerFloorConfig cfg = RuneTowerFloorConfig.Get(towerArray[_hole]);
|
var tower = RuneTowerConfig.Get(cfg.TowerId);
|
SysNotifyMgr.Instance.ShowTip("RuneUnlock", StringUtility.Contact(tower.TowerName, cfg.FloorName));
|
}
|
}
|
}
|
|
private void DisplaySpecialHole(int _hole)
|
{
|
m_ContainerSpecial.gameObject.SetActive(true);
|
m_ContainerSelectRune.gameObject.SetActive(false);
|
m_ContainerGetRune.gameObject.SetActive(false);
|
m_RuneLevelUpBtn.gameObject.SetActive(false);
|
m_RuneReplaceBtn.gameObject.SetActive(false);
|
m_RuneUnlockTip.gameObject.SetActive(false);
|
DisSelectAll();
|
model.sltRuneHole = _hole;
|
runeHoleDatas[_hole].SetSelect(true);
|
var speical = model.specialHoles[_hole];
|
m_SpecialCostRemind.text = Language.Get("RuneSpecialHoleCost", speical.cost);
|
m_SpecialLevelRemind.text = Language.Get("RuneSpecialHoleLevel", speical.level);
|
}
|
|
private void OnUpdateRuneHoleInfo()
|
{
|
model.runeLevelUpRedpoint.state = RedPointState.None;
|
model.runeReplaceRedpoint.state = RedPointState.None;
|
if (model.sltRuneHole == -1 || !model.IsRuneHoleOpen(model.sltRuneHole))
|
{
|
return;
|
}
|
if (model.sltRuneHole == m_SpecialHoleUnlocking)
|
{
|
return;
|
}
|
RuneData data = model.GetHoleRune(model.sltRuneHole);
|
|
var _redpoint = model.GetRedpoint(model.sltRuneHole);
|
if (_redpoint.state == RedPointState.Simple)
|
{
|
if (data == null)
|
{
|
model.runeReplaceRedpoint.state = RedPointState.Simple;
|
}
|
else if (model.CanEquipBetterRune(model.sltRuneHole))
|
{
|
model.runeReplaceRedpoint.state = RedPointState.Simple;
|
}
|
else
|
{
|
model.runeLevelUpRedpoint.state = RedPointState.Simple;
|
}
|
}
|
|
OpenOrCloseSelect(false);
|
if (data == null)
|
{
|
m_ContainerGetRune.gameObject.SetActive(true);
|
return;
|
}
|
m_ContainerGetRune.gameObject.SetActive(false);
|
m_LevelUpBtnTxt.color = Color.grey;
|
OpenOrCloseSelect(true);
|
var _runeCfg = RuneConfig.Get(data.id);
|
bool _doubleProperty = _runeCfg.AttrType.Length > 1;
|
m_ContainerLvUp2.gameObject.SetActive(_doubleProperty);
|
var _itemCfg = ItemConfig.Get(data.id);
|
presentRuneImg.SetSprite(_itemCfg.IconKey);
|
presentRuneAttrTxt.text = model.GetRuneAttrStr(data.id, data.lv);
|
presentRuneNameTxt.text = StringUtility.Contact(_itemCfg.ItemName, Language.Get("Z1024", data.lv));
|
presentRuneNameTxt.color = UIHelper.GetUIColor(_itemCfg.ItemColor, true);
|
|
var _propertyCfg = PlayerPropertyConfig.Get(_runeCfg.AttrType[0]);
|
var _propertyValue = model.GetRuneAttrVal(data.id, data.lv, _runeCfg.AttrType[0]);
|
runeLevelUpAttr1.text = StringUtility.Contact(_propertyCfg.Name, "+", UIHelper.ReplacePercentage(_propertyValue, _propertyCfg.ISPercentage,
|
UIHelper.GetPropertyDecimalCount(_propertyCfg.ID)),
|
_propertyCfg.ISPercentage == 1 ? "%" : string.Empty);
|
|
bool _isRuneMaxLv = data.lv >= model.GetRuneMaxLevelByItem(data.id);
|
runeLevelUpAttrNum1.gameObject.SetActive(!_isRuneMaxLv);
|
if (!_isRuneMaxLv)
|
{
|
_propertyValue = model.GetRuneAttrVal(data.id, data.lv + 1, _runeCfg.AttrType[0]);
|
runeLevelUpAttrNum1.text = StringUtility.Contact("+", UIHelper.ReplacePercentage(_propertyValue, _propertyCfg.ISPercentage,
|
UIHelper.GetPropertyDecimalCount(_propertyCfg.ID)),
|
_propertyCfg.ISPercentage == 1 ? "%" : string.Empty);
|
}
|
|
if (_doubleProperty)
|
{
|
_propertyCfg = PlayerPropertyConfig.Get(_runeCfg.AttrType[1]);
|
_propertyValue = model.GetRuneAttrVal(data.id, data.lv, _runeCfg.AttrType[1]);
|
runeLevelUpAttr2.text = StringUtility.Contact(_propertyCfg.Name, "+", UIHelper.ReplacePercentage(_propertyValue, _propertyCfg.ISPercentage,
|
UIHelper.GetPropertyDecimalCount(_propertyCfg.ID)),
|
_propertyCfg.ISPercentage == 1 ? "%" : string.Empty);
|
runeLevelUpAttrNum2.gameObject.SetActive(!_isRuneMaxLv);
|
if (!_isRuneMaxLv)
|
{
|
_propertyValue = model.GetRuneAttrVal(data.id, data.lv + 1, _runeCfg.AttrType[1]);
|
runeLevelUpAttrNum2.text = StringUtility.Contact("+", UIHelper.ReplacePercentage(_propertyValue, _propertyCfg.ISPercentage,
|
UIHelper.GetPropertyDecimalCount(_propertyCfg.ID)),
|
_propertyCfg.ISPercentage == 1 ? "%" : string.Empty);
|
}
|
}
|
int _levelUpExp = model.GetRuneNeedExp(data.id, data.lv);
|
m_RuneLevelUpBtn.interactable = !_isRuneMaxLv /*&& model.RuneSplinters >= _levelUpExp*/;
|
m_LevelUpBtnTxt.color = m_RuneLevelUpBtn.interactable ? m_LevelUpCacheColor : Color.grey;
|
runeLevelUpItemNum.gameObject.SetActive(!_isRuneMaxLv);
|
m_ContainerLvUp1.gameObject.SetActive(!_isRuneMaxLv);
|
m_ContainerLvUp2.gameObject.SetActive(!_isRuneMaxLv && _doubleProperty);
|
m_ContainerItem.gameObject.SetActive(!_isRuneMaxLv);
|
m_RuneLevelUpBtn.gameObject.SetActive(!_isRuneMaxLv);
|
//m_ContainerLevelUp.gameObject.SetActive(!_isRuneMaxLv);
|
m_ContaienrMaxLevel.gameObject.SetActive(_isRuneMaxLv);
|
runeLevelUpItemNum.text = StringUtility.Contact(UIHelper.AppendStringColor(
|
model.RuneSplinters >= _levelUpExp ? TextColType.Green : TextColType.Red
|
, model.RuneSplinters.ToString(), true), "/", _levelUpExp);
|
}
|
|
void InitRuneHoles()
|
{
|
int towerCnt = model.GetOpenTowerCnt();
|
int[] towerArray = model.runeUnlockArray;
|
if (towerCnt >= towerArray.Length)
|
{
|
var _tower = 0;
|
foreach (var _key in model.doublePropRuneInlayDict.Keys)
|
{
|
if (model.RuneTowerOpenLV < _key)
|
{
|
_tower = _key;
|
break;
|
}
|
}
|
if (_tower == 0)
|
{
|
m_RuneUnlockTip.text = Language.Get("L1060", model.doublePropRuneInlayDict.Values.Last());
|
}
|
else
|
{
|
RuneTowerFloorConfig cfg = RuneTowerFloorConfig.Get(_tower);
|
var tower = RuneTowerConfig.Get(cfg.TowerId);
|
m_RuneUnlockTip.text = Language.Get("RuneDoubleAttr", StringUtility.Contact(tower.TowerName, cfg.FloorName)
|
, model.doublePropRuneInlayDict[_tower]);
|
}
|
}
|
else
|
{
|
RuneTowerFloorConfig cfg = RuneTowerFloorConfig.Get(towerArray[towerCnt]);
|
var tower = RuneTowerConfig.Get(cfg.TowerId);
|
m_RuneUnlockTip.text = Language.Get("RuneUnlock", StringUtility.Contact(tower.TowerName, cfg.FloorName));
|
}
|
var speicalHole = -1;
|
for (int i = 0; i < runeHoleDatas.Count; i++)
|
{
|
RuneData data = model.GetHoleRune(i);
|
runeHoleDatas[i].SetRuneHole(!model.IsRuneHoleOpen(i) || m_SpecialHoleUnlocking == i);
|
if (data == null || !model.IsRuneHoleOpen(i))
|
{
|
runeHoleDatas[i].Display(0, 0);
|
}
|
else
|
{
|
runeHoleDatas[i].Display(data.id, data.lv);
|
}
|
if (model.IsSpeicalHole(i))
|
{
|
speicalHole = i;
|
}
|
}
|
m_SpecialHoleEffect.StopImediatly();
|
if (speicalHole != -1)
|
{
|
if (!model.IsRuneHoleOpen(speicalHole))
|
{
|
m_SpecialHoleEffect.Play();
|
}
|
}
|
}
|
|
void OnRuneHoleRefresh()
|
{
|
InitRuneHoles();
|
OnUpdateRuneHoleInfo();
|
if (model.sltRuneHole != -1)
|
{
|
OnRuneHoleClick(model.sltRuneHole);
|
}
|
if (m_IsRuneLvUp)
|
{
|
m_RuneLvUpEffect.Play();
|
m_IsRuneLvUp = false;
|
}
|
}
|
|
private void OnRuneReplaceBtn()
|
{
|
WindowCenter.Instance.Open<RunePackWin>();
|
}
|
|
private void OnRunePreviewBtn()
|
{
|
WindowCenter.Instance.Open<RunePreviewWin>();
|
}
|
|
void OnRuneUpBtn()
|
{
|
RuneData data = model.GetHoleRune(model.sltRuneHole);
|
if (data == null)
|
{
|
return;
|
}
|
var _runeCfg = RuneConfig.Get(data.id);
|
var _itemCfg = ItemConfig.Get(data.id);
|
if (data.lv >= model.GetRuneMaxLevelByItem(data.id))
|
{
|
return;
|
}
|
float _levelUpExp = model.GetRuneNeedExp(data.id, data.lv);
|
if (model.RuneSplinters < _levelUpExp)
|
{
|
SysNotifyMgr.Instance.ShowTip("RuneEssenceLack");
|
return;
|
}
|
m_IsRuneLvUp = true;
|
CA565_tagCMRuneUp runeUpPack = new CA565_tagCMRuneUp();
|
runeUpPack.PlaceIndex = (ushort)data.index;
|
runeUpPack.PlaceType = (byte)data.placetype;
|
GameNetSystem.Instance.SendInfo(runeUpPack);
|
}
|
[Serializable]
|
public class RuneDisplay
|
{
|
[SerializeField] Image m_RuneIcon;
|
[SerializeField] Image m_RuneUnlock;
|
[SerializeField] Text m_RuneNameLvTxt;
|
[SerializeField] Image m_RuneSelect;
|
[SerializeField] Image m_RuneAdd;
|
[SerializeField] UIEffect m_Effect;
|
[SerializeField] RedpointBehaviour m_Redpoint;
|
|
RuneModel m_Model;
|
RuneModel model { get { return m_Model ?? (m_Model = ModelCenter.Instance.GetModel<RuneModel>()); } }
|
|
RuneComposeModel runeComposeModel { get { return ModelCenter.Instance.GetModel<RuneComposeModel>(); } }
|
|
public RectTransform Container
|
{
|
get
|
{
|
return m_RuneIcon.rectTransform;
|
}
|
}
|
|
public RedpointBehaviour redpoint { get { return m_Redpoint; } }
|
|
public void Display(int _runeId, int _lv)
|
{
|
m_RuneIcon.gameObject.SetActive(_runeId != 0);
|
m_RuneNameLvTxt.gameObject.SetActive(_runeId != 0);
|
m_RuneAdd.gameObject.SetActive(_runeId == 0);
|
var _itemCfg = ItemConfig.Get(_runeId);
|
if (_itemCfg != null)
|
{
|
m_RuneIcon.SetSprite(_itemCfg.IconKey);
|
m_RuneNameLvTxt.color = UIHelper.GetUIColor(_itemCfg.ItemColor);
|
}
|
m_RuneNameLvTxt.text = Language.Get("Z1024", _lv);
|
if (_runeId != 0 && runeComposeModel.m_RuneBothPropertys.Contains(_runeId))
|
{
|
if (!m_Effect.IsPlaying)
|
{
|
m_Effect.Play();
|
}
|
}
|
else
|
{
|
if (m_Effect.IsPlaying)
|
{
|
m_Effect.StopImediatly();
|
}
|
}
|
}
|
|
public void SetRuneHole(bool _lock)
|
{
|
m_RuneUnlock.gameObject.SetActive(_lock);
|
m_RuneAdd.gameObject.SetActive(!_lock);
|
}
|
|
public void SetSelect(bool _select)
|
{
|
m_RuneSelect.gameObject.SetActive(_select);
|
}
|
}
|
}
|
|
}
|
|
|
|
|