Skip to content

Commit

Permalink
整理代码
Browse files Browse the repository at this point in the history
  • Loading branch information
sumneko committed Jan 10, 2017
1 parent 701b0e2 commit a48127d
Show file tree
Hide file tree
Showing 9 changed files with 103 additions and 105 deletions.
40 changes: 22 additions & 18 deletions script/other/read_w3i.lua
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
local select = select

local w2l

local function unpack_flag(flag)
local tbl = {}
for i = 0, 64 do
Expand Down Expand Up @@ -41,10 +43,10 @@ function mt:add_head(chunk)
['文件版本'] = self:unpack 'l',
['地图版本'] = self:unpack 'l',
['编辑器版本'] = self:unpack 'l',
['地图名称'] = self.wts:load(self:unpack 'z'),
['作者名字'] = self.wts:load(self:unpack 'z'),
['地图描述'] = self.wts:load(self:unpack 'z'),
['推荐玩家'] = self.wts:load(self:unpack 'z'),
['地图名称'] = w2l:load_wts(self.wts, self:unpack 'z'),
['作者名字'] = w2l:load_wts(self.wts, self:unpack 'z'),
['地图描述'] = w2l:load_wts(self.wts, self:unpack 'z'),
['推荐玩家'] = w2l:load_wts(self.wts, self:unpack 'z'),
}

chunk['镜头'] = {
Expand Down Expand Up @@ -87,19 +89,19 @@ function mt:add_head(chunk)

chunk['载入图'] = {
['序号'] = self:unpack 'l',
['路径'] = self.wts:load(self:unpack 'z'),
['文本'] = self.wts:load(self:unpack 'z'),
['标题'] = self.wts:load(self:unpack 'z'),
['子标题'] = self.wts:load(self:unpack 'z'),
['路径'] = w2l:load_wts(self.wts, self:unpack 'z'),
['文本'] = w2l:load_wts(self.wts, self:unpack 'z'),
['标题'] = w2l:load_wts(self.wts, self:unpack 'z'),
['子标题'] = w2l:load_wts(self.wts, self:unpack 'z'),
}

chunk['选项']['使用的游戏数据设置'] = self:unpack 'l'

chunk['战役'] = {
['路径'] = self.wts:load(self:unpack 'z'),
['文本'] = self.wts:load(self:unpack 'z'),
['标题'] = self.wts:load(self:unpack 'z'),
['子标题'] = self.wts:load(self:unpack 'z'),
['路径'] = w2l:load_wts(self.wts, self:unpack 'z'),
['文本'] = w2l:load_wts(self.wts, self:unpack 'z'),
['标题'] = w2l:load_wts(self.wts, self:unpack 'z'),
['子标题'] = w2l:load_wts(self.wts, self:unpack 'z'),
}

chunk['迷雾'] = {
Expand All @@ -112,7 +114,7 @@ function mt:add_head(chunk)

chunk['环境'] = {
['天气'] = self:unpack 'c4',
['音效'] = self.wts:load(self:unpack 'z'),
['音效'] = w2l:load_wts(self.wts, self:unpack 'z'),
['光照'] = self:unpack 'c1',
['水面颜色'] = pack(self:unpack 'BBBB'),
}
Expand All @@ -129,7 +131,7 @@ function mt:add_player(chunk)
['类型'] = self:unpack 'l',
['种族'] = self:unpack 'l',
['修正出生点'] = self:unpack 'l',
['名字'] = self.wts:load(self:unpack 'z'),
['名字'] = w2l:load_wts(self.wts, self:unpack 'z'),
['出生点'] = pack(self:unpack 'ff'),
['低结盟优先权标记'] = unpack_flag(self:unpack 'L'),
['高结盟优先权标记'] = unpack_flag(self:unpack 'L'),
Expand All @@ -156,7 +158,7 @@ function mt:add_force(chunk)
['共享单位控制'] = flag >> 4 & 1,
['共享高级单位设置'] = flag >> 5 & 1,
['玩家列表'] = self:unpack_player_flag(chunk['玩家']['玩家数量']),
['队伍名称'] = self.wts:load(self:unpack 'z'),
['队伍名称'] = w2l:load_wts(self.wts, self:unpack 'z'),
}
end
end
Expand Down Expand Up @@ -197,7 +199,7 @@ function mt:add_randomgroup(chunk)
for i = 1, count do
chunk['随机组'..i] = {
['ID'] = self:unpack 'l',
['随机组名称'] = self.wts:load(self:unpack 'z'),
['随机组名称'] = w2l:load_wts(self.wts, self:unpack 'z'),
['设置'] = {},
}
local x = self:unpack 'l'
Expand All @@ -221,7 +223,7 @@ function mt:add_randomitem(chunk)
for i = 1, count do
chunk['物品列表'..i] = {
['ID'] = self:unpack 'l',
['物品列表名称'] = self.wts:load(self:unpack 'z'),
['物品列表名称'] = w2l:load_wts(self.wts, self:unpack 'z'),
['设置'] = {},
}

Expand All @@ -240,10 +242,12 @@ function mt:add_randomitem(chunk)
end
end

return function (self, content, wts)
return function (w2l_, content, wts)
if not content then
return nil
end
w2l = w2l_

local index = 1
local tbl = setmetatable({}, mt)
local data = {}
Expand Down
2 changes: 1 addition & 1 deletion script/slk/backend.lua
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,7 @@ return function (w2l, archive, slk)
progress(0.96)

message('重新生成字符串...')
local content = slk.wts:refresh()
local content = w2l:refresh_wts(slk.wts)
if #content > 0 then
archive:set('war3map.wts', content)
else
Expand Down
6 changes: 4 additions & 2 deletions script/slk/backend_convertjass.lua
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
local lpeg = require 'lpeg'
local line_count
local w2l
local wts

local function fwts(str)
return wts:load(str, 1023, '脚本里的文本长度超过1023字符'):gsub('\\', '\\\\'):gsub('"', '\\"')
return w2l:load_wts(wts, str, 1023, '脚本里的文本长度超过1023字符'):gsub('\\', '\\\\'):gsub('"', '\\"')
end

lpeg.locale(lpeg)
Expand All @@ -25,7 +26,7 @@ local wst = quo * ('TRIGSTR_' * num^3 / fwts) * quo

local pjass = Cs((nl + wst + str + 1)^0)

return function (w2l, archive, wts_)
return function (w2l_, archive, wts_)
local name = 'war3map.j'
local buf = archive:get(name)
if not buf then
Expand All @@ -35,6 +36,7 @@ return function (w2l, archive, wts_)
return
end
end
w2l = w2l_
wts = wts_
line_count = 0
archive:set(name, pjass:match(buf))
Expand Down
2 changes: 1 addition & 1 deletion script/slk/backend_obj.lua
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ local function write_value(meta, level, value)
write('f', value)
else
if #value > 1023 then
value = wts:insert(value, '物编里的文本长度超过1023字符')
value = w2l:save_wts(wts, value, '物编里的文本长度超过1023字符')
end
write('z', value)
end
Expand Down
10 changes: 5 additions & 5 deletions script/slk/backend_skin.lua
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
local function add_obj(name, obj, lines, wts)
local function add_obj(w2l, name, obj, lines, wts)
local keys = {}
for key in pairs(obj) do
keys[#keys+1] = key
Expand All @@ -8,12 +8,12 @@ local function add_obj(name, obj, lines, wts)
lines[#lines+1] = '[' .. name .. ']'
for _, key in ipairs(keys) do
local value = obj[key]
value = wts:load(value)
value = w2l:load_wts(wts, value)
lines[#lines+1] = key .. '=' .. value
end
end

local function convert(skin, wts)
local function convert(w2l, skin, wts)
local lines = {}
local names = {}
for name in pairs(skin) do
Expand All @@ -22,13 +22,13 @@ local function convert(skin, wts)
table.sort(names)

for _, name in ipairs(names) do
add_obj(name, skin[name], lines, wts)
add_obj(w2l, name, skin[name], lines, wts)
end

return table.concat(lines, '\r\n')
end

return function(w2l, skin, wts)
local buf = convert(skin, wts)
local buf = convert(w2l, skin, wts)
return buf
end
2 changes: 1 addition & 1 deletion script/slk/frontend_misc.lua
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ local function merge_misc_data(misc, map_misc, meta, slk)
for k, v in pairs(map_misc) do
if meta[k].type == 3 then
for i, str in ipairs(v) do
v[i] = slk.wts:load(str)
v[i] = w2l:load_wts(slk.wts, str)
end
end
misc[k] = v
Expand Down
2 changes: 1 addition & 1 deletion script/slk/frontend_obj.lua
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ local function read_data(obj)
value = unpack 'f'
else
local str = unpack 'z'
value = wts:load(str)
value = w2l:load_wts(wts, str)
end

-- 扔掉一个整数
Expand Down
87 changes: 11 additions & 76 deletions script/slk/frontend_wts.lua
Original file line number Diff line number Diff line change
@@ -1,69 +1,5 @@
local lpeg = require 'lpeg'

local table_insert = table.insert

local mt = {}
mt.__index = mt

-- 同时有英文逗号和英文双引号的字符串存在txt里会解析出错
-- 包含右大括号的字符串存在wts里会解析出错
-- 超过256字节的字符串存在二进制里会崩溃
function mt:load(content, max, reason)
local wts = self.wts
return content:gsub('TRIGSTR_(%d+)', function(i)
local str_data = wts[i]
if not str_data then
message('-report|9其他', '没有找到字符串定义:', ('TRIGSTR_%03d'):format(i))
return
end
local text = str_data.text
if max and #text > max then
str_data.mark = true
message('-report|7保存到wts中的文本', reason)
message('-tip', '文本保存在wts中会导致加载速度变慢: ', (text:sub(1, 1000):gsub('\r\n', ' ')))
return
end
return text
end)
end

function mt:insert(value, reason)
local wts = self.wts
message('-report|7保存到wts中的文本', reason)
message('-tip', '文本保存在wts中会导致加载速度变慢: ', (value:sub(1, 1000):gsub('\r\n', ' ')))
for i = self.lastindex, 999999 do
local index = ('%03d'):format(i)
if not wts[index] then
if value:find('}', 1, false) then
message('-report|2警告', '文本中的"}"被修改为了"|"')
message('-tip', (value:sub(1, 1000):gsub('\r\n', ' ')))
value = value:gsub('}', '|')
end
self.lastindex = i + 1
wts[index] = {
index = i,
text = value,
mark = true,
}
table_insert(wts, wts[index])
return 'TRIGSTR_' .. i
end
end
message('-report|2警告', '保存在wts里的字符串太多了')
message('-tip', '字符串被丢弃了:' .. (value:sub(1, 1000):gsub('\r\n', ' ')))
end

function mt:refresh()
local lines = {}
for i, t in ipairs(self.wts) do
if t and t.mark then
table_insert(lines, ('STRING %d\r\n{\r\n%s\r\n}'):format(t.index, t.text))
end
end

return table.concat(lines, '\r\n\r\n')
end

local function search_string(buf)
local line_count = 1
lpeg.locale(lpeg)
Expand Down Expand Up @@ -113,20 +49,19 @@ local function search_string(buf)
return result
end

-- TODO: 待重构,数据和操作分离
return function (w2l, archive)
local buf = archive:get('war3map.wts')
local tbl = {}
if buf then
tbl = search_string(buf)
for _, t in ipairs(tbl) do
local index, text = t.index, t.text
if text:find('}', 1, false) then
message('-report|2警告', '文本不能包含字符"}"')
message('-tip', (text:sub(1, 1000):gsub('\r\n', ' ')))
end
tbl[('%03d'):format(index)] = t --这里的索引是字符串
if not buf then
return {}
end
local tbl = search_string(buf)
for _, t in ipairs(tbl) do
local index, text = t.index, t.text
if text:find('}', 1, false) then
message('-report|2警告', '文本不能包含字符"}"')
message('-tip', (text:sub(1, 1000):gsub('\r\n', ' ')))
end
tbl[('%03d'):format(index)] = t --这里的索引是字符串
end
return setmetatable({ wts = tbl, lastindex = 0 }, mt)
return tbl
end
57 changes: 57 additions & 0 deletions script/w3x2lni.lua
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ local keydata
local editstring
local default
local miscnames
local wts

function mt:parse_lni(...)
return lni(...)
Expand Down Expand Up @@ -91,6 +92,62 @@ function mt:get_default(create)
return default
end

-- 同时有英文逗号和英文双引号的字符串存在txt里会解析出错
-- 包含右大括号的字符串存在wts里会解析出错
-- 超过256字节的字符串存在二进制里会崩溃
function mt:load_wts(wts, content, max, reason)
return content:gsub('TRIGSTR_(%d+)', function(i)
local str_data = wts[i]
if not str_data then
message('-report|9其他', '没有找到字符串定义:', ('TRIGSTR_%03d'):format(i))
return
end
local text = str_data.text
if max and #text > max then
str_data.mark = true
message('-report|7保存到wts中的文本', reason)
message('-tip', '文本保存在wts中会导致加载速度变慢: ', (text:sub(1, 1000):gsub('\r\n', ' ')))
return
end
return text
end)
end

function mt:save_wts(wts, value, reason)
message('-report|7保存到wts中的文本', reason)
message('-tip', '文本保存在wts中会导致加载速度变慢: ', (value:sub(1, 1000):gsub('\r\n', ' ')))
for i = 1, 999999 do
local index = ('%03d'):format(i)
if not wts[index] then
if value:find('}', 1, false) then
message('-report|2警告', '文本中的"}"被修改为了"|"')
message('-tip', (value:sub(1, 1000):gsub('\r\n', ' ')))
value = value:gsub('}', '|')
end
wts[index] = {
index = i,
text = value,
mark = true,
}
wts[#wts+1] = wts[index]
return 'TRIGSTR_' .. i
end
end
message('-report|2警告', '保存在wts里的字符串太多了')
message('-tip', '字符串被丢弃了:' .. (value:sub(1, 1000):gsub('\r\n', ' ')))
end

function mt:refresh_wts(wts)
local lines = {}
for i, t in ipairs(wts) do
if t and t.mark then
lines[#lines+1] = ('STRING %d\r\n{\r\n%s\r\n}'):format(t.index, t.text)
end
end

return table.concat(lines, '\r\n\r\n')
end

function mt:initialize(root)
if self.initialized then
return
Expand Down

0 comments on commit a48127d

Please sign in to comment.