Files
StellaSora_DataLua/lua/game/ui/soldier/battleevent/soldierresolveadisputectrl.lua
T
SL1900 8c4bd41668 Update - 1.13.0.124
EN: 1.13.0.124
CN: 1.13.0.124
JP: 1.13.0.128
KR: 1.13.0.130
2026-07-21 12:30:00 +09:00

350 lines
12 KiB
Lua

local SoldierResolveadisputeCtrl = class("SoldierResolveadisputeCtrl", BaseCtrl)
local Camera = CS.UnityEngine.Camera
local Light = CS.UnityEngine.Light
local Animator = CS.UnityEngine.Animator
local AudioListener = CS.UnityEngine.AudioListener
local RawImage = CS.UnityEngine.UI.RawImage
local ClientManager = CS.ClientManager
local GameObject = CS.UnityEngine.GameObject
local typeof = typeof
local DICE_PREFAB_PATH_MAP = {
[1] = "UI/Soldier/Dice/Prefab/Dice01.prefab",
[2] = "UI/Soldier/Dice/Prefab/Dice02.prefab"
}
local DICE_RAW_IMAGE_NODE_NAME = "rimgDiceModel"
local DICE_LAYER_NAME = "Cam_Layer_1"
local DICE_WORLD_ROOT_NAME = "SoldierResolveadisputeDice3DRoot"
local DICE_WORLD_ROOT_POSITION = Vector3(10000, 0, 0)
local DICE_ROLL_MIN_TIME = 1
local DICE_RESULT_TIME = 1.0
local DICE_ANIM_NAME = "Soldier_Dice01_Num_"
SoldierResolveadisputeCtrl._mapNodeConfig = {
btnConfirm = {
sComponentName = "UIButton",
callback = "OnBtnClick_Confirm"
},
txtConfirmBtn = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Resolveadispute_Confirm"
},
btnClose = {
sComponentName = "UIButton",
callback = "OnBtnClick_Close"
},
txtTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Soldier_Resolveadispute_Title"
},
txtSucessTip = {sComponentName = "TMP_Text"},
txtBlank = {
sComponentName = "TMP_Text",
sLanguageId = "Tips_Continue"
},
txtFinalPoint = {
sComponentName = "TMP_Text",
sLanguageId = "SoldierBattleEvent_FinalPoint"
},
txtFinalPointNum = {sComponentName = "TMP_Text"},
goNodeResultTitle = {},
trRawImage = {
sComponentName = "RectTransform"
},
animFx_Tips = {sNodeName = "Fx_Tips", sComponentName = "Animator"},
Win = {},
Lose = {}
}
SoldierResolveadisputeCtrl._mapEventConfig = {}
SoldierResolveadisputeCtrl._mapRedDotConfig = {}
local function FindChildTransform(trRoot, sName)
if trRoot == nil or type(sName) ~= "string" then
return nil
end
if trRoot.name == sName then
return trRoot
end
local nChildCount = trRoot.childCount - 1
for i = 0, nChildCount do
local trChild = trRoot:GetChild(i)
local trResult = FindChildTransform(trChild, sName)
if trResult ~= nil then
return trResult
end
end
return nil
end
function SoldierResolveadisputeCtrl:Awake()
self.bActive = true
self.bDiceCasted = false
self.mDice3DData = {}
self._mapNode.trRawImage.gameObject:SetActive(true)
self:BuildDice3DData()
end
function SoldierResolveadisputeCtrl:OnEnable()
self.bActive = true
self.bDiceCasted = false
self.bRollMinFinished = false
self.nPendingDicePoint = nil
self._mapNode.btnClose.gameObject:SetActive(false)
self._mapNode.btnConfirm.gameObject:SetActive(true)
self._mapNode.txtBlank.gameObject:SetActive(false)
self._mapNode.goNodeResultTitle.gameObject:SetActive(false)
local tbDicePointLevel = ConfigTable.GetConfigArray("SoldierChessEventBattle")
local nPointGreatSuccess = tbDicePointLevel[3]
local sText = orderedFormat(ConfigTable.GetUIText("Soldier_Resolveadispute_SucessTip"), nPointGreatSuccess)
NovaAPI.SetTMPText(self._mapNode.txtSucessTip, sText)
end
function SoldierResolveadisputeCtrl:OnDisable()
self.bActive = false
end
function SoldierResolveadisputeCtrl:GetDiceCount()
local soldierLevelData = PlayerData.SoldierData:GetCurLevelData()
if soldierLevelData == nil then
return 1
end
local eventBattleData = soldierLevelData:GetEventBattleData()
if eventBattleData == nil then
return 1
end
local bTwoDice = eventBattleData.bTwoDice
return bTwoDice and 2 or 1
end
function SoldierResolveadisputeCtrl:BuildDice3DData()
self.bTwoDice = self:GetDiceCount() == 2
local sDicePrefabPath = DICE_PREFAB_PATH_MAP[self:GetDiceCount()]
if sDicePrefabPath == nil or sDicePrefabPath == "" then
return
end
if self._mapNode.trRawImage == nil then
return
end
local nLayerIndex = NovaAPI.LayerMaskName2Layer(DICE_LAYER_NAME)
local nLayerMask = NovaAPI.LayerMaskGetMask(DICE_LAYER_NAME)
local prefab = self:LoadAsset(sDicePrefabPath, typeof(GameObject))
if prefab == nil then
return
end
local goWorldRoot = GameObject(DICE_WORLD_ROOT_NAME)
goWorldRoot.transform.position = DICE_WORLD_ROOT_POSITION
goWorldRoot.transform.localEulerAngles = Vector3(0, 0, 0)
goWorldRoot.transform.localScale = Vector3.one
self.mDice3DData.worldRoot = goWorldRoot
local go = instantiate(prefab, goWorldRoot.transform)
if go == nil then
return
end
go.transform.localPosition = Vector3(0, 0, 0)
go.transform.localEulerAngles = Vector3(0, 0, 0)
go.transform.localScale = Vector3.one
go.transform:SetLayerRecursively(nLayerIndex)
self.mDice3DData.gameObject = go
self.mDice3DData.rawImage = self._mapNode.trRawImage:GetComponent(typeof(RawImage))
if self.mDice3DData.rawImage == nil then
return
end
local trCamera = FindChildTransform(go.transform, "Camera")
if trCamera == nil then
return
end
self.mDice3DData.camera = trCamera:GetComponent(typeof(Camera))
if self.mDice3DData.camera == nil then
return
end
self.mDice3DData.camera.cullingMask = nLayerMask
self.mDice3DData.camera:SetCameraVolumeLayerMask(nLayerMask)
local tbLight = go:GetComponentsInChildren(typeof(Light), true)
for i = 0, tbLight.Length - 1 do
tbLight[i].cullingMask = nLayerMask
end
local tbAudioListener = go:GetComponentsInChildren(typeof(AudioListener), true)
for i = 0, tbAudioListener.Length - 1 do
tbAudioListener[i].enabled = false
end
if self.bTwoDice == false then
local trNumber = FindChildTransform(go.transform, "Number")
local trAnimRotation = FindChildTransform(go.transform, "Anim_Rotation")
if trNumber ~= nil then
self.mDice3DData.animDice01Num = trNumber:GetComponent(typeof(Animator))
end
if trAnimRotation ~= nil then
self.mDice3DData.animDice01Rot = trAnimRotation:GetComponent(typeof(Animator))
end
else
local trNumber_L = FindChildTransform(go.transform, "Number_L")
if trNumber_L ~= nil then
self.mDice3DData.animDice02Num_L = trNumber_L:GetComponent(typeof(Animator))
end
local trNumber_R = FindChildTransform(go.transform, "Number_R")
if trNumber_R ~= nil then
self.mDice3DData.animDice02Num_R = trNumber_R:GetComponent(typeof(Animator))
end
local trAnimRotation = FindChildTransform(go.transform, "Anim_Rotation")
if trAnimRotation ~= nil then
self.mDice3DData.animDice02Rot = trAnimRotation:GetComponent(typeof(Animator))
end
end
local v2Resolution = Vector2(2160, 1080)
local nRTSizeX = math.floor(v2Resolution.x * Settings.RENDERTEXTURE_SIZE_FACTOR)
local nRTSizeY = math.floor(v2Resolution.y * Settings.RENDERTEXTURE_SIZE_FACTOR)
self.mDice3DData.cameraRT = GameUIUtils.GenerateRenderTextureFor3D(nRTSizeX, nRTSizeY)
self._mapNode.trRawImage.sizeDelta = v2Resolution
self.mDice3DData.camera.targetTexture = self.mDice3DData.cameraRT
NovaAPI.SetTexture(self.mDice3DData.rawImage, self.mDice3DData.cameraRT)
end
function SoldierResolveadisputeCtrl:HasDiceAnim()
return self.mDice3DData.animDice01Rot ~= nil or self.mDice3DData.animDice02Rot ~= nil
end
function SoldierResolveadisputeCtrl:PlayDiceRollAnim()
self._mapNode.trRawImage.gameObject:SetActive(true)
if self.bTwoDice == false then
if self.mDice3DData.animDice01Rot ~= nil then
self.mDice3DData.animDice01Rot:Play("Soldier_Dice01_Start")
end
elseif self.mDice3DData.animDice02Rot ~= nil then
self.mDice3DData.animDice02Rot:Play("Soldier_Dice02_Start")
end
CS.WwiseAudioManager.Instance:PostEvent("mode_900001_chess_result_resolve_tossSwing")
end
function SoldierResolveadisputeCtrl:OnDiceRollMinFinished()
self.bRollMinFinished = true
self:TryPlayDiceResultAnim()
end
function SoldierResolveadisputeCtrl:TryPlayDiceResultAnim()
self._mapNode.trRawImage.gameObject:SetActive(true)
if self.nPendingDicePoint == nil then
return
end
if self:HasDiceAnim() == false then
self:OnDiceResultAnimEnd()
return
end
if self.bRollMinFinished ~= true then
return
end
local nAnimTime = 0
if self.bTwoDice == false and self.mDice3DData.animDice01Num ~= nil then
local nAnimPoint = math.max(1, math.min(20, self.nPendingDicePoint or 1))
local sAnimName = "Soldier_Dice01_Num_" .. nAnimPoint
self.mDice3DData.animDice01Num:Play(sAnimName)
nAnimTime = NovaAPI.GetAnimClipLength(self.mDice3DData.animDice01Num, {sAnimName})
end
if self.bTwoDice == true then
math.randomseed(os.time())
math.random()
math.random()
math.random()
local nFinalPoint = self.nPendingDicePoint or 0
local nRandomLeftOrRight = math.random(1, 2)
local nDice1 = 0
local nDice2 = 0
if nRandomLeftOrRight == 1 then
nDice1 = nFinalPoint
nDice2 = math.random(1, nFinalPoint - 1)
else
nDice2 = nFinalPoint
nDice1 = math.random(1, nFinalPoint - 1)
end
local nAnimTime_L = 0
local nAnimTime_R = 0
if self.mDice3DData.animDice02Num_L ~= nil then
local sAnimName = "Soldier_Dice02_Num_" .. nDice1
self.mDice3DData.animDice02Num_L:Play(sAnimName)
nAnimTime_L = NovaAPI.GetAnimClipLength(self.mDice3DData.animDice02Num_L, {sAnimName})
end
if self.mDice3DData.animDice02Num_R ~= nil then
local sAnimName = "Soldier_Dice02_Num_" .. nDice2
self.mDice3DData.animDice02Num_R:Play(sAnimName)
nAnimTime_R = NovaAPI.GetAnimClipLength(self.mDice3DData.animDice02Num_R, {sAnimName})
end
nAnimTime = math.max(nAnimTime_L, nAnimTime_R)
end
self:AddTimer(1, nAnimTime, "OnDiceResultAnimEnd", true, true, true)
end
function SoldierResolveadisputeCtrl:OnDiceResultAnimEnd()
if self.bActive ~= true then
return
end
NovaAPI.SetTMPText(self._mapNode.txtFinalPointNum, self.nPendingDicePoint or 0)
local tbDicePointLevel = ConfigTable.GetConfigArray("SoldierChessEventBattle")
if tbDicePointLevel ~= nil then
local nMinPoint = tonumber(tbDicePointLevel[1]) or 0
local sAnimName = ""
local sSoundName = ""
if nMinPoint <= self.nPendingDicePoint then
self._mapNode.Win.gameObject:SetActive(true)
self._mapNode.Lose.gameObject:SetActive(false)
sAnimName = "SoldierResolveadisputeTips_Win"
sSoundName = "mode_900001_chess_result_resolve_toss_goodEnd"
else
self._mapNode.Lose.gameObject:SetActive(true)
self._mapNode.Win.gameObject:SetActive(false)
sAnimName = "SoldierResolveadisputeTips_Lose"
sSoundName = "mode_900001_chess_result_resolve_toss_badEnd"
end
if sAnimName ~= "" then
self._mapNode.animFx_Tips:Play(sAnimName)
end
if sSoundName ~= "" then
CS.WwiseAudioManager.Instance:PostEvent(sSoundName)
end
end
self.bDiceCasted = false
self._mapNode.txtBlank.gameObject:SetActive(true)
self._mapNode.btnConfirm.gameObject:SetActive(false)
self._mapNode.btnClose.gameObject:SetActive(true)
self._mapNode.goNodeResultTitle.gameObject:SetActive(true)
EventManager.Hit("SoldierDiceCasted")
end
function SoldierResolveadisputeCtrl:OnBtnClick_Confirm()
if self.bDiceCasted == true then
return
end
self._mapNode.btnConfirm.gameObject:SetActive(false)
self.bDiceCasted = true
self.bRollMinFinished = false
self.nPendingDicePoint = nil
self:PlayDiceRollAnim()
if self:HasDiceAnim() == true then
self:AddTimer(1, DICE_ROLL_MIN_TIME, "OnDiceRollMinFinished", true, true, true)
else
self.bRollMinFinished = true
end
local soldierLevelData = PlayerData.SoldierData:GetCurLevelData()
if soldierLevelData ~= nil then
soldierLevelData:SendEventBattleThrowDice(function()
if self.bActive ~= true then
return
end
self.nPendingDicePoint = soldierLevelData:GetEventBattleData().nPoint or 0
self:TryPlayDiceResultAnim()
end)
else
self.nPendingDicePoint = 0
self:TryPlayDiceResultAnim()
end
end
function SoldierResolveadisputeCtrl:OnBtnClick_Close()
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierResolveadisputePanel)
end
function SoldierResolveadisputeCtrl:OnDestroy()
if self.mDice3DData.cameraRT ~= nil then
if self.mDice3DData.camera ~= nil then
self.mDice3DData.camera.targetTexture = nil
end
if self.mDice3DData.rawImage ~= nil then
NovaAPI.SetTexture(self.mDice3DData.rawImage, nil)
end
GameUIUtils.ReleaseRenderTexture(self.mDice3DData.cameraRT)
self.mDice3DData.cameraRT = nil
end
if self.mDice3DData.worldRoot ~= nil then
destroy(self.mDice3DData.worldRoot)
self.mDice3DData.worldRoot = nil
self.mDice3DData.gameObject = nil
elseif self.mDice3DData.gameObject ~= nil then
destroy(self.mDice3DData.gameObject)
self.mDice3DData.gameObject = nil
end
self.mDice3DData = {}
end
return SoldierResolveadisputeCtrl