357 lines
No EOL
14 KiB
Lua
357 lines
No EOL
14 KiB
Lua
require("XManager/XModelManager")
|
||
|
||
XUiPanelSelectLevelItems = XClass(nil, "XUiPanelSelectLevelItems")
|
||
|
||
function XUiPanelSelectLevelItems:Ctor(ui, rootUi, parent)
|
||
self.GameObject = ui.gameObject
|
||
self.Transform = ui.transform
|
||
self.RootUi = rootUi
|
||
self.Parent = parent
|
||
---@type XCharacterAgency
|
||
local ag = XMVCA:GetAgency(ModuleId.XCharacter)
|
||
self.CharacterAgency = ag
|
||
|
||
self:InitAutoScript()
|
||
self.ExpItems = {}
|
||
self.TotalExp = {}
|
||
self.CharUpgradeInfoPanel = XUiPanelLevelUpgrade.New(self.PanelLevelUpgrade, self.Parent)
|
||
end
|
||
|
||
-- auto
|
||
-- Automatic generation of code, forbid to edit
|
||
function XUiPanelSelectLevelItems:InitAutoScript()
|
||
self:AutoInitUi()
|
||
self:AutoAddListener()
|
||
end
|
||
|
||
function XUiPanelSelectLevelItems:AutoInitUi()
|
||
self.PanelItems = self.Transform:Find("PanelItems")
|
||
self.PanelLvInfo = self.Transform:Find("PanelItems/PanelLvInfo")
|
||
self.PanelRole = self.Transform:Find("PanelItems/PanelLvInfo/PanelRole")
|
||
self.PanelContent = self.Transform:Find("PanelItems/PanelLvInfo/SffViewItem/AVSDiewport/PanelContent")
|
||
self.PanelExpItem = self.Transform:Find("PanelItems/PanelLvInfo/SffViewItem/AVSDiewport/PanelContent/PanelExpItem")
|
||
self.ScrollbarVertical = self.Transform:Find("PanelItems/PanelLvInfo/SffViewItem/ScrollbarVertical"):GetComponent("Scrollbar")
|
||
self.BtnUpgrade = self.Transform:Find("PanelItems/PanelLvInfo/BtnUpgrade"):GetComponent("Button")
|
||
self.ImgMaxLevel = self.Transform:Find("PanelItems/PanelLvInfo/ImgMaxLevel"):GetComponent("Image")
|
||
self.PanelLevel = self.Transform:Find("PanelItems/PanelLevel")
|
||
self.TxtExpCompare = self.Transform:Find("PanelItems/PanelLevel/LevelBarInfo/TxtExpCompare"):GetComponent("Text")
|
||
self.TxtAddExp = self.Transform:Find("PanelItems/PanelLevel/LevelBarInfo/TxtAddExp"):GetComponent("Text")
|
||
self.TxtShowLevel = self.Transform:Find("PanelItems/PanelLevel/LevelBarInfo/TxtShowLevel"):GetComponent("Text")
|
||
self.TxtCharCurLevel = self.Transform:Find("PanelItems/PanelLevel/LevelBarInfo/TxtCharCurLevel"):GetComponent("Text")
|
||
self.ImgExpBar = self.Transform:Find("PanelItems/PanelLevel/LevelBarInfo/ImgExpBar"):GetComponent("Image")
|
||
self.ImgExpAddBar = self.Transform:Find("PanelItems/PanelLevel/LevelBarInfo/ImgExpAddBar"):GetComponent("Image")
|
||
self.PanelLevelUpgrade = self.Transform.parent:FindTransform("PanelLevelUpgrade")
|
||
self.PanelEmpty = self.Transform:Find("PanelItems/PanelLvInfo/PanelEmpty")
|
||
end
|
||
|
||
function XUiPanelSelectLevelItems:RegisterClickEvent(uiNode, func)
|
||
if func == nil then
|
||
XLog.Error("XUiPanelSelectLevelItems:RegisterClickEvent函数参数错误:参数func不能为空")
|
||
return
|
||
end
|
||
|
||
if type(func) ~= "function" then
|
||
XLog.Error("XUiPanelSelectLevelItems:RegisterClickEvent函数错误, 参数func需要是function类型, func的类型是" .. type(func))
|
||
end
|
||
|
||
local listener = function(...)
|
||
func(self, ...)
|
||
end
|
||
|
||
CsXUiHelper.RegisterClickEvent(uiNode, listener)
|
||
end
|
||
|
||
function XUiPanelSelectLevelItems:AutoAddListener()
|
||
self:RegisterClickEvent(self.BtnUpgrade, self.OnBtnUpgradeClick)
|
||
end
|
||
-- auto
|
||
|
||
function XUiPanelSelectLevelItems:OnBtnUpgradeClick()
|
||
self:SendLevelExpItems()
|
||
end
|
||
|
||
function XUiPanelSelectLevelItems:ResetData()
|
||
local characterId = self.CharacterId
|
||
local character = self.CharacterAgency:GetCharacter(characterId)
|
||
|
||
self.MaxLevelNeedExp = 0
|
||
self.ShowNextLevel = character.Level
|
||
|
||
for start = character.Level, self.MaxLevel - 1 do
|
||
self.MaxLevelNeedExp = self.MaxLevelNeedExp + XCharacterConfigs.GetNextLevelExp(characterId, start)
|
||
end
|
||
|
||
self.ShowCurExp = character.Exp
|
||
self.CurCharacterExp = character.Exp
|
||
self.CharacterTempExp = character.Exp
|
||
if character.Exp > XCharacterConfigs.GetNextLevelExp(characterId, character.Level) then
|
||
self.CharacterTempExp = 0
|
||
end
|
||
self.MaxLevelNeedExp = self.MaxLevelNeedExp - self.CharacterTempExp
|
||
self.RedundantExp = character.Exp - self.CharacterTempExp
|
||
|
||
self.AddExp = 0
|
||
end
|
||
|
||
function XUiPanelSelectLevelItems:ShowPanel(characterId)
|
||
self.ItemId = nil
|
||
self.CharacterId = characterId
|
||
self.MaxLevel = self.CharacterAgency:GetMaxAvailableLevel(characterId)
|
||
self.IsShow = true
|
||
self.ScrollbarVertical.value = 1
|
||
self.CharUpgradeInfoPanel.GameObject:SetActive(false)
|
||
self:ResetData()
|
||
self:UpdateItems()
|
||
self:UpdateUi()
|
||
self:CheckMaxLevel()
|
||
local character = self.CharacterAgency:GetCharacter(characterId)
|
||
self.TxtShowLevel.text = CS.XTextManager.GetText("CharacterShowLevel", character.Level, self.MaxLevel)
|
||
self.PanelItems.gameObject:SetActive(true)
|
||
self.GameObject:SetActive(true)
|
||
end
|
||
|
||
function XUiPanelSelectLevelItems:HidePanel()
|
||
self.IsShow = false
|
||
self.GameObject:SetActive(false)
|
||
self.PanelRole.gameObject:SetActive(false)
|
||
end
|
||
|
||
function XUiPanelSelectLevelItems:CheckMaxLevel()
|
||
local character = self.CharacterAgency:GetCharacter(self.CharacterId)
|
||
local isMaxLevel = character.Level >= self.MaxLevel or self.AddExp <= 0
|
||
self.BtnUpgrade.gameObject:SetActive(not isMaxLevel)
|
||
self.ImgMaxLevel.gameObject:SetActive(isMaxLevel)
|
||
end
|
||
|
||
function XUiPanelSelectLevelItems:UpdateUi()
|
||
local characterId = self.CharacterId
|
||
local character = self.CharacterAgency:GetCharacter(self.CharacterId)
|
||
|
||
self.ImgExpAddBar.gameObject:SetActive(false)
|
||
local isMaxLevel = self.ShowNextLevel >= self.MaxLevel
|
||
self.ImgExpBar.fillAmount = isMaxLevel and 0 or self.CharacterTempExp / XCharacterConfigs.GetNextLevelExp(characterId, self.ShowNextLevel)
|
||
self.TxtExpCompare.text = math.floor(self.ShowCurExp) .. "/" .. XCharacterConfigs.GetNextLevelExp(characterId, self.ShowNextLevel)
|
||
self.TxtCharCurLevel.text = character.Level
|
||
self.TxtAddExp.text = self.AddExp > 0 and "+" .. math.floor(self.AddExp) or ""
|
||
|
||
for i = 1, #self.ExpItems do
|
||
self.ExpItems[i].Btn2.gameObject:SetActive(not isMaxLevel and self.ExpItems[i].SelectCount > 0)
|
||
end
|
||
end
|
||
|
||
function XUiPanelSelectLevelItems:UpdateUiAdd(index)
|
||
local characterId = self.CharacterId
|
||
local character = self.CharacterAgency:GetCharacter(characterId)
|
||
|
||
local isMaxLevel = self.ShowNextLevel >= self.MaxLevel
|
||
local nextLevelExp = XCharacterConfigs.GetNextLevelExp(characterId, self.ShowNextLevel)
|
||
|
||
self.ImgExpAddBar.gameObject:SetActive(true)
|
||
|
||
if self.AddExp == 0 then
|
||
self.ImgExpAddBar.fillAmount = character.Exp / nextLevelExp
|
||
else
|
||
self.ImgExpAddBar.fillAmount = isMaxLevel and 0 or (self.AddExp + self.CurCharacterExp) / nextLevelExp
|
||
end
|
||
|
||
if character.Level < self.ShowNextLevel then
|
||
self.ImgExpAddBar.fillAmount = 1
|
||
end
|
||
|
||
self.TxtCharCurLevel.text = character.Level
|
||
self.TxtAddExp.text = self.AddExp > 0 and "+" .. math.floor(self.AddExp) or ""
|
||
self.ExpItems[index].Btn2.gameObject:SetActive(self.ExpItems[index].SelectCount > 0)
|
||
end
|
||
|
||
function XUiPanelSelectLevelItems:CalcMaxCount(expItem)
|
||
local character = self.CharacterAgency:GetCharacter(self.CharacterId)
|
||
|
||
local count = expItem.SelectCount
|
||
local itemId = expItem.Data.Id
|
||
local itemexp = XDataCenter.ItemManager.GetCharExp(itemId, character.Type)
|
||
local sumExp = 0
|
||
|
||
for _, item in pairs(self.ExpItems) do
|
||
local compareItemId = item.Data.Id
|
||
if compareItemId ~= itemId then
|
||
sumExp = sumExp + XDataCenter.ItemManager.GetCharExp(compareItemId, character.Type) * item.SelectCount
|
||
end
|
||
end
|
||
|
||
if (self.MaxLevelNeedExp - sumExp) > 0 then
|
||
count = (self.MaxLevelNeedExp - sumExp) / itemexp
|
||
count = math.ceil(count)
|
||
end
|
||
|
||
return count
|
||
end
|
||
|
||
function XUiPanelSelectLevelItems:UpdateItems()
|
||
local character = self.CharacterAgency:GetCharacter(self.CharacterId)
|
||
|
||
local expItemsInfo = XDataCenter.ItemManager.GetCardExpItems()
|
||
local index = 1
|
||
|
||
for i = 1, #expItemsInfo do
|
||
if expItemsInfo[i].Template.UpType == character.Type then
|
||
local a = expItemsInfo[i]
|
||
table.insert(expItemsInfo, index, a)
|
||
table.remove(expItemsInfo, i + 1)
|
||
index = index + 1
|
||
end
|
||
end
|
||
|
||
XUiHelper.CreateTemplates(self.RootUi, self.ExpItems, expItemsInfo, XUiBagItem.New, self.PanelExpItem.gameObject, self.PanelContent)
|
||
self.PanelExpItem.gameObject:SetActive(false)
|
||
|
||
local itemCount = #expItemsInfo
|
||
for i = 1, itemCount do
|
||
local info = expItemsInfo[i]
|
||
local expItem = self.ExpItems[i]
|
||
|
||
expItem.GameObject.name = info.Id
|
||
XEventManager.DispatchEvent(XEventId.EVENT_GUIDE_STEP_OPEN_EVENT,expItem.GameObject.name)
|
||
|
||
expItem:Refresh(info, true, true)
|
||
expItem:SetSelectCount(0)
|
||
expItem.Btn2.gameObject:SetActive(false)
|
||
expItem:SetClickCallback2(function()
|
||
expItem:UpdateSelectCount(self:CalcMaxCount(expItem))
|
||
|
||
local selectCount = expItem.SelectCount
|
||
if selectCount > 0 then
|
||
expItem.TxtSelectHide.text = string.format("%s%s", "x", selectCount)
|
||
expItem.TxtSelectHide.gameObject:SetActive(true)
|
||
expItem.ImgSelectBg.gameObject:SetActive(true)
|
||
else
|
||
expItem.TxtSelectHide.gameObject:SetActive(false)
|
||
expItem.ImgSelectBg.gameObject:SetActive(false)
|
||
end
|
||
end)
|
||
expItem:SetChangeSelectCountCondition(function(newCount)
|
||
return self:DealSelectItem(i, newCount)
|
||
end)
|
||
end
|
||
|
||
--多出来被消耗的格子要清掉数据
|
||
for i = itemCount + 1, #self.ExpItems do
|
||
self.ExpItems[i] = nil
|
||
end
|
||
|
||
self.PanelEmpty.gameObject:SetActiveEx(XTool.IsTableEmpty(expItemsInfo))
|
||
end
|
||
|
||
function XUiPanelSelectLevelItems:UpdateAddExp(index, changeCount)
|
||
local character = self.CharacterAgency:GetCharacter(self.CharacterId)
|
||
|
||
local exp = XDataCenter.ItemManager.GetCharExp(self.ExpItems[index].Data.Id, character.Type)
|
||
self.AddExp = self.AddExp + exp * changeCount
|
||
character.Exp = self.CharacterTempExp
|
||
local preExp = self.AddExp ~= 0 and self.AddExp + self.RedundantExp or 0
|
||
self.ShowNextLevel, self.ShowCurExp = self.CharacterAgency:CalLevelAndExp(character, preExp)
|
||
|
||
if self.ShowNextLevel > self.MaxLevel then
|
||
self.ShowNextLevel = self.MaxLevel
|
||
end
|
||
|
||
self.TxtShowLevel.text = CS.XTextManager.GetText("CharacterShowLevel", self.ShowNextLevel, self.MaxLevel)
|
||
|
||
if self.AddExp < self.AddExp + exp * changeCount then
|
||
CS.XAudioManager.PlaySound(XSoundManager.UiBasicsMusic.Promotion) --杝均
|
||
end
|
||
|
||
|
||
end
|
||
|
||
function XUiPanelSelectLevelItems:DealSelectItem(index, newCount)
|
||
local character = self.CharacterAgency:GetCharacter(self.CharacterId)
|
||
|
||
if newCount < 0 then
|
||
return
|
||
end
|
||
|
||
local expItem = self.ExpItems[index]
|
||
local selectCount = self.ExpItems[index].SelectCount
|
||
|
||
if self.ShowNextLevel >= self.MaxLevel and newCount > selectCount then
|
||
XUiManager.TipText("CharacterNotMoreLevel")
|
||
return
|
||
end
|
||
|
||
local diffCount = newCount - selectCount
|
||
|
||
-- 由于长按可能导致道具超出理论极限使用个数,因此加个范围检测
|
||
local exp = XDataCenter.ItemManager.GetCharExp(self.ExpItems[index].Data.Id, character.Type)
|
||
local addExp = exp * diffCount
|
||
local preExp = addExp ~= 0 and self.AddExp + addExp + self.RedundantExp or 0
|
||
local showNextLevel, _ = self.CharacterAgency:CalLevelAndExp(character, preExp)
|
||
if showNextLevel > self.MaxLevel and newCount > selectCount then
|
||
while showNextLevel >= self.MaxLevel do
|
||
diffCount = diffCount - 1
|
||
addExp = exp * diffCount
|
||
preExp = self.AddExp + addExp ~= 0 and self.AddExp + addExp + self.RedundantExp or 0
|
||
showNextLevel, _ = self.CharacterAgency:CalLevelAndExp(character, preExp)
|
||
end
|
||
diffCount = diffCount + 1
|
||
self:UpdateAddExp(index, diffCount)
|
||
expItem:SetSelectCount(selectCount + diffCount)
|
||
self:UpdateUiAdd(index)
|
||
character.Exp = self.CurCharacterExp
|
||
self:CheckMaxLevel()
|
||
return false
|
||
end
|
||
|
||
self:UpdateAddExp(index, diffCount)
|
||
expItem:SetSelectCount(newCount)
|
||
self:UpdateUiAdd(index)
|
||
character.Exp = self.CurCharacterExp
|
||
self:CheckMaxLevel()
|
||
|
||
if self.AddExp > 0 and self.AddExp + self.RedundantExp >= self.MaxLevelNeedExp then
|
||
return true
|
||
end
|
||
return false
|
||
end
|
||
|
||
function XUiPanelSelectLevelItems:SendLevelExpItems()
|
||
local character = self.CharacterAgency:GetCharacter(self.CharacterId)
|
||
|
||
local curLevel = XPlayer.Level
|
||
if curLevel < self.ShowNextLevel then
|
||
local text = CS.XTextManager.GetText('CharacterLevelFull')
|
||
XUiManager.TipMsg(text, XUiManager.UiTipType.Tip)
|
||
return
|
||
end
|
||
|
||
local items = {}
|
||
for i = 1, #self.ExpItems do
|
||
local item = self.ExpItems[i]
|
||
if item.GameObject.activeSelf and item.SelectCount ~= 0 then
|
||
items[item.Data.Id] = item.SelectCount
|
||
end
|
||
end
|
||
|
||
local oldCharLevel = character.Level
|
||
self.CharUpgradeInfoPanel:OldCharUpgradeInfo(character)
|
||
if next(items) then
|
||
self.CharacterAgency:AddExp(character, items, function()
|
||
self:ResetData()
|
||
self:UpdateItems()
|
||
self:UpdateUi()
|
||
self:CheckMaxLevel()
|
||
|
||
if character.Level >= self.MaxLevel then
|
||
self.RootUi.ParentUi:OnBtnBackClick() -- 满级后自动点一次返回
|
||
end
|
||
|
||
if character.Level > oldCharLevel then
|
||
self.Parent.LevelUpgradeEnable:PlayTimelineAnimation()
|
||
self.CharUpgradeInfoPanel:ShowLevelInfo(character)
|
||
end
|
||
|
||
if self.RootUi.RefreshTabBtns then
|
||
self.RootUi:RefreshTabBtns()
|
||
end
|
||
end)
|
||
end
|
||
end |