summaryrefslogtreecommitdiff
path: root/VP-miscwork.lua
blob: 31f7e925e4e818aca24da76bae120c7ae3e85eeb (plain)
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