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

502 lines
20 KiB
Lua

---@class WBP_SaveGamePanel_C:UUserWidget
---@field Category_Item_1 UWBP_SaveGame_Category_Item_C
---@field Category_Item_2 UWBP_SaveGame_Category_Item_C
---@field Category_Item_3 UWBP_SaveGame_Category_Item_C
---@field Category_Item_4 UWBP_SaveGame_Category_Item_C
---@field Category_Item_5 UWBP_SaveGame_Category_Item_C
---@field Category_Item_6 UWBP_SaveGame_Category_Item_C
---@field Image_CurAchievement_Icon UImage
---@field Panel_AchievementInfo UCanvasPanel
---@field Panel_BG UWBP_WidgetHeader_C
---@field ScrollBox_Achievements UScrollBox
---@field TextBlock_CurAchievement_Condition UTextBlock
---@field TextBlock_CurAchievement_Desc UTextBlock
---@field TextBlock_CurAchievement_State UTextBlock
---@field WrapBox_Achievements UWrapBox
--Edit Below--
require("Script.Global.SaveGameConfigs")
local WBP_SaveGamePanel = {
bInitDoOnce = false,
CategoryButtons = {},
AchievementInfoList = {},
AchievementItems = {},
CurCategoryIndex = -1,
ArchiveTable = nil,
OwnerArchiveData = nil,
};
function WBP_SaveGamePanel:Construct()
self.Panel_BG:Construct()
for i = 1, 6 do
self.CategoryButtons[i] = self["Category_Item_"..tostring(i)]
self.CategoryButtons[i].OwnerPanel = self
end
self.ItemClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_SaveGame_Achievement_Item.WBP_SaveGame_Achievement_Item_C'))
self.WrapBox_Achievements:ClearChildren()
self.AchievementItems = {}
end
function WBP_SaveGamePanel:Destruct()
self.CategoryButtons = {}
end
function WBP_SaveGamePanel:OnShowPanel()
if self.ArchiveTable == nil then
self.ArchiveTable = require('Script.Global.ArchiveTable')
end
self.OwnerArchiveData = GameDataManager.GetLocalPlayerState().ArchiveData
table.print("[WBP_SaveGamePanel][OnShowPanel] OwnerArchiveData", self.OwnerArchiveData)
log_tree("OwnerArchiveData ", self.OwnerArchiveData)
if self.CurCategoryIndex < 0 then
self.CurCategoryIndex = 1
end
self:OnCurCategoryChanged(self.CurCategoryIndex)
NewPlayerGuideManager:RemoveGuide(31)
end
function WBP_SaveGamePanel:OnCurCategoryChanged(InCategory)
if self.OwnerArchiveData == nil then
return
end
self.CurCategoryIndex = InCategory
for i = 1, 6 do
if i ~= InCategory then
self.CategoryButtons[i]:SetIsSelected(false)
else
self.CategoryButtons[i]:SetIsSelected(true)
end
end
self:SetCurAchievementItems(InCategory)
if not table.isEmpty(self.AchievementItems) then
self.Panel_AchievementInfo:SetVisibility(ESlateVisibility.SelfHitTestInvisible)
self.ScrollBox_Achievements:ScrollToStart() --滚动框滑到顶
self:OnCurAchievementChanged(self.AchievementItems[1]) --默认选取第一个成就
else
self.Panel_AchievementInfo:SetVisibility(ESlateVisibility.Collapsed)
end
end
function WBP_SaveGamePanel:OnCurAchievementChanged(InAchievementItem)
for _, Item in pairs(self.AchievementItems) do
if Item == InAchievementItem then
Item:SetAchievementIsSelected(true)
else
Item:SetAchievementIsSelected(false)
end
end
--Icon
local Info = InAchievementItem.Info
if Info.HasGained then
self.TextBlock_CurAchievement_State:SetColorAndOpacity({SpecifiedColor={R=1,G=0.258763,B=0.029837,A=1},ColorUseRule=0})
self.TextBlock_CurAchievement_State:SetText("已获得")
else
self.TextBlock_CurAchievement_State:SetColorAndOpacity({SpecifiedColor={R=0.015625,G=0.015625,B=0.015625,A=1},ColorUseRule=0})
self.TextBlock_CurAchievement_State:SetText("未获得")
end
self.TextBlock_CurAchievement_Condition:SetText(Info.Condition)
self.TextBlock_CurAchievement_Desc:SetText(Info.Desc)
UIManager.LoadTexture(self.Image_CurAchievement_Icon, Info.Icon)
end
function WBP_SaveGamePanel:SetCurAchievementItems(Index)
if self.AchievementInfoList[Index] == nil then
if Index == 1 then
self.AchievementInfoList[Index] = self:SetGameClearanceAchievements()
elseif Index == 2 then
self.AchievementInfoList[Index] = self:SetScoreAchievements()
elseif Index == 3 then
self.AchievementInfoList[Index] = self:SetEasterEggAchievements()
elseif Index == 4 then
self.AchievementInfoList[Index] = self:SetDropItemAchievements()
elseif Index == 5 then
self.AchievementInfoList[Index] = self:SetGameAchievements()
elseif Index == 6 then --商店类,暂无
self.AchievementInfoList[Index] = {}
end
end
self:SetupAchievementItems(self.AchievementInfoList[Index])
end
function WBP_SaveGamePanel:SetGameClearanceAchievements()
local PlayedGames = self.OwnerArchiveData.PlayedGames
local AchievementList = {}
local IconPath = SaveGameConfigs.Icons.GameClearance
local GameClearanceRewards = self.ArchiveTable.GameClearanceRewards
for GameDifficulty, RewardInfo in pairs(GameClearanceRewards) do
local DifficultyStr = ""..tostring(GameDifficulty)
local PlayedTimes = PlayedGames[GameDifficulty]
for ConditionTimes, Info in pairs(RewardInfo) do
local AchievementData = {
HasGained = false,
ConditionTimes = ConditionTimes,
Difficulty = GameDifficulty,
Icon = IconPath,
Num = DifficultyStr,
Condition = string.format("%s难度通关%d次以上", DifficultyStr, ConditionTimes),
Desc = self:ParseRewardDesc(Info),
}
if PlayedTimes and PlayedTimes >= ConditionTimes then
AchievementData.HasGained = true
end
table.insert(AchievementList, AchievementData)
end
end
table.sort(AchievementList, function(a, b)
if a.HasGained == true and b.HasGained == false then
return true
elseif a.HasGained == b.HasGained then
if a.Difficulty < b.Difficulty then
return true
elseif a.Difficulty == b.Difficulty then
return a.ConditionTimes < b.ConditionTimes
end
return false
end
return false
end)
return AchievementList
end
function WBP_SaveGamePanel:SetScoreAchievements()
local AchievementList = {}
local PlayerScore = self.OwnerArchiveData.Score
--local RewardTable = self.ArchiveTable.CreditRewards
for Index, RewardInfo in pairs(ArchiveTable.CreditRewards) do
local AchievementData = {
HasGained = false,
Icon = SaveGameConfigs.Icons.Score,
Num = RewardInfo.Reach,
Condition = string.format("积分达到%d以上", RewardInfo.Reach),
Desc = self:ParseRewardDesc(RewardInfo.Reward),
}
if PlayerScore >= RewardInfo.Reach then
AchievementData.HasGained = true
end
table.insert(AchievementList, AchievementData)
end
table.sort(AchievementList, function(a, b)
if a.Num < b.Num then
if a.HasGained == true and b.HasGained == false then
return true
elseif a.HasGained == false and b.HasGained == true then
return false
end
return true
end
return false
end)
return AchievementList
end
function WBP_SaveGamePanel:SetEasterEggAchievements()
local AchievementList = {}
local PlayerEasterEggs = self.OwnerArchiveData.EasterEggs
local RewardTable = self.ArchiveTable.EasterEggs
for k, v in pairs(PlayerEasterEggs) do
local RewardInfo = RewardTable[k]
if RewardInfo == nil then
UE.Log("[WBP_SaveGamePanel][SetEasterEggAchievements] Can't Find RewardInfo")
else
local AchievementData = {
HasGained = false,
Index = k,
Icon = SaveGameConfigs.Icons.EasterEggs[k],
Num = RewardInfo.Name,
Condition = RewardInfo.Condition,
Desc = self:ParseRewardDesc(RewardInfo.Reward),
}
if v.Active == true then
AchievementData.HasGained = true
end
table.insert(AchievementList, AchievementData)
end
end
table.sort(AchievementList, function(a, b)
if a.HasGained == true and b.HasGained == false then
return true
elseif a.HasGained == b.HasGained then
if a.Index < b.Index then
if a.HasGained == true and b.HasGained == false then
return true
elseif a.HasGained == false and b.HasGained == true then
return false
end
return true
end
return false
end
return false
end)
return AchievementList
end
function WBP_SaveGamePanel:SetDropItemAchievements()
local AchievementList = {}
local PlayerBossDropItems = self.OwnerArchiveData.BossDropItems
local PlayerGameDropItems = self.OwnerArchiveData.GameDropItems
local BossDropItemName = {'武器','盔甲','腿铠','足屐','套装',}
local GameDropItemName = {'握把','枪口','弹夹','枪托','瞄准镜'}
--local RewardTable1 = self.ArchiveTable.BossDropItems
--local RewardTable2 = self.ArchiveTable.DropGameItems
for BossName, RewardInfo in pairs(self.ArchiveTable.BossDropItems) do
for Type, Data in pairs(RewardInfo) do
local AchievementData = {
HasGained = false,
Icon = SaveGameConfigs.Icons.BossDropItems[BossName][Type],
Num = string.format("%s之%s", BossName, BossDropItemName[Type]),
Condition = "",
Desc = "",
BossName = BossName,
AchievementType = 2,
ItemType = Type,
}
local CurPlayerDropData = PlayerBossDropItems[BossName]
if Type <= 4 then
if CurPlayerDropData and CurPlayerDropData[Type] and CurPlayerDropData[Type] > 0 then
AchievementData.HasGained = true
AchievementData.Desc = self:ParseRewardDescWithTable(Data.Rewards, CurPlayerDropData[Type])
else
AchievementData.Desc = self:ParseRewardDescWithTable(Data.Rewards, 1)
end
else
AchievementData.Desc = self:ParseRewardDescWithTable(Data.Rewards, 1)
if table.getCount(CurPlayerDropData) >= 4 and CurPlayerDropData[1] ~= nil then
AchievementData.HasGained = true
end
end
table.insert(AchievementList, AchievementData)
end
end
-- 读取碎片
local ChipCount = 0
for GameDifficulty, Data in pairs(PlayerGameDropItems) do
for Type, Count in pairs(Data) do
if Type == 6 then
ChipCount = ChipCount + Count*GameDifficulty
end
end
end
local WeaponPartName = '碎片'
local ChipAchievementData = {
HasGained = false,
Icon = SaveGameConfigs.Icons.GameDropItems[WeaponPartName],
Num = "",
Condition = "",
Desc = "",
AchievementType = 0,
ItemType = 0,
}
if ChipCount > 0 then
ChipAchievementData.HasGained = true
ChipAchievementData.Num = string.format("碎片*%d", ChipCount)
ChipAchievementData.Desc = self:ParseRewardDescWithTable(self.ArchiveTable.DropGameItems[WeaponPartName], ChipCount)
else
ChipAchievementData.Num = string.format("碎片*%d", 0)
ChipAchievementData.Desc = self:ParseRewardDescWithTable(self.ArchiveTable.DropGameItems[WeaponPartName], 1)
end
table.insert(AchievementList, ChipAchievementData)
for Difficulty = 1, 66 do
for Type = 1, 5 do
local WeaponPartName = GameDropItemName[Type]
local AchievementData = {
HasGained = false,
Icon = SaveGameConfigs.Icons.GameDropItems[WeaponPartName],
Num = string.format("难%d %s", Difficulty, WeaponPartName),
Condition = "",
Desc = self:ParseRewardDesc(self.ArchiveTable.DropGameItems[WeaponPartName]),
Difficulty = Difficulty,
AchievementType = 1,
ItemType = Type,
}
local GameDropData = PlayerGameDropItems[Difficulty]
if GameDropData and GameDropData[Type] then
AchievementData.HasGained = true
end
table.insert(AchievementList, AchievementData)
end
if PlayerGameDropItems[Difficulty] and table.getCount(PlayerGameDropItems[Difficulty]) >= 5 and PlayerGameDropItems[Difficulty][1] ~= nil then
local WeaponPartName = '套装'
local AchievementData = {
HasGained = true,
Icon = SaveGameConfigs.Icons.GameDropItems[WeaponPartName],
Num = string.format("难%d %s", Difficulty, WeaponPartName),
Condition = "",
Desc = self:ParseRewardDescWithTable(self.ArchiveTable.DropGameItems[WeaponPartName], 1),
Difficulty = Difficulty,
AchievementType = 1,
ItemType = 6,
}
table.insert(AchievementList, AchievementData)
end
end
table.sort(AchievementList, function(a, b)
if a.HasGained == true and b.HasGained == false then
return true
elseif a.HasGained == b.HasGained then
if a.AchievementType == b.AchievementType then
if a.AchievementType == 1 then
if a.Difficulty == b.Difficulty then
return a.ItemType < b.ItemType
end
return a.Difficulty < b.Difficulty
elseif a.AchievementType == 2 then
if a.BossName == b.BossName then
return a.ItemType < b.ItemType
else
local BossNameIndex = {[''] = 1, [''] = 2, [''] = 3, [''] = 4, [''] = 5, [''] = 6}
return BossNameIndex[a.BossName] < BossNameIndex[b.BossName]
end
end
end
return a.AchievementType < b.AchievementType
end
return false
end)
return AchievementList
end
function WBP_SaveGamePanel:SetGameAchievements()
local AchievementList = {}
local GameAchievements = {
['通关'] = {Value = self.OwnerArchiveData.GameClearanceTimes, ConditionStr = "通关%d次"},
['击败'] = {Value = self.OwnerArchiveData.TotalBossKilledTimes, ConditionStr = "共击败首领%d次"},
['金币'] = {Value = self.OwnerArchiveData.TotalCoinPoint / 10000, ConditionStr = "共获得%dw金币"},
['科技点'] = {Value = self.OwnerArchiveData.TotalKillPoint, ConditionStr = "共获得%d科技点"},
['技能'] = {Value = self.OwnerArchiveData.TotalSuperSkill, ConditionStr = "共获得超级技能%d个"},
--['配件'] = {Value = self.OwnerArchiveData.TotalSuperFitting, ConditionStr = "共获得超级配件%d个"},
['开箱'] = {Value = self.OwnerArchiveData.TotalUnpackTimes, ConditionStr = "开箱次数达到%d次"},
}
for AchievementName, Data in pairs(GameAchievements) do
local RewardTable = self.ArchiveTable.AchievementRewards[AchievementName]
for RewardReach, RewardInfo in pairs(RewardTable) do
local AchievementData = {
HasGained = false,
Sort = {Name = AchievementName, Reach = RewardReach},
Icon = SaveGameConfigs.Icons.Achievements[AchievementName][RewardReach],
Num = RewardInfo.Name,
Condition = string.format(Data.ConditionStr, RewardReach),
Desc = self:ParseRewardDesc(RewardInfo.Reward),
}
if Data.Value >= RewardReach then
AchievementData.HasGained = true
end
table.insert(AchievementList, AchievementData)
end
end
table.sort(AchievementList, function(a, b)
if a.HasGained == true and b.HasGained == false then
return true
elseif a.HasGained == b.HasGained then
local NameSort = {['通关'] = 1, ['击败'] = 2, ['金币'] = 3, ['科技点'] = 4, ['技能'] = 5, ['配件'] = 6, ['开箱'] = 7,}
local NameIndex1 = NameSort[a.Sort.Name]
local NameIndex2 = NameSort[b.Sort.Name]
if NameIndex1 == NameIndex2 then
return a.Sort.Reach < b.Sort.Reach
elseif NameIndex1 > NameIndex2 then
return false
end
return true
end
return false
end)
return AchievementList
end
function WBP_SaveGamePanel:SetupAchievementItems(AchievementDataList)
if AchievementDataList == nil then
return
end
self.AchievementItems = {}
local ChildIndex = 0
for _, AchievementData in pairs(AchievementDataList) do
local AchievementItemWidget = self.WrapBox_Achievements:GetChildAt(ChildIndex)
if AchievementItemWidget == nil then
AchievementItemWidget = UserWidget.NewWidgetObjectBP(UGCGameSystem.GameState, self.ItemClass)
AchievementItemWidget.OwnerPanel = self
self.WrapBox_Achievements:AddChildWrapBox(AchievementItemWidget)
else
AchievementItemWidget:SetVisibility(ESlateVisibility.SelfHitTestInvisible)
end
AchievementItemWidget:InitAchievementInfo(AchievementData)
table.insert(self.AchievementItems, AchievementItemWidget)
ChildIndex = ChildIndex + 1
end
local ChildCount = self.WrapBox_Achievements:GetChildrenCount()
if ChildIndex < ChildCount then
for i = ChildIndex, ChildCount do
local AchievementItemWidget = self.WrapBox_Achievements:GetChildAt(i)
if AchievementItemWidget and UE.IsValid(AchievementItemWidget) then
AchievementItemWidget:SetVisibility(ESlateVisibility.Collapsed)
end
end
end
end
function WBP_SaveGamePanel:ParseRewardDesc(InfoTable)
local Type = InfoTable.Type
local Value = InfoTable.Value
local Unit = InfoTable.Unit
if Type == nil or Value == nil or Unit == nil then
return ""
end
local NeedPercentSign = false
local DescStr = string.gsub(Type,"%p+","")..(Value >= 0 and "+" or "-")
if Unit == "%" then
Value = (math.abs(Value)) * 100.0
NeedPercentSign = true
end
local int, decimal = math.modf(Value)
local ValueStr = decimal > 0.001 and string.format("%.1f", Value) or string.format("%d", math.floor(Value))
DescStr = DescStr..ValueStr..(NeedPercentSign and "%" or "")
return DescStr
end
function WBP_SaveGamePanel:ParseRewardDescWithTable(RewardRewardInfo, Count)
Count = Count or 1.0
local DescStr = ""
for index, Info in pairs(RewardRewardInfo) do
local NeedPercentSign = false
local Type = Info.Type
local Value = Info.Value
local Unit = Info.Unit
if Type == nil or Value == nil or Unit == nil then
break
end
DescStr = DescStr..string.gsub(Type,"%p+","")..(Value >= 0 and "+" or "-")
if Unit == "%" then
Value = (math.abs(Value)) * 100.0
NeedPercentSign = true
end
Value = Value * Count
local int, decimal = math.modf(Value)
local ValueStr = decimal > 0.001 and string.format("%.1f", Value) or string.format("%d", math.floor(Value))
DescStr = DescStr..ValueStr..(NeedPercentSign and "%" or "")..(next(RewardRewardInfo, index) ~= nil and "\n" or "")
end
return DescStr
end
return WBP_SaveGamePanel;