diff --git a/game/packages/thlib-scripts/THlib/enemy/boss_system.lua b/game/packages/thlib-scripts/THlib/enemy/boss_system.lua index 46152f28..437f1b5e 100644 --- a/game/packages/thlib-scripts/THlib/enemy/boss_system.lua +++ b/game/packages/thlib-scripts/THlib/enemy/boss_system.lua @@ -3,7 +3,6 @@ ---@return lstg.StopWatch local StopWatch = plus.Class() - ---初始化函数 function StopWatch:init() self:Reset() @@ -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 = {} @@ -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 diff --git a/game/packages/thlib-scripts/THlib/ext/ext.lua b/game/packages/thlib-scripts/THlib/ext/ext.lua index 8fb07441..ba84991d 100644 --- a/game/packages/thlib-scripts/THlib/ext/ext.lua +++ b/game/packages/thlib-scripts/THlib/ext/ext.lua @@ -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 --控制录像播放速度时有用 @@ -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) diff --git a/game/packages/thlib-scripts/THlib/ext/ext_replay.lua b/game/packages/thlib-scripts/THlib/ext/ext_replay.lua index 4838c345..abe82fde 100644 --- a/game/packages/thlib-scripts/THlib/ext/ext_replay.lua +++ b/game/packages/thlib-scripts/THlib/ext/ext_replay.lua @@ -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可以被用来检查录像文件的合法性 @@ -74,6 +77,7 @@ function ext.replay.SaveReplay(stageNames, slot, playerName, finish) userName = playerName, group_finish = finish, stages = stages, + gameExtendInfo = Serialize(gameExtendInfo), }) end @@ -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 -- 关闭上一个场景的录像读写 @@ -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) diff --git a/game/packages/thlib-scripts/THlib/ext/ext_stage_data.lua b/game/packages/thlib-scripts/THlib/ext/ext_stage_data.lua new file mode 100644 index 00000000..35137180 --- /dev/null +++ b/game/packages/thlib-scripts/THlib/ext/ext_stage_data.lua @@ -0,0 +1,87 @@ +---------------------------------------- +--- extra stage data + +---@type table|nil +local extraData + +---@type table|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 \ No newline at end of file