summaryrefslogtreecommitdiff
path: root/VP-miscwork.lua
blob: cb111f3d99733cf1d39313e63ff79bd633e7c5fb (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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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 outfile = {}
    local script = nil
    local font = nil
    for i = 1, nfiles do
        local tell = h:tell()
        local handler = nil
        local counter = 1
        local f1 = andB(index[i].extra, 0xffffff00)
        if dump_mode and f1 == 0x00300900 then
            if script then error "Can't have two scripts" end
            handler = function(fname, h, size, ext)
                if counter == 1 then
                    log "taking script"
                    script = Buffer(true)
                    script:copyfrom(h)
                else
                    error "Too many files"
                end
                counter = counter + 1
            end
        elseif dump_mode and f1 == 0x00300800 then
            if font then error "Can't have two fonts" end
            handler = function(fname, h, size, ext)
                if counter == 1 then
                    log "taking font"
                    font = Buffer(true)
                    font:copyfrom(h)
                else
                    error "Too many files"
                end
                counter = counter + 1
            end
        elseif not dump_mode and f1 == 0x00300900 then
            error "Not written yet"
        elseif not dump_mode and f1 == 0x00300800 then
            error "Not written yet"
        end
        outfile[i] = process_single_file(fname .. string.format("/%04i-%08X", i, index[i].extra), h, index[i].size, ext, handler)
        
        if handler and script and font then
            if dump_mode then
                extract_simple_script(fname .. string.format("/%04i", i), script, font)
            end
            script:destroy()
            font:destroy()
            script = nil
            font = nil
        end
        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