A lot like TamoGameSystem. So similar that it might even be a predecessor. {{{#!highlight c++ #include #include #include #include void fread_or_die(void * a, size_t b, int c, FILE * d) { int got = fread(a, b, c, d); if(feof(d)) {puts("feof"); exit(0);} if(ferror(d)) {puts("ferror"); exit(0);} if(got != c) {exit(0);} } int main() { auto fs = fopen("scenario.dat", "rb"); auto ft = fopen("textdata.bin", "rb"); auto fo = fopen("script.txt", "wb"); fseek(fs, 0x20, SEEK_SET); std::set seen; while(!feof(fs) and !ferror(fs)) { /* !!!!!!!!!!!!!!!!!!!!!!! 07 03 00 80 54 04 00 00 A2 00 00 00 AA 00 00 00 08 00 00 00 00 00 03 00 01 00 00 00 02 03 00 01 3C B8 03 00 07 03 00 80 55 04 00 00 BC 00 00 00 C2 00 00 00 09 00 00 00 00 00 03 00 01 00 00 00 02 03 00 01 F0 BC 03 00 07 03 00 80 56 04 00 00 A2 00 00 00 CE 00 00 00 0A 00 00 00 00 00 03 00 01 00 00 00 02 03 00 01 A8 C6 03 00 07 03 00 80 57 04 00 00 A2 00 00 00 10 01 00 00 0B 00 00 00 00 00 03 00 01 00 00 00 02 03 00 01 E0 C9 03 00 # some kind of goto? 07 03 00 80 58 04 00 00 BC 00 00 00 30 01 00 00 0C 00 00 00 00 00 02 00 01 00 00 00 02 03 00 01 44 CF 03 00 01 02 02 80 04 00 00 04 64 00 00 00 2F 00 00 00 03 00 00 00 !!!!!!!!!!!!!!!!!! 06 04 00 80 00 00 00 00 # voicing (nulled) BC 00 00 00 # name FF 8A 00 00 # text 00 00 03 00 01 00 00 00 02 0D 00 01 C8 76 00 00 02 03 00 01 C4 22 73 00 !!!!!!!!!!!!!!!!!!! 03 03 00 03 0A 00 00 00 B4 70 00 00 # 普段から流れ星がよく降ることで有名なこの街では、そう珍しいことでもありません。 02 0D 00 01 30 2D 01 00 04 01 01 80 00 00 00 00 2F 00 00 00 03 00 00 00 04 00 01 80 01 00 00 00 F4 01 00 00 00 00 00 00 02 01 01 05 00 00 00 00 04 00 01 05 24 09 00 00 00 00 00 00 03 00 00 00 01 02 02 80 01 00 30 00 03 01 00 02 00 00 00 30 00 00 00 40 01 02 02 80 03 01 00 02 01 00 00 30 E6 03 00 10 00 00 03 00 01 00 00 00 07 03 00 80 00 00 00 00 00 00 00 00 80 A3 38 00 # ? C7 4E 01 00 # ? 00 00 03 00 # 01 00 00 00 # 07 03 00 80 # prefix 70 2A 01 00 # index of voice filename in filename.dat A1 CB 03 00 # name 9C A3 38 00 # text C8 4E 01 00 # ? 00 00 03 00 # ? 01 00 00 00 # ? 07 03 00 80 00 00 00 00 00 00 00 00 27 CB 07 00 # text CE 2E 00 00 # probably a counter 00 00 03 00 01 00 00 00 04 02 01 80 02 00 00 00 36 0A 00 00 # SE? 03 00 00 00 04 00 01 80 01 00 00 00 64 00 00 00 00 00 00 00 07 03 00 80 01 A3 00 00 # SE? C7 B6 0F 00 # text? 1F 62 1B 00 0B A8 00 00 # counter 00 00 03 00 01 00 00 00 04 02 01 80 14 00 00 00 90 62 00 00 03 00 00 00 04 00 01 80 01 00 00 00 64 00 00 00 00 00 00 00 02 03 00 01 4C AD 70 00 07 03 00 80 37 0A 00 00 # SE? X*20 = 146E0; X-10 = 146D0; dereference: = "LLT_A010013" E0 1D 00 00 # name? dereference = "ロロット" C5 90 00 00 # text? dereference = "「呼び捨てで構いません」" CE 02 00 00 00 00 00 00 01 00 00 00 04 00 01 05 39 0A 00 00 # SE: "SE_HOE" 00 00 00 00 03 00 00 00 02 03 00 01 2C 64 70 00 02 01 00 04 02 00 00 00 02 01 00 04 03 00 00 00 01 04 00 01 07 03 00 80 # ? 54 04 00 00 # ? isn't this for the next line? or is it 1-indexed? A2 00 00 00 # name AA 00 00 00 # text line 08 00 00 00 00 00 03 00 01 00 00 00 02 03 00 01 3C B8 03 00 07 03 00 80 55 04 00 00 BC 00 00 00 C2 00 00 00 09 00 00 00 00 00 03 00 01 00 00 00 */ /* 02 03 00 01 2C 64 70 00 07 03 00 80 4A 6A 00 00 # voice filename index A2 00 00 00 # name EE 19 00 00 # text C3 69 00 00 # unknown 00 00 03 00 01 00 00 00 04 02 01 80 01 00 00 00 4F 54 00 00 # ? 03 00 00 00 04 00 01 80 01 00 00 00 64 00 00 00 00 00 00 00 02 03 00 01 38 6D 70 00 07 03 00 80 4B 6A 00 00 # voice filename index A2 00 00 00 # name 96 30 11 00 # text C4 69 00 00 # unknown 00 00 03 00 01 00 00 00 04 02 01 80 04 00 00 00 48 6A 00 00 # ? 03 00 00 00 04 00 01 80 01 00 00 00 64 00 00 00 00 00 00 00 */ uint32_t command; fread_or_die(&command, 4, 1, fs); uint8_t consume = command&0xFF; if(consume == 0) { printf("Encoding error at %08X.\n", ftell(fs)); exit(0); } static auto last = ftell(fs); if(ftell(fs) < last) { printf("Movement error at %08X.\n", ftell(fs)); exit(0); } if(command == 0x80000307) { fseek(fs, 8, SEEK_CUR); uint32_t data; fread_or_die(&data, 4, 1, fs); if(!seen.count(data)) { seen.insert(data); fseek(ft, data, SEEK_SET); int c = fgetc(ft); while(c != 0) { fputc(c, fo); c = fgetc(ft); } fputc('\n', fo); } fseek(fs, 12, SEEK_CUR); } else if(command == 0x80000406) { fseek(fs, 8, SEEK_CUR); uint32_t data; fread_or_die(&data, 4, 1, fs); if(!seen.count(data)) { seen.insert(data); fseek(ft, data, SEEK_SET); int c = fgetc(ft); while(c != 0) { fputc(c, fo); c = fgetc(ft); } fputc('\n', fo); } fseek(fs, 8, SEEK_CUR); } else if(command == 0x03000303) { fseek(fs, 4, SEEK_CUR); uint32_t data; fread_or_die(&data, 4, 1, fs); if(!seen.count(data)) { seen.insert(data); fseek(ft, data, SEEK_SET); int c = fgetc(ft); while(c != 0) { fputc(c, fo); c = fgetc(ft); } } fputc('\n', fo); } else fseek(fs, 4*(consume-1), SEEK_CUR); } } }}}