Guest User

Untitled

a guest
Oct 16th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.77 KB | None | 0 0
  1. # `trackblock` File Specification
  2.  
  3. ## `trackblock` File Layout
  4.  
  5. `trackblock` files contain a header, body with multiple segments and a footer.
  6.  
  7. * Header
  8. * Body
  9. * Segments
  10. * Footer
  11.  
  12. **Note:** The footer of each file contains 7104 bytes null bytes (`00`). This is considered normal. The reason for the file padding is unknown.
  13.  
  14. ## `trackblock` Header
  15.  
  16. ### Header Layout
  17.  
  18. | Offset | Length | Type | Description |
  19. |--:|:-:|---|---|
  20. | `0x00` | 1 | Unsigned Byte | File Index? |
  21. | `0x01` | 1 | Unsigned Byte | File Index Repeated? |
  22. | `0x02` | 1 | Unsigned Byte | Unknown. Values include `2f`, `08`. |
  23. | `0x03` | 1 | Unsigned Byte | Unknown. Always `00` |
  24. | `0x04` | 1 | Unsigned Byte | Unknown. Values include `01` and `00` |
  25. | `0x05` | 1 | Unsigned Byte | Unknown. Values include `2c` and `cd` |
  26. | `0x06` | 2 | Unsigned Short | Unknown. Always `00 00` |
  27. | `0x08` | 4 | Unsigned Int | Unknown. Values include `00 00 00 00` and `00 00 00 10` |
  28. | `0x0c` | 4 | Unsigned Int | Unknown. Always `00 00 00 00`. Padding? |
  29. | `0x10` | 4 | Unsigned Int | Unknown. Always `00 00 00 00`. Padding? |
  30. | `0x14` | 4 | Unsigned Int | Unknown. Always `00 00 00 00`. Padding? |
  31. | `0x18` | 4 | Unsigned Int | Unknown. Always `00 00 00 00`. Padding? |
  32. | `0x1c` | 4 | Unsigned Int | Unknown. Always `00 00 00 00`. Padding? |
  33. | `0x20` | 4 | Unsigned Int | Unknown. Always `00 00 00 00`. Padding? |
  34. | `0x24` | 4 | Unsigned Int | Unknown. Always `00 00 00 00`. Padding? |
  35. | `0x28` | 4 | Unsigned Int | Unknown. Always `00 00 00 00`. Padding? |
  36. | `0x2c` | 4 | Unsigned Int | Unknown. Always `00 00 00 00`. Padding? |
  37. | `0x30` | 4 | Unsigned Int | Unknown. Always `00 00 00 00`. Padding? |
  38. | `0x34` | 4 | Unsigned Int | Unknown. Always `00 00 00 00`. Padding? |
  39. | `0x38` | 4 | Unsigned Int | Unknown. Always `00 00 00 00`. Padding? |
  40. | `0x3c` | 4 | Unsigned Int | Unknown. Always `00 00 00 00`. Padding? |
  41.  
  42. ## `trackblock` Body
  43.  
  44. Each file covers an average of 7.42 hours (based on 26 files).
  45.  
  46. ### Segments
  47.  
  48. Each file body is divided into 48 segments. Segments cover an average of about 10 minutes and contain an array of location and meta data
  49.  
  50. #### Segment Header
  51.  
  52. | Offset | Length | Type | Description |
  53. |--:|:-:|---|---|
  54. | `0x00` | 4 | Unsigned Int | Timestamp1 |
  55. | `0x04` | 4 | Unsigned Int | Timestamp2 |
  56. | `0x08` | 8 | | Padding |
  57.  
  58. #### Parameters
  59.  
  60. ##### Timestamps
  61.  
  62. These values are not always equal. Possibly playtime vs playtime + idle time?
  63.  
  64. #### Segment Body
  65.  
  66. The segment body contains an array of 300 four-byte entries. There does not seem to be a set amount of time between each entry, but the time averages out to be around 2 seconds between each location logged.
  67.  
  68. | Offset | Length | Type | Description |
  69. |--:|:-:|---|---|
  70. | `0x00` | 4 | Unsigned Int | Entry |
  71.  
  72. Nintendo has compiled quite a bit of data into each entry. Each entry is a 32-bit unsigned integer describing coordinates and meta data (as flags).
  73.  
  74. The following big-endian value
  75.  
  76. ```
  77. Hex: 0x8E6ADF6E
  78. Int: 2389368686
  79. Bin: 0b10001110011010101101111101101110
  80. ```
  81.  
  82. would be decompiled in the following manner:
  83.  
  84. ```
  85. 7 6 5 4 3 2 1 X Coordinate 0 Y Coordinate
  86. 1 0 0 0 1 1 1 001101010110 1 111101101110
  87. ```
  88.  
  89. | Bit | Length | Type | Description |
  90. |--:|:-:|---|---|
  91. | `0` | 12 | Unsigned Int | Y-coordinate |
  92. | `12` | 1 | Boolean | `flag_0` Y-coordinate sign |
  93. | `13` | 12 | Unsigned Int | X-coordinate |
  94. | `26` | 1 | Boolean | `flag_1` Horizontal shift |
  95. | `27` | 1 | Boolean | `flag_2` Y-coordinate sign |
  96. | `28` | 1 | Boolean | `flag_3` Teleport? |
  97. | `29` | 1 | Boolean | `flag_4` Player auto-placement? |
  98. | `30` | 1 | Boolean | `flag_5` Death |
  99. | `31` | 1 | Boolean | `flag_6` Horse Riding |
  100. | `32` | 1 | Boolean | `flag_7` MainField or Dungeon / AocField |
  101.  
  102. #### Flags
  103.  
  104. | Flag | `0` | `1` | Description |
  105. |--:|:-:|:-:|---|
  106. | `0` | -y | +y | Mirrors point across the x-axis |
  107. | `1` | `false` | `true` | Horizontal shift (`+4096`) |
  108. | `2` | -x | +x | Mirrors point across the y-axis |
  109. | `3` | `true` | `false` | Player auto-placement? |
  110. | `4` | `true` | `false` | Teleport? |
  111. | `5` | `true` | `false` | Death |
  112. | `6` | `true` | `false` | Riding a horse? |
  113. | `7` | `true` | `false` | `true` = MainField , `false` = Dungeon or AocField |
  114.  
  115. #### Parsing Algorithm
  116.  
  117. The following algorithm works for big endian
  118.  
  119. ```c++
  120. for (int int = 0; int < 300; int++) {
  121. // Read unsigned int from file into unsigned int data
  122. unsigned int y = data & 0xfff
  123. unsigned int x = (data & 0x1ffe000) >> 13
  124.  
  125. unsigned int flag = (data & 0xfc000000) >> 26
  126. unsigned int flag_0 = (data & 0x1000) >> 12
  127. unsigned int flag_1 = (data & 0x2000000) >> 25
  128. unsigned int flag_2 = flag & 0b000001
  129. unsigned int flag_3 = (flag & 0b000010) >> 1
  130. unsigned int flag_4 = (flag & 0b000100) >> 2
  131. unsigned int flag_5 = (flag & 0b001000) >> 3
  132. unsigned int flag_6 = (flag & 0b010000) >> 4
  133. unsigned int flag_7 = (flag & 0b100000) >> 5
  134. }
  135. ```
Add Comment
Please, Sign In to add comment