local SoldierPauseCtrl = class("SoldierPauseCtrl", BaseCtrl) local GamepadUIManager = require("GameCore.Module.GamepadUIManager") local SoldierAttrData = require("GameCore.Data.DataClass.Soldier.SoldierAttrData") SoldierPauseCtrl._mapNodeConfig = { goBlur = { sNodeName = "t_fullscreen_blur_01" }, aniBlur = { sNodeName = "t_fullscreen_blur_01", sComponentName = "Animator" }, safeAreaRoot = { sNodeName = "----SafeAreaRoot----" }, txtWindowTitle = { sComponentName = "TMP_Text", sLanguageId = "Soldier_Battle_Pause" }, btnClose = { sComponentName = "UIButton", callback = "OnBtnClick_Close" }, snapshot = { sComponentName = "UIButton", callback = "OnBtnClick_Close" }, btnRestart = { sComponentName = "UIButton", callback = "OnBtnClick_Restart" }, txtBtnRestart = { sComponentName = "TMP_Text", sLanguageId = "Soldier_Btn_Restart" }, btnResult = { sComponentName = "UIButton", callback = "OnBtnClick_Result" }, txtBtnResult = { sComponentName = "TMP_Text", sLanguageId = "Soldier_Btn_Result" }, btnLeave = { sComponentName = "UIButton", callback = "OnBtnClick_Leave" }, txtBtnLeave = { sComponentName = "TMP_Text", sLanguageId = "Soldier_Btn_Leave" }, goNodeInfo = {}, Node = {nCount = 8}, txtProgress = {sComponentName = "TMP_Text"}, txtLevel = {sComponentName = "TMP_Text"}, txtExp = {sComponentName = "TMP_Text"}, txtHp = {sComponentName = "TMP_Text"}, txtCoin = {sComponentName = "TMP_Text"}, btnCoin = { sComponentName = "UIButton", callback = "OnBtnClick_CoinTips" }, BarContainer = { sComponentName = "RectTransform" }, goChar = {}, goCharItem = {}, goCharList = {nCount = 2, sComponentName = "Transform"}, txtCharTitle = { sComponentName = "TMP_Text", sLanguageId = "Soldier_Battle_Char_Title" }, txtPartnerTitle = { sComponentName = "TMP_Text", sLanguageId = "Soldier_Battle_Partner_Title" }, goPartnerList = {sComponentName = "Transform"}, goPartnerItem = {sComponentName = "Transform"}, txtCardTitle = { sComponentName = "TMP_Text", sLanguageId = "Soldier_Battle_Card_Title" }, btnStarterCard = { sComponentName = "UIButton", callback = "OnBtnClick_StarterCard" }, imgCardStarter = {sComponentName = "Image"}, imgCardIconStarter = {sComponentName = "Image"}, imgemptyStarter = {}, goStrategyCardList = {sComponentName = "Transform"}, btnStrategyCardItem = {sComponentName = "Transform"}, btnSetting = { sComponentName = "UIButton", callback = "OnBtnClick_Setting" }, charDetialRoot = {sComponentName = "Transform"}, parnterDetialRoot = {sComponentName = "Transform"} } SoldierPauseCtrl._mapEventConfig = { OpenSoldierPause = "OnEvent_OpenSoldierPause", RefreshSoldierCoin = "OnEvent_RefreshCoin" } SoldierPauseCtrl._mapRedDotConfig = {} local iconPath = "Icon/SoldierOtherIcon/" local iconCardPath = "Icon/SoldierBuffCard/" local iconPartnerPath = "Icon/SoldierPartner/" function SoldierPauseCtrl:OpenUI() self._mapNode.goBlur:SetActive(true) local wait = function() coroutine.yield(CS.UnityEngine.WaitForEndOfFrame()) if self.bShow then self._mapNode.safeAreaRoot:SetActive(true) end end cs_coroutine.start(wait) end function SoldierPauseCtrl:Refresh() local nStage, nNodexIndex = PlayerData.SoldierData:GetCurChallengeState() NovaAPI.SetTMPText(self._mapNode.txtProgress, orderedFormat(ConfigTable.GetUIText("Soldier_Pause_Schedule"), nStage .. "-" .. nNodexIndex)) local nLevel, nMaxLevel = self.levelData:GetShopLevel() NovaAPI.SetTMPText(self._mapNode.txtLevel, orderedFormat(ConfigTable.GetUIText("Soldier_Battle_LevelPause"), nLevel)) local mapLevelCfg = ConfigTable.GetData("SoldierShopLevel", nLevel) local nNeedExp = 0 if mapLevelCfg ~= nil then nNeedExp = mapLevelCfg.Exp end local nExp = self.levelData:GetExp() NovaAPI.SetTMPText(self._mapNode.txtExp, string.format("%s/%s", nExp, nNeedExp)) local nHp = self.levelData:GetHp() NovaAPI.SetTMPText(self._mapNode.txtHp, nHp) local nCount = self.levelData:GetItem(AllEnum.CoinItemId.SoldierCurrency) NovaAPI.SetTMPText(self._mapNode.txtCoin, tostring(nCount)) if self.isRefreshMSg then return end self:RefreshShopLv() self:InitNodeList() self:RefreshCharList() self:RefreshCardList() self.isRefreshMSg = true end function SoldierPauseCtrl:RefreshShopLv() local nCurLevel, nMaxLevel = self.levelData:GetShopLevel() NovaAPI.SetTMPText(self._mapNode.txtLevel, orderedFormat(ConfigTable.GetUIText("Soldier_Battle_LevelPause"), nCurLevel)) if nCurLevel == nMaxLevel then self._mapNode.BarContainer.sizeDelta = Vector2(134, 22) NovaAPI.SetTMPText(self._mapNode.txtExp, ConfigTable.GetUIText("Soldier_Sandtable_MaxLevel")) else local ShopMsg = ConfigTable.GetData("SoldierShopLevel", nCurLevel) if ShopMsg then local nNeedExp = ShopMsg.Exp local nCurExp = self.levelData:GetExp() self._mapNode.BarContainer.sizeDelta = Vector2(134 * (nCurExp / nNeedExp), 22) NovaAPI.SetTMPText(self._mapNode.txtExp, tostring(nCurExp) .. "/" .. tostring(nNeedExp)) else printError("商店表找不到,商店当前等级为 === " .. nCurLevel) end end end function SoldierPauseCtrl:InitNodeList() local nStage, nNodexIndex = PlayerData.SoldierData:GetCurChallengeState() NovaAPI.SetTMPText(self._mapNode.TextPos, tostring(nStage) .. "-" .. tostring(nNodexIndex)) local curStageNodeList = self.levelData:GetNodeList() for i = 1, #self._mapNode.Node do local node = self._mapNode.Node[i] if i > #curStageNodeList then node.gameObject:SetActive(false) else local imgIcon = node.transform:Find("imgIcon"):GetComponent("Image") self:SetPngSprite(imgIcon, iconPath .. AllEnum.SoliderNoteTypeCfg[curStageNodeList[i].nNodeType].Icon) local imgCurrent = node.transform:Find("imgCurrent") imgCurrent.gameObject:SetActive(i == nNodexIndex) if nNodexIndex > i then NovaAPI.SetImageColor(imgIcon, Color(0.7098039215686275, 0.7647058823529411, 0.8156862745098039, 0.3)) elseif nNodexIndex < i then NovaAPI.SetImageColor(imgIcon, Color(0.7098039215686275, 0.7647058823529411, 0.8156862745098039, 1)) elseif i == nNodexIndex then NovaAPI.SetImageColor(imgIcon, Color(1.0, 1.0, 1.0, 1)) end node.gameObject:SetActive(true) end end end function SoldierPauseCtrl:RefreshCharList() self._mapNode.goCharItem:SetActive(false) local tabMain = {} local tabSub = {} for k, v in ipairs(self.tChess) do local nIndex = v.nIndex if v.nPositionType == GameEnum.SoldierPositionType.FightPosition then tabMain[nIndex] = v elseif v.nPositionType == GameEnum.SoldierPositionType.SupportPosition then tabSub[nIndex] = v end end local tbActivePartner, tbPartner = SoldierAttrData.CalcActivePartners(self.tChess) for i, v in pairs(tabMain) do local goChar = instantiate(self._mapNode.goCharItem, self._mapNode.goCharList[1]) goChar:SetActive(true) if not self.tbMainCtrl[v.nIndex] then self.tbMainCtrl[v.nIndex] = self:BindCtrlByNode(goChar, "Game.UI.Soldier.Template.Character.SoldierCharCardItemCtrl") if v.nId > 0 then self.tbMainCtrl[v.nIndex]:SetItemData(v.nId, GameEnum.SoldierPositionType.FightPosition) self.tbMainCtrl[v.nIndex]:SetStar(v.nStar) self.tbMainCtrl[v.nIndex]:SetAttribute(v.nIndex) self.tbMainCtrl[v.nIndex]:SetClickCallback(_, function() local chessData = { nPositionType = GameEnum.SoldierPositionType.FightPosition, nId = v.nId, nStar = math.max(v.nStar, 1) } self:ClickCharactorTips(v.nUId, v.nId, goChar, chessData, self.tChess, tbActivePartner) end) else self.tbMainCtrl[v.nIndex]:SetItemData(nil) end end end for i, v in pairs(tabSub) do local goChar = instantiate(self._mapNode.goCharItem, self._mapNode.goCharList[2]) goChar:SetActive(true) if not self.tbSubCtrl[v.nIndex] then self.tbSubCtrl[v.nIndex] = self:BindCtrlByNode(goChar, "Game.UI.Soldier.Template.Character.SoldierCharCardItemCtrl") if 0 < v.nId then self.tbSubCtrl[v.nIndex]:SetItemData(v.nId, GameEnum.SoldierPositionType.SupportPosition) self.tbSubCtrl[v.nIndex]:SetStar(v.nStar) self.tbSubCtrl[v.nIndex]:SetAttribute(0) self.tbSubCtrl[v.nIndex]:SetClickCallback(_, function() local chessData = { nPositionType = GameEnum.SoldierPositionType.SupportPosition, nId = v.nId, nStar = math.max(v.nStar, 1) } self:ClickCharactorTips(v.nUId, v.nId, goChar, chessData, self.tChess, tbActivePartner) end) else self.tbSubCtrl[v.nIndex]:SetItemData(nil) end end end if tbPartner == nil then return end self._mapNode.goPartnerItem.gameObject:SetActive(false) self:RefreshPartnerList(tbPartner) end function SoldierPauseCtrl:ClickCharactorTips(nUId, nId, obj, chessData, tbChess, tbActivePartner) local tmpEnergy = self.tabCacheSoldierEnergy[nUId] if tmpEnergy.death == true then EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_Death_Tips")) return end local Info = CS.AdventureModuleHelper.GetSoldierActorInfo(nId) local HealthInfo = CS.AdventureModuleHelper.GetSoldierHealthInfo(nId) local atk = Info ~= nil and Info.atk:AsFloat() or 0 local def = Info ~= nil and Info.def:AsFloat() or 0 local critRate = Info ~= nil and Info.critRate:AsFloat() or 0 local critPower = Info ~= nil and Info.critPower:AsFloat() or 0 local attackSpeed = Info ~= nil and Info.normalAttackSpd:AsFloat() or 0 local hp = HealthInfo ~= nil and HealthInfo.hp or 0 local hpMax = HealthInfo ~= nil and HealthInfo.hpMax or 0 local tab = {} tab.atk = atk tab.def = def tab.critRate = critRate tab.critPower = critPower tab.attackSpeed = attackSpeed tab.hp = hp tab.hpMax = hpMax tab.nEnergy = tmpEnergy ~= nil and tmpEnergy.energy or 0 tab.nMaxEnergy = tmpEnergy ~= nil and tmpEnergy.maxEnergy or 0 tab.nRecoverRate = tmpEnergy ~= nil and tmpEnergy.recoverRate or 0 EventManager.Hit(EventId.OpenPanel, PanelId.SoldierCharCardTips, self._mapNode.charDetialRoot, chessData, tbChess, tbActivePartner, tab) EventManager.Hit("OnSetTipsPosition", self._mapNode.charDetialRoot:GetChild(0).position, self._mapNode.charDetialRoot:GetChild(1).position, self._mapNode.charDetialRoot:GetChild(2).position) EventManager.Hit("SoldierCharTips_ShowBg") end function SoldierPauseCtrl:RefreshPartnerList(tbPartner) self.tabPartnerBtn = {} for _, v in ipairs(tbPartner) do local mapPartnerGroupCfg = CacheTable.GetData("_SoldierPartnerGroup", v.nType) if mapPartnerGroupCfg ~= nil then local nPartnerQty = GameEnum.PartnerLevelQuality.None local sBgPath = "" local cfgList = CacheTable.GetData("_SoldierPartner", v.nType) if cfgList == nil then return end local partnerCfg = cfgList[v.nActiveLevel] if partnerCfg == nil then partnerCfg = cfgList[1] end local goU = instantiate(self._mapNode.goPartnerItem, self._mapNode.goPartnerList) goU.gameObject:SetActive(true) local imgPartner = goU:Find("imgPartner"):GetComponent("Image") local imgPartnerIcon = goU:Find("imgPartnerIcon"):GetComponent("Image") local txtPartnerCount = goU:Find("txtPartnerCount"):GetComponent("TMP_Text") if v.nActiveLevel == 0 then self:SetPngSprite(imgPartner, iconPath .. AllEnum.SoldierPartnerLevelIcon[GameEnum.PartnerLevelQuality.None].bg) else self:SetPngSprite(imgPartner, iconPath .. AllEnum.SoldierPartnerLevelIcon[partnerCfg.PartnerLevelQuality].bg) end self:SetPngSprite(imgPartnerIcon, iconPartnerPath .. mapPartnerGroupCfg.Icon .. AllEnum.SoldierChessIconSurfix.M) NovaAPI.SetTMPText(txtPartnerCount, tostring(v.nCurNum or 0)) local clickCb = function() local bTrace = PlayerData.SoldierData:GetCurLevelData():CheckPartnerTrace(v.nType) EventManager.Hit(EventId.OpenPanel, PanelId.SoldierPartnerTips, self._mapNode.parnterDetialRoot, v.nType, v.nActiveLevel, bTrace) EventManager.Hit("OnSetParnterTipsPosition", self._mapNode.parnterDetialRoot:GetChild(0).position, self._mapNode.parnterDetialRoot:GetChild(1).position, self._mapNode.parnterDetialRoot:GetChild(2).position) EventManager.Hit("SoldierCharTips_ShowBg") end local btn = imgPartner.gameObject:GetComponent("UIButton") btn.onClick:RemoveAllListeners() btn.onClick:AddListener(clickCb) table.insert(self.tabPartnerBtn, btn) end end end function SoldierPauseCtrl:RefreshCardList() local starterCard, strategyCard = self.levelData:GetCardData() if starterCard ~= nil then if starterCard[1] ~= nil then self.nStarterCardId = starterCard[1].nId local SoldierStarterCardCfg = ConfigTable.GetData("SoldierStarterCard", self.nStarterCardId) self._mapNode.imgCardStarter.gameObject:SetActive(true) self._mapNode.imgCardIconStarter.gameObject:SetActive(true) self._mapNode.imgemptyStarter.gameObject:SetActive(false) local sBgPath = iconCardPath .. SoldierStarterCardCfg.Icon self:SetPngSprite(self._mapNode.imgCardIconStarter, sBgPath) else self._mapNode.imgCardStarter.gameObject:SetActive(false) self._mapNode.imgCardIconStarter.gameObject:SetActive(false) self._mapNode.imgemptyStarter.gameObject:SetActive(true) end end self._mapNode.btnStrategyCardItem.gameObject:SetActive(false) self.tabStrategyCard = {} if strategyCard ~= nil then for k, v in ipairs(strategyCard) do local goStrategy = instantiate(self._mapNode.btnStrategyCardItem, self._mapNode.goStrategyCardList) goStrategy.gameObject:SetActive(true) local clickCb = function() self:OnBtnClick_StrategyCard(v.nId) end local cardBg = goStrategy:Find("AnimRoot/imgCardStrategy"):GetComponent("Image") local cardIcon = goStrategy:Find("AnimRoot/imgCardIconStrategy"):GetComponent("Image") local btn = goStrategy:GetComponent("UIButton") btn.onClick:RemoveAllListeners() btn.onClick:AddListener(clickCb) table.insert(self.tabStrategyCard, btn) local SoldierStrategyCardCfg = ConfigTable.GetData("SoldierStrategyCard", v.nId) local cardBgPath = iconPath .. AllEnum.SoldierStrategyCardRarityIcon[SoldierStrategyCardCfg.Rarity] .. AllEnum.SoldierChessIconSurfix.S self:SetPngSprite(cardBg, cardBgPath) local cardIconPath = iconCardPath .. SoldierStrategyCardCfg.Icon self:SetPngSprite(cardIcon, cardIconPath) end end end function SoldierPauseCtrl:CloseUI(callback) if self._mapNode == nil then return end self:AddTimer(1, 0.2, "ClosePanel", true, true, true, callback) end function SoldierPauseCtrl:ClosePanel(_, callback) if self._mapNode == nil or not self.bShow then return end self:OnPanelClose(callback) end function SoldierPauseCtrl:OnPanelClose(callback) self.bShow = false PanelManager.InputEnable() GamepadUIManager.DisableGamepadUI("SoldierPauseCtrl") EventManager.Hit(EventId.BattleDashboardVisible, true) self._mapNode.safeAreaRoot:SetActive(false) self._mapNode.goBlur:SetActive(false) if callback then callback() end end function SoldierPauseCtrl:Awake() self.nAllChallengeTime = ConfigTable.GetConfigNumber("JointDrill_Challenge_Time_Max") self.nTotalTime = self._panel.nTotalTime self._mapNode.safeAreaRoot:SetActive(false) self.tbGamepadUINode = self:GetGamepadUINode() self.tbMainCtrl = {} self.tbSubCtrl = {} end function SoldierPauseCtrl:OnEnable() self.nOpenTime = 0 self.nRemainTime = 0 if self._panel.nType ~= nil then if self._panel.nType == GameEnum.JointDrillMode.JointDrill_Mode_1 then self.nOpenTime = PlayerData.JointDrill_1:GetJointDrillStartTime() elseif self._panel.nType == GameEnum.JointDrillMode.JointDrill_Mode_2 then self.nOpenTime = PlayerData.JointDrill_2:GetJointDrillStartTime() end end end function SoldierPauseCtrl:OnDisable() end function SoldierPauseCtrl:OnDestroy() for nInstanceId, objCtrl in pairs(self.tbMainCtrl) do self:UnbindCtrlByNode(objCtrl) self.tbMainCtrl[nInstanceId] = nil end self.tbMainCtrl = {} for nInstanceId, objCtrl in pairs(self.tbSubCtrl) do self:UnbindCtrlByNode(objCtrl) self.tbSubCtrl[nInstanceId] = nil end self.tbSubCtrl = {} if self.tabPartnerBtn then for i, v in pairs(self.tabPartnerBtn) do v.onClick:RemoveAllListeners() end self.tabPartnerBtn = nil end if self.tabStrategyCard then for i, v in pairs(self.tabStrategyCard) do v.onClick:RemoveAllListeners() end self.tabStrategyCard = nil end end function SoldierPauseCtrl:OnBtnClick_Result() local confirmCallback = function() local callback = function() EventManager.Hit("SettleSoldierBattle") self:CloseUI(function() local function levelEndCallback() EventManager.Remove("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, levelEndCallback) NovaAPI.EnterModule("MainMenuModuleScene", true, 17) end EventManager.Add("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, levelEndCallback) CS.AdventureModuleHelper.LevelStateChanged(true, 0, true) EventManager.Hit(EventId.ClosePanel, PanelId.SoldierBattlePanel) end) end PlayerData.SoldierData:SendGiveUp(callback) end local nStage, nNodexIndex = PlayerData.SoldierData:GetCurChallengeState() local str = orderedFormat(ConfigTable.GetUIText("Soldier_Battle_GiveUp"), nStage .. "-" .. nNodexIndex) local msg = { nType = AllEnum.MessageBox.Confirm, sContent = str, callbackConfirm = confirmCallback, bBlur = false } EventManager.Hit(EventId.OpenMessageBox, msg) end function SoldierPauseCtrl:OnBtnClick_Close() self:CloseUI() end function SoldierPauseCtrl:OnBtnClick_Restart() self:CloseUI() EventManager.Hit("RestartSoldier") end function SoldierPauseCtrl:OnBtnClick_Leave() local tabM, tabS, tabO = self.levelData:GetDeploy() local tbMain = {} local tbSup = {} for i, v in pairs(tabM) do if v.nPositionType == GameEnum.SoldierPositionType.FightPosition then table.insert(tbMain, v) elseif v.nPositionType == GameEnum.SoldierPositionType.SupportPosition then table.insert(tbSup, v) end end local callback = function() self:CloseUI(function() local function levelEndCallback() EventManager.Remove("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, levelEndCallback) NovaAPI.EnterModule("MainMenuModuleScene", true, 17) EventManager.Hit(EventId.ClosePanel, PanelId.SoldierBattlePanel) end EventManager.Add("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, levelEndCallback) CS.AdventureModuleHelper.LevelStateChanged(true, 0, true) end) end PlayerData.SoldierData:SendStepOut(tbMain, tbSup, tabS, callback) end function SoldierPauseCtrl:OnBtnClick_StarterCard() if self.nStarterCardId and self.nStarterCardId > 0 then EventManager.Hit(EventId.OpenPanel, PanelId.SoldierSelectStarterCardItem, self.nStarterCardId) end end function SoldierPauseCtrl:OnBtnClick_StrategyCard(StrategyCardId) EventManager.Hit(EventId.OpenPanel, PanelId.SoldierSelectStrategyCardItem, StrategyCardId) end function SoldierPauseCtrl:OnBtnClick_CoinTips() EventManager.Hit(EventId.OpenPanel, PanelId.SoldierGoldTips) end function SoldierPauseCtrl:OnBtnClick_Setting() EventManager.Hit(EventId.OpenPanel, PanelId.BattleSettings) end function SoldierPauseCtrl:OnEvent_OpenSoldierPause(tabChess, tabCacheSoldierEnergy) self.tChess = tabChess self.tabCacheSoldierEnergy = tabCacheSoldierEnergy self.bShow = true self.levelData = PlayerData.SoldierData:GetCurLevelData() PanelManager.InputDisable() self:OpenUI() self:Refresh() GamepadUIManager.EnableGamepadUI("SoldierPauseCtrl", self.tbGamepadUINode, nil, true) end function SoldierPauseCtrl:OnEvent_RefreshCoin(nCount) NovaAPI.SetTMPText(self._mapNode.txtCoin, nCount) end return SoldierPauseCtrl