/// #pkgName FGUI包名
/// #panelName UIPanel名字
/// #UIName = $"{#pkgName}{#panelName}" UIKey名字
/// 该脚本由模板创建
/// created by cb 2024
using FairyGUI;
using FL.Data;
using FL.Network;
using System.Collections.Generic;
using Unity.Jobs;
using XGame.Database;
using XGame.Framework.UI;
using XGame.Framework.Utils;
namespace FL.FGUI
{
///
/// UI逻辑处理类
///
///
public partial class PlayerAwakePanelCtrl : UIController
{
private bool _bShowPlansName; // 方案名称下拉列表UI是否显示状态
private int _selectPlanIndex; // 当前选中的方案索引
private int _selectImprint; // 当前选中的印记索引
private int _awakeItemId; // 觉醒道具id
private int _awakeCostVal; // 觉醒需要的道具数量
private int _upgradeItemId; // 升级印记道具id
private int _upgradeCostVal;// 升级需要的道具数量
private List _imprintItemList;
private List _runeTableList;
private int[] _runeIdArray; // 印记槽位镶嵌的符文id数组
protected override void OnEnable(object intent)
{
AddUIListenres();
AddEventListner();
InitUI();
ShowUI();
}
protected override void OnDisable()
{
RemoveUIListenres();
RemoveEventListner();
_selectImprint = 0;
if (_imprintItemList != null)
{
_imprintItemList.Clear();
_imprintItemList = null;
}
if (_runeTableList != null)
{
_runeTableList.Clear();
_runeTableList = null;
}
if (_runeIdArray != null) _runeIdArray = null;
}
#region UI事件
private void AddUIListenres()
{
VM.PlansNameBtn.onClick.Add(OnClickPlansNameBtn);
VM.RenameBtn.onClick.Add(OnClickRenameBtn);
VM.WakeupBtn.onClick.Add(OnClickWakeupBtn);
VM.ResetBtn.onClick.Add(OnClickResetBtn);
VM.ChangeImprintBtn.onClick.Add(OnClickChangeImprintBtn);
VM.BackBtn.onClick.Add(OnClickBackBtn);
VM.UpgradeBtn.onClick.Add(OnClickUpgradeBtn);
VM.TenBtn.onClick.Add(OnClickTenBtn);
}
private void RemoveUIListenres()
{
VM.PlansNameBtn.onClick.Remove(OnClickPlansNameBtn);
VM.RenameBtn.onClick.Remove(OnClickRenameBtn);
VM.WakeupBtn.onClick.Remove(OnClickWakeupBtn);
VM.ResetBtn.onClick.Remove(OnClickResetBtn);
VM.ChangeImprintBtn.onClick.Remove(OnClickChangeImprintBtn);
VM.BackBtn.onClick.Remove(OnClickBackBtn);
VM.UpgradeBtn.onClick.Remove(OnClickUpgradeBtn);
VM.TenBtn.onClick.Remove(OnClickTenBtn);
}
///
/// 显示方案选择列表
///
///
private void OnClickPlansNameBtn(EventContext context)
{
ShowPlansNameNestedItem(!_bShowPlansName);
}
///
/// 修改方案名
///
///
private void OnClickRenameBtn(EventContext context)
{
var param = new RenameParam()
{
title = StringDefine.AwakeRenameTitle,
tipsDesc = StringDefine.AwakeRenameDesc,
limitWordCount = 5,
renameCallback = RenameCallback,
};
Context.UI.OpenAsync(UIKeys.CommonRenamePanel, param);
}
///
/// 随机觉醒按钮
///
///
private void OnClickWakeupBtn(EventContext context)
{
if (VM.AwakeCtrl.selectedIndex == 1)
{
// 前往觉醒
Context.UI.OpenAsync(UIKeys.PlayerTransferPanel);
Context.ClosePanel();
return;
}
else if (VM.AwakeCtrl.selectedIndex == 2)
{
// 职业预览
Context.UI.OpenAsync(UIKeys.PlayerJobCareerPreviewPanel);
Context.ClosePanel();
return;
}
// 随机觉醒槽位(符文)
if (!ItemService.Instance.IsEnough(_awakeItemId, _awakeCostVal, true))
return;
PlayerService.Instance.SendToWakeupRune();
}
private void OnClickResetBtn(EventContext context)
{
ConfirmationBoxParam dialogParam = new ConfirmationBoxParam()
{
cnt = StringDefine.resetCurrentPlan,
onPromiseCallback = PlayerService.Instance.SendToResetPlan
};
Context.UI.OpenAsync(UIKeys.CommonConfirmationBox, dialogParam);
}
private void OnClickChangeImprintBtn(EventContext context)
{
Context.UI.OpenAsync(UIKeys.PlayerChangeImprintPanel,_selectImprint);
}
private void OnClickBackBtn(EventContext context)
{
Context.ClosePanel();
}
///
/// 升级1次印记
///
///
private void OnClickUpgradeBtn(EventContext context)
{
if (!ItemService.Instance.IsEnough(_upgradeItemId, _upgradeCostVal, true))
return;
PlayerService.Instance.SendToUpgradeRune(_selectImprint+1,1);
}
///
/// 升级10次印记
///
///
private void OnClickTenBtn(EventContext context)
{
if (!ItemService.Instance.IsEnough(_upgradeItemId, _upgradeCostVal*10, true))
return;
PlayerService.Instance.SendToUpgradeRune(_selectImprint+1, 10);
}
#endregion
private void AddEventListner()
{
EventSingle.Instance.AddListener(EventDefine.UpdataItemData, UpdataItemData);
EventSingle.Instance.AddListener(EventDefine.WakeUpRuneSucess, WakeUpRuneSucess);
EventSingle.Instance.AddListener(EventDefine.UpgradeRuneLvSucess, UpgradeRuneLvSucess);
EventSingle.Instance.AddListener(EventDefine.ChangePlanIndexSucess, ChangePlanIndexSucess);
EventSingle.Instance.AddListener(EventDefine.ResetCurrentPlanSucess,ResetCurrentPlanSucess);
EventSingle.Instance.AddListener(EventDefine.ChangePlanNameSucess, ChangePlanNameSucess);
EventSingle.Instance.AddListener(EventDefine.ChangeRuneTypeSucess, ChangeRuneTypeSucess);
}
private void RemoveEventListner()
{
EventSingle.Instance.RemoveListener(EventDefine.UpdataItemData, UpdataItemData);
EventSingle.Instance.RemoveListener(EventDefine.WakeUpRuneSucess, WakeUpRuneSucess);
EventSingle.Instance.RemoveListener(EventDefine.UpgradeRuneLvSucess, UpgradeRuneLvSucess);
EventSingle.Instance.RemoveListener(EventDefine.ChangePlanIndexSucess, ChangePlanIndexSucess);
EventSingle.Instance.RemoveListener(EventDefine.ResetCurrentPlanSucess,ResetCurrentPlanSucess);
EventSingle.Instance.RemoveListener(EventDefine.ChangePlanNameSucess, ChangePlanNameSucess);
EventSingle.Instance.RemoveListener(EventDefine.ChangeRuneTypeSucess, ChangeRuneTypeSucess);
}
private void InitUI()
{
_selectImprint = 0;
_selectPlanIndex = PlayerData.Instance.CurPlanIndex;
SelectPlanNameItem(_selectPlanIndex);
if (_imprintItemList == null)
{
_imprintItemList = new List
{
VM.ImprintItem1.Ctrl,VM.ImprintItem2.Ctrl,VM.ImprintItem3.Ctrl,
VM.ImprintItem4.Ctrl,VM.ImprintItem5.Ctrl,VM.ImprintItem6.Ctrl,
};
}
if (_runeTableList == null)
{
_runeTableList = new List();
_runeTableList.AddRange(runeTableRepo.GetAll());
_runeTableList.Sort((a, b) =>
{
return a.Id.CompareTo(b.Id);//升序
});
}
if (_runeIdArray == null) _runeIdArray = new int[_runeTableList.Count];
}
private void ShowUI()
{
ShowPlayerSpine("info_job_1001_1_SkeletonData");
ShowImprintUI(true);
ShowAwakeCostUI(1);
}
///
/// 加载主角的spine
///
///
private void ShowPlayerSpine(string spineName)
{
VM.JobSpine.LoadSpine(spineName, "stand", true);
}
private void ShowImprintUI(bool bInit = false)
{
RunePlan runePlanData = PlayerData.Instance.RunePlanMap[_selectPlanIndex];
bool bAllLock = true;
bool bHighestJob = false; // 已到达觉醒最高阶
bool bWaitAwake = false;
int index = 0;
foreach (var rune in runePlanData.slot)
{
_runeIdArray[index] = rune.runeId;
index++;
if (bAllLock && rune.runeId > 0)
{
bAllLock = false;
}
if (!bWaitAwake && rune.runeId == 0)
{
bWaitAwake = true;
}
}
VM.LockCtrl.selectedIndex = bAllLock ? 1 : 0;
if (!bWaitAwake)
{
var curJobInfo = careerTableRepo.Get(PlayerData.Instance.JobId);
if (curJobInfo?.Job_change.Length == 0)
{
bHighestJob = true;
}
}
VM.AwakeCtrl.selectedIndex = bWaitAwake ? 0 : (bHighestJob ? 2 : 1);
if (bInit && _runeIdArray[_selectImprint] == 0)
{
for (int i = 0; i < _runeIdArray.Length; i++)
{
if (_runeIdArray[i] > 0)
{
_selectImprint = i;
break;
}
}
}
ShowImprintRuneUI();
}
///
/// 显示印记镶嵌的符文UI
///
private void ShowImprintRuneUI()
{
for (int i = 0; i < _runeIdArray.Length; i++)
{
if (_imprintItemList[i] != null)
{
_imprintItemList[i].ShowUI(i,_runeIdArray[i], OnclcickImprintItem);
}
}
OnclcickImprintItem(_selectImprint);
}
///
/// 觉醒印记消耗
///
///
private void ShowAwakeCostUI(int index)
{
var info = _runeTableList[index];
if (info != null)
{
_awakeItemId = info.LevelUpCost[0];
_awakeCostVal = info.LevelUpCost[1];
VM.AwakeCostItem.Ctrl.ShowCostUI(_awakeItemId, _awakeCostVal, 0);
}
}
///
/// 升级印记消耗
///
///
private void ShowUpgradeCostUI(int runeId)
{
var runeLvInfo = rune_levelTableRepo.Get(runeId);
if (runeLvInfo == null) return;
var runeExpInfo = rune_expTableRepo.Get(runeLvInfo.Level);
if (runeExpInfo?.Cost?.Length > 1)
{
_upgradeItemId = runeExpInfo.Cost[0];
_upgradeCostVal = runeExpInfo.Cost[1];
RunePlan runePlanData = PlayerData.Instance.RunePlanMap[_selectPlanIndex];
// allPoint - 当前方案的subPoint) + 玩家的道具
int upgradePoint = PlayerData.Instance.AllPoint - runePlanData.subPoint + (int)ItemData.Instance.GetItemNum(_upgradeItemId);
VM.UpgradeCostItem.Ctrl.ShowCostUI(_upgradeItemId, _upgradeCostVal, upgradePoint);
VM.TenCostItem.Ctrl.ShowCostUI(_upgradeItemId, _upgradeCostVal*10, upgradePoint);
}
}
///
/// 点击印记项
///
///
private void OnclcickImprintItem(int imprintIndex)
{
_selectImprint = imprintIndex;
ShowImprintItemUI(imprintIndex);
for (int i = 0; i < _imprintItemList.Count; i++)
{
_imprintItemList[i].ShowSelectUI(i == imprintIndex);
}
}
///
/// 获取某个槽位上的符文id
///
///
private int GetRuneId(int index)
{
RunePlan runePlanData = PlayerData.Instance.RunePlanMap[_selectPlanIndex];
foreach (var item in runePlanData.slot)
{
if (item.id == index)
{
return item.runeId;
}
}
return 0;
}
///
/// 显示点击的印记项信息
///
///
private void ShowImprintItemUI(int index)
{
int runeId = GetRuneId(index+1);
bool bShowChangeImprintBtn = true;
int lvCtrlIndex = 0;
if (runeId == 0)
{
// 展示信息 槽位id * 10000 + 符文类型 * 1000
runeId = (index+1) * 10000 + 1001;
bShowChangeImprintBtn = false;
}
else
{
var runeLevelInfo = rune_levelTableRepo.Get(runeId);
if (runeLevelInfo == null)
lvCtrlIndex = 2;
else
{
var runeExpInfo = rune_expTableRepo.Get(runeLevelInfo.Level +1);
lvCtrlIndex = runeExpInfo == null ? 2 : 1;
}
}
var imprintInfo = _runeTableList[index];
if (imprintInfo != null)
{
int runeType = (runeId - (index+1) * 10000) / 1000 - 1;
VM.ImprintNameLabel.text = imprintInfo.Name[runeType];
if (bShowChangeImprintBtn && imprintInfo.Handoff.Length == 1) bShowChangeImprintBtn = false;
}
ShowRuneAttrUI(runeId);
ShowUpgradeCostUI(runeId);
VM.ChangeImprintBtn.visible = bShowChangeImprintBtn;
VM.LevelCtrl.selectedIndex = lvCtrlIndex;
}
private void ShowRuneAttrUI(int runeId)
{
var runeInfo = rune_levelTableRepo.Get(runeId);
if (runeInfo != null)
{
var sb = StringBuilderUtils.Acquire();
for (int i = 0; i < runeInfo.Value_plus.Length; i+=2)
{
var attributeInfo = AttrDescTableRepo.Get(runeInfo.Value_plus[i]);
if (attributeInfo != null)
{
sb.Append(attributeInfo.ShowName);
sb.Append("[color=#1EF369]+");
sb.Append(attributeInfo.Num_type == 1 ? TableUtils.ToRealDouble(runeInfo.Value_plus[i+1]).ToString("F3") + "%" :
(attributeInfo.Id == (int)EAttributeType.AtkSpeed ? TableUtils.ToRealDouble(runeInfo.Value_plus[i + 1]).ToString("F1") : runeInfo.Value_plus[i + 1].ToString()));
sb.Append("[/color]");
}
}
VM.ImprintDescLabel.text = sb.ToString();
StringBuilderUtils.Release(sb);
}
}
///
/// 道具变化
///
///
///
private void UpdataItemData(int eventId, object args)
{
int runeId = GetRuneId(_selectImprint+1);
var itemDataList = args as List;
if (itemDataList?.Count > 0)
{
for (int i = 0; i < itemDataList.Count; i++)
{
if (itemDataList[i].count > 0)
{
if (itemDataList[i].id == _awakeItemId)
{
ShowAwakeCostUI(1);
}
if (runeId > 0 && itemDataList[i].id == _upgradeItemId)
{
ShowUpgradeCostUI(runeId);
}
}
}
}
}
///
/// 成功激活印记(镶嵌符文)
///
///
///
private void WakeUpRuneSucess(int eventId, object args)
{
ShowImprintUI();
}
///
/// 成功提升印记(符文)等级
///
///
///
private void UpgradeRuneLvSucess(int eventId, object args)
{
ShowImprintUI();
}
///
/// 切换符文方案
///
///
///
private void ChangePlanIndexSucess(int eventId, object args)
{
_selectImprint = 0;
_selectPlanIndex = PlayerData.Instance.CurPlanIndex;
ShowImprintUI();
}
///
/// 成功重置当前方案
///
///
///
private void ResetCurrentPlanSucess(int eventId, object args)
{
ShowImprintUI();
}
///
/// 成功更换印记类型
///
///
///
private void ChangeRuneTypeSucess(int eventId, object args)
{
ShowImprintItemUI(_selectImprint);
}
///
/// 成功修改符文方案名字
///
///
///
private void ChangePlanNameSucess(int eventId, object args)
{
SelectPlanNameItem(_selectPlanIndex);
}
///
/// 修改方案名
///
/// 要修改的名称
/// 确定修改
private void RenameCallback(string changeName, bool bChange)
{
if (bChange)
{
PlayerService.Instance.SendToAlterPlanName(changeName,_selectPlanIndex);
}
}
///
/// 显示印记方案列表UI
///
///
private void ShowPlansNameNestedItem(bool bShow)
{
_bShowPlansName = bShow;
VM.PlansNameBtn.GetController("ComboBoxCtrl").selectedIndex = bShow ? 1 : 0;
if (bShow)
{
VM.PlansNameNestedItem.Enable(null);
VM.PlansNameNestedItem.Ctrl.ShowUI(SelectPlanNameItem);
}
else
{
VM.PlansNameNestedItem.Disable();
}
}
///
/// 选择(符文升级)方案
///
///
private void SelectPlanNameItem(int index)
{
if (index > 0 && PlayerData.Instance.RunePlanNamesArray.Count > 0)
{
PlayerService.Instance.SendToChangePlanIndex(index);
VM.PlansNameBtn.title = PlayerData.Instance.RunePlanNamesArray[index-1];
}
ShowPlansNameNestedItem(false);
}
}
}