Major Update - 2.0.0.143

EN: 2.0.0.143
CN: 2.0.0.142
JP: 2.0.0.145
KR: 2.0.0.150
This commit is contained in:
SL1900
2026-10-20 13:00:00 +09:00
parent 4bcada6061
commit 08b515afd9
1773 changed files with 1095195 additions and 65670 deletions
@@ -0,0 +1,99 @@
local AnniversaryActCtrl = class("AnniversaryActCtrl", BaseCtrl)
local ClientManager = CS.ClientManager.Instance
AnniversaryActCtrl._mapNodeConfig = {
btnJump = {
nCount = 4,
sComponentName = "UIButton",
callback = "OnBtnClick_Jump"
},
btnName = {
nCount = 2,
sComponentName = "UIButton",
callback = "OnBtnClick_Name"
},
txtBtnSkin = {nCount = 2, sComponentName = "TMP_Text"},
txtBtnChar = {nCount = 2, sComponentName = "TMP_Text"},
txtBtnJump1 = {
sComponentName = "TMP_Text",
sLanguageId = "Activity_Advertise_Skin_201018"
},
txtBtnJump2 = {
sComponentName = "TMP_Text",
sLanguageId = "Activity_Advertise_Package_201018"
},
txtBtnJump3 = {
sComponentName = "TMP_Text",
sLanguageId = "Activity_Advertise_Bonus_201018"
},
txtBtnJump4 = {
sComponentName = "TMP_Text",
sLanguageId = "Activity_Advertise_ChargeReset_201018"
},
txtDiscount = {
sComponentName = "TMP_Text",
sLanguageId = "Activity_Advertise_PackageDiscount_201018"
},
reddotMall = {}
}
AnniversaryActCtrl._mapRedDotConfig = {
[RedDotDefine.Mall_Page] = {
sNodeName = "reddotMall",
param = {
AllEnum.MallToggle.Activity
}
}
}
function AnniversaryActCtrl:InitActData(actData)
self.actData = actData
self.nActId = actData:GetActId()
self.AdConfig = ConfigTable.GetData("AdControl", self.nActId)
self:RefreshAct()
end
local tbCharId = {110, 155}
local tbSkinId = {11003, 15503}
function AnniversaryActCtrl:RefreshAct()
local tbTxtSkin = self._mapNode.txtBtnSkin
local tbTxtChar = self._mapNode.txtBtnChar
for i = 1, #tbSkinId do
local mapSkinCfg = ConfigTable.GetData_CharacterSkin(tbSkinId[i])
if mapSkinCfg == nil then
printError(string.format("CharacterSkin表里找不到皮肤id:%d", tbSkinId[i]))
end
NovaAPI.SetTMPText(tbTxtSkin[i], mapSkinCfg ~= nil and mapSkinCfg.Name or "")
local mapCharCfg = ConfigTable.GetData_Character(tbCharId[i])
if mapCharCfg == nil then
printError(string.format("Character表里找不到角色id:%d", tbCharId[i]))
end
NovaAPI.SetTMPText(tbTxtChar[i], mapCharCfg ~= nil and mapCharCfg.Name or "")
end
end
function AnniversaryActCtrl:OnBtnClick_Name(btn, nIndex)
local callback = function()
EventManager.Hit(EventId.OpenPanel, PanelId.Mall, AllEnum.MallToggle.Skin)
end
EventManager.Hit(EventId.SetTransition, 5, callback)
end
function AnniversaryActCtrl:OnBtnClick_Jump(btn, nIndex)
local nEndTime = self.actData:GetActEndTime()
local nCurTime = ClientManager.serverTimeStamp
if nEndTime < nCurTime then
return
end
local bPlayCond = self.actData:CheckActJumpCond(true)
if not bPlayCond then
return
end
local callback = function()
if nIndex == 1 then
EventManager.Hit(EventId.OpenPanel, PanelId.Mall, AllEnum.MallToggle.Skin)
elseif nIndex == 2 then
EventManager.Hit(EventId.OpenPanel, PanelId.Mall, AllEnum.MallToggle.Package)
elseif nIndex == 3 then
EventManager.Hit(EventId.OpenPanel, PanelId.Mall, AllEnum.MallToggle.Activity)
elseif nIndex == 4 then
EventManager.Hit(EventId.OpenPanel, PanelId.Mall, AllEnum.MallToggle.Gem)
end
end
EventManager.Hit(EventId.SetTransition, 5, callback)
end
return AnniversaryActCtrl
@@ -1,5 +1,5 @@
local TimerManager = require("GameCore.Timer.TimerManager")
NewTutorialsActCtrl = class("NewTutorialsActCtrl", BaseCtrl)
local NewTutorialsActCtrl = class("NewTutorialsActCtrl", BaseCtrl)
NewTutorialsActCtrl._mapNodeConfig = {
goBaseGuide = {},
goAdvanceGuide = {},
@@ -263,7 +263,7 @@ function NewTutorialsActCtrl:RefreshGuideQuset()
self._mapNode.btn_GoGuideQusetPanel.gameObject:SetActive(bPlayCond)
self._mapNode.txt_Locked1.gameObject:SetActive(not bPlayCond)
local mapLockCfgData = ConfigTable.GetData("OpenFunc", GameEnum.OpenFuncType.Quest) or {}
sLockTip = UTILS.ParseParamDesc(mapLockCfgData.Tips, mapLockCfgData)
local sLockTip = UTILS.ParseParamDesc(mapLockCfgData.Tips, mapLockCfgData)
NovaAPI.SetTMPText(self._mapNode.txt_Locked1, sLockTip)
if not bPlayCond then
return
@@ -290,7 +290,7 @@ function NewTutorialsActCtrl:RefreshTutorial()
self._mapNode.btn_GoTutorialPanel.gameObject:SetActive(bPlayCond)
self._mapNode.txt_Locked2.gameObject:SetActive(not bPlayCond)
local mapLockCfgData = ConfigTable.GetData("OpenFunc", GameEnum.OpenFuncType.TutorialLevel) or {}
sLockTip = UTILS.ParseParamDesc(mapLockCfgData.Tips, mapLockCfgData)
local sLockTip = UTILS.ParseParamDesc(mapLockCfgData.Tips, mapLockCfgData)
NovaAPI.SetTMPText(self._mapNode.txt_Locked2, sLockTip)
if not bPlayCond then
return
@@ -315,7 +315,7 @@ function NewTutorialsActCtrl:RefreshTeamFormation()
self._mapNode.btn_GoTeamFormationPanel.gameObject:SetActive(bPlayCond)
self._mapNode.txt_Locked3.gameObject:SetActive(not bPlayCond)
local mapLockCfgData = ConfigTable.GetData("OpenFunc", GameEnum.OpenFuncType.QuestNewbie) or {}
sLockTip = UTILS.ParseParamDesc(mapLockCfgData.Tips, mapLockCfgData)
local sLockTip = UTILS.ParseParamDesc(mapLockCfgData.Tips, mapLockCfgData)
NovaAPI.SetTMPText(self._mapNode.txt_Locked3, sLockTip)
if not bPlayCond then
return
@@ -347,7 +347,7 @@ function NewTutorialsActCtrl:RefreshWeekBoss()
self._mapNode.btn_GoWeekBossPanel.gameObject:SetActive(bPlayCond)
self._mapNode.goCountDown3.gameObject:SetActive(bPlayCond)
local mapLockCfgData = ConfigTable.GetData("OpenFunc", GameEnum.OpenFuncType.WeeklyCopies) or {}
sLockTip = UTILS.ParseParamDesc(mapLockCfgData.Tips, mapLockCfgData)
local sLockTip = UTILS.ParseParamDesc(mapLockCfgData.Tips, mapLockCfgData)
self._mapNode.txt_AdvanceLocked3.gameObject:SetActive(not bPlayCond)
NovaAPI.SetTMPText(self._mapNode.txt_AdvanceLocked3, sLockTip)
if not bPlayCond then
@@ -370,7 +370,7 @@ function NewTutorialsActCtrl:RefreshVampireSurvivor()
self._mapNode.goCountDown1.gameObject:SetActive(bPlayCond)
self._mapNode.goProgress1.gameObject:SetActive(bPlayCond)
local mapLockCfgData = ConfigTable.GetData("OpenFunc", GameEnum.OpenFuncType.VampireSurvivor) or {}
sLockTip = UTILS.ParseParamDesc(mapLockCfgData.Tips, mapLockCfgData)
local sLockTip = UTILS.ParseParamDesc(mapLockCfgData.Tips, mapLockCfgData)
self._mapNode.txt_AdvanceLocked1.gameObject:SetActive(not bPlayCond)
NovaAPI.SetTMPText(self._mapNode.txt_AdvanceLocked1, sLockTip)
if not bPlayCond then
@@ -420,7 +420,7 @@ function NewTutorialsActCtrl:RefreshScoreBoss()
self._mapNode.goProgress2.gameObject:SetActive(bPlayCond)
self._mapNode.txt_AdvanceLocked2.gameObject:SetActive(not bPlayCond)
local mapLockCfgData = ConfigTable.GetData("OpenFunc", GameEnum.OpenFuncType.ScoreBoss) or {}
sLockTip = UTILS.ParseParamDesc(mapLockCfgData.Tips, mapLockCfgData)
local sLockTip = UTILS.ParseParamDesc(mapLockCfgData.Tips, mapLockCfgData)
NovaAPI.SetTMPText(self._mapNode.txt_AdvanceLocked2, sLockTip)
if not bPlayCond then
return
@@ -0,0 +1,159 @@
local LoginRewardPopUpCtrl_01 = class("LoginRewardPopUpCtrl_01", BaseCtrl)
local ClientManager = CS.ClientManager.Instance
LoginRewardPopUpCtrl_01._mapNodeConfig = {
imgActivity = {sComponentName = "Image"},
goActTime = {},
txtActivityTime = {sComponentName = "TMP_Text"},
btnActivity = {
sComponentName = "Button",
callback = "OnBtnClick_Activity"
},
txtTips = {
sComponentName = "TMP_Text",
sLanguageId = "LoginReward_PopUp_Tip"
},
goRewardItem = {
nCount = 7,
sCtrlName = "Game.UI.Activity.LoginReward.LoginSpRewardItemCtrl"
},
imgActor = {nCount = 2, sComponentName = "Image"},
trActor2D_PNG = {
sNodeName = "----Actor2D_PNG----",
sComponentName = "Transform"
}
}
LoginRewardPopUpCtrl_01._mapEventConfig = {}
LoginRewardPopUpCtrl_01._mapRedDotConfig = {}
function LoginRewardPopUpCtrl_01:RefreshRemainTime()
local endTime = self.actData:GetActEndTime()
local curTime = ClientManager.serverTimeStamp
local remainTime = endTime - curTime
if remainTime < 0 then
self._mapNode.goActTime.gameObject:SetActive(false)
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)
if sec == 0 then
min = min - 1
sec = 60
end
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)
if min == 0 then
hour = hour - 1
min = 60
end
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)
if hour == 0 then
day = day - 1
hour = 24
end
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Day") or "", day, hour)
end
NovaAPI.SetTMPText(self._mapNode.txtActivityTime, sTimeStr)
end
function LoginRewardPopUpCtrl_01:RefreshActData()
self.nActId = self._panel.nActId
self.actData = self._panel.actData
self.remainTimer = nil
self:RefreshRewardList()
self:RefreshNPC2D()
local actCfg = self.actData:GetActCfgData()
if actCfg.EndType == GameEnum.activityEndType.NoLimit then
self._mapNode.goActTime.gameObject:SetActive(false)
else
self._mapNode.goActTime.gameObject:SetActive(true)
self:RefreshRemainTime()
end
end
function LoginRewardPopUpCtrl_01:RefreshRewardList()
local tbRewardList = self.actData:GetActLoginRewardList()
if nil ~= tbRewardList then
local nReceiveDay = self.actData:GetCanReceive()
self.nActual = self.actData:GetReceived()
for k, v in ipairs(self._mapNode.goRewardItem) do
local mapReward = tbRewardList[k]
v.gameObject:SetActive(mapReward ~= nil)
if mapReward ~= nil then
v:SetRewardItem(k, mapReward, true, nReceiveDay == self.nActual and k == self.nActual + 1, true)
end
end
end
end
function LoginRewardPopUpCtrl_01:RefreshNPC2D()
local tbRewardList = self.actData:GetActLoginRewardList()
local nReceive = self.actData:GetCanReceive()
local nNpcId = tbRewardList[nReceive].NpcId
local sPath = "LoginNpc_" .. nNpcId
self._mapNode.imgActor[1].gameObject:SetActive(true)
self:SetActivityAtlasSprite(self._mapNode.imgActor[1], "_" .. self.nActId, sPath)
NovaAPI.SetImageNativeSize(self._mapNode.imgActor[1])
end
function LoginRewardPopUpCtrl_01:PlayOutAnim()
local nAnimLength = 0
if self.animRoot ~= nil then
nAnimLength = NovaAPI.GetAnimClipLength(self.animRoot, {
"LoginReward_01_out"
})
self.animRoot:Play("LoginReward_01_out")
EventManager.Hit(EventId.TemporaryBlockInput, nAnimLength)
end
return nAnimLength
end
function LoginRewardPopUpCtrl_01:Awake()
self.animRoot = self.gameObject:GetComponent("Animator")
end
function LoginRewardPopUpCtrl_01:OnEnable()
if self.animRoot ~= nil then
local nAnimLength = NovaAPI.GetAnimClipLength(self.animRoot, {
"LoginReward_01_in"
})
self.animRoot:Play("LoginReward_01_in")
EventManager.Hit(EventId.TemporaryBlockInput, nAnimLength)
end
end
function LoginRewardPopUpCtrl_01:OnDisable()
end
function LoginRewardPopUpCtrl_01:OnDestroy()
end
function LoginRewardPopUpCtrl_01:OnBtnClick_Activity()
local bOpen = self.actData:CheckActivityOpen()
if not bOpen then
local callback = function()
EventManager.Hit("RefreshLoginRewardPanel")
end
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Alert,
sContent = ConfigTable.GetUIText("Activity_PopUp_Time_Out"),
callbackConfirm = callback
})
return
end
local canReceive = self.actData:CheckCanReceive()
if not canReceive then
EventManager.Hit("RefreshLoginRewardPanel")
return
end
local tbRewardList = self.actData:GetActLoginRewardList()
local nReceive = self.actData:GetCanReceive()
local mapNpc = {
nNpcId = tbRewardList[nReceive].NpcId,
nVoiceId = tbRewardList[nReceive].VoiceId
}
local callback = function()
EventManager.Hit("RefreshLoginRewardPanel")
end
PlayerData.Activity:SendReceiveLoginRewardMsg(self.nActId, callback, mapNpc)
end
return LoginRewardPopUpCtrl_01
@@ -0,0 +1,28 @@
local LoginSpRewardCtrl_01 = class("LoginSpRewardCtrl_01", BaseCtrl)
LoginSpRewardCtrl_01._mapNodeConfig = {
goCommon = {
sNodeName = "---Common---"
}
}
LoginSpRewardCtrl_01._mapEventConfig = {}
function LoginSpRewardCtrl_01:UnbindCtrl()
if self.activityCtrl ~= nil then
self:UnbindCtrlByNode(self.activityCtrl)
self.activityCtrl = nil
end
end
function LoginSpRewardCtrl_01:InitActData(actData)
if self.activityCtrl == nil then
self.activityCtrl = self:BindCtrlByNode(self._mapNode.goCommon, "Game.UI.Activity.LoginReward.LoginSpRewardCtrl_List")
end
self.actData = actData
self.nActId = actData:GetActId()
self.activityCtrl:InitActData(actData)
end
function LoginSpRewardCtrl_01:ClearActivity()
self:UnbindCtrl()
end
function LoginSpRewardCtrl_01:OnDisable()
self:UnbindCtrl()
end
return LoginSpRewardCtrl_01
@@ -0,0 +1,200 @@
local LoginRewardCtrl_01 = class("LoginRewardCtrl_01", BaseCtrl)
local TimerManager = require("GameCore.Timer.TimerManager")
local ClientManager = CS.ClientManager.Instance
LoginRewardCtrl_01._mapNodeConfig = {
btnDetail = {
sComponentName = "UIButton",
callback = "OnBtnClick_Detail"
},
txtDetail = {
sComponentName = "TMP_Text",
sLanguageId = "Activity_Btn_Detail"
},
goActTime = {},
txtActivityTime = {sComponentName = "TMP_Text"},
sv = {
sComponentName = "LoopScrollView"
},
btnActivity = {
sComponentName = "Button",
callback = "OnBtnClick_Activity"
}
}
LoginRewardCtrl_01._mapEventConfig = {}
function LoginRewardCtrl_01:UnbindCtrl()
for nInstanceId, objCtrl in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbGridCtrl[nInstanceId] = nil
end
self.tbGridCtrl = {}
end
function LoginRewardCtrl_01:RefreshRemainTime()
local endTime = self.actData:GetActEndTime()
local curTime = ClientManager.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)
if sec == 0 then
min = min - 1
sec = 60
end
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)
if min == 0 then
hour = hour - 1
min = 60
end
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)
if hour == 0 then
day = day - 1
hour = 24
end
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Day") or "", day, hour)
end
NovaAPI.SetTMPText(self._mapNode.txtActivityTime, sTimeStr)
end
function LoginRewardCtrl_01:RefreshRewardList()
local tbRewardList = self.actData:GetActLoginRewardList()
if nil ~= tbRewardList then
local nMaxDay = #tbRewardList
self.nReceiveDay = self.actData:GetCanReceive()
self.nActual = self.actData:GetReceived()
local canReceive = self.actData:CheckCanReceive()
local nSelectIndex = 0
if canReceive then
nSelectIndex = self.actData:GetCanReceive()
else
nSelectIndex = self.nActual
end
for nInstanceId, objCtrl in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbGridCtrl[nInstanceId] = nil
end
self._mapNode.sv:SetAnim(0.06)
self._mapNode.sv:Init(nMaxDay, self, self.OnGridRefresh, self.OnGridBtnClick)
self._mapNode.sv:SetScrollGridPos(nSelectIndex - 2, 0)
end
end
function LoginRewardCtrl_01:OnGridRefresh(goGrid, gridIndex)
local nIndex = gridIndex + 1
local tbRewardList = self.actData:GetActLoginRewardList()
local nMaxDay = #tbRewardList
local mapReward = tbRewardList[nIndex]
local nInstanceID = goGrid:GetInstanceID()
if not self.tbGridCtrl[nInstanceID] then
self.tbGridCtrl[nInstanceID] = self:BindCtrlByNode(goGrid, "Game.UI.Activity.LoginReward.LoginRewardItemCtrl")
end
self.tbGridCtrl[nInstanceID]:SetRewardItem(nIndex, mapReward, nIndex == nMaxDay, self.nReceiveDay == self.nActual and nIndex == self.nActual + 1, "zs_activity_03_num_")
end
function LoginRewardCtrl_01:OnGridBtnClick(goGrid, gridIndex)
local nIndex = gridIndex + 1
local tbRewardList = self.actData:GetActLoginRewardList()
local mapReward = tbRewardList[nIndex]
local tbShowReward = {}
if mapReward ~= nil then
for i = 1, 3 do
local nTid = mapReward["RewardId" .. i]
local nCount = mapReward["Qty" .. i]
if nTid ~= 0 then
table.insert(tbShowReward, {nTid = nTid, nCount = nCount})
end
end
end
self._mapNode.sv:SetScrollGridPos(nIndex - 1, 0.1, 1)
EventManager.Hit(EventId.BlockInput, true)
self:AddTimer(1, 0.1, function()
EventManager.Hit(EventId.BlockInput, false)
local btn = goGrid.transform:Find("btnGrid/AnimRoot/goRewardItem/btnItem")
if #tbShowReward == 1 then
local nTid = tbShowReward[1].nTid
UTILS.ClickItemGridWithTips(nTid, btn.gameObject.transform, true, true, false)
else
local tbReward = {}
for _, v in ipairs(tbShowReward) do
local rewardData = {
[1] = v.nTid,
[5] = v.nCount
}
table.insert(tbReward, rewardData)
end
EventManager.Hit("ShowActRewardList", tbReward)
end
end, true, true, true)
end
function LoginRewardCtrl_01:RefreshDetail()
local mapActCfg = self.actData:GetLoginRewardControlCfg()
local bEmpty = mapActCfg.DesText == ""
self._mapNode.btnDetail.gameObject:SetActive(not bEmpty)
end
function LoginRewardCtrl_01:InitActData(actData)
self.actData = actData
self.nActId = actData:GetActId()
self:RefreshRewardList()
self:RefreshDetail()
local canReceive = self.actData:CheckCanReceive()
self._mapNode.btnActivity.gameObject:SetActive(canReceive)
local actCfg = self.actData:GetActCfgData()
if actCfg.EndType == GameEnum.activityEndType.NoLimit then
self._mapNode.goActTime.gameObject:SetActive(false)
else
self._mapNode.goActTime.gameObject:SetActive(true)
self:RefreshRemainTime()
if nil == self.remainTimer then
self.remainTimer = self:AddTimer(0, 1, "RefreshRemainTime", true, true, false)
end
end
end
function LoginRewardCtrl_01:ClearActivity()
self:UnbindCtrl()
end
function LoginRewardCtrl_01:Awake()
self.tbGridCtrl = {}
end
function LoginRewardCtrl_01:OnDisable()
self:UnbindCtrl()
end
function LoginRewardCtrl_01:OnBtnClick_Detail()
local mapActCfg = self.actData:GetLoginRewardControlCfg()
local msg = {
nType = AllEnum.MessageBox.Desc,
sContent = mapActCfg.DesText,
sTitle = ConfigTable.GetUIText("Activity_Btn_Detail")
}
EventManager.Hit(EventId.OpenMessageBox, msg)
end
function LoginRewardCtrl_01:OnBtnClick_Activity()
local callback = function()
self._mapNode.btnActivity.gameObject:SetActive(false)
local actData = PlayerData.Activity:GetActivityDataById(self.actData:GetActId())
self:InitActData(actData)
end
local canReceive = self.actData:CheckCanReceive()
if not canReceive then
callback()
return
end
PlayerData.Activity:SendReceiveLoginRewardMsg(self.actData:GetActId(), callback)
end
return LoginRewardCtrl_01
@@ -0,0 +1,157 @@
local LoginRewardPopUpCtrl_01 = class("LoginRewardPopUpCtrl_01", BaseCtrl)
local ClientManager = CS.ClientManager.Instance
local TimerManager = require("GameCore.Timer.TimerManager")
LoginRewardPopUpCtrl_01._mapNodeConfig = {
sv = {
sNodeName = "goRewardList",
sComponentName = "LoopScrollView"
},
goActTime = {},
txtActivityTime = {sComponentName = "TMP_Text"},
btnActivity = {
sComponentName = "Button",
callback = "OnBtnClick_Activity"
},
txtTips = {
sComponentName = "TMP_Text",
sLanguageId = "LoginReward_PopUp_Tip"
}
}
LoginRewardPopUpCtrl_01._mapEventConfig = {}
LoginRewardPopUpCtrl_01._mapRedDotConfig = {}
function LoginRewardPopUpCtrl_01:RefreshRemainTime()
local endTime = self.actData:GetActEndTime()
local curTime = ClientManager.serverTimeStamp
local remainTime = endTime - curTime
if remainTime < 0 then
self._mapNode.goActTime.gameObject:SetActive(false)
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)
if sec == 0 then
min = min - 1
sec = 60
end
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)
if min == 0 then
hour = hour - 1
min = 60
end
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)
if hour == 0 then
day = day - 1
hour = 24
end
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Day") or "", day, hour)
end
NovaAPI.SetTMPText(self._mapNode.txtActivityTime, sTimeStr)
end
function LoginRewardPopUpCtrl_01:RefreshActData()
self.nActId = self._panel.nActId
self.actData = self._panel.actData
self.remainTimer = nil
self:RefreshRewardList()
local actCfg = self.actData:GetActCfgData()
if actCfg.EndType == GameEnum.activityEndType.NoLimit then
self._mapNode.goActTime.gameObject:SetActive(false)
else
self._mapNode.goActTime.gameObject:SetActive(true)
self:RefreshRemainTime()
end
end
function LoginRewardPopUpCtrl_01:RefreshRewardList()
local tbRewardList = self.actData:GetActLoginRewardList()
if nil ~= tbRewardList then
local nMaxDay = #tbRewardList
local nActual = self.actData:GetReceived()
for nInstanceId, objCtrl in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbGridCtrl[nInstanceId] = nil
end
self._mapNode.sv:SetAnim(0.06)
self._mapNode.sv:Init(nMaxDay, self, self.OnGridRefresh)
self:AddTimer(1, 0.5, function()
self._mapNode.sv:SetScrollGridPos(nActual - 1, 0.5)
end, true, true, true)
end
end
function LoginRewardPopUpCtrl_01:OnGridRefresh(goGrid, gridIndex)
local nIndex = gridIndex + 1
local tbRewardList = self.actData:GetActLoginRewardList()
local nMaxDay = #tbRewardList
local mapReward = tbRewardList[nIndex]
local nInstanceID = goGrid:GetInstanceID()
if not self.tbGridCtrl[nInstanceID] then
self.tbGridCtrl[nInstanceID] = self:BindCtrlByNode(goGrid, "Game.UI.Activity.LoginReward.LoginRewardItemCtrl")
end
self.tbGridCtrl[nInstanceID]:SetRewardItem(nIndex, mapReward, nIndex == nMaxDay, nil, "zs_activity_03_num_")
end
function LoginRewardPopUpCtrl_01:PlayOutAnim()
local nAnimLength = 0
if self.animRoot ~= nil then
nAnimLength = NovaAPI.GetAnimClipLength(self.animRoot, {
"LoginReward_01_out"
})
self.animRoot:Play("LoginReward_01_out")
EventManager.Hit(EventId.TemporaryBlockInput, nAnimLength)
end
return nAnimLength
end
function LoginRewardPopUpCtrl_01:Awake()
self.animRoot = self.gameObject:GetComponent("Animator")
self.tbGridCtrl = {}
end
function LoginRewardPopUpCtrl_01:OnEnable()
if self.animRoot ~= nil then
local nAnimLength = NovaAPI.GetAnimClipLength(self.animRoot, {
"LoginReward_01_in"
})
self.animRoot:Play("LoginReward_01_in")
EventManager.Hit(EventId.TemporaryBlockInput, nAnimLength)
end
end
function LoginRewardPopUpCtrl_01:OnDisable()
for nInstanceId, objCtrl in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbGridCtrl[nInstanceId] = nil
end
self.tbGridCtrl = {}
end
function LoginRewardPopUpCtrl_01:OnDestroy()
end
function LoginRewardPopUpCtrl_01:OnBtnClick_Activity()
local bOpen = self.actData:CheckActivityOpen()
if not bOpen then
local callback = function()
EventManager.Hit("RefreshLoginRewardPanel")
end
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Alert,
sContent = ConfigTable.GetUIText("Activity_PopUp_Time_Out"),
callbackConfirm = callback
})
return
end
local canReceive = self.actData:CheckCanReceive()
if not canReceive then
EventManager.Hit("RefreshLoginRewardPanel")
return
end
local callback = function()
EventManager.Hit("RefreshLoginRewardPanel")
end
PlayerData.Activity:SendReceiveLoginRewardMsg(self.nActId, callback)
end
return LoginRewardPopUpCtrl_01
@@ -19,8 +19,6 @@ LoginRewardPopUpCtrl_01._mapNodeConfig = {
sLanguageId = "Quest_Receive"
}
}
LoginRewardPopUpCtrl_01._mapEventConfig = {}
LoginRewardPopUpCtrl_01._mapRedDotConfig = {}
function LoginRewardPopUpCtrl_01:RefreshRemainTime()
local endTime = self.actData:GetActEndTime()
local curTime = ClientManager.serverTimeStamp
@@ -63,7 +61,6 @@ end
function LoginRewardPopUpCtrl_01:RefreshActData()
self.nActId = self._panel.nActId
self.actData = self._panel.actData
self.remainTimer = nil
local actCfg = self.actData:GetActCfgData()
if actCfg.EndType == GameEnum.activityEndType.NoLimit then
self._mapNode.goActTime.gameObject:SetActive(false)
@@ -120,8 +117,10 @@ function LoginRewardPopUpCtrl_01:OnBtnClick_Activity()
return
end
local callback = function()
EventManager.Hit("RefreshLoginRewardPanel")
PlayerData.CharSkin:TryOpenSkinShowPanel(function()
EventManager.Hit("RefreshLoginRewardPanel")
end)
end
PlayerData.Activity:SendReceiveLoginRewardMsg(301042, callback)
PlayerData.Activity:SendReceiveLoginRewardMsg(self.nActId, callback)
end
return LoginRewardPopUpCtrl_01
@@ -1,5 +1,6 @@
local LoginSkinRewardCtrl_01 = class("LoginSkinRewardCtrl_01", BaseCtrl)
local ClientManager = CS.ClientManager.Instance
local TimerManager = require("GameCore.Timer.TimerManager")
LoginSkinRewardCtrl_01._mapNodeConfig = {
btnDetail = {
sNodeName = "btnActDetail",
@@ -36,17 +37,14 @@ LoginSkinRewardCtrl_01._mapNodeConfig = {
LoginSkinRewardCtrl_01._mapEventConfig = {
ClickLoginRewardTips = "OnEvent_ClickLoginRewardTips"
}
function LoginSkinRewardCtrl_01:UnbindCtrl()
end
function LoginSkinRewardCtrl_01:InitActData(actData)
self.actData = actData
self.nActId = actData:GetActId()
self.nNpcId = nil
self.bPlayVoice = false
self:RefreshDetail()
local canReceive = self.actData:CheckCanReceive()
self._mapNode.btnReward.gameObject:SetActive(canReceive)
self._mapNode.btnUnReward.gameObject:SetActive(not canReceive)
self._mapNode.imgEnd.gameObject:SetActive(false)
local actCfg = self.actData:GetActCfgData()
if actCfg.EndType == GameEnum.activityEndType.NoLimit then
self._mapNode.goActTime.gameObject:SetActive(false)
@@ -62,11 +60,17 @@ function LoginSkinRewardCtrl_01:RefreshRemainTime()
local endTime = self.actData:GetActEndTime()
local curTime = ClientManager.serverTimeStamp
local remainTime = endTime - curTime
self._mapNode.goActTime:SetActive(0 < remainTime)
self._mapNode.imgEnd:SetActive(remainTime <= 0)
self._mapNode.goActTime.gameObject:SetActive(0 < remainTime)
self._mapNode.imgEnd.gameObject:SetActive(remainTime <= 0)
if remainTime < 0 then
TimerManager.Remove(self.remainTimer)
self.remainTimer = nil
if self.remainTimer then
TimerManager.Remove(self.remainTimer)
self.remainTimer = nil
end
if self._bEndPopped then
return
end
self._bEndPopped = true
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Alert,
sContent = ConfigTable.GetUIText("Activity_Invalid_Tip_1"),
@@ -114,8 +118,6 @@ function LoginSkinRewardCtrl_01:RefreshDetail()
local sTips = ConfigTable.GetUIText("LoginSkinRewardTips1_301053") .. "\n" .. ConfigTable.GetUIText("LoginSkinRewardTips2_301053")
NovaAPI.SetTMPText(self._mapNode.txtAdvanceMat, sTips)
end
function LoginSkinRewardCtrl_01:ClearActivity()
end
function LoginSkinRewardCtrl_01:OnBtnClick_Detail()
local mapActCfg = self.actData:GetLoginRewardControlCfg()
local msg = {
@@ -129,6 +131,7 @@ function LoginSkinRewardCtrl_01:OnBtnClick_Activity()
local callback = function()
self._mapNode.btnReward.gameObject:SetActive(false)
local actData = PlayerData.Activity:GetActivityDataById(self.actData:GetActId())
PlayerData.CharSkin:TryOpenSkinShowPanel()
self:InitActData(actData)
end
local canReceive = self.actData:CheckCanReceive()
@@ -136,6 +139,7 @@ function LoginSkinRewardCtrl_01:OnBtnClick_Activity()
return
end
PlayerData.Activity:SendReceiveLoginRewardMsg(self.actData:GetActId(), callback)
RedDotManager.SetValid(RedDotDefine.Activity_Tab, self.nActId, false)
end
function LoginSkinRewardCtrl_01:OnEvent_ClickLoginRewardTips(callback, index)
callback()
@@ -143,5 +147,9 @@ end
function LoginSkinRewardCtrl_01:OnBtnClick_Reward()
end
function LoginSkinRewardCtrl_01:OnDisable()
if self.remainTimer then
TimerManager.Remove(self.remainTimer)
self.remainTimer = nil
end
end
return LoginSkinRewardCtrl_01
@@ -127,6 +127,16 @@ function LoginSpRewardCtrl_List:RefreshRewardList()
end
end
end
function LoginSpRewardCtrl_List:StopVoice()
self.bPlayVoice = false
BubbleVoiceManager.StopBubbleAnim()
PlayerVoiceData:ClearTimer()
PlayerVoiceData:StopCharVoice()
if self.timer then
self.timer:Cancel()
self.timer = nil
end
end
function LoginSpRewardCtrl_List:RefreshNPC2D(bSwitch)
local tbRewardList = self.actData:GetActLoginRewardList()
local nNpcId = tbRewardList[self.nSelectIndex].NpcId
@@ -144,14 +154,7 @@ function LoginSpRewardCtrl_List:RefreshNPC2D(bSwitch)
self._mapNode.animActorL2D:Play("Actor2D_PNG_right_middle_in", 0, 0)
end
if bSwitch and self.bPlayVoice then
self.bPlayVoice = false
BubbleVoiceManager.StopBubbleAnim()
PlayerVoiceData:ClearTimer()
PlayerVoiceData:StopCharVoice()
if self.timer then
self.timer:Cancel()
self.timer = nil
end
self:StopVoice()
else
self:PlayVoice()
end
@@ -180,6 +183,7 @@ function LoginSpRewardCtrl_List:InitActData(actData)
self.actData = actData
self.nNpcId = nil
self.bPlayVoice = false
self.bChangeTabStop = true
self:RefreshRewardList()
self:RefreshNPC2D()
self:RefreshDetail()
@@ -202,9 +206,7 @@ function LoginSpRewardCtrl_List:OnEnable()
end
function LoginSpRewardCtrl_List:OnDisable()
Actor2DManager.UnsetBoardNPC2D()
BubbleVoiceManager.StopBubbleAnim()
PlayerVoiceData:ClearTimer()
PlayerVoiceData:StopCharVoice()
self:StopVoice()
end
function LoginSpRewardCtrl_List:OnDestroy()
end
@@ -280,9 +282,7 @@ function LoginSpRewardCtrl_List:OnEvent_ActivityListChangeTab(nId)
self.bChangeTabStop = true
elseif nId ~= self.actData:GetActId() and self.bChangeTabStop then
self.bChangeTabStop = false
BubbleVoiceManager.StopBubbleAnim()
PlayerVoiceData:ClearTimer()
PlayerVoiceData:StopCharVoice()
self:StopVoice()
end
end
function LoginSpRewardCtrl_List:OnEvent_ClosePanel(nPanelId)
@@ -127,6 +127,16 @@ function LoginSpRewardCtrl_List_01:RefreshRewardList()
end
end
end
function LoginSpRewardCtrl_List_01:StopVoice()
self.bPlayVoice = false
BubbleVoiceManager.StopBubbleAnim()
PlayerVoiceData:ClearTimer()
PlayerVoiceData:StopCharVoice()
if self.timer then
self.timer:Cancel()
self.timer = nil
end
end
function LoginSpRewardCtrl_List_01:RefreshNPC2D(bSwitch)
local tbRewardList = self.actData:GetActLoginRewardList()
local nNpcId = tbRewardList[self.nSelectIndex].NpcId
@@ -144,14 +154,7 @@ function LoginSpRewardCtrl_List_01:RefreshNPC2D(bSwitch)
self._mapNode.animActorL2D:Play("Actor2D_PNG_right_middle_in", 0, 0)
end
if bSwitch and self.bPlayVoice then
self.bPlayVoice = false
BubbleVoiceManager.StopBubbleAnim()
PlayerVoiceData:ClearTimer()
PlayerVoiceData:StopCharVoice()
if self.timer then
self.timer:Cancel()
self.timer = nil
end
self:StopVoice()
else
self:PlayVoice()
end
@@ -180,6 +183,7 @@ function LoginSpRewardCtrl_List_01:InitActData(actData)
self.actData = actData
self.nNpcId = nil
self.bPlayVoice = false
self.bChangeTabStop = true
self:RefreshRewardList()
self:RefreshNPC2D()
self:RefreshDetail()
@@ -202,9 +206,7 @@ function LoginSpRewardCtrl_List_01:OnEnable()
end
function LoginSpRewardCtrl_List_01:OnDisable()
Actor2DManager.UnsetBoardNPC2D()
BubbleVoiceManager.StopBubbleAnim()
PlayerVoiceData:ClearTimer()
PlayerVoiceData:StopCharVoice()
self:StopVoice()
end
function LoginSpRewardCtrl_List_01:OnDestroy()
end
@@ -280,9 +282,7 @@ function LoginSpRewardCtrl_List_01:OnEvent_ActivityListChangeTab(nId)
self.bChangeTabStop = true
elseif nId ~= self.actData:GetActId() and self.bChangeTabStop then
self.bChangeTabStop = false
BubbleVoiceManager.StopBubbleAnim()
PlayerVoiceData:ClearTimer()
PlayerVoiceData:StopCharVoice()
self:StopVoice()
end
end
function LoginSpRewardCtrl_List_01:OnEvent_ClosePanel(nPanelId)
@@ -153,6 +153,16 @@ function LoginSpRewardCtrl_Lsv:OnGridBtnClick(goGrid, gridIndex)
self.nSelectIndex = nIndex
self:RefreshNPC2D(true)
end
function LoginSpRewardCtrl_Lsv:StopVoice()
self.bPlayVoice = false
BubbleVoiceManager.StopBubbleAnim()
PlayerVoiceData:ClearTimer()
PlayerVoiceData:StopCharVoice()
if self.timer then
self.timer:Cancel()
self.timer = nil
end
end
function LoginSpRewardCtrl_Lsv:RefreshNPC2D(bSwitch)
local tbRewardList = self.actData:GetActLoginRewardList()
local nNpcId = tbRewardList[self.nSelectIndex].NpcId
@@ -170,14 +180,7 @@ function LoginSpRewardCtrl_Lsv:RefreshNPC2D(bSwitch)
self._mapNode.animActorL2D:Play("Actor2D_PNG_right_middle_in", 0, 0)
end
if bSwitch and self.bPlayVoice then
self.bPlayVoice = false
BubbleVoiceManager.StopBubbleAnim()
PlayerVoiceData:ClearTimer()
PlayerVoiceData:StopCharVoice()
if self.timer then
self.timer:Cancel()
self.timer = nil
end
self:StopVoice()
else
self:PlayVoice()
end
@@ -206,6 +209,7 @@ function LoginSpRewardCtrl_Lsv:InitActData(actData)
self.actData = actData
self.nNpcId = nil
self.bPlayVoice = false
self.bChangeTabStop = true
self:RefreshRewardList()
self:RefreshNPC2D()
self:RefreshDetail()
@@ -234,9 +238,7 @@ function LoginSpRewardCtrl_Lsv:OnDisable()
end
self.tbGridCtrl = {}
Actor2DManager.UnsetBoardNPC2D()
BubbleVoiceManager.StopBubbleAnim()
PlayerVoiceData:ClearTimer()
PlayerVoiceData:StopCharVoice()
self:StopVoice()
end
function LoginSpRewardCtrl_Lsv:OnDestroy()
end
@@ -302,9 +304,7 @@ function LoginSpRewardCtrl_Lsv:OnEvent_ActivityListChangeTab(nId)
self.bChangeTabStop = true
elseif nId ~= self.actData:GetActId() and self.bChangeTabStop then
self.bChangeTabStop = false
BubbleVoiceManager.StopBubbleAnim()
PlayerVoiceData:ClearTimer()
PlayerVoiceData:StopCharVoice()
self:StopVoice()
end
end
function LoginSpRewardCtrl_Lsv:OnEvent_ClosePanel(nPanelId)
@@ -0,0 +1,63 @@
local ActMailBindCtrl = class("ActMailBindCtrl", BaseCtrl)
local SDKManager = CS.SDKManager.Instance
ActMailBindCtrl._mapNodeConfig = {
txtDesc = {sComponentName = "TMP_Text"},
btnGo = {
sComponentName = "UIButton",
callback = "OnBtnClick_Go"
},
txtBtnGo = {
sComponentName = "TMP_Text",
sLanguageId = "MailBind_Go"
},
btnGoLock = {},
txtBtnGoLock = {
sComponentName = "TMP_Text",
sLanguageId = "MailBind_GoLock"
}
}
ActMailBindCtrl._mapEventConfig = {
MailBind_RequestUpdate = "OnEvent_RequestUpdate"
}
ActMailBindCtrl._mapRedDotConfig = {}
function ActMailBindCtrl:InitActData(actData)
self.actData = actData
self.nActId = self.actData:GetActId()
local config = ConfigTable.GetData("ActivityMailBindControl", self.nActId)
if config == nil then
return
end
NovaAPI.SetTMPText(self._mapNode.txtDesc, config.Desc)
local itemCfg = ConfigTable.GetData("Item", config.Reward1Tid)
if itemCfg == nil then
return
end
self:SetPngSprite(self._mapNode.imgItem, itemCfg.Icon)
NovaAPI.SetTMPText(self._mapNode.txtCount, config.Reward1Qty)
self:InitRewardStatus()
end
function ActMailBindCtrl:InitRewardStatus()
local bGettedReward = self.actData:GetRewardData()
self._mapNode.btnGo.gameObject:SetActive(not bGettedReward)
self._mapNode.btnGoLock.gameObject:SetActive(bGettedReward)
end
function ActMailBindCtrl:OnBtnClick_Go()
local bRequestState = self.actData:GetRequestState()
if bRequestState then
return
end
local bGettedReward = self.actData:GetRewardData()
if bGettedReward then
self:InitRewardStatus()
return
end
if not SDKManager:IsSDKInit() then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Function_NotAvailable"))
return
end
self.actData:RequestReward()
end
function ActMailBindCtrl:OnEvent_RequestUpdate()
self:InitRewardStatus()
end
return ActMailBindCtrl
@@ -0,0 +1,22 @@
local MathParkourLevelSelectPanel = class("MathParkourLevelSelectPanel", BasePanel)
MathParkourLevelSelectPanel._sUIResRootPath = "UI_Activity/"
MathParkourLevelSelectPanel._tbDefine = {
{
sPrefabPath = "_400018/MathParkourLevelsSelect.prefab",
sCtrlName = "Game.UI.Activity.MathParkour.MathParkourLevelSelectCtrl"
}
}
function MathParkourLevelSelectPanel:Awake()
self.nSelectIndex = 0
end
function MathParkourLevelSelectPanel:OnEnable()
end
function MathParkourLevelSelectPanel:OnAfterEnter()
end
function MathParkourLevelSelectPanel:OnDisable()
end
function MathParkourLevelSelectPanel:OnDestroy()
end
function MathParkourLevelSelectPanel:OnRelease()
end
return MathParkourLevelSelectPanel
@@ -0,0 +1,30 @@
local MathParkourPanel = class("MathParkourPanel", BasePanel)
local GamepadUIManager = require("GameCore.Module.GamepadUIManager")
MathParkourPanel._sUIResRootPath = "UI_Activity/"
MathParkourPanel._tbDefine = {
{
sPrefabPath = "_400018/MathParkourPanel.prefab",
sCtrlName = "Game.UI.Activity.MathParkour.MathParkourCtrl"
},
{
sPrefabPath = "_400018/MathParkourSkillDisplayPanel.prefab",
sCtrlName = "Game.UI.Activity.MathParkour.MathParkourSkillDisplayCtrl"
}
}
function MathParkourPanel:Awake()
GamepadUIManager.EnterAdventure(true)
GamepadUIManager.EnableGamepadUI("MathParkourCtrl", {}, nil, false)
end
function MathParkourPanel:OnEnable()
end
function MathParkourPanel:OnAfterEnter()
end
function MathParkourPanel:OnDisable()
end
function MathParkourPanel:OnDestroy()
GamepadUIManager.DisableGamepadUI("MathParkourCtrl")
GamepadUIManager.QuitAdventure()
end
function MathParkourPanel:OnRelease()
end
return MathParkourPanel
@@ -0,0 +1,23 @@
local MathParkourResultPanel = class("MathParkourResultPanel", BasePanel)
MathParkourResultPanel._nSnapshotPrePanel = 1
MathParkourResultPanel._sUIResRootPath = "UI_Activity/"
MathParkourResultPanel._bIsMainPanel = false
MathParkourResultPanel._tbDefine = {
{
sPrefabPath = "_400018/MathParkourResultPanel.prefab",
sCtrlName = "Game.UI.Activity.MathParkour.MathParkourResultCtrl"
}
}
function MathParkourResultPanel:Awake()
end
function MathParkourResultPanel:OnEnable()
end
function MathParkourResultPanel:OnAfterEnter()
end
function MathParkourResultPanel:OnDisable()
end
function MathParkourResultPanel:OnDestroy()
end
function MathParkourResultPanel:OnRelease()
end
return MathParkourResultPanel
@@ -0,0 +1,21 @@
local MathParkourSkillDisplayPanel = class("MathParkourSkillDisplayPanel", BasePanel)
MathParkourSkillDisplayPanel._bIsMainPanel = false
MathParkourSkillDisplayPanel._tbDefine = {
{
sPrefabPath = "Activity/MathParkour/400018/MathParkourSkillDisplayPanel.prefab",
sCtrlName = "Game.UI.Activity.MathParkour.MathParkourSkillDisplayPanelCtrl"
}
}
function MathParkourSkillDisplayPanel:Awake()
end
function MathParkourSkillDisplayPanel:OnEnable()
end
function MathParkourSkillDisplayPanel:OnAfterEnter()
end
function MathParkourSkillDisplayPanel:OnDisable()
end
function MathParkourSkillDisplayPanel:OnDestroy()
end
function MathParkourSkillDisplayPanel:OnRelease()
end
return MathParkourSkillDisplayPanel
@@ -0,0 +1,90 @@
local MathParkourBuffCtrl = class("MathParkourBuffCtrl", BaseCtrl)
local AssetPath = "UI_Activity/_400018/SpriteAtlas/"
MathParkourBuffCtrl._mapNodeConfig = {
imgIcon = {sComponentName = "Image"},
TMPBuffTime1 = {sComponentName = "TMP_Text"}
}
MathParkourBuffCtrl._mapEventConfig = {}
MathParkourBuffCtrl._mapRedDotConfig = {}
function MathParkourBuffCtrl:Awake()
self.timer = nil
self.boomTimer = nil
self.animator = self.gameObject:GetComponent("Animator")
end
function MathParkourBuffCtrl:OnEnable()
end
function MathParkourBuffCtrl:ShowBuff(nBuffId, bPause)
self.nBuffId = nBuffId
local buffCfg = ConfigTable.GetData("MathParkourBuffItem", nBuffId)
if self.timer ~= nil then
self.timer:Cancel()
self.timer = nil
end
if buffCfg.Icon ~= "" then
self:SetPngSprite(self._mapNode.imgIcon, AssetPath .. buffCfg.Icon)
end
self.nCurTime = buffCfg.Time
self.nBoomTime = buffCfg.Time
self:SetTimeText(self.nCurTime)
self.timer = self:AddTimer(0, 1, function()
self.nCurTime = self.nCurTime - 1
self.nCurTime = math.max(self.nCurTime, 0)
if self.nCurTime <= 0 then
self.timer:Cancel()
self.timer = nil
self:HideBuff()
return
end
self:SetTimeText(self.nCurTime)
end, true, true, true)
self.timer:Pause(bPause)
if buffCfg.ObjType == GameEnum.MathParkourBuffType.Boom then
if self.boomTimer ~= nil then
self.boomTimer:Cancel()
self.boomTimer = nil
end
EventManager.Hit("MathParkour_BoomTime", 1.0)
self.boomTimer = self:AddTimer(0, 0.02, function()
self.nBoomTime = self.nBoomTime - 0.02
if self.nBoomTime <= 0 then
self.boomTimer:Cancel()
self.boomTimer = nil
return
end
EventManager.Hit("MathParkour_BoomTime", self.nBoomTime / buffCfg.Time)
end, true, true, true)
self.boomTimer:Pause(bPause)
end
if self.animator ~= nil then
self.animator:Play("rtBuff_in")
end
end
function MathParkourBuffCtrl:SetTimeText(nTime)
nTime = math.max(nTime, 0)
nTime = math.floor(nTime)
local sTimeText = string.format("%02d:%02d", math.floor(nTime / 60), nTime % 60)
NovaAPI.SetTMPText(self._mapNode.TMPBuffTime1, sTimeText)
end
function MathParkourBuffCtrl:HideBuff()
if self.timer ~= nil then
self.timer:Cancel()
self.timer = nil
end
if self.boomTimer ~= nil then
self.boomTimer:Cancel()
self.boomTimer = nil
end
if self.nBuffId ~= nil and self.nBuffId ~= 0 then
EventManager.Hit("MathParkour_BuffTimeOut", self.nBuffId)
end
self.nBuffId = 0
end
function MathParkourBuffCtrl:Pause(bPause)
if self.timer ~= nil then
self.timer:Pause(bPause)
end
if self.boomTimer ~= nil then
self.boomTimer:Pause(bPause)
end
end
return MathParkourBuffCtrl
@@ -0,0 +1,615 @@
local MathParkourCtrl = class("MathParkourCtrl", BaseCtrl)
local GamepadUIManager = require("GameCore.Module.GamepadUIManager")
local WwiseAudioMgr = CS.WwiseAudioManager.Instance
MathParkourCtrl._mapNodeConfig = {
rtBuff = {
nCount = 5,
sCtrlName = "Game.UI.Activity.MathParkour.MathParkourBuffCtrl"
},
txt_newScore = {
sComponentName = "TMP_Text",
sLanguageId = "MathParkour_Text_NewScore"
},
txt_targetScore = {sComponentName = "TMP_Text"},
imgActProgress = {sComponentName = "Image"},
StarItem = {nCount = 3},
obj_Time = {},
btnPause = {
sComponentName = "NaviButton",
callback = "OnBtnClick_Pause",
sAction = "MathParkour_Pause"
},
goChallenge = {
sCtrlName = "Game.UI.Activity.MathParkour.MathParkourResultSuccessCtrl"
},
goFailure = {
sCtrlName = "Game.UI.Activity.MathParkour.MathParkourResultFailCtrl"
},
goPause = {
sNodeName = "MathParkourPause",
sCtrlName = "Game.UI.Activity.MathParkour.MathParkourPauseCtrl"
},
btn_qte = {
sComponentName = "NaviButton",
callback = "OnBtnClick_QTE",
sAction = "MathParkour_QTE",
sActionIconType = "Dark"
},
goSmash = {},
imgSmasProgress = {sComponentName = "Image"},
txt_SmashScore = {
sComponentName = "TMP_Text",
sLanguageId = "MathParkour_Text_SmashScore"
},
btnClearthescene = {
sComponentName = "NaviButton",
callback = "OnBtnClick_ClearTheScene",
sAction = "MathParkour_Boom"
},
txt_Clearthescene = {
sComponentName = "TMP_Text",
nCount = 2,
sLanguageId = "MathParkour_Clearthescene"
},
imgProgress = {sComponentName = "Image"},
txt_Score1 = {
sComponentName = "TMP_Text",
sLanguageId = "MathParkour_Text_Score1"
},
txt_Score = {sComponentName = "TMP_Text"},
canvasGroup = {
sNodeName = "----SafeAreaRoot---",
sComponentName = "CanvasGroup"
}
}
MathParkourCtrl._mapEventConfig = {
MathParkour_AddScore = "OnEvent_AddScore",
MathParkour_BuffItemCollected = "OnEvent_AddBuff",
MathParkour_UseBuff = "OnEvent_UseBuff",
MathParkour_BuffConsumed = "OnEvent_BuffConsumed",
MathParkour_BoomTime = "OnEvent_BoomTime",
MathParkour_LevelEnd = "OnEvent_LevelEnd",
MathParkour_BossEncountered = "OnEvent_BossEncountered",
MathParkour_Confirm = "OnEvent_Confirm",
MathParkour_Again = "OnEvent_Again",
MathParkour_NextLevel = "OnEvent_GoNextLevel",
MathParkour_BuffTimeOut = "OnEvent_BuffTimeOut",
MathParkour_Exit_OnClick = "OnEvent_Exit",
MathParkour_Restart_OnClick = "OnEvent_Restart",
MathParkour_Continue_OnClick = "OnEvent_Continue",
MathParkour_EnterLevel = "OnEvent_EnterLevel",
MathParkour_BlockInput = "OnEvent_BlockInput",
MathParkour_GMRemoveBuff = "OnEvent_GMRemoveBuff",
MathParkour_GM_ToggleBuffOverlay = "OnEvent_GMToggleBuffOverlay",
MathParkour_GM_Pause = "OnEvent_GMPause"
}
MathParkourCtrl._mapRedDotConfig = {}
function MathParkourCtrl:Awake()
local param = self:GetPanelParam()
if type(param) == "table" then
self.nActId = param[1]
self.nLevelId = param[2]
end
self.tbGamepadUINode = self:GetGamepadUINode()
GamepadUIManager.AddGamepadUINode("MathParkourCtrl", self.tbGamepadUINode)
self:InitData()
self:UpdatePanelData()
NovaAPI.SetCanvasGroupAlpha(self._mapNode.canvasGroup, 0)
end
function MathParkourCtrl:OnDestroy()
self:ClearGMBuffOverlay()
end
function MathParkourCtrl:InitData()
self.bPause = true
self.levelCfg = ConfigTable.GetData("MathParkourLevel", self.nLevelId)
self.cfg = ConfigTable.GetData("MathParkourConfig", self.levelCfg.ConfigId)
self.actData = PlayerData.Activity:GetActivityDataById(self.nActId)
self.CurLevelData = self.actData:GetLevelData(self.nLevelId)
self.nCurScore = 0
self.nStar = 0
self.bInResult = false
self:UpdateScore(0)
self.nAddBuffCount = 0
self.tbUsedBuffItem = {}
self.tbBuffItem = {}
self.bBossEncountered = false
for i = 1, 5 do
self.tbBuffItem[i] = self._mapNode.rtBuff[i]
self.tbBuffItem[i].gameObject:SetActive(false)
end
end
function MathParkourCtrl:UpdatePanelData()
self._mapNode.btnClearthescene.gameObject:SetActive(false)
self._mapNode.goChallenge:HidePanel()
self._mapNode.goFailure:HidePanel()
self._mapNode.obj_Time:SetActive(true)
local timeOutGo = self._mapNode.obj_Time.transform:Find("AnimRoot")
timeOutGo.gameObject:SetActive(false)
self:InitQTE()
self._mapNode.txt_Score1.gameObject:SetActive(self.bBossEncountered)
self._mapNode.txt_Score.gameObject:SetActive(self.bBossEncountered)
end
function MathParkourCtrl:InitQTE()
self._mapNode.goSmash.gameObject:SetActive(false)
self._mapNode.btn_qte.gameObject:SetActive(false)
if self.qteTimer ~= nil then
self.qteTimer:Cancel()
self.qteTimer = nil
end
self.nQte = 0
end
function MathParkourCtrl:StartGame()
local bNewLevel = self.actData:GetLevelIsNew(self.nLevelId)
if bNewLevel and self.levelCfg.DicId ~= 0 then
self.actData:EnterLevel(self.nLevelId)
EventManager.Hit(EventId.OpenPanel, PanelId.DictionaryEntry, self.levelCfg.DicId, true, function()
WwiseAudioMgr:PostEvent("Mode_400018_start")
self:AddTimer(1, 0.5, function()
local timeOutGo = self._mapNode.obj_Time.transform:Find("AnimRoot")
timeOutGo.gameObject:SetActive(true)
NovaAPI.DispatchEventWithData("MATHPARKOUR_STARTLEVEL", nil, nil)
EventManager.Hit(EventId.BlockInput, true)
self:AddTimer(1, 3.5, function()
self._mapNode.obj_Time:SetActive(false)
self.bPause = false
EventManager.Hit(EventId.BlockInput, false)
NovaAPI.DispatchEventWithData("MATHPARKOUR_START", nil, nil)
end, true, true, true)
end, true, true, true)
end)
else
EventManager.Hit(EventId.BlockInput, true)
WwiseAudioMgr:PostEvent("Mode_400018_start")
self:AddTimer(1, 0.5, function()
local timeOutGo = self._mapNode.obj_Time.transform:Find("AnimRoot")
timeOutGo.gameObject:SetActive(true)
NovaAPI.DispatchEventWithData("MATHPARKOUR_STARTLEVEL", nil, nil)
self:AddTimer(1, 3.5, function()
self._mapNode.obj_Time:SetActive(false)
self.bPause = false
EventManager.Hit(EventId.BlockInput, false)
NovaAPI.DispatchEventWithData("MATHPARKOUR_START", nil, nil)
end, true, true, true)
end, true, true, true)
self.actData:EnterLevel(self.nLevelId)
end
end
function MathParkourCtrl:ShowQTE()
NovaAPI.SetImageFillAmount(self._mapNode.imgSmasProgress, 0)
self._mapNode.goSmash.gameObject:SetActive(true)
self._mapNode.btn_qte.gameObject:SetActive(true)
self.qteTimer = self:AddTimer(0, 1, function()
self.nQte = self.nQte - self.cfg.QteProgressDeduction
self.nQte = math.max(self.nQte, 0)
NovaAPI.SetImageFillAmount(self._mapNode.imgSmasProgress, self.nQte / self.cfg.QteProgressLimit)
NovaAPI.DispatchEventWithData("MathParkour_SetQteSpeed", nil, {
self.nQte * self.cfg.QteSpeedFactor
})
end, true, true, true)
end
function MathParkourCtrl:RemoveBuff(nBuffId)
if self.tbUsedBuffItem[nBuffId] ~= nil then
local buffItem = self.tbUsedBuffItem[nBuffId]
table.insert(self.tbBuffItem, buffItem)
buffItem.gameObject:SetActive(false)
local buffCfg = ConfigTable.GetData("MathParkourBuffItem", nBuffId)
if buffCfg.ObjType == GameEnum.MathParkourBuffType.Boom then
self._mapNode.btnClearthescene.gameObject:SetActive(false)
end
self.tbUsedBuffItem[nBuffId] = nil
NovaAPI.DispatchEventWithData("MathParkour_BuffRemoved", nil, {nBuffId})
end
end
function MathParkourCtrl:Remap(nValue, nInMin, nInMax, nOutMin, nOutMax)
if nInMax == nInMin then
return nOutMin
end
return nOutMin + (nValue - nInMin) / (nInMax - nInMin) * (nOutMax - nOutMin)
end
function MathParkourCtrl:UpdateScore(nAddScore)
self.nCurScore = math.max(self.nCurScore + nAddScore, 0)
NovaAPI.SetTMPText(self._mapNode.txt_targetScore, self.nCurScore)
self._mapNode.txt_newScore.gameObject:SetActive(self.nCurScore > self.CurLevelData.nScore)
local nStar = 0
if self.nCurScore >= self.levelCfg.Reward3Condition then
NovaAPI.SetImageFillAmount(self._mapNode.imgActProgress, 1)
nStar = 3
elseif self.nCurScore >= self.levelCfg.Reward2Condition then
local nTempScore = self.nCurScore - self.levelCfg.Reward2Condition
local amount = self:Remap(nTempScore / (self.levelCfg.Reward3Condition - self.levelCfg.Reward2Condition), 0, 1, 0, 0.33) + 0.66
NovaAPI.SetImageFillAmount(self._mapNode.imgActProgress, amount)
nStar = 2
elseif self.nCurScore >= self.levelCfg.Reward1Condition then
local nTempScore = self.nCurScore - self.levelCfg.Reward1Condition
local amount = self:Remap(nTempScore / (self.levelCfg.Reward2Condition - self.levelCfg.Reward1Condition), 0, 1, 0, 0.33) + 0.33
NovaAPI.SetImageFillAmount(self._mapNode.imgActProgress, amount)
nStar = 1
else
local amount = self:Remap(self.nCurScore / self.levelCfg.Reward1Condition, 0, 1, 0, 0.33)
NovaAPI.SetImageFillAmount(self._mapNode.imgActProgress, amount)
nStar = 0
end
for i = 1, 3 do
local star = self._mapNode.StarItem[i].transform:Find("ImgStarGray")
star.gameObject:SetActive(i > nStar)
end
self.nStar = nStar
end
function MathParkourCtrl:ApplyLogicPause(bPause)
if bPause then
NovaAPI.DispatchEventWithData("MATHPARKOUR_PAUSE_STATE_CHANGED", nil, {1})
EventManager.Hit("MathParkour_CastAssistSkillPause", true)
if self.tbUsedBuffItem ~= nil then
for _, v in pairs(self.tbUsedBuffItem) do
v:Pause(true)
end
end
WwiseAudioMgr:PostEvent("Mode_400018_all_pasue")
else
NovaAPI.DispatchEventWithData("MATHPARKOUR_PAUSE_STATE_CHANGED", nil, {0})
EventManager.Hit("MathParkour_CastAssistSkillPause", false)
if self.tbUsedBuffItem ~= nil then
for _, v in pairs(self.tbUsedBuffItem) do
v:Pause(false)
end
end
WwiseAudioMgr:PostEvent("Mode_400018_all_resume")
end
end
function MathParkourCtrl:IsLogicPaused()
return self.bPause == true or self.bGMPaused == true
end
function MathParkourCtrl:OnEvent_GMPause(bPause)
if bPause then
if self:IsLogicPaused() then
return
end
self.bGMPaused = true
self:ApplyLogicPause(true)
return
end
if not self.bGMPaused then
return
end
self.bGMPaused = false
if self:IsLogicPaused() then
return
end
self:ApplyLogicPause(false)
end
function MathParkourCtrl:OnBtnClick_Pause()
if self.bInResult then
return
end
self.bPause = true
self:ApplyLogicPause(true)
self._mapNode.goPause:Open(self.levelCfg.DicId)
end
function MathParkourCtrl:OnBtnClick_Start()
end
function MathParkourCtrl:OnBtnClick_ClearTheScene()
if self.tempClearSceneBuffId ~= nil and self.tbUsedBuffItem[self.tempClearSceneBuffId] ~= nil then
NovaAPI.DispatchEventWithData("MATHPARKOUR_CLEAR_THE_SCENE", nil, {
self.tempClearSceneBuffId
})
end
if self.tbUsedBuffItem[self.tempClearSceneBuffId] ~= nil then
local buffItem = self.tbUsedBuffItem[self.tempClearSceneBuffId]
table.insert(self.tbBuffItem, buffItem)
buffItem.gameObject:SetActive(false)
local buffCfg = ConfigTable.GetData("MathParkourBuffItem", self.tempClearSceneBuffId)
if buffCfg.ObjType == GameEnum.MathParkourBuffType.Boom then
self._mapNode.btnClearthescene.gameObject:SetActive(false)
end
self.tbUsedBuffItem[self.tempClearSceneBuffId] = nil
end
end
function MathParkourCtrl:OnBtnClick_QTE()
self.nQte = self.nQte + self.cfg.QteProgressPerClick
self.nQte = math.min(self.nQte, self.cfg.QteProgressLimit)
NovaAPI.SetImageFillAmount(self._mapNode.imgSmasProgress, self.nQte / self.cfg.QteProgressLimit)
NovaAPI.DispatchEventWithData("MathParkour_SetQteSpeed", nil, {
self.nQte * self.cfg.QteSpeedFactor
})
end
function MathParkourCtrl:OnEvent_AddScore(nAddScore)
self:UpdateScore(nAddScore)
if self.bBossEncountered then
self.nBossScore = self.nBossScore + nAddScore
NovaAPI.SetTMPText(self._mapNode.txt_Score, "+" .. tostring(self.nBossScore))
end
end
function MathParkourCtrl:OnEvent_AddBuff(nBuffId)
self.nAddBuffCount = self.nAddBuffCount + 1
local buffCfg = ConfigTable.GetData("MathParkourBuffItem", nBuffId)
if NovaAPI.IsEditorPlatform() then
print("MathParkourCtrl:OnEvent_AddBuff nBuffId=" .. tostring(nBuffId) .. "=====" .. buffCfg.Name)
end
if buffCfg.ObjType == GameEnum.MathParkourBuffType.Rocket then
NovaAPI.DispatchEventWithData("MathParkour_BuffAdded", nil, {nBuffId})
NovaAPI.DispatchEventWithData("MathParkour_BuffRemoved", nil, {nBuffId})
return
end
if self.tbUsedBuffItem[nBuffId] == nil then
local buffItem = self.tbBuffItem[1]
buffItem.gameObject:SetActive(true)
buffItem:ShowBuff(nBuffId, self:IsLogicPaused())
self.tbUsedBuffItem[nBuffId] = buffItem
if buffCfg.ObjType == GameEnum.MathParkourBuffType.Boom then
self._mapNode.btnClearthescene.gameObject:SetActive(true)
self.tempClearSceneBuffId = nBuffId
end
table.remove(self.tbBuffItem, 1)
NovaAPI.DispatchEventWithData("MathParkour_BuffAdded", nil, {nBuffId})
else
self.tbUsedBuffItem[nBuffId]:ShowBuff(nBuffId, self:IsLogicPaused())
end
end
function MathParkourCtrl:OnEvent_BuffTimeOut(nBuffId)
local cfg = ConfigTable.GetData("MathParkourBuffItem", nBuffId)
if cfg.ObjType == GameEnum.MathParkourBuffType.Boom then
self:OnBtnClick_ClearTheScene()
end
self:RemoveBuff(nBuffId)
end
function MathParkourCtrl:OnEvent_UseBuff(nBuffId)
self:RemoveBuff(nBuffId)
end
function MathParkourCtrl:OnEvent_BuffConsumed(nBuffId)
self:RemoveBuff(nBuffId)
end
function MathParkourCtrl:OnEvent_BoomTime(fTime)
NovaAPI.SetImageFillAmount(self._mapNode.imgProgress, fTime)
end
function MathParkourCtrl:OnEvent_LevelEnd(bResult)
self:ClearGMBuffOverlay()
self.bInResult = true
if bResult then
local nNextLevelId = self.actData:GetNextLevelId(self.nLevelId)
self._mapNode.goChallenge:ShowPanel(self.nCurScore, self.nCurScore > self.CurLevelData.nScore, self.nStar, nNextLevelId ~= nil, self.nActId)
else
self._mapNode.goFailure:ShowPanel(self.nCurScore)
end
self.actData:DoResult(self.nLevelId, bResult, self.nCurScore, self.nStar, self.nAddBuffCount)
end
function MathParkourCtrl:OnEvent_BossEncountered()
EventManager.Hit(EventId.TemporaryBlockInput, 1.6)
EventManager.Hit("MathParkour_CastAssistSkill", 140, 14001)
self:AddTimer(1, 1.66, function()
self.bBossEncountered = true
self:ShowQTE()
self._mapNode.txt_Score1.gameObject:SetActive(self.bBossEncountered)
self._mapNode.txt_Score.gameObject:SetActive(self.bBossEncountered)
self.nBossScore = 0
NovaAPI.SetTMPText(self._mapNode.txt_Score, "+" .. tostring(self.nBossScore))
end, true, true, true)
end
function MathParkourCtrl:OnEvent_Confirm()
if NovaAPI.GetCurrentModuleName() == "MainMenuModuleScene" then
CS.AdventureModuleHelper.LevelStateChanged(true, 0, false)
EventManager.Hit(EventId.CloesCurPanel)
PlayerData.Base:OnBackToMainMenuModule()
else
NovaAPI.EnterModule("MainMenuModuleScene", true)
end
end
function MathParkourCtrl:OnEvent_Again()
NovaAPI.DispatchEventWithData("MathParkour_Restart", nil, nil)
self:InitData()
self:UpdatePanelData()
NovaAPI.SetCanvasGroupAlpha(self._mapNode.canvasGroup, 0)
end
function MathParkourCtrl:OnEvent_GoNextLevel()
local nNextLevelId = self.actData:GetNextLevelId(self.nLevelId)
if nNextLevelId == nil then
return
end
WwiseAudioMgr:PostEvent("Mode_400018_all_stop")
self.nLevelId = nNextLevelId
self:AddTimer(1, 0.1, function()
NovaAPI.SetCanvasGroupAlpha(self._mapNode.canvasGroup, 0)
end, true, true, true)
self:InitData()
self:UpdatePanelData()
local param = {}
table.insert(param, tostring(self.nActId))
table.insert(param, tostring(self.CurLevelData.nId))
table.insert(param, tostring(0))
CS.MiniGameHelper.SetMiniGameData(param)
NovaAPI.DispatchEventWithData("MathParkour_NextLevel", nil, nil)
end
function MathParkourCtrl:OnEvent_Exit()
WwiseAudioMgr:PostEvent("Mode_400018_all_stop")
if NovaAPI.GetCurrentModuleName() == "MainMenuModuleScene" then
CS.AdventureModuleHelper.LevelStateChanged(true, 0, false)
EventManager.Hit(EventId.CloesCurPanel)
PlayerData.Base:OnBackToMainMenuModule()
else
NovaAPI.EnterModule("MainMenuModuleScene", true)
end
end
function MathParkourCtrl:OnEvent_Restart()
WwiseAudioMgr:PostEvent("Mode_400018_all_stop")
self._mapNode.goPause:Close()
NovaAPI.DispatchEventWithData("MathParkour_Restart", nil, nil)
self:AddTimer(1, 0.1, function()
NovaAPI.SetCanvasGroupAlpha(self._mapNode.canvasGroup, 0)
end, true, true, true)
self:InitData()
self:UpdatePanelData()
end
function MathParkourCtrl:OnEvent_Continue()
self._mapNode.goPause:Close()
self.bPause = false
if self:IsLogicPaused() then
return
end
self:ApplyLogicPause(false)
end
function MathParkourCtrl:OnEvent_EnterLevel()
local animator = self.gameObject:GetComponent("Animator")
if animator ~= nil then
animator:Play("MathParkourPanel_in")
end
NovaAPI.SetCanvasGroupAlpha(self._mapNode.canvasGroup, 1)
self:StartGame()
end
function MathParkourCtrl:OnEvent_BlockInput(bBlock)
EventManager.Hit(EventId.BlockInput, bBlock)
end
function MathParkourCtrl:OnEvent_GMRemoveBuff(nBuffId)
self:RemoveBuff(nBuffId)
end
function MathParkourCtrl:OnEvent_GMToggleBuffOverlay()
self.bGMBuffOverlay = not self.bGMBuffOverlay
if self.bGMBuffOverlay then
self:EnsureGMBuffOverlay()
self:RefreshGMBuffOverlay()
if self.gmOverlayTimer == nil then
self.gmOverlayTimer = self:AddTimer(0, 0.5, function()
if self.bGMBuffOverlay then
self:RefreshGMBuffOverlay()
end
end, true, true, true)
else
self.gmOverlayTimer:Pause(false)
end
else
if self.goGMBuffOverlay ~= nil and not self.goGMBuffOverlay:IsNull() then
self.goGMBuffOverlay:SetActive(false)
end
if self.gmOverlayTimer ~= nil then
self.gmOverlayTimer:Pause(true)
end
end
end
local GM_OVERLAY_COL_MAX = 4
local GetGMOverlayFont = function(trParent)
local srcTxt = trParent:GetComponentInChildren(typeof(CS.UnityEngine.UI.Text))
if srcTxt ~= nil and srcTxt.font ~= nil then
return srcTxt.font
end
local ok, builtinFont = pcall(function()
return CS.UnityEngine.Resources.GetBuiltinResource(typeof(CS.UnityEngine.Font), "LegacyRuntime.ttf")
end)
if ok then
return builtinFont
end
return nil
end
local CreateGMOverlayText = function(goParent, sName, font)
local go = CS.UnityEngine.GameObject(sName, typeof(CS.UnityEngine.RectTransform))
go.layer = goParent.layer
go.transform:SetParent(goParent.transform, false)
local txt = go:AddComponent(typeof(CS.UnityEngine.UI.Text))
txt.fontSize = 22
txt.color = CS.UnityEngine.Color.black
txt.alignment = CS.UnityEngine.TextAnchor.UpperLeft
txt.horizontalOverflow = CS.UnityEngine.HorizontalWrapMode.Overflow
txt.verticalOverflow = CS.UnityEngine.VerticalWrapMode.Overflow
txt.raycastTarget = false
if font ~= nil then
txt.font = font
end
return txt
end
local StretchGMOverlayText = function(txt, nAnchorMinX, nAnchorMaxX)
local rt = txt:GetComponent("RectTransform")
rt.anchorMin = Vector2(nAnchorMinX, 0)
rt.anchorMax = Vector2(nAnchorMaxX, 1)
rt.pivot = Vector2(0.5, 1)
rt.offsetMin = Vector2(8, 0)
rt.offsetMax = Vector2(-8, 0)
end
function MathParkourCtrl:EnsureGMBuffOverlay()
if self.goGMBuffOverlay ~= nil and not self.goGMBuffOverlay:IsNull() and self.txtGMBuffOverlayRight ~= nil then
self.goGMBuffOverlay:SetActive(true)
return
end
if self.goGMBuffOverlay ~= nil and not self.goGMBuffOverlay:IsNull() then
destroy(self.goGMBuffOverlay)
end
local parent = self._mapNode.canvasGroup.transform
local go = CS.UnityEngine.GameObject("GMBuffOverlay", typeof(CS.UnityEngine.RectTransform))
go.layer = parent.gameObject.layer
go.transform:SetParent(parent, false)
local rt = go:GetComponent("RectTransform")
rt.anchorMin = Vector2(0.5, 0.5)
rt.anchorMax = Vector2(0.5, 0.5)
rt.pivot = Vector2(0.5, 1)
rt.anchoredPosition = Vector2(0, -90)
rt.sizeDelta = Vector2(560, 180)
local font = GetGMOverlayFont(parent)
local txtLeft = CreateGMOverlayText(go, "txtLeft", font)
local txtRight = CreateGMOverlayText(go, "txtRight", font)
StretchGMOverlayText(txtLeft, 0, 1)
StretchGMOverlayText(txtRight, 0.5, 1)
txtRight.gameObject:SetActive(false)
self.goGMBuffOverlay = go
self.txtGMBuffOverlay = txtLeft
self.txtGMBuffOverlayRight = txtRight
end
function MathParkourCtrl:RefreshGMBuffOverlay()
if self.txtGMBuffOverlay == nil then
return
end
local tbLines = {}
for nBuffId, buffCtrl in pairs(self.tbUsedBuffItem) do
local buffCfg = ConfigTable.GetData("MathParkourBuffItem", nBuffId)
local sName = buffCfg ~= nil and buffCfg.Name or tostring(nBuffId)
local nTime = buffCtrl.nCurTime or 0
table.insert(tbLines, {
nId = nBuffId,
sText = string.format("%s %02d:%02d", sName, math.floor(nTime / 60), nTime % 60)
})
end
table.sort(tbLines, function(a, b)
return a.nId < b.nId
end)
local JoinLines = function(nFrom, nTo)
local s = "当前效果:\n"
if nTo < nFrom then
return s .. "(无)"
end
for i = nFrom, nTo do
s = s .. tbLines[i].sText .. "\n"
end
return s
end
local nCount = #tbLines
local bTwoCol = nCount > GM_OVERLAY_COL_MAX
if not bTwoCol then
StretchGMOverlayText(self.txtGMBuffOverlay, 0, 1)
self.txtGMBuffOverlay.alignment = CS.UnityEngine.TextAnchor.UpperCenter
NovaAPI.SetText(self.txtGMBuffOverlay, JoinLines(1, nCount))
if self.txtGMBuffOverlayRight ~= nil then
self.txtGMBuffOverlayRight.gameObject:SetActive(false)
end
return
end
local nLeft = math.ceil(nCount / 2)
StretchGMOverlayText(self.txtGMBuffOverlay, 0, 0.5)
self.txtGMBuffOverlay.alignment = CS.UnityEngine.TextAnchor.UpperLeft
NovaAPI.SetText(self.txtGMBuffOverlay, JoinLines(1, nLeft))
self.txtGMBuffOverlayRight.gameObject:SetActive(true)
self.txtGMBuffOverlayRight.alignment = CS.UnityEngine.TextAnchor.UpperLeft
local sRight = ""
for i = nLeft + 1, nCount do
sRight = sRight .. tbLines[i].sText .. "\n"
end
NovaAPI.SetText(self.txtGMBuffOverlayRight, "\n" .. sRight)
end
function MathParkourCtrl:ClearGMBuffOverlay()
self.bGMBuffOverlay = false
if self.gmOverlayTimer ~= nil then
self.gmOverlayTimer:Cancel()
self.gmOverlayTimer = nil
end
if self.goGMBuffOverlay ~= nil and not self.goGMBuffOverlay:IsNull() then
destroy(self.goGMBuffOverlay)
end
self.goGMBuffOverlay = nil
self.txtGMBuffOverlay = nil
self.txtGMBuffOverlayRight = nil
end
return MathParkourCtrl
@@ -0,0 +1,162 @@
local MathParkourLevelDetailCtrl = class("MathParkourLevelDetailCtrl", BaseCtrl)
local AssetPath = "UI_Activity/_400018/SpriteAtlas/"
MathParkourLevelDetailCtrl._mapNodeConfig = {
txt_LevelName = {sComponentName = "TMP_Text"},
txt_detailDesc = {sComponentName = "TMP_Text"},
txt_ScoreTitle = {
sComponentName = "TMP_Text",
sLanguageId = "MathParkour_ScoreTitle"
},
txt_MaxScore = {sComponentName = "TMP_Text"},
txt_Title1 = {
sComponentName = "TMP_Text",
sLanguageId = "MathParkour_Title1"
},
txt_Title2 = {
sComponentName = "TMP_Text",
sLanguageId = "MathParkour_Title2"
},
listReward = {
sComponentName = "LoopScrollView"
},
rtReward1 = {},
btn_item = {nCount = 4},
btn_firstPassItem = {sComponentName = "UIButton"},
firstPassItem = {
sCtrlName = "Game.UI.TemplateEx.TemplateItemCtrl"
},
btn_threePassItem = {sComponentName = "UIButton"},
threePassItem = {
sCtrlName = "Game.UI.TemplateEx.TemplateItemCtrl"
},
btn_Go = {
sComponentName = "UIButton",
callback = "OnBtnClick_Go"
},
txtBtnGo = {
sComponentName = "TMP_Text",
sLanguageId = "MathParkour_Go"
}
}
MathParkourLevelDetailCtrl._mapEventConfig = {}
MathParkourLevelDetailCtrl._mapRedDotConfig = {}
function MathParkourLevelDetailCtrl:Awake()
self.animator = self.gameObject:GetComponent("Animator")
end
function MathParkourLevelDetailCtrl:OnEnable()
end
function MathParkourLevelDetailCtrl:OnDisable()
end
function MathParkourLevelDetailCtrl:OnDestroy()
self:Clear()
end
function MathParkourLevelDetailCtrl:Clear()
if self.tbItemCtrl ~= nil then
for _, ctrl in pairs(self.tbItemCtrl) do
self:UnbindCtrlByNode(ctrl)
end
end
self.tbItemCtrl = {}
end
function MathParkourLevelDetailCtrl:ShowPanel(nActId, levelData)
self.nActId = nActId
self.levelData = levelData
local config = ConfigTable.GetData("MathParkourLevel", levelData.nId)
if config == nil then
return
end
NovaAPI.SetTMPText(self._mapNode.txt_LevelName, config.Title)
NovaAPI.SetTMPText(self._mapNode.txt_detailDesc, config.Desc)
NovaAPI.SetTMPText(self._mapNode.txt_MaxScore, levelData.nScore)
local buffItem = config.DropItemList
self._mapNode.listReward.gameObject:SetActive(4 < #buffItem)
self._mapNode.rtReward1.gameObject:SetActive(#buffItem <= 4)
if 4 < #buffItem then
self._mapNode.listReward:Init(#buffItem, self, self.OnGridRefresh, self.OnGridBtnClick, false)
else
for i = 1, 4 do
if i <= #buffItem then
local btn_item = self._mapNode.btn_item[i]
btn_item.gameObject:SetActive(true)
local itemId = buffItem[i]
local buffCfg = ConfigTable.GetData("MathParkourBuffItem", itemId)
if buffCfg ~= nil then
local imgIcon = btn_item.transform:Find("AnimRoot/item/AnimRoot/imgIcon"):GetComponent("Image")
if buffCfg.Icon ~= "" then
self:SetPngSprite(imgIcon, AssetPath .. buffCfg.Icon)
end
local btn = btn_item.gameObject:GetComponent("UIButton")
btn.onClick:RemoveAllListeners()
btn.onClick:AddListener(function()
local msgData = {
Title = buffCfg.Name,
Desc = {
buffCfg.Desc or ""
}
}
EventManager.Hit(EventId.OpenPanel, PanelId.DescTips, btn.transform, msgData)
end)
end
else
self._mapNode.btn_item[i].gameObject:SetActive(false)
end
end
end
self._mapNode.btn_firstPassItem.gameObject:SetActive(config.Reward1Id)
if config.Reward1Id > 0 then
self._mapNode.firstPassItem:SetItem(config.Reward1Id, nil, config.Reward1Count, false, 0 < levelData.nStar, true)
self._mapNode.btn_firstPassItem.onClick:RemoveAllListeners()
self._mapNode.btn_firstPassItem.onClick:AddListener(function()
UTILS.ClickItemGridWithTips(config.Reward1Id, self._mapNode.btn_firstPassItem.transform, true, true, false)
end)
end
self._mapNode.btn_threePassItem.gameObject:SetActive(config.Reward3Id)
if 0 < config.Reward3Id then
self._mapNode.threePassItem:SetItem(config.Reward3Id, nil, config.Reward3Count, false, levelData.nStar >= 3, false, true)
self._mapNode.btn_threePassItem.onClick:RemoveAllListeners()
self._mapNode.btn_threePassItem.onClick:AddListener(function()
UTILS.ClickItemGridWithTips(config.Reward3Id, self._mapNode.btn_threePassItem.transform, true, true, false)
end)
end
self.gameObject:SetActive(true)
if self.animator ~= nil then
self.animator:Play("LevelDetailsPanel_in")
end
end
function MathParkourLevelDetailCtrl:ClosePanel()
self.gameObject:SetActive(false)
self:Clear()
end
function MathParkourLevelDetailCtrl:OnGridRefresh(goGrid, gridIndex)
local nIndex = gridIndex + 1
local nInstanceId = goGrid:GetInstanceID()
local item = goGrid.transform:Find("btn_itemTemp/AnimRoot/item")
if not self.tbItemCtrl[nInstanceId] then
self.tbItemCtrl[nInstanceId] = self:BindCtrlByNode(item, "Game.UI.TemplateEx.TemplateItemCtrl")
end
local config = ConfigTable.GetData("MathParkourLevel", self.levelData.nId)
if config == nil then
return
end
local itemId = config.DropItemList[nIndex]
self.tbItemCtrl[nInstanceId]:SetItem(itemId)
end
function MathParkourLevelDetailCtrl:OnGridBtnClick(go, nIndex)
local nIndex = nIndex + 1
local config = ConfigTable.GetData("MathParkourLevel", self.levelData.nId)
if config == nil then
return
end
local itemId = config.DropItemList[nIndex]
UTILS.ClickItemGridWithTips(itemId, go.transform, true, true, false)
end
function MathParkourLevelDetailCtrl:OnBtnClick_Go()
local param = {}
table.insert(param, tostring(self.nActId))
table.insert(param, tostring(self.levelData.nId))
table.insert(param, tostring(0))
CS.MiniGameHelper.SetMiniGameData(param)
NovaAPI.EnterModule("MathParkourModuleScene", true, 56)
EventManager.Hit(EventId.OpenPanel, PanelId.MathParkourPanel, self.nActId, self.levelData.nId)
end
return MathParkourLevelDetailCtrl
@@ -0,0 +1,268 @@
local MathParkourLevelSelectCtrl = class("MathParkourLevelSelectCtrl", BaseCtrl)
local SpineManager = require("Game.Spine.SpineManager")
local layoutRight = 915
local layoutRightDefault = 322
local layoutMax = -427
MathParkourLevelSelectCtrl._mapNodeConfig = {
TopBar = {
sNodeName = "TopBarPanel",
sCtrlName = "Game.UI.TopBarEx.TopBarCtrl"
},
btnCloseBg = {
sComponentName = "UIButton",
callback = "OnBtnClick_CloseBg"
},
togRoot = {nCount = 7},
btnTask = {
sComponentName = "UIButton",
callback = "OnBtnClick_Task"
},
txtTask = {
sComponentName = "TMP_Text",
sLanguageId = "MathParkour_QuestTitle"
},
Sp_BookScene = {
sComponentName = "RectTransform"
},
Sp_BookSceneFront = {
sComponentName = "RectTransform"
},
rt_Toggle = {},
srToggle = {
sComponentName = "UIScrollRect"
},
rt_ToggleTrans = {
sNodeName = "rt_Toggle",
sComponentName = "RectTransform"
},
levelDetail = {
sNodeName = "LevelDetailsPanel",
sCtrlName = "Game.UI.Activity.MathParkour.MathParkourLevelDetailCtrl"
},
charSpine = {sNodeName = "Sp_char"},
reward_reddot = {}
}
MathParkourLevelSelectCtrl._mapEventConfig = {
MathParkourLevelUpdate = "OnEvent_LevelUpdate"
}
MathParkourLevelSelectCtrl._mapRedDotConfig = {}
function MathParkourLevelSelectCtrl:Awake()
local param = self:GetPanelParam()
if type(param) == "table" then
self.nActId = param[1]
end
end
function MathParkourLevelSelectCtrl:OnEnable()
self._mapNode.rt_Toggle.gameObject:SetActive(false)
local aniamtor = self.gameObject:GetComponent("Animator")
if aniamtor ~= nil then
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
aniamtor:Play("MathParkourLevelsSelect_in")
self._mapNode.rt_Toggle.gameObject:SetActive(true)
end
cs_coroutine.start(wait)
end
self._mapNode.Sp_BookSceneFront.gameObject:SetActive(true)
local bInActGroup, nActGroupId = PlayerData.Activity:IsActivityInActivityGroup(self.nActId)
if bInActGroup then
local mapActivityData = ConfigTable.GetData("Activity", self.nActId)
local actGroupId = mapActivityData.MidGroupId
local actGroupData = PlayerData.Activity:GetActivityGroupDataById(actGroupId)
local taskActId = actGroupData:GetActivityDataByIndex(AllEnum.ActivityThemeFuncIndex.Task).ActivityId
local taskActData = PlayerData.Activity:GetActivityDataById(taskActId)
if taskActData ~= nil and taskActData:CheckActivityOpen() then
RedDotManager.RegisterNode(RedDotDefine.Activity_Group_Task_Group, {
nActGroupId,
taskActId,
mapActivityData.MiniGameRedDot
}, self._mapNode.reward_reddot)
end
end
self:RefreshLevelList()
self._mapNode.levelDetail:ClosePanel()
NovaAPI.SetLayoutGroupPadding(self._mapNode.rt_Toggle, 194, layoutRightDefault, -32, 0)
self._mapNode.Sp_BookScene.localPosition = Vector3(0, self._mapNode.Sp_BookScene.localPosition.y, 0)
self._mapNode.rt_ToggleTrans.localPosition = Vector3(0, self._mapNode.rt_ToggleTrans.localPosition.y, 0)
if 0 < self._panel.nSelectIndex then
local cacheLevelId = self.actData:GetCacheLevelId()
if cacheLevelId ~= nil then
for i, v in ipairs(self.tbLevelData) do
if v.nId == cacheLevelId then
self._panel.nSelectIndex = i
self.actData:ClearCacheLevelId()
break
end
end
end
self:AddTimer(1, 1.5, function()
self:ShowDetail(self.tbLevelData[self._panel.nSelectIndex], self._panel.nSelectIndex, false)
local imgSelect = self._mapNode.togRoot[self._panel.nSelectIndex].transform:Find("tog/AnimRoot/AnimSwitch/imgSelect")
imgSelect.gameObject:SetActive(true)
if self._panel.nSelectIndex > 4 then
NovaAPI.SetLayoutGroupPadding(self._mapNode.rt_Toggle, 194, layoutRight, -32, 0)
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
local moveTime = 0.2
local moveX = -325 - 340 * (self._panel.nSelectIndex - 5)
self._mapNode.rt_ToggleTrans:DOLocalMoveX(moveX, moveTime)
self._mapNode.Sp_BookScene:DOLocalMoveX(moveX, moveTime)
end
cs_coroutine.start(wait)
end
end, true, true, true)
EventManager.Hit(EventId.TemporaryBlockInput, 1.5)
else
EventManager.Hit(EventId.TemporaryBlockInput, 1)
end
SpineManager.PlayAnim(self._mapNode.Sp_BookScene.gameObject, "in", false)
SpineManager.PlayAnim(self._mapNode.Sp_BookSceneFront, "in_Front", false)
self:AddTimer(1, 1, function()
SpineManager.PlayAnim(self._mapNode.Sp_BookScene.gameObject, "idle", true)
self._mapNode.Sp_BookSceneFront.gameObject:SetActive(false)
end, true, true, true)
function self.onScrollValueChanged(value)
self._mapNode.Sp_BookScene.localPosition = Vector3(self._mapNode.rt_ToggleTrans.localPosition.x, self._mapNode.Sp_BookScene.localPosition.y, 0)
end
self._mapNode.srToggle.onValueChanged:AddListener(self.onScrollValueChanged)
SpineManager.PlayAnim(self._mapNode.charSpine, "in", false)
self:AddTimer(1, 0.9, function()
SpineManager.PlayAnim(self._mapNode.charSpine, "idle", true)
end, true, true, true)
end
function MathParkourLevelSelectCtrl:OnDisable()
if self.onScrollValueChanged ~= nil then
self._mapNode.srToggle.onValueChanged:RemoveListener(self.onScrollValueChanged)
self.onScrollValueChanged = nil
end
end
function MathParkourLevelSelectCtrl:RefreshLevelList()
self.actData = PlayerData.Activity:GetActivityDataById(self.nActId)
if self.actData == nil then
return
end
self.tbLevelData = self.actData:GetAllLevelData()
for i = 1, 7 do
local levelData = self.tbLevelData[i]
if levelData ~= nil then
self:SetLevelToggle(levelData, self._mapNode.togRoot[i], i)
self._mapNode.togRoot[i]:SetActive(true)
else
self._mapNode.togRoot[i]:SetActive(false)
end
end
end
function MathParkourLevelSelectCtrl:OnEvent_LevelUpdate()
self:RefreshLevelList()
end
function MathParkourLevelSelectCtrl:OnDestroy()
if PlayerData.Activity:IsActivityInActivityGroup(self.nActId) then
local mapActivityData = ConfigTable.GetData("Activity", self.nActId)
local actGroupId = mapActivityData.MidGroupId
local actGroupData = PlayerData.Activity:GetActivityGroupDataById(actGroupId)
local taskActId = actGroupData:GetActivityDataByIndex(AllEnum.ActivityThemeFuncIndex.Task).ActivityId
local taskActData = PlayerData.Activity:GetActivityDataById(taskActId)
if taskActData ~= nil and taskActData:CheckActivityOpen() then
RedDotManager.UnRegisterNode(RedDotDefine.Activity_Group_Task_Group, {
actGroupId,
taskActId,
mapActivityData.MiniGameRedDot
}, self._mapNode.reward_reddot)
return
end
end
end
function MathParkourLevelSelectCtrl:SetLevelToggle(levelData, toggle, nIndex)
local rt_Targets = toggle.transform:Find("tog/grpText/rt_Targets")
local rtLockPreLv = toggle.transform:Find("tog/grpText/rtLockPreLv")
local txt_Open = toggle.transform:Find("tog/AnimRoot/AnimSwitch/txt_Open"):GetComponent("TextMeshProUGUI")
local txt_Lock = toggle.transform:Find("tog/AnimRoot/AnimSwitch/txt_Lock"):GetComponent("TextMeshProUGUI")
local levelUnlock = self.actData:GetLevelUnlock(levelData.nId)
local tog = toggle.transform:Find("tog"):GetComponent("UIButton")
tog.onClick:RemoveAllListeners()
rt_Targets.gameObject:SetActive(levelUnlock)
rtLockPreLv.gameObject:SetActive(not levelUnlock)
txt_Open.gameObject:SetActive(levelUnlock)
txt_Lock.gameObject:SetActive(not levelUnlock)
local sLevelIndex = string.format("%02d", nIndex)
NovaAPI.SetTMPText(txt_Open, sLevelIndex)
NovaAPI.SetTMPText(txt_Lock, sLevelIndex)
local imgSelect = toggle.transform:Find("tog/AnimRoot/AnimSwitch/imgSelect")
imgSelect.gameObject:SetActive(false)
if not levelUnlock then
return
end
for i = 1, 3 do
local btnTarget = rt_Targets.transform:Find("btnTarget" .. i):GetComponent("Button")
btnTarget.interactable = i <= levelData.nStar
end
tog.onClick:AddListener(function()
self:ShowDetail(levelData, nIndex, true)
imgSelect.gameObject:SetActive(true)
end)
local bNewDot = toggle.transform:Find("tog/AnimRoot/AnimSwitch/redH")
RedDotManager.RegisterNode(RedDotDefine.Activity_MathParkour_New_Level, {
self.nActId,
levelData.nId
}, bNewDot)
end
function MathParkourLevelSelectCtrl:ShowDetail(levelData, nIndex, bScroll)
local tempIndex = self._panel.nSelectIndex
if 0 < tempIndex then
local imgSelect = self._mapNode.togRoot[tempIndex].transform:Find("tog/AnimRoot/AnimSwitch/imgSelect")
imgSelect.gameObject:SetActive(false)
end
self._panel.nSelectIndex = nIndex
self._mapNode.levelDetail:ShowPanel(self.nActId, levelData)
if bScroll and 4 < nIndex then
NovaAPI.SetLayoutGroupPadding(self._mapNode.rt_Toggle, 194, layoutRight, -32, 0)
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
local moveTime = 0.2
local moveX = -325 - 340 * (nIndex - 5)
self._mapNode.rt_ToggleTrans:DOLocalMoveX(moveX, moveTime)
self._mapNode.Sp_BookScene:DOLocalMoveX(moveX, moveTime)
end
cs_coroutine.start(wait)
end
end
function MathParkourLevelSelectCtrl:OnBtnClick_CloseBg()
local tempIndex = self._panel.nSelectIndex
if 0 < tempIndex then
local imgSelect = self._mapNode.togRoot[tempIndex].transform:Find("tog/AnimRoot/AnimSwitch/imgSelect")
imgSelect.gameObject:SetActive(false)
end
self._panel.nSelectIndex = 0
self._mapNode.levelDetail:ClosePanel()
local moveTime = 0.2
EventManager.Hit(EventId.TemporaryBlockInput, moveTime)
local layout = layoutRight
self.tweener = DOTween.To(function()
return layout
end, function(v)
NovaAPI.SetLayoutGroupPadding(self._mapNode.rt_Toggle, 194, math.floor(v), -32, 0)
end, layoutRightDefault, moveTime):OnComplete(function()
NovaAPI.SetLayoutGroupPadding(self._mapNode.rt_Toggle, 194, layoutRightDefault, -32, 0)
end)
end
function MathParkourLevelSelectCtrl:OnBtnClick_Task()
if PlayerData.Activity:IsActivityInActivityGroup(self.nActId) then
local mapActivityData = ConfigTable.GetData("Activity", self.nActId)
local actGroupId = mapActivityData.MidGroupId
local actGroupData = PlayerData.Activity:GetActivityGroupDataById(actGroupId)
local taskActId = actGroupData:GetActivityDataByIndex(AllEnum.ActivityThemeFuncIndex.Task).ActivityId
local taskActData = PlayerData.Activity:GetActivityDataById(taskActId)
if taskActData ~= nil and taskActData:CheckActivityOpen() then
EventManager.Hit(EventId.OpenPanel, PanelId.Task_20104, taskActId, GameEnum.ActivityTaskTabType.Tab4)
return
end
RedDotManager.UnRegisterNode(RedDotDefine.Activity_Group_Task_Group, {
actGroupId,
taskActId,
mapActivityData.MiniGameRedDot
}, self._mapNode.reward_reddot)
self._mapNode.reward_reddot:SetActive(false)
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Activity_End_Notice"))
end
end
return MathParkourLevelSelectCtrl
@@ -0,0 +1,80 @@
local MathParkourPauseCtrl = class("MathParkourPauseCtrl", BaseCtrl)
local GamepadUIManager = require("GameCore.Module.GamepadUIManager")
MathParkourPauseCtrl._mapNodeConfig = {
blur = {},
txt_title = {
sComponentName = "TMP_Text",
sLanguageId = "TowerDef_Text_Pause"
},
txt_exit = {
nCount = 2,
sComponentName = "TMP_Text",
sLanguageId = "TowerDef_Button_Leave"
},
txt_restart = {
nCount = 2,
sComponentName = "TMP_Text",
sLanguageId = "TowerDef_Button_Re"
},
txt_continue = {
nCount = 2,
sComponentName = "TMP_Text",
sLanguageId = "TowerDef_Button_Back"
},
txt_dic = {
nCount = 2,
sComponentName = "TMP_Text",
sLanguageId = "Tutorial_DicTitle"
},
btn_exit = {
sComponentName = "NaviButton",
callback = "OnBtnClick_Exit",
sAction = "Giveup"
},
btn_restart = {
sComponentName = "NaviButton",
callback = "OnBtnClick_Restart",
sAction = "Retry"
},
btn_continue = {
sComponentName = "NaviButton",
callback = "OnBtnClick_Continue",
sAction = "Back"
},
btn_dic = {
sComponentName = "NaviButton",
callback = "OnBtnClick_OpenDic",
sAction = "Depot"
}
}
MathParkourPauseCtrl._mapEventConfig = {}
MathParkourPauseCtrl._mapRedDotConfig = {}
function MathParkourPauseCtrl:Awake()
end
function MathParkourPauseCtrl:Open(nDicId)
self.nDicId = nDicId
self.gameObject:SetActive(true)
self._mapNode.btn_dic.gameObject:SetActive(0 < nDicId)
self.tbGamepadUINode = self:GetGamepadUINode()
GamepadUIManager.EnableGamepadUI("MathParkourPauseCtrl", self.tbGamepadUINode, nil, false)
end
function MathParkourPauseCtrl:Close()
GamepadUIManager.DisableGamepadUI("MathParkourPauseCtrl")
self.gameObject:SetActive(false)
end
function MathParkourPauseCtrl:OnBtnClick_Exit()
EventManager.Hit("MathParkour_Exit_OnClick")
end
function MathParkourPauseCtrl:OnBtnClick_Restart()
EventManager.Hit("MathParkour_Restart_OnClick")
end
function MathParkourPauseCtrl:OnBtnClick_Continue()
EventManager.Hit("MathParkour_Continue_OnClick")
end
function MathParkourPauseCtrl:OnBtnClick_OpenDic()
if self.nDicId == 0 then
return
end
EventManager.Hit(EventId.OpenPanel, PanelId.DictionaryEntry, self.nDicId, true)
end
return MathParkourPauseCtrl
@@ -0,0 +1,45 @@
local MathParkourResultFailCtrl = class("MathParkourResultFailCtrl", BaseCtrl)
local GamepadUIManager = require("GameCore.Module.GamepadUIManager")
MathParkourResultFailCtrl._mapNodeConfig = {
txtCompleteTipsPrev1 = {
sComponentName = "TMP_Text",
sLanguageId = "MathParkour_Text_CompleteTipsPrev"
},
txt_Complete = {sComponentName = "TMP_Text"},
btn_Confirm = {
sComponentName = "UIButton",
callback = "OnBtnClick_Confirm"
},
txt_confirm = {
sComponentName = "TMP_Text",
sLanguageId = "MathParkour_Text_Confirm"
},
btn_Again = {
sComponentName = "UIButton",
callback = "OnBtnClick_Again"
},
txt_again = {
sComponentName = "TMP_Text",
sLanguageId = "MathParkour_Text_Again"
}
}
MathParkourResultFailCtrl._mapEventConfig = {}
MathParkourResultFailCtrl._mapRedDotConfig = {}
function MathParkourResultFailCtrl:ShowPanel(nScore)
self.gameObject:SetActive(true)
NovaAPI.SetTMPText(self._mapNode.txt_Complete, nScore)
self.tbGamepadUINode = self:GetGamepadUINode()
GamepadUIManager.EnableGamepadUI("MathParkourResultFailCtrl", self.tbGamepadUINode, nil, true)
end
function MathParkourResultFailCtrl:HidePanel()
self.gameObject:SetActive(false)
end
function MathParkourResultFailCtrl:OnBtnClick_Confirm()
GamepadUIManager.DisableGamepadUI("MathParkourResultFailCtrl")
EventManager.Hit("MathParkour_Confirm")
end
function MathParkourResultFailCtrl:OnBtnClick_Again()
GamepadUIManager.DisableGamepadUI("MathParkourResultFailCtrl")
EventManager.Hit("MathParkour_Again")
end
return MathParkourResultFailCtrl
@@ -0,0 +1,67 @@
local MathParkourResultSuccessCtrl = class("MathParkourResultSuccessCtrl", BaseCtrl)
local GamepadUIManager = require("GameCore.Module.GamepadUIManager")
MathParkourResultSuccessCtrl._mapNodeConfig = {
txtCompleteTipsPrev1 = {
sComponentName = "TMP_Text",
sLanguageId = "MathParkour_StarTitle"
},
ScoreStar = {nCount = 3},
txtCompleteTipsPrev2 = {
sComponentName = "TMP_Text",
sLanguageId = "MathParkour_Text_CompleteTipsPrev"
},
txt_Complete = {sComponentName = "TMP_Text"},
txt_curScore = {
sComponentName = "TMP_Text",
sLanguageId = "MathParkour_Text_NewScore"
},
btn_Confirm = {
sComponentName = "UIButton",
callback = "OnBtnClick_Confirm"
},
txt_confirm = {
sComponentName = "TMP_Text",
sLanguageId = "MathParkour_Text_Confirm"
},
btn_Nextlevel = {
sComponentName = "UIButton",
callback = "OnBtnClick_NextLevel"
},
txt_nextlevel = {
sComponentName = "TMP_Text",
sLanguageId = "MathParkour_Text_NextLevel"
}
}
MathParkourResultSuccessCtrl._mapEventConfig = {}
MathParkourResultSuccessCtrl._mapRedDotConfig = {}
function MathParkourResultSuccessCtrl:ShowPanel(nScore, bNew, nStarCount, bCanNextLevel, nActId)
self.gameObject:SetActive(true)
NovaAPI.SetTMPText(self._mapNode.txt_Complete, nScore)
self._mapNode.txt_curScore.gameObject:SetActive(bNew)
for i = 1, 3 do
self._mapNode.ScoreStar[i].gameObject:SetActive(i <= nStarCount)
end
bCanNextLevel = bCanNextLevel or false
self._mapNode.btn_Nextlevel.gameObject:SetActive(bCanNextLevel)
self.actData = PlayerData.Activity:GetActivityDataById(nActId)
if self.actData ~= nil then
EventManager.Hit(EventId.TemporaryBlockInput, 1)
self:AddTimer(1, 1, function()
self.actData:OpenTempChangeInfo()
end, true, true, true)
end
self.tbGamepadUINode = self:GetGamepadUINode()
GamepadUIManager.EnableGamepadUI("MathParkourResultSuccessCtrl", self.tbGamepadUINode, nil, true)
end
function MathParkourResultSuccessCtrl:HidePanel()
self.gameObject:SetActive(false)
end
function MathParkourResultSuccessCtrl:OnBtnClick_Confirm()
GamepadUIManager.DisableGamepadUI("MathParkourResultSuccessCtrl")
EventManager.Hit("MathParkour_Confirm")
end
function MathParkourResultSuccessCtrl:OnBtnClick_NextLevel()
GamepadUIManager.DisableGamepadUI("MathParkourResultSuccessCtrl")
EventManager.Hit("MathParkour_NextLevel")
end
return MathParkourResultSuccessCtrl
@@ -0,0 +1,113 @@
local MathParkourSkillDisplayCtrl = class("MathParkourSkillDisplayCtrl", BaseCtrl)
local Actor2DManager = require("Game.Actor2D.Actor2DManager")
local GameResourceLoader = require("Game.Common.Resource.GameResourceLoader")
local ResTypeAny = GameResourceLoader.ResType.Any
local Path = require("path")
local WwiseAudioMgr = CS.WwiseAudioManager.Instance
local LocalSettingData = require("GameCore.Data.LocalSettingData")
MathParkourSkillDisplayCtrl._mapNodeConfig = {
DisplayParent = {},
imgBgChar = {sComponentName = "Image"},
imgBgPortrait = {sComponentName = "Image"},
DisplayL2d = {sComponentName = "RawImage"},
animRoot = {sComponentName = "Animator", sNodeName = "animove"},
imgBgCharL2d = {}
}
MathParkourSkillDisplayCtrl._mapEventConfig = {
MathParkour_CastAssistSkill = "OnEvent_CastAssistSkill",
MathParkour_CastAssistSkillPause = "OnEvent_CastAssistSkillPause"
}
MathParkourSkillDisplayCtrl._mapRedDotConfig = {}
function MathParkourSkillDisplayCtrl:Awake()
end
function MathParkourSkillDisplayCtrl:OnEnable()
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
self._mapNode.DisplayParent:SetActive(true)
NovaAPI.SetMaskAllDirty(self._mapNode.imgBgCharL2d)
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
self._mapNode.DisplayParent:SetActive(false)
end
cs_coroutine.start(wait)
end
function MathParkourSkillDisplayCtrl:OnDisable()
end
function MathParkourSkillDisplayCtrl:OnDestroy()
self.tbInterruptedDisplay = nil
Actor2DManager.UnsetActor2D(false, 1, true)
end
function MathParkourSkillDisplayCtrl:InterrputAllDisplay()
self:InterrputAnim()
end
function MathParkourSkillDisplayCtrl:InterrputAnim()
if self.timer ~= nil then
self.timer:Cancel(false)
self.timer = nil
end
Actor2DManager.UnsetActor2D(false, 1, true)
self.callback = nil
self._mapNode.DisplayParent:SetActive(false)
end
function MathParkourSkillDisplayCtrl:UltimateDisplay(nCharId, nSkinId)
self:InitL2dRes(nCharId, nSkinId)
self:ShowSkill(nCharId, nSkinId)
end
function MathParkourSkillDisplayCtrl:InitL2dRes(nCharId, nSkinId)
local mapSkin = ConfigTable.GetData_CharacterSkin(nSkinId)
local sBodyName = string.format("%s_001", nSkinId)
self.LoadSprite(self._mapNode.imgBgPortrait, mapSkin.Portrait, sBodyName)
local mapCharDescCfg = ConfigTable.GetData("CharacterDes", nCharId)
local sColor
if mapCharDescCfg == nil then
sColor = ""
else
sColor = mapCharDescCfg.CharSkillColor == "" and mapCharDescCfg.CharColor or mapCharDescCfg.CharSkillColor
end
local _b, _color = ColorUtility.TryParseHtmlString(sColor)
NovaAPI.SetImageColor(self._mapNode.imgBgChar, _color)
end
function MathParkourSkillDisplayCtrl.LoadSprite(imgObj, sPath, sName)
local _sPath = string.format("%s/atlas_png/a/%s.png", Path.dirname(sPath), sName)
NovaAPI.SetImageSprite(imgObj, Settings.AB_ROOT_PATH .. _sPath)
end
function MathParkourSkillDisplayCtrl:ShowSkill(nCharId, nSkinId, callback)
if self.timer ~= nil then
self.timer:Cancel(false)
self.timer = nil
end
WwiseAudioMgr:PostEvent("ui_tip_support_ult")
self._mapNode.DisplayParent:SetActive(true)
NovaAPI.SetMaskAllDirty(self._mapNode.imgBgCharL2d)
self._mapNode.animRoot:Play("Empty")
self._mapNode.animRoot:Play("SubskillDisplay_moves_1")
self.gameObject.transform.localScale = Vector3.one
Actor2DManager.SetActor2D_ForSubSKill(PanelId.SubSkillDisplay, self._mapNode.DisplayL2d, nCharId, nSkinId, nil, nIdx)
Actor2DManager.PlayAnim("ultra", true, 1)
self.callback = callback
self.timer = self:AddTimer(1, 1.5, "ShowEnd", true, true, true, true)
end
function MathParkourSkillDisplayCtrl:ShowEnd()
if self.callback ~= nil and type(self.callback) == "function" then
self.callback()
end
Actor2DManager.UnsetActor2D(false, 1)
self.callback = nil
self._mapNode.DisplayParent:SetActive(false)
self.timer = nil
end
function MathParkourSkillDisplayCtrl:OnEvent_CastAssistSkillPause(bPause)
if bPause then
if self.callback ~= nil and type(self.callback) == "function" then
self.callback()
end
self:InterrputAllDisplay()
end
end
function MathParkourSkillDisplayCtrl:OnEvent_CastAssistSkill(nCharId, nSkinId)
self.UseLive2D = LocalSettingData.mapData.UseLive2D
if not (nCharId and nSkinId) or not self.UseLive2D then
return
end
self:UltimateDisplay(nCharId, nSkinId)
end
return MathParkourSkillDisplayCtrl
@@ -1,4 +1,5 @@
local PeriodicQuestCtrl_01 = class("PeriodicQuestCtrl_01", BaseCtrl)
local TimerManager = require("GameCore.Timer.TimerManager")
PeriodicQuestCtrl_01._mapNodeConfig = {
goCommon = {
sNodeName = "---Common---"
@@ -38,11 +39,24 @@ PeriodicQuestCtrl_01._mapNodeConfig = {
btnCharDetail = {
sComponentName = "UIButton",
callback = "OnBtnClick_CharPreview"
}
},
btnDetail = {
sComponentName = "UIButton",
callback = "OnBtnClick_Detail"
},
txtBtnDetail = {
sComponentName = "TMP_Text",
sLanguageId = "Activity_Btn_Detail"
},
goActTime = {},
txtActivityTime = {sComponentName = "TMP_Text"}
}
PeriodicQuestCtrl_01._mapEventConfig = {
RefreshPeriodicAct = "OnEvent_RefreshPeriodicAct"
}
function PeriodicQuestCtrl_01:OnDisable()
self:UnbindCtrl()
end
function PeriodicQuestCtrl_01:RefreshActInfo()
if self.activityCtrl ~= nil then
self.activityCtrl:RefreshQuestList()
@@ -108,24 +122,22 @@ function PeriodicQuestCtrl_01:InitActData(actData, bResetGroup)
self.nActId = actData:GetActId()
self.activityCtrl:InitActData(actData, bResetGroup)
self:RefreshActInfo()
self:SetTime()
end
function PeriodicQuestCtrl_01:ClearActivity()
self:UnbindCtrl()
end
function PeriodicQuestCtrl_01:Awake()
end
function PeriodicQuestCtrl_01:FadeIn()
end
function PeriodicQuestCtrl_01:FadeOut()
end
function PeriodicQuestCtrl_01:OnEnable()
end
function PeriodicQuestCtrl_01:OnDisable()
self:UnbindCtrl()
end
function PeriodicQuestCtrl_01:OnDestroy()
end
function PeriodicQuestCtrl_01:OnRelease()
function PeriodicQuestCtrl_01:SetTime()
local actCfg = self.actData:GetActCfgData()
if actCfg.EndType == GameEnum.activityEndType.NoLimit then
self._mapNode.goActTime.gameObject:SetActive(false)
else
self._mapNode.goActTime.gameObject:SetActive(true)
self:RefreshRemainTime()
if nil == self.remainTimer then
self.remainTimer = self:AddTimer(0, 1, "RefreshRemainTime", true, true, false)
end
end
end
function PeriodicQuestCtrl_01:OnBtnClick_Receive()
local callback = function()
@@ -169,4 +181,60 @@ function PeriodicQuestCtrl_01:OnBtnClick_CharPreview()
end
end
end
function PeriodicQuestCtrl_01:OnBtnClick_Detail()
local perQuestActCfg = self.actData:GetPerQuestCfg()
local msg = {
nType = AllEnum.MessageBox.Desc,
sContent = perQuestActCfg.DesText,
sTitle = ConfigTable.GetUIText("Activity_Btn_Detail")
}
EventManager.Hit(EventId.OpenMessageBox, msg)
end
function PeriodicQuestCtrl_01:RefreshRemainTime()
local endTime = self.actData:GetActEndTime()
local curTime = CS.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)
if sec == 0 then
min = min - 1
sec = 60
end
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)
if min == 0 then
hour = hour - 1
min = 60
end
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)
if hour == 0 then
day = day - 1
hour = 24
end
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Day") or "", day, hour)
end
NovaAPI.SetTMPText(self._mapNode.txtActivityTime, orderedFormat(ConfigTable.GetUIText("PerActivity_Remain_Time") or "", sTimeStr))
end
return PeriodicQuestCtrl_01
@@ -0,0 +1,126 @@
local PeriodicQuestCtrl_cover = class("PeriodicQuestCtrl_cover", BaseCtrl)
local TimerManager = require("GameCore.Timer.TimerManager")
PeriodicQuestCtrl_cover._mapNodeConfig = {
goCommon = {
sNodeName = "---Common---"
},
btnDetail = {
sComponentName = "UIButton",
callback = "OnBtnClick_Detail"
},
txtBtnDetail = {
sComponentName = "TMP_Text",
sLanguageId = "Activity_Btn_Detail"
},
txtActivityTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Activity_CopyMemo"
},
goActTime = {},
txtActivityTime = {sComponentName = "TMP_Text"}
}
PeriodicQuestCtrl_cover._mapEventConfig = {
RefreshPeriodicAct = "OnEvent_RefreshPeriodicAct"
}
function PeriodicQuestCtrl_cover:OnDisable()
self:UnbindCtrl()
end
function PeriodicQuestCtrl_cover:RefreshActInfo()
if self.activityCtrl ~= nil then
self.activityCtrl:RefreshQuestList()
end
end
function PeriodicQuestCtrl_cover:UnbindCtrl()
if self.activityCtrl ~= nil then
self:UnbindCtrlByNode(self.activityCtrl)
self.activityCtrl = nil
end
end
function PeriodicQuestCtrl_cover:InitActData(actData, bResetGroup)
if self.activityCtrl == nil then
self.activityCtrl = self:BindCtrlByNode(self._mapNode.goCommon, "Game.UI.Activity.PeriodicQuest.PeriodicQuestCtrl")
end
self.actData = actData
self.nActId = actData:GetActId()
self.activityCtrl:InitActData(actData, bResetGroup)
self:RefreshActInfo()
self:SetTime()
end
function PeriodicQuestCtrl_cover:ClearActivity()
self:UnbindCtrl()
end
function PeriodicQuestCtrl_cover:SetTime()
local actCfg = self.actData:GetActCfgData()
if actCfg.EndType == GameEnum.activityEndType.NoLimit then
self._mapNode.goActTime.gameObject:SetActive(false)
else
self._mapNode.goActTime.gameObject:SetActive(true)
self:RefreshRemainTime()
if nil == self.remainTimer then
self.remainTimer = self:AddTimer(0, 1, "RefreshRemainTime", true, true, false)
end
end
end
function PeriodicQuestCtrl_cover:OnEvent_RefreshPeriodicAct(nActId)
if nActId == self.nActId then
self.bQuestAnim = false
self:RefreshActInfo()
end
end
function PeriodicQuestCtrl_cover:OnBtnClick_Detail()
local perQuestActCfg = self.actData:GetPerQuestCfg()
local msg = {
nType = AllEnum.MessageBox.Desc,
sContent = perQuestActCfg.DesText,
sTitle = ConfigTable.GetUIText("Activity_Btn_Detail")
}
EventManager.Hit(EventId.OpenMessageBox, msg)
end
function PeriodicQuestCtrl_cover:RefreshRemainTime()
local endTime = self.actData:GetActEndTime()
local curTime = CS.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)
if sec == 0 then
min = min - 1
sec = 60
end
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)
if min == 0 then
hour = hour - 1
min = 60
end
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)
if hour == 0 then
day = day - 1
hour = 24
end
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Day") or "", day, hour)
end
NovaAPI.SetTMPText(self._mapNode.txtActivityTime, sTimeStr)
end
return PeriodicQuestCtrl_cover
@@ -1,5 +1,4 @@
local PeriodicQuestCtrl = class("PeriodicQuestCtrl", BaseCtrl)
local TimerManager = require("GameCore.Timer.TimerManager")
PeriodicQuestCtrl._mapNodeConfig = {
loopSv = {
sNodeName = "srGuideQuest",
@@ -22,73 +21,36 @@ PeriodicQuestCtrl._mapNodeConfig = {
sComponentName = "UIButton",
callback = "OnBtnClick_GroupLock"
},
btnDetail = {
sComponentName = "UIButton",
callback = "OnBtnClick_Detail"
},
txtBtnDetail = {
sComponentName = "TMP_Text",
sLanguageId = "Activity_Btn_Detail"
},
btnQuickRec = {
sComponentName = "UIButton",
callback = "OnBtnClick_QuickRec"
},
btnCanNotQuickRec = {
sComponentName = "UIButton",
callback = "OnBtnClick_CannotQuickRec"
},
txtBtnQuickRec = {
sComponentName = "TMP_Text",
sLanguageId = "Activity_Btn_Quick_Receive"
},
goActTime = {},
txtActivityTime = {sComponentName = "TMP_Text"}
txtBtnCannotQuickRec = {
sComponentName = "TMP_Text",
sLanguageId = "Activity_Btn_Quick_Receive"
},
btnShop = {
sComponentName = "UIButton",
callback = "OnBtnClick_Shop"
},
btnGuideMission = {
sComponentName = "UIButton",
callback = "OnBtnClick_GuideMission"
},
txtBtnGuideMission = {
sComponentName = "TMP_Text",
sLanguageId = "Activity_AvgReview"
}
}
PeriodicQuestCtrl._mapEventConfig = {}
function PeriodicQuestCtrl:RefreshRemainTime()
local endTime = self.actData:GetActEndTime()
local curTime = CS.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)
if sec == 0 then
min = min - 1
sec = 60
end
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)
if min == 0 then
hour = hour - 1
min = 60
end
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)
if hour == 0 then
day = day - 1
hour = 24
end
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Day") or "", day, hour)
end
NovaAPI.SetTMPText(self._mapNode.txtActivityTime, orderedFormat(ConfigTable.GetUIText("PerActivity_Remain_Time") or "", sTimeStr))
end
function PeriodicQuestCtrl:RefreshQuestList()
self.tbAllQuestList = self.actData:GetQuestListByGroup()
if nil == self.tbAllQuestList[self._panel.nSelectGroup] then
@@ -114,6 +76,7 @@ function PeriodicQuestCtrl:RefreshQuestList()
end
local _, _, canReceive = self.actData:GetQuestProgress()
self._mapNode.btnQuickRec.gameObject:SetActive(0 < canReceive)
self._mapNode.btnCanNotQuickRec.gameObject:SetActive(canReceive <= 0)
for k, v in ipairs(self._mapNode.PerActGroupItem) do
local nAllQuest, nReceivedQuest = self.actData:GetDayQuestStatus(k)
v:RefreshStatus(nAllQuest <= nReceivedQuest and 0 < nReceivedQuest)
@@ -186,27 +149,11 @@ function PeriodicQuestCtrl:InitActData(actData, bResetGroup)
EventManager.Hit(EventId.ClosePanel, PanelId.ActivityList)
return
end
local actCfg = self.actData:GetActCfgData()
if actCfg.EndType == GameEnum.activityEndType.NoLimit then
self._mapNode.goActTime.gameObject:SetActive(false)
else
self._mapNode.goActTime.gameObject:SetActive(true)
self:RefreshRemainTime()
if nil == self.remainTimer then
self.remainTimer = self:AddTimer(0, 1, "RefreshRemainTime", true, true, false)
end
end
end
function PeriodicQuestCtrl:Awake()
self.tbGridCtrl = {}
self.tbSequences = {}
end
function PeriodicQuestCtrl:FadeIn()
end
function PeriodicQuestCtrl:FadeOut()
end
function PeriodicQuestCtrl:OnEnable()
end
function PeriodicQuestCtrl:OnDisable()
for nInstanceId, objCtrl in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(objCtrl)
@@ -214,10 +161,6 @@ function PeriodicQuestCtrl:OnDisable()
end
self.tbGridCtrl = {}
end
function PeriodicQuestCtrl:OnDestroy()
end
function PeriodicQuestCtrl:OnRelease()
end
function PeriodicQuestCtrl:OnBtnClick_Group(_, nIndex)
if self._panel.nSelectGroup == nIndex then
return
@@ -240,15 +183,6 @@ end
function PeriodicQuestCtrl:OnBtnClick_GroupLock()
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("PerActivity_Not_Open"))
end
function PeriodicQuestCtrl:OnBtnClick_Detail()
local perQuestActCfg = self.actData:GetPerQuestCfg()
local msg = {
nType = AllEnum.MessageBox.Desc,
sContent = perQuestActCfg.DesText,
sTitle = ConfigTable.GetUIText("Activity_Btn_Detail")
}
EventManager.Hit(EventId.OpenMessageBox, msg)
end
function PeriodicQuestCtrl:OnBtnClick_QuickRec()
local callback = function()
EventManager.Hit("RefreshPeriodicAct", self.nActId)
@@ -256,4 +190,19 @@ function PeriodicQuestCtrl:OnBtnClick_QuickRec()
end
PlayerData.Activity:SendReceivePerQuest(self.nActId, 0, callback)
end
function PeriodicQuestCtrl:OnBtnClick_CannotQuickRec()
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("InfinityTower_Reward_Tips"))
end
function PeriodicQuestCtrl:OnBtnClick_Shop()
EventManager.Hit(EventId.OpenPanel, PanelId.GuideMission, 3)
end
function PeriodicQuestCtrl:OnBtnClick_GuideMission()
local nActivityId = tonumber(self.actData:GetSpecialParam())
if type(nActivityId) == "number" then
local data = ConfigTable.GetData("ActivityStoryChapter", nActivityId)
if data ~= nil then
PlayerData.StoryReview:TryOpenStoryChapter(data.ChapterId)
end
end
end
return PeriodicQuestCtrl
@@ -1,54 +0,0 @@
local PeriodicQuestCtrl_02 = class("PeriodicQuestCtrl_02", BaseCtrl)
PeriodicQuestCtrl_02._mapNodeConfig = {
goCommon = {
sNodeName = "---Common---"
}
}
PeriodicQuestCtrl_02._mapEventConfig = {
RefreshPeriodicAct = "OnEvent_RefreshPeriodicAct"
}
function PeriodicQuestCtrl_02:RefreshActInfo()
if self.activityCtrl ~= nil then
self.activityCtrl:RefreshQuestList()
end
end
function PeriodicQuestCtrl_02:UnbindCtrl()
if self.activityCtrl ~= nil then
self:UnbindCtrlByNode(self.activityCtrl)
self.activityCtrl = nil
end
end
function PeriodicQuestCtrl_02:InitActData(actData, bResetGroup)
if self.activityCtrl == nil then
self.activityCtrl = self:BindCtrlByNode(self._mapNode.goCommon, "Game.UI.Activity.PeriodicQuest.PeriodicQuestCtrl")
end
self.actData = actData
self.nActId = actData:GetActId()
self.activityCtrl:InitActData(actData, bResetGroup)
self:RefreshActInfo()
end
function PeriodicQuestCtrl_02:ClearActivity()
self:UnbindCtrl()
end
function PeriodicQuestCtrl_02:Awake()
end
function PeriodicQuestCtrl_02:FadeIn()
end
function PeriodicQuestCtrl_02:FadeOut()
end
function PeriodicQuestCtrl_02:OnEnable()
end
function PeriodicQuestCtrl_02:OnDisable()
self:UnbindCtrl()
end
function PeriodicQuestCtrl_02:OnDestroy()
end
function PeriodicQuestCtrl_02:OnRelease()
end
function PeriodicQuestCtrl_02:OnEvent_RefreshPeriodicAct(nActId)
if nActId == self.nActId then
self.bQuestAnim = false
self:RefreshActInfo()
end
end
return PeriodicQuestCtrl_02
@@ -14,9 +14,16 @@ PeriodicQuestItemCtrl._mapNodeConfig = {
sComponentName = "UIButton",
callback = "OnBtnClick_Reward"
},
btnReward2 = {
sComponentName = "UIButton",
callback = "OnBtnClick_Reward2"
},
rtReward = {
sCtrlName = "Game.UI.TemplateEx.TemplateItemCtrl"
},
rtReward2 = {
sCtrlName = "Game.UI.TemplateEx.TemplateItemCtrl"
},
btnReceive = {
sComponentName = "UIButton",
callback = "OnBtnClick_Receive"
@@ -56,6 +63,9 @@ function PeriodicQuestItemCtrl:SetData(nActId, mapData)
self.nJumpTo = questCfg.JumpTo
self.rewardId = questCfg.Reward
self._mapNode.rtReward:SetItem(questCfg.Reward, nil, questCfg.RewardQty, nil, nil, nil, nil, true)
self.rewardId2 = questCfg.Reward2
self._mapNode.rtReward2:SetItem(questCfg.Reward2, nil, questCfg.RewardQty2, nil, nil, nil, nil, true)
self._mapNode.btnReward2.gameObject:SetActive(self.rewardId2 ~= 0)
self._mapNode.txtUnComplete.gameObject:SetActive(nStatus == AllEnum.ActQuestStatus.UnComplete and questCfg.JumpTo == 0)
self._mapNode.btnJump.gameObject:SetActive(nStatus == AllEnum.ActQuestStatus.UnComplete and questCfg.JumpTo ~= 0)
self._mapNode.btnReceive.gameObject:SetActive(nStatus == AllEnum.ActQuestStatus.Complete)
@@ -90,6 +100,11 @@ function PeriodicQuestItemCtrl:OnBtnClick_Reward(btn)
UTILS.ClickItemGridWithTips(self.rewardId, btn.transform, true, true, true)
end
end
function PeriodicQuestItemCtrl:OnBtnClick_Reward2(btn)
if nil ~= self.rewardId2 then
UTILS.ClickItemGridWithTips(self.rewardId2, btn.transform, true, true, true)
end
end
function PeriodicQuestItemCtrl:OnBtnClick_Receive()
local callback = function()
EventManager.Hit("RefreshPeriodicAct", self.nActId)
@@ -0,0 +1,123 @@
local ActivityReengagement_101004PopUpCtrl = class("ActivityReengagement_101004PopUpCtrl", BaseCtrl)
local LocalData = require("GameCore.Data.LocalData")
local ClientManager = CS.ClientManager.Instance
ActivityReengagement_101004PopUpCtrl._mapNodeConfig = {
txtTips = {
sComponentName = "TMP_Text",
sLanguageId = "Reengagement_Popup_Tip"
},
goRewardItem = {
nCount = 4,
sCtrlName = "Game.UI.TemplateEx.TemplateItemCtrl"
},
btnRewardItem = {
nCount = 4,
sNodeName = "goRewardItem",
sComponentName = "UIButton",
callback = "OnClickBtnRewardItem"
},
rtBtn = {},
btnWelcome = {
sComponentName = "UIButton",
callback = "OnBtnClick_Welcome"
},
txtBtnWelcome = {
sComponentName = "TMP_Text",
sLanguageId = "Reengagement_Popup_Welcome"
}
}
ActivityReengagement_101004PopUpCtrl._mapEventConfig = {}
function ActivityReengagement_101004PopUpCtrl:ShowPopUp(actId, callback, index)
self.popUpIndex = index
self.nCurActId = actId
self.callback = callback
local bCanReceive = PlayerData.Reengagement:CheckCanReceive()
self._mapNode.rtBtn:SetActive(bCanReceive)
local nActId = PlayerData.Reengagement:GetActId()
local mapActData = ConfigTable.GetData("ActivityReturneeReunionReward", nActId)
if mapActData == nil then
if self.callback ~= nil then
self.callback()
end
return
end
local tbRewards = {}
self.tbItemReward = {}
for i = 1, 3 do
local nId = mapActData["Reward" .. i .. "Tid"]
local nQty = mapActData["Reward" .. i .. "Qty"]
if 0 < nId then
table.insert(tbRewards, {nId = nId, nQty = nQty})
table.insert(self.tbItemReward, nId)
end
end
for i = 1, #self._mapNode.goRewardItem do
local item = self._mapNode.goRewardItem[i]
if i <= #tbRewards then
item:SetItem(tbRewards[i].nId, nil, tbRewards[i].nQty)
self._mapNode.btnRewardItem[i].gameObject:SetActive(true)
else
self._mapNode.btnRewardItem[i].gameObject:SetActive(false)
end
end
self.anim = self.gameObject:GetComponent("Animator")
self:PlayOpenAnim()
end
function ActivityReengagement_101004PopUpCtrl:PlayOpenAnim()
if self.anim then
self.anim:Play("open", 0, 0)
end
end
function ActivityReengagement_101004PopUpCtrl:ClosePopUp(callback)
if self.anim ~= nil then
self.anim:Play("close", 0, 0)
self:AddTimer(1, 0.1, function()
if callback ~= nil then
callback()
end
end, true, true, true)
EventManager.Hit(EventId.TemporaryBlockInput, 0.1)
elseif callback ~= nil then
callback()
end
end
function ActivityReengagement_101004PopUpCtrl:OnBtnClick_Close()
self:ClosePopUp(self.callback)
end
function ActivityReengagement_101004PopUpCtrl:OnBtnClick_Goto()
local callback = function()
if nil ~= self.nCurActId then
PlayerData.Activity:SendActivityDetailMsg()
local endTime = PlayerData.Reengagement:GetReengagementCloseTime()
local curTime = ClientManager.serverTimeStamp
local remainTime = endTime - curTime
if remainTime <= 0 then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Activity_Invalid_Tip_3"))
if self.callback ~= nil then
self.callback()
end
return
end
PopUpManager.PauseAfterCurrent()
local openAct = function()
EventManager.Hit(EventId.OpenPanel, PanelId.ReengagementPanel)
end
if self.callback ~= nil then
self.callback(openAct, true)
else
openAct()
end
end
end
self:ClosePopUp(callback)
end
function ActivityReengagement_101004PopUpCtrl:OnClickBtnRewardItem(btn, index)
UTILS.ClickItemGridWithTips(self.tbItemReward[index], self._mapNode.btnRewardItem[index].transform, true, true, false)
end
function ActivityReengagement_101004PopUpCtrl:OnBtnClick_Welcome()
local cb = function()
self:OnBtnClick_Goto()
end
PlayerData.Reengagement:RequestReceiveReunionReward(cb)
end
return ActivityReengagement_101004PopUpCtrl
@@ -0,0 +1,21 @@
local ActivityReengagementPopUpPanel = class("ActivityReengagementPopUpPanel", BasePanel)
ActivityReengagementPopUpPanel._bIsMainPanel = false
ActivityReengagementPopUpPanel._tbDefine = {
{
sPrefabPath = "ActivityList/ActivityPopUpPanel.prefab",
sCtrlName = "Game.UI.Activity.Reengagement.ReengagementPopUpCtrl"
}
}
function ActivityReengagementPopUpPanel:Awake()
end
function ActivityReengagementPopUpPanel:OnEnable()
end
function ActivityReengagementPopUpPanel:OnAfterEnter()
end
function ActivityReengagementPopUpPanel:OnDisable()
end
function ActivityReengagementPopUpPanel:OnDestroy()
end
function ActivityReengagementPopUpPanel:OnRelease()
end
return ActivityReengagementPopUpPanel
@@ -25,6 +25,8 @@ ReengagementBDPreviewCtrl._mapNodeConfig = {
sComponentName = "TMP_Text",
sLanguageId = "Quest_WorldClass_Level"
},
txtLevel = {sComponentName = "TMP_Text"},
imgExpBar = {sComponentName = "Image"},
svAll = {
sComponentName = "LoopScrollView"
}
@@ -41,15 +43,26 @@ function ReengagementBDPreviewCtrl:OpenPanel()
self:InitPanel()
self._mapNode.animRoot:Play("t_window_04_t_in")
end
cs_coroutine.start(wait)
end
function ReengagementBDPreviewCtrl:InitPanel()
self.tbLevelInterval = {}
local foreachData = function(mapData)
table.insert(self.tbLevelInterval, mapData)
end
ForEachTableLine(ConfigTable.GetData("ReengagementBDTrial"), foreachData)
ForEachTableLine(ConfigTable.Get("ActivityReturneeTrialBuildGroup"), foreachData)
table.sort(self.tbLevelInterval, function(a, b)
return a.LevelMin < b.LevelMin
end)
self.nWorldLevel = PlayerData.Base:GetWorldClass()
NovaAPI.SetTMPText(self._mapNode.txtLevel, self.nWorldLevel)
local nCurExp = PlayerData.Base:GetWorldExp()
local mapCfg = ConfigTable.GetData("WorldClass", self.nWorldLevel + 1, true)
local nFullExp = 0
if mapCfg ~= nil then
nFullExp = mapCfg.Exp
NovaAPI.SetImageFillAmount(self._mapNode.imgExpBar, nCurExp / nFullExp)
end
self._mapNode.svAll:Init(#self.tbLevelInterval, self, self.OnGridRefresh)
end
function ReengagementBDPreviewCtrl:OnGridRefresh(goGrid, nGridIndex)
@@ -58,7 +71,7 @@ function ReengagementBDPreviewCtrl:OnGridRefresh(goGrid, nGridIndex)
local imgOnBg = goGrid.transform:Find("imgOnBg").gameObject
local imgOffBg = goGrid.transform:Find("imgOffBg").gameObject
local imgSelect = goGrid.transform:Find("imgSelect").gameObject
if self.nWorldLevel >= mapData.MinLevel and self.nWorldLevel <= mapData.MaxLevel then
if self.nWorldLevel >= mapData.LevelMin and (mapData.LevelMax == -1 or self.nWorldLevel <= mapData.LevelMax) then
imgOnBg:SetActive(true)
imgOffBg:SetActive(false)
imgSelect:SetActive(true)
@@ -69,13 +82,20 @@ function ReengagementBDPreviewCtrl:OnGridRefresh(goGrid, nGridIndex)
end
local txtDesc = goGrid.transform:Find("txtDesc"):GetComponent("TMP_Text")
if txtDesc ~= nil then
local nLevelMin = math.max(1, mapData.LevelMin)
local nLevelMax = PlayerData.Base:GetMaxWorldClass()
if mapData.LevelMax ~= -1 then
nLevelMax = math.min(nLevelMax, mapData.LevelMax)
end
local sText = ConfigTable.GetUIText("Reengagement_BDTrialPreview_WorldClass")
sText = sText .. mapData.MinLevel .. "~" .. mapData.MaxLevel
sText = sText .. nLevelMin .. "~" .. nLevelMax
NovaAPI.SetTMPText(txtDesc, sText)
end
local imgIcon = goGrid.transform:Find("imgIcon"):GetComponent("Image")
if imgIcon ~= nil then
self:SetPngSprite(imgIcon, mapData.Icon)
local rank = PlayerData.Build:CalBuildRank(mapData.Score)
local sScore = "Icon/BuildRank/BuildRank_" .. rank.Id
self:SetPngSprite(imgIcon, sScore)
end
end
function ReengagementBDPreviewCtrl:ClosePanel()
@@ -17,14 +17,10 @@ ReengagementBDPreviewItemCtrl._mapNodeConfig = {
imgCharFrame = {nCount = 3, sComponentName = "Image"},
txtPotentialCount = {nCount = 3, sComponentName = "TMP_Text"},
imgCharElement = {nCount = 3, sComponentName = "Image"},
txtChar = {
sComponentName = "TMP_Text",
sLanguageId = "StarTower_Build_Char_Title"
},
imgIcon = {sComponentName = "Image"},
txtRating = {
sComponentName = "TMP_Text",
sLanguageId = "StarTower_Build_Rating"
sLanguageId = "Template_Score"
}
}
ReengagementBDPreviewItemCtrl._mapEventConfig = {}
@@ -54,7 +50,7 @@ function ReengagementBDPreviewItemCtrl:RefreshChar()
local mapCharData = self.mapBuildData.tbChar[i]
local nCharTid = mapCharData ~= nil and mapCharData.nTid or 0
local mapCharCfg = 0 < nCharTid and ConfigTable.GetData_Character(nCharTid) or nil
local nCharSkinId = 0 < nCharTid and PlayerData.Char:GetCharSkinId(nCharTid) or 0
local nCharSkinId = 0 < nCharTid and PlayerData.Build:GetBuildCharSkinId(self.mapBuildData, mapCharData) or 0
local mapCharSkin = 0 < nCharSkinId and ConfigTable.GetData_CharacterSkin(nCharSkinId) or nil
local bShowChar = mapCharCfg ~= nil and mapCharSkin ~= nil
self._mapNode.imgCharIcon[i].gameObject:SetActive(bShowChar)
@@ -1,4 +1,6 @@
local ReengagementBDTrialCtrl = class("ReengagementBDTrialCtrl", BaseCtrl)
local TimerManager = CS.TimerManager.Instance
local ClientManager = CS.ClientManager.Instance
ReengagementBDTrialCtrl._mapNodeConfig = {
txtActName = {
sComponentName = "TMP_Text",
@@ -15,30 +17,72 @@ ReengagementBDTrialCtrl._mapNodeConfig = {
goInstanceItem = {
nCount = 6,
sCtrlName = "Game.UI.Activity.Reengagement.ReengagementBDPreviewItemCtrl"
}
},
txtTime = {sComponentName = "TMP_Text"}
}
ReengagementBDTrialCtrl._mapEventConfig = {}
function ReengagementBDTrialCtrl:Refresh(nCurTog)
if nCurTog ~= AllEnum.ReengagementTog.BDTrial then
return
end
self:RefreshTrialItems()
self:RefreshRemainTime()
if nil == self.remainTimer then
self.remainTimer = self:AddTimer(0, 1, "RefreshRemainTime", true, true, false)
end
end
function ReengagementBDTrialCtrl:RefreshTrialItems()
self.nWorldLevel = PlayerData.Base:GetWorldClass()
self.mapTrialBuildData = {}
local foreachMapData = function(mapData)
if self.nWorldLevel >= mapData.MinLevel and self.nWorldLevel <= mapData.MaxLevel then
self.mapTrialBuildData = mapData
end
end
ForEachTableLine(ConfigTable.Get("ReengagementBDTrial"), foreachMapData)
if self.mapTrialBuildData == {} then
return
end
self.tbBuildIds = self.mapTrialBuildData.BuildIds
self.tbBuildIds = PlayerData.Reengagement:GetLimitedTrialBuildList()
for k, nBuildId in ipairs(self.tbBuildIds) do
local itemCtrl = self.goInstanceItem[k]
local itemCtrl = self._mapNode.goInstanceItem[k]
itemCtrl:Refresh(nBuildId)
end
end
function ReengagementBDTrialCtrl:RefreshRemainTime()
local endTime = PlayerData.Reengagement:GetReengagementCloseTime()
local curTime = ClientManager.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.ReengagementPanel)
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)
if sec == 0 then
min = min - 1
sec = 60
end
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)
if min == 0 then
hour = hour - 1
min = 60
end
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)
if hour == 0 then
day = day - 1
hour = 24
end
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Day") or "", day, hour)
end
NovaAPI.SetTMPText(self._mapNode.txtTime, sTimeStr)
end
return ReengagementBDTrialCtrl
@@ -1,6 +1,11 @@
local ReengagementCtrl = class("ReengagementCtrl", BaseCtrl)
local TimerManager = require("GameCore.Timer.TimerManager")
local nTogCount = 5
ReengagementCtrl._mapNodeConfig = {
TopBar = {
sNodeName = "TopBarPanel",
sCtrlName = "Game.UI.TopBarEx.TopBarCtrl"
},
svTog = {
sComponentName = "LoopScrollView"
},
@@ -56,21 +61,80 @@ ReengagementCtrl._mapNodeConfig = {
sCtrlName = "Game.UI.Activity.Reengagement.ReengagementBDPreviewCtrl"
}
}
ReengagementCtrl._mapEventConfig = {}
ReengagementCtrl._mapEventConfig = {
[EventId.IsNewDay] = "OnEvent_NewDay"
}
local mapReddotKey = {
[1] = RedDotDefine.Activity_Reengagement_LoginReward,
[2] = RedDotDefine.Activity_Reengagement_Task,
[4] = RedDotDefine.Activity_Reengagement_WeeklyCard
}
function ReengagementCtrl:ClearTogCtrl()
if self.ctrlTog == nil then
self.ctrlTog = {}
return
end
for nInstanceID, objCtrl in pairs(self.ctrlTog) do
objCtrl:UnRegisterReddot()
self:UnbindCtrlByNode(objCtrl)
self.ctrlTog[nInstanceID] = nil
end
end
function ReengagementCtrl:InitTog()
self._mapNode.svTog:Init(5, self, self.OnGridRefresh, self.OnGridBtnClick)
self:ClearTogCtrl()
if self.nCurTog == nil or self.nCurTog < 1 or self.nCurTog > nTogCount then
self.nCurTog = self:GetDefaultTog()
end
self._mapNode.svTog:Init(nTogCount, self, self.OnGridRefresh, self.OnGridBtnClick)
end
function ReengagementCtrl:GetDefaultTog()
for nIndex = 1, nTogCount do
local sReddotKey = mapReddotKey[nIndex]
if sReddotKey ~= nil and RedDotManager.GetValid(sReddotKey, {
self.nActId
}) then
return nIndex
end
end
local mapLoginReward = PlayerData.Reengagement:GetActLoginRewardList()
if mapLoginReward == nil or (tonumber(mapLoginReward.Actual) or 0) < 7 then
return 1
end
for nDay = 1, 7 do
local tbQuestConfig = PlayerData.Reengagement:GetQuestConfigDataByGroup(100 + nDay)
if #tbQuestConfig == 0 then
return 2
end
for _, mapQuestConfig in ipairs(tbQuestConfig) do
local mapQuest = PlayerData.Reengagement:GetQuestDataById(mapQuestConfig.Id)
if mapQuest == nil or mapQuest.nStatus ~= 1 and mapQuest.nStatus ~= 2 then
return 2
end
end
end
if 0 < PlayerData.Reengagement:GetDoubleDropCount() then
return 3
end
return 1
end
function ReengagementCtrl:OnGridRefresh(goGrid, gridIndex)
local nIndex = gridIndex + 1
local nInstanceID = goGrid:GetInstanceID()
if not self.ctrlTog[nInstanceID] then
self.ctrlTog[nInstanceID] = self:BindCtrlByNode(goGrid, "Game.UI.TemplateEx.TemplateToggleCtrl")
self.ctrlTog[nInstanceID] = self:BindCtrlByNode(goGrid, "Game.UI.Activity.Reengagement.TemplateToggleReengagementCtrl")
end
local mapCfg = ConfigTable.GetUIText("ReengagementTog_" .. nIndex)
if mapCfg then
self.ctrlTog[nInstanceID]:SetText(mapCfg)
end
self.ctrlTog[nInstanceID]:SetDefault(nIndex == self.nCurTog)
local sReddotKey = mapReddotKey[nIndex]
self.ctrlTog[nInstanceID]:SetReddot(sReddotKey, {
self.nActId
})
if self.nCurTog == nIndex then
self.ctrlTog[nInstanceID]:SetTrigger(true)
end
end
function ReengagementCtrl:OnGridBtnClick(goGrid, gridIndex)
local nIndex = gridIndex + 1
@@ -78,27 +142,35 @@ function ReengagementCtrl:OnGridBtnClick(goGrid, gridIndex)
if nIndex == self.nCurTog then
return
end
self.ctrlTog[nInstanceID]:SetTrigger(true)
if self.nCurTog then
if self.ctrlTog[nInstanceID] ~= nil then
self.ctrlTog[nInstanceID]:SetTrigger(true)
end
if self.nCurTog ~= nil and self.nCurTog > 0 then
local goSelect = self._mapNode.trSvTog:Find("Viewport/Content/" .. self.nCurTog - 1)
if goSelect then
self.ctrlTog[goSelect.gameObject:GetInstanceID()]:SetTrigger(false)
local objCurTog = self.ctrlTog[goSelect.gameObject:GetInstanceID()]
if objCurTog ~= nil then
objCurTog:SetTrigger(false)
end
end
end
self.nCurTog = nIndex
self:SwitchTog()
self:SwitchTog(self._bInfoReady == true)
end
function ReengagementCtrl:SwitchTog()
self._mapNode.rtSignin:SetActive(self.nCurTog == 1)
self._mapNode.rtTask:SetActive(self.nCurTog == 2)
self._mapNode.rtDoubleDrop:SetActive(self.nCurTog == 3)
self._mapNode.rtShopMall:SetActive(self.nCurTog == 4)
self._mapNode.rtBDTrial:SetActive(self.nCurTog == 5)
self.ctrlSignin:Refresh(self.nCurTog)
self.ctrlTask:Refresh(self.nCurTog)
self.ctrlDoubleDrop:Refresh(self.nCurTog)
self.ctrlShopMall:Refresh(self.nCurTog)
self.ctrlBDTrial:Refresh(self.nCurTog)
function ReengagementCtrl:SwitchTog(bRefreshData)
self._mapNode.rtSignin.gameObject:SetActive(self.nCurTog == 1)
self._mapNode.rtTask.gameObject:SetActive(self.nCurTog == 2)
self._mapNode.rtDoubleDrop.gameObject:SetActive(self.nCurTog == 3)
self._mapNode.rtShopMall.gameObject:SetActive(self.nCurTog == 4)
self._mapNode.rtBDTrial.gameObject:SetActive(self.nCurTog == 5)
if bRefreshData ~= true then
return
end
self._mapNode.ctrlSignin:Refresh(self.nCurTog)
self._mapNode.ctrlTask:Refresh(self.nCurTog)
self._mapNode.ctrlDoubleDrop:Refresh(self.nCurTog)
self._mapNode.ctrlShopMall:Refresh(self.nCurTog)
self._mapNode.ctrlBDTrial:Refresh(self.nCurTog)
end
local nMaxEnergyBatteryFillerLength = 252
local nMinEnergyBatteryFillerLength = 15
@@ -115,23 +187,65 @@ function ReengagementCtrl:RefreshEnergyBattery()
self._mapNode.imgEnergyBarFill.sizeDelta = Vector2(nFillerLength, self._mapNode.imgEnergyBarFill.sizeDelta.y)
end
function ReengagementCtrl:Awake()
self.ctrlTog = {}
if self._bInfoReady == nil then
self._bInfoReady = false
end
end
function ReengagementCtrl:FadeIn()
end
function ReengagementCtrl:FadeOut()
end
function ReengagementCtrl:OnEnable()
self.nCurTog = 1
self:SwitchTog()
local nActId = PlayerData.Reengagement:GetActId()
local nOpenTime = PlayerData.Reengagement:GetReengagementOpenTime()
if self.nActId ~= nActId or self._nActOpenTime ~= nOpenTime then
self._bInfoReady = false
self.nCurTog = 0
self._panel.nSelectGroup = nil
end
self.nActId = nActId
self._nActOpenTime = nOpenTime
self.nCurTog = self.nCurTog or 0
self._mapNode.svTog.gameObject:SetActive(false)
self:SwitchTog(false)
self:RefreshEnergyBattery()
local init = function()
self._bInfoReady = true
if self._panel == nil or self._panel._bIsActive ~= true then
return
end
self._mapNode.svTog.gameObject:SetActive(true)
self:InitTog()
self:SwitchTog(true)
end
if self._bInfoReady == false then
PlayerData.Reengagement:RequestReengagementInfo(init)
else
init()
end
end
function ReengagementCtrl:OnDisable()
self:ClearTogCtrl()
end
function ReengagementCtrl:OnDestroy()
end
function ReengagementCtrl:OnRelease()
end
function ReengagementCtrl:OnClickTrialDetail()
self.ReengagementPreviewPanel:OpenPanel()
self._mapNode.ReengagementPreviewPanel:OpenPanel()
end
function ReengagementCtrl:OnEvent_NewDay()
if PanelManager.GetCurPanelId() == PanelId.MainView then
EventManager.Hit("NewDay_Clear_Guide")
local msg = {
nType = AllEnum.MessageBox.Alert,
sContent = ConfigTable.GetUIText("Alert_NextDay"),
callbackConfirm = function()
PanelManager.Home()
end
}
EventManager.Hit(EventId.OpenMessageBox, msg)
end
end
return ReengagementCtrl
@@ -1,3 +1,4 @@
local ClientManager = CS.ClientManager.Instance
local ReengagementDoubleDropCtrl = class("ReengagementDoubleDropCtrl", BaseCtrl)
ReengagementDoubleDropCtrl._mapNodeConfig = {
txtActName = {
@@ -30,8 +31,7 @@ ReengagementDoubleDropCtrl._mapNodeConfig = {
nCount = 4,
sComponentName = "TMP_Text",
sLanguageId = "Double_Drops_Goto_Instance"
},
redDotQuest = {}
}
}
ReengagementDoubleDropCtrl._mapEventConfig = {}
function ReengagementDoubleDropCtrl:Refresh(nCurTog)
@@ -40,10 +40,15 @@ function ReengagementDoubleDropCtrl:Refresh(nCurTog)
end
self:InitActData()
end
local tbInstanceToFunc = {
[GameEnum.instanceType.DailyInstance] = GameEnum.OpenFuncType.DailyInstance,
[GameEnum.instanceType.RegionBoss] = GameEnum.OpenFuncType.RegionBoss,
[GameEnum.instanceType.SkillInstance] = GameEnum.OpenFuncType.SkillInstance,
[GameEnum.instanceType.CharGemInstance] = GameEnum.OpenFuncType.CharGemInstance
}
function ReengagementDoubleDropCtrl:InitActData()
self.actData = {}
self.nActId = 0
self.tbFuncType = self.actData:GetDoubleFuncType()
self.tbFuncType = PlayerData.Reengagement:GetDoubleFuncType()
if self.tbFuncType == nil then
return
end
@@ -51,13 +56,14 @@ function ReengagementDoubleDropCtrl:InitActData()
for k, v in ipairs(self._mapNode.goInstanceItem) do
v.gameObject:SetActive(self.tbFuncType[k] ~= nil)
if self.tbFuncType[k] ~= nil then
v:InitItem(self.tbFuncType[k])
local bUnlock = PlayerData.Base:CheckFunctionUnlock(self.tbFuncType[k])
local nFuncType = tbInstanceToFunc[self.tbFuncType[k]]
v:InitItem(nFuncType)
local bUnlock = PlayerData.Base:CheckFunctionUnlock(nFuncType)
self._mapNode.btnGoto[k].gameObject:SetActive(bUnlock)
end
end
NovaAPI.SetTMPText(self._mapNode.txtDoubleCount, self.actData:GetDropActString())
RedDotManager.RegisterNode(RedDotDefine.Activity_DoubleDrop_Quest, self.nActId, self._mapNode.redDotQuest)
local sText = ConfigTable.GetUIText("Reengagement_DoubleDrop_Count") .. PlayerData.Reengagement:GetDoubleDropCount() .. "/" .. PlayerData.Reengagement:GetMaxDoubleDropCount()
NovaAPI.SetTMPText(self._mapNode.txtDoubleCount, sText)
end
function ReengagementDoubleDropCtrl:GetTimeStr(nRemainTime)
local sTimeStr = ""
@@ -96,8 +102,8 @@ function ReengagementDoubleDropCtrl:StartActTimer()
self.timer:Cancel()
self.timer = nil
end
local nOpenTime = self.actData:GetActOpenTime()
local nCloseTime = self.actData:GetActEndTime()
local nOpenTime = PlayerData.Reengagement:GetReengagementOpenTime()
local nCloseTime = PlayerData.Reengagement:GetReengagementCloseTime()
local refreshTime = function()
local nCurTime = ClientManager.serverTimeStamp
local sTime = ""
@@ -110,6 +116,13 @@ function ReengagementDoubleDropCtrl:StartActTimer()
if nRemainTime <= 0 and self.timer ~= nil then
self.timer:Cancel()
self.timer = nil
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Alert,
sContent = ConfigTable.GetUIText("Activity_Invalid_Tip_1"),
callbackConfirm = function()
EventManager.Hit(EventId.ClosePanel, PanelId.ReengagementPanel)
end
})
end
NovaAPI.SetTMPText(self._mapNode.txtTime, sTime)
end
@@ -133,13 +146,13 @@ function ReengagementDoubleDropCtrl:OnBtnClick_Goto(btn, nIndex)
if nType == nil then
return
end
if nType == GameEnum.OpenFuncType.DailyInstance then
if nType == GameEnum.instanceType.DailyInstance then
EventManager.Hit(EventId.OpenPanel, PanelId.DailyInstanceLevelSelect, 0, 0, true)
elseif nType == GameEnum.OpenFuncType.RegionBoss then
elseif nType == GameEnum.instanceType.RegionBoss then
EventManager.Hit(EventId.OpenPanel, PanelId.RogueBossLevel, 0, 0, true)
elseif nType == GameEnum.OpenFuncType.SkillInstance then
elseif nType == GameEnum.instanceType.SkillInstance then
EventManager.Hit(EventId.OpenPanel, PanelId.SkillInstanceLevelSelect)
elseif nType == GameEnum.OpenFuncType.CharGemInstance then
elseif nType == GameEnum.instanceType.CharGemInstance then
EventManager.Hit(EventId.OpenPanel, PanelId.EquipmentInstanceLevelSelect)
end
end
@@ -8,14 +8,8 @@ ReengagementMallCtrl._mapNodeConfig = {
},
txtLabelValue = {sComponentName = "TMP_Text"},
txtRemainDay = {sComponentName = "TMP_Text"},
txtWeeklyCardName = {
sComponentName = "TMP_Text",
sLanguageId = "Reengagement_WeeklyCardName"
},
txtWeeklyCardDesc = {
sComponentName = "TMP_Text",
sLanguageId = "Reengagement_WeeklyCardDesc"
},
txtWeeklyCardName = {sComponentName = "TMP_Text"},
txtWeeklyCardDesc = {sComponentName = "TMP_Text"},
txtGetNow = {
sComponentName = "TMP_Text",
sLanguageId = "Reengagement_GetNow"
@@ -24,10 +18,18 @@ ReengagementMallCtrl._mapNodeConfig = {
sComponentName = "TMP_Text",
sLanguageId = "Reengagement_GetDaily"
},
btnBuyWeeklyCard = {
sComponentName = "UIButton",
callback = "OnBtnClick_BuyWeeklyCard"
},
txtBtnBuy = {sComponentName = "TMP_Text"},
txtBtnReceiveWeeklyCard = {
sComponentName = "TMP_Text",
sLanguageId = "Quest_Receive_Btn_Text"
},
txtAlreadyReceived = {
sComponentName = "TMP_Text",
sLanguageId = "Reengagement_AlreadyReceived"
sLanguageId = "CharPlot_Task_Received"
},
btnReceiveWeeklyCard = {
sComponentName = "UIButton",
@@ -41,6 +43,7 @@ ReengagementMallCtrl._mapNodeConfig = {
nCount = 3,
sCtrlName = "Game.UI.TemplateEx.TemplateItemCtrl"
},
btnMallItem = {nCount = 3, sComponentName = "UIButton"},
txtBannerTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Reengagement_Mall_BannerTitle"
@@ -70,15 +73,26 @@ ReengagementMallCtrl._mapNodeConfig = {
imgPointBg = {nCount = 10},
PkgItem = {
nCount = 3,
sCtrlName = "Game.UI.Mall.MallPackageItemCtrl"
sCtrlName = "Game.UI.Activity.Reengagement.ReengagementMallPackageItemCtrl"
}
}
ReengagementMallCtrl._mapEventConfig = {}
ReengagementMallCtrl._mapEventConfig = {
MallOrderClear = "OnEvent_MallOrderClear",
RefreshReengagementWeeklyCard = "OnEvent_RefreshReengagementWeeklyCard"
}
function ReengagementMallCtrl:OnEnable()
self.tbPackagePage = {}
self.actData = {}
self.tbBannerInitPos = {}
for _, v in ipairs(self._mapNode.activityBannerItem) do
self.nBannerWidth = v.sizeDelta.x
table.insert(self.tbBannerInitPos, v.anchoredPosition)
end
self.nBannerInterval = ConfigTable.GetConfigNumber("Activity_Banner_Interval_Time")
end
function ReengagementMallCtrl:OnDisable()
self._mapNode.btnMallItem[1].onClick:RemoveAllListeners()
self._mapNode.btnMallItem[2].onClick:RemoveAllListeners()
self._mapNode.btnMallItem[3].onClick:RemoveAllListeners()
self:ResetTimer()
end
function ReengagementMallCtrl:Refresh(nCurTog)
@@ -90,22 +104,75 @@ function ReengagementMallCtrl:Refresh(nCurTog)
self:RefreshPkgItem()
end
function ReengagementMallCtrl:RefreshWeeklyCard()
local mapWeeklyCardCfg = self.actData:GetWeeklyCardData()
local mapWeeklyCardData = {}
NovaAPI.SetTMPText(self._mapNode.txtLabelValue, "")
NovaAPI.SetTMPText(self._mapNode.txtWeeklyCardDesc, "")
self._mapNode.btnReceiveWeeklyCard.gameObject:SetActive(true)
self._mapNode.btnAlreadyReceived.gameObject:SetActive(true)
self._mapNode.MallItem[1]:SetItem()
self._mapNode.MallItem[2]:SetItem()
self._mapNode.MallItem[3]:SetItem()
local mapWeeklyCard = PlayerData.Reengagement:GetWeeklyCardData()
local nActId = PlayerData.Reengagement:GetActId()
local bHasWeeklyCard = mapWeeklyCard.Id ~= nil and mapWeeklyCard.Id ~= ""
local foreach = function(mapData)
if mapData ~= nil and mapData.ReturneeId == nActId then
self.mapCurWeeklyCard = mapData
end
end
ForEachTableLine(ConfigTable.Get("ActivityReturneeCard"), foreach)
local sCanBuy = ConfigTable.GetUIText("Mall_Package_LimitTitle") .. ":1/1"
local sOut = ConfigTable.GetUIText("Mall_Package_SoldOut")
local bDisabled = mapWeeklyCard.Received or mapWeeklyCard.Remaining <= 0
NovaAPI.SetTMPText(self._mapNode.txtLabelValue, bHasWeeklyCard and sOut or sCanBuy)
NovaAPI.SetTMPText(self._mapNode.txtWeeklyCardDesc, self.mapCurWeeklyCard.Desc)
NovaAPI.SetTMPText(self._mapNode.txtWeeklyCardName, self.mapCurWeeklyCard.Name)
self._mapNode.btnReceiveWeeklyCard.gameObject:SetActive(not bDisabled and bHasWeeklyCard)
self._mapNode.btnAlreadyReceived.gameObject:SetActive(bDisabled and bHasWeeklyCard)
self._mapNode.btnBuyWeeklyCard.gameObject:SetActive(not bHasWeeklyCard)
NovaAPI.SetTMPText(self._mapNode.txtBtnBuy, self.mapCurWeeklyCard.ShowPrice)
if bHasWeeklyCard then
local sRemain = orderedFormat(ConfigTable.GetUIText("Mall_MonthlyCard_RemainDay") or "", mapWeeklyCard.Remaining)
local sReceived = ""
if mapWeeklyCard.Received then
sReceived = ConfigTable.GetUIText("Mall_MonthlyCard_Received")
else
sReceived = ConfigTable.GetUIText("Mall_MonthlyCard_Unreceived")
end
local sToday = "<color=#08D3D4>" .. sReceived .. "</color>"
if mapWeeklyCard.Remaining > 0 then
sRemain = sRemain .. " " .. sToday
end
NovaAPI.SetTMPText(self._mapNode.txtRemainDay, sRemain)
end
self._mapNode.txtRemainDay.gameObject:SetActive(bHasWeeklyCard)
self._mapNode.MallItem[1]:SetItem(self.mapCurWeeklyCard.BaseItemId, nil, self.mapCurWeeklyCard.BaseItemQty)
self._mapNode.MallItem[2]:SetItem(self.mapCurWeeklyCard.DailyItemId1, nil, self.mapCurWeeklyCard.DailyItemQty1)
self._mapNode.MallItem[3]:SetItem(self.mapCurWeeklyCard.DailyItemId2, nil, self.mapCurWeeklyCard.DailyItemQty2)
self._mapNode.btnMallItem[1].onClick:RemoveAllListeners()
self._mapNode.btnMallItem[2].onClick:RemoveAllListeners()
self._mapNode.btnMallItem[3].onClick:RemoveAllListeners()
self._mapNode.btnMallItem[1].onClick:AddListener(function()
UTILS.ClickItemGridWithTips(self.mapCurWeeklyCard.BaseItemId, self._mapNode.btnMallItem[1].transform, true, true, false)
end)
self._mapNode.btnMallItem[2].onClick:AddListener(function()
UTILS.ClickItemGridWithTips(self.mapCurWeeklyCard.DailyItemId1, self._mapNode.btnMallItem[2].transform, true, true, false)
end)
self._mapNode.btnMallItem[3].onClick:AddListener(function()
UTILS.ClickItemGridWithTips(self.mapCurWeeklyCard.DailyItemId2, self._mapNode.btnMallItem[3].transform, true, true, false)
end)
end
function ReengagementMallCtrl:RefreshPkgItem()
local nActId = PlayerData.Reengagement:GetActId()
self.tbPackagePage = {}
local foreach = function(mapData)
if mapData ~= nil and mapData.ReturneeId == nActId then
table.insert(self.tbPackagePage, mapData)
end
end
ForEachTableLine(ConfigTable.Get("ActivityReturneePack"), foreach)
table.sort(self.tbPackagePage, function(a, b)
return a.Sort < b.Sort
end)
local tbPurchasedBundles = PlayerData.Reengagement:GetPurchasedBundles()
for i = 1, 3 do
local mapData = self.tbPackagePage[i]
if mapData ~= nil then
local bPurchased = table.indexof(tbPurchasedBundles, mapData.Id) > 0
self._mapNode.PkgItem[i].gameObject:SetActive(true)
self._mapNode.PkgItem[i]:Refresh(mapData)
self._mapNode.PkgItem[i]:RefreshReengagement(mapData, bPurchased)
else
self._mapNode.PkgItem[i].gameObject:SetActive(false)
end
@@ -122,7 +189,7 @@ function ReengagementMallCtrl:SetBanner()
for _, v in ipairs(self._mapNode.imgPointBg) do
v.gameObject:SetActive(false)
end
for k, v in ipairs(self.tbBannerList) do
for k, v in pairs(self.tbBannerList) do
if nil ~= self._mapNode.imgPointBg[k] then
self._mapNode.imgPointBg[k]:SetActive(true)
self._mapNode.imgPointBg[k].transform:Find("imgPoint").gameObject:SetActive(false)
@@ -135,216 +202,6 @@ function ReengagementMallCtrl:SetBanner()
self:StartActBannerTimer()
self._mapNode.eventActBannerDrag.enabled = #self.tbBannerList > 1
end
function ReengagementMallCtrl:AddActivityBanner()
local tb_activityBanner = PlayerData.Activity:GetActivityBannerList()
for _, value in ipairs(tb_activityBanner) do
table.insert(self.tbBannerList, {
nId = value:GetActId(),
nType = GameEnum.bannerType.Activity,
actData = value,
nFuncType = GameEnum.OpenFuncType.Activity
})
end
end
function ReengagementMallCtrl:AddOtherBanner()
local nNextOpenTime = 0
local nNextCloseTime = 0
local nCurTime = CS.ClientManager.Instance.serverTimeStamp
local forEachMap = function(mapLineData)
if mapLineData.BannerType == GameEnum.bannerType.OpenFunc then
local funcNum = tonumber(mapLineData.Param1)
if funcNum == nil then
return
end
local bUnlock = PlayerData.Base:CheckFunctionUnlock(funcNum, false)
if bUnlock then
local jumpToNum = tonumber(mapLineData.Param2)
if jumpToNum == nil then
return
end
table.insert(self.tbBannerList, {
nId = mapLineData.Id,
nType = GameEnum.bannerType.OpenFunc,
sBanner = mapLineData.bannerName,
nJumpTo = jumpToNum,
nFuncType = funcNum
})
end
elseif mapLineData.BannerType == GameEnum.bannerType.Community then
local clientPublishRegion = CS.ClientConfig.ClientPublishRegion
local channelName = CS.ClientConfig.ClientPublishChannelName
if SDKManager:IsSDKInit() and clientPublishRegion == CS.ClientPublishRegion.CN and (channelName == "Official" or channelName == "TEST_1" or channelName == "Taptap") then
table.insert(self.tbBannerList, {
nId = mapLineData.Id,
nType = GameEnum.bannerType.Community,
sBanner = mapLineData.bannerName
})
end
elseif mapLineData.BannerType == GameEnum.bannerType.Payment then
if not NovaAPI.IsReviewServerEnv() then
local clientPublishRegion = CS.ClientConfig.ClientPublishRegion
local channelName = CS.ClientConfig.ClientPublishChannelName
if SDKManager:IsSDKInit() and clientPublishRegion == CS.ClientPublishRegion.CN and (channelName == "Official" or channelName == "TEST_1" or channelName == "Taptap" or channelName == "TEST_2") then
table.insert(self.tbBannerList, {
nId = mapLineData.Id,
nType = GameEnum.bannerType.Payment,
sBanner = mapLineData.bannerName
})
end
end
elseif mapLineData.BannerType == GameEnum.bannerType.Mall or mapLineData.BannerType == GameEnum.bannerType.MallSkin then
local nOpenTime = CS.ClientManager.Instance:ISO8601StrToTimeStamp(mapLineData.Param1)
local nCloseTime = CS.ClientManager.Instance:ISO8601StrToTimeStamp(mapLineData.Param2)
if nOpenTime <= nCurTime and nCloseTime >= nCurTime then
table.insert(self.tbBannerList, {
nId = mapLineData.Id,
nType = mapLineData.BannerType,
sBanner = mapLineData.bannerName,
sParam = mapLineData.Param3
})
if nCloseTime < nNextCloseTime or nNextCloseTime == 0 then
nNextCloseTime = nCloseTime
end
elseif nOpenTime > nCurTime and (nOpenTime < nNextOpenTime or nNextOpenTime == 0) then
nNextOpenTime = nOpenTime
end
elseif mapLineData.BannerType == GameEnum.bannerType.TimeLimit_Func then
local nOpenTime = CS.ClientManager.Instance:ISO8601StrToTimeStamp(mapLineData.Param1)
local nCloseTime = CS.ClientManager.Instance:ISO8601StrToTimeStamp(mapLineData.Param2)
local nJumpToId = tonumber(mapLineData.Param3)
local nFuncType = tonumber(mapLineData.Param4)
if nFuncType == nil or nJumpToId == nil then
return
end
local bUnlock = PlayerData.Base:CheckFunctionUnlock(nFuncType, false)
if bUnlock and nOpenTime <= nCurTime and nCloseTime >= nCurTime then
table.insert(self.tbBannerList, {
nId = mapLineData.Id,
nType = GameEnum.bannerType.TimeLimit_Func,
sBanner = mapLineData.bannerName,
nJumpTo = nJumpToId,
nFuncType = nFuncType
})
if nCloseTime < nNextCloseTime or nNextCloseTime == 0 then
nNextCloseTime = nCloseTime
end
elseif nOpenTime > nCurTime and (nOpenTime < nNextOpenTime or nNextOpenTime == 0) then
nNextOpenTime = nOpenTime
end
elseif mapLineData.BannerType == GameEnum.bannerType.JumpToUrl then
if NovaAPI.IsReviewServerEnv() and mapLineData.Param6 == "1" then
return
end
local sUrl = mapLineData.Param3
if sUrl == nil or sUrl == "" then
return
end
local sPlatform = mapLineData.Param4
local sOption = mapLineData.Param5
local curPlatform = CS.ClientManager.Instance.Platform
local bUseOpenUrl = mapLineData.Param7 == "1"
if mapLineData.Param1 == "" then
if sPlatform == "" then
table.insert(self.tbBannerList, {
nId = mapLineData.Id,
nType = GameEnum.bannerType.JumpToUrl,
sBanner = mapLineData.bannerName,
sUrl = sUrl,
bInside = true,
bUseOpenUrl = bUseOpenUrl
})
else
local tbPlatformList = string.split(sPlatform, ",")
local tbOptionList = string.split(sOption, ",")
local nIndex = table.indexof(tbPlatformList, curPlatform)
if nIndex ~= nil and 0 < nIndex then
local sOptionType = tbOptionList[nIndex]
local bInside = sOptionType == "0"
table.insert(self.tbBannerList, {
nId = mapLineData.Id,
nType = GameEnum.bannerType.JumpToUrl,
sBanner = mapLineData.bannerName,
sUrl = sUrl,
bInside = bInside,
bUseOpenUrl = bUseOpenUrl
})
end
end
else
local nOpenTime = CS.ClientManager.Instance:ISO8601StrToTimeStamp(mapLineData.Param1)
local nCloseTime = CS.ClientManager.Instance:ISO8601StrToTimeStamp(mapLineData.Param2)
if nOpenTime <= nCurTime and nCloseTime >= nCurTime then
if sPlatform == "" then
table.insert(self.tbBannerList, {
nId = mapLineData.Id,
nType = GameEnum.bannerType.JumpToUrl,
sBanner = mapLineData.bannerName,
sUrl = sUrl,
bInside = true,
bUseOpenUrl = bUseOpenUrl
})
else
local tbPlatformList = string.split(sPlatform, ",")
local tbOptionList = string.split(sOption, ",")
local nIndex = table.indexof(tbPlatformList, curPlatform)
if nIndex ~= nil and 0 < nIndex then
local sOptionType = tbOptionList[nIndex]
local bInside = sOptionType == "0"
table.insert(self.tbBannerList, {
nId = mapLineData.Id,
nType = GameEnum.bannerType.JumpToUrl,
sBanner = mapLineData.bannerName,
sUrl = sUrl,
bInside = bInside,
bUseOpenUrl = bUseOpenUrl
})
end
end
if nCloseTime < nNextCloseTime or nNextCloseTime == 0 then
nNextCloseTime = nCloseTime
end
elseif nOpenTime > nCurTime and (nOpenTime < nNextOpenTime or nNextOpenTime == 0) then
nNextOpenTime = nOpenTime
end
end
elseif mapLineData.BannerType == GameEnum.bannerType.SeaPayment and not NovaAPI.IsReviewServerEnv() then
local sUrl = mapLineData.Param3
if sUrl == nil or sUrl == "" then
return
end
local nOpenTime = CS.ClientManager.Instance:ISO8601StrToTimeStamp(mapLineData.Param1)
local nCloseTime = CS.ClientManager.Instance:ISO8601StrToTimeStamp(mapLineData.Param2)
if nOpenTime <= nCurTime and nCloseTime >= nCurTime then
local sPlatform = mapLineData.Param4
local sOption = mapLineData.Param5
local curPlatform = CS.ClientManager.Instance.Platform
local tbPlatformList = string.split(sPlatform, ",")
local tbOptionList = string.split(sOption, ",")
local nIndex = table.indexof(tbPlatformList, curPlatform)
local sPid = mapLineData.Param6
if nIndex ~= nil and 0 < nIndex then
local sOptionType = tbOptionList[nIndex]
local bInside = sOptionType == "0"
if SDKManager:IsSDKInit() then
table.insert(self.tbBannerList, {
nId = mapLineData.Id,
nType = GameEnum.bannerType.SeaPayment,
sBanner = mapLineData.bannerName,
sUrl = sUrl,
bInside = bInside,
sPid = sPid
})
end
end
end
end
end
ForEachTableLine(DataTable.Banner, forEachMap)
local nRefreshTime = math.min(math.max(nNextOpenTime, 0), math.max(nNextCloseTime, 0))
if 0 < nRefreshTime and nCurTime < nRefreshTime then
self.bannerRefreshTimer = self:AddTimer(1, nRefreshTime - nCurTime, "SetBanner", true, true, true)
end
end
function ReengagementMallCtrl:AddGachaBanner()
local tbOpenedPool = PlayerData.Gacha:GetOpenedPool()
local comp = function(a, b)
@@ -586,4 +443,21 @@ function ReengagementMallCtrl:ResetTimer()
self.bannerRefreshTimer = nil
end
end
function ReengagementMallCtrl:OnBtnClick_BuyWeeklyCard()
PlayerData.Reengagement:BuyWeeklyCard(self.mapCurWeeklyCard.Id, self.mapCurWeeklyCard.StatisticalGroup)
end
function ReengagementMallCtrl:OnBtnClick_ReceiveWeeklyCard()
PlayerData.Reengagement:RequestReceiveWeeklyCard()
end
function ReengagementMallCtrl:OnEvent_RefreshReengagementWeeklyCard()
self:RefreshWeeklyCard()
end
function ReengagementMallCtrl:OnBtnClick_AlreadyReceived()
end
function ReengagementMallCtrl:OnEvent_MallOrderClear()
PlayerData.Reengagement:RequestReengagementInfo(function()
self:RefreshWeeklyCard()
self:RefreshPkgItem()
end)
end
return ReengagementMallCtrl
@@ -0,0 +1,50 @@
local MallPackageDetailCtrl = import("Game.UI.Mall.MallPackageDetailCtrl")
local ReengagementMallPackageDetailCtrl = class("ReengagementMallPackageDetailCtrl", MallPackageDetailCtrl)
function ReengagementMallPackageDetailCtrl:Refresh(sPackageId)
self._sPackageId = sPackageId
local mapCfg = ConfigTable.GetData("ActivityReturneePack", sPackageId)
if not mapCfg or not PlayerData.Reengagement:GetActIsOpen() then
self:OnBtnClick_Close()
return
end
local bPurchased = table.indexof(PlayerData.Reengagement:GetPurchasedBundles(), sPackageId) > 0
local mapData = {
nCurStock = bPurchased and 0 or 1,
nNextRefreshTime = PlayerData.Reengagement:GetReengagementCloseTime(),
bPrioritizeDeList = true
}
self:PlayInAni()
self:RefreshInfo(mapCfg)
self:RefreshPrice(mapCfg)
self:RefreshLimit(mapCfg, mapData)
self:RefreshTime(mapData)
self:RefreshItem(mapCfg)
self:RefreshBuy(mapCfg, mapData)
end
function ReengagementMallPackageDetailCtrl:RefreshLimit(mapCfg, mapData)
NovaAPI.SetTMPText(self._mapNode.txtLimit, mapData.nCurStock .. "/1")
NovaAPI.SetTMPText(self._mapNode.txtLimitCn, ConfigTable.GetUIText("Mall_Package_LimitTitle"))
end
function ReengagementMallPackageDetailCtrl:OnBtnClick_Buy()
if not PlayerData.Reengagement:GetActIsOpen() then
self:OnBtnClick_Close()
return
end
local mapCfg = ConfigTable.GetData("ActivityReturneePack", self._sPackageId)
if not mapCfg then
return
end
if table.indexof(PlayerData.Reengagement:GetPurchasedBundles(), self._sPackageId) > 0 then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Mall_Package_SoldOut"))
return
end
if not PlayerData.Shop:CheckShopCond(mapCfg.OrderCondType, decodeJson(mapCfg.OrderCondParams)) then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Shop_Condition"))
return
end
PlayerData.Mall:BuyReengagementPackage(self._sPackageId, mapCfg.StatisticalGroup)
end
function ReengagementMallPackageDetailCtrl:OnBtnClick_Close()
EventManager.Hit("ReengagementMallCloseDetail")
end
return ReengagementMallPackageDetailCtrl
@@ -0,0 +1,150 @@
local ReengagementMallPackageItemCtrl = class("ReengagementMallPackageItemCtrl", BaseCtrl)
local LayoutRebuilder = CS.UnityEngine.UI.LayoutRebuilder
ReengagementMallPackageItemCtrl._mapNodeConfig = {
txtName = {sComponentName = "TMP_Text"},
imgIcon = {sComponentName = "Image"},
imgBg = {sComponentName = "Image"},
txtPrice = {sComponentName = "TMP_Text"},
txtLimit = {sComponentName = "TMP_Text"},
imgCurrency = {sComponentName = "Image"},
goCurrency = {},
goTime = {},
goCondition = {},
goSoldOut = {},
imgSoldOut = {nCount = 2},
txtRefreshTime = {sComponentName = "TMP_Text"},
txtTime = {sComponentName = "TMP_Text"},
txtSoldOut = {
nCount = 2,
sComponentName = "TMP_Text",
sLanguageId = "Mall_Package_SoldOut"
},
txtCondition = {sComponentName = "TMP_Text"},
goSaleRate = {
sComponentName = "RectTransform"
},
fxSaleRate = {sNodeName = "goSaleRate", sComponentName = "UIShiny"},
txtSaleRate = {sComponentName = "TMP_Text"},
imgMask = {},
imgSaleMask = {},
reddotPkg = {},
reddotNew = {},
btnGrid = {
sComponentName = "UIButton",
callback = "OnBtnClick_Buy"
}
}
ReengagementMallPackageItemCtrl._mapEventConfig = {}
function ReengagementMallPackageItemCtrl:RefreshReengagement(mapData, bPurchased)
self.sId = mapData.Id
self.sStatistical = mapData.StatisticalGroup
self.bPurchased = bPurchased
self:RefreshInfo(mapData, bPurchased)
self:RefreshPrice(mapData)
end
function ReengagementMallPackageItemCtrl:RefreshPrice(mapCfg)
if mapCfg.CurrencyType == GameEnum.currencyType.Cash then
self._mapNode.goCurrency:SetActive(false)
NovaAPI.SetTMPText(self._mapNode.txtPrice, tostring(mapCfg.CurrencyShowPrice))
elseif mapCfg.CurrencyType == GameEnum.currencyType.Item then
self._mapNode.goCurrency:SetActive(true)
NovaAPI.SetTMPText(self._mapNode.txtPrice, mapCfg.CurrencyItemQty)
self:SetPngSprite(self._mapNode.imgCurrency, ConfigTable.GetData_Item(mapCfg.CurrencyItemId).Icon2)
elseif mapCfg.CurrencyType == GameEnum.currencyType.Free then
self._mapNode.goCurrency:SetActive(false)
NovaAPI.SetTMPText(self._mapNode.txtPrice, ConfigTable.GetUIText("Mall_Package_Free"))
end
end
function ReengagementMallPackageItemCtrl:RefreshInfo(mapCfg, bPurchased)
NovaAPI.SetTMPText(self._mapNode.txtName, mapCfg.Name)
self:SetPngSprite(self._mapNode.imgIcon, mapCfg.Icon)
self:SetPngSprite(self._mapNode.imgBg, mapCfg.IconBg)
self._mapNode.goSaleRate.gameObject:SetActive(not bPurchased)
if mapCfg.SaleRate ~= 0 then
if mapCfg.SaleRate == -1 then
NovaAPI.SetTMPText(self._mapNode.txtSaleRate, ConfigTable.GetUIText("Mall_Package_Recommend"))
else
NovaAPI.SetTMPText(self._mapNode.txtSaleRate, string.format("%s%%", mapCfg.SaleRate))
end
end
local sLimit = bPurchased and orderedFormat(ConfigTable.GetUIText("Mall_Package_Limit") or "", 0, 1) or orderedFormat(ConfigTable.GetUIText("Mall_Package_Limit") or "", 1, 1)
NovaAPI.SetTMPText(self._mapNode.txtLimit, sLimit)
self._mapNode.imgMask:SetActive(bPurchased)
end
function ReengagementMallPackageItemCtrl:RefreshTime(mapCfg, mapData)
local bDisposable = mapCfg.RefreshType == GameEnum.mallPackageRefreshType.None
self._mapNode.goTime.gameObject:SetActive(mapData.nNextRefreshTime > 0 and bDisposable)
if mapData.nNextRefreshTime > 0 and bDisposable then
local sSuffix = mapData.bPrioritizeDeList and ConfigTable.GetUIText("Mall_Package_Delist") or ConfigTable.GetUIText("Mall_Package_Refresh")
local sPrefix
local nRemaining = mapData.nNextRefreshTime - CS.ClientManager.Instance.serverTimeStamp
if nRemaining <= 3600 then
sPrefix = ConfigTable.GetUIText("Mall_Package_WithinHour")
elseif 3600 < nRemaining and nRemaining <= 86400 then
sPrefix = orderedFormat(ConfigTable.GetUIText("Mall_Package_Hour") or "", math.floor(nRemaining / 3600))
elseif 86400 < nRemaining then
sPrefix = orderedFormat(ConfigTable.GetUIText("Mall_Package_Day") or "", math.floor(nRemaining / 86400))
end
NovaAPI.SetTMPText(self._mapNode.txtTime, sPrefix .. sSuffix)
end
end
function ReengagementMallPackageItemCtrl:RefreshCond(mapData, bPurchased)
local bShowMask = not bPurchased
self._mapNode.imgMask:SetActive(bShowMask)
self._mapNode.imgSaleMask:SetActive(bShowMask)
NovaAPI.SetComponentEnable(self._mapNode.fxSaleRate, not bShowMask)
self._mapNode.goCondition:SetActive(not bPurchased)
self._mapNode.goSoldOut:SetActive(not bPurchased)
if not bPurchaseAble then
local sCond = ""
if mapCfg.OrderCondType == GameEnum.shopCond.WorldClassSpecific then
sCond = orderedFormat(ConfigTable.GetUIText("Mall_Cond_WorldClass") or "", tbCond[1])
end
NovaAPI.SetTMPText(self._mapNode.txtCondition, sCond)
end
if bPurchased then
local bTime = mapData.nNextRefreshTime > 0
self._mapNode.imgSoldOut[1]:SetActive(not bTime)
self._mapNode.imgSoldOut[2]:SetActive(bTime)
if mapData.nNextRefreshTime > 0 then
local sPrefix
local nRemaining = mapData.nNextRefreshTime - CS.ClientManager.Instance.serverTimeStamp
if nRemaining <= 3600 then
sPrefix = ConfigTable.GetUIText("Mall_Package_WithinHourRefresh")
elseif 3600 < nRemaining and nRemaining <= 86400 then
sPrefix = orderedFormat(ConfigTable.GetUIText("Mall_Package_HourRefresh") or "", math.floor(nRemaining / 3600))
elseif 86400 < nRemaining then
sPrefix = orderedFormat(ConfigTable.GetUIText("Mall_Package_DayRefresh") or "", math.floor(nRemaining / 86400))
end
NovaAPI.SetTMPText(self._mapNode.txtRefreshTime, sPrefix)
end
end
end
function ReengagementMallPackageItemCtrl:RegisterRedDot(mapCfg)
RedDotManager.RegisterNode(RedDotDefine.FreePackage, self.sId, self._mapNode.reddotPkg)
local groupCfg = ConfigTable.GetData("MallPackagePage", mapCfg.GroupId)
if groupCfg == nil then
return
end
RedDotManager.RegisterNode(RedDotDefine.Mall_Package_New, {
AllEnum.MallToggle.Package,
groupCfg.Sort,
self.sId
}, self._mapNode.reddotNew)
end
function ReengagementMallPackageItemCtrl:Awake()
end
function ReengagementMallPackageItemCtrl:OnEnable()
end
function ReengagementMallPackageItemCtrl:OnDisable()
end
function ReengagementMallPackageItemCtrl:OnDestroy()
end
function ReengagementMallPackageItemCtrl:OnBtnClick_Buy()
if self.bPurchased then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Mall_Package_SoldOut"))
return
end
EventManager.Hit(EventId.OpenPanel, PanelId.ReengagementMallPopup, self.sId)
end
return ReengagementMallPackageItemCtrl
@@ -0,0 +1,67 @@
local ReengagementMallPopupCtrl = class("ReengagementMallPopupCtrl", BaseCtrl)
ReengagementMallPopupCtrl._mapNodeConfig = {
TopBar = {
sNodeName = "TopBarPanel",
sCtrlName = "Game.UI.TopBarEx.TopBarCtrl"
},
blur = {
sNodeName = "t_fullscreen_blur_blue"
},
aniBlur = {
sNodeName = "t_fullscreen_blur_blue",
sComponentName = "Animator"
},
btnCloseDatail = {
sNodeName = "snapshot",
sComponentName = "Button",
callback = "OnBtnClick_CloseDetail"
},
PackageDetail = {
sNodeName = "---PackageDetail---",
sCtrlName = "Game.UI.Activity.Reengagement.ReengagementMallPackageDetailCtrl"
},
ShopDetail = {
sNodeName = "---ShopDetail---"
},
FurnitureDetail = {
sNodeName = "---FurnitureDetail---"
},
FurnitureSet = {
sNodeName = "---FurnitureSet---"
}
}
ReengagementMallPopupCtrl._mapEventConfig = {
ReengagementMallCloseDetail = "OnBtnClick_CloseDetail",
MallOrderClear = "OnBtnClick_CloseDetail"
}
function ReengagementMallPopupCtrl:Awake()
self._mapNode.PackageDetail.gameObject:SetActive(false)
self._mapNode.ShopDetail:SetActive(false)
self._mapNode.FurnitureDetail:SetActive(false)
self._mapNode.FurnitureSet:SetActive(false)
self._sPackageId = self:GetPanelParam()[1]
end
function ReengagementMallPopupCtrl:OnEnable()
self._bClosing = false
self._mapNode.blur:SetActive(true)
self._mapNode.TopBar:CreateCoin({
AllEnum.CoinItemId.FREESTONE
}, true)
self._mapNode.PackageDetail:Refresh(self._sPackageId)
end
function ReengagementMallPopupCtrl:OnBtnClick_CloseDetail()
if self._bClosing then
return
end
self._bClosing = true
if self._mapNode.PackageDetail.gameObject.activeSelf then
self._mapNode.PackageDetail:PlayOutAni()
end
self._mapNode.TopBar.gameObject:SetActive(false)
self._mapNode.aniBlur:SetTrigger("tOut")
self:AddTimer(1, 0.2, function()
EventManager.Hit(EventId.ClosePanel, PanelId.ReengagementMallPopup)
end, true, true, true)
EventManager.Hit(EventId.TemporaryBlockInput, 0.2)
end
return ReengagementMallPopupCtrl
@@ -0,0 +1,9 @@
local ReengagementMallPopupPanel = class("ReengagementMallPopupPanel", BasePanel)
ReengagementMallPopupPanel._bIsMainPanel = false
ReengagementMallPopupPanel._tbDefine = {
{
sPrefabPath = "Mall/MallPopupPanel.prefab",
sCtrlName = "Game.UI.Activity.Reengagement.ReengagementMallPopupCtrl"
}
}
return ReengagementMallPopupPanel
@@ -1,6 +1,7 @@
local BasePanel = require("GameCore.UI.BasePanel")
local ReengagementPanel = class("ReengagementPanel", BasePanel)
ReengagementPanel._sUIResRootPath = "UI_Activity/"
ReengagementPanel._bIsMainPanel = true
ReengagementPanel._tbDefine = {
{
sPrefabPath = "_101004/ReengagementPanel.prefab",
@@ -0,0 +1,85 @@
local ReengagementPopUpCtrl = class("ReengagementPopUpCtrl", BaseCtrl)
local sPrefabFolder = "UI_Activity/%s.prefab"
ReengagementPopUpCtrl._mapNodeConfig = {
imgBlurredBg = {},
goContent = {
sNodeName = "---Content---"
},
PopUpRoot = {
sNodeName = "---PopUpRoot---",
sComponentName = "RectTransform"
}
}
ReengagementPopUpCtrl._mapEventConfig = {}
ReengagementPopUpCtrl._mapRedDotConfig = {}
function ReengagementPopUpCtrl:Awake()
local tbParam = self:GetPanelParam()
if type(tbParam) == "table" then
local mapData = tbParam[1]
if type(mapData) == "table" then
self.nActId = mapData.nActId or mapData[1]
else
self.nActId = mapData
end
self.callback = tbParam[2]
end
end
function ReengagementPopUpCtrl:OnEnable()
self._mapNode.goContent.gameObject:SetActive(false)
self._mapNode.PopUpRoot.gameObject:SetActive(false)
self._mapNode.imgBlurredBg.gameObject:SetActive(true)
self:ShowPopUp()
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
self._mapNode.PopUpRoot.gameObject:SetActive(self.curPopUpCtrl ~= nil)
end
cs_coroutine.start(wait)
end
function ReengagementPopUpCtrl:OnDisable()
self:ResetContent()
end
function ReengagementPopUpCtrl:OnDestroy()
end
function ReengagementPopUpCtrl:ResetContent()
if self.curPopUpCtrl ~= nil then
destroy(self.curPopUpCtrl.gameObject)
self:UnbindCtrlByNode(self.curPopUpCtrl)
end
self.curPopUpCtrl = nil
end
function ReengagementPopUpCtrl:ShowPopUp()
if self.nActId == nil then
self:ClosePopUp()
return
end
local mapPopUpCfg = ConfigTable.GetData("ActivityReturneeLoginRewardControl", self.nActId)
if mapPopUpCfg == nil or mapPopUpCfg.UIAssets == nil or mapPopUpCfg.UIAssets == "" or mapPopUpCfg.CtrlName == nil or mapPopUpCfg.CtrlName == "" then
self:ClosePopUp()
return
end
self:ResetContent()
local sPrefabPath = string.format(sPrefabFolder, mapPopUpCfg.UIAssets)
local goObj = self:CreatePrefabInstance(sPrefabPath, self._mapNode.PopUpRoot)
local sCtrlPath = string.format("Game.UI.Activity.%s", mapPopUpCfg.CtrlName)
self.curPopUpCtrl = self:BindCtrlByNode(goObj, sCtrlPath)
local callback = function(funcCall, bPauseQueue)
self:ClosePopUp(funcCall, bPauseQueue)
end
self.curPopUpCtrl:ShowPopUp(self.nActId, callback, 1)
end
function ReengagementPopUpCtrl:ClosePopUp(funcCall, bPauseQueue)
self:ResetContent()
EventManager.Hit(EventId.ClosePanel, PanelId.ReengagementPopUpPanel)
if bPauseQueue then
if funcCall ~= nil then
funcCall()
end
return
end
if self.callback ~= nil then
self.callback(funcCall)
elseif funcCall ~= nil then
funcCall()
end
end
return ReengagementPopUpCtrl
@@ -0,0 +1,109 @@
local ReengagementQuestItemCtrl = class("ReengagementQuestItemCtrl", BaseCtrl)
local JumpUtil = require("Game.Common.Utils.JumpUtil")
local LayoutRebuilder = CS.UnityEngine.UI.LayoutRebuilder
ReengagementQuestItemCtrl._mapNodeConfig = {
rtTitle = {
sComponentName = "RectTransform"
},
txtTitle = {sNodeName = "TMPTitle", sComponentName = "TMP_Text"},
rtBarFill = {
sComponentName = "RectTransform"
},
txtProcess = {sNodeName = "TMPProcess", sComponentName = "TMP_Text"},
btnReward = {
sComponentName = "UIButton",
callback = "OnBtnClick_Reward"
},
rtReward = {
sCtrlName = "Game.UI.TemplateEx.TemplateItemCtrl"
},
btnReceive = {
sComponentName = "UIButton",
callback = "OnBtnClick_Receive"
},
txtBtnReceive = {
sComponentName = "TMP_Text",
sLanguageId = "PerActivity_Quest_Receive"
},
btnJump = {
sComponentName = "UIButton",
callback = "OnBtnClick_Jump"
},
txtBtnJump = {
sComponentName = "TMP_Text",
sLanguageId = "PerActivity_Quest_Jump"
},
txtUnComplete = {
sNodeName = "TMPUncomplete",
sComponentName = "TMP_Text",
sLanguageId = "PerActivity_Quest_UnComplete"
},
imgComplete = {},
imgCompleteMask = {},
imgPoint = {}
}
ReengagementQuestItemCtrl._mapEventConfig = {}
local totalLength = 520
local totalHeight = 37
function ReengagementQuestItemCtrl:SetData(nActId, mapData)
self.nActId = nActId
self.nQuestId = mapData.Id
local tbQuest = PlayerData.Reengagement:GetQuestDataById(self.nQuestId)
if tbQuest == nil then
tbQuest = {
nStatus = 0,
Progress = {Cur = 0, Max = 1}
}
end
local nStatus = tbQuest.nStatus
local questCfg = PlayerData.Reengagement:GetQuestConfigDataById(self.nQuestId)
self.nGroupId = questCfg.GroupId
if nil ~= questCfg then
NovaAPI.SetTMPText(self._mapNode.txtTitle, questCfg.Title)
NovaAPI.SetTMPText(self._mapNode.txtProcess, string.format("%s/%s", tbQuest.Progress.Cur, tbQuest.Progress.Max))
self.nJumpTo = questCfg.JumpTo
self.rewardId = questCfg.Reward1Tid
self._mapNode.rtReward:SetItem(questCfg.Reward1Tid, nil, questCfg.Reward1Qty, nil, nil, nil, nil, true)
self._mapNode.txtUnComplete.gameObject:SetActive(nStatus == 0 and questCfg.JumpTo == 0)
self._mapNode.btnJump.gameObject:SetActive(nStatus == 0 and questCfg.JumpTo ~= 0)
self._mapNode.btnReceive.gameObject:SetActive(nStatus == 1)
self._mapNode.imgComplete.gameObject:SetActive(nStatus == 2)
self._mapNode.imgCompleteMask.gameObject:SetActive(nStatus == 2)
self._mapNode.imgPoint.gameObject:SetActive(nStatus ~= 2)
if nStatus == 2 then
NovaAPI.SetTMPText(self._mapNode.txtProcess, ConfigTable.GetUIText("PerActivity_Quest_Complete"))
self._mapNode.rtBarFill.sizeDelta = Vector2(totalLength, totalHeight)
else
self._mapNode.rtBarFill.sizeDelta = Vector2(tbQuest.Progress.Cur / tbQuest.Progress.Max * totalLength, totalHeight)
end
LayoutRebuilder.ForceRebuildLayoutImmediate(self._mapNode.rtTitle)
end
end
function ReengagementQuestItemCtrl:Awake()
end
function ReengagementQuestItemCtrl:FadeIn()
end
function ReengagementQuestItemCtrl:FadeOut()
end
function ReengagementQuestItemCtrl:OnEnable()
end
function ReengagementQuestItemCtrl:OnDisable()
end
function ReengagementQuestItemCtrl:OnDestroy()
end
function ReengagementQuestItemCtrl:OnRelease()
end
function ReengagementQuestItemCtrl:OnBtnClick_Reward(btn)
if nil ~= self.rewardId then
UTILS.ClickItemGridWithTips(self.rewardId, btn.transform, true, true, true)
end
end
function ReengagementQuestItemCtrl:OnBtnClick_Receive()
PlayerData.Reengagement:RequestReceiveQuestReward(self.nQuestId, self.nGroupId)
end
function ReengagementQuestItemCtrl:OnBtnClick_Jump()
if nil ~= self.nJumpTo and 0 ~= self.nJumpTo then
JumpUtil.JumpTo(self.nJumpTo)
end
end
return ReengagementQuestItemCtrl
@@ -40,13 +40,13 @@ ReengagementSigninCtrl._mapNodeConfig = {
}
ReengagementSigninCtrl._mapEventConfig = {}
function ReengagementSigninCtrl:Refresh(nCurTog)
if nCurTog ~= AllEnum.ReengagementTog.ShopMall then
if nCurTog ~= AllEnum.ReengagementTog.Signin then
return
end
self:InitActData()
end
function ReengagementSigninCtrl:RefreshRemainTime()
local endTime = self.actData:GetActEndTime()
local endTime = PlayerData.Reengagement:GetReengagementCloseTime()
local curTime = ClientManager.serverTimeStamp
local remainTime = endTime - curTime
if remainTime < 0 then
@@ -56,7 +56,7 @@ function ReengagementSigninCtrl:RefreshRemainTime()
nType = AllEnum.MessageBox.Alert,
sContent = ConfigTable.GetUIText("Activity_Invalid_Tip_1"),
callbackConfirm = function()
EventManager.Hit(EventId.ClosePanel, PanelId.ActivityList)
EventManager.Hit(EventId.ClosePanel, PanelId.ReengagementPanel)
end
})
return
@@ -93,17 +93,42 @@ function ReengagementSigninCtrl:RefreshRemainTime()
NovaAPI.SetTMPText(self._mapNode.txtTime, sTimeStr)
end
function ReengagementSigninCtrl:RefreshRewardList()
local canReceive = self.mapLoginRewardData.Receive > self.mapLoginRewardData.Actual
self._mapNode.btnActivity.gameObject:SetActive(canReceive)
self.nLoginRewardGroup = 0
self.tbRewardList = {}
local tbRewardList = self.actData:GetActLoginRewardList()
local tbRewardList = {}
local mapDataLoginRewardCtrl = ConfigTable.GetData("ActivityReturneeLoginRewardControl", PlayerData.Reengagement:GetActId())
if mapDataLoginRewardCtrl ~= nil then
self.nLoginRewardGroup = mapDataLoginRewardCtrl.RewardsGroup
end
local foreachfunc = function(mapData)
if mapData ~= nil and mapData.RewardGroupId == self.nLoginRewardGroup then
table.insert(tbRewardList, mapData)
end
end
ForEachTableLine(ConfigTable.Get("ActivityReturneeLoginRewardGroup"), foreachfunc)
table.sort(tbRewardList, function(a, b)
return a.Order < b.Order
end)
if nil ~= tbRewardList then
local nMaxDay = #tbRewardList
local nReceiveDay = self.actData:GetCanReceive()
local nActual = self.actData:GetReceived()
local nReceiveDay = self.mapLoginRewardData.Receive
local nActual = self.mapLoginRewardData.Actual
for k, v in ipairs(self._mapNode.goRewardItem) do
self.tbRewardList[k] = {}
local mapReward = tbRewardList[k]
v.gameObject:SetActive(mapReward ~= nil)
if mapReward ~= nil then
local Status = 0
if k <= nReceiveDay and k > nActual then
Status = 1
elseif k <= nReceiveDay and k <= nActual then
Status = 2
elseif k > nReceiveDay then
Status = 0
end
mapReward.Status = Status
v:SetRewardItem(k, mapReward, k == nMaxDay, nReceiveDay == nActual and k == nActual + 1)
for i = 1, 3 do
local nTid = mapReward["RewardId" .. i]
@@ -117,12 +142,9 @@ function ReengagementSigninCtrl:RefreshRewardList()
end
end
function ReengagementSigninCtrl:InitActData()
local actData = {}
self.actData = actData
self:RefreshRewardList()
local canReceive = self.actData:CheckCanReceive()
self._mapNode.btnActivity.gameObject:SetActive(canReceive)
self.mapLoginRewardData = PlayerData.Reengagement:GetActLoginRewardList()
self._mapNode.imgRemaineTime.gameObject:SetActive(true)
self:RefreshRewardList()
self:RefreshRemainTime()
if nil == self.remainTimer then
self.remainTimer = self:AddTimer(0, 1, "RefreshRemainTime", true, true, false)
@@ -137,43 +159,54 @@ end
function ReengagementSigninCtrl:OnDestroy()
end
function ReengagementSigninCtrl:OnBtnClick_Detail()
local mapActCfg = self.actData:GetLoginRewardControlCfg()
local mapActData = ConfigTable.GetData("ActivityReturneeReunionReward", PlayerData.Reengagement:GetActId())
if mapActData == nil then
return
end
local tbRewards = {}
for i = 1, 3 do
local nId = mapActData["Reward" .. i .. "Tid"]
local nQty = mapActData["Reward" .. i .. "Qty"]
if 0 < nId then
table.insert(tbRewards, {
nId = nId,
nCount = nQty,
bReceived = true
})
end
end
local msg = {
nType = AllEnum.MessageBox.Desc,
sContent = mapActCfg.DesText,
sTitle = ConfigTable.GetUIText("Activity_Btn_Detail")
nType = AllEnum.MessageBox.ItemList,
tbItem = tbRewards,
bBlur = true
}
EventManager.Hit(EventId.OpenMessageBox, msg)
end
function ReengagementSigninCtrl:OnBtnClick_Item(btn, nIndex)
if self.tbRewardList[nIndex] ~= nil then
if #self.tbRewardList[nIndex] == 1 then
if nIndex < self.mapLoginRewardData.Actual or self.mapLoginRewardData.Actual == self.mapLoginRewardData.Receive then
local nTid = self.tbRewardList[nIndex][1].nTid
UTILS.ClickItemGridWithTips(nTid, btn.gameObject.transform, true, true, false)
else
local tbReward = {}
for _, v in ipairs(self.tbRewardList[nIndex]) do
local rewardData = {
[1] = v.nTid,
[5] = v.nCount
}
table.insert(tbReward, rewardData)
end
EventManager.Hit("ShowActRewardList", tbReward)
PlayerData.Reengagement:RequestReceiveLoginReward(function()
self:RefreshRewardList()
end)
end
end
end
function ReengagementSigninCtrl:OnBtnClick_Activity()
local callback = function()
self._mapNode.btnActivity.gameObject:SetActive(false)
local actData = PlayerData.Activity:GetActivityDataById(self.actData:GetActId())
self:InitActData(actData)
if self.mapLoginRewardData.Actual < self.mapLoginRewardData.Receive then
PlayerData.Reengagement:RequestReceiveLoginReward(function()
self:RefreshRewardList()
end)
end
local canReceive = self.actData:CheckCanReceive()
if not canReceive then
callback()
return
end
function ReengagementSigninCtrl:OnBtnClick_Play()
local mapActData = ConfigTable.GetData("ActivityReturnee", PlayerData.Reengagement:GetActId())
local sAvgId
if mapActData ~= nil and mapActData.AVG ~= nil then
sAvgId = mapActData.AVG
end
PlayerData.Activity:SendReceiveLoginRewardMsg(self.actData:GetActId(), callback)
EventManager.Hit("StoryDialog_DialogStart", sAvgId, Settings.sCurrentTxtLanguage, Settings.sCurrentVoLanguage)
end
return ReengagementSigninCtrl
@@ -34,14 +34,6 @@ ReengagementTaskCtrl._mapNodeConfig = {
sComponentName = "TMP_Text",
sLanguageId = "Activity_Btn_Detail"
},
btnQuickRec = {
sComponentName = "UIButton",
callback = "OnBtnClick_QuickRec"
},
txtBtnQuickRec = {
sComponentName = "TMP_Text",
sLanguageId = "Activity_Btn_Quick_Receive"
},
goActTime = {},
txtActivityTime = {sComponentName = "TMP_Text"},
txtActValue = {sComponentName = "TMP_Text"},
@@ -52,17 +44,27 @@ ReengagementTaskCtrl._mapNodeConfig = {
nCount = 7,
sComponentName = "UIButton",
callback = "OnBtnClick_NodeItem"
},
item = {
nCount = 7,
sCtrlName = "Game.UI.TemplateEx.TemplateItemCtrl"
}
}
ReengagementTaskCtrl._mapEventConfig = {}
ReengagementTaskCtrl._mapEventConfig = {
RefreshReengagementQuest = "RefreshQuestList",
RefreshReengagementQuestPoint = "RefreshActivityNode",
RefreshReengagementGroup = "OnRefreshGroup"
}
function ReengagementTaskCtrl:Refresh(nCurTog)
if nCurTog ~= AllEnum.ReengagementTog.Task then
return
end
self:InitActData()
self:RefreshQuestList()
self:RefreshActivityNode()
end
function ReengagementTaskCtrl:RefreshRemainTime()
local endTime = self.actData:GetActEndTime()
local endTime = PlayerData.Reengagement:GetReengagementCloseTime()
local curTime = CS.ClientManager.Instance.serverTimeStamp
local remainTime = endTime - curTime
if remainTime < 0 then
@@ -72,7 +74,7 @@ function ReengagementTaskCtrl:RefreshRemainTime()
nType = AllEnum.MessageBox.Alert,
sContent = ConfigTable.GetUIText("Activity_Invalid_Tip_1"),
callbackConfirm = function()
EventManager.Hit(EventId.ClosePanel, PanelId.ActivityList)
EventManager.Hit(EventId.ClosePanel, PanelId.ReengagementPanel)
end
})
return
@@ -108,66 +110,83 @@ function ReengagementTaskCtrl:RefreshRemainTime()
end
NovaAPI.SetTMPText(self._mapNode.txtActivityTime, orderedFormat(ConfigTable.GetUIText("PerActivity_Remain_Time") or "", sTimeStr))
end
local tbConvertStatus = {
[0] = 1,
[1] = 0,
[2] = 2
}
function ReengagementTaskCtrl:RefreshQuestList()
self.tbAllQuestList = self.actData:GetQuestListByGroup()
if nil == self.tbAllQuestList[self._panel.nSelectGroup] then
printLog(string.format("任务列表为空!!!actId = %s, group = %s", self.nActId, self._panel.nSelectGroup))
return
end
self.tbQuestList = self.tbAllQuestList[self._panel.nSelectGroup]
table.sort(self.tbQuestList, function(a, b)
if a.nStatus == b.nStatus then
local nGroupId = 100 + (self._panel.nSelectGroup or 1)
self.tbQuestList = PlayerData.Reengagement:GetQuestListByGroup(nGroupId)
self.tbQuestData = PlayerData.Reengagement:GetQuestConfigDataByGroup(nGroupId)
table.sort(self.tbQuestData, function(a, b)
if not self.tbQuestList[a.Id] or not self.tbQuestList[b.Id] then
return a.Id < b.Id
end
return a.nStatus < b.nStatus
if self.tbQuestList[a.Id].nStatus == self.tbQuestList[b.Id].nStatus then
return a.Id < b.Id
end
return tbConvertStatus[self.tbQuestList[a.Id].nStatus] < tbConvertStatus[self.tbQuestList[b.Id].nStatus]
end)
for k, v in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(v)
self.tbGridCtrl[k] = nil
end
if nil ~= self.tbQuestList then
if #self.tbQuestData > 0 then
self.nPageCount = 0
self._mapNode.loopSv:SetAnim(0.06)
self._mapNode.loopSv:Init(#self.tbQuestList, self, self.OnGridRefresh, nil, false, self.GetGridPageCount)
self._mapNode.loopSv:Init(#self.tbQuestData, self, self.OnGridRefresh, nil, false, self.GetGridPageCount)
EventManager.Hit(EventId.TemporaryBlockInput, 0.2)
end
local _, _, canReceive = self.actData:GetQuestProgress()
self._mapNode.btnQuickRec.gameObject:SetActive(0 < canReceive)
for k, v in ipairs(self._mapNode.PerActGroupItem) do
local nAllQuest, nReceivedQuest = self.actData:GetDayQuestStatus(k)
v:RefreshStatus(nAllQuest <= nReceivedQuest and 0 < nReceivedQuest)
local bAllReceived = PlayerData.Reengagement:IsQuestGroupAllReceived(k)
v:RefreshStatus(bAllReceived)
end
end
function ReengagementTaskCtrl:GetGridPageCount(pageCount)
self.nPageCount = pageCount > #self.tbQuestList and #self.tbQuestList or pageCount
end
function ReengagementTaskCtrl:InitGroupList()
local nCurDay = self.actData:GetCurOpenDay()
self.nMaxOpenGroup = 0
self.tbGroupList = {}
local foreachtabelline = function(mapData)
if mapData.ReturneeId == self.nActId then
table.insert(self.tbGroupList, mapData)
end
end
ForEachTableLine(ConfigTable.Get("ActivityReturneeQuestGroup"), foreachtabelline)
local tbNextOpenGroupList = {}
if nil ~= CacheTable.GetData("_PeriodicQuestGroup", self.nActId) then
local tbGroup = CacheTable.GetData("_PeriodicQuestGroup", self.nActId)[nCurDay]
if nil ~= tbGroup then
for _, v in ipairs(tbGroup) do
if v > self.nMaxOpenGroup then
self.nMaxOpenGroup = v
end
end
end
if nil ~= CacheTable.GetData("_PeriodicQuestGroup", self.nActId)[nCurDay + 1] then
for _, v in ipairs(CacheTable.GetData("_PeriodicQuestGroup", self.nActId)[nCurDay + 1]) do
tbNextOpenGroupList[v] = 1
end
local nEventOpenTime = PlayerData.Reengagement:GetReengagementOpenTime()
local nCurTime = CS.ClientManager.Instance.serverTimeStamp
self.nCurDay = 0
if nil ~= nEventOpenTime and 0 < nEventOpenTime and nEventOpenTime < nCurTime then
local nOpenDayStartTime = CS.ClientManager.Instance:GetNextRefreshTime(nEventOpenTime) - 86400
self.nCurDay = math.floor((nCurTime - nOpenDayStartTime) / 86400)
end
for _, v in ipairs(self.tbGroupList) do
local nOpenDay = v.DayOpen
if nOpenDay <= self.nCurDay then
self.nMaxOpenGroup = math.max(self.nMaxOpenGroup, v.Id - 100)
elseif nOpenDay == self.nCurDay + 1 then
tbNextOpenGroupList[v.Id] = 1
end
end
local nSelectGroup = self.actData:GetCanReceiveRewardGroup()
if 0 == nSelectGroup then
nSelectGroup = self.nMaxOpenGroup
local nRedDotGroup = 0
for _, mapGroup in ipairs(self.tbGroupList) do
if mapGroup.DayOpen <= self.nCurDay and RedDotManager.GetValid(RedDotDefine.Activity_Reengagement_Task_Group, {
self.nActId,
mapGroup.Id
}) then
nRedDotGroup = math.max(nRedDotGroup, mapGroup.Id - 100)
end
end
local nSelectGroup = 0 < nRedDotGroup and nRedDotGroup or math.max(1, self.nMaxOpenGroup)
for k, v in ipairs(self._mapNode.PerActGroupItem) do
v:Init(self.nActId, k, self.nMaxOpenGroup)
if nil ~= tbNextOpenGroupList[k] then
local nHour = self.actData:GetNextDayOpenTime()
local bAllReceived = PlayerData.Reengagement:IsQuestGroupAllReceived(k)
v:Init(self.nActId, k, self.nMaxOpenGroup, bAllReceived)
if nil ~= tbNextOpenGroupList[k + 100] then
local nNextRefreshTime = CS.ClientManager.Instance:GetNextRefreshTime(nCurTime)
local nHour = math.floor((nNextRefreshTime - nCurTime) / 3600)
if nHour < 1 then
v:SetTime(orderedFormat(ConfigTable.GetUIText("PerActivity_Quest_Open_Time_2") or "", 1))
else
@@ -175,58 +194,62 @@ function ReengagementTaskCtrl:InitGroupList()
end
end
end
if nil == self._panel.nSelectGroup then
if nil == self._panel.nSelectGroup or 0 >= self._panel.nSelectGroup or self._panel.nSelectGroup > self.nMaxOpenGroup then
self._panel.nSelectGroup = nSelectGroup
end
self._mapNode.PerActGroupItem[self._panel.nSelectGroup]:SetSelect(true)
if nil ~= self._mapNode.PerActGroupItem[self._panel.nSelectGroup] then
self._mapNode.PerActGroupItem[self._panel.nSelectGroup]:SetSelect(true)
end
end
function ReengagementTaskCtrl:OnGridRefresh(goGrid, gridIndex)
local nIndex = gridIndex + 1
local nInstanceId = goGrid:GetInstanceID()
if not self.tbGridCtrl[nInstanceId] then
self.tbGridCtrl[nInstanceId] = self:BindCtrlByNode(goGrid, "Game.UI.Activity.PeriodicQuest.PeriodicQuestItemCtrl")
self.tbGridCtrl[nInstanceId] = self:BindCtrlByNode(goGrid, "Game.UI.Activity.Reengagement.ReengagementQuestItemCtrl")
end
self.tbGridCtrl[nInstanceId]:SetData(self.nActId, self.tbQuestList[nIndex])
self.tbGridCtrl[nInstanceId]:SetData(self.nActId, self.tbQuestData[nIndex])
end
local totalLength = 816
local totalNodeLength = 136
local actNodeItemHeight = 152
local totalHeight = 20
function ReengagementTaskCtrl:RefreshActivityNode()
NovaAPI.SetTMPText(self._mapNode.txtActValue, self.nActiveCount)
local bAllComplete = self.nActiveCount >= self.nTotalActiveCount
self.tbQuestActive = {}
self.nTotalActiveCount = 0
local ForeachActivity = function(mapData)
table.insert(self.tbQuestActive, mapData)
if mapData.ReturneeId == self.nActId then
table.insert(self.tbQuestActive, mapData)
end
end
ForEachTableLine(ConfigTable.Get("DailyQuestActive"), ForeachActivity)
ForEachTableLine(ConfigTable.Get("ActivityReturneeQuestPoint"), ForeachActivity)
table.sort(self.tbQuestActive, function(a, b)
return a.Active < b.Active
return a.Point < b.Point
end)
local nMaxAct = self.tbQuestActive[#self.tbQuestActive].Active
self.tbCanReceiveAct = {}
local nMaxAct = self.tbQuestActive[#self.tbQuestActive].Point
self.nTotalActiveCount = nMaxAct
self.nActiveCount = PlayerData.Reengagement:GetQuestPointInfo().Point or 0
NovaAPI.SetTMPText(self._mapNode.txtActValue, self.nActiveCount)
for k, v in ipairs(self.tbQuestActive) do
if self._mapNode.btnNodeItem[k] ~= nil then
local bReceived = PlayerData.Reengagement:CheckPointRewardReceived(v.Index)
self._mapNode.item[k]:SetItem(v.Reward1Tid, nil, v.Reward1Qty, nil, bReceived)
local node = self._mapNode.btnNodeItem[k]
local nPosX = math.min(k / #self.tbQuestActive * totalNodeLength, totalNodeLength)
node.transform:GetComponent("RectTransform").anchoredPosition = Vector2(nPosX, actNodeItemHeight)
node.gameObject:SetActive(true)
local txtNodeAct = node.transform:Find("AnimRoot/goNodeItem/txtNodeAct"):GetComponent("TMP_Text")
NovaAPI.SetTMPText(txtNodeAct, v.Active)
local imgNodeAct1 = node.transform:Find("AnimRoot/goNodeItem/imgNumNml")
local imgNodeAct2 = node.transform:Find("AnimRoot/goNodeItem/imgNumSel")
local txtNodeAct1 = node.transform:Find("AnimRoot/goNodeItem/imgNumNml/txtNmlValue"):GetComponent("TMP_Text")
local txtNodeAct2 = node.transform:Find("AnimRoot/goNodeItem/imgNumSel/txtSelValue"):GetComponent("TMP_Text")
NovaAPI.SetTMPText(txtNodeAct1, v.Point)
NovaAPI.SetTMPText(txtNodeAct2, v.Point)
local anim = node.transform:Find("AnimRoot"):GetComponent("Animator")
local imgGift = node.transform:Find("AnimRoot/goNodeItem/imgGift")
local imgComplete = node.transform:Find("AnimRoot/goNodeItem/imgComplete")
local goParticle1 = node.transform:Find("AnimRoot/goNodeItem/UIParticle1")
local goParticle2 = node.transform:Find("AnimRoot/goNodeItem/UIParticle2")
local bReceived = PlayerData.Quest:CheckDailyActiveReceive(v.Id)
local bComplete = v.Active <= self.nActiveCount
imgGift.gameObject:SetActive(not bReceived)
imgComplete.gameObject:SetActive(bReceived)
local bComplete = v.Point <= self.nActiveCount and not bReceived
imgNodeAct1.gameObject:SetActive(not bReceived)
imgNodeAct2.gameObject:SetActive(bReceived)
goParticle1.gameObject:SetActive(not bReceived and bComplete)
goParticle2.gameObject:SetActive(not bReceived and bComplete)
if bComplete and not bReceived then
table.insert(self.tbCanReceiveAct, k)
end
if not bReceived and bComplete then
anim:Play("Quest_btnNodeComplete_loop", 0, 0)
else
@@ -234,38 +257,27 @@ function ReengagementTaskCtrl:RefreshActivityNode()
end
end
end
self._mapNode.btnActReceive.gameObject:SetActive(#self.tbCanReceiveAct > 0)
self._mapNode.txtActComplete.gameObject:SetActive(bAllComplete and not (#self.tbCanReceiveAct > 0))
self._mapNode.btnActReceiveGray.gameObject:SetActive(not bAllComplete and not (#self.tbCanReceiveAct > 0))
local nWidth = math.min(self.nActiveCount / nMaxAct * totalLength, totalLength)
self._mapNode.rtActProgressFill.sizeDelta = Vector2(nWidth, totalHeight)
end
function ReengagementTaskCtrl:InitActData(actData, bResetGroup)
self.actData = actData
if bResetGroup then
function ReengagementTaskCtrl:InitActData(bResetGroup)
if bResetGroup or self._panel.nSelectGroup == nil or self._panel.nSelectGroup == 0 then
self._panel.nSelectGroup = nil
end
self.nActId = actData:GetActId()
self.nActId = PlayerData.Reengagement:GetActId()
self.bQuestAnim = false
self:InitGroupList()
local tbAllQuestList = self.actData:GetQuestListByGroup()
if nil == tbAllQuestList[self._panel.nSelectGroup] then
if nil == PlayerData.Reengagement:GetQuestListByGroup(self._panel.nSelectGroup + 100) then
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Tips,
sContent = ConfigTable.GetUIText("Activity_Invalid_Tip_1")
})
EventManager.Hit(EventId.ClosePanel, PanelId.ActivityList)
return
end
local actCfg = self.actData:GetActCfgData()
if actCfg.EndType == GameEnum.activityEndType.NoLimit then
self._mapNode.goActTime.gameObject:SetActive(false)
else
self._mapNode.goActTime.gameObject:SetActive(true)
self:RefreshRemainTime()
if nil == self.remainTimer then
self.remainTimer = self:AddTimer(0, 1, "RefreshRemainTime", true, true, false)
end
self._mapNode.goActTime.gameObject:SetActive(true)
self:RefreshRemainTime()
if nil == self.remainTimer then
self.remainTimer = self:AddTimer(0, 1, "RefreshRemainTime", true, true, false)
end
end
function ReengagementTaskCtrl:Awake()
@@ -289,6 +301,10 @@ function ReengagementTaskCtrl:OnDestroy()
end
function ReengagementTaskCtrl:OnRelease()
end
function ReengagementTaskCtrl:OnRefreshGroup()
self:InitGroupList()
self:RefreshRemainTime()
end
function ReengagementTaskCtrl:OnBtnClick_Group(_, nIndex)
if self._panel.nSelectGroup == nIndex then
return
@@ -296,7 +312,7 @@ function ReengagementTaskCtrl:OnBtnClick_Group(_, nIndex)
if nIndex > self.nMaxOpenGroup then
return
end
if nil == self.tbAllQuestList[nIndex] or nil == next(self.tbAllQuestList[nIndex]) then
if nil == PlayerData.Reengagement:GetQuestConfigDataByGroup(nIndex + 100) or nil == next(PlayerData.Reengagement:GetQuestConfigDataByGroup(nIndex + 100)) then
printError(string.format("当前任务组下没有任务!!! 活动id = %d, 任务组 = %s", self.nActId, nIndex))
return
end
@@ -312,7 +328,7 @@ function ReengagementTaskCtrl:OnBtnClick_GroupLock()
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("PerActivity_Not_Open"))
end
function ReengagementTaskCtrl:OnBtnClick_Detail()
local perQuestActCfg = self.actData:GetPerQuestCfg()
local perQuestActCfg = PlayerData.Reengagement:GetActDetail(AllEnum.ReengagementTog.Task)
local msg = {
nType = AllEnum.MessageBox.Desc,
sContent = perQuestActCfg.DesText,
@@ -320,11 +336,16 @@ function ReengagementTaskCtrl:OnBtnClick_Detail()
}
EventManager.Hit(EventId.OpenMessageBox, msg)
end
function ReengagementTaskCtrl:OnBtnClick_QuickRec()
local callback = function()
EventManager.Hit("RefreshPeriodicAct", self.nActId)
PlayerData.Base:TryOpenWorldClassUpgrade()
function ReengagementTaskCtrl:OnBtnClick_NodeItem(btn, index)
if PlayerData.Reengagement:CheckPointRewardReceived(index) then
UTILS.ClickItemGridWithTips(self.tbQuestActive[index].Reward1Tid, btn.transform, true, true, false)
return
end
if self.nActiveCount >= self.tbQuestActive[index].Point then
PlayerData.Reengagement:RequestReceiveQuestPointReward(index)
else
UTILS.ClickItemGridWithTips(self.tbQuestActive[index].Reward1Tid, btn.transform, true, true, false)
return
end
PlayerData.Activity:SendReceivePerQuest(self.nActId, 0, callback)
end
return ReengagementTaskCtrl
@@ -10,9 +10,10 @@ ReengagementTaskGroupCtrl._mapNodeConfig = {
imgComplete = {}
}
ReengagementTaskGroupCtrl._mapEventConfig = {}
function ReengagementTaskGroupCtrl:Init(nActId, nGroup, nCurGroup)
function ReengagementTaskGroupCtrl:Init(nActId, nGroup, nCurGroup, bAllReceived)
self.nActId = nActId
self.nGroup = nGroup
self.nGroupId = 100 < nGroup and nGroup or nGroup + 100
for _, v in ipairs(self._mapNode.txt_Group) do
NovaAPI.SetTMPText(v, self.nGroup)
end
@@ -23,14 +24,17 @@ function ReengagementTaskGroupCtrl:Init(nActId, nGroup, nCurGroup)
self._mapNode.redDotGroup.gameObject:SetActive(false)
self.bUnlock = nGroup <= nCurGroup
self:SetSelect(false)
self._mapNode.imgComplete.gameObject:SetActive(bAllReceived)
self._mapNode.goNormal.gameObject:SetActive(nGroup <= nCurGroup)
self._mapNode.goLock.gameObject:SetActive(nCurGroup < nGroup)
self:RegisterRedDot()
if nGroup <= nCurGroup then
self:RegisterRedDot()
end
end
function ReengagementTaskGroupCtrl:RegisterRedDot()
RedDotManager.RegisterNode(RedDotDefine.Activity_Reengagement_Task_Group, {
self.nActId,
self.nGroup
self.nGroupId
}, self._mapNode.redDotGroup)
end
function ReengagementTaskGroupCtrl:SetTime(sTime)
@@ -43,7 +47,7 @@ function ReengagementTaskGroupCtrl:SetSelect(bSelect)
self._mapNode.goSelect.gameObject:SetActive(self.bSelect)
end
function ReengagementTaskGroupCtrl:RefreshStatus(bAllReceived)
self._mapNode.imgComplete.gameObject:SetActive(bAllReceived and self.bUnlock)
self._mapNode.imgComplete.gameObject:SetActive(bAllReceived)
end
function ReengagementTaskGroupCtrl:Awake()
end
@@ -0,0 +1,94 @@
local TemplateToggleReengagementCtrl = class("TemplateToggleReengagementCtrl", BaseCtrl)
TemplateToggleReengagementCtrl._mapNodeConfig = {
AnimSwitch = {sComponentName = "Animator"},
txt_Select = {sComponentName = "TMP_Text"},
txt_unSelect = {sComponentName = "TMP_Text"},
Select = {},
unSelect = {},
reddotTog = {}
}
TemplateToggleReengagementCtrl._mapEventConfig = {}
function TemplateToggleReengagementCtrl:SetText(sText)
NovaAPI.SetTMPText(self._mapNode.txt_Select, sText)
NovaAPI.SetTMPText(self._mapNode.txt_unSelect, sText)
end
function TemplateToggleReengagementCtrl:SetDefault(bOn)
if self._mapNode.AnimSwitch.enabled == true then
self._mapNode.AnimSwitch.enabled = false
end
self._mapNode.Select:SetActive(bOn)
self._mapNode.unSelect:SetActive(not bOn)
self._mapNode.txt_Select.gameObject:SetActive(bOn)
self._mapNode.txt_unSelect.gameObject:SetActive(not bOn)
NovaAPI.SetTMPColor(self._mapNode.txt_Select, White_Normal)
NovaAPI.SetTMPColor(self._mapNode.txt_unSelect, Blue_Normal)
end
function TemplateToggleReengagementCtrl:SetDefaultDorm(bOn)
if self._mapNode.AnimSwitch.enabled == true then
self._mapNode.AnimSwitch.enabled = false
end
self._mapNode.Select:SetActive(bOn)
self._mapNode.unSelect:SetActive(not bOn)
self._mapNode.txt_Select.gameObject:SetActive(bOn)
self._mapNode.txt_unSelect.gameObject:SetActive(not bOn)
end
function TemplateToggleReengagementCtrl:SetDefaultAct10101(bOn)
if self._mapNode.AnimSwitch.enabled == true then
self._mapNode.AnimSwitch.enabled = false
end
self._mapNode.Select:SetActive(bOn)
self._mapNode.unSelect:SetActive(not bOn)
self._mapNode.txt_Select.gameObject:SetActive(bOn)
self._mapNode.txt_unSelect.gameObject:SetActive(not bOn)
NovaAPI.SetTMPColor(self._mapNode.txt_Select, Color(1, 1, 1, 1))
NovaAPI.SetTMPColor(self._mapNode.txt_unSelect, Color(0.2196078431372549, 0.1803921568627451, 0.1450980392156863, 1))
end
function TemplateToggleReengagementCtrl:SetDefaultActivity(bOn, colorSelect, colorUnSelect)
if self._mapNode.AnimSwitch.enabled == true then
self._mapNode.AnimSwitch.enabled = false
end
self._mapNode.Select:SetActive(bOn)
self._mapNode.unSelect:SetActive(not bOn)
self._mapNode.txt_Select.gameObject:SetActive(bOn)
self._mapNode.txt_unSelect.gameObject:SetActive(not bOn)
if colorSelect ~= nil then
NovaAPI.SetTMPColor(self._mapNode.txt_Select, colorSelect)
NovaAPI.SetTMPColor(self._mapNode.txt_unSelect, colorUnSelect)
end
end
function TemplateToggleReengagementCtrl:SetTrigger(bOn)
if self._mapNode.AnimSwitch.enabled == false then
self._mapNode.AnimSwitch.enabled = true
end
if bOn then
self._mapNode.AnimSwitch:SetTrigger("tOn")
else
self._mapNode.AnimSwitch:SetTrigger("tOff")
end
end
function TemplateToggleReengagementCtrl:ResetTrigger()
if self._mapNode.AnimSwitch.enabled == false then
self._mapNode.AnimSwitch.enabled = true
end
self._mapNode.AnimSwitch:ResetTrigger("tOff")
end
function TemplateToggleReengagementCtrl:SetReddot(sKey, param)
self:UnRegisterReddot()
if sKey == nil then
return
end
self.sReddotKey = sKey
self.mapReddotParam = param
RedDotManager.RegisterNode(sKey, param, self._mapNode.reddotTog)
end
function TemplateToggleReengagementCtrl:UnRegisterReddot()
if self.sReddotKey ~= nil then
RedDotManager.UnRegisterNode(self.sReddotKey, self.mapReddotParam, self._mapNode.reddotTog)
end
self.sReddotKey = nil
self.mapReddotParam = nil
end
function TemplateToggleReengagementCtrl:OnEnable()
self._mapNode.reddotTog:SetActive(false)
end
return TemplateToggleReengagementCtrl