Files
StellaSora_DataLua/lua/game/ui/battle/skillbtnctrl.lua
T
SL1900 46f967a584 Update - 1.6.0.84
EN: 1.6.0.84
CN: 1.6.0.87
JP: 1.6.0.88
KR: 1.6.0.91
2026-02-04 13:00:00 +09:00

369 lines
14 KiB
Lua

local SkillBtnCtrl = class("SkillBtnCtrl", BaseCtrl)
local WwiseAudioMgr = CS.WwiseAudioManager.Instance
local LocalSettingData = require("GameCore.Data.LocalSettingData")
local NormalCDSize = 34
local eftColor = {
[1] = "#00B7FF",
[2] = "#FF587E",
[3] = "#FF902A",
[4] = "#86FF3B",
[5] = "#FFCF00",
[6] = "#F186FF"
}
local SKILL_FLEE = 1
local SKILL_A = 2
local SKILL_B = 3
local SKILL_ULTRA = 4
local BTN_STATE = {
None = 0,
Press = 1,
Click = 2,
Hold = 3,
Cancel = 4
}
SkillBtnCtrl._mapNodeConfig = {
CanvasGroupMain = {
sNodeName = "main",
sComponentName = "CanvasGroup"
},
transformFX = {sNodeName = "FX", sComponentName = "Transform"},
imageFX = {sNodeName = "FX", sComponentName = "Image"},
imageType = {sNodeName = "type", sComponentName = "Image"},
imageFXFire = {sNodeName = "fx_fire", sComponentName = "Image"},
transformQTE = {sNodeName = "QTE", sComponentName = "Transform"},
imageQteLoading = {
sNodeName = "qte_loading",
sComponentName = "Image"
},
ICON = {sComponentName = "Image"},
transformCD = {sNodeName = "CD", sComponentName = "Transform"},
TMP_CD = {sNodeName = "CD_TMP", sComponentName = "TMP_Text"},
transformCharge = {sNodeName = "Charge", sComponentName = "Transform"},
tbTransformRotate = {
sNodeName = "rotate",
nCount = 2,
sComponentName = "Transform"
},
imageChargeLoading = {
sNodeName = "charge_loading",
nCount = 2,
sComponentName = "Image"
},
TMP_Charge = {sNodeName = "Charge_TMP", sComponentName = "TMP_Text"},
fx = {sComponentName = "Image"},
glow = {sComponentName = "Image"},
Charge_Max_glow = {},
transformCharge_glow = {
sNodeName = "Charge_Max_glow",
sComponentName = "Transform"
},
Img_Charge_glow = {
sNodeName = "Charge_Max_glow",
sComponentName = "Image"
},
Transform_ChargeLoading = {
sNodeName = "charge_loading1",
sComponentName = "Transform"
},
transformX = {sNodeName = "X", sComponentName = "Transform"},
fx_tip = {},
transformXcd = {sNodeName = "Xcd", sComponentName = "Transform"},
imgPressed = {sNodeName = "pressed", sComponentName = "Image"},
imgXtips = {sNodeName = "Xtips", sComponentName = "Image"},
Action = {
sCtrlName = "Game.UI.Battle.SkillActionIconCtrl"
},
Empty = {},
Action_Pos = {sComponentName = "Transform"},
Action_Pos_Hor = {sComponentName = "Transform"}
}
SkillBtnCtrl._mapEventConfig = {
Open_Ultra_Special_FX = "OpenUltraSpecialFX",
[EventId.SettingsBattleClose] = "OnEvent_ChangeKeyLayout"
}
function SkillBtnCtrl:Awake()
self.BTN = self.gameObject:GetComponent("ButtonEx")
self.AnimFX = self.gameObject:GetComponent("Animator")
self.tbUltraColor = {
"#69C6F6",
"#FA886E",
"#FFAE67",
"#B0EE50",
"#FACC55",
"#ED78DF"
}
self.bCanUse = true
self.bInCD = false
self.nCDpercent = 0
self.nSectionNum = 0
self.bInCharge = true
self.bCanPlayCDSound = true
self.canFresh = true
self:SetActionLayout()
self:SetCDTextSize()
self._mapNode.fx_tip:SetActive(false)
self.bChargeLoading_CurrentIsActive = nil
end
function SkillBtnCtrl:InitSkillBtn(EET, icon, bShowSection, charId, actionId, bIsSupportChar)
self:SetMainAlpha(true)
self.EET = EET
self.ActionId = actionId
self.tmpActionPosId = charId * 10 + self.ActionId
self.bShowSection = bShowSection
self._mapNode.TMP_Charge.gameObject:SetActive(bShowSection)
if 0 < EET then
local _, _color = ColorUtility.TryParseHtmlString(self.tbUltraColor[EET])
local _, _colorFire = ColorUtility.TryParseHtmlString(eftColor[EET])
NovaAPI.SetImageColor(self._mapNode.imageFX, _color)
NovaAPI.SetImageColor(self._mapNode.imageChargeLoading[1], _color)
NovaAPI.SetImageColor(self._mapNode.imageChargeLoading[2], _color)
NovaAPI.SetImageColor(self._mapNode.fx, _color)
NovaAPI.SetImageColor(self._mapNode.glow, _color)
NovaAPI.SetImageColor(self._mapNode.imageFXFire, _colorFire)
NovaAPI.SetImageColor(self._mapNode.Img_Charge_glow, _color)
self:SetAtlasSprite(self._mapNode.imageType, "15_battle", "skill_btn_b_type_" .. tostring(EET))
end
self:SetPngSprite(self._mapNode.ICON, icon)
self._mapNode.transformCharge.localScale = Vector3.zero
self._mapNode.CanvasGroupMain.gameObject:SetActive(true)
self._mapNode.Action.gameObject:SetActive(true)
self._mapNode.Empty:SetActive(false)
self.bIsSupportChar = bIsSupportChar == true
if self.bIsSupportChar == true then
self.parentCanvasGroup = self.gameObject.transform.parent.parent.parent:GetComponent("CanvasGroup")
else
self.parentCanvasGroup = self.gameObject.transform.parent.parent:GetComponent("CanvasGroup")
end
end
function SkillBtnCtrl:SetEmptySkillBtn()
self._mapNode.CanvasGroupMain.gameObject:SetActive(false)
self._mapNode.Action.gameObject:SetActive(false)
self._mapNode.TMP_Charge.gameObject:SetActive(false)
self._mapNode.transformCharge.localScale = Vector3.zero
self._mapNode.Empty:SetActive(true)
end
function SkillBtnCtrl:RefreshBtn(bSuportSkillUseable, QTEpercent, CDpercent, CDsecond, ChargePercent, ChargeSectionNum, nTotalSectionNum, bBeginResume)
if self.canFresh == false then
return
end
local bCanUse = false
if self.ActionId == SKILL_ULTRA then
bCanUse = 1 <= ChargeSectionNum and 1 <= ChargePercent and CDpercent <= 0
else
bCanUse = 1 <= ChargeSectionNum
end
if self.bIsSupportChar == true and bCanUse then
bCanUse = bSuportSkillUseable
end
if self.bShowSection ~= (1 < nTotalSectionNum) then
self.bShowSection = 1 < nTotalSectionNum
self._mapNode.TMP_Charge.gameObject:SetActive(self.bShowSection)
end
local sAnimName, sFxSoundName
if self.bCanUse == true then
if bCanUse == true then
if 1 < nTotalSectionNum and ChargeSectionNum > self.nSectionNum then
if self.ActionId == SKILL_ULTRA then
sAnimName = "BattlecgUltra_in0" .. self.EET
sFxSoundName = "ui_skill_freeze_ultra_ok"
elseif self.ActionId == SKILL_A then
sAnimName = "BattlecgSkill_in0" .. self.EET
sFxSoundName = "ui_skill_freeze_ok"
elseif self.ActionId == SKILL_FLEE then
sAnimName = "BattlecgSkill_in"
end
end
elseif self.ActionId ~= 1 then
NovaAPI.DispatchEventWithData("CHAR_ULTRA_CAN_USE", nil, {
self.tmpActionPosId,
false
})
end
elseif bCanUse == true then
if self.ActionId == SKILL_ULTRA then
sAnimName = "BattlecgUltra_in0" .. self.EET
sFxSoundName = "ui_skill_freeze_ultra_ok"
elseif self.ActionId == SKILL_A then
sAnimName = "BattlecgSkill_in0" .. self.EET
sFxSoundName = "ui_skill_freeze_ok"
elseif self.ActionId == SKILL_FLEE then
sAnimName = "BattlecgSkill_in"
end
if self.ActionId ~= 1 then
NovaAPI.DispatchEventWithData("CHAR_ULTRA_CAN_USE", nil, {
self.tmpActionPosId,
true
})
else
end
end
if sAnimName ~= nil then
self:PlayAnimFX(sAnimName)
end
if sFxSoundName ~= nil and self.gameObject.activeInHierarchy == true and 0 < NovaAPI.GetCanvasGroupAlpha(self.parentCanvasGroup) then
WwiseAudioMgr:PlaySound(sFxSoundName)
end
self.bCanUse = bCanUse
self.nCDpercent = CDpercent
self.nSectionNum = ChargeSectionNum
self:SetMainAlpha(bCanUse)
self:SetQTE(QTEpercent)
if self.ActionId == SKILL_ULTRA or self.bShowSection then
self:SetCharge(ChargePercent, ChargeSectionNum)
end
self:SetCD(CDpercent, CDsecond, bBeginResume)
self:SetFX(self.ActionId == SKILL_ULTRA and 1 <= ChargePercent and not self.bInCD)
end
function SkillBtnCtrl:SetBtnEnable(bEnable)
self.BTN.interactable = bEnable == true
self:SetMainAlpha(bEnable)
end
function SkillBtnCtrl:SetBtnVisible(bVisible)
self.BTN.gameObject:SetActive(bVisible)
end
function SkillBtnCtrl:GetBtnVisible()
return self.BTN.gameObject.activeSelf
end
function SkillBtnCtrl:SetMainAlpha(bCanUse)
NovaAPI.SetCanvasGroupAlpha(self._mapNode.CanvasGroupMain, bCanUse == true and 1 or 0.3)
end
function SkillBtnCtrl:SetFX(bVisible)
self._mapNode.transformFX.localScale = bVisible == true and Vector3.one or Vector3.zero
end
function SkillBtnCtrl:SetQTE(percent)
if self._mapNode.transformQTE.localScale.x < 1 and 0 < percent then
self.AnimFX:Play("BattlecgUltra_Qte_in")
end
self._mapNode.transformQTE.localScale = 0 < percent and Vector3.one or Vector3.zero
NovaAPI.SetImageFillAmount(self._mapNode.imageQteLoading, percent)
end
function SkillBtnCtrl:PlayAnimFX(sAnimName)
self.AnimFX:Play(sAnimName)
end
function SkillBtnCtrl:SetCD(percent, second, bBeginResume)
self.bInCD = 0 < percent
self._mapNode.transformCD.localScale = self.bInCD == true and Vector3.one or Vector3.zero
self._mapNode.transformXcd.localScale = self.bInCD == true and Vector3.one or Vector3.zero
if 1.0 <= second then
NovaAPI.SetTMPSourceText(self._mapNode.TMP_CD, tostring(math.ceil(second)))
else
NovaAPI.SetTMPSourceText(self._mapNode.TMP_CD, string.format("%.1f", second))
end
self._mapNode.TMP_CD.transform.localScale = bBeginResume == true and Vector3.one or Vector3.zero
local bTargetIsActive = self.bInCD and not self.bInCharge
if self.bChargeLoading_CurrentIsActive ~= bTargetIsActive then
self.bChargeLoading_CurrentIsActive = bTargetIsActive
self._mapNode.Charge_Max_glow:SetActive(self.bChargeLoading_CurrentIsActive)
self._mapNode.Transform_ChargeLoading.gameObject:SetActive(self.bChargeLoading_CurrentIsActive)
end
end
function SkillBtnCtrl:SetCharge(percent, second)
if second == 0 and self.ActionId ~= SKILL_ULTRA then
self._mapNode.transformCharge.localScale = Vector3.zero
NovaAPI.SetTMPSourceText(self._mapNode.TMP_Charge, "")
return
end
self.bInCharge = percent < 1
self._mapNode.transformCharge.localScale = 0 < percent and percent < 1 and Vector3.one or Vector3.zero
self._mapNode.transformCharge_glow.localScale = self.bInCharge and Vector3.zero or Vector3.one
self._mapNode.Transform_ChargeLoading.localScale = self.bInCharge and Vector3.zero or Vector3.one
local tr1 = self._mapNode.tbTransformRotate[1]
local tr2 = self._mapNode.tbTransformRotate[2]
if 0.02 <= percent and percent < 1 then
local v3 = Vector3(0, 0, -percent * 360)
tr1.localScale = Vector3.one
tr1.localEulerAngles = v3
tr2.localScale = Vector3.one
tr2.localEulerAngles = v3
else
tr1.localScale = Vector3.zero
tr2.localScale = Vector3.zero
end
NovaAPI.SetImageFillAmount(self._mapNode.imageChargeLoading[1], percent)
NovaAPI.SetImageFillAmount(self._mapNode.imageChargeLoading[2], percent)
NovaAPI.SetTMPSourceText(self._mapNode.TMP_Charge, tostring(math.floor(second)))
end
function SkillBtnCtrl:SetForbidden(bForbidden)
self._mapNode.transformX.localScale = bForbidden == true and Vector3.one or Vector3.zero
end
function SkillBtnCtrl:OpenUltraSpecialFX(mTmpActionPosId, isShow)
if self.tmpActionPosId == mTmpActionPosId then
self._mapNode.fx_tip:SetActive(isShow)
end
end
function SkillBtnCtrl:Set_SkillHintActive(bActive)
self._mapNode.transformQTE.localScale = bActive == true and Vector3.one or Vector3.zero
self._mapNode.imageQteLoading.transform.localScale = bActive == true and Vector3.zero or Vector3.one
end
function SkillBtnCtrl:SetSupSkillStateByUltimate(bForbidden)
self._mapNode.transformX.localScale = bForbidden == true and Vector3.one or Vector3.zero
self._mapNode.transformCD.gameObject:SetActive(not bForbidden)
end
function SkillBtnCtrl:GetSupSkillForbidden()
return self._mapNode.transformX.localScale == Vector3.one
end
function SkillBtnCtrl:BtnStateChange(nState)
if nState == BTN_STATE.Cancel then
NovaAPI.SetComponentEnable(self._mapNode.imgPressed, false)
NovaAPI.SetComponentEnable(self._mapNode.imgXtips, false)
elseif nState == BTN_STATE.Press then
NovaAPI.SetComponentEnable(self._mapNode.imgPressed, self.bInCD == false and self.bCanUse == true)
NovaAPI.SetComponentEnable(self._mapNode.imgXtips, self.bInCD == true)
if self.bInCD == true and self.gameObject.activeInHierarchy == true and NovaAPI.GetCanvasGroupAlpha(self.parentCanvasGroup) > 0 and self.bCanPlayCDSound then
WwiseAudioMgr:PlaySound("ui_skill_freeze_click")
self.bCanPlayCDSound = false
self:AddTimer(1, 0.5, function()
self.bCanPlayCDSound = true
end, true, true, true)
end
elseif nState == BTN_STATE.Click then
NovaAPI.SetComponentEnable(self._mapNode.imgPressed, false)
NovaAPI.SetComponentEnable(self._mapNode.imgXtips, false)
elseif nState == BTN_STATE.Hold then
NovaAPI.SetComponentEnable(self._mapNode.imgPressed, self.bInCD == false and self.bCanUse == true)
NovaAPI.SetComponentEnable(self._mapNode.imgXtips, self.bInCD == true)
end
end
function SkillBtnCtrl:SetActionBind(sGamepadBind, mapKeyboardBind)
self._mapNode.Action:SetActionBind(sGamepadBind, mapKeyboardBind)
end
function SkillBtnCtrl:SetActionLayout()
local nType = LocalSettingData.GetLocalSettingData("BattleHUD")
if nType == AllEnum.BattleHudType.Horizontal then
self:SetKeyPos(self._mapNode.Action.gameObject:GetComponent("RectTransform"), self._mapNode.Action_Pos_Hor)
else
self:SetKeyPos(self._mapNode.Action.gameObject:GetComponent("RectTransform"), self._mapNode.Action_Pos)
end
end
function SkillBtnCtrl:SetKeyPos(btnTra, parentTra)
btnTra:SetParent(parentTra)
btnTra.anchoredPosition = Vector2.zero
btnTra.localScale = Vector3.one
end
function SkillBtnCtrl:SetCDTextSize()
local nType = LocalSettingData.GetLocalSettingData("BattleHUD")
if nType == AllEnum.BattleHudType.Horizontal then
self._mapNode.TMP_CD.fontSize = 74
else
local parentTra = self.gameObject.transform.parent
local scale = parentTra.localScale
local size = 1 / scale.x * NormalCDSize
self._mapNode.TMP_CD.fontSize = math.ceil(size)
end
end
function SkillBtnCtrl:SetbtnEnable_Prologuel(bEnable)
self.BTN.interactable = bEnable == true
self.canFresh = bEnable
self:SetMainAlpha(bEnable)
if bEnable == false then
self:SetMainAlpha(false)
self:SetFX(false)
self:SetCD(1, 0, false)
end
end
function SkillBtnCtrl:OnEvent_ChangeKeyLayout()
self:SetActionLayout()
self:SetCDTextSize()
end
return SkillBtnCtrl