diff options
| author | Pixel <pixel@nobis-crew.org> | 2012-10-26 20:33:39 -0700 | 
|---|---|---|
| committer | Pixel <pixel@nobis-crew.org> | 2012-10-26 20:34:28 -0700 | 
| commit | 17c81623a7845c47d29cd29b80edb6a8200ecae1 (patch) | |
| tree | 91c391ff8da01717e6fe98e0c9fbcc575530f6f1 | |
| parent | eaadfce496989ff703ea864b66d615253bae9f8c (diff) | |
Adding one more script type; one with a brand new action table.
| -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 | 
