UGCProjects/GZJ/Script/UI/WBP_SettlementPanel.lua
2025-01-08 22:46:12 +08:00

629 lines
19 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---@class WBP_SettlementPanel_C:UUserWidget
---@field Button_Back UNewButton
---@field Panel_Avatar UWBP_AvatarFrame_C
---@field Panel_Settlement UCanvasPanel
---@field Panel_Waiting UCanvasPanel
---@field PlayerInfoList UVerticalBox
---@field ScrollBox_SaveItems UScrollBox
---@field TextBlock_BackToLobby UTextBlock
---@field TextBlock_Difficulty UTextBlock
---@field TextBlock_GameDuration UTextBlock
---@field TextBlock_GameIsWin UTextBlock
---@field TextBlock_Status UTextBlock
---@field WidgetSwitcher_Save UWidgetSwitcher
---@field WidgetSwitcher_TitleBG UWidgetSwitcher
---@field ItemClass UClass
--Edit Below--
local WBP_SettlementPanel = {
bInitDoOnce = false;
-- 对象池初始化数量
InitCount = 0,
FirstOpen = true;
-- 存放数组,如果之后需要改变排序,直接改变即可,不需要在计算一遍
SaveGames = {
},
};
function WBP_SettlementPanel:Construct()
WBP_SettlementPanel.SuperClass.Construct(self);
self:BindEvents();
self.ScrollBox_SaveItems:ClearChildren();
end
function WBP_SettlementPanel:Destruct()
self:UnBindEvents()
if self.CountDownHandle ~= nil then
EventSystem.StopTimer(self.CountDownHandle)
self.CountDownHandle = nil
end
end
function WBP_SettlementPanel:OnShowPanel()
self.Panel_Settlement:SetVisibility(ESlateVisibility.Collapsed)
self.Panel_Waiting:SetVisibility(ESlateVisibility.SelfHitTestInvisible)
local GameResultData = UGCGameSystem.GameState.GameResultData
if GameResultData ~= nil and table.isEmpty(GameResultData) == false then
self.Panel_Settlement:SetVisibility(ESlateVisibility.SelfHitTestInvisible)
self.Panel_Waiting:SetVisibility(ESlateVisibility.Collapsed)
self:ShowResult(GameResultData)
self:ShowArchive()
else
if self.WaitTimerHandle ~= nil then
EventSystem.StopTimer(self.WaitTimerHandle)
end
self.WaitTimerHandle = EventSystem.SetTimerLoop(self, function()
local GameResultData = UGCGameSystem.GameState.GameResultData
if GameResultData ~= nil and table.isEmpty(GameResultData) == false then
self.Panel_Settlement:SetVisibility(ESlateVisibility.SelfHitTestInvisible)
self.Panel_Waiting:SetVisibility(ESlateVisibility.Collapsed)
self:ShowResult(GameResultData)
self:ShowArchive()
EventSystem.StopTimer(self.WaitTimerHandle)
self.WaitTimerHandle = nil
end
end, 0.1)
end
local CountDownRemain = 20.0
self.TextBlock_BackToLobby:SetText(string.format("(%d)返回大厅", math.floor(CountDownRemain)))
self.CountDownHandle = EventSystem.SetTimerLoop(UGCGameSystem.GameState, function()
CountDownRemain = CountDownRemain - 1
self.TextBlock_BackToLobby:SetText(string.format("(%d)返回大厅", math.floor(CountDownRemain)))
if CountDownRemain <= 0 then
UE.Log("[WBP_SettlementPanel] Auto Back To Lobby")
self:OnButtonBackClicked()
end
end, 1.0)
end
-- function WBP_SettlementPanel:InitFromParam(GameResultData)
-- self:ShowResult(GameResultData)
-- self:ShowArchive();
-- end
function WBP_SettlementPanel:BindEvents()
self.Button_Back.OnClicked:Add(WBP_SettlementPanel.OnButtonBackClicked, self)
end
function WBP_SettlementPanel:UnBindEvents()
self.Button_Back.OnClicked:Remove(WBP_SettlementPanel.OnButtonBackClicked, self)
end
function WBP_SettlementPanel:ShowResult(GameResultData)
--隐藏主UI
local PC = STExtraGameplayStatics.GetFirstPlayerController(self)
if PC then
PC:CastUIMsg("MainControlPanel_HideAllUI", "ingame");
else
UE.Log("[WBP_SettlementPanel:ShowResult] Error: PC is nil!")
end
--TODO: 游戏成功和失败的显示
self.WidgetSwitcher_TitleBG:SetActiveWidgetIndex(GameResultData.IsWin and 0 or 1)
self.TextBlock_GameIsWin:SetText(GameResultData.IsWin and "通关" or "失败")
self.TextBlock_Status:SetText(GameResultData.IsWin and "守卫光子鸡" or "淘汰")
self.TextBlock_Difficulty:SetText(string.format("难%d", GameResultData.GameDifficulty))
self.TextBlock_GameDuration:SetText(string.format("%ds", GameResultData.GameDuration))
local LocalPlayerState = GameDataManager.GetLocalPlayerState()
if LocalPlayerState then
self:InitAvatar(LocalPlayerState)
end
self:InitSettlementPlayerList(GameResultData)
end
function WBP_SettlementPanel:InitAvatar(InPlayerState)
local UID = InPlayerState.UID
local IconURL = InPlayerState.IconURL
local Gender = InPlayerState.PlatformGender
local FrameLevel = InPlayerState.SegmentLevel
local PlayerLevel = InPlayerState.PlayerLevel
self.Panel_Avatar:InitView(UID, IconURL, Gender, FrameLevel, PlayerLevel, true, true)
self.Panel_Avatar:SetPlayerName(InPlayerState.PlayerName)
end
--初始化结算玩家列表
function WBP_SettlementPanel:InitSettlementPlayerList(GameResultData)
if next(GameResultData) == nil then
return false
end
if not UE.IsValid(self.ItemClass) then
UE.LogError("[WBP_SettlementPanel:InitSettlementPlayerList] ItemClass is invalid")
return false
end
--根据玩家结算数据创建对应数量的玩家数据UI条目控件
for i, PlayerResultData in pairs(GameResultData.PlayerResultDatas) do
local PlayerListItemClass = self.ItemClass
local PlayerListItem = UserWidget.NewWidgetObjectBP(UGCGameSystem.GameState, PlayerListItemClass)
if PlayerListItem then
self.PlayerInfoList:AddChild(PlayerListItem)
PlayerListItem:Init(PlayerResultData)
else
UE.LogError("[WBP_SettlementPanel:InitSettlementPlayerList] PlayerListItem is nil!")
end
end
end
function WBP_SettlementPanel:OnButtonBackClicked()
EventSystem.StopTimer(self.CountDownHandle)
self.CountDownHandle = nil
local PlayerController = STExtraGameplayStatics.GetFirstPlayerController(self)
if PlayerController then
PlayerController:ExitGame()
else
UE.Log("[WBP_SettlementPanel:OnButtonBackClicked] PlayerController is nil")
end
UGCGameSystem.ReturnToLobby()
end
function WBP_SettlementPanel:OnClickSave()
if self.WBP_SettleSave:IsVisible() then
self.WBP_SettleSave:SetVisibility(ESlateVisibility.Collapsed);
else
-- 显示结算存档界面
self.WBP_SettleSave:SetVisibility(ESlateVisibility.SelfHitTestInvisible);
-- 初始化
self.WBP_SettleSave:ShowArchive();
end
end
function WBP_SettlementPanel:ShowArchive()
print(string.format("[WBP_SettlementPanel:ShowArchive] 进入"))
if self.FirstOpen == false then
return
end
self.FirstOpen = false;
-- 这里面就是变化,还是要根据每一个具体显示
local Results = self:CompareArchive();
log_tree("[WBP_SettlementPanel:ShowArchive] Results = ", Results);
-- 显示存档,根据顺序进行排列
self:ShowItem_GameClearance(Results.GameClearanceDiff);
self:ShowItem_Credit(Results.CreditDiff);
self:ShowItem_EasterEggs(Results.EasterEggsDiff);
self:ShowItem_Achievement(Results.AchievementDiff);
self:ShowItem_GameDrop(Results.GameDropDiff);
self:ShowItem_BossDrop(Results.BossDropDiff);
print(string.format("[WBP_SettlementPanel:ShowArchive] 显示完全"));
-- 设置数据
log_tree("[WBP_SettlementPanel:ShowArchive] self.SaveGames = ", self.SaveGames)
self:SetItemInfos();
print(string.format("[WBP_SettlementPanel:ShowArchive] 设置完全"));
end
function WBP_SettlementPanel:SetItemInfos()
if #self.SaveGames == 0 then
self.WidgetSwitcher_Save:SetActiveWidgetIndex(0);
return;
end
self.WidgetSwitcher_Save:SetActiveWidgetIndex(1)
log_tree("[WBP_SettlementPanel:SetItemInfos] self.SaveGames = ", self.SaveGames)
local ChildrenCount = self.ScrollBox_SaveItems:GetChildrenCount()
local SaveGameCount = #self.SaveGames
if ChildrenCount < SaveGameCount then
self:InitObjectPool(SaveGameCount - ChildrenCount)
end
for i, Info in pairs(self.SaveGames) do
self.ScrollBox_SaveItems:GetChildAt(i - 1):SetSaveInfo(Info)
self.ScrollBox_SaveItems:GetChildAt(i - 1):SetVisibility(ESlateVisibility.SelfHitTestInvisible)
end
end
-- 返回新增的存档,数据结构如下
-- {
-- [Difficult] = { Time1 }
-- }
--- 例如:
--- {
--- [10] = { 3, 5 }
---}
function WBP_SettlementPanel:GameClearanceDiff(InOld, InLast)
local Results = {}
-- 记录增量变化
-- 去检查一下 ArchiveTable 中当前的存档
local Func = function(InDiff, InTimes)
local ValTable = {
[InDiff] = {}
}
ValTable[InDiff] = {}
for i, v in pairs(ArchiveTable.GameClearanceRewards[InDiff]) do
if InTimes >= i then
table.insert(ValTable[InDiff], i);
end
end
return ValTable;
end
-- InTable: Results; InAddTable: [Diff] = { Times }
local AddResultFunc = function(InAddTable)
for i, v in pairs(InAddTable) do
Results[i] = v
end
end
for Diff, Times in pairs(InLast) do
if InOld[Diff] == nil then
-- 说明全部是新的
local NewAdd = Func(Diff, Times)
AddResultFunc(NewAdd)
else
-- 判断当前已经打到第几个阶段了
local OldTable = Func(Diff, InOld[Diff])
local NewTable = Func(Diff, Times)
-- 做插值
local DiffTable = table.Diff(OldTable, NewTable)
AddResultFunc(DiffTable)
end
end
if table.getCount(Results) == 0 then
return nil;
end
return Results;
end
function WBP_SettlementPanel:CreditDiff(InOld, InLast)
local Results = {}
-- 获取积分的最大值
local Func = function(Val)
local Max = 0
for i, v in pairs(ArchiveTable.CreditRewards) do
if v.Reach >= Val then
return i - 1
end
Max = i;
end
return Max;
end
local Old = Func(InOld)
local New = Func(InLast)
if Old ~= New then
for i = Old + 1, New do
table.insert(Results, i)
end
end
if table.getCount(Results) == 0 then
return nil;
end
return Results
end
function WBP_SettlementPanel:EasterEggsDiff(InOld, InLast)
local Results = {}
for i, v in pairs(InLast) do
if v.Active == true and InOld[i].Active == false then
table.insert(Results, i)
end
end
return Results;
end
-- 成就类型: { Val }
function WBP_SettlementPanel:AchievementDiff(InKey, InOld, InLast)
-- 做成数组
local MakeArrFunc = function(TheKey)
local Ret = {}
for i, v in pairs(ArchiveTable.AchievementRewards[TheKey]) do
Ret[#Ret + 1] = i;
--table.insert(Ret, i)
end
return Ret;
end
local Arr = MakeArrFunc(InKey)
local Func = function(InArr, Val)
local Ret = {}
for i, v in pairs(InArr) do
if Val >= v then
Ret[#Ret + 1] = i; -- 添加进去
end
end
return Ret;
end
local OldMax = Func(Arr, InOld)
local LastMax = Func(Arr, InLast)
local Results = {}
-- 判断哪些没有
for Index, AchieveIndex in pairs(LastMax) do
if OldMax[Index] == nil then
Results[#Results + 1] = Arr[AchieveIndex];
end
end
if table.getCount(Results) == 0 then
return nil;
end
return Results;
end
-- 游戏掉落物
-- { [Diff] = { Type: Count } }
function WBP_SettlementPanel:GameDropDiff(InOld, InLast)
local Results = {}
for Diff, Table in pairs(InLast) do
if InOld[Diff] ~= nil then
for Type, Count in pairs(Table) do
local OldVal = InOld[Diff][Type]
if OldVal == nil then
Results[Diff] = {
[Type] = Count
}
else
if Count - OldVal ~= 0 then
Results[Diff] = {
[Type] = Count - OldVal
}
end
end
end
else
Results[Diff] = Table;
end
end
return Results;
end
function WBP_SettlementPanel:BossDropDiff(InOld, InLast)
-- Table: { Type: Count }
local Results = {}
for BossName, Table in pairs(InLast) do
if InOld[BossName] == nil then
Results[BossName] = Table
else
Results[BossName] = {}
for Type, Count in pairs(Table) do
local OldVal = InOld[BossName][Type]
if OldVal == nil then
Results[BossName][Type] = Count
else
if Count - OldVal ~= 0 then
Results[BossName][Type] = Count - OldVal;
end
end
end
if table.getCount(Results[BossName]) == 0 then
Results[BossName] = nil;
end
end
end
if table.getCount(Results) == 0 then
Results = nil;
end
return Results;
end
--比较前后变化
function WBP_SettlementPanel:CompareArchive()
print(string.format("[WBP_SettlementPanel:CompareArchive] 执行"))
local BeforeArchive = GameDataManager.GetLocalPlayerState().SavedArchiveData
print(string.format("[WBP_SettlementPanel:CompareArchive] BeforeArchive"))
print(table.logTree(BeforeArchive));
local LastArchive = GameDataManager.GetLocalPlayerState().GameEndSavedArchiveData;
print(string.format("[WBP_SettlementPanel:CompareArchive] LastArchive"))
print(table.logTree(LastArchive));
log_tree("[WBP_SettlementPanel:CompareArchive] BeforeArchive = ", BeforeArchive);
log_tree("[WBP_SettlementPanel:CompareArchive] LastArchive = ", LastArchive);
local Results = {}
Results.GameClearanceDiff = self:GameClearanceDiff(BeforeArchive["PlayedGames"], LastArchive["PlayedGames"])
--log_tree("[WBP_SettlementPanel:CompareArchive] Results 1111111 = ", Results)
Results.CreditDiff = self:CreditDiff(BeforeArchive["Score"], LastArchive["Score"])
--log_tree("[WBP_SettlementPanel:CompareArchive] Results 2222222 = ", Results)
Results.EasterEggsDiff = self:EasterEggsDiff(BeforeArchive["EasterEggs"], LastArchive["EasterEggs"])
--log_tree("[WBP_SettlementPanel:CompareArchive] Results 3333333 = ", Results)
-- 成就类
Results.AchievementDiff = {}
Results.AchievementDiff["通关"] = self:AchievementDiff("通关", BeforeArchive.GameClearanceTimes, LastArchive.GameClearanceTimes)
Results.AchievementDiff["击败"] = self:AchievementDiff("击败", BeforeArchive.TotalBossKilledTimes, LastArchive.TotalBossKilledTimes)
Results.AchievementDiff["金币"] = self:AchievementDiff("金币", BeforeArchive.TotalCoinPoint / 10000, LastArchive.TotalCoinPoint / 10000)
Results.AchievementDiff["科技点"] = self:AchievementDiff("科技点", BeforeArchive.TotalKillPoint, LastArchive.TotalKillPoint)
Results.AchievementDiff["技能"] = self:AchievementDiff("技能", BeforeArchive.TotalSuperSkill, LastArchive.TotalSuperSkill)
--Results.AchievementDiff["配件"] = self:AchievementDiff("配件", BeforeArchive.TotalSuperFitting, LastArchive.TotalSuperFitting)
Results.AchievementDiff["开箱"] = self:AchievementDiff("开箱", BeforeArchive.TotalUnpackTimes, LastArchive.TotalUnpackTimes)
--log_tree("[WBP_SettlementPanel:CompareArchive] Results 4444444 = ", Results)
Results.GameDropDiff = self:GameDropDiff(BeforeArchive.GameDropItems, LastArchive.GameDropItems)
--log_tree("[WBP_SettlementPanel:CompareArchive] Results 5555555 = ", Results)
Results.BossDropDiff = self:BossDropDiff(BeforeArchive.BossDropItems, LastArchive.BossDropItems)
--log_tree("[WBP_SettlementPanel:CompareArchive] Results 6666666 = ", Results)
-- 精简一下
for i, v in pairs(Results) do
if table.isEmpty(v) == true then
Results[i] = nil;
end
end
print(string.format("[WBP_SettlementPanel:CompareArchive] Result"))
print(table.logTree(Results));
log_tree("[WBP_SettlementPanel:CompareArchive] Results = ", Results)
return Results;
end
function WBP_SettlementPanel:GetTypeValue(InArchive, InNum)
local Archive = InArchive
if InArchive.Type == nil then
local Val = ''
for i, v in pairs(InArchive) do
Val = self:GetTypeValue(v, InNum) .. '\n' .. Val
end
return Val
end
if InNum == nil then
InNum = 1
end
local Num = Archive.Value * InNum
local Type = Archive.Type
-- 替换掉 %
if string.find(Type, '%%') ~= nil then
Type = string.gsub(Type, '%%', '')
end
local Unit = ""
if Archive.Unit == '%' then
Unit = '%'
Num = Num * 100
end
if math.type(Archive.Value) == 'float' then
Num = string.format("%.2f", Num)
elseif math.type(Archive.Value) == 'integer' then
Num = string.format("%d", Archive.Value)
end
return string.format('%s + %s', Type, Num .. Unit)
end
-- 初始化对象池
function WBP_SettlementPanel:InitObjectPool(InSize)
if InSize == nil then
InSize = self.InitCount
end
-- 先清空
self.ScrollBox_SaveItems:ClearChildren()
local ClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/ChildWidgets/WBP_SettlementSaveItem.WBP_SettlementSaveItem_C')
local ItemClass = UE.LoadClass(ClassPath)
for i = 1, InSize do
local Item = UserWidget.NewWidgetObjectBP(UGCGameSystem.GameState, ItemClass)
-- 添加进去
self.ScrollBox_SaveItems:AddChild(Item)
-- 设置隐藏
Item:SetVisibility(ESlateVisibility.Collapsed)
end
end
function WBP_SettlementPanel:ShowItem_GameClearance(InData)
-- 存放到数组中
if InData == nil then
return
end
for Diff, TimeTable in pairs(InData) do
for i, Times in pairs(TimeTable) do
-- 处理 Desc
local ItemData = {
Type = ArchiveTable.ArchiveType.GameClearance,
TextVal = string.format("难%d %d次", Diff, Times),
Icon = SaveGameConfigs.Icons.GameClearance,
Desc = self:GetTypeValue(ArchiveTable.GameClearanceRewards[Diff][Times])
}
table.insert(self.SaveGames, ItemData)
end
end
end
function WBP_SettlementPanel:ShowItem_Credit(InData)
if InData == nil then
return
end
for i, CreditRewardsIndex in pairs(InData) do
local ItemData = {
Type = ArchiveTable.ArchiveType.Credit,
TextVal = tostring(ArchiveTable.CreditRewards[CreditRewardsIndex].Reach),
Icon = SaveGameConfigs.Icons.Score,
Desc = self:GetTypeValue(ArchiveTable.CreditRewards[CreditRewardsIndex]["Reward"])
}
table.insert(self.SaveGames, ItemData)
end
end
function WBP_SettlementPanel:ShowItem_EasterEggs(InData)
if InData == nil then
return
end
log_tree("[WBP_SettlementPanel:ShowItem_EasterEggs] InData = ", InData)
for i, v in pairs(InData) do
local ItemData = {
Type = ArchiveTable.ArchiveType.EasterEggs,
Desc = self:GetTypeValue(ArchiveTable.EasterEggs[v]["Reward"]),
Icon = SaveGameConfigs.Icons.EasterEggs[v],
TextVal = ArchiveTable.EasterEggs[v].Name,
}
table.insert(self.SaveGames, ItemData)
end
end
function WBP_SettlementPanel:ShowItem_Achievement(InData)
if InData == nil then
return
end
for Name, ValTable in pairs(InData) do
for i, v in pairs(ValTable) do
local ItemData = {
Type = ArchiveTable.ArchiveType.Achievement,
TextVal = ArchiveTable.AchievementRewards[Name][v].Name,
Icon = SaveGameConfigs.Icons.Achievements[Name][v],
Desc = self:GetTypeValue(ArchiveTable.AchievementRewards[Name][v].Reward),
}
table.insert(self.SaveGames, ItemData)
end
end
end
-- 表示新增的
function WBP_SettlementPanel:ShowItem_GameDrop(InData)
if InData == nil then
return
end
-- Diff: 难度TypeCountTable: 物品:数量
-- 统计所有的
for Diff, TypeCountTable in pairs(InData) do
for Type, Count in pairs(TypeCountTable) do
local Name = ArchiveTable.DropGameItemIndex[Type]
--if self.SaveGames.GameDrop[Name] == nil then
-- self.SaveGames.GameDrop[Name] = {}
--end
local ItemData = {
Type = ArchiveTable.ArchiveType.DropGameItems,
TextVal = string.format('难%d %s', Diff, Name),
Desc = self:GetTypeValue(ArchiveTable.DropGameItems[Name], Diff * Count),
Icon = SaveGameConfigs.Icons.GameDropItems[Name],
}
table.insert(self.SaveGames, ItemData)
end
end
end
function WBP_SettlementPanel:ShowItem_BossDrop(InData)
if InData == nil then
return
end
-- 检查新增
local Func = function(Index)
for c, d in pairs(ArchiveTable.BossDropItemIndexs) do
if Index == d then
return c
end
end
end
for BossName, Table in pairs(InData) do
if table.getCount(Table) == 0 then
else
for i, v in pairs(Table) do
local ItemData = {
Desc = self:GetTypeValue(ArchiveTable.BossDropItems[BossName][i].Rewards, v),
Icon = SaveGameConfigs.Icons.BossDropItems[BossName][i],
Type = ArchiveTable.ArchiveType.DropBossItems,
TextVal = string.format('%s之%s', BossName, Func(i))
}
table.insert(self.SaveGames, ItemData);
end
end
end
end
return WBP_SettlementPanel;