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.

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