local SoldierSandtableCtrl = class("SoldierSandtableCtrl", BaseCtrl) local SoldierAttrData = require("GameCore.Data.DataClass.Soldier.SoldierAttrData") local GamepadUIManager = require("GameCore.Module.GamepadUIManager") local AssetRoot = "Icon/SoldierOtherIcon/" local chessAnimType = { PUTIN = 1, DRAGIN = 2, COMPOUND = 3, COMPOUND_OUT = 4, WARRIOR = 5 } local chessAnimLength = { [chessAnimType.PUTIN] = 0.7, [chessAnimType.DRAGIN] = 0.7, [chessAnimType.COMPOUND] = 1, [chessAnimType.COMPOUND_OUT] = 0.4 } local animQueueType = { NodeReward = 1, EnterSandtable = 2, OpenShop = 3 } local fxType = { Gray = 1, Green = 2, Blue = 3, Purple = 4, Gold = 5, Coin = 99 } local nMaxBarWidth = 153.2128 local DragInsType = { None = 0, Chess = 1, Sell = 2 } local chessCountColor = { Normal = { sColor = "354154", mapColor = Color(0.20784313725490197, 0.2549019607843137, 0.32941176470588235, 1) }, Max = { sColor = "565a67", mapColor = Color(0.33725490196078434, 0.35294117647058826, 0.403921568627451, 1) }, Overflow = { sColor = "e65a72", mapColor = Color(0.9019607843137255, 0.35294117647058826, 0.4470588235294118, 1) }, LevelUp = { sColor = "fff7d6", mapColor = Color(1.0, 0.9686274509803922, 0.8392156862745098, 1) } } SoldierSandtableCtrl._mapNodeConfig = { goRoot = { sNodeName = "----SafeAreaRoot----" }, btnPause = { sComponentName = "UIButton", callback = "OnBtnClick_Close" }, btnDetails = { sComponentName = "UIButton", callback = "OnBtnClick_Details" }, PartnerList = { sCtrlName = "Game.UI.Soldier.Sandtable.SoldierPartnerListCtrl" }, btnHandbook = { sComponentName = "UIButton", callback = "OnBtnClick_Handbook" }, btnPolicy = { sComponentName = "UIButton", callback = "OnBtnClick_Policy" }, BuffContainer = { sCtrlName = "Game.UI.Soldier.Sandtable.Components.SoldierBuffCtrl" }, SaleContainer = {}, SellAnimation = { sNodeName = "SaleContainer", sComponentName = "Animator" }, btn_Sell = {nCount = 2, sComponentName = "UIButton"}, txt_cell = { nCount = 2, sComponentName = "TMP_Text", sLanguageId = "Soldier_Sandtable_ShopCell" }, txtSellPrice = {nCount = 2, sComponentName = "TMP_Text"}, btnGo = { sComponentName = "UIButton", callback = "OnBtnClick_GO" }, Enable = {}, Disable = {}, txt_go = { nCount = 2, sComponentName = "TMP_Text", sLanguageId = "Soldier_Sandtable_Go" }, btnExperience = { sComponentName = "UIButton", callback = "OnBtnClick_Experience" }, TextLvTitle = { nCount = 2, sComponentName = "TMP_Text", sLanguageId = "Soldier_Sandtable_TextLvTitle" }, TextLv = {nCount = 2, sComponentName = "TMP_Text"}, imgBuyExpCostIcon = {}, TextCostNum = {sComponentName = "TMP_Text"}, TextExpNum = {nCount = 2, sComponentName = "TMP_Text"}, imgBossTemplateIcon = {nCount = 2, sComponentName = "Image"}, BarContainer = {sComponentName = "Image"}, txtExpTitle = {sComponentName = "TMP_Text"}, TextMaxLevel = { sComponentName = "TMP_Text", sLanguageId = "Soldier_Sandtable_MaxLevel" }, btnMax = { sComponentName = "UIButton", callback = "OnBtnClick_Experience" }, btnShop = { sComponentName = "NaviButton", sAction = "SoldierOpenShop", callback = "OnBtnClick_Shop" }, btnCloseShop = { sComponentName = "UIButton", callback = "OnBtnClick_CloseShop" }, txt_shop = { sComponentName = "TMP_Text", sLanguageId = "Soldier_Sandtable_Shop" }, fx_shop = {sComponentName = "Animator"}, TextCurCoin = {sComponentName = "TMP_Text"}, ImgIconFight = {}, ImgIconFight_lose = {}, TextFightCount = {sComponentName = "TMP_Text"}, btn_coinTips = { sComponentName = "UIButton", callback = "OnBtnClick_CoinTips" }, TextReputation = {sComponentName = "TMP_Text"}, TextPos = {sComponentName = "TMP_Text"}, NodeLayout = { sComponentName = "UIButton", callback = "OnBtnClick_NodeLayout" }, Node = {nCount = 8}, ImageAddCharCount = {sComponentName = "Image"}, TextAddCharCount = {sComponentName = "TMP_Text"}, TextAddCharCountShow = {sComponentName = "TMP_Text"}, TextChess = { sComponentName = "TMP_Text", sLanguageId = "Soldier_Handbook_Vanguard" }, TextChess2 = { sComponentName = "TMP_Text", sLanguageId = "Soldier_Handbook_Support" }, SoldierPosEffectTips = { sCtrlName = "Game.UI.Soldier.Sandtable.Components.SoldierEffectDesCtrl" }, MiddleContainer = {sComponentName = "Animator"}, EntranceItemTemplate = { nCount = 3, sCtrlName = "Game.UI.Soldier.Sandtable.SoldierSandtableCharItemCtrl" }, UpportingItemTemplate = { nCount = 6, sCtrlName = "Game.UI.Soldier.Sandtable.SoldierSandtableCharItemCtrl" }, WaitingCardItemTemplate = { nCount = 9, sCtrlName = "Game.UI.Soldier.Sandtable.SoldierSandtableCharItemCtrl" }, OtherChar = { nCount = 10, sCtrlName = "Game.UI.Soldier.Sandtable.SoldierSandtableOtherCharItemCtrl" }, OtherCharLsit = {sComponentName = "Transform"}, SoldierNodeTips = { sCtrlName = "Game.UI.Soldier.Sandtable.Components.SoldierNodeTipsCtrl" }, SoldierShopComponent = { sCtrlName = "Game.UI.Soldier.Sandtable.Components.SoldierShopCtrl" }, go_overflow = {}, go_overflow_anim = { sNodeName = "go_overflow", sComponentName = "Animator" }, sandtable_anim = { sNodeName = "----SafeAreaRoot----", sComponentName = "Animator" }, btn_GoBackEvent = { sComponentName = "UIButton", callback = "OnBtnClick_GoBackEventPanel" }, txtBtnBack = { sComponentName = "TMP_Text", sLanguageId = "Soldier_Sandtable_GoBackEvent" }, charDetaiRoot = {sComponentName = "Transform"}, parnterDetailRoot = {sComponentName = "Transform"}, fxFlyRoot = { sCtrlName = "Game.UI.Soldier.Sandtable.SoldierSandtableFxCtrl" }, goNodeDeployment = {}, goNodeSupply = {}, goNodeReward = {}, TextReward = { sComponentName = "TMP_Text", sLanguageId = "Soldier_Sandtable_Reward" }, reward = { nCount = 7, sCtrlName = "Game.UI.Soldier.Template.Character.SoldierCharItemCtrl" }, rewardItem = { sCtrlName = "Game.UI.Soldier.Template.SoldierItemGridCtrl" }, goNodeMatch = {sComponentName = "Canvas"}, fxFlyRootCanvas = {sNodeName = "fxFlyRoot", sComponentName = "Canvas"}, blockInput = {}, btnSkillDetail = { sComponentName = "UIButton", callback = "OnBtnClick_SkillDetail" }, txtSkillDetail = { sComponentName = "TMP_Text", sLanguageId = "Soldier_BossTemplate_Title" }, imgSkill = {sComponentName = "Image"}, imgSkillInitiative = {}, txtSkillInitiative = { sComponentName = "TMP_Text", sLanguageId = "Soldier_BossSkill_Active" }, imgSkillPassive = {}, txtSkillPassive = { sComponentName = "TMP_Text", sLanguageId = "Soldier_BossSkill_Passive" } } SoldierSandtableCtrl._mapEventConfig = { SoldierShopLevelChange = "OnEvent_SoldierExpUpdate", SoldierItemChange = "OnEvent_SoldierItemChange", SoldierCharItemChange = "OnEvent_SoldierCharItemChange", SoldierNodeChange = "OnEvent_SoldierNodeChange", SoldierHpChange = "OnEvent_SoldierHpChange", SoldierEffectChange = "OnEvent_SoldierEffectChange", SoldierPartnerUpdate = "OnEvent_SoldierEffectChange", SoldierBuffCardChange = "OnEvent_SoldierBuffCardChange", SoldierShopClose = "OnEvent_SoldierShopClose", SoldierSandtableCharItemDragStart = "OnEvent_SoldierSandtableCharItemDragStart", SoldierSandtableCharItemDragEnd = "OnEvent_SoldierSandtableCharItemDragEnd", SoldierSandtableCharItemDragging = "OnEvent_SoldierSandtableCharItemDragging", SoldierSandtableOtherCharItemDragStart = "OnEvent_SoldierSandtableOtherCharItemDragStart", SoldierSandtableOtherCharItemDragEnd = "OnEvent_SoldierSandtableOtherCharItemDragEnd", EnterCardSelect = "OnEvent_EnterCardSelect", EnterEventSelect = "OnEvent_EnterEventSelect", EnterStandTable = "OnEvent_EnterStandTable", SoldierSandtableSceneReady = "OnEvent_SoldierSandtableSceneReady", ShowSoldierPositionEffect = "OnEvent_ShowSoldierPositionEffect", SoldierSandtableRefreshStep = "OnEvent_SoldierSandtableRefreshStep", RefreshPurchaseExpPrice = "OnEvent_PurchaseExpPrice", SoldierGMRefresh = "OnEvent_SoldierGMRefresh", Guide_CloseSoldierShop = "OnBtnClick_CloseShop", [EventId.ClosePanel] = "OnEvent_CloseDic" } SoldierSandtableCtrl._mapRedDotConfig = {} function SoldierSandtableCtrl:Awake() self.canvas = self.gameObject:GetComponent("Canvas") local param = self:GetPanelParam() if type(param) == "table" then self.bIsFirst = param[1] end self:CreateChessList() self._panel.bFirstRefreshed = true end function SoldierSandtableCtrl:CreateChessList() self.levelData = PlayerData.SoldierData:GetCurLevelData() if self.levelData == nil then return end if self.bIsFirst == false then if not self._panel.bFirstRefreshed then local tbDeploy, tbWaiting, tbOther = self.levelData:GetDeploy() for _, v in ipairs(tbDeploy) do local copy = { nId = v.nId, nStar = v.nStar, nUid = v.nUid, nPositionType = v.nPositionType, nIndex = v.nIndex } if v.nPositionType == GameEnum.SoldierPositionType.FightPosition then table.insert(self._panel.MainChessList, copy) else table.insert(self._panel.SupportChessList, copy) end end for _, v in ipairs(tbWaiting) do local copy = { nId = v.nId, nStar = v.nStar, nUid = v.nUid, nIndex = v.nIndex, nPositionType = AllEnum.SoldierPositionType.Waiting } table.insert(self._panel.WaitingChessList, copy) end for _, v in ipairs(tbOther) do for i = 1, v.nCount do table.insert(self._panel.OtherChessList, { nId = v.nId, nStar = v.nStar }) end end table.sort(self._panel.MainChessList, function(a, b) return a.nIndex < b.nIndex end) table.sort(self._panel.SupportChessList, function(a, b) return a.nIndex < b.nIndex end) table.sort(self._panel.WaitingChessList, function(a, b) return a.nIndex < b.nIndex end) table.sort(self._panel.OtherChessList, function(a, b) return a.nId < b.nId end) end elseif not self._panel.bFirstRefreshed then self._panel:InitChessList() end self:InitOtherChessList() self:OnEvent_SoldierSandtableFirstInChessListRefresh() end function SoldierSandtableCtrl:InitCacheData() self.sellTimer = nil self.overflowTimer = nil self.nCacheChessMaxCount = 0 self.nCacheShopLevel = 0 self.nCacheExp = 0 self.AnimQueue = {} end function SoldierSandtableCtrl:OnEnable() self._panel:AddGamepadUINode(self:GetGamepadUINode()) self.animRoot = self.gameObject:GetComponent("Animator") self:ShowSandtable(false) self.goSceneTimeline1 = nil self.goSceneTimeline2 = nil self.goSceneTimeline3 = nil self.goSceneTimeline4 = nil self:InitCacheData() self.levelData = PlayerData.SoldierData:GetCurLevelData() if self.levelData == nil then return end self:RefreshLimitAction() NovaAPI.SetTMPText(self._mapNode.TextReputation, tostring(self.levelData:GetHp())) self:InitNodeList() self._mapNode.BuffContainer:RefreshBuff() self:InitExperience() self:InitCoin() self:InitFightIcon() self:InitSellList() self:InitChessListIns() self:InitChessList() self._mapNode.SoldierNodeTips:HideNodeTips() self._mapNode.btnCloseShop.gameObject:SetActive(false) self._mapNode.SoldierShopComponent:HideShopPanel() self._mapNode.SoldierPosEffectTips:HideTips() self:RefreshGoState() self:RefreshBossSkill() self._mapNode.blockInput:SetActive(false) self._mapNode.fxFlyRoot:InitFx() self.bInShopAnim = false CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_ingame_transition") if self.levelData:CheckSandTableDisable() then self:ShowSandtable(true) if self.levelData:IsSandtableSceneLoaded() then self:PlaySceneTimeline() end end local fnReady = self.levelData.fnPanelReadyOnce if fnReady ~= nil then self.levelData.fnPanelReadyOnce = nil fnReady() elseif self._panel.bReturnFromOverlay then self._panel.bReturnFromOverlay = nil self:ShowSandtable(true) end end function SoldierSandtableCtrl:OnDisable() if self.timelineTimer ~= nil then self.timelineTimer:Cancel() end end function SoldierSandtableCtrl:PlaySceneTimeline(callback) local sSceneName = self.levelData ~= nil and self.levelData:GetSandtableSceneName() or nil if sSceneName == nil then if callback ~= nil then callback() end return end if self.timelineTimer ~= nil then self.timelineTimer:Cancel() end local sceneRoot = CS.MainMenuModuleHelper.GetMainMenuSceneRoot(sSceneName) if sceneRoot == nil then if callback ~= nil then callback() end return end self:ShowSandtable(false) self.goSceneTimeline1 = sceneRoot.transform:Find("==== Environment ====/Timeline1/EnterCamera_SoldierUI") self.goSceneTimeline2 = sceneRoot.transform:Find("==== Environment ====/Timeline2/EnterCamera_SoldierUISlow") self.goSceneTimeline3 = sceneRoot.transform:Find("==== Environment ====/Timeline3/SoldierUI_Down") self.goSceneTimeline4 = sceneRoot.transform:Find("==== Environment ====/Timeline4/SoldierUI_Up") local cameraBrain = CS.GameCameraStackManager.Instance.mainCameraBrain if self.goSceneTimeline1 ~= nil then NovaAPIHotfix.BindTimelineCameraBrain(self.goSceneTimeline1.gameObject, cameraBrain) end if self.goSceneTimeline2 ~= nil then NovaAPIHotfix.BindTimelineCameraBrain(self.goSceneTimeline2.gameObject, cameraBrain) end if self.goSceneTimeline3 ~= nil then NovaAPIHotfix.BindTimelineCameraBrain(self.goSceneTimeline3.gameObject, cameraBrain) end if self.goSceneTimeline4 ~= nil then NovaAPIHotfix.BindTimelineCameraBrain(self.goSceneTimeline4.gameObject, cameraBrain) end local bFirstEnterScene = self.levelData.sLastTimelineScene ~= sSceneName local goTimeline = bFirstEnterScene and self.goSceneTimeline1 or self.goSceneTimeline2 local nWait = bFirstEnterScene and 1.5 or 0.5 if goTimeline ~= nil then goTimeline.gameObject:SetActive(true) NovaAPIHotfix.PlayTimeline(goTimeline.gameObject) self.timelineTimer = self:AddTimer(1, nWait, function() self.timelineTimer = nil self:ShowSandtable(true) if callback ~= nil then callback() end end, true, true, true) self.levelData.sLastTimelineScene = sSceneName end NovaAPI.SetComponentEnable(self.canvas, true) end function SoldierSandtableCtrl:RefreshLimitAction() local bLimitAction = self.levelData:CheckSandTableDisable() self._mapNode.btn_GoBackEvent.gameObject:SetActive(bLimitAction) self._mapNode.btnPolicy.gameObject:SetActive(not bLimitAction) self._mapNode.btnHandbook.gameObject:SetActive(not bLimitAction) end function SoldierSandtableCtrl:CheckLimitAction() return self.levelData:CheckSandTableDisable() end function SoldierSandtableCtrl:InitExperience() local nCurLevel, nMaxLevel = self.levelData:GetShopLevel() self._mapNode.btnExperience.gameObject:SetActive(nCurLevel < nMaxLevel) self._mapNode.btnMax.gameObject:SetActive(nMaxLevel <= nCurLevel) self.nCacheShopLevel = nCurLevel self.nCacheExp = self.levelData:GetExp() for _, v in ipairs(self._mapNode.TextLv) do NovaAPI.SetTMPText(v, tostring(nCurLevel)) end self._mapNode.imgBuyExpCostIcon.gameObject:SetActive(nCurLevel < nMaxLevel) self._mapNode.TextCostNum.gameObject:SetActive(nCurLevel < nMaxLevel) if nCurLevel == nMaxLevel then NovaAPI.SetImageFillAmount(self._mapNode.BarContainer, 1) for _, v in ipairs(self._mapNode.TextExpNum) do NovaAPI.SetTMPText(v, ConfigTable.GetUIText("Soldier_Sandtable_MaxLevel")) end NovaAPI.SetTMPText(self._mapNode.txtExpTitle, ConfigTable.GetUIText("Soldier_Sandtable_MaxLevel")) else local nNeedExp = ConfigTable.GetData("SoldierShopLevel", nCurLevel).Exp local nCurExp = self.levelData:GetExp() NovaAPI.SetImageFillAmount(self._mapNode.BarContainer, nCurExp / nNeedExp) for _, v in ipairs(self._mapNode.TextExpNum) do NovaAPI.SetTMPText(v, tostring(nCurExp) .. "/" .. tostring(nNeedExp)) end local shopData = self.levelData:GetShopData() if shopData ~= nil then NovaAPI.SetTMPText(self._mapNode.TextCostNum, shopData.nPurchaseExpPrice) else local tbCost = ConfigTable.GetConfigArray("SoldierBuyExp", nCurLevel) NovaAPI.SetTMPText(self._mapNode.TextCostNum, tbCost[1]) end NovaAPI.SetTMPText(self._mapNode.txtExpTitle, ConfigTable.GetUIText("Soldier_Sandtable_BuyExpTitle")) end end function SoldierSandtableCtrl:InitPartnerList() local tbDeployChess = self.levelData:GetDeploy() local tbActivePartner, tbUIData = SoldierAttrData.CalcActivePartners(tbDeployChess) self._mapNode.PartnerList:SetData(tbUIData) self._mapNode.PartnerList:SetTipsRoot(self._mapNode.parnterDetailRoot) end function SoldierSandtableCtrl:InitNodeList() local nStage, nNodexIndex = PlayerData.SoldierData:GetCurChallengeState() NovaAPI.SetTMPText(self._mapNode.TextPos, tostring(nStage) .. "-" .. tostring(nNodexIndex)) local tbAllNodeList = self.levelData:GetNodeList() local curStageNodeList = {} for _, v in ipairs(tbAllNodeList) do if v.nNodeType ~= GameEnum.soldierNodeType.CheckStage then table.insert(curStageNodeList, v) end end 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, AssetRoot .. AllEnum.SoliderNoteTypeCfg[curStageNodeList[i].nNodeType].Icon) for j = 1, 3 do local imgDot = node.transform:Find("imgDot" .. j) imgDot.gameObject:SetActive(i < #curStageNodeList) end 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 self._mapNode.SoldierNodeTips:HideNodeTips() end function SoldierSandtableCtrl:InitCoin() local nCount = self.levelData:GetItem(AllEnum.CoinItemId.SoldierCurrency) NovaAPI.SetTMPText(self._mapNode.TextCurCoin, tostring(nCount)) end function SoldierSandtableCtrl:InitFightIcon() local nWiningStreak, nLosingStreak = self.levelData:GetStreakCount() self._mapNode.ImgIconFight_lose:SetActive(0 < nLosingStreak) self._mapNode.ImgIconFight:SetActive(nLosingStreak == 0) if 0 < nLosingStreak then NovaAPI.SetTMPText(self._mapNode.TextFightCount, tostring(nLosingStreak)) else NovaAPI.SetTMPText(self._mapNode.TextFightCount, tostring(nWiningStreak)) end end function SoldierSandtableCtrl:InitChessListIns() self.MainChessListIns = {} self.SupportChessListIns = {} self.WaitingChessListIns = {} for i = 1, #self._mapNode.EntranceItemTemplate do table.insert(self.MainChessListIns, self._mapNode.EntranceItemTemplate[i]:GetItemBtnInstanceId()) self._mapNode.EntranceItemTemplate[i]:InitSortingOrder(self._nSortingOrder) self._mapNode.EntranceItemTemplate[i]:SetPositionIndex(i) self._mapNode.EntranceItemTemplate[i]:SetDetailRoot(self._mapNode.charDetaiRoot) end for i = 1, #self._mapNode.UpportingItemTemplate do table.insert(self.SupportChessListIns, self._mapNode.UpportingItemTemplate[i]:GetItemBtnInstanceId()) self._mapNode.UpportingItemTemplate[i]:InitSortingOrder(self._nSortingOrder) self._mapNode.UpportingItemTemplate[i]:SetDetailRoot(self._mapNode.charDetaiRoot) end for i = 1, #self._mapNode.WaitingCardItemTemplate do table.insert(self.WaitingChessListIns, self._mapNode.WaitingCardItemTemplate[i]:GetItemBtnInstanceId()) self._mapNode.WaitingCardItemTemplate[i]:InitSortingOrder(self._nSortingOrder) self._mapNode.WaitingCardItemTemplate[i]:SetDetailRoot(self._mapNode.charDetaiRoot) end for i = 1, #self._mapNode.OtherChar do self._mapNode.OtherChar[i]:InitSortingOrder(self._nSortingOrder) end end function SoldierSandtableCtrl:InitChessList() self:RefreshChessList() self:InitChessCount() self:InitPartnerList() self:RefreshGoState() end function SoldierSandtableCtrl:InitChessCount() local nCurLevel, nMaxLevel = self.levelData:GetShopLevel() local shopCfg = ConfigTable.GetData("SoldierShopLevel", nCurLevel) local nMaxCount = shopCfg.Count local nCurCount = 0 local tbDeployChess, tbWaitingChess, tbOtherChess = self.levelData:GetDeploy() for k, v in ipairs(tbDeployChess) do if v.nId ~= 0 then nCurCount = nCurCount + 1 end end nCurCount = nCurCount + #tbOtherChess self.nCacheChessMaxCount = nMaxCount self._mapNode.go_overflow:SetActive(nMaxCount < nCurCount) if self.overflowTimer ~= nil then self.overflowTimer:_Stop() end if nMaxCount < nCurCount then self._mapNode.go_overflow_anim:Play("Overflow_in") else self.overflowTimer = self:AddTimer(1, 0.26, function() self._mapNode.go_overflow_anim:Play("Overflow_out") end, true, true, true) end local tbCurChessColor if nMaxCount > nCurCount then tbCurChessColor = chessCountColor.Normal elseif nCurCount == nMaxCount then tbCurChessColor = chessCountColor.Max else tbCurChessColor = chessCountColor.Overflow end if tbCurChessColor ~= nil then NovaAPI.SetImageColor(self._mapNode.ImageAddCharCount, tbCurChessColor.mapColor) NovaAPI.SetTMPText(self._mapNode.TextAddCharCount, string.format("%d/%d", tbCurChessColor.sColor, nCurCount, nMaxCount)) NovaAPI.SetTMPText(self._mapNode.TextAddCharCountShow, string.format("%d/%d", nCurCount, nMaxCount)) end end function SoldierSandtableCtrl:InitSellList() self.SellListIns = {} for i = 1, #self._mapNode.btn_Sell do table.insert(self.SellListIns, self._mapNode.btn_Sell[i].gameObject:GetInstanceID()) end if self._mapNode.SoldierShopComponent ~= nil then table.insert(self.SellListIns, self._mapNode.SoldierShopComponent:GetSellBtnInstanceId()) end self._mapNode.SaleContainer:SetActive(false) end function SoldierSandtableCtrl:RefreshSell(nCount) for _, v in ipairs(self._mapNode.txtSellPrice) do NovaAPI.SetTMPText(v, nCount) end end function SoldierSandtableCtrl:RefreshChessList() for i = 1, #self._mapNode.EntranceItemTemplate do local item = self._mapNode.EntranceItemTemplate[i] item:SetData(self._panel.MainChessList[i]) end for i = 1, #self._mapNode.UpportingItemTemplate do local item = self._mapNode.UpportingItemTemplate[i] item:SetData(self._panel.SupportChessList[i]) end for i = 1, #self._mapNode.WaitingCardItemTemplate do local item = self._mapNode.WaitingCardItemTemplate[i] item:SetData(self._panel.WaitingChessList[i]) end for k, v in ipairs(self._mapNode.OtherChar) do v.gameObject:SetActive(false) end self:RefreshOtherChessData() end function SoldierSandtableCtrl:InitOtherChessList() self._panel.OtherChessList = {} local _, _, tbOther = self.levelData:GetDeploy() for _, v in ipairs(tbOther) do for i = 1, v.nCount do table.insert(self._panel.OtherChessList, { nId = v.nId, nStar = v.nStar }) end end table.sort(self._panel.OtherChessList, function(a, b) return a.nId < b.nId end) self:RefreshOtherChessData() end function SoldierSandtableCtrl:RefreshOtherChessData() for k, v in ipairs(self._mapNode.OtherChar) do v.gameObject:SetActive(false) end for i = 1, #self._panel.OtherChessList do local item = self._mapNode.OtherChar[i] if item ~= nil then item:SetData(self._panel.OtherChessList[i]) item.gameObject:SetActive(true) end end end function SoldierSandtableCtrl:RefreshGoState() if self:CheckLimitAction() then self:SetGoState(false) return end local nCurLevel, nMaxLevel = self.levelData:GetShopLevel() local tbDeployChess = self.levelData:GetDeploy() local shopCfg = ConfigTable.GetData("SoldierShopLevel", nCurLevel) local nMaxCount = shopCfg.Count local nCurCount = 0 for k, v in ipairs(tbDeployChess) do if v.nId ~= 0 then nCurCount = nCurCount + 1 end end if nCurCount == 0 then self:SetGoState(false) return end if nMaxCount < nCurCount then self:SetGoState(false) return end self:SetGoState(true) end function SoldierSandtableCtrl:SetGoState(bCanGo) self._mapNode.Enable:SetActive(bCanGo) self._mapNode.Disable:SetActive(not bCanGo) end function SoldierSandtableCtrl:CalSellPrice(chessData) local charCfg = ConfigTable.GetData("SoldierCharacter", chessData.nId) if charCfg == nil then return 0 end local nCount = 1 for i = 1, chessData.nStar - 1 do nCount = nCount * 3 end return charCfg.Cost * nCount end function SoldierSandtableCtrl:GetDragInsData(nInsId) if table.indexof(self.MainChessListIns, nInsId) > 0 then return DragInsType.Chess, self._panel.MainChessList[table.indexof(self.MainChessListIns, nInsId)] elseif 0 < table.indexof(self.SupportChessListIns, nInsId) then return DragInsType.Chess, self._panel.SupportChessList[table.indexof(self.SupportChessListIns, nInsId)] elseif 0 < table.indexof(self.WaitingChessListIns, nInsId) then return DragInsType.Chess, self._panel.WaitingChessList[table.indexof(self.WaitingChessListIns, nInsId)] elseif 0 < table.indexof(self.SellListIns, nInsId) then return DragInsType.Sell, nil end return DragInsType.None, nil end function SoldierSandtableCtrl:ResetPostionType() for k, v in ipairs(self._panel.MainChessList) do v.nPositionType = GameEnum.SoldierPositionType.FightPosition v.nIndex = k end for k, v in ipairs(self._panel.SupportChessList) do v.nPositionType = GameEnum.SoldierPositionType.SupportPosition v.nIndex = k end for k, v in ipairs(self._panel.WaitingChessList) do v.nPositionType = 3 v.nIndex = k end end function SoldierSandtableCtrl:SwapChess(dragChessData, targetChessData) local sourceList, targetList if dragChessData.nPositionType == GameEnum.SoldierPositionType.FightPosition then sourceList = self._panel.MainChessList elseif dragChessData.nPositionType == GameEnum.SoldierPositionType.SupportPosition then sourceList = self._panel.SupportChessList else sourceList = self._panel.WaitingChessList end if targetChessData.nPositionType == GameEnum.SoldierPositionType.FightPosition then targetList = self._panel.MainChessList elseif targetChessData.nPositionType == GameEnum.SoldierPositionType.SupportPosition then targetList = self._panel.SupportChessList else targetList = self._panel.WaitingChessList end if not self:CheckSwapCondition(sourceList, targetList, dragChessData, targetChessData) then self:RefreshChessList() return end local nUid = dragChessData.nUid if nUid == nil or nUid == 0 then printError("[Soldier] SwapChess 拖拽源无 UID") return end local nTargetSlot = self.levelData:PosIndexToSlot(targetChessData.nPositionType, targetChessData.nIndex) if nTargetSlot == 0 then return end self:ResetPostionType() EventManager.Hit(EventId.BlockInput, true) local nPositionType = targetChessData.nPositionType self.levelData:SendMove(nUid, nTargetSlot, function(tbChange) EventManager.Hit("Guide_SwapSoldierSuccess") if nPositionType == AllEnum.SoldierPositionType.Waiting then CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_selectCard_downChair") elseif nPositionType == GameEnum.SoldierPositionType.FightPosition or nPositionType == GameEnum.SoldierPositionType.SupportPosition then CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_selectCard_prepareBattle") end EventManager.Hit(EventId.BlockInput, false) local tbStep = tbChange and tbChange.tbChessChangeStep if tbStep ~= nil and 0 < #tbStep then local bNeedLock = false for _, s in ipairs(tbStep) do if s.tbConsume ~= nil and 0 < #s.tbConsume or s.tbObtain ~= nil and 0 < #s.tbObtain then bNeedLock = true break end end if bNeedLock then self._mapNode.blockInput:SetActive(true) end self:InitChessCount() self:InitPartnerList() self:RefreshGoState() self:PlayStepsAnimation(tbStep, function() if bNeedLock then self._mapNode.blockInput:SetActive(false) end end) end end) end function SoldierSandtableCtrl:CheckSwapCondition(sourceList, targetList, dragChessData, targetChessData) if sourceList == targetList then return true end local waitingList = self._panel.WaitingChessList if sourceList ~= waitingList and targetList ~= waitingList then return true end local deployedSideData, waitingSideData if sourceList == waitingList then waitingSideData = dragChessData deployedSideData = targetChessData else waitingSideData = targetChessData deployedSideData = dragChessData end local nIncomingId = waitingSideData.nId if nIncomingId ~= 0 then local hasSameIdExcept = function(list, exceptData, nId) for _, v in ipairs(list) do if v ~= exceptData and v.nId == nId then return true end end return false end if hasSameIdExcept(self._panel.MainChessList, deployedSideData, nIncomingId) or hasSameIdExcept(self._panel.SupportChessList, deployedSideData, nIncomingId) then EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_SwapChess_Tips")) return false end end if sourceList == waitingList and deployedSideData.nId == 0 then local nCurLevel = self.levelData:GetShopLevel() local shopCfg = ConfigTable.GetData("SoldierShopLevel", nCurLevel) local nMaxCount = shopCfg.Count local nCurCount = 0 for _, v in ipairs(self._panel.MainChessList) do if v.nId ~= 0 then nCurCount = nCurCount + 1 end end for _, v in ipairs(self._panel.SupportChessList) do if v.nId ~= 0 then nCurCount = nCurCount + 1 end end if nMaxCount <= nCurCount then EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_OverChessCount_Tips")) return false end end return true end function SoldierSandtableCtrl:GetCharCtrlByChessData(chessData, bOtherAdd) if bOtherAdd == nil then bOtherAdd = false end if chessData.nPositionType == GameEnum.SoldierPositionType.FightPosition then return self._mapNode.EntranceItemTemplate[chessData.nIndex] elseif chessData.nPositionType == GameEnum.SoldierPositionType.SupportPosition then return self._mapNode.UpportingItemTemplate[chessData.nIndex] end if (chessData.nPositionType == nil or chessData.nPositionType == AllEnum.SoldierPositionType.Other) and (chessData.nIndex == nil or chessData.nIndex == 0) then if not bOtherAdd then for k, v in ipairs(self._panel.OtherChessList) do if v.nId == chessData.nId and v.nStar == chessData.nStar then return self._mapNode.OtherChar[k] end end else return self._mapNode.OtherChar[#self._panel.OtherChessList + 1] end else return self._mapNode.WaitingCardItemTemplate[chessData.nIndex] end return nil end function SoldierSandtableCtrl:RefreshBossSkill() local nTemplateId = self.levelData:GetBossTemplateId() if nTemplateId == 0 then return end local mapCfg = ConfigTable.GetData("SoldierBossTemplate", nTemplateId) if mapCfg ~= nil then self:SetPngSprite(self._mapNode.imgSkill, mapCfg.SoldierRoleSkillIcon) for _, v in ipairs(self._mapNode.imgBossTemplateIcon) do self:SetPngSprite(v, mapCfg.SoldierPlayerHead) end local nSkillType = mapCfg.SoldierRoleSkillType self._mapNode.imgSkillPassive.gameObject:SetActive(nSkillType == GameEnum.SoldierRoleSkillType.SoldierRoleSkillType_1 or nSkillType == GameEnum.SoldierRoleSkillType.SoldierRoleSkillType_3) self._mapNode.imgSkillInitiative.gameObject:SetActive(nSkillType == GameEnum.SoldierRoleSkillType.SoldierRoleSkillType_2 or nSkillType == GameEnum.SoldierRoleSkillType.SoldierRoleSkillType_4) end end function SoldierSandtableCtrl:CheckAnimQueue() if #self.AnimQueue == 0 then self:InitOtherChessList() self:RefreshGoState() return end local animaData = self.AnimQueue[1] table.remove(self.AnimQueue, 1) if animaData.nType == animQueueType.NodeReward then self:PlayNodeReward(animaData, function() self:InitChessCount() self:InitPartnerList() self:RefreshGoState() self:CheckAnimQueue() end) elseif animaData.nType == animQueueType.EnterSandtable then self._mapNode.goNodeDeployment:SetActive(true) self._mapNode.blockInput:SetActive(true) self:AddTimer(1, 1.5, function() self._mapNode.blockInput:SetActive(false) self._mapNode.goNodeDeployment:SetActive(false) self:CheckAnimQueue() end, true, true, true) elseif animaData.nType == animQueueType.OpenShop then self:OpenShop(true) self:CheckAnimQueue() end end function SoldierSandtableCtrl:PlayNodeReward(animaData, callback) local rewardData = animaData.rewardData if (rewardData.tbSteps == nil or #rewardData.tbSteps == 0) and (rewardData.data == nil or rewardData.data.nCoin == 0) then if callback ~= nil then callback() end return end if rewardData.nType == AllEnum.SoldierRewardSource.Apply then self._mapNode.goNodeSupply:SetActive(true) self._mapNode.blockInput:SetActive(true) self:AddTimer(1, 0.5, function() local tbChess = {} if rewardData.tbSteps[1] ~= nil and rewardData.tbSteps[1].tbObtain ~= nil then tbChess = rewardData.tbSteps[1].tbObtain end for k, v in ipairs(tbChess) do local chessData = { nId = v.nId, nStar = v.nStar, nUid = v.nUid, nPositionType = v.nTargetType, nIndex = v.nIndex } self:AddChessData2list(chessData) end self:PlayRewardFly(tbChess, rewardData.data.nCoin, function() self:PlayStepsAnimation(rewardData.tbSteps, function() self._mapNode.goNodeSupply:SetActive(false) if callback ~= nil then self._mapNode.blockInput:SetActive(false) callback() end end) end) end, true, true, true) elseif rewardData.nType == AllEnum.SoldierRewardSource.CardWipe then self._mapNode.blockInput:SetActive(true) self:PlayStepsAnimation(rewardData.tbSteps, function() self._mapNode.blockInput:SetActive(false) if callback ~= nil then callback() end end) elseif rewardData.nType == AllEnum.SoldierRewardSource.EventBattle or rewardData.nType == AllEnum.SoldierRewardSource.Battle then for k, v in ipairs(self._mapNode.reward) do v.gameObject:SetActive(false) end local tbChessReward = rewardData.data.tbChess or {} for i, p in ipairs(tbChessReward) do local item = self._mapNode.reward[i] item:SetItemData(p.Tid) item:SetCharLevel(p.Star) item.gameObject:SetActive(true) end local nCoin = rewardData.data.nCoin or 0 self._mapNode.rewardItem.gameObject:SetActive(false) if 0 < nCoin then local mapItemCfg = ConfigTable.GetData_Item(AllEnum.CoinItemId.SoldierCurrency) if mapItemCfg ~= nil then self._mapNode.rewardItem.gameObject:SetActive(true) self._mapNode.rewardItem:SetItem(GameEnum.itemRarity.SSR, nCoin, mapItemCfg.Icon, AllEnum.CoinItemId.SoldierCurrency) end end self._mapNode.blockInput:SetActive(true) self._mapNode.goNodeReward:SetActive(true) self:AddTimer(1, 0.5, function() local tbChess = {} if rewardData.tbSteps[1] ~= nil and rewardData.tbSteps[1].tbObtain ~= nil then tbChess = rewardData.tbSteps[1].tbObtain end self:PlayRewardFly(tbChess, rewardData.data.nCoin, function() self:PlayStepsAnimation(rewardData.tbSteps, function() self._mapNode.goNodeReward:SetActive(false) if callback ~= nil then self._mapNode.blockInput:SetActive(false) callback() end end) self:InitCoin() end) end, true, true, true) end end function SoldierSandtableCtrl:AddChessData2list(chessData, bLose) if bLose == nil then bLose = false end if chessData.nPositionType == GameEnum.SoldierPositionType.FightPosition then self._panel.MainChessList[chessData.nIndex] = chessData elseif chessData.nPositionType == GameEnum.SoldierPositionType.SupportPosition then self._panel.SupportChessList[chessData.nIndex] = chessData elseif chessData.nPositionType == 3 then self._panel.WaitingChessList[chessData.nIndex] = chessData else if bLose then local index = 0 for k, v in ipairs(self._panel.OtherChessList) do if v.nId == chessData.nId and v.nStar == chessData.nStar then index = k end if 0 < index then table.remove(self._panel.OtherChessList, index) break end end else table.insert(self._panel.OtherChessList, { nId = chessData.nId, nStar = chessData.nStar }) end table.sort(self._panel.OtherChessList, function(a, b) return a.nId < b.nId end) self:RefreshOtherChessData() end end function SoldierSandtableCtrl:PlayRewardFly(tbChess, nCoin, callback) local tbFx = {} if nCoin ~= nil and 0 < nCoin then tbFx[fxType.Coin] = {} table.insert(tbFx[fxType.Coin], { from = self._mapNode.fxFlyRoot.gameObject.transform, to = self._mapNode.TextCurCoin.gameObject.transform }) end for k, v in ipairs(tbChess) do local cfg = ConfigTable.GetData("SoldierCharacter", v.nId) if cfg ~= nil then local to if v.nTargetType == GameEnum.SoldierPositionType.FightPosition then to = self._mapNode.EntranceItemTemplate[v.nIndex].gameObject.transform elseif v.nTargetType == GameEnum.SoldierPositionType.SupportPosition then to = self._mapNode.UpportingItemTemplate[v.nIndex].gameObject.transform elseif v.nTargetType == AllEnum.SoldierPositionType.Waiting then to = self._mapNode.WaitingCardItemTemplate[v.nIndex].gameObject.transform elseif v.nTargetType == nil or v.nTargetType == AllEnum.SoldierPositionType.Other then to = self._mapNode.OtherCharLsit end if tbFx[cfg.Rarity] == nil then tbFx[cfg.Rarity] = {} end table.insert(tbFx[cfg.Rarity], { from = self._mapNode.fxFlyRoot.gameObject.transform, to = to }) end end self._mapNode.fxFlyRoot:PlayFx(tbFx, callback) end function SoldierSandtableCtrl:PlayStepsAnimation(tbSteps, callback) local bPartnerChanged = false if self.levelData ~= nil and self.levelData.HasPartnerSetChanged ~= nil then bPartnerChanged = self.levelData:HasPartnerSetChanged() end if bPartnerChanged then self._nStepsSession = (self._nStepsSession or 0) + 1 local _stopSlots = function(slotList) for _, slotCtrl in ipairs(slotList or {}) do if slotCtrl ~= nil and slotCtrl.itemCtrl ~= nil and slotCtrl.itemCtrl._StopPartnerActiveAnim ~= nil then slotCtrl.itemCtrl:_StopPartnerActiveAnim() end end end _stopSlots(self._mapNode.EntranceItemTemplate) _stopSlots(self._mapNode.UpportingItemTemplate) if self.levelData.ClearPartnerSetChangedFlag ~= nil then self.levelData:ClearPartnerSetChangedFlag() end end local nMySession = self._nStepsSession or 0 if tbSteps == nil or #tbSteps == 0 then if callback ~= nil then callback() end if NovaAPI.IsEditorPlatform() then self:PrintChessList() end return end for _, v in ipairs(tbSteps) do for _, n in ipairs(v.tbConsume) do if n.nSourceType == AllEnum.SoldierPositionType.Other then local chessData = { nId = n.nId, nStar = n.nStar, nUid = n.nUid, nPositionType = n.nSourceType, nIndex = n.nIndex } self:AddChessData2list(chessData, true) else local chessData = { nId = 0, nStar = 0, nUid = 0, nPositionType = n.nSourceType, nIndex = n.nIndex } self:AddChessData2list(chessData, true) end end for _, n in ipairs(v.tbObtain) do local chessData = { nId = n.nId, nStar = n.nStar, nUid = n.nUid, nPositionType = n.nTargetType, nIndex = n.nIndex } self:AddChessData2list(chessData) end if v.tbUpdate ~= nil then local mapDstKey = {} for _, n in ipairs(v.tbUpdate) do mapDstKey[tostring(n.nTargetType) .. "_" .. tostring(n.nTargetIndex)] = true end for _, n in ipairs(v.tbUpdate) do if n.nSourceType ~= AllEnum.SoldierPositionType.Other then local sSrcKey = tostring(n.nSourceType) .. "_" .. tostring(n.nSourceIndex) if not mapDstKey[sSrcKey] then local srcData = { nId = 0, nStar = 0, nUid = 0, nPositionType = n.nSourceType, nIndex = n.nSourceIndex } self:AddChessData2list(srcData, true) end end local dstData = { nId = n.nId, nStar = n.nStar, nUid = n.nUid, nPositionType = n.nTargetType, nIndex = n.nTargetIndex } self:AddChessData2list(dstData) end end end local wait = function() local bGuide510 = false while 0 < #tbSteps do local step = table.remove(tbSteps, 1) local nAnimLength = 0 if step.sSpecial == "CardWipeAll" then end for k, v in ipairs(step.tbConsume) do local chessData = { nId = v.nId, nStar = v.nStar, nUid = v.nUid, nPositionType = v.nSourceType, nIndex = v.nIndex } local sourceCharCtrl = self:GetCharCtrlByChessData(chessData) if sourceCharCtrl ~= nil then sourceCharCtrl:SetAnimator(chessAnimType.COMPOUND_OUT) nAnimLength = math.max(nAnimLength, chessAnimLength[chessAnimType.COMPOUND_OUT]) end end coroutine.yield(CS.UnityEngine.WaitForSeconds(nAnimLength)) nAnimLength = 0 for k, v in ipairs(step.tbConsume) do if v.nSourceType == AllEnum.SoldierPositionType.Other then local chessData = { nId = v.nId, nStar = v.nStar, nUid = v.nUid, nPositionType = v.nSourceType, nIndex = v.nIndex } local sourceCharCtrl = self:GetCharCtrlByChessData(chessData) if sourceCharCtrl ~= nil then sourceCharCtrl:SetData(chessData) end else local chessData = { nId = 0, nStar = 0, nUid = 0, nPositionType = v.nSourceType, nIndex = v.nIndex } local sourceCharCtrl = self:GetCharCtrlByChessData(chessData) if sourceCharCtrl ~= nil then sourceCharCtrl:SetData(chessData) end end end for k, v in ipairs(step.tbObtain) do local chessData = { nId = v.nId, nStar = v.nStar, nUid = v.nUid, nPositionType = v.nTargetType, nIndex = v.nIndex } local targetCharCtrl = self:GetCharCtrlByChessData(chessData) if targetCharCtrl ~= nil then targetCharCtrl:SetData(chessData) end end for k, v in ipairs(step.tbObtain) do local chessData = { nId = v.nId, nStar = v.nStar, nUid = v.nUid, nPositionType = v.nTargetType, nIndex = v.nIndex } local targetCharCtrl = self:GetCharCtrlByChessData(chessData, true) if targetCharCtrl ~= nil then if 0 < #step.tbConsume then nAnimLength = math.max(nAnimLength, chessAnimLength[chessAnimType.COMPOUND]) targetCharCtrl:SetAnimator(chessAnimType.COMPOUND) CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_chair_combine") else nAnimLength = math.max(nAnimLength, chessAnimLength[chessAnimType.PUTIN]) targetCharCtrl:SetAnimator(chessAnimType.PUTIN) end end end if step.tbUpdate ~= nil then local mapDstKey = {} for _, v in ipairs(step.tbUpdate) do mapDstKey[tostring(v.nTargetType) .. "_" .. tostring(v.nTargetIndex)] = true end for k, v in ipairs(step.tbUpdate) do if v.nSourceType == AllEnum.SoldierPositionType.Other then for idx, item in ipairs(self._panel.OtherChessList) do if item.nId == v.nId and item.nStar == v.nStar then local srcCtrl = self._mapNode.OtherChar[idx] if srcCtrl ~= nil then srcCtrl:SetData({ nId = 0, nStar = 0, nUid = 0, nPositionType = AllEnum.SoldierPositionType.Other }) end table.remove(self._panel.OtherChessList, idx) break end end else local sSrcKey = tostring(v.nSourceType) .. "_" .. tostring(v.nSourceIndex) if not mapDstKey[sSrcKey] then local srcChessData = { nId = v.nId, nStar = v.nStar, nUid = v.nUid, nPositionType = v.nSourceType, nIndex = v.nSourceIndex } local srcCharCtrl = self:GetCharCtrlByChessData(srcChessData) if srcCharCtrl ~= nil then local newSrcChessData = { nId = 0, nStar = 0, nUid = 0, nPositionType = v.nSourceType, nIndex = v.nSourceIndex } srcCharCtrl:SetData(newSrcChessData) end end end local dstChessData = { nId = v.nId, nStar = v.nStar, nUid = v.nUid, nPositionType = v.nTargetType, nIndex = v.nTargetIndex } local dstCharCtrl = self:GetCharCtrlByChessData(dstChessData) if dstCharCtrl ~= nil then dstCharCtrl:SetData(dstChessData) nAnimLength = math.max(nAnimLength, chessAnimLength[chessAnimType.PUTIN]) dstCharCtrl:SetAnimator(chessAnimType.PUTIN) end end end coroutine.yield(CS.UnityEngine.WaitForSeconds(nAnimLength)) if step.sSpecial ~= "CardWipeAll" and step.tbConsume ~= nil and 0 < #step.tbConsume and step.tbObtain ~= nil and 0 < #step.tbObtain then bGuide510 = true local nId = 0 for _, v in ipairs(step.tbObtain) do if 1 < v.nStar then nId = v.nId break end end PlayerData.SoldierData:SetGuideData(510, nId) end if #tbSteps == 0 then if callback ~= nil then callback() if NovaAPI.IsEditorPlatform() then self:PrintChessList() end end if bGuide510 and not PlayerData.Guide:CheckGuideFinishById(510) then EventManager.Hit("Guide_PassiveCheck_Msg", "Guide_Solider_510") end if nMySession ~= self._nStepsSession then return end if self.levelData ~= nil and self.levelData.GetPendingNewPartner ~= nil then local tbPending = self.levelData:GetPendingNewPartner() self.levelData:ClearPendingNewPartner() if tbPending ~= nil then local tbOrdered = {} for nType, info in pairs(tbPending) do table.insert(tbOrdered, {nType = nType, info = info}) end table.sort(tbOrdered, function(a, b) return a.nType < b.nType end) local nPartnerAnimLength = 1 local _probeAnimLength = function(slotList) for _, slotCtrl in ipairs(slotList or {}) do if slotCtrl ~= nil and slotCtrl.itemCtrl ~= nil and slotCtrl.itemCtrl._mapNode ~= nil and slotCtrl.itemCtrl._mapNode.HeadRoot ~= nil then local len = NovaAPI.GetAnimClipLength(slotCtrl.itemCtrl._mapNode.HeadRoot, {"HeadActive"}) if type(len) == "number" and 0 < len then return len end end end return nil end if 0 < #tbOrdered then nPartnerAnimLength = _probeAnimLength(self._mapNode.EntranceItemTemplate) or _probeAnimLength(self._mapNode.UpportingItemTemplate) or 1 end for i, item in ipairs(tbOrdered) do if nMySession ~= self._nStepsSession then return end local tbSinglePartner = { [item.nType] = item.info } local _dispatch = function(slotList) for _, slotCtrl in ipairs(slotList or {}) do if slotCtrl ~= nil and slotCtrl.itemCtrl ~= nil and slotCtrl.itemCtrl.OnEvent_SoldierPartnerNewActive ~= nil then slotCtrl.itemCtrl:OnEvent_SoldierPartnerNewActive(tbSinglePartner) end end end _dispatch(self._mapNode.EntranceItemTemplate) _dispatch(self._mapNode.UpportingItemTemplate) if i < #tbOrdered then coroutine.yield(CS.UnityEngine.WaitForSeconds(nPartnerAnimLength)) end end end end end end end cs_coroutine.start(wait) end function SoldierSandtableCtrl:ShowChessCanPutIn(bShow, chessData) if not bShow then EventManager.Hit("SoldierChessCanPutIn", false) else local nCurLevel, nMaxLevel = self.levelData:GetShopLevel() local shopCfg = ConfigTable.GetData("SoldierShopLevel", nCurLevel) local nMaxCount = shopCfg.Count local nCurCount = 0 for k, v in ipairs(self._panel.MainChessList) do if v.nId ~= 0 then nCurCount = nCurCount + 1 end end for k, v in ipairs(self._panel.SupportChessList) do if v.nId ~= 0 then nCurCount = nCurCount + 1 end end if nMaxCount <= nCurCount then if chessData ~= nil and (chessData.nPositionType == GameEnum.SoldierPositionType.FightPosition or chessData.nPositionType == GameEnum.SoldierPositionType.SupportPosition) then EventManager.Hit("SoldierChessCanPutIn", true) else EventManager.Hit("SoldierChessCanPutIn", false) end else EventManager.Hit("SoldierChessCanPutIn", true) end end end function SoldierSandtableCtrl:OpenShop(bOpen) if self.goSceneTimeline3 ~= nil then self.goSceneTimeline3.gameObject:SetActive(bOpen) end if self.goSceneTimeline4 ~= nil then self.goSceneTimeline4.gameObject:SetActive(not bOpen) end local timeline = bOpen and self.goSceneTimeline3 or self.goSceneTimeline4 if timeline ~= nil then NovaAPIHotfix.PlayTimeline(timeline.gameObject) end if bOpen then self._mapNode.btnCloseShop.gameObject:SetActive(true) self._mapNode.SoldierShopComponent:ShowShopPanel() local btn_shopAnimator = self._mapNode.btnShop.transform:Find("AnimRoot"):GetComponent("Animator") btn_shopAnimator:Play("ShopContainer") self._mapNode.sandtable_anim:Play("SandtableMiddle_S") CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_shop_button") else self._mapNode.btnCloseShop.gameObject:SetActive(false) self._mapNode.SoldierShopComponent:HideShopPanel() self._mapNode.sandtable_anim:Play("SandtableMiddle_L") local btn_shopAnimator = self._mapNode.btnShop.transform:Find("AnimRoot"):GetComponent("Animator") btn_shopAnimator:Play("ShopContainer_close") if self.goSceneTimeline4 ~= nil then self.goSceneTimeline4.gameObject:SetActive(true) NovaAPIHotfix.PlayTimeline(self.goSceneTimeline4.gameObject) end end end function SoldierSandtableCtrl:ShowSandtable(bShow) self._mapNode.goRoot.gameObject:SetActive(bShow) if bShow then self.animRoot:Play("SoldierSandtablePanel_in", 0, 0) NovaAPI.SetCanvasOverrideSorting(self._mapNode.goNodeMatch, true) NovaAPI.SetCanvasSortingName(self._mapNode.goNodeMatch, self._panel._sSortingLayerName) NovaAPI.SetCanvasSortingOrder(self._mapNode.goNodeMatch, self._nSortingOrder + 2) NovaAPI.SetCanvasOverrideSorting(self._mapNode.fxFlyRootCanvas, true) NovaAPI.SetCanvasSortingName(self._mapNode.fxFlyRootCanvas, self._panel._sSortingLayerName) NovaAPI.SetCanvasSortingOrder(self._mapNode.fxFlyRootCanvas, self._nSortingOrder + 2) for i = 1, #self._mapNode.EntranceItemTemplate do self._mapNode.EntranceItemTemplate[i]:InitSortingOrder(self._nSortingOrder) end for i = 1, #self._mapNode.UpportingItemTemplate do self._mapNode.UpportingItemTemplate[i]:InitSortingOrder(self._nSortingOrder) end for i = 1, #self._mapNode.WaitingCardItemTemplate do self._mapNode.WaitingCardItemTemplate[i]:InitSortingOrder(self._nSortingOrder) end for i = 1, #self._mapNode.OtherChar do self._mapNode.OtherChar[i]:InitSortingOrder(self._nSortingOrder) end end end function SoldierSandtableCtrl:OnBtnClick_Policy() if self.bInShopAnim then return end if self:CheckLimitAction() then EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_Sandtable_TemporaryReturn_Tips")) return end self._panel.bReturnFromOverlay = true EventManager.Hit(EventId.OpenPanel, PanelId.SoldierRecommendPanel, true) end function SoldierSandtableCtrl:OnBtnClick_Handbook() if self.bInShopAnim then return end if self:CheckLimitAction() then EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_Sandtable_TemporaryReturn_Tips")) return end self._panel.bReturnFromOverlay = true EventManager.Hit(EventId.OpenPanel, PanelId.SoldierHandbookSelectPanel) end function SoldierSandtableCtrl:OnBtnClick_Close() if self.bInShopAnim then return end if self:CheckLimitAction() then EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_Sandtable_TemporaryReturn_Tips")) return end local nStage, nNodexIndex = PlayerData.SoldierData:GetCurChallengeState() local sStage = tostring(nStage) .. "-" .. tostring(nNodexIndex) local sContent = orderedFormat(ConfigTable.GetUIText("Soldier_FinishTips"), sStage) local msg = { nType = AllEnum.MessageBox.Confirm, sTitle = ConfigTable.GetUIText("Soldier_FinishTitle"), sContent = sContent, callbackCancel = function() PlayerData.SoldierData:SendStepOut(function() end) end, callbackConfirm = function() PlayerData.SoldierData:SendGiveUp(function() end) end, bDisableSnap = false, sConfirm = ConfigTable.GetUIText("Soldier_SaveAndQuit"), sCancel = ConfigTable.GetUIText("Soldier_SaveAndExit"), bCloseNoHandler = true } EventManager.Hit(EventId.OpenMessageBox, msg) end function SoldierSandtableCtrl:OnBtnClick_Details() if self.bInShopAnim then return end if self:CheckLimitAction() then EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_Sandtable_TemporaryReturn_Tips")) return end local nSeasonId = PlayerData.SoldierData:GetCurSelectSeasonId() local mapCfg = ConfigTable.GetData("SoldierSeason", nSeasonId) if mapCfg ~= nil then local nDicId = mapCfg.DictionaryId self._panel.bReturnFromOverlay = true EventManager.Hit(EventId.OpenPanel, PanelId.DictionaryEntry, nDicId, true) end end function SoldierSandtableCtrl:OnBtnClick_Shop() if self:CheckLimitAction() then EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_Sandtable_TemporaryReturn_Tips")) return end if self._mapNode.SoldierShopComponent:IsShopOpen() then self:OpenShop(false) else self:OpenShop(true) end end function SoldierSandtableCtrl:OnBtnClick_CloseShop() self:OpenShop(false) end function SoldierSandtableCtrl:OnBtnClick_GO() if self.bInShopAnim then return end if self:CheckLimitAction() then EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_Sandtable_TemporaryReturn_Tips")) CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_ingame_Go_unprepare") return end if #self._panel.OtherChessList > 0 then EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_OverChessCount_Tips")) CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_ingame_Go_unprepare") return end local nCurLevel, nMaxLevel = self.levelData:GetShopLevel() local shopCfg = ConfigTable.GetData("SoldierShopLevel", nCurLevel) local nMaxCount = shopCfg.Count local nCurCount = 0 for k, v in ipairs(self._panel.MainChessList) do if v.nId ~= 0 then nCurCount = nCurCount + 1 end end if nCurCount == 0 then EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_NoFightChess_Tips")) CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_ingame_Go_unprepare") return end for k, v in ipairs(self._panel.SupportChessList) do if v.nId ~= 0 then nCurCount = nCurCount + 1 end end if nMaxCount < nCurCount then EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_OverChessCount_Tips")) CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_ingame_Go_unprepare") return elseif nMaxCount > nCurCount then local msg = { nType = AllEnum.MessageBox.Confirm, sContent = ConfigTable.GetUIText("Soldier_NotEnoughChess_Tips"), callbackConfirm = function() CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_ingame_Go") self.levelData:SendFight() end, bDisableSnap = false, bCloseNoHandler = true } EventManager.Hit(EventId.OpenMessageBox, msg) return else CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_ingame_Go") self.levelData:SendFight() end end function SoldierSandtableCtrl:OnBtnClick_NodeLayout() self._mapNode.SoldierNodeTips:OpenNodeTips() end function SoldierSandtableCtrl:OnBtnClick_Experience() if self:CheckLimitAction() then EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_Sandtable_TemporaryReturn_Tips")) CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_ingame_buyExperience_poor") return end local nCurLevel, nMaxLevel = self.levelData:GetShopLevel() if nCurLevel == nMaxLevel then EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_BuyExp_Tips1")) CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_ingame_buyExperience_poor") return else local nCost = 0 local shopData = self.levelData:GetShopData() if shopData ~= nil then nCost = shopData.nPurchaseExpPrice else local nCurLevel = self.levelData:GetShopLevel() local tbCost = ConfigTable.GetConfigArray("SoldierBuyExp", nCurLevel) nCost = tbCost[1] end local nItemCount = self.levelData:GetItem(AllEnum.CoinItemId.SoldierCurrency) if nItemCount < tonumber(nCost) then EventManager.Hit("Guide_ExperienceLevelUp_CostNotEnough") EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_BuyExp_Tips2")) CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_ingame_buyExperience_poor") return end end local callback = function(callbackData) self:InitExperience() self._mapNode.SoldierShopComponent:RefreshShopData() if PlayerData.Guide:CheckInGuideGroup(507) then if callbackData.nLevelChange > 0 then EventManager.Hit("Guide_ExperienceLevelChange", true) else EventManager.Hit("Guide_ExperienceLevelChange", false) end end CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_ingame_buyExperience") if callbackData.tbChessChangeStep ~= nil and 0 < #callbackData.tbChessChangeStep then local tbStep = {} for k, v in ipairs(callbackData.tbChessChangeStep) do table.insert(tbStep, v) end self._mapNode.blockInput:SetActive(true) self:PlayStepsAnimation(tbStep, function() self:InitOtherChessList() self:InitChessList() self._mapNode.blockInput:SetActive(false) end) end end self.levelData:SendShopBuyExp(callback) end function SoldierSandtableCtrl:OnBtnClick_CoinTips() if self:CheckLimitAction() then EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_Sandtable_TemporaryReturn_Tips")) return end EventManager.Hit(EventId.OpenPanel, PanelId.SoldierGoldTips) end function SoldierSandtableCtrl:OnBtnClick_GoBackEventPanel() EventManager.Hit("SoldierShowBattleEventPanel") end function SoldierSandtableCtrl:OnBtnClick_SkillDetail() EventManager.Hit(EventId.OpenPanel, PanelId.SoldierBossTemplateTips, self.levelData:GetBossTemplateId()) end function SoldierSandtableCtrl:OnEvent_SoldierExpUpdate() local nOldChessMaxCount = self.nCacheChessMaxCount local nOldLevel = self.nCacheShopLevel local nOldExp = self.nCacheExp local oldShopCfg = ConfigTable.GetData("SoldierShopLevel", nOldLevel) local nOldMaxCount = oldShopCfg.Count self:InitExperience() self:InitChessCount() local expAnimator = self._mapNode.btnExperience.transform:Find("AnimRoot"):GetComponent("Animator") local levelUpAnimator = self._mapNode.btnExperience.transform:Find("AnimRoot/FxLevelUp"):GetComponent("Animator") if 0 < nOldLevel and nOldLevel ~= self.nCacheShopLevel then levelUpAnimator:Play("ExperienceLevelUp_in") CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_ingame_ExperienceReward") local nCurLevel = self.levelData:GetShopLevel() local shopCfg = ConfigTable.GetData("SoldierShopLevel", nCurLevel) local nMaxCount = shopCfg.Count if nOldMaxCount < nMaxCount then self._mapNode.MiddleContainer:Play("LevelUpGrade") local nAnimLength = NovaAPI.GetAnimClipLength(self._mapNode.MiddleContainer, { "LevelUpGrade" }) local nCurCount = 0 local tbDeployChess, tbWaitingChess, tbOtherChess = self.levelData:GetDeploy() for k, v in ipairs(tbDeployChess) do if v.nId ~= 0 then nCurCount = nCurCount + 1 end end nCurCount = nCurCount + #tbOtherChess local tbColor = chessCountColor.LevelUp NovaAPI.SetImageColor(self._mapNode.ImageAddCharCount, tbColor.mapColor) NovaAPI.SetTMPText(self._mapNode.TextAddCharCount, string.format("%d/%d", tbColor.sColor, nCurCount, nMaxCount)) self:AddTimer(1, nAnimLength, function() self:InitChessCount() end, true, true, true) end elseif nOldExp ~= self.nCacheExp then expAnimator:Play("ExperienceContainer") CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_ingame_ExperienceReward") end if 0 < nOldChessMaxCount and nOldChessMaxCount ~= self.nCacheChessMaxCount then self._mapNode.go_overflow_anim:Play("Overflow_in") end end function SoldierSandtableCtrl:OnEvent_SoldierItemChange(itemChange) self:InitCoin() for k, v in pairs(itemChange) do if k == AllEnum.CoinItemId.SoldierCurrency and 0 < v then self._mapNode.fx_shop:Play("ShopFx_in") end end if self._mapNode.SoldierShopComponent:IsShopOpen() then self._mapNode.SoldierShopComponent:RefreshShopData() end end function SoldierSandtableCtrl:OnEvent_SoldierHpChange() NovaAPI.SetTMPText(self._mapNode.TextReputation, tostring(self.levelData:GetHp())) end function SoldierSandtableCtrl:OnEvent_SoldierEffectChange() self:RefreshLimitAction() self:InitNodeList() self:InitChessList() self:InitExperience() end function SoldierSandtableCtrl:OnEvent_SoldierShopClose() self._mapNode.sandtable_anim:Play("SandtableMiddle_L") local btn_shopAnimator = self._mapNode.btnShop.transform:Find("AnimRoot"):GetComponent("Animator") btn_shopAnimator:Play("ShopContainer_close") end function SoldierSandtableCtrl:OnEvent_SoldierSandtableCharItemDragStart(objInsId) CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_selectCard") local dragInsType, chessData = self:GetDragInsData(objInsId) local nPrice if dragInsType == DragInsType.Chess then nPrice = self:CalSellPrice(chessData) self:RefreshSell(nPrice) end if self.sellTimer ~= nil then self.sellTimer:_Stop() end self._mapNode.SellAnimation:Play("sellbtn_in") if not PlayerData.Guide:CheckInGuideGroup(505) then self._mapNode.SaleContainer:SetActive(true) if self._mapNode.SoldierShopComponent:IsShopOpen() then self._mapNode.SoldierShopComponent:SetSellMode(true, nPrice) end end self:ShowChessCanPutIn(true, chessData) end function SoldierSandtableCtrl:OnEvent_SoldierSandtableCharItemDragEnd(nDragInsId, nPointerInsId) self:ShowChessCanPutIn(false) if nPointerInsId == 0 then self:RefreshChessList() if self.sellTimer ~= nil then self.sellTimer:_Stop() end self._mapNode.SellAnimation:Play("sellbtn_out") self._mapNode.SoldierShopComponent:SetSellMode(false) self.sellTimer = self:AddTimer(1, 0.4, function() self._mapNode.SaleContainer:SetActive(false) end, true, true, true) return end local dragInsType, chessData = self:GetDragInsData(nDragInsId) local targetInsType, targetChessData = self:GetDragInsData(nPointerInsId) local dragChessData = chessData local targetChessData = targetChessData if targetInsType == DragInsType.Sell then self.levelData:SendShopSell(dragChessData, function(callbackData) local ctrl = self:GetCharCtrlByChessData(dragChessData) dragChessData.nId = 0 dragChessData.nStar = 0 dragChessData.nUid = 0 self:AddChessData2list(dragChessData, true) ctrl:SetData(dragChessData) local tbStep = {} for k, v in ipairs(callbackData.tbChessChangeStep) do if 1 < k then table.insert(tbStep, v) end end CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_shop_sell") self._mapNode.blockInput:SetActive(true) self:PlayStepsAnimation(tbStep, function() self:InitOtherChessList() self:InitChessList() self._mapNode.blockInput:SetActive(false) end) end) elseif targetChessData == nil then self:RefreshChessList() else self:SwapChess(dragChessData, targetChessData) end if self.sellTimer ~= nil then self.sellTimer:_Stop() end self._mapNode.SellAnimation:Play("sellbtn_out") self._mapNode.SoldierShopComponent:SetSellMode(false) self.sellTimer = self:AddTimer(1, 0.4, function() self._mapNode.SaleContainer:SetActive(false) end, true, true, true) end function SoldierSandtableCtrl:OnEvent_SoldierSandtableCharItemDragging(nDragInsId, nPointerInsId) end function SoldierSandtableCtrl:OnEvent_SoldierSandtableOtherCharItemDragStart(objInsId, chessData) local nPrice = self:CalSellPrice(chessData) self:RefreshSell(nPrice) if self.sellTimer ~= nil then self.sellTimer:_Stop() end self._mapNode.SellAnimation:Play("sellbtn_in") self._mapNode.SaleContainer:SetActive(true) if self._mapNode.SoldierShopComponent:IsShopOpen() then self._mapNode.SoldierShopComponent:SetSellMode(true, nPrice) end end function SoldierSandtableCtrl:OnEvent_SoldierSandtableOtherCharItemDragEnd(chessData, nPointerInsId) local targetInsType, targetChessData = self:GetDragInsData(nPointerInsId) if targetInsType == DragInsType.Sell then self.levelData:SendShopSell(chessData, function(callbackData) local tbStep = {} for k, v in ipairs(callbackData.tbChessChangeStep) do if 1 < k then table.insert(tbStep, v) end end self._mapNode.blockInput:SetActive(true) self:PlayStepsAnimation(tbStep, function() self:InitOtherChessList() self:InitChessList() self._mapNode.blockInput:SetActive(false) end) end) else self:RefreshChessList() end if self.sellTimer ~= nil then self.sellTimer:_Stop() end self._mapNode.SellAnimation:Play("sellbtn_out") self._mapNode.SoldierShopComponent:SetSellMode(false) self.sellTimer = self:AddTimer(1, 0.4, function() self._mapNode.SaleContainer:SetActive(false) end, true, true, true) end function SoldierSandtableCtrl:OnEvent_SoldierCharItemChange(tbChessChangeStep, tr) if tbChessChangeStep == nil or #tbChessChangeStep == 0 then return end local tbFx = {} local tempData = tbChessChangeStep[1].tbObtain[1] local chessData = { nId = tempData.nId, nStar = tempData.nStar, nUid = tempData.nUid, nPositionType = tempData.nTargetType, nIndex = tempData.nIndex } local cfg = ConfigTable.GetData("SoldierCharacter", tempData.nId) local ctrl = self:GetCharCtrlByChessData(chessData, true) local to if ctrl == nil then to = self._mapNode.OtherCharLsit else to = ctrl.gameObject.transform end tbFx[cfg.Rarity] = {} table.insert(tbFx[cfg.Rarity], {from = tr, to = to}) self.bInShopAnim = true local nStepLength = #tbChessChangeStep if 1 < nStepLength then self._mapNode.blockInput:SetActive(true) end self._mapNode.fxFlyRoot:PlayFx(tbFx, function() self:PlayStepsAnimation(tbChessChangeStep, function() if 1 < nStepLength then self._mapNode.blockInput:SetActive(false) end self:InitChessCount() self:InitPartnerList() self:RefreshGoState() self.bInShopAnim = false end) end) end function SoldierSandtableCtrl:OnEvent_SoldierBuffCardChange() self._mapNode.BuffContainer:RefreshBuff() end function SoldierSandtableCtrl:OnEvent_SoldierNodeChange() self:RefreshLimitAction() NovaAPI.SetTMPText(self._mapNode.TextReputation, tostring(self.levelData:GetHp())) self:InitNodeList() self._mapNode.BuffContainer:RefreshBuff() self:InitExperience() self:InitCoin() self:InitFightIcon() self:InitSellList() end function SoldierSandtableCtrl:OnEvent_EnterCardSelect() self:RefreshLimitAction() end function SoldierSandtableCtrl:OnEvent_EnterEventSelect() self:RefreshLimitAction() end function SoldierSandtableCtrl:OnEvent_EnterStandTable() self:RefreshBossSkill() self:OpenShop(false) local bSuppressEnterAnim = self.levelData.bSuppressEnterAnim self.levelData.bSuppressEnterAnim = false local callback = function() local tbPendingReward = self.levelData:GetPendingReward() for k, v in ipairs(tbPendingReward) do if v.data ~= nil then local animaData = { nType = animQueueType.NodeReward, rewardData = v } table.insert(self.AnimQueue, animaData) end end if not bSuppressEnterAnim then local enterSandtableData = { nType = animQueueType.EnterSandtable } table.insert(self.AnimQueue, enterSandtableData) if not self.levelData:IsFirstStageFirstNode() then local openShop = { nType = animQueueType.OpenShop } table.insert(self.AnimQueue, openShop) end if not PlayerData.Guide:CheckGuideFinishById(505) then EventManager.Hit("Guide_PassiveCheck_Msg", "Guide_Solider_505") end if not PlayerData.Guide:CheckGuideFinishById(504) then EventManager.Hit("Guide_PassiveCheck_Msg", "Guide_Solider_504") end end self:CheckAnimQueue() end self:PlaySceneTimeline(callback) end function SoldierSandtableCtrl:OnEvent_SoldierSandtableSceneReady() if not self.levelData:CheckSandTableDisable() then return end self:ShowSandtable(true) self:PlaySceneTimeline() end function SoldierSandtableCtrl:OnEvent_ShowSoldierPositionEffect(nPositionIndex) self._mapNode.SoldierPosEffectTips:ShowTips(nPositionIndex) end function SoldierSandtableCtrl:OnEvent_SoldierSandtableFirstInChessListRefresh() self:InitChessListIns() self:InitChessList() end function SoldierSandtableCtrl:OnEvent_SoldierSandtableRefreshStep(tbSteps) if tbSteps == nil then return end local tbStep = {} for k, v in ipairs(tbSteps) do table.insert(tbStep, v) end self:PlayStepsAnimation(tbStep, function() self:InitOtherChessList() self:InitChessList() end) end function SoldierSandtableCtrl:OnEvent_PurchaseExpPrice() local shopData = self.levelData:GetShopData() if shopData ~= nil then NovaAPI.SetTMPText(self._mapNode.TextCostNum, shopData.nPurchaseExpPrice) else local nCurLevel = self.levelData:GetShopLevel() local tbCost = ConfigTable.GetConfigArray("SoldierBuyExp", nCurLevel) NovaAPI.SetTMPText(self._mapNode.TextCostNum, tbCost[1]) end end function SoldierSandtableCtrl:OnEvent_SoldierGMRefresh(tbStepChange) self._mapNode.blockInput:SetActive(true) self:PlayStepsAnimation(tbStepChange, function() self:InitOtherChessList() self:InitChessList() self:InitChessCount() self:InitPartnerList() self:RefreshGoState() self._mapNode.blockInput:SetActive(false) end) end function SoldierSandtableCtrl:PrintChessList() for k, v in ipairs(self._panel.MainChessList) do print("[Soldier]", "MainChessList:", "Id:", v.nId, "star:", v.nStar, "index:", v.nIndex, v.nPositionType) end for k, v in ipairs(self._panel.SupportChessList) do print("[Soldier]", "SupportChessList:", "Id:", v.nId, "star:", v.nStar, "index:", v.nIndex, v.nPositionType) end for k, v in ipairs(self._panel.WaitingChessList) do print("[Soldier]", "WaitingChessList:", "Id", v.nId, "star:", v.nStar, "index:", v.nIndex, v.nPositionType) end for k, v in ipairs(self._panel.OtherChessList) do print("[Soldier]", "OtherChessList:", "Id:", v.nId, "star:", v.nStar) end end function SoldierSandtableCtrl:OnEvent_CloseDic(panelId) if panelId == PanelId.DictionaryEntry and not PlayerData.Guide:CheckGuideFinishById(505) then EventManager.Hit("Guide_PassiveCheck_Msg", "Guide_Solider_505") end end return SoldierSandtableCtrl