100 lines
1.9 KiB
Lua
100 lines
1.9 KiB
Lua
return function(ll)
|
|
|
|
ll.games = {}
|
|
|
|
local function parse(conf)
|
|
local r = {}
|
|
local k, v
|
|
|
|
local buf = ''
|
|
local t = 'str'
|
|
local esc = false
|
|
local prg = true
|
|
|
|
local i = 1
|
|
repeat
|
|
local ch = conf:sub(i, i)
|
|
|
|
if ch == '\\'
|
|
then esc = true
|
|
|
|
elseif ch == '#' then
|
|
repeat i = i + 1
|
|
ch = conf:sub(i, i)
|
|
until ch == '' or ch == '\n' or ch == '\r'
|
|
|
|
elseif ch == '[' then
|
|
buf = buf:match '%s*(.*)%s*'
|
|
assert(#buf == 0, 'Unexpected array usage')
|
|
t = 'arr'
|
|
prg = true
|
|
v = {}
|
|
|
|
elseif ch == ''
|
|
or (ch == '=' and not k)
|
|
or (ch == ']' and t == 'arr')
|
|
or (ch == ';' and t == 'arr')
|
|
or ch == '\n' or ch == '\r' then
|
|
buf = buf:match '^%s*(.-)%s*$'
|
|
|
|
if ch == '=' then
|
|
assert(t == 'str', 'Cannot use other types than string for key')
|
|
end
|
|
|
|
if t == 'str'
|
|
or (t == 'arr' and ch == ']')
|
|
then prg = false end
|
|
|
|
if not prg or ch == ';' then
|
|
if #buf ~= 0 then
|
|
if k then
|
|
if t == 'str'
|
|
then v = buf
|
|
elseif t == 'arr'
|
|
then table.insert(v, buf)
|
|
else error 'wut?' end
|
|
else k = buf
|
|
end
|
|
buf = ''
|
|
elseif ch ~= ''
|
|
and ch ~= '\r'
|
|
and ch ~= '\n'
|
|
then error 'empty buffer'
|
|
end
|
|
end
|
|
if k and v and not prg then
|
|
r[k] = v
|
|
k = nil
|
|
v = nil
|
|
buf = ''
|
|
t = 'str'
|
|
end
|
|
|
|
elseif esc then
|
|
buf = buf .. ch
|
|
esc = false
|
|
|
|
else buf = buf .. ch
|
|
end
|
|
i = i + 1
|
|
until i >= #conf + 1
|
|
return r
|
|
end
|
|
|
|
function ll.gameNew(conf, file, base, dir)
|
|
local cfg = parse(conf or '')
|
|
local gme = {
|
|
name = cfg.name or dir or 'No name',
|
|
desc = cfg.desc or 'No description provided.',
|
|
base = base,
|
|
dir = dir,
|
|
main = cfg.main or 'main.lua',
|
|
screens = cfg.screens or cfg.pics or nil,
|
|
scrcur = 1,
|
|
scrprv = 1,
|
|
dat = nil,
|
|
}
|
|
return gme
|
|
end
|
|
|
|
end
|