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