Files
StellaSora_DataLua/lua/game/ui/avg/avg_7_choicectrl.lua
T
SL1900 5e0d58cfad Initial version - 1.2.0.60
EN: 1.2.0.60
CN: 1.2.0.61
JP: 1.2.0.63
KR: 1.2.0.67
2025-12-03 01:00:00 +09:00

551 lines
16 KiB
Lua

local Avg_7_ChoiceCtrl = class("Avg_7_ChoiceCtrl", BaseCtrl)
local GamepadUIManager = require("GameCore.Module.GamepadUIManager")
local WwiseAudioMgr = CS.WwiseAudioManager.Instance
Avg_7_ChoiceCtrl._mapNodeConfig = {
imgMask = {sComponentName = "Image"},
canvasGroup = {
sNodeName = "----root----",
sComponentName = "CanvasGroup"
},
anim = {
sNodeName = "----main_role_choice----",
sComponentName = "Animator"
},
trMainRole = {sNodeName = "goMainRole", sComponentName = "Transform"},
rubyTmp_Choice_OS = {
sComponentName = "RubyTextMeshProUGUI"
},
goM = {sNodeName = "--M--"},
tbTMPLayout_M = {
nCount = 4,
sNodeName = "rubyTmp_Layout_M_",
sComponentName = "RubyTextMeshProUGUI"
},
tbRT_M = {
nCount = 4,
sNodeName = "anim_root_M_",
sComponentName = "RectTransform"
},
tbCG_M = {
nCount = 4,
sNodeName = "anim_root_M_",
sComponentName = "CanvasGroup"
},
tbBtn_M = {
nCount = 4,
sNodeName = "btn_M_",
sComponentName = "NaviButton",
callback = "OnBtnClick_Choice"
},
tbTMP_M = {
nCount = 4,
sNodeName = "rubyTmp_M_",
sComponentName = "RubyTextMeshProUGUI"
},
goSelect_M = {
nCount = 4,
sNodeName = "goSelect_M_"
},
goR = {sNodeName = "--R--"},
tbTMPLayout_R = {
nCount = 4,
sNodeName = "rubyTmp_Layout_R_",
sComponentName = "RubyTextMeshProUGUI"
},
tbRT_R = {
nCount = 4,
sNodeName = "anim_root_R_",
sComponentName = "RectTransform"
},
tbCG_R = {
nCount = 4,
sNodeName = "anim_root_R_",
sComponentName = "CanvasGroup"
},
tbBtn_R = {
nCount = 4,
sNodeName = "btn_R_",
sComponentName = "NaviButton",
callback = "OnBtnClick_Choice"
},
tbGoSelected_R = {
nCount = 4,
sNodeName = "goSelected_R_"
},
tbGoUnselected_R = {
nCount = 4,
sNodeName = "goUnselected_R_"
},
tbTMP_R = {
nCount = 4,
sNodeName = "rubyTmp_R_",
sComponentName = "RubyTextMeshProUGUI"
},
goSelect_R = {
nCount = 4,
sNodeName = "goSelect_R_"
},
goL = {sNodeName = "--L--"},
tbTMPLayout_L = {
nCount = 4,
sNodeName = "rubyTmp_Layout_L_",
sComponentName = "RubyTextMeshProUGUI"
},
tbRT_L = {
nCount = 4,
sNodeName = "anim_root_L_",
sComponentName = "RectTransform"
},
tbCG_L = {
nCount = 4,
sNodeName = "anim_root_L_",
sComponentName = "CanvasGroup"
},
tbBtn_L = {
nCount = 4,
sNodeName = "btn_L_",
sComponentName = "NaviButton",
callback = "OnBtnClick_Choice"
},
tbGoSelected_L = {
nCount = 4,
sNodeName = "goSelected_L_"
},
tbGoUnselected_L = {
nCount = 4,
sNodeName = "goUnselected_L_"
},
tbTMP_L = {
nCount = 4,
sNodeName = "rubyTmp_L_",
sComponentName = "RubyTextMeshProUGUI"
},
goSelect_L = {
nCount = 4,
sNodeName = "goSelect_L_"
}
}
Avg_7_ChoiceCtrl._mapEventConfig = {
GamepadUIChange = "OnEvent_GamepadUIChange",
[EventId.AvgSpeedUp] = "OnEvent_AvgSpeedUp"
}
function Avg_7_ChoiceCtrl:Awake()
self.tbChoiceData = {}
self.tbTotalChoiceCount = {}
self.sCurChoiceGroupId = nil
self.nType = nil
NovaAPI.SetImageColor(self._mapNode.imgMask, Color(0, 0, 0, 0))
NovaAPI.SetCanvasGroupInteractable(self._mapNode.canvasGroup, false)
NovaAPI.SetCanvasGroupBlocksRaycasts(self._mapNode.canvasGroup, false)
self._mapNode.canvasGroup.gameObject:SetActive(false)
for i = 1, 4 do
self._mapNode.tbTMPLayout_M[i].gameObject:SetActive(false)
self._mapNode.tbTMPLayout_R[i].gameObject:SetActive(false)
self._mapNode.tbTMPLayout_L[i].gameObject:SetActive(false)
end
self._mapNode.goM:SetActive(false)
self._mapNode.goR:SetActive(false)
self._mapNode.goL:SetActive(false)
self.tbLogData = {}
end
function Avg_7_ChoiceCtrl:OnEnable()
self:AddGamepadUINode()
self:BindSelect()
end
function Avg_7_ChoiceCtrl:OnDisable()
self:UnbindSelect()
end
function Avg_7_ChoiceCtrl:_SetMask(bVisible)
NovaAPI.ImageDoFade(self._mapNode.imgMask, bVisible == true and 0.5 or 0, 0.2, true)
end
function Avg_7_ChoiceCtrl:_Set(nIndex, bVisible, bSelected, sContent, nExtraDelay)
local tbTxtLayout, tbRT, tbCG, tbTxt
if self.nType == 0 then
tbTxtLayout = self._mapNode.tbTMPLayout_M
tbRT = self._mapNode.tbRT_M
tbCG = self._mapNode.tbCG_M
tbTxt = self._mapNode.tbTMP_M
elseif self.nType == 1 then
tbTxtLayout = self._mapNode.tbTMPLayout_R
tbRT = self._mapNode.tbRT_R
tbCG = self._mapNode.tbCG_R
tbTxt = self._mapNode.tbTMP_R
elseif self.nType == 2 then
tbTxtLayout = self._mapNode.tbTMPLayout_L
tbRT = self._mapNode.tbRT_L
tbCG = self._mapNode.tbCG_L
tbTxt = self._mapNode.tbTMP_L
end
local txtLayout = tbTxtLayout[nIndex]
local rt = tbRT[nIndex]
local canvasGroup = tbCG[nIndex]
local txt = tbTxt[nIndex]
local goChoice = txtLayout.gameObject
goChoice:SetActive(bVisible)
self:SetSelectBtnObj(nIndex, bVisible, bSelected)
if bVisible == false then
return
end
NovaAPI.SetCanvasGroupAlpha(canvasGroup, 0)
local nOffsetX = 0
if self.nType == 2 then
nOffsetX = -72 * (nIndex - 1)
end
rt.anchoredPosition = Vector2(500 + nOffsetX, 0)
rt.localScale = Vector3(0.5, 0.5, 1)
if self.nType == 1 then
self._mapNode.tbGoSelected_R[nIndex]:SetActive(bSelected == true)
self._mapNode.tbGoUnselected_R[nIndex]:SetActive(bSelected == false)
elseif self.nType == 2 then
self._mapNode.tbGoSelected_L[nIndex]:SetActive(bSelected == true)
self._mapNode.tbGoUnselected_L[nIndex]:SetActive(bSelected == false)
end
local sColor = "#264278"
if bSelected == true then
sColor = "#6E8297"
end
NovaAPI.SetTextColor_RubyTMP(txt, sColor)
sContent = ProcAvgTextContent(sContent, self._panel.nCurLanguageIdx)
NovaAPI.SetText_RubyTMP(txtLayout, sContent)
NovaAPI.SetText_RubyTMP(txt, sContent)
local nDelay = nIndex * 0.03
if nExtraDelay ~= nil then
nDelay = nDelay + nExtraDelay
end
canvasGroup:DOFade(1, 0.2):SetUpdate(true):SetDelay(nDelay)
rt:DOAnchorPosX(0 + nOffsetX, 0.2):SetUpdate(true):SetDelay(nDelay)
local sequence = DOTween.Sequence()
sequence:AppendInterval(nDelay)
sequence:Append(rt:DOScale(1.03, 0.2):SetUpdate(true):SetEase(Ease.OutQuint))
sequence:Append(rt:DOScale(0.99, 0.1):SetUpdate(true):SetEase(Ease.InCubic))
sequence:Append(rt:DOScale(1, 0.1):SetUpdate(true))
sequence:SetUpdate(true)
end
function Avg_7_ChoiceCtrl:OnBtnClick_Choice(uiBtn)
self:ClearSelect()
local nIndex
if self.nType == 0 then
nIndex = table.indexof(self._mapNode.tbBtn_M, uiBtn)
elseif self.nType == 1 then
nIndex = table.indexof(self._mapNode.tbBtn_R, uiBtn)
elseif self.nType == 2 then
nIndex = table.indexof(self._mapNode.tbBtn_L, uiBtn)
end
if nIndex == nil then
return
end
if 0 >= table.indexof(self.tbChoiceData[self.sCurChoiceGroupId], nIndex) then
table.insert(self.tbChoiceData[self.sCurChoiceGroupId], nIndex)
end
local tbTxtLayout, tbRT, tbCG, tbTxt
if self.nType == 0 then
tbTxtLayout = self._mapNode.tbTMPLayout_M
tbRT = self._mapNode.tbRT_M
tbCG = self._mapNode.tbCG_M
tbTxt = self._mapNode.tbTMP_M
elseif self.nType == 1 then
tbTxtLayout = self._mapNode.tbTMPLayout_R
tbRT = self._mapNode.tbRT_R
tbCG = self._mapNode.tbCG_R
tbTxt = self._mapNode.tbTMP_R
elseif self.nType == 2 then
tbTxtLayout = self._mapNode.tbTMPLayout_L
tbRT = self._mapNode.tbRT_L
tbCG = self._mapNode.tbCG_L
tbTxt = self._mapNode.tbTMP_L
end
for i = 1, 4 do
local goChoice = tbTxtLayout[i].gameObject
local rt = tbRT[i]
local canvasGroup = tbCG[i]
if goChoice.activeSelf == true then
if i == nIndex then
canvasGroup:DOFade(0, 0.2):SetUpdate(true):SetDelay(0.2)
rt:DOScale(1.1, 0.2):SetUpdate(true):SetDelay(0.1):SetEase(Ease.OutQuart)
else
canvasGroup:DOFade(0, 0.2):SetUpdate(true):SetDelay(0.1)
rt:DOScale(0.3, 0.2):SetUpdate(true):SetDelay(0.1):SetEase(Ease.InQuart)
end
end
end
EventManager.Hit(EventId.TemporaryBlockInput, 0.3)
NovaAPI.SetCanvasGroupInteractable(self._mapNode.canvasGroup, false)
NovaAPI.SetCanvasGroupBlocksRaycasts(self._mapNode.canvasGroup, false)
self:AddTimer(1, 0.4, "_RunNextCmd", true, true, true, nIndex)
self:_SetMask(false)
local sReplyContent = NovaAPI.GetText_RubyTMP(tbTxt[nIndex])
if self.nType == 1 then
EventManager.Hit(EventId.AvgChoiceToReplyPhoneMessage, sReplyContent)
end
if self.bShowMainRole == true then
self._mapNode.anim:SetTrigger("tOut")
end
WwiseAudioMgr:PlaySound("ui_choice_click")
self.tbLogData.nType = AllEnum.AvgLogType.Choice
self.tbLogData.sAvgId = nil
self.tbLogData.sContent = sReplyContent
self.tbLogData.sVoice = nil
EventManager.Hit(EventId.AvgMarkLog, self.tbLogData)
end
function Avg_7_ChoiceCtrl:_RunNextCmd(timer, nIndex)
if self:GetPanelId() == PanelId.AvgST then
if self.bShowMainRole == true then
EventManager.Hit(EventId.AvgChoiceMainRoleOS_Out)
end
self.bShowMainRole = nil
self._mapNode.canvasGroup.gameObject:SetActive(false)
self._panel:SetChoiceJumpTo(self.sCurChoiceGroupId, nIndex)
end
end
function Avg_7_ChoiceCtrl:OnEvent_AvgSpeedUp(nRate)
if self:GetPanelId() ~= PanelId.AvgST then
return
end
self:OnEvent_AvgSpeedUp_Timer(nRate)
NovaAPI.SetAnimatorSpeed(self._mapNode.anim, nRate)
end
function Avg_7_ChoiceCtrl:SetChoiceBegin(tbParam)
EventManager.Hit(EventId.AvgAllMenuBtnEnable, false)
local sChoiceGroupId = tbParam[1]
local bMaskVisible = tbParam[2] == 0
local tbVisibleType = tbParam[3]
local tbContent_CN_F = tbParam[4]
local tbContent_CN_M = tbParam[11]
local tbContent_JP_F = tbParam[13] or {}
local tbContent_JP_M = tbParam[14] or {}
local tbContent = {}
local _sContent
for i = 1, 4 do
if self._panel.sTxtLan == AllEnum.Language.CN then
_sContent = tbContent_CN_F[i]
if self._panel.sVoLan == AllEnum.Language.JP and type(tbContent_JP_F[i]) == "string" and tbContent_JP_F[i] ~= "" then
_sContent = tbContent_JP_F[i]
end
table.insert(tbContent, _sContent)
else
_sContent = tbContent_JP_F[i]
if self._panel.bIsPlayerMale == true and type(tbContent_JP_M[i]) == "string" and tbContent_JP_M[i] ~= "" then
_sContent = tbContent_JP_M[i]
end
if self._panel.sVoLan == AllEnum.Language.CN then
if type(tbContent_CN_F[i]) == "string" and tbContent_CN_F[i] ~= "" then
_sContent = tbContent_CN_F[i]
end
if self._panel.bIsPlayerMale == true and type(tbContent_CN_M[i]) == "string" and tbContent_CN_M[i] ~= "" then
_sContent = tbContent_CN_M[i]
end
end
table.insert(tbContent, _sContent)
end
end
local nType = tbParam[5]
self.bShowMainRole = tbParam[6] == 1
local sBody = tbParam[7]
local sFace = tbParam[8]
local sEmoji = tbParam[9]
local sContentOS = tbParam[10]
self.sCurChoiceGroupId = sChoiceGroupId
self.nType = nType
self._mapNode.goM:SetActive(self.nType == 0)
self._mapNode.goR:SetActive(self.nType == 1)
self._mapNode.goL:SetActive(self.nType == 2)
self:_SetMask(bMaskVisible)
self._mapNode.canvasGroup.gameObject:SetActive(true)
NovaAPI.SetCanvasGroupInteractable(self._mapNode.canvasGroup, true)
NovaAPI.SetCanvasGroupBlocksRaycasts(self._mapNode.canvasGroup, true)
self:ResetGamepadUI()
if self.tbChoiceData[sChoiceGroupId] == nil then
self.tbChoiceData[sChoiceGroupId] = {}
end
local tbData = self.tbChoiceData[sChoiceGroupId]
local nBlockTime = 0.4
local nChoiceCount = 0
local nExtraDelay
if self.bShowMainRole == true then
nExtraDelay = 0.2
end
for i = 1, 4 do
local bVisible = true
local sContent = tbContent[i]
if sContent == "" then
bVisible = false
else
nChoiceCount = nChoiceCount + 1
local _type = tbVisibleType[i]
if _type == 0 then
bVisible = true
elseif _type == 1 then
bVisible = 0 < table.indexof(tbData, i - 1)
elseif _type == 2 then
for j = 1, 4 do
if j ~= i and 0 >= table.indexof(tbData, j) then
bVisible = false
break
end
end
end
end
self:_Set(i, bVisible, 0 < table.indexof(tbData, i), sContent, nExtraDelay)
if bVisible == true then
nBlockTime = nBlockTime + 0.03
end
end
GamepadUIManager.SetNavigation(self.tbSelectBtnObj, false)
self:SelectChoiceBtn()
self.tbTotalChoiceCount[sChoiceGroupId] = nChoiceCount
EventManager.Hit(EventId.TemporaryBlockInput, nBlockTime)
if self.bShowMainRole == true then
sContentOS = ProcAvgTextContent(sContentOS, self._panel.nCurLanguageIdx)
NovaAPI.SetText_RubyTMP(self._mapNode.rubyTmp_Choice_OS, sContentOS)
EventManager.Hit(EventId.AvgChoiceMainRoleOS_In, self._mapNode.trMainRole, sBody, sFace, sEmoji)
self._mapNode.anim:SetTrigger("tIn")
end
NovaAPI.SetScreenSleepTimeout(false)
return -1
end
function Avg_7_ChoiceCtrl:SetChoiceJumpTo(tbParam)
EventManager.Hit(EventId.AvgAllMenuBtnEnable, true)
EventManager.Hit("AvgCheckAutoOnOff")
return 0
end
function Avg_7_ChoiceCtrl:SetChoiceRollback(tbParam)
local sGroupId = tbParam[1]
local nRollBackType = tbParam[2]
if nRollBackType == 1 then
local tbData = self.tbChoiceData[sGroupId]
if #tbData >= self.tbTotalChoiceCount[sGroupId] then
self._panel:SetChoiceRollover(sGroupId)
else
self._panel:SetChoiceRollback(sGroupId)
end
else
self._panel:SetChoiceRollback(sGroupId)
end
return 0
end
function Avg_7_ChoiceCtrl:SetChoiceRollover(tbParam)
self._panel:SetChoiceRollover(tbParam[1])
return 0
end
function Avg_7_ChoiceCtrl:SetChoiceEnd(tbParam)
return 0
end
function Avg_7_ChoiceCtrl:RestoreAll(bActive)
self.gameObject:SetActive(bActive)
end
function Avg_7_ChoiceCtrl:AddGamepadUINode()
GamepadUIManager.AddGamepadUINode("AVG", self:GetGamepadUINode())
end
function Avg_7_ChoiceCtrl:BindSelect()
self.handlerBtn_M, self.handlerBtn_R, self.handlerBtn_L = {}, {}, {}
for k, v in ipairs(self._mapNode.tbBtn_M) do
self.handlerBtn_M[k] = ui_handler(self, self.OnBtnSelect_Choice, v, k)
v.onSelect:AddListener(self.handlerBtn_M[k])
end
for k, v in ipairs(self._mapNode.tbBtn_R) do
self.handlerBtn_R[k] = ui_handler(self, self.OnBtnSelect_Choice, v, k)
v.onSelect:AddListener(self.handlerBtn_R[k])
end
for k, v in ipairs(self._mapNode.tbBtn_L) do
self.handlerBtn_L[k] = ui_handler(self, self.OnBtnSelect_Choice, v, k)
v.onSelect:AddListener(self.handlerBtn_L[k])
end
end
function Avg_7_ChoiceCtrl:UnbindSelect()
for k, v in ipairs(self._mapNode.tbBtn_M) do
v.onSelect:RemoveListener(self.handlerBtn_M[k])
end
for k, v in ipairs(self._mapNode.tbBtn_R) do
v.onSelect:RemoveListener(self.handlerBtn_R[k])
end
for k, v in ipairs(self._mapNode.tbBtn_L) do
v.onSelect:RemoveListener(self.handlerBtn_L[k])
end
end
function Avg_7_ChoiceCtrl:GetSelectList()
local tbSelect
if self.nType == 0 then
tbSelect = self._mapNode.goSelect_M
elseif self.nType == 1 then
tbSelect = self._mapNode.goSelect_R
elseif self.nType == 2 then
tbSelect = self._mapNode.goSelect_L
end
return tbSelect
end
function Avg_7_ChoiceCtrl:GetBtnList()
local tbBtn
if self.nType == 0 then
tbBtn = self._mapNode.tbBtn_M
elseif self.nType == 1 then
tbBtn = self._mapNode.tbBtn_R
elseif self.nType == 2 then
tbBtn = self._mapNode.tbBtn_L
end
return tbBtn
end
function Avg_7_ChoiceCtrl:OnBtnSelect_Choice(btn, nIndex)
if self.nSelectIndex == nIndex then
return
end
local tbSelect = self:GetSelectList()
for k, v in ipairs(tbSelect) do
if k == nIndex then
if GamepadUIManager.GetCurUIType() ~= AllEnum.GamepadUIType.Other and GamepadUIManager.GetCurUIType() ~= AllEnum.GamepadUIType.Mouse then
v:SetActive(true)
else
v:SetActive(false)
end
elseif k == self.nSelectIndex then
v:SetActive(false)
end
end
self.nSelectIndex = nIndex
end
function Avg_7_ChoiceCtrl:SetSelectBtnObj(nIndex, bVisible, bSelected)
if bVisible then
if next(self.tbSelectBtnObj) == nil then
self.nSelectIndex = nIndex
end
local tbBtn = self:GetBtnList()
table.insert(self.tbSelectBtnObj, tbBtn[nIndex])
end
end
function Avg_7_ChoiceCtrl:SelectChoiceBtn()
local tbSelect = self:GetSelectList()
local tbBtn = self:GetBtnList()
local nUIType = GamepadUIManager.GetCurUIType()
if nUIType ~= AllEnum.GamepadUIType.Other and nUIType ~= AllEnum.GamepadUIType.Mouse then
if self.nSelectIndex and self.nSelectIndex ~= 0 then
tbSelect[self.nSelectIndex]:SetActive(true)
GamepadUIManager.SetSelectedUI(tbBtn[self.nSelectIndex].gameObject)
end
else
for k, _ in ipairs(tbBtn) do
tbSelect[k]:SetActive(false)
end
end
end
function Avg_7_ChoiceCtrl:ResetGamepadUI()
self._panel.sCurGamepadUI = "Choice"
GamepadUIManager.ClearSelectedUI()
self.tbSelectBtnObj = {}
self.nSelectIndex = 0
local tbSelect = self:GetSelectList()
for _, v in ipairs(tbSelect) do
v:SetActive(false)
end
end
function Avg_7_ChoiceCtrl:ClearSelect()
GamepadUIManager.ClearSelectedUI()
self.nSelectIndex = 0
self._panel.sCurGamepadUI = nil
end
function Avg_7_ChoiceCtrl:OnEvent_GamepadUIChange(sName, nBeforeType, nAfterType)
if sName ~= "AVG" or self._panel.sCurGamepadUI ~= "Choice" then
return
end
self:SelectChoiceBtn()
end
return Avg_7_ChoiceCtrl