summaryrefslogtreecommitdiff
path: root/PE
diff options
context:
space:
mode:
Diffstat (limited to 'PE')
-rw-r--r--PE/Makefile2
-rw-r--r--PE/extract-rooms.cpp6
-rw-r--r--PE/pe-hack.lua268
3 files changed, 272 insertions, 4 deletions
diff --git a/PE/Makefile b/PE/Makefile
index 2d404ab..1444f44 100644
--- a/PE/Makefile
+++ b/PE/Makefile
@@ -9,7 +9,7 @@ LIBS=-lz -lefence
LDFLAGS=${LIBS} `baltisot-config --libs`
#`pkg-config --libs glib-2.0`
-TARGET = reinsert compil extract extract-various extract-rooms
+TARGET = compil extract extract-various extract-rooms
all: ${TARGET}
diff --git a/PE/extract-rooms.cpp b/PE/extract-rooms.cpp
index 738411d..a23026f 100644
--- a/PE/extract-rooms.cpp
+++ b/PE/extract-rooms.cpp
@@ -15,7 +15,7 @@ struct entry {
#define fullsize 206213120
#define offset 0x83b78
-#define N 437
+#define N 438
CODE_BEGINS
struct entry tab[N];
@@ -43,8 +43,8 @@ virtual int startup() throw (GeneralException) {
tab[i].sizes[0] = te.u[0];
tab[i].sizes[1] = te.u[1] | ((te.u[2] & 0xf) << 8);
tab[i].sizes[2] = (te.u[2] >> 4) | (te.u[3] << 4);
- printm(M_INFO, "entry %3i - offset: %9i, sizes = %4i %4i %4i\n", i, tab[i].sector * 2048,
- tab[i].sizes[0], tab[i].sizes[1], tab[i].sizes[2]);
+ printm(M_INFO, "entry %3i - offset: %9i, sizes = %4i %4i %4i (%02x %02x %02x %02x)\n", i, tab[i].sector * 2048,
+ tab[i].sizes[0], tab[i].sizes[1], tab[i].sizes[2], te.u[0], te.u[1], te.u[2], te.u[3]);
}
delete f;
diff --git a/PE/pe-hack.lua b/PE/pe-hack.lua
new file mode 100644
index 0000000..97f1ec2
--- /dev/null
+++ b/PE/pe-hack.lua
@@ -0,0 +1,268 @@
+slus_hacks = {
+
+-- ASM Ptr hack
+ [0x1603c] = { 0xbc },
+
+-- ASM Font hack
+ [0x284e4] = { 0x21 },
+ [0x28540] = { 0x21, 0x18, 0x00, 0x00 },
+ [0x28fb8] = { 0x21, 0x18, 0x00, 0x00 },
+ [0x29074] = { 0x00, 0x00, 0x00 },
+
+
+-- Text "Susceptible to poison"
+ [0x81c96] = { 0x25, 0x34, 0x3d, 0x38, 0x3c, 0x34, 0x44, 0x47,
+ 0xff },
+
+-- Text "Susceptible to acid"
+ [0x81cc0] = { 0x14, 0x3c, 0x3f, 0x3e, 0x38, 0x42, 0x3e, 0x3d,
+ 0x3d, 0x34, 0x0f, 0x3f, 0x30, 0x41, 0x0f, 0x30,
+ 0x32, 0x38, 0x33, 0x34, 0xff },
+
+-- Text "Easily tranquilized"
+ [0x81ce8] = { 0x22, 0x34, 0x3d, 0x42, 0x38, 0x31, 0x3b, 0x34,
+ 0x0f, 0x30, 0x44, 0x47, 0x0f, 0x43, 0x41, 0x30,
+ 0x3d, 0x40, 0x44, 0x38, 0x3b, 0x38, 0x42, 0x30,
+ 0x3d, 0x43, 0x42, 0xff },
+
+-- Text "Sensitive to heat"
+ [0x81d0e] = { 0x22, 0x34, 0x3d, 0x42, 0x38, 0x31, 0x3b, 0x34,
+ 0x0f, 0x51, 0x0f, 0x3b, 0x30, 0x0f, 0x32, 0x37,
+ 0x30, 0x3b, 0x34, 0x44, 0x41, 0xff },
+
+-- Text "Sensitive to cold"
+ [0x81d32] = { 0x22, 0x34, 0x3d, 0x42, 0x38, 0x31, 0x3b, 0x34,
+ 0x0f, 0x30, 0x44, 0x0f, 0x35, 0x41, 0x3e, 0x38,
+ 0x33, 0xff },
+
+-- Text "Objects easily stolen"
+ [0x81d5a] = { 0x1f, 0x3e, 0x42, 0x42, 0x4e, 0x33, 0x34, 0x0f,
+ 0x33, 0x34, 0x42, 0x0f, 0x3e, 0x31, 0x39, 0x34,
+ 0x43, 0x42, 0x0f, 0x51, 0x0f, 0x45, 0x3e, 0x3b,
+ 0x34, 0x41, 0xff },
+
+-- Text "Gets confused easily"
+ [0x81d85] = { 0x12, 0x3e, 0x3d, 0x35, 0x44, 0x42, 0x38, 0x3e,
+ 0x3d, 0x0f, 0x3f, 0x3e, 0x42, 0x42, 0x38, 0x31,
+ 0x3b, 0x34, 0x0f, 0x34, 0x43, 0x0f, 0x34, 0x35,
+ 0x35, 0x38, 0x32, 0x30, 0x32, 0x34, 0xff },
+
+-- Text "Failed to escape"
+ [0x81dad] = { 0x15, 0x44, 0x38, 0x43, 0x34, 0x0f, 0x4d, 0x32,
+ 0x37, 0x44, 0x4d, 0x34, 0xff },
+
+-- Text "Can't escape!"
+ [0x81dca] = { 0x15, 0x44, 0x38, 0x43, 0x34, 0x0f, 0x38, 0x3c,
+ 0x3f, 0x3e, 0x42, 0x42, 0x38, 0x31, 0x3b, 0x34,
+ 0x2b, 0xff },
+
+
+-- Font width table
+ [0x81ea1] = { 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 8, 11, 14,
+ 9, 8, 7, 8, 7, 7, 8, 9, 6, 7, 9, 8, 11, 9, 7, 8,
+ 7, 9, 7, 7, 9, 9, 11, 7, 9, 7, 9, 4, 7, 6, 4, 4,
+ 8, 8, 7, 7, 7, 7, 8, 9, 5, 4, 8, 5, 11, 9, 7, 8,
+ 8, 7, 6, 5, 9, 9, 11, 7, 9, 6, 4, 4, 7, 7, 7, 7,
+ 7, 7, 7, 7, 5, 5, 7, 7, 9, 9, 9, 7, 11, 11, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+
+-- PE.BIN filename extension
+ [0x01b4c] = { 0x54, 0x49, 0x4d },
+}
+
+function apply_hacks(hacks, file)
+ local k, v, i, h
+ for k, v in pairs(slus_hacks) do
+ for i, h in ipairs(v) do
+ file[k + i - 1] = h
+ end
+ end
+end
+
+function mainpatch()
+ local dirent, pvd, root, is_cd1, is_cd2, slusname, fmvdir, systemcnfstring, inslus, slus, peimg, pesect, tim, startsect, fmvdirtree
+
+ dirent = cdutil:findpath "/SLUS_006.62;1" or cdutil:findpath "/SLUS_006.68;1" or error "Not a Parasite Eve CD"
+
+ iso:foreword(cdutil)
+ pvd = createpvd(cdutil)
+
+ print "Identifying CD..."
+ if (dirent.id == "SLUS_006.62;1") then
+ print "CD is Parasite Eve CD1"
+ pvd.volid = "PARASITE_EVE_FRANCAIS_CD1"
+ slusname = "PE-FR.CD1"
+ fmvdir = "FMV1"
+ is_cd1 = true
+ is_cd2 = false
+ else
+ print "CD is Parasite Eve CD2"
+ pvd.volid = "PARASITE_EVE_FRANCAIS_CD2"
+ slusname = "PE-FR.CD2"
+ fmvdir = "FMV2"
+ is_cd1 = false
+ is_cd2 = true
+ end
+ root = iso:setbasics(pvd)
+
+ systemcnfstring = "BOOT=cdrom:\\" .. slusname .. [[;1
+TCB=4
+EVENT=16
+STACK=801fff00
+]]
+
+ systemcnf = Buffer()
+ systemcnf:write(systemcnfstring)
+ iso:createfile(root, "SYSTEM.CNF", systemcnf, dirent)
+
+ print "Reading CD's slus file"
+ inslus = cdfile(cdutil, dirent)
+ slus = Buffer(true)
+ slus:copyfrom(inslus)
+ apply_hacks(slus_hacks, slus)
+
+ dirent = cdutil:findpath "/"
+ root:setbasicsxa()
+ root:fromdir(dirent)
+
+ dirent = cdutil:findpath "/PE.IMG;1"
+ pesect = dirent.Sector
+ peimg = cdfile(cdutil, dirent)
+ tim = Buffer()
+ peimg:copyto(tim, 0x23800)
+ startsect = iso:createfile(root, "PE.TIM", tim, dirent).sector
+ print "Compiling IMG file"
+ do_img_file(slus, startsect, pesect)
+
+ print "Writing final main file"
+ slus:seek(0)
+ iso:createfile(root, slusname, slus):setbasicsxa()
+
+ print "Copying FMV directory"
+ dirent = cdutil:findpath("/" .. fmvdir)
+ fmvdirtree = iso:createdir(root, fmvdir, 1, dirent)
+-- fmvdirtree.hardhide = true
+ iso:copydir(fmvdirtree, cdutil, dirent)
+
+ print "Finalizing CD"
+ iso:createfile(root, "README.TXT", Input("readme.txt")):setbasicsxa()
+
+ iso:close()
+end
+
+function do_img_file(slus, startsect, pesect)
+ local i, j, sect1, tab1, sect2, tab2, sect3, tab3, sizes1, sizes2, sizes3, sect, file, file1, file2, file3, songsect, b1, b2, b3, b4, lastsect, s1, s2, s3
+
+ sect1 = {}
+ tab1 = {}
+ sect2 = {}
+ tab2 = {}
+ sect3 = {}
+ tab3 = {}
+ sizes1 = {}
+ sizes2 = {}
+ sizes3 = {}
+
+
+ print "Putting various files"
+ slus:seek(0x838da)
+ for i = 1, 80, 1 do
+ sect1[i] = slus:readU16() + pesect
+ end
+ for i = 1, 79, 1 do
+-- print(i)
+ file = cdfile(cdutil, sect1[i], (sect1[i + 1] - sect1[i]) * 2048)
+ s1 = iso:putfile(file)
+ tab1[i] = s1 - startsect
+ print("Putting file " .. i .. " from sector " .. sect1[i] .. " to sector " .. s1)
+ end
+ tab1[80] = iso:getdispsect() - startsect
+ songsect = tab1[80]
+
+ print "Putting musics"
+ slus:seek(0x83980)
+ for i = 1, 251, 1 do
+ sect2[i] = slus:readU16() + sect1[80]
+ end
+ for i = 1, 250, 1 do
+-- print(i)
+ file = nil
+ if ((sect2[i + 1] - sect2[i]) ~= 0) then
+ file = cdfile(cdutil, sect2[i], (sect2[i + 1] - sect2[i]) * 2048)
+ end
+ if (file) then
+ s1 = iso:putfile(file)
+ end
+ tab2[i] = s1 - startsect - songsect
+ print("Putting music " .. i .. " from sector " .. sect2[i] .. " to sector " .. s1)
+ end
+ tab2[251] = iso:getdispsect() - startsect - songsect
+
+
+ print "Putting rooms"
+ slus:seek(0x83b78)
+ for i = 1, 438, 1 do
+ sect3[i] = slus:readU32() + pesect
+ b1 = slus:readU8()
+ b2 = slus:readU8()
+ b3 = slus:readU8()
+ b4 = slus:readU8()
+ sizes1[i] = b1
+ sizes2[i] = orB(b2, (shl(andB(b3, 0x0f), 8)))
+ sizes3[i] = orB(shr(b3, 4), shl(b4, 4))
+ end
+ for i = 1, 438, 1 do
+-- print(i)
+ file1 = nil
+ file2 = nil
+ file3 = nil
+ if (sizes1[i] ~= 0) then
+ print("File " .. i .. " from sector " .. sect3[i])
+ file1 = cdfile(cdutil, sect3[i], sizes1[i] * 2048)
+ end
+ if (sizes2[i] ~= 0) then
+ print("File " .. i .. " from sector " .. sect3[i] + sizes1[i])
+ file2 = cdfile(cdutil, sect3[i] + sizes1[i], sizes2[i] * 2048)
+ end
+ if (sizes3[i] ~= 0) then
+ print("File " .. i .. " from sector " .. sect3[i] + sizes1[i] + sizes2[i])
+ file3 = cdfile(cdutil, sect3[i] + sizes1[i] + sizes2[i], sizes3[i] * 2048)
+ end
+
+ s1 = iso:getdispsect() - startsect
+ if (file1) then
+ print("Put file " .. i .. " at " .. s1)
+ iso:putfile(file1)
+ end
+ s2 = iso:getdispsect() - startsect
+ if (file2) then
+ iso:putfile(file2)
+ end
+ s3 = iso:getdispsect() - startsect
+ if (file3) then
+ iso:putfile(file3)
+ end
+ tab3[i] = s1
+ sizes1[i] = s2 - s1
+ sizes2[i] = s3 - s2
+ sizes3[i] = iso:getdispsect() - s3
+ end
+
+ slus:wseek(0x838da)
+ for i = 1, 80, 1 do
+ slus:writeU16(tab1[i])
+ end
+ slus:writeU16(0)
+ slus:writeU16(songsect)
+ slus:writeU16(0)
+ for i = 1, 251, 1 do
+ slus:writeU16(tab2[i])
+ end
+
+ slus:wseek(0x83b78)
+end
+
+mainpatch()