/// #pkgName FGUI包名
/// #panelName UIPanel名字
/// #UIName = $"{#pkgName}{#panelName}" UIKey名字
/// 该脚本由模板创建
/// created by cb 2024
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using FairyGUI;
using FL.Data;
using XGame;
using XGame.Database;
using XGame.Framework.UI;
namespace FL.FGUI
{
public class PartnerDetailsPanelParam
{
public int PlanId;
///
/// 槽位id,-1为非更换界面打开的详情
///
public int SlotId;
public int PartnerId;
}
///
/// UI逻辑处理类
///
///
public partial class PartnerDetailsPanelCtrl : UIController
{
private int _partnerId;
private int _slotId;
private int _planId;
private bool _initView = false;
private List _partnerIds = new List();
protected override void OnEnable(object intent)
{
var param = intent as PartnerDetailsPanelParam;
_partnerId = param.PartnerId;
_planId = param.PlanId;
_slotId = param.SlotId;
AddUIListenres();
AddEventListener();
InitPartnerIdList();
ShowUI();
}
protected override void OnDisable()
{
RemoveUIListenres();
RemoveEventListener();
}
#region 事件
private void AddUIListenres()
{
VM.PreviousBtn.onClick.Add(OnClickPreviousBtn);
VM.NextBtn.onClick.Add(OnClickNextBtn);
VM.ChangeBtn.onClick.Add(OnClickChangeBtn);
VM.UpLvBtn.onClick.Add(OnClickUpLvBtn);
VM.UpBtn.onClick.Add(OnClickUpBtn);
VM.DownBtn.onClick.Add(OnClickDownBtn);
VM.UpStarBtn.onClick.Add(OnClickUpStarBtn);
VM.BackBtn.onClick.Add(OnClickBackBtn);
VM.EpiItem.VM.PanelEvent.Add(OnClickEpiSet);
}
private void RemoveUIListenres()
{
VM.PreviousBtn.onClick.Remove(OnClickPreviousBtn);
VM.NextBtn.onClick.Remove(OnClickNextBtn);
VM.ChangeBtn.onClick.Remove(OnClickChangeBtn);
VM.UpLvBtn.onClick.Remove(OnClickUpLvBtn);
VM.UpBtn.onClick.Remove(OnClickUpBtn);
VM.DownBtn.onClick.Remove(OnClickDownBtn);
VM.UpStarBtn.onClick.Remove(OnClickUpStarBtn);
VM.BackBtn.onClick.Remove(OnClickBackBtn);
VM.EpiItem.VM.PanelEvent.Remove(OnClickEpiSet);
}
private void AddEventListener()
{
EventSingle.Instance.AddListener(EventDefine.PartnerUpLevel, OnUpdateLv);
EventSingle.Instance.AddListener(EventDefine.PartnerUpStar, OnUpdateStar);
EventSingle.Instance.AddListener(EventDefine.UpdataItemData, OnItemUpdate);
EventSingle.Instance.AddListener(EventDefine.PartnerUp, OnUpDownPartner);
EventSingle.Instance.AddListener(EventDefine.PartnerDown, OnUpDownPartner);
EventSingle.Instance.AddListener(EventDefine.PartnerBinding, OnBinding);
}
private void RemoveEventListener()
{
EventSingle.Instance.RemoveListener(EventDefine.PartnerUpLevel, OnUpdateLv);
EventSingle.Instance.RemoveListener(EventDefine.PartnerUpStar, OnUpdateStar);
EventSingle.Instance.RemoveListener(EventDefine.UpdataItemData, OnItemUpdate);
EventSingle.Instance.RemoveListener(EventDefine.PartnerUp, OnUpDownPartner);
EventSingle.Instance.RemoveListener(EventDefine.PartnerDown, OnUpDownPartner);
EventSingle.Instance.RemoveListener(EventDefine.PartnerBinding, OnBinding);
}
private void OnBinding(int eventId, object args)
{
ShowEpi();
}
private void OnUpdateStar(int eventId, object args)
{
ShowStarUI();
}
private void OnItemUpdate(int eventId, object args)
{
var info = PartnersData.Instance.GetPartnerAttrByTableId(_partnerId);
var starLv = info?.RisingStarLv ?? 1;
ShowStarRatingCostUI(starLv);
}
private void OnClickPreviousBtn(EventContext context)
{
OnSelectPartnerOffset(1);
}
private void OnClickNextBtn(EventContext context)
{
OnSelectPartnerOffset(-1);
}
private void OnClickEpiSet(EventContext context)
{
var info = PartnersData.Instance.GetPartnerAttrByTableId(_partnerId);
if (info == null)
{
Context.ShowTips(StringDefine.PartnerEmptyTips);
return;
}
Context.UI.OpenAsync(
UIKeys.PartnerEpiChangePanel,
new PartnerEpiChangePanelCtrlParam()
{
PlanId = PartnersData.Instance.UsePlanId,
SlotId = -1,
SbId = _partnerId,
}
);
}
private void OnClickChangeBtn(EventContext context)
{
var info = PartnersData.Instance.GetPartnerAttrByTableId(_partnerId);
if (info == null)
{
Context.ShowTips(StringDefine.PartnerEmptyTips);
return;
}
Context.UI.OpenAsync(
UIKeys.PartnerEpiChangePanel,
new PartnerEpiChangePanelCtrlParam()
{
PlanId = PartnersData.Instance.UsePlanId,
SlotId = -1,
SbId = _partnerId,
}
);
}
private void OnClickUpLvBtn(EventContext context)
{
var info = PartnersData.Instance.GetPartnerAttrByTableId(_partnerId);
if (info == null)
{
Context.ShowTips(StringDefine.PartnerEmptyTips);
return;
}
var lvTable = partnerLvUpTableRepo.GetPartnerLvUpTable(_partnerId, info.Level);
if (lvTable == null)
{
Context.ShowTips(StringDefine.PartnerUpLvEmptyTips);
return;
}
if (
!ItemService.Instance.IsEnough(lvTable.LevelUpCost[0], lvTable.LevelUpCost[1], true)
)
return;
PartnersService.Instance.RequestLvUp(_partnerId);
}
private void OnClickUpBtn(EventContext context)
{
if (!PartnersData.Instance.TryGetPartnerAttrByTableId(_partnerId, out var info))
{
Context.ShowTips(StringDefine.PartnerEmptyTips);
return;
}
if (PartnersData.Instance.UsePlanId == _planId)
{
if (info.Status > 0)
{
Context.ShowTips(StringDefine.PartnerAlreadyUpTips);
return;
}
if (_slotId < 0)
{
PartnersService.Instance.OpenPartnerMode(_partnerId);
}
else
{
PartnersService.Instance.RequestPartnerUp(_slotId, _partnerId);
}
}
else
{
PartnersService.Instance.RequestUpdatePlanSb(_planId, _slotId, _partnerId);
}
Context.ClosePanel();
}
///
/// 下阵按钮事件
///
///
private void OnClickDownBtn(EventContext context)
{
if (!PartnersData.Instance.TryGetPartnerAttrByTableId(_partnerId, out var info))
{
Context.ShowTips(StringDefine.PartnerEmptyTips);
return;
}
if (_planId == PartnersData.Instance.UsePlanId)
{
PartnersService.Instance.RequestPartnerDown(_partnerId);
}
else
{
if (!PartnersData.Instance.TryGetPlan(_planId, out var plan))
{
Context.ShowTips(StringDefine.PartnerPlanEmptyTips);
return;
}
if (!plan.TryGetUpPos(_partnerId, out var upPos))
{
Context.ShowTips(StringDefine.PartnerAlreadyUpTips);
return;
}
PartnersService.Instance.RequestUpdatePlanSb(_planId, upPos, 0);
}
Context.ClosePanel();
}
private void OnClickUpStarBtn(EventContext context)
{
var info = PartnersData.Instance.GetPartnerAttrByTableId(_partnerId);
if (info == null)
{
Context.ShowTips(StringDefine.PartnerEmptyTips);
return;
}
var starTable = partnerStarUpTableRepo.GetPartnerStarTable(
_partnerId,
info.RisingStarLv
);
if (starTable == null)
{
Context.ShowTips(StringDefine.PartnerUpStarEmptyTips);
return;
}
if (!ItemService.Instance.IsEnough(starTable.PetId, starTable.StarUpCost, true))
return;
PartnersService.Instance.RequestStarUp(_partnerId);
}
private void OnClickBackBtn(EventContext context)
{
Context.ClosePanel();
}
private void OnUpDownPartner(int eventId, object args)
{
ShowUpDownBtn();
}
///
/// 圣兵升级监听事件
///
///
///
private void OnUpdateLv(int eventId, object args)
{
ShowLevelUI();
}
#endregion
#region 界面
private void ShowUI()
{
ShowPartnerUI();
ShowEpi();
ShowSwitchState();
}
private void ShowEpi()
{
var info = PartnersData.Instance.GetPartnerAttrByTableId(_partnerId);
if (info == null)
{
VM.EpiItem.Disable();
}
else
{
VM.EpiItem.Enable(null);
VM.EpiItem.Ctrl.SetData(info.EpigraphId, _partnerId, true);
}
}
private void ShowPartnerUI()
{
var table = PartnerTableRepo.Get(_partnerId);
if (table == null)
{
Log.Error($"圣兵tableId {_partnerId} 不存在");
return;
}
VM.PartnerIcon.icon = table.Icon;
//LoadPartnerSpine(partnerInfo?.Model);
VM.QualityIcon.icon = AddressableDefine.ItemFrame(table.Quality);
VM.SacredVesselsIcon.icon = table.SkillIcon;
VM.AttrTypeIcon.icon = AddressableDefine.PartnerElementType((int)table.Element);
VM.NameLabel.text = table.Name;
VM.TypeLabel.text = StringDefine.partnerTypeList[table.Type - 1];
ShowUpDownBtn();
var info = PartnersData.Instance.GetPartnerAttrByTableId(_partnerId);
VM.Have.selectedIndex = info != null ? 1 : 0;
ShowLevelUI();
ShowStarUI();
}
private void ShowUpDownBtn()
{
if (!PartnersData.Instance.TryGetPlan(_planId, out var plan))
{
Log.Error($"圣兵信息不存在,id:{_planId}");
return;
}
VM.ShowBtnCtrl.selectedIndex = plan.TryGetUpPos(_partnerId, out var upPos) ? 1 : 0;
}
private void ShowStarUI()
{
var info = PartnersData.Instance.GetPartnerAttrByTableId(_partnerId);
var starLv = info?.RisingStarLv ?? 1;
ShowPartnerStarUI(starLv);
ShowStarRatingCostUI(starLv);
ShowStarOwnAttr(starLv);
ShowBuff(starLv);
}
///
/// 星星数
///
///
private void ShowPartnerStarUI(int starLv)
{
int starNum = starLv == 0 ? 0 : starLv % PartnersData.MaxStarNum;
if (starLv > 0 && starNum == 0)
starNum = PartnersData.MaxStarNum;
int starStep = PartnersService.Instance.GetStarStep(starLv);
int[] array = Enumerable.Repeat(starStep, starNum).ToArray();
VM.StarRatingList.BindDatas(array);
}
///
/// 拥有的星级效果属性描述
///
private void ShowStarOwnAttr(int starLv)
{
partnerStarUpTable starTable = partnerStarUpTableRepo.GetPartnerStarTable(
_partnerId,
starLv
);
if (starTable == null)
{
Log.Error($"圣兵升星表tableId:{_partnerId}, starLv:{starLv} 不存在");
return;
}
var attrsArray = starTable.StarOwnAttr;
if (attrsArray?.Length > 0)
{
string desc = string.Empty;
for (int i = 0; i < attrsArray.Length; i += 2)
{
GetAttributeDesc(attrsArray[i], attrsArray[i + 1], ref desc);
if (i + 1 < attrsArray.Length - 1)
{
desc += ",";
}
}
VM.SkillEffectLabel.text = string.Format(StringDefine.partnerStarAttribute, desc);
VM.SkillEffectLabel.visible = true;
}
else
{
VM.SkillEffectLabel.visible = false;
}
}
private void GetAttributeDesc(int attrType, int attrValue, ref string desc)
{
var attributeInfo = AttrDescTableRepo.Get(attrType);
string valStr = attrValue > 0 ? TableUtils.ToRealDouble(attrValue).ToString("F2") : "0";
desc += $"{attributeInfo?.ShowName}{valStr}%";
}
///
/// 升星消耗
///
///
private void ShowStarRatingCostUI(int starLv)
{
partnerStarUpTable starTable = partnerStarUpTableRepo.GetPartnerStarTable(
_partnerId,
starLv
);
if (starTable == null)
{
Log.Error($"圣兵升星表tableId:{_partnerId}, starLv:{starLv} 不存在");
return;
}
bool isMaxStar =
partnerStarUpTableRepo.GetPartnerStarTable(_partnerId, starLv + 1) == null;
VM.MaxStarCtrl.selectedIndex = isMaxStar ? 1 : 0;
if (!isMaxStar && starTable?.StarUpCost > 0)
{
long num = ItemData.Instance.GetItemNum(starTable.PetId);
VM.StarCostBar.max = starTable.StarUpCost;
VM.StarCostBar.value = num;
}
}
private void InitPartnerIdList()
{
if (_initView)
return;
var attrs = PartnerTableRepo.GetAll();
foreach (var attr in attrs)
{
_partnerIds.Add(attr.Id);
}
_initView = true;
}
private void OnSelectPartnerOffset(int offset)
{
var index = _partnerIds.IndexOf(_partnerId);
index += offset;
if (index < 0)
{
index += _partnerIds.Count;
}
else if (index >= _partnerIds.Count)
{
index -= _partnerIds.Count;
}
_partnerId = _partnerIds[index];
ShowUI();
}
///
/// 上一个|下一个按钮显隐
///
private void ShowSwitchState()
{
VM.CanSwitch.selectedIndex = (_partnerIds.Count > 0 && _slotId < 0) ? 1 : 0;
}
///
/// 圣器升级基础属性
///
///
///
private void ShowLevelUI()
{
var info = PartnersData.Instance.GetPartnerAttrByTableId(_partnerId);
var lv = info?.Level ?? 1;
var lvTable = partnerLvUpTableRepo.GetPartnerLvUpTable(_partnerId, lv);
if (lvTable == null)
{
Log.Error($"圣兵等级提升表不存在sbId{_partnerId}, lv:{lv}");
return;
}
bool bMaxLv = partnerLvUpTableRepo.GetPartnerLvUpTable(_partnerId, lv + 1) == null;
if (info == null)
{
VM.UpgradeCostItem.Disable();
}
else if (bMaxLv)
{
VM.UpgradeCostItem.Disable();
}
else
{
VM.UpgradeCostItem.Enable(null);
}
VM.LvLabel.text = $"LV.{lv}";
if (lvTable.LvAttr.Length > 0)
{
VM.MaxLvCtrl.selectedIndex = bMaxLv ? 1 : 0;
if (!bMaxLv)
{
if (lvTable?.LevelUpCost?.Length > 0)
{
VM.UpgradeCostItem.Ctrl.ShowCostUI(
lvTable.LevelUpCost[0],
lvTable.LevelUpCost[1]
);
}
}
var atkVal = lvTable.LvAttr[1];
//var attributeInfo = AttrDescTableRepo.Get(attrType);
string desc = atkVal > 0 ? TableUtils.ToRealDouble(atkVal).ToString("F1") : "0";
//VM.AtkLabel.text = $"{attributeInfo?.ShowName}:{desc}";
VM.AtkLabel.text = string.Format(StringDefine.partnerAttack, desc);
if (lvTable.LvAttr.Length > 3)
{
//var attributeInfo = AttrDescTableRepo.Get(attrType);
var atkSpeed = lvTable.LvAttr[3];
string descSpeed =
atkSpeed > 0 ? TableUtils.ToRealDouble(atkSpeed).ToString("F1") : "0";
//VM.AtkSpeedLabel.text = $"{attributeInfo?.ShowName}:{desc}";
VM.AtkSpeedLabel.text = string.Format(StringDefine.partnerAtkSpeed, descSpeed);
}
}
}
///
/// 加载圣器的spine
///
///
private void LoadPartnerSpine(string spineName)
{
VM.PartnerSpine.LoadSpine(spineName, "idle", true);
}
private void ShowBuff(int starLv)
{
var table = PartnerTableRepo.Get(_partnerId);
if (table == null)
{
Log.Error($"圣兵tableId {_partnerId} 不存在");
return;
}
var starSkillIds = table?.Skill;
var dataList = new List>();
if (starSkillIds?.Length > 0)
{
int index = 0;
for (int i = 0; i < starSkillIds.Length; i += 2)
{
// 0星激活的技能效果
if (starSkillIds[i + 1] == 0)
{
ShowSkillBaseInfo(starSkillIds[i]);
}
else
{
var data = new List() { starSkillIds[i], starSkillIds[i + 1], starLv };
dataList.Add(data);
}
index++;
}
}
VM.StarBuffItemList.BindDatas(dataList);
}
///
/// 基础技能描述
///
///
private void ShowSkillBaseInfo(int skillId)
{
var skillInfo = SkillTableRepo.Get(skillId);
VM.SkillInfoLabel.text = skillInfo == null ? "" : skillInfo.Desc;
}
#endregion
}
}