annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
1 <?xml version="1.0" encoding="utf-8"?>
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
2 <?xml-stylesheet type="text/css" href="../style.css"?>
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
3 <!DOCTYPE html>
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
4 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
5 <head>
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
6 <title>T6RP format</title>
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
7 </head>
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
8 <body>
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
9 <h1>T6RP format</h1>
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
10 <p>The T6RP format is the replay format used by EoSD.</p>
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
11
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
12 <p>It is composed of a header and an "encrypted" data section, which is itself composed of a header, per-stage structures and lists of keystates.</p>
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
13
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
14
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
15 <h2>Header</h2>
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
16 <pre>
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
17 typedef struct {
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
18 char magic[4]; // T6RP
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
19 uint16_t unknown; //TODO: always 0x0102
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
20 // Seems to be a switch, if 0x0102 do something, else (whatever the value is), do something else
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
21 uint8_t player; // 0 = ReimuA, 1 = ReimuB, 2 = MarisaA, 3 = MarisaB
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
22 uint8_t rank; // 0 = Easy, 3 = Lunatic, 4 = Extra
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
23 uint32_t checksum; // (0x3f000318 + key + sum(c for c in decrypted_data)) % (2 ** 32)
11
9f0e37b7eeab Some fixes in the replay format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
24 uint16_t unknown2; //TODO: seems to be ignored by the game.
8
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
25 uint8_t key;
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
26 char crypted_data[]; // crypted(a, i) = (a + key + 7*i) % 256
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
27 // decrypted(c, i) = (c - key - 7*i) % 256
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
28 } thrpy6_header_t;
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
29 </pre>
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
30
11
9f0e37b7eeab Some fixes in the replay format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
31 <h2>Decrypting the data section</h2>
8
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
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>
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
33 <pre>
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
34 def decrypt(key, data):
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
35 return bytes((c - key - 7 * i) % 256 for i, c in enumerate(data))
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
36
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
37 def encrypt(key, data):
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
38 return bytes((c + key + 7 * i) % 256 for i, c in enumerate(data))
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
39 </pre>
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
40
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
41 <h2>Encrypted header</h2>
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
42 <pre>
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
43 typedef struct {
11
9f0e37b7eeab Some fixes in the replay format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
44 uint8_t unknown; //TODO: seems to be ignored by the game. Padding?
8
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
45 char date[9]; // null-terminated string
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
46 char name[9]; // null-terminated string
11
9f0e37b7eeab Some fixes in the replay format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
47 uint16_t unknown2; //TODO: seems to be ignored by the game. Padding?
9f0e37b7eeab Some fixes in the replay format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
48 uint32_t score; //TODO: Total score. seems to be ignored by the game.
9f0e37b7eeab Some fixes in the replay format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
49 uint32_t unknown3; //TODO: seems to be ignored by the game.
8
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
50 float slowdown_rate; // As a percentage, not a proper rate
11
9f0e37b7eeab Some fixes in the replay format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
51 uint32_t unknown4; //TODO: seems to be ignored by the game.
8
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
52 uint32_t stage1_offset; // Offset of a thrpy6_stage_t from the start of the file (including the unencrypted header)
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
53 uint32_t stage2_offset;
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
54 uint32_t stage3_offset;
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
55 uint32_t stage4_offset;
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
56 uint32_t stage5_offset;
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
57 uint32_t stage6_offset;
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
58 uint32_t stage7_offset;
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
59 } thrpy6_encrypted_header;
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
60 </pre>
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
61
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
62 <h2>Stage entry</h2>
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
63 <pre>
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
64 typedef struct {
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
65 uint32_t score;
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
66 uint16_t random_seed;
11
9f0e37b7eeab Some fixes in the replay format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
67 uint16_t unknown1; //TODO: seems to be ignored by the game.
8
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
68 uint8_t power;
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
69 int8_t lives;
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
70 int8_t bombs;
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
71 uint8_t difficulty; //TODO: WARNING: This has a huge effect on the game!
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
72 // It is also called rank (but we use the term "difficulty" because "rank" is the official name for Easy/Normal/Hard/Lunatic/Extra)
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
73 // See: http://en.touhouwiki.net/wiki/Embodiment_of_Scarlet_Devil/Gameplay#Rank
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
74 uint8_t unknown3[3]; //TODO: seems to be ignored by the game. Padding?
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
75 thrpy6_keystate_t keystates[];
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
76 } thrpy6_stage_t;
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
77 </pre>
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
78
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
79 <h2>Keystates</h2>
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
80 <pre>
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
81 struct {
11
9f0e37b7eeab Some fixes in the replay format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
82 uint32_t time; // Time of the event, most probably exprimed in frames.
9f0e37b7eeab Some fixes in the replay format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
83 uint16_t keys; // 1 = shoot, 2 = bomb, 4 = focus, 8 = ?, 16 = up, 32 = down, 64 = left, 128 = right, 256 = skip dialogs
9f0e37b7eeab Some fixes in the replay format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8
diff changeset
84 uint16_t unknown; //TODO: seems to be ignored by the game.
8
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
85 } thrpy6_keystate_t;
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
86 </pre>
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
87 </body>
c5b074b0abbd Add T6RP documentation
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
88 </html>