local SoldierSandtableCtrl = class("SoldierSandtableCtrl", BaseCtrl) local SoldierAttrData = require("GameCore.Data.DataClass.Soldier.SoldierAttrData") 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 } SoldierSandtableCtrl._mapNodeConfig = { 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" }, 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 = { sComponentName = "TMP_Text", sLanguageId = "Soldier_Sandtable_TextLvTitle" }, TextLv = {sComponentName = "TMP_Text"}, imgBuyExpCostIcon = {}, TextCostNum = {sComponentName = "TMP_Text"}, TextExpNum = {sComponentName = "TMP_Text"}, BarContainer = { sComponentName = "RectTransform" }, txtExpTitle = {sComponentName = "TMP_Text"}, btnShop = { sComponentName = "UIButton", callback = "OnBtnClick_Shop" }, 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" }, goNodeMatch = {sComponentName = "Canvas"}, fxFlyRootCanvas = {sNodeName = "fxFlyRoot", sComponentName = "Canvas"}, blockInput = {} } 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", ShowSoldierPositionEffect = "OnEvent_ShowSoldierPositionEffect", SoldierSandtableRefreshStep = "OnEvent_SoldierSandtableRefreshStep", RefreshPurchaseExpPrice = "OnEvent_PurchaseExpPrice", SoldierGMRefresh = "OnEvent_SoldierGMRefresh" } SoldierSandtableCtrl._mapRedDotConfig = {} function SoldierSandtableCtrl:Awake() 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, 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, 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: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.SoldierShopComponent:HideShopPanel() self._mapNode.SoldierPosEffectTips:HideTips() self:RefreshGoState() NovaAPI.SetCanvasSortingOrder(self._mapNode.goNodeMatch, self._nSortingOrder + 2) NovaAPI.SetCanvasSortingOrder(self._mapNode.fxFlyRootCanvas, self._nSortingOrder + 2) self._mapNode.blockInput:SetActive(false) self._mapNode.fxFlyRoot:InitFx() self.bInShopAnim = false CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_ingame_transition") 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.nCacheShopLevel = nCurLevel self.nCacheExp = self.levelData:GetExp() NovaAPI.SetTMPText(self._mapNode.TextLv, tostring(nCurLevel)) self._mapNode.imgBuyExpCostIcon.gameObject:SetActive(nCurLevel < nMaxLevel) self._mapNode.TextCostNum.gameObject:SetActive(nCurLevel < nMaxLevel) if nCurLevel == nMaxLevel then self._mapNode.BarContainer.sizeDelta = Vector2(nMaxBarWidth, self._mapNode.BarContainer.sizeDelta.y) NovaAPI.SetTMPText(self._mapNode.TextExpNum, ConfigTable.GetUIText("Soldier_Sandtable_MaxLevel")) NovaAPI.SetTMPText(self._mapNode.txtExpTitle, ConfigTable.GetUIText("Soldier_Sandtable_MaxLevel")) else local nNeedExp = ConfigTable.GetData("SoldierShopLevel", nCurLevel).Exp local nCurExp = self.levelData:GetExp() self._mapNode.BarContainer.sizeDelta = Vector2(nMaxBarWidth * (nCurExp / nNeedExp), self._mapNode.BarContainer.sizeDelta.y) NovaAPI.SetTMPText(self._mapNode.TextExpNum, tostring(nCurExp) .. "/" .. tostring(nNeedExp)) 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 tbChess = {} for k, v in ipairs(self._panel.MainChessList) do table.insert(tbChess, v) end for k, v in ipairs(self._panel.SupportChessList) do table.insert(tbChess, v) end local tbActivePartner, tbUIData = SoldierAttrData.CalcActivePartners(tbChess) 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 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, 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 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 nCurCount = nCurCount + #self._panel.OtherChessList 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 if nMaxCount > nCurCount then NovaAPI.SetImageColor(self._mapNode.ImageAddCharCount, Color(0.23921568627450981, 0.29411764705882354, 0.3607843137254902, 1)) NovaAPI.SetTMPText(self._mapNode.TextAddCharCount, string.format("%d/%d", nCurCount, nMaxCount)) NovaAPI.SetTMPText(self._mapNode.TextAddCharCountShow, string.format("%d/%d", nCurCount, nMaxCount)) elseif nCurCount == nMaxCount then NovaAPI.SetImageColor(self._mapNode.ImageAddCharCount, Color(0.5450980392156862, 0.615686274509804, 0.6823529411764706, 1)) NovaAPI.SetTMPText(self._mapNode.TextAddCharCount, string.format("%d/%d", nCurCount, nMaxCount)) NovaAPI.SetTMPText(self._mapNode.TextAddCharCountShow, string.format("%d/%d", nCurCount, nMaxCount)) else NovaAPI.SetImageColor(self._mapNode.ImageAddCharCount, Color(0.8823529411764706, 0.3607843137254902, 0.45098039215686275, 1)) NovaAPI.SetTMPText(self._mapNode.TextAddCharCount, string.format("%d/%d", 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 self._mapNode.SaleContainer:SetActive(false) end function SoldierSandtableCtrl:RefreshSell(nCount) for i = 1, #self._mapNode.btn_Sell do local TextCost = self._mapNode.btn_Sell[i].transform:Find("TextCost"):GetComponent("TMP_Text") NovaAPI.SetTMPText(TextCost, 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 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 self:SetGoState(false) 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 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:SwapChess(dragChessData, targetChessData) local sourceList, targetList local bSourceCheck = false local bTargetCheck = false if dragChessData.nPositionType == GameEnum.SoldierPositionType.FightPosition then sourceList = self._panel.MainChessList bSourceCheck = true elseif dragChessData.nPositionType == GameEnum.SoldierPositionType.SupportPosition then sourceList = self._panel.SupportChessList bTargetCheck = true else sourceList = self._panel.WaitingChessList end if targetChessData.nPositionType == GameEnum.SoldierPositionType.FightPosition then targetList = self._panel.MainChessList bTargetCheck = true elseif targetChessData.nPositionType == GameEnum.SoldierPositionType.SupportPosition then targetList = self._panel.SupportChessList bTargetCheck = true else targetList = self._panel.WaitingChessList end local sourceIndex = table.indexof(sourceList, dragChessData) local targetIndex = table.indexof(targetList, targetChessData) if not self:CheckSwapCondition(sourceList, targetList, dragChessData, targetChessData) then return end sourceList[sourceIndex] = { nId = targetChessData.nId, nStar = targetChessData.nStar } targetList[targetIndex] = { nId = dragChessData.nId, nStar = dragChessData.nStar } if not self.levelData:SwapSoldier(dragChessData, targetChessData) then sourceList[sourceIndex] = { nId = dragChessData.nId, nStar = dragChessData.nStar } targetList[targetIndex] = { nId = targetChessData.nId, nStar = targetChessData.nStar } self:ResetPostionType() EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_SwapChess_Tips")) return end self:ResetPostionType() local sourceCharCtrl = self:GetCharCtrlByChessData(dragChessData) local targetCharCtrl = self:GetCharCtrlByChessData(targetChessData) sourceCharCtrl:SetData(sourceList[sourceIndex]) targetCharCtrl:SetData(targetList[targetIndex]) sourceCharCtrl:SetAnimator(chessAnimType.PUTIN) targetCharCtrl:SetAnimator(chessAnimType.DRAGIN) if targetList[targetIndex].nPositionType ~= nil and targetList[targetIndex].nPositionType == 3 then CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_selectCard_downChair") elseif targetList[targetIndex].nPositionType ~= nil and (targetList[targetIndex].nPositionType == GameEnum.SoldierPositionType.FightPosition or targetList[targetIndex].nPositionType == GameEnum.SoldierPositionType.SupportPosition) then CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_selectCard_prepareBattle") end self:SyncChessList() if NovaAPI.IsEditorPlatform() then self:PrintChessList() end 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:CheckSwapCondition(sourceList, targetList, dragChessData, targetChessData) if targetList == self._panel.WaitingChessList and sourceList == self._panel.WaitingChessList then return true end if targetList == self._panel.MainChessList and sourceList == self._panel.MainChessList then return true end if targetList == self._panel.SupportChessList and sourceList == self._panel.SupportChessList then return true end if targetList == self._panel.WaitingChessList then end if sourceList == self._panel.WaitingChessList and targetChessData.nId == 0 then 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 return false end end return true end function SoldierSandtableCtrl:CheckDuplicateChess() local tbChessList = {} for k, v in ipairs(self._panel.MainChessList) do if v.nId ~= 0 then if 0 < table.indexof(tbChessList, v.nId) then return true end table.insert(tbChessList, v.nId) end end for k, v in ipairs(self._panel.SupportChessList) do if v.nId ~= 0 then if 0 < table.indexof(tbChessList, v.nId) then return true end table.insert(tbChessList, v.nId) end end return false end function SoldierSandtableCtrl:SyncChessList(tbStep) local callback = function(tbStep) self._mapNode.blockInput:SetActive(true) self:PlayStepsAnimation(tbStep, function() self:InitOtherChessList() self:InitChessList() self:InitChessCount() self:InitPartnerList() self:RefreshGoState() self._mapNode.blockInput:SetActive(false) end) end self.levelData:SyncSoldierDeploy(callback) 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:CheckAnimQueue() if #self.AnimQueue == 0 then self:InitOtherChessList() return end local animaData = self.AnimQueue[1] table.remove(self.AnimQueue, 1) if animaData.nType == animQueueType.NodeReward then self:PlayNodeReward(animaData, function() self:InitChessList() 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._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") 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, 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 for i, p in ipairs(rewardData.data.tbChess) do local item = self._mapNode.reward[i] item:SetItemData(p.Id) item:SetCharLevel(p.Star) item.gameObject:SetActive(true) 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) 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) 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, nPositionType = n.nSourceType, nIndex = n.nIndex } self:AddChessData2list(chessData, true) else local chessData = { nId = 0, nStar = 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, nPositionType = n.nTargetType, nIndex = n.nIndex } self:AddChessData2list(chessData) end end local wait = function() 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, 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, 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, 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, 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, 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 coroutine.yield(CS.UnityEngine.WaitForSeconds(nAnimLength)) if #tbSteps == 0 and callback ~= nil then callback() if NovaAPI.IsEditorPlatform() then self:PrintChessList() 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:OnBtnClick_Policy() if self.bInShopAnim then return end if self:CheckLimitAction() then EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_Sandtable_TemporaryReturn_Tips")) return end 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 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(self._panel.MainChessList, self._panel.SupportChessList, self._panel.WaitingChessList, 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 actData = PlayerData.Activity:GetActivityDataByType(GameEnum.activityType.Soldier) if actData == nil then return end local nActId = actData:GetActId() local nDicId = ConfigTable.GetData("SoldierControl", nActId).DictionaryId EventManager.Hit(EventId.OpenPanel, PanelId.DictionaryEntry, nDicId, true) end function SoldierSandtableCtrl:OnBtnClick_Shop() if self:CheckLimitAction() then EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_Sandtable_TemporaryReturn_Tips")) return end 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") 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(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() CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_ingame_buyExperience") if callbackData.tbChessChangeStep ~= nil and #callbackData.tbChessChangeStep > 0 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:OnEvent_SoldierExpUpdate() local nOldChessMaxCount = self.nCacheChessMaxCount local nOldLevel = self.nCacheShopLevel local nOldExp = self.nCacheExp self:InitExperience() self:InitChessCount() local expAnimator = self._mapNode.btnExperience.transform:Find("AnimRoot"):GetComponent("Animator") if 0 < nOldLevel and nOldLevel ~= self.nCacheShopLevel then expAnimator:Play("ExperienceContainer") CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_ingame_ExperienceReward") self._mapNode.MiddleContainer:Play("LevelUpGrade") 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 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) if dragInsType == DragInsType.Chess then local nPrice = self:CalSellPrice(chessData) self:RefreshSell(nPrice) end if self.sellTimer ~= nil then self.sellTimer:_Stop() end self._mapNode.SellAnimation:Play("sellbtn_in") self._mapNode.SaleContainer:SetActive(true) 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.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 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) self:InitChessList() end if self.sellTimer ~= nil then self.sellTimer:_Stop() end self._mapNode.SellAnimation:Play("sellbtn_out") 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) 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.sellTimer = self:AddTimer(1, 0.4, function() self._mapNode.SaleContainer:SetActive(false) end, true, true, true) end function SoldierSandtableCtrl:OnEvent_SoldierCharItemChange(tbChessChangeStep, tr) local tbFx = {} local tempData = tbChessChangeStep[1].tbObtain[1] local chessData = { nId = tempData.nId, nStar = tempData.nStar, 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:InitChessList() 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() 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 local enterSandtableData = { nType = animQueueType.EnterSandtable } local openShop = { nType = animQueueType.OpenShop } table.insert(self.AnimQueue, enterSandtableData) table.insert(self.AnimQueue, openShop) self:CheckAnimQueue() 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 return SoldierSandtableCtrl