1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
function process_arcgfx(fname, h, size, ext)
log("Processing " .. fname .. "." .. ext)
if dump_mode then
o = Output(fname .. "." .. ext)
o:copyfrom(h, size)
o:destroy()
h:seek(-size, SEEK_CUR)
end
log("Extracting " .. fname .. " - format 'arcgfx'")
dump_mkdir(fname)
local nfiles = h:readU32()
local extra = h:readU32()
local ret
if dump_mode then
o = Output(fname .. "/--extra.bin")
o:writeU32(extra)
o:destroy()
o = Output(fname .. string.format("/0000-%08X", extra))
o:writeU32(extra)
o:destroy()
else
ret = Buffer(true)
ret:writeU32(nfiles)
ret:writeU32(extra)
end
index = {}
for i = 1, nfiles do
index[i] = {}
index[i].extra = h:readU32()
index[i].size = h:readU32()
end
local tell
local outfile = {}
for i = 1, nfiles do
tell = h:tell()
outfile[i] = process_single_file(fname .. string.format("/%04i-%08X", i, index[i].extra), h, index[i].size, ext)
h:seek(tell + index[i].size)
end
if not dump_mode then
for i = 1, nfiles do
local alignment_bytes = alignment(outfile[i]:getsize(), 4)
for j = 1, alignment_bytes do
outfile[i]:writeU8(0)
end
ret:writeU32(index[i].extra)
ret:writeU32(outfile[i]:getsize())
end
for i = 1, nfiles do
ret:copyfrom(outfile[i])
outfile[i]:destroy()
end
end
-- return ret
end
|