diff options
-rw-r--r-- | VP-map.lua | 1 | ||||
-rw-r--r-- | VP-roomwork.lua | 99 |
2 files changed, 92 insertions, 8 deletions
@@ -66,6 +66,7 @@ VP_map = { [ 3] = { dir = "MISC", ext = "txt" }, [ 4] = { dir = "MAIN/SOUNDS", ext = "wag" }, [ 5] = { dir = "MAIN/GFX" }, + [ 6] = { dir = "MAIN/MISC", ext = "main", ftype = "arcroom" }, [ 618] = { dir = "SOUNDS/MISC", ext = "wag" }, [1021] = { dir = "SOUNDS/MISC", ext = "wag" }, diff --git a/VP-roomwork.lua b/VP-roomwork.lua index d1eabfe..ac0a958 100644 --- a/VP-roomwork.lua +++ b/VP-roomwork.lua @@ -120,7 +120,7 @@ function process_arcroom(fname, h, size, ext) o:destroy() h:seek(-size, SEEK_CUR) end - log("Processing " .. fname .. " - format 'arcroom'") + log("Processing " .. fname .. " - format 'arcroom' - " .. ext) dump_mkdir(fname) local nfiles = h:readU32() @@ -157,23 +157,23 @@ function process_arcroom(fname, h, size, ext) tell = h:tell() local handler = nil local counter = 1 - if dump_mode and index[i].ftype == 4 then + if dump_mode and ext == "room" and index[i].ftype == 4 then log("Preparing to dump script...") - script = Buffer(true) - font = Buffer(true) handler = function(fname, h, size, ext) if counter == 1 then log("Taking script...") + script = Buffer(true) script:copyfrom(h) elseif counter == 2 then log("Taking font...") + font = Buffer(true) font:copyfrom(h) else error("Too many files.") end counter = counter + 1 end - elseif index[i].ftype == 4 and script and font then + elseif not dump_mode and ext == "room" and index[i].ftype == 4 and script and font then old_script = Buffer(true) handler = function(fname, h, size, ext) local ret @@ -190,15 +190,46 @@ function process_arcroom(fname, h, size, ext) counter = counter + 1 return ret end + elseif dump_mode and ext == "main" and index[i].ftype == 4 then + if script then error "Can't have two scripts in these..." end + handler = function(fname, h, size, ext) + if counter == 1 then + log("Taking text...") + script = Buffer(true) + script:copyfrom(h) + else + error("Too many files") + end + counter = counter + 1 + end + elseif dump_mode and ext == "main" and index[i].ftype == 7 then + if font then error "Can't have two fonts in these..." 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 ext == "main" and index[i].ftype == 4 then + error "Not written yet" + elseif not dump_mode and ext == "main" and index[i].ftype == 7 then + error "Not written yet" end outfile[i] = process_single_file(fname .. string.format("/%04i-%08X", i, index[i].ftype), h, index[i].size, "room", handler) - if handler then - if counter ~= 3 then error("Didn't get enough files; got " .. (counter - 1) .. " instead of 2.") end - if dump_mode then + if handler and script and font then + if dump_mode and counter == 3 then extract_room_script(fname .. string.format("/%04i", i), script, font) + else + 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 @@ -497,3 +528,55 @@ function extract_room_script(fname, script, font) o:destroy() end + +function extract_simple_script(fname, script, font) + log("Processing script " .. fname) + dump_mkdir(fname) + local font = extract_font(fname .. "/FONT", font) + local lookup = resolve_font(font) + local n_ptrs = 1 + local script_begin = script:readU32() + + local ptrs = {} + local unks = {} + local ptr_start = 1 + local tell = script:tell() + + while tell < script_begin do + unks[n_ptrs] = script:readU32() + ptrs[n_ptrs] = script:readU32() + tell = script:tell() + n_ptrs = n_ptrs + 1 + end + ptrs[n_ptrs] = script:getsize() - script_begin + n_ptrs = n_ptrs - 1 + + local ptrs_contents, ptrs_raws = {}, {} + ptr_start = 1 + for i = ptr_start, n_ptrs do + ptrs_contents[i] = "" + ptrs_raws[i] = "" + +-- if tell + ptrs[i] ~= script:tell() then print("Script consistancy failure for pointer " .. i .. " - we're at " .. script:tell() .. " and " .. (tell + ptrs[i]) .. " was expected.") end + + script:seek(script_begin + ptrs[i]) + while script:tell() ~= (script_begin + ptrs[i + 1]) do + local r, rr = extract_char(script, lookup) + if r then + ptrs_contents[i] = ptrs_contents[i] .. r + ptrs_raws[i] = ptrs_raws[i] .. rr + elseif script:tell() ~= (script_begin + ptrs[i + 1]) then + ptrs_contents[i] = ptrs_contents[i] .. "<ZERO>" + end + end + end + + local o = Output(fname .. "-script.txt") + for i = ptr_start, n_ptrs do + o:write("<ptr " .. i .. " - " .. unks[i] .. ">\n") + o:write(ptrs_contents[i]) + o:write("\n") + end + + o:destroy() +end |