Files
StellaSora_DataLua/lua/game/adventure/startower/startowersettinggate.lua
T
SL1900 08b515afd9 Major Update - 2.0.0.143
EN: 2.0.0.143
CN: 2.0.0.142
JP: 2.0.0.145
KR: 2.0.0.150
2026-10-20 13:00:00 +09:00

114 lines
3.5 KiB
Lua

local StarTowerSettingGate = {}
local objLevelData
local nSerial = 0
local objReadyOwner
local mapTransition = {}
local mapOwnerVersion = {}
local mapRequests = {}
function StarTowerSettingGate.Start(objData)
EventManager.Remove("StarTowerSettingRequestFailed", StarTowerSettingGate, StarTowerSettingGate.OnRequestFailed)
objLevelData = objData
nSerial = nSerial + 1
objReadyOwner = nil
mapTransition = {}
mapOwnerVersion = {}
mapRequests = {}
if objData ~= nil then
EventManager.Add("StarTowerSettingRequestFailed", StarTowerSettingGate, StarTowerSettingGate.OnRequestFailed)
end
end
function StarTowerSettingGate.Stop(objData)
if objLevelData == objData then
StarTowerSettingGate.Start(nil)
end
end
function StarTowerSettingGate.Begin()
nSerial = nSerial + 1
objReadyOwner = nil
return nSerial
end
function StarTowerSettingGate.Ready(objOwner, nExpectedSerial)
if objLevelData ~= nil and nExpectedSerial == nSerial then
objReadyOwner = objOwner
end
end
function StarTowerSettingGate.ReadyAfter(objOwner, nExpectedSerial, nDuration)
if objLevelData == nil then
return
end
local nOwnerVersion = mapOwnerVersion[objOwner] or 0
objOwner:AddTimer(1, nDuration, function()
if (mapOwnerVersion[objOwner] or 0) == nOwnerVersion then
StarTowerSettingGate.Ready(objOwner, nExpectedSerial)
end
end, true, true, true)
end
function StarTowerSettingGate.Transition(objOwner, nDuration)
if objLevelData == nil then
return
end
local mapToken = {}
mapTransition[mapToken] = objOwner
objOwner:AddTimer(1, nDuration, function()
mapTransition[mapToken] = nil
end, true, true, true)
end
function StarTowerSettingGate.Clear(objOwner)
mapOwnerVersion[objOwner] = (mapOwnerVersion[objOwner] or 0) + 1
if objReadyOwner == objOwner then
StarTowerSettingGate.Begin()
end
for mapToken, objTransitionOwner in pairs(mapTransition) do
if objTransitionOwner == objOwner then
mapTransition[mapToken] = nil
end
end
end
function StarTowerSettingGate.ResumeAfterSetting()
local objOwner = objReadyOwner
if objLevelData == nil or objOwner == nil then
return
end
local nExpectedSerial = StarTowerSettingGate.Begin()
local nOwnerVersion = mapOwnerVersion[objOwner] or 0
cs_coroutine.start(function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
if (mapOwnerVersion[objOwner] or 0) == nOwnerVersion then
StarTowerSettingGate.Ready(objOwner, nExpectedSerial)
end
end)
end
function StarTowerSettingGate.BeginRequest(failedCallback)
StarTowerSettingGate.Begin()
local mapToken = {failedCallback = failedCallback}
if objLevelData ~= nil then
mapRequests[mapToken] = nSerial
end
return mapToken
end
function StarTowerSettingGate.FinishRequest(mapToken)
mapRequests[mapToken] = nil
end
function StarTowerSettingGate.OnRequestFailed(_, mapError)
local mapOldestToken
local nOldestSerial = math.huge
for mapToken, nRequestSerial in pairs(mapRequests) do
if nRequestSerial < nOldestSerial then
mapOldestToken = mapToken
nOldestSerial = nRequestSerial
end
end
if mapOldestToken ~= nil then
mapRequests[mapOldestToken] = nil
StarTowerSettingGate.Begin()
if mapOldestToken.failedCallback ~= nil then
mapOldestToken.failedCallback(mapError)
end
end
end
function StarTowerSettingGate.CanOpen(objData)
return objData ~= nil and objLevelData == objData and objReadyOwner ~= nil and next(mapTransition) == nil and next(mapRequests) == nil and objData.bEnd ~= true and not objData:IsAutoDecisionEnabled() and not objData:IsAutoDecisionBusy()
end
return StarTowerSettingGate