summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--VP-map.lua5
-rw-r--r--VP-miscwork.lua106
-rw-r--r--VP-textwork.lua38
3 files changed, 145 insertions, 4 deletions
diff --git a/VP-map.lua b/VP-map.lua
index 334f7c7..54a382e 100644
--- a/VP-map.lua
+++ b/VP-map.lua
@@ -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