diff options
Diffstat (limited to 'VP-isowork.lua')
-rw-r--r-- | VP-isowork.lua | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/VP-isowork.lua b/VP-isowork.lua new file mode 100644 index 0000000..4b9efb2 --- /dev/null +++ b/VP-isowork.lua @@ -0,0 +1,163 @@ +load "VP-slz3-patch.lua" + +function apply_hacks(hacks, file) + local k, v, i, h + + for k, v in pairs(hacks) do + for i, h in ipairs(v) do + file[k + i - 1] = h + end + end +end + +function prepare_out(file_out) + if got_psp then + local x = Output "VP-FR.iso" + x:destroy() + globals[3] = dvdabstract(file_out or "VP-FR.iso", true) + else + globals[3] = Output(file_out or "VP-FR.bin") + end + local iso = isobuilder(globals[3]) + return iso +end + +function startup(file_in, file_in2, iso_out) + if not loadmodule then error("This can only be used with lua-interface...") end + loadmodule "lualibs" + loadmodule "luahandle" + loadmodule "luacd" + loadmodule "luaslz" + loadmodule "luahttp" + loadmodule "luaxml" +-- globals[1] = cdabstract(file_in or "VP-SQUISH.bin") + globals[1] = dvdabstract(file_in or "VP-PSP-EUR.iso") + local cdutil = cdutils(globals[1]) + if file_in2 then + globals[2] = cdabstract(file_in2) + local cdutil2 = cdutils(globals[2]) + end + return cdutil, cdutil2, iso_out +end + +anti_cd_swap_hack = { + [0x278C] = { 0x00, 0x00, 0x00, 0x00 }, + [0x27A0] = { 0x00, 0x00, 0x00, 0x00 }, + [0x27B4] = { 0x21, 0x10, 0x00, 0x00 }, + [0x2820] = { 0x00, 0x00, 0x00, 0x00 }, +} + +function iso_identify(cdutil) + local slusdirentuscd1 = cdutil:findpath "/SLUS_011.56;1" + local slusdirentuscd2 = cdutil:findpath "/SLUS_011.79;1" + local slusdirentjpcd1 = cdutil:findpath "/SLPM_863_79;1" + local slusdirentjpcd2 = cdutil:findpath "/SLPM_863_80;1" + local slusdirentsquished = cdutil:findpath "/VALKYRIE.EXE;1" + local pspdata = cdutil:findpath "/UMD_DATA.BIN" + if pspdata then + local pspdataf = cdutil:cdfile(pspdata) + local umddata = pspdataf:read() + if umddata == "ULUS-10107|400F6E7A41D6C586|0001|G" then + got_us = true + elseif umddata == "ULES-00724|2A9CD5DEEA986357|0001|G" then + got_eu = true + elseif umddata == "ULJM-05101|7862BF3F2632E5B5|0001|G" then + got_jp = true + else + error "Wrong PSP iso." + end + + got_psp = true + end + + if slusdirentuscd1 and got_cd1 then error "Got twice CD1." end + if slusdirentuscd2 and got_cd2 then error "Got twice CD2." end + + if slusdirentuscd1 or slusdirentuscd2 then got_us = true end + if slusdirentjpcd1 or slusdirentjpcd2 then got_jp = true end + if slusdirentuscd1 or slusdirentjpcd1 then got_cd1 = true end + if slusdirentuscd2 or slusdirentjpcd2 then got_cd2 = true end + + if slusdirentsquished then + got_cd1 = true + got_cd2 = true + -- let's fallback... + got_us = true + end + + if not slusent then + slusent = slusdirentuscd1 or slusdirentuscd2 or slusdirentjpcd1 or slusdirentjpcd2 or slusdirentsquished + end + + if got_us and got_jp then error "2 isos must from the same version of the game." end +end + +function build_basic(iso, cdutil, iso_full) + local cp = function(path, name, dirtree) copyfile(path, name, dirtree, iso, cdutil) end + iso:foreword(cdutil) + local pvd = createpvd(cdutil) + pvd.volid = "VP-FR" + local root = iso:setbasics(pvd) + dirent = cdutil:findpath "/" + root:setbasicsxa() + root:fromdir(dirent) + if got_psp then + root:setdvdmode() + psp_dirtrees.root = root + psp_dirtrees.PSP_GAME = iso:createdir(root, "PSP_GAME", 1, cdutil:findpath "/PSP_GAME") + psp_dirtrees.PSP_GAME:setbasicsxa() + psp_dirtrees.SYSDIR = iso:createdir(psp_dirtrees.PSP_GAME, "SYSDIR", 1, cdutil:findpath "/PSP_GAME/SYSDIR") + psp_dirtrees.SYSDIR:setbasicsxa() + psp_dirtrees.USRDIR = iso:createdir(psp_dirtrees.PSP_GAME, "USRDIR", 1, cdutil:findpath "/PSP_GAME/USRDIR") + psp_dirtrees.USRDIR:setbasicsxa() +--[[ + psp_dirtrees.kmodule = iso:createdir(psp_dirtrees.USRDIR, "kmodule", 1, cdutil:findpath "/PSP_GAME/USRDIR/kmodule") + psp_dirtrees.kmodule:setbasicsxa() +--]] + cp("", "UMD_DATA.BIN", root) + cp("/PSP_GAME/SYSDIR", "EBOOT.BIN", psp_dirtrees.SYSDIR) + cp("/PSP_GAME/SYSDIR", "BOOT.BIN", psp_dirtrees.SYSDIR) + for _, f in ipairs { "PARAM.SFO", "ICON0.PNG", "PIC0.PNG", "PIC1.PNG" } do + cp("/PSP_GAME", f, psp_dirtrees.PSP_GAME) + end +--[[ + for _, prx in ipairs { "audiocodec.prx", "libatrac3plus.prx", "mpeg.prx", "mpegbase.prx", "psmf.prx", "sc_sascore.prx", "videocodec.prx" } do + cp("/PSP_GAME/USRDIR/kmodule", prx, psp_dirtrees.kmodule) + end +]]-- + for _, prx in ipairs { "Title_master.prx", "Staff_master.prx", "Battle_master.prx" } do + cp("/PSP_GAME/USRDIR", prx, psp_dirtrees.USRDIR) + end + pspval1_sec = iso:getdispsect() + local dummy = Buffer() + dummy:writeU8(0) + local dirent = cdutil:findpath "/PSP_GAME/USRDIR/PSPVAL1.PFS" + psp_dirtrees.PSPVAL1 = iso:createfile(psp_dirtrees.USRDIR, "PSPVAL1.PFS", dummy, dirent) + psp_dirtrees.PSPVAL1:setbasicsxa() + dummy:destroy() + else + local systemcnfstring = "BOOT=cdrom:\\VP-FR.EXE;1\r\nTCB=4\r\nEVENT=16\r\nSTACK=801fff00\r\n" + local systemcnf = Buffer() + local slus = Buffer(true) + slus:copyfrom(cdutil:cdfile(slusdirent)) + slus:seek(0) + systemcnf:write(systemcnfstring) + local dirent = cdutil:findpath("/SYSTEM.CNF;1") + iso:createfile(root, "SYSTEM.CNF", systemcnf, dirent):setbasicsxa() + if iso_full then + apply_hacks(anti_cd_swap_hack, slus) + end + apply_hacks(slz3_patch, slus) + slus:seek(0) + iso:createfile(root, "VP-FR.EXE", slus, slusdirent):setbasicsxa() + slus:seek(0) + local readme = Buffer() + readme:write("Readme...") + iso:createfile(root, "README.TXT", readme, dirent):setbasicsxa() + local cursect = iso:getdispsect() + local falsesect = {} + for i = cursect, 149 do + iso:createsector(falsesect, MODE2_FORM1) + end + end +end |