Update - 1.13.0.124

EN: 1.13.0.124
CN: 1.13.0.124
JP: 1.13.0.128
KR: 1.13.0.130
This commit is contained in:
SL1900
2026-07-21 12:30:00 +09:00
parent a12087abad
commit 8c4bd41668
1334 changed files with 873026 additions and 95164 deletions
@@ -0,0 +1,167 @@
local SkillDisplayCtrl = class("SkillDisplayCtrl", BaseCtrl)
local WwiseAudioMgr = CS.WwiseAudioManager.Instance
SkillDisplayCtrl._mapNodeConfig = {
rtDisplay = {
nCount = 2,
sCtrlName = "Game.UI.Battle.SubSkillDisplay.UltimateDisplayCtrl"
},
rtSubSkill = {
nCount = 2,
sCtrlName = "Game.UI.Battle.SubSkillDisplay.SkillDisplayCtrl"
}
}
SkillDisplayCtrl._mapEventConfig = {
SoldierSkillDisPlay = "OnEvent_CastAssistSkill",
[EventId.SubSkillDisplayInit] = "OnEvent_Init",
InputEnable = "OnEvent_InputEnable"
}
function SkillDisplayCtrl:Awake()
end
function SkillDisplayCtrl:FadeIn()
end
function SkillDisplayCtrl:FadeOut()
end
function SkillDisplayCtrl:OnEnable()
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
NovaAPI.ForceUpdateCanvases()
end
cs_coroutine.start(wait)
end
function SkillDisplayCtrl:OnDisable()
for _, mapData in pairs(self.mapChar) do
Actor2DManager.UnsetActor2D(false, mapData.Idx, true)
end
end
function SkillDisplayCtrl:OnDestroy()
end
function SkillDisplayCtrl:OnRelease()
end
function SkillDisplayCtrl:OnEvent_Init(tbTeam)
self.mapChar = {}
if #tbTeam < 3 then
printWarn("人数小于3")
return
end
for i = 2, 3 do
local charTid = tbTeam[i]
if charTid ~= nil and charTid ~= 0 then
local nSkillId = ConfigTable.GetData_Character(charTid).AssistSkillId
self.mapChar[charTid] = {
Idx = i,
nSkillId = nSkillId,
bPlaying = false,
rtIdx = i - 1,
nSkillShowIdx = 0
}
end
self._mapNode.rtDisplay[i - 1]:InitL2dRes(charTid, i)
end
end
function SkillDisplayCtrl:OnEvent_CastAssistSkill(nCharId)
if self.mapChar[nCharId] ~= nil then
local nSkillId = self.mapChar[nCharId].nSkillId
local checkType = self:CheckPlayType(nCharId)
if checkType == 0 then
return
elseif checkType == 1 then
self:UltimateDisplay(nCharId)
elseif checkType == 2 then
self:SkillDisplay(nCharId, nSkillId)
end
end
end
function SkillDisplayCtrl:OnEvent_InputEnable(bEnable)
if not bEnable then
self:InterrputAllDisplay()
end
end
function SkillDisplayCtrl:InterrputAllDisplay()
self._mapNode.rtDisplay[1]:InterrputAnim()
self._mapNode.rtDisplay[2]:InterrputAnim()
self._mapNode.rtSubSkill[1]:InterrputAnim()
self._mapNode.rtSubSkill[2]:InterrputAnim()
for _, mapSkill in pairs(self.mapChar) do
mapSkill.bPlaying = false
mapSkill.nSkillShowIdx = 0
end
end
function SkillDisplayCtrl:SkillDisplay(nCharId, nSkillId)
local mapData = self.mapChar[nCharId]
if mapData == nil then
return
end
local Callback = function()
mapData.nSkillShowIdx = 0
end
if mapData.nSkillShowIdx == 0 then
for nIdx, skillCtrl in ipairs(self._mapNode.rtSubSkill) do
if not skillCtrl.bPlaying then
skillCtrl:ShowSkillTips(nSkillId, nCharId, Callback)
mapData.nSkillShowIdx = nIdx
return
end
end
printError("没有槽位播放技能展示")
else
self._mapNode.rtSubSkill[mapData.nSkillShowIdx]:ShowSkillTips(nSkillId, nCharId, Callback)
WwiseAudioMgr:PostEvent("ui_tip_feadback")
end
end
function SkillDisplayCtrl:UltimateDisplay(nCharId)
local mapData = self.mapChar[nCharId]
if mapData == nil then
return
end
local Callback = function()
mapData.bPlaying = false
end
if mapData.bPlaying then
self._mapNode.rtDisplay[mapData.rtIdx]:ReShowSkill(Callback, mapData.Idx)
else
self._mapNode.rtDisplay[mapData.rtIdx]:ShowSkill(nCharId, mapData.Idx, Callback)
mapData.bPlaying = true
end
self._mapNode.rtDisplay[mapData.rtIdx % 2 + 1]:Set2SecondSkill()
end
function SkillDisplayCtrl:CheckPlayType(nCharId)
local bForce = self:CheckForcePlay()
local nType = LocalSettingData.GetLocalSettingData("AnimationSub")
if bForce then
nType = 2
end
if nType == 3 then
return 2
elseif nType == 2 then
if self.mapCharShow[nCharId] == nil then
self.mapCharShow[nCharId] = true
self:SetLocalData()
end
return 1
elseif nType == 1 then
if self.mapCharShow[nCharId] == nil then
self.mapCharShow[nCharId] = true
self:SetLocalData()
return 1
else
return 2
end
end
end
function SkillDisplayCtrl:SetLocalData()
local jsonData = {}
for nCharId, _ in pairs(self.mapCharShow) do
table.insert(jsonData, nCharId)
end
local sJson = RapidJson.encode(jsonData)
LocalData.SetPlayerLocalData("SkillShowCount", sJson)
return 1
end
function SkillDisplayCtrl:CheckForcePlay()
local tbDynamic = {
[GameEnum.dynamicLevelType.Trial] = true
}
local tbBattle = {}
return tbDynamic[self._panel.DynamicType] or tbBattle[self._panel.BattleType]
end
return SkillDisplayCtrl
@@ -0,0 +1,49 @@
local SoldierBattlePanel = class("SoldierBattlePanel", BasePanel)
local GamepadUIManager = require("GameCore.Module.GamepadUIManager")
SoldierBattlePanel.OpenMinMap = true
SoldierBattlePanel._bAddToBackHistory = false
SoldierBattlePanel._tbDefine = {
{
sPrefabPath = "Soldier/Battle/SoldierRoomInfo.prefab",
sCtrlName = "Game.UI.Soldier.Battle.SoldierRoomInfoCtrl"
},
{
sPrefabPath = "Battle/AdventureMainUI/BattlePopupTips.prefab",
sCtrlName = "Game.UI.Battle.BattlePopupTipsCtrl"
},
{
sPrefabPath = "Soldier/Battle/SoldierPausePanel.prefab",
sCtrlName = "Game.UI.Soldier.Battle.SoldierPauseCtrl"
},
{
sPrefabPath = "Soldier/Battle/SoldierSubSkillDisplay.prefab",
sCtrlName = "Game.UI.Soldier.Battle.SoldierSkillDisplayCtrl"
}
}
function SoldierBattlePanel:Awake()
self.BattleType = GameEnum.worldLevelType.Dynamic
self.DynamicType = GameEnum.dynamicLevelType.SoldierChess
self.trUIRoot = GameObject.Find("---- UI ----").transform
GamepadUIManager.EnterAdventure()
GamepadUIManager.EnableGamepadUI("BattleMenu", {}, nil, true)
self.tbChess = self._tbParam[1]
self.tbPartner = self._tbParam[2]
self.nTotalTime = self._tbParam[3]
end
function SoldierBattlePanel:OnEnable()
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
EventManager.Hit(EventId.OpenPanel, PanelId.Hud, false, false)
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
end
cs_coroutine.start(wait)
EventManager.Hit("RefreshSoldierChessList", self.tbChess)
end
function SoldierBattlePanel:OnAfterEnter()
EventManager.Hit(EventId.SubSkillDisplayInit, self._tbParam[1])
end
function SoldierBattlePanel:OnDisable()
GamepadUIManager.DisableGamepadUI("BattleMenu")
GamepadUIManager.QuitAdventure()
end
return SoldierBattlePanel
@@ -0,0 +1,451 @@
local SoldierBattleResultCtrl = class("SoldierBattleResultCtrl", BaseCtrl)
SoldierBattleResultCtrl._mapNodeConfig = {
goRoot = {
sNodeName = "----SafeAreaRoot----"
},
Bg = {},
BgFail = {},
goNodeSuccess = {},
goNodeFail = {},
goNodeExpansion = {},
goNodeExpansionFail = {},
goBattleReputation = {},
imgNumBarReputation = {sComponentName = "Image"},
txtNumPrestige = {sComponentName = "TMP_Text"},
txtNumPrestigeAdd = {sComponentName = "TMP_Text"},
goBattleRound = {},
BarContainer = {
sComponentName = "RectTransform"
},
txt_NodeIndex = {sComponentName = "TMP_Text"},
Partner = {nCount = 2},
txt_PartnerBattle = {
sComponentName = "TMP_Text",
sLanguageId = "SoldierNodeType_Event"
},
txt_PartnerWinning = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Result_WinningTitle"
},
txt_PartnerWinningNum = {sComponentName = "TMP_Text"},
imgNumBar = {sComponentName = "Image"},
txtNumRoundPrestige = {sComponentName = "TMP_Text"},
txtNumRoundTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Result_Prestige"
},
txtLevel = {sComponentName = "TMP_Text"},
txtExp = {sComponentName = "TMP_Text"},
txtNumLvTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Result_ExperienceTitle"
},
txtDataStatisticsTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Result_StatisticsTitle"
},
txtNumCoinsTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Result_CoinsTitle"
},
txtCoinsTotalCount = {sComponentName = "TMP_Text"},
coinItem = {sComponentName = "Transform"},
CoinListRoot = {sComponentName = "Transform"},
gosoldierItemRoot = {sComponentName = "Transform"},
soldierDamageItem = {sComponentName = "Transform"},
goBattleExpansion = {},
NumLayout = {sComponentName = "Transform"},
NumRootItem = {sComponentName = "Transform"},
txtIntegralTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Result_Imntergral"
},
txtAwardTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Result_AwardTitle"
},
txtScoreTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Result_ScoreTitle"
},
txtIntegralNum = {sComponentName = "TMP_Text"},
btnConfirm = {
sComponentName = "UIButton",
callback = "OnBtnClick_Confirm"
},
txtBtnConfirm = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Level_Select_Continue"
},
btnSettlement = {
sComponentName = "UIButton",
callback = "OnBtnClick_Result"
},
txtBtnSettlement = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Level_Select_GoResult"
},
Mask = {
sComponentName = "CanvasGroup"
}
}
SoldierBattleResultCtrl._mapEventConfig = {
SoldierChallengeEnd = "OnEvent_SoldierChallengeEnd"
}
SoldierBattleResultCtrl._mapRedDotConfig = {}
local CSColor = Color(1.0, 0.8392156862745098, 0.5333333333333333, 1)
local CFColor = Color(0.9137254901960784, 0.9294117647058824, 0.9490196078431372, 1)
local _NS = AllEnum.SoldierResultType.NodeSuccess
local _NF = AllEnum.SoldierResultType.NodeFail
local _CS = AllEnum.SoldierResultType.ChallengeSuccess
local _CF = AllEnum.SoldierResultType.ChallengeFail
function SoldierBattleResultCtrl:RefreshResult()
self._mapNode.BgFail.gameObject:SetActive(self.nResultType == _NF or self.nResultType == _CF)
self._mapNode.Bg.gameObject:SetActive(self.nResultType == _NS or self.nResultType == _CS)
self._mapNode.goNodeSuccess.gameObject:SetActive(self.nResultType == _NS)
self._mapNode.goNodeFail.gameObject:SetActive(self.nResultType == _NF)
self._mapNode.goNodeExpansion.gameObject:SetActive(self.nResultType == _CS)
self._mapNode.goNodeExpansionFail.gameObject:SetActive(self.nResultType == _CF)
self.levelData = PlayerData.SoldierData:GetCurLevelData()
if self.nResultType == _NS or self.nResultType == _NF then
self:SetGoBattleReputationMsg()
self:SetGoBattleRoundMsg()
self._mapNode.goBattleReputation:SetActive(true)
self._mapNode.goBattleRound:SetActive(true)
self._mapNode.goBattleExpansion:SetActive(false)
if self.levelData:GetHp() > 0 then
self._mapNode.btnConfirm.gameObject:SetActive(true)
self._mapNode.btnSettlement.gameObject:SetActive(false)
else
self._mapNode.btnConfirm.gameObject:SetActive(false)
self._mapNode.btnSettlement.gameObject:SetActive(true)
end
elseif self.nResultType == _CS or self.nResultType == _CF then
self.challengeColor = self.nResultType == _CS and CSColor or CFColor
self:SetGoBattleExpansionMsg()
self._mapNode.goBattleReputation:SetActive(false)
self._mapNode.goBattleRound:SetActive(false)
self._mapNode.goBattleExpansion:SetActive(true)
self._mapNode.btnConfirm.gameObject:SetActive(true)
self._mapNode.btnSettlement.gameObject:SetActive(false)
end
self:AddTimer(1, 0.1, function()
if self.nResultType == _NS then
self.nAnimator:Play("SoldierResult_successfulchallenge01")
elseif self.nResultType == _NF then
self.nAnimator:Play("SoldierResult_failchallenge01")
elseif self.nResultType == _CS then
self.nAnimator:Play("SoldierResult_successfulexpansion02")
elseif self.nResultType == _CF then
self.nAnimator:Play("SoldierResult_failexpansion02")
end
end, true, true, true)
end
function SoldierBattleResultCtrl:ClosePanel()
CS.AdventureModuleHelper.ResumeLogic()
if NovaAPI.GetCurrentModuleName() == "MainMenuModuleScene" then
EventManager.Hit(EventId.CloesCurPanel)
PlayerData.Base:OnBackToMainMenuModule()
else
NovaAPI.SetCanvasGroupAlpha(self._mapNode.Mask, 0)
self._mapNode.Mask.gameObject:SetActive(true)
EventManager.Hit(EventId.TemporaryBlockInput, 0.5)
local sequence = DOTween.Sequence()
sequence:Append(self._mapNode.Mask:DOFade(1, 0.5):SetUpdate(true))
sequence:AppendCallback(function()
local function levelEndCallback()
EventManager.Remove("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, levelEndCallback)
NovaAPI.EnterModule("MainMenuModuleScene", true, 17)
end
EventManager.Add("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, levelEndCallback)
CS.AdventureModuleHelper.LevelStateChanged(true, 0, true)
end)
sequence:SetUpdate(true)
end
end
function SoldierBattleResultCtrl:Awake()
end
function SoldierBattleResultCtrl:OnEnable()
self.mapNextData = nil
CS.AdventureModuleHelper.PauseLogic()
self.nAnimator = self.gameObject:GetComponent("Animator")
local tbParam = self:GetPanelParam()
if type(tbParam) == "table" then
self.nResultType = tbParam[1]
self.mapData = tbParam[2]
self.callback = tbParam[3]
self:RefreshResult()
end
end
function SoldierBattleResultCtrl:OnDisable()
if self.callback ~= nil then
self.callback()
end
end
function SoldierBattleResultCtrl:OnDestroy()
if self.tbSoldierGridCtrl ~= nil then
for nInstanceId, objCtrl in pairs(self.tbSoldierGridCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbSoldierGridCtrl[nInstanceId] = nil
end
self.tbSoldierGridCtrl = {}
end
if self.ReputationTweener ~= nil then
self.ReputationTweener:Kill()
self.ReputationTweener = nil
end
if self.tbScoreDigitTweeners ~= nil then
for _, tw in ipairs(self.tbScoreDigitTweeners) do
if tw ~= nil then
tw:Kill()
end
end
self.tbScoreDigitTweeners = nil
end
end
function SoldierBattleResultCtrl:OnBtnClick_Confirm()
if self.mapNextData ~= nil then
self.nResultType = self.mapNextData.nType
self.mapData = self.mapNextData.mapData
self.callback = self.mapNextData.callback
self:RefreshResult()
self.mapNextData = nil
else
self:ClosePanel()
end
end
function SoldierBattleResultCtrl:OnBtnClick_Result()
self:ClosePanel()
end
function SoldierBattleResultCtrl:OnEvent_SoldierChallengeEnd(nType, mapData, callback)
self.mapNextData = {
nType = nType,
mapData = mapData,
callback = callback
}
end
function SoldierBattleResultCtrl:SetGoBattleReputationMsg()
NovaAPI.SetTMPText(self._mapNode.txtNumPrestige, self.levelData:GetHp())
if self.mapData.tbChange.nHpChange >= 0 then
NovaAPI.SetTMPText(self._mapNode.txtNumPrestigeAdd, ConfigTable.GetUIText("Soldier_Result_Prestige") .. " +" .. self.mapData.tbChange.nHpChange)
else
NovaAPI.SetTMPText(self._mapNode.txtNumPrestigeAdd, ConfigTable.GetUIText("Soldier_Result_Prestige") .. " " .. self.mapData.tbChange.nHpChange)
end
CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_result_reputationUp")
local imgBar = self._mapNode.imgNumBarReputation
local nHpEnd = self.levelData:GetHp()
local nFullHp = 100
imgBar.fillAmount = 0
self:AddTimer(1, 1, function()
local nTarget = nHpEnd / nFullHp
if nTarget < 0 then
nTarget = 0
end
if 1 < nTarget then
nTarget = 1
end
self.reputationBarTweener = DOTween.To(function()
return imgBar.fillAmount
end, function(value)
imgBar.fillAmount = value
end, nTarget, 0.5):SetUpdate(true)
end, true, true, true)
end
function SoldierBattleResultCtrl:GetCurChallengeState()
if PlayerData.SoldierData.curChallengeData == nil then
return 0, 0
end
if PlayerData.SoldierData.curChallengeData.nGradeChallengeId == 0 then
return 0, 0
end
local curChallengeCfg = ConfigTable.GetData("SoldierGradeChallenge", PlayerData.SoldierData.curChallengeData.nGradeChallengeId)
if not curChallengeCfg then
return 0, 0
end
local tbAllNodeList = {}
local func_ForEach_SoldierNodePlan = function(mapLine)
if curChallengeCfg.NodeGroupId == mapLine.NodeGroupId then
table.insert(tbAllNodeList, mapLine)
end
end
ForEachTableLine(DataTable.SoldierNodePlan, func_ForEach_SoldierNodePlan)
table.sort(tbAllNodeList, function(a, b)
return a.Index < b.Index
end)
local mapCfg = ConfigTable.GetData("SoldierNodePlan", self.mapData.tbChange.tbNodeChange.nLastNodeId)
local nNodexIndex = mapCfg.Index
local nStage = self.mapData.tbChange.tbNodeChange.nLastStageId
for i = 1, #tbAllNodeList do
local nodeCfg = tbAllNodeList[i]
if nStage > nodeCfg.Stage then
nNodexIndex = nNodexIndex - 1
end
end
return nStage, nNodexIndex
end
function SoldierBattleResultCtrl:SetGoBattleRoundMsg()
local nStage, nNodexIndex = self:GetCurChallengeState()
NovaAPI.SetTMPText(self._mapNode.txt_NodeIndex, nStage .. "-" .. nNodexIndex)
if self.mapData.bEventBattle then
NovaAPI.SetTMPText(self._mapNode.txt_PartnerBattle, ConfigTable.GetUIText("SoldierNodeType_Event"))
self._mapNode.Partner[2]:SetActive(false)
else
local nWiningStreak, nLosingStreak = self.levelData:GetStreakCount()
if 0 < nWiningStreak then
NovaAPI.SetTMPText(self._mapNode.txt_PartnerWinning, ConfigTable.GetUIText("Soldier_Result_WinningTitle"))
NovaAPI.SetTMPText(self._mapNode.txt_PartnerWinningNum, "x" .. nWiningStreak)
elseif 0 < nLosingStreak then
NovaAPI.SetTMPText(self._mapNode.txt_PartnerWinning, ConfigTable.GetUIText("Soldier_Result_LosingingTitle"))
NovaAPI.SetTMPText(self._mapNode.txt_PartnerWinningNum, "x" .. nLosingStreak)
end
NovaAPI.SetTMPText(self._mapNode.txt_PartnerBattle, ConfigTable.GetUIText("SoldierNodeType_Battle"))
self._mapNode.Partner[2]:SetActive(true)
end
local nCurLevel, nMaxLevel = self.levelData:GetShopLevel()
NovaAPI.SetTMPText(self._mapNode.txtNumRoundPrestige, self.levelData:GetHp())
self._mapNode.imgNumBar.fillAmount = self.levelData:GetHp() / 100
NovaAPI.SetTMPText(self._mapNode.txtLevel, "<size=20>LV</size>" .. tostring(nCurLevel))
if nCurLevel == nMaxLevel then
self._mapNode.BarContainer.sizeDelta = Vector2(134, 28)
NovaAPI.SetTMPText(self._mapNode.txtExp, ConfigTable.GetUIText("Soldier_Sandtable_MaxLevel"))
else
local nNeedExp = ConfigTable.GetData("SoldierShopLevel", nCurLevel).Exp
local nCurExp = self.levelData:GetExp()
self._mapNode.BarContainer.sizeDelta = Vector2(134 * (nCurExp / nNeedExp), 28)
NovaAPI.SetTMPText(self._mapNode.txtExp, tostring(nCurExp) .. "/" .. tostring(nNeedExp))
end
self._mapNode.coinItem.gameObject:SetActive(false)
local totalC = self.mapData.tbCoinReward.base + self.mapData.tbCoinReward.interest + self.mapData.tbCoinReward.winningStreak + self.mapData.tbCoinReward.losingStreak + self.mapData.tbCoinReward.other
NovaAPI.SetTMPText(self._mapNode.txtCoinsTotalCount, totalC)
self:SetRewardItem(self.mapData.tbCoinReward.base, "Soldier_GoldTips_BasicReward")
self:SetRewardItem(self.mapData.tbCoinReward.interest, "Soldier_GoldTips_Interest")
self:SetRewardItem(self.mapData.tbCoinReward.winningStreak, "Soldier_GoldTips_Winningstreak")
self:SetRewardItem(self.mapData.tbCoinReward.losingStreak, "Soldier_GoldTips_Losingingstreak")
self:SetRewardItem(self.mapData.tbCoinReward.other, "Soldier_GoldTips_Other")
local maxDamage = 0
self.tbSoldierGridCtrl = {}
local tbSortedDamage = {}
for i, v in pairs(self.mapData.tbDamage) do
if maxDamage < v.nDamage then
maxDamage = v.nDamage
end
table.insert(tbSortedDamage, {id = i, data = v})
end
table.sort(tbSortedDamage, function(a, b)
return a.data.nDamage > b.data.nDamage
end)
self._mapNode.soldierDamageItem.gameObject:SetActive(false)
for _, item in ipairs(tbSortedDamage) do
self:SetSoldierDamageItem(item.id, item.data, maxDamage)
end
end
function SoldierBattleResultCtrl:SetRewardItem(count, languageId)
if count == nil or count == 0 then
return
end
local goR = instantiate(self._mapNode.coinItem, self._mapNode.CoinListRoot)
goR.gameObject:SetActive(true)
local txt_name = goR:Find("txt_name"):GetComponent("TMP_Text")
local txRefreshCount = goR:Find("txRefreshCount"):GetComponent("TMP_Text")
NovaAPI.SetTMPText(txt_name, ConfigTable.GetUIText(languageId))
NovaAPI.SetTMPText(txRefreshCount, count)
end
function SoldierBattleResultCtrl:SetSoldierDamageItem(id, damageData, maxDamage)
local goR = instantiate(self._mapNode.soldierDamageItem, self._mapNode.gosoldierItemRoot)
goR.gameObject:SetActive(true)
local imgNumLine = goR:Find("imgNumLine"):GetComponent("RectTransform")
local txDamageCount = goR:Find("imgNumLine/goNumLayout/txDamageCount"):GetComponent("TMP_Text")
local objSoldier = goR:Find("tc_char_small").gameObject
local cData = ConfigTable.GetData("SoldierCharacter", id)
local cSkin = ConfigTable.GetData("SoldierSkin", id)
local ctrl = self:BindCtrlByNode(objSoldier, "Game.UI.Soldier.Template.SoldierCharGridCtrl")
ctrl:SetItem(cData.Rarity, 0, cSkin.Icon .. AllEnum.SoldierChessIconSurfix.S, damageData.nStar)
self.tbSoldierGridCtrl[id] = ctrl
local ratio = 0
if maxDamage and 0 < maxDamage then
ratio = damageData.nDamage / maxDamage
end
imgNumLine.sizeDelta = Vector2(20, 76 * ratio)
NovaAPI.SetTMPText(txDamageCount, damageData.nDamage)
end
function SoldierBattleResultCtrl:SetGoBattleExpansionMsg()
local totalScore = self.mapData.nTotalScore
if totalScore ~= nil and 0 < totalScore then
CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_result_countPoint")
end
self:RefreshScoreDigits(totalScore)
NovaAPI.SetTMPText(self._mapNode.txtIntegralNum, self.mapData.nRewardScore)
end
function SoldierBattleResultCtrl:RefreshScoreDigits(nTotalScore)
local trLayout = self._mapNode.NumLayout
local goTemplate = self._mapNode.NumRootItem
if trLayout == nil or goTemplate == nil then
return
end
goTemplate.gameObject:SetActive(false)
if self.tbScoreDigitTweeners ~= nil then
for _, tw in ipairs(self.tbScoreDigitTweeners) do
if tw ~= nil then
tw:Kill()
end
end
end
self.tbScoreDigitTweeners = {}
local sScore = tostring(math.max(0, math.floor(nTotalScore or 0)))
local nLen = #sScore
local fBaseDur = 0.6
local fStepDur = 0.15
local fAnimStepDelay = 0.08
local nLoops = 3
for i = 1, nLen do
local nDigit = tonumber(string.sub(sScore, i, i)) or 0
local goItem = instantiate(goTemplate, trLayout)
local animator = goItem:GetComponent("Animator")
if animator ~= nil then
local fDelay = fAnimStepDelay * (nLen - i)
if fDelay <= 0 then
goItem.gameObject:SetActive(true)
animator:Play("NumPos")
else
local delayedCall = CS.DG.Tweening.DOVirtual.DelayedCall(fDelay, function()
if animator ~= nil then
goItem.gameObject:SetActive(true)
animator:Play("NumPos")
end
end, false)
delayedCall:SetUpdate(true)
table.insert(self.tbScoreDigitTweeners, delayedCall)
end
end
local txt = goItem:Find("txtNum"):GetComponent("TMP_Text")
if txt ~= nil then
NovaAPI.SetTMPColor(txt, self.challengeColor)
NovaAPI.SetTMPText(txt, "0")
local fEnd = nLoops * 10 + nDigit
local fDur = fBaseDur + fStepDur * (nLen - i)
local fCurValue = 0
local nLastShown = -1
local tweener = DOTween.To(function()
return fCurValue
end, function(value)
fCurValue = value
local nShown = math.floor(value) % 10
if nShown ~= nLastShown then
nLastShown = nShown
NovaAPI.SetTMPText(txt, tostring(nShown))
end
end, fEnd, fDur):SetEase(CS.DG.Tweening.Ease.OutCubic):SetUpdate(true)
tweener:OnComplete(function()
NovaAPI.SetTMPText(txt, tostring(nDigit))
end)
table.insert(self.tbScoreDigitTweeners, tweener)
end
if i == 1 then
do
local objLine = goItem:Find("imgLine").gameObject
objLine:SetActive(false)
end
end
end
end
return SoldierBattleResultCtrl
@@ -0,0 +1,16 @@
local SoldierBattleResultPanel = class("SoldierBattleResultPanel", BasePanel)
SoldierBattleResultPanel._tbDefine = {
{
sPrefabPath = "Soldier/Battle/SoldierResult.prefab",
sCtrlName = "Game.UI.Soldier.Battle.SoldierBattleResultCtrl"
}
}
function SoldierBattleResultPanel:Awake()
end
function SoldierBattleResultPanel:OnEnable()
end
function SoldierBattleResultPanel:OnDisable()
end
function SoldierBattleResultPanel:OnDestroy()
end
return SoldierBattleResultPanel
@@ -0,0 +1,176 @@
local SoldierMainCharItemCtrl = class("SoldierMainCharItemCtrl", BaseCtrl)
local ImgChessRarityColor = {
[GameEnum.ChessRarity.Gold] = "#FFF0BB",
[GameEnum.ChessRarity.Purple] = "#C099FF",
[GameEnum.ChessRarity.Blue] = "#8BF3FF",
[GameEnum.ChessRarity.Green] = "#A1FF8D",
[GameEnum.ChessRarity.White] = "#DBDBDB"
}
SoldierMainCharItemCtrl._mapNodeConfig = {
imgSkillStart = {sComponentName = "Image"},
AnimRoot = {sComponentName = "Animator"},
SkillCharge = {
sComponentName = "RectTransform"
},
btnItem = {
sComponentName = "UIButton",
callback = "OnBtnClick_Item"
},
imgRarity = {sComponentName = "Image"},
imgIcon = {sComponentName = "Image"},
imgStar = {nCount = 5, sComponentName = "Image"},
imgDeathMask = {},
Fx_Charge = {},
Fx_fish = {},
Fx_Death = {}
}
SoldierMainCharItemCtrl._mapEventConfig = {
SoldierCharSpawn = "OnEvent_SoldierCharSpawn"
}
SoldierMainCharItemCtrl._mapRedDotConfig = {}
local iconPath = "Icon/SoldierOtherIcon/"
local nMaxSize = 0
function SoldierMainCharItemCtrl:AddEntityEvent()
EventManager.AddEntityEvent("Soldier_EnergyChange", self.nCharId, self, self.OnEvent_EnergyChange)
EventManager.AddEntityEvent("Event_SoldierMoYu", self.nCharId, self, self.OnEvent_MoYu)
EventManager.AddEntityEvent("Event_SoldierDeath", self.nCharId, self, self.Event_Death)
end
function SoldierMainCharItemCtrl:RemoveEntityEvent()
EventManager.RemoveEntityEvent("Soldier_EnergyChange", self.nCharId, self, self.OnEvent_EnergyChange)
EventManager.RemoveEntityEvent("Event_SoldierMoYu", self.nCharId, self, self.OnEvent_MoYu)
EventManager.RemoveEntityEvent("Event_SoldierDeath", self.nCharId, self, self.Event_Death)
end
function SoldierMainCharItemCtrl:InitChar(mapData, tbChess, tbPartner, parent)
self.isDeath = false
self.isEnergyMax = false
self._mapNode.imgSkillStart.gameObject:SetActive(false)
self.tmpMapData = mapData
self.bAddEvent = false
self.nDataId = mapData.nId
self.tbChess = tbChess
self.tbPartner = tbPartner
self.parent = parent
nMaxSize = self._mapNode.SkillCharge.sizeDelta.x
local mapCfg = ConfigTable.GetData("SoldierCharacter", self.nDataId)
if mapCfg ~= nil then
local sIcon = AllEnum.SoldierChessRarityIcon[mapCfg.Rarity]
sIcon = iconPath .. sIcon .. AllEnum.SoldierChessIconSurfix.Fight
self:SetPngSprite(self._mapNode.imgRarity, sIcon)
local skinCfg = ConfigTable.GetData("SoldierSkin", mapCfg.Skin)
if skinCfg then
self:SetPngSprite(self._mapNode.imgIcon, skinCfg.Icon .. AllEnum.SoldierChessIconSurfix.M)
end
local _, color = ColorUtility.TryParseHtmlString(ImgChessRarityColor[mapCfg.Rarity])
NovaAPI.SetImageColor(self._mapNode.imgSkillStart, color)
end
self._mapNode.SkillCharge.sizeDelta = Vector2(nMaxSize, 0)
for k, v in ipairs(self._mapNode.imgStar) do
v.gameObject:SetActive(k <= mapData.nStar)
end
end
function SoldierMainCharItemCtrl:CloseUI()
self:RemoveEntityEvent()
self.bAddEvent = false
self.nCharId = 0
end
function SoldierMainCharItemCtrl:Awake()
end
function SoldierMainCharItemCtrl:OnEnable()
end
function SoldierMainCharItemCtrl:OnDisable()
end
function SoldierMainCharItemCtrl:OnDestroy()
end
function SoldierMainCharItemCtrl:SetTipsRoot(tr)
self.tipsRoot = tr
end
function SoldierMainCharItemCtrl:OnBtnClick_Item()
if self.isDeath == true then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_Death_Tips"))
return
end
local chessData = {
nPositionType = GameEnum.SoldierPositionType.FightPosition,
nId = self.tmpMapData.nId,
nStar = math.max(self.tmpMapData.nStar, 1)
}
local Info = CS.AdventureModuleHelper.GetSoldierActorInfo(self.nDataId)
local HealthInfo = CS.AdventureModuleHelper.GetSoldierHealthInfo(self.nDataId)
local atk = Info ~= nil and Info.atk:AsFloat() or 0
local def = Info ~= nil and Info.def:AsFloat() or 0
local critRate = Info ~= nil and Info.critRate:AsFloat() or 0
local critPower = Info ~= nil and Info.critPower:AsFloat() or 0
local attackSpeed = Info ~= nil and Info.normalAttackSpd:AsFloat() or 0
local hp = HealthInfo ~= nil and HealthInfo.hp or 0
local hpMax = HealthInfo ~= nil and HealthInfo.hpMax or 0
local tab = {}
tab.atk = atk
tab.def = def
tab.critRate = critRate
tab.critPower = critPower
tab.attackSpeed = attackSpeed
tab.hp = hp
tab.hpMax = hpMax
tab.nEnergy = self.nEnergy
tab.nMaxEnergy = self.nMaxEnergy
tab.nRecoverRate = self.nRecoverRate
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierCharCardTips, self.tipsRoot, chessData, self.tbChess, self.tbPartner, tab)
EventManager.Hit("OnSetTipsPosition", self.tipsRoot:GetChild(0).position, self.tipsRoot:GetChild(1).position, self.tipsRoot:GetChild(2).position)
end
function SoldierMainCharItemCtrl:OnEvent_EnergyChange(nEnergy, nMaxEnergy, nRecoverRate)
local nValue = nEnergy / nMaxEnergy
self.nEnergy = nEnergy
self.nMaxEnergy = nMaxEnergy
self.nRecoverRate = nRecoverRate
if self.parent ~= nil then
self.parent:CacheSoldierEnergyData(self.nCharId, nEnergy, nMaxEnergy, nRecoverRate, self.isDeath)
end
self._mapNode.SkillCharge.sizeDelta = Vector2(nMaxSize, nMaxSize * nValue)
if self.isEnergyMax == false then
if nEnergy == nMaxEnergy then
self.isEnergyMax = true
self._mapNode.imgSkillStart.gameObject:SetActive(true)
self._mapNode.Fx_Charge:SetActive(true)
self:AddTimer(1, 1, function()
if self == nil or self._mapNode == nil then
return
end
self._mapNode.imgSkillStart.gameObject:SetActive(false)
self._mapNode.Fx_Charge:SetActive(false)
end, true, true, true)
end
elseif nEnergy ~= nMaxEnergy then
self.isEnergyMax = false
end
end
function SoldierMainCharItemCtrl:OnEvent_MoYu(isMoYu)
self._mapNode.Fx_fish:SetActive(isMoYu)
end
function SoldierMainCharItemCtrl:Event_Death()
self.isDeath = true
self._mapNode.imgDeathMask:SetActive(true)
self._mapNode.Fx_Death:SetActive(true)
self._mapNode.Fx_Charge:SetActive(false)
self._mapNode.Fx_fish:SetActive(false)
self._mapNode.AnimRoot:Play("SoldierMainCharItem_death")
if self.parent ~= nil then
self.parent:CacheSoldierEnergyData(self.nCharId, self.nEnergy, self.nMaxEnergy, self.nRecoverRate, self.isDeath)
end
end
function SoldierMainCharItemCtrl:OnEvent_SoldierCharSpawn(nDataId, nUId)
if nDataId == self.nDataId and not self.bAddEvent then
self.nEnergy = 0
self.nMaxEnergy = 0
self.nRecoverRate = 0
self.bAddEvent = true
self.nCharId = nUId
self.isDeath = false
self.isEnergyMax = false
self._mapNode.imgDeathMask:SetActive(false)
self._mapNode.Fx_Death:SetActive(false)
self._mapNode.Fx_Charge:SetActive(false)
self._mapNode.Fx_fish:SetActive(false)
self:AddEntityEvent()
end
end
return SoldierMainCharItemCtrl
@@ -0,0 +1,508 @@
local SoldierPauseCtrl = class("SoldierPauseCtrl", BaseCtrl)
local GamepadUIManager = require("GameCore.Module.GamepadUIManager")
local SoldierAttrData = require("GameCore.Data.DataClass.Soldier.SoldierAttrData")
SoldierPauseCtrl._mapNodeConfig = {
goBlur = {
sNodeName = "t_fullscreen_blur_01"
},
aniBlur = {
sNodeName = "t_fullscreen_blur_01",
sComponentName = "Animator"
},
safeAreaRoot = {
sNodeName = "----SafeAreaRoot----"
},
txtWindowTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Battle_Pause"
},
btnClose = {
sComponentName = "UIButton",
callback = "OnBtnClick_Close"
},
snapshot = {
sComponentName = "UIButton",
callback = "OnBtnClick_Close"
},
btnRestart = {
sComponentName = "UIButton",
callback = "OnBtnClick_Restart"
},
txtBtnRestart = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Btn_Restart"
},
btnResult = {
sComponentName = "UIButton",
callback = "OnBtnClick_Result"
},
txtBtnResult = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Btn_Result"
},
btnLeave = {
sComponentName = "UIButton",
callback = "OnBtnClick_Leave"
},
txtBtnLeave = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Btn_Leave"
},
goNodeInfo = {},
Node = {nCount = 8},
txtProgress = {sComponentName = "TMP_Text"},
txtLevel = {sComponentName = "TMP_Text"},
txtExp = {sComponentName = "TMP_Text"},
txtHp = {sComponentName = "TMP_Text"},
txtCoin = {sComponentName = "TMP_Text"},
btnCoin = {
sComponentName = "UIButton",
callback = "OnBtnClick_CoinTips"
},
BarContainer = {
sComponentName = "RectTransform"
},
goChar = {},
goCharItem = {},
goCharList = {nCount = 2, sComponentName = "Transform"},
txtCharTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Battle_Char_Title"
},
txtPartnerTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Battle_Partner_Title"
},
goPartnerList = {sComponentName = "Transform"},
goPartnerItem = {sComponentName = "Transform"},
txtCardTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Battle_Card_Title"
},
btnStarterCard = {
sComponentName = "UIButton",
callback = "OnBtnClick_StarterCard"
},
imgCardStarter = {sComponentName = "Image"},
imgCardIconStarter = {sComponentName = "Image"},
imgemptyStarter = {},
goStrategyCardList = {sComponentName = "Transform"},
btnStrategyCardItem = {sComponentName = "Transform"},
btnSetting = {
sComponentName = "UIButton",
callback = "OnBtnClick_Setting"
},
charDetialRoot = {sComponentName = "Transform"},
parnterDetialRoot = {sComponentName = "Transform"}
}
SoldierPauseCtrl._mapEventConfig = {
OpenSoldierPause = "OnEvent_OpenSoldierPause",
RefreshSoldierCoin = "OnEvent_RefreshCoin"
}
SoldierPauseCtrl._mapRedDotConfig = {}
local iconPath = "Icon/SoldierOtherIcon/"
local iconCardPath = "Icon/SoldierBuffCard/"
local iconPartnerPath = "Icon/SoldierPartner/"
function SoldierPauseCtrl:OpenUI()
self._mapNode.goBlur:SetActive(true)
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
if self.bShow then
self._mapNode.safeAreaRoot:SetActive(true)
end
end
cs_coroutine.start(wait)
end
function SoldierPauseCtrl:Refresh()
local nStage, nNodexIndex = PlayerData.SoldierData:GetCurChallengeState()
NovaAPI.SetTMPText(self._mapNode.txtProgress, orderedFormat(ConfigTable.GetUIText("Soldier_Pause_Schedule"), nStage .. "-" .. nNodexIndex))
local nLevel, nMaxLevel = self.levelData:GetShopLevel()
NovaAPI.SetTMPText(self._mapNode.txtLevel, orderedFormat(ConfigTable.GetUIText("Soldier_Battle_LevelPause"), nLevel))
local mapLevelCfg = ConfigTable.GetData("SoldierShopLevel", nLevel)
local nNeedExp = 0
if mapLevelCfg ~= nil then
nNeedExp = mapLevelCfg.Exp
end
local nExp = self.levelData:GetExp()
NovaAPI.SetTMPText(self._mapNode.txtExp, string.format("%s/%s", nExp, nNeedExp))
local nHp = self.levelData:GetHp()
NovaAPI.SetTMPText(self._mapNode.txtHp, nHp)
local nCount = self.levelData:GetItem(AllEnum.CoinItemId.SoldierCurrency)
NovaAPI.SetTMPText(self._mapNode.txtCoin, tostring(nCount))
if self.isRefreshMSg then
return
end
self:RefreshShopLv()
self:InitNodeList()
self:RefreshCharList()
self:RefreshCardList()
self.isRefreshMSg = true
end
function SoldierPauseCtrl:RefreshShopLv()
local nCurLevel, nMaxLevel = self.levelData:GetShopLevel()
NovaAPI.SetTMPText(self._mapNode.txtLevel, orderedFormat(ConfigTable.GetUIText("Soldier_Battle_LevelPause"), nCurLevel))
if nCurLevel == nMaxLevel then
self._mapNode.BarContainer.sizeDelta = Vector2(134, 22)
NovaAPI.SetTMPText(self._mapNode.txtExp, ConfigTable.GetUIText("Soldier_Sandtable_MaxLevel"))
else
local ShopMsg = ConfigTable.GetData("SoldierShopLevel", nCurLevel)
if ShopMsg then
local nNeedExp = ShopMsg.Exp
local nCurExp = self.levelData:GetExp()
self._mapNode.BarContainer.sizeDelta = Vector2(134 * (nCurExp / nNeedExp), 22)
NovaAPI.SetTMPText(self._mapNode.txtExp, tostring(nCurExp) .. "/" .. tostring(nNeedExp))
else
printError("商店表找不到,商店当前等级为 === " .. nCurLevel)
end
end
end
function SoldierPauseCtrl:InitNodeList()
local nStage, nNodexIndex = PlayerData.SoldierData:GetCurChallengeState()
NovaAPI.SetTMPText(self._mapNode.TextPos, tostring(nStage) .. "-" .. tostring(nNodexIndex))
local curStageNodeList = self.levelData:GetNodeList()
for i = 1, #self._mapNode.Node do
local node = self._mapNode.Node[i]
if i > #curStageNodeList then
node.gameObject:SetActive(false)
else
local imgIcon = node.transform:Find("imgIcon"):GetComponent("Image")
self:SetPngSprite(imgIcon, iconPath .. AllEnum.SoliderNoteTypeCfg[curStageNodeList[i].nNodeType].Icon)
local imgCurrent = node.transform:Find("imgCurrent")
imgCurrent.gameObject:SetActive(i == nNodexIndex)
if nNodexIndex > i then
NovaAPI.SetImageColor(imgIcon, Color(0.7098039215686275, 0.7647058823529411, 0.8156862745098039, 0.3))
elseif nNodexIndex < i then
NovaAPI.SetImageColor(imgIcon, Color(0.7098039215686275, 0.7647058823529411, 0.8156862745098039, 1))
elseif i == nNodexIndex then
NovaAPI.SetImageColor(imgIcon, Color(1.0, 1.0, 1.0, 1))
end
node.gameObject:SetActive(true)
end
end
end
function SoldierPauseCtrl:RefreshCharList()
self._mapNode.goCharItem:SetActive(false)
local tabMain = {}
local tabSub = {}
for k, v in ipairs(self.tChess) do
local nIndex = v.nIndex
if v.nPositionType == GameEnum.SoldierPositionType.FightPosition then
tabMain[nIndex] = v
elseif v.nPositionType == GameEnum.SoldierPositionType.SupportPosition then
tabSub[nIndex] = v
end
end
local tbActivePartner, tbPartner = SoldierAttrData.CalcActivePartners(self.tChess)
for i, v in pairs(tabMain) do
local goChar = instantiate(self._mapNode.goCharItem, self._mapNode.goCharList[1])
goChar:SetActive(true)
if not self.tbMainCtrl[v.nIndex] then
self.tbMainCtrl[v.nIndex] = self:BindCtrlByNode(goChar, "Game.UI.Soldier.Template.Character.SoldierCharCardItemCtrl")
if v.nId > 0 then
self.tbMainCtrl[v.nIndex]:SetItemData(v.nId, GameEnum.SoldierPositionType.FightPosition)
self.tbMainCtrl[v.nIndex]:SetStar(v.nStar)
self.tbMainCtrl[v.nIndex]:SetAttribute(v.nIndex)
self.tbMainCtrl[v.nIndex]:SetClickCallback(_, function()
local chessData = {
nPositionType = GameEnum.SoldierPositionType.FightPosition,
nId = v.nId,
nStar = math.max(v.nStar, 1)
}
self:ClickCharactorTips(v.nUId, v.nId, goChar, chessData, self.tChess, tbActivePartner)
end)
else
self.tbMainCtrl[v.nIndex]:SetItemData(nil)
end
end
end
for i, v in pairs(tabSub) do
local goChar = instantiate(self._mapNode.goCharItem, self._mapNode.goCharList[2])
goChar:SetActive(true)
if not self.tbSubCtrl[v.nIndex] then
self.tbSubCtrl[v.nIndex] = self:BindCtrlByNode(goChar, "Game.UI.Soldier.Template.Character.SoldierCharCardItemCtrl")
if 0 < v.nId then
self.tbSubCtrl[v.nIndex]:SetItemData(v.nId, GameEnum.SoldierPositionType.SupportPosition)
self.tbSubCtrl[v.nIndex]:SetStar(v.nStar)
self.tbSubCtrl[v.nIndex]:SetAttribute(0)
self.tbSubCtrl[v.nIndex]:SetClickCallback(_, function()
local chessData = {
nPositionType = GameEnum.SoldierPositionType.SupportPosition,
nId = v.nId,
nStar = math.max(v.nStar, 1)
}
self:ClickCharactorTips(v.nUId, v.nId, goChar, chessData, self.tChess, tbActivePartner)
end)
else
self.tbSubCtrl[v.nIndex]:SetItemData(nil)
end
end
end
if tbPartner == nil then
return
end
self._mapNode.goPartnerItem.gameObject:SetActive(false)
self:RefreshPartnerList(tbPartner)
end
function SoldierPauseCtrl:ClickCharactorTips(nUId, nId, obj, chessData, tbChess, tbActivePartner)
local tmpEnergy = self.tabCacheSoldierEnergy[nUId]
if tmpEnergy.death == true then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_Death_Tips"))
return
end
local Info = CS.AdventureModuleHelper.GetSoldierActorInfo(nId)
local HealthInfo = CS.AdventureModuleHelper.GetSoldierHealthInfo(nId)
local atk = Info ~= nil and Info.atk:AsFloat() or 0
local def = Info ~= nil and Info.def:AsFloat() or 0
local critRate = Info ~= nil and Info.critRate:AsFloat() or 0
local critPower = Info ~= nil and Info.critPower:AsFloat() or 0
local attackSpeed = Info ~= nil and Info.normalAttackSpd:AsFloat() or 0
local hp = HealthInfo ~= nil and HealthInfo.hp or 0
local hpMax = HealthInfo ~= nil and HealthInfo.hpMax or 0
local tab = {}
tab.atk = atk
tab.def = def
tab.critRate = critRate
tab.critPower = critPower
tab.attackSpeed = attackSpeed
tab.hp = hp
tab.hpMax = hpMax
tab.nEnergy = tmpEnergy ~= nil and tmpEnergy.energy or 0
tab.nMaxEnergy = tmpEnergy ~= nil and tmpEnergy.maxEnergy or 0
tab.nRecoverRate = tmpEnergy ~= nil and tmpEnergy.recoverRate or 0
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierCharCardTips, self._mapNode.charDetialRoot, chessData, tbChess, tbActivePartner, tab)
EventManager.Hit("OnSetTipsPosition", self._mapNode.charDetialRoot:GetChild(0).position, self._mapNode.charDetialRoot:GetChild(1).position, self._mapNode.charDetialRoot:GetChild(2).position)
EventManager.Hit("SoldierCharTips_ShowBg")
end
function SoldierPauseCtrl:RefreshPartnerList(tbPartner)
self.tabPartnerBtn = {}
for _, v in ipairs(tbPartner) do
local mapPartnerGroupCfg = CacheTable.GetData("_SoldierPartnerGroup", v.nType)
if mapPartnerGroupCfg ~= nil then
local nPartnerQty = GameEnum.PartnerLevelQuality.None
local sBgPath = ""
local cfgList = CacheTable.GetData("_SoldierPartner", v.nType)
if cfgList == nil then
return
end
local partnerCfg = cfgList[v.nActiveLevel]
if partnerCfg == nil then
partnerCfg = cfgList[1]
end
local goU = instantiate(self._mapNode.goPartnerItem, self._mapNode.goPartnerList)
goU.gameObject:SetActive(true)
local imgPartner = goU:Find("imgPartner"):GetComponent("Image")
local imgPartnerIcon = goU:Find("imgPartnerIcon"):GetComponent("Image")
local txtPartnerCount = goU:Find("txtPartnerCount"):GetComponent("TMP_Text")
if v.nActiveLevel == 0 then
self:SetPngSprite(imgPartner, iconPath .. AllEnum.SoldierPartnerLevelIcon[GameEnum.PartnerLevelQuality.None].bg)
else
self:SetPngSprite(imgPartner, iconPath .. AllEnum.SoldierPartnerLevelIcon[partnerCfg.PartnerLevelQuality].bg)
end
self:SetPngSprite(imgPartnerIcon, iconPartnerPath .. mapPartnerGroupCfg.Icon .. AllEnum.SoldierChessIconSurfix.M)
NovaAPI.SetTMPText(txtPartnerCount, tostring(v.nCurNum or 0))
local clickCb = function()
local bTrace = PlayerData.SoldierData:GetCurLevelData():CheckPartnerTrace(v.nType)
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierPartnerTips, self._mapNode.parnterDetialRoot, v.nType, v.nActiveLevel, bTrace)
EventManager.Hit("OnSetParnterTipsPosition", self._mapNode.parnterDetialRoot:GetChild(0).position, self._mapNode.parnterDetialRoot:GetChild(1).position, self._mapNode.parnterDetialRoot:GetChild(2).position)
EventManager.Hit("SoldierCharTips_ShowBg")
end
local btn = imgPartner.gameObject:GetComponent("UIButton")
btn.onClick:RemoveAllListeners()
btn.onClick:AddListener(clickCb)
table.insert(self.tabPartnerBtn, btn)
end
end
end
function SoldierPauseCtrl:RefreshCardList()
local starterCard, strategyCard = self.levelData:GetCardData()
if starterCard ~= nil then
if starterCard[1] ~= nil then
self.nStarterCardId = starterCard[1].nId
local SoldierStarterCardCfg = ConfigTable.GetData("SoldierStarterCard", self.nStarterCardId)
self._mapNode.imgCardStarter.gameObject:SetActive(true)
self._mapNode.imgCardIconStarter.gameObject:SetActive(true)
self._mapNode.imgemptyStarter.gameObject:SetActive(false)
local sBgPath = iconCardPath .. SoldierStarterCardCfg.Icon
self:SetPngSprite(self._mapNode.imgCardIconStarter, sBgPath)
else
self._mapNode.imgCardStarter.gameObject:SetActive(false)
self._mapNode.imgCardIconStarter.gameObject:SetActive(false)
self._mapNode.imgemptyStarter.gameObject:SetActive(true)
end
end
self._mapNode.btnStrategyCardItem.gameObject:SetActive(false)
self.tabStrategyCard = {}
if strategyCard ~= nil then
for k, v in ipairs(strategyCard) do
local goStrategy = instantiate(self._mapNode.btnStrategyCardItem, self._mapNode.goStrategyCardList)
goStrategy.gameObject:SetActive(true)
local clickCb = function()
self:OnBtnClick_StrategyCard(v.nId)
end
local cardBg = goStrategy:Find("AnimRoot/imgCardStrategy"):GetComponent("Image")
local cardIcon = goStrategy:Find("AnimRoot/imgCardIconStrategy"):GetComponent("Image")
local btn = goStrategy:GetComponent("UIButton")
btn.onClick:RemoveAllListeners()
btn.onClick:AddListener(clickCb)
table.insert(self.tabStrategyCard, btn)
local SoldierStrategyCardCfg = ConfigTable.GetData("SoldierStrategyCard", v.nId)
local cardBgPath = iconPath .. AllEnum.SoldierStrategyCardRarityIcon[SoldierStrategyCardCfg.Rarity] .. AllEnum.SoldierChessIconSurfix.S
self:SetPngSprite(cardBg, cardBgPath)
local cardIconPath = iconCardPath .. SoldierStrategyCardCfg.Icon
self:SetPngSprite(cardIcon, cardIconPath)
end
end
end
function SoldierPauseCtrl:CloseUI(callback)
if self._mapNode == nil then
return
end
self:AddTimer(1, 0.2, "ClosePanel", true, true, true, callback)
end
function SoldierPauseCtrl:ClosePanel(_, callback)
if self._mapNode == nil or not self.bShow then
return
end
self:OnPanelClose(callback)
end
function SoldierPauseCtrl:OnPanelClose(callback)
self.bShow = false
PanelManager.InputEnable()
GamepadUIManager.DisableGamepadUI("SoldierPauseCtrl")
EventManager.Hit(EventId.BattleDashboardVisible, true)
self._mapNode.safeAreaRoot:SetActive(false)
self._mapNode.goBlur:SetActive(false)
if callback then
callback()
end
end
function SoldierPauseCtrl:Awake()
self.nAllChallengeTime = ConfigTable.GetConfigNumber("JointDrill_Challenge_Time_Max")
self.nTotalTime = self._panel.nTotalTime
self._mapNode.safeAreaRoot:SetActive(false)
self.tbGamepadUINode = self:GetGamepadUINode()
self.tbMainCtrl = {}
self.tbSubCtrl = {}
end
function SoldierPauseCtrl:OnEnable()
self.nOpenTime = 0
self.nRemainTime = 0
if self._panel.nType ~= nil then
if self._panel.nType == GameEnum.JointDrillMode.JointDrill_Mode_1 then
self.nOpenTime = PlayerData.JointDrill_1:GetJointDrillStartTime()
elseif self._panel.nType == GameEnum.JointDrillMode.JointDrill_Mode_2 then
self.nOpenTime = PlayerData.JointDrill_2:GetJointDrillStartTime()
end
end
end
function SoldierPauseCtrl:OnDisable()
end
function SoldierPauseCtrl:OnDestroy()
for nInstanceId, objCtrl in pairs(self.tbMainCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbMainCtrl[nInstanceId] = nil
end
self.tbMainCtrl = {}
for nInstanceId, objCtrl in pairs(self.tbSubCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbSubCtrl[nInstanceId] = nil
end
self.tbSubCtrl = {}
if self.tabPartnerBtn then
for i, v in pairs(self.tabPartnerBtn) do
v.onClick:RemoveAllListeners()
end
self.tabPartnerBtn = nil
end
if self.tabStrategyCard then
for i, v in pairs(self.tabStrategyCard) do
v.onClick:RemoveAllListeners()
end
self.tabStrategyCard = nil
end
end
function SoldierPauseCtrl:OnBtnClick_Result()
local confirmCallback = function()
local callback = function()
EventManager.Hit("SettleSoldierBattle")
self:CloseUI(function()
local function levelEndCallback()
EventManager.Remove("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, levelEndCallback)
NovaAPI.EnterModule("MainMenuModuleScene", true, 17)
end
EventManager.Add("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, levelEndCallback)
CS.AdventureModuleHelper.LevelStateChanged(true, 0, true)
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierBattlePanel)
end)
end
PlayerData.SoldierData:SendGiveUp(callback)
end
local nStage, nNodexIndex = PlayerData.SoldierData:GetCurChallengeState()
local str = orderedFormat(ConfigTable.GetUIText("Soldier_Battle_GiveUp"), nStage .. "-" .. nNodexIndex)
local msg = {
nType = AllEnum.MessageBox.Confirm,
sContent = str,
callbackConfirm = confirmCallback,
bBlur = false
}
EventManager.Hit(EventId.OpenMessageBox, msg)
end
function SoldierPauseCtrl:OnBtnClick_Close()
self:CloseUI()
end
function SoldierPauseCtrl:OnBtnClick_Restart()
self:CloseUI()
EventManager.Hit("RestartSoldier")
end
function SoldierPauseCtrl:OnBtnClick_Leave()
local tabM, tabS, tabO = self.levelData:GetDeploy()
local tbMain = {}
local tbSup = {}
for i, v in pairs(tabM) do
if v.nPositionType == GameEnum.SoldierPositionType.FightPosition then
table.insert(tbMain, v)
elseif v.nPositionType == GameEnum.SoldierPositionType.SupportPosition then
table.insert(tbSup, v)
end
end
local callback = function()
self:CloseUI(function()
local function levelEndCallback()
EventManager.Remove("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, levelEndCallback)
NovaAPI.EnterModule("MainMenuModuleScene", true, 17)
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierBattlePanel)
end
EventManager.Add("ADVENTURE_LEVEL_UNLOAD_COMPLETE", self, levelEndCallback)
CS.AdventureModuleHelper.LevelStateChanged(true, 0, true)
end)
end
PlayerData.SoldierData:SendStepOut(tbMain, tbSup, tabS, callback)
end
function SoldierPauseCtrl:OnBtnClick_StarterCard()
if self.nStarterCardId and self.nStarterCardId > 0 then
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierSelectStarterCardItem, self.nStarterCardId)
end
end
function SoldierPauseCtrl:OnBtnClick_StrategyCard(StrategyCardId)
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierSelectStrategyCardItem, StrategyCardId)
end
function SoldierPauseCtrl:OnBtnClick_CoinTips()
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierGoldTips)
end
function SoldierPauseCtrl:OnBtnClick_Setting()
EventManager.Hit(EventId.OpenPanel, PanelId.BattleSettings)
end
function SoldierPauseCtrl:OnEvent_OpenSoldierPause(tabChess, tabCacheSoldierEnergy)
self.tChess = tabChess
self.tabCacheSoldierEnergy = tabCacheSoldierEnergy
self.bShow = true
self.levelData = PlayerData.SoldierData:GetCurLevelData()
PanelManager.InputDisable()
self:OpenUI()
self:Refresh()
GamepadUIManager.EnableGamepadUI("SoldierPauseCtrl", self.tbGamepadUINode, nil, true)
end
function SoldierPauseCtrl:OnEvent_RefreshCoin(nCount)
NovaAPI.SetTMPText(self._mapNode.txtCoin, nCount)
end
return SoldierPauseCtrl
@@ -0,0 +1,550 @@
local SoldierRoomInfoCtrl = class("SoldierRoomInfoCtrl", BaseCtrl)
local GamepadUIManager = require("GameCore.Module.GamepadUIManager")
local SoldierAttrData = require("GameCore.Data.DataClass.Soldier.SoldierAttrData")
SoldierRoomInfoCtrl._mapNodeConfig = {
canvas_group = {
sComponentName = "CanvasGroup",
sNodeName = "----SafeAreaRoot----"
},
btnPause = {
sComponentName = "NaviButton",
callback = "OnBtn_Pause"
},
BtnBg = {},
txtNode = {sComponentName = "TMP_Text"},
txtProgress = {sComponentName = "TMP_Text"},
imgProgressBg = {
sComponentName = "RectTransform"
},
imgProgress = {sComponentName = "Image"},
txtHp = {sComponentName = "TMP_Text"},
txtCoin = {sComponentName = "TMP_Text"},
btnCoin = {
sComponentName = "UIButton",
callback = "OnBtnClick_CoinTips"
},
goCharList = {},
goMainChar = {
nCount = 3,
sCtrlName = "Game.UI.Soldier.Battle.SoldierMainCharItemCtrl"
},
goSubChar = {
nCount = 6,
sCtrlName = "Game.UI.Soldier.Battle.SoldierSubCharItemCtrl"
},
goDamage = {nCount = 9},
txtChessName = {nCount = 9, sComponentName = "TMP_Text"},
txtDamage = {nCount = 9, sComponentName = "TMP_Text"},
rtChallengeTime = {},
TMPChallengeTime = {sComponentName = "TMP_Text"},
imgUnfold = {},
btnFold = {
sComponentName = "UIButton",
callback = "OnBtnClick_Fold"
},
btnPartner = {
sComponentName = "UIButton",
callback = "OnBtnClick_Partner"
},
btnCharacter = {
sComponentName = "UIButton",
callback = "OnBtnClick_Character"
},
svPartnerUnfold = {sComponentName = "Transform"},
svCharUnfold = {sComponentName = "Transform"},
goPartnerItem = {sComponentName = "Transform"},
goPartnerUnfold = {sComponentName = "Transform"},
goCharDamageItem = {sComponentName = "Transform"},
goCharUnfold = {sComponentName = "Transform"},
imgFold = {},
btnUnfold = {
sComponentName = "UIButton",
callback = "OnBtnClick_Unfold"
},
btnChange = {
sComponentName = "UIButton",
callback = "OnBtnClick_Change"
},
txtBtnPartner = {
nCount = 3,
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Battle_Btn_Partner"
},
txtBtnChar = {
nCount = 3,
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Battle_Btn_Char"
},
svPartnerFold = {sComponentName = "Transform"},
svCharFold = {sComponentName = "Transform"},
goPartnerItemFold = {sComponentName = "Transform"},
goPartnerFold = {sComponentName = "Transform"},
goCharItemFold = {sComponentName = "Transform"},
goCharFold = {sComponentName = "Transform"},
txtBtnAutoBattleOpen = {
nCount = 4,
sComponentName = "TMP_Text",
sLanguageId = "AutoBattle_Open"
},
txtBtnAutoBattleClose = {
nCount = 4,
sComponentName = "TMP_Text",
sLanguageId = "AutoBattle_Close"
},
btnAutoBattleOpen = {
sComponentName = "NaviButton",
callback = "OnClick_AutoBattleOpen",
sAction = "AutoBattle"
},
btnAutoBattleClose = {
sComponentName = "NaviButton",
callback = "OnClick_AutoBattleClose",
sAction = "AutoBattle"
},
charDetialRoot = {sComponentName = "Transform"},
parnterDetialRoot = {sComponentName = "Transform"}
}
SoldierRoomInfoCtrl._mapEventConfig = {
OpenSoldierRoomInfo = "OnEvent_OpenUI",
InputEnable = "OnEvent_InputEnable",
LoadLevelRefresh = "OnEvent_LoadLevelRefresh",
RefreshSoldierBattleTime = "OnEvent_RefreshTime",
RefreshSoldierChessList = "OnEvent_RefreshChessList",
RefreshChessDamage = "OnEvent_RefreshChessDamage",
RefreshSoldierProgress = "OnEvent_RefreshProgress",
RefreshSoldierCoin = "OnEvent_RefreshCoin",
RestartSoldier = "OnEvent_ClearSoldier",
SettleSoldierBattle = "OnEvent_ClearSoldier",
LeaveSoldier = "OnEvent_ClearSoldier",
Soldier_Settlement_Ready = "OnEvent_SettlementReady"
}
local colorWhite = Color(1, 1, 1, 1)
local colorRed = Color(0.8470588235294118, 0.3137254901960784, 0.32941176470588235)
local nMaxWidth = 0
local nHeight = 0
local TAB_PARTNER = 1
local TAB_CHARACTER = 2
local iconPath = "Icon/SoldierOtherIcon/"
local iconPartnerPath = "Icon/SoldierPartner/"
function SoldierRoomInfoCtrl:OpenUI(nFloorId)
self.nFloorId = nFloorId
local mapFloorCfg = ConfigTable.GetData("SoldierFloor", nFloorId)
if mapFloorCfg ~= nil then
self.nTotalTime = mapFloorCfg.BattleTime
self.nRemainTime = 0
end
nMaxWidth = self._mapNode.imgProgressBg.sizeDelta.x
nHeight = self._mapNode.imgProgressBg.sizeDelta.y
self._mapNode.rtChallengeTime.gameObject:SetActive(false)
NovaAPI.SetTMPText(self._mapNode.TMPChallengeTime, "00:00")
NovaAPI.SetTMPColor(self._mapNode.TMPChallengeTime, colorWhite)
local nHp = self.levelData:GetHp()
NovaAPI.SetTMPText(self._mapNode.txtHp, nHp)
local nCount = self.levelData:GetItem(AllEnum.CoinItemId.SoldierCurrency)
NovaAPI.SetTMPText(self._mapNode.txtCoin, tostring(nCount))
local nStage, nNodexIndex = PlayerData.SoldierData:GetCurChallengeState()
NovaAPI.SetTMPText(self._mapNode.txtNode, nStage .. "-" .. nNodexIndex)
self:ApplyViewState()
self._mapNode.btnAutoBattleOpen.gameObject:SetActive(false)
self._mapNode.btnAutoBattleClose.gameObject:SetActive(true)
end
function SoldierRoomInfoCtrl:CloseUI()
for _, v in ipairs(self._mapNode.goMainChar) do
v:CloseUI()
end
for _, v in ipairs(self._mapNode.goSubChar) do
v:CloseUI()
end
end
function SoldierRoomInfoCtrl:ApplyViewState()
self._mapNode.txtBtnPartner[1].gameObject:SetActive(self._nShowTab == TAB_PARTNER)
self._mapNode.txtBtnChar[1].gameObject:SetActive(self._nShowTab == TAB_CHARACTER)
self._mapNode.imgUnfold.gameObject:SetActive(self._bUnfold)
self._mapNode.imgFold.gameObject:SetActive(not self._bUnfold)
if self._bUnfold then
self._mapNode.svPartnerUnfold.gameObject:SetActive(self._nShowTab == TAB_PARTNER)
self._mapNode.svCharUnfold.gameObject:SetActive(self._nShowTab == TAB_CHARACTER)
else
self._mapNode.svPartnerFold.gameObject:SetActive(self._nShowTab == TAB_PARTNER)
self._mapNode.svCharFold.gameObject:SetActive(self._nShowTab == TAB_CHARACTER)
end
self:ChangeBtnBgState()
end
function SoldierRoomInfoCtrl:SetTime(nTime)
self.nRemainTime = self.nTotalTime - nTime
if self.nRemainTime <= 0 then
NovaAPI.SetTMPColor(self._mapNode.TMPChallengeTime, colorRed)
NovaAPI.SetTMPText(self._mapNode.TMPChallengeTime, ConfigTable.GetUIText("Soldier_Battle_Speed"))
else
if self.nRemainTime <= 5 then
NovaAPI.SetTMPColor(self._mapNode.TMPChallengeTime, colorRed)
else
NovaAPI.SetTMPColor(self._mapNode.TMPChallengeTime, colorWhite)
end
local nMin = math.floor(self.nRemainTime / 60)
local nSec = math.fmod(self.nRemainTime, 60)
NovaAPI.SetTMPText(self._mapNode.TMPChallengeTime, string.format("%02d:%02d", nMin, nSec))
end
end
function SoldierRoomInfoCtrl:RefreshChessList()
for _, v in ipairs(self._mapNode.goDamage) do
v.gameObject:SetActive(false)
end
for _, v in ipairs(self._mapNode.goMainChar) do
v.gameObject:SetActive(false)
end
for _, v in ipairs(self._mapNode.goSubChar) do
v.gameObject:SetActive(false)
end
local tbActivePartner, tbPartner = SoldierAttrData.CalcActivePartners(self.tbChess)
for k, v in ipairs(self.tbChess) do
local nIndex = v.nIndex
if v.nPositionType == GameEnum.SoldierPositionType.FightPosition then
self._mapNode.goMainChar[nIndex].gameObject:SetActive(v.nId > 0)
if v.nId > 0 then
self._mapNode.goMainChar[nIndex]:InitChar(v, self.tbChess, tbActivePartner, self)
self._mapNode.goMainChar[nIndex]:SetTipsRoot(self._mapNode.charDetialRoot)
end
elseif v.nPositionType == GameEnum.SoldierPositionType.SupportPosition then
self._mapNode.goSubChar[nIndex].gameObject:SetActive(v.nId > 0)
if v.nId > 0 then
self._mapNode.goSubChar[nIndex]:InitChar(v, self.tbChess, tbActivePartner, self)
self._mapNode.goSubChar[nIndex]:SetTipsRoot(self._mapNode.charDetialRoot)
end
end
end
self:RefreshPartner(tbPartner)
self:BuildCharList(self.tbChess)
end
function SoldierRoomInfoCtrl:RefreshPartner(tbPartner)
if self._bPartnerBuilt then
return
end
self.tabPartnerBtn = {}
if tbPartner == nil then
return
end
local index = 0
for _, v in ipairs(tbPartner) do
index = index + 1
local mapPartnerGroupCfg = CacheTable.GetData("_SoldierPartnerGroup", v.nType)
if mapPartnerGroupCfg ~= nil then
local nPartnerQty = GameEnum.PartnerLevelQuality.None
local sBgPath = ""
local cfgList = CacheTable.GetData("_SoldierPartner", v.nType)
if cfgList == nil then
return
end
local partnerCfg = cfgList[v.nActiveLevel]
if partnerCfg == nil then
partnerCfg = cfgList[1]
end
if v.nActiveLevel == 0 then
sBgPath = iconPath .. AllEnum.SoldierPartnerLevelIcon[GameEnum.PartnerLevelQuality.None].bg
else
sBgPath = iconPath .. AllEnum.SoldierPartnerLevelIcon[partnerCfg.PartnerLevelQuality].bg
end
local clickCb = function()
local bTrace = PlayerData.SoldierData:GetCurLevelData():CheckPartnerTrace(v.nType)
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierPartnerTips, self._mapNode.parnterDetialRoot, v.nType, v.nActiveLevel, bTrace)
EventManager.Hit("OnSetParnterTipsPosition", self._mapNode.parnterDetialRoot:GetChild(0).position, self._mapNode.parnterDetialRoot:GetChild(1).position, self._mapNode.parnterDetialRoot:GetChild(2).position)
end
local goU = instantiate(self._mapNode.goPartnerItem, self._mapNode.goPartnerUnfold)
goU.gameObject:SetActive(true)
local imgQtyU = goU:Find("imgPartner"):GetComponent("Image")
local imgIconU = goU:Find("imgPartnerIcon"):GetComponent("Image")
local txtName = goU:Find("txtPartnerName"):GetComponent("TMP_Text")
local txtLvlU = goU:Find("imgPartnerbg/txtPartner"):GetComponent("TMP_Text")
local txtCount = goU:Find("txtPartnerCount"):GetComponent("TMP_Text")
self:SetPngSprite(imgQtyU, sBgPath)
self:SetPngSprite(imgIconU, iconPartnerPath .. mapPartnerGroupCfg.Icon .. AllEnum.SoldierChessIconSurfix.M)
NovaAPI.SetTMPText(txtName, mapPartnerGroupCfg.Name)
local strLevel = ""
for i = 1, #v.tbNumList do
if 1 < i then
strLevel = strLevel .. "/"
end
if i ~= v.nActiveLevel then
strLevel = strLevel .. v.tbNumList[i]
else
strLevel = strLevel .. "<color=#3F4A5E>" .. v.tbNumList[i] .. "</color>"
end
end
NovaAPI.SetTMPText(txtLvlU, strLevel)
NovaAPI.SetTMPText(txtCount, v.nCurNum)
self._tbPartnerInst.unfold[#self._tbPartnerInst.unfold + 1] = goU
local btnU = imgQtyU.gameObject:GetComponent("UIButton")
btnU.onClick:RemoveAllListeners()
btnU.onClick:AddListener(clickCb)
table.insert(self.tabPartnerBtn, btnU)
local goF = instantiate(self._mapNode.goPartnerItemFold, self._mapNode.goPartnerFold)
goF.gameObject:SetActive(true)
local imgQty = goF:Find("imgPartner"):GetComponent("Image")
local imgIconF = goF:Find("imgPartnerIcon"):GetComponent("Image")
local txtLvlF = goF:Find("txtPartner"):GetComponent("TMP_Text")
self:SetPngSprite(imgQty, sBgPath)
self:SetPngSprite(imgIconF, iconPartnerPath .. mapPartnerGroupCfg.Icon .. AllEnum.SoldierChessIconSurfix.M)
NovaAPI.SetTMPText(txtLvlF, tostring(v.nCurNum or 0))
self._tbPartnerInst.fold[#self._tbPartnerInst.fold + 1] = goF
local btnF = imgQty.gameObject:GetComponent("UIButton")
btnF.onClick:RemoveAllListeners()
btnF.onClick:AddListener(clickCb)
table.insert(self.tabPartnerBtn, btnF)
if index == #tbPartner then
goU:Find("imgLine").gameObject:SetActive(false)
goF:Find("imgLine").gameObject:SetActive(false)
end
end
end
self._bPartnerBuilt = true
end
function SoldierRoomInfoCtrl:_FillCharCommon(goItem, mapChess, mapCfg)
local imgIcon = goItem:Find("imgChar"):GetComponent("Image")
local img_icon = goItem:Find("iconMask/img_icon"):GetComponent("Image")
local sIcon = AllEnum.SoldierChessRarityIcon[mapCfg.Rarity]
sIcon = iconPath .. sIcon .. AllEnum.SoldierChessIconSurfix.S
if imgIcon then
self:SetPngSprite(imgIcon, sIcon)
end
local skinCfg = ConfigTable.GetData("SoldierSkin", mapCfg.Skin)
if img_icon and skinCfg then
self:SetPngSprite(img_icon, skinCfg.Icon .. AllEnum.SoldierChessIconSurfix.S)
end
for i = 1, 5 do
local goStar = goItem:Find("goStarRoot/imgStar" .. i)
if goStar then
goStar.gameObject:SetActive(i <= mapChess.nStar)
end
end
end
function SoldierRoomInfoCtrl:BuildCharList(tbChess)
if self._bCharBuilt then
return
end
local index = 0
local totalIndex = 0
for _, v in ipairs(tbChess or {}) do
if v.nId and 0 < v.nId then
totalIndex = totalIndex + 1
end
end
for _, v in ipairs(tbChess or {}) do
if v.nId and 0 < v.nId then
index = index + 1
local mapCfg = ConfigTable.GetData("SoldierCharacter", v.nId)
if mapCfg ~= nil then
local goU = instantiate(self._mapNode.goCharDamageItem, self._mapNode.goCharUnfold)
goU.gameObject:SetActive(true)
self:_FillCharCommon(goU, v, mapCfg)
local trDamage = goU:Find("txtDamage")
local imgDamage = goU:Find("imgDamageBg/imgDamage"):GetComponent("RectTransform")
local txtDamage = trDamage and trDamage:GetComponent("TMP_Text") or nil
if txtDamage then
NovaAPI.SetTMPText(txtDamage, "0")
end
local goF = instantiate(self._mapNode.goCharItemFold, self._mapNode.goCharFold)
goF.gameObject:SetActive(true)
self:_FillCharCommon(goF, v, mapCfg)
self._tbCharInst[v.nId] = {
goUnfold = goU,
goFold = goF,
txtDamage = txtDamage,
imgDamage = imgDamage
}
if self.tbDamage[v.nId] == nil then
self.tbDamage[v.nId] = {nDamage = 0}
end
if index == totalIndex then
goU:Find("imgLine").gameObject:SetActive(false)
goF:Find("imgLine").gameObject:SetActive(false)
end
end
end
end
self._bCharBuilt = true
self:_RefreshAllDamageUI()
end
function SoldierRoomInfoCtrl:_RefreshAllDamageUI()
local tbSorted = {}
local nMaxDamage = 0
for nId, v in pairs(self.tbDamage) do
local nDamage = v.nDamage or 0
table.insert(tbSorted, {nId = nId, nDamage = nDamage})
if nMaxDamage < nDamage then
nMaxDamage = nDamage
end
end
table.sort(tbSorted, function(a, b)
if a.nDamage == b.nDamage then
return a.nId < b.nId
end
return a.nDamage > b.nDamage
end)
for nOrder, mapEntry in ipairs(tbSorted) do
local inst = self._tbCharInst[mapEntry.nId]
if inst then
local nPercent = 0 < nMaxDamage and mapEntry.nDamage / nMaxDamage or 0
if inst.txtDamage then
NovaAPI.SetTMPText(inst.txtDamage, self:ThousandsNumber(mapEntry.nDamage))
end
if inst.imgDamage then
inst.imgDamage.sizeDelta = Vector2(nPercent * 178, 16)
end
if inst.goUnfold then
inst.goUnfold:SetSiblingIndex(nOrder - 1)
end
if inst.goFold then
inst.goFold:SetSiblingIndex(nOrder - 1)
end
end
end
end
function SoldierRoomInfoCtrl:RefreshChessDamage(nId, nDamage)
if self.tbDamage[nId] == nil then
self.tbDamage[nId] = {nDamage = nDamage}
else
self.tbDamage[nId].nDamage = nDamage
end
if self._bCharBuilt then
self:_RefreshAllDamageUI()
end
end
function SoldierRoomInfoCtrl:OnEnable()
self.levelData = PlayerData.SoldierData:GetCurLevelData()
self.tbDamage = {}
self.tbCacheSoldierEnergy = {}
self._mapNode.BtnBg.gameObject:SetActive(false)
self._mapNode.goPartnerItem.gameObject:SetActive(false)
self._mapNode.goCharDamageItem.gameObject:SetActive(false)
self._mapNode.goPartnerItemFold.gameObject:SetActive(false)
self._mapNode.goCharItemFold.gameObject:SetActive(false)
self._bUnfold = true
self._nShowTab = TAB_CHARACTER
self._tbPartnerInst = {
unfold = {},
fold = {}
}
self._tbCharInst = {}
self._bPartnerBuilt = false
self._bCharBuilt = false
GamepadUIManager.AddGamepadUINode("BattleMenu", self:GetGamepadUINode())
end
function SoldierRoomInfoCtrl:OnDisable()
self:CloseUI()
end
function SoldierRoomInfoCtrl:OnDestroy()
if self.tabPartnerBtn then
for i, v in pairs(self.tabPartnerBtn) do
v.onClick:RemoveAllListeners()
end
self.tabPartnerBtn = nil
end
end
function SoldierRoomInfoCtrl:OnBtn_Pause()
EventManager.Hit("OpenSoldierPause", self.tbChess, self.tbCacheSoldierEnergy)
end
function SoldierRoomInfoCtrl:OnBtnClick_CoinTips()
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierGoldTips)
end
function SoldierRoomInfoCtrl:OnBtnClick_Fold()
self._bUnfold = false
self:ApplyViewState()
end
function SoldierRoomInfoCtrl:OnBtnClick_Unfold()
self._bUnfold = true
self:ApplyViewState()
end
function SoldierRoomInfoCtrl:OnBtnClick_Partner()
self._nShowTab = TAB_PARTNER
self:ApplyViewState()
end
function SoldierRoomInfoCtrl:OnBtnClick_Character()
self._nShowTab = TAB_CHARACTER
self:ApplyViewState()
end
function SoldierRoomInfoCtrl:ChangeBtnBgState()
local PartnerBg = self._mapNode.btnPartner.transform:Find("AnimRoot/imgBg").gameObject
local BtnPartner2 = self._mapNode.btnPartner.transform:Find("AnimRoot/txtBtnPartner2").gameObject
local BtnPartner3 = self._mapNode.btnPartner.transform:Find("AnimRoot/txtBtnPartner3").gameObject
local CharacterBg = self._mapNode.btnCharacter.transform:Find("AnimRoot/imgBg").gameObject
local BtnChar2 = self._mapNode.btnCharacter.transform:Find("AnimRoot/txtBtnChar2").gameObject
local BtnChar3 = self._mapNode.btnCharacter.transform:Find("AnimRoot/txtBtnChar3").gameObject
PartnerBg:SetActive(self._nShowTab == TAB_PARTNER)
BtnPartner2:SetActive(self._nShowTab == TAB_PARTNER)
BtnPartner3:SetActive(self._nShowTab ~= TAB_PARTNER)
CharacterBg:SetActive(self._nShowTab ~= TAB_PARTNER)
BtnChar2:SetActive(self._nShowTab ~= TAB_PARTNER)
BtnChar3:SetActive(self._nShowTab == TAB_PARTNER)
end
function SoldierRoomInfoCtrl:OnBtnClick_Change()
self._nShowTab = self._nShowTab == TAB_PARTNER and TAB_CHARACTER or TAB_PARTNER
self:ApplyViewState()
end
function SoldierRoomInfoCtrl:OnEvent_OpenUI(nFloorId)
self:OpenUI(nFloorId)
end
function SoldierRoomInfoCtrl:OnEvent_InputEnable(bEnable)
NovaAPI.SetCanvasGroupAlpha(self._mapNode.canvas_group, bEnable == true and 1 or 0)
NovaAPI.SetCanvasGroupInteractable(self._mapNode.canvas_group, bEnable == true)
NovaAPI.SetCanvasGroupBlocksRaycasts(self._mapNode.canvas_group, bEnable == true)
end
function SoldierRoomInfoCtrl:OnEvent_LoadLevelRefresh()
self._mapNode.BtnBg.gameObject:SetActive(true)
end
function SoldierRoomInfoCtrl:OnEvent_RefreshChessList(tbChess)
self.tbChess = tbChess or {}
self:RefreshChessList()
end
function SoldierRoomInfoCtrl:OnEvent_RefreshChessDamage(nId, nDamage)
self:RefreshChessDamage(nId, nDamage)
end
function SoldierRoomInfoCtrl:OnEvent_RefreshTime(nTime)
self._mapNode.rtChallengeTime.gameObject:SetActive(true)
if self.nRemainTime < 0 then
return
end
self:SetTime(nTime)
end
function SoldierRoomInfoCtrl:OnEvent_RefreshProgress(nTotalHp, nHp)
local nProgress = nHp / nTotalHp
NovaAPI.SetTMPText(self._mapNode.txtProgress, string.format("%.f %%", nProgress * 100))
NovaAPI.SetImageFillAmount(self._mapNode.imgProgress, nProgress)
end
function SoldierRoomInfoCtrl:OnEvent_RefreshCoin(nCount)
local nCurCount = self.levelData:GetItem(AllEnum.CoinItemId.SoldierCurrency) or 0
NovaAPI.SetTMPText(self._mapNode.txtCoin, tostring(nCount + nCurCount))
end
function SoldierRoomInfoCtrl:OnEvent_ClearSoldier()
for _, v in ipairs(self._mapNode.goMainChar) do
v:CloseUI()
end
for _, v in ipairs(self._mapNode.goSubChar) do
v:CloseUI()
end
for _, inst in pairs(self._tbCharInst) do
if inst.txtDamage then
NovaAPI.SetTMPText(inst.txtDamage, "0")
end
if inst.imgDamage then
inst.imgDamage.sizeDelta = Vector2(0, 16)
end
end
end
function SoldierRoomInfoCtrl:CacheSoldierEnergyData(dataId, nEnergy, nMaxEnergy, nRecoverRate, nDeath)
self.tbCacheSoldierEnergy[dataId] = {
energy = nEnergy,
maxEnergy = nMaxEnergy,
recoverRate = nRecoverRate,
death = nDeath
}
end
function SoldierRoomInfoCtrl:OnClick_AutoBattleOpen()
end
function SoldierRoomInfoCtrl:OnClick_AutoBattleClose()
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_AutoBattle_Tips"))
end
function SoldierRoomInfoCtrl:OnEvent_SettlementReady()
self._mapNode.BtnBg.gameObject:SetActive(false)
self._mapNode.btnPause.gameObject:SetActive(false)
end
return SoldierRoomInfoCtrl
@@ -0,0 +1,67 @@
local SoldierSkillDisplayCtrl = class("SoldierSkillDisplayCtrl", BaseCtrl)
local WwiseAudioMgr = CS.WwiseAudioManager.Instance
SoldierSkillDisplayCtrl._mapNodeConfig = {
rtSubSkill = {
nCount = 3,
sCtrlName = "Game.UI.Soldier.Battle.SoldierSkillDisplayItemCtrl"
}
}
SoldierSkillDisplayCtrl._mapEventConfig = {
SoldierSkillDisPlay = "OnEvent_SkillDisplay",
InputEnable = "OnEvent_InputEnable"
}
function SoldierSkillDisplayCtrl:Awake()
self.mapSkillDisplay = {}
end
function SoldierSkillDisplayCtrl:OnEnable()
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
NovaAPI.ForceUpdateCanvases()
end
cs_coroutine.start(wait)
end
function SoldierSkillDisplayCtrl:OnDisable()
end
function SoldierSkillDisplayCtrl:OnDestroy()
end
function SoldierSkillDisplayCtrl:OnRelease()
end
function SoldierSkillDisplayCtrl:OnEvent_SkillDisplay(nCharId, nSkillId)
local mapCharCfg = ConfigTable.GetData("SoldierCharacter", nCharId)
local mapSkillCfg = ConfigTable.GetData("Skill", nSkillId)
if mapCharCfg == nil or mapSkillCfg == nil then
return
end
local bPlay = false
for nIdx, skillCtrl in ipairs(self._mapNode.rtSubSkill) do
if not skillCtrl.bPlaying then
bPlay = true
skillCtrl:ShowSkillTips(nSkillId, nCharId)
return
end
end
if not bPlay then
local nIndex = 0
local nTmpTime = 0
for k, v in ipairs(self._mapNode.rtSubSkill) do
if nTmpTime == 0 or nTmpTime > v.nPlayTime then
nIndex = k
end
end
if 0 < nIndex then
self._mapNode.rtSubSkill[nIndex]:InterrputAnim()
self._mapNode.rtSubSkill[nIndex]:ShowSkillTips(nSkillId, nCharId)
end
end
end
function SoldierSkillDisplayCtrl:OnEvent_InputEnable(bEnable)
if not bEnable then
self:InterrputAllDisplay()
end
end
function SoldierSkillDisplayCtrl:InterrputAllDisplay()
self._mapNode.rtSubSkill[1]:InterrputAnim()
self._mapNode.rtSubSkill[2]:InterrputAnim()
self._mapNode.rtSubSkill[3]:InterrputAnim()
end
return SoldierSkillDisplayCtrl
@@ -0,0 +1,83 @@
local SoldierSkillDisplayItemCtrl = class("SoldierSkillDisplayItemCtrl", BaseCtrl)
SoldierSkillDisplayItemCtrl._mapNodeConfig = {
TMP_SkillName = {sComponentName = "TMP_Text"},
imgSubSkillIcon = {sComponentName = "Image"}
}
SoldierSkillDisplayItemCtrl._mapEventConfig = {}
function SoldierSkillDisplayItemCtrl:Awake()
end
function SoldierSkillDisplayItemCtrl:OnEnable()
self.nPlayTime = 0
self.animRoot = self.gameObject:GetComponent("Animator")
self.canvasGroup = self.gameObject:GetComponent("CanvasGroup")
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
self.gameObject:SetActive(false)
end
cs_coroutine.start(wait)
end
function SoldierSkillDisplayItemCtrl:OnDisable()
end
function SoldierSkillDisplayItemCtrl:OnDestroy()
end
function SoldierSkillDisplayItemCtrl:ShowSkillTips(nSkillId, nCharId, callback)
if self.timer ~= nil then
self.timer:Cancel(false)
self.timer = nil
end
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
self.animRoot.enabled = true
self.animRoot:Play("SubSkillDisplay_skill_1")
NovaAPI.SetCanvasGroupAlpha(self.canvasGroup, 1)
end
self.animRoot.enabled = false
NovaAPI.SetCanvasGroupAlpha(self.canvasGroup, 0)
cs_coroutine.start(wait)
local mapSkillCfgData = ConfigTable.GetData_Skill(nSkillId)
if mapSkillCfgData == nil then
printError("Skill Data Missing:" .. nSkillId)
NovaAPI.SetTMPText(self._mapNode.TMP_SkillName, "")
else
NovaAPI.SetTMPText(self._mapNode.TMP_SkillName, mapSkillCfgData.Title)
end
local mapChar = ConfigTable.GetData("SoldierCharacter", nCharId)
if mapChar ~= nil then
local nSkinId = mapChar.Skin
local mapSkin = ConfigTable.GetData("SoldierSkin", nSkinId)
if mapSkin ~= nil then
self:SetPngSprite(self._mapNode.imgSubSkillIcon, mapSkin.Icon .. AllEnum.SoldierChessIconSurfix.S)
end
end
self.ShowEndCallback = callback
self.gameObject:SetActive(true)
self.timer = self:AddTimer(1, 1.5, "ShowEnd", true, true, true, true)
self.bPlaying = true
self.nPlayTime = os.time()
end
function SoldierSkillDisplayItemCtrl:ShowEnd()
NovaAPI.SetImageSpriteAsset(self._mapNode.imgSubSkillIcon, nil)
NovaAPI.SetTMPText(self._mapNode.TMP_SkillName, "")
if self.ShowEndCallback ~= nil and type(self.ShowEndCallback) == "function" then
self.ShowEndCallback()
end
self.ShowEndCallback = nil
self.gameObject:SetActive(false)
self.timer = nil
self.bPlaying = false
self.nPlayTime = 0
end
function SoldierSkillDisplayItemCtrl:InterrputAnim()
if self.timer ~= nil then
self.timer:Cancel(false)
self.timer = nil
end
NovaAPI.SetImageSpriteAsset(self._mapNode.imgSubSkillIcon, nil)
NovaAPI.SetTMPText(self._mapNode.TMP_SkillName, "")
self.ShowEndCallback = nil
self.gameObject:SetActive(false)
self.timer = nil
self.bPlaying = false
self.nPlayTime = 0
end
return SoldierSkillDisplayItemCtrl
@@ -0,0 +1,181 @@
local SoldierSubCharItemCtrl = class("SoldierSubCharItemCtrl", BaseCtrl)
local ImgChessRarityColor = {
[GameEnum.ChessRarity.Gold] = "#FFF0BB",
[GameEnum.ChessRarity.Purple] = "#C099FF",
[GameEnum.ChessRarity.Blue] = "#8BF3FF",
[GameEnum.ChessRarity.Green] = "#A1FF8D",
[GameEnum.ChessRarity.White] = "#DBDBDB"
}
SoldierSubCharItemCtrl._mapNodeConfig = {
imgSkillStart = {sComponentName = "Image"},
AnimRoot = {sComponentName = "Animator"},
SkillCharge = {
sComponentName = "RectTransform"
},
btnItem = {
sComponentName = "UIButton",
callback = "OnBtnClick_Item"
},
imgRarity = {sComponentName = "Image"},
imgIcon = {sComponentName = "Image"},
imgStar = {nCount = 5, sComponentName = "Image"},
rtBuff = {
sCtrlName = "Game.UI.Hud.Buff.BuffCtrl"
},
imgDeathMask = {},
Fx_Charge = {},
Fx_fish = {},
Fx_Death = {}
}
SoldierSubCharItemCtrl._mapEventConfig = {
SoldierCharSpawn = "OnEvent_SoldierCharSpawn"
}
SoldierSubCharItemCtrl._mapRedDotConfig = {}
local nMaxSize = 0
local iconPath = "Icon/SoldierOtherIcon/"
function SoldierSubCharItemCtrl:AddEntityEvent()
EventManager.AddEntityEvent("Soldier_EnergyChange", self.nCharId, self, self.OnEvent_EnergyChange)
EventManager.AddEntityEvent("Event_SoldierMoYu", self.nCharId, self, self.OnEvent_MoYu)
EventManager.AddEntityEvent("Event_SoldierDeath", self.nCharId, self, self.Event_Death)
self._mapNode.rtBuff:BindEntity(self.nCharId)
end
function SoldierSubCharItemCtrl:RemoveEntityEvent()
EventManager.RemoveEntityEvent("Soldier_EnergyChange", self.nCharId, self, self.OnEvent_EnergyChange)
EventManager.RemoveEntityEvent("Event_SoldierMoYu", self.nCharId, self, self.OnEvent_MoYu)
EventManager.RemoveEntityEvent("Event_SoldierDeath", self.nCharId, self, self.Event_Death)
self._mapNode.rtBuff:UnbindEntity()
end
function SoldierSubCharItemCtrl:InitChar(mapData, tbChess, tbPartner, parent)
self.isDeath = false
self.isEnergyMax = false
self._mapNode.imgSkillStart.gameObject:SetActive(false)
self.tmpMapData = mapData
self.nCharId = mapData.nUId
self.nDataId = mapData.nId
self.tbChess = tbChess
self.tbPartner = tbPartner
self.parent = parent
nMaxSize = self._mapNode.SkillCharge.sizeDelta.x
local mapCfg = ConfigTable.GetData("SoldierCharacter", self.nDataId)
if mapCfg ~= nil then
local sIcon = AllEnum.SoldierChessRarityIcon[mapCfg.Rarity]
sIcon = iconPath .. sIcon .. AllEnum.SoldierChessIconSurfix.M
self:SetPngSprite(self._mapNode.imgRarity, sIcon)
local skinCfg = ConfigTable.GetData("SoldierSkin", mapCfg.Skin)
if skinCfg then
self:SetPngSprite(self._mapNode.imgIcon, skinCfg.Icon .. AllEnum.SoldierChessIconSurfix.M)
end
local _, color = ColorUtility.TryParseHtmlString(ImgChessRarityColor[mapCfg.Rarity])
NovaAPI.SetImageColor(self._mapNode.imgSkillStart, color)
end
self._mapNode.SkillCharge.sizeDelta = Vector2(nMaxSize, 0)
for k, v in ipairs(self._mapNode.imgStar) do
v.gameObject:SetActive(k <= mapData.nStar)
end
end
function SoldierSubCharItemCtrl:CloseUI()
self:RemoveEntityEvent()
self.bAddEvent = false
self.nCharId = 0
end
function SoldierSubCharItemCtrl:Awake()
end
function SoldierSubCharItemCtrl:OnEnable()
end
function SoldierSubCharItemCtrl:OnDisable()
end
function SoldierSubCharItemCtrl:OnDestroy()
end
function SoldierSubCharItemCtrl:SetTipsRoot(tr)
self.tipsRoot = tr
end
function SoldierSubCharItemCtrl:OnBtnClick_Item()
if self.isDeath == true then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_Death_Tips"))
return
end
local chessData = {
nPositionType = GameEnum.SoldierPositionType.SupportPosition,
nId = self.tmpMapData.nId,
nStar = math.max(self.tmpMapData.nStar, 1)
}
local Info = CS.AdventureModuleHelper.GetSoldierActorInfo(self.nDataId)
local HealthInfo = CS.AdventureModuleHelper.GetSoldierHealthInfo(self.nDataId)
local atk = Info ~= nil and Info.atk:AsFloat() or 0
local def = Info ~= nil and Info.def:AsFloat() or 0
local critRate = Info ~= nil and Info.critRate:AsFloat() or 0
local critPower = Info ~= nil and Info.critPower:AsFloat() or 0
local attackSpeed = Info ~= nil and Info.normalAttackSpd:AsFloat() or 0
local hp = HealthInfo ~= nil and HealthInfo.hp or 0
local hpMax = HealthInfo ~= nil and HealthInfo.hpMax or 0
local tab = {}
tab.atk = atk
tab.def = def
tab.critRate = critRate
tab.critPower = critPower
tab.attackSpeed = attackSpeed
tab.hp = hp
tab.hpMax = hpMax
tab.nEnergy = self.nEnergy
tab.nMaxEnergy = self.nMaxEnergy
tab.nRecoverRate = self.nRecoverRate
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierCharCardTips, self.tipsRoot, chessData, self.tbChess, self.tbPartner, tab)
EventManager.Hit("OnSetTipsPosition", self.tipsRoot:GetChild(0).position, self.tipsRoot:GetChild(1).position, self.tipsRoot:GetChild(2).position)
end
function SoldierSubCharItemCtrl:OnEvent_EnergyChange(nEnergy, nMaxEnergy, nRecoverRate)
local nValue = nEnergy / nMaxEnergy
self.nEnergy = nEnergy
self.nMaxEnergy = nMaxEnergy
self.nRecoverRate = nRecoverRate
if self.parent ~= nil then
self.parent:CacheSoldierEnergyData(self.nCharId, nEnergy, nMaxEnergy, nRecoverRate, self.isDeath)
end
self._mapNode.SkillCharge.sizeDelta = Vector2(nMaxSize, nMaxSize * nValue)
if self.isEnergyMax == false then
if nEnergy == nMaxEnergy then
self.isEnergyMax = true
self._mapNode.imgSkillStart.gameObject:SetActive(true)
self._mapNode.Fx_Charge:SetActive(true)
self:AddTimer(1, 1, function()
if self == nil or self._mapNode == nil then
return
end
self._mapNode.imgSkillStart.gameObject:SetActive(false)
self._mapNode.Fx_Charge:SetActive(false)
end, true, true, true)
end
elseif nEnergy ~= nMaxEnergy then
self.isEnergyMax = false
end
end
function SoldierSubCharItemCtrl:OnEvent_MoYu(isMoYu)
self._mapNode.Fx_fish:SetActive(isMoYu)
end
function SoldierSubCharItemCtrl:Event_Death()
self.isDeath = true
self._mapNode.Fx_Death:SetActive(true)
self._mapNode.imgDeathMask:SetActive(true)
self._mapNode.Fx_Charge:SetActive(false)
self._mapNode.Fx_fish:SetActive(false)
self._mapNode.AnimRoot:Play("SoldierMainCharItem_death")
if self.parent ~= nil then
self.parent:CacheSoldierEnergyData(self.nCharId, self.nEnergy, self.nMaxEnergy, self.nRecoverRate, self.isDeath)
end
end
function SoldierSubCharItemCtrl:OnEvent_SoldierCharSpawn(nDataId, nUId)
if nDataId == self.nDataId and not self.bAddEvent then
self.nEnergy = 0
self.nMaxEnergy = 0
self.nRecoverRate = 0
self.bAddEvent = true
self.nCharId = nUId
self.isDeath = false
self.isEnergyMax = false
self._mapNode.Fx_Death:SetActive(false)
self._mapNode.imgDeathMask:SetActive(false)
self._mapNode.Fx_Charge:SetActive(false)
self._mapNode.Fx_fish:SetActive(false)
self:AddEntityEvent()
end
end
return SoldierSubCharItemCtrl
@@ -0,0 +1,114 @@
local SoldierAddBuffItemCtrl = class("SoldierAddBuffItemCtrl", BaseCtrl)
SoldierAddBuffItemCtrl._mapNodeConfig = {
btnItem = {
sComponentName = "UIButton",
callback = "OnBtnClick_Select"
},
TextDes = {sComponentName = "TMP_Text"},
TextName = {sComponentName = "TMP_Text"},
imgIcon = {sComponentName = "Image"},
btnConfirm = {
sComponentName = "UIButton",
callback = "OnBtnClick_Confirm"
},
txtConfirm = {
sComponentName = "TMP_Text",
sLanguageId = "Avg_Btn_Select"
},
AnimRoot = {sComponentName = "Animator"},
BgNormal = {sComponentName = "Image"},
imgbg_copper = {},
imgbg_silver = {},
imgbg_gold = {}
}
SoldierAddBuffItemCtrl._mapEventConfig = {}
SoldierAddBuffItemCtrl._mapRedDotConfig = {}
function SoldierAddBuffItemCtrl:Awake()
end
function SoldierAddBuffItemCtrl:OnEnable()
self._bSelected = nil
end
function SoldierAddBuffItemCtrl:OnDisable()
if self.timerBtnConfirm ~= nil then
self.timerBtnConfirm:Cancel()
self.timerBtnConfirm = nil
end
end
function SoldierAddBuffItemCtrl:SetSelectCallback(obj, fn)
self._objSelectCallback = obj
self._fnSelectCallback = fn
end
function SoldierAddBuffItemCtrl:OnBtnClick_Refresh()
if self._fnRefreshCallback ~= nil then
self._fnRefreshCallback(self._objRefreshCallback, self._nIndex)
end
end
function SoldierAddBuffItemCtrl:SetItemData(tbItem)
self._nCardId = tbItem.id or -1
self._nIndex = tbItem.index or 0
self._mapNode.btnConfirm.gameObject:SetActive(false)
local cfg = ConfigTable.GetData("SoldierStrategyCard", self._nCardId)
if cfg == nil then
return
end
self:_SetIcon(cfg.Icon)
NovaAPI.SetTMPText(self._mapNode.TextName, cfg.Name or "")
NovaAPI.SetTMPText(self._mapNode.TextDes, cfg.Des or "")
NovaAPI.SetTMPText(self._mapNode.TextRefreshCount, tostring(self._nRefreshCount))
self:SetPngSprite(self._mapNode.BgNormal, "Icon/SoldierOtherIcon/" .. AllEnum.SoldierStrategyCardRarityIcon[cfg.Rarity] .. AllEnum.SoldierChessIconSurfix.L)
self._mapNode.imgbg_gold:SetActive(cfg.Rarity == GameEnum.itemRarity.R)
self._mapNode.imgbg_silver:SetActive(cfg.Rarity == GameEnum.itemRarity.M)
self._mapNode.imgbg_copper:SetActive(cfg.Rarity == GameEnum.itemRarity.N)
end
function SoldierAddBuffItemCtrl:GetCardId()
return self._nCardId
end
function SoldierAddBuffItemCtrl:GetIndex()
return self._nIndex
end
function SoldierAddBuffItemCtrl:SetSelected(bSelected)
if self.timerBtnConfirm ~= nil then
self.timerBtnConfirm:Cancel()
self.timerBtnConfirm = nil
end
local sSwitchAnimName = ""
if bSelected == true then
self._mapNode.btnConfirm.gameObject:SetActive(bSelected)
sSwitchAnimName = "BuffItem_up"
elseif self._bSelected == true then
sSwitchAnimName = "BuffItem_down"
local nAnimLength = NovaAPI.GetAnimClipLength(self._mapNode.AnimRoot, sSwitchAnimName)
self.timerBtnConfirm = self:AddTimer(1, nAnimLength, function()
self._mapNode.btnConfirm.gameObject:SetActive(false)
end, true, true, true)
elseif self._bSelected == false then
self._mapNode.btnConfirm.gameObject:SetActive(false)
end
if sSwitchAnimName ~= "" then
self._mapNode.AnimRoot:Play(sSwitchAnimName)
end
self._bSelected = bSelected == true
end
function SoldierAddBuffItemCtrl:IsSelected()
return self._bSelected
end
function SoldierAddBuffItemCtrl:_SetIcon(sIconPath)
if self._mapNode.imgIcon == nil then
return
end
if sIconPath ~= nil and sIconPath ~= "" then
self:SetPngSprite(self._mapNode.imgIcon, "Icon/SoldierBuffCard/" .. sIconPath)
self._mapNode.imgIcon.gameObject:SetActive(true)
else
self._mapNode.imgIcon.gameObject:SetActive(false)
end
end
function SoldierAddBuffItemCtrl:OnBtnClick_Select()
EventManager.Hit("SoldierStrategySelect", self._nIndex, self._nCardId)
end
function SoldierAddBuffItemCtrl:OnBtnClick_Confirm()
PlayerData.SoldierData:GetCurLevelData():SendCardSelect(self._nIndex, function()
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierBattleEventPanel)
end)
end
return SoldierAddBuffItemCtrl
@@ -0,0 +1,252 @@
local SoldierBattleEventCtrl = class("SoldierBattleEventCtrl", BaseCtrl)
local SELECT_CARD_TYPE_STRATEGY = 2
SoldierBattleEventCtrl._mapNodeConfig = {
imgBgMain = {},
imgBgMain_Fx = {},
blur = {},
mainRoot = {
sNodeName = "----SafeAreaRoot----"
},
txtLabel = {
sComponentName = "TMP_Text",
sLanguageId = "SoldierBattleEvent_Label"
},
txtRemainRewardCount = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_BattleEvent_RemainRewardCount"
},
txtFinalPoint = {sComponentName = "TMP_Text"},
txtBtnBack = {
sComponentName = "TMP_Text",
sLanguageId = "SoldierBattleEvent_Back"
},
EventItem = {
nCount = 3,
sCtrlName = "Game.UI.Soldier.BattleEvent.SoldierBattleEventItemCtrl"
},
StrategyItem = {
nCount = 3,
sCtrlName = "Game.UI.Soldier.BattleEvent.SoldierAddBuffItemCtrl"
},
btnPolicy = {
sComponentName = "UIButton",
callback = "OnBtnClick_Policy"
},
btnReturn = {
sComponentName = "UIButton",
callback = "OnBtnClick_Return"
},
btnGuide = {
sComponentName = "UIButton",
callback = "OnBtnClick_Guide"
},
btnGoToDice = {
sComponentName = "UIButton",
callback = "OnBtnClick_btnGoToDice"
},
txtGoToDice = {
sComponentName = "TMP_Text",
sLanguageId = "SoldierBattleEvent_GoToDice"
},
imgFinalPoint = {},
ImgNum = {},
EventContainers = {},
StrategyContainers = {}
}
SoldierBattleEventCtrl._mapEventConfig = {
SoldierSelectEventBattle = "OnEvent_SoldierSelectEventBattle",
SoldierShowBattleEventPanel = "OnEvent_ShowBattleEventPanel",
SoldierDiceCasted = "RefreshDiceCasted",
SoldierStrategySelect = "OnEvent_SoldierStrategySelect",
SoldierRecommendPanel_Open = "HidePanel",
SoldierRecommendPanel_Close = "ShowPanel",
SoldierHandbookPanel_Open = "HidePanel",
SoldierHandbookPanel_Close = "ShowPanel"
}
SoldierBattleEventCtrl._mapRedDotConfig = {}
function SoldierBattleEventCtrl:Awake()
self.tbStrategyCardData = nil
self.nDicePoint = nil
self.bSkipEvent = false
local tbParams = self:GetPanelParam()
if tbParams ~= nil and 0 < #tbParams then
self.bSkipEvent = tbParams[1] or false
end
end
function SoldierBattleEventCtrl:OnEnable()
self._mapNode.imgFinalPoint.gameObject:SetActive(false)
self._mapNode.btnGoToDice.gameObject:SetActive(false)
if self.bSkipEvent then
self.bSkipEvent = false
self:OnSoldierEnterCardSelect()
return
end
self:RefreshBattleEventList()
self.nDicePoint = PlayerData.SoldierData:GetCurLevelData():GetEventBattleData().nPoint or 0
if self.tbStrategyCardData == nil and self.nDicePoint ~= nil and self.nDicePoint > 0 then
self:RefreshEventDicePoint()
end
end
function SoldierBattleEventCtrl:OnDisable()
self.tbStrategyCardData = nil
self.nDicePoint = nil
end
function SoldierBattleEventCtrl:GetAddBattleEventList()
local selectCardData = PlayerData.SoldierData:GetCurLevelData():GetEventBattleData()
local tbList = {}
local tbIds = selectCardData.tbIds or {}
if next(tbIds) ~= nil then
table.sort(tbIds, function(a, b)
local mapEventA = ConfigTable.GetData("SoldierEventBattlePool", a)
local mapEventB = ConfigTable.GetData("SoldierEventBattlePool", b)
return mapEventA.LevelName < mapEventB.LevelName
end)
end
for i = 1, 3 do
local nCardId = tbIds[i]
if nCardId ~= nil then
tbList[i] = {id = nCardId, index = i}
end
end
return tbList
end
function SoldierBattleEventCtrl:RefreshBattleEventList()
local tbList = self:GetAddBattleEventList()
if tbList == nil or #tbList <= 0 then
return
end
self._mapNode.btnGoToDice.gameObject:SetActive(true)
self._mapNode.EventContainers.gameObject:SetActive(true)
self._mapNode.StrategyContainers.gameObject:SetActive(false)
self._mapNode.btnPolicy.gameObject:SetActive(false)
for i = 1, 3 do
local item = self._mapNode.EventItem[i]
if item ~= nil then
item:SetItemData(tbList[i])
end
end
end
function SoldierBattleEventCtrl:RefreshStrategyCard()
if self.tbStrategyCardData == nil then
return
end
self._mapNode.EventContainers.gameObject:SetActive(false)
self._mapNode.StrategyContainers.gameObject:SetActive(true)
self._mapNode.btnGoToDice.gameObject:SetActive(false)
self._mapNode.imgFinalPoint.gameObject:SetActive(false)
self._mapNode.btnPolicy.gameObject:SetActive(false)
self._mapNode.ImgNum.gameObject:SetActive(false)
NovaAPI.SetTMPText(self._mapNode.txtLabel, ConfigTable.GetUIText("Soldier_Strategy_Title"))
for k, v in ipairs(self._mapNode.StrategyItem) do
local tbItem = {
id = self.tbStrategyCardData[k],
index = k
}
v:SetItemData(tbItem)
end
end
function SoldierBattleEventCtrl:RefreshDiceCasted()
self:RefreshBattleEventList()
self.nDicePoint = PlayerData.SoldierData:GetCurLevelData():GetEventBattleData().nPoint or 0
if self.tbStrategyCardData == nil and self.nDicePoint ~= nil and self.nDicePoint > 0 then
self:RefreshEventDicePoint()
end
end
function SoldierBattleEventCtrl:OnItemSelected(nIndex, nCardId)
self._nSelectedIndex = nIndex or 0
self._nSelectedCardId = nCardId or -1
for k, v in ipairs(self._mapNode.StrategyItem) do
v:SetSelected(k == self._nSelectedIndex)
end
self:_MoveConfirmBtnTo(self._nSelectedIndex)
end
function SoldierBattleEventCtrl:_MoveConfirmBtnTo(nIndex)
local btnConfirm = self._mapNode.btnConfirm
if btnConfirm == nil or btnConfirm.transform == nil then
return
end
local item = self._mapNode.EventItem and self._mapNode.EventItem[nIndex]
if item == nil then
if btnConfirm.gameObject ~= nil then
btnConfirm.gameObject:SetActive(false)
end
return
end
local v3Pos = item:GetConfirmBtnPosition()
if v3Pos == nil then
return
end
btnConfirm.transform.position = v3Pos
if btnConfirm.gameObject ~= nil then
btnConfirm.gameObject:SetActive(true)
end
end
function SoldierBattleEventCtrl:GetSelectedCardId()
return self._nSelectedCardId
end
function SoldierBattleEventCtrl:GetSelectedIndex()
return self._nSelectedIndex
end
function SoldierBattleEventCtrl:HidePanel()
self.bPrevMainRootVisible = self._mapNode.mainRoot.gameObject.activeSelf or false
self.bPrevBlurVisible = self._mapNode.blur.gameObject.activeSelf or false
self.bPrevImgBgMainVisible = self._mapNode.imgBgMain.gameObject.activeSelf or false
self.bPrevImgBgMain_FxVisible = self._mapNode.imgBgMain_Fx.gameObject.activeSelf or false
self._mapNode.mainRoot.gameObject:SetActive(false)
self._mapNode.blur.gameObject:SetActive(false)
self._mapNode.imgBgMain.gameObject:SetActive(false)
self._mapNode.imgBgMain_Fx.gameObject:SetActive(false)
end
function SoldierBattleEventCtrl:ShowPanel()
self._mapNode.mainRoot.gameObject:SetActive(self.bPrevMainRootVisible)
self._mapNode.blur.gameObject:SetActive(self.bPrevBlurVisible)
self._mapNode.imgBgMain.gameObject:SetActive(self.bPrevImgBgMainVisible)
self._mapNode.imgBgMain_Fx.gameObject:SetActive(self.bPrevImgBgMain_FxVisible)
for k, v in ipairs(self._mapNode.StrategyItem) do
v:SetSelected(k == self._nSelectedIndex)
end
end
function SoldierBattleEventCtrl:OnBtnClick_btnGoToDice()
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierResolveadisputePanel)
end
function SoldierBattleEventCtrl:OnBtnClick_Return()
CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_ingame_transition")
self:HidePanel()
end
function SoldierBattleEventCtrl:OnBtnClick_Guide()
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierRecommendPanel, true)
end
function SoldierBattleEventCtrl:OnBtnClick_Policy()
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierHandbookPanel, AllEnum.SoldierHandbookType.StrategyCard)
end
function SoldierBattleEventCtrl:RefreshEventDicePoint()
self._mapNode.imgFinalPoint.gameObject:SetActive(true)
self._mapNode.btnGoToDice.gameObject:SetActive(false)
local sFinalPoint = ConfigTable.GetUIText("SoldierBattleEvent_FinalPoint")
NovaAPI.SetTMPText(self._mapNode.txtFinalPoint, sFinalPoint .. self.nDicePoint)
for i = 1, 3 do
local item = self._mapNode.EventItem[i]
if item ~= nil then
item:SetDiceCasted(self.nDicePoint)
end
end
end
function SoldierBattleEventCtrl:OnSoldierEnterCardSelect()
self.tbStrategyCardData = PlayerData.SoldierData:GetCurLevelData():GetSelectCardData()
self:RefreshStrategyCard()
end
function SoldierBattleEventCtrl:OnEvent_SoldierSelectEventBattle()
local bInSelectCard = PlayerData.SoldierData:GetCurLevelData():CheckInSelectCard()
if not bInSelectCard then
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierBattleEventPanel)
else
self:OnSoldierEnterCardSelect()
end
end
function SoldierBattleEventCtrl:OnEvent_ShowBattleEventPanel()
self:ShowPanel()
end
function SoldierBattleEventCtrl:OnEvent_SoldierStrategySelect(nIndex, nCardId)
self:OnItemSelected(nIndex, nCardId)
end
return SoldierBattleEventCtrl
@@ -0,0 +1,177 @@
local SoldierBattleEventItemCtrl = class("SoldierBattleEventItemCtrl", BaseCtrl)
SoldierBattleEventItemCtrl._mapNodeConfig = {
imgBgNormal = {sComponentName = "Image"},
ConfirmBtnLocalPos = {sComponentName = "Transform"},
TextName = {sComponentName = "TMP_Text"},
TextDes = {sComponentName = "TMP_Text"},
btnTakeBuff = {
sComponentName = "UIButton",
callback = "OnBtnClick_TakeBuff"
},
txtTakeBuff = {
sComponentName = "TMP_Text",
sLanguageId = "Btn_EarnReward"
},
btnChallenge = {
sComponentName = "UIButton",
callback = "OnBtnClick_Challenge"
},
txtBtnChallenge = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_BattleEventItem_Challenge"
},
txtNeedPoint = {sComponentName = "TMP_Text"},
txt_charTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_BattleEventItem_RewardItem"
},
gridCoin = {
sCtrlName = "Game.UI.Soldier.Template.SoldierItemGridCtrl"
},
gridChess = {
sCtrlName = "Game.UI.Soldier.Template.SoldierItemGridCtrl"
},
gridBuff = {
sCtrlName = "Game.UI.Soldier.Template.SoldierItemGridCtrl"
},
RewardRoot = {}
}
SoldierBattleEventItemCtrl._mapEventConfig = {}
SoldierBattleEventItemCtrl._mapRedDotConfig = {}
function SoldierBattleEventItemCtrl:Awake()
end
function SoldierBattleEventItemCtrl:OnEnable()
end
function SoldierBattleEventItemCtrl:OnDisable()
end
function SoldierBattleEventItemCtrl:OnDestroy()
end
function SoldierBattleEventItemCtrl:SetRefreshCallback(obj, fn)
self._objRefreshCallback = obj
self._fnRefreshCallback = fn
end
function SoldierBattleEventItemCtrl:SetSelectCallback(obj, fn)
self._objSelectCallback = obj
self._fnSelectCallback = fn
end
function SoldierBattleEventItemCtrl:OnBtnClick_Select()
end
function SoldierBattleEventItemCtrl:SetItemData(tbItem)
if tbItem == nil then
self._nCardId = -1
self._nIndex = 0
self:SetSelected(false)
return
end
self._nCardId = tbItem.id or -1
self._nIndex = tbItem.index or 0
local cfg = ConfigTable.GetData("SoldierEventBattlePool", self._nCardId)
if cfg == nil then
return
end
self:_SetIcon(cfg.Icon)
if self._mapNode.TextName ~= nil then
NovaAPI.SetTMPText(self._mapNode.TextName, cfg.Title or "")
end
if self._mapNode.TextDes ~= nil then
NovaAPI.SetTMPText(self._mapNode.TextDes, cfg.Name or "")
end
self:SetPngSprite(self._mapNode.imgBgNormal, "Icon/SoldierOtherIcon/EventBattleQuality_0" .. cfg.LevelName)
self:RefreshCharItems(cfg.coin, cfg.CharacterCount, cfg.StrategyCardCount)
local tbDicePointLevel = ConfigTable.GetConfigArray("SoldierChessEventBattle")
self.nNeedPoint = tonumber(tbDicePointLevel[self._nIndex]) or 0
local sNeedText = orderedFormat(ConfigTable.GetUIText("Soldier_Event_NeedPoint"), self.nNeedPoint)
NovaAPI.SetTMPText(self._mapNode.txtNeedPoint, sNeedText or "")
end
function SoldierBattleEventItemCtrl:RefreshCharItems(nCoinCount, nCharCount, nStrategyCardCount)
if nCoinCount <= 0 and nCharCount <= 0 and nStrategyCardCount <= 0 then
self._mapNode.RewardRoot.gameObject:SetActive(false)
return
end
self._mapNode.RewardRoot.gameObject:SetActive(true)
self.nCoinCount = nCoinCount
if 0 >= self.nCoinCount then
self._mapNode.gridCoin.gameObject:SetActive(false)
else
self._mapNode.gridCoin.gameObject:SetActive(true)
self._mapNode.gridCoin:SetItem(1, self.nCoinCount, "Icon/Item/item_40", 40)
end
self.nCharCount = nCharCount
if 0 >= self.nCharCount then
self._mapNode.gridChess.gameObject:SetActive(false)
else
self._mapNode.gridChess.gameObject:SetActive(true)
self._mapNode.gridChess:SetItem(1, self.nCharCount, "Icon/SoldierOtherIcon/icon_soldier_random_chess", 2701001)
end
self.nStrategyCardCount = nStrategyCardCount
if 0 >= self.nStrategyCardCount then
self._mapNode.gridBuff.gameObject:SetActive(false)
else
self._mapNode.gridBuff.gameObject:SetActive(true)
self._mapNode.gridBuff:SetItem(1, self.nStrategyCardCount, "Icon/SoldierOtherIcon/icon_soldier_random_strategycard", 2701002)
end
self:SetButtonInit()
end
function SoldierBattleEventItemCtrl:SetButtonInit()
self._mapNode.btnTakeBuff.gameObject:SetActive(false)
self._mapNode.btnChallenge.gameObject:SetActive(false)
self._mapNode.txtNeedPoint.gameObject:SetActive(true)
end
function SoldierBattleEventItemCtrl:SetDiceCasted(nPoint)
self._mapNode.txtNeedPoint.gameObject:SetActive(false)
if nPoint < self.nNeedPoint then
self._mapNode.btnTakeBuff.gameObject:SetActive(false)
self._mapNode.btnChallenge.gameObject:SetActive(true)
else
self._mapNode.btnTakeBuff.gameObject:SetActive(true)
self._mapNode.btnChallenge.gameObject:SetActive(false)
end
end
function SoldierBattleEventItemCtrl:OnGridBtnClick(nIndex)
end
function SoldierBattleEventItemCtrl:GetCardId()
return self._nCardId
end
function SoldierBattleEventItemCtrl:GetIndex()
return self._nIndex
end
function SoldierBattleEventItemCtrl:SetSelected(bSelected)
self._bSelected = bSelected == true
if self._mapNode.ImageSelect ~= nil and self._mapNode.ImageSelect.gameObject ~= nil then
self._mapNode.ImageSelect.gameObject:SetActive(self._bSelected)
end
end
function SoldierBattleEventItemCtrl:IsSelected()
return self._bSelected
end
function SoldierBattleEventItemCtrl:GetConfirmBtnPosition()
local node = self._mapNode.ConfirmBtnLocalPos
if node == nil or node.transform == nil then
return nil
end
return node.transform.position
end
function SoldierBattleEventItemCtrl:_SetIcon(sIconPath)
if self._mapNode.img_icon == nil then
return
end
if sIconPath and 0 < #sIconPath then
self:SetPngSprite(self._mapNode.img_icon, sIconPath)
self._mapNode.img_icon.gameObject:SetActive(true)
else
self._mapNode.img_icon.gameObject:SetActive(false)
end
end
function SoldierBattleEventItemCtrl:OnBtnClick_TakeBuff()
local callback = function()
EventManager.Hit("SoldierSelectEventBattle")
end
PlayerData.SoldierData:GetCurLevelData():SendEventBattleChoose(self._nIndex, callback)
end
function SoldierBattleEventItemCtrl:OnBtnClick_Challenge()
local callback = function()
EventManager.Hit("SoldierSelectEventBattle")
end
PlayerData.SoldierData:GetCurLevelData():SendEventBattleChoose(self._nIndex, callback)
end
return SoldierBattleEventItemCtrl
@@ -0,0 +1,21 @@
local SoldierBattleEventPanel = class("SoldierBattleEventPanel", BasePanel)
SoldierBattleEventPanel._bIsMainPanel = false
SoldierBattleEventPanel._tbDefine = {
{
sPrefabPath = "Soldier/Level/SoldierBattleEventPanel.prefab",
sCtrlName = "Game.UI.Soldier.BattleEvent.SoldierBattleEventCtrl"
}
}
function SoldierBattleEventPanel:Awake()
end
function SoldierBattleEventPanel:OnEnable()
end
function SoldierBattleEventPanel:OnAfterEnter()
end
function SoldierBattleEventPanel:OnDisable()
end
function SoldierBattleEventPanel:OnDestroy()
end
function SoldierBattleEventPanel:OnRelease()
end
return SoldierBattleEventPanel
@@ -0,0 +1,349 @@
local SoldierResolveadisputeCtrl = class("SoldierResolveadisputeCtrl", BaseCtrl)
local Camera = CS.UnityEngine.Camera
local Light = CS.UnityEngine.Light
local Animator = CS.UnityEngine.Animator
local AudioListener = CS.UnityEngine.AudioListener
local RawImage = CS.UnityEngine.UI.RawImage
local ClientManager = CS.ClientManager
local GameObject = CS.UnityEngine.GameObject
local typeof = typeof
local DICE_PREFAB_PATH_MAP = {
[1] = "UI/Soldier/Dice/Prefab/Dice01.prefab",
[2] = "UI/Soldier/Dice/Prefab/Dice02.prefab"
}
local DICE_RAW_IMAGE_NODE_NAME = "rimgDiceModel"
local DICE_LAYER_NAME = "Cam_Layer_1"
local DICE_WORLD_ROOT_NAME = "SoldierResolveadisputeDice3DRoot"
local DICE_WORLD_ROOT_POSITION = Vector3(10000, 0, 0)
local DICE_ROLL_MIN_TIME = 1
local DICE_RESULT_TIME = 1.0
local DICE_ANIM_NAME = "Soldier_Dice01_Num_"
SoldierResolveadisputeCtrl._mapNodeConfig = {
btnConfirm = {
sComponentName = "UIButton",
callback = "OnBtnClick_Confirm"
},
txtConfirmBtn = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Resolveadispute_Confirm"
},
btnClose = {
sComponentName = "UIButton",
callback = "OnBtnClick_Close"
},
txtTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Resolveadispute_Title"
},
txtSucessTip = {sComponentName = "TMP_Text"},
txtBlank = {
sComponentName = "TMP_Text",
sLanguageId = "Tips_Continue"
},
txtFinalPoint = {
sComponentName = "TMP_Text",
sLanguageId = "SoldierBattleEvent_FinalPoint"
},
txtFinalPointNum = {sComponentName = "TMP_Text"},
goNodeResultTitle = {},
trRawImage = {
sComponentName = "RectTransform"
},
animFx_Tips = {sNodeName = "Fx_Tips", sComponentName = "Animator"},
Win = {},
Lose = {}
}
SoldierResolveadisputeCtrl._mapEventConfig = {}
SoldierResolveadisputeCtrl._mapRedDotConfig = {}
local function FindChildTransform(trRoot, sName)
if trRoot == nil or type(sName) ~= "string" then
return nil
end
if trRoot.name == sName then
return trRoot
end
local nChildCount = trRoot.childCount - 1
for i = 0, nChildCount do
local trChild = trRoot:GetChild(i)
local trResult = FindChildTransform(trChild, sName)
if trResult ~= nil then
return trResult
end
end
return nil
end
function SoldierResolveadisputeCtrl:Awake()
self.bActive = true
self.bDiceCasted = false
self.mDice3DData = {}
self._mapNode.trRawImage.gameObject:SetActive(true)
self:BuildDice3DData()
end
function SoldierResolveadisputeCtrl:OnEnable()
self.bActive = true
self.bDiceCasted = false
self.bRollMinFinished = false
self.nPendingDicePoint = nil
self._mapNode.btnClose.gameObject:SetActive(false)
self._mapNode.btnConfirm.gameObject:SetActive(true)
self._mapNode.txtBlank.gameObject:SetActive(false)
self._mapNode.goNodeResultTitle.gameObject:SetActive(false)
local tbDicePointLevel = ConfigTable.GetConfigArray("SoldierChessEventBattle")
local nPointGreatSuccess = tbDicePointLevel[3]
local sText = orderedFormat(ConfigTable.GetUIText("Soldier_Resolveadispute_SucessTip"), nPointGreatSuccess)
NovaAPI.SetTMPText(self._mapNode.txtSucessTip, sText)
end
function SoldierResolveadisputeCtrl:OnDisable()
self.bActive = false
end
function SoldierResolveadisputeCtrl:GetDiceCount()
local soldierLevelData = PlayerData.SoldierData:GetCurLevelData()
if soldierLevelData == nil then
return 1
end
local eventBattleData = soldierLevelData:GetEventBattleData()
if eventBattleData == nil then
return 1
end
local bTwoDice = eventBattleData.bTwoDice
return bTwoDice and 2 or 1
end
function SoldierResolveadisputeCtrl:BuildDice3DData()
self.bTwoDice = self:GetDiceCount() == 2
local sDicePrefabPath = DICE_PREFAB_PATH_MAP[self:GetDiceCount()]
if sDicePrefabPath == nil or sDicePrefabPath == "" then
return
end
if self._mapNode.trRawImage == nil then
return
end
local nLayerIndex = NovaAPI.LayerMaskName2Layer(DICE_LAYER_NAME)
local nLayerMask = NovaAPI.LayerMaskGetMask(DICE_LAYER_NAME)
local prefab = self:LoadAsset(sDicePrefabPath, typeof(GameObject))
if prefab == nil then
return
end
local goWorldRoot = GameObject(DICE_WORLD_ROOT_NAME)
goWorldRoot.transform.position = DICE_WORLD_ROOT_POSITION
goWorldRoot.transform.localEulerAngles = Vector3(0, 0, 0)
goWorldRoot.transform.localScale = Vector3.one
self.mDice3DData.worldRoot = goWorldRoot
local go = instantiate(prefab, goWorldRoot.transform)
if go == nil then
return
end
go.transform.localPosition = Vector3(0, 0, 0)
go.transform.localEulerAngles = Vector3(0, 0, 0)
go.transform.localScale = Vector3.one
go.transform:SetLayerRecursively(nLayerIndex)
self.mDice3DData.gameObject = go
self.mDice3DData.rawImage = self._mapNode.trRawImage:GetComponent(typeof(RawImage))
if self.mDice3DData.rawImage == nil then
return
end
local trCamera = FindChildTransform(go.transform, "Camera")
if trCamera == nil then
return
end
self.mDice3DData.camera = trCamera:GetComponent(typeof(Camera))
if self.mDice3DData.camera == nil then
return
end
self.mDice3DData.camera.cullingMask = nLayerMask
self.mDice3DData.camera:SetCameraVolumeLayerMask(nLayerMask)
local tbLight = go:GetComponentsInChildren(typeof(Light), true)
for i = 0, tbLight.Length - 1 do
tbLight[i].cullingMask = nLayerMask
end
local tbAudioListener = go:GetComponentsInChildren(typeof(AudioListener), true)
for i = 0, tbAudioListener.Length - 1 do
tbAudioListener[i].enabled = false
end
if self.bTwoDice == false then
local trNumber = FindChildTransform(go.transform, "Number")
local trAnimRotation = FindChildTransform(go.transform, "Anim_Rotation")
if trNumber ~= nil then
self.mDice3DData.animDice01Num = trNumber:GetComponent(typeof(Animator))
end
if trAnimRotation ~= nil then
self.mDice3DData.animDice01Rot = trAnimRotation:GetComponent(typeof(Animator))
end
else
local trNumber_L = FindChildTransform(go.transform, "Number_L")
if trNumber_L ~= nil then
self.mDice3DData.animDice02Num_L = trNumber_L:GetComponent(typeof(Animator))
end
local trNumber_R = FindChildTransform(go.transform, "Number_R")
if trNumber_R ~= nil then
self.mDice3DData.animDice02Num_R = trNumber_R:GetComponent(typeof(Animator))
end
local trAnimRotation = FindChildTransform(go.transform, "Anim_Rotation")
if trAnimRotation ~= nil then
self.mDice3DData.animDice02Rot = trAnimRotation:GetComponent(typeof(Animator))
end
end
local v2Resolution = Vector2(2160, 1080)
local nRTSizeX = math.floor(v2Resolution.x * Settings.RENDERTEXTURE_SIZE_FACTOR)
local nRTSizeY = math.floor(v2Resolution.y * Settings.RENDERTEXTURE_SIZE_FACTOR)
self.mDice3DData.cameraRT = GameUIUtils.GenerateRenderTextureFor3D(nRTSizeX, nRTSizeY)
self._mapNode.trRawImage.sizeDelta = v2Resolution
self.mDice3DData.camera.targetTexture = self.mDice3DData.cameraRT
NovaAPI.SetTexture(self.mDice3DData.rawImage, self.mDice3DData.cameraRT)
end
function SoldierResolveadisputeCtrl:HasDiceAnim()
return self.mDice3DData.animDice01Rot ~= nil or self.mDice3DData.animDice02Rot ~= nil
end
function SoldierResolveadisputeCtrl:PlayDiceRollAnim()
self._mapNode.trRawImage.gameObject:SetActive(true)
if self.bTwoDice == false then
if self.mDice3DData.animDice01Rot ~= nil then
self.mDice3DData.animDice01Rot:Play("Soldier_Dice01_Start")
end
elseif self.mDice3DData.animDice02Rot ~= nil then
self.mDice3DData.animDice02Rot:Play("Soldier_Dice02_Start")
end
CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_result_resolve_tossSwing")
end
function SoldierResolveadisputeCtrl:OnDiceRollMinFinished()
self.bRollMinFinished = true
self:TryPlayDiceResultAnim()
end
function SoldierResolveadisputeCtrl:TryPlayDiceResultAnim()
self._mapNode.trRawImage.gameObject:SetActive(true)
if self.nPendingDicePoint == nil then
return
end
if self:HasDiceAnim() == false then
self:OnDiceResultAnimEnd()
return
end
if self.bRollMinFinished ~= true then
return
end
local nAnimTime = 0
if self.bTwoDice == false and self.mDice3DData.animDice01Num ~= nil then
local nAnimPoint = math.max(1, math.min(20, self.nPendingDicePoint or 1))
local sAnimName = "Soldier_Dice01_Num_" .. nAnimPoint
self.mDice3DData.animDice01Num:Play(sAnimName)
nAnimTime = NovaAPI.GetAnimClipLength(self.mDice3DData.animDice01Num, {sAnimName})
end
if self.bTwoDice == true then
math.randomseed(os.time())
math.random()
math.random()
math.random()
local nFinalPoint = self.nPendingDicePoint or 0
local nRandomLeftOrRight = math.random(1, 2)
local nDice1 = 0
local nDice2 = 0
if nRandomLeftOrRight == 1 then
nDice1 = nFinalPoint
nDice2 = math.random(1, nFinalPoint - 1)
else
nDice2 = nFinalPoint
nDice1 = math.random(1, nFinalPoint - 1)
end
local nAnimTime_L = 0
local nAnimTime_R = 0
if self.mDice3DData.animDice02Num_L ~= nil then
local sAnimName = "Soldier_Dice02_Num_" .. nDice1
self.mDice3DData.animDice02Num_L:Play(sAnimName)
nAnimTime_L = NovaAPI.GetAnimClipLength(self.mDice3DData.animDice02Num_L, {sAnimName})
end
if self.mDice3DData.animDice02Num_R ~= nil then
local sAnimName = "Soldier_Dice02_Num_" .. nDice2
self.mDice3DData.animDice02Num_R:Play(sAnimName)
nAnimTime_R = NovaAPI.GetAnimClipLength(self.mDice3DData.animDice02Num_R, {sAnimName})
end
nAnimTime = math.max(nAnimTime_L, nAnimTime_R)
end
self:AddTimer(1, nAnimTime, "OnDiceResultAnimEnd", true, true, true)
end
function SoldierResolveadisputeCtrl:OnDiceResultAnimEnd()
if self.bActive ~= true then
return
end
NovaAPI.SetTMPText(self._mapNode.txtFinalPointNum, self.nPendingDicePoint or 0)
local tbDicePointLevel = ConfigTable.GetConfigArray("SoldierChessEventBattle")
if tbDicePointLevel ~= nil then
local nMinPoint = tonumber(tbDicePointLevel[1]) or 0
local sAnimName = ""
local sSoundName = ""
if nMinPoint <= self.nPendingDicePoint then
self._mapNode.Win.gameObject:SetActive(true)
self._mapNode.Lose.gameObject:SetActive(false)
sAnimName = "SoldierResolveadisputeTips_Win"
sSoundName = "mode_900001_chess_result_resolve_toss_goodEnd"
else
self._mapNode.Lose.gameObject:SetActive(true)
self._mapNode.Win.gameObject:SetActive(false)
sAnimName = "SoldierResolveadisputeTips_Lose"
sSoundName = "mode_900001_chess_result_resolve_toss_badEnd"
end
if sAnimName ~= "" then
self._mapNode.animFx_Tips:Play(sAnimName)
end
if sSoundName ~= "" then
CS.WwiseAudioManager.Instance:PostEvent(sSoundName)
end
end
self.bDiceCasted = false
self._mapNode.txtBlank.gameObject:SetActive(true)
self._mapNode.btnConfirm.gameObject:SetActive(false)
self._mapNode.btnClose.gameObject:SetActive(true)
self._mapNode.goNodeResultTitle.gameObject:SetActive(true)
EventManager.Hit("SoldierDiceCasted")
end
function SoldierResolveadisputeCtrl:OnBtnClick_Confirm()
if self.bDiceCasted == true then
return
end
self._mapNode.btnConfirm.gameObject:SetActive(false)
self.bDiceCasted = true
self.bRollMinFinished = false
self.nPendingDicePoint = nil
self:PlayDiceRollAnim()
if self:HasDiceAnim() == true then
self:AddTimer(1, DICE_ROLL_MIN_TIME, "OnDiceRollMinFinished", true, true, true)
else
self.bRollMinFinished = true
end
local soldierLevelData = PlayerData.SoldierData:GetCurLevelData()
if soldierLevelData ~= nil then
soldierLevelData:SendEventBattleThrowDice(function()
if self.bActive ~= true then
return
end
self.nPendingDicePoint = soldierLevelData:GetEventBattleData().nPoint or 0
self:TryPlayDiceResultAnim()
end)
else
self.nPendingDicePoint = 0
self:TryPlayDiceResultAnim()
end
end
function SoldierResolveadisputeCtrl:OnBtnClick_Close()
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierResolveadisputePanel)
end
function SoldierResolveadisputeCtrl:OnDestroy()
if self.mDice3DData.cameraRT ~= nil then
if self.mDice3DData.camera ~= nil then
self.mDice3DData.camera.targetTexture = nil
end
if self.mDice3DData.rawImage ~= nil then
NovaAPI.SetTexture(self.mDice3DData.rawImage, nil)
end
GameUIUtils.ReleaseRenderTexture(self.mDice3DData.cameraRT)
self.mDice3DData.cameraRT = nil
end
if self.mDice3DData.worldRoot ~= nil then
destroy(self.mDice3DData.worldRoot)
self.mDice3DData.worldRoot = nil
self.mDice3DData.gameObject = nil
elseif self.mDice3DData.gameObject ~= nil then
destroy(self.mDice3DData.gameObject)
self.mDice3DData.gameObject = nil
end
self.mDice3DData = {}
end
return SoldierResolveadisputeCtrl
@@ -0,0 +1,21 @@
local SoldierResolveadisputePanel = class("SoldierResolveadisputePanel", BasePanel)
SoldierResolveadisputePanel._bIsMainPanel = false
SoldierResolveadisputePanel._tbDefine = {
{
sPrefabPath = "Soldier/Level/SoldierResolveadisputePanel.prefab",
sCtrlName = "Game.UI.Soldier.BattleEvent.SoldierResolveadisputeCtrl"
}
}
function SoldierResolveadisputePanel:Awake()
end
function SoldierResolveadisputePanel:OnEnable()
end
function SoldierResolveadisputePanel:OnAfterEnter()
end
function SoldierResolveadisputePanel:OnDisable()
end
function SoldierResolveadisputePanel:OnDestroy()
end
function SoldierResolveadisputePanel:OnRelease()
end
return SoldierResolveadisputePanel
@@ -0,0 +1,144 @@
local BaseCtrl = require("GameCore.UI.BaseCtrl")
local SoldierAttrData = require("GameCore.Data.DataClass.Soldier.SoldierAttrData")
local SoldierCharAttriTipsCtrl = class("SoldierCharAttriTipsCtrl", BaseCtrl)
SoldierCharAttriTipsCtrl._mapNodeConfig = {
snapshot = {
sComponentName = "UIButton",
callback = "OnBtnClick_Close"
},
btnClose = {
sComponentName = "UIButton",
callback = "OnBtnClick_Close"
},
imgIcon = {sComponentName = "Image"},
txt_CharName = {sComponentName = "TMP_Text"},
txtStatus = {sNodeName = "TextStatus", sComponentName = "TMP_Text"},
imgStatusIcon = {
sNodeName = "ImageStatusIcon",
sComponentName = "Image"
},
loopSv = {
sComponentName = "LoopScrollView",
sNodeName = "Scroll View"
},
goLevel = {nCount = 3},
txtWindowTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Handbook_CharDetail"
},
imgRare = {sComponentName = "Image"}
}
SoldierCharAttriTipsCtrl._mapEventConfig = {}
SoldierCharAttriTipsCtrl._mapRedDotConfig = {}
local RootPath = "Icon/SoldierOtherIcon/"
function SoldierCharAttriTipsCtrl:Awake()
local tbParam = self:GetPanelParam()
if type(tbParam) == "table" then
self._nCharId = tbParam[1]
end
end
function SoldierCharAttriTipsCtrl:OnEnable()
if self._nCharId ~= nil then
self:OnRefresh(self._nCharId)
end
end
function SoldierCharAttriTipsCtrl:OnDisable()
end
function SoldierCharAttriTipsCtrl:OnDestroy()
end
function SoldierCharAttriTipsCtrl:OnRefresh(nCharId)
local cfgChess = ConfigTable.GetData("SoldierCharacter", nCharId)
if cfgChess == nil then
printError("SoldierCharAttriTips: SoldierCharacter not found, nCharId=" .. tostring(nCharId))
return
end
local cfgSkin = ConfigTable.GetData("SoldierSkin", cfgChess.Skin)
if cfgSkin ~= nil and cfgSkin.Icon then
self:SetPngSprite(self._mapNode.imgIcon, cfgSkin.Icon .. "_L")
end
local sName = cfgChess.Name
NovaAPI.SetTMPText(self._mapNode.txt_CharName, sName)
local nChessType = cfgChess.Type
local tbChessTypeConfig = CacheTable.GetData("_SoldierChessType", nChessType)
if tbChessTypeConfig ~= nil then
local sPath = "Icon/SoldierOtherIcon/" .. tbChessTypeConfig.Icon
self:SetPngSprite(self._mapNode.imgStatusIcon, sPath)
NovaAPI.SetTMPText(self._mapNode.txtStatus, tbChessTypeConfig.Name)
local rarePath = RootPath .. AllEnum.SoldierChessRarityIcon[cfgChess.Rarity] .. AllEnum.SoldierChessIconSurfix.L
self:SetPngSprite(self._mapNode.imgRare, rarePath)
end
self.maxLevel = cfgChess.MaxStar
for i = 1, self.maxLevel do
local goLevel = self._mapNode.goLevel[i]
if goLevel then
goLevel:SetActive(i <= self.maxLevel)
end
end
self:_RefreshAttrItems(cfgChess.Id)
end
function SoldierCharAttriTipsCtrl:_RefreshAttrItems(nCharId)
local tbAttr = SoldierAttrData.CalcCharacterAttr(nCharId, 1)
self._tbShowAttr = {}
for _, attr in ipairs(tbAttr or {}) do
if attr.sKey ~= "Energy" and attr.sKey ~= "InitialEnergy" then
table.insert(self._tbShowAttr, attr)
end
end
self._mapNode.loopSv:Init(#self._tbShowAttr, self, self.RefreshAttrItem)
end
function SoldierCharAttriTipsCtrl:RefreshAttrItem(goGird, gridIndex)
local index = gridIndex + 1
local attr = self._tbShowAttr and self._tbShowAttr[index]
if attr == nil then
return
end
local mapAttributeDesc = CacheTable.GetData("_AttributeDesc", attr.sKey)
if not mapAttributeDesc then
return
end
local imgIcon = goGird.transform:Find("ImageIcon"):GetComponent("Image")
local txtName = goGird.transform:Find("TextName"):GetComponent("TMP_Text")
self:SetPngSprite(imgIcon, mapAttributeDesc.Icon)
if attr.sLanguageId ~= nil then
NovaAPI.SetTMPText(txtName, ConfigTable.GetUIText(attr.sLanguageId))
else
NovaAPI.SetTMPText(txtName, mapAttributeDesc.Desc)
end
local tbAttrByLevel = {}
for i = 1, self.maxLevel do
local tbAttr = SoldierAttrData.CalcCharacterAttr(self._nCharId, i)
local curAttr
for _, item in ipairs(tbAttr or {}) do
if item.sKey == attr.sKey then
curAttr = item
break
end
end
tbAttrByLevel[i] = curAttr
end
for i = 1, 3 do
local txtValue = goGird.transform:Find("TextValue" .. i):GetComponent("TMP_Text")
if i > self.maxLevel then
NovaAPI.SetTMPText(txtValue, "")
else
local curAttr = tbAttrByLevel[i]
if curAttr ~= nil then
local sValue = self:_TransValueFormat(curAttr.nValue, mapAttributeDesc.isPercent, mapAttributeDesc.Format)
NovaAPI.SetTMPText(txtValue, sValue)
else
NovaAPI.SetTMPText(txtValue, "")
end
end
end
end
function SoldierCharAttriTipsCtrl:_TransValueFormat(nValue, bPercent, nFormat, bAdd)
local sValue = FormatEffectValue(nValue, bPercent, nFormat)
if bAdd then
sValue = "+" .. sValue
end
return sValue
end
function SoldierCharAttriTipsCtrl:OnBtnClick_Close()
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierCharAttriTips)
end
return SoldierCharAttriTipsCtrl
@@ -0,0 +1,22 @@
local BasePanel = require("GameCore.UI.BasePanel")
local SoldierCharAttriTipsPanel = class("SoldierCharAttriTipsPanel", BasePanel)
SoldierCharAttriTipsPanel._bIsMainPanel = false
SoldierCharAttriTipsPanel._tbDefine = {
{
sPrefabPath = "Soldier/Tips/SoldierCharAttriTipsPanel.prefab",
sCtrlName = "Game.UI.Soldier.CharacterAttriTips.SoldierCharAttriTipsCtrl"
}
}
function SoldierCharAttriTipsPanel:Awake()
end
function SoldierCharAttriTipsPanel:OnEnable()
end
function SoldierCharAttriTipsPanel:OnAfterEnter()
end
function SoldierCharAttriTipsPanel:OnDisable()
end
function SoldierCharAttriTipsPanel:OnDestroy()
end
function SoldierCharAttriTipsPanel:OnRelease()
end
return SoldierCharAttriTipsPanel
@@ -0,0 +1,91 @@
local CommonTipsBaseCtrl = require("Game.UI.CommonTipsEx.CommonTipsBaseCtrl")
local SoldierCharPotentialDetailCtrl = class("SoldierCharPotentialDetailCtrl", CommonTipsBaseCtrl)
SoldierCharPotentialDetailCtrl._mapNodeConfig = {
PotentialItem = {},
switch_des = {},
switch_img_bg = {
sComponentName = "RectTransform"
},
switch_name = {
sComponentName = "TMP_Text",
sLanguageId = "Potential_Change_Desc"
},
btnSwitch_on = {
sComponentName = "UIButton",
callback = "OnBtnClick_SetDes"
},
btnSwitch_off = {
sComponentName = "UIButton",
callback = "OnBtnClick_SetSimpleDes"
},
btnClosePanel = {
sComponentName = "UIButton",
callback = "OnBtnClick_ClosePanel"
},
safeAreaRoot = {
sNodeName = "----SafeAreaRoot----",
sComponentName = "RectTransform"
},
rtContent = {
sComponentName = "RectTransform"
}
}
SoldierCharPotentialDetailCtrl._mapEventConfig = {}
SoldierCharPotentialDetailCtrl._mapRedDotConfig = {}
function SoldierCharPotentialDetailCtrl:Awake()
local param = self:GetPanelParam()
if type(param) == "table" then
self.rtTarget = param[1]
self.nPotentialId = param[2] or 0
end
end
function SoldierCharPotentialDetailCtrl:OnEnable()
self:SetData(self.nPotentialId)
self:SetTipsPosition(self.rtTarget, self._mapNode.rtContent, self._mapNode.safeAreaRoot)
local pos = self._mapNode.rtContent.transform.localPosition
pos.z = 0
self._mapNode.rtContent.transform.localPosition = pos
end
function SoldierCharPotentialDetailCtrl:OnDisable()
end
function SoldierCharPotentialDetailCtrl:OnDestroy()
end
function SoldierCharPotentialDetailCtrl:SetData(nPotentialId)
if nPotentialId == nil or nPotentialId == 0 then
return
end
local potentialItemRoot = self._mapNode.PotentialItem.transform:Find("AnimRoot/goPotentialNormal")
local txtName = potentialItemRoot:Find("txtName"):GetComponent("TMP_Text")
local imgIcon = potentialItemRoot:Find("goIcon/imgIcon3"):GetComponent("Image")
local txtDesc = potentialItemRoot:Find("ScrollView/Viewport/Content/txtDesc"):GetComponent("TMP_Text")
local potentialConfig = ConfigTable.GetData("SoldierPotential", nPotentialId)
NovaAPI.SetTMPText(txtName, potentialConfig.Name)
self:SetPngSprite(imgIcon, potentialConfig.Icon)
NovaAPI.SetTMPText(txtDesc, potentialConfig.Des)
end
function SoldierCharPotentialDetailCtrl:OnBtnClick_SetSimpleDes()
self:_ApplySimple(true)
end
function SoldierCharPotentialDetailCtrl:OnBtnClick_SetDes()
self:_ApplySimple(false)
end
function SoldierCharPotentialDetailCtrl:_ApplySimple(bSimple)
self.bSimple = bSimple
PlayerData.StarTower:SetPotentialDescSimple(bSimple)
self:_RefreshSwitch()
if self._mapNode.PotentialItem ~= nil then
self._mapNode.PotentialItem:ChangeDesc(bSimple)
end
end
function SoldierCharPotentialDetailCtrl:_RefreshSwitch()
if self._mapNode.btnSwitch_on ~= nil then
self._mapNode.btnSwitch_on.gameObject:SetActive(self.bSimple)
end
if self._mapNode.btnSwitch_off ~= nil then
self._mapNode.btnSwitch_off.gameObject:SetActive(not self.bSimple)
end
end
function SoldierCharPotentialDetailCtrl:OnBtnClick_ClosePanel()
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierCharPontentialDetailPanel)
end
return SoldierCharPotentialDetailCtrl
@@ -0,0 +1,22 @@
local BasePanel = require("GameCore.UI.BasePanel")
local SoldierCharTalentDetailPanel = class("SoldierCharTalentDetailPanel", BasePanel)
SoldierCharTalentDetailPanel._bIsMainPanel = false
SoldierCharTalentDetailPanel._bAddToBackHistory = false
SoldierCharTalentDetailPanel._sSortingLayerName = AllEnum.SortingLayerName.UI_Top
SoldierCharTalentDetailPanel._tbDefine = {
{
sPrefabPath = "Soldier/Tips/CharacterCardTips/SoldierCharPontentialDetailPanel.prefab",
sCtrlName = "Game.UI.Soldier.CharacterTips.Components.SoldierCharPotentialDetailCtrl"
}
}
function SoldierCharTalentDetailPanel:Awake()
end
function SoldierCharTalentDetailPanel:OnEnable()
end
function SoldierCharTalentDetailPanel:OnDisable()
end
function SoldierCharTalentDetailPanel:OnDestroy()
end
function SoldierCharTalentDetailPanel:OnRelease()
end
return SoldierCharTalentDetailPanel
@@ -0,0 +1,46 @@
local SoldierCharSkillDetailItemCtrl = class("SoldierCharSkillDetailItemCtrl", BaseCtrl)
SoldierCharSkillDetailItemCtrl._mapNodeConfig = {
goSkillItem = {
sCtrlName = "Game.UI.Soldier.CharacterTips.Items.SoldierCharSkillItemCtrl"
},
txt_title = {sComponentName = "TMP_Text"},
txt_desc = {sComponentName = "TMP_Text"},
TMP_Link = {
sNodeName = "txt_desc",
sComponentName = "TMPHyperLink",
callback = "OnLinkClick_Word"
},
imgLine = {}
}
SoldierCharSkillDetailItemCtrl._mapEventConfig = {}
SoldierCharSkillDetailItemCtrl._mapRedDotConfig = {}
function SoldierCharSkillDetailItemCtrl:Awake()
end
function SoldierCharSkillDetailItemCtrl:OnEnable()
end
function SoldierCharSkillDetailItemCtrl:OnDisable()
end
function SoldierCharSkillDetailItemCtrl:OnDestroy()
end
function SoldierCharSkillDetailItemCtrl:SetData(nSkillId, nSkillIndex, nSkillLevel, bLast)
if nSkillId == nil or nSkillId == 0 then
self.gameObject:SetActive(false)
return
end
self.gameObject:SetActive(true)
self.nSkillId = nSkillId
self._mapNode.goSkillItem:SetData(nSkillId, nSkillIndex)
local skillCfg = ConfigTable.GetData("Skill", nSkillId)
if skillCfg == nil then
printError("[SoldierCharSkillDetailItemCtrl] Skill 表找不到数据,id" .. tostring(nSkillId))
return
end
NovaAPI.SetTMPText(self._mapNode.txt_title, skillCfg.Title)
local sDesc = UTILS.ParseDesc(skillCfg, GameEnum.levelTypeData.SoldierLevel, nil, false, nSkillLevel)
NovaAPI.SetTMPText(self._mapNode.txt_desc, sDesc)
self._mapNode.imgLine:SetActive(not bLast)
end
function SoldierCharSkillDetailItemCtrl:OnLinkClick_Word(link, sWordId)
UTILS.ClickWordLink(link, sWordId)
end
return SoldierCharSkillDetailItemCtrl
@@ -0,0 +1,34 @@
local SoldierCharSkillItemCtrl = class("SoldierCharSkillItemCtrl", BaseCtrl)
SoldierCharSkillItemCtrl._mapNodeConfig = {
imgBg = {nCount = 2, sComponentName = "Image"},
imgIcon = {sComponentName = "Image"},
imgType = {sComponentName = "Image"}
}
SoldierCharSkillItemCtrl._mapEventConfig = {}
SoldierCharSkillItemCtrl._mapRedDotConfig = {}
function SoldierCharSkillItemCtrl:Awake()
end
function SoldierCharSkillItemCtrl:OnEnable()
end
function SoldierCharSkillItemCtrl:OnDisable()
end
function SoldierCharSkillItemCtrl:OnDestroy()
end
function SoldierCharSkillItemCtrl:SetData(nSkillId, nSkillIndex)
local skillCfg = ConfigTable.GetData_Skill(nSkillId)
if nil == skillCfg then
printError("找不到技能配置!!技能id = " .. nSkillId)
return
end
local skillShowCfg = AllEnum.SkillTypeShow[nSkillIndex]
local bgIconIndex = skillShowCfg.bgIconIndex
self:SetAtlasSprite(self._mapNode.imgBg[2], "10_ico", "zs_character_skill_" .. bgIconIndex)
local _, color = ColorUtility.TryParseHtmlString(skillShowCfg.bgColor)
NovaAPI.SetImageColor(self._mapNode.imgBg[2], Color(color.r, color.g, color.b, 0.19607843137254902))
self:SetAtlasSprite(self._mapNode.imgBg[1], "12_rare", "rare_character_skill_6")
local skillTypeIconIdx = skillShowCfg.iconIndex
self:SetAtlasSprite(self._mapNode.imgType, "05_language", "zs_character_skill_text_" .. skillTypeIconIdx)
NovaAPI.SetImageNativeSize(self._mapNode.imgType)
self:SetPngSprite(self._mapNode.imgIcon, skillCfg.Icon)
end
return SoldierCharSkillItemCtrl
@@ -0,0 +1,138 @@
local CommonTipsBaseCtrl = require("Game.UI.CommonTipsEx.CommonTipsBaseCtrl")
local LayoutRebuilder = CS.UnityEngine.UI.LayoutRebuilder
local SoldierCharSkillDetailCtrl = class("SoldierCharSkillDetailCtrl", CommonTipsBaseCtrl)
SoldierCharSkillDetailCtrl._mapNodeConfig = {
btnCloseTips = {
sComponentName = "UIButton",
callback = "OnBtnClick_ClosePanel"
},
rtContent = {
sComponentName = "RectTransform"
},
safeAreaRoot = {
sNodeName = "----SafeAreaRoot----",
sComponentName = "RectTransform"
},
btnCloseWordTip = {
sComponentName = "Button",
callback = "OnBtnClick_CloseWord"
},
imgWordTipBg = {},
TMPWordDesc = {sComponentName = "TMP_Text"},
TMPWordTipsTitle = {sComponentName = "TMP_Text"},
imgTipsBg = {
sComponentName = "RectTransform"
},
TipsContent = {
sComponentName = "RectTransform"
},
TipsView = {sComponentName = "ScrollRect"},
goSkillDetailItem = {
sNodeName = "SoldierCharSkillDetailItem",
ComponentName = "Transform"
}
}
SoldierCharSkillDetailCtrl._mapEventConfig = {}
SoldierCharSkillDetailCtrl._mapRedDotConfig = {}
SoldierCharSkillDetailCtrl.maxTipHeight = 896
function SoldierCharSkillDetailCtrl:Awake()
self._tbItems = {}
self._nCharId = 0
self._nStar = 1
self._mapNode.goSkillDetailItem.gameObject:SetActive(false)
end
function SoldierCharSkillDetailCtrl:OnEnable()
local tbParam = self:GetPanelParam()
if type(tbParam) == "table" then
self.rtTarget = tbParam[1]
self._nCharId = tbParam[2]
self._nStar = tbParam[3] or 1
self._bFront = tbParam[4] or false
end
self._mapNode.btnCloseWordTip.gameObject:SetActive(false)
self._mapNode.imgWordTipBg:SetActive(false)
if self._mapNode.btnShortcutClose ~= nil then
self:EnableGamepadUI(self._mapNode.btnShortcutClose, true)
end
self:_RefreshSkillList()
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
if self._mapNode == nil then
return
end
LayoutRebuilder.ForceRebuildLayoutImmediate(self._mapNode.TipsContent)
local nContentHeight = self._mapNode.TipsContent.rect.height
local bExceed = nContentHeight > self.maxTipHeight
if bExceed then
nContentHeight = self.maxTipHeight
end
if self._mapNode.TipsView ~= nil then
NovaAPI.SetScrollRectVertical(self._mapNode.TipsView, bExceed)
end
if self._mapNode.imgTipsBg ~= nil then
self._mapNode.imgTipsBg.sizeDelta = Vector2(self._mapNode.imgTipsBg.sizeDelta.x, nContentHeight)
end
if self.rtTarget ~= nil and self._mapNode.rtContent ~= nil and self._mapNode.safeAreaRoot ~= nil then
self:SetTipsPosition(self.rtTarget, self._mapNode.rtContent, self._mapNode.safeAreaRoot)
end
end
cs_coroutine.start(wait)
end
function SoldierCharSkillDetailCtrl:OnDisable()
self:DisableGamepadUI()
self:_ClearItems()
end
function SoldierCharSkillDetailCtrl:OnDestroy()
end
function SoldierCharSkillDetailCtrl:OnBtnClick_ClosePanel()
EventManager.Hit(EventId.ClosePanel, self._panel._nPanelId)
end
function SoldierCharSkillDetailCtrl:OnBtnClick_CloseWord(btn)
self._mapNode.btnCloseWordTip.gameObject:SetActive(false)
self._mapNode.imgWordTipBg:SetActive(false)
end
function SoldierCharSkillDetailCtrl:_RefreshSkillList()
if self._nCharId == nil or self._nCharId == 0 then
return
end
local mapCfg = ConfigTable.GetData("SoldierCharacter", self._nCharId)
if mapCfg == nil then
printError("[SoldierCharSkillDetailCtrl] SoldierCharacter 表找不到数据,id=" .. tostring(self._nCharId))
return
end
local tbSlots = self._bFront and {
{
nSkillId = mapCfg.Skill,
nIndex = 2
}
} or {
{
nSkillId = mapCfg.Support,
nIndex = 3
}
}
for _, slot in ipairs(tbSlots) do
if slot.nSkillId ~= nil and slot.nSkillId ~= 0 then
local goItem = instantiate(self._mapNode.goSkillDetailItem.gameObject, self._mapNode.TipsContent)
goItem:SetActive(true)
local objCtrl = self:BindCtrlByNode(goItem, "Game.UI.Soldier.CharacterTips.Items.SoldierCharSkillDetailItemCtrl")
objCtrl:SetData(slot.nSkillId, slot.nIndex, self._nStar)
table.insert(self._tbItems, objCtrl)
end
end
end
function SoldierCharSkillDetailCtrl:_ClearItems()
if type(self._tbItems) ~= "table" then
return
end
for _, objCtrl in ipairs(self._tbItems) do
local goItem = objCtrl.gameObject
self:UnbindCtrlByNode(objCtrl)
if goItem ~= nil and goItem:IsNull() == false then
destroy(goItem)
end
end
self._tbItems = {}
end
return SoldierCharSkillDetailCtrl
@@ -0,0 +1,23 @@
local SoldierCharSkillDetailPanel = class("SoldierCharSkillDetailPanel", BasePanel)
SoldierCharSkillDetailPanel._bIsMainPanel = false
SoldierCharSkillDetailPanel._bAddToBackHistory = false
SoldierCharSkillDetailPanel._sSortingLayerName = AllEnum.SortingLayerName.UI_Top
SoldierCharSkillDetailPanel._tbDefine = {
{
sPrefabPath = "Soldier/Tips/SoldierCharSkillDetailPanel.prefab",
sCtrlName = "Game.UI.Soldier.CharacterTips.SoldierCharSkillDetailCtrl"
}
}
function SoldierCharSkillDetailPanel:Awake()
end
function SoldierCharSkillDetailPanel:OnEnable()
end
function SoldierCharSkillDetailPanel:OnAfterEnter()
end
function SoldierCharSkillDetailPanel:OnDisable()
end
function SoldierCharSkillDetailPanel:OnDestroy()
end
function SoldierCharSkillDetailPanel:OnRelease()
end
return SoldierCharSkillDetailPanel
@@ -0,0 +1,138 @@
local SoldierCharSkillPreviewCtrl = class("SoldierCharSkillPreviewCtrl", BaseCtrl)
SoldierCharSkillPreviewCtrl._mapNodeConfig = {
rtToggleStar = {},
btnLevel = {
nCount = 3,
sComponentName = "UIButton",
callback = "OnBtnClick_BtnLevel"
},
imgOn = {nCount = 3},
imgOff = {nCount = 3},
ScrollRoot = {
sComponentName = "LoopScrollView"
},
bgClosePanel = {
sComponentName = "UIButton",
callback = "OnBtnClick_ClosePanel"
},
grid = {
sComponentName = "RectTransform"
}
}
SoldierCharSkillPreviewCtrl._mapEventConfig = {}
SoldierCharSkillPreviewCtrl._mapRedDotConfig = {}
function SoldierCharSkillPreviewCtrl:Awake()
self._tbItems = {}
self._nCharId = 0
self._nCurLevel = 0
self.mapSkillItemCtrl = {}
self._nSkillIndex = 2
end
function SoldierCharSkillPreviewCtrl:OnEnable()
local tbParam = self:GetPanelParam()
if type(tbParam) == "table" then
self._nCharId = tbParam[1]
self._nSkillIndex = tbParam[2]
end
self:SetData()
end
function SoldierCharSkillPreviewCtrl:OnDisable()
end
function SoldierCharSkillPreviewCtrl:OnDestroy()
end
function SoldierCharSkillPreviewCtrl:SetData()
local bShowToggle = self._nCurLevel == nil or self._nCurLevel == 0
if bShowToggle then
self._nCurLevel = 1
end
self._mapNode.rtToggleStar.gameObject:SetActive(bShowToggle)
if bShowToggle then
self:_RefreshLevelTabUI()
end
self:_RefreshSkillList()
end
function SoldierCharSkillPreviewCtrl:Show(bShow)
if self.gameObject ~= nil and self.gameObject:IsNull() == false then
self.gameObject:SetActive(bShow == true)
end
end
function SoldierCharSkillPreviewCtrl:OnBtnClick_BtnLevel(btn, nIdx)
if type(nIdx) ~= "number" then
return
end
if nIdx < 1 or 3 < nIdx then
return
end
if self._nCurLevel == nIdx then
return
end
self._nCurLevel = nIdx
self:_RefreshLevelTabUI(nIdx)
self:_RefreshSkillList(nIdx)
end
function SoldierCharSkillPreviewCtrl:OnBtnClick_ClosePanel()
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierCharSkillPreview)
end
function SoldierCharSkillPreviewCtrl:_RefreshLevelTabUI()
if type(self._mapNode.imgOn) == "table" then
for i, goImgOn in ipairs(self._mapNode.imgOn) do
goImgOn.gameObject:SetActive(i == self._nCurLevel)
end
end
if type(self._mapNode.imgOff) == "table" then
for i, goImgOff in ipairs(self._mapNode.imgOff) do
goImgOff.gameObject:SetActive(i ~= self._nCurLevel)
end
end
end
function SoldierCharSkillPreviewCtrl:_RefreshSkillList()
if self._nCharId == nil or self._nCharId == 0 then
return
end
self.tbAllSkillIds = {}
local mapCfg = ConfigTable.GetData("SoldierCharacter", self._nCharId)
local tbSkillId = {}
if self._nSkillIndex == 2 then
tbSkillId = {
mapCfg.Skill
}
else
tbSkillId = {
mapCfg.Support
}
end
for nIndex, nSkillId in ipairs(tbSkillId) do
if nSkillId ~= nil and nSkillId ~= 0 then
table.insert(self.tbAllSkillIds, {
nId = nSkillId,
nIndex = self._nSkillIndex
})
end
end
self:CalGridHeight()
self._mapNode.ScrollRoot:InitEx(self.tbAllSkillIdHeight, self, self.OnRefreshSkillItem)
end
function SoldierCharSkillPreviewCtrl:CalGridHeight()
self.tbAllSkillIdHeight = {}
for _, skill in ipairs(self.tbAllSkillIds) do
local nSkillId = skill.nId
local skillCfg = ConfigTable.GetData("Skill", nSkillId)
local sDesc = UTILS.ParseDesc(skillCfg, GameEnum.levelTypeData.SoldierLevel, nil, false, nil, self._nCurLevel)
local txtDesc = self._mapNode.grid.transform:Find("ImgdescBg/txt_desc"):GetComponent("TMP_Text")
NovaAPI.SetTMPText(txtDesc, sDesc)
CS.UnityEngine.UI.LayoutRebuilder.ForceRebuildLayoutImmediate(self._mapNode.grid)
local nHeight = self._mapNode.grid.sizeDelta.y
table.insert(self.tbAllSkillIdHeight, nHeight)
end
end
function SoldierCharSkillPreviewCtrl:OnRefreshSkillItem(goGrid, gridIndex)
local index = gridIndex + 1
local nInstanceId = goGrid:GetInstanceID()
local objCtrl = self.mapSkillItemCtrl[nInstanceId]
if objCtrl == nil then
objCtrl = self:BindCtrlByNode(goGrid, "Game.UI.Soldier.CharacterTips.Items.SoldierCharSkillDetailItemCtrl")
self.mapSkillItemCtrl[nInstanceId] = objCtrl
end
objCtrl:SetData(self.tbAllSkillIds[index].nId, self.tbAllSkillIds[index].nIndex, self._nCurLevel, index == #self.tbAllSkillIds)
end
return SoldierCharSkillPreviewCtrl
@@ -0,0 +1,23 @@
local SoldierCharSkillPreviewPanel = class("SoldierCharSkillPreviewPanel", BasePanel)
SoldierCharSkillPreviewPanel._bIsMainPanel = false
SoldierCharSkillPreviewPanel._bAddToBackHistory = false
SoldierCharSkillPreviewPanel._sSortingLayerName = AllEnum.SortingLayerName.UI_Top
SoldierCharSkillPreviewPanel._tbDefine = {
{
sPrefabPath = "Soldier/Tips/SoldierCharSkillPreviewPanel.prefab",
sCtrlName = "Game.UI.Soldier.CharacterTips.SoldierCharSkillPreviewCtrl"
}
}
function SoldierCharSkillPreviewPanel:Awake()
end
function SoldierCharSkillPreviewPanel:OnEnable()
end
function SoldierCharSkillPreviewPanel:OnAfterEnter()
end
function SoldierCharSkillPreviewPanel:OnDisable()
end
function SoldierCharSkillPreviewPanel:OnDestroy()
end
function SoldierCharSkillPreviewPanel:OnRelease()
end
return SoldierCharSkillPreviewPanel
@@ -0,0 +1,533 @@
local CommonTipsBaseCtrl = require("Game.UI.CommonTipsEx.CommonTipsBaseCtrl")
local SoldierAttrData = require("GameCore.Data.DataClass.Soldier.SoldierAttrData")
local LayoutRebuilder = CS.UnityEngine.UI.LayoutRebuilder
local SoldierCharTipsCtrl = class("SoldierCharTipsCtrl", CommonTipsBaseCtrl)
SoldierCharTipsCtrl._mapNodeConfig = {
btnCloseTips = {
sComponentName = "UIButton",
callback = "OnBtnClick_ClosePanel"
},
rtContent = {
sComponentName = "RectTransform"
},
safeAreaRoot = {
sNodeName = "----SafeAreaRoot----",
sComponentName = "RectTransform"
},
btnCloseWordTip = {
sComponentName = "Button",
callback = "OnBtnClick_CloseWord"
},
imgWordTipBg = {},
TMPWordDesc = {sComponentName = "TMP_Text"},
TMPWordTipsTitle = {sComponentName = "TMP_Text"},
imgTipsBg = {
sComponentName = "RectTransform"
},
TipsContent = {
sComponentName = "RectTransform"
},
ScrollView = {sComponentName = "ScrollRect"},
rtDescContent = {
sComponentName = "RectTransform"
},
srDesc = {
sComponentName = "RectTransform"
},
tc_char_small = {
sCtrlName = "Game.UI.Soldier.Template.Character.SoldierCharItemCtrl"
},
txtTitleName = {sComponentName = "TMP_Text"},
txtCost = {sComponentName = "TMP_Text"},
txtChessType = {sComponentName = "TMP_Text"},
goStar = {sNodeName = "Star", nCount = 5},
goPartnerRootLayout = {sComponentName = "Transform"},
goPartnerItem = {sComponentName = "Transform"},
imgHpBar = {
sComponentName = "RectTransform"
},
imgHpFill = {sComponentName = "Image"},
txtHp = {sComponentName = "TMP_Text"},
imgEnergyBar = {
sComponentName = "RectTransform"
},
imgEnergyFill = {sComponentName = "Image"},
txtEnergy = {sComponentName = "TMP_Text"},
goAttrGridLayout = {sComponentName = "Transform"},
goPropertyItem = {sComponentName = "Transform"},
goBaseInfo = {
sComponentName = "RectTransform"
},
btnTabFront = {
sComponentName = "UIButton",
callback = "OnBtnClick_Front"
},
btnTabSupport = {
sComponentName = "UIButton",
callback = "OnBtnClick_Support"
},
txtTitleSkill = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Handbook_SkillTitle"
},
goSkillItem = {
nCount = 3,
sCtrlName = "Game.UI.Soldier.CharacterTips.Items.SoldierCharSkillItemCtrl"
},
btnSkillItem = {
nCount = 3,
sNodeName = "goSkillItem",
sComponentName = "UIButton",
callback = "OnBtnClick_SkillItem"
},
txtTitlePotential = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Handbook_PotentialTitle"
},
goPotentialList = {sComponentName = "Transform"},
goPotentialItem = {sComponentName = "Transform"},
go_Vanguard_on = {},
go_Vanguard_off = {},
go_Support_on = {},
go_Support_off = {},
txt_Vanguard_on = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Vanguard_Skill"
},
txt_Vanguard_off = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Vanguard_Skill"
},
txt_Support_on = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Support_Skill"
},
txt_Support_off = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Support_Skill"
},
icon_Position = {sComponentName = "Image"},
btnShortcutClose = {
callback = "OnBtnClick_ClosePanel"
},
imgBg_Rare = {sComponentName = "Image"},
img_Rare = {sComponentName = "Image"},
trSkillDetail = {sComponentName = "Transform"},
trPontentialDetail = {sComponentName = "Transform"},
trPartnerDetail = {sComponentName = "Transform"},
imgBG = {sNodeName = "----BG----", sComponentName = "Image"}
}
SoldierCharTipsCtrl._mapEventConfig = {
OnSetTipsPosition = "OnEvent_SetTipsPosition",
SoldierCharTips_ShowBg = "OnEvent_ShowBg"
}
SoldierCharTipsCtrl._mapRedDotConfig = {}
SoldierCharTipsCtrl.minTipHeight = 59.13
SoldierCharTipsCtrl.maxTipHeight = 896
local iconPath = "Icon/SoldierOtherIcon/"
local iconPartnerPath = "Icon/SoldierPartner/"
local ImgChessRarity = {
[GameEnum.ChessRarity.Gold] = "ChessQuality_05_XL",
[GameEnum.ChessRarity.Purple] = "ChessQuality_04_XL",
[GameEnum.ChessRarity.Blue] = "ChessQuality_03_XL",
[GameEnum.ChessRarity.Green] = "ChessQuality_02_XL",
[GameEnum.ChessRarity.White] = "ChessQuality_01_XL"
}
local tbColor = {
"#d5ddec",
"#d8e8b6",
"#a0c8fe",
"#caaefa",
"#fecc88"
}
function SoldierCharTipsCtrl:Awake()
self._tbPartnerItems = {}
self._tbPropertyItems = {}
self._tbPotentialItems = {}
local tbParam = self:GetPanelParam()
if type(tbParam) == "table" then
self.rtTarget = tbParam[1]
self.tbData = tbParam[2]
self.tbDeployedChess = tbParam[3] or {}
self.tbPartner = tbParam[4] or {}
self.tbCurAttr = tbParam[5] or {}
end
end
function SoldierCharTipsCtrl:OnEnable()
self._mapNode.btnCloseWordTip.gameObject:SetActive(false)
self._mapNode.imgWordTipBg:SetActive(false)
if self._mapNode.btnShortcutClose ~= nil then
self:EnableGamepadUI(self._mapNode.btnShortcutClose, true)
end
self.nId = self.tbData.nId
if self.nId ~= nil then
self:Refresh(self.nId, self.tbData)
end
if self.rtTarget ~= nil and self._mapNode.rtContent ~= nil and self._mapNode.safeAreaRoot ~= nil then
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
if self._mapNode == nil then
return
end
local nContentHeight = self._mapNode.rtDescContent.sizeDelta.y
if nContentHeight > self.maxTipHeight then
nContentHeight = self.maxTipHeight
NovaAPI.SetScrollRectVertical(self._mapNode.ScrollView, true)
end
if nContentHeight < self.minTipHeight then
nContentHeight = self.minTipHeight
NovaAPI.SetScrollRectVertical(self._mapNode.ScrollView, false)
end
self._mapNode.srDesc.sizeDelta = Vector2(self._mapNode.srDesc.sizeDelta.x, nContentHeight)
local nBaseInfoHeight = 0
if self._mapNode.goBaseInfo ~= nil then
LayoutRebuilder.ForceRebuildLayoutImmediate(self._mapNode.goBaseInfo)
nBaseInfoHeight = self._mapNode.goBaseInfo.rect.height
end
self._mapNode.imgTipsBg.sizeDelta = Vector2(self._mapNode.imgTipsBg.sizeDelta.x, nContentHeight + nBaseInfoHeight)
self._mapNode.srDesc.gameObject:SetActive(false)
self:SetTipsPosition(self.rtTarget, self._mapNode.rtContent, self._mapNode.safeAreaRoot)
self._mapNode.srDesc.gameObject:SetActive(true)
if self.bSetTipsPos ~= true then
self._mapNode.trSkillDetail.position = self._mapNode.imgTipsBg.position
self._mapNode.trPontentialDetail.position = self._mapNode.imgTipsBg.position
self._mapNode.trPartnerDetail.position = self._mapNode.imgTipsBg.position
end
end
cs_coroutine.start(wait)
end
end
function SoldierCharTipsCtrl:OnDisable()
self:DisableGamepadUI()
self:_ClearPartnerTags()
self:_ClearPropertyItems()
self:_ClearPotentialItems()
end
function SoldierCharTipsCtrl:OnDestroy()
end
function SoldierCharTipsCtrl:Refresh(nId, tbData)
self.nId = nId
self.tbData = tbData
local mapCfg = ConfigTable.GetData("SoldierCharacter", nId)
if mapCfg == nil then
printError("[SoldierCharTipsCtrl] SoldierCharacter 表找不到数据,id" .. tostring(nId))
return
end
self.mapCfg = mapCfg
self:_SetBaseInfo(mapCfg, tbData)
self:_SetAttr(mapCfg, tbData)
self:_SetPotentials(mapCfg)
self:_RefreshTabSelect(self.bChosenFont)
self:_SetSkills(mapCfg, self.bChosenFont)
end
function SoldierCharTipsCtrl:_SetPotentials(mapCfg)
self._mapNode.goPotentialItem.gameObject:SetActive(false)
local tbList = {}
for nStar = 1, 4 do
local tbIds = mapCfg["Potential" .. nStar]
if type(tbIds) == "table" then
for _, nId in ipairs(tbIds) do
if nId ~= nil and nId ~= 0 then
tbList[#tbList + 1] = {nId = nId, nStar = nStar}
end
end
elseif type(tbIds) == "number" and tbIds ~= 0 then
tbList[#tbList + 1] = {nId = tbIds, nStar = nStar}
end
end
for _, tbItem in ipairs(tbList) do
local goItem = instantiate(self._mapNode.goPotentialItem, self._mapNode.goPotentialList)
goItem.gameObject:SetActive(true)
local objCtrl = self:BindCtrlByNode(goItem, "Game.UI.Soldier.Template.SoldierPotentialItemCtrl")
if objCtrl ~= nil then
local nStar = self.tbData.nStar
objCtrl:SetItemData(tbItem.nId, tbItem.nStar)
if nStar < tbItem.nStar then
objCtrl:SetItemLockData(tbItem.nId, tbItem.nStar)
end
self._tbPotentialItems[#self._tbPotentialItems + 1] = objCtrl
end
local btnItem = goItem:GetComponent("UIButton")
if btnItem ~= nil then
btnItem.onClick:RemoveAllListeners()
btnItem.onClick:AddListener(function()
self:OnBtnClick_PotentialItem(tbItem)
end)
end
end
end
function SoldierCharTipsCtrl:_SetSkills(mapCfg, bFront)
if mapCfg == nil or type(self._mapNode.goSkillItem) ~= "table" then
return
end
if bFront then
local tbSlots = {
{
nSkillId = mapCfg.Skill,
nSkillIndex = 2
}
}
for i, objCtrl in ipairs(self._mapNode.goSkillItem) do
local slot = tbSlots[i]
if slot ~= nil and slot.nSkillId ~= nil and slot.nSkillId ~= 0 then
objCtrl.gameObject:SetActive(true)
objCtrl:SetData(slot.nSkillId, slot.nSkillIndex)
else
objCtrl.gameObject:SetActive(false)
end
end
else
local nSkillId = mapCfg.Support
for i, objCtrl in ipairs(self._mapNode.goSkillItem) do
if i == 1 and nSkillId ~= nil and nSkillId ~= 0 then
objCtrl.gameObject:SetActive(true)
objCtrl:SetData(nSkillId, 3)
else
objCtrl.gameObject:SetActive(false)
end
end
end
end
function SoldierCharTipsCtrl:_ClearPotentialItems()
if type(self._tbPotentialItems) == "table" then
for _, objCtrl in ipairs(self._tbPotentialItems) do
self:UnbindCtrlByNode(objCtrl)
end
end
self._tbPotentialItems = {}
end
function SoldierCharTipsCtrl:_SetBaseInfo(mapCfg)
self._mapNode.tc_char_small:SetItemData(mapCfg.Id)
self._mapNode.tc_char_small:SetCharLevel(self.tbData.nStar)
NovaAPI.SetTMPText(self._mapNode.txtTitleName, mapCfg.Name)
NovaAPI.SetTMPText(self._mapNode.txtCost, mapCfg.Cost)
local nChessType = mapCfg.Type
local tbChessTypeConfig = CacheTable.GetData("_SoldierChessType", nChessType)
NovaAPI.SetTMPText(self._mapNode.txtChessType, tbChessTypeConfig.Name)
self:SetPngSprite(self._mapNode.icon_Position, iconPath .. tbChessTypeConfig.Icon)
self:_SetPartnerTags(mapCfg)
self:_SetStar(mapCfg)
self:SetPngSprite(self._mapNode.imgBg_Rare, iconPath .. ImgChessRarity[mapCfg.Rarity])
local _, rareColor = ColorUtility.TryParseHtmlString(tbColor[mapCfg.Rarity])
NovaAPI.SetImageColor(self._mapNode.img_Rare, rareColor)
if self.tbData.nPositionType == GameEnum.SoldierPositionType.FightPosition then
nChessType = GameEnum.ChessType.Vanguard
elseif self.tbData.nPositionType == GameEnum.SoldierPositionType.SupportPosition then
nChessType = GameEnum.ChessType.Support
end
if nChessType == GameEnum.ChessType.Balance or nChessType == GameEnum.ChessType.Vanguard then
self:OnBtnClick_Front()
else
self:OnBtnClick_Support()
end
end
local _TransValueFormat = function(nValue, bPercent, nFormat)
return FormatEffectValue(nValue, bPercent, nFormat)
end
function SoldierCharTipsCtrl:_SetAttr(mapCfg)
self:_ClearPropertyItems()
self._mapNode.goPropertyItem.gameObject:SetActive(false)
local nStar = type(self.tbData) == "table" and self.tbData.nStar or mapCfg.MaxStar or 1
local tbAttrSortList, tbAttrMap = SoldierAttrData.CalcCharacterAttr(mapCfg.Id, nStar, self.tbDeployedChess, self.tbPartner)
if type(tbAttrSortList) ~= "table" then
return
end
if type(self.tbCurAttr) == "table" and next(self.tbCurAttr) ~= nil then
local attrKeyMap = {
Hp = "hp",
HpMax = "hpMax",
Energy = "nMaxEnergy",
Atk = "atk",
Def = "def",
Recovery = "nRecoverRate",
CritRate = "critRate",
CritPower = "critPower",
AttackSpeed = "attackSpeed"
}
for _, mapAttr in ipairs(tbAttrSortList) do
local curAttrKey = attrKeyMap[mapAttr.sKey]
if curAttrKey ~= nil and self.tbCurAttr[curAttrKey] ~= nil then
mapAttr.nValue = self.tbCurAttr[curAttrKey]
print("[SoldierCharTipsCtrl] 实时属性覆盖:", mapAttr.sKey, "=", mapAttr.nValue)
end
end
if tbAttrMap and tbAttrMap.InitialEnergy and self.tbCurAttr.nEnergy ~= nil then
tbAttrMap.InitialEnergy.nValue = self.tbCurAttr.nEnergy
end
end
for _, mapAttr in ipairs(tbAttrSortList) do
local sKey = mapAttr.sKey
if sKey == "Hp" then
local nHp = type(self.tbCurAttr) == "table" and self.tbCurAttr.hp ~= nil and self.tbCurAttr.hp or mapAttr.nValue or 0
local nMaxHp = type(self.tbCurAttr) == "table" and self.tbCurAttr.hpMax ~= nil and self.tbCurAttr.hpMax or mapAttr.nValue or 0
self:_SetBar(self._mapNode.imgHpFill, self._mapNode.txtHp, nHp, nMaxHp, self._mapNode.imgHpBar)
elseif sKey == "Energy" then
local nMaxEnergy = mapAttr.nValue or 0
local nInitEnergy = tbAttrMap and tbAttrMap.InitialEnergy and tbAttrMap.InitialEnergy.nValue or 0
self:_SetBar(self._mapNode.imgEnergyFill, self._mapNode.txtEnergy, nInitEnergy, nMaxEnergy, self._mapNode.imgEnergyBar)
elseif sKey ~= "InitialEnergy" then
local mapAttributeDesc = CacheTable.GetData("_AttributeDesc", sKey)
if mapAttributeDesc ~= nil then
local goItem = instantiate(self._mapNode.goPropertyItem, self._mapNode.goAttrGridLayout)
goItem.gameObject:SetActive(true)
local trIcon = goItem:Find("imgIcon")
if trIcon ~= nil and mapAttributeDesc.Icon and 0 < #mapAttributeDesc.Icon then
local img = trIcon:GetComponent("Image")
if img ~= nil then
self:SetPngSprite(img, mapAttributeDesc.Icon)
end
end
local trName = goItem:Find("txtProperty")
if trName ~= nil then
local tmp = trName:GetComponent("TMP_Text")
if tmp ~= nil then
local sName
if mapAttr.sLanguageId ~= nil then
sName = ConfigTable.GetUIText(mapAttr.sLanguageId)
else
sName = mapAttributeDesc.Desc or ""
end
NovaAPI.SetTMPText(tmp, sName)
end
end
local trValue = goItem:Find("txtValue2")
if trValue ~= nil then
local tmp = trValue:GetComponent("TMP_Text")
if tmp ~= nil then
local sValue = _TransValueFormat(mapAttr.nValue or 0, mapAttributeDesc.isPercent, mapAttributeDesc.Format)
NovaAPI.SetTMPText(tmp, sValue)
print("[SoldierCharTipsCtrl] 属性值:", sKey, "=", sValue)
end
end
self._tbPropertyItems[#self._tbPropertyItems + 1] = goItem
end
end
end
end
function SoldierCharTipsCtrl:_ClearPropertyItems()
if type(self._tbPropertyItems) == "table" then
for _, goItem in ipairs(self._tbPropertyItems) do
if goItem ~= nil and goItem:IsNull() == false then
destroy(goItem.gameObject)
end
end
end
self._tbPropertyItems = {}
end
function SoldierCharTipsCtrl:_SetPartnerTags(mapCfg)
self:_ClearPartnerTags()
self._mapNode.goPartnerItem.gameObject:SetActive(false)
local tbPartner = mapCfg.PartnerType
if type(tbPartner) ~= "table" then
return
end
for _, nPartnerType in ipairs(tbPartner) do
local mapGroup = CacheTable.GetData("_SoldierPartnerGroup", nPartnerType)
if mapGroup ~= nil then
local goItem = instantiate(self._mapNode.goPartnerItem, self._mapNode.goPartnerRootLayout)
goItem.gameObject:SetActive(true)
local txtPartner = goItem:Find("txtPartner")
if txtPartner ~= nil then
local tmp = txtPartner:GetComponent("TMP_Text")
if tmp ~= nil then
NovaAPI.SetTMPText(tmp, mapGroup.Name or "")
end
local trIcon = goItem:Find("imgIcon")
if trIcon ~= nil and mapGroup.Icon and #mapGroup.Icon > 0 then
local img = trIcon:GetComponent("Image")
if img ~= nil then
self:SetPngSprite(img, iconPartnerPath .. mapGroup.Icon .. "_M")
end
end
end
local btnPartner = goItem:GetComponent("UIButton")
if btnPartner ~= nil then
btnPartner.onClick:RemoveAllListeners()
btnPartner.onClick:AddListener(function()
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierPartnerTips, self._mapNode.trPartnerDetail, nPartnerType, 0, false, {}, false)
end)
end
self._tbPartnerItems[#self._tbPartnerItems + 1] = goItem
end
end
end
function SoldierCharTipsCtrl:_ClearPartnerTags()
if type(self._tbPartnerItems) == "table" then
for _, goItem in ipairs(self._tbPartnerItems) do
if goItem ~= nil and goItem:IsNull() == false then
destroy(goItem.gameObject)
end
end
end
self._tbPartnerItems = {}
end
function SoldierCharTipsCtrl:_SetStar(mapCfg)
local nStar = type(self.tbData) == "table" and self.tbData.nStar or mapCfg.MaxStar or 0
for i = 1, 5 do
if self._mapNode.goStar[i] ~= nil then
self._mapNode.goStar[i]:SetActive(i <= nStar)
end
end
end
function SoldierCharTipsCtrl:_SetBar(imgFill, txt, nCur, nMax, rtBar)
nCur = nCur or 0
nMax = nMax or 0
if imgFill ~= nil and rtBar ~= nil then
LayoutRebuilder.ForceRebuildLayoutImmediate(rtBar)
local nInitWidth = rtBar.rect.width
local rt = imgFill.rectTransform
if rt ~= nil then
local nPct = 0 < nMax and nCur / nMax or 0
rt.sizeDelta = Vector2(nInitWidth * nPct, rt.sizeDelta.y)
end
end
if txt ~= nil then
NovaAPI.SetTMPText(txt, string.format("%s/%s", tostring(nCur), tostring(nMax)))
end
end
function SoldierCharTipsCtrl:OnBtnClick_ClosePanel()
EventManager.Hit(EventId.ClosePanel, self._panel._nPanelId)
end
function SoldierCharTipsCtrl:OnBtnClick_Front()
self:_RefreshTabSelect(true)
self:_SetSkills(self.mapCfg, true)
self.bChosenFont = true
end
function SoldierCharTipsCtrl:OnBtnClick_Support()
self:_RefreshTabSelect(false)
self:_SetSkills(self.mapCfg, false)
self.bChosenFont = false
end
function SoldierCharTipsCtrl:_RefreshTabSelect(bFront)
self._mapNode.go_Vanguard_on.gameObject:SetActive(bFront)
self._mapNode.go_Support_on.gameObject:SetActive(not bFront)
self._mapNode.go_Vanguard_off.gameObject:SetActive(not bFront)
self._mapNode.go_Support_off.gameObject:SetActive(bFront)
end
function SoldierCharTipsCtrl:OnBtnClick_SkillItem(btn, nIndex)
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierCharSkillDetail, self._mapNode.trSkillDetail, self.nId, self.tbData.nStar, self.bChosenFont)
end
function SoldierCharTipsCtrl:OnBtnClick_PotentialItem(tbItem)
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierCharPontentialDetailPanel, self._mapNode.trPontentialDetail, tbItem.nId)
end
function SoldierCharTipsCtrl:OnBtnClick_CloseWord(btn)
self._mapNode.btnCloseWordTip.gameObject:SetActive(false)
self._mapNode.imgWordTipBg:SetActive(false)
end
function SoldierCharTipsCtrl:OnEvent_ShowBg()
self._mapNode.imgBG.enabled = true
end
function SoldierCharTipsCtrl:OnEvent_SetTipsPosition(skillTipsPos, pontentialTipsPos, partnerTipsPos)
self.bSetTipsPos = true
if skillTipsPos ~= nil and self._mapNode.trSkillDetail ~= nil then
self._mapNode.trSkillDetail.position = skillTipsPos
end
if pontentialTipsPos ~= nil and self._mapNode.trPontentialDetail ~= nil then
self._mapNode.trPontentialDetail.position = pontentialTipsPos
end
if partnerTipsPos ~= nil and self._mapNode.trPartnerDetail ~= nil then
self._mapNode.trPartnerDetail.position = partnerTipsPos
end
end
return SoldierCharTipsCtrl
@@ -0,0 +1,23 @@
local SoldierCharTipsPanel = class("SoldierCharTipsPanel", BasePanel)
SoldierCharTipsPanel._bIsMainPanel = false
SoldierCharTipsPanel._bAddToBackHistory = false
SoldierCharTipsPanel._sSortingLayerName = AllEnum.SortingLayerName.UI_Top
SoldierCharTipsPanel._tbDefine = {
{
sPrefabPath = "Soldier/Tips/SoldierCharCardTipsPanel.prefab",
sCtrlName = "Game.UI.Soldier.CharacterTips.SoldierCharTipsCtrl"
}
}
function SoldierCharTipsPanel:Awake()
end
function SoldierCharTipsPanel:OnEnable()
end
function SoldierCharTipsPanel:OnAfterEnter()
end
function SoldierCharTipsPanel:OnDisable()
end
function SoldierCharTipsPanel:OnDestroy()
end
function SoldierCharTipsPanel:OnRelease()
end
return SoldierCharTipsPanel
@@ -0,0 +1,195 @@
local BaseCtrl = require("GameCore.UI.BaseCtrl")
local SoldierGoldTipsCtrl = class("SoldierGoldTipsCtrl", BaseCtrl)
SoldierGoldTipsCtrl._mapNodeConfig = {
btnClose = {
sComponentName = "UIButton",
callback = "OnBtnClick_Close"
},
txt_glodTitle = {
sNodeName = "txt_glodTitle",
sComponentName = "TMP_Text",
sLanguageId = "Soldier_GoldTips_Title"
},
txt_desc = {sNodeName = "txt_desc", sComponentName = "TMP_Text"},
txt_IncomeTitle = {
sNodeName = "txt_IncomeTitle",
sComponentName = "TMP_Text",
sLanguageId = "Soldier_GoldTips_Income"
},
txt_WinningstreakTitle = {
sNodeName = "txt_WinningstreakTitle",
sComponentName = "TMP_Text"
},
IncomeRoot = {sNodeName = "IncomeRoot", sComponentName = "Transform"},
IncomeItem = {},
WinningstreakRoot = {
sNodeName = "WinningstreakRoot",
sComponentName = "Transform"
},
WinningstreakItem = {}
}
SoldierGoldTipsCtrl._mapEventConfig = {}
SoldierGoldTipsCtrl._mapRedDotConfig = {}
local RootPath = "UI/Soldier/SpriteAtlas/Sandbox/"
function SoldierGoldTipsCtrl:Awake()
self:ParseConfig()
end
function SoldierGoldTipsCtrl:OnEnable()
self:OnRefresh()
end
function SoldierGoldTipsCtrl:OnDisable()
end
function SoldierGoldTipsCtrl:OnDestroy()
end
function SoldierGoldTipsCtrl:OnBtnClick_Close()
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierGoldTips)
end
function SoldierGoldTipsCtrl:OnRefresh()
self:_RefreshDes()
self:_RefreshIncameItems()
self:_RefreshStreakItems()
end
function SoldierGoldTipsCtrl:ParseConfig()
local sSoldierCoinWinningStreak = ConfigTable.GetConfigValue("SoldierCoinWinningStreak")
self.tbWinningStreak = {}
if sSoldierCoinWinningStreak ~= nil then
local tbSoldierCoinWinningStreak = decodeJson(sSoldierCoinWinningStreak)
for k, v in pairs(tbSoldierCoinWinningStreak) do
table.insert(self.tbWinningStreak, {
nCount = tonumber(k),
nReward = v
})
end
table.sort(self.tbWinningStreak, function(a, b)
return a.nCount < b.nCount
end)
end
local sSoldierCoinLosingStreak = ConfigTable.GetConfigValue("SoldierCoinLosingStreak")
self.tbLosingStreak = {}
if sSoldierCoinLosingStreak ~= nil then
local tbSoldierCoinLosingStreak = decodeJson(sSoldierCoinLosingStreak)
for k, v in pairs(tbSoldierCoinLosingStreak) do
table.insert(self.tbLosingStreak, {
nCount = tonumber(k),
nReward = v
})
end
table.sort(self.tbLosingStreak, function(a, b)
return a.nCount < b.nCount
end)
end
local sSoldierCoinInterest = ConfigTable.GetConfigValue("SoldierCoinInterest")
self.nCoinInterestCount = 1
self.nCoinInterestRatio = 1
self.nCoinInterestMax = 0
if sSoldierCoinInterest ~= nil then
local tbSoldierCoinInterest = string.split(sSoldierCoinInterest, ",")
self.nCoinInterestCount = tonumber(tbSoldierCoinInterest[1]) or 0
self.nCoinInterestRatio = tonumber(tbSoldierCoinInterest[2]) or 1
self.nCoinInterestMax = tonumber(tbSoldierCoinInterest[3]) or 0
end
end
function SoldierGoldTipsCtrl:_RefreshDes()
if self._mapNode.txt_desc == nil then
return
end
local str = orderedFormat(ConfigTable.GetUIText("Soldier_GoldTips_Desc"), self.nCoinInterestCount, self.nCoinInterestRatio, self.nCoinInterestMax)
NovaAPI.SetTMPText(self._mapNode.txt_desc, str)
end
function SoldierGoldTipsCtrl:_RefreshIncameItems()
self.tbIncomeItems = {}
local curLevelData = PlayerData.SoldierData:GetCurLevelData()
local nCurNodeId = curLevelData:GetNodeId()
local nodeConfig = ConfigTable.GetData("SoldierNodePlan", nCurNodeId)
if nodeConfig ~= nil and nodeConfig.Coin > 0 then
table.insert(self.tbIncomeItems, {
sDesc = ConfigTable.GetUIText("Soldier_GoldTips_BasicReward"),
nCoin = nodeConfig.Coin
})
end
self.nWiningStreak, self.nLosingStreak = curLevelData:GetStreakCount()
if 0 < self.nWiningStreak or 0 < self.nLosingStreak then
local nCurStreak = 0 < self.nWiningStreak and self.nWiningStreak or self.nLosingStreak
local tbTargetStreak = 0 < self.nWiningStreak and self.tbWinningStreak or self.tbLosingStreak
local sStreakText = 0 < self.nWiningStreak and ConfigTable.GetUIText("Soldier_GoldTips_Winningstreak") or ConfigTable.GetUIText("Soldier_GoldTips_Losingingstreak")
local targetData
for _, data in pairs(tbTargetStreak) do
if nCurStreak >= data.nCount then
targetData = data
else
break
end
end
if targetData ~= nil then
table.insert(self.tbIncomeItems, {
sDesc = orderedFormat(sStreakText, targetData.nCount),
nCoin = targetData.nReward
})
end
end
self.bWinningStreak = 0 < self.nWiningStreak or self.nWiningStreak == 0 and self.nLosingStreak == 0
local curTotalCoin = curLevelData:GetItem(AllEnum.CoinItemId.SoldierCurrency)
local nInterestCoin = math.floor(curTotalCoin / self.nCoinInterestCount) * self.nCoinInterestRatio
nInterestCoin = math.min(nInterestCoin, self.nCoinInterestMax)
if 0 < nInterestCoin then
table.insert(self.tbIncomeItems, {
sDesc = orderedFormat(ConfigTable.GetUIText("Soldier_GoldTips_Interest"), self.nCoinInterestCount, self.nCoinInterestRatio, self.nCoinInterestMax),
nCoin = nInterestCoin
})
end
for i = 1, #self.tbIncomeItems do
local item = self.tbIncomeItems[i]
if self._mapNode.IncomeItem ~= nil then
local itemNode = instantiate(self._mapNode.IncomeItem, self._mapNode.IncomeRoot)
self:RefreshItems(itemNode, item.nCoin, item.sDesc)
end
end
self._mapNode.IncomeItem.gameObject:SetActive(false)
if self.bWinningStreak then
NovaAPI.SetTMPText(self._mapNode.txt_WinningstreakTitle, ConfigTable.GetUIText("Soldier_GoldTips_Winningstreak"))
else
NovaAPI.SetTMPText(self._mapNode.txt_WinningstreakTitle, ConfigTable.GetUIText("Soldier_GoldTips_Losingingstreak"))
end
end
function SoldierGoldTipsCtrl:_RefreshStreakItems()
self.tbStreakItems = {}
local str = self.bWinningStreak and ConfigTable.GetUIText("Soldier_GoldTips_Winningstreak") or ConfigTable.GetUIText("Soldier_GoldTips_Losingingstreak")
NovaAPI.SetTMPText(self._mapNode.WinningstreakTitle, str)
local tbStreak = self.bWinningStreak and self.tbWinningStreak or self.tbLosingStreak
for i = 1, #tbStreak do
local item = tbStreak[i]
if self._mapNode.WinningstreakItem ~= nil then
local itemNode = instantiate(self._mapNode.WinningstreakItem, self._mapNode.WinningstreakRoot)
local sDesc = ""
if i < #tbStreak then
local minCount = item.nCount
local maxCount = tbStreak[i + 1].nCount - 1
sDesc = minCount .. "-" .. maxCount
else
sDesc = item.nCount .. "+"
end
local nCurStreak = self.bWinningStreak and self.nWiningStreak or self.nLosingStreak
local bCurItem = nCurStreak >= item.nCount and (i == #tbStreak or nCurStreak < tbStreak[i + 1].nCount)
self:RefreshItems(itemNode, item.nReward, sDesc, true, bCurItem)
end
end
self._mapNode.WinningstreakItem.gameObject:SetActive(false)
end
function SoldierGoldTipsCtrl:RefreshItems(goItem, nCoinCount, sDesc, bStreak, bCurItem)
if goItem == nil then
return
end
goItem:SetActive(true)
local txt_Name = goItem.transform:Find("TextName"):GetComponent("TMP_Text")
local txRefreshCount = goItem.transform:Find("txRefreshCount"):GetComponent("TMP_Text")
NovaAPI.SetTMPText(txt_Name, sDesc)
NovaAPI.SetTMPText(txRefreshCount, nCoinCount)
if bStreak == true then
local imgItemLine = goItem.transform:Find("imgItemLine").gameObject
imgItemLine:SetActive(bCurItem)
local imgItemIcon = goItem.transform:Find("imgItemIcon"):GetComponent("Image")
local sIcon = self.bWinningStreak and "icon_soldier_sandbox_chess_2" or "icon_soldier_sandbox_chess_5"
self:SetSprite(imgItemIcon, RootPath .. sIcon)
end
end
return SoldierGoldTipsCtrl
@@ -0,0 +1,23 @@
local BasePanel = require("GameCore.UI.BasePanel")
local SoldierGoldTipsPanel = class("SoldierGoldTipsPanel", BasePanel)
SoldierGoldTipsPanel._bIsMainPanel = false
SoldierGoldTipsPanel._sSortingLayerName = AllEnum.SortingLayerName.UI
SoldierGoldTipsPanel._tbDefine = {
{
sPrefabPath = "Soldier/Tips/SoldierGoldTipsPanel.prefab",
sCtrlName = "Game.UI.Soldier.GoldTipsPanel.SoldierGoldTipsCtrl"
}
}
function SoldierGoldTipsPanel:Awake()
end
function SoldierGoldTipsPanel:OnEnable()
end
function SoldierGoldTipsPanel:OnAfterEnter()
end
function SoldierGoldTipsPanel:OnDisable()
end
function SoldierGoldTipsPanel:OnDestroy()
end
function SoldierGoldTipsPanel:OnRelease()
end
return SoldierGoldTipsPanel
@@ -0,0 +1,148 @@
local SoldierHandbookCardDetailCtrl = class("SoldierHandbookCardDetailCtrl", BaseCtrl)
local RootPath = "Icon/SoldierBuffCard/"
SoldierHandbookCardDetailCtrl._mapNodeConfig = {
img_detailIcon = {sComponentName = "Image"},
txt_name = {sComponentName = "TMP_Text"},
txt_desc = {sComponentName = "TMP_Text"},
go_charListRoot = {},
txt_charTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Detail_CharTitle"
},
btnListChar = {},
charList = {},
Btn_ListChar = {nCount = 3},
tc_char_small = {
nCount = 3,
sCtrlName = "Game.UI.Soldier.Template.Character.SoldierCharItemCtrl"
},
sv_char = {
sComponentName = "LoopScrollView"
}
}
SoldierHandbookCardDetailCtrl._mapEventConfig = {}
SoldierHandbookCardDetailCtrl._mapRedDotConfig = {}
function SoldierHandbookCardDetailCtrl:Awake()
self.mapCharItemCtrl = {}
end
function SoldierHandbookCardDetailCtrl:OnDestroy()
self:Clear()
end
function SoldierHandbookCardDetailCtrl:Clear()
if self.mapCharItemCtrl ~= nil then
for _, v in ipairs(self.mapCharItemCtrl) do
self:UnbindCtrlByNode(v)
end
self.mapCharItemCtrl = {}
end
end
function SoldierHandbookCardDetailCtrl:RefreshStarterCardDetail(nStarterCardId)
if self.animator == nil then
self.animator = self.gameObject:GetComponent("Animator")
end
self.animator:Play("StarterCardDetail_in")
self.tbCharList = {}
local starterCardConfig = ConfigTable.GetData("SoldierStarterCard", nStarterCardId)
if starterCardConfig == nil then
return
end
self:SetPngSprite(self._mapNode.img_detailIcon, RootPath .. starterCardConfig.Icon)
NovaAPI.SetTMPText(self._mapNode.txt_name, starterCardConfig.Name)
NovaAPI.SetTMPText(self._mapNode.txt_desc, UTILS.ParseDesc(starterCardConfig))
self.tbCharList = starterCardConfig.CharacterShow
self._mapNode.go_charListRoot:SetActive(#self.tbCharList > 0)
if #self.tbCharList > 0 then
self._mapNode.charList:SetActive(#self.tbCharList > 3)
self._mapNode.btnListChar:SetActive(#self.tbCharList <= 3)
if #self.tbCharList > 3 then
self._mapNode.sv_char:Init(#self.tbCharList, self, self.OnCharRefreshGrid, self.OnCharGridBtnClick, false)
else
for i = 1, 3 do
local btn_char = self._mapNode.Btn_ListChar[i]
if i <= #self.tbCharList then
local btn = self._mapNode.tc_char_small[i].gameObject:GetComponent("UIButton")
local charId = self.tbCharList[i]
self._mapNode.tc_char_small[i]:SetItemData(charId)
self._mapNode.tc_char_small[i]:SetCharLevel(0)
btn.onClick:RemoveAllListeners()
btn.onClick:AddListener(function()
local chessData = {nId = charId, nStar = 1}
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierCharCardTips, self._mapNode.tc_char_small[i].gameObject.transform, chessData)
end)
end
btn_char:SetActive(i <= #self.tbCharList)
end
end
end
end
function SoldierHandbookCardDetailCtrl:RefreshStrategyCardDetail(nStrategyCardId)
if self.animator == nil then
self.animator = self.gameObject:GetComponent("Animator")
end
self.animator:Play("SoldierHandbookPanelStrategyDetail_in")
self.tbCharList = {}
local strategyCardConfig = ConfigTable.GetData("SoldierStrategyCard", nStrategyCardId)
if strategyCardConfig == nil then
return
end
local imgBg_Gold = self.gameObject.transform:Find("AnimRoot/imgBg_Gold")
local imgBg_Silver = self.gameObject.transform:Find("AnimRoot/imgBg_Silver")
local imgBg_Copper = self.gameObject.transform:Find("AnimRoot/imgBg_Copper")
imgBg_Gold.gameObject:SetActive(strategyCardConfig.Rarity == GameEnum.itemRarity.R)
imgBg_Silver.gameObject:SetActive(strategyCardConfig.Rarity == GameEnum.itemRarity.M)
imgBg_Copper.gameObject:SetActive(strategyCardConfig.Rarity == GameEnum.itemRarity.N)
self:SetPngSprite(self._mapNode.img_detailIcon, RootPath .. strategyCardConfig.Icon)
NovaAPI.SetTMPText(self._mapNode.txt_name, strategyCardConfig.Name)
NovaAPI.SetTMPText(self._mapNode.txt_desc, strategyCardConfig.Desc)
self.tbCharList = strategyCardConfig.CharacterShow
self._mapNode.go_charListRoot:SetActive(#self.tbCharList > 0)
if #self.tbCharList > 0 then
self._mapNode.charList:SetActive(#self.tbCharList > 3)
self._mapNode.btnListChar:SetActive(#self.tbCharList <= 3)
if #self.tbCharList > 3 then
self._mapNode.sv_char:Init(#self.tbCharList, self, self.OnCharRefreshGrid, self.OnCharGridBtnClick, false)
else
for i = 1, 3 do
local btn_char = self._mapNode.Btn_ListChar[i]
if i <= #self.tbCharList then
local btn = self._mapNode.tc_char_small[i].gameObject:GetComponent("UIButton")
local charId = self.tbCharList[i]
self._mapNode.tc_char_small[i]:SetItemData(charId)
self._mapNode.tc_char_small[i]:SetCharLevel(0)
btn.onClick:RemoveAllListeners()
btn.onClick:AddListener(function()
local chessData = {nId = charId, nStar = 1}
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierCharCardTips, self._mapNode.tc_char_small[i].gameObject.transform, chessData)
end)
end
btn_char:SetActive(i <= #self.tbCharList)
end
end
end
end
function SoldierHandbookCardDetailCtrl:OnCharRefreshGrid(goGrid, gridIndex)
local nIndex = gridIndex + 1
local charId = self.tbCharList[nIndex]
local go_char = goGrid.transform:Find("tc_char_small")
local nInstanceId = go_char:GetInstanceID()
if not self.mapCharItemCtrl[nInstanceId] then
self.mapCharItemCtrl[nInstanceId] = self:BindCtrlByNode(go_char, "Game.UI.Soldier.Template.Character.SoldierCharItemCtrl")
end
self.mapCharItemCtrl[nInstanceId]:SetItemData(charId)
self.mapCharItemCtrl[nInstanceId]:SetCharLevel(0)
local btn = go_char.gameObject:GetComponent("UIButton")
btn.onClick:RemoveAllListeners()
btn.onClick:AddListener(function()
local chessData = {nId = charId, nStar = 1}
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierCharCardTips, goGrid.transform, chessData)
end)
end
function SoldierHandbookCardDetailCtrl:OnCharGridBtnClick(goGrid, gridIndex)
local nIndex = gridIndex + 1
local charId = self.tbCharList[nIndex]
local chessData = {nId = charId, nStar = 1}
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierCharCardTips, goGrid.transform, chessData)
end
function SoldierHandbookCardDetailCtrl:OnEvent_AAA()
end
return SoldierHandbookCardDetailCtrl
@@ -0,0 +1,147 @@
local SoldierHandbookCharCtrl = class("SoldierHandbookCharCtrl", BaseCtrl)
local tabType = {
All = 1,
Gold = 2,
Purple = 3,
Blue = 4,
Green = 5,
White = 6
}
local tab2ChessRarity = {
[tabType.All] = 1,
[tabType.Gold] = GameEnum.ChessRarity.Gold,
[tabType.Purple] = GameEnum.ChessRarity.Purple,
[tabType.Blue] = GameEnum.ChessRarity.Blue,
[tabType.Green] = GameEnum.ChessRarity.Green,
[tabType.White] = GameEnum.ChessRarity.White
}
SoldierHandbookCharCtrl._mapNodeConfig = {
btn_tab = {
nCount = 6,
sComponentName = "UIButton",
callback = "OnBtnClick_Tab"
},
tab_On = {nCount = 6},
tab_Off = {nCount = 6},
sv_loop = {
sComponentName = "LoopScrollView"
},
DetailCtrl = {
sNodeName = "DetailRoot",
sCtrlName = "Game.UI.Soldier.Handbook.SoldierHandbookCharDetailCtrl"
}
}
SoldierHandbookCharCtrl._mapEventConfig = {}
SoldierHandbookCharCtrl._mapRedDotConfig = {}
function SoldierHandbookCharCtrl:OnDestroy()
self:Clear()
end
function SoldierHandbookCharCtrl:Clear()
if self.tbItemCtrl ~= nil then
for _, v in ipairs(self.tbItemCtrl) do
self:UnbindCtrlByNode(v)
end
self.tbItemCtrl = {}
end
self._mapNode.DetailCtrl:Clear()
end
function SoldierHandbookCharCtrl:Init()
self.tbItemCtrl = {}
self:InitCharList()
self:SwitchToTab(tabType.All, true)
end
function SoldierHandbookCharCtrl:InitCharList()
self.tbAllChar = {}
self.mapCharByRarity = {}
local actData = PlayerData.Activity:GetActivityDataByType(GameEnum.activityType.Soldier)
if actData == nil then
return
end
local nActId = actData:GetActId()
local seasonConfig = ConfigTable.GetData("SoldierSeason", nActId)
if seasonConfig == nil then
return
end
local func_ForEach_Char = function(mapCharData)
if mapCharData.BoardChess and seasonConfig.ChessGroupId == mapCharData.GroupId then
table.insert(self.tbAllChar, mapCharData)
if self.mapCharByRarity[mapCharData.Rarity] == nil then
self.mapCharByRarity[mapCharData.Rarity] = {}
end
table.insert(self.mapCharByRarity[mapCharData.Rarity], mapCharData)
end
end
ForEachTableLine(DataTable.SoldierCharacter, func_ForEach_Char)
table.sort(self.tbAllChar, function(a, b)
if a.Rarity == b.Rarity then
return a.Id < b.Id
end
return a.Rarity > b.Rarity
end)
for nRarity, tbChar in pairs(self.mapCharByRarity) do
table.sort(tbChar, function(a, b)
return a.Id < b.Id
end)
end
end
function SoldierHandbookCharCtrl:RefreshCharList()
if self.tbItemCtrl ~= nil then
for _, v in ipairs(self.tbItemCtrl) do
self:UnbindCtrlByNode(v)
end
self.tbItemCtrl = nil
end
self.tbItemCtrl = {}
self.tbCurCharList = {}
self.nSelectIndex = 1
if self.nCurTab == tabType.All then
self.tbCurCharList = self.tbAllChar
else
self.tbCurCharList = self.mapCharByRarity[tab2ChessRarity[self.nCurTab]]
end
self._mapNode.sv_loop:Init(#self.tbCurCharList, self, self.OnCharRefreshGrid, self.OnCharGridBtnClick, false)
EventManager.Hit("SoldierHandbookChar_Selected", self.tbCurCharList[self.nSelectIndex].Id)
self:RefreshDetail()
end
function SoldierHandbookCharCtrl:OnCharRefreshGrid(goGrid, gridIndex)
local nIndex = gridIndex + 1
local nInstanceId = goGrid:GetInstanceID()
if not self.tbItemCtrl[nInstanceId] then
self.tbItemCtrl[nInstanceId] = self:BindCtrlByNode(goGrid, "Game.UI.Soldier.Handbook.SoldierHandbookCharItemCtrl")
end
self.tbItemCtrl[nInstanceId]:SetItemData(self.tbCurCharList[nIndex], self.nSelectIndex == nIndex)
end
function SoldierHandbookCharCtrl:OnCharGridBtnClick(goGrid, gridIndex)
local nIndex = gridIndex + 1
self.nSelectIndex = nIndex
EventManager.Hit("SoldierHandbookChar_Selected", self.tbCurCharList[self.nSelectIndex].Id)
self:RefreshDetail()
end
function SoldierHandbookCharCtrl:SwitchToTab(nTab, bForce)
if self.nCurTab == nTab and not bForce then
return
end
if self.nCurTab ~= nil then
self._mapNode.tab_Off[self.nCurTab]:SetActive(true)
self._mapNode.tab_On[self.nCurTab]:SetActive(false)
else
for i = 1, 6 do
self._mapNode.tab_Off[i]:SetActive(true)
self._mapNode.tab_On[i]:SetActive(false)
end
end
self.nCurTab = nTab
self._mapNode.tab_On[self.nCurTab]:SetActive(true)
self._mapNode.tab_Off[self.nCurTab]:SetActive(false)
self:RefreshCharList()
end
function SoldierHandbookCharCtrl:RefreshDetail()
self._mapNode.DetailCtrl:RefreshDetail(self.tbCurCharList[self.nSelectIndex].Id)
end
function SoldierHandbookCharCtrl:OnBtnClick_Tab(btn, nIndex)
if nIndex == self.nCurTab then
return
end
self:SwitchToTab(nIndex)
end
return SoldierHandbookCharCtrl
@@ -0,0 +1,274 @@
local SoldierHandbookCharDetailCtrl = class("SoldierHandbookCharDetailCtrl", BaseCtrl)
local SoldierAttrData = require("GameCore.Data.DataClass.Soldier.SoldierAttrData")
local RootPath = "Icon/SoldierOtherIcon/"
local PartnerPath = "Icon/SoldierPartner/"
local tabType = {Vanguard = 1, Support = 2}
local barMax = 512
local ColorChessRarity = {
[GameEnum.ChessRarity.Gold] = Color(0.996078431372549, 0.8, 0.5333333333333333, 1),
[GameEnum.ChessRarity.Purple] = Color(0.792156862745098, 0.6823529411764706, 0.9803921568627451, 1),
[GameEnum.ChessRarity.Blue] = Color(0.6274509803921569, 0.7843137254901961, 0.996078431372549, 1),
[GameEnum.ChessRarity.Green] = Color(0.8470588235294118, 0.9098039215686274, 0.7137254901960784, 1),
[GameEnum.ChessRarity.White] = Color(0.8352941176470589, 0.8666666666666667, 0.9254901960784314, 1)
}
SoldierHandbookCharDetailCtrl._mapNodeConfig = {
imgBg_Rare = {sComponentName = "Image"},
img_Rare = {sComponentName = "Image"},
txt_name = {sComponentName = "TMP_Text"},
txt_cost = {sComponentName = "TMP_Text"},
icon_Position = {sComponentName = "Image"},
txt_Position = {sComponentName = "TMP_Text"},
Partner = {nCount = 3},
property_hp = {},
property_sp = {},
property_atk = {},
property_def = {},
btn_Vanguard = {
sComponentName = "UIButton",
callback = "OnBtnClick_Vanguard"
},
go_Vanguard_on = {},
go_Vanguard_off = {},
txt_Vanguard = {
nCount = 2,
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Vanguard_Skill"
},
btn_Support = {
sComponentName = "UIButton",
callback = "OnBtnClick_Support"
},
go_Support_on = {},
go_Support_off = {},
txt_Support = {
nCount = 2,
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Support_Skill"
},
txt_skillTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Handbook_SkillTitle"
},
txt_potentialTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Handbook_PotentialTitle"
},
sv_Skill = {
sComponentName = "LoopScrollView"
},
sv_Potential = {
sComponentName = "LoopScrollView"
},
btn_charDetail = {
sComponentName = "UIButton",
callback = "OnBtnClick_CharDetail"
},
txtBtnCharDetail = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Handbook_CharDetail"
},
rtTipsPos = {
sComponentName = "RectTransform"
}
}
SoldierHandbookCharDetailCtrl._mapEventConfig = {}
SoldierHandbookCharDetailCtrl._mapRedDotConfig = {}
function SoldierHandbookCharDetailCtrl:Awake()
self.tbSkillItemCtrl = {}
self.tbPotentialItemCtrl = {}
end
function SoldierHandbookCharDetailCtrl:OnDestroy()
self:Clear()
end
function SoldierHandbookCharDetailCtrl:Clear()
if self.tbSkillItemCtrl ~= nil then
for _, v in ipairs(self.tbSkillItemCtrl) do
self:UnbindCtrlByNode(v)
end
self.tbSkillItemCtrl = {}
end
if self.tbPotentialItemCtrl ~= nil then
for _, v in ipairs(self.tbPotentialItemCtrl) do
self:UnbindCtrlByNode(v)
end
self.tbPotentialItemCtrl = {}
end
end
function SoldierHandbookCharDetailCtrl:RefreshDetail(nCharId)
if self.animator == nil then
self.animator = self.gameObject:GetComponent("Animator")
end
self.animator:Play("CharDetail_in")
if self.tbSkillItemCtrl ~= nil then
for _, v in ipairs(self.tbSkillItemCtrl) do
self:UnbindCtrlByNode(v)
end
self.tbSkillItemCtrl = {}
end
if self.tbPotentialItemCtrl ~= nil then
for _, v in ipairs(self.tbPotentialItemCtrl) do
self:UnbindCtrlByNode(v)
end
self.tbPotentialItemCtrl = {}
end
self.nCharId = nCharId
self.charConfig = ConfigTable.GetData("SoldierCharacter", self.nCharId)
if self.charConfig == nil then
return
end
self.skinConfig = ConfigTable.GetData("SoldierSkin", self.charConfig.Skin)
if self.skinConfig == nil then
return
end
self:SetPngSprite(self._mapNode.imgBg_Rare, RootPath .. AllEnum.SoldierChessRarityIcon[self.charConfig.Rarity] .. AllEnum.SoldierChessIconSurfix.XL)
NovaAPI.SetImageColor(self._mapNode.img_Rare, ColorChessRarity[self.charConfig.Rarity])
NovaAPI.SetTMPText(self._mapNode.txt_name, self.skinConfig.Name)
NovaAPI.SetTMPText(self._mapNode.txt_cost, self.charConfig.Cost)
local nChessType = self.charConfig.Type
local tbChessTypeConfig = CacheTable.GetData("_SoldierChessType", nChessType)
if tbChessTypeConfig ~= nil then
self:SetPngSprite(self._mapNode.icon_Position, RootPath .. tbChessTypeConfig.Icon)
NovaAPI.SetTMPText(self._mapNode.txt_Position, tbChessTypeConfig.Name)
end
local _, tbAttrMap = SoldierAttrData.CalcCharacterAttr(self.nCharId, 1, nil, nil)
local txt_hp = self._mapNode.property_hp.transform:Find("txtValue"):GetComponent("TMP_Text")
local hp = tbAttrMap.Hp
NovaAPI.SetTMPText(txt_hp, hp.nValue .. "/" .. hp.nValue)
local imgMainBarFill = self._mapNode.property_sp.transform:Find("imgBarBg/rtBarFill/imgMainBarFill"):GetComponent("Image")
local txt_sp = self._mapNode.property_sp.transform:Find("txtValue"):GetComponent("TMP_Text")
local sp = tbAttrMap.InitialEnergy
local spMax = tbAttrMap.Energy
NovaAPI.SetTMPText(txt_sp, sp.nValue .. "/" .. spMax.nValue)
imgMainBarFill.rectTransform.sizeDelta = Vector2(sp.nValue / spMax.nValue * barMax, imgMainBarFill.rectTransform.sizeDelta.y)
local txt_defName = self._mapNode.property_def.transform:Find("txtProperty"):GetComponent("TMP_Text")
local txt_def = self._mapNode.property_def.transform:Find("txtValue2"):GetComponent("TMP_Text")
local def = tbAttrMap.Def
NovaAPI.SetTMPText(txt_def, def.nValue)
NovaAPI.SetTMPText(txt_defName, ConfigTable.GetUIText(def.sLanguageId))
local txt_atkName = self._mapNode.property_atk.transform:Find("txtProperty"):GetComponent("TMP_Text")
local txt_atk = self._mapNode.property_atk.transform:Find("txtValue2"):GetComponent("TMP_Text")
local atkValue = tbAttrMap.Atk
NovaAPI.SetTMPText(txt_atkName, ConfigTable.GetUIText(atkValue.sLanguageId))
NovaAPI.SetTMPText(txt_atk, atkValue.nValue)
self:InitPartner()
self:SwitchTab(tabType.Vanguard, true)
end
function SoldierHandbookCharDetailCtrl:InitPartner()
local partnerType = self.charConfig.PartnerType
for i = 1, 3 do
self._mapNode.Partner[i]:SetActive(false)
end
for i = 1, 3 do
if i > #partnerType then
return
end
local configPartner = CacheTable.GetData("_SoldierPartnerGroup", partnerType[i])
if configPartner == nil then
return
end
local icon = self._mapNode.Partner[i].transform:Find("imgIcon"):GetComponent("Image")
local txt_Partner = self._mapNode.Partner[i].transform:Find("txt_Partner"):GetComponent("TMP_Text")
self:SetPngSprite(icon, PartnerPath .. configPartner.Icon .. AllEnum.SoldierChessIconSurfix.M)
NovaAPI.SetTMPText(txt_Partner, configPartner.Name)
self._mapNode.Partner[i]:SetActive(true)
end
end
function SoldierHandbookCharDetailCtrl:SwitchTab(nTab, bForce)
if self.nCurTab == nTab and not bForce then
return
end
self.nCurTab = nTab
self._mapNode.go_Vanguard_on:SetActive(self.nCurTab == tabType.Vanguard)
self._mapNode.go_Vanguard_off:SetActive(self.nCurTab ~= tabType.Vanguard)
self._mapNode.go_Support_on:SetActive(self.nCurTab == tabType.Support)
self._mapNode.go_Support_off:SetActive(self.nCurTab ~= tabType.Support)
if self.nCurTab == tabType.Vanguard then
self:InitVanguard()
else
self:InitSupport()
end
end
function SoldierHandbookCharDetailCtrl:InitVanguard()
self.tbVanguardSkill = {}
table.insert(self.tbVanguardSkill, self.charConfig.Skill)
self._mapNode.sv_Skill:Init(#self.tbVanguardSkill, self, self.OnSkillRefreshGrid, self.OnSkillBtnClick, false)
self.tbVanguardPotential = {}
for i = 1, 4 do
local potentialList = self.charConfig["Potential" .. tostring(i)]
for _, potentialId in ipairs(potentialList) do
table.insert(self.tbVanguardPotential, {nId = potentialId, nStar = i})
end
end
self._mapNode.sv_Potential:Init(#self.tbVanguardPotential, self, self.OnPotentialRefreshGrid)
end
function SoldierHandbookCharDetailCtrl:OnSkillRefreshGrid(goGrid, gridIndex)
local nIndex = gridIndex + 1
local skillId = 0
if self.nCurTab == tabType.Vanguard then
skillId = self.tbVanguardSkill[nIndex]
else
skillId = self.tbSupportSkill[nIndex]
end
local nInstanceId = goGrid:GetInstanceID()
if not self.tbSkillItemCtrl[nInstanceId] then
self.tbSkillItemCtrl[nInstanceId] = self:BindCtrlByNode(goGrid, "Game.UI.TemplateEx.TemplateSkillCharCtrl")
end
local nSkillIndex = 2
if self.nCurTab == tabType.Vanguard then
nSkillIndex = 2
else
nSkillIndex = 3
end
self.tbSkillItemCtrl[nInstanceId]:SetSkill(skillId, nSkillIndex, 1, GameEnum.elementType.DE, false)
local btnSkill = goGrid:GetComponent("UIButton")
if btnSkill then
btnSkill.onClick:RemoveAllListeners()
btnSkill.onClick:AddListener(function()
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierCharSkillPreview, self.nCharId, nSkillIndex)
end)
end
end
function SoldierHandbookCharDetailCtrl:OnSkillBtnClick(goGrid, gridIndex)
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierCharSkillPreview, self.nCharId)
end
function SoldierHandbookCharDetailCtrl:OnPotentialRefreshGrid(goGrid, gridIndex)
local nIndex = gridIndex + 1
local potential = self.tbVanguardPotential[nIndex]
local nInstanceId = goGrid:GetInstanceID()
if not self.tbPotentialItemCtrl[nInstanceId] then
self.tbPotentialItemCtrl[nInstanceId] = self:BindCtrlByNode(goGrid, "Game.UI.Soldier.Template.SoldierPotentialItemCtrl")
end
self.tbPotentialItemCtrl[nInstanceId]:SetItemData(potential.nId, potential.nStar)
local btnPotential = goGrid.transform:Find("btnItem"):GetComponent("UIButton")
if btnPotential then
btnPotential.onClick:RemoveAllListeners()
btnPotential.onClick:AddListener(function()
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierCharPontentialDetailPanel, self._mapNode.rtTipsPos, potential.nId)
end)
end
end
function SoldierHandbookCharDetailCtrl:InitSupport()
self.tbSupportSkill = {}
table.insert(self.tbSupportSkill, self.charConfig.Support)
self._mapNode.sv_Skill:Init(#self.tbSupportSkill, self, self.OnSkillRefreshGrid, self.OnSkillBtnClick, false)
self.tbVanguardPotential = {}
for i = 1, 4 do
local potentialList = self.charConfig["Potential" .. tostring(i)]
for _, potentialId in ipairs(potentialList) do
table.insert(self.tbVanguardPotential, {nId = potentialId, nStar = i})
end
end
self._mapNode.sv_Potential:Init(#self.tbVanguardPotential, self, self.OnPotentialRefreshGrid)
end
function SoldierHandbookCharDetailCtrl:OnBtnClick_Vanguard()
self:SwitchTab(tabType.Vanguard)
end
function SoldierHandbookCharDetailCtrl:OnBtnClick_Support()
self:SwitchTab(tabType.Support)
end
function SoldierHandbookCharDetailCtrl:OnBtnClick_CharDetail()
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierCharAttriTips, self.nCharId)
end
function SoldierHandbookCharDetailCtrl:OnEvent_SoldierHandbookChar_Selected(nCharId)
end
return SoldierHandbookCharDetailCtrl
@@ -0,0 +1,33 @@
local SoldierHandbookCharItemCtrl = class("SoldierHandbookCharItemCtrl", BaseCtrl)
local RootPath = "Icon/SoldierOtherIcon/"
SoldierHandbookCharItemCtrl._mapNodeConfig = {
imgSelect = {},
imageRarity = {sComponentName = "Image"},
imageIcon = {sComponentName = "Image"},
txtCharName = {sComponentName = "TMP_Text"}
}
SoldierHandbookCharItemCtrl._mapEventConfig = {
SoldierHandbookChar_Selected = "OnEvent_SoldierHandbookChar_Selected"
}
SoldierHandbookCharItemCtrl._mapRedDotConfig = {}
function SoldierHandbookCharItemCtrl:Awake()
end
function SoldierHandbookCharItemCtrl:SetItemData(mapCharData, bSelect)
self.mapCharData = mapCharData
local skinData = ConfigTable.GetData("SoldierSkin", mapCharData.Skin)
if skinData == nil then
return
end
self:SetPngSprite(self._mapNode.imageIcon, skinData.Icon .. AllEnum.SoldierChessIconSurfix.M)
NovaAPI.SetTMPText(self._mapNode.txtCharName, skinData.Name)
self:SetPngSprite(self._mapNode.imageRarity, RootPath .. AllEnum.SoldierChessRarityIcon[mapCharData.Rarity] .. AllEnum.SoldierChessIconSurfix.L)
self._mapNode.imgSelect.gameObject:SetActive(bSelect)
end
function SoldierHandbookCharItemCtrl:OnEvent_SoldierHandbookChar_Selected(nCharId)
if self.mapCharData.Id == nCharId then
self._mapNode.imgSelect.gameObject:SetActive(true)
else
self._mapNode.imgSelect.gameObject:SetActive(false)
end
end
return SoldierHandbookCharItemCtrl
@@ -0,0 +1,127 @@
local SoldierHandbookCtrl = class("SoldierHandbookCtrl", BaseCtrl)
SoldierHandbookCtrl._mapNodeConfig = {
TopBar = {
sNodeName = "TopBarPanel",
sCtrlName = "Game.UI.TopBarEx.TopBarCtrl"
},
btn_char = {
sComponentName = "UIButton",
callback = "OnBtnClick_Char"
},
go_char_in = {},
go_char_off = {},
btn_partner = {
sComponentName = "UIButton",
callback = "OnBtnClick_Partner"
},
go_partner_in = {},
go_partner_off = {},
btn_starterCard = {
sComponentName = "UIButton",
callback = "OnBtnClick_StarterCard"
},
go_starterCard_in = {},
go_starterCard_off = {},
btn_strategyCard = {
sComponentName = "UIButton",
callback = "OnBtnClick_StrategyCard"
},
go_strategyCard_in = {},
go_strategyCard_off = {},
txt_char = {
nCount = 2,
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Handbook_Character"
},
txt_partner = {
nCount = 2,
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Handbook_Partner"
},
txt_starterCard = {
nCount = 2,
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Handbook_StarterCard"
},
txt_strategyCard = {
nCount = 2,
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Handbook_StrategyCard"
},
CharCtrl = {
sNodeName = "CharRoot",
sCtrlName = "Game.UI.Soldier.Handbook.SoldierHandbookCharCtrl"
},
PartnerCtrl = {
sNodeName = "PartnerRoot",
sCtrlName = "Game.UI.Soldier.Handbook.SoldierHandbookPartnerCtrl"
},
StarterCardCtrl = {
sNodeName = "StarterCardRoot",
sCtrlName = "Game.UI.Soldier.Handbook.SoldierHandbookStarterCardCtrl"
},
StrategyCardCtrl = {
sNodeName = "StrategyCardRoot",
sCtrlName = "Game.UI.Soldier.Handbook.SoldierHandbookStrategyCardCtrl"
}
}
SoldierHandbookCtrl._mapEventConfig = {}
SoldierHandbookCtrl._mapRedDotConfig = {}
function SoldierHandbookCtrl:Awake()
local param = self:GetPanelParam()
local nSelectedType = 0
if type(param) == "table" then
nSelectedType = param[1]
end
if nSelectedType == 0 then
nSelectedType = AllEnum.SoldierHandbookType.Character
end
self:SwitchToSelectedType(nSelectedType)
end
function SoldierHandbookCtrl:OnEnable()
EventManager.Hit("SoldierHandbookPanel_Open")
end
function SoldierHandbookCtrl:OnDisable()
EventManager.Hit("SoldierHandbookPanel_Close")
end
function SoldierHandbookCtrl:SwitchToSelectedType(nSelectedType)
self._mapNode.CharCtrl:Clear()
self._mapNode.PartnerCtrl:Clear()
self._mapNode.StarterCardCtrl:Clear()
self._mapNode.StrategyCardCtrl:Clear()
self.nSelectedType = nSelectedType
self._mapNode.CharCtrl.gameObject:SetActive(self.nSelectedType == AllEnum.SoldierHandbookType.Character)
self._mapNode.PartnerCtrl.gameObject:SetActive(self.nSelectedType == AllEnum.SoldierHandbookType.Partner)
self._mapNode.StarterCardCtrl.gameObject:SetActive(self.nSelectedType == AllEnum.SoldierHandbookType.StarterCard)
self._mapNode.StrategyCardCtrl.gameObject:SetActive(self.nSelectedType == AllEnum.SoldierHandbookType.StrategyCard)
self._mapNode.go_char_in.gameObject:SetActive(self.nSelectedType == AllEnum.SoldierHandbookType.Character)
self._mapNode.go_char_off.gameObject:SetActive(self.nSelectedType ~= AllEnum.SoldierHandbookType.Character)
self._mapNode.go_partner_in.gameObject:SetActive(self.nSelectedType == AllEnum.SoldierHandbookType.Partner)
self._mapNode.go_partner_off.gameObject:SetActive(self.nSelectedType ~= AllEnum.SoldierHandbookType.Partner)
self._mapNode.go_starterCard_in.gameObject:SetActive(self.nSelectedType == AllEnum.SoldierHandbookType.StarterCard)
self._mapNode.go_starterCard_off.gameObject:SetActive(self.nSelectedType ~= AllEnum.SoldierHandbookType.StarterCard)
self._mapNode.go_strategyCard_in.gameObject:SetActive(self.nSelectedType == AllEnum.SoldierHandbookType.StrategyCard)
self._mapNode.go_strategyCard_off.gameObject:SetActive(self.nSelectedType ~= AllEnum.SoldierHandbookType.StrategyCard)
if self.nSelectedType == AllEnum.SoldierHandbookType.Character then
self._mapNode.CharCtrl:Init()
elseif self.nSelectedType == AllEnum.SoldierHandbookType.Partner then
self._mapNode.PartnerCtrl:Init()
elseif self.nSelectedType == AllEnum.SoldierHandbookType.StarterCard then
self._mapNode.StarterCardCtrl:Init()
elseif self.nSelectedType == AllEnum.SoldierHandbookType.StrategyCard then
self._mapNode.StrategyCardCtrl:Init()
end
end
function SoldierHandbookCtrl:OnBtnClick_Char()
self:SwitchToSelectedType(AllEnum.SoldierHandbookType.Character)
end
function SoldierHandbookCtrl:OnBtnClick_Partner()
self:SwitchToSelectedType(AllEnum.SoldierHandbookType.Partner)
end
function SoldierHandbookCtrl:OnBtnClick_StarterCard()
self:SwitchToSelectedType(AllEnum.SoldierHandbookType.StarterCard)
end
function SoldierHandbookCtrl:OnBtnClick_StrategyCard()
self:SwitchToSelectedType(AllEnum.SoldierHandbookType.StrategyCard)
end
return SoldierHandbookCtrl
@@ -0,0 +1,22 @@
local SoldierHandbookPanel = class("SoldierHandbookPanel", BasePanel)
SoldierHandbookPanel._bIsMainPanel = true
SoldierHandbookPanel._sSortingLayerName = AllEnum.SortingLayerName.UI
SoldierHandbookPanel._tbDefine = {
{
sPrefabPath = "Soldier/SoldierHandbookPanel.prefab",
sCtrlName = "Game.UI.Soldier.Handbook.SoldierHandbookCtrl"
}
}
function SoldierHandbookPanel:Awake()
end
function SoldierHandbookPanel:OnEnable()
end
function SoldierHandbookPanel:OnAfterEnter()
end
function SoldierHandbookPanel:OnDisable()
end
function SoldierHandbookPanel:OnDestroy()
end
function SoldierHandbookPanel:OnRelease()
end
return SoldierHandbookPanel
@@ -0,0 +1,85 @@
local SoldierHandbookPartnerCtrl = class("SoldierHandbookPartnerCtrl", BaseCtrl)
local tabType = {All = 1}
SoldierHandbookPartnerCtrl._mapNodeConfig = {
sv_partnerGroup = {
sComponentName = "LoopScrollView"
},
txt_DescCalHeight = {sComponentName = "TMP_Text"}
}
SoldierHandbookPartnerCtrl._mapEventConfig = {}
SoldierHandbookPartnerCtrl._mapRedDotConfig = {}
function SoldierHandbookPartnerCtrl:Awake()
end
function SoldierHandbookPartnerCtrl:OnDestroy()
self:Clear()
end
function SoldierHandbookPartnerCtrl:Clear()
if self.tbPartnerGroupItemCtrl ~= nil then
for _, v in ipairs(self.tbPartnerGroupItemCtrl) do
v:Clear()
self:UnbindCtrlByNode(v)
end
self.tbPartnerGroupItemCtrl = nil
end
end
function SoldierHandbookPartnerCtrl:Init()
self:Clear()
self.tbPartnerGroupItemCtrl = {}
self:InitPartnerGroupList()
end
function SoldierHandbookPartnerCtrl:InitPartnerGroupList()
self.tbPartnerGroup = {}
local func_ForEach_PartnerGroup = function(mapPartnerGroup)
table.insert(self.tbPartnerGroup, mapPartnerGroup)
end
ForEachTableLine(DataTable.SoldierPartnerGroup, func_ForEach_PartnerGroup)
self:InitHeight()
self._mapNode.sv_partnerGroup:InitEx(self.tbGridHeight, self, self.OnPartnerGroupRefreshGrid, self.OnPartnerGroupGridBtnClick, false)
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
self:PlayGridAnim()
end
cs_coroutine.start(wait)
end
function SoldierHandbookPartnerCtrl:PlayGridAnim()
local listInUse = self._mapNode.sv_partnerGroup:GetInUseGridIndex()
local tbGridInUse = {}
for i = 0, listInUse.Count - 1 do
table.insert(tbGridInUse, listInUse[i])
end
for k, v in ipairs(tbGridInUse) do
local goGrid = self._mapNode.sv_partnerGroup.transform:Find("Viewport/Content/" .. v)
local animRoot = goGrid:GetComponent("Animator")
local delayTime = (k - 1) * 0.1
if 0 < delayTime then
self:AddTimer(1, delayTime, function()
animRoot:Play("go")
end, true, true, true)
else
animRoot:Play("go")
end
end
end
function SoldierHandbookPartnerCtrl:InitHeight()
self.tbGridHeight = {}
for _, v in ipairs(self.tbPartnerGroup) do
NovaAPI.SetTMPText(self._mapNode.txt_DescCalHeight, UTILS.ParseDesc(v))
CS.UnityEngine.UI.LayoutRebuilder.ForceRebuildLayoutImmediate(self._mapNode.txt_DescCalHeight.transform)
local nHeight = self._mapNode.txt_DescCalHeight.transform.sizeDelta.y + 76
table.insert(self.tbGridHeight, nHeight)
end
end
function SoldierHandbookPartnerCtrl:OnPartnerGroupRefreshGrid(goGrid, gridIndex)
local nIndex = gridIndex + 1
local nInstanceId = goGrid:GetInstanceID()
if not self.tbPartnerGroupItemCtrl[nInstanceId] then
self.tbPartnerGroupItemCtrl[nInstanceId] = self:BindCtrlByNode(goGrid, "Game.UI.Soldier.Handbook.SoldierHandbookPartnerItemCtrl")
end
self.tbPartnerGroupItemCtrl[nInstanceId]:SetItemData(self.tbPartnerGroup[nIndex])
end
function SoldierHandbookPartnerCtrl:OnPartnerGroupGridBtnClick(goGrid, gridIndex)
local nIndex = gridIndex + 1
local partnerType = self.tbPartnerGroup[nIndex].PartnerType
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierHandbookPartnerDetailPanel, partnerType)
end
return SoldierHandbookPartnerCtrl
@@ -0,0 +1,134 @@
local SoldierHandbookPartnerDetailCtrl = class("SoldierHandbookPartnerDetailCtrl", BaseCtrl)
local SoldierAttrData = require("GameCore.Data.DataClass.Soldier.SoldierAttrData")
local RootPath = "Icon/SoldierOtherIcon/"
local iconPath = "Icon/SoldierPartner/"
SoldierHandbookPartnerDetailCtrl._mapNodeConfig = {
blur = {},
root = {
sNodeName = "----SafeAreaRoot---"
},
btn_Close = {
sComponentName = "UIButton",
callback = "OnBtnClick_Close"
},
btnClose = {
sComponentName = "UIButton",
callback = "OnBtnClick_Close"
},
txtWindowTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Handbook_PartnerDetail"
},
txt_name = {sComponentName = "TMP_Text"},
img_partnerIcon = {sComponentName = "Image"},
TMP_Link = {
sNodeName = "txt_PartnerDesc",
sComponentName = "TMPHyperLink",
callback = "OnLinkClick_Word"
},
txt_PartnerDesc = {sComponentName = "TMP_Text"},
partner_desc = {nCount = 6},
txt_charListTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Handbook_PartnerCharListTitle"
},
sv_char = {
sComponentName = "LoopScrollView"
},
charDetialRoot = {sComponentName = "Transform"}
}
SoldierHandbookPartnerDetailCtrl._mapEventConfig = {}
SoldierHandbookPartnerDetailCtrl._mapRedDotConfig = {}
function SoldierHandbookPartnerDetailCtrl:Awake()
self._mapNode.blur:SetActive(true)
self._mapNode.root:SetActive(false)
self.animator = self._mapNode.root.transform:Find("AnimRoot"):GetComponent("Animator")
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
self._mapNode.root:SetActive(true)
self.animator:Play("t_window_04_t_in")
EventManager.Hit(EventId.TemporaryBlockInput, 0.3)
end
cs_coroutine.start(wait)
local param = self:GetPanelParam()
if type(param) == "table" then
self.nPartnerType = param[1]
end
local mapPartnerGroupData = CacheTable.GetData("_SoldierPartnerGroup", self.nPartnerType)
if mapPartnerGroupData == nil then
return
end
self.mapPartnerGroupData = mapPartnerGroupData
self:Init()
end
function SoldierHandbookPartnerDetailCtrl:OnDestroy()
for _, v in ipairs(self.tbCharItemCtrl) do
self:UnbindCtrlByNode(v)
end
self.tbCharItemCtrl = nil
end
function SoldierHandbookPartnerDetailCtrl:Init()
self.tbCharItemCtrl = {}
if self.mapPartnerGroupData == nil then
return
end
NovaAPI.SetTMPText(self._mapNode.txtName, self.mapPartnerGroupData.Name)
NovaAPI.SetTMPText(self._mapNode.txtDesc, self.mapPartnerGroupData.Des)
for i = 1, 6 do
self._mapNode.partner_desc[i]:SetActive(false)
end
self:SetPngSprite(self._mapNode.img_partnerIcon, iconPath .. self.mapPartnerGroupData.Icon .. AllEnum.SoldierChessIconSurfix.M)
NovaAPI.SetTMPText(self._mapNode.txt_name, self.mapPartnerGroupData.Name)
NovaAPI.SetTMPText(self._mapNode.txt_PartnerDesc, UTILS.ParseDesc(self.mapPartnerGroupData))
local tbAttrData = SoldierAttrData.GetPartnerLevelsByType(self.nPartnerType)
for i, v in ipairs(tbAttrData) do
local mapCfg = ConfigTable.GetData("SoldierPartner", v.nConfigId)
if mapCfg ~= nil then
local bg_icon = self._mapNode.partner_desc[i].transform:Find("icon_Level"):GetComponent("Image")
self:SetPngSprite(bg_icon, RootPath .. AllEnum.SoldierPartnerLevelIcon[mapCfg.PartnerLevelQuality].levelIcon)
local txt_desc = self._mapNode.partner_desc[i].transform:Find("txt_desc"):GetComponent("TMP_Text")
local txt_level = self._mapNode.partner_desc[i].transform:Find("icon_Level/txt_level"):GetComponent("TMP_Text")
local link = txt_desc.transform:GetComponent("TMPHyperLink")
NovaAPI.SetTMPText(txt_desc, v.sDesc)
NovaAPI.SetTMPText(txt_level, mapCfg.Num)
local handler = ui_handler(self, function(_, goLink, sWordId)
UTILS.ClickWordLink(goLink, sWordId)
end, link)
link.onClick:AddListener(handler)
self._mapNode.partner_desc[i]:SetActive(true)
end
end
self._mapNode.sv_char:Init(#self.mapPartnerGroupData.ChessCharacterIds, self, self.OnCharRefreshGrid, self.OnCharBtnClick, false)
end
function SoldierHandbookPartnerDetailCtrl:OnCharRefreshGrid(goGrid, gridIndex)
local nIndex = gridIndex + 1
local charId = self.mapPartnerGroupData.ChessCharacterIds[nIndex]
local go_char = goGrid.transform:Find("tc_char_small")
local nInstanceId = go_char:GetInstanceID()
if not self.tbCharItemCtrl[nInstanceId] then
self.tbCharItemCtrl[nInstanceId] = self:BindCtrlByNode(go_char, "Game.UI.Soldier.Template.Character.SoldierCharItemCtrl")
end
self.tbCharItemCtrl[nInstanceId]:SetItemData(charId)
self.tbCharItemCtrl[nInstanceId]:SetCharLevel(0)
end
function SoldierHandbookPartnerDetailCtrl:OnCharBtnClick(goGrid, gridIndex)
local nIndex = gridIndex + 1
local charId = self.mapPartnerGroupData.ChessCharacterIds[nIndex]
local chessData = {nId = charId, nStar = 1}
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierCharCardTips, self._mapNode.charDetialRoot, chessData)
local tr = self._mapNode.charDetialRoot
EventManager.Hit("OnSetTipsPosition", tr:GetChild(0).position, tr:GetChild(1).position, tr:GetChild(2).position)
EventManager.Hit("SoldierCharTips_ShowBg")
end
function SoldierHandbookPartnerDetailCtrl:OnBtnClick_Close()
self.animator:Play("t_window_04_t_out")
local callback = function()
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierHandbookPartnerDetailPanel)
end
self:AddTimer(1, 0.3, callback, true, true, true)
EventManager.Hit(EventId.TemporaryBlockInput, 0.3)
end
function SoldierHandbookPartnerDetailCtrl:OnLinkClick_Word(link, sWordId)
UTILS.ClickWordLink(link, sWordId)
end
return SoldierHandbookPartnerDetailCtrl
@@ -0,0 +1,21 @@
local SoldierHandbookPartnerDetailPanel = class("SoldierHandbookPartnerDetailPanel", BasePanel)
SoldierHandbookPartnerDetailPanel._bIsMainPanel = false
SoldierHandbookPartnerDetailPanel._tbDefine = {
{
sPrefabPath = "Soldier/SoldierHandbookPartnerDetailPanel.prefab",
sCtrlName = "Game.UI.Soldier.Handbook.SoldierHandbookPartnerDetailCtrl"
}
}
function SoldierHandbookPartnerDetailPanel:Awake()
end
function SoldierHandbookPartnerDetailPanel:OnEnable()
end
function SoldierHandbookPartnerDetailPanel:OnAfterEnter()
end
function SoldierHandbookPartnerDetailPanel:OnDisable()
end
function SoldierHandbookPartnerDetailPanel:OnDestroy()
end
function SoldierHandbookPartnerDetailPanel:OnRelease()
end
return SoldierHandbookPartnerDetailPanel
@@ -0,0 +1,59 @@
local SoldierHandbookPartnerItemCtrl = class("SoldierHandbookPartnerItemCtrl", BaseCtrl)
local iconPath = "Icon/SoldierPartner/"
SoldierHandbookPartnerItemCtrl._mapNodeConfig = {
partnerCell = {
sComponentName = "RectTransform"
},
img_partnerIcon = {sComponentName = "Image"},
txt_name = {sComponentName = "TMP_Text"},
TMP_Link = {
sNodeName = "txt_Desc",
sComponentName = "TMPHyperLink",
callback = "OnLinkClick_Word"
},
txt_Desc = {sComponentName = "TMP_Text"},
sv = {
sComponentName = "LoopScrollView"
}
}
SoldierHandbookPartnerItemCtrl._mapEventConfig = {}
SoldierHandbookPartnerItemCtrl._mapRedDotConfig = {}
function SoldierHandbookPartnerItemCtrl:Awake()
self.tbCharItemCtrl = {}
end
function SoldierHandbookPartnerItemCtrl:OnDestroy()
self:Clear()
end
function SoldierHandbookPartnerItemCtrl:Clear()
if self.tbCharItemCtrl ~= nil then
for _, v in ipairs(self.tbCharItemCtrl) do
self:UnbindCtrlByNode(v)
end
end
self.tbCharItemCtrl = {}
end
function SoldierHandbookPartnerItemCtrl:SetItemData(mapPartnerGroupData)
self.mapPartnerGroupData = mapPartnerGroupData
self:SetPngSprite(self._mapNode.img_partnerIcon, iconPath .. self.mapPartnerGroupData.Icon .. AllEnum.SoldierChessIconSurfix.M)
NovaAPI.SetTMPText(self._mapNode.txt_name, self.mapPartnerGroupData.Name)
NovaAPI.SetTMPText(self._mapNode.txt_Desc, UTILS.ParseDesc(self.mapPartnerGroupData))
CS.UnityEngine.UI.LayoutRebuilder.ForceRebuildLayoutImmediate(self._mapNode.txt_Desc.transform)
local nHeight = self._mapNode.txt_Desc.transform.sizeDelta.y + 76
self._mapNode.partnerCell.sizeDelta = Vector2(self._mapNode.partnerCell.sizeDelta.x, nHeight)
self._mapNode.sv:Init(#self.mapPartnerGroupData.ChessCharacterIds, self, self.OnCharRefreshGrid)
end
function SoldierHandbookPartnerItemCtrl:OnCharRefreshGrid(goGrid, gridIndex)
local nIndex = gridIndex + 1
local charId = self.mapPartnerGroupData.ChessCharacterIds[nIndex]
local go_char = goGrid.transform:Find("tc_char_small")
local nInstanceId = go_char:GetInstanceID()
if not self.tbCharItemCtrl[nInstanceId] then
self.tbCharItemCtrl[nInstanceId] = self:BindCtrlByNode(go_char, "Game.UI.Soldier.Template.Character.SoldierCharItemCtrl")
end
self.tbCharItemCtrl[nInstanceId]:SetItemData(charId)
self.tbCharItemCtrl[nInstanceId]:SetCharLevel(0)
end
function SoldierHandbookPartnerItemCtrl:OnLinkClick_Word(link, sWordId)
UTILS.ClickWordLink(link, sWordId)
end
return SoldierHandbookPartnerItemCtrl
@@ -0,0 +1,109 @@
local SoldierHandbookSelectCtrl = class("SoldierHandbookSelectCtrl", BaseCtrl)
SoldierHandbookSelectCtrl._mapNodeConfig = {
TopBar = {
sNodeName = "TopBarPanel",
sCtrlName = "Game.UI.TopBarEx.TopBarCtrl"
},
btn_Char = {
sComponentName = "UIButton",
callback = "OnBtnClick_Character"
},
txt_Char = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Handbook_Character"
},
txt_CharCount = {sComponentName = "TMP_Text"},
btn_Partner = {
sComponentName = "UIButton",
callback = "OnBtnClick_Partner"
},
txt_Partner = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Handbook_Partner"
},
txt_PartnerCount = {sComponentName = "TMP_Text"},
btn_StarterCard = {
sComponentName = "UIButton",
callback = "OnBtnClick_StarterCard"
},
txt_StarterCard = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Handbook_StarterCard"
},
txt_StarterCardCount = {sComponentName = "TMP_Text"},
btn_StrategyCard = {
sComponentName = "UIButton",
callback = "OnBtnClick_StrategyCard"
},
txt_StrategyCard = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Handbook_StrategyCard"
},
txt_StrategyCardCount = {sComponentName = "TMP_Text"}
}
SoldierHandbookSelectCtrl._mapEventConfig = {}
SoldierHandbookSelectCtrl._mapRedDotConfig = {}
function SoldierHandbookSelectCtrl:Awake()
end
function SoldierHandbookSelectCtrl:OnEnable()
self:RefreshCharCount()
self:RefreshPartnerCount()
self:RefreshStarterCardCount()
self:RefreshStrategyCardCount()
end
function SoldierHandbookSelectCtrl:RefreshCharCount()
local nCount = 0
local actData = PlayerData.Activity:GetActivityDataByType(GameEnum.activityType.Soldier)
if actData == nil then
return
end
local nActId = actData:GetActId()
local seasonConfig = ConfigTable.GetData("SoldierSeason", nActId)
if seasonConfig == nil then
return
end
local func_ForEach_Char = function(mapCharData)
if mapCharData.BoardChess and seasonConfig.ChessGroupId == mapCharData.GroupId then
nCount = nCount + 1
end
end
ForEachTableLine(DataTable.SoldierCharacter, func_ForEach_Char)
NovaAPI.SetTMPText(self._mapNode.txt_CharCount, nCount)
end
function SoldierHandbookSelectCtrl:RefreshPartnerCount()
local nCount = 0
local func_ForEach_Partner = function(mapPartnerData)
nCount = nCount + 1
end
ForEachTableLine(DataTable.SoldierPartnerGroup, func_ForEach_Partner)
NovaAPI.SetTMPText(self._mapNode.txt_PartnerCount, nCount)
end
function SoldierHandbookSelectCtrl:RefreshStarterCardCount()
local nCount = 0
local func_ForEach_StarterCard = function(mapStarterCardData)
nCount = nCount + 1
end
ForEachTableLine(DataTable.SoldierStarterCard, func_ForEach_StarterCard)
NovaAPI.SetTMPText(self._mapNode.txt_StarterCardCount, nCount)
end
function SoldierHandbookSelectCtrl:RefreshStrategyCardCount()
local nCount = 0
local func_ForEach_StrategyCard = function(mapStrategyCardData)
nCount = nCount + 1
end
ForEachTableLine(DataTable.SoldierStrategyCard, func_ForEach_StrategyCard)
NovaAPI.SetTMPText(self._mapNode.txt_StrategyCardCount, nCount)
end
function SoldierHandbookSelectCtrl:OnBtnClick_Character()
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierHandbookPanel, AllEnum.SoldierHandbookType.Character)
end
function SoldierHandbookSelectCtrl:OnBtnClick_Partner()
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierHandbookPanel, AllEnum.SoldierHandbookType.Partner)
end
function SoldierHandbookSelectCtrl:OnBtnClick_StarterCard()
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierHandbookPanel, AllEnum.SoldierHandbookType.StarterCard)
end
function SoldierHandbookSelectCtrl:OnBtnClick_StrategyCard()
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierHandbookPanel, AllEnum.SoldierHandbookType.StrategyCard)
end
return SoldierHandbookSelectCtrl
@@ -0,0 +1,22 @@
local SoldierHandbookSelectPanel = class("SoldierHandbookSelectPanel", BasePanel)
SoldierHandbookSelectPanel._bIsMainPanel = true
SoldierHandbookSelectPanel._sSortingLayerName = AllEnum.SortingLayerName.UI
SoldierHandbookSelectPanel._tbDefine = {
{
sPrefabPath = "Soldier/SoldierHandbookSelectPanel.prefab",
sCtrlName = "Game.UI.Soldier.Handbook.SoldierHandbookSelectCtrl"
}
}
function SoldierHandbookSelectPanel:Awake()
end
function SoldierHandbookSelectPanel:OnEnable()
end
function SoldierHandbookSelectPanel:OnAfterEnter()
end
function SoldierHandbookSelectPanel:OnDisable()
end
function SoldierHandbookSelectPanel:OnDestroy()
end
function SoldierHandbookSelectPanel:OnRelease()
end
return SoldierHandbookSelectPanel
@@ -0,0 +1,84 @@
local SoldierHandbookStarterCardCtrl = class("SoldierHandbookStarterCardCtrl", BaseCtrl)
SoldierHandbookStarterCardCtrl._mapNodeConfig = {
sv_loop = {
sComponentName = "LoopScrollView"
},
CardDetailCtrl = {
sNodeName = "DetailRoot",
sCtrlName = "Game.UI.Soldier.Handbook.SoldierHandbookCardDetailCtrl"
}
}
SoldierHandbookStarterCardCtrl._mapEventConfig = {}
SoldierHandbookStarterCardCtrl._mapRedDotConfig = {}
function SoldierHandbookStarterCardCtrl:Awake()
end
function SoldierHandbookStarterCardCtrl:OnEnable()
end
function SoldierHandbookStarterCardCtrl:OnDisable()
end
function SoldierHandbookStarterCardCtrl:OnDestroy()
self:Clear()
end
function SoldierHandbookStarterCardCtrl:Clear()
if self.tbCardItemCtrl ~= nil then
for _, v in ipairs(self.tbCardItemCtrl) do
self:UnbindCtrlByNode(v)
end
self.tbCardItemCtrl = {}
end
self._mapNode.CardDetailCtrl:Clear()
end
function SoldierHandbookStarterCardCtrl:Init()
self.tbCardItemCtrl = {}
self:InitCardList()
self:RefreshCardList()
end
function SoldierHandbookStarterCardCtrl:InitCardList()
self.tbAllCard = {}
self.mapCardByRarity = {}
local func_ForEach_Card = function(mapCardData)
table.insert(self.tbAllCard, mapCardData)
if self.mapCardByRarity[mapCardData.Rarity] == nil then
self.mapCardByRarity[mapCardData.Rarity] = {}
end
table.insert(self.mapCardByRarity[mapCardData.Rarity], mapCardData)
end
ForEachTableLine(DataTable.SoldierStarterCard, func_ForEach_Card)
table.sort(self.tbAllCard, function(a, b)
if a.Rarity == b.Rarity then
return a.Id < b.Id
end
return a.Rarity > b.Rarity
end)
for nRarity, tbCard in pairs(self.mapCardByRarity) do
table.sort(tbCard, function(a, b)
return a.Id < b.Id
end)
end
end
function SoldierHandbookStarterCardCtrl:RefreshCardList()
self.tbCardItemCtrl = {}
self.nSelectIndex = 1
self.tbCurCardList = self.tbAllCard
self._mapNode.sv_loop:Init(#self.tbCurCardList, self, self.OnCardRefreshGrid, self.OnCardGridBtnClick, false)
EventManager.Hit("SoldierHandbookStarterCard_Selected", self.tbCurCardList[self.nSelectIndex].Id)
self:RefreshDetail()
end
function SoldierHandbookStarterCardCtrl:RefreshDetail()
self._mapNode.CardDetailCtrl:RefreshStarterCardDetail(self.tbCurCardList[self.nSelectIndex].Id)
end
function SoldierHandbookStarterCardCtrl:OnCardRefreshGrid(goGrid, gridIndex)
local nIndex = gridIndex + 1
local nInstanceId = goGrid:GetInstanceID()
if not self.tbCardItemCtrl[nInstanceId] then
self.tbCardItemCtrl[nInstanceId] = self:BindCtrlByNode(goGrid, "Game.UI.Soldier.Template.SoldierStarterCardItemCtrl")
end
self.tbCardItemCtrl[nInstanceId]:SetItemData(self.tbCurCardList[nIndex], self.nSelectIndex == nIndex)
end
function SoldierHandbookStarterCardCtrl:OnCardGridBtnClick(goGrid, gridIndex)
local nIndex = gridIndex + 1
self.nSelectIndex = nIndex
EventManager.Hit("SoldierHandbookStarterCard_Selected", self.tbCurCardList[self.nSelectIndex].Id)
self:RefreshDetail()
end
return SoldierHandbookStarterCardCtrl
@@ -0,0 +1,132 @@
local SoldierHandbookStrategyCardCtrl = class("SoldierHandbookStrategyCardCtrl", BaseCtrl)
local tabType = {
All = 1,
R = 2,
M = 3,
N = 4
}
local tab2ItemRarity = {
[tabType.All] = 1,
[tabType.R] = GameEnum.itemRarity.R,
[tabType.M] = GameEnum.itemRarity.M,
[tabType.N] = GameEnum.itemRarity.N
}
SoldierHandbookStrategyCardCtrl._mapNodeConfig = {
btn_tab = {
nCount = 4,
sComponentName = "UIButton",
callback = "OnBtnClick_Tab"
},
tab_On = {nCount = 4},
tab_Off = {nCount = 4},
sv_loop = {
sComponentName = "LoopScrollView"
},
CardDetailCtrl = {
sNodeName = "DetailRoot",
sCtrlName = "Game.UI.Soldier.Handbook.SoldierHandbookCardDetailCtrl"
}
}
SoldierHandbookStrategyCardCtrl._mapEventConfig = {}
SoldierHandbookStrategyCardCtrl._mapRedDotConfig = {}
function SoldierHandbookStrategyCardCtrl:Awake()
end
function SoldierHandbookStrategyCardCtrl:OnEnable()
end
function SoldierHandbookStrategyCardCtrl:OnDisable()
end
function SoldierHandbookStrategyCardCtrl:OnDestroy()
self:Clear()
end
function SoldierHandbookStrategyCardCtrl:Clear()
if self.tbCardItemCtrl ~= nil then
for _, v in ipairs(self.tbCardItemCtrl) do
self:UnbindCtrlByNode(v)
end
self.tbCardItemCtrl = {}
end
self._mapNode.CardDetailCtrl:Clear()
end
function SoldierHandbookStrategyCardCtrl:Init()
self.tbCardItemCtrl = {}
self:InitCardList()
self:SwitchToTab(tabType.All, true)
end
function SoldierHandbookStrategyCardCtrl:InitCardList()
self.tbAllCard = {}
self.mapCardByRarity = {}
local func_ForEach_Card = function(mapCardData)
table.insert(self.tbAllCard, mapCardData)
if self.mapCardByRarity[mapCardData.Rarity] == nil then
self.mapCardByRarity[mapCardData.Rarity] = {}
end
table.insert(self.mapCardByRarity[mapCardData.Rarity], mapCardData)
end
ForEachTableLine(DataTable.SoldierStrategyCard, func_ForEach_Card)
table.sort(self.tbAllCard, function(a, b)
if a.Rarity == b.Rarity then
return a.Id < b.Id
end
return a.Rarity < b.Rarity
end)
for nRarity, tbCard in pairs(self.mapCardByRarity) do
table.sort(tbCard, function(a, b)
return a.Id < b.Id
end)
end
end
function SoldierHandbookStrategyCardCtrl:SwitchToTab(nTab, bForce)
if self.nCurTab == nTab and not bForce then
return
end
if self.nCurTab ~= nil then
self._mapNode.tab_Off[self.nCurTab]:SetActive(true)
self._mapNode.tab_On[self.nCurTab]:SetActive(false)
else
for i = 1, 4 do
self._mapNode.tab_Off[i]:SetActive(true)
self._mapNode.tab_On[i]:SetActive(false)
end
end
self.nCurTab = nTab
self._mapNode.tab_On[self.nCurTab]:SetActive(true)
self._mapNode.tab_Off[self.nCurTab]:SetActive(false)
self:RefreshCardList()
end
function SoldierHandbookStrategyCardCtrl:RefreshCardList()
self.tbCardItemCtrl = {}
self.tbCurCardList = {}
self.nSelectIndex = 1
if self.nCurTab == tabType.All then
self.tbCurCardList = self.tbAllCard
else
self.tbCurCardList = self.mapCardByRarity[tab2ItemRarity[self.nCurTab]]
end
self._mapNode.sv_loop:Init(#self.tbCurCardList, self, self.OnCardRefreshGrid, self.OnCardGridBtnClick, false)
EventManager.Hit("SoldierHandbookStrategyCard_Selected", self.tbCurCardList[self.nSelectIndex].Id)
self:RefreshDetail()
end
function SoldierHandbookStrategyCardCtrl:RefreshDetail()
self._mapNode.CardDetailCtrl:RefreshStrategyCardDetail(self.tbCurCardList[self.nSelectIndex].Id)
end
function SoldierHandbookStrategyCardCtrl:OnCardRefreshGrid(goGrid, gridIndex)
local nIndex = gridIndex + 1
local nInstanceId = goGrid:GetInstanceID()
if not self.tbCardItemCtrl[nInstanceId] then
self.tbCardItemCtrl[nInstanceId] = self:BindCtrlByNode(goGrid, "Game.UI.Soldier.Template.SoldierStrategyCardItemCtrl")
end
self.tbCardItemCtrl[nInstanceId]:SetItemData(self.tbCurCardList[nIndex], self.nSelectIndex == nIndex)
end
function SoldierHandbookStrategyCardCtrl:OnCardGridBtnClick(goGrid, gridIndex)
local nIndex = gridIndex + 1
self.nSelectIndex = nIndex
EventManager.Hit("SoldierHandbookStrategyCard_Selected", self.tbCurCardList[self.nSelectIndex].Id)
self:RefreshDetail()
end
function SoldierHandbookStrategyCardCtrl:OnBtnClick_Tab(btn, nIndex)
if nIndex == self.nCurTab then
return
end
self:SwitchToTab(nIndex)
end
return SoldierHandbookStrategyCardCtrl
@@ -0,0 +1,105 @@
local BaseCtrl = require("GameCore.UI.BaseCtrl")
local SoldierSelectStarterCardItemCtrl = class("SoldierSelectStarterCardItemCtrl", BaseCtrl)
local RootPath = "Icon/SoldierOtherIcon/"
SoldierSelectStarterCardItemCtrl._mapNodeConfig = {
btnClose = {
sComponentName = "UIButton",
callback = "OnBtnClick_Close"
},
img_Selecticon = {sComponentName = "Image"},
txt_name = {sComponentName = "TMP_Text"},
txt_desc = {sComponentName = "TMP_Text"},
txt_charTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Detail_CharTitle"
},
sv_char = {
sComponentName = "LoopScrollView"
},
txt_desc_HyperLink = {
sNodeName = "txt_desc",
sComponentName = "TMPHyperLink",
callback = "OnBtnClick_Word"
},
txt_Empty = {
sComponentName = "TMP_Text",
sLanguageId = "Tips_Continue"
},
TextLab = {
sComponentName = "TMP_Text",
sLanguageId = "Solider_Starter_Title"
},
goChar = {
sNodeName = "tc_char_small"
},
CharContent = {sComponentName = "Transform"}
}
SoldierSelectStarterCardItemCtrl._mapEventConfig = {}
SoldierSelectStarterCardItemCtrl._mapRedDotConfig = {}
local iconCardPath = "Icon/SoldierBuffCard/"
function SoldierSelectStarterCardItemCtrl:Awake()
self.mapCharItemCtrl = {}
self.tbCharList = {}
self.tbCharItemsCtrl = {}
self.animator = self.gameObject:GetComponent("Animator")
end
function SoldierSelectStarterCardItemCtrl:OnEnable()
local tbParam = self:GetPanelParam()
if type(tbParam) == "table" and tbParam[1] ~= nil then
self:SetData(tbParam[1])
end
self.animator:Play("SoldierSelectStarterCardItem_in")
end
function SoldierSelectStarterCardItemCtrl:OnDisable()
self:_ClearCharItems()
end
function SoldierSelectStarterCardItemCtrl:OnDestroy()
end
function SoldierSelectStarterCardItemCtrl:SetData(nStarterCardId)
local starterCardConfig = ConfigTable.GetData("SoldierStarterCard", nStarterCardId)
self:SetPngSprite(self._mapNode.img_Selecticon, iconCardPath .. starterCardConfig.Icon)
NovaAPI.SetTMPText(self._mapNode.txt_name, starterCardConfig.Name)
NovaAPI.SetTMPText(self._mapNode.txt_desc, UTILS.ParseDesc(starterCardConfig))
self.tbCharList = starterCardConfig.CharacterShow or {}
local bHasChar = #self.tbCharList > 0
self._mapNode.txt_charTitle.gameObject:SetActive(bHasChar)
self._mapNode.sv_char.gameObject:SetActive(bHasChar)
if bHasChar then
self:_RefreshCharItems(self.tbCharList)
end
end
function SoldierSelectStarterCardItemCtrl:_RefreshCharItems(tbCharIds)
for k, charId in ipairs(tbCharIds) do
local itemCtrl = self.tbCharItemsCtrl[k]
if itemCtrl == nil then
local go = instantiate(self._mapNode.goChar, self._mapNode.CharContent)
itemCtrl = self:BindCtrlByNode(go, "Game.UI.Soldier.Template.Character.SoldierCharItemCtrl")
table.insert(self.tbCharItemsCtrl, itemCtrl)
end
itemCtrl.gameObject:SetActive(true)
itemCtrl:SetItemData(charId)
itemCtrl:SetCharLevel(1)
end
end
function SoldierSelectStarterCardItemCtrl:_ClearCharItems()
for _, ctrl in ipairs(self.tbCharItemsCtrl) do
local obj = ctrl.gameObject
self:UnbindCtrlByNode(ctrl)
destroy(obj)
end
self.tbCharItemsCtrl = {}
end
function SoldierSelectStarterCardItemCtrl:OnCharGridBtnClick(_goGrid, _gridIndex)
end
function SoldierSelectStarterCardItemCtrl:OnBtnClick_Close()
self.animator:Play("SoldierSelectStarterCardItem_out")
local callback = function()
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierSelectStarterCardItem)
end
self:AddTimer(1, 0.3, callback, true, true, true)
EventManager.Hit(EventId.TemporaryBlockInput, 0.3)
end
function SoldierSelectStarterCardItemCtrl:OnBtnClick_Word(link, sWordId)
UTILS.ClickWordLink(link, sWordId)
end
return SoldierSelectStarterCardItemCtrl
@@ -0,0 +1,22 @@
local SoldierSelectStarterCardItemPanel = class("SoldierSelectStarterCardItemPanel", BasePanel)
SoldierSelectStarterCardItemPanel._bIsMainPanel = false
SoldierSelectStarterCardItemPanel._sSortingLayerName = AllEnum.SortingLayerName.UI
SoldierSelectStarterCardItemPanel._tbDefine = {
{
sPrefabPath = "Soldier/Tips/SoldierSelectStarterCardItem.prefab",
sCtrlName = "Game.UI.Soldier.Handbook.SoldierSelectStarterCardItemCtrl"
}
}
function SoldierSelectStarterCardItemPanel:Awake()
end
function SoldierSelectStarterCardItemPanel:OnEnable()
end
function SoldierSelectStarterCardItemPanel:OnAfterEnter()
end
function SoldierSelectStarterCardItemPanel:OnDisable()
end
function SoldierSelectStarterCardItemPanel:OnDestroy()
end
function SoldierSelectStarterCardItemPanel:OnRelease()
end
return SoldierSelectStarterCardItemPanel
@@ -0,0 +1,108 @@
local BaseCtrl = require("GameCore.UI.BaseCtrl")
local SoldierSelectStrategyCardItemCtrl = class("SoldierSelectStrategyCardItemCtrl", BaseCtrl)
local RootPath = "Icon/SoldierOtherIcon/"
SoldierSelectStrategyCardItemCtrl._mapNodeConfig = {
btnClose = {
sComponentName = "UIButton",
callback = "OnBtnClick_Close"
},
imgBg_Gold = {},
imgBg_Silver = {},
imgBg_Copper = {},
img_Selecticon = {sComponentName = "Image"},
txt_name = {sComponentName = "TMP_Text"},
txt_desc = {sComponentName = "TMP_Text"},
txt_charTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Detail_CharTitle"
},
sv_char = {},
txt_desc_HyperLink = {
sNodeName = "txt_desc",
sComponentName = "TMPHyperLink",
callback = "OnBtnClick_Word"
},
txt_Empty = {
sComponentName = "TMP_Text",
sLanguageId = "Tips_Continue"
},
TextLab = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Strategy_Title"
},
goChar = {
sNodeName = "tc_char_small"
},
CharContent = {sComponentName = "Transform"}
}
SoldierSelectStrategyCardItemCtrl._mapEventConfig = {}
SoldierSelectStrategyCardItemCtrl._mapRedDotConfig = {}
local iconCardPath = "Icon/SoldierBuffCard/"
function SoldierSelectStrategyCardItemCtrl:Awake()
self.mapCharItemCtrl = {}
self.tbCharList = {}
self.tbCharItemsCtrl = {}
self.animator = self.gameObject:GetComponent("Animator")
end
function SoldierSelectStrategyCardItemCtrl:OnEnable()
local tbParam = self:GetPanelParam()
if type(tbParam) == "table" and tbParam[1] ~= nil then
self:SetData(tbParam[1])
end
self.animator:Play("SoldierSelectStarterCardItem_in")
end
function SoldierSelectStrategyCardItemCtrl:OnDisable()
self:_ClearCharItems()
end
function SoldierSelectStrategyCardItemCtrl:OnDestroy()
end
function SoldierSelectStrategyCardItemCtrl:SetData(nStrategyCardId)
local strategyCardConfig = ConfigTable.GetData("SoldierStrategyCard", nStrategyCardId)
self._mapNode.imgBg_Gold:SetActive(strategyCardConfig.Rarity == GameEnum.itemRarity.R)
self._mapNode.imgBg_Silver:SetActive(strategyCardConfig.Rarity == GameEnum.itemRarity.M)
self._mapNode.imgBg_Copper:SetActive(strategyCardConfig.Rarity == GameEnum.itemRarity.N)
self:SetPngSprite(self._mapNode.img_Selecticon, iconCardPath .. strategyCardConfig.Icon)
NovaAPI.SetTMPText(self._mapNode.txt_name, strategyCardConfig.Name)
NovaAPI.SetTMPText(self._mapNode.txt_desc, UTILS.ParseDesc(strategyCardConfig))
self.tbCharList = strategyCardConfig.CharacterShow or {}
local bHasChar = #self.tbCharList > 0
self._mapNode.txt_charTitle.gameObject:SetActive(bHasChar)
self._mapNode.sv_char.gameObject:SetActive(bHasChar)
if bHasChar then
self:_RefreshCharItems(self.tbCharList)
end
end
function SoldierSelectStrategyCardItemCtrl:_RefreshCharItems(tbCharIds)
for k, charId in ipairs(tbCharIds) do
local itemCtrl = self.tbCharItemsCtrl[k]
if itemCtrl == nil then
local go = instantiate(self._mapNode.goChar, self._mapNode.CharContent)
itemCtrl = self:BindCtrlByNode(go, "Game.UI.Soldier.Template.Character.SoldierCharItemCtrl")
table.insert(self.tbCharItemsCtrl, itemCtrl)
end
itemCtrl.gameObject:SetActive(true)
itemCtrl:SetItemData(charId)
end
end
function SoldierSelectStrategyCardItemCtrl:_ClearCharItems()
for _, ctrl in ipairs(self.tbCharItemsCtrl) do
local obj = ctrl.gameObject
self:UnbindCtrlByNode(ctrl)
destroy(obj)
end
self.tbCharItemsCtrl = {}
end
function SoldierSelectStrategyCardItemCtrl:OnCharGridBtnClick(_goGrid, _gridIndex)
end
function SoldierSelectStrategyCardItemCtrl:OnBtnClick_Close()
self.animator:Play("SoldierSelectStarterCardItem_out")
local callback = function()
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierSelectStrategyCardItem)
end
self:AddTimer(1, 0.3, callback, true, true, true)
EventManager.Hit(EventId.TemporaryBlockInput, 0.3)
end
function SoldierSelectStrategyCardItemCtrl:OnBtnClick_Word(link, sWordId)
UTILS.ClickWordLink(link, sWordId)
end
return SoldierSelectStrategyCardItemCtrl
@@ -0,0 +1,22 @@
local SoldierSelectStrategyCardItemPanel = class("SoldierSelectStrategyCardItemPanel", BasePanel)
SoldierSelectStrategyCardItemPanel._bIsMainPanel = false
SoldierSelectStrategyCardItemPanel._sSortingLayerName = AllEnum.SortingLayerName.UI
SoldierSelectStrategyCardItemPanel._tbDefine = {
{
sPrefabPath = "Soldier/Tips/SoldierSelectStrategyCardItem.prefab",
sCtrlName = "Game.UI.Soldier.Handbook.SoldierSelectStrategyCardItemCtrl"
}
}
function SoldierSelectStrategyCardItemPanel:Awake()
end
function SoldierSelectStrategyCardItemPanel:OnEnable()
end
function SoldierSelectStrategyCardItemPanel:OnAfterEnter()
end
function SoldierSelectStrategyCardItemPanel:OnDisable()
end
function SoldierSelectStrategyCardItemPanel:OnDestroy()
end
function SoldierSelectStrategyCardItemPanel:OnRelease()
end
return SoldierSelectStrategyCardItemPanel
@@ -0,0 +1,37 @@
local SoldierPartnerTipsCardItemCtrl = class("SoldierPartnerTipsCardItemCtrl", BaseCtrl)
SoldierPartnerTipsCardItemCtrl._mapNodeConfig = {
btnItem = {
sNodeName = "tc_char_small",
callback = "OnBtnClick_CharItem"
},
goCharItem = {
sNodeName = "tc_char_small",
sCtrlName = "Game.UI.Soldier.Template.Character.SoldierCharItemCtrl"
},
imgSelect = {},
imgMask = {},
imgInBattle = {}
}
SoldierPartnerTipsCardItemCtrl._mapEventConfig = {}
SoldierPartnerTipsCardItemCtrl._mapRedDotConfig = {}
function SoldierPartnerTipsCardItemCtrl:Awake()
end
function SoldierPartnerTipsCardItemCtrl:OnEnable()
end
function SoldierPartnerTipsCardItemCtrl:OnDisable()
end
function SoldierPartnerTipsCardItemCtrl:OnDestroy()
end
function SoldierPartnerTipsCardItemCtrl:OnRefresh(nCharId, bActive, bHave)
self._nCharId = nCharId
self._mapNode.imgInBattle:SetActive(bActive == true)
self._mapNode.imgMask:SetActive(bActive ~= true)
self._mapNode.goCharItem:SetItemData(nCharId)
self:SetCharSelect(false)
end
function SoldierPartnerTipsCardItemCtrl:SetCharSelect(bSelect)
self._mapNode.imgSelect.gameObject:SetActive(bSelect)
end
function SoldierPartnerTipsCardItemCtrl:OnBtnClick_CharItem()
end
return SoldierPartnerTipsCardItemCtrl
@@ -0,0 +1,302 @@
local SoldierAttrData = require("GameCore.Data.DataClass.Soldier.SoldierAttrData")
local CommonTipsBaseCtrl = require("Game.UI.CommonTipsEx.CommonTipsBaseCtrl")
local SoldierPartnerTipsCtrl = class("SoldierPartnerTipsCtrl", CommonTipsBaseCtrl)
SoldierPartnerTipsCtrl._mapNodeConfig = {
btnCloseTips = {
sComponentName = "Button",
callback = "OnBtnClick_ClosePanel"
},
rtContent = {
sComponentName = "RectTransform"
},
safeAreaRoot = {
sNodeName = "----SafeAreaRoot----",
sComponentName = "RectTransform"
},
TipsContent = {
sComponentName = "RectTransform"
},
imgTipsBg = {
sComponentName = "RectTransform"
},
ScrollView = {sComponentName = "ScrollRect"},
rtDescContent = {
sComponentName = "RectTransform"
},
srDesc = {
sComponentName = "RectTransform"
},
goCharItem = {sComponentName = "Transform"},
goEffectItem = {sComponentName = "Transform"},
imgPartnerBg = {sComponentName = "Image"},
imgPartnerIcon = {sComponentName = "Image"},
txtPartnerName = {sComponentName = "TMP_Text"},
btnTrace = {
sComponentName = "UIButton",
callback = "OnBtnClick_Trace"
},
btnCancel = {
sComponentName = "UIButton",
callback = "OnBtnClick_Trace"
},
txtPartnerDesc = {sComponentName = "TMP_Text"},
TMP_Link = {
sNodeName = "txtPartnerDesc",
sComponentName = "TMPHyperLink",
callback = "OnLinkClick_Word"
},
btnShortcutClose = {
sComponentName = "NaviButton",
callback = "OnBtnClick_ClosePanel"
},
btnCloseWordTip = {
sComponentName = "Button",
callback = "OnBtnClick_CloseWord"
},
imgWordTipBg = {},
TMPWordDesc = {sComponentName = "TMP_Text"},
TMPWordTipsTitle = {sComponentName = "TMP_Text"},
partner_desc = {nCount = 5},
go_Char = {
sNodeName = "tc_char_small",
sComponentName = "Transform"
},
goPartnerTitle = {
sComponentName = "RectTransform"
},
charDetialRoot = {sComponentName = "Transform"},
txtBtnTrace = {
sComponentName = "TMP_Text",
sLanguageId = "Solider_Trace"
},
txtBtnCancel = {sComponentName = "TMP_Text", sLanguageId = "BtnCancel"},
imgBG = {sNodeName = "----BG----", sComponentName = "Image"}
}
SoldierPartnerTipsCtrl._mapEventConfig = {
OnSetParnterTipsPosition = "OnEvent_SetParnterTipsPosition",
SoldierCharTips_ShowBg = "OnEvent_ShowBg"
}
SoldierPartnerTipsCtrl._mapRedDotConfig = {}
local iconPartnerPath = "Icon/SoldierPartner/"
local RootPath = "Icon/SoldierOtherIcon/"
local contentHeight = 882
SoldierPartnerTipsCtrl.minTipHeight = 59.13
SoldierPartnerTipsCtrl.maxTipHeight = 896
function SoldierPartnerTipsCtrl:Awake()
local tbParam = self:GetPanelParam()
if type(tbParam) == "table" then
self.rtTarget = tbParam[1]
self.partnerType = tbParam[2]
self.activityLevel = tbParam[3]
self.bTrace = tbParam[4]
self.tbChars = tbParam[5]
self.bCanCheckCharTips = tbParam[6] or true
end
self._tbCharItemCtrl = {}
end
function SoldierPartnerTipsCtrl:OnEnable()
self._mapNode.btnCloseWordTip.gameObject:SetActive(false)
self._mapNode.imgWordTipBg:SetActive(false)
self._mapNode.btnTrace.gameObject:SetActive(not self.bTrace and self.tbChars == nil)
self._mapNode.btnCancel.gameObject:SetActive(self.bTrace and self.tbChars == nil)
self:EnableGamepadUI(self._mapNode.btnShortcutClose, true)
self:RefreshPanel()
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
if self._mapNode == nil then
return
end
local nContentHeight = self._mapNode.rtDescContent.sizeDelta.y
if nContentHeight > self.maxTipHeight then
nContentHeight = self.maxTipHeight
NovaAPI.SetScrollRectVertical(self._mapNode.ScrollView, true)
end
if nContentHeight < self.minTipHeight then
nContentHeight = self.minTipHeight
NovaAPI.SetScrollRectVertical(self._mapNode.ScrollView, false)
end
self._mapNode.srDesc.sizeDelta = Vector2(self._mapNode.srDesc.sizeDelta.x, nContentHeight)
nContentHeight = nContentHeight + self._mapNode.goPartnerTitle.sizeDelta.y + 20
local nTipsBgHeight = nContentHeight + 10
self._mapNode.imgTipsBg.sizeDelta = Vector2(self._mapNode.imgTipsBg.sizeDelta.x, nTipsBgHeight)
if nTipsBgHeight < contentHeight then
local nDiff = contentHeight - nTipsBgHeight
local rtTargetRect = self.rtTarget:GetComponent("RectTransform")
local anchoredPos = rtTargetRect.anchoredPosition
self._tbTargetOriginPos = anchoredPos
rtTargetRect.anchoredPosition = Vector2(anchoredPos.x, anchoredPos.y + nDiff)
end
self:SetTipsPosition(self.rtTarget, self._mapNode.rtContent, self._mapNode.safeAreaRoot)
if self.bSetTipsPos ~= true then
self._mapNode.charDetialRoot.position = self._mapNode.imgTipsBg.position
end
end
cs_coroutine.start(wait)
end
function SoldierPartnerTipsCtrl:OnDisable()
self:DisableGamepadUI()
if self._tbTargetOriginPos ~= nil and self.rtTarget ~= nil then
local rtTargetRect = self.rtTarget:GetComponent("RectTransform")
rtTargetRect.anchoredPosition = self._tbTargetOriginPos
self._tbTargetOriginPos = nil
end
end
function SoldierPartnerTipsCtrl:RefreshPanel()
self:RefreshTitle()
self:RefreshLevelItems()
self:RefreshCharItems()
end
function SoldierPartnerTipsCtrl:RefreshTitle()
local partnerGroupCfg = CacheTable.GetData("_SoldierPartnerGroup", self.partnerType)
self:SetPngSprite(self._mapNode.imgPartnerIcon, iconPartnerPath .. partnerGroupCfg.Icon .. "_M")
local tbAttrData = SoldierAttrData.GetPartnerLevelsByType(self.partnerType)
local level = math.max(1, self.activityLevel)
local mapCfg = ConfigTable.GetData("SoldierPartner", tbAttrData[level].nConfigId)
if mapCfg == nil then
return
end
local sPath = self.activityLevel > 0 and RootPath .. AllEnum.SoldierPartnerLevelIcon[mapCfg.PartnerLevelQuality].bg or RootPath .. AllEnum.SoldierPartnerLevelIcon[GameEnum.PartnerLevelQuality.None].bg
self:SetPngSprite(self._mapNode.imgPartnerBg, sPath)
NovaAPI.SetTMPText(self._mapNode.txtPartnerName, partnerGroupCfg.Name)
NovaAPI.SetTMPText(self._mapNode.txtPartnerDesc, partnerGroupCfg.Desc)
end
function SoldierPartnerTipsCtrl:RefreshLevelItems()
local tbAttrData = SoldierAttrData.GetPartnerLevelsByType(self.partnerType)
for i = 1, 5 do
self._mapNode.partner_desc[i].gameObject:SetActive(tbAttrData[i] ~= nil)
if tbAttrData[i] ~= nil then
local canvasGroup = self._mapNode.partner_desc[i]:GetComponent("CanvasGroup")
local imgEffectLv = self._mapNode.partner_desc[i].transform:Find("imgEffectLv"):GetComponent("Image")
local txtEffectDesc = self._mapNode.partner_desc[i].transform:Find("txtEffectDesc"):GetComponent("TMP_Text")
local txt_level = self._mapNode.partner_desc[i].transform:Find("imgEffectLv/txt_level"):GetComponent("TMP_Text")
local mapCfg = ConfigTable.GetData("SoldierPartner", tbAttrData[i].nConfigId)
if mapCfg == nil then
return
end
self:SetPngSprite(imgEffectLv, RootPath .. AllEnum.SoldierPartnerLevelIcon[mapCfg.PartnerLevelQuality].levelIcon)
NovaAPI.SetTMPText(txtEffectDesc, mapCfg.Desc)
NovaAPI.SetTMPText(txt_level, mapCfg.Num)
NovaAPI.SetCanvasGroupAlpha(canvasGroup, i == self.activityLevel and 1 or 0.5)
end
end
end
function SoldierPartnerTipsCtrl:RefreshCharItems()
self._mapNode.go_Char.gameObject:SetActive(false)
local partnerGroupCfg = CacheTable.GetData("_SoldierPartnerGroup", self.partnerType)
if partnerGroupCfg == nil then
return
end
local tbChars = {}
for k, v in ipairs(partnerGroupCfg.ChessCharacterIds) do
table.insert(tbChars, v)
end
table.sort(tbChars, function(a, b)
local charCfgA = ConfigTable.GetData("SoldierCharacter", a)
local charCfgB = ConfigTable.GetData("SoldierCharacter", b)
if charCfgA.Rarity ~= charCfgB.Rarity then
return charCfgA.Rarity > charCfgB.Rarity
end
return a < b
end)
for i = 1, #tbChars do
if self._tbCharItemCtrl[i] ~= nil then
self:RefreshCharInfo(self._tbCharItemCtrl[i].itemCtrl, tbChars[i], self._tbCharItemCtrl[i].goItem)
self._tbCharItemCtrl[i].goItem.gameObject:SetActive(true)
else
local charItem = instantiate(self._mapNode.go_Char, self._mapNode.goCharItem)
local charItemCtrl = self:BindCtrlByNode(charItem, "Game.UI.Soldier.Template.Character.SoldierCharItemCtrl")
self:RefreshCharInfo(charItemCtrl, tbChars[i], charItem)
charItem.gameObject:SetActive(true)
table.insert(self._tbCharItemCtrl, {itemCtrl = charItemCtrl, goItem = charItem})
end
end
for i = #tbChars + 1, #self._tbCharItemCtrl do
if self._tbCharItemCtrl[i] ~= nil then
self._tbCharItemCtrl[i].goItem.gameObject:SetActive(false)
end
end
end
function SoldierPartnerTipsCtrl:RefreshCharInfo(itemCtrl, charId, goChar)
local tbDeployChess = {}
local tbWaitingChess = {}
if self.tbChars == nil or #self.tbChars <= 0 then
local curLevelData = PlayerData.SoldierData:GetCurLevelData()
if curLevelData ~= nil then
tbDeployChess, tbWaitingChess = curLevelData:GetDeploy()
end
else
tbDeployChess = self.tbChars
end
local bInBattle = false
local bInWaiting = false
local nStar = 0
itemCtrl:SetItemData(charId)
for _, char in ipairs(tbDeployChess) do
if char.nId == charId then
bInBattle = true
nStar = math.max(nStar, char.nStar)
break
end
end
for _, char in ipairs(tbWaitingChess) do
if char.nId == charId then
bInWaiting = true
nStar = math.max(nStar, char.nStar)
break
end
end
itemCtrl:SetItemState(bInBattle, not bInWaiting and not bInBattle)
itemCtrl:SetCharLevel(nStar)
if self.bCanCheckCharTips then
itemCtrl:SetCharItemBtnFunc(function()
local chessData = {
nPositionType = self.partnerType,
nId = charId,
nStar = math.max(nStar, 1)
}
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierCharCardTips, self._mapNode.charDetialRoot, chessData)
EventManager.Hit("OnSetTipsPosition", self.skillTipsPos, self.potentialTipsPos, self.partnerTipsPos)
end)
end
end
function SoldierPartnerTipsCtrl:OnBtnClick_ClosePanel()
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierPartnerTips)
end
function SoldierPartnerTipsCtrl:OnBtnClick_Trace()
local callback = function()
self.bTrace = not self.bTrace
self._mapNode.btnTrace.gameObject:SetActive(not self.bTrace)
self._mapNode.btnCancel.gameObject:SetActive(self.bTrace)
end
local curLevelData = PlayerData.SoldierData:GetCurLevelData()
if curLevelData ~= nil then
curLevelData:SetPartnerTrace(self.partnerType, not self.bTrace, callback)
end
end
function SoldierPartnerTipsCtrl:OnBtnClick_CloseWord(btn)
self._mapNode.btnCloseWordTip.gameObject:SetActive(false)
self._mapNode.imgWordTipBg:SetActive(false)
end
function SoldierPartnerTipsCtrl:OnLinkClick_Word(link, sWordId)
UTILS.ClickWordLink(link, sWordId)
end
function SoldierPartnerTipsCtrl:OnEvent_ShowBg()
self._mapNode.imgBG.enabled = true
end
function SoldierPartnerTipsCtrl:OnEvent_SetParnterTipsPosition(charTipsPos, skillTipsPos, pontentialTipsPos, partnerTipsPos)
self.bSetTipsPos = true
if charTipsPos ~= nil and self._mapNode.charDetialRoot ~= nil then
self._mapNode.charDetialRoot.position = charTipsPos
end
if skillTipsPos ~= nil then
self.skillTipsPos = skillTipsPos
end
if pontentialTipsPos ~= nil then
self.potentialTipsPos = pontentialTipsPos
end
if partnerTipsPos ~= nil then
self.partnerTipsPos = partnerTipsPos
end
end
return SoldierPartnerTipsCtrl
@@ -0,0 +1,37 @@
local SoldierPartnerTipsDesItemCtrl = class("SoldierPartnerTipsDesItemCtrl", BaseCtrl)
SoldierPartnerTipsDesItemCtrl._mapNodeConfig = {
imgEffectLv = {sComponentName = "Image"},
btnImgEffectLv = {
sNodeName = "imgEffectLv",
sComponentName = "Button"
},
txtEffectDesc = {sComponentName = "TMP_Text"}
}
SoldierPartnerTipsDesItemCtrl._mapEventConfig = {}
SoldierPartnerTipsDesItemCtrl._mapRedDotConfig = {}
local COLOR_ACTIVE_HEX = "#5fdc6e"
local COLOR_INACTIVE_HEX = "#9b3a3a"
local iconPath = "Icon/SoldierOtherIcon/"
function SoldierPartnerTipsDesItemCtrl:Awake()
end
function SoldierPartnerTipsDesItemCtrl:OnEnable()
end
function SoldierPartnerTipsDesItemCtrl:OnDisable()
end
function SoldierPartnerTipsDesItemCtrl:OnDestroy()
end
function SoldierPartnerTipsDesItemCtrl:OnRefresh(cfg, bActive)
if cfg == nil then
return
end
self._mapCfg = cfg
local iconCfg = AllEnum.SoldierPartnerLevelIcon[self._mapCfg.PartnerLevelQuality]
if iconCfg ~= nil then
local sPath = iconPath .. iconCfg.levelIcon
self:SetPngSprite(self._mapNode.imgEffectLv, sPath)
end
local sHex = bActive and COLOR_ACTIVE_HEX or COLOR_INACTIVE_HEX
NovaAPI.SetTMPText(self._mapNode.txtEffectDesc, string.format("<color=%s>%s</color>", sHex, cfg.Desc))
self._mapNode.btnImgEffectLv.interactable = bActive == true
end
return SoldierPartnerTipsDesItemCtrl
@@ -0,0 +1,24 @@
local BasePanel = require("GameCore.UI.BasePanel")
local SoldierPartnerTipsPanel = class("SoldierPartnerTipsPanel", BasePanel)
SoldierPartnerTipsPanel._bIsMainPanel = false
SoldierPartnerTipsPanel._sSortingLayerName = AllEnum.SortingLayerName.UI
SoldierPartnerTipsPanel._sSortingLayerName = AllEnum.SortingLayerName.UI_Top
SoldierPartnerTipsPanel._tbDefine = {
{
sPrefabPath = "Soldier/Tips/SoldierPartnerTipsPanel.prefab",
sCtrlName = "Game.UI.Soldier.PartnerTipsPanel.SoldierPartnerTipsCtrl"
}
}
function SoldierPartnerTipsPanel:Awake()
end
function SoldierPartnerTipsPanel:OnEnable()
end
function SoldierPartnerTipsPanel:OnAfterEnter()
end
function SoldierPartnerTipsPanel:OnDisable()
end
function SoldierPartnerTipsPanel:OnDestroy()
end
function SoldierPartnerTipsPanel:OnRelease()
end
return SoldierPartnerTipsPanel
@@ -0,0 +1,98 @@
local SoldierRecommendCellCtrl = class("SoldierRecommendCellCtrl", BaseCtrl)
SoldierRecommendCellCtrl._mapNodeConfig = {
txt_title = {sComponentName = "TMP_Text"},
sv_char = {
sComponentName = "LoopScrollView"
},
img_Char = {sComponentName = "Image"},
btn_Apply = {
sComponentName = "UIButton",
callback = "OnBtnClick_Apply"
},
txt_Apply = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Recommend_Apply"
},
btn_Cancel = {
sComponentName = "UIButton",
callback = "OnBtnClick_Cancel"
},
txt_Cancel = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Recommend_Cancel"
},
img_Use = {},
txt_Use = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Recommend_Use"
}
}
SoldierRecommendCellCtrl._mapEventConfig = {
SoldierRecommend_Update = "OnEvent_SoldierRecommendCell_Update"
}
SoldierRecommendCellCtrl._mapRedDotConfig = {}
function SoldierRecommendCellCtrl:Awake()
self.tbCharItemCtrl = {}
end
function SoldierRecommendCellCtrl:OnEnable()
end
function SoldierRecommendCellCtrl:OnDisable()
for _, v in ipairs(self.tbCharItemCtrl) do
self:UnbindCtrlByNode(v)
end
self.tbCharItemCtrl = nil
end
function SoldierRecommendCellCtrl:OnDestroy()
end
function SoldierRecommendCellCtrl:SetItemData(mapRecommendData, bInSoldier)
self.bInSoldier = bInSoldier
self.mapRecommendData = mapRecommendData
self.cfg = ConfigTable.GetData("SoldierRecommendBuilds", self.mapRecommendData.nRecommendId)
NovaAPI.SetTMPText(self._mapNode.txt_title, self.cfg.Title)
local nMainCharId = self.cfg.CharacterId
local mainCharCfg = ConfigTable.GetData("SoldierCharacter", nMainCharId)
if mainCharCfg ~= nil then
local skinConfig = ConfigTable.GetData("SoldierSkin", mainCharCfg.Skin)
if skinConfig then
self:SetPngSprite(self._mapNode.img_Char, skinConfig.Icon .. AllEnum.SoldierChessIconSurfix.S)
end
end
self._mapNode.sv_char:Init(#self.mapRecommendData.charList, self, self.OnCharRefreshGrid, self.OnCharGridBtnClick, false)
self:SetApplyStatus()
end
function SoldierRecommendCellCtrl:OnCharRefreshGrid(goGrid, gridIndex)
local nIndex = gridIndex + 1
local charData = self.mapRecommendData.charList[nIndex]
local go_char = goGrid.transform:Find("AnimRoot/SoldierCharCardItem")
local nInstanceId = go_char:GetInstanceID()
if not self.tbCharItemCtrl[nInstanceId] then
self.tbCharItemCtrl[nInstanceId] = self:BindCtrlByNode(go_char, "Game.UI.Soldier.Template.Character.SoldierCharCardItemCtrl")
end
self.tbCharItemCtrl[nInstanceId]:SetItemData(charData.nId)
self.tbCharItemCtrl[nInstanceId]:SetStar(charData.nStar)
self.tbCharItemCtrl[nInstanceId]:SetAttribute(nIndex)
end
function SoldierRecommendCellCtrl:SetApplyStatus()
local bApply = false
local recommendData = PlayerData.SoldierData:GetRecommendData(self.bInSoldier)
if recommendData ~= nil and recommendData.nRecommendId == self.mapRecommendData.nRecommendId then
bApply = true
end
self._mapNode.btn_Apply.gameObject:SetActive(not bApply)
self._mapNode.btn_Cancel.gameObject:SetActive(bApply)
self._mapNode.img_Use.gameObject:SetActive(bApply)
end
function SoldierRecommendCellCtrl:OnCharGridBtnClick(goGrid, gridIndex)
local nIndex = gridIndex + 1
local charId = self.mapRecommendData.charList[nIndex].nId
end
function SoldierRecommendCellCtrl:OnBtnClick_Apply()
PlayerData.SoldierData:SetRecommendData(self.mapRecommendData.nRecommendId, self.bInSoldier)
end
function SoldierRecommendCellCtrl:OnBtnClick_Cancel()
PlayerData.SoldierData:SetRecommendData(0, self.bInSoldier)
end
function SoldierRecommendCellCtrl:OnEvent_SoldierRecommendCell_Update()
self:SetApplyStatus()
end
return SoldierRecommendCellCtrl
@@ -0,0 +1,84 @@
local SoldierRecommendCtrl = class("SoldierRecommendCtrl", BaseCtrl)
SoldierRecommendCtrl._mapNodeConfig = {
Topbar = {
sNodeName = "TopBarPanel",
sCtrlName = "Game.UI.TopBarEx.TopBarCtrl"
},
btnHome = {},
txt_tips = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Recommend_Tips"
},
sv_recommend = {
sComponentName = "LoopScrollView"
}
}
SoldierRecommendCtrl._mapEventConfig = {}
SoldierRecommendCtrl._mapRedDotConfig = {}
function SoldierRecommendCtrl:Awake()
local param = self:GetPanelParam()
if type(param) == "table" then
self.bInSoldier = param[1]
end
self.bInSoldier = self.bInSoldier or false
self.animator = self.gameObject:GetComponent("Animator")
end
function SoldierRecommendCtrl:OnEnable()
self.tbRecommendCellCtrl = {}
self.tbRecommendData = {}
self:InitData()
EventManager.Hit("SoldierRecommendPanel_Open")
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
self._mapNode.btnHome.gameObject:SetActive(not self.bInSoldier)
end
cs_coroutine.start(wait)
end
function SoldierRecommendCtrl:OnDisable()
for _, v in ipairs(self.tbRecommendCellCtrl) do
self:UnbindCtrlByNode(v)
end
self.tbRecommendCellCtrl = nil
EventManager.Hit("SoldierRecommendPanel_Close")
end
function SoldierRecommendCtrl:InitData()
local tbRecommendData = PlayerData.SoldierData:GetAllRecommendData()
if tbRecommendData == nil then
return
end
for _, v in ipairs(tbRecommendData) do
table.insert(self.tbRecommendData, v)
end
local nApplyData = PlayerData.SoldierData:GetRecommendData(self.bInSoldier)
if nApplyData ~= nil then
table.sort(self.tbRecommendData, function(a, b)
if a.nRecommendId == nApplyData.nRecommendId then
return true
end
if b.nRecommendId == nApplyData.nRecommendId then
return false
end
return a.nRecommendId < b.nRecommendId
end)
end
self._mapNode.sv_recommend:SetAnim(0.08)
self._mapNode.sv_recommend:Init(#self.tbRecommendData, self, self.OnRecommendRefreshGrid, self.OnRecommendGridBtnClick, false)
end
function SoldierRecommendCtrl:OnRecommendRefreshGrid(goGrid, gridIndex)
local nIndex = gridIndex + 1
local mapRecommendData = self.tbRecommendData[nIndex]
local nInstanceID = goGrid:GetInstanceID()
if not self.tbRecommendCellCtrl[nInstanceID] then
self.tbRecommendCellCtrl[nInstanceID] = self:BindCtrlByNode(goGrid, "Game.UI.Soldier.Recommend.SoldierRecommendCellCtrl")
end
self.tbRecommendCellCtrl[nInstanceID]:SetItemData(mapRecommendData, self.bInSoldier)
end
function SoldierRecommendCtrl:OnRecommendGridBtnClick(goGrid, gridIndex)
local nIndex = gridIndex + 1
local mapRecommendData = self.tbRecommendData[nIndex]
self.animator:Play("SoldierRecommendPanel_out")
self:AddTimer(1, 0.26, function()
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierRecommendDetailPanel, mapRecommendData, self.bInSoldier)
end, true, true, true)
end
return SoldierRecommendCtrl
@@ -0,0 +1,217 @@
local SoldierRecommendDetailCtrl = class("SoldierRecommendDetailCtrl", BaseCtrl)
local iconPath = "Icon/SoldierBuffCard/"
local iconPath2 = "Icon/SoldierOtherIcon/"
SoldierRecommendDetailCtrl._mapNodeConfig = {
Topbar = {
sNodeName = "TopBarPanel",
sCtrlName = "Game.UI.TopBarEx.TopBarCtrl"
},
btnHome = {},
img_Use = {},
txt_Use = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Recommend_Use"
},
MainChar = {
nCount = 3,
sCtrlName = "Game.UI.Soldier.Template.Character.SoldierCharSupportCardItemCtrl"
},
BackChar = {
nCount = 6,
sCtrlName = "Game.UI.Soldier.Template.Character.SoldierCharSupportCardItemCtrl"
},
txt_title = {sComponentName = "TMP_Text"},
txt_buildTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Recommend_BuildTitle"
},
txt_skillTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_RecommendDetail_Tips"
},
txt_desc = {sComponentName = "TMP_Text"},
img_pos = {nCount = 3, sComponentName = "Image"},
partnerCtrl = {
sNodeName = "PartnerRoot",
sCtrlName = "Game.UI.Soldier.Recommend.SpliderRecommendPartnerCtrl"
},
starterCard = {},
strategyCardPrefab = {},
buffList = {
sNodeName = "BuffListRoot"
},
btn_Apply = {
sComponentName = "UIButton",
callback = "OnBtnClick_Apply"
},
txt_Apply = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Recommend_Apply"
},
btn_Cancel = {
sComponentName = "UIButton",
callback = "OnBtnClick_Cancel"
},
txt_Cancel = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Recommend_Cancel"
},
charDetialRoot = {sComponentName = "Transform"},
parnterDetialRoot = {sComponentName = "Transform"}
}
SoldierRecommendDetailCtrl._mapEventConfig = {}
SoldierRecommendDetailCtrl._mapRedDotConfig = {}
function SoldierRecommendDetailCtrl:Awake()
local param = self:GetPanelParam()
if type(param) == "table" then
self.mapRecommendData = param[1]
self.bInSoldier = param[2]
end
self.nRecommendId = self.mapRecommendData.nRecommendId
if self.mapRecommendData == nil then
return
end
self.recommendCfg = ConfigTable.GetData("SoldierRecommendBuilds", self.nRecommendId)
if self.recommendCfg == nil then
return
end
self:RefreshUI()
self:SetApplyStatus()
end
function SoldierRecommendDetailCtrl:OnEnable()
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
self._mapNode.btnHome.gameObject:SetActive(not self.bInSoldier)
end
cs_coroutine.start(wait)
end
function SoldierRecommendDetailCtrl:RefreshUI()
NovaAPI.SetTMPText(self._mapNode.txt_title, self.recommendCfg.Title)
NovaAPI.SetTMPText(self._mapNode.txt_desc, self.recommendCfg.Desc)
for i = 1, 3 do
local charData = self.mapRecommendData.charList[i]
if charData then
self._mapNode.MainChar[i]:SetItemData(charData.nId)
self._mapNode.MainChar[i]:SetStar(charData.nStar)
do
local callback = function(obj, nCharId)
local chessData = {
nId = charData.nId,
nStar = charData.nStar
}
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierCharCardTips, self._mapNode.charDetialRoot, chessData)
EventManager.Hit("OnSetTipsPosition", self._mapNode.charDetialRoot:GetChild(0).position, self._mapNode.charDetialRoot:GetChild(1).position, self._mapNode.charDetialRoot:GetChild(2).position)
EventManager.Hit("SoldierCharTips_ShowBg")
end
self._mapNode.MainChar[i]:SetClickCallback(_, callback)
end
end
end
for i = 1, 3 do
local img_pos = self._mapNode.img_pos[i]
local nCfgId = PlayerData.SoldierData:GetSoldierPositionEffectDataId(i)
local cfg = ConfigTable.GetData("SoldierPositionEffect", nCfgId)
if cfg then
self:SetPngSprite(img_pos, iconPath2 .. cfg.Icon)
end
end
for i = 4, 9 do
local charData = self.mapRecommendData.charList[i]
if charData then
self._mapNode.BackChar[i - 3]:SetItemData(charData.nId)
self._mapNode.BackChar[i - 3]:SetStar(charData.nStar)
local callback = function(obj, nCharId)
local chessData = {
nId = charData.nId,
nStar = charData.nStar,
nPositionType = nPositionType
}
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierCharCardTips, self._mapNode.charDetialRoot, chessData)
EventManager.Hit("OnSetTipsPosition", self._mapNode.charDetialRoot:GetChild(0).position, self._mapNode.charDetialRoot:GetChild(1).position, self._mapNode.charDetialRoot:GetChild(2).position)
EventManager.Hit("SoldierCharTips_ShowBg")
end
self._mapNode.BackChar[i - 3]:SetClickCallback(_, callback)
else
self._mapNode.BackChar[i - 3]:SetItemData(nil)
end
end
local img_starterCardIcon = self._mapNode.starterCard.transform:Find("img_iconBg/img_icon"):GetComponent("Image")
local txt_name = self._mapNode.starterCard.transform:Find("txt_name"):GetComponent("TMP_Text")
local starterCardConfig = ConfigTable.GetData("SoldierStarterCard", self.recommendCfg.StarterCard)
if starterCardConfig then
self:SetPngSprite(img_starterCardIcon, iconPath .. starterCardConfig.Icon)
NovaAPI.SetTMPText(txt_name, starterCardConfig.Name)
local btn_detail = self._mapNode.starterCard.transform:Find("btn_detail"):GetComponent("UIButton")
btn_detail.onClick:RemoveAllListeners()
btn_detail.onClick:AddListener(function()
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierSelectStarterCardItem, self.recommendCfg.StarterCard)
end)
end
local tr = self._mapNode.buffList.transform
for i = tr.childCount, 1, -1 do
GameObject.Destroy(tr:GetChild(i - 1).gameObject)
end
for _, buffId in ipairs(self.recommendCfg.StrategyCard) do
local buffConfig = ConfigTable.GetData("SoldierStrategyCard", buffId)
if buffConfig then
local go_buff = instantiate(self._mapNode.strategyCardPrefab, tr)
go_buff.transform:SetParent(tr)
go_buff.transform.localScale = Vector3.one
local img_icon = go_buff.transform:Find("img_iconBg/img_icon"):GetComponent("Image")
local img_bg = go_buff.transform:Find("img_iconBg"):GetComponent("Image")
local txt_name = go_buff.transform:Find("txt_name"):GetComponent("TMP_Text")
local btn_detail = go_buff.transform:Find("btn_detail"):GetComponent("UIButton")
btn_detail.onClick:RemoveAllListeners()
btn_detail.onClick:AddListener(function()
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierSelectStrategyCardItem, buffId)
end)
self:SetPngSprite(img_icon, iconPath .. buffConfig.Icon)
if buffConfig.Rarity ~= 0 then
self:SetPngSprite(img_bg, iconPath2 .. AllEnum.SoldierStrategyCardRarityIcon[buffConfig.Rarity] .. AllEnum.SoldierChessIconSurfix.S)
end
NovaAPI.SetTMPText(txt_name, buffConfig.Name)
go_buff:SetActive(true)
end
end
local tbPartnerAdd = decodeJson(self.recommendCfg.PartnerAdd)
local mapExtraPartner = {}
for k, v in pairs(tbPartnerAdd) do
mapExtraPartner[tonumber(k)] = tonumber(v)
end
local tbExPartner = {}
for partnerId, addLevel in pairs(mapExtraPartner) do
local partnerCfg = ConfigTable.GetData("SoldierPartner", partnerId)
if partnerCfg then
tbExPartner[partnerCfg.PartnerType] = addLevel
end
end
self._mapNode.partnerCtrl:RefreshPartner(self.mapRecommendData.charList, tbExPartner)
self._mapNode.partnerCtrl:SetPartnerDetailRoot(self._mapNode.parnterDetialRoot)
end
function SoldierRecommendDetailCtrl:SetApplyStatus()
local bApply = false
local recommendData = PlayerData.SoldierData:GetRecommendData(self.bInSoldier)
if recommendData ~= nil and recommendData.nRecommendId == self.mapRecommendData.nRecommendId then
bApply = true
end
self._mapNode.btn_Apply.gameObject:SetActive(not bApply)
self._mapNode.btn_Cancel.gameObject:SetActive(bApply)
self._mapNode.img_Use.gameObject:SetActive(bApply)
end
function SoldierRecommendDetailCtrl:OnDestroy()
end
function SoldierRecommendDetailCtrl:OnBtnClick_Apply()
PlayerData.SoldierData:SetRecommendData(self.mapRecommendData.nRecommendId, self.bInSoldier)
self:SetApplyStatus()
end
function SoldierRecommendDetailCtrl:OnBtnClick_Cancel()
PlayerData.SoldierData:SetRecommendData(0, self.bInSoldier)
self:SetApplyStatus()
end
function SoldierRecommendDetailCtrl:OnBtnClick_StarterCard()
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierSelectStarterCardItem, self.recommendCfg.StarterCard)
end
function SoldierRecommendDetailCtrl:OnBtnClick_StrategyCard()
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierStrategyCardTips, self.gameObject.transform, nBuffId)
end
return SoldierRecommendDetailCtrl
@@ -0,0 +1,20 @@
local SoldierRecommendDetailPanel = class("SoldierRecommendDetailPanel", BasePanel)
SoldierRecommendDetailPanel._tbDefine = {
{
sPrefabPath = "Soldier/SoldierRecommendDetailPanel.prefab",
sCtrlName = "Game.UI.Soldier.Recommend.SoldierRecommendDetailCtrl"
}
}
function SoldierRecommendDetailPanel:Awake()
end
function SoldierRecommendDetailPanel:OnEnable()
end
function SoldierRecommendDetailPanel:OnAfterEnter()
end
function SoldierRecommendDetailPanel:OnDisable()
end
function SoldierRecommendDetailPanel:OnDestroy()
end
function SoldierRecommendDetailPanel:OnRelease()
end
return SoldierRecommendDetailPanel
@@ -0,0 +1,20 @@
local SoldierRecommendPanel = class("SoldierRecommendPanel", BasePanel)
SoldierRecommendPanel._tbDefine = {
{
sPrefabPath = "Soldier/SoldierRecommendPanel.prefab",
sCtrlName = "Game.UI.Soldier.Recommend.SoldierRecommendCtrl"
}
}
function SoldierRecommendPanel:Awake()
end
function SoldierRecommendPanel:OnEnable()
end
function SoldierRecommendPanel:OnAfterEnter()
end
function SoldierRecommendPanel:OnDisable()
end
function SoldierRecommendPanel:OnDestroy()
end
function SoldierRecommendPanel:OnRelease()
end
return SoldierRecommendPanel
@@ -0,0 +1,78 @@
local SpliderRecommendPartnerCtrl = class("SpliderRecommendPartnerCtrl", BaseCtrl)
local SoldierAttrData = require("GameCore.Data.DataClass.Soldier.SoldierAttrData")
local iconPath = "Icon/SoldierOtherIcon/"
local partnerPath = "Icon/SoldierPartner/"
SpliderRecommendPartnerCtrl._mapNodeConfig = {
sv_partner = {
sComponentName = "LoopScrollView"
}
}
SpliderRecommendPartnerCtrl._mapEventConfig = {}
SpliderRecommendPartnerCtrl._mapRedDotConfig = {}
function SpliderRecommendPartnerCtrl:Awake()
end
function SpliderRecommendPartnerCtrl:OnDestroy()
end
function SpliderRecommendPartnerCtrl:RefreshPartner(tbCharList, tbExPartner)
self.tbCharList = tbCharList
local _, tbUIData = SoldierAttrData.CalcActivePartners(self.tbCharList, tbExPartner)
self.tbPartner = tbUIData
self:RefreshPartnerUI()
end
function SpliderRecommendPartnerCtrl:RefreshPartnerUI()
self._mapNode.sv_partner:Init(#self.tbPartner, self, self.OnPartnerRefreshGrid, self.OnPartnerGridBtnClick, false)
end
function SpliderRecommendPartnerCtrl:OnPartnerRefreshGrid(goGrid, gridIndex)
local nIndex = gridIndex + 1
local partner = self.tbPartner[nIndex]
local partnerGroupCfg = CacheTable.GetData("_SoldierPartnerGroup", partner.nType)
if partnerGroupCfg == nil then
return
end
local nIndex = table.indexof(partner.tbNumList, partner.nActiveNum)
local partnerCfgList = CacheTable.GetData("_SoldierPartner", partner.nType)
if partnerCfgList == nil then
return
end
local partnerCfg = partnerCfgList[partner.nActiveLevel]
if partnerCfg == nil then
partnerCfg = partnerCfgList[1]
end
local img_bg = goGrid.transform:Find("img_icon"):GetComponent("Image")
local img_icon = goGrid.transform:Find("img_icon/img_Partnericon"):GetComponent("Image")
local txt_name = goGrid.transform:Find("txt_name"):GetComponent("TMP_Text")
local txtPartner = goGrid.transform:Find("imgPartnerbg/txt_level"):GetComponent("TMP_Text")
local txtPartner2 = goGrid.transform:Find("imgLevelBg/txt_level2"):GetComponent("TMP_Text")
if partner.nActiveLevel == 0 then
self:SetPngSprite(img_bg, iconPath .. AllEnum.SoldierPartnerLevelIcon[GameEnum.PartnerLevelQuality.None].bg)
else
self:SetPngSprite(img_bg, iconPath .. AllEnum.SoldierPartnerLevelIcon[partnerCfg.PartnerLevelQuality].bg)
end
self:SetPngSprite(img_icon, partnerPath .. partnerGroupCfg.Icon .. AllEnum.SoldierChessIconSurfix.M)
NovaAPI.SetTMPText(txt_name, partnerCfg.Name)
NovaAPI.SetTMPText(txtPartner2, partner.nCurNum)
local strLevel = ""
for i = 1, #partner.tbNumList do
if 1 < i then
strLevel = strLevel .. "/"
end
if i ~= partner.nActiveLevel then
strLevel = strLevel .. partner.tbNumList[i]
else
strLevel = strLevel .. "<color=#EED9BD>" .. partner.tbNumList[i] .. "</color>"
end
end
NovaAPI.SetTMPText(txtPartner, strLevel)
end
function SpliderRecommendPartnerCtrl:SetPartnerDetailRoot(tr)
self.partnerDetailRoot = tr
end
function SpliderRecommendPartnerCtrl:OnPartnerGridBtnClick(goGrid, gridIndex)
local nIndex = gridIndex + 1
local mapPartner = self.tbPartner[nIndex]
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierPartnerTips, self.partnerDetailRoot, mapPartner.nType, mapPartner.nActiveLevel, false, self.tbCharList)
local tr = self.partnerDetailRoot:GetChild(0)
EventManager.Hit("OnSetParnterTipsPosition", tr.position, tr:GetChild(0).position, tr:GetChild(1).position)
EventManager.Hit("SoldierCharTips_ShowBg")
end
return SpliderRecommendPartnerCtrl
@@ -0,0 +1,79 @@
local BaseCtrl = require("GameCore.UI.BaseCtrl")
local SoldierBuffCtrl = class("SoldierBuffCtrl", BaseCtrl)
SoldierBuffCtrl._mapNodeConfig = {
BigBuffItem = {
sNodeName = "BigBuff",
sCtrlName = "Game.UI.Soldier.Sandtable.Items.SoldierBuffItemCtrl"
},
sv_buff = {
sComponentName = "LoopScrollView"
},
smallBuff = {
sNodeName = "buff",
nCount = 20,
sCtrlName = "Game.UI.Soldier.Sandtable.Items.SoldierBuffItemCtrl"
},
imgLineRoot = {},
goBuffRoot = {
sComponentName = "RectTransform"
}
}
SoldierBuffCtrl._mapEventConfig = {}
SoldierBuffCtrl._mapRedDotConfig = {}
function SoldierBuffCtrl:Awake()
end
function SoldierBuffCtrl:OnEnable()
end
function SoldierBuffCtrl:OnDisable()
end
function SoldierBuffCtrl:OnDestroy()
end
function SoldierBuffCtrl:RefreshBuff()
self._nStarterCardId = 0
self._tbStrategyCardIds = {}
self.tbBuffCfgs = {}
if self.btn_detail == nil then
self.btn_detail = self.gameObject:GetComponent("UIButton")
end
local levelData = PlayerData.SoldierData:GetCurLevelData()
local tbStarterCard, tbStrategyCard = levelData:GetCardData()
if tbStarterCard == nil or #tbStarterCard == 0 then
self._mapNode.goBuffRoot.gameObject:SetActive(false)
return
end
self._mapNode.goBuffRoot.gameObject:SetActive(true)
self._nStarterCardId = tbStarterCard[1].nId
self._tbStrategyCardIds = tbStrategyCard
local cfg = ConfigTable.GetData("SoldierStarterCard", self._nStarterCardId)
table.insert(self.tbBuffCfgs, cfg)
for k, v in ipairs(self._tbStrategyCardIds) do
local cfg = ConfigTable.GetData("SoldierStrategyCard", v.nId)
table.insert(self.tbBuffCfgs, cfg)
end
self.btn_detail.onClick:RemoveAllListeners()
self.btn_detail.onClick:AddListener(function()
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierBuffTipsPanel, self.tbBuffCfgs)
end)
self:_RefreshBuffItems()
end
function SoldierBuffCtrl:_RefreshBuffItems()
self._mapNode.imgLineRoot.gameObject:SetActive(#self._tbStrategyCardIds > 0)
if self._mapNode.BigBuffItem ~= nil then
local cfg = ConfigTable.GetData("SoldierStarterCard", self._nStarterCardId)
self._mapNode.BigBuffItem:SetData(cfg)
end
for k, v in ipairs(self._mapNode.smallBuff) do
v.gameObject:SetActive(false)
end
for k, v in ipairs(self._tbStrategyCardIds) do
if self._mapNode.smallBuff[k] ~= nil then
local cfg = ConfigTable.GetData("SoldierStrategyCard", v.nId)
self._mapNode.smallBuff[k]:SetData(cfg)
self._mapNode.smallBuff[k].gameObject:SetActive(true)
end
end
CS.UnityEngine.UI.LayoutRebuilder.ForceRebuildLayoutImmediate(self._mapNode.goBuffRoot)
end
function SoldierBuffCtrl:RefreshBuffItem(goGrid, gridIndex)
end
return SoldierBuffCtrl
@@ -0,0 +1,72 @@
local BaseCtrl = require("GameCore.UI.BaseCtrl")
local SoldierBuffTipsCtrl = class("SoldierBuffTipsCtrl", BaseCtrl)
SoldierBuffTipsCtrl._mapNodeConfig = {
btnClose = {
sComponentName = "UIButton",
callback = "OnBtnClick_Close"
},
loopTips = {
sComponentName = "LoopScrollView",
sNodeName = "sv"
},
grid = {
sComponentName = "RectTransform"
}
}
SoldierBuffTipsCtrl._mapEventConfig = {}
local RootPath = "Icon/SoldierBuffCard/"
local bgPath = "Icon/SoldierOtherIcon/"
local initHeight = 90.85
local gridHeight = 224
function SoldierBuffTipsCtrl:Awake()
local param = self:GetPanelParam()
if type(param) == "table" then
self.tbBuffCfgs = param[1] or {}
end
end
function SoldierBuffTipsCtrl:OnEnable()
self:RefreshBuffTips()
end
function SoldierBuffTipsCtrl:RefreshBuffTips()
self:CalBuffHeight()
self._mapNode.loopTips:InitEx(self.tbBuffHeight, self, self.RefreshBuffTipsItem)
end
function SoldierBuffTipsCtrl:CalBuffHeight()
self.tbBuffHeight = {}
for i, cfg in ipairs(self.tbBuffCfgs) do
local buffItem = self._mapNode.grid.transform:Find("btnGrid/AnimRoot/BuffItem")
local TextName = buffItem.transform:Find("imgItemBg/TextName"):GetComponent("TMP_Text")
local imgItemBg = buffItem.transform:Find("imgItemBg"):GetComponent("RectTransform")
NovaAPI.SetTMPText(TextName, cfg.Desc)
CS.UnityEngine.UI.LayoutRebuilder.ForceRebuildLayoutImmediate(imgItemBg)
local nHeight = imgItemBg.sizeDelta.y - initHeight
table.insert(self.tbBuffHeight, nHeight + gridHeight)
end
end
function SoldierBuffTipsCtrl:RefreshBuffTipsItem(grid, gridIndex)
gridIndex = gridIndex + 1
local cfg = self.tbBuffCfgs[gridIndex]
if cfg then
local buffItem = grid.transform:Find("btnGrid/AnimRoot/BuffItem")
local txtTitle = buffItem.transform:Find("txtTitle"):GetComponent("TMP_Text")
local ImageIcon = buffItem.transform:Find("ImageIcon"):GetComponent("Image")
local TextName = buffItem.transform:Find("imgItemBg/TextName"):GetComponent("TMP_Text")
local ImageIconBg = buffItem.transform:Find("ImageIconBg"):GetComponent("Image")
NovaAPI.SetTMPText(txtTitle, cfg.Name)
self:SetPngSprite(ImageIcon, RootPath .. cfg.Icon)
NovaAPI.SetTMPText(TextName, cfg.Desc)
if cfg.Rarity ~= 0 then
self:SetPngSprite(ImageIconBg, bgPath .. AllEnum.SoldierStrategyCardRarityIcon[cfg.Rarity] .. AllEnum.SoldierChessIconSurfix.S)
end
local ImageLine = buffItem.transform:Find("imgItemBg/imgLine").gameObject
ImageLine:SetActive(gridIndex == 1 and 1 < #self.tbBuffCfgs)
end
end
function SoldierBuffTipsCtrl:OnDisable()
end
function SoldierBuffTipsCtrl:OnDestroy()
end
function SoldierBuffTipsCtrl:OnBtnClick_Close()
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierBuffTipsPanel)
end
return SoldierBuffTipsCtrl
@@ -0,0 +1,20 @@
local BasePanel = require("GameCore.UI.BasePanel")
local SoldierBuffTipsPanel = class("SoldierBuffTipsPanel", BasePanel)
SoldierBuffTipsPanel._bIsMainPanel = false
SoldierBuffTipsPanel._tbDefine = {
{
sPrefabPath = "Soldier/Tips/SoldierBuffTips.prefab",
sCtrlName = "Game.UI.Soldier.Sandtable.Components.SoldierBuffTipsCtrl"
}
}
function SoldierBuffTipsPanel:Awake()
end
function SoldierBuffTipsPanel:OnEnable()
end
function SoldierBuffTipsPanel:OnDisable()
end
function SoldierBuffTipsPanel:OnDestroy()
end
function SoldierBuffTipsPanel:OnRelease()
end
return SoldierBuffTipsPanel
@@ -0,0 +1,32 @@
local iconPath2 = "Icon/SoldierOtherIcon/"
local SoldierEffectDesCtrl = class("SoldierEffectDesCtrl", BaseCtrl)
SoldierEffectDesCtrl._mapNodeConfig = {
txtTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Sandtable_PositionEffect"
},
ImageIcon = {sComponentName = "Image"},
TextDes = {sComponentName = "TMP_Text"},
btnClose = {
sComponentName = "UIButton",
callback = "OnBtnClick_Close"
}
}
SoldierEffectDesCtrl._mapEventConfig = {}
SoldierEffectDesCtrl._mapRedDotConfig = {}
function SoldierEffectDesCtrl:HideTips()
self.gameObject:SetActive(false)
end
function SoldierEffectDesCtrl:ShowTips(nPositionIndex)
self.gameObject:SetActive(true)
local nCfgId = PlayerData.SoldierData:GetSoldierPositionEffectDataId(nPositionIndex)
local cfg = ConfigTable.GetData("SoldierPositionEffect", nCfgId)
if cfg then
self:SetPngSprite(self._mapNode.ImageIcon, iconPath2 .. cfg.Icon)
NovaAPI.SetTMPText(self._mapNode.TextDes, cfg.KeyEffectDes)
end
end
function SoldierEffectDesCtrl:OnBtnClick_Close()
self:HideTips()
end
return SoldierEffectDesCtrl
@@ -0,0 +1,37 @@
local SoldierNodeTipsCtrl = class("SoldierNodeTipsCtrl", BaseCtrl)
local AssetRoot = "Icon/SoldierOtherIcon/"
SoldierNodeTipsCtrl._mapNodeConfig = {
btnClose = {
sComponentName = "UIButton",
callback = "OnBtnClick_Close"
},
txtTitle = {
sComponentName = "TMP_Text",
sLanguageId = "SoldierNodeTips_Title"
},
Item = {nCount = 4}
}
SoldierNodeTipsCtrl._mapEventConfig = {}
SoldierNodeTipsCtrl._mapRedDotConfig = {}
function SoldierNodeTipsCtrl:Awake()
for i = 1, 4 do
local item = self._mapNode.Item[i]
local imageIcon = item.transform:Find("ImageIcon"):GetComponent("Image")
local textName = item.transform:Find("TextName"):GetComponent("TMP_Text")
local nodeConfig = AllEnum.SoliderNoteTypeCfg[i]
if nodeConfig then
self:SetPngSprite(imageIcon, AssetRoot .. nodeConfig.Icon)
NovaAPI.SetTMPText(textName, ConfigTable.GetUIText(nodeConfig.Language))
end
end
end
function SoldierNodeTipsCtrl:OpenNodeTips(nodeInfo)
self.gameObject:SetActive(true)
end
function SoldierNodeTipsCtrl:HideNodeTips()
self.gameObject:SetActive(false)
end
function SoldierNodeTipsCtrl:OnBtnClick_Close()
self:HideNodeTips()
end
return SoldierNodeTipsCtrl
@@ -0,0 +1,226 @@
local SoldierShopCtrl = class("SoldierShopCtrl", BaseCtrl)
SoldierShopCtrl._mapNodeConfig = {
btn_CloseShop = {
sComponentName = "UIButton",
callback = "OnBtnClick_CloseShop"
},
SoldierCharCardShopItem = {
nCount = 5,
sCtrlName = "Game.UI.Soldier.Sandtable.Items.SoldierCharCardShopItemCtrl"
},
btnRefreshShop = {
sComponentName = "UIButton",
callback = "OnBtnClick_RefreshShop"
},
txtBtnRefreshShop = {sComponentName = "TMP_Text"},
imgBtnRefreshShopMask = {},
goCoinRaidUnlock = {},
txtRefreshCount = {sComponentName = "TMP_Text"},
goCoinRaidFree = {},
txtRefreshFreeCount = {sComponentName = "TMP_Text"},
btnLock = {
sComponentName = "UIButton",
callback = "OnBtnClick_Lock"
},
imgLocked = {},
imgUnlocked = {},
goProbabilityBarItem = {nCount = 5},
imgTickets = {},
btn_Probability = {
sComponentName = "UIButton",
callback = "OnBtnClick_Probability"
}
}
SoldierShopCtrl._mapEventConfig = {
SoldierItemChange = "OnEvent_SoldierItemChange"
}
SoldierShopCtrl._mapRedDotConfig = {}
function SoldierShopCtrl:OnEnable()
self.nFreeCount = 0
self.nReRollPrice = 0
self.levelData = PlayerData.SoldierData:GetCurLevelData()
self.timer = nil
end
function SoldierShopCtrl:OnDisable()
if self.timer ~= nil then
self.timer:_Stop()
self.timer = nil
end
end
function SoldierShopCtrl:ShowShopPanel()
if self.levelData == nil then
self.levelData = PlayerData.SoldierData:GetCurLevelData()
end
self:RefreshShopData()
self.gameObject:SetActive(true)
end
function SoldierShopCtrl:RefreshShopData()
local shopData = self.levelData:GetShopData()
if shopData == nil then
return
end
self.tbChessData = shopData.tbGoods
self.tbProbability = shopData.tbWeightList
self.bLock = shopData.bLock
self.nFreeCount = shopData.nFreeCount
self.nReRollPrice = shopData.nReRollPrice
self.bDisablePurchase = shopData.bDisablePurchase
self.bDisableRefresh = shopData.bDisableRefresh
self:RefreshRefreshBtnState()
self:RefreshGoodsData()
self:RefreshProbabilityData()
self:RefreshTicketsData()
self._mapNode.imgLocked:SetActive(self.bLock)
self._mapNode.imgUnlocked:SetActive(not self.bLock)
EventManager.Hit("RefreshPurchaseExpPrice")
end
function SoldierShopCtrl:HideShopPanel()
self.gameObject:SetActive(false)
end
function SoldierShopCtrl:RefreshRefreshBtnState()
self._mapNode.imgBtnRefreshShopMask.gameObject:SetActive(self.bDisableRefresh)
self._mapNode.goCoinRaidUnlock.gameObject:SetActive(self.nFreeCount <= 0 and not self.bDisableRefresh)
self._mapNode.goCoinRaidFree.gameObject:SetActive(self.nFreeCount > 0 and not self.bDisableRefresh)
NovaAPI.SetTMPText(self._mapNode.txtRefreshFreeCount, self.nFreeCount)
local sBtn = ConfigTable.GetUIText("Soldier_Shop_Refresh")
if self.bDisableRefresh then
sBtn = ConfigTable.GetUIText("Soldier_Shop_Refresh_Disable")
elseif self.nFreeCount > 0 then
sBtn = ConfigTable.GetUIText("Soldier_Shop_Refresh_Free")
end
NovaAPI.SetTMPText(self._mapNode.txtBtnRefreshShop, sBtn)
end
function SoldierShopCtrl:RefreshGoodsData()
local tbGoodsData = {
nil,
nil,
nil,
nil,
nil
}
for i = 1, 5 do
if self.tbChessData[i] ~= nil then
local bCombine = false
local nNextStar = 0
if self.tbChessData[i].Id ~= 0 then
bCombine, nNextStar = self.levelData:CheckSoldierCombine(self.tbChessData[i].Id, self.tbChessData[i].Star)
end
if nNextStar == 0 and 1 < self.tbChessData[i].Star then
nNextStar = self.tbChessData[i].Star
end
tbGoodsData[i] = {
nCharId = self.tbChessData[i].Id,
nStar = nNextStar,
nCost = self.tbChessData[i].Price
}
end
end
for i = 1, 5 do
self._mapNode.SoldierCharCardShopItem[i]:SetData(tbGoodsData[i].nCharId, tbGoodsData[i].nCost, tbGoodsData[i].nStar, self.bDisablePurchase)
self._mapNode.SoldierCharCardShopItem[i]:SetClickCallback(_, function()
self:OnBtnClick_Char(i)
end)
end
end
function SoldierShopCtrl:RefreshProbabilityData()
for i = 1, 5 do
local TextRatio = self._mapNode.goProbabilityBarItem[i].transform:Find("TextRatio"):GetComponent("TMP_Text")
local goFx = self._mapNode.goProbabilityBarItem[i].transform:Find("Fx_Upgrade")
local nWeight = self.tbProbability[i].nWeight
local bDouble = self.tbProbability[i].bDouble
NovaAPI.SetTMPText(TextRatio, tostring(nWeight) .. "%")
goFx.gameObject:SetActive(bDouble)
end
end
function SoldierShopCtrl:RefreshTicketsData()
self._mapNode.imgTickets:SetActive(self.nFreeCount <= 0)
if self.nFreeCount > 0 then
NovaAPI.SetTMPText(self._mapNode.txtRefreshCount, tostring(self.nFreeCount))
else
NovaAPI.SetTMPText(self._mapNode.txtRefreshCount, tostring(self.nReRollPrice))
end
local coinCount = self.levelData:GetItem(AllEnum.CoinItemId.SoldierCurrency)
if coinCount < self.nReRollPrice then
NovaAPI.SetTMPColor(self._mapNode.txtRefreshCount, Color(0.8431372549019608, 0.3568627450980392, 0.4392156862745098, 1))
else
NovaAPI.SetTMPColor(self._mapNode.txtRefreshCount, Color(0.14901960784313725, 0.25882352941176473, 0.47058823529411764, 1))
end
end
function SoldierShopCtrl:OnBtnClick_CloseShop()
self:HideShopPanel()
EventManager.Hit("SoldierShopClose")
end
function SoldierShopCtrl:OnBtnClick_Lock()
self.levelData:SendShopLock(not self.bLock, function()
self.bLock = not self.bLock
self._mapNode.imgLocked:SetActive(self.bLock)
self._mapNode.imgUnlocked:SetActive(not self.bLock)
end)
end
function SoldierShopCtrl:OnBtnClick_RefreshShop()
if self.bDisableRefresh then
return
end
local coinCount = self.levelData:GetItem(AllEnum.CoinItemId.SoldierCurrency)
if coinCount < self.nReRollPrice and self.nFreeCount <= 0 then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_BuyExp_Tips2"))
CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_shop_refresh_poor")
return
end
self.levelData:SendShopRefresh(function(callbackData)
EventManager.Hit("SoldierShopRefresh")
CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_shop_refresh")
if self.timer ~= nil then
self.timer:_Stop()
self.timer = nil
end
local data = callbackData.shopBecomeAnother
if callbackData.shopBecomeAnother ~= nil then
self._mapNode.SoldierCharCardShopItem[data.nGoodsIndex]:PlayRandomRefreshOneShot()
end
EventManager.Hit("SoldierSandtableRefreshStep", callbackData.tbChessChangeStep)
self.timer = self:AddTimer(1, 0.23, function()
self:RefreshShopData()
end, true, true, true)
end)
end
function SoldierShopCtrl:OnBtnClick_Char(nIndex)
local chessData = self.tbChessData[nIndex]
if chessData == nil then
return
end
if chessData.Id == 0 then
return
end
local coinCount = self.levelData:GetItem(AllEnum.CoinItemId.SoldierCurrency)
if coinCount < chessData.Price then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_InsufficientCoin_Tips"))
CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_shop_buy_poor")
return
end
local _, tbWaiting, _ = self.levelData:GetDeploy()
local bWaitingMax = true
for _, v in ipairs(tbWaiting) do
if v.nId == 0 then
bWaitingMax = false
break
end
end
local bCombine, _ = self.levelData:CheckSoldierCombine(chessData.Id, chessData.Star)
if bWaitingMax and not bCombine then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_OverBench_Tips"))
return
end
self.levelData:SendShopPurchase(nIndex, function(tbChange)
CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_shop_buy")
self:RefreshShopData()
EventManager.Hit("SoldierCharItemChange", tbChange.tbChessChangeStep, self._mapNode.SoldierCharCardShopItem[nIndex].gameObject.transform)
end)
end
function SoldierShopCtrl:OnBtnClick_Probability()
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierShopProbabilityPanel)
end
function SoldierShopCtrl:OnEvent_SoldierItemChange()
self:RefreshTicketsData()
end
return SoldierShopCtrl
@@ -0,0 +1,29 @@
local SoldierBuffItemCtrl = class("SoldierBuffItemCtrl", BaseCtrl)
local RootPath = "Icon/SoldierBuffCard/"
local bgPath = "Icon/SoldierOtherIcon/"
SoldierBuffItemCtrl._mapNodeConfig = {
imgIcon = {sComponentName = "Image"},
imgBg = {sComponentName = "Image"}
}
SoldierBuffItemCtrl._mapEventConfig = {}
SoldierBuffItemCtrl._mapRedDotConfig = {}
function SoldierBuffItemCtrl:Awake()
end
function SoldierBuffItemCtrl:OnEnable()
end
function SoldierBuffItemCtrl:OnDisable()
end
function SoldierBuffItemCtrl:OnDestroy()
end
function SoldierBuffItemCtrl:SetData(mapCfg)
if mapCfg == nil then
return
end
self:SetPngSprite(self._mapNode.imgIcon, RootPath .. mapCfg.Icon)
if mapCfg.Rarity ~= 0 then
self:SetPngSprite(self._mapNode.imgBg, bgPath .. AllEnum.SoldierStrategyCardRarityIcon[mapCfg.Rarity] .. AllEnum.SoldierChessIconSurfix.S)
end
end
function SoldierBuffItemCtrl:OnRefresh()
end
return SoldierBuffItemCtrl
@@ -0,0 +1,13 @@
local SoldierBuffTipsItemCtrl = class("SoldierBuffTipsItemCtrl", BaseCtrl)
SoldierBuffTipsItemCtrl._mapEventConfig = {}
SoldierBuffTipsItemCtrl._mapRedDotConfig = {}
function SoldierBuffTipsItemCtrl:OnRefresh(mapCfg)
if mapCfg == nil then
return
end
self:SetPngSprite(self._mapNode.ImageIcon, mapCfg.Icon)
NovaAPI.SetTMPText(self._mapNode.TextName, mapCfg.Name or "")
local sDes = mapCfg.Desc or mapCfg.Des or ""
NovaAPI.SetTMPText(self._mapNode.TextDes, sDes)
end
return SoldierBuffTipsItemCtrl
@@ -0,0 +1,323 @@
local SoldierAttrData = require("GameCore.Data.DataClass.Soldier.SoldierAttrData")
local SoldierCharCardShopItemCtrl = class("SoldierCharCardShopItemCtrl", BaseCtrl)
local SYNERGY_TEMPLATE_PATH = "Game.UI.Soldier.Sandtable.Items.SoldierCharCardShopPartnerItemCtrl"
local _DestroyNode = function(node)
if node == nil then
return
end
if node.IsNull ~= nil and node:IsNull() == true then
return
end
destroy(node.gameObject or node)
end
SoldierCharCardShopItemCtrl._mapNodeConfig = {
imgUpgradeStar = {nCount = 5},
imgUpgrade = {},
btnItem = {
sComponentName = "UIButton",
callback = "OnBtnItemClick"
},
imgSelect = {},
imageRarity = {sComponentName = "Image"},
imgEmpty = {},
Container = {},
txtShopName = {sComponentName = "TMP_Text"},
txtCharName = {sComponentName = "TMP_Text"},
ImageIcon = {sComponentName = "Image"},
imgPosition = {},
img_Position = {sComponentName = "Image"},
imgRecommend = {sComponentName = "Image"},
imgUnavailable = {},
imgInHand = {},
txtCost = {sComponentName = "TMP_Text"},
goSynergyRoot = {
sComponentName = "RectTransform"
},
SynergyTemplate = {},
animRoot = {sNodeName = "AnimRoot", sComponentName = "Animator"},
FxCard_Random = {sComponentName = "Animator"}
}
SoldierCharCardShopItemCtrl._mapEventConfig = {
SoldierCharCardShopItemClicked = "OnEvent_SoldierCharCardShopItemClicked",
SoldierRecommend_Update = "SetTrackAndRecommend",
SoldierPartnerTrace = "SetTrackAndRecommend",
SoldierShopRefresh = "OnShopRefresh"
}
SoldierCharCardShopItemCtrl._mapRedDotConfig = {}
function SoldierCharCardShopItemCtrl:Awake()
self.nSlotIndex = 0
self.fnClickHost = nil
self.fnClickFunc = nil
self._tbSynergyItemCtrl = {}
self._tbSynergyItemGo = {}
self._mapNode.FxCard_Random.gameObject:SetActive(false)
end
function SoldierCharCardShopItemCtrl:OnEnable()
end
function SoldierCharCardShopItemCtrl:OnDisable()
self:SetEmpty()
end
function SoldierCharCardShopItemCtrl:OnDestroy()
self._objClickCallback = nil
self._fnClickCallback = nil
end
function SoldierCharCardShopItemCtrl:SetSlotIndex(nIndex)
self.nSlotIndex = nIndex
end
function SoldierCharCardShopItemCtrl:SetClickCallback(host, func)
self._objClickCallback = host
self._fnClickCallback = func
end
function SoldierCharCardShopItemCtrl:SetData(nCharId, nCost, nStar, bDisablePurchase)
self.nCharId = nCharId
if nCharId == nil or nCharId <= 0 then
self:SetEmpty()
return
end
local mapChar = ConfigTable.GetData("SoldierCharacter", nCharId)
if mapChar == nil then
self:SetEmpty()
return
end
self:SetNodeActive(self._mapNode.imgEmpty, false)
self:SetNodeActive(self._mapNode.Container, true)
self:RefreshBaseCard(mapChar)
self:SetInHand(nStar)
if nStar ~= nil then
self:SetUpgradeHint(nStar or 0)
end
local mapShopData
ForEachTableLine(DataTable.SoldierShopPool, function(mapData)
if mapData.ChessCharacterId == nCharId then
mapShopData = mapData
end
end)
if mapShopData ~= nil then
local nHasMoney = PlayerData.SoldierData:GetCurLevelData():GetItem(AllEnum.CoinItemId.SoldierCurrency)
self:SetAvailable(nHasMoney >= (nCost or 0) and not bDisablePurchase)
local sCost = tostring(nCost or 0)
if nHasMoney < (nCost or 0) then
sCost = "<color=#E15C73>" .. sCost .. "</color>"
end
self:SetCost(sCost)
end
self:RefreshSynergy()
end
function SoldierCharCardShopItemCtrl:SetEmpty()
self.nCharId = nil
self:SetNodeActive(self._mapNode.imgEmpty or self._mapNode.EmptyContainer or self._mapNode.imgEmpty, true)
self:SetNodeActive(self._mapNode.Container, false)
self:ResetAllStates()
end
function SoldierCharCardShopItemCtrl:ResetAllStates()
self:SetNodeActive(self._mapNode.imgRecommend, false)
self:SetNodeActive(self._mapNode.imgUnavailable, false)
self:SetNodeActive(self._mapNode.imgInHand, false)
self:SetNodeActive(self._mapNode.imgPosition, false)
self:SetUpgradeHint(0)
self:_ClearSynergyItems()
end
function SoldierCharCardShopItemCtrl:RefreshBaseCard(mapChar)
NovaAPI.SetTMPText(self._mapNode.txtShopName, mapChar.Name or "")
NovaAPI.SetTMPText(self._mapNode.txtCharName, mapChar.Name or "")
local mapSkin = ConfigTable.GetData("SoldierSkin", mapChar.Skin)
if mapSkin ~= nil then
self:SetPngSprite(self._mapNode.ImageIcon, mapSkin.Icon .. AllEnum.SoldierChessIconSurfix.L)
end
self:SetChessPosition(mapChar.Type)
self:SetRarity(mapChar.Rarity)
self:SetTrackAndRecommend()
end
function SoldierCharCardShopItemCtrl:SetRarity(nRarity)
if nRarity == nil then
return
end
self:SetPngSprite(self._mapNode.imageRarity, "Icon/SoldierOtherIcon/" .. AllEnum.SoldierChessRarityIcon[nRarity] .. AllEnum.SoldierChessIconSurfix.L)
end
function SoldierCharCardShopItemCtrl:SetChessPosition(nType)
self._mapNode.imgPosition.gameObject:SetActive(true)
if nType == nil then
return
end
local tbChessTypeConfig = CacheTable.GetData("_SoldierChessType", nType)
local sIcon = ""
if tbChessTypeConfig ~= nil then
sIcon = tbChessTypeConfig.Icon
end
local sPath = "Icon/SoldierOtherIcon/" .. sIcon
self:SetPngSprite(self._mapNode.img_Position, sPath)
end
function SoldierCharCardShopItemCtrl:SetTrackAndRecommend()
if self.nCharId == nil then
return
end
self._mapNode.imgRecommend.gameObject:SetActive(true)
local levelData = PlayerData.SoldierData:GetCurLevelData()
if levelData == nil then
self._mapNode.imgRecommend.gameObject:SetActive(false)
return
end
local bTrack = levelData:CheckChessTrace(self.nCharId)
local bRecommend = PlayerData.SoldierData:CheckChessRecommendState(self.nCharId)
local sIcon = ""
if bRecommend and bTrack then
sIcon = "Icon/SoldierOtherIcon/SoldierPartnerBuilds_03"
elseif bTrack then
sIcon = "Icon/SoldierOtherIcon/SoldierPartnerBuilds_02"
elseif bRecommend then
sIcon = "Icon/SoldierOtherIcon/SoldierPartnerBuilds_01"
else
self._mapNode.imgRecommend.gameObject:SetActive(false)
end
if sIcon ~= "" then
self:SetPngSprite(self._mapNode.imgRecommend, sIcon)
end
end
function SoldierCharCardShopItemCtrl:SetInHand(nStar)
if nStar ~= nil and 2 <= nStar then
self:SetNodeActive(self._mapNode.imgInHand, true)
return
end
local tbDeploy, tbWaiting, _ = PlayerData.SoldierData:GetCurLevelData():GetDeploy()
local bInHand = false
for k, v in pairs(tbDeploy) do
if v.nId == self.nCharId then
bInHand = true
break
end
end
if bInHand == false then
for k, v in pairs(tbWaiting) do
if v.nId == self.nCharId then
bInHand = true
break
end
end
end
self:SetNodeActive(self._mapNode.imgInHand, bInHand)
end
function SoldierCharCardShopItemCtrl:SetUpgradeHint(nStar)
nStar = nStar or 0
if nStar < 2 then
nStar = 0
end
if nStar == 0 then
self:SetNodeActive(self._mapNode.imgUpgrade, false)
return
else
self:SetNodeActive(self._mapNode.imgUpgrade, true)
end
for i = 1, 5 do
self:SetNodeActive(self._mapNode.imgUpgradeStar and self._mapNode.imgUpgradeStar[i], nStar >= i)
end
end
function SoldierCharCardShopItemCtrl:SetAvailable(bAvailable)
self:SetNodeActive(self._mapNode.imgUnavailable, not bAvailable)
end
function SoldierCharCardShopItemCtrl:SetCost(sCost)
NovaAPI.SetTMPText(self._mapNode.txtCost, sCost)
end
function SoldierCharCardShopItemCtrl:SetSelect(bSelect)
self:SetNodeActive(self._mapNode.imgSelect, bSelect)
end
function SoldierCharCardShopItemCtrl:GetAnimator()
if self._mapNode.animRoot == nil then
self._mapNode.animRoot = self.gameObejct.transform:GetChild(0):GetChild(0):GetComponent("Animator")
if self._mapNode.animRoot == nil then
return nil
end
end
return self._mapNode.animRoot
end
function SoldierCharCardShopItemCtrl:PlayRandomRefreshOneShot()
if self.timerRandomRefresh ~= nil then
self.timerRandomRefresh:Cancel()
self.timerRandomRefresh = nil
self._mapNode.FxCard_Random.gameObject:SetActive(false)
end
self._mapNode.FxCard_Random.gameObject:SetActive(true)
local nAnimLength = NovaAPI.GetAnimClipLength(self._mapNode.FxCard_Random, {
"ShopCardItem_random"
})
self.timerRandomRefresh = self:AddTimer(1, nAnimLength, function()
self._mapNode.FxCard_Random.gameObject:SetActive(false)
end, true, true, true)
end
function SoldierCharCardShopItemCtrl:RefreshSynergy()
self:_ClearSynergyItems()
self:SetNodeActive(self._mapNode.SynergyTemplate, false)
local tbPartnerTypes = SoldierAttrData.GetPartnerGroupsByChessId(self.nCharId)
if tbPartnerTypes == nil or #tbPartnerTypes == 0 then
self:SetNodeActive(self._mapNode.goSynergyRoot, false)
return
end
local goTemplate = self._mapNode.SynergyTemplate
local goRoot = self._mapNode.goSynergyRoot
if goTemplate == nil or goRoot == nil then
return
end
self:SetNodeActive(goRoot, true)
local trParent = goRoot.transform or goRoot
local nItemCount = 0
for _, nPartnerType in ipairs(tbPartnerTypes) do
local mapGroup = CacheTable.GetData("_SoldierPartnerGroup", nPartnerType)
if mapGroup ~= nil then
local goItem = instantiate(goTemplate, trParent)
self:SetNodeActive(goItem, true)
local ctrl = self:BindCtrlByNode(goItem, SYNERGY_TEMPLATE_PATH)
if ctrl ~= nil then
ctrl:OnRefresh(mapGroup)
nItemCount = nItemCount + 1
self._tbSynergyItemCtrl = self._tbSynergyItemCtrl or {}
self._tbSynergyItemGo = self._tbSynergyItemGo or {}
table.insert(self._tbSynergyItemCtrl, ctrl)
table.insert(self._tbSynergyItemGo, goItem)
else
_DestroyNode(goItem)
end
end
end
self:SetNodeActive(goRoot, 0 < nItemCount)
end
function SoldierCharCardShopItemCtrl:_ClearSynergyItems()
local tbSynergyItemCtrl = self._tbSynergyItemCtrl or {}
for _, ctrl in ipairs(tbSynergyItemCtrl) do
self:UnbindCtrlByNode(ctrl)
end
local tbSynergyItemGo = self._tbSynergyItemGo or {}
for _, goItem in ipairs(tbSynergyItemGo) do
_DestroyNode(goItem)
end
self._tbSynergyItemCtrl = {}
self._tbSynergyItemGo = {}
end
function SoldierCharCardShopItemCtrl:SetNodeActive(node, bActive)
if node == nil then
return
end
if node.gameObject ~= nil then
node.gameObject:SetActive(bActive)
else
node:SetActive(bActive)
end
end
function SoldierCharCardShopItemCtrl:OnBtnItemClick()
if self._fnClickCallback ~= nil and self.nCharId ~= nil then
self._fnClickCallback(self._objClickCallback, self.nCharId)
end
end
function SoldierCharCardShopItemCtrl:OnEvent_SoldierCharCardShopItemClicked(nCharId)
if nCharId == nil then
self:SetSelect(false)
return
end
self:SetSelect(nCharId == self.nCharId)
end
function SoldierCharCardShopItemCtrl:OnShopRefresh(bRandomRefresh)
if bRandomRefresh then
self:PlayRandomRefreshOneShot()
else
self:GetAnimator():Play("ShopCardItem_refresh")
end
end
return SoldierCharCardShopItemCtrl
@@ -0,0 +1,18 @@
local SoldierCharCardShopPartnerItemCtrl = class("SoldierCharCardShopPartnerItemCtrl", BaseCtrl)
SoldierCharCardShopPartnerItemCtrl._mapNodeConfig = {
txtPartnerName = {sComponentName = "TMP_Text"},
imgPartnerIcon = {sComponentName = "Image"}
}
SoldierCharCardShopPartnerItemCtrl._mapEventConfig = {}
SoldierCharCardShopPartnerItemCtrl._mapRedDotConfig = {}
function SoldierCharCardShopPartnerItemCtrl:Awake()
self._tbTimer = {}
end
function SoldierCharCardShopPartnerItemCtrl:OnRefresh(mapGroup)
if mapGroup == nil then
return
end
NovaAPI.SetTMPText(self._mapNode.txtPartnerName, mapGroup.Name or "")
self:SetPngSprite(self._mapNode.imgPartnerIcon, "Icon/SoldierPartner/" .. mapGroup.Icon .. AllEnum.SoldierChessIconSurfix.M)
end
return SoldierCharCardShopPartnerItemCtrl
@@ -0,0 +1,13 @@
local SoldierEffectDesItemCtrl = class("SoldierEffectDesItemCtrl", BaseCtrl)
SoldierEffectDesItemCtrl._mapNodeConfig = {}
SoldierEffectDesItemCtrl._mapEventConfig = {}
SoldierEffectDesItemCtrl._mapRedDotConfig = {}
function SoldierEffectDesItemCtrl:OnRefresh(tbData, nCardId)
if self._mapNode.TextName ~= nil then
NovaAPI.SetTMPText(self._mapNode.TextName, tbData and tbData.sName or "")
end
if self._mapNode.TextDes ~= nil then
NovaAPI.SetTMPText(self._mapNode.TextDes, tbData and tbData.sDes or "")
end
end
return SoldierEffectDesItemCtrl
@@ -0,0 +1,19 @@
local SoldierNodeItemCtrl = class("SoldierNodeItemCtrl", BaseCtrl)
function SoldierNodeItemCtrl:Awake()
self.serverData = PlayerData.SoldierData.ServerData
end
function SoldierNodeItemCtrl:OnEnable()
end
function SoldierNodeItemCtrl:OnDisable()
end
function SoldierNodeItemCtrl:OnDestroy()
end
function SoldierNodeItemCtrl:OnRefresh(nodeId)
local config = ConfigTable.GetData("SoldierNodePlan", nodeId)
if config then
self:SetPngSprite(self._mapNode.imgIcon, config.NodeIcon)
end
local curNodeId = self.serverData:GetNodeId()
self._mapNode.imgStatus:SetActive(curNodeId == nodeId)
end
return SoldierNodeItemCtrl
@@ -0,0 +1,98 @@
local SoldierPartnerListCtrl = class("SoldierPartnerListCtrl", BaseCtrl)
local iconPath = "Icon/SoldierOtherIcon/"
local partnerPath = "Icon/SoldierPartner/"
SoldierPartnerListCtrl._mapNodeConfig = {
sv_partner = {
sNodeName = "PartnerContainer",
sComponentName = "LoopScrollView"
}
}
SoldierPartnerListCtrl._mapEventConfig = {
SoldierPartnerTrace = "OnEvent_SoldierPartnerTrace",
SoldierPartnerNewActive = "OnEvent_SoldierPartnerNewActive"
}
SoldierPartnerListCtrl._mapRedDotConfig = {}
function SoldierPartnerListCtrl:SetData(tbPartner)
self.tbPartner = tbPartner
self:RefreshPartnerList()
end
function SoldierPartnerListCtrl:SetTipsRoot(tr)
self.trTipsRoot = tr
end
function SoldierPartnerListCtrl:RefreshPartnerList()
if self.tbPartner == nil or #self.tbPartner == 0 then
self._mapNode.sv_partner.gameObject:SetActive(false)
return
end
self._mapNode.sv_partner.gameObject:SetActive(true)
self._mapNode.sv_partner:Init(#self.tbPartner, self, self.OnPartnerRefreshGrid, self.OnPartnerGridBtnClick, false)
self.tbNewPartner = {}
end
function SoldierPartnerListCtrl:OnPartnerRefreshGrid(goGrid, gridIndex)
local nIndex = gridIndex + 1
local partner = self.tbPartner[nIndex]
local partnerGroupCfg = CacheTable.GetData("_SoldierPartnerGroup", partner.nType)
if partnerGroupCfg == nil then
return
end
local nIndex = table.indexof(partner.tbNumList, partner.nActiveNum)
local partnerCfgList = CacheTable.GetData("_SoldierPartner", partner.nType)
if partnerCfgList == nil then
return
end
local partnerCfg = partnerCfgList[partner.nActiveLevel]
if partnerCfg == nil then
partnerCfg = partnerCfgList[1]
end
local img_bg = goGrid.transform:Find("Common/ImageIcon"):GetComponent("Image")
local img_icon = goGrid.transform:Find("Common/imgPartnericon"):GetComponent("Image")
local txt_name = goGrid.transform:Find("Common/TextName"):GetComponent("TMP_Text")
local txtPartner = goGrid.transform:Find("Common/imgPartnerbg/txtPartner"):GetComponent("TMP_Text")
local txtPartner2 = goGrid.transform:Find("Common/txtPartner2"):GetComponent("TMP_Text")
local img_Trace = goGrid.transform:Find("Common/imgBuildsIcon")
if partner.nActiveLevel == 0 then
self:SetPngSprite(img_bg, iconPath .. AllEnum.SoldierPartnerLevelIcon[GameEnum.PartnerLevelQuality.None].bg)
else
self:SetPngSprite(img_bg, iconPath .. AllEnum.SoldierPartnerLevelIcon[partnerCfg.PartnerLevelQuality].bg)
end
self:SetPngSprite(img_icon, partnerPath .. partnerGroupCfg.Icon .. AllEnum.SoldierChessIconSurfix.M)
NovaAPI.SetTMPText(txt_name, partnerCfg.Name)
NovaAPI.SetTMPText(txtPartner2, partner.nCurNum)
local bTrace = PlayerData.SoldierData:GetCurLevelData():CheckPartnerTrace(partner.nType)
local bRecommend = PlayerData.SoldierData:CheckPartnerRecommendState(partner.nType)
img_Trace.gameObject:SetActive(bTrace or bRecommend)
local strLevel = ""
for i = 1, #partner.tbNumList do
if 1 < i then
strLevel = strLevel .. "/"
end
if i ~= partner.nActiveLevel then
strLevel = strLevel .. partner.tbNumList[i]
else
strLevel = strLevel .. "<color=#EED9BD>" .. partner.tbNumList[i] .. "</color>"
end
end
NovaAPI.SetTMPText(txtPartner, strLevel)
local animator = goGrid.transform:GetComponent("Animator")
if animator ~= nil and self.tbNewPartner ~= nil and 0 < table.indexof(self.tbNewPartner, partner.nType) then
animator:Play("PartnerActive")
end
end
function SoldierPartnerListCtrl:OnPartnerGridBtnClick(goGrid, gridIndex)
local nIndex = gridIndex + 1
local partner = self.tbPartner[nIndex]
local bTrace = PlayerData.SoldierData:GetCurLevelData():CheckPartnerTrace(partner.nType)
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierPartnerTips, self.trTipsRoot, partner.nType, partner.nActiveLevel, bTrace)
local tr = self.trTipsRoot
EventManager.Hit("OnSetParnterTipsPosition", tr:GetChild(0).position, tr:GetChild(1).position, tr:GetChild(2).position, tr:GetChild(3).position)
end
function SoldierPartnerListCtrl:OnEvent_SoldierPartnerTrace()
self:RefreshPartnerList()
end
function SoldierPartnerListCtrl:OnEvent_SoldierPartnerNewActive(tbActivePartner)
self.tbNewPartner = {}
for k, v in pairs(tbActivePartner) do
table.insert(self.tbNewPartner, k)
end
end
return SoldierPartnerListCtrl
@@ -0,0 +1,251 @@
local SoldierSandtableCharItemCtrl = class("SoldierSandtableCharItemCtrl", BaseCtrl)
local SoldierAttrData = require("GameCore.Data.DataClass.Soldier.SoldierAttrData")
local iconPath2 = "Icon/SoldierOtherIcon/"
local chessAnimType = {
PUTIN = 1,
DRAGIN = 2,
COMPOUND = 3,
COMPOUND_OUT = 4,
WARRIOR = 5
}
local chessAnimName = {
[chessAnimType.PUTIN] = "SoldierSupportCard_putin",
[chessAnimType.DRAGIN] = "SoldierSupportCard_dragin",
[chessAnimType.COMPOUND] = "SoldierSupportCard_compound",
[chessAnimType.COMPOUND_OUT] = "SoldierSupportCard_compoundout",
[chessAnimType.WARRIOR] = "SoldierSupportCard_warrior"
}
SoldierSandtableCharItemCtrl._mapNodeConfig = {
btn_char = {
sComponentName = "UIButton",
callback = "OnBtnClick_Char"
},
HaveStatus = {},
drag = {
sNodeName = "HaveStatus",
sComponentName = "UIDrag",
callback = "OnUIDrag_Drag"
},
trSortItem = {
sNodeName = "HaveStatus",
sComponentName = "RectTransform"
},
raySortItem = {
sNodeName = "HaveStatus",
sComponentName = "Empty4Raycast"
},
rayDragEvent = {
sComponentName = "Empty4Raycast"
},
SoldierCharacterCardItem = {},
AnimRoot = {},
ImgPutLightADD = {}
}
SoldierSandtableCharItemCtrl._mapEventConfig = {
SoldierSandtableCharItemDragStart = "OnSoldierSandtableCharItemDragStart",
SoldierSandtableCharItemDragging = "OnSoldierSandtableCharItemDragging",
SoldierSandtableCharItemDragEnd = "OnSoldierSandtableCharItemDragEnd",
SoldierExtraPartnerTagChange = "OnSoldierExtraPartnerTagChange",
SoldierChessCanPutIn = "OneEvent_SoldierChessCanPutIn"
}
SoldierSandtableCharItemCtrl._mapRedDotConfig = {}
function SoldierSandtableCharItemCtrl:Awake()
self.chessData = nil
self.itemCtrl = nil
self.animRoot = self._mapNode.AnimRoot:GetComponent("Animator")
end
function SoldierSandtableCharItemCtrl:OnDisable()
if self.itemCtrl ~= nil then
self:UnbindCtrlByNode(self.itemCtrl)
self.itemCtrl = nil
end
end
function SoldierSandtableCharItemCtrl:SetData(chessData)
self.levelData = PlayerData.SoldierData:GetCurLevelData()
self.chessData = chessData
self._mapNode.trSortItem.localPosition = Vector3(0, 0, 0)
self._mapNode.ImgPutLightADD.gameObject:SetActive(false)
if self.chessData == nil or self.chessData.nId == 0 then
self._mapNode.HaveStatus.gameObject:SetActive(false)
else
if self.itemCtrl == nil then
if chessData.nPositionType == GameEnum.SoldierPositionType.FightPosition or chessData.nPositionType == GameEnum.SoldierPositionType.SupportPosition then
self.itemCtrl = self:BindCtrlByNode(self._mapNode.SoldierCharacterCardItem, "Game.UI.Soldier.Template.Character.SoldierCharSupportCardItemCtrl")
else
self.itemCtrl = self:BindCtrlByNode(self._mapNode.SoldierCharacterCardItem, "Game.UI.Soldier.Template.Character.SoldierCharCardItemCtrl")
end
end
self._mapNode.HaveStatus.gameObject:SetActive(true)
if chessData.nPositionType == GameEnum.SoldierPositionType.FightPosition or chessData.nPositionType == GameEnum.SoldierPositionType.SupportPosition then
self.itemCtrl:SetItemData(self.chessData.nId)
else
self.itemCtrl:SetItemData(self.chessData.nId, true)
end
self.itemCtrl:SetStar(self.chessData.nStar)
if chessData.nPositionType == GameEnum.SoldierPositionType.FightPosition then
self.itemCtrl:SetChessPosition(GameEnum.SoldierPositionType.FightPosition)
elseif chessData.nPositionType == GameEnum.SoldierPositionType.SupportPosition then
self.itemCtrl:SetChessPosition(GameEnum.SoldierPositionType.SupportPosition)
end
if chessData.nPositionType == GameEnum.SoldierPositionType.FightPosition or chessData.nPositionType == GameEnum.SoldierPositionType.SupportPosition then
else
end
end
self.itemCanvas = self.gameObject:GetComponent("Canvas")
NovaAPI.SetCanvasOverrideSorting(self.itemCanvas, false)
self._mapNode.rayDragEvent.gameObject:SetActive(false)
end
function SoldierSandtableCharItemCtrl:GetItemBtnInstanceId()
return self._mapNode.rayDragEvent.gameObject:GetInstanceID()
end
function SoldierSandtableCharItemCtrl:SetPositionIndex(nIndex)
self.nPositionIndex = nIndex
local img_pos = self.gameObject.transform:Find("btn_pos/AnimRoot/img_pos"):GetComponent("Image")
local btn_pos = self.gameObject.transform:Find("btn_pos"):GetComponent("UIButton")
local nCfgId = PlayerData.SoldierData:GetSoldierPositionEffectDataId(self.nPositionIndex)
local cfg = ConfigTable.GetData("SoldierPositionEffect", nCfgId)
if cfg then
self:SetPngSprite(img_pos, iconPath2 .. cfg.Icon)
end
btn_pos.onClick:RemoveAllListeners()
btn_pos.onClick:AddListener(function()
EventManager.Hit("ShowSoldierPositionEffect", self.nPositionIndex)
end)
end
function SoldierSandtableCharItemCtrl:SetDetailRoot(tr)
self.trDetailRoot = tr
end
function SoldierSandtableCharItemCtrl:SetItemPos(dragPos)
local localPos = GameUIUtils.ScreenPointToLocalPoint(dragPos, self.gameObject.transform)
self._mapNode.trSortItem.localPosition = Vector3(localPos.x, localPos.y, 0)
end
function SoldierSandtableCharItemCtrl:InitSortingOrder(nSortOrder)
self.nInitSortingOrder = nSortOrder
end
function SoldierSandtableCharItemCtrl:CheckLimitAction()
return self.levelData:CheckSandTableDisable()
end
function SoldierSandtableCharItemCtrl:SetAnimator(nAnimType)
if self.itemCtrl == nil then
return
end
local anim = self.itemCtrl:GetAnimator()
if anim == nil then
return
end
anim:Play(chessAnimName[nAnimType])
end
function SoldierSandtableCharItemCtrl:OnUIDrag_Drag(mDrag)
if self:CheckLimitAction() then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_Sandtable_TemporaryReturn_Tips"))
return
end
if self.chessData.nId <= 0 then
return
end
if mDrag.DragEventType == AllEnum.UIDragType.DragStart then
self.nLastPointerInsId = nil
self:SetItemPos(mDrag.EventData.position)
self._mapNode.raySortItem.enabled = false
self._mapNode.rayDragEvent.enabled = false
self._mapNode.btn_char.gameObject:SetActive(false)
EventManager.Hit("SoldierSandtableCharItemDragStart", self:GetItemBtnInstanceId())
elseif mDrag.DragEventType == AllEnum.UIDragType.Drag then
self:SetItemPos(mDrag.EventData.position)
local pointerObj = mDrag.EventData.pointerCurrentRaycast
if nil ~= pointerObj and nil ~= pointerObj.gameObject then
local nPointerInsId = pointerObj.gameObject:GetInstanceID()
if nPointerInsId ~= self.nLastPointerInsId then
self.nLastPointerInsId = nPointerInsId
EventManager.Hit("SoldierSandtableCharItemDragging", self:GetItemBtnInstanceId(), nPointerInsId)
end
end
elseif mDrag.DragEventType == AllEnum.UIDragType.DragEnd then
local pointerObj = mDrag.EventData.pointerCurrentRaycast
if nil ~= pointerObj and nil ~= pointerObj.gameObject then
local nPointerInsId = pointerObj.gameObject:GetInstanceID()
if nPointerInsId ~= self.nLastPointerInsId then
self.nLastPointerInsId = nPointerInsId
EventManager.Hit("SoldierSandtableCharItemDragEnd", self:GetItemBtnInstanceId(), nPointerInsId)
else
EventManager.Hit("SoldierSandtableCharItemDragEnd", self:GetItemBtnInstanceId(), nPointerInsId)
end
else
EventManager.Hit("SoldierSandtableCharItemDragEnd", self:GetItemBtnInstanceId(), 0)
end
NovaAPI.SetCanvasOverrideSorting(self.itemCanvas, false)
NovaAPI.SetCanvasSortingOrder(self.itemCanvas, self.nInitSortingOrder)
self._mapNode.raySortItem.enabled = true
self._mapNode.rayDragEvent.enabled = true
self._mapNode.btn_char.gameObject:SetActive(true)
end
end
function SoldierSandtableCharItemCtrl:OnSoldierSandtableCharItemDragStart(objInsId)
self._mapNode.rayDragEvent.gameObject:SetActive(true)
NovaAPI.SetCanvasOverrideSorting(self.itemCanvas, true)
NovaAPI.SetCanvasSortingName(self.itemCanvas, AllEnum.SortingLayerName.UI)
if self:GetItemBtnInstanceId() ~= objInsId then
NovaAPI.SetCanvasSortingOrder(self.itemCanvas, self.nInitSortingOrder + 1)
else
NovaAPI.SetCanvasSortingOrder(self.itemCanvas, self.nInitSortingOrder + 2)
end
end
function SoldierSandtableCharItemCtrl:OnSoldierSandtableCharItemDragging(objInsId, targetInsId)
if targetInsId == self:GetItemBtnInstanceId() then
self._mapNode.ImgPutLightADD.gameObject:SetActive(true)
else
self._mapNode.ImgPutLightADD.gameObject:SetActive(false)
end
end
function SoldierSandtableCharItemCtrl:OnSoldierSandtableCharItemDragEnd()
NovaAPI.SetCanvasSortingOrder(self.itemCanvas, self.nInitSortingOrder + 1)
self._mapNode.rayDragEvent.gameObject:SetActive(false)
end
function SoldierSandtableCharItemCtrl:OnSoldierExtraPartnerTagChange()
if self.chessData ~= nil and self.chessData.nId ~= 0 and self.animRoot ~= nil then
local tbTags = PlayerData.SoldierData:GetCurLevelData():GetExtraPartnerTags(self.chessData.nId)
if tbTags ~= nil then
end
end
end
function SoldierSandtableCharItemCtrl:OnBtnClick_Char()
if self.chessData.nId <= 0 then
return
end
local nPositionType = self.chessData.nPositionType
if nPositionType == 0 or nPositionType == nil then
nPositionType = AllEnum.SoldierPositionType.Waiting
end
local tbDeploy, _, _ = self.levelData:GetDeploy()
local tbPartner, tbUIData = SoldierAttrData.CalcActivePartners(tbDeploy)
local chessData = {
nId = self.chessData.nId,
nStar = self.chessData.nStar,
nPositionType = nPositionType
}
local tr = self.trDetailRoot
if tr == nil then
tr = self.gameObject.transform
end
if nPositionType == AllEnum.SoldierPositionType.Waiting then
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierCharCardTips, tr, chessData)
else
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierCharCardTips, tr, chessData, tbDeploy, tbPartner)
end
EventManager.Hit("OnSetTipsPosition", tr:GetChild(0).position, tr:GetChild(1).position, tr:GetChild(2).position)
end
function SoldierSandtableCharItemCtrl:OneEvent_SoldierChessCanPutIn(bCanPutIn)
local img_input = self.gameObject.transform:Find("EmptyStatus/imgPut")
local ImgPutLight = self.gameObject.transform:Find("EmptyStatus/ImgPutLight")
if img_input == nil then
return
end
if bCanPutIn then
img_input.gameObject:SetActive(true)
ImgPutLight.gameObject:SetActive(true)
else
img_input.gameObject:SetActive(false)
ImgPutLight.gameObject:SetActive(false)
end
end
return SoldierSandtableCharItemCtrl
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,163 @@
local SoldierSandtableFxCtrl = class("SoldierSandtableFxCtrl", BaseCtrl)
local nTime = 0.5
local fxType = {
Gray = 1,
Green = 2,
Blue = 3,
Purple = 4,
Gold = 5,
Coin = 99
}
SoldierSandtableFxCtrl._mapNodeConfig = {
RoleSlide_Coin = {},
RoleSlide_Blue = {nCount = 5},
RoleSlide_Gold = {nCount = 5},
RoleSlide_Gray = {nCount = 6},
RoleSlide_Green = {nCount = 5},
RoleSlide_Purple = {nCount = 5}
}
SoldierSandtableFxCtrl._mapEventConfig = {}
SoldierSandtableFxCtrl._mapRedDotConfig = {}
function SoldierSandtableFxCtrl:Awake()
end
function SoldierSandtableFxCtrl:OnEnable()
self:InitFx()
end
function SoldierSandtableFxCtrl:InitFx()
self._mapNode.RoleSlide_Coin:SetActive(false)
self.tbUnUseNode = {
[fxType.Coin] = {},
[fxType.Blue] = {},
[fxType.Gold] = {},
[fxType.Gray] = {},
[fxType.Green] = {},
[fxType.Purple] = {}
}
self.tbUseNode = {
[fxType.Coin] = {},
[fxType.Blue] = {},
[fxType.Gold] = {},
[fxType.Gray] = {},
[fxType.Green] = {},
[fxType.Purple] = {}
}
table.insert(self.tbUnUseNode[fxType.Coin], self._mapNode.RoleSlide_Coin)
for _, v in ipairs(self._mapNode.RoleSlide_Blue) do
v:SetActive(false)
table.insert(self.tbUnUseNode[fxType.Blue], v)
end
for _, v in ipairs(self._mapNode.RoleSlide_Gold) do
v:SetActive(false)
table.insert(self.tbUnUseNode[fxType.Gold], v)
end
for _, v in ipairs(self._mapNode.RoleSlide_Gray) do
v:SetActive(false)
table.insert(self.tbUnUseNode[fxType.Gray], v)
end
for _, v in ipairs(self._mapNode.RoleSlide_Green) do
v:SetActive(false)
table.insert(self.tbUnUseNode[fxType.Green], v)
end
for _, v in ipairs(self._mapNode.RoleSlide_Purple) do
v:SetActive(false)
table.insert(self.tbUnUseNode[fxType.Purple], v)
end
end
function SoldierSandtableFxCtrl:PlayFx(tbfx, callback)
for nType, v in pairs(tbfx) do
if nType == fxType.Coin then
local go = self:GetUnUseNode(nType)
self:PlayFxItem(go, v[1].from, v[1].to, nType)
elseif nType == fxType.Blue then
for i = 1, #v do
local go = self:GetUnUseNode(nType)
self:PlayFxItem(go, v[i].from, v[i].to, nType)
end
elseif nType == fxType.Gold then
for i = 1, #v do
local go = self:GetUnUseNode(nType)
self:PlayFxItem(go, v[i].from, v[i].to, nType)
end
elseif nType == fxType.Gray then
for i = 1, #v do
local go = self:GetUnUseNode(nType)
self:PlayFxItem(go, v[i].from, v[i].to, nType)
end
elseif nType == fxType.Green then
for i = 1, #v do
local go = self:GetUnUseNode(nType)
self:PlayFxItem(go, v[i].from, v[i].to, nType)
end
elseif nType == fxType.Purple then
for i = 1, #v do
local go = self:GetUnUseNode(nType)
self:PlayFxItem(go, v[i].from, v[i].to, nType)
end
end
end
self:AddTimer(1, nTime - 0.2, function()
if callback ~= nil then
callback()
end
end, true, true, true)
end
function SoldierSandtableFxCtrl:PlayFxItem(go, from, to, nType)
if go == nil then
return
end
go:SetActive(true)
go.transform.position = from.position
local boomfx = go.transform:Find("P_Ecplor_Cbess")
boomfx.gameObject:SetActive(true)
local trail = go.transform:Find("P_Slide_Cbess")
local animaFunc = function()
local beginPos = from.position
local endPos = to.position
local controlPos = Vector3((beginPos.x + endPos.x) / 2.0, (beginPos.y + endPos.y) / 2.0, 0)
local wait = function()
local totalMoveTime = nTime - 0.2
local moveTime = 0
local normalizedTime = 0
while normalizedTime < 1 do
moveTime = moveTime + CS.UnityEngine.Time.unscaledDeltaTime
normalizedTime = moveTime / totalMoveTime
normalizedTime = normalizedTime <= 1 and normalizedTime or 1
local x, y, z = UTILS.GetBezierPointByT(beginPos, controlPos, endPos, normalizedTime)
local angleZ = 100 * normalizedTime * 2
angleZ = angleZ <= 100 and angleZ or 100
go.transform.localEulerAngles = Vector3(0, 0, angleZ)
go.transform.position = Vector3(x, y, z)
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
end
go:SetActive(false)
self:BackUseNode(nType, go)
end
cs_coroutine.start(wait)
end
self:AddTimer(1, 0.2, function()
boomfx.gameObject:SetActive(false)
animaFunc()
end, true, true, true)
end
function SoldierSandtableFxCtrl:GetUnUseNode(nType)
if self.tbUnUseNode[nType] == nil then
return nil
end
local go = table.remove(self.tbUnUseNode[nType], 1)
if go == nil then
return nil
end
table.insert(self.tbUseNode[nType], go)
return go
end
function SoldierSandtableFxCtrl:BackUseNode(nType, go)
if self.tbUseNode[nType] == nil then
return nil
end
local index = table.indexof(self.tbUseNode[nType], go)
table.remove(self.tbUseNode[nType], index)
table.insert(self.tbUnUseNode[nType], go)
end
function SoldierSandtableFxCtrl:OnEvent_AAA()
end
return SoldierSandtableFxCtrl
@@ -0,0 +1,131 @@
local SoldierSandtableOtherCharItemCtrl = class("SoldierSandtableOtherCharItemCtrl", BaseCtrl)
SoldierSandtableOtherCharItemCtrl._mapNodeConfig = {
btn_char = {
sComponentName = "UIButton",
callback = "OnBtnClick_Char"
},
drag = {
sNodeName = "char",
sComponentName = "UIDrag",
callback = "OnUIDrag_Drag"
},
trSortItem = {
sNodeName = "char",
sComponentName = "RectTransform"
},
raySortItem = {
sNodeName = "char",
sComponentName = "Empty4Raycast"
},
rayDragEvent = {
sComponentName = "Empty4Raycast"
},
charCtrl = {
sNodeName = "tc_char_small",
sCtrlName = "Game.UI.Soldier.Template.Character.SoldierCharItemCtrl"
}
}
SoldierSandtableOtherCharItemCtrl._mapEventConfig = {
SoldierSandtableOtherCharItemDragStart = "OnSoldierSandtableOtherCharItemDragStart",
SoldierSandtableOtherCharItemDragEnd = "OnSoldierSandtableOtherCharItemDragEnd"
}
SoldierSandtableOtherCharItemCtrl._mapRedDotConfig = {}
function SoldierSandtableOtherCharItemCtrl:Awake()
self.otherChessData = nil
self.itemCtrl = nil
end
function SoldierSandtableOtherCharItemCtrl:OnDisable()
if self.itemCtrl ~= nil then
self:UnbindCtrlByNode(self.itemCtrl)
self.itemCtrl = nil
end
end
function SoldierSandtableOtherCharItemCtrl:SetData(otherChessData, nIndex)
self.levelData = PlayerData.SoldierData:GetCurLevelData()
self.otherChessData = otherChessData
self.nIndex = nIndex
self._mapNode.trSortItem.localPosition = Vector3(0, 0, 0)
self._mapNode.charCtrl:SetItemData(self.otherChessData.nId)
self._mapNode.charCtrl:SetCharLevel(self.otherChessData.nStar or 1)
self.itemCanvas = self.gameObject:GetComponent("Canvas")
NovaAPI.SetCanvasOverrideSorting(self.itemCanvas, false)
self._mapNode.rayDragEvent.gameObject:SetActive(false)
end
function SoldierSandtableOtherCharItemCtrl:GetItemBtnInstanceId()
return self._mapNode.rayDragEvent.gameObject:GetInstanceID()
end
function SoldierSandtableOtherCharItemCtrl:SetAnimator()
end
function SoldierSandtableOtherCharItemCtrl:SetItemPos(dragPos)
local localPos = GameUIUtils.ScreenPointToLocalPoint(dragPos, self.gameObject.transform)
self._mapNode.trSortItem.localPosition = Vector3(localPos.x, localPos.y, 0)
end
function SoldierSandtableOtherCharItemCtrl:InitSortingOrder(nSortOrder)
self.nInitSortingOrder = nSortOrder
end
function SoldierSandtableOtherCharItemCtrl:CheckLimitAction()
return self.levelData:CheckSandTableDisable()
end
function SoldierSandtableOtherCharItemCtrl:OnUIDrag_Drag(mDrag)
if self:CheckLimitAction() then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_Sandtable_TemporaryReturn_Tips"))
return
end
if self.otherChessData.nId <= 0 then
return
end
if mDrag.DragEventType == AllEnum.UIDragType.DragStart then
self.nLastPointerInsId = nil
self:SetItemPos(mDrag.EventData.position)
self._mapNode.raySortItem.enabled = false
self._mapNode.rayDragEvent.enabled = false
self._mapNode.btn_char.gameObject:SetActive(false)
EventManager.Hit("SoldierSandtableOtherCharItemDragStart", self:GetItemBtnInstanceId(), self.otherChessData, self.nIndex)
elseif mDrag.DragEventType == AllEnum.UIDragType.Drag then
self:SetItemPos(mDrag.EventData.position)
elseif mDrag.DragEventType == AllEnum.UIDragType.DragEnd then
local pointerObj = mDrag.EventData.pointerCurrentRaycast
if nil ~= pointerObj and nil ~= pointerObj.gameObject then
local nPointerInsId = pointerObj.gameObject:GetInstanceID()
if nPointerInsId ~= self.nLastPointerInsId then
self.nLastPointerInsId = nPointerInsId
EventManager.Hit("SoldierSandtableOtherCharItemDragEnd", self.otherChessData, nPointerInsId)
else
EventManager.Hit("SoldierSandtableOtherCharItemDragEnd", self.otherChessData, nPointerInsId)
end
else
EventManager.Hit("SoldierSandtableOtherCharItemDragEnd", self.otherChessData, 0)
end
NovaAPI.SetCanvasOverrideSorting(self.itemCanvas, false)
NovaAPI.SetCanvasSortingOrder(self.itemCanvas, self.nInitSortingOrder)
self._mapNode.raySortItem.enabled = true
self._mapNode.rayDragEvent.enabled = true
self._mapNode.btn_char.gameObject:SetActive(true)
end
end
function SoldierSandtableOtherCharItemCtrl:OnSoldierSandtableOtherCharItemDragStart(objInsId)
self._mapNode.rayDragEvent.gameObject:SetActive(true)
NovaAPI.SetCanvasOverrideSorting(self.itemCanvas, true)
NovaAPI.SetCanvasSortingName(self.itemCanvas, AllEnum.SortingLayerName.UI)
if self:GetItemBtnInstanceId() ~= objInsId then
NovaAPI.SetCanvasSortingOrder(self.itemCanvas, self.nInitSortingOrder + 1)
else
NovaAPI.SetCanvasSortingOrder(self.itemCanvas, self.nInitSortingOrder + 2)
end
end
function SoldierSandtableOtherCharItemCtrl:OnSoldierSandtableOtherCharItemDragEnd()
NovaAPI.SetCanvasSortingOrder(self.itemCanvas, self.nInitSortingOrder + 1)
self._mapNode.rayDragEvent.gameObject:SetActive(false)
end
function SoldierSandtableOtherCharItemCtrl:OnBtnClick_Char()
if self.otherChessData.nId <= 0 then
return
end
local chessData = {
nId = self.otherChessData.nId,
nStar = self.otherChessData.nStar,
nPositionType = AllEnum.SoldierPositionType.Other
}
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierCharCardTips, self.gameObject.transform, chessData)
end
return SoldierSandtableOtherCharItemCtrl
@@ -0,0 +1,48 @@
local SoldierSandtablePanel = class("SoldierSandtablePanel", BasePanel)
SoldierSandtablePanel._bIsMainPanel = true
SoldierSandtablePanel._tbDefine = {
{
sPrefabPath = "Soldier/Level/SoldierSandtablePanel.prefab",
sCtrlName = "Game.UI.Soldier.Sandtable.SoldierSandtableCtrl"
}
}
function SoldierSandtablePanel:Awake()
self.MainChessList = {}
self.SupportChessList = {}
self.WaitingChessList = {}
self.OtherChessList = {}
self.bFirstRefreshed = false
end
function SoldierSandtablePanel:InitChessList()
for i = 1, 3 do
self.MainChessList[i] = {
nId = 0,
nStar = 0,
nPositionType = GameEnum.SoldierPositionType.FightPosition,
nIndex = i
}
end
for i = 1, 6 do
self.SupportChessList[i] = {
nId = 0,
nStar = 0,
nPositionType = GameEnum.SoldierPositionType.SupportPosition,
nIndex = i
}
end
for i = 1, 9 do
self.WaitingChessList[i] = {
nId = 0,
nStar = 0,
nPositionType = 3,
nIndex = i
}
end
end
function SoldierSandtablePanel:OnEnable()
end
function SoldierSandtablePanel:OnDisable()
end
function SoldierSandtablePanel:OnDestroy()
end
return SoldierSandtablePanel
@@ -0,0 +1,129 @@
local SoldierPolicyItemCtrl = class("SoldierPolicyItemCtrl", BaseCtrl)
SoldierPolicyItemCtrl._mapNodeConfig = {
imgIconBg = {sComponentName = "Image"},
imgIcon = {sComponentName = "Image"},
txtName = {sComponentName = "TMP_Text"},
txtDesc = {sComponentName = "TMP_Text"},
RewardRoot = {},
goChar = {
sNodeName = "tc_char_small"
},
goItem = {
sNodeName = "tc_item_small"
},
goRewardContent = {sComponentName = "Transform"},
txtCharTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Select_PolicyItem_Effect_Title"
},
btnConfirm = {
sComponentName = "UIButton",
callback = "OnBtnClick_Confirm"
},
txtBtnConfirm = {
sComponentName = "TMP_Text",
sLanguageId = "DailyInstance_Reward_Select"
},
AnimRootMain = {sComponentName = "Animator"}
}
SoldierPolicyItemCtrl._mapEventConfig = {}
SoldierPolicyItemCtrl._mapRedDotConfig = {}
local CHAR_CTRL = "Game.UI.Soldier.Template.Character.SoldierCharItemCtrl"
local iconPath = "Icon/SoldierBuffCard/"
function SoldierPolicyItemCtrl:Awake()
self._mapNode.goChar.gameObject:SetActive(false)
self._mapNode.goItem.gameObject:SetActive(false)
self.tbCharItemsCtrl = {}
self.nCardId = -1
self.nIndex = 0
self._bSelected = false
end
function SoldierPolicyItemCtrl:OnDisable()
self:_ClearCharItems()
if self.timerBtnConfirm ~= nil then
self.timerBtnConfirm:Cancel()
self.timerBtnConfirm = nil
end
end
function SoldierPolicyItemCtrl:OnEnable()
end
function SoldierPolicyItemCtrl:OnDestroy()
end
function SoldierPolicyItemCtrl:SetItemData(cardId, index)
self.nCardId = cardId
self.nIndex = index or 0
local mapCfg = ConfigTable.GetData("SoldierStarterCard", cardId)
if not mapCfg then
return
end
self:SetPngSprite(self._mapNode.imgIcon, iconPath .. mapCfg.Icon)
NovaAPI.SetTMPText(self._mapNode.txtName, mapCfg.Name)
NovaAPI.SetTMPText(self._mapNode.txtDesc, mapCfg.Des)
local hasReward = mapCfg.CharacterShow and 0 < #mapCfg.CharacterShow
self._mapNode.RewardRoot:SetActive(hasReward)
if hasReward then
self:_RefreshCharItems(mapCfg.CharacterShow)
end
self:SetSelected(false)
self._mapNode.btnConfirm.gameObject:SetActive(false)
end
function SoldierPolicyItemCtrl:SetButtonCallback(fn)
self._btnConfirmCallback = fn
end
function SoldierPolicyItemCtrl:_RefreshCharItems(tbCharIds)
for k, charId in ipairs(tbCharIds) do
local itemCtrl = self.tbCharItemsCtrl[k]
if itemCtrl == nil then
local go = instantiate(self._mapNode.goChar, self._mapNode.goRewardContent)
itemCtrl = self:BindCtrlByNode(go, CHAR_CTRL)
itemCtrl:SetCharLevel(1)
table.insert(self.tbCharItemsCtrl, itemCtrl)
end
itemCtrl:SetCharItemBtnFunc(function()
local chessData = {nId = charId, nStar = 1}
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierCharCardTips, self.charTipsRoot, chessData)
end)
itemCtrl.gameObject:SetActive(true)
itemCtrl:SetItemData(charId)
end
end
function SoldierPolicyItemCtrl:_ClearCharItems()
for _, ctrl in ipairs(self.tbCharItemsCtrl) do
local obj = ctrl.gameObject
self:UnbindCtrlByNode(ctrl)
destroy(obj)
end
self.tbCharItemsCtrl = {}
end
function SoldierPolicyItemCtrl:SetSelected(bSelected)
if self.timerBtnConfirm ~= nil then
self.timerBtnConfirm:Cancel()
self.timerBtnConfirm = nil
end
local sSwitchAnimName = ""
if bSelected == true then
self._mapNode.btnConfirm.gameObject:SetActive(bSelected)
sSwitchAnimName = "PolicyItem_up"
elseif self._bSelected == true then
sSwitchAnimName = "PolicyItem_down"
local nAnimLength = NovaAPI.GetAnimClipLength(self._mapNode.AnimRootMain, sSwitchAnimName)
self.timerBtnConfirm = self:AddTimer(1, nAnimLength, function()
self._mapNode.btnConfirm.gameObject:SetActive(false)
end, true, true, true)
elseif self._bSelected == false then
self._mapNode.btnConfirm.gameObject:SetActive(false)
end
if sSwitchAnimName ~= "" then
self._mapNode.AnimRootMain:Play(sSwitchAnimName)
end
self._bSelected = bSelected == true
end
function SoldierPolicyItemCtrl:SetCharTipsRoot(tr)
self.charTipsRoot = tr
end
function SoldierPolicyItemCtrl:OnBtnClick_Confirm()
if self._btnConfirmCallback then
self._btnConfirmCallback()
end
end
return SoldierPolicyItemCtrl
@@ -0,0 +1,123 @@
local SoldierSelectPolicyCtrl = class("SoldierSelectPolicyCtrl", BaseCtrl)
SoldierSelectPolicyCtrl._mapNodeConfig = {
trBg = {sNodeName = "----BG----"},
imgBgMain_Fx = {},
trRoot = {
sNodeName = "----SafeAreaRoot----"
},
goPolicyItem = {
nCount = 3,
sCtrlName = "Game.UI.Soldier.SelectPolicy.SoldierPolicyItemCtrl"
},
btnPolicyItem = {
nCount = 3,
sNodeName = "goPolicyItem",
sComponentName = "UIButton",
callback = "OnBtnClick_PolicyItem"
},
btnRecommend = {
sComponentName = "UIButton",
callback = "OnBtnClick_Recommend"
},
btnRefreshBuff = {
sComponentName = "UIButton",
callback = "OnBtnClick_RefreshBuff"
},
imgBtnMask = {},
txtTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Select_Policy_Title"
},
txtReRollCount = {sComponentName = "TMP_Text"},
trCharDetail = {sComponentName = "Transform"}
}
SoldierSelectPolicyCtrl._mapEventConfig = {
SoldierRecommendPanel_Close = "OnEvent_SoldierRecommendPanelClose",
SoldierRecommendPanel_Open = "OnEvent_SoldierRecommendPanelOpen"
}
SoldierSelectPolicyCtrl._mapRedDotConfig = {}
function SoldierSelectPolicyCtrl:Awake()
self.levelData = PlayerData.SoldierData:GetCurLevelData()
self.tbCardList = {}
self.nReRollCount = 0
self.nSelectCardId = -1
self.nSelectIndex = 0
end
function SoldierSelectPolicyCtrl:OnEnable()
self:RefreshContent()
end
function SoldierSelectPolicyCtrl:OnDisable()
end
function SoldierSelectPolicyCtrl:OnDestroy()
end
function SoldierSelectPolicyCtrl:ClosePanel()
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierSelectPolicy)
end
function SoldierSelectPolicyCtrl:RefreshContent()
self.nSelectCardId = -1
self.nSelectIndex = 0
if self.levelData == nil then
return
end
self.tbCardList, self.nReRollCount = self.levelData:GetSelectCardData()
for k, v in ipairs(self._mapNode.goPolicyItem) do
v.gameObject:SetActive(self.tbCardList[k] ~= nil)
if self.tbCardList[k] ~= nil then
v:SetItemData(self.tbCardList[k], k)
v:SetButtonCallback(function()
self:OnBtnClick_Confirm(k)
end)
end
end
local sRemain = orderedFormat(ConfigTable.GetUIText("Soldier_Policy_ReRoll_Count"), self.nReRollCount)
NovaAPI.SetTMPText(self._mapNode.txtReRollCount, sRemain)
self._mapNode.imgBtnMask.gameObject:SetActive(0 >= self.nReRollCount)
for k, v in ipairs(self._mapNode.goPolicyItem) do
v:SetCharTipsRoot(self._mapNode.trCharDetail)
end
end
function SoldierSelectPolicyCtrl:HidePanel()
self._mapNode.trBg.gameObject:SetActive(false)
self._mapNode.imgBgMain_Fx.gameObject:SetActive(false)
self._mapNode.trRoot.gameObject:SetActive(false)
end
function SoldierSelectPolicyCtrl:ShowPanel()
self._mapNode.trBg.gameObject:SetActive(true)
self._mapNode.imgBgMain_Fx.gameObject:SetActive(true)
self._mapNode.trRoot.gameObject:SetActive(true)
for k, v in ipairs(self._mapNode.goPolicyItem) do
v:SetSelected(k == self.nSelectIndex)
end
end
function SoldierSelectPolicyCtrl:OnBtnClick_PolicyItem(btn, nIndex)
for k, v in ipairs(self._mapNode.goPolicyItem) do
v:SetSelected(k == nIndex)
end
self.nSelectCardId = self.tbCardList[nIndex]
self.nSelectIndex = nIndex
end
function SoldierSelectPolicyCtrl:OnBtnClick_RefreshBuff()
if self.nReRollCount <= 0 then
return
end
local callback = function()
self:RefreshContent()
end
self.levelData:SendCardSelectReRoll(callback)
end
function SoldierSelectPolicyCtrl:OnBtnClick_Confirm(k)
local callback = function()
self:ClosePanel()
end
self.levelData:SendCardSelect(k, callback)
end
function SoldierSelectPolicyCtrl:OnBtnClick_Recommend()
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierRecommendPanel, true)
end
function SoldierSelectPolicyCtrl:OnEvent_SoldierRecommendPanelClose()
self:ShowPanel()
end
function SoldierSelectPolicyCtrl:OnEvent_SoldierRecommendPanelOpen()
self:HidePanel()
end
return SoldierSelectPolicyCtrl
@@ -0,0 +1,21 @@
local SoldierSelectPolicyPanel = class("SoldierSelectPolicyPanel", BasePanel)
SoldierSelectPolicyPanel._bIsMainPanel = false
SoldierSelectPolicyPanel._tbDefine = {
{
sPrefabPath = "Soldier/Level/SoldierSelectPolicyPanel.prefab",
sCtrlName = "Game.UI.Soldier.SelectPolicy.SoldierSelectPolicyCtrl"
}
}
function SoldierSelectPolicyPanel:Awake()
end
function SoldierSelectPolicyPanel:OnEnable()
end
function SoldierSelectPolicyPanel:OnAfterEnter()
end
function SoldierSelectPolicyPanel:OnDisable()
end
function SoldierSelectPolicyPanel:OnDestroy()
end
function SoldierSelectPolicyPanel:OnRelease()
end
return SoldierSelectPolicyPanel
@@ -0,0 +1,79 @@
local SoldierShopProbabilityCtrl = class("SoldierShopProbabilityCtrl", BaseCtrl)
SoldierShopProbabilityCtrl._mapNodeConfig = {
btnCloseFull = {
sComponentName = "UIButton",
callback = "OnBtnClick_Close"
},
btnClose = {
sComponentName = "UIButton",
callback = "OnBtnClick_Close"
},
ScrollView = {
sComponentName = "LoopScrollView"
},
txtWindowTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_ShopProbability_Title"
},
TextLv = {
sComponentName = "TMP_Text",
sLanguageId = "WorldClass_Level"
},
TextLvCost = {sComponentName = "TMP_Text", nCount = 5}
}
SoldierShopProbabilityCtrl._mapEventConfig = {}
SoldierShopProbabilityCtrl._mapRedDotConfig = {}
local ITEM_LUA_PATH = "Game.UI.Soldier.ShopProbability.SoldierShopProbabilityItemCtrl"
function SoldierShopProbabilityCtrl:Awake()
self._tbItemCtrls = {}
if self._mapNode.ListItemTemplate ~= nil then
self._mapNode.ListItemTemplate:SetActive(false)
end
end
function SoldierShopProbabilityCtrl:OnEnable()
self:_RefreshList()
end
function SoldierShopProbabilityCtrl:OnDisable()
self:UnbindRowItems()
self.tbRowsCtrl = nil
end
function SoldierShopProbabilityCtrl:OnDestroy()
end
function SoldierShopProbabilityCtrl:_RefreshList()
for k, v in pairs(self._mapNode.TextLvCost) do
NovaAPI.SetTMPText(v, orderedFormat(ConfigTable.GetUIText("Soldier_ShopProbability_ChessCost"), k))
end
self.tbRows = {}
local _f = function(mapLine)
if mapLine ~= nil then
table.insert(self.tbRows, mapLine)
end
end
ForEachTableLine(ConfigTable.Get("SoldierShopLevel"), _f)
table.sort(self.tbRows, function(a, b)
return (a.Level or 0) < (b.Level or 0)
end)
self:UnbindRowItems()
self._mapNode.ScrollView:Init(#self.tbRows, self, self.OnGridRefresh)
end
function SoldierShopProbabilityCtrl:OnGridRefresh(goGrid, nGridIndex)
local nIndex = nGridIndex + 1
local ctrl = self:BindCtrlByNode(goGrid, ITEM_LUA_PATH)
if ctrl ~= nil then
self.tbRowsCtrl[goGrid:GetInstanceID()] = ctrl
ctrl:Refresh(self.tbRows[nIndex])
end
end
function SoldierShopProbabilityCtrl:UnbindRowItems()
if self.tbRowsCtrl == nil then
self.tbRowsCtrl = {}
return
end
for _, ctrl in ipairs(self.tbRowsCtrl) do
self:UnbindCtrlByNode(ctrl)
end
end
function SoldierShopProbabilityCtrl:OnBtnClick_Close()
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierShopProbabilityPanel)
end
return SoldierShopProbabilityCtrl
@@ -0,0 +1,30 @@
local SoldierShopProbabilityItemCtrl = class("SoldierShopProbabilityItemCtrl", BaseCtrl)
SoldierShopProbabilityItemCtrl._mapNodeConfig = {
TextProbability = {nCount = 5, sComponentName = "TMP_Text"},
txtLv = {sComponentName = "TMP_Text"}
}
SoldierShopProbabilityItemCtrl._mapEventConfig = {}
SoldierShopProbabilityItemCtrl._mapRedDotConfig = {}
local RARITY_COUNT = 5
function SoldierShopProbabilityItemCtrl:Awake()
end
function SoldierShopProbabilityItemCtrl:OnEnable()
end
function SoldierShopProbabilityItemCtrl:OnDisable()
end
function SoldierShopProbabilityItemCtrl:OnDestroy()
end
function SoldierShopProbabilityItemCtrl:Refresh(cfgData)
if cfgData == nil then
return
end
NovaAPI.SetTMPText(self._mapNode.txtLv, tostring(cfgData.Level or ""))
for i = 1, RARITY_COUNT do
local txt = self._mapNode.TextProbability[i]
if txt ~= nil then
local nValue = cfgData["Rarity" .. i] or 0
NovaAPI.SetTMPText(txt, tostring(nValue) .. "%")
end
end
end
return SoldierShopProbabilityItemCtrl
@@ -0,0 +1,22 @@
local SoldierShopProbabilityPanel = class("SoldierShopProbabilityPanel", BasePanel)
SoldierShopProbabilityPanel._bIsMainPanel = false
SoldierShopProbabilityPanel._sSortingLayerName = AllEnum.SortingLayerName.UI
SoldierShopProbabilityPanel._tbDefine = {
{
sPrefabPath = "Soldier/Level/SoldierShopProbabilityPanel.prefab",
sCtrlName = "Game.UI.Soldier.ShopProbability.SoldierShopProbabilityCtrl"
}
}
function SoldierShopProbabilityPanel:Awake()
end
function SoldierShopProbabilityPanel:OnEnable()
end
function SoldierShopProbabilityPanel:OnAfterEnter()
end
function SoldierShopProbabilityPanel:OnDisable()
end
function SoldierShopProbabilityPanel:OnDestroy()
end
function SoldierShopProbabilityPanel:OnRelease()
end
return SoldierShopProbabilityPanel
@@ -0,0 +1,151 @@
local SoldierLevelSelectCtrl = class("SoldierLevelSelectCtrl", BaseCtrl)
SoldierLevelSelectCtrl._mapNodeConfig = {
topbar = {
sNodeName = "TopBarPanel",
sCtrlName = "Game.UI.TopBarEx.TopBarCtrl"
},
btn_Difficulty = {
nCount = 2,
sComponentName = "UIButton",
callback = "OnBtnClick_Difficulty"
}
}
SoldierLevelSelectCtrl._mapEventConfig = {}
SoldierLevelSelectCtrl._mapRedDotConfig = {}
function SoldierLevelSelectCtrl:Awake()
local actData = PlayerData.Activity:GetActivityDataByType(GameEnum.activityType.Soldier)
if actData == nil then
return
end
actData:RefreshLevelNew()
end
function SoldierLevelSelectCtrl:OnEnable()
self:Refresh()
end
function SoldierLevelSelectCtrl:Refresh()
local curChallengeData = PlayerData.SoldierData:GetCurChallengeData()
self.curChallengeData = curChallengeData
self.tbAllChallenge = {}
local func_ForEach_Challenge = function(mapLineData)
table.insert(self.tbAllChallenge, mapLineData)
end
ForEachTableLine(DataTable.SoldierGradeChallenge, func_ForEach_Challenge)
table.sort(self.tbAllChallenge, function(a, b)
if a.KeyGradeId == b.KeyGradeId then
return a.GradeLevel < b.GradeLevel
end
return a.KeyGradeId < b.KeyGradeId
end)
self.nHighestChallengeId = PlayerData.SoldierData:GetHighestChallengeId()
local nIndex = table.indexof(self.tbAllChallenge, function(a)
return a.KeyGradeId == self.nHighestChallengeId
end)
if nIndex == 0 then
nIndex = 1
end
self:OnBtnClick_Difficulty(_, nIndex)
for i = 1, 2 do
do
local config = ConfigTable.GetData("SoldierGradeChallenge", self.tbAllChallenge[i].Id)
if config ~= nil then
local btnDifficulty = self._mapNode.btn_Difficulty[i]
local txt_TitleNormal = btnDifficulty.transform:Find("AnimRoot/txt_TitleNormal"):GetComponent("TMP_Text")
local txt_CountNormal = btnDifficulty.transform:Find("AnimRoot/txt_CountNormal"):GetComponent("TMP_Text")
local txtGoLevelNormal = btnDifficulty.transform:Find("AnimRoot/imgLevelNormal/txtGoLevelNormal"):GetComponent("TMP_Text")
local btnChallenge = btnDifficulty.transform:Find("AnimRoot/btnChallenge"):GetComponent("UIButton")
local txtBtnChallenge = btnChallenge.transform:Find("AnimRoot/txtBtnChallenge"):GetComponent("TMP_Text")
local goLevelHint = btnDifficulty.transform:Find("AnimRoot/goLevelHint")
local btnContinue = btnDifficulty.transform:Find("AnimRoot/btnContinue"):GetComponent("UIButton")
local txtBtnContinue = btnContinue.transform:Find("AnimRoot/txtBtnContinue"):GetComponent("TMP_Text")
local txt_goLevelHint = btnDifficulty.transform:Find("AnimRoot/goLevelHint/imgContentBg/txt_goLevelHint"):GetComponent("TMP_Text")
local btnSettle = btnDifficulty.transform:Find("AnimRoot/btnSettle"):GetComponent("UIButton")
local txtBtnSettle = btnSettle.transform:Find("AnimRoot/txtBtnSettle"):GetComponent("TMP_Text")
local imgLockRoot = btnDifficulty.transform:Find("AnimRoot/imgLockRoot"):GetComponent("Image")
local txtLockHard = btnDifficulty.transform:Find("AnimRoot/imgLockRoot/imgLockHard/txtLockHard"):GetComponent("TMP_Text")
NovaAPI.SetTMPText(txt_TitleNormal, config.Name)
NovaAPI.SetTMPText(txt_CountNormal, orderedFormat(ConfigTable.GetUIText("Soldier_Level_Select_Reward"), config.Score))
NovaAPI.SetTMPText(txtGoLevelNormal, orderedFormat(ConfigTable.GetUIText("Soldier_Battle_Level"), config.OppoLevelShow))
NovaAPI.SetTMPText(txtBtnChallenge, ConfigTable.GetUIText("Soldier_Level_Select_Challenge"))
NovaAPI.SetTMPText(txtBtnContinue, ConfigTable.GetUIText("Soldier_Level_Select_Continue"))
NovaAPI.SetTMPText(txtBtnSettle, ConfigTable.GetUIText("Soldier_Level_Select_DoResult"))
btnChallenge.onClick:RemoveAllListeners()
btnChallenge.onClick:AddListener(function()
self:OnBtnClick_Challenge(i)
end)
btnContinue.onClick:RemoveAllListeners()
btnContinue.onClick:AddListener(function()
self:OnBtnClick_Continue(i)
end)
btnSettle.onClick:RemoveAllListeners()
btnSettle.onClick:AddListener(function()
local callback = function()
self:Refresh()
end
PlayerData.SoldierData:SendGiveUp(callback)
end)
goLevelHint.gameObject:SetActive(false)
btnContinue.gameObject:SetActive(false)
btnSettle.gameObject:SetActive(false)
imgLockRoot.gameObject:SetActive(false)
btnChallenge.gameObject:SetActive(false)
local bUnlocked = PlayerData.SoldierData:CheckChallengeUnlocked(self.tbAllChallenge[i].Id)
imgLockRoot.gameObject:SetActive(not bUnlocked)
if bUnlocked then
if self.curChallengeData.nGradeChallengeId ~= 0 then
if self.curChallengeData.nGradeChallengeId == self.tbAllChallenge[i].Id then
btnContinue.gameObject:SetActive(true)
goLevelHint.gameObject:SetActive(true)
btnSettle.gameObject:SetActive(true)
local nStage, nNodexIndex = PlayerData.SoldierData:GetCurChallengeState()
NovaAPI.SetTMPText(txt_goLevelHint, orderedFormat(ConfigTable.GetUIText("Soldier_Level_Select_NodeIndex"), nStage, nNodexIndex))
else
imgLockRoot.gameObject:SetActive(true)
NovaAPI.SetTMPText(txtLockHard, ConfigTable.GetUIText("Soldier_Level_Select_Lock1"))
end
else
btnChallenge.gameObject:SetActive(true)
end
else
imgLockRoot.gameObject:SetActive(true)
NovaAPI.SetTMPText(txtLockHard, ConfigTable.GetUIText("Soldier_Level_Select_Lock2"))
end
if i == 2 then
local chess1 = btnDifficulty.transform:Find("AnimRoot/img_Chess2/img_Chess2").gameObject:GetComponent("DOTweenAnimation")
local chess2 = btnDifficulty.transform:Find("AnimRoot/imgIconDb/img_Chess1/img_Chess2").gameObject:GetComponent("DOTweenAnimation")
local chess3 = btnDifficulty.transform:Find("AnimRoot/imgIconDb/img_Chess3/img_Chess2").gameObject:GetComponent("DOTweenAnimation")
if bUnlocked then
chess1:DOPlay()
chess2:DOPlay()
chess3:DOPlay()
else
chess1:DOKill()
chess2:DOKill()
chess3:DOKill()
end
end
end
end
end
end
function SoldierLevelSelectCtrl:EnterSoldier(nIndex)
local actData = PlayerData.Activity:GetActivityDataByType(GameEnum.activityType.Soldier)
if actData == nil then
return
end
local callback = function()
self:ClosePanel()
end
PlayerData.SoldierData:EnterSoldier(actData.nActId, self.tbAllChallenge[nIndex].Id, callback)
end
function SoldierLevelSelectCtrl:ClosePanel()
end
function SoldierLevelSelectCtrl:OnBtnClick_Difficulty(_, nIndex)
self.nSelectedChallenge = self.tbAllChallenge[nIndex].Id
end
function SoldierLevelSelectCtrl:OnBtnClick_Challenge(nIndex)
self:EnterSoldier(nIndex)
end
function SoldierLevelSelectCtrl:OnBtnClick_Continue(nIndex)
self:EnterSoldier(nIndex)
end
return SoldierLevelSelectCtrl
@@ -0,0 +1,22 @@
local SoldierLevelSelectPanel = class("SoldierLevelSelectPanel", BasePanel)
SoldierLevelSelectPanel._bIsMainPanel = true
SoldierLevelSelectPanel._sSortingLayerName = AllEnum.SortingLayerName.UI
SoldierLevelSelectPanel._tbDefine = {
{
sPrefabPath = "Soldier/SoldierLevelSelectPanel.prefab",
sCtrlName = "Game.UI.Soldier.SoldierLevelSelectCtrl"
}
}
function SoldierLevelSelectPanel:Awake()
end
function SoldierLevelSelectPanel:OnEnable()
end
function SoldierLevelSelectPanel:OnAfterEnter()
end
function SoldierLevelSelectPanel:OnDisable()
end
function SoldierLevelSelectPanel:OnDestroy()
end
function SoldierLevelSelectPanel:OnRelease()
end
return SoldierLevelSelectPanel
+169
View File
@@ -0,0 +1,169 @@
local SoldierMainViewCtrl = class("SoldierMainViewCtrl", BaseCtrl)
local RedDotManager = require("GameCore.RedDot.RedDotManager")
local ClientManager = CS.ClientManager
SoldierMainViewCtrl._mapNodeConfig = {
TopBar = {
sNodeName = "TopBarPanel",
sCtrlName = "Game.UI.TopBarEx.TopBarCtrl"
},
btn_Handbook = {
sComponentName = "UIButton",
callback = "OnBtnClick_Handbook"
},
txt_Handbook = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Handbook"
},
txt_HandbookNum = {sComponentName = "TMP_Text"},
redDot_Handbook = {},
redDot_Handbook_New = {},
btn_Quest = {
sComponentName = "UIButton",
callback = "OnBtnClick_Quest"
},
txt_Quest = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Quest"
},
txt_QuestNum = {sComponentName = "TMP_Text"},
btn_Recommend = {
sComponentName = "UIButton",
callback = "OnBtnClick_Recommend"
},
txt_Recommend = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Recommend"
},
redDot_Recommend = {},
redDot_Recommend_New = {},
btn_Go = {
sComponentName = "UIButton",
callback = "OnBtnClick_Go"
},
txt_Go = {sComponentName = "TMP_Text", sLanguageId = "Soldier_Go"},
txtGoTime = {sComponentName = "TMP_Text"},
txtActivityDate = {sComponentName = "TMP_Text"},
txtActivityTime = {sComponentName = "TMP_Text"},
redDot_Quest = {},
redDot_Quest_New = {},
redDot_Go = {},
redDot_Go_New = {}
}
SoldierMainViewCtrl._mapEventConfig = {
[EventId.ClosePanel] = "OnEvent_ClosePanel"
}
SoldierMainViewCtrl._mapRedDotConfig = {
[RedDotDefine.Solider_Level_New] = {
sNodeName = "redDot_Go_New"
}
}
function SoldierMainViewCtrl:Awake()
RedDotManager.RegisterNode(RedDotDefine.Solider_AllQuest, nil, self._mapNode.redDot_Quest)
self._mapNode.redDot_Handbook:SetActive(false)
self._mapNode.redDot_Handbook_New:SetActive(false)
local actData = PlayerData.Activity:GetActivityDataByType(GameEnum.activityType.Soldier)
if actData == nil then
return
end
self:RefreshDate()
self:RefreshTimeout()
if nil == self.remainTimer then
self.remainTimer = self:AddTimer(0, 1, "RefreshTimeout", true, true, false)
end
self._mapNode.redDot_Recommend:SetActive(false)
self._mapNode.redDot_Recommend_New:SetActive(false)
self._mapNode.redDot_Go:SetActive(false)
self._mapNode.redDot_Go_New:SetActive(false)
end
function SoldierMainViewCtrl:OnEnable()
self:RefreshQuest()
end
function SoldierMainViewCtrl:RefreshQuest()
local bHasComQuest = RedDotManager.GetValid(RedDotDefine.Solider_AllQuest)
local bHasNewQuest = RedDotManager.GetValid(RedDotDefine.Solider_Quest_New)
if bHasNewQuest and not bHasComQuest then
self._mapNode.redDot_Quest_New:SetActive(true)
else
self._mapNode.redDot_Quest_New:SetActive(false)
end
local allQuestCount = PlayerData.SoldierData:GetAllQuestCount()
local allReceivedCount = PlayerData.SoldierData:GetAllReceivedCount()
NovaAPI.SetTMPText(self._mapNode.txt_QuestNum, string.format("%d/%d", allReceivedCount, allQuestCount))
end
function SoldierMainViewCtrl:RefreshDate()
local actData = PlayerData.Activity:GetActivityDataByType(GameEnum.activityType.Soldier)
if actData == nil then
return
end
local actCfg = ConfigTable.GetData("Activity", actData.nActId)
local nOpenTime = CS.ClientManager.Instance:ISO8601StrToTimeStamp(actCfg.StartTime)
local nEndTime = CS.ClientManager.Instance:ISO8601StrToTimeStamp(actCfg.EndTime)
local nOpenYear = tonumber(os.date("%Y", nOpenTime))
local nOpenMonth = tonumber(os.date("%m", nOpenTime))
local nOpenDay = tonumber(os.date("%d", nOpenTime))
local nEndYear = tonumber(os.date("%Y", nEndTime))
local nEndMonth = tonumber(os.date("%m", nEndTime))
local nEndDay = tonumber(os.date("%d", nEndTime))
local strOpenDay = string.format("%d", nOpenDay)
local strEndDay = string.format("%d", nEndDay)
local dateStr = string.format("%s/%s/%s ~ %s/%s/%s", nOpenYear, nOpenMonth, strOpenDay, nEndYear, nEndMonth, strEndDay)
NovaAPI.SetTMPText(self._mapNode.txtActivityDate, dateStr)
end
function SoldierMainViewCtrl:RefreshTimeout()
local actData = PlayerData.Activity:GetActivityDataByType(GameEnum.activityType.Soldier)
if actData == nil then
return
end
local endTime = actData:GetActEndTime()
local curTime = ClientManager.Instance.serverTimeStamp
local remainTime = endTime - curTime
if remainTime < 0 then
TimerManager.Remove(self.remainTimer)
self.remainTimer = nil
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Alert,
sContent = ConfigTable.GetUIText("Activity_Invalid_Tip_1"),
callbackConfirm = function()
EventManager.Hit(EventId.ClosePanel, PanelId.ActivityList)
end
})
return
end
local sTimeStr = ""
if remainTime <= 60 then
local sec = math.floor(remainTime)
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Sec") or "", sec)
elseif 60 < remainTime and remainTime <= 3600 then
local min = math.floor(remainTime / 60)
local sec = math.floor(remainTime - min * 60)
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Min") or "", min, sec)
elseif 3600 < remainTime and remainTime <= 86400 then
local hour = math.floor(remainTime / 3600)
local min = math.floor((remainTime - hour * 3600) / 60)
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Hour") or "", hour, min)
elseif 86400 < remainTime then
local day = math.floor(remainTime / 86400)
local hour = math.floor((remainTime - day * 86400) / 3600)
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Day") or "", day, hour)
end
NovaAPI.SetTMPText(self._mapNode.txtActivityTime, sTimeStr)
NovaAPI.SetTMPText(self._mapNode.txtGoTime, sTimeStr)
end
function SoldierMainViewCtrl:OnBtnClick_Handbook()
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierHandbookSelectPanel)
end
function SoldierMainViewCtrl:OnBtnClick_Recommend()
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierRecommendPanel)
end
function SoldierMainViewCtrl:OnBtnClick_Quest()
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierQuestPanel)
end
function SoldierMainViewCtrl:OnBtnClick_Go()
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierLevelSelectPanel)
end
function SoldierMainViewCtrl:OnEvent_ClosePanel(nPanelId)
if nPanelId == PanelId.SoldierQuestPanel then
self:RefreshQuest()
end
end
return SoldierMainViewCtrl
@@ -0,0 +1,22 @@
local SoldierMainViewPanel = class("SoldierMainViewPanel", BasePanel)
SoldierMainViewPanel._bIsMainPanel = true
SoldierMainViewPanel._sSortingLayerName = AllEnum.SortingLayerName.UI
SoldierMainViewPanel._tbDefine = {
{
sPrefabPath = "Soldier/SoldierMainViewPanel.prefab",
sCtrlName = "Game.UI.Soldier.SoldierMainViewCtrl"
}
}
function SoldierMainViewPanel:Awake()
end
function SoldierMainViewPanel:OnEnable()
end
function SoldierMainViewPanel:OnAfterEnter()
end
function SoldierMainViewPanel:OnDisable()
end
function SoldierMainViewPanel:OnDestroy()
end
function SoldierMainViewPanel:OnRelease()
end
return SoldierMainViewPanel
+290
View File
@@ -0,0 +1,290 @@
local SoldierQuestCtrl = class("SoldierQuestCtrl", BaseCtrl)
SoldierQuestCtrl._mapNodeConfig = {
animator = {sNodeName = "WindowRoot", sComponentName = "Animator"},
btnClose = {
sComponentName = "UIButton",
callback = "OnBtnClick_Close"
},
btn_close = {
sComponentName = "UIButton",
callback = "OnBtnClick_Close"
},
txtWindowTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_QuestPanelTitle"
},
btnLeft = {
sComponentName = "UIButton",
callback = "OnBtnClick_Tab1"
},
btnRight = {
sComponentName = "UIButton",
callback = "OnBtnClick_Tab2"
},
sv = {
sComponentName = "LoopScrollView"
},
btn_GetAllReward = {
sComponentName = "UIButton",
callback = "OnBtnClick_GetReward"
},
txt_GetAllReward = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Quest_GetAllReward"
},
btn_GetAllReward_None = {
sComponentName = "UIButton",
callback = "OnBtnClick_GetReward_None"
},
txt_GetAllReward_None = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Quest_GetAllReward"
}
}
SoldierQuestCtrl._mapEventConfig = {}
SoldierQuestCtrl._mapRedDotConfig = {}
function SoldierQuestCtrl:Awake()
self._mapNode.animator:Play("t_window_04_t_in")
EventManager.Hit(EventId.TemporaryBlockInput, 0.3)
self.nTabIndex = 1
self.tbQuestGroup = {}
self.tbAllQuestData = PlayerData.SoldierData:GetAllQuestData()
self.nSelectedGroupId = 0
self.tbQuestList = {}
end
function SoldierQuestCtrl:OnEnable()
self:InitQuestGroup()
self:InitTab()
self:CheckTabPriority()
self:SelectTab(self.nTabIndex, true)
end
function SoldierQuestCtrl:OnDisable()
end
function SoldierQuestCtrl:OnDestroy()
if self.tbItemCtrl ~= nil then
for _, ctrl in pairs(self.tbItemCtrl) do
self:UnbindCtrlByNode(ctrl)
end
end
end
function SoldierQuestCtrl:CheckTabPriority()
local bIsLockRight = PlayerData.SoldierData:IsGroupLock(self.tbQuestGroup[2])
if bIsLockRight then
self.nTabIndex = 1
return
end
local bHasRedDotLeft = RedDotManager.GetValid(RedDotDefine.Solider_Quest_Group, self.tbQuestGroup[1])
local bHasRedDotRight = RedDotManager.GetValid(RedDotDefine.Solider_Quest_Group, self.tbQuestGroup[2])
if bHasRedDotLeft then
self.nTabIndex = 1
return
elseif bHasRedDotRight then
self.nTabIndex = 2
return
end
local tbQuestData = PlayerData.SoldierData:GetQuestDataByGroupId(self.tbQuestGroup[1])
self.tbQuestList = {}
for _, questData in pairs(tbQuestData) do
table.insert(self.tbQuestList, questData)
end
local nCompleteCount = 0
for _, questData in ipairs(self.tbQuestList) do
if questData.nStatus == AllEnum.ActQuestStatus.Received then
nCompleteCount = nCompleteCount + 1
end
end
if nCompleteCount == #self.tbQuestList then
self.nTabIndex = 2
return
end
end
function SoldierQuestCtrl:InitQuestGroup()
local func_ForEach_QuestGroup = function(mapLineData)
if mapLineData.ActivityId == self.nActId then
table.insert(self.tbQuestGroup, mapLineData.Id)
end
end
ForEachTableLine(DataTable.SoldierQuestGroup, func_ForEach_QuestGroup)
table.sort(self.tbQuestGroup, function(a, b)
return a < b
end)
end
function SoldierQuestCtrl:InitTab()
if #self.tbQuestGroup < 2 then
return
end
local txtLeft1 = self._mapNode.btnLeft.transform:Find("AnimRoot/imgOff/txtLeft"):GetComponent("TMP_Text")
local txtLeft2 = self._mapNode.btnLeft.transform:Find("AnimRoot/imgOn/txtLeft"):GetComponent("TMP_Text")
local groupConfig1 = ConfigTable.GetData("SoldierQuestGroup", self.tbQuestGroup[1])
local groupConfig2 = ConfigTable.GetData("SoldierQuestGroup", self.tbQuestGroup[2])
NovaAPI.SetTMPText(txtLeft1, groupConfig1.Des)
NovaAPI.SetTMPText(txtLeft2, groupConfig1.Des)
local txtRight1 = self._mapNode.btnRight.transform:Find("AnimRoot/imgOn/txtRight"):GetComponent("TMP_Text")
local txtRight2 = self._mapNode.btnRight.transform:Find("AnimRoot/imgOff/txtRight"):GetComponent("TMP_Text")
NovaAPI.SetTMPText(txtRight1, groupConfig2.Des)
NovaAPI.SetTMPText(txtRight2, groupConfig2.Des)
self:RefreshRedDot()
local bIsLockLeft = PlayerData.SoldierData:IsGroupLock(self.tbQuestGroup[1])
local bIsLockRight = PlayerData.SoldierData:IsGroupLock(self.tbQuestGroup[2])
self._mapNode.btnRight.transform:Find("AnimRoot/imgOff/imgLock").gameObject:SetActive(bIsLockRight)
end
function SoldierQuestCtrl:SelectTab(nTabIndex, bForce)
if self.nTabIndex == nTabIndex and not bForce then
return
end
self.nTabIndex = nTabIndex
local imgOn1 = self._mapNode.btnLeft.transform:Find("AnimRoot/imgOn")
local imgOff1 = self._mapNode.btnLeft.transform:Find("AnimRoot/imgOff")
local imgOn2 = self._mapNode.btnRight.transform:Find("AnimRoot/imgOn")
local imgOff2 = self._mapNode.btnRight.transform:Find("AnimRoot/imgOff")
imgOn1.gameObject:SetActive(self.nTabIndex == 1)
imgOff1.gameObject:SetActive(self.nTabIndex ~= 1)
imgOn2.gameObject:SetActive(self.nTabIndex == 2)
imgOff2.gameObject:SetActive(self.nTabIndex ~= 2)
self.nSelectedGroupId = self.tbQuestGroup[self.nTabIndex]
local tbQuestData = PlayerData.SoldierData:GetQuestDataByGroupId(self.nSelectedGroupId)
if tbQuestData == nil then
local actData = PlayerData.Activity:GetActivityDataByType(GameEnum.activityType.Soldier)
actData:RefreshAllQuestData(function()
self:SelectTab(self.nTabIndex, true)
end)
return
end
self.tbQuestList = {}
for _, questData in pairs(tbQuestData) do
table.insert(self.tbQuestList, questData)
end
table.sort(self.tbQuestList, function(a, b)
if a.nStatus ~= b.nStatus then
return a.nStatus < b.nStatus
end
return a.nId < b.nId
end)
self.tbItemCtrl = {}
self._mapNode.sv:Init(#self.tbQuestList, self, self.OnRefreshQuestGrid)
local bHasComplete = false
for _, questData in pairs(self.tbQuestList) do
if questData.nStatus == AllEnum.ActQuestStatus.Complete then
bHasComplete = true
break
end
end
self._mapNode.btn_GetAllReward.gameObject:SetActive(bHasComplete)
self._mapNode.btn_GetAllReward_None.gameObject:SetActive(not bHasComplete)
PlayerData.SoldierData:SetViewedGroupId(self.nSelectedGroupId)
self:RefreshRedDot()
end
function SoldierQuestCtrl:RefreshRedDot()
local redDotLeft = self._mapNode.btnLeft.transform:Find("AnimRoot/redDotLeft")
local redDotRight = self._mapNode.btnRight.transform:Find("AnimRoot/redDotRight")
RedDotManager.RegisterNode(RedDotDefine.Solider_Quest_Group, self.tbQuestGroup[1], redDotLeft.gameObject)
RedDotManager.RegisterNode(RedDotDefine.Solider_Quest_Group, self.tbQuestGroup[2], redDotRight.gameObject)
local redDotLeftNew = self._mapNode.btnLeft.transform:Find("AnimRoot/redDotLeftNew")
local redDotRightNew = self._mapNode.btnRight.transform:Find("AnimRoot/redDotRightNew")
local bHasRedDotLeft = RedDotManager.GetValid(RedDotDefine.Solider_Quest_Group, self.tbQuestGroup[1])
local bHasRedDotRight = RedDotManager.GetValid(RedDotDefine.Solider_Quest_Group, self.tbQuestGroup[2])
local bHasNewQuestLeft = RedDotManager.GetValid(RedDotDefine.Solider_Quest_New_Group, self.tbQuestGroup[1])
local bHasNewQuestRight = RedDotManager.GetValid(RedDotDefine.Solider_Quest_New_Group, self.tbQuestGroup[2])
if bHasNewQuestLeft and not bHasRedDotLeft then
redDotLeftNew.gameObject:SetActive(true)
else
redDotLeftNew.gameObject:SetActive(false)
end
if bHasNewQuestRight and not bHasRedDotRight then
redDotRightNew.gameObject:SetActive(true)
else
redDotRightNew.gameObject:SetActive(false)
end
end
function SoldierQuestCtrl:OnRefreshQuestGrid(goGrid, gridIndex)
local nIndex = gridIndex + 1
local questData = self.tbQuestList[nIndex]
local questConfig = ConfigTable.GetData("SoldierQuest", questData.nId)
if questConfig == nil then
return
end
for i = 1, 2 do
do
local index = i
local btnItem = goGrid.transform:Find("DetailRoot/AnimRoot/btn_item" .. index):GetComponent("UIButton")
local item = btnItem.transform:Find("AnimRoot/item")
local instanceId = btnItem:GetInstanceID()
if self.tbItemCtrl[instanceId] == nil then
self.tbItemCtrl[instanceId] = self:BindCtrlByNode(item.gameObject, "Game.UI.TemplateEx.TemplateItemCtrl")
end
local itemId = questConfig["Reward" .. index]
local itemCount = questConfig["RewardQty" .. index]
if 0 < itemId then
btnItem.gameObject:SetActive(true)
else
btnItem.gameObject:SetActive(false)
end
self.tbItemCtrl[instanceId]:SetItem(itemId, nil, itemCount, false, questData.nstatus == AllEnum.ActQuestStatus.Received, false, false)
btnItem.onClick:RemoveAllListeners()
btnItem.onClick:AddListener(function()
UTILS.ClickItemGridWithTips(itemId, btnItem.transform, true, true, false)
end)
end
end
local txt_target = goGrid.transform:Find("DetailRoot/AnimRoot/txt_target"):GetComponent("TMP_Text")
NovaAPI.SetTMPText(txt_target, questConfig.Desc)
local barFill = goGrid.transform:Find("DetailRoot/AnimRoot/imgBarBg/imgMainBarFill"):GetComponent("Image")
NovaAPI.SetImageFillAmount(barFill, questData.Progress[1].Cur / questData.Progress[1].Max)
local txt_com = goGrid.transform:Find("DetailRoot/AnimRoot/txt_com"):GetComponent("TMP_Text")
local img_Received = goGrid.transform:Find("DetailRoot/AnimRoot/img_Received")
img_Received.gameObject:SetActive(questData.nStatus == AllEnum.ActQuestStatus.Received)
if questData.nStatus == AllEnum.ActQuestStatus.UnComplete then
NovaAPI.SetImageFillAmount(barFill, questData.Progress[1].Cur / questData.Progress[1].Max)
NovaAPI.SetTMPText(txt_com, string.format("%d/%d", questData.Progress[1].Cur, questData.Progress[1].Max))
else
NovaAPI.SetImageFillAmount(barFill, 1)
NovaAPI.SetTMPText(txt_com, ConfigTable.GetUIText("Soldier_Quest_Complete"))
end
local btn_JumpTo = goGrid.transform:Find("DetailRoot/AnimRoot/btn_JumpTo"):GetComponent("UIButton")
local txt_JumpTo = btn_JumpTo.transform:Find("AnimRoot/txtBtn"):GetComponent("TMP_Text")
local btn_GetReward = goGrid.transform:Find("DetailRoot/AnimRoot/btn_GetReward"):GetComponent("UIButton")
local txt_GetReward = btn_GetReward.transform:Find("AnimRoot/txtBtn"):GetComponent("TMP_Text")
NovaAPI.SetTMPText(txt_JumpTo, ConfigTable.GetUIText("Soldier_Quest_JumpTo"))
NovaAPI.SetTMPText(txt_GetReward, ConfigTable.GetUIText("Soldier_Quest_Receive"))
btn_JumpTo.gameObject:SetActive(questData.nStatus == AllEnum.ActQuestStatus.UnComplete)
btn_JumpTo.onClick:RemoveAllListeners()
btn_JumpTo.onClick:AddListener(function()
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierLevelSelectPanel)
self:OnBtnClick_Close()
end)
btn_GetReward.gameObject:SetActive(questData.nStatus == AllEnum.ActQuestStatus.Complete)
btn_GetReward.onClick:RemoveAllListeners()
btn_GetReward.onClick:AddListener(function()
PlayerData.SoldierData:ReceiveQuestReward(self.nSelectedGroupId, questData.nId, function()
self:SelectTab(self.nTabIndex, true)
end)
end)
end
function SoldierQuestCtrl:OnBtnClick_Close()
EventManager.Hit(EventId.TemporaryBlockInput, 0.2)
self._mapNode.animator:Play("t_window_04_t_out")
self:AddTimer(1, 0.2, function()
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierQuestPanel)
end, true, true, true)
end
function SoldierQuestCtrl:OnBtnClick_GetReward()
PlayerData.SoldierData:ReceiveQuestReward(self.nSelectedGroupId, 0, function()
self:SelectTab(self.nTabIndex, true)
end)
end
function SoldierQuestCtrl:OnBtnClick_GetReward_None()
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Soldier_Quest_ReceiveNone"))
end
function SoldierQuestCtrl:OnBtnClick_Tab1()
if PlayerData.SoldierData:IsGroupLock(self.tbQuestGroup[1]) then
return
end
self:SelectTab(1)
end
function SoldierQuestCtrl:OnBtnClick_Tab2()
if PlayerData.SoldierData:IsGroupLock(self.tbQuestGroup[2]) then
return
end
self:SelectTab(2)
end
return SoldierQuestCtrl
+23
View File
@@ -0,0 +1,23 @@
local SoldierMainViewPanel = class("SoldierMainViewPanel", BasePanel)
SoldierMainViewPanel._bIsMainPanel = false
SoldierMainViewPanel._sSortingLayerName = AllEnum.SortingLayerName.UI
SoldierMainViewPanel._nSnapshotPrePanel = 1
SoldierMainViewPanel._tbDefine = {
{
sPrefabPath = "Soldier/SoldierQuestPanel.prefab",
sCtrlName = "Game.UI.Soldier.SoldierQuestCtrl"
}
}
function SoldierMainViewPanel:Awake()
end
function SoldierMainViewPanel:OnEnable()
end
function SoldierMainViewPanel:OnAfterEnter()
end
function SoldierMainViewPanel:OnDisable()
end
function SoldierMainViewPanel:OnDestroy()
end
function SoldierMainViewPanel:OnRelease()
end
return SoldierMainViewPanel
@@ -0,0 +1,291 @@
local SoldierTestEnterCtrl = class("SoldierTestEnterCtrl", BaseCtrl)
local SoldierAttrData = require("GameCore.Data.DataClass.Soldier.SoldierAttrData")
SoldierTestEnterCtrl._mapNodeConfig = {
TopBar = {
sNodeName = "TopBarPanel",
sCtrlName = "Game.UI.TopBarEx.TopBarCtrl"
},
chessId = {
nCount = 9,
sComponentName = "Dropdown",
callback = "OnDropDownChanged_Chess"
},
chessLv = {
nCount = 9,
sComponentName = "Dropdown",
callback = "OnDropDownChanged_Chess"
},
btnAttr = {
nCount = 9,
sComponentName = "UIButton",
callback = "OnBtnClick_Attr"
},
txtCharPartner = {nCount = 9, sComponentName = "TMP_Text"},
goPartner = {},
goAttr = {},
btnConfirm = {
sComponentName = "UIButton",
callback = "OnBtnClick_Confirm"
},
goAttrList = {},
txtAttrTitle = {sComponentName = "TMP_Text"},
tc_property = {},
goPartnerItem = {},
PartnerLayouts = {}
}
SoldierTestEnterCtrl._mapEventConfig = {}
SoldierTestEnterCtrl._mapRedDotConfig = {}
local _SortPartner = function(a, b)
local aActive = 0 < (a.mapData.nActiveLevel or 0)
local bActive = 0 < (b.mapData.nActiveLevel or 0)
if aActive ~= bActive then
return aActive
end
local aNum = a.mapData.nCurNum or 0
local bNum = b.mapData.nCurNum or 0
if aNum ~= bNum then
return aNum > bNum
end
return a.nType < b.nType
end
function SoldierTestEnterCtrl:RefreshChess()
self._tbDeployedChess = {}
local tbIdUsed = {}
for i = 1, 9 do
local nIdIndex = NovaAPI.GetDropDownValue(self._mapNode.chessId[i])
local nId = self.tbChessIdList[nIdIndex + 1] or 0
if nId ~= 0 then
local mapCfg = ConfigTable.GetData("SoldierCharacter", nId)
if mapCfg == nil then
printError(string.format("格子 %s 棋子Id错误!!!", i))
return false
end
if tbIdUsed[nId] then
EventManager.Hit(EventId.OpenMessageBox, "不能选择重复棋子")
return false
end
tbIdUsed[nId] = true
end
local nLvIndex = NovaAPI.GetDropDownValue(self._mapNode.chessLv[i])
local nLevel = nLvIndex + 1
nLevel = math.min(nLevel, 3)
local nPositionType = i <= 3 and GameEnum.SoldierPositionType.FightPosition or GameEnum.SoldierPositionType.SupportPosition
local nIndex = i <= 3 and i or i - 3
table.insert(self._tbDeployedChess, {
nPositionType = nPositionType,
nIndex = nIndex,
nId = nId,
nStar = nLevel
})
end
return true
end
function SoldierTestEnterCtrl:InitChessDropdowns()
self.tbChessIdList = {0}
local tbIds = {}
local foreachTable = function(line)
table.insert(tbIds, line.Id)
end
ForEachTableLine(ConfigTable.Get("SoldierCharacter"), foreachTable)
for _, nId in ipairs(tbIds) do
table.insert(self.tbChessIdList, nId)
end
local ListString = CS.System.Collections.Generic.List(CS.System.String)
local listChessId = ListString()
listChessId:Add("")
for _, nId in ipairs(tbIds) do
local mapCfg = ConfigTable.GetData("SoldierCharacter", nId)
local sName = mapCfg ~= nil and mapCfg.Name or ""
listChessId:Add(string.format("%s - %s", nId, sName))
end
local listChessLv = ListString()
listChessLv:Add("1")
listChessLv:Add("2")
listChessLv:Add("3")
for i = 1, 9 do
NovaAPI.ClearDropDownOptions(self._mapNode.chessId[i])
NovaAPI.DropDownAddOptions(self._mapNode.chessId[i], listChessId)
NovaAPI.SetDDValueWithoutNotify(self._mapNode.chessId[i], 0)
NovaAPI.ClearDropDownOptions(self._mapNode.chessLv[i])
NovaAPI.DropDownAddOptions(self._mapNode.chessLv[i], listChessLv)
NovaAPI.SetDDValueWithoutNotify(self._mapNode.chessLv[i], 0)
end
end
function SoldierTestEnterCtrl:RefreshCharPartner()
for i = 1, 9 do
local chess = self._tbDeployedChess[i]
local sText = ""
if chess and chess.nId and chess.nId ~= 0 then
local tbPartnerTypes = SoldierAttrData.GetPartnerGroupsByChessId(chess.nId)
if tbPartnerTypes then
local tbNames = {}
for _, nType in ipairs(tbPartnerTypes) do
local mapCfg = CacheTable.GetData("_SoldierPartnerGroup", nType)
if mapCfg and mapCfg.Name then
table.insert(tbNames, mapCfg.Name)
end
end
sText = table.concat(tbNames, "/")
end
end
NovaAPI.SetTMPText(self._mapNode.txtCharPartner[i], sText)
end
end
function SoldierTestEnterCtrl:RefreshPartner()
local tbActivePartner, tbUIData = SoldierAttrData.CalcActivePartners(self._tbDeployedChess)
self.tbPartner = tbActivePartner
local tbSorted = {}
if tbUIData ~= nil then
for _, mapData in pairs(tbUIData) do
table.insert(tbSorted, {
nType = mapData.nType,
mapData = mapData
})
end
table.sort(tbSorted, _SortPartner)
end
self:_RefreshPartnerItems(tbSorted)
end
function SoldierTestEnterCtrl:_RefreshPartnerItems(tbSorted)
self:_ClearPartnerItems()
local tmpl = self._mapNode.goPartnerItem
local layout = self._mapNode.PartnerLayouts
if tmpl == nil or layout == nil then
return
end
if tbSorted == nil or #tbSorted == 0 then
return
end
local trParent = layout.transform
for _, info in ipairs(tbSorted) do
local goItem = instantiate(tmpl, trParent)
goItem:SetActive(true)
self:_SetupPartnerItem(goItem, info)
table.insert(self._tbPartnerItemGo, goItem)
end
end
function SoldierTestEnterCtrl:_SetupPartnerItem(goItem, info)
local trItem = goItem.transform
local nType = info.nType
local mapData = info.mapData or {}
local trName = trItem:Find("btnPartnerItem/AnimRoot/txtPartnerName")
if trName ~= nil then
local mapCfg = CacheTable.GetData("_SoldierPartnerGroup", nType)
local sName = mapCfg and mapCfg.Name or ""
NovaAPI.SetTMPText(trName:GetComponent("TMP_Text"), sName)
end
local trLevel = trItem:Find("btnPartnerItem/AnimRoot/txtPartnerLevel")
if trLevel ~= nil then
local nActiveLevel = mapData.nActiveLevel or 0
local nLevelCount = #(mapData.tbNumList or {})
local sLevel = ""
for j = 1, nLevelCount do
local sPart = j == nActiveLevel and string.format("<color=#D85054>%d</color>", j) or tostring(j)
sLevel = j == 1 and sPart or sLevel .. "/" .. sPart
end
NovaAPI.SetTMPText(trLevel:GetComponent("TMP_Text"), sLevel)
end
local trBtn = trItem:Find("btnPartnerItem")
if trBtn ~= nil then
local btn = trBtn:GetComponent("UIButton") or trBtn:GetComponent("Button")
if btn ~= nil then
btn.onClick:RemoveAllListeners()
btn.onClick:AddListener(function()
self:OnPartnerItemClicked(trItem, mapData)
end)
end
end
end
function SoldierTestEnterCtrl:_ClearPartnerItems()
if self._tbPartnerItemGo == nil then
self._tbPartnerItemGo = {}
return
end
for _, goItem in ipairs(self._tbPartnerItemGo) do
destroy(goItem)
end
self._tbPartnerItemGo = {}
end
function SoldierTestEnterCtrl:OnPartnerItemClicked(trItem, partnerData)
if partnerData == nil then
return
end
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierPartnerTips, trItem, partnerData.nType, partnerData.nActiveLevel, false)
end
function SoldierTestEnterCtrl:Awake()
self._mapNode.goPartner.gameObject:SetActive(true)
self._mapNode.goAttr.gameObject:SetActive(true)
self._mapNode.tc_property.gameObject:SetActive(false)
if self._mapNode.goPartnerItem ~= nil then
self._mapNode.goPartnerItem:SetActive(false)
end
self._tbPartnerItemGo = {}
end
function SoldierTestEnterCtrl:OnEnable()
self._tbDeployedChess = {}
self.tbPartner = {}
self:InitChessDropdowns()
end
function SoldierTestEnterCtrl:OnDisable()
self:_ClearPartnerItems()
end
function SoldierTestEnterCtrl:OnDestroy()
self:_ClearPartnerItems()
end
function SoldierTestEnterCtrl:OnBtnClick_Confirm()
if #self._tbDeployedChess > 0 then
PlayerData.SoldierData:GMEnterSoldier(self._tbDeployedChess, 0, 1, 10101, 10101)
end
end
function SoldierTestEnterCtrl:OnDropDownChanged_Chess(objComp, nIndex)
if nIndex ~= nil and self._mapNode.chessId and self._mapNode.chessId[nIndex] == objComp then
local nIdIndex = NovaAPI.GetDropDownValue(objComp)
local nId = self.tbChessIdList[nIdIndex + 1] or 0
if nId ~= 0 then
for i = 1, 9 do
if i ~= nIndex then
local nOtherIdx = NovaAPI.GetDropDownValue(self._mapNode.chessId[i])
local nOtherId = self.tbChessIdList[nOtherIdx + 1] or 0
if nOtherId == nId then
EventManager.Hit(EventId.OpenMessageBox, "不能选择重复棋子")
NovaAPI.SetDDValueWithoutNotify(objComp, 0)
break
end
end
end
end
end
if self:RefreshChess() then
self:RefreshCharPartner()
self:RefreshPartner()
end
end
function SoldierTestEnterCtrl:OnBtnClick_Attr(btn, nIndex)
if not self:RefreshChess() then
return
end
local chessData = self._tbDeployedChess[nIndex]
if chessData == nil or chessData.nId == 0 then
EventManager.Hit(EventId.OpenMessageBox, "该格子未选择棋子")
return
end
self:RefreshPartner()
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierCharCardTips, btn.gameObject, chessData, self._tbDeployedChess, self.tbPartner)
end
function SoldierTestEnterCtrl:ShowAttr(chessData, attrList)
local mapCfg = ConfigTable.GetData("SoldierCharacter", chessData.nId)
local sName = mapCfg ~= nil and mapCfg.Name or tostring(chessData.nId)
local sTitle = string.format("<color=#43A9F1>%s</color> (%d★)", sName, chessData.nStar)
NovaAPI.SetTMPText(self._mapNode.txtAttrTitle, sTitle)
delChildren(self._mapNode.goAttrList)
if attrList == nil then
return
end
for _, v in ipairs(attrList) do
local goItem = instantiate(self._mapNode.tc_property, self._mapNode.goAttrList.transform)
goItem:SetActive(true)
local ctrlItem = self:BindCtrlByNode(goItem, "Game.UI.TemplateEx.TemplatePropertyCtrl")
ctrlItem:SetSoldierAttr(v)
end
end
return SoldierTestEnterCtrl
@@ -0,0 +1,20 @@
local SoldierTestEnterPanel = class("SoldierTestEnterPanel", BasePanel)
SoldierTestEnterPanel._tbDefine = {
{
sPrefabPath = "Soldier/SoldierTestEnterPanel.prefab",
sCtrlName = "Game.UI.Soldier.SoldierTestEnterCtrl"
}
}
function SoldierTestEnterPanel:Awake()
end
function SoldierTestEnterPanel:OnEnable()
end
function SoldierTestEnterPanel:OnAfterEnter()
end
function SoldierTestEnterPanel:OnDisable()
end
function SoldierTestEnterPanel:OnDestroy()
end
function SoldierTestEnterPanel:OnRelease()
end
return SoldierTestEnterPanel
@@ -0,0 +1,209 @@
local SoldierCharCardItemCtrl = class("SoldierCharCardItemCtrl", BaseCtrl)
local iconPath2 = "Icon/SoldierOtherIcon/"
SoldierCharCardItemCtrl._mapNodeConfig = {
btnItem = {
sComponentName = "UIButton",
callback = "OnBtnItemClick"
},
Star = {nCount = 5},
FxStar = {nCount = 5},
StarRoot = {sComponentName = "Transform"},
goChar = {},
imgEmpty = {},
imgSelect = {},
imgLock = {},
imgPut = {},
imageIcon = {sComponentName = "Image"},
imageRarity = {sComponentName = "Image"},
imgRecommend = {sComponentName = "Image"},
img_Position = {sComponentName = "Image"},
imgAttribute = {sComponentName = "Image"},
animRoot = {sNodeName = "AnimRoot", sComponentName = "Animator"}
}
SoldierCharCardItemCtrl._mapEventConfig = {
SoldierCharCardItemClicked = "OnEvent_SoldierCharCardItemClicked",
SoldierRecommend_Update = "SetTrackAndRecommend",
SoldierPartnerTrace = "SetTrackAndRecommend",
SoldierExtraPartnerTagChange = "OnEvent_SoldierExtraPartnerTagChange"
}
SoldierCharCardItemCtrl._mapRedDotConfig = {}
SoldierCharCardItemCtrl.MAX_STAR = 5
function SoldierCharCardItemCtrl:Awake()
self.bActive = false
end
function SoldierCharCardItemCtrl:OnEnable()
self.bActive = true
end
function SoldierCharCardItemCtrl:OnDisable()
self._objClickCallback = nil
self._fnClickCallback = nil
self.nCharId = nil
self.bActive = false
end
function SoldierCharCardItemCtrl:OnDestroy()
self.bActive = false
end
function SoldierCharCardItemCtrl:OnSelected()
end
function SoldierCharCardItemCtrl:OnRefresh(nCharId)
self.nCharId = nCharId
self:SetItemData(nCharId)
end
function SoldierCharCardItemCtrl:SetItemData(nCharId, bInSandland)
bInSandland = bInSandland or false
self._mapNode.imgSelect:SetActive(false)
self._mapNode.imgPut:SetActive(false)
if nCharId == nil then
self._mapNode.goChar:SetActive(false)
self._mapNode.imgEmpty:SetActive(true)
return
end
self.nCharId = nCharId
self._mapNode.imgEmpty:SetActive(false)
self._mapNode.goChar:SetActive(true)
local soldierCharConfig = ConfigTable.GetData("SoldierCharacter", nCharId)
if soldierCharConfig == nil then
return
end
self:SetRarity(soldierCharConfig.Rarity)
self:SetStar(soldierCharConfig.Star, nCharId)
self:SetChessPosition(soldierCharConfig.Type)
self.bInSandland = bInSandland
self:SetTrackAndRecommend()
local skinConfig = ConfigTable.GetData("SoldierSkin", soldierCharConfig.Skin)
if skinConfig then
self:SetPngSprite(self._mapNode.imageIcon, skinConfig.Icon .. AllEnum.SoldierChessIconSurfix.M)
end
end
function SoldierCharCardItemCtrl:SetRarity(nRarity)
if nRarity == nil then
return
end
self:SetPngSprite(self._mapNode.imageRarity, "Icon/SoldierOtherIcon/" .. AllEnum.SoldierChessRarityIcon[nRarity] .. AllEnum.SoldierChessIconSurfix.M)
end
function SoldierCharCardItemCtrl:SetAttribute(nIndex)
if nIndex == nil or nIndex < 1 or 3 < nIndex then
self._mapNode.imgAttribute.gameObject:SetActive(false)
return
end
local nCfgId = PlayerData.SoldierData:GetSoldierPositionEffectDataId(nIndex)
local cfg = ConfigTable.GetData("SoldierPositionEffect", nCfgId)
if cfg then
self._mapNode.imgAttribute.gameObject:SetActive(true)
self:SetPngSprite(self._mapNode.imgAttribute, iconPath2 .. cfg.Icon)
end
end
function SoldierCharCardItemCtrl:SetStar(nStar, nCharId)
nStar = nStar or 0
local bPlayCompoundAnim = false
if self.nStar == nil then
self.nStar = nStar
elseif nStar > self.nStar and self.nCharId == nCharId then
self.nStar = nStar
bPlayCompoundAnim = true
end
for i = 1, self.MAX_STAR do
local goFxStar = self._mapNode.FxStar[i]
if goFxStar then
goFxStar:SetActive(i <= nStar)
end
end
if bPlayCompoundAnim == true then
CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_chair_combine")
local nAnimLength = NovaAPI.GetAnimClipLength(self._mapNode.animRoot, {
"SoldierSupportCard_compound"
})
self:AddTimer(1, nAnimLength, function()
for i = 1, self.MAX_STAR do
local goStar = self._mapNode.Star[i]
if goStar then
goStar:SetActive(i <= nStar)
end
end
end)
else
for i = 1, self.MAX_STAR do
local goStar = self._mapNode.Star[i]
if goStar then
goStar:SetActive(nStar >= i)
end
end
end
end
function SoldierCharCardItemCtrl:SetTrackAndRecommend()
if self.bActive == false then
return
end
if self.bInSandland == nil or self.bInSandland == false then
self._mapNode.imgRecommend.gameObject:SetActive(false)
return
end
if self.nCharId == nil then
return
end
self._mapNode.imgRecommend.gameObject:SetActive(true)
local levelData = PlayerData.SoldierData:GetCurLevelData()
if levelData == nil then
self._mapNode.imgRecommend.gameObject:SetActive(false)
return
end
local bTrack = levelData:CheckChessTrace(self.nCharId)
local bRecommend = PlayerData.SoldierData:CheckChessRecommendState(self.nCharId)
local sIcon = ""
if bRecommend and bTrack then
sIcon = "Icon/SoldierOtherIcon/SoldierPartnerBuilds_03"
elseif bTrack then
sIcon = "Icon/SoldierOtherIcon/SoldierPartnerBuilds_02"
elseif bRecommend then
sIcon = "Icon/SoldierOtherIcon/SoldierPartnerBuilds_01"
else
self._mapNode.imgRecommend.gameObject:SetActive(false)
end
if sIcon ~= "" then
self:SetPngSprite(self._mapNode.imgRecommend, sIcon)
end
end
function SoldierCharCardItemCtrl:SetChessPosition(nType)
if nType == nil then
return
end
local tbChessTypeConfig = CacheTable.GetData("_SoldierChessType", nType)
local sIcon = ""
if tbChessTypeConfig ~= nil then
sIcon = tbChessTypeConfig.Icon
end
local sPath = "Icon/SoldierOtherIcon/" .. sIcon
self:SetPngSprite(self._mapNode.img_Position, sPath)
end
function SoldierCharCardItemCtrl:SetSelect(bSelect)
self._mapNode.ImageSelect.gameObject:SetActive(bSelect)
end
function SoldierCharCardItemCtrl:SetLock(bLock)
self._mapNode.imgLock.gameObject:SetActive(bLock)
end
function SoldierCharCardItemCtrl:SetClickCallback(obj, fn)
self._objClickCallback = obj
self._fnClickCallback = fn
end
function SoldierCharCardItemCtrl:GetAnimator()
if self._mapNode.animRoot == nil then
self._mapNode.animRoot = self.gameObejct.transform:GetChild(0):GetChild(0):GetComponent("Animator")
if self._mapNode.animRoot == nil then
return nil
end
end
return self._mapNode.animRoot
end
function SoldierCharCardItemCtrl:OnBtnItemClick()
if self._fnClickCallback ~= nil and self.nCharId ~= nil then
self._fnClickCallback(self._objClickCallback, self.nCharId)
end
end
function SoldierCharCardItemCtrl:OnEvent_SoldierCharCardItemClicked(nCharId)
if nCharId == nil then
self:SetSelect(false)
return
end
self:SetSelect(nCharId == self.nCharId)
end
return SoldierCharCardItemCtrl
@@ -0,0 +1,52 @@
local SoldierCharItemCtrl = class("SoldierCharItemCtrl", BaseCtrl)
local RootPath = "Icon/SoldierOtherIcon/"
SoldierCharItemCtrl._mapNodeConfig = {
img_icon = {sComponentName = "Image"},
img_rarity = {sComponentName = "Image"},
imgInBattle = {},
txtInBattle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_InBattle"
},
imgMask = {},
Star = {nCount = 5},
StarRoot = {}
}
SoldierCharItemCtrl._mapEventConfig = {}
SoldierCharItemCtrl._mapRedDotConfig = {}
function SoldierCharItemCtrl:SetItemData(soldierCharId)
self.soldierCharId = soldierCharId
local soldierCharConfig = ConfigTable.GetData("SoldierCharacter", self.soldierCharId)
if soldierCharConfig == nil then
return
end
local rarity = soldierCharConfig.Rarity
self:SetPngSprite(self._mapNode.img_rarity, RootPath .. AllEnum.SoldierChessRarityIcon[rarity] .. AllEnum.SoldierChessIconSurfix.S)
local skinId = soldierCharConfig.Skin
local skinConfig = ConfigTable.GetData("SoldierSkin", skinId)
if skinConfig == nil then
return
end
self:SetPngSprite(self._mapNode.img_icon, skinConfig.Icon .. AllEnum.SoldierChessIconSurfix.S)
end
function SoldierCharItemCtrl:SetItemState(bInBattle, bNotOwned)
self._mapNode.imgInBattle:SetActive(bInBattle)
self._mapNode.imgMask:SetActive(bNotOwned)
end
function SoldierCharItemCtrl:SetCharItemBtnFunc(callback)
local btnChar = self.gameObject:GetComponent("UIButton")
if btnChar == nil then
return
end
btnChar.onClick:RemoveAllListeners()
btnChar.onClick:AddListener(callback)
end
function SoldierCharItemCtrl:SetCharLevel(nLevel)
self._mapNode.StarRoot:SetActive(0 < nLevel)
if 0 < nLevel then
for i = 1, 5 do
self._mapNode.Star[i]:SetActive(i <= nLevel)
end
end
end
return SoldierCharItemCtrl
@@ -0,0 +1,314 @@
local SoldierCharSupportCardItemCtrl = class("SoldierCharSupportCardItemCtrl", BaseCtrl)
local SoldierAttrData = require("GameCore.Data.DataClass.Soldier.SoldierAttrData")
SoldierCharSupportCardItemCtrl._mapNodeConfig = {
btnItem = {
sComponentName = "UIButton",
callback = "OnBtnItemClick"
},
Star = {nCount = 5},
FxStar = {nCount = 5},
StarRoot = {sComponentName = "Transform"},
goChar = {},
imgEmpty = {},
imgSelect = {},
imgPut = {},
ImgPutLight = {},
imageIcon = {sComponentName = "Image"},
imageRarity = {sComponentName = "Image"},
img_Position = {sComponentName = "Image"},
imgPosition = {},
animRoot = {sNodeName = "AnimRoot", sComponentName = "Animator"},
HeadRoot = {sComponentName = "Animator"},
img_icon = {sComponentName = "Image"},
img_iconBg = {sComponentName = "Image"},
img_iconBg_Add = {sComponentName = "Image"},
Fx_warrior = {}
}
SoldierCharSupportCardItemCtrl._mapEventConfig = {
SoldierCharSupportCardItemClicked = "OnEvent_SoldierCharSupportCardItemClicked",
SoldierPartnerNewActive = "OnEvent_SoldierPartnerNewActive",
SoldierExtraPartnerTagChange = "OnEvent_SoldierExtraPartnerTagChange"
}
SoldierCharSupportCardItemCtrl._mapRedDotConfig = {}
SoldierCharSupportCardItemCtrl.MAX_STAR = 5
function SoldierCharSupportCardItemCtrl:Awake()
end
function SoldierCharSupportCardItemCtrl:OnEnable()
end
function SoldierCharSupportCardItemCtrl:OnDisable()
self:_StopPartnerActiveAnim()
end
function SoldierCharSupportCardItemCtrl:OnDestroy()
self:_StopPartnerActiveAnim()
end
function SoldierCharSupportCardItemCtrl:OnSelected()
end
function SoldierCharSupportCardItemCtrl:OnRefresh(nCharId)
if self.nCharId ~= nCharId then
self:_StopPartnerActiveAnim()
end
self.nCharId = nCharId
self:SetItemData(nCharId)
end
function SoldierCharSupportCardItemCtrl:SetItemData(nCharId)
if self.nCharId ~= nCharId then
self:_StopPartnerActiveAnim()
end
self._mapNode.imgPut:SetActive(false)
self._mapNode.ImgPutLight:SetActive(false)
self._mapNode.imgSelect:SetActive(false)
if nCharId == nil then
self.nCharId = nil
self._mapNode.goChar:SetActive(false)
self._mapNode.imgEmpty:SetActive(true)
return
end
self.nCharId = nCharId
self._mapNode.imgEmpty:SetActive(false)
self._mapNode.goChar:SetActive(true)
local soldierCharConfig = ConfigTable.GetData("SoldierCharacter", nCharId)
if soldierCharConfig == nil then
return
end
self:SetRarity(soldierCharConfig.Rarity)
self:SetStar(soldierCharConfig.Star, nCharId)
local skinConfig = ConfigTable.GetData("SoldierSkin", soldierCharConfig.Skin)
if skinConfig then
self:SetPngSprite(self._mapNode.imageIcon, skinConfig.Icon .. AllEnum.SoldierChessIconSurfix.M)
end
self._mapNode.Fx_warrior.gameObject:SetActive(false)
local curLevelData = PlayerData.SoldierData:GetCurLevelData()
if curLevelData ~= nil then
local bWarrior = curLevelData:GetExtraPartnerTags(self.nCharId)
if bWarrior ~= nil then
self._mapNode.Fx_warrior.gameObject:SetActive(true)
end
end
end
function SoldierCharSupportCardItemCtrl:SetRarity(nRarity)
if nRarity == nil then
return
end
self:SetPngSprite(self._mapNode.imageRarity, "Icon/SoldierOtherIcon/" .. AllEnum.SoldierChessRarityIcon[nRarity] .. AllEnum.SoldierChessIconSurfix.M)
end
function SoldierCharSupportCardItemCtrl:SetChessPosition(nDeployedPos)
self._mapNode.imgPosition.gameObject:SetActive(false)
if self.nCharId == nil then
return
end
local mapChar = ConfigTable.GetData("SoldierCharacter", self.nCharId)
if mapChar == nil then
return
end
local nType = mapChar.Type or GameEnum.ChessType.Balance
local tbChessTypeConfig = CacheTable.GetData("_SoldierChessType", nType)
local sIcon = ""
if tbChessTypeConfig ~= nil then
sIcon = tbChessTypeConfig.Icon
end
self._mapNode.imgPosition.gameObject:SetActive(true)
if nType ~= GameEnum.ChessType.Balance and nType ~= nDeployedPos then
sIcon = sIcon .. "_00"
end
local sPath = "Icon/SoldierOtherIcon/" .. sIcon
self:SetPngSprite(self._mapNode.img_Position, sPath)
end
function SoldierCharSupportCardItemCtrl:SetStar(nStar, nCharId)
nStar = nStar or 0
local bPlayCompoundAnim = false
if self.nStar == nil then
self.nStar = nStar
elseif nStar > self.nStar and self.nCharId == nCharId then
self.nStar = nStar
bPlayCompoundAnim = true
end
for i = 1, self.MAX_STAR do
local goFxStar = self._mapNode.FxStar[i]
if goFxStar then
goFxStar:SetActive(i <= nStar)
end
end
if bPlayCompoundAnim == true then
CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_chair_combine")
local nAnimLength = NovaAPI.GetAnimClipLength(self._mapNode.animRoot, {
"SoldierSupportCard_compound"
})
self:AddTimer(1, nAnimLength, function()
for i = 1, self.MAX_STAR do
local goStar = self._mapNode.Star[i]
if goStar then
goStar:SetActive(i <= nStar)
end
end
end)
else
for i = 1, self.MAX_STAR do
local goStar = self._mapNode.Star[i]
if goStar then
goStar:SetActive(nStar >= i)
end
end
end
end
function SoldierCharSupportCardItemCtrl:SetSelect(bSelect)
self._mapNode.ImageSelect.gameObject:SetActive(bSelect)
end
function SoldierCharSupportCardItemCtrl:SetLock(bLock)
self._mapNode.imgLock.gameObject:SetActive(bLock)
end
function SoldierCharSupportCardItemCtrl:_CancelPartnerActiveTimer()
if self.timerCloseParterNode ~= nil then
self.timerCloseParterNode:Cancel()
self.timerCloseParterNode = nil
end
end
function SoldierCharSupportCardItemCtrl:_StopPartnerActiveAnim()
self:_CancelPartnerActiveTimer()
self.tbPartnerActiveAnimQueue = nil
self.mapPartnerActiveAnimPending = nil
self.bPlayingPartnerActiveAnim = false
if self._mapNode ~= nil and self._mapNode.HeadRoot ~= nil then
self._mapNode.HeadRoot.gameObject:SetActive(false)
end
end
function SoldierCharSupportCardItemCtrl:_GetPartnerActiveAnimKey(nPartnerType, nPartnerId)
return tostring(nPartnerType or 0) .. "_" .. tostring(nPartnerId or 0)
end
function SoldierCharSupportCardItemCtrl:_TryInsertPartnerActiveAnim(tbQueue, nPartnerType, nPartnerId, nOrder)
if nPartnerType == nil then
return
end
local mapGroup = CacheTable.GetData("_SoldierPartnerGroup", nPartnerType)
if mapGroup == nil then
return
end
table.insert(tbQueue, {
nType = nPartnerType,
nId = nPartnerId,
nOrder = nOrder
})
end
function SoldierCharSupportCardItemCtrl:_GetMyActivePartnerQueue(tbActivePartner)
local tbPartnerTypes = SoldierAttrData.GetPartnerGroupsByChessId(self.nCharId)
if tbPartnerTypes == nil or #tbPartnerTypes == 0 then
return nil
end
local tbQueue = {}
for nOrder, nPartnerType in ipairs(tbPartnerTypes) do
local mapActivePartner = tbActivePartner ~= nil and tbActivePartner[nPartnerType] or nil
if mapActivePartner ~= nil then
local nPartnerId = type(mapActivePartner) == "table" and mapActivePartner.nId or mapActivePartner
self:_TryInsertPartnerActiveAnim(tbQueue, nPartnerType, nPartnerId, nOrder)
end
end
if #tbQueue == 0 then
return nil
end
table.sort(tbQueue, function(a, b)
if a.nOrder == b.nOrder then
return a.nType < b.nType
end
return a.nOrder < b.nOrder
end)
return tbQueue
end
function SoldierCharSupportCardItemCtrl:_TryAppendPartnerActiveAnimQueue(mapItem)
if mapItem == nil then
return
end
local sKey = self:_GetPartnerActiveAnimKey(mapItem.nType, mapItem.nId)
self.mapPartnerActiveAnimPending = self.mapPartnerActiveAnimPending or {}
if self.mapPartnerActiveAnimPending[sKey] == true then
return
end
self.mapPartnerActiveAnimPending[sKey] = true
self.tbPartnerActiveAnimQueue = self.tbPartnerActiveAnimQueue or {}
table.insert(self.tbPartnerActiveAnimQueue, mapItem)
end
function SoldierCharSupportCardItemCtrl:_FinishPartnerActiveAnimItem(mapItem)
if mapItem == nil or self.mapPartnerActiveAnimPending == nil then
return
end
local sKey = self:_GetPartnerActiveAnimKey(mapItem.nType, mapItem.nId)
self.mapPartnerActiveAnimPending[sKey] = nil
end
function SoldierCharSupportCardItemCtrl:_PlayNextPartnerActiveAnim()
self:_CancelPartnerActiveTimer()
if self.tbPartnerActiveAnimQueue == nil or #self.tbPartnerActiveAnimQueue == 0 then
self.bPlayingPartnerActiveAnim = false
self._mapNode.HeadRoot.gameObject:SetActive(false)
return
end
local mapItem = table.remove(self.tbPartnerActiveAnimQueue, 1)
local mapGroup = CacheTable.GetData("_SoldierPartnerGroup", mapItem.nType)
local mapPartner = ConfigTable.GetData("SoldierPartner", mapItem.nId)
if mapGroup ~= nil and mapPartner ~= nil then
self.bPlayingPartnerActiveAnim = true
self:SetPngSprite(self._mapNode.img_icon, "Icon/SoldierPartner/" .. mapGroup.Icon .. AllEnum.SoldierChessIconSurfix.M)
self:SetPngSprite(self._mapNode.img_iconBg, "Icon/SoldierOtherIcon/PartnerLevelQuality_0" .. mapPartner.PartnerLevelQuality)
self:SetPngSprite(self._mapNode.img_iconBg_Add, "Icon/SoldierOtherIcon/PartnerLevelQuality_0" .. mapPartner.PartnerLevelQuality)
self._mapNode.HeadRoot.gameObject:SetActive(true)
self._mapNode.HeadRoot:Play("HeadActive", 0, 0)
local nAnimLength = NovaAPI.GetAnimClipLength(self._mapNode.HeadRoot, {"HeadActive"})
if type(nAnimLength) ~= "number" or nAnimLength <= 0 then
nAnimLength = 1
end
self.timerCloseParterNode = self:AddTimer(1, nAnimLength, function()
self._mapNode.HeadRoot.gameObject:SetActive(false)
self:_FinishPartnerActiveAnimItem(mapItem)
self:_PlayNextPartnerActiveAnim()
end, true, true)
else
self:_FinishPartnerActiveAnimItem(mapItem)
self:_PlayNextPartnerActiveAnim()
end
end
function SoldierCharSupportCardItemCtrl:OnEvent_SoldierPartnerNewActive(tbActivePartner)
local tbQueue = self:_GetMyActivePartnerQueue(tbActivePartner)
if tbQueue == nil then
return
end
for _, mapItem in ipairs(tbQueue) do
self:_TryAppendPartnerActiveAnimQueue(mapItem)
end
if self.bPlayingPartnerActiveAnim ~= true then
self:_PlayNextPartnerActiveAnim()
end
end
function SoldierCharSupportCardItemCtrl:OnEvent_SoldierExtraPartnerTagChange()
local bWarrior = PlayerData.SoldierData:GetCurLevelData():GetExtraPartnerTags(self.nCharId)
if bWarrior ~= nil then
self._mapNode.Fx_warrior.gameObject:SetActive(true)
else
self._mapNode.Fx_warrior.gameObject:SetActive(false)
end
end
function SoldierCharSupportCardItemCtrl:GetAnimator()
if self._mapNode.animRoot == nil then
self._mapNode.animRoot = self.gameObejct.transform:GetChild(0):GetChild(0):GetComponent("Animator")
if self._mapNode.animRoot == nil then
return nil
end
end
return self._mapNode.animRoot
end
function SoldierCharSupportCardItemCtrl:OnBtnItemClick()
if self._fnClickCallback ~= nil and self.nCharId ~= nil then
self._fnClickCallback(self._objClickCallback, self.nCharId)
end
end
function SoldierCharSupportCardItemCtrl:SetClickCallback(obj, fn)
self._objClickCallback = obj
self._fnClickCallback = fn
end
function SoldierCharSupportCardItemCtrl:OnEvent_SoldierCharSupportCardItemClicked(nCharId)
if nCharId == nil then
self:SetSelect(false)
return
end
if self._fnClickCallback ~= nil and self.nCharId ~= nil then
self:SetSelect(nCharId == self.nCharId)
self._fnClickCallback(self._objClickCallback, self.nCharId)
end
end
return SoldierCharSupportCardItemCtrl
@@ -0,0 +1,43 @@
local SoldierCharGridCtrl = class("SoldierCharGridCtrl", BaseCtrl)
local RootPath = "Icon/SoldierOtherIcon/"
SoldierCharGridCtrl._mapNodeConfig = {
img_rarity = {sComponentName = "Image"},
img_icon = {sComponentName = "Image"},
txtCount = {sComponentName = "TMP_Text"},
imgInBattle = {},
imgMask = {},
txtInBattle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_InBattle"
},
StarRoot = {},
Star = {nCount = 5}
}
SoldierCharGridCtrl._mapEventConfig = {
SoldierHandbookStrategyCard_Selected = "OnEvent_SoldierHandbookStrategyCard_Selected"
}
SoldierCharGridCtrl._mapRedDotConfig = {}
function SoldierCharGridCtrl:SetItem(nRarity, nCount, sIcon, nStar, bMask, bInBattle)
self:SetPngSprite(self._mapNode.img_rarity, RootPath .. AllEnum.SoldierChessRarityIcon[nRarity] .. AllEnum.SoldierChessIconSurfix.S)
if sIcon ~= nil and sIcon ~= "" then
self:SetPngSprite(self._mapNode.img_icon, sIcon)
end
if 0 < nCount then
self._mapNode.txtCount.gameObject:SetActive(true)
NovaAPI.SetTMPText(self._mapNode.txtCount, nCount)
else
self._mapNode.txtCount.gameObject:SetActive(false)
end
self._mapNode.imgInBattle:SetActive(bInBattle)
self._mapNode.imgMask:SetActive(bMask)
if nStar ~= nil and 0 < nStar then
self._mapNode.StarRoot.gameObject:SetActive(true)
for i = 1, #self._mapNode.Star do
local star = self._mapNode.Star[i]
star.gameObject:SetActive(nStar >= i)
end
else
self._mapNode.StarRoot.gameObject:SetActive(false)
end
end
return SoldierCharGridCtrl
@@ -0,0 +1,37 @@
local SoldierItemGridCtrl = class("SoldierItemGridCtrl", BaseCtrl)
local RootPath = "Icon/SoldierOtherIcon/"
SoldierItemGridCtrl._mapNodeConfig = {
img_rarity = {sComponentName = "Image"},
img_icon = {sComponentName = "Image"},
txtCount = {sComponentName = "TMP_Text"}
}
SoldierItemGridCtrl._mapEventConfig = {
SoldierHandbookStrategyCard_Selected = "OnEvent_SoldierHandbookStrategyCard_Selected"
}
SoldierItemGridCtrl._mapRedDotConfig = {}
function SoldierItemGridCtrl:SetItem(nRarity, nCount, sIcon, nItemId)
self:SetPngSprite(self._mapNode.img_rarity, RootPath .. AllEnum.SoldierItemRarityIcon[nRarity])
if sIcon ~= nil and sIcon ~= "" then
self:SetPngSprite(self._mapNode.img_icon, sIcon)
end
if 0 < nCount then
self._mapNode.txtCount.gameObject:SetActive(true)
NovaAPI.SetTMPText(self._mapNode.txtCount, nCount)
else
self._mapNode.txtCount.gameObject:SetActive(false)
end
self.btnSelf = self.gameObject:GetComponent("UIButton")
if self.btnSelf ~= nil then
self.btnSelf.onClick:RemoveAllListeners()
self.btnSelf.onClick:AddListener(function()
UTILS.ClickItemGridWithTips(nItemId, self.gameObject.transform, true)
end)
end
end
function SoldierItemGridCtrl:OnDisable()
if self.btnSelf ~= nil then
self.btnSelf.onClick:RemoveAllListeners()
self.btnSelf = nil
end
end
return SoldierItemGridCtrl
@@ -0,0 +1,41 @@
local SoldierPotentialItemCtrl = class("SoldierPotentialItemCtrl", BaseCtrl)
SoldierPotentialItemCtrl._mapNodeConfig = {
imgIcon = {sComponentName = "Image"},
txtName = {sComponentName = "TMP_Text"},
iconStar = {nCount = 4},
goLock = {},
iconLockStar = {nCount = 4},
listStar = {}
}
SoldierPotentialItemCtrl._mapEventConfig = {}
SoldierPotentialItemCtrl._mapRedDotConfig = {}
function SoldierPotentialItemCtrl:SetItemData(nPotentialId, nStar)
nStar = nStar or 0
local potentialConfig = ConfigTable.GetData("SoldierPotential", nPotentialId)
if potentialConfig == nil then
return
end
self:SetPngSprite(self._mapNode.imgIcon, potentialConfig.Icon)
NovaAPI.SetTMPText(self._mapNode.txtName, potentialConfig.Name)
for i = 1, 4 do
self._mapNode.iconStar[i]:SetActive(nStar >= i)
end
self._mapNode.goLock:SetActive(false)
self._mapNode.listStar:SetActive(true)
end
function SoldierPotentialItemCtrl:SetItemLockData(nPotentialId, nStar)
nStar = nStar or 0
local potentialConfig = ConfigTable.GetData("SoldierPotential", nPotentialId)
if potentialConfig == nil then
return
end
self._mapNode.goLock:SetActive(true)
for i = 1, 4 do
self._mapNode.iconLockStar[i]:SetActive(i <= nStar)
end
for i = 1, 4 do
self._mapNode.iconStar[i]:SetActive(false)
end
self._mapNode.listStar:SetActive(false)
end
return SoldierPotentialItemCtrl
@@ -0,0 +1,31 @@
local SoldierStarterCardItemCtrl = class("SoldierStarterCardItemCtrl", BaseCtrl)
local RootPath = "Icon/SoldierBuffCard/"
SoldierStarterCardItemCtrl._mapNodeConfig = {
imgRare = {sComponentName = "Image"},
imgIcon = {sComponentName = "Image"},
imgSelect = {},
txtName = {sComponentName = "TMP_Text"}
}
SoldierStarterCardItemCtrl._mapEventConfig = {
SoldierHandbookStarterCard_Selected = "OnEvent_SoldierHandbookStarterCard_Selected"
}
SoldierStarterCardItemCtrl._mapRedDotConfig = {}
function SoldierStarterCardItemCtrl:SetItemData(mapStarterCardData, bSelected)
self.mapStarterCardData = mapStarterCardData
local starterCardConfig = ConfigTable.GetData("SoldierStarterCard", mapStarterCardData.Id)
if starterCardConfig == nil then
return
end
self:SetPngSprite(self._mapNode.imgIcon, RootPath .. starterCardConfig.Icon)
NovaAPI.SetTMPText(self._mapNode.txtName, starterCardConfig.Name)
self._mapNode.imgSelect:SetActive(false)
self._mapNode.imgSelect:SetActive(bSelected)
end
function SoldierStarterCardItemCtrl:OnEvent_SoldierHandbookStarterCard_Selected(nStarterCardId)
if self.mapStarterCardData.Id == nStarterCardId then
self._mapNode.imgSelect:SetActive(true)
else
self._mapNode.imgSelect:SetActive(false)
end
end
return SoldierStarterCardItemCtrl
@@ -0,0 +1,29 @@
local SoldierStrategyCardItemCtrl = class("SoldierStrategyCardItemCtrl", BaseCtrl)
local RootPath = "Icon/SoldierOtherIcon/"
local iconPath = "Icon/SoldierBuffCard/"
SoldierStrategyCardItemCtrl._mapNodeConfig = {
imgRare = {sComponentName = "Image"},
imgIcon = {sComponentName = "Image"},
imgSelect = {},
txtName = {sComponentName = "TMP_Text"}
}
SoldierStrategyCardItemCtrl._mapEventConfig = {
SoldierHandbookStrategyCard_Selected = "OnEvent_SoldierHandbookStrategyCard_Selected"
}
SoldierStrategyCardItemCtrl._mapRedDotConfig = {}
function SoldierStrategyCardItemCtrl:SetItemData(mapStrategyCardData, bSelected)
self.mapStrategyCardData = mapStrategyCardData
local rarity = self.mapStrategyCardData.Rarity
self:SetPngSprite(self._mapNode.imgRare, RootPath .. AllEnum.SoldierStrategyCardRarityIcon[rarity] .. AllEnum.SoldierChessIconSurfix.M)
self:SetPngSprite(self._mapNode.imgIcon, iconPath .. self.mapStrategyCardData.Icon)
NovaAPI.SetTMPText(self._mapNode.txtName, self.mapStrategyCardData.Name)
self._mapNode.imgSelect:SetActive(bSelected)
end
function SoldierStrategyCardItemCtrl:OnEvent_SoldierHandbookStrategyCard_Selected(nStrategyCardId)
if self.mapStrategyCardData.Id == nStrategyCardId then
self._mapNode.imgSelect:SetActive(true)
else
self._mapNode.imgSelect:SetActive(false)
end
end
return SoldierStrategyCardItemCtrl