Files
SL1900 dcc2c4a2a9 Update - 1.11.0.113
EN: 1.11.0.113
CN: 1.11.0.114
JP: 1.11.0.118
KR: 1.11.0.118
2026-06-02 16:00:00 +09:00

399 lines
13 KiB
Lua

local PenguinCardQuestSelectCtrl = class("PenguinCardQuestSelectCtrl", BaseCtrl)
local PenguinCardUtils = require("Game.UI.Play_PenguinCard.PenguinCardUtils")
local _, NotMaxLevel = ColorUtility.TryParseHtmlString("#FFF7EA")
local _, MaxLevel = ColorUtility.TryParseHtmlString("#ffe075")
local WwiseManger = CS.WwiseAudioManager.Instance
PenguinCardQuestSelectCtrl._mapNodeConfig = {
blur = {
sNodeName = "t_fullscreen_blur_blue"
},
aniBlur = {
sNodeName = "t_fullscreen_blur_blue",
sComponentName = "Animator"
},
btnCloseBg = {
sNodeName = "snapshot",
sComponentName = "UIButton",
callback = "OnBtnClick_Back"
},
Select = {sNodeName = "--Select--"},
txtQuestTitle = {
sComponentName = "TMP_Text",
sLanguageId = "PenguinCard_Quest_SelectTitle"
},
btnConfirm = {
sComponentName = "UIButton",
callback = "OnBtnClick_Confirm"
},
txtBtnConfirm = {
sComponentName = "TMP_Text",
sLanguageId = "PenguinCard_Btn_SelectQuest"
},
rtBtnConfirm = {
sNodeName = "btnConfirm",
sComponentName = "RectTransform"
},
goSelectQuest = {
nCount = 3,
sCtrlName = "Game.UI.Play_PenguinCard.PenguinCardQuestItemCtrl"
},
btnQuest = {
sComponentName = "UIButton",
nCount = 3,
callback = "OnBtnClick_Quest"
},
btnBack = {
sComponentName = "UIButton",
callback = "OnBtnClick_Back"
},
btnNext = {
sComponentName = "UIButton",
callback = "OnBtnClick_Next"
},
Count = {sNodeName = "--Count--"},
goQuest = {
sCtrlName = "Game.UI.Play_PenguinCard.PenguinCardQuestItemCtrl"
},
txtScore = {sComponentName = "TMP_Text"},
goQuestBuff = {},
rtQuestBuff = {sComponentName = "Transform"},
Hp = {sNodeName = "--Hp--"},
goHp = {nCount = 3, sComponentName = "Animator"},
txtHpTip = {
sComponentName = "TMP_Text",
sLanguageId = "PenguinCard_Quest_FailDesc"
},
goInfo = {}
}
PenguinCardQuestSelectCtrl._mapEventConfig = {
PenguinCard_AddBuff = "OnEvent_AddBuff",
PenguinCard_DeleteBuff = "OnEvent_DeleteBuff",
PenguinCard_ChangeScore = "OnEvent_ChangeScore",
PenguinCard_ChangeHp = "OnEvent_ChangeHp",
PenguinCard_Pause_SwitchGame = "FastClose",
PenguinCard_BlockFatalDamage = "OnEvent_BlockFatalDamage"
}
function PenguinCardQuestSelectCtrl:Open(bCur)
self._panel.mapLevel:Pause()
local nScore = math.floor(self._panel.mapLevel.nScore)
NovaAPI.SetTMPText(self._mapNode.txtScore, self:ThousandsNumber(nScore))
self.bCur = bCur
self:PlayInAni()
NovaAPI.SetButtonInteractable(self._mapNode.btnCloseBg, self.bCur)
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
self._mapNode.goInfo:SetActive(true)
if bCur then
self:RefreshCur()
else
self:RefreshPhase()
end
end
cs_coroutine.start(wait)
end
function PenguinCardQuestSelectCtrl:RefreshCur()
self._mapNode.Select:SetActive(false)
self._mapNode.Count:SetActive(true)
self._mapNode.Hp:SetActive(true)
self._mapNode.btnNext.gameObject:SetActive(false)
self._mapNode.goQuest:Refresh(self._panel.mapLevel.mapQuest)
self:RefreshHp()
WwiseManger:PostEvent("Mode_Card_mission")
self._mapNode.goQuest:PlayInAni()
end
function PenguinCardQuestSelectCtrl:RefreshPhase()
self._mapNode.btnNext.gameObject:SetActive(false)
self.callbackNext = nil
local bPlayHpAni = false
local bEmptySelect = next(self._panel.mapLevel.tbSelectableQuest) == nil
local next_select = function()
self:TryShowBuff()
self._mapNode.goQuest:PlayOutAni()
if bEmptySelect then
self:Close()
self:AddTimer(1, 0.4, function()
self._panel.mapLevel:SwitchGameState()
end, true, true, true)
else
self:AddTimer(1, 0.2, function()
self:RefreshSelect()
end, true, true, true)
EventManager.Hit(EventId.TemporaryBlockInput, 0.2)
end
end
if self._panel.mapLevel.mapQuestForShow then
local bComplete = self._panel.mapLevel.mapQuestForShow:CheckComplete()
if bComplete then
self:RefreshCount(true)
self:AddTimer(1, 0.5, function()
self:TryShowBuff()
end, true, true, true)
self.callbackNext = next_select
self._mapNode.btnNext.gameObject:SetActive(true)
else
local bExpired = self._panel.mapLevel.mapQuestForShow:CheckExpired()
if bExpired then
bPlayHpAni = true
if self._panel.mapLevel.nHp > 0 then
self:RefreshCount(false)
self.callbackNext = next_select
self._mapNode.btnNext.gameObject:SetActive(true)
else
self:RefreshCount(false)
function self.callbackNext()
self:FastClose()
self:AddTimer(1, 0.2, function()
self._panel.mapLevel:SwitchGameState()
end, true, true, true)
end
self._mapNode.btnNext.gameObject:SetActive(true)
end
end
end
else
self:RefreshSelect()
end
if bPlayHpAni then
if self.bBlockFatalDamage then
self.bBlockFatalDamage = false
for i = 2, 3 do
self._mapNode.goHp[i]:Play("PenguinCardHp_Null", 0, 0)
end
self:AddTimer(1, 0.5, function()
self._mapNode.goHp[1]:Play("PenguinCardHp_Del", 0, 0)
WwiseManger:PostEvent("Mode_Card_hurt")
self:AddTimer(1, 1, function()
self._mapNode.goHp[1]:Play("PenguinCardHp_Add")
WwiseManger:PostEvent("Mode_Card_heal")
end, true, true, true)
end, true, true, true)
else
local nIndex = self._panel.mapLevel.nHp + 1
for i = 1, 3 do
if i > nIndex then
self._mapNode.goHp[i]:Play("PenguinCardHp_Null", 0, 0)
end
end
self:AddTimer(1, 0.5, function()
self._mapNode.goHp[nIndex]:Play("PenguinCardHp_Del", 0, 0)
WwiseManger:PostEvent("Mode_Card_hurt")
end, true, true, true)
end
end
end
function PenguinCardQuestSelectCtrl:RefreshSelect()
self._mapNode.Select:SetActive(true)
self._mapNode.Count:SetActive(false)
self._mapNode.Hp:SetActive(true)
self.nSelectIndex = 0
self._mapNode.btnConfirm.gameObject:SetActive(false)
local nMax = #self._panel.mapLevel.tbSelectableQuest
for i = 1, 3 do
self._mapNode.goSelectQuest[i].gameObject:SetActive(i <= nMax)
if i <= nMax then
self._mapNode.goSelectQuest[i]:Refresh(self._panel.mapLevel.tbSelectableQuest[i])
self._mapNode.goSelectQuest[i]:PlayInAni()
end
end
self:RefreshHp()
WwiseManger:PostEvent("Mode_Card_mission")
end
function PenguinCardQuestSelectCtrl:MoveConfirmButton(nIndex)
local rtBtn = self._mapNode.goSelectQuest[nIndex].gameObject.transform:GetComponent("RectTransform")
self._mapNode.rtBtnConfirm.localPosition = Vector3(rtBtn.localPosition.x, self.btnConfirmPosY, 0)
if self._mapNode.btnConfirm.gameObject.activeSelf == false then
self._mapNode.btnConfirm.gameObject:SetActive(true)
else
local animCtrl = self._mapNode.btnConfirm.transform:Find("AnimRoot/Show"):GetComponent("Animator")
animCtrl:Play("btnConfirm_in", 0, 0)
end
end
function PenguinCardQuestSelectCtrl:RefreshCount(bSuc)
self._mapNode.Select:SetActive(false)
self._mapNode.Count:SetActive(true)
if bSuc == true then
self._mapNode.Hp:SetActive(false)
self._mapNode.goQuest:RefreshSuc(self._panel.mapLevel.mapQuestForShow)
WwiseManger:PostEvent("Mode_Card_mission_com")
elseif bSuc == false then
self._mapNode.Hp:SetActive(true)
self._mapNode.goQuest:RefreshFail(self._panel.mapLevel.mapQuestForShow)
WwiseManger:PostEvent("Mode_Card_mission")
end
self._mapNode.goQuest:PlayInAni()
end
function PenguinCardQuestSelectCtrl:RefreshHp()
for i = 1, 3 do
if i > self._panel.mapLevel.nHp then
self._mapNode.goHp[i]:Play("PenguinCardHp_Null", 0, 0)
end
end
end
function PenguinCardQuestSelectCtrl:ClearBuffItem()
delChildren(self._mapNode.rtQuestBuff)
self.tbBuffItem = {}
self.tbWaitShowBuff = {}
end
function PenguinCardQuestSelectCtrl:PlayInAni()
self.gameObject:SetActive(true)
self._mapNode.blur:SetActive(true)
EventManager.Hit("PenguinCard_QuestSelectOpen")
EventManager.Hit(EventId.TemporaryBlockInput, 0.3)
end
function PenguinCardQuestSelectCtrl:Close()
self.animator:Play("PengUinCard_Quest_out", 0, 0)
self._mapNode.aniBlur:SetTrigger("tOut")
self._mapNode.btnConfirm.gameObject:SetActive(false)
self:AddTimer(1, 0.4, function()
self._panel.mapLevel:Resume()
self._mapNode.goInfo:SetActive(false)
self.gameObject:SetActive(false)
end, true, true, true)
EventManager.Hit(EventId.TemporaryBlockInput, 0.4)
end
function PenguinCardQuestSelectCtrl:FastClose()
if self.gameObject.activeSelf == false then
return
end
self.animator:Play("PengUinCard_Quest_out_fast", 0, 0)
self._mapNode.aniBlur:SetTrigger("tOut")
self._mapNode.btnConfirm.gameObject:SetActive(false)
self:AddTimer(1, 0.2, function()
self._panel.mapLevel:Resume()
self._mapNode.goInfo:SetActive(false)
self.gameObject:SetActive(false)
end, true, true, true)
EventManager.Hit(EventId.TemporaryBlockInput, 0.2)
end
function PenguinCardQuestSelectCtrl:TryShowBuff()
if next(self.tbWaitShowBuff) == nil then
return
end
local nAll = #self.tbWaitShowBuff
for i = nAll, 1, -1 do
local mapBuff = self.tbWaitShowBuff[i]
table.remove(self.tbWaitShowBuff, i)
self:AddBuff(mapBuff)
end
end
function PenguinCardQuestSelectCtrl:AddBuff(mapBuff)
if not self.tbBuffItem then
self.tbBuffItem = {}
end
local goItemObj = instantiate(self._mapNode.goQuestBuff, self._mapNode.rtQuestBuff)
goItemObj:SetActive(true)
table.insert(self.tbBuffItem, goItemObj)
local btn = goItemObj.transform:Find("btnOpenInfo"):GetComponent("UIButton")
local imgSelect = goItemObj.transform:Find("btnOpenInfo/AnimRoot/imgSelect").gameObject
local imgIcon = goItemObj.transform:Find("btnOpenInfo/AnimRoot/imgIcon"):GetComponent("Image")
local ani = goItemObj.transform:Find("btnOpenInfo/AnimRoot"):GetComponent("Animator")
self:SetSprite(imgIcon, "UI/Play_PenguinCard/SpriteAtlas/Sprite/" .. mapBuff.sIcon)
ani:Play("PenguinCardBuff_in", 0, 0)
local click = function()
imgSelect:SetActive(true)
EventManager.Hit("PenguinCard_OpenBuffTips", mapBuff, function()
imgSelect:SetActive(false)
end)
end
btn.onClick:AddListener(click)
end
function PenguinCardQuestSelectCtrl:Awake()
self._mapNode.goInfo:SetActive(false)
self.animator = self.gameObject:GetComponent("Animator")
self.btnConfirmPosY = self._mapNode.rtBtnConfirm.localPosition.y
self.tbWaitShowBuff = {}
end
function PenguinCardQuestSelectCtrl:OnEnable()
end
function PenguinCardQuestSelectCtrl:OnDisable()
end
function PenguinCardQuestSelectCtrl:OnBtnClick_Quest(btn, nIndex)
if self.nSelectIndex == nIndex then
return
end
self:MoveConfirmButton(nIndex)
if self.nSelectIndex ~= 0 then
self._mapNode.goSelectQuest[self.nSelectIndex]:SetSelect(false)
self._mapNode.goSelectQuest[self.nSelectIndex]:PlaySelectAni(false)
end
self._mapNode.goSelectQuest[nIndex]:SetSelect(true)
self._mapNode.goSelectQuest[nIndex]:PlaySelectAni(true)
self.nSelectIndex = nIndex
end
function PenguinCardQuestSelectCtrl:OnBtnClick_Confirm()
if not self.nSelectIndex or self.nSelectIndex == 0 then
return
end
local nMax = #self._panel.mapLevel.tbSelectableQuest
for i = 1, nMax do
if i == self.nSelectIndex then
self._mapNode.goSelectQuest[i]:PlaySelectOutAni()
self._mapNode.goSelectQuest[i]:SetSelect(false)
else
self._mapNode.goSelectQuest[i]:PlayOutAni()
end
end
self._panel.mapLevel:SelectQuest(self.nSelectIndex)
self:Close()
self:AddTimer(1, 0.4, function()
self._panel.mapLevel:SwitchGameState()
end, true, true, true)
end
function PenguinCardQuestSelectCtrl:OnBtnClick_Back()
if self.bCur then
self._mapNode.goQuest:PlayOutAni()
self:Close()
else
EventManager.Hit("PenguinCard_OpenPause")
end
end
function PenguinCardQuestSelectCtrl:OnBtnClick_Next()
if self.callbackNext then
self.callbackNext()
end
self._mapNode.btnNext.gameObject:SetActive(false)
end
function PenguinCardQuestSelectCtrl:OnEvent_AddBuff(mapBuff, bWaitShow)
if bWaitShow then
table.insert(self.tbWaitShowBuff, mapBuff)
else
self:AddBuff(mapBuff)
end
end
function PenguinCardQuestSelectCtrl:OnEvent_DeleteBuff(nIndex)
if not self.tbBuffItem or next(self.tbBuffItem) == nil then
return
end
local goBuff = self.tbBuffItem[nIndex]
table.remove(self.tbBuffItem, nIndex)
if goBuff:IsNull() == false then
local ani = goBuff.transform:Find("btnOpenInfo/AnimRoot"):GetComponent("Animator")
ani:Play("PenguinCardBuff_out", 0, 0)
self:AddTimer(1, 0.4, function()
destroy(goBuff)
end, true, true, true)
end
end
function PenguinCardQuestSelectCtrl:OnEvent_ChangeScore(nBefore, nBeforeStar, nStar)
if nBefore < self._panel.mapLevel.nScore and self._panel.mapLevel.nGameState == PenguinCardUtils.GameState.Quest then
WwiseManger:PostEvent("Mode_Card_coin")
end
local callback = dotween_callback_handler(self, function()
if nBefore < self._panel.mapLevel.nScore and self._panel.mapLevel.nGameState == PenguinCardUtils.GameState.Quest then
WwiseManger:PostEvent("Mode_Card_coin_stop")
end
end)
DOTween.To(function()
return nBefore
end, function(v)
local nScore = math.floor(v)
NovaAPI.SetTMPText(self._mapNode.txtScore, self:ThousandsNumber(nScore))
end, self._panel.mapLevel.nScore, 0.5):OnComplete(callback)
end
function PenguinCardQuestSelectCtrl:OnEvent_ChangeHp(nChange)
end
function PenguinCardQuestSelectCtrl:OnEvent_BlockFatalDamage()
self.bBlockFatalDamage = true
end
return PenguinCardQuestSelectCtrl