SoUI 0.5版本占坑
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

121 lines
3.0 KiB

3 years ago
local w3xparser = require 'w3xparser'
local string_lower = string.lower
local table_concat = table.concat
local wtonumber = w3xparser.tonumber
local math_floor = math.floor
local w2l
local marks
local function to_type(tp, value)
if tp == 0 then
if not value then
return 0
end
return math_floor(wtonumber(value))
elseif tp == 1 or tp == 2 then
if not value then
return 0.0
end
return wtonumber(value) + 0.0
elseif tp == 3 then
if not value then
return nil
end
if value == '' then
return value
end
value = tostring(value)
if not value:match '[^ %-%_]' then
return nil
end
return value
end
end
local function add_data(key, meta, misc, obj, slk)
local name = obj._id
local lname = string_lower(name)
local value = misc[lname] and misc[lname][key] or slk.txt[lname] and slk.txt[lname][key]
if not value then
return
end
if meta['concat'] then
value = table_concat(value, ',')
else
value = to_type(meta.type, value[1])
end
obj[key] = value
end
local function add_obj(name, meta, misc, chunk, slk)
chunk[name] = {
_id = name,
_code = name,
_parent = name,
_type = 'misc',
}
local obj = chunk[name]
for key, meta in pairs(meta) do
add_data(key, meta, misc, obj, slk)
end
local lname = string_lower(name)
slk.txt[lname] = nil
if marks[lname] then
obj._mark = true
end
end
local function convert(misc, metadata, miscnames, slk)
local chunk = {}
for _, name in ipairs(miscnames.misc_names) do
local meta = metadata[name]
add_obj(name, meta, misc, chunk, slk)
end
return chunk
end
local function merge_misc_data(misc, map_misc, meta, slk)
if not misc then
return
end
for k, v in pairs(map_misc) do
if meta[k].type == 3 then
for i, str in ipairs(v) do
v[i] = w2l:load_wts(slk.wts, str)
end
end
misc[k] = v
end
end
local function merge_misc(misc, txt, map_misc, metadata, miscnames, slk)
for _, name in ipairs(miscnames.misc_names) do
local lname = name:lower()
local v = map_misc[lname]
if v then
marks[lname] = true
merge_misc_data(misc[lname] or txt[lname], v, metadata[name], slk)
end
end
end
return function (w2l_, archive, slk)
w2l = w2l_
marks = {}
local metadata = w2l:metadata()
local miscnames = w2l:miscnames()
local misc = {}
for _, name in ipairs {"UI\\MiscData.txt", "Units\\MiscData.txt", "Units\\MiscGame.txt"} do
local buf = io.load(w2l.mpq / name)
w2l:parse_txt(buf, name, misc)
end
local buf = archive:get('war3mapmisc.txt')
if buf then
local map_misc = w2l:parse_txt(buf, 'war3mapmisc.txt')
merge_misc(misc, slk.txt, map_misc, metadata, miscnames, slk)
end
slk.misc = convert(misc, metadata, miscnames, slk)
end