Files
Endfield-Data/LuaScripts/UI/Widgets/CommonMedalNode.lua
2025-12-02 20:37:18 +07:00

129 lines
3.4 KiB
Lua

local UIWidgetBase = require_ex('Common/Core/UIWidgetBase')
CommonMedalNode = HL.Class('CommonMedalNode', UIWidgetBase)
CommonMedalNode.m_achievementData = HL.Field(HL.Any)
CommonMedalNode.m_level = HL.Field(HL.Number) << 0
CommonMedalNode.m_obtained = HL.Field(HL.Boolean) << false
CommonMedalNode.m_plated = HL.Field(HL.Boolean) << false
CommonMedalNode.m_maxLevel = HL.Field(HL.Number) << 0
CommonMedalNode.m_state = HL.Field(HL.String) << ''
CommonMedalNode._OnFirstTimeInit = HL.Override() << function(self)
self:_InitViews()
end
CommonMedalNode.InitCommonMedalNode = HL.Method(HL.String) << function(self, achievementId)
self:_FirstTimeInit()
self.m_achievementData = Tables.achievementTable[achievementId]
local isEmpty = string.isEmpty(achievementId) or self.m_achievementData == nil
if isEmpty then
self.view.stateCtrl:SetState("NotObtained")
return
end
self:_LoadData(achievementId)
self:_RenderViews()
end
CommonMedalNode._InitViews = HL.Method() << function(self)
self.view.button.onClick:RemoveAllListeners()
self.view.button.onClick:AddListener(function()
self:_OnClick()
end)
self:RegisterMessage(MessageConst.ON_ACHIEVEMENT_UPDATE, function(args)
if self.m_achievementData ~= nil and not string.isEmpty(self.m_achievementData.achieveId) then
self:_LoadData(self.m_achievementData.achieveId)
self:_RenderViews()
end
end)
end
CommonMedalNode._LoadData = HL.Method(HL.String) << function(self, achievementId)
local achievementSystem = GameInstance.player.achievementSystem
local succ, playerInfo = achievementSystem.achievementData.achievementInfos:TryGetValue(achievementId)
self.m_level = succ and playerInfo.level or 0
self.m_obtained = succ and playerInfo.level >= self.m_achievementData.initLevel
self.m_plated = succ and playerInfo.isPlated
self.m_maxLevel = self.m_achievementData.initLevel
for i, levelInfo in pairs(self.m_achievementData.levelInfos) do
self.m_maxLevel = math.max(self.m_maxLevel, levelInfo.achieveLevel)
end
self.m_state = "Obtained"
if not self.m_obtained then
self.m_state = "NotObtained"
elseif self.m_achievementData.canBePlated and not self.m_plated then
self.m_state = "CanPlated"
elseif self.m_achievementData.canBePlated and self.m_plated then
self.m_state = "Plated"
elseif self.m_achievementData.canBeUpgraded and self.m_level < self.m_maxLevel then
self.m_state = "CanUpgrade"
elseif self.m_achievementData.canBeUpgraded and self.m_level >= self.m_maxLevel then
self.m_state = "Upgraded"
end
end
CommonMedalNode._RenderViews = HL.Method() << function(self)
if self.m_obtained then
local medalBundle = {
achievementId = self.m_achievementData.achieveId,
level = self.m_level,
isPlated = self.m_plated,
isRare = self.m_achievementData.applyRareEffect,
}
self.view.medal:InitMedal(medalBundle)
end
self.view.stateCtrl:SetState(self.m_state)
end
CommonMedalNode._OnClick = HL.Method() << function(self)
if self.m_achievementData == nil then
return
end
local achievementId = self.m_achievementData.achieveId
if not string.isEmpty(achievementId) then
Notify(MessageConst.SHOW_ACHIEVEMENT, achievementId)
end
end
HL.Commit(CommonMedalNode)
return CommonMedalNode