comparison 06/t6rp.xhtml @ 11:9f0e37b7eeab

Some fixes in the replay format.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Wed, 24 Aug 2011 15:40:37 +0200
parents c5b074b0abbd
children 2925b0e246c6
comparison
equal deleted inserted replaced
10:d0e992b282a0 11:9f0e37b7eeab
19 uint16_t unknown; //TODO: always 0x0102 19 uint16_t unknown; //TODO: always 0x0102
20 // Seems to be a switch, if 0x0102 do something, else (whatever the value is), do something else 20 // Seems to be a switch, if 0x0102 do something, else (whatever the value is), do something else
21 uint8_t player; // 0 = ReimuA, 1 = ReimuB, 2 = MarisaA, 3 = MarisaB 21 uint8_t player; // 0 = ReimuA, 1 = ReimuB, 2 = MarisaA, 3 = MarisaB
22 uint8_t rank; // 0 = Easy, 3 = Lunatic, 4 = Extra 22 uint8_t rank; // 0 = Easy, 3 = Lunatic, 4 = Extra
23 uint32_t checksum; // (0x3f000318 + key + sum(c for c in decrypted_data)) % (2 ** 32) 23 uint32_t checksum; // (0x3f000318 + key + sum(c for c in decrypted_data)) % (2 ** 32)
24 uint16_t unknown2; //TODO: seems to be ignored by the game 24 uint16_t unknown2; //TODO: seems to be ignored by the game.
25 uint8_t key; 25 uint8_t key;
26 char crypted_data[]; // crypted(a, i) = (a + key + 7*i) % 256 26 char crypted_data[]; // crypted(a, i) = (a + key + 7*i) % 256
27 // decrypted(c, i) = (c - key - 7*i) % 256 27 // decrypted(c, i) = (c - key - 7*i) % 256
28 } thrpy6_header_t; 28 } thrpy6_header_t;
29 </pre> 29 </pre>
30 30
31 <h2>Decrypting the data section.</h2> 31 <h2>Decrypting the data section</h2>
32 <p>As stated earlier, the data section is encrypted. Luckily, this encryption is quite simplistic, and encrypting/decrypting it is easy (see this snippet of python3 code):</p> 32 <p>As stated earlier, the data section is encrypted. Luckily, this encryption is quite simplistic, and encrypting/decrypting it is easy (see this snippet of python3 code):</p>
33 <pre> 33 <pre>
34 def decrypt(key, data): 34 def decrypt(key, data):
35 return bytes((c - key - 7 * i) % 256 for i, c in enumerate(data)) 35 return bytes((c - key - 7 * i) % 256 for i, c in enumerate(data))
36 36
39 </pre> 39 </pre>
40 40
41 <h2>Encrypted header</h2> 41 <h2>Encrypted header</h2>
42 <pre> 42 <pre>
43 typedef struct { 43 typedef struct {
44 uint8_t unknown; //TODO: seems to be ignored by the game 44 uint8_t unknown; //TODO: seems to be ignored by the game. Padding?
45 char date[9]; // null-terminated string 45 char date[9]; // null-terminated string
46 char name[9]; // null-terminated string 46 char name[9]; // null-terminated string
47 uint16_t unknown2; //TODO: seems to be ignored by the game 47 uint16_t unknown2; //TODO: seems to be ignored by the game. Padding?
48 uint32_t score; //TODO: Total score. seems to be ignored by the game 48 uint32_t score; //TODO: Total score. seems to be ignored by the game.
49 uint32_t unknown3; //TODO: seems to be ignored by the game 49 uint32_t unknown3; //TODO: seems to be ignored by the game.
50 float slowdown_rate; // As a percentage, not a proper rate 50 float slowdown_rate; // As a percentage, not a proper rate
51 uint8_t unknwon[4]; //TODO: seems to have no effect 51 uint32_t unknown4; //TODO: seems to be ignored by the game.
52 uint32_t stage1_offset; // Offset of a thrpy6_stage_t from the start of the file (including the unencrypted header) 52 uint32_t stage1_offset; // Offset of a thrpy6_stage_t from the start of the file (including the unencrypted header)
53 uint32_t stage2_offset; 53 uint32_t stage2_offset;
54 uint32_t stage3_offset; 54 uint32_t stage3_offset;
55 uint32_t stage4_offset; 55 uint32_t stage4_offset;
56 uint32_t stage5_offset; 56 uint32_t stage5_offset;
62 <h2>Stage entry</h2> 62 <h2>Stage entry</h2>
63 <pre> 63 <pre>
64 typedef struct { 64 typedef struct {
65 uint32_t score; 65 uint32_t score;
66 uint16_t random_seed; 66 uint16_t random_seed;
67 uint16_t unknown1; //TODO: seems to be ignored by the game 67 uint16_t unknown1; //TODO: seems to be ignored by the game.
68 uint8_t power; 68 uint8_t power;
69 int8_t lives; 69 int8_t lives;
70 int8_t bombs; 70 int8_t bombs;
71 uint8_t difficulty; //TODO: WARNING: This has a huge effect on the game! 71 uint8_t difficulty; //TODO: WARNING: This has a huge effect on the game!
72 // It is also called rank (but we use the term "difficulty" because "rank" is the official name for Easy/Normal/Hard/Lunatic/Extra) 72 // It is also called rank (but we use the term "difficulty" because "rank" is the official name for Easy/Normal/Hard/Lunatic/Extra)
77 </pre> 77 </pre>
78 78
79 <h2>Keystates</h2> 79 <h2>Keystates</h2>
80 <pre> 80 <pre>
81 struct { 81 struct {
82 uint32_t time; // Time of the event, most probably exprimed in frames 82 uint32_t time; // Time of the event, most probably exprimed in frames.
83 uint16_t keys; // 1 = shoot, 2 = bomb, 4 = focus, 8 = ?, 16 = up, 32 = down, 64 = left, 128 = right 83 uint16_t keys; // 1 = shoot, 2 = bomb, 4 = focus, 8 = ?, 16 = up, 32 = down, 64 = left, 128 = right, 256 = skip dialogs
84 uint16_t unknown; //TODO: seems to be ignored by the game 84 uint16_t unknown; //TODO: seems to be ignored by the game.
85 } thrpy6_keystate_t; 85 } thrpy6_keystate_t;
86 </pre> 86 </pre>
87 </body> 87 </body>
88 </html> 88 </html>