2025-04-19 20:54:16 +08:00

672 lines
31 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local ____lualib = require("lualib_bundle")
local __TS__ObjectKeys = ____lualib.__TS__ObjectKeys
local __TS__StringReplaceAll = ____lualib.__TS__StringReplaceAll
local __TS__StringReplace = ____lualib.__TS__StringReplace
local __TS__ArrayMap = ____lualib.__TS__ArrayMap
local __TS__StringAccess = ____lualib.__TS__StringAccess
local __TS__ArrayUnshift = ____lualib.__TS__ArrayUnshift
local __TS__New = ____lualib.__TS__New
local __TS__StringSplit = ____lualib.__TS__StringSplit
local __TS__ArrayPushArray = ____lualib.__TS__ArrayPushArray
local __TS__ArraySplice = ____lualib.__TS__ArraySplice
local __TS__StringSlice = ____lualib.__TS__StringSlice
local __TS__ArraySlice = ____lualib.__TS__ArraySlice
local __TS__Number = ____lualib.__TS__Number
local __TS__NumberIsInteger = ____lualib.__TS__NumberIsInteger
local __TS__StringIncludes = ____lualib.__TS__StringIncludes
local __TS__NumberIsNaN = ____lualib.__TS__NumberIsNaN
local __TS__StringStartsWith = ____lualib.__TS__StringStartsWith
local __TS__StringEndsWith = ____lualib.__TS__StringEndsWith
local ____exports = {}
local ____storyteller = require("code.engine.storyteller")
local ST = ____storyteller.ST
local STPoint = ____storyteller.STPoint
local STRectangle = ____storyteller.STRectangle
local STText = ____storyteller.STText
local ____global = require("code.global")
local accessor = ____global.accessor
local world = ____global.world
local utf8 = require("utf8")
local function textGen()
local sk = { {} }
local keys = __TS__ObjectKeys(world.schema)
table.sort(keys)
for ____, key in ipairs(keys) do
local ar = sk[#sk]
if #ar == 13 then
sk[#sk + 1] = { key }
else
ar[#ar + 1] = key
end
end
local help = { {} }
for ____, line in ipairs({
"ed - 开启/关闭碰撞箱显示",
"fc - 开启/关闭自由视角",
"fps - 获取当前fps",
"fps <value> - 设置当前fps",
"help [page] - (当前命令)",
"r - 读取存档",
"reset [level] - 重置存档",
"rm - 获取当前地图房间号",
"rm <value> - 设置当前地图房间号",
"sk [page] - 获取存档文件键名",
"spd - 获取当前人物速度",
"spd <value> - 设置当前人物速度",
"sv <key> - 获取存档文件键值",
"sv <key> <value> - 设置存档文件键值",
"tp <x> <y> - 传送玩家"
}) do
local ar = help[#help]
if #ar == 13 then
help[#help + 1] = { line }
else
ar[#ar + 1] = line
end
end
return {
ed_on = "已开启碰撞箱显示",
ed_off = "已关闭碰撞箱显示",
fc_prq = "{color=0xff3f3f}没有地图以启用自由视角!",
fc_on = "已开启自由视角(鼠标左键拖拽,滚轮缩放)",
fc_off = "已关闭自由视角",
fps_err = "{color=0xff3f3f}参数\"<x>\"无效!\n请输入1~60的整数",
fps_get = "当前FPS为 <x>",
fps_set = "当前FPS已设为 <x>",
help_err = ("{color=0xff3f3f}参数\"<x>\"无效!\n请输入1~" .. tostring(#help)) .. "的整数!",
help_header = ("帮助(第 <x> 页,总页数:" .. tostring(#help)) .. "",
help_pages = __TS__ArrayMap(
help,
function(____, lines)
return table.concat(
__TS__ArrayMap(
lines,
function(____, line)
return "{color=0x7f7fff}" .. __TS__StringReplace(
__TS__StringReplaceAll(
__TS__StringReplaceAll(
__TS__StringReplaceAll(
__TS__StringReplaceAll(line, "<", "{color=0xffff7f}<"),
">",
">{color=0xffffff}"
),
"[",
"{color=0xff7fff}["
),
"]",
"]{color=0xffffff}"
),
" - ",
"{color=0xffffff} - "
)
end
),
"\n"
)
end
),
hint = "按ESC键打开控制台。",
reset_err = "{color=0xff3f3f}参数\"<x>\"无效!\n请输入0~2的整数",
rm_err = "{color=0xff3f3f}参数\"<x>\"无效!\n请输入0~<y>的整数!",
rm_get = "当前房间号为 {color=0x7f7fff}<x>{color=0xffffff}",
rm_set = "当前房间号已设为 {color=0x7f7fff}<x>{color=0xffffff}",
rm_prq = "{color=0xff3f3f}没有地图以设置房间号!",
sk_err = ("{color=0xff3f3f}参数\"<x>\"无效!\n请输入1~" .. tostring(#sk)) .. "的整数!",
sk_header = ("存档文件键名 (当前页数: <x> ,总页数: " .. tostring(#sk)) .. "",
sk_pages = __TS__ArrayMap(
sk,
function(____, keys)
return table.concat(
__TS__ArrayMap(
keys,
function(____, key)
return __TS__StringAccess(key, 0) == "$" and "{color=0xff7fff}" .. key or
(__TS__StringAccess(key, 0) == "_" and "{color=0xffff7f}" .. key or "{color=0x7f7fff}" .. key)
end
),
"\n"
)
end
),
spd_err = "{color=0xff3f3f}参数\"<x>\"无效!\n请输入1~2的数字",
spd_get = "当前人物速度为 <x>",
spd_set = "当前人物速度已设为 <x>",
sv_arg = "{color=0xff3f3f}至少需要1个参数",
sv_err1 =
"{color=0xff3f3f}\"<x>\"不是一个有效的存档文件键名!\n使用\"{color=0x7f7fff}sk{color=0xffffff}\"指令显示存档文件键名列表。",
sv_err2 =
"{color=0xff3f3f}\"<x>\"不是一个有效的存档文件键值!\n请参考\"{color=0x7f7fff}sv{color=0xffff7f}<key>{color=0xffffff}\"指令的输出。",
sv_get = "当前 {color=0x7f7fff}<x>{color=0xffffff} 的值为 {color=0x7f7fff}<y>{color=0xffffff}",
sv_set = "当前 {color=0x7f7fff}<x>{color=0xffffff} 的值已设为 {color=0x7f7fff}<y>{color=0xffffff}",
tp = "已传送至 {color=0x7f7fff}<x>{color=0xffffff}x {color=0x7f7fff}<y>{color=0xffffff}y",
tp_arg = "{color=0xff3f3f}至少需要2个参数",
tp_err1 = "{color=0xff3f3f}参数\"<x>\"无效!\n请输入一个数字!",
tp_prq = "{color=0xff3f3f}没有玩家可传送!",
unknown =
"{color=0xff3f3f}\"<x>\"不是一条有效指令!\n{color=0xffffff}使用\"{color=0x7f7fff}help{color=0xffffff}\"显示可用指令列表。"
}
end
local function dybug(assets, canActivate)
if canActivate == nil then
canActivate = accessor["$option_debug"]
end
local text = textGen()
local dybug
dybug = {
active = false,
history = { "" },
history_index = 0,
input = function(self)
return dybug.history[dybug.history_index + 1]
end,
input_update = function(self, v)
if dybug.history_index ~= 0 then
dybug.history_index = 0
if dybug.history[1] ~= "" then
__TS__ArrayUnshift(dybug.history, v)
if #dybug.history == 1000 then
table.remove(dybug.history)
end
return
end
end
dybug.history[1] = v
end,
canActivate = canActivate,
cam_free = __TS__New(STPoint),
cam_standby = nil,
destroy = function(self)
love.keypressed = nil
love.wheelmoved = nil
love.textinput = nil
end,
display = __TS__New(STText,
{ font = assets["f$helloplayer"], offset = { x = -235, y = -175 }, priority = 1000000000, scale = 0.5 })
:addTicker(function(self)
if not dybug.canActivate then
self.alpha.value = 0
self.content = ""
elseif not dybug.active then
self.alpha.value = 0.5
self.content = text.hint
else
self.alpha.value = 1
self.content = ""
end
local ____opt_0 = dybug.map
if (____opt_0 and ____opt_0.camera) ~= dybug.cam_free then
return
end
local width, height = love.window.getMode()
local x = love.mouse.getX() * (ST.width / width)
local y = love.mouse.getY() * (ST.height / height)
if love.mouse.isDown(1) then
dybug.cam_free.x = dybug.mouse.value_camera.x - (x - dybug.mouse.click.x) / dybug.map.scale.x
dybug.cam_free.y = dybug.mouse.value_camera.y - (y - dybug.mouse.click.y) / dybug.map.scale.y
else
dybug.mouse.value_camera.x = dybug.cam_free.x
dybug.mouse.value_camera.y = dybug.cam_free.y
dybug.mouse.click.x = x
dybug.mouse.click.y = y
end
end),
log = {},
map = nil,
mouse = { click = { x = 0, y = 0 }, value_camera = { x = 0, y = 0 } },
player = nil,
print = function(self, ...)
local lines = { ... }
for ____, line in ipairs(lines) do
__TS__ArrayPushArray(
dybug.log,
__TS__StringSplit(line, "\n")
)
end
if #dybug.log <= 14 then
return
end
__TS__ArraySplice(dybug.log, 0, #dybug.log - 14)
end,
start = function(self)
if not dybug.canActivate then
return
end
dybug.active = true
dybug.display:attach(
__TS__New(STRectangle, {
scale = 2,
position = { y = 45 * 2 },
anchor = { x = 0.5, y = 1 },
size = { x = 240, y = 105 },
alpha = 0.5,
color = 0
}),
__TS__New(STRectangle, {
scale = 2,
position = { y = 60 * 2 },
anchor = { x = 0.5, y = 1 },
size = { x = 240, y = 15 },
alpha = 0.5
}),
__TS__New(STText, { font = assets["f$helloplayer"], position = { x = -120 * 2 + 5, y = -60 * 2 + 5 } })
:addTicker(function(self)
self.content = table.concat(dybug.log, "\n{reset}")
end),
__TS__New(STText,
{ font = assets["f$helloplayer"], position = { x = -120 * 2 + 5, y = 60 * 2 - 5 }, anchor = { y = 1 }, plain = true })
:addTicker(function(self)
self.content = dybug:input() .. "_"
end)
)
__TS__ArrayUnshift(dybug.history, "")
if #dybug.history == 1000 then
table.remove(dybug.history)
end
dybug.history_index = 0
end,
stop = function(self)
dybug.active = false
dybug.display:clear()
end
}
love.keypressed = function(key)
if not dybug.canActivate then
return
end
repeat
local ____switch41 = key
local ____cond41 = ____switch41 == "escape"
if ____cond41 then
if dybug.active then
dybug:stop()
else
dybug:start()
end
break
end
____cond41 = ____cond41 or ____switch41 == "backspace"
if ____cond41 then
do
if not dybug.active then
break
end
if love.keyboard.isDown("lctrl") or love.keyboard.isDown("rctrl") then
dybug:input_update("")
else
local input = dybug:input()
local length = utf8.len(input)
if length == 0 then
return
end
dybug:input_update(__TS__StringSlice(
input,
0,
utf8.offset(input, length) - 1
))
end
break
end
end
____cond41 = ____cond41 or ____switch41 == "up"
if ____cond41 then
dybug.history_index = math.min(dybug.history_index + 1, #dybug.history - 1)
break
end
____cond41 = ____cond41 or ____switch41 == "down"
if ____cond41 then
dybug.history_index = math.max(dybug.history_index - 1, 0)
break
end
____cond41 = ____cond41 or ____switch41 == "return"
if ____cond41 then
do
if not dybug.active then
break
end
local input = dybug:input()
dybug:input_update(input)
local ____TS__StringSplit_result_2 = __TS__StringSplit(input, " ")
local name = ____TS__StringSplit_result_2[1]
local args = __TS__ArraySlice(____TS__StringSplit_result_2, 1)
__TS__ArrayUnshift(dybug.history, "")
if #dybug.history == 1000 then
table.remove(dybug.history)
end
dybug.history_index = 0
repeat
local ____switch52 = name
local level
local ____cond52 = ____switch52 == "ed"
if ____cond52 then
if ST.debug then
ST.debug = false
dybug:print(text.ed_off)
else
ST.debug = true
dybug:print(text.ed_on)
end
break
end
____cond52 = ____cond52 or ____switch52 == "fc"
if ____cond52 then
if dybug.map == nil then
dybug:print(text.fc_prq)
elseif dybug.cam_standby == nil then
dybug.cam_standby = dybug.map.camera
dybug.cam_free:set(dybug.cam_standby)
dybug.map.camera = dybug.cam_free
dybug.map:cam_free()
dybug.map.autorestore = false
dybug:print(text.fc_on)
else
dybug.map.autorestore = true
local rm = dybug.map.rooms[dybug.map.room + 1]
dybug.map:cam_restore(rm.camera_min, rm.camera_max)
dybug.map.camera = dybug.cam_standby
dybug.cam_free:set(0)
dybug.cam_standby = nil
dybug.map.scale:set(1)
dybug:print(text.fc_off)
end
break
end
____cond52 = ____cond52 or ____switch52 == "fps"
if ____cond52 then
if #args == 0 then
dybug:print(__TS__StringReplace(
text.fps_get,
"<x>",
tostring(ST.fps)
))
else
local num = __TS__Number(args[1])
if __TS__NumberIsInteger(num) and 1 <= num and num <= 60 and not __TS__StringIncludes(args[1], ".") then
ST.fps = num
dybug:print(__TS__StringReplace(
text.fps_set,
"<x>",
tostring(num)
))
else
dybug:print(__TS__StringReplace(text.fps_err, "<x>", args[1]))
end
end
break
end
____cond52 = ____cond52 or ____switch52 == "help"
if ____cond52 then
do
local page
if #args == 0 then
page = 0
else
local num = __TS__Number(args[1])
if __TS__NumberIsInteger(num) and 1 <= num and num <= #text.help_pages and not __TS__StringIncludes(args[1], ".") then
page = num - 1
else
dybug:print(__TS__StringReplace(
text.help_err,
"<x>",
tostring(num)
))
break
end
end
dybug:print(
__TS__StringReplace(
text.help_header,
"<x>",
tostring(page + 1)
),
unpack(page < #text.help_pages and ({ text.help_pages[page + 1] }) or ({}))
)
break
end
end
____cond52 = ____cond52 or ____switch52 == "r"
if ____cond52 then
if dybug.map == nil then
love.event.quit("restart")
else
world:dump()
local ____opt_3 = dybug.map.task
if ____opt_3 ~= nil then
____opt_3.complete(nil)
end
end
break
end
____cond52 = ____cond52 or ____switch52 == "reset"
if ____cond52 then
if #args == 0 then
level = 0
else
local num = __TS__Number(args[1])
if __TS__NumberIsInteger(num) and 0 <= num and num <= 2 and not __TS__StringIncludes(args[1], ".") then
level = num
else
dybug:print(__TS__StringReplace(
text.reset_err,
"<x>",
tostring(num)
))
break
end
end
world:reset(level)
love.event.quit("restart")
break
end
____cond52 = ____cond52 or ____switch52 == "rm"
if ____cond52 then
if dybug.map == nil then
dybug:print(text.rm_prq)
elseif #args == 0 then
dybug:print(__TS__StringReplace(
text.rm_get,
"<x>",
tostring(dybug.map.room)
))
else
local num = __TS__Number(args[1])
if __TS__NumberIsInteger(num) and 0 <= num and num < #dybug.map.rooms and not __TS__StringIncludes(args[1], ".") then
local ____opt_5 = dybug.map.task
if ____opt_5 ~= nil then
____opt_5.complete(num)
end
dybug:print(__TS__StringReplace(
text.rm_set,
"<x>",
tostring(num)
))
else
dybug:print(__TS__StringReplace(
__TS__StringReplace(text.rm_err, "<x>", args[1]),
"<y>",
tostring(#dybug.map.rooms - 1)
))
end
end
break
end
____cond52 = ____cond52 or ____switch52 == "spd"
if ____cond52 then
if #args == 0 then
dybug:print(__TS__StringReplace(
text.spd_get,
"<x>",
tostring(ST.speed)
))
else
local num = __TS__Number(args[1])
if not __TS__NumberIsNaN(num) and 0 < num and num <= 2 then
ST.speed = num
dybug:print(__TS__StringReplace(
text.spd_set,
"<x>",
tostring(num)
))
else
dybug:print(__TS__StringReplace(text.spd_err, "<x>", args[1]))
end
end
break
end
____cond52 = ____cond52 or ____switch52 == "sk"
if ____cond52 then
do
local page
if #args == 0 then
page = 0
else
local num = __TS__Number(args[1])
if __TS__NumberIsInteger(num) and 1 <= num and num <= #text.sk_pages and not __TS__StringIncludes(args[1], ".") and not __TS__StringIncludes(args[1], "e") then
page = num - 1
else
dybug:print(__TS__StringReplace(
text.sk_err,
"<x>",
tostring(num)
))
break
end
end
dybug:print(
__TS__StringReplace(
text.sk_header,
"<x>",
tostring(page + 1)
),
unpack(page < #text.sk_pages and ({ text.sk_pages[page + 1] }) or ({}))
)
break
end
end
____cond52 = ____cond52 or ____switch52 == "sv"
if ____cond52 then
if #args == 0 then
dybug:print(text.sv_arg)
elseif not (accessor[args[1]] ~= nil) then
dybug:print(__TS__StringReplace(text.sv_err1, "<x>", args[1]))
elseif #args == 1 then
local value = accessor[args[1]]
dybug:print(__TS__StringReplace(
__TS__StringReplace(text.sv_get, "<x>", args[1]),
"<y>",
value == true and "true" or
(value == false and "false" or (type(value) == "string" and ("\"" .. value) .. "\"" or tostring(value)))
))
else
local value = table.concat(
__TS__ArraySlice(args, 1),
" "
)
if value == "true" then
accessor[args[1]] = true
dybug:print(__TS__StringReplace(
__TS__StringReplace(text.sv_set, "<x>", args[1]),
"<y>",
"true"
))
elseif value == "false" then
accessor[args[1]] = false
dybug:print(__TS__StringReplace(
__TS__StringReplace(text.sv_set, "<x>", args[1]),
"<y>",
"false"
))
elseif __TS__StringStartsWith(value, "\"") then
if __TS__StringEndsWith(value, "\"") then
accessor[args[1]] = string.sub(value, 2, -2)
dybug:print(__TS__StringReplace(
__TS__StringReplace(text.sv_set, "<x>", args[1]),
"<y>",
value
))
else
dybug:print(__TS__StringReplace(text.sv_err2, "<x>", value))
end
else
local num = __TS__Number(value)
if not __TS__NumberIsNaN(num) then
accessor[args[1]] = num
dybug:print(__TS__StringReplace(
__TS__StringReplace(text.sv_set, "<x>", args[1]),
"<y>",
tostring(num)
))
else
dybug:print(__TS__StringReplace(text.sv_err2, "<x>", value))
break
end
end
end
break
end
____cond52 = ____cond52 or ____switch52 == "tp"
if ____cond52 then
if dybug.player == nil then
dybug:print(text.tp_prq)
elseif #args < 2 then
dybug:print(text.tp_arg)
else
local t1 = __TS__StringAccess(args[1], 0) == "~"
local num1 = __TS__Number(t1 and string.sub(args[1], 2) or args[1])
if not __TS__NumberIsNaN(num1) then
local t2 = __TS__StringAccess(args[2], 0) == "~"
local num2 = __TS__Number(t2 and string.sub(args[2], 2) or args[2])
if not __TS__NumberIsNaN(num2) then
local x = (t1 and dybug.player.position.x or 0) + num1
local y = (t2 and dybug.player.position.y or 0) + num2
dybug.player.position.x = x
dybug.player.position.y = y
dybug:print(__TS__StringReplace(
__TS__StringReplace(
text.tp,
"<x>",
tostring(x)
),
"<y>",
tostring(y)
))
else
dybug:print(__TS__StringReplace(text.tp_err1, "<x>", args[2]))
end
else
dybug:print(__TS__StringReplace(text.tp_err1, "<x>", args[1]))
end
end
break
end
do
dybug:print(__TS__StringReplace(text.unknown, "<x>", name))
break
end
until true
break
end
end
until true
end
love.wheelmoved = function(x, y)
local ____temp_9 = not dybug.canActivate
if not ____temp_9 then
local ____opt_7 = dybug.map
____temp_9 = (____opt_7 and ____opt_7.camera) ~= dybug.cam_free
end
if ____temp_9 then
return
end
dybug.map.scale:set(y < 0 and dybug.map.scale.x / 2 ^ (1 / 4) or dybug.map.scale.x * 2 ^ (1 / 4))
end
love.textinput = function(text)
if not dybug.canActivate or not dybug.active then
return
end
dybug:input_update(dybug:input() .. text)
end
return dybug
end
____exports.default = dybug
return ____exports