using cfg.ActorCfg;
using cfg.LevelCfg;
using Cysharp.Threading.Tasks;
using Framework;
using Gameplay;
using Gameplay.Common;
using Gameplay.Level;
using PhxhSDK;
using System;
using System.Collections.Generic;
using System.Linq;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using Button = UnityEngine.UI.Button;
using Image = UnityEngine.UI.Image;
using Object = UnityEngine.Object;
public class UI_LevelDetailController : UIWindow
{
//UI GameObj
///Auto Gen Start///
public Image Image_BG;
public Button Button_Close;
public TMP_Text Text_LevelNum;
public TMP_Text Text_LevelName;
public Image Image_Shadow;
public Image Image_Misson;
public Image Image_Weather;
public Image Image_DayOrNight;
public TMP_Text Text_DayOrNight;
public Image Image_Seperate;
public Image Image_weather;
public TMP_Text Text_WeatherAndLand01;
public Image Image_environment;
public TMP_Text Text_WeatherAndLand02;
public Image Image_Buff;
public TMP_Text Text_Buff;
public TMP_Text Text_GetReward;
public TMP_Text Text_AlreadyGet;
public TMP_Text Text_Sweep;
public Image Image_SweepNum;
public TMP_Text Text_Num;
public Button Button_Minus;
public Button Button_Plus;
public Button Button_StartSweep;
public Image Image_physicalBG;
public Image Image_Physical;
public TMP_Text Text_PhysicalNum;
public TMP_Text Text_StartSweep;
public Button Button_Cancel;
public TMP_Text Text_Cancel;
public Image Image_StartFight;
public TMP_Text Text_StartFight;
///Auto Gen End///
///
/// 打开关卡详情界面
///
public static async UniTask Open(LevelInfo levelInfo)
{
CommonUtils.CaptureScreenshot();
return await UIManager.Instance.CreateAndOpenWindow(UINameConst.UI_LevelDetail, levelInfo);
}
///
/// 高斯模糊遮罩
///
private RawImage rawImageGaussianBlurMask;
///
/// 循环列表
///
private RecycleView recycleView;
private ScrollRect _numScrollView;
private UIScrollFocusHelper _scrollFocusCmp;
private GameObject _numItem;
private GameObject _maskObj;
private const int MAX_SWEEPNUM = 10;
private const int SWEEP_NUM_CONST = 3; //扫荡列表前后默认item数量
private class RewardShowItem
{
public RewardItem rewardItem;
public ERewardType rewardType;
public bool hasGet;
public RewardShowItem(RewardItem rewardItem, ERewardType rewardType, bool hasGet)
{
this.rewardItem = rewardItem;
this.rewardType = rewardType;
this.hasGet = hasGet;
}
}
///
/// 通关奖励字典
///
private readonly Dictionary dicPassReward = new();
private LevelInfo _currLevelInfo;
private Button _fightBtn;
private int _sweepNum = -1;
private int SweepNum
{
get => _sweepNum;
set
{
if (_sweepNum != value)
{
_sweepNum = value;
if (_sweepNum < 0)
_sweepNum = 0;
//Text_Num.text = _sweepNum.ToString();
_SetCostEnergyItemCount();
}
}
}
private List _allRewards = new();
//private int _currTeamIndex = -1;
private Team _currTeam;
private int _teamIndexMax;
// deal with input data
public override void PreLoad(object data)
{
_currLevelInfo = data != null?data as LevelInfo : _currLevelInfo;
CommonUtils.PreLoadOrUnloadEnvironmentWeatherDayNightIcon(true);
}
// Use this for initialization
public override void OnInit()
{
//bind UI GameObj
UI_LevelDetailBinder.GetComponents(this);
rawImageGaussianBlurMask = GetComponent("GaussianBlurMask");
recycleView = GetComponent("Image_BG/RewardAndSweep/Text_GetReward/RecycleView");
_fightBtn = GetComponent("Image_BG/Image_StartFight");
Text_LevelNum = GetComponent("Image_BG/Top/Text_LevelNum");
// _numScrollView = GetComponent("Image_BG/RewardAndSweep/Text_Sweep/SweepNum/ScrollView");
// _numItem = FindObj("Image_BG/RewardAndSweep/Text_Sweep/SweepNum/ItemNum");
_maskObj = FindObj("Image_BG/ImageMask");
rawImageGaussianBlurMask.texture = CommonUtils.screenTexture;
//test
_maskObj.gameObject.SetActive(true);
var dayBtnEx = Image_DayOrNight.GetComponent();
var weatherBtnEx = Image_weather.GetComponent();
var environmentBtnEx = Image_environment.GetComponent();
recycleView.Init(RefreshRewardItem);
BindButton(Button_Close, CloseOnClick);
BindButton(Button_Cancel, CloseOnClick);
BindButton(GetComponent("emptyForAllCloseBtn"), CloseOnClick);
BindButton(_fightBtn, FightOnClick);
BindButton(Button_Plus, PlusOnClick);
BindButton(Button_Minus, MinusOnClick);
dayBtnEx.AddLongPressListener(OnLongPressDay);
dayBtnEx.AddClickListener(OnPointUpDay);
weatherBtnEx.AddLongPressListener(OnLongPressWeather);
weatherBtnEx.AddClickListener(OnPointUpWeather);
environmentBtnEx.AddLongPressListener(OnLongPressEnvironment);
environmentBtnEx.AddClickListener(OnPointUpEnvironment);
}
private async void FightOnClick()
{
await UI_TeamAndSkillSelectController.Open(_currLevelInfo);
}
private void OnEnterLevelFinished()
{
CloseWindow();
}
private void CloseOnClick()
{
CloseWindow();
}
private void PlusOnClick()
{
SweepNum++;
_scrollFocusCmp.ChangeIndex(true);
}
private void MinusOnClick()
{
SweepNum --;
_scrollFocusCmp.ChangeIndex(false);
}
private void OnLongPressDay()
{
Image_Buff.gameObject.SetActive(true);
var dayNightConfig = CommonUtils.GetDayNightConfig(_currLevelInfo.DayNightType);
var txtName = CommonUtils.GetLocalizeText(dayNightConfig.NameLocal);
var txtDesc = CommonUtils.GetLocalizeText(dayNightConfig.DescLocal);
var txtContent = txtName + ": " + txtDesc;
Text_Buff.text = txtContent;
}
private void OnLongPressWeather()
{
Image_Buff.gameObject.SetActive(true);
var weatherConfig = CommonUtils.GetWeatherConfig(_currLevelInfo.WeatherType);
var txtName = CommonUtils.GetLocalizeText(weatherConfig.NameLocal);
var txtDesc = CommonUtils.GetLocalizeText(weatherConfig.DescLocal);
var txtContent = txtName + ": " + txtDesc;
Text_Buff.text = txtContent;
}
private void OnLongPressEnvironment()
{
Image_Buff.gameObject.SetActive(true);
var environmentConfig = CommonUtils.GetEnvironmentConfig(_currLevelInfo.EnvironmentType);
var txtName = CommonUtils.GetLocalizeText(environmentConfig.NameLocal);
var txtDesc = CommonUtils.GetLocalizeText(environmentConfig.DescLocal);
var txtContent = txtName + ": " + txtDesc;
Text_Buff.text = txtContent;
}
private void OnPointUpDay()
{
Image_Buff.gameObject.SetActive(false);
}
private void OnPointUpWeather()
{
Image_Buff.gameObject.SetActive(false);
}
private void OnPointUpEnvironment()
{
Image_Buff.gameObject.SetActive(false);
}
private void _SetCostEnergyItemCount()
{
var costItems = _currLevelInfo.CostItems;
var itemCount = costItems.Find(itemCount => itemCount.Id == GLConfig.Inst.data.EnergyPointID);
if (itemCount != null)
{
Text_PhysicalNum.text = itemCount.Count.ToString();
return;
}
Text_PhysicalNum.text = "0";
}
//invoke when open window
protected override void OnShowWindow(object data)
{
base.OnShowWindow(data);
SweepNum = 0;
RefreshUI();
RefreshAllRewardsData();
SetScrollView();
recycleView.ShowList(_allRewards.Count);
RefreshNumScroll();
}
private async void RefreshUI()
{
Text_LevelNum.text = _currLevelInfo.ChapterIndex + "-" + _currLevelInfo.LevelIndex;
Text_LevelName.text = _currLevelInfo.Name;
Text_Buff.text = _currLevelInfo.EnvironmentBuffString;
var dayNightConfig = CommonUtils.GetDayNightConfig(_currLevelInfo.DayNightType);
Image_DayOrNight.sprite = AssetManager.Instance.GetPreLoadResult(dayNightConfig.Icon);
Text_DayOrNight.text = CommonUtils.GetLocalizeText(dayNightConfig.NameLocal);
var weatherConfig = CommonUtils.GetWeatherConfig(_currLevelInfo.WeatherType);
Image_weather.sprite = AssetManager.Instance.GetPreLoadResult(weatherConfig.Icon);
Text_WeatherAndLand01.text = CommonUtils.GetLocalizeText(weatherConfig.NameLocal);
var environmentConfig = CommonUtils.GetEnvironmentConfig(_currLevelInfo.EnvironmentType);
Image_environment.sprite = AssetManager.Instance.GetPreLoadResult(environmentConfig.Icon);
Text_WeatherAndLand02.text = CommonUtils.GetLocalizeText(environmentConfig.NameLocal);
var starResult = _currLevelInfo.StarResult;
for (int i = 0; i < 3; i++)
{
GameObject go =
FindObj(string.Format("Image_BG/LevelDetail/Image_Misson/ImageMissionBar{0}", (i).ToString()));
if (i < _currLevelInfo.LevelData.starTarget.Count)
{
go.SetActive(true);
CommonUtils.GetComponent(go, "TextDescribe").text = _currLevelInfo.GetStarTargetLocalizationText(i);
var rewardIDs = i == 0 ? _currLevelInfo.StarRewardID_1 :
i == 1 ? _currLevelInfo.StarRewardID_2 : _currLevelInfo.StarRewardID_3;
bool isFinish = starResult[i];
if (rewardIDs.Length != 1)
{
DebugUtil.LogError($"关卡星级奖励配置id数目不正确!只能有一个ID! levelID:{_currLevelInfo.ID} 星级:{i + 1}");
}
else
{
var rewardItemList = RewardManager.Instance.Get(rewardIDs[0]).ItemList.Get();
if (rewardItemList.Count > 0)
{
DebugUtil.LogError($"星级目标的奖励数目大于1!levelID:{_currLevelInfo.ID} 星级:{i + 1}");
}
var rewardItem = rewardItemList[0];
TMP_Text getItemText = CommonUtils.GetComponent(go, "RewardContent/TextGetItem");
TMP_Text getItemGrayText = CommonUtils.GetComponent(go, "RewardContent/TextGetItem_Grey");
var text = isFinish ? getItemText : getItemGrayText;
text.text = rewardItem.ShowCountText;
getItemText.gameObject.SetActive(isFinish);
getItemGrayText.gameObject.SetActive(!isFinish);
var imgItem = CommonUtils.GetComponent(go, "RewardContent/ImageItem");
var spritePath = CommonUtils.GetItemPath(rewardItem.ID);
imgItem.sprite = await LoadAssetAsync(spritePath);
}
var finishedStarImage = CommonUtils.GetComponent(go, "ImageWinStart");
var notFinishedStarImage = CommonUtils.GetComponent(go, "ImageFailedStart");
finishedStarImage.gameObject.SetActive(isFinish);
notFinishedStarImage.gameObject.SetActive(!isFinish);
}
else
{
go.SetActive(false);
}
}
}
private void SetScrollView()
{
ShowIfNull();
}
// private void SetScrollviewItemButton(GameObject @object)
// {
// }
private void RefreshRewardItem(GameObject cell, int index)
{
if (!dicPassReward.TryGetValue(cell.GetInstanceID(), out GenericItem_PassReward item))
{
item = new GenericItem_PassReward(cell);
dicPassReward.Add(cell.GetInstanceID(), item);
}
var rewardInfo = _allRewards[index];
item.SetInfo(rewardInfo.rewardItem, rewardInfo.hasGet, rewardInfo.rewardType);
}
private void RefreshAllRewardsData()
{
_allRewards.Clear();
for (int i = 0; i < _currLevelInfo.NomralRewardID.Length; i++)
{
Reward reward = RewardManager.Instance.Get(_currLevelInfo.NomralRewardID[i]);
foreach (var rewardItem in reward.ItemList.Get())
{
RewardShowItem RewardShowItem =
new RewardShowItem(rewardItem, ERewardType.LevelNormalPassReward, false);
_allRewards.Add(RewardShowItem);
}
}
for (int i = 0; i < _currLevelInfo.FirstRewardID.Length; i++)
{
Reward reward = RewardManager.Instance.Get(_currLevelInfo.FirstRewardID[i]);
foreach (var rewardItem in reward.ItemList.Get())
{
RewardShowItem RewardShowItem =
new RewardShowItem(rewardItem, ERewardType.LevelFirstPassReward, _currLevelInfo.HasPass);
_allRewards.Add(RewardShowItem);
}
}
}
private bool ShowIfNull()
{
FindObj("Image_BG/RewardAndSweep/Text_GetReward/NoRewards").SetActive(_allRewards.Count == 0);
return _allRewards.Count == 0;
}
#region NumScroll
private void RefreshNumScroll()
{
if (_numScrollView != null)
{
return;
}
_numScrollView = GetComponent("Image_BG/RewardAndSweep/Text_Sweep/SweepNum/ScrollView");
_numItem = FindObj("Image_BG/RewardAndSweep/Text_Sweep/SweepNum/ItemNum");
var content = CommonUtils.GetGameObject(_numScrollView.gameObject, "Viewport/Content");
List itemL = new List();
for (int i = 0; i < 3; i++)
{
var go = Instantiate(_numItem);
go.transform.SetParent(content.transform);
RefreshItemHide(go);
itemL.Add(go);
}
for (int i = 0; i < MAX_SWEEPNUM; i++)
{
var go = Instantiate(_numItem);
go.transform.SetParent(content.transform);
RefreshItem(go, i);
itemL.Add(go);
}
for (int i = 0; i < 3; i++)
{
var go = Instantiate(_numItem);
go.transform.SetParent(content.transform);
RefreshItemHide(go);
itemL.Add(go);
}
_scrollFocusCmp = _numScrollView.GetComponent();
if (_scrollFocusCmp)
{
_scrollFocusCmp.SetData(itemL, MAX_SWEEPNUM + SWEEP_NUM_CONST - 1, SWEEP_NUM_CONST - 1);
_scrollFocusCmp.SetFocusItemFunc(_FocusItemFunc);
_scrollFocusCmp.SetUnFocusItemFunc(_UnFocusItemFunc);
_scrollFocusCmp.Init();
}
}
private void RefreshItemHide(GameObject obj)
{
var txtNum = CommonUtils.GetComponent(obj, "TextNum");
var imgTri = CommonUtils.GetComponent(obj, "ImageTri");
obj.SetActive(true);
txtNum.gameObject.SetActive(false);
imgTri.gameObject.SetActive(false);
}
private void RefreshItem(GameObject obj, int idx)
{
var txtNum = CommonUtils.GetComponent(obj, "TextNum");
var imgTri = CommonUtils.GetComponent(obj, "ImageTri");
txtNum.text = idx.ToString();
if (idx == MAX_SWEEPNUM - 1)
{
imgTri.gameObject.SetActive(false);
}
obj.SetActive(true);
}
private void _FocusItemFunc(GameObject go)
{
//DebugUtil.LogError("触发聚焦 FocusItemFunc");
var txtNum = CommonUtils.GetComponent(go, "TextNum");
txtNum.fontSize = 66f;
}
private void _UnFocusItemFunc(GameObject go)
{
var txtNum = CommonUtils.GetComponent(go, "TextNum");
txtNum.fontSize = 40f;
}
#endregion
//invoke when reload window
protected override void OnReloadWindow(object data = null)
{
}
//invoke when close window
//invoke when destroy
public override void OnRelease()
{
CommonUtils.PreLoadOrUnloadEnvironmentWeatherDayNightIcon(false);
foreach (GenericItem_PassReward genericItem_PassReward in dicPassReward.Values)
{
genericItem_PassReward.Dispose();
}
dicPassReward.Clear();
base.OnRelease();
}
}