diff options
-rw-r--r-- | VP-map.lua | 5 | ||||
-rw-r--r-- | VP-miscwork.lua | 106 | ||||
-rw-r--r-- | VP-textwork.lua | 38 |
3 files changed, 145 insertions, 4 deletions
@@ -98,6 +98,11 @@ VP_map = { [4734] = { dir = "MISC/SCRIPT", ext = "sarc", ftype = "arcroom", }, + [4797] = { dir = "MISC/UNKNOWN", ext = "carc", ftype = "carc", }, + [4798] = { dir = "MISC/UNKNOWN", ext = "carc", ftype = "carc", }, + [4799] = { dir = "MISC/UNKNOWN", ext = "carc", ftype = "carc", }, + [4807] = { dir = "MISC/UNKNOWN", ext = "carc", ftype = "carc", }, + -- -- Videos -- 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 diff --git a/VP-textwork.lua b/VP-textwork.lua index 2d3f56c..c7bc9af 100644 --- a/VP-textwork.lua +++ b/VP-textwork.lua @@ -1,3 +1,9 @@ +function get_next_char(script) + local c = script:readU8() + if c >= 0x80 then c = (c - 0x80) + (script:readU8() * 128) end + return c +end + function get_next_utf8(str) local ret = "" local n @@ -86,14 +92,38 @@ function dump_special(script, code) error "Should not end up there" end +function dump_special2(script, code) + if code == 0 then + return "\n", "\n" + elseif code == 1 then + return "\n<new/>\n", "\n" + else + local a1, a2 + if code == 3 or code == 5 or code == 7 or code == 8 or code == 9 or code == 12 or code == 13 or code == 14 or code == 15 or code == 21 then + a1 = script:readU8() + return '<u1 c="' .. code .. '" a="' .. a1 .. '"/>', "" + elseif code == 20 then + a1 = script:readU8() + a2 = script:readU8() + return '<u2 c="' .. code .. '" a1="' .. a1 .. '" a2="' .. a2 .. '"/>', "" + else + return '<uk c="' .. code .. '"/>', "" + end + end + error "Should not end up there" +end + function extract_char(script, lookup) - local - c = script:readU8() + local c = get_next_char(script) if c == 0 then return nil end - if c >= 0x80 then c = (c - 0x80) + (script:readU8() * 128) end if c >= 0x4000 then - return dump_special(script, c - 0x4000) + local code = c - 0x4000 + if second_style_script then + return dump_special2(script, code) + else + return dump_special(script, code) + end else local l = lookup[c] if not l and not sloppy_extract then error("Lookup failed for character " .. c) end |