diff options
Diffstat (limited to 'PE/extract-rooms.cpp')
-rw-r--r-- | PE/extract-rooms.cpp | 284 |
1 files changed, 142 insertions, 142 deletions
diff --git a/PE/extract-rooms.cpp b/PE/extract-rooms.cpp index f2e2e31..a23026f 100644 --- a/PE/extract-rooms.cpp +++ b/PE/extract-rooms.cpp @@ -1,142 +1,142 @@ -#include "Main.h"
-#include "Input.h"
-#include "Output.h"
-#include "table.h"
-
-struct tentry {
- int sector;
- unsigned char u[4];
-};
-
-struct entry {
- int sector;
- int sizes[3];
-};
-
-#define fullsize 206213120
-#define offset 0x83b78
-#define N 438
-
-CODE_BEGINS
-struct entry tab[N];
-
-virtual int startup() throw (GeneralException) {
- int i, j, s, dcount = 1;
- Input * f;
- Output * t;
- int alreadycounted = 0;
- String fn;
- char buff[2048];
- unsigned char b, a1, a2;
- struct tentry te;
- unsigned long orig, pos, truesize, ptr, sig, size;
- int found, empty;
-
- verbosity = M_INFO;
-
- f = new Input("slus_006.62");
- f->seek(offset);
-
- for (i = 0; i < N; i++) {
- f->read(&te, sizeof(struct tentry));
- tab[i].sector = te.sector;
- 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 (%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;
-
- f = new Input("pe.img");
-
- for (i = 0; i < N; i++) {
- printm(M_INFO, "Dumping room %i\n", i + 1);
-
- if (!tab[i].sizes[0])
- continue;
-
- f->seek(tab[i].sector * 2048);
- for (j = 0; j < 3; j++) {
- fn.set("rooms/room-%04i-%02i.out", i + 1, j);
-
- t = new Output(fn);
-
- for (s = 0; s < tab[i].sizes[j]; s++) {
- f->read(buff, 2048);
- t->write(buff, 2048);
- }
- delete t;
- }
- }
-
- for (i = 0; i < N; i++) {
- printm(M_INFO, "Dumping script %i\n", i + 1);
-
- found = empty = 0;
-
- if (!tab[i].sizes[0])
- continue;
-
- f->seek((tab[i].sector + tab[i].sizes[0] + tab[i].sizes[1]) * 2048);
- orig = f->tell();
-
- fn.set("scripts/room-%04i.txt", i);
- t = new Output(fn);
-
-#if 0
- f->read(&truesize, 4);
- f->seek(truesize - 4, SEEK_CUR);
-
- while (!found) {
- f->read(&ptr, 4);
- f->seek(-8, SEEK_CUR);
- pos = f->tell();
- if ((ptr >> 24) == 1) {
- ptr &= 0x00ffffff;
- f->seek(orig + ptr);
- f->read(&sig, 4);
- if ((sig & 0xffff) == 0xfe) {
- f->seek(pos);
- f->read(&size, 4);
- pos = ptr + orig;
- found = 1;
- } else if (sig != 0x4f414b41) { /* AKAO */
- delete t;
- empty = 1;
- break;
- }
- }
- f->seek(pos);
- }
-
- if (empty)
- continue;
-#else
- truesize = f->readU32();
- ptr = f->readU32();
- f->seek(orig + ptr + 32, SEEK_SET);
- ptr = f->readU32();
-
- if (!(ptr & 0xfff00000))
- continue;
-
- f->seek(orig + (ptr & 0xfffff) + 8);
- size = f->readU32();
- ptr = f->readU32();
- pos = orig + (ptr & 0xfffff);
- f->seek(pos);
-#endif
-
- printm(M_INFO, "Found %i bytes of text at %i\n", size, pos);
-
- extracttext(f, t, size);
-
- delete t;
- }
-
- delete f;
- return 0;
-}
-CODE_ENDS
+#include "Main.h" +#include "Input.h" +#include "Output.h" +#include "table.h" + +struct tentry { + int sector; + unsigned char u[4]; +}; + +struct entry { + int sector; + int sizes[3]; +}; + +#define fullsize 206213120 +#define offset 0x83b78 +#define N 438 + +CODE_BEGINS +struct entry tab[N]; + +virtual int startup() throw (GeneralException) { + int i, j, s, dcount = 1; + Input * f; + Output * t; + int alreadycounted = 0; + String fn; + char buff[2048]; + unsigned char b, a1, a2; + struct tentry te; + unsigned long orig, pos, truesize, ptr, sig, size; + int found, empty; + + verbosity = M_INFO; + + f = new Input("slus_006.62"); + f->seek(offset); + + for (i = 0; i < N; i++) { + f->read(&te, sizeof(struct tentry)); + tab[i].sector = te.sector; + 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 (%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; + + f = new Input("pe.img"); + + for (i = 0; i < N; i++) { + printm(M_INFO, "Dumping room %i\n", i + 1); + + if (!tab[i].sizes[0]) + continue; + + f->seek(tab[i].sector * 2048); + for (j = 0; j < 3; j++) { + fn.set("rooms/room-%04i-%02i.out", i + 1, j); + + t = new Output(fn); + + for (s = 0; s < tab[i].sizes[j]; s++) { + f->read(buff, 2048); + t->write(buff, 2048); + } + delete t; + } + } + + for (i = 0; i < N; i++) { + printm(M_INFO, "Dumping script %i\n", i + 1); + + found = empty = 0; + + if (!tab[i].sizes[0]) + continue; + + f->seek((tab[i].sector + tab[i].sizes[0] + tab[i].sizes[1]) * 2048); + orig = f->tell(); + + fn.set("scripts/room-%04i.txt", i); + t = new Output(fn); + +#if 0 + f->read(&truesize, 4); + f->seek(truesize - 4, SEEK_CUR); + + while (!found) { + f->read(&ptr, 4); + f->seek(-8, SEEK_CUR); + pos = f->tell(); + if ((ptr >> 24) == 1) { + ptr &= 0x00ffffff; + f->seek(orig + ptr); + f->read(&sig, 4); + if ((sig & 0xffff) == 0xfe) { + f->seek(pos); + f->read(&size, 4); + pos = ptr + orig; + found = 1; + } else if (sig != 0x4f414b41) { /* AKAO */ + delete t; + empty = 1; + break; + } + } + f->seek(pos); + } + + if (empty) + continue; +#else + truesize = f->readU32(); + ptr = f->readU32(); + f->seek(orig + ptr + 32, SEEK_SET); + ptr = f->readU32(); + + if (!(ptr & 0xfff00000)) + continue; + + f->seek(orig + (ptr & 0xfffff) + 8); + size = f->readU32(); + ptr = f->readU32(); + pos = orig + (ptr & 0xfffff); + f->seek(pos); +#endif + + printm(M_INFO, "Found %i bytes of text at %i\n", size, pos); + + extracttext(f, t, size); + + delete t; + } + + delete f; + return 0; +} +CODE_ENDS |