Skip to content
This repository was archived by the owner on Aug 28, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 13 additions & 4 deletions game/packages/thlib-scripts/THlib/enemy/boss_system.lua
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
---@return lstg.StopWatch
local StopWatch = plus.Class()


---初始化函数
function StopWatch:init()
self:Reset()
Expand Down Expand Up @@ -739,8 +738,18 @@ function system:popSpellResult()
b._timer = b.timer
b._timeout = b.timeout
end
local t = self.clock:GetElapsed() * time_rate
b._real_timer = t
local tmpvar = lstg.tmpvar
local timerRecordIndex = (tmpvar.timer_record_index or 0) + 1
tmpvar.timer_record_index = timerRecordIndex
local timerRecordName = table.concat({ "boss_timer", timerRecordIndex }, "|")
if ext.replay.IsReplay() then
local t = ext.stage_data.GetStageData(timerRecordName)
b._real_timer = t or 0
else
local t = self.clock:GetElapsed() * time_rate
ext.stage_data.SetStageData(timerRecordName, t)
b._real_timer = t
end
b.timeout = nil
self:finishSpellHist(b._getcard)
local c = {}
Expand Down Expand Up @@ -838,7 +847,7 @@ function system:refresh(part)
b._sp_point_auto = {}
b.__is_waiting = true
b.__hpbartype = -1
self.is_killing = false
self.is_killing = false
end
end

Expand Down
4 changes: 4 additions & 0 deletions game/packages/thlib-scripts/THlib/ext/ext.lua
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ DoFile(extpath .. "ext_replay.lua")
--CHU爷爷的replay系统以及切关函数重载
DoFile(extpath .. "ext_stage_group.lua")
--关卡组
DoFile(extpath .. "ext_stage_data.lua")
--关卡数据

ext.replayTicker = 0
--控制录像播放速度时有用
Expand Down Expand Up @@ -179,6 +181,8 @@ function ChangeGameStage()
lstg.nextvar = nil
end

ext.stage_data.InitStageData()

-- 初始化随机数
if lstg.var.ran_seed then
--Print('RanSeed',lstg.var.ran_seed)
Expand Down
19 changes: 16 additions & 3 deletions game/packages/thlib-scripts/THlib/ext/ext_replay.lua
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,13 @@ end

function ext.replay.SaveReplay(stageNames, slot, playerName, finish)
local stages = {}
local gameExtendInfo = {}
finish = finish or 0
for _, v in ipairs(stageNames) do
assert(replayStages[v], 'Stage not found')
table.insert(stages, replayStages[v])
local replayStage = replayStages[v]
assert(replayStage, 'Stage not found')
table.insert(stages, replayStage)
gameExtendInfo[#stages] = replayStage.stageData or {}
end

-- TODO: gameName和gameVersion可以被用来检查录像文件的合法性
Expand All @@ -74,6 +77,7 @@ function ext.replay.SaveReplay(stageNames, slot, playerName, finish)
userName = playerName,
group_finish = finish,
stages = stages,
gameExtendInfo = Serialize(gameExtendInfo),
})
end

Expand Down Expand Up @@ -126,7 +130,7 @@ function stage.Set(stageName, mode, path)
local recordStage = replayStages[lstg.var.stage_name]
recordStage.score = lstg.var.score
recordStage.stageTime = os.time() - recordStage.stageTime -- TODO:这个方法只保存了大致时间,包括了暂停
--recordStage.stageExtendInfo = Serialize(lstg.var)--错误的保存位置
recordStage.stageData = ext.stage_data.SerializeStageData()
end

-- 关闭上一个场景的录像读写
Expand Down Expand Up @@ -222,6 +226,15 @@ function stage.Set(stageName, mode, path)
lstg.nextvar = DeSerialize(nextRecordStage.stageExtendInfo)
--assert(lstg.var.ran_seed == nextRecordStage.randomSeed) -- 这两个应该相等

--准备额外关卡数据
if replayInfo.gameExtendInfo:match("%S") then
local gameExtendInfo = DeSerialize(replayInfo.gameExtendInfo)
local stageData = gameExtendInfo[replayStageIdx]
if stageData then
ext.stage_data.PrepareStageData(stageData)
end
end

--初始化随机数
--if lstg.var.ran_seed then
--ran:Seed(lstg.var.ran_seed)
Expand Down
87 changes: 87 additions & 0 deletions game/packages/thlib-scripts/THlib/ext/ext_stage_data.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
----------------------------------------
--- extra stage data

---@type table<string|number,string|number|boolean>|nil
local extraData

---@type table<string|number,string|number|boolean>|nil
local nextData

ext.stage_data = {}

---检查 key 的类型是否合法
---@param key any
---@return boolean
local function checkKeyType(key)
local keyType = type(key)
if keyType == "string" or keyType == "number" then
return true
else
lstg.Log(2, string.format("Invalid key type: %s", keyType))
return false, string.format("Key must be a string or number, got %s", keyType)
end
end

---检查 value 的类型是否合法
---@param value any
---@return boolean
local function checkValueType(value)
local valueType = type(value)
if valueType == "string" or valueType == "number" or valueType == "boolean" then
return true
else
lstg.Log(2, string.format("Invalid value type: %s", valueType))
return false, string.format("Value must be a string, number, or boolean, got %s", valueType)
end
end

---设置关卡数据
---@param key string|number
---@param value string|number|boolean
function ext.stage_data.SetStageData(key, value)
if ext.replay.IsReplay() then
error("Cannot set stage data in replay mode")
return
end

assert(extraData, "extraData is not initialized")
assert(checkKeyType(key))
assert(checkValueType(value))
extraData[key] = value
end

---获取关卡数据
---@param key string|number
---@return string|number|boolean|nil
function ext.stage_data.GetStageData(key)
assert(extraData, "extraData is not initialized")
assert(checkKeyType(key))
return extraData[key]
end

---装载关卡数据
function ext.stage_data.InitStageData()
if nextData then
-- 如果 nextData 已经存在,直接使用它
extraData = nextData
nextData = nil
else
-- 否则初始化一个新的空表
extraData = {}
end
end

---序列化关卡数据
---@return string
function ext.stage_data.SerializeStageData()
assert(extraData, "extraData is not initialized")
return Serialize(extraData)
end

---准备关卡数据
---@param data string
function ext.stage_data.PrepareStageData(data)
assert(type(data) == "string", "Data must be a serialized string")
nextData = DeSerialize(data)
assert(type(nextData) == "table", "Deserialized data must be a table")
end