46f967a584
EN: 1.6.0.84 CN: 1.6.0.87 JP: 1.6.0.88 KR: 1.6.0.91
394 lines
15 KiB
Lua
394 lines
15 KiB
Lua
local PhoneDatingCtrl = class("PhoneDatingCtrl", BaseCtrl)
|
|
local LocalData = require("GameCore.Data.LocalData")
|
|
local newDayTime = UTILS.GetDayRefreshTimeOffset()
|
|
PhoneDatingCtrl._mapNodeConfig = {
|
|
txtDatingTime = {sComponentName = "TMP_Text"},
|
|
imgHeadIcon = {sComponentName = "Image"},
|
|
txtCharName = {sComponentName = "TMP_Text"},
|
|
imgForce = {sComponentName = "Image"},
|
|
goAffinityProgress = {},
|
|
rectProgress = {
|
|
sNodeName = "imgProgress",
|
|
sComponentName = "RectTransform"
|
|
},
|
|
txtProgress = {sComponentName = "TMP_Text"},
|
|
imgAffinity = {sComponentName = "Image"},
|
|
txtLevel = {sComponentName = "TMP_Text"},
|
|
txtAffinity = {sComponentName = "TMP_Text"},
|
|
txtTitle = {
|
|
sComponentName = "TMP_Text",
|
|
sLanguageId = "Phone_Dating_Special_Event_Title"
|
|
},
|
|
datingEventLSV = {
|
|
sComponentName = "LoopScrollView"
|
|
},
|
|
btnCharDetail = {
|
|
sComponentName = "UIButton",
|
|
callback = "OnBtnClick_CharDetail"
|
|
},
|
|
txtBtnCharDetail = {
|
|
sComponentName = "TMP_Text",
|
|
sLanguageId = "Phone_Dating_Char_Detail_Btn"
|
|
},
|
|
btnStartDating = {
|
|
sComponentName = "UIButton",
|
|
callback = "OnBtnClick_StartDating"
|
|
},
|
|
txtBtnStartDating = {
|
|
sComponentName = "TMP_Text",
|
|
sLanguageId = "Phone_Dating_Start_Dating_Btn"
|
|
},
|
|
btnDatingGray = {
|
|
sComponentName = "UIButton",
|
|
callback = "OnBtnClick_DatingGray"
|
|
},
|
|
txtBtnDatingGray = {
|
|
sComponentName = "TMP_Text",
|
|
sLanguageId = "Phone_Char_Dating_Count_Max"
|
|
},
|
|
goEventDetail = {},
|
|
goBlur = {},
|
|
goWindow = {},
|
|
aniWindow = {sNodeName = "goWindow", sComponentName = "Animator"},
|
|
btnBg = {
|
|
sComponentName = "Button",
|
|
callback = "OnBtnClick_Close"
|
|
},
|
|
txtWindowTitle = {
|
|
sComponentName = "TMP_Text",
|
|
sLanguageId = "Phone_Dating_Event_Window_Title"
|
|
},
|
|
imgChar = {sComponentName = "Image"},
|
|
imgSpCg = {sComponentName = "Image"},
|
|
txtLandmark = {sComponentName = "TMP_Text"},
|
|
txtEventName = {sComponentName = "TMP_Text"},
|
|
txtDesc = {sComponentName = "TMP_Text"},
|
|
btnReward = {
|
|
sComponentName = "UIButton",
|
|
callback = "OnBtnClick_Reward"
|
|
},
|
|
btnLeft = {
|
|
sComponentName = "UIButton",
|
|
callback = "OnBtnClick_Left"
|
|
},
|
|
btnRight = {
|
|
sComponentName = "UIButton",
|
|
callback = "OnBtnClick_Right"
|
|
},
|
|
goPageDot = {},
|
|
goPage = {nCount = 8},
|
|
btnClose = {
|
|
sComponentName = "UIButton",
|
|
callback = "OnBtnClick_Close"
|
|
}
|
|
}
|
|
PhoneDatingCtrl._mapEventConfig = {}
|
|
PhoneDatingCtrl._mapRedDotConfig = {}
|
|
function PhoneDatingCtrl:Refresh(nCharId)
|
|
self.nCharId = nCharId
|
|
local mapCharacter = ConfigTable.GetData_Character(nCharId)
|
|
if mapCharacter ~= nil then
|
|
local nSkinId = mapCharacter.DefaultSkinId
|
|
local mapSkin = ConfigTable.GetData_CharacterSkin(nSkinId)
|
|
if mapSkin ~= nil then
|
|
self:SetPngSprite(self._mapNode.imgHeadIcon, mapSkin.Icon, AllEnum.CharHeadIconSurfix.S)
|
|
end
|
|
NovaAPI.SetTMPText(self._mapNode.txtCharName, mapCharacter.Name)
|
|
local mapCharDes = ConfigTable.GetData("CharacterDes", nCharId)
|
|
if mapCharDes then
|
|
local mapForceCfg = ConfigTable.GetData("Force", mapCharDes.Force)
|
|
if mapForceCfg ~= nil then
|
|
end
|
|
end
|
|
end
|
|
self._mapNode.goEventDetail.gameObject:SetActive(false)
|
|
local nCount, nAllCount = PlayerData.Dating:GetDatingCount()
|
|
NovaAPI.SetTMPText(self._mapNode.txtDatingTime, orderedFormat(ConfigTable.GetUIText("Dating_Day_Count"), nCount, nAllCount))
|
|
local bDating = PlayerData.Dating:CheckDating(self.nCharId)
|
|
self._mapNode.btnStartDating.gameObject:SetActive(not bDating)
|
|
self._mapNode.btnDatingGray.gameObject:SetActive(bDating)
|
|
self.mapEvent = PlayerData.Dating:GetLimitedEventList(self.nCharId)
|
|
self.mapUnlockEvent = {}
|
|
for k, v in ipairs(self.mapEvent) do
|
|
if v.Status ~= AllEnum.DatingEventStatus.Lock then
|
|
table.insert(self.mapUnlockEvent, v)
|
|
end
|
|
end
|
|
self._mapNode.datingEventLSV.gameObject:SetActive(#self.mapEvent > 0)
|
|
self._mapNode.datingEventLSV:SetAnim(0.1)
|
|
self._mapNode.datingEventLSV:Init(#self.mapEvent, self, self.OnGridRefresh, self.OnGridClick)
|
|
self:RefreshAffinity()
|
|
end
|
|
function PhoneDatingCtrl:RefreshAffinity()
|
|
local affinityData = PlayerData.Char:GetCharAffinityData(self.nCharId)
|
|
if affinityData == nil then
|
|
return
|
|
end
|
|
self.curFavourLevel = affinityData.Level
|
|
self.curFavourExp = affinityData.Exp
|
|
NovaAPI.SetTMPText(self._mapNode.txtLevel, self.curFavourLevel)
|
|
if self.curFavourLevel < ConfigTable.GetConfigNumber("PhoneDatingAffinityLimit") then
|
|
self._mapNode.btnStartDating.gameObject:SetActive(false)
|
|
self._mapNode.btnDatingGray.gameObject:SetActive(true)
|
|
local sTip = orderedFormat(ConfigTable.GetUIText("Phone_Dating_Affinity_Limit"), ConfigTable.GetConfigNumber("PhoneDatingAffinityLimit"))
|
|
NovaAPI.SetTMPText(self._mapNode.txtBtnDatingGray, sTip)
|
|
else
|
|
NovaAPI.SetTMPText(self._mapNode.txtBtnDatingGray, ConfigTable.GetUIText("Phone_Char_Dating_Count_Max"))
|
|
end
|
|
local mapCharAffinity = ConfigTable.GetData("CharAffinityTemplate", self.nCharId)
|
|
if mapCharAffinity == nil then
|
|
return
|
|
end
|
|
local templateId = mapCharAffinity.TemplateId
|
|
self.MaxAffinityLevel = PlayerData.Char:GetMaxAffinityLevel(templateId)
|
|
local percent = 0
|
|
local level = self.curFavourLevel >= self.MaxAffinityLevel and self.MaxAffinityLevel or self.curFavourLevel + 1
|
|
local data = CacheTable.GetData("_AffinityLevel", templateId)[level]
|
|
local curData = CacheTable.GetData("_AffinityLevel", templateId)[self.curFavourLevel]
|
|
if self.curFavourLevel >= self.MaxAffinityLevel then
|
|
percent = 1
|
|
else
|
|
percent = self.curFavourExp / data.NeedExp
|
|
end
|
|
local sizeDelta = self._mapNode.rectProgress.sizeDelta
|
|
sizeDelta.x = self.progressBarWidth * percent < self.progressBarMinWidth and self.progressBarMinWidth or self.progressBarWidth * percent
|
|
self._mapNode.rectProgress.sizeDelta = sizeDelta
|
|
self._mapNode.rectProgress.gameObject:SetActive(self.curFavourExp > 0 or self.curFavourLevel >= self.MaxAffinityLevel)
|
|
if self.curFavourLevel >= self.MaxAffinityLevel then
|
|
NovaAPI.SetTMPText(self._mapNode.txtProgress, ConfigTable.GetUIText("Phone_Gift_Affinity_Max_Level"))
|
|
else
|
|
NovaAPI.SetTMPText(self._mapNode.txtProgress, string.format("%d/%d", self.curFavourExp, data.NeedExp))
|
|
end
|
|
NovaAPI.SetTMPText(self._mapNode.txtAffinity, curData.AffinityLevelName)
|
|
self:SetPngSprite(self._mapNode.imgAffinity, curData.AffinityLevelIcon .. "_s")
|
|
end
|
|
function PhoneDatingCtrl:OnGridRefresh(goGrid, goIndex)
|
|
local nIndex = goIndex + 1
|
|
local eventData = self.mapEvent[nIndex]
|
|
if eventData ~= nil then
|
|
local mapCfg = ConfigTable.GetData("DatingCharacterEvent", eventData.Id)
|
|
if mapCfg ~= nil then
|
|
local imgLock = goGrid.transform:Find("btnGrid/AnimRoot/imgLock")
|
|
local goUnlock = goGrid.transform:Find("btnGrid/AnimRoot/goUnlock")
|
|
local imgSpCg = goUnlock.transform:Find("mask/imgSpCg"):GetComponent("Image")
|
|
local txtDesc = goGrid.transform:Find("btnGrid/AnimRoot/txtDesc"):GetComponent("TMP_Text")
|
|
local imgTitleBg = goGrid.transform:Find("btnGrid/AnimRoot/imgTitleBg")
|
|
local txtLandmark = goGrid.transform:Find("btnGrid/AnimRoot/imgTitleBg/txtLandmark"):GetComponent("TMP_Text")
|
|
local redDot = goGrid.transform:Find("btnGrid/AnimRoot/goUnlock/redDotDatingReward")
|
|
RedDotManager.RegisterNode(RedDotDefine.Phone_Dating_Reward, {
|
|
self.nCharId,
|
|
eventData.Id
|
|
}, redDot, nil, nil, true)
|
|
local bLock = eventData.Status == AllEnum.DatingEventStatus.Lock
|
|
imgTitleBg.gameObject:SetActive(not bLock)
|
|
imgLock.gameObject:SetActive(bLock)
|
|
goUnlock.gameObject:SetActive(not bLock)
|
|
if bLock then
|
|
NovaAPI.SetTMPText(txtDesc, mapCfg.Clue)
|
|
else
|
|
NovaAPI.SetTMPText(txtDesc, mapCfg.Name)
|
|
local mapLandmark = ConfigTable.GetData("DatingLandmark", eventData.LandMark)
|
|
if mapLandmark ~= nil then
|
|
NovaAPI.SetTMPText(txtLandmark, mapLandmark.Name)
|
|
end
|
|
if mapCfg.CG ~= nil then
|
|
local sCGPath = "Icon/DatingEventCG/" .. mapCfg.CG
|
|
self:SetPngSprite(imgSpCg, sCGPath)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
function PhoneDatingCtrl:OnGridClick(goGrid, goIndex)
|
|
local nSelectIndex = goIndex + 1
|
|
local eventData = self.mapEvent[nSelectIndex]
|
|
if eventData.Status == AllEnum.DatingEventStatus.Lock then
|
|
return
|
|
end
|
|
for k, v in ipairs(self.mapUnlockEvent) do
|
|
if v.Id == eventData.Id then
|
|
self.nSelectIndex = k
|
|
end
|
|
end
|
|
self:OpenWindow()
|
|
end
|
|
function PhoneDatingCtrl:OpenWindow()
|
|
self._mapNode.goEventDetail.gameObject:SetActive(true)
|
|
self._mapNode.goWindow.gameObject:SetActive(false)
|
|
self._mapNode.goBlur.gameObject:SetActive(true)
|
|
EventManager.Hit(EventId.TemporaryBlockInput, 0.3)
|
|
local wait = function()
|
|
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
|
|
self._mapNode.goWindow.gameObject:SetActive(true)
|
|
self._mapNode.aniWindow:Play("t_window_04_t_in")
|
|
EventManager.Hit("OpenEventDetailWindow", true)
|
|
self:RefreshEventContent()
|
|
end
|
|
cs_coroutine.start(wait)
|
|
end
|
|
function PhoneDatingCtrl:CloseWindow()
|
|
EventManager.Hit("OpenEventDetailWindow", false)
|
|
self._mapNode.aniWindow:Play("t_window_04_t_out")
|
|
self._mapNode.goBlur.gameObject:SetActive(false)
|
|
local nAnimLen = NovaAPI.GetAnimClipLength(self._mapNode.aniWindow, {
|
|
"t_window_04_t_out"
|
|
})
|
|
self:AddTimer(1, nAnimLen, function()
|
|
self._mapNode.goEventDetail.gameObject:SetActive(false)
|
|
end, true, true, true)
|
|
EventManager.Hit(EventId.TemporaryBlockInput, nAnimLen)
|
|
end
|
|
function PhoneDatingCtrl:RefreshEventContent()
|
|
self.curEventData = self.mapUnlockEvent[self.nSelectIndex]
|
|
local mapCfg = ConfigTable.GetData("DatingCharacterEvent", self.curEventData.Id)
|
|
if mapCfg ~= nil then
|
|
local nCharId = tonumber(mapCfg.DatingEventParams[1])
|
|
local nLandmarkId = tonumber(mapCfg.DatingEventParams[2])
|
|
local mapLandmark = ConfigTable.GetData("DatingLandmark", nLandmarkId)
|
|
if mapLandmark ~= nil then
|
|
local sLandmark = mapLandmark.Name
|
|
NovaAPI.SetTMPText(self._mapNode.txtLandmark, sLandmark)
|
|
end
|
|
local nSkinId = PlayerData.Char:GetCharSkinId(nCharId)
|
|
local mapSkin = ConfigTable.GetData_CharacterSkin(nSkinId)
|
|
if mapSkin ~= nil then
|
|
self:SetPngSprite(self._mapNode.imgChar, mapSkin.Icon, AllEnum.CharHeadIconSurfix.XXL)
|
|
end
|
|
NovaAPI.SetTMPText(self._mapNode.txtEventName, mapCfg.Name)
|
|
if self.curEventData.Status == AllEnum.DatingEventStatus.Lock then
|
|
NovaAPI.SetTMPText(self._mapNode.txtDesc, mapCfg.Clue)
|
|
else
|
|
NovaAPI.SetTMPText(self._mapNode.txtDesc, mapCfg.Memory)
|
|
end
|
|
self._mapNode.btnReward.gameObject:SetActive(self.curEventData.Status == AllEnum.DatingEventStatus.Unlock)
|
|
if mapCfg.CG ~= nil then
|
|
local sCGPath = "Icon/DatingEventCG/" .. mapCfg.CG
|
|
self:SetPngSprite(self._mapNode.imgSpCg, sCGPath)
|
|
end
|
|
end
|
|
for k, v in ipairs(self._mapNode.goPage) do
|
|
v.gameObject:SetActive(k <= #self.mapUnlockEvent)
|
|
if k <= #self.mapUnlockEvent then
|
|
local goCur = v.gameObject.transform:Find("imgPage")
|
|
goCur.gameObject:SetActive(k == self.nSelectIndex)
|
|
end
|
|
end
|
|
self._mapNode.btnLeft.gameObject:SetActive(self.nSelectIndex > 1)
|
|
self._mapNode.btnRight.gameObject:SetActive(self.nSelectIndex < #self.mapUnlockEvent)
|
|
end
|
|
function PhoneDatingCtrl:Awake()
|
|
self.progressBarWidth = 253
|
|
self.progressBarMinWidth = 0
|
|
end
|
|
function PhoneDatingCtrl:FadeIn()
|
|
end
|
|
function PhoneDatingCtrl:FadeOut()
|
|
end
|
|
function PhoneDatingCtrl:OnEnable()
|
|
end
|
|
function PhoneDatingCtrl:OnDisable()
|
|
end
|
|
function PhoneDatingCtrl:OnDestroy()
|
|
end
|
|
function PhoneDatingCtrl:OnRelease()
|
|
end
|
|
function PhoneDatingCtrl:OnBtnClick_CharDetail()
|
|
if nil ~= self.nCharId then
|
|
if PanelManager.CheckPanelOpen(PanelId.CharBgPanel) then
|
|
EventManager.Hit(EventId.ClosePanel, PanelId.Phone)
|
|
EventManager.Hit(EventId.CharBgRefresh, PanelId.CharacterRelation, self.nCharId)
|
|
else
|
|
EventManager.Hit(EventId.OpenPanel, PanelId.CharBgPanel, PanelId.CharacterRelation, self.nCharId)
|
|
end
|
|
end
|
|
end
|
|
function PhoneDatingCtrl:OnBtnClick_StartDating()
|
|
local nCount, nAllCount = PlayerData.Dating:GetDatingCount()
|
|
if nAllCount <= nCount then
|
|
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Dating_Day_Count_Max"))
|
|
return
|
|
end
|
|
local bDating = PlayerData.Dating:CheckDating(self.nCharId)
|
|
if bDating then
|
|
return
|
|
end
|
|
local mapCharCfg = ConfigTable.GetData_Character(self.nCharId)
|
|
if mapCharCfg ~= nil then
|
|
local TipsTime = LocalData.GetPlayerLocalData("PhoneDating_Tips_Time")
|
|
local _tipDay = 0
|
|
if TipsTime ~= nil then
|
|
_tipDay = tonumber(TipsTime)
|
|
end
|
|
local curTimeStamp = CS.ClientManager.Instance.serverTimeStampWithTimeZone
|
|
local fixedTimeStamp = curTimeStamp + newDayTime * 3600
|
|
local nYear = tonumber(os.date("!%Y", fixedTimeStamp))
|
|
local nMonth = tonumber(os.date("!%m", fixedTimeStamp))
|
|
local nDay = tonumber(os.date("!%d", fixedTimeStamp))
|
|
local nowD = nYear * 366 + nMonth * 31 + nDay
|
|
if nowD == _tipDay then
|
|
EventManager.Hit(EventId.OpenPanel, PanelId.DatingLandmark, self.nCharId)
|
|
else
|
|
local sTip = orderedFormat(ConfigTable.GetUIText("Phone_Dating_Start_Tip_Text"), mapCharCfg.Name)
|
|
local isSelectAgain = false
|
|
local confirmCallback = function()
|
|
if isSelectAgain then
|
|
local _curTimeStamp = CS.ClientManager.Instance.serverTimeStampWithTimeZone
|
|
local _fixedTimeStamp = _curTimeStamp + newDayTime * 3600
|
|
local _nYear = tonumber(os.date("!%Y", _fixedTimeStamp))
|
|
local _nMonth = tonumber(os.date("!%m", _fixedTimeStamp))
|
|
local _nDay = tonumber(os.date("!%d", _fixedTimeStamp))
|
|
local _nowD = _nYear * 366 + _nMonth * 31 + _nDay
|
|
LocalData.SetPlayerLocalData("PhoneDating_Tips_Time", tostring(_nowD))
|
|
end
|
|
EventManager.Hit(EventId.OpenPanel, PanelId.DatingLandmark, self.nCharId)
|
|
end
|
|
local againCallback = function(isSelect)
|
|
isSelectAgain = isSelect
|
|
end
|
|
local msg = {
|
|
nType = AllEnum.MessageBox.Confirm,
|
|
sTitle = ConfigTable.GetUIText("Phone_Dating_Start_Tip_Title"),
|
|
sContent = sTip,
|
|
callbackConfirm = confirmCallback,
|
|
callbackAgain = againCallback
|
|
}
|
|
EventManager.Hit(EventId.OpenMessageBox, msg)
|
|
end
|
|
end
|
|
end
|
|
function PhoneDatingCtrl:OnBtnClick_DatingGray()
|
|
local sTip
|
|
if self.curFavourLevel < ConfigTable.GetConfigNumber("PhoneDatingAffinityLimit") then
|
|
sTip = orderedFormat(ConfigTable.GetUIText("Phone_Dating_Affinity_Limit"), ConfigTable.GetConfigNumber("PhoneDatingAffinityLimit"))
|
|
else
|
|
sTip = ConfigTable.GetUIText("Phone_Dating_Day_Max_Count")
|
|
end
|
|
EventManager.Hit(EventId.OpenMessageBox, sTip)
|
|
end
|
|
function PhoneDatingCtrl:OnBtnClick_Reward()
|
|
local callback = function()
|
|
self.mapEvent = PlayerData.Dating:GetLimitedEventList(self.nCharId)
|
|
self.mapUnlockEvent = {}
|
|
for k, v in ipairs(self.mapEvent) do
|
|
if v.Status ~= AllEnum.DatingEventStatus.Lock then
|
|
table.insert(self.mapUnlockEvent, v)
|
|
end
|
|
end
|
|
self._mapNode.datingEventLSV:Init(#self.mapEvent, self, self.OnGridRefresh, self.OnGridClick)
|
|
self:RefreshEventContent()
|
|
end
|
|
PlayerData.Dating:SendReceiveDatingEventRewardMsg(self.nCharId, self.curEventData.Id, callback)
|
|
end
|
|
function PhoneDatingCtrl:OnBtnClick_Left()
|
|
self.nSelectIndex = self.nSelectIndex - 1
|
|
self:RefreshEventContent()
|
|
end
|
|
function PhoneDatingCtrl:OnBtnClick_Right()
|
|
self.nSelectIndex = self.nSelectIndex + 1
|
|
self:RefreshEventContent()
|
|
end
|
|
function PhoneDatingCtrl:OnBtnClick_Close()
|
|
self:CloseWindow()
|
|
end
|
|
return PhoneDatingCtrl
|