#include #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 437 struct entry tab[N]; int main(void) { int i, j, s, dcount = 1; FILE * f, * t; int alreadycounted = 0; char fn[50], buff[2048]; unsigned char b, a1, a2; struct tentry te; unsigned long orig, pos, truesize, ptr, sig, size; int found, empty; f = fopen("slus_006.62", "r"); fseek(f, offset, SEEK_SET); for (i = 0; i < N; i++) { fread(&te, sizeof(struct tentry), 1, f); tab[i].sector = te.sector; tab[i].sizes[0] = te.u[0]; tab[i].sizes[1] = te.u[1] | (te.u[2] & 0xf); tab[i].sizes[2] = (te.u[2] >> 4) | (te.u[3] << 4); printf("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]); } fclose(f); f = fopen("pe.img", "r"); for (i = 0; i < N; i++) { fprintf(stderr, "Dumping room %i\n", i); if (!tab[i].sizes[0]) continue; fseek(f, tab[i].sector * 2048, SEEK_SET); for (j = 0; j < 3; j++) { sprintf(fn, "rooms/room-%04i-%02i.out", i, j); t = fopen(fn, "w"); for (s = 0; s < tab[i].sizes[j]; s++) { fread(buff, 2048, 1, f); fwrite(buff, 2048, 1, t); } fclose(t); } } for (i = 0; i < N; i++) { fprintf(stderr, "Dumping script %i\n", i); found = empty = 0; if (!tab[i].sizes[0]) continue; fseek(f, (tab[i].sector + tab[i].sizes[0] + tab[i].sizes[1]) * 2048, SEEK_SET); orig = ftell(f); sprintf(fn, "scripts/room-%04i.txt", i); t = fopen(fn, "w"); fread(&truesize, 4, 1, f); fseek(f, truesize - 4, SEEK_CUR); while (!found) { fread(&ptr, 4, 1, f); fseek(f, -8, SEEK_CUR); pos = ftell(f); if ((ptr >> 24) == 1) { ptr &= 0x00ffffff; fseek(f, orig + ptr, SEEK_SET); fread(&sig, 4, 1, f); if ((sig & 0xffff) == 0xfe) { fseek(f, pos, SEEK_SET); fread(&size, 4, 1, f); pos = ptr + orig; found = 1; } else if (sig != 0x4f414b41) { /* AKAO */ fclose(t); empty = 1; break; } } fseek(f, pos, SEEK_SET); } if (empty) continue; fprintf(stderr, "Found %i bytes of text at %i\n", size, pos); for (j = 0; j < size; j++) { b = fgetc(f); if (b <= MAXCHAR) { fputc(table[b], t); } else { switch(b) { case 0xf7: fputc('\n', t); break; case 0xf8: fprintf(t, "\n"); break; case 0xf9: fprintf(t, "\n\n"); break; case 0xfa: fprintf(t, ""); break; case 0xfb: j++; j++; a1 = fgetc(f); switch(a1) { case 0: fprintf(t, ""); break; case 1: fprintf(t, ""); break; case 9: a2 = fgetc(f); fprintf(t, "\n", a2); break; case 7: a2 = fgetc(f); fprintf(t, "", a2); break; default: fprintf(t, "", a1); break; } break; case 0xfe: j++; b = fgetc(f); fprintf(t, "\n", b); break; case 0xff: fprintf(t, "\n\n"); break; default: fprintf(t, "", b); } } } fclose(t); } return 0; }