Line 87: |
Line 87: |
| | | |
| ==== Header ==== | | ==== Header ==== |
− |
| |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
Line 104: |
Line 103: |
| | 0x8 | | | 0x8 |
| | 0x4 | | | 0x4 |
− | | Version? (always 0x2400) | + | | String table type magic (always 0x2400) |
| |- | | |- |
| | 0xC | | | 0xC |
| | 0x4 | | | 0x4 |
− | | Offset to root node (always 0x10) | + | | This + 8 points to the string table (always 0x10) |
| |- | | |- |
| | 0x10 | | | 0x10 |
| | 0x4 | | | 0x4 |
− | | Root node type (always 0x2401) | + | | String table lookup type magic (always 0x2401) |
| |- | | |- |
| | 0x14 | | | 0x14 |
| | 0x4 | | | 0x4 |
− | | This + 8 points to some kind of descriptor table | + | | This + 8 points to the string lookup table |
| |- | | |- |
| | 0x18 | | | 0x18 |
| | 0x4 | | | 0x4 |
− | | Count of audio names (since each file should have a name you could also say this is essentially a file count) | + | | Filename count |
| + | |- |
| + | | 0x1C |
| + | | 0xC * count |
| + | | String offset table |
| |- | | |- |
| |} | | |} |
| | | |
− | ==== Node struct ==== | + | ==== String offset table entry ==== |
| | | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
Line 134: |
Line 137: |
| | 0x0 | | | 0x0 |
| | 0x4 | | | 0x4 |
− | | Type of the node? | + | | Type of the node (should be 0x1F01) |
| |- | | |- |
| | 0x4 | | | 0x4 |
| | 0x4 | | | 0x4 |
− | | Offset to node data? | + | | Offset to data from the end of the STRG header (sizeof 0x18) |
| |- | | |- |
| | 0x8 | | | 0x8 |
| | 0x4 | | | 0x4 |
− | | Length of some data based on node type | + | | Length of the data buffer (includes NUL terminator) |
| |- | | |- |
| |} | | |} |
| | | |
− | ==== Nodes ====
| + | Then every filename is rawly setted. You can set up a dictionary that contains, using a simple counter, the size of every filename in order. Then, using the same type of counter, get the values of the size of the filename in a correct order. |
| | | |
− | ===== Root node (0x2401) ===== | + | ==== String lookup table ==== |
− | * Offset + 8 points to some unknown data.
| |
− | * Length specifies how many nodes after this node belong to this node.
| |
| | | |
− | ===== File node(?) (0x1F01) ===== | + | ===== Header ===== |
− | * Offset + 0x18 points to the file's name
| + | |
− | * Length specifies the file name buffer size, including the NUL terminator. | + | {| class="wikitable" border="1" |
| + | |- |
| + | ! OFFSET |
| + | ! SIZE |
| + | ! DESCRIPTION |
| + | |- |
| + | | 0x0 |
| + | | 0x4 |
| + | | Index of the root entry |
| + | |- |
| + | | 0x4 |
| + | | 0x4 |
| + | | Entry count |
| + | |- |
| + | | 0x8 |
| + | | 0x14 * count |
| + | | Lookup entry |
| + | |- |
| + | |} |
| | | |
| + | ===== Entry ===== |
| | | |
− | Then every filename is rawly setted. You can set up a dictionary that contains, using a simple counter, the size of every filename in order. Then, using the same type of counter, get the values of the size of the filename in a correct order.
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! OFFSET |
| + | ! SIZE |
| + | ! DESCRIPTION |
| + | |- |
| + | | 0x0 |
| + | | 0x2 |
| + | | Is 1 if contains data |
| + | |- |
| + | | 0x2 |
| + | | 0x2 |
| + | | Unknown |
| + | |- |
| + | | 0x4 |
| + | | 0x4 |
| + | | Next index? (-1 if invalid) |
| + | |- |
| + | | 0x8 |
| + | | 0x4 |
| + | | Data index? (-1 if invalid) |
| + | |- |
| + | | 0xC |
| + | | 0x8 |
| + | | Unknown data, -1 if contains no data |
| + | |- |
| + | |} |
| | | |
| === INFO === | | === INFO === |
Line 178: |
Line 224: |
| | 0x4 | | | 0x4 |
| | Length of INFO partition (also in CSAR header) | | | Length of INFO partition (also in CSAR header) |
| + | |- |
| + | | 0x8 |
| + | | 0x4 |
| + | | Unknown magic 0x2100 |
| + | |- |
| + | | 0xC |
| + | | 0x4 |
| + | | This + 8 points to unknown |
| + | |- |
| + | | 0x10 |
| + | | 0x4 |
| + | | Unknown magic 0x2104 |
| + | |- |
| + | | 0x14 |
| + | | 0x4 |
| + | | This + 8 points to unknown |
| + | |- |
| + | | 0x18 |
| + | | 0x4 |
| + | | Unknown magic 0x2101 |
| + | |- |
| + | | 0x1C |
| + | | 0x4 |
| + | | This + 8 points to unknown |
| + | |- |
| + | | 0x20 |
| + | | 0x4 |
| + | | Unknown magic 0x2103 |
| + | |- |
| + | | 0x24 |
| + | | 0x4 |
| + | | This + 8 points to unknown |
| + | |- |
| + | | 0x28 |
| + | | 0x4 |
| + | | Unknown magic 0x2105 |
| + | |- |
| + | | 0x2C |
| + | | 0x4 |
| + | | This + 8 points to unknown |
| + | |- |
| + | | 0x30 |
| + | | 0x4 |
| + | | Unknown magic 0x2102 |
| + | |- |
| + | | 0x34 |
| + | | 0x4 |
| + | | This + 8 points to unknown |
| + | |- |
| + | | 0x38 |
| + | | 0x4 |
| + | | Unknown magic 0x2106 |
| + | |- |
| + | | 0x3C |
| + | | 0x4 |
| + | | This + 8 points to unknown |
| + | |- |
| + | | 0x40 |
| + | | 0x4 |
| + | | Unknown magic 0x220B |
| + | |- |
| + | | 0x44 |
| + | | 0x4 |
| + | | This + 8 points to unknown |
| |- | | |- |
| |} | | |} |