NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/UI/LevelFight/UIPassGameController.cs

630 lines
16 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System.Collections.Generic;
using System.Linq;
using cfg.CharacterCfg;
using cfg.LevelCfg;
using Cysharp.Threading.Tasks;
using Framework;
using Gameplay;
using Gameplay.Character;
using Gameplay.Guide;
using Gameplay.Level;
using Gameplay.Net;
using Gameplay.Unit;
using NLDPB;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using Image = UnityEngine.UI.Image;
using DG.Tweening;
public class UIPassGameController : UIWindow
{
//UI GameObj
///Auto Gen Start///
public Image Image_WinBG;
public Image Image_PosterLu;
public Image Image_TextRect;
public TMP_Text Text_Win;
public Image Image_BlueBar;
public TMP_Text Text_LevelNum;
public TMP_Text Text_LevelName;
public TMP_Text Text_FightTime;
public Image Image_Clock;
public TMP_Text Text_Time;
public TMP_Text Text_CharacterID;
public TMP_Text Text_CharacterLV;
public Image Image_EXEmpty;
public Image Image_EXFull;
public TMP_Text Text_EX;
public TMP_Text Text_LVUp;
public TMP_Text Text_Target;
public Image Image_DownShadow;
public TMP_Text Text_GeneralEX;
public Image Image_ELogo;
public TMP_Text Text_EXPHave;
public TMP_Text Text_EXPGet;
public TMP_Text Text_Mode;
///Auto Gen End///
public static async UniTask<UIWindow> Open(ItemList itemList)
{
return await UIManager.Instance.CreateAndOpenWindow(UINameConst.UIPassGame, itemList);
}
/// <summary>
/// 高斯模糊遮罩
/// </summary>
private RawImage rawImageGaussianBlurMask;
/// <summary>
/// 台词文本
/// </summary>
private TMP_Text textDialogue;
/// <summary>
/// 角色名
/// </summary>
private TMP_Text textName;
private List<Image> _imgWinStar;
private List<Image> _imageFailedStart;
private List<GameObject> _aimObjList;
private int _levelID;
private List<GameObject> _itemHeadList;
private List<uint> _charIDs;
private ItemList _itemList;
/// <summary>
/// 台词语音
/// </summary>
private AudioInst dialogueAudio;
/// <summary>
/// 是否正在播放台词语音
/// </summary>
public bool IsDialoguePlaying
{
get { return dialogueAudio != null && dialogueAudio.IsPlaying; }
}
private bool _isPlayingAnim; //是否正在播放升级动画
private int _playerLvUp; //获取到的升级
private float _playerExpUp; //需要最后涨的经验值
private Sequence _seq;
public override void PreLoad(object data = null)
{
base.PreLoad(data);
if (data != null)
{
_itemList = data as ItemList;
}
}
// Use this for initialization
public override void OnInit()
{
//bind UI GameObj
UIPassGameBinder.GetComponents(this);
Text_Mode = GetComponent<TMP_Text>("Image_WinBG/Text_Win/Text_Mode");
textName = GetComponent<TMP_Text>("Image_WinBG/Image_PosterLu/Image_ActorLineBG/Text_Name");
textDialogue = GetComponent<TMP_Text>("Image_WinBG/Image_PosterLu/Image_ActorLineBG/Text_Describe");
rawImageGaussianBlurMask = GetComponent<RawImage>("GaussianBlurMask");
rawImageGaussianBlurMask.texture = CommonUtils.GetScreenTexture2D();
BindButton("Button_Close", _OnClickClose);
_imgWinStar = new List<Image>();
_imageFailedStart = new List<Image>();
_aimObjList = new List<GameObject>();
_itemHeadList = new List<GameObject>();
_charIDs = new List<uint>();
for (int i = 0; i < 3; i++)
{
var img = GetComponent<Image>("Image_WinBG/MissionDetail/ImageMissionBar" + i + "/ImageWinStart");
var imgFail = GetComponent<Image>("Image_WinBG/MissionDetail/ImageMissionBar" + i + "/ImageFailedStart");
_imgWinStar.Add(img);
_imageFailedStart.Add(imgFail);
_aimObjList.Add(FindObj("Image_WinBG/MissionDetail/ImageMissionBar" + i));
}
for (int i = 0; i < 7; i++)
{
var go = FindObj("Image_WinBG/HeroLevelUp/Image_DownShadow/ItemHead" + i);
_itemHeadList.Add(go);
}
}
public override void OnRelease()
{
base.OnRelease();
AudioManager.Instance.AudioMgrObj.StopAllSounds();
if (_seq != null)
{
DOTween.Kill(_seq);
_seq = null;
}
}
private void _Refresh()
{
var team = LevelManager.Instance.SettleData.Team;
var charIDArray = team.GetCharacterIDs();
for (int i = 0; i < charIDArray.Length; i++)
{
if (charIDArray[i] != Team.NONE_ID)
{
_charIDs.Add(charIDArray[i]);
}
}
_RefreshInfo();
_RefreshMissionDetail();
_RefreshCommonExp();
_RefreshHeads();
if (charIDArray.Count() > 0)
{
int id = (int)charIDArray[0];
DataCharacterAttri dataCharacterAttri = TableManager.Instance.Tables.CharacterAttri.Get(id);
if (dataCharacterAttri == null)
{
DebugUtil.LogError($"获取角色配置失败id{id}");
return;
}
textName.text = CommonUtils.GetLocalizeText(dataCharacterAttri.Name);
dialogueAudio = DialogueManager.Instance.PlayDiaogue(id,
cfg.DialogueCfg.E_DialogueType.LevelWin,
(content) => { textDialogue.text = content; });
}
}
//invoke when open window
protected override void OnShowWindow(object data)
{
_levelID = LevelManager.Instance.SettleData.LevelID;
_Refresh();
}
protected override void OnUpdate()
{
base.OnUpdate();
Image_TextRect.gameObject.IsScaleShow(IsDialoguePlaying);
}
protected override void OnHideWindow()
{
//AudioManager.Instance.AudioMgrObj.StopAllSounds();
base.OnHideWindow();
}
#region RefreshWindow
private void _RefreshInfo()
{
_RefreshMapDetail();
}
private void _RefreshMapDetail()
{
_RefreshTime();
_RefreshLevelInfo();
_RefreshPlayerInfo();
}
private async void _RefreshLevelInfo()
{
var level = LevelManager.Instance.CurrLevel;
//var levelName = level.Name;
//Text_LevelName.text = levelName;
Text_Mode.text = CommonUtils.GetCurLevelTypeStr();
Text_LevelNum.text = LevelManager.Instance.LevelIDToNum(level.ID);
}
private void _RefreshTime()
{
var minutes = TeamManager.Instance.GetFightPastMinute();
var seconds = TeamManager.Instance.GetFightPastSecond();
var timeStr = "";
if (minutes >= 10)
{
timeStr += minutes;
}
else
{
timeStr += "0";
timeStr += minutes;
}
timeStr += ":";
if (seconds >= 10)
{
timeStr += seconds;
}
else
{
timeStr += "0";
timeStr += seconds;
}
Text_Time.text = timeStr;
}
private void _RefreshPlayerInfo()
{
var playerName = Actor.Instance.Base.Nickname;
var playerLv = Actor.Instance.Base.GetProp(ActorProp.Level);
Text_CharacterID.text = playerName;
if (GuideManager.Instance.IsGuiding && 100001 == LevelManager.Instance.CurrLevel.ID)
Text_CharacterID.gameObject.IsScaleShow(false);
else
Text_CharacterID.gameObject.IsScaleShow(true);
Text_CharacterLV.text = "LV." + playerLv;
//var actorCfg = ActorLevelTableHelper.Instance.Get((int)playerLv);
var max = ActorLevelTableHelper.Instance.GetLevelUpExp((int)playerLv);//actorCfg.Exp;
var cur = Actor.Instance.Base.GetProp(ActorProp.Exp);
var process = (float)cur / max;
var oldLvExp = LevelManager.Instance.SettleData.PlayerLvExp;
var lvDiff = playerLv - oldLvExp.Lv;
var oldLv = oldLvExp.Lv;
int add = _CalculateExp();
Image_EXFull.fillAmount = (float)oldLvExp.Exp / max;
Text_LVUp.text = "+" + add;
Text_EX.text = cur + "/" + max;
//Image_EXFull.fillAmount = process;
_playerLvUp = (int)lvDiff;
_PlayAnim(process);
}
private int _CalculateExp()
{
int retExp = 0;
var oldExp = LevelManager.Instance.SettleData.PlayerLvExp.Exp;
var oldLv = LevelManager.Instance.SettleData.PlayerLvExp.Lv;
var curLv = Actor.Instance.Base.GetProp(ActorProp.Level);
var curExp = Actor.Instance.Base.GetProp(ActorProp.Exp);
if (oldLv < curLv)
{
var oldActorLvExp = ActorLevelTableHelper.Instance.GetLevelUpExp((int)oldLv);//Cfg = ActorLevelTableHelper.Instance.Get((int)oldLv);
retExp += oldActorLvExp - (int)oldExp;
for (uint i = oldLv + 1; i < curLv; i++)
{
var curLvExp = ActorLevelTableHelper.Instance.GetLevelUpExp((int)i);
retExp += curLvExp;
}
retExp += (int)curExp;
}
else
{
retExp += (int)(curExp - oldExp);
}
return retExp;
}
private void _RefreshMissionDetail()
{
_RefreshStars();
_RefreshAimInfo();
}
private void _RefreshStars()
{
var starCount = LevelManager.Instance.CurrentLevel.StarCount;
for (int i = 0; i < _imgWinStar.Count; i++)
{
var isFinish = LevelManager.Instance.CurrentLevel.GetStarIsSuccess(i);
_imgWinStar[i].gameObject.SetActive(isFinish);
_imageFailedStart[i].gameObject.SetActive(!isFinish);
}
}
private void _RefreshAimInfo()
{
//var levelInfo = LevelManager.Instance.GetLevelInfoByID(_levelID);
var levelCfg = TableManager.Instance.Tables.Level.GetOrDefault(_levelID);
var levelRewardID = new List<List<int>>(3);
if (levelCfg != null)
{
levelRewardID.Add(new List<int>(levelCfg.StarRewardID1));
levelRewardID.Add(new List<int>(levelCfg.StarRewardID2));
levelRewardID.Add(new List<int>(levelCfg.StarRewardID3));
}
for (int i = 0; i < _aimObjList.Count; i++)
{
var txtContent = "";
var aimObj = _aimObjList[i];
var txtDesc = CommonUtils.GetComponent<TMP_Text>(aimObj, "TextDescribe");
var isFinish = LevelManager.Instance.CurrentLevel.GetStarIsSuccess(i);
var txtGetItem = CommonUtils.GetComponent<TMP_Text>(aimObj, "TextGetItem");
var txtGetItemFailed = CommonUtils.GetComponent<TMP_Text>(aimObj, "TextGetItemFailed");
txtGetItem.gameObject.SetActive(isFinish);
txtGetItemFailed.gameObject.SetActive(!isFinish);
txtDesc.text = LevelManager.Instance.CurrentLevel.GetStarTargetLocalization(i);
if (levelCfg != null)
{
var levelRewardL = levelRewardID[i];
if (levelRewardL.Count > 0)
{
var itemList = CommonUtils.GetFilterRewardItemList(levelRewardL);
for (int n = 0; n < itemList.Count; n++)
{
var list = itemList[n];
var itemID = list.ID;
var itemCfg = TableManager.Instance.Tables.Item.GetOrDefault(itemID);
if (itemCfg != null)
{
var name = CommonUtils.GetLocalizeText(itemCfg.NameLocal);
txtContent += name + "x" + list.Count;
}
}
}
}
txtGetItem.text = txtContent;
txtGetItemFailed.text = txtContent;
}
}
private void _RefreshCommonExp()
{
var list = _itemList.Lists;
int itemCount = 0;
for (var i = ItemSource.LevelPassNormal; i <= ItemSource.LevelPassStar3; i++)
{
itemCount += _CalculateExpItemCount(list[(int)i]);
}
var settleData = LevelManager.Instance.SettleData;
Text_EXPHave.text = settleData.CommonExp.ToString();
Text_EXPGet.text = "+" + itemCount;
}
private int _CalculateExpItemCount(ItemCounts itemCounts)
{
int retCount = 0;
if (itemCounts.Ids.Count > 0)
{
var idx = itemCounts.Ids.IndexOf(3);
if (idx >= 0)
{
var count = itemCounts.Counts[idx];
retCount = (int)count;
}
}
return retCount;
}
private void _RefreshHeads()
{
for (int i = 0; i < _itemHeadList.Count; i++)
{
_RefreshHead(i);
}
}
private async void _RefreshHead(int idx)
{
var item = _itemHeadList[idx];
if (idx >= _charIDs.Count)
{
item.SetActive(false);
return;
}
item.SetActive(true);
var uid = _charIDs[idx];
var headNode = CommonUtils.GetComponent<UIHeadItemNode>(item, "HeadNode");
if (headNode)
{
var headInfo = new UIHeadInfo(uid);
headNode.SetData(headInfo);
headNode.Refresh(false);
}
var txtTeamIdx = CommonUtils.GetComponent<TMP_Text>(item, "Image_SerialNumber/Text_Number");
var team = LevelManager.Instance.SettleData.Team;
var teamIdx = team.GetCharacterIdx(uid);
txtTeamIdx.text = teamIdx.ToString();
var imgPro = CommonUtils.GetComponent<Image>(item, "ImageProfessionRect/ImageProfession");
var job = CommonUtils.GetProfessionByUid(uid);
var jobData = TableManager.Instance.Tables.JobAttri.GetOrDefault((int)job);
var spritePath = jobData.IconPath;
var sprite = await LoadAssetAsync<Sprite>(spritePath);
imgPro.sprite = sprite;
//txtTeamIdx.text =
var txtExpAdd = CommonUtils.GetComponent<TMP_Text>(item, "ImageHeroEXpEmpty/TextHeroEXPUp");
var imgExpProcess = CommonUtils.GetComponent<Image>(item, "ImageHeroEXpEmpty/ImageHeroEXpFull");
var txtLv = CommonUtils.GetComponent<TMP_Text>(item, "TextHeroLV");
var addExp = _CalculateCharExpAdd(uid);
if (addExp > 0)
{
txtExpAdd.text = "+" + addExp;
}
else
{
txtExpAdd.text = "";
}
if (CharacterDataInfoManager.Instance.DataDic.TryGetValue(uid, out var charDataInfo))
{
var cur = charDataInfo.Exp;
var cfg = TableManager.Instance.Tables.CharacterLevelExp.GetOrDefault((int)charDataInfo.Level);
var process = (float)cur / cfg.EXP;
imgExpProcess.fillAmount = process;
txtLv.text = "LV " + charDataInfo.Level;
}
var imgLikely = CommonUtils.GetComponent<Image>(item, "ImageFavorate");
var txtLikely = CommonUtils.GetComponent<TMP_Text>(item, "ImageFavorate/TextFavorateEXp");
var likely = _CalculateLikely(uid);
if (likely > 0)
{
txtLikely.text = "+" + likely;
imgLikely.gameObject.SetActive(true);
}
else
{
imgLikely.gameObject.SetActive(false);
}
}
#endregion
#region Data
private int _CalculateCharExpAdd(uint roleID)
{
int add = 0;
var lvExp = LevelManager.Instance.SettleData.ExpDic[roleID];
if (CharacterDataInfoManager.Instance.DataDic.TryGetValue(roleID, out var charDataInfo))
{
var oldLv = lvExp.Lv;
var oldExp = (int)lvExp.Exp;
var curLv = charDataInfo.Level;
var curExp = (int)charDataInfo.Exp;
if (curLv == TableManager.Instance.Tables.CharacterLevelExp.DataList.Count)
{
return 0;
}
if (oldLv < curLv)
{
var expCfg = TableManager.Instance.Tables.CharacterLevelExp.GetOrDefault((int)oldLv + 1);
add += (expCfg.EXP - oldExp);
for (uint i = oldLv + 1; i < curLv; i++)
{
var cfg = TableManager.Instance.Tables.CharacterLevelExp.GetOrDefault((int)i);
add += cfg.EXP;
}
add += curExp;
}
else
{
add += curExp - oldExp;
}
}
return add;
}
private int _CalculateLikely(uint roleID)
{
int retCount = 0;
var lvExp = LevelManager.Instance.SettleData.FavorDic[roleID];
if (CharacterDataInfoManager.Instance.DataDic.TryGetValue(roleID, out var charDataInfo))
{
var oldExp = (int)lvExp.Exp;
var oldLv = (int)lvExp.Lv;
var curLv = (int)charDataInfo.LikelyLevel;
var curExp = (int)charDataInfo.LikelyExp;
if (oldLv < curLv)
{
var expCfg = TableManager.Instance.Tables.CharacterLikability.Get((int)roleID, oldLv + 1);
if (expCfg == null)
{
return 0;
}
retCount += expCfg.LikabilityExp - oldExp;
for (int i = oldLv + 1; i < curLv; i++)
{
var cfg = TableManager.Instance.Tables.CharacterLikability.Get((int)roleID, i + 1);
retCount += cfg.LikabilityExp;
}
retCount += curExp;
}
else
{
retCount += curExp - oldExp;
}
}
return retCount;
}
#endregion
private async void _OnClickClose()
{
if (_isPlayingAnim)
return;
await UI_GetItemSettleController.Open(_itemList);
CloseWindow();
}
#region Anim
private async void _PlayAnim(float process)
{
if (!_isPlayingAnim)
{
_seq = DOTween.Sequence();
//await UniTask.Delay(250);
_seq.AppendInterval(0.4f);
if (_playerLvUp > 0)
{
for (int i = 1; i <= _playerLvUp; i++)
{
_seq.Append(Image_EXFull.DOFillAmount(1, 0.8f));
_seq.AppendCallback(() =>
{
Image_EXFull.fillAmount = 0;
});
}
}
if (process > 0)
{
_seq.Append(Image_EXFull.DOFillAmount(process, 0.5f));
_seq.AppendInterval(0.25f);
_seq.AppendCallback(_ShowRewardWindow);
}
}
}
private async void _ShowRewardWindow()
{
if (_playerLvUp < 1)
{
return;
}
var oldLvExp = LevelManager.Instance.SettleData.PlayerLvExp;
var curLv = Actor.Instance.Base.GetProp(ActorProp.Level);
await UI_PlayerLevelUpInfoController.Open((int)oldLvExp.Lv, (int)curLv);
}
#endregion
}