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.
282 lines
8.1 KiB
282 lines
8.1 KiB
3 years ago
|
local select = select
|
||
|
|
||
|
local w2l
|
||
|
|
||
|
local function unpack_flag(flag)
|
||
|
local tbl = {}
|
||
|
for i = 0, 64 do
|
||
|
local n = 1 << i
|
||
|
if n > flag then
|
||
|
break
|
||
|
end
|
||
|
if flag & n ~= 0 then
|
||
|
tbl[#tbl+1] = i + 1
|
||
|
end
|
||
|
end
|
||
|
return tbl
|
||
|
end
|
||
|
|
||
|
local function pack(...)
|
||
|
local tbl = {...}
|
||
|
tbl[#tbl] = nil
|
||
|
return tbl
|
||
|
end
|
||
|
|
||
|
local mt = {}
|
||
|
mt.__index = mt
|
||
|
|
||
|
function mt:set_index(...)
|
||
|
self.index = select(-1, ...)
|
||
|
return ...
|
||
|
end
|
||
|
|
||
|
function mt:unpack(str)
|
||
|
return self:set_index(str:unpack(self.content, self.index))
|
||
|
end
|
||
|
|
||
|
function mt:is_finish()
|
||
|
return ('I1'):unpack(self.content, self.index) == 0xFF
|
||
|
end
|
||
|
|
||
|
function mt:add_head(chunk)
|
||
|
chunk['地图'] = {
|
||
|
['文件版本'] = self:unpack 'l',
|
||
|
['地图版本'] = self:unpack 'l',
|
||
|
['编辑器版本'] = self:unpack 'l',
|
||
|
['地图名称'] = 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['镜头'] = {
|
||
|
['镜头范围'] = pack(self:unpack 'ffffffff'),
|
||
|
['镜头范围扩充'] = pack(self:unpack 'llll'),
|
||
|
}
|
||
|
|
||
|
chunk['地形'] = {
|
||
|
['地图宽度'] = self:unpack 'l',
|
||
|
['地图长度'] = self:unpack 'l',
|
||
|
}
|
||
|
|
||
|
local flag = self:unpack 'L'
|
||
|
chunk['选项'] = {
|
||
|
['关闭预览图'] = flag >> 0 & 1,
|
||
|
['自定义结盟优先权'] = flag >> 1 & 1,
|
||
|
['对战地图'] = flag >> 2 & 1,
|
||
|
['大型地图'] = flag >> 3 & 1,
|
||
|
['迷雾区域显示地形'] = flag >> 4 & 1,
|
||
|
['自定义玩家分组'] = flag >> 5 & 1,
|
||
|
['自定义队伍'] = flag >> 6 & 1,
|
||
|
['自定义科技树'] = flag >> 7 & 1,
|
||
|
['自定义技能'] = flag >> 8 & 1,
|
||
|
['自定义升级'] = flag >> 9 & 1,
|
||
|
['地图菜单标记'] = flag >> 10 & 1,
|
||
|
['地形悬崖显示水波'] = flag >> 11 & 1,
|
||
|
['地形起伏显示水波'] = flag >> 12 & 1,
|
||
|
['未知1'] = flag >> 13 & 1,
|
||
|
['未知2'] = flag >> 14 & 1,
|
||
|
['未知3'] = flag >> 15 & 1,
|
||
|
['未知4'] = flag >> 16 & 1,
|
||
|
['未知5'] = flag >> 17 & 1,
|
||
|
['未知6'] = flag >> 18 & 1,
|
||
|
['未知7'] = flag >> 19 & 1,
|
||
|
['未知8'] = flag >> 20 & 1,
|
||
|
['未知9'] = flag >> 21 & 1,
|
||
|
}
|
||
|
|
||
|
chunk['地形']['地形类型'] = self:unpack 'c1'
|
||
|
|
||
|
chunk['载入图'] = {
|
||
|
['序号'] = self:unpack 'l',
|
||
|
['路径'] = 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['战役'] = {
|
||
|
['路径'] = 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',
|
||
|
['z轴起点'] = self:unpack 'f',
|
||
|
['z轴终点'] = self:unpack 'f',
|
||
|
['密度'] = self:unpack 'f',
|
||
|
['颜色'] = pack(self:unpack 'BBBB'),
|
||
|
}
|
||
|
|
||
|
chunk['环境'] = {
|
||
|
['天气'] = self:unpack 'c4',
|
||
|
['音效'] = w2l:load_wts(self.wts, (self:unpack 'z')),
|
||
|
['光照'] = self:unpack 'c1',
|
||
|
['水面颜色'] = pack(self:unpack 'BBBB'),
|
||
|
}
|
||
|
end
|
||
|
|
||
|
function mt:add_player(chunk)
|
||
|
chunk['玩家'] = {
|
||
|
['玩家数量'] = self:unpack 'l',
|
||
|
}
|
||
|
|
||
|
for i = 1, chunk['玩家']['玩家数量'] do
|
||
|
chunk['玩家'..i] = {
|
||
|
['玩家'] = self:unpack 'l',
|
||
|
['类型'] = self:unpack 'l',
|
||
|
['种族'] = self:unpack 'l',
|
||
|
['修正出生点'] = self:unpack 'l',
|
||
|
['名字'] = w2l:load_wts(self.wts, (self:unpack 'z')),
|
||
|
['出生点'] = pack(self:unpack 'ff'),
|
||
|
['低结盟优先权标记'] = unpack_flag(self:unpack 'L'),
|
||
|
['高结盟优先权标记'] = unpack_flag(self:unpack 'L'),
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function mt:unpack_player_flag(chunk)
|
||
|
local flag = self:unpack 'L'
|
||
|
local tbl = unpack_flag(flag)
|
||
|
local exits = {}
|
||
|
for i = 1, chunk['玩家']['玩家数量'] do
|
||
|
local player = chunk['玩家'..i]
|
||
|
local id = player['玩家'] + 1
|
||
|
exits[id] = true
|
||
|
end
|
||
|
local result = {}
|
||
|
for _, id in ipairs(tbl) do
|
||
|
if exits[id] then
|
||
|
result[#result+1] = id
|
||
|
end
|
||
|
end
|
||
|
return result
|
||
|
end
|
||
|
|
||
|
function mt:add_force(chunk)
|
||
|
chunk['队伍'] = {
|
||
|
['队伍数量'] = self:unpack 'l',
|
||
|
}
|
||
|
|
||
|
for i = 1, chunk['队伍']['队伍数量'] do
|
||
|
local flag = self:unpack 'L'
|
||
|
chunk['队伍'..i] = {
|
||
|
['结盟'] = flag >> 0 & 1,
|
||
|
['结盟胜利'] = flag >> 1 & 1,
|
||
|
['共享视野'] = flag >> 3 & 1,
|
||
|
['共享单位控制'] = flag >> 4 & 1,
|
||
|
['共享高级单位设置'] = flag >> 5 & 1,
|
||
|
['玩家列表'] = self:unpack_player_flag(chunk),
|
||
|
['队伍名称'] = w2l:load_wts(self.wts, (self:unpack 'z')),
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function mt:add_upgrade(chunk)
|
||
|
if self:is_finish() then
|
||
|
return
|
||
|
end
|
||
|
local count = self:unpack 'l'
|
||
|
for i = 1, count do
|
||
|
chunk['升级'..i] = {
|
||
|
['玩家列表'] = unpack_flag(self:unpack 'L'),
|
||
|
['ID'] = self:unpack 'c4',
|
||
|
['等级'] = self:unpack 'l',
|
||
|
['可用性'] = self:unpack 'l',
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function mt:add_tech(chunk)
|
||
|
if self:is_finish() then
|
||
|
return
|
||
|
end
|
||
|
local count = self:unpack 'l'
|
||
|
for i = 1, count do
|
||
|
chunk['科技'..i] = {
|
||
|
['玩家列表'] = unpack_flag(self:unpack 'L'),
|
||
|
['ID'] = self:unpack 'c4',
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function mt:add_randomgroup(chunk)
|
||
|
if self:is_finish() then
|
||
|
return
|
||
|
end
|
||
|
local count = self:unpack 'l'
|
||
|
for i = 1, count do
|
||
|
chunk['随机组'..i] = {
|
||
|
['ID'] = self:unpack 'l',
|
||
|
['随机组名称'] = w2l:load_wts(self.wts, (self:unpack 'z')),
|
||
|
['设置'] = {},
|
||
|
}
|
||
|
local x = self:unpack 'l'
|
||
|
chunk['随机组'..i]['位置类型'] = pack(self:unpack(('l'):rep(x)))
|
||
|
|
||
|
local y = self:unpack 'l'
|
||
|
for y = 1, y do
|
||
|
chunk['随机组'..i]['设置'][y] = {
|
||
|
['几率'] = self:unpack 'l',
|
||
|
['ID'] = pack(self:unpack(('c4'):rep(x))),
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function mt:add_randomitem(chunk)
|
||
|
if self:is_finish() then
|
||
|
return
|
||
|
end
|
||
|
local count = self:unpack 'l'
|
||
|
for i = 1, count do
|
||
|
chunk['物品列表'..i] = {
|
||
|
['ID'] = self:unpack 'l',
|
||
|
['物品列表名称'] = w2l:load_wts(self.wts, (self:unpack 'z')),
|
||
|
['设置'] = {},
|
||
|
}
|
||
|
|
||
|
--设置
|
||
|
local x = self:unpack 'l'
|
||
|
for x = 1, x do
|
||
|
chunk['物品列表'..i]['设置'][x] = {}
|
||
|
local y = self:unpack 'l'
|
||
|
for y = 1, y do
|
||
|
chunk['物品列表'..i]['设置'][x][y] = {
|
||
|
['几率'] = self:unpack 'l',
|
||
|
['ID'] = self:unpack 'c4',
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return function (w2l_, content, wts)
|
||
|
if not content then
|
||
|
return nil
|
||
|
end
|
||
|
w2l = w2l_
|
||
|
|
||
|
local index = 1
|
||
|
local tbl = setmetatable({}, mt)
|
||
|
local data = {}
|
||
|
|
||
|
tbl.content = content
|
||
|
tbl.index = index
|
||
|
tbl.wts = wts
|
||
|
|
||
|
tbl:add_head(data)
|
||
|
tbl:add_player(data)
|
||
|
tbl:add_force(data)
|
||
|
tbl:add_upgrade(data)
|
||
|
tbl:add_tech(data)
|
||
|
tbl:add_randomgroup(data)
|
||
|
tbl:add_randomitem(data)
|
||
|
|
||
|
return data
|
||
|
end
|