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
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
|