├── common.cpp ├── common.h ├── th06.cpp ├── th07.cpp ├── th08.cpp ├── th10.cpp ├── th11.cpp ├── th12.cpp ├── th125.cpp ├── th128.cpp ├── th13.cpp └── threp.cpp /common.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * common.cpp 3 | * 4 | * Created on: 2010-5-9 5 | * Author: Argon 6 | */ 7 | 8 | #include "common.h" 9 | 10 | unsigned int get_bit(unsigned char* buffer, unsigned int &pointer, unsigned char &filter, unsigned char length) { 11 | unsigned char i; 12 | unsigned int result = 0; 13 | unsigned char current; 14 | current = buffer[pointer]; 15 | for (i = 0; i < length; ++i) { 16 | result <<= 1; 17 | if (current & filter) 18 | result |= 0x1; 19 | filter >>= 1; 20 | if (filter == 0) { 21 | pointer++; 22 | current = buffer[pointer]; 23 | filter = 0x80; 24 | } 25 | } 26 | return result; 27 | } 28 | unsigned int decompress(unsigned char * buffer, unsigned char * decode, unsigned int length) { 29 | unsigned int pointer = 0, dest = 0, index, bits, i; 30 | unsigned char filter = 0x80; 31 | unsigned char dict[0x2010]; 32 | memset(dict, 0, 0x2010); 33 | while (pointer < length) { 34 | bits = get_bit(buffer, pointer, filter, 1); 35 | if (pointer >= length) 36 | return dest; 37 | if (bits) { 38 | bits = get_bit(buffer, pointer, filter, 8); 39 | if (pointer >= length) 40 | return dest; 41 | decode[dest] = (unsigned char) bits; 42 | dict[dest & 0x1fff] = (unsigned char) bits; 43 | dest++; 44 | } else { 45 | bits = get_bit(buffer, pointer, filter, 13); 46 | if (pointer >= length) 47 | return dest; 48 | index = bits - 1; 49 | bits = get_bit(buffer, pointer, filter, 4); 50 | if (pointer >= length) 51 | return dest; 52 | bits += 3; 53 | for (i = 0; i < bits; ++i) { 54 | dict[dest & 0x1fff] = dict[index + i]; 55 | decode[dest] = dict[index + i]; 56 | dest++; 57 | } 58 | } 59 | } 60 | return dest; 61 | } 62 | 63 | void decode(unsigned char * buffer, int length, int block_size, unsigned char base, unsigned char add) { 64 | unsigned char * tbuf = new unsigned char[length]; 65 | memcpy(tbuf, buffer, length); 66 | int i, p = 0, tp1, tp2, hf, left = length; 67 | if ((left % block_size) < (block_size / 4)) 68 | left -= left % block_size; 69 | left -= length & 1; 70 | while (left) { 71 | if (left < block_size) 72 | block_size = left; 73 | tp1 = p + block_size - 1; 74 | tp2 = p + block_size - 2; 75 | hf = (block_size + (block_size & 0x1)) / 2; 76 | for (i = 0; i < hf; ++i, ++p) { 77 | buffer[tp1] = tbuf[p] ^ base; 78 | base += add; 79 | tp1 -= 2; 80 | } 81 | hf = block_size / 2; 82 | for (i = 0; i < hf; ++i, ++p) { 83 | buffer[tp2] = tbuf[p] ^ base; 84 | base += add; 85 | tp2 -= 2; 86 | } 87 | left -= block_size; 88 | } 89 | delete[] tbuf; 90 | } 91 | -------------------------------------------------------------------------------- /common.h: -------------------------------------------------------------------------------- 1 | /* 2 | * common.h 3 | * 4 | * Created on: 2010-5-9 5 | * Author: Argon 6 | */ 7 | 8 | #ifndef COMMON_H_ 9 | #define COMMON_H_ 10 | 11 | #include 12 | #include 13 | #include 14 | #include 15 | 16 | void th06decode(char *file, unsigned char * buffer, unsigned int flength); 17 | void th07decode(char *file, unsigned char * buffer, unsigned int flength); 18 | void th08decode(char *file, unsigned char * buffer, unsigned int flength); 19 | void th10decode(char *file, unsigned char * buffer, unsigned int flength); 20 | void th11decode(char *file, unsigned char * buffer, unsigned int flength); 21 | void th12decode(char *file, unsigned char * buffer, unsigned int flength); 22 | void th125decode(char *file, unsigned char * buffer, unsigned int flength); 23 | void th128decode(char *file, unsigned char * buffer, unsigned int flength); 24 | void th13decode(char *file, unsigned char * buffer, unsigned int flength); 25 | 26 | unsigned int get_bit(unsigned char* buffer, unsigned int &pointer, unsigned char &filter, unsigned char length); 27 | unsigned int decompress(unsigned char * buffer, unsigned char * decode, unsigned int length); 28 | void decode(unsigned char * buffer, int length, int block_size, unsigned char base, unsigned char add); 29 | 30 | 31 | #endif /* COMMON_H_ */ 32 | -------------------------------------------------------------------------------- /th06.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * th06.cpp 3 | * 4 | * Created on: 2010-5-9 5 | * Author: Argon 6 | */ 7 | 8 | #include "common.h" 9 | 10 | void th06decode(char *file, unsigned char * buffer, unsigned int flength) { 11 | char frec[50]; 12 | char fraw[50]; 13 | unsigned int i, checksum; 14 | unsigned char base; 15 | base = *((unsigned char*) (&buffer[0x0e])); 16 | sprintf(frec, "%s.txt", file); 17 | sprintf(fraw, "%s.raw", file); 18 | for (i = 0x0f; i < flength; ++i) { 19 | buffer[i] -= base; 20 | base += 7; 21 | } 22 | checksum = 0x3f000318; 23 | for (i = 0x0e; i < flength; ++i) 24 | checksum += buffer[i]; 25 | FILE *fpraw = fopen(fraw, "wb"); 26 | fwrite(buffer, flength, 1, fpraw); 27 | fclose(fpraw); 28 | printf("Decoding done."); 29 | } 30 | -------------------------------------------------------------------------------- /th07.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * th07.cpp 3 | * 4 | * Created on: 2010-5-9 5 | * Author: Argon 6 | */ 7 | 8 | #include "common.h" 9 | 10 | void th07decode(char *file, unsigned char * buffer, unsigned int flength) { 11 | char frec[50]; 12 | char fraw[50]; 13 | unsigned char *rawdata = &buffer[0x54], *decodedata; 14 | unsigned int i, length, dlength, rlength, checksum; 15 | unsigned char base; 16 | base = *((unsigned char*) (&buffer[0x0d])); 17 | sprintf(frec, "%s.txt", file); 18 | sprintf(fraw, "%s.raw", file); 19 | for (i = 0x10; i < flength; ++i) { 20 | buffer[i] -= base; 21 | base += 7; 22 | } 23 | checksum = 0x3f000318; 24 | for (i = 0x0d; i < flength; ++i) 25 | checksum += buffer[i]; 26 | length = *((unsigned int*) (&buffer[0x14])); 27 | dlength = *((unsigned int*) (&buffer[0x18])); 28 | decodedata = new unsigned char[dlength]; 29 | rlength = decompress(rawdata, decodedata, length); 30 | FILE *fpraw = fopen(fraw, "wb"); 31 | fwrite(decodedata, rlength, 1, fpraw); 32 | fclose(fpraw); 33 | printf("Decompression done."); 34 | 35 | delete[] decodedata; 36 | } 37 | -------------------------------------------------------------------------------- /th08.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * th08.cpp 3 | * 4 | * Created on: 2010-5-9 5 | * Author: Argon 6 | */ 7 | 8 | #include "common.h" 9 | 10 | void th08decode(char *file, unsigned char * buffer, unsigned int flength) { 11 | char frec[50]; 12 | char fraw[50]; 13 | unsigned char *rawdata = &buffer[0x68], *decodedata; 14 | unsigned int i, length, dlength, rlength, checksum; 15 | unsigned char base; 16 | base = *((unsigned char*) (&buffer[0x15])); 17 | length = *((unsigned int*) (&buffer[0x0c])); 18 | sprintf(frec, "%s.txt", file); 19 | sprintf(fraw, "%s.raw", file); 20 | for (i = 24; i < length; ++i) { 21 | buffer[i] -= base; 22 | base += 7; 23 | } 24 | checksum = 0x3f000318; 25 | for (i = 21; i < length; ++i) 26 | checksum += buffer[i]; 27 | dlength = *((unsigned int*) (&buffer[0x1c])); 28 | decodedata = new unsigned char[dlength]; 29 | rlength = decompress(rawdata, decodedata, length - 0x68); 30 | FILE *fpraw = fopen(fraw, "wb"); 31 | fwrite(decodedata, rlength, 1, fpraw); 32 | fclose(fpraw); 33 | printf("Decompression done."); 34 | 35 | delete[] decodedata; 36 | } 37 | -------------------------------------------------------------------------------- /th10.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * th10.cpp 3 | * 4 | * Created on: 2010-5-9 5 | * Author: Argon 6 | */ 7 | 8 | #include "common.h" 9 | 10 | void th10decode(char *file, unsigned char * buffer, unsigned int flength) { 11 | char frec[50]; 12 | char fraw[50]; 13 | unsigned int score[6], faith[6]; 14 | unsigned int frame, rlength, llength, i, l; 15 | unsigned char character, ctype, rank, clear; 16 | unsigned char framekey, stage; 17 | unsigned char *rawdata = &buffer[0x24], *stagedata, *replaydata, *fpsdata, *decodedata; 18 | unsigned int length = *((unsigned int*) (&buffer[0x1c])); 19 | unsigned int dlength = *((unsigned int*) (&buffer[0x20])); 20 | unsigned short keys[16] = 21 | { 0xf0a1, 0xfca1, 0xfda1, 0xfda1, 0xfba1, 0x49a8, 0x4ca8, 0x49a8, 0xfaa1, 0x4aa8, 0x4ba8, 0x4aa8, 0xfba1, 0x49a8, 0x4ca8, 0x49a8 }; 22 | unsigned short skey[61]; 23 | sprintf(frec, "%s.txt", file); 24 | sprintf(fraw, "%s.raw", file); 25 | 26 | decodedata = new unsigned char[dlength]; 27 | decode(rawdata, length, 0x400, 0xaa, 0xe1); 28 | decode(rawdata, length, 0x80, 0x3d, 0x7a); 29 | rlength = decompress(rawdata, decodedata, length); 30 | FILE *fpraw = fopen(fraw, "wb"); 31 | fwrite(decodedata, dlength, 1, fpraw); 32 | fclose(fpraw); 33 | printf("Decompression done."); 34 | 35 | stagedata = &decodedata[0x64]; 36 | stage = decodedata[0x4c]; 37 | if (stage > 6) 38 | stage = 6; 39 | faith[0] = 5000; 40 | for (i = 1; i < stage; ++i) { 41 | stagedata = stagedata + 0x1c4 + *((unsigned int*) &stagedata[0x8]); 42 | score[i - 1] = *((unsigned int*) &stagedata[0xc]); 43 | faith[i] = *((unsigned int*) &stagedata[0x14]); 44 | } 45 | score[stage - 1] = *((unsigned int*) &decodedata[0x10]); 46 | character = decodedata[0x50]; 47 | ctype = decodedata[0x54]; 48 | rank = decodedata[0x58]; 49 | clear = decodedata[0x5c]; 50 | 51 | FILE * fprec = fopen(frec, "wb"); 52 | fprintf(fprec, "file : %s\r\n", file); 53 | fprintf(fprec, "rawdata size = 0x%x\r\n", length); 54 | fprintf(fprec, "alloced size = 0x%x\r\n", dlength); 55 | fprintf(fprec, "decodedatad size = 0x%x\r\n", rlength); 56 | decodedata[8] = 0; 57 | fprintf(fprec, "----------\r\n"); 58 | fprintf(fprec, "player : %s\r\n", decodedata); 59 | fprintf(fprec, "character : "); 60 | if (!character) 61 | fprintf(fprec, "Reimu"); 62 | else 63 | fprintf(fprec, "Marisa"); 64 | if (ctype == 0) 65 | fprintf(fprec, "A\r\n"); 66 | else if (ctype == 1) 67 | fprintf(fprec, "B\r\n"); 68 | else 69 | fprintf(fprec, "C\r\n"); 70 | fprintf(fprec, "rank : "); 71 | if (rank == 0) 72 | fprintf(fprec, "easy\r\n"); 73 | else if (rank == 1) 74 | fprintf(fprec, "normal\r\n"); 75 | else if (rank == 2) 76 | fprintf(fprec, "hard\r\n"); 77 | else if (rank == 3) 78 | fprintf(fprec, "lunatic\r\n"); 79 | else 80 | fprintf(fprec, "extra\r\n"); 81 | fprintf(fprec, "clear : "); 82 | if (clear == 8) 83 | fprintf(fprec, "all\r\n"); 84 | else if (clear == 7) 85 | fprintf(fprec, "extra\r\n"); 86 | else 87 | fprintf(fprec, "%d\r\n", clear); 88 | fprintf(fprec, "----------\r\n"); 89 | 90 | stagedata = &decodedata[0x64]; 91 | for (l = 0; l < stage; ++l) { 92 | replaydata = stagedata + 0x1c4; 93 | frame = *((unsigned int*) &stagedata[0x4]); 94 | llength = *((unsigned int*) &stagedata[0x8]); 95 | fpsdata = replaydata + frame * 6; 96 | if (rank != 0x4) 97 | fprintf(fprec, "stage : %d ", stagedata[0]); 98 | else 99 | fprintf(fprec, "stage : extra "); 100 | fprintf(fprec, "score = %d0 | frame size = 0x%x | stage length = 0x%x\r\n", score[l], frame, llength); 101 | fprintf(fprec, "= Time = ====================================================== "); 102 | fprintf(fprec, "Operations ======================================================\r\n"); 103 | skey[60] = 0; 104 | for (i = 0; i < frame; ++i) { 105 | if (!(i % 60)) 106 | fprintf(fprec, "[%06d] ", i / 60); 107 | framekey = (replaydata[i * 6] >> 4) & 0xf; 108 | skey[i % 60] = keys[framekey]; 109 | if (!((i + 1) % 60)) 110 | fprintf(fprec, "%s\r\n", (char *) skey); 111 | } 112 | if (i % 60) { 113 | skey[i % 60] = 0; 114 | fprintf(fprec, "%s\r\n", (char *) skey); 115 | } 116 | stagedata += llength + 0x1c4; 117 | } 118 | fclose(fprec); 119 | delete[] decodedata; 120 | } 121 | -------------------------------------------------------------------------------- /th11.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * th11.cpp 3 | * 4 | * Created on: 2010-5-9 5 | * Author: Argon 6 | */ 7 | 8 | #include "common.h" 9 | 10 | void th11decode(char *file, unsigned char * buffer, unsigned int flength) { 11 | char frec[50]; 12 | char fraw[50]; 13 | unsigned int score[6], maxp[6], graze[6]; 14 | unsigned int frame, rlength, llength, i, l; 15 | unsigned char character, ctype, rank, clear; 16 | unsigned char framekey, stage; 17 | unsigned char *rawdata = &buffer[0x24], *stagedata, *replaydata, *fpsdata, *decodedata; 18 | unsigned int length = *((unsigned int*) (&buffer[0x1c])); 19 | unsigned int dlength = *((unsigned int*) (&buffer[0x20])); 20 | short keys[] = { 0xf0a1, 0xfca1, 0xfda1, 0xfda1, 0xfba1, 0x49a8, 0x4ca8, 0x49a8, 0xfaa1, 0x4aa8, 0x4ba8, 0x4aa8, 0xfba1, 21 | 0x49a8, 0x4ca8, 0x49a8 }; 22 | short skey[61]; 23 | sprintf(frec, "%s.txt", file); 24 | sprintf(fraw, "%s.raw", file); 25 | 26 | decodedata = new unsigned char[dlength]; 27 | decode(rawdata, length, 0x800, 0xaa, 0xe1); 28 | decode(rawdata, length, 0x40, 0x3d, 0x7a); 29 | rlength = decompress(rawdata, decodedata, length); 30 | FILE *fpraw = fopen(fraw, "wb"); 31 | fwrite(decodedata, dlength, 1, fpraw); 32 | fclose(fpraw); 33 | printf("Decompression done."); 34 | 35 | stagedata = &decodedata[0x70]; 36 | stage = decodedata[0x58]; 37 | if (stage > 6) 38 | stage = 6; 39 | graze[0] = 0; 40 | for (i = 1; i < stage; ++i) { 41 | stagedata = stagedata + 0x90 + *((unsigned int*) &stagedata[0x8]); 42 | score[i - 1] = *((unsigned int*) &stagedata[0xc]); 43 | maxp[i] = *((unsigned int*) &stagedata[0x14]); 44 | graze[i] = *((unsigned int*) &stagedata[0x34]); 45 | } 46 | score[stage - 1] = *((unsigned int*) &decodedata[0x14]); 47 | character = decodedata[0x5c]; 48 | ctype = decodedata[0x60]; 49 | rank = decodedata[0x64]; 50 | clear = decodedata[0x68]; 51 | if (rank == 0) 52 | maxp[0] = 25000; 53 | else if (rank == 1) 54 | maxp[0] = 50000; 55 | else if (rank == 2) 56 | maxp[0] = 50000; 57 | else 58 | maxp[0] = 200000; 59 | 60 | FILE * fprec = fopen(frec, "wb"); 61 | fprintf(fprec, "file : %s\r\n", file); 62 | fprintf(fprec, "rawdata size = 0x%x\r\n", length); 63 | fprintf(fprec, "alloced size = 0x%x\r\n", dlength); 64 | fprintf(fprec, "decodedatad size = 0x%x\r\n", rlength); 65 | 66 | decodedata[8] = 0; 67 | fprintf(fprec, "----------\r\n"); 68 | fprintf(fprec, "player : %s\r\n", decodedata); 69 | fprintf(fprec, "character : "); 70 | if (!character) 71 | fprintf(fprec, "Reimu"); 72 | else 73 | fprintf(fprec, "Marisa"); 74 | if (ctype == 0) 75 | fprintf(fprec, "A\r\n"); 76 | else if (ctype == 1) 77 | fprintf(fprec, "B\r\n"); 78 | else 79 | fprintf(fprec, "C\r\n"); 80 | fprintf(fprec, "rank : "); 81 | if (rank == 0) 82 | fprintf(fprec, "easy\r\n"); 83 | else if (rank == 1) 84 | fprintf(fprec, "normal\r\n"); 85 | else if (rank == 2) 86 | fprintf(fprec, "hard\r\n"); 87 | else if (rank == 3) 88 | fprintf(fprec, "lunatic\r\n"); 89 | else 90 | fprintf(fprec, "extra\r\n"); 91 | fprintf(fprec, "clear : "); 92 | if (clear == 8) 93 | fprintf(fprec, "all\r\n"); 94 | else if (clear == 7) 95 | fprintf(fprec, "extra\r\n"); 96 | else 97 | fprintf(fprec, "%d\r\n", clear); 98 | fprintf(fprec, "----------\r\n"); 99 | 100 | stagedata = &decodedata[0x70]; 101 | for (l = 0; l < stage; ++l) { 102 | replaydata = stagedata + 0x90; 103 | frame = *((unsigned int*) &stagedata[0x4]); 104 | llength = *((unsigned int*) &stagedata[0x8]); 105 | fpsdata = replaydata + frame * 6; 106 | if (rank != 0x4) 107 | fprintf(fprec, "stage : %d ", stagedata[0]); 108 | else 109 | fprintf(fprec, "stage : extra "); 110 | fprintf(fprec, "score = %d0 | frame size = 0x%x | stage length = 0x%x\r\n", score[l], frame, llength); 111 | fprintf(fprec, "= Time = ====================================================== "); 112 | fprintf(fprec, "Operations ======================================================\r\n"); 113 | skey[60] = 0; 114 | for (i = 0; i < frame; ++i) { 115 | if (!(i % 60)) 116 | fprintf(fprec, "[%06d] ", i / 60); 117 | framekey = (replaydata[i * 6] >> 4) & 0xf; 118 | skey[i % 60] = keys[framekey]; 119 | if (!((i + 1) % 60)) 120 | fprintf(fprec, "%s\r\n", (char *) skey); 121 | } 122 | if (i % 60) { 123 | skey[i % 60] = 0; 124 | fprintf(fprec, "%s\r\n", (char *) skey); 125 | } 126 | stagedata += llength + 0x90; 127 | } 128 | fclose(fprec); 129 | delete[] decodedata; 130 | } 131 | -------------------------------------------------------------------------------- /th12.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * th12.cpp 3 | * 4 | * Created on: 2010-5-9 5 | * Author: Argon 6 | */ 7 | 8 | #include "common.h" 9 | 10 | void th12decode(char *file, unsigned char * buffer, unsigned int flength) { 11 | char frec[50]; 12 | char fraw[50]; 13 | unsigned int score[6], maxp[6], graze[6]; 14 | unsigned int frame, rlength, llength, i, l; 15 | unsigned char character, ctype, rank, clear; 16 | unsigned char framekey, stage; 17 | unsigned char *rawdata = &buffer[0x24], *stagedata, *replaydata, *fpsdata, *decodedata; 18 | unsigned int length = *((unsigned int*) (&buffer[0x1c])); 19 | unsigned int dlength = *((unsigned int*) (&buffer[0x20])); 20 | short keys[] = { 0xf0a1, 0xfca1, 0xfda1, 0xfda1, 0xfba1, 0x49a8, 0x4ca8, 0x49a8, 0xfaa1, 0x4aa8, 0x4ba8, 0x4aa8, 0xfba1, 21 | 0x49a8, 0x4ca8, 0x49a8 }; 22 | short skey[61]; 23 | sprintf(frec, "%s.txt", file); 24 | sprintf(fraw, "%s.raw", file); 25 | 26 | decodedata = new unsigned char[dlength]; 27 | decode(rawdata, length, 0x800, 0x5e, 0xe1); 28 | decode(rawdata, length, 0x40, 0x7d, 0x3a); 29 | rlength = decompress(rawdata, decodedata, length); 30 | FILE *fpraw = fopen(fraw, "wb"); 31 | fwrite(decodedata, dlength, 1, fpraw); 32 | fclose(fpraw); 33 | printf("Decompression done."); 34 | 35 | stagedata = &decodedata[0x70]; 36 | stage = decodedata[0x58]; 37 | if (stage > 6) 38 | stage = 6; 39 | graze[0] = 0; 40 | for (i = 1; i < stage; ++i) { 41 | stagedata = stagedata + 0xa0 + *((unsigned int*) &stagedata[0x8]); 42 | score[i - 1] = *((unsigned int*) &stagedata[0xc]); 43 | maxp[i] = *((unsigned int*) &stagedata[0x14]); 44 | graze[i] = *((unsigned int*) &stagedata[0x44]); 45 | } 46 | score[stage - 1] = *((unsigned int*) &decodedata[0x14]); 47 | character = decodedata[0x5c]; 48 | ctype = decodedata[0x60]; 49 | rank = decodedata[0x64]; 50 | clear = decodedata[0x68]; 51 | if (rank == 0) 52 | maxp[0] = 500000; 53 | else if (rank == 1) 54 | maxp[0] = 1000000; 55 | else if (rank == 2) 56 | maxp[0] = 1500000; 57 | else 58 | maxp[0] = 2000000; 59 | 60 | FILE * fprec = fopen(frec, "wb"); 61 | fprintf(fprec, "file : %s\r\n", file); 62 | fprintf(fprec, "rawdata size = 0x%x\r\n", length); 63 | fprintf(fprec, "alloced size = 0x%x\r\n", dlength); 64 | fprintf(fprec, "decodedatad size = 0x%x\r\n", rlength); 65 | 66 | decodedata[8] = 0; 67 | fprintf(fprec, "----------\r\n"); 68 | fprintf(fprec, "player : %s\r\n", decodedata); 69 | fprintf(fprec, "character : "); 70 | if (character == 0) 71 | fprintf(fprec, "Reimu"); 72 | else if (character == 1) 73 | fprintf(fprec, "Marisa"); 74 | else 75 | fprintf(fprec, "Sanae"); 76 | if (ctype == 0) 77 | fprintf(fprec, "A\r\n"); 78 | else 79 | fprintf(fprec, "B\r\n"); 80 | fprintf(fprec, "rank : "); 81 | if (rank == 0) 82 | fprintf(fprec, "easy\r\n"); 83 | else if (rank == 1) 84 | fprintf(fprec, "normal\r\n"); 85 | else if (rank == 2) 86 | fprintf(fprec, "hard\r\n"); 87 | else if (rank == 3) 88 | fprintf(fprec, "lunatic\r\n"); 89 | else 90 | fprintf(fprec, "extra\r\n"); 91 | fprintf(fprec, "clear : "); 92 | if (clear == 8) 93 | fprintf(fprec, "all\r\n"); 94 | else if (clear == 7) 95 | fprintf(fprec, "extra\r\n"); 96 | else 97 | fprintf(fprec, "%d\r\n", clear); 98 | fprintf(fprec, "----------\r\n"); 99 | 100 | stagedata = &decodedata[0x70]; 101 | for (l = 0; l < stage; ++l) { 102 | replaydata = stagedata + 0xa0; 103 | frame = *((unsigned int*) &stagedata[0x4]); 104 | llength = *((unsigned int*) &stagedata[0x8]); 105 | fpsdata = replaydata + frame * 6; 106 | if (rank != 0x4) 107 | fprintf(fprec, "stage : %d ", stagedata[0]); 108 | else 109 | fprintf(fprec, "stage : extra "); 110 | fprintf(fprec, "score = %d0 | frame size = 0x%x | stage length = 0x%x\r\n", score[l], frame, llength); 111 | fprintf(fprec, "= Time = ====================================================== "); 112 | fprintf(fprec, "Operations ======================================================\r\n"); 113 | skey[60] = 0; 114 | for (i = 0; i < frame; ++i) { 115 | if (!(i % 60)) 116 | fprintf(fprec, "[%06d] ", i / 60); 117 | framekey = (replaydata[i * 6] >> 4) & 0xf; 118 | skey[i % 60] = keys[framekey]; 119 | if (!((i + 1) % 60)) 120 | fprintf(fprec, "%s\r\n", (char *) skey); 121 | } 122 | if (i % 60) { 123 | skey[i % 60] = 0; 124 | fprintf(fprec, "%s\r\n", (char *) skey); 125 | } 126 | stagedata += llength + 0xa0; 127 | } 128 | fclose(fprec); 129 | delete[] decodedata; 130 | } 131 | -------------------------------------------------------------------------------- /th125.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * th125.cpp 3 | * 4 | * Created on: 2010-9-10 5 | * Author: Argon 6 | */ 7 | 8 | #include "common.h" 9 | 10 | void th125decode(char *file, unsigned char * buffer, unsigned int flength) { 11 | char frec[50]; 12 | char fraw[50]; 13 | unsigned char *rawdata = &buffer[0x24],*decodedata; 14 | unsigned int rlength; 15 | unsigned int length = *((unsigned int*) (&buffer[0x1c])); 16 | unsigned int dlength = *((unsigned int*) (&buffer[0x20])); 17 | sprintf(frec, "%s.txt", file); 18 | sprintf(fraw, "%s.raw", file); 19 | 20 | decodedata = new unsigned char[dlength]; 21 | decode(rawdata, length, 0x800, 0x5e, 0xe1); 22 | decode(rawdata, length, 0x40, 0x7d, 0x3a); 23 | rlength = decompress(rawdata, decodedata, length); 24 | FILE *fpraw = fopen(fraw, "wb"); 25 | fwrite(decodedata, dlength, 1, fpraw); 26 | fclose(fpraw); 27 | printf("Decompression done."); 28 | delete[] decodedata; 29 | } 30 | -------------------------------------------------------------------------------- /th128.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * th128.cpp 3 | * 4 | * Created on: 2010-9-10 5 | * Author: Argon 6 | */ 7 | 8 | #include "common.h" 9 | 10 | void th128decode(char *file, unsigned char * buffer, unsigned int flength) { 11 | char frec[50]; 12 | char fraw[50]; 13 | unsigned int score[3], final; 14 | float droprate, freezearea; 15 | unsigned int frame, rlength, llength, perfectfreeze, lf, i, j; 16 | unsigned char route, rank, clear, shootlevel; 17 | unsigned char framekey, stage; 18 | unsigned char *rawdata = &buffer[0x24], *stagedata, *replaydata, *fpsdata, *decodedata; 19 | unsigned int length = *((unsigned int*) (&buffer[0x1c])); 20 | unsigned int dlength = *((unsigned int*) (&buffer[0x20])); 21 | unsigned short keys[16] = 22 | { 0xf0a1, 0xfca1, 0xfda1, 0xfda1, 0xfba1, 0x49a8, 0x4ca8, 0x49a8, 0xfaa1, 0x4aa8, 0x4ba8, 0x4aa8, 0xfba1, 0x49a8, 0x4ca8, 0x49a8 }; 23 | unsigned short skey[61]; 24 | sprintf(frec, "%s.txt", file); 25 | sprintf(fraw, "%s.raw", file); 26 | 27 | decodedata = new unsigned char[dlength]; 28 | decode(rawdata, length, 0x800, 0x5e, 0xe7); 29 | decode(rawdata, length, 0x80, 0x7d, 0x36); 30 | rlength = decompress(rawdata, decodedata, length); 31 | FILE *fpraw = fopen(fraw, "wb"); 32 | fwrite(decodedata, dlength, 1, fpraw); 33 | fclose(fpraw); 34 | printf("Decompression done.\n"); 35 | 36 | droprate = *(float*) (&decodedata[0x54]); 37 | stage = decodedata[0x58]; 38 | route = decodedata[0x5c]; 39 | rank = decodedata[0x64]; 40 | stagedata = &decodedata[0x70]; 41 | final = *(unsigned int*) (&decodedata[0x14]); 42 | for (i = 1; i < stage; ++i) { 43 | stagedata = stagedata + 0x90 + *((unsigned int*) &stagedata[0x8]); 44 | score[i - 1] = *((unsigned int*) &stagedata[0xc]); 45 | } 46 | score[stage - 1] = final; 47 | stagedata = &decodedata[0x70]; 48 | 49 | FILE * fprec = fopen(frec, "wb"); 50 | fprintf(fprec, "file : %s\r\n", file); 51 | fprintf(fprec, "rawdata size = 0x%x\r\n", length); 52 | fprintf(fprec, "alloced size = 0x%x\r\n", dlength); 53 | fprintf(fprec, "decoded size = 0x%x\r\n", rlength); 54 | fprintf(fprec, "----------\r\n"); 55 | fprintf(fprec, "player : %s\r\n", decodedata); 56 | fprintf(fprec, "route : "); 57 | if (route == 0) 58 | fprintf(fprec, "A1"); 59 | else if (route == 1) 60 | fprintf(fprec, "A2"); 61 | else if (route == 2) 62 | fprintf(fprec, "B1"); 63 | else if (route == 3) 64 | fprintf(fprec, "B2"); 65 | else if (route == 4) 66 | fprintf(fprec, "C1"); 67 | else if (route == 5) 68 | fprintf(fprec, "C2"); 69 | else if (route == 6) 70 | fprintf(fprec, "Extra"); 71 | fprintf(fprec, "\r\n"); 72 | fprintf(fprec, "score : %d0\r\n", final); 73 | fprintf(fprec, "rank :"); 74 | if (rank == 0) 75 | fprintf(fprec, "Easy"); 76 | else if (rank == 1) 77 | fprintf(fprec, "Normal"); 78 | else if (rank == 2) 79 | fprintf(fprec, "Hard"); 80 | else if (rank == 3) 81 | fprintf(fprec, "Lunatic"); 82 | else if (rank == 4) 83 | fprintf(fprec, "Extra"); 84 | fprintf(fprec, "\r\n"); 85 | fprintf(fprec, "slow rate : %f%%\r\n", droprate); 86 | fprintf(fprec, "----------\r\n"); 87 | 88 | for (i = 0; i < stage; ++i) { 89 | replaydata = stagedata + 0x90; 90 | frame = *((unsigned int*) &stagedata[0x4]); 91 | llength = *((unsigned int*) &stagedata[0x8]); 92 | fpsdata = replaydata + frame * 6; 93 | shootlevel = stagedata[0x10] + 1; 94 | perfectfreeze = *((unsigned int*) &stagedata[0x84]) / 100; 95 | lf = *((unsigned int*) &stagedata[0x80]) / 100; 96 | freezearea = *((float*) &stagedata[0x88]); 97 | if (rank != 0x4) 98 | fprintf(fprec, "stage : %d \r\n", i + 1); 99 | else 100 | fprintf(fprec, "stage : extra \r\n"); 101 | fprintf(fprec, "score = %d0 | frame size = 0x%x | stage length = 0x%x | ", score[i], frame, llength); 102 | fprintf(fprec, "life: %d%% | level: = %d | perfect freeze : %d | freeze area : %f%%\r\n", lf, shootlevel, perfectfreeze, freezearea); 103 | fprintf(fprec, "= Time = ====================================================== "); 104 | fprintf(fprec, "Operations ======================================================\r\n"); 105 | skey[60] = 0; 106 | for (j = 0; j < frame; ++j) { 107 | if (!(j % 60)) 108 | fprintf(fprec, "[%06d] ", j / 60); 109 | framekey = (replaydata[j * 6] >> 4) & 0xf; 110 | skey[j % 60] = keys[framekey]; 111 | if (!((j + 1) % 60)) 112 | fprintf(fprec, "%s\r\n", (char *) skey); 113 | } 114 | if (j % 60) { 115 | skey[j % 60] = 0; 116 | fprintf(fprec, "%s\r\n", (char *) skey); 117 | } 118 | stagedata += llength + 0x90; 119 | } 120 | fclose(fprec); 121 | delete[] decodedata; 122 | } 123 | -------------------------------------------------------------------------------- /th13.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * th13.cpp 3 | * 4 | * Created on: 2011-4-16 5 | * Author: Argon 6 | */ 7 | 8 | #include "common.h" 9 | 10 | void th13decode(char *file, unsigned char * buffer, unsigned int flength) { 11 | char frec[50]; 12 | char fraw[50]; 13 | unsigned int score[3], final; 14 | float droprate, freezearea; 15 | unsigned int frame, rlength, llength, perfectfreeze, lf, i, j; 16 | unsigned char route, rank, clear, shootlevel; 17 | unsigned char framekey, stage; 18 | unsigned char *rawdata = &buffer[0x24], *stagedata, *replaydata, *fpsdata, *decodedata; 19 | unsigned int length = *((unsigned int*) (&buffer[0x1c])); 20 | unsigned int dlength = *((unsigned int*) (&buffer[0x20])); 21 | unsigned short keys[16] = 22 | { 0xf0a1, 0xfca1, 0xfda1, 0xfda1, 0xfba1, 0x49a8, 0x4ca8, 0x49a8, 0xfaa1, 0x4aa8, 0x4ba8, 0x4aa8, 0xfba1, 0x49a8, 0x4ca8, 0x49a8 }; 23 | unsigned short skey[61]; 24 | sprintf(frec, "%s.txt", file); 25 | sprintf(fraw, "%s.raw", file); 26 | 27 | decodedata = new unsigned char[dlength]; 28 | decode(rawdata, length, 0x400, 0x5c, 0xe1); 29 | decode(rawdata, length, 0x100, 0x7d, 0x3a); 30 | rlength = decompress(rawdata, decodedata, length); 31 | FILE *fpraw = fopen(fraw, "wb"); 32 | fwrite(decodedata, dlength, 1, fpraw); 33 | fclose(fpraw); 34 | printf("Decompression done.\n"); 35 | 36 | delete[] decodedata; 37 | } 38 | -------------------------------------------------------------------------------- /threp.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * threp.cpp 3 | * 4 | * Created on: 2010-1-3 5 | * Author: Argon.Sun 6 | * Version: 1.2.8 7 | */ 8 | 9 | #include "common.h" 10 | 11 | int main(int argc, char *argv[]) { 12 | unsigned int flength; 13 | unsigned char *buffer = new unsigned char[0x100000]; 14 | if (argc < 2) { 15 | printf("Usage : %s [filename]", argv[0]); 16 | return 0; 17 | } 18 | char * file = argv[1]; 19 | FILE * fp; 20 | fp = fopen(file, "rb"); 21 | if (!fp) { 22 | printf("%s not found.\n", file); 23 | return 0; 24 | } 25 | fread(buffer, 0x100000, 1, fp); 26 | flength = _filelength(fp->_file); 27 | fclose(fp); 28 | if (*(int *) buffer == 0x50523654) { //"T6RP" 29 | th06decode(file, buffer, flength); 30 | } else if (*(int *) buffer == 0x50523754) { //"T7RP" 31 | th07decode(file, buffer, flength); 32 | } else if (*(int *) buffer == 0x50523854) { //"T8RP" 33 | th08decode(file, buffer, flength); 34 | } else if (*(int *) buffer == 0x72303174) { //"t10r" 35 | th10decode(file, buffer, flength); 36 | } else if (*(int *) buffer == 0x72313174) { //"t11r" 37 | th11decode(file, buffer, flength); 38 | } else if (*(int *) buffer == 0x72323174) { //"t12r" 39 | th12decode(file, buffer, flength); 40 | } else if (*(int *) buffer == 0x35323174) { //"t125" 41 | th125decode(file, buffer, flength); 42 | } else if (*(int *) buffer == 0x72383231) { //"128r" 43 | th128decode(file, buffer, flength); 44 | } else if (*(int *) buffer == 0x72333174) { //"t13r" 45 | th13decode(file, buffer, flength); 46 | } else { 47 | printf("not supported format.\n"); 48 | return 0; 49 | } 50 | delete[] buffer; 51 | return 0; 52 | } 53 | --------------------------------------------------------------------------------