diff options
Diffstat (limited to 'VP-miscwork.lua')
-rw-r--r-- | VP-miscwork.lua | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/VP-miscwork.lua b/VP-miscwork.lua index 1818b30..1a5bc14 100644 --- a/VP-miscwork.lua +++ b/VP-miscwork.lua @@ -130,3 +130,109 @@ function process_cscript(fname, h, size, ext) script:destroy() font:destroy() end + +function process_carc(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 'carc'") + dump_mkdir(fname) + local nfiles = h:readU32() + local ret + if not dump_mode then + ret = Buffer(true) + ret:writeU32(nfiles) + end + + local index = {} + for i = 1, nfiles do + index[i] = {} + local offset = h:readU32() + index[i].extra = shr(offset, 24) + index[i].offset = andB(offset, 0xffffff) + end + + index[nfiles + 1] = {} + index[nfiles + 1].extra = 0 + index[nfiles + 1].offset = size + + local outfile = {} + local script = nil + local font = nil + for i = 1, nfiles do + local tell = h:tell() + local handler = nil + local counter = 1 + if index[i].extra == 3 then + handler = function(fname, h, size, ext) + if counter ~= 1 then error "Too many files" end + counter = counter + 1 + return process_carc(fname, h, size, ext) + end + elseif dump_mode and index[i].extra == 2 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 index[i].extra == 1 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 index[i].extra == 2 then + error "Not written yet" + elseif not dump_mode and index[i].extra == 1 then + error "Not written yet" + end + local fsize = index[i + 1].offset - index[i].offset + outfile[i] = process_single_file(fname .. string.format("/%04i-%08X", i, index[i].extra), h, fsize, ext, handler) + + if handler and script and font then + if dump_mode then + second_style_script = true + extract_simple_script(fname .. string.format("/%04i", i), script, font) + second_style_script = false + end + script:destroy() + font:destroy() + script = nil + font = nil + end + h:seek(tell + fsize) + 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 |