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.

364 lines
11 KiB

3 years ago
local progress = require 'progress'
local os_clock = os.clock
local output = {
unit = 'units\\campaignunitstrings.txt',
ability = 'units\\campaignabilitystrings.txt',
buff = 'units\\commonabilitystrings.txt',
upgrade = 'units\\campaignupgradestrings.txt',
item = 'units\\itemstrings.txt',
txt = 'units\\itemabilitystrings.txt',
}
local function to_lni(w2l, archive, slk)
--转换物编
local count = 0
for ttype, filename in pairs(w2l.info.lni) do
count = count + 1
local data = slk[ttype]
progress:start(count / 7)
local content = w2l:backend_lni(ttype, data)
progress:finish()
if content then
archive:set(filename, content)
end
end
local content = w2l:backend_txtlni(slk['txt'])
if content then
archive:set('war3map.txt.ini', content)
end
end
local function to_obj(w2l, archive, slk)
--转换物编
local count = 0
for type, filename in pairs(w2l.info.obj) do
count = count + 1
local data = slk[type]
progress:start(count / 7)
local content = w2l:backend_obj(type, data, slk.wts)
progress:finish()
if content then
archive:set(filename, content)
end
end
local content = w2l:backend_txtlni(slk['txt'])
if content then
archive:set('war3map.txt.ini', content)
end
end
local displaytype = {
unit = '单位',
ability = '技能',
item = '物品',
buff = '魔法效果',
upgrade = '科技',
doodad = '装饰物',
destructable = '可破坏物',
}
local function get_displayname(o)
local name
if o._type == 'buff' then
name = o.bufftip or o.editorname or ''
elseif o._type == 'upgrade' then
name = o.name[1] or ''
else
name = o.name or ''
end
return o._id, (name:sub(1, 100):gsub('\r\n', ' '))
end
local function get_displayname_by_id(slk, id)
local o = slk.ability[id]
or slk.unit[id]
or slk.buff[id]
or slk.item[id]
or slk.destructable[id]
or slk.doodad[id]
or slk.upgrade[id]
if not o then
return id, '<unknown>'
end
return get_displayname(o)
end
local function format_marktip(slk, marktip)
return marktip[2]:format(get_displayname_by_id(slk, marktip[1]))
end
local function report_object(slk, type, o)
message('-report|4简化', displaytype[type], get_displayname(o))
if o._mark then
message('-tip', format_marktip(slk, o._mark))
end
end
local function report_list(slk, list, type, n)
list = list[type]
for i = 1, math.min(n, #list) do
report_object(slk, type, list[i])
end
end
local function remove_unuse(w2l, slk)
local custom_list = {
ability = {},
unit = {},
item = {},
buff = {},
upgrade = {},
doodad = {},
destructable = {},
}
local origin_list = {
ability = {},
unit = {},
item = {},
buff = {},
upgrade = {},
doodad = {},
destructable = {},
}
local mustuse = {
ability = {},
unit = {},
item = {},
buff = {},
upgrade = {},
doodad = {},
destructable = {},
}
for type, list in pairs(slk.mustuse) do
for _, id in ipairs(list) do
mustuse[type][id] = true
end
end
local total_custom = 0
local total_origin = 0
local unuse_custom = 0
local unuse_origin = 0
for _, type in ipairs {'ability', 'buff', 'unit', 'item', 'upgrade', 'doodad', 'destructable'} do
local default = w2l:get_default()[type]
for name, obj in pairs(slk[type]) do
if obj._obj or not default[name] then
total_custom = total_custom + 1
if not obj._mark then
unuse_custom = unuse_custom + 1
custom_list[type][#custom_list[type]+1] = obj
end
else
total_origin = total_origin + 1
if not obj._mark then
unuse_origin = unuse_origin + 1
else
if not mustuse[type][name] then
origin_list[type][#origin_list[type]+1] = obj
end
end
end
end
end
if unuse_origin + unuse_custom > 0 then
message('-report|4简化', ('简化掉的对象数: %d/%d'):format(unuse_origin + unuse_custom, total_origin + total_custom))
end
if total_origin - unuse_origin > 0 then
message('-report|4简化', ('保留的默认对象数: %d/%d'):format(total_origin - unuse_origin, total_origin))
report_list(slk, origin_list, 'unit', 10)
report_list(slk, origin_list, 'ability', 10)
report_list(slk, origin_list, 'item', 10)
report_list(slk, origin_list, 'buff', 10)
report_list(slk, origin_list, 'upgrade', 3)
report_list(slk, origin_list, 'destructable', 3)
report_list(slk, origin_list, 'doodad', 3)
end
if unuse_custom > 0 then
message('-report|4简化', ('简化掉的自定义对象数: %d/%d'):format(unuse_custom, total_custom))
report_list(slk, custom_list, 'unit', 10)
report_list(slk, custom_list, 'ability', 10)
report_list(slk, custom_list, 'item', 10)
report_list(slk, custom_list, 'buff', 10)
report_list(slk, custom_list, 'upgrade', 3)
report_list(slk, custom_list, 'destructable', 3)
report_list(slk, custom_list, 'doodad', 3)
end
end
local function to_slk(w2l, archive, slk)
local report = { n = 0 }
local object = {}
local slk_list = {'ability', 'buff', 'unit', 'item', 'upgrade', 'destructable'}
if w2l.config.slk_doodad then
slk_list[#slk_list+1] = 'doodad'
end
for _, type in ipairs(slk_list) do
local data = slk[type]
object[type] = {}
for _, slk in ipairs(w2l.info.slk[type]) do
archive:set(slk, w2l:backend_slk(type, slk, data, report, object[type]))
end
end
for _, filename in ipairs(w2l.info.txt) do
archive:set(filename, '')
end
local txt = w2l:backend_txt(slk, report, object)
for _, type in ipairs {'ability', 'buff', 'unit', 'item', 'upgrade'} do
archive:set(output[type], txt[type])
end
for _, type in ipairs {'ability', 'buff', 'unit', 'item', 'upgrade', 'destructable', 'doodad'} do
local data = object[type] or slk[type]
local content = w2l:backend_obj(type, data, slk.wts)
if content then
archive:set(w2l.info.obj[type], content)
end
end
local content = w2l:backend_extra_txt(slk['txt'])
if content then
archive:set(output['txt'], content)
end
if report.n > 0 then
local index = 1
message('-report|3没有SLK化的数据', ('合计: %d'):format(report.n))
for tip, list in pairs(report) do
if #tip > 1 then
local n = 0
message('-report|3没有SLK化的数据', ('%d.%s'):format(index, tip))
index = index + 1
for _, msg in pairs(list) do
message('-report|3没有SLK化的数据', msg[1])
message('-tip', msg[2])
n = n + 1
if n > 20 then
break
end
end
end
end
end
end
local function load_w3i(w2l, archive, slk)
local buf = archive:get 'war3map.w3i.ini'
if buf then
slk.w3i = w2l:parse_lni(buf)
archive:set('war3map.w3i.ini', false)
else
buf = archive:get 'war3map.w3i'
if buf then
slk.w3i = w2l:read_w3i(buf, slk.wts)
end
end
if not slk.w3i then
return
end
if slk.w3i['选项']['使用的游戏数据设置'] == 1 then
message('-report|2警告', '不支持的游戏数据设置"自定义"')
message('-tip', '只支持"默认(1.07)",数据可能会出现差异')
end
if slk.w3i['选项']['使用的游戏数据设置'] == 2 then
message('-report|2警告', '不支持的游戏数据设置"对战(最新版本)"')
message('-tip', '只支持"默认(1.07)",数据可能会出现差异')
end
end
return function (w2l, archive, slk)
load_w3i(w2l, archive, slk)
if slk.w3i then
if w2l.config.target_format == 'lni' then
archive:set('war3map.w3i.ini', w2l:w3i2lni(slk.w3i), slk.wts)
archive:set('war3map.w3i', false)
else
archive:set('war3map.w3i', w2l:lni2w3i(slk.w3i, slk.wts))
end
end
progress(0.1)
progress:start(0.1)
message('清理数据...')
w2l:backend_searchparent(slk)
progress:finish()
if w2l.config.remove_unuse_object then
message('标记简化对象...')
w2l:backend_mark(archive, slk)
progress(0.2)
end
if w2l.config.target_format == 'slk' then
message('计算描述中的公式...')
w2l:backend_computed(slk)
progress(0.3)
end
if w2l.config.remove_unuse_object then
message('移除简化对象...')
progress:start(0.5)
remove_unuse(w2l, slk)
progress:finish()
end
progress:start(0.7)
w2l:backend_cleanobj(slk)
progress:finish()
progress:start(0.9)
message('转换物编文件...')
if w2l.config.target_format == 'lni' then
to_lni(w2l, archive, slk)
elseif w2l.config.target_format == 'obj' then
to_obj(w2l, archive, slk)
elseif w2l.config.target_format == 'slk' then
to_slk(w2l, archive, slk)
end
progress:finish()
message('转换脚本...')
w2l:backend_convertjass(archive, slk.wts)
w2l:backend_convertwtg(archive, slk.wts)
progress(0.92)
message('转换其他文件...')
archive:set('war3mapmisc.txt', w2l:backend_misc(slk.misc, slk.txt, slk.wts))
progress(0.93)
local buf = archive:get 'war3mapskin.txt'
if buf then
local skin = w2l:parse_ini(buf)
archive:set('war3mapskin.txt', w2l:backend_skin(skin, slk.wts))
end
progress(0.94)
if w2l.config.target_format == 'lni' then
local buf = archive:get 'war3map.imp'
if buf then
archive:set('war3map.imp', false)
archive:set('war3map.imp.ini', w2l:backend_imp(archive, buf))
end
end
message('重新生成字符串...')
local content = w2l:refresh_wts(slk.wts)
if #content > 0 then
archive:set('war3map.wts', content)
else
archive:set('war3map.wts', false)
end
progress(0.95)
if w2l.config.optimize_jass then
message('优化脚本...')
w2l:backend_optimizejass(archive)
end
progress(1)
end