Files
SL1900 eafd8f4088 Update - 1.9.0.107
EN: 1.9.0.107
CN: 1.9.0.108
JP: 1.9.0.112
KR: 1.9.0.112
2026-05-14 16:00:00 +09:00

404 lines
15 KiB
Lua

local BreakOutLevelDetailCtrl = class("BreakOutLevelDetailCtrl", BaseCtrl)
local DifficultyState = {
"Entry",
"Newbie",
"Advanced",
"Expert"
}
BreakOutLevelDetailCtrl._mapNodeConfig = {
TopBar = {
sNodeName = "TopBarPanel",
sCtrlName = "Game.UI.TopBarEx.TopBarCtrl"
},
EnemyInfo = {
sCtrlName = "Game.UI.MainlineEx.MainlineMonsterInfoCtrl"
},
btnHeadItem_ = {
nCount = 4,
sComponentName = "UIButton",
callback = "OnBtn_ClickCharacterItem"
},
txtTitleTarget = {
sNodeName = "txtTitleTarget",
sComponentName = "TMP_Text",
sLanguageId = "ChallengingGoals"
},
txt_Reward = {
sNodeName = "txt_Reward",
sComponentName = "TMP_Text",
sLanguageId = "BreakOut_Act_Reward"
},
txt_LevelTitle = {
sNodeName = "txt_LevelTitle",
sComponentName = "TMP_Text"
},
txt_DifficultyType = {
sNodeName = "txt_DifficultyType",
sComponentName = "TMP_Text"
},
txt_LevelDesc = {
sNodeName = "txt_LevelDesc",
sComponentName = "TMP_Text"
},
txt_Target = {sNodeName = "txt_Target", sComponentName = "TMP_Text"},
item = {
nCount = 4,
sCtrlName = "Game.UI.TemplateEx.TemplateItemCtrl"
},
btn_item = {
nCount = 4,
sComponentName = "UIButton",
callback = "OnBtnClick_RewardItem"
},
btn_GoChallenge = {sComponentName = "UIButton", callback = "OnBtn_Go"},
UnClick = {},
txt_UnGo = {
sNodeName = "txt_UnGo",
sComponentName = "TMP_Text",
sLanguageId = "TD_Btn_Challenge"
},
CanClick = {},
txt_Go = {
sNodeName = "txt_Go",
sComponentName = "TMP_Text",
sLanguageId = "TD_Btn_Challenge"
},
btnEnemyInfo = {
sComponentName = "UIButton",
callback = "OnBtnClick_EnemyInfo"
},
txt_EnemyInfo = {
sNodeName = "txt_EnemyInfo",
sComponentName = "TMP_Text",
sLanguageId = "MonsterInfo"
},
txt_title = {
sNodeName = "txt_title",
sComponentName = "TMP_Text",
sLanguageId = "BreakOut_Act_BattleCount"
},
txt_battleCount = {
sNodeName = "txt_battleCount",
sComponentName = "TMP_Text",
sLanguageId = "BreakOut_Act_DefaultBattleCount"
},
goChar = {
sCtrlName = "Game.UI.FormationEx.FormationCharCtrl"
},
UIParallax3DStage = {
sComponentName = "UIParallaxStageCameraController"
},
iconAdd = {},
CharacterDetails = {},
txt_Desc = {
sNodeName = "txt_Desc",
sComponentName = "TMP_Text",
sLanguageId = "BreakOut_Act_DefaultDesc"
},
txt_SpDesc = {sNodeName = "txt_SpDesc", sComponentName = "TMP_Text"},
txt_name = {
sNodeName = "txt_name",
sComponentName = "TMP_Text",
sLanguageId = "BreakOut_Act_DefaultName_Skill"
},
txtProperty_CD = {sComponentName = "TMP_Text", sLanguageId = "Talent_CD"},
txtValue_CD = {sComponentName = "TMP_Text"},
SkillIcon = {
sNodeName = "imgIcon_Skill",
sComponentName = "Image"
},
fxChange = {}
}
BreakOutLevelDetailCtrl._mapEventConfig = {
Event_ReStartBreakOut = "Event_ReStartGoPlay",
RefreshCharacterBattleTimes = "RefreshCharacterDetail"
}
function BreakOutLevelDetailCtrl:Awake()
local param = self:GetPanelParam()
if type(param) == "table" then
self.nActId = param[1]
self.nLevelId = param[2]
end
self.BreakOutData = PlayerData.Activity:GetActivityDataById(self.nActId)
self.LevelCharacters = {}
self.LevelData = self.BreakOutData:GetDetailLevelDataById(self.nLevelId)
local nFloorId = self.LevelData.FloorId
self.BreakOutFloorData = ConfigTable.GetData("BreakOutFloor", nFloorId)
self.PreviewMonsterGroupId = self.LevelData.PreviewMonsterGroupId
self._mapNode.btnEnemyInfo.gameObject:SetActive(self.PreviewMonsterGroupId ~= 0)
self.BreakOutLevelDetail_Animator = self.gameObject:GetComponent("Animator")
end
function BreakOutLevelDetailCtrl:OnEnable()
self.curCharacter = nil
self.isOnDefaultClick = true
self.nCurrentIndex = 1
self.nCurrentCharacterNid = {}
self.gameObject:SetActive(false)
local sSceneName = ConfigTable.GetData("BreakOutControl", self.nActId).SceneName
local Callback = function(bSuccess)
self.bOpen = true
if bSuccess == true then
local sceneRoot = CS.MainMenuModuleHelper.GetMainMenuSceneRoot(sSceneName)
self.rtSceneOriginPos = sceneRoot.transform:Find("==== Scene ====")
self.goSelectRolePrefab = self:CreatePrefabInstance("UI/MainlineFormationEx/SelectRolePrefab.prefab", self.rtSceneOriginPos)
local goSelectRoleCam = self.goSelectRolePrefab.transform:Find("Camera"):GetComponent("Camera")
NovaAPI.SetupUIParallaxStageCameraControllerForModelView(self._mapNode.UIParallax3DStage, goSelectRoleCam)
self:Refresh()
if #self.nCurrentCharacterNid ~= 0 then
end
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
if PlayerData.Guide:GetGuideState() then
EventManager.Hit("Guide_LoadFormationSuccess")
end
end
cs_coroutine.start(wait)
else
self._mapNode.UIParallax3DStage.gameObject:SetActive(false)
end
self._mapNode.goChar:OpenList(false)
self.bOpen = false
EventManager.Hit(EventId.SetTransition)
self.gameObject:SetActive(true)
self.BreakOutLevelDetail_Animator:Play("BreakOutLevelDetailPanel_in", -1, 0)
end
CS.MainMenuModuleHelper.GetActiveScene(sSceneName, Callback)
self.bOpenTransition = false
end
function BreakOutLevelDetailCtrl:OnDisable()
local sSceneName = ConfigTable.GetData("BreakOutControl", self.nActId).SceneName
local callback1 = function()
EventManager.Hit(EventId.SetTransition)
end
local callback2 = function()
end
CS.MainMenuModuleHelper.DeActiveScene(sSceneName, self.bOpenTransition == true and callback1 or callback2)
if self.curCharacter ~= nil and self.curCharacter.model ~= nil then
NovaAPI.UnbindUIParallaxStageCameraControllerModel(self._mapNode.UIParallax3DStage, 0)
destroy(self.curCharacter.model)
end
self._mapNode.goChar.nCharId = nil
if self.goSelectRolePrefab ~= nil then
destroy(self.goSelectRolePrefab)
end
self.curCharacter = nil
end
function BreakOutLevelDetailCtrl:Refresh()
self:Set_DefaultCharacter()
self:RefreshLevelDetail()
self:RefreshLevelCharacter()
self:RefreshCharacterDetail()
self:RefreshCharacter()
end
function BreakOutLevelDetailCtrl:RefreshLevelDetail()
NovaAPI.SetTMPText(self._mapNode.txt_LevelTitle, self.LevelData.Name)
local time = self.BreakOutFloorData.Time
local score = self.BreakOutFloorData.Score
NovaAPI.SetTMPText(self._mapNode.txt_Target, orderedFormat(ConfigTable.GetUIText("BreakOut_Act_Target") or "", time, score))
local sDifficultType = ConfigTable.GetUIText(DifficultyState[self.LevelData.Type])
NovaAPI.SetTMPText(self._mapNode.txt_DifficultyType, sDifficultType)
NovaAPI.SetTMPText(self._mapNode.txt_LevelDesc, self.LevelData.Desc)
self.tbReward = {}
for i = 1, 4 do
local nRewardId = self.LevelData["FirstCompleteReward" .. i .. "Tid"]
local nRewardQty = self.LevelData["FirstCompleteReward" .. i .. "Qty"]
if nRewardId ~= nil and 0 < nRewardId and nRewardQty ~= nil and 0 < nRewardQty then
table.insert(self.tbReward, {nRewardId, nRewardQty})
self._mapNode.btn_item[i].gameObject:SetActive(true)
else
self._mapNode.btn_item[i].gameObject:SetActive(false)
end
end
self.tbBtn = self._mapNode.btnRewardItem
local bIsComplete = self.BreakOutData:IsLevelComplete(self.nLevelId)
for k, v in pairs(self.tbReward) do
self._mapNode.item[k]:SetItem(v[1], nil, v[2], nil, bIsComplete)
end
self._mapNode.UnClick:SetActive(self.isOnDefaultClick)
self._mapNode.CanClick:SetActive(not self.isOnDefaultClick)
end
function BreakOutLevelDetailCtrl:RefreshLevelCharacter()
local nCharactersNumber = #self.LevelData.Characters
for i = 1, nCharactersNumber do
self._mapNode.btnHeadItem_[i].gameObject:SetActive(true)
local characterNId = ConfigTable.GetData("BreakOutCharacter", self.LevelData.Characters[i]).Id
local characterId = ConfigTable.GetData("BreakOutCharacter", self.LevelData.Characters[i]).CharId
self:RefreshLevelCharacterState(i, characterNId, characterId)
end
for i = nCharactersNumber + 1, #self._mapNode.btnHeadItem_ do
self._mapNode.btnHeadItem_[i].gameObject:SetActive(false)
end
end
function BreakOutLevelDetailCtrl:RefreshLevelCharacterState(index, characterNId, characterId)
local objTog = self._mapNode.btnHeadItem_[index].gameObject
local rt_Head_Close = objTog.transform:Find("Head_Close").gameObject
local rt_SelectIcon = objTog.transform:Find("SelectIcon").gameObject
local rt_HeadIcon = objTog.transform:Find("img_head").gameObject
objTog.transform:GetChild(0).name = tostring(characterNId)
if not self.BreakOutData:CacheIsUnlocked(characterNId) then
rt_Head_Close:SetActive(true)
rt_SelectIcon:SetActive(false)
rt_HeadIcon:SetActive(false)
local txt_Tip = rt_Head_Close.transform:Find("Tip/txt_Tip"):GetComponent("TMP_Text")
NovaAPI.SetTMPText(txt_Tip, ConfigTable.GetUIText("BreakOut_Act_CharacterUnOpen"))
else
rt_Head_Close:SetActive(false)
if self.isOnDefaultClick then
rt_SelectIcon:SetActive(false)
elseif self.nCurrentIndex == index and self.nCurrentCharacterNid[1] == characterNId then
rt_SelectIcon:SetActive(true)
else
rt_SelectIcon:SetActive(false)
end
local img_HeadIcon = rt_HeadIcon.transform:Find("img_headMask/img_headIcon"):GetComponent("Image")
local sHeadPath = "head_" .. characterId .. "_QM"
self:SetPngSprite(img_HeadIcon, "Icon/Head/" .. sHeadPath)
end
end
function BreakOutLevelDetailCtrl:RefreshCharacterDetail()
local DefaultDesc = self._mapNode.CharacterDetails.transform:Find("DefaultDesc"):GetComponent("CanvasGroup")
local SpScrollView = self._mapNode.CharacterDetails.transform:Find("SpScrollView"):GetComponent("CanvasGroup")
if self.isOnDefaultClick or self.nCurrentCharacterNid[1] == nil then
NovaAPI.SetCanvasGroupAlpha(DefaultDesc, 1)
NovaAPI.SetCanvasGroupAlpha(SpScrollView, 0)
else
NovaAPI.SetCanvasGroupAlpha(DefaultDesc, 0)
NovaAPI.SetCanvasGroupAlpha(SpScrollView, 1)
NovaAPI.SetTMPText(self._mapNode.txt_battleCount, self.BreakOutData:GetBattleCount(self.nCurrentCharacterNid[1]))
local characterData = self.BreakOutData:GetDataFromBreakOutCharacter(self.nCurrentCharacterNid[1])
if characterData == nil then
return
end
local SkillData = ConfigTable.GetData("Skill", characterData.SkillId)
local sCD = tostring(SkillData.SkillCD) .. ConfigTable.GetUIText("Talent_Sec")
NovaAPI.SetTMPText(self._mapNode.txtValue_CD, sCD)
NovaAPI.SetTMPText(self._mapNode.txt_SpDesc, SkillData.Desc)
self:SetPngSprite(self._mapNode.SkillIcon, SkillData.Icon)
NovaAPI.SetTMPText(self._mapNode.txt_name, orderedFormat(ConfigTable.GetUIText("BreakOut_Act_Name_Skill") or "", characterData.Name, SkillData.Title))
self.BreakOutLevelDetail_Animator:Play("BreakOutLevelDetailPanel_switch", -1, 0)
end
end
function BreakOutLevelDetailCtrl:RefreshCharacter()
if #self.nCurrentCharacterNid == 0 then
self.nCurrentCharacterNid[1] = 0
self._mapNode.iconAdd:SetActive(true)
return
else
self._mapNode.iconAdd:SetActive(false)
local characterId = self.BreakOutData:GetDataFromBreakOutCharacter(self.nCurrentCharacterNid[1]).CharId
if self.curCharacter == nil or self.curCharacter.nCharId ~= characterId then
self:LoadCharacter(characterId, self.nCurrentCharacterNid[1], self.bOpen)
elseif self.curCharacter ~= nil then
NovaAPI.UnbindUIParallaxStageCameraControllerModel(self._mapNode.UIParallax3DStage, 0)
destroy(self.curCharacter.model)
self.curCharacter = nil
end
end
end
function BreakOutLevelDetailCtrl:LoadCharacter(nCharId, nCharNid, bOpen)
if self.isOnDefaultClick then
return
end
local mapSkin = self.BreakOutData:GetDataFromBreakOutCharacter(nCharNid)
if not mapSkin then
printLog("没有找到皮肤配置" .. nCharId)
return
end
local CharacterSkinOverlapData = ConfigTable.GetData("CharacterSkinOverlap", mapSkin.CharId)
if not CharacterSkinOverlapData then
printLog("CharacterSkinOverlap" .. nCharId)
return
end
local nBreakOut_ModelShowScale = CharacterSkinOverlapData.BreakOut_ModelShowScale ~= "" and CharacterSkinOverlapData.BreakOut_ModelShowScale or 1
local nBreakOut_ModelShow = CharacterSkinOverlapData.BreakOut_Model_Show ~= "" and CharacterSkinOverlapData.BreakOut_Model_Show or mapSkin.Model
local sFullPath = string.format("%s.prefab", nBreakOut_ModelShow)
local LoadModelCallback = function(obj)
if self._mapNode == nil then
return
end
if self.nCurrentCharacterNid[1] == nCharNid then
if self.curCharacter ~= nil then
NovaAPI.UnbindUIParallaxStageCameraControllerModel(self._mapNode.UIParallax3DStage, 0)
destroy(self.curCharacter.model)
self.curCharacter = nil
end
local go = instantiate(obj, self.rtSceneOriginPos)
self.curCharacter = {nCharId = nCharId, model = go}
NovaAPI.BindUIParallaxStageCameraControllerModel(self._mapNode.UIParallax3DStage, 0, go)
if self.rtSceneOriginPos ~= nil then
go.transform.position = self.rtSceneOriginPos.position
go.transform.localEulerAngles = Vector3(0, 180, 0)
go.transform.localScale = Vector3.zero
GameUIUtils.SetCustomModelMaterialVariant(go, CS.CustomModelMaterialVariantComponent.VariantNames.FormationView)
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
go.transform.localScale = Vector3.one * (nBreakOut_ModelShowScale / 10000)
end
cs_coroutine.start(wait)
end
if not bOpen then
self:PlayChangeFx()
end
end
end
self:LoadAssetAsync(sFullPath, typeof(GameObject), LoadModelCallback)
end
function BreakOutLevelDetailCtrl:PlayChangeFx()
GameUIUtils.RestartParticle(self._mapNode.fxChange)
end
function BreakOutLevelDetailCtrl:OnBtn_ClickCharacterItem(btn, nIndex)
local characterNId = tonumber(btn.gameObject.transform:GetChild(0).name)
if not self.BreakOutData:CacheIsUnlocked(characterNId) then
return
end
if self.isOnDefaultClick or self.nCurrentIndex ~= nIndex or self.nCurrentCharacterNid[1] ~= characterNId then
self.nCurrentIndex = nIndex
self.isOnDefaultClick = false
self.nCurrentCharacterNid[1] = characterNId
self:Refresh()
end
end
function BreakOutLevelDetailCtrl:OnBtnClick_RewardItem(btn, nIndex)
local nRewardId
if self.tbReward ~= nil and self.tbReward[nIndex] ~= nil then
nRewardId = self.tbReward[nIndex][1]
end
if nRewardId ~= nil then
UTILS.ClickItemGridWithTips(nRewardId, btn.transform, true, true, false)
end
end
function BreakOutLevelDetailCtrl:OnBtn_Go()
if self.isOnDefaultClick or self.nCurrentCharacterNid[1] == nil or self.nCurrentCharacterNid[1] == 0 then
local sTip = ConfigTable.GetUIText("BreakOut_Act_DefaultDesc")
EventManager.Hit(EventId.OpenMessageBox, sTip)
return
end
self.isOnDefaultClick = true
local sChar = tostring(self.nCurrentCharacterNid[1])
local param = {}
table.insert(param, sChar)
self.BreakOutData.BreakOutLevelData:InitData(self.nLevelId, self.nCurrentCharacterNid[1], self.nActId)
CS.AdventureModuleHelper.EnterBrickBreakerLevel(self.LevelData.FloorId, param)
NovaAPI.EnterModule("AdventureModuleScene", true, 17)
end
function BreakOutLevelDetailCtrl:Event_ReStartGoPlay(tempData)
local sChar = tostring(tempData.curChar)
local param = {}
table.insert(param, sChar)
self.BreakOutData.BreakOutLevelData:InitData(tempData.nLevelId, tempData.curChar, tempData.nActId)
CS.AdventureModuleHelper.EnterBrickBreakerLevel(tempData.FloorId, param)
NovaAPI.EnterModule("AdventureModuleScene", true, 17)
end
function BreakOutLevelDetailCtrl:Set_DefaultCharacter()
local nCharactersNumber = #self.LevelData.Characters
if nCharactersNumber == 1 then
self.nCurrentIndex = nCharactersNumber
self.isOnDefaultClick = false
self.nCurrentCharacterNid[1] = ConfigTable.GetData("BreakOutCharacter", self.LevelData.Characters[nCharactersNumber]).Id
end
end
function BreakOutLevelDetailCtrl:OnBtnClick_EnemyInfo()
EventManager.Hit("OpenActivityLevelsMonsterInfo", self.PreviewMonsterGroupId)
end
return BreakOutLevelDetailCtrl