LibT2FS 0.1
C API for accessing TEngine data in memory.
Loading...
Searching...
No Matches
levels.h
Go to the documentation of this file.
1/* This file is part of LibT2FS.
2 *
3 * LibT2FS is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 3 of the License, or
6 * (at your option) any later version.
7 *
8 * LibT2FS is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <https://www.gnu.org/licenses/>.
15 */
16
17#ifndef H_T2FS_LEVELS
18#define H_T2FS_LEVELS
19
20#include <stdint.h>
21
22#include "t2fs.h"
23#include "models/common.h"
24
25// ********************************************************************
26// Structs as in file (possible after decompression and/or deinterleaving)
27// ********************************************************************
28
31typedef struct __attribute__((__packed__)) s_T2FSDataLevelInfo {
33 uint16_t unk_u16_00; // 0xFFFF
34 uint16_t unk_u16_01; // 0xFFFF
35 uint16_t unk_u16_02; // 0xFFFF
36 uint16_t unk_u16_03; // 0xFFFF
37 uint16_t unk_u16_04; // 0xFF??
38 uint16_t unk_u16_05;
39 uint16_t unk_u16_06;
40 uint16_t unk_u16_07;
41 uint16_t unk_u16_08;
42 uint16_t unk_u16_09;
44
46T2FS_CREATE_SWAP_STRUCT(T2FSDataLevelInfo, (4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2));
47
48
55typedef struct __attribute__((__packed__)) s_T2FSDataLevel_unk_1_0 {
56 uint8_t unk[100];
58
60
61
62
66typedef struct __attribute__((__packed__)) s_T2FSDataLevelMeshBuffer {
68 uint32_t unk;
70
73
74
79typedef struct __attribute__((__packed__)) s_T2FSDataLevelMeshIndices {
80 uint16_t someIndex;
81 uint16_t flags;
82
83 uint16_t indexA;
84 uint16_t indexB;
85 uint16_t indexC;
86
87 uint16_t indexToSelfA;
88 uint16_t indexToSelfB;
89 uint16_t indexToSelfC;
90
91 uint16_t unk_u16_07;
92 uint16_t unk_u16_08;
94
96T2FS_CREATE_SWAP_STRUCT(T2FSDataLevelMeshIndices, (2, 2, 2, 2, 2, 2, 2, 2, 2, 2));
97
98
106typedef struct __attribute__((__packed__)) s_T2FSDataRegionBounds {
107 float min_x, min_y;
108 float max_x, max_y;
109 float unk;
111
114
115
118typedef struct __attribute__((__packed__)) s_T2FSDataLevel_unk_2_x_0 {
119 uint8_t unk[8];
121
123
124
125
129typedef struct __attribute__((__packed__)) s_T2FSDataLevel_unk_2_x_1 {
130 uint8_t unk[28];
132
134
135
136
146typedef struct __attribute__((__packed__)) s_T2FSDataScriptedObject {
147 uint16_t unk_u16_00;
148 uint16_t unk_u16_01;
149 // TODO on T2FS_FILE_PC_SEEDS_OF_EVIL_MP it's different?
152 uint16_t modelId;
153 int16_t unk_u16_02;
154 int16_t unk_u16_03;
155 int16_t unk_u16_04;
156 int16_t rotz;
157 int16_t unk_u16_06;
159
161T2FS_CREATE_SWAP_STRUCT(T2FSDataScriptedObject, (2, 2, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2));
162
163
164
169typedef struct __attribute__((__packed__)) s_T2FSDataLevel_unk_4_0 {
170 uint32_t unk;
172
174
175
176
180typedef struct __attribute__((__packed__)) s_T2FSDataLevel_unk_4_1 {
181 uint32_t unk;
183
185
186
187
191typedef struct __attribute__((__packed__)) s_T2FSDataLevel_unk_4_2 {
192 uint32_t unk;
194
196
197
198
202typedef struct __attribute__((__packed__)) s_T2FSDataLevel_unk_4_3 {
203 uint32_t unk;
205
207
208
209
215typedef struct __attribute__((__packed__)) s_T2FSDataTileBounds {
216 float min_x, min_y;
217 float max_x, max_y;
218 uint16_t unk;
219 uint16_t unk2;
221
224
225
226
240typedef struct __attribute__((__packed__)) s_T2FSDataTiledObject {
241 uint32_t unk_u32_00; // 0xFFFFFFFF
242 float scale;
243 uint16_t modelId;
244
245 int16_t unk_16_00;
246
250 uint16_t rotFlags;
251
252 uint16_t unk_u16_05;
253
260 int16_t z;
261
262 // These are probably the bbox, need to check that.. FIXME
263 int8_t unk_8_06;
264 int8_t unk_8_07;
265 int8_t unk_8_08;
266 int8_t unk_8_09;
267 int8_t unk_8_10;
268 int8_t unk_8_11;
269
270 uint8_t posFlags;
271
272 uint8_t x;
273 uint8_t y;
274 uint8_t unk_u8_15;
275} T2FSDataTiledObject; // size of 28
276
278T2FS_CREATE_SWAP_STRUCT(T2FSDataTiledObject, (4, 4, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1));
279
280
289typedef struct __attribute__((__packed__)) s_T2FSDataStaticObject {
290 int16_t unk_u16_00; // 00 2 0xFFFF
291 int16_t unk_u16_02; // 02 2 0xFFFF
292
296
300
301 float unk_u32_1C; // 28 4
302 float unk_u32_20; // 32 4
303 float unk_u32_24; // 36 4
304
305 int16_t modelId; // 40 2
306 //int16_t unk_u16_2A; // 42 2
307 uint8_t unk_u8_01xx;
308 uint8_t unk_u8_02xx;
309
310 int16_t unk_u16_2C; // 44 2
311
313 int8_t unk_u8_00;
314
315 int8_t unk_u8_01;
316 int8_t unk_u8_02;
317 int8_t unk_u8_03;
318 int8_t unk_u8_04;
319} T2FSDataStaticObject; // size of 52 (on Turok2Demo.lss it's 56..)
320
322T2FS_CREATE_SWAP_STRUCT(T2FSDataStaticObject, (2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1));
323
324
325
334typedef struct __attribute__((__packed__)) s_T2FSDataStaticObjectShadow {
335 int16_t unk_u16_00; // 00 2 0xFFFF
336 int16_t unk_u16_02; // 02 2 0xFFFF
337
340
344
345 int16_t modelId;
346
347 uint8_t unk_u8_01xx;
348 uint8_t unk_u8_02xx;
349
350 int16_t unk_u16_2C;
351
353 int8_t unk_u8_00;
354
355 int8_t unk_u8_01;
356 int8_t unk_u8_02;
357 int8_t unk_u8_03;
358 int8_t unk_u8_04;
359
360 int8_t unk_u8_05;
361 int8_t unk_u8_06;
362 int8_t unk_u8_07;
363 int8_t unk_u8_08;
364
366
368T2FS_CREATE_SWAP_STRUCT(T2FSDataStaticObjectShadow, (2, 2, 1, 1, 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1));
369
370
377typedef struct __attribute__((__packed__)) s_T2FSDataLevelItem {
378 uint32_t unk_u32_00; // 0xFFFFFFFF
380
382 uint16_t modelId;
383 int16_t unk_s16_05;
384 int16_t unk_s16_06;
385 int16_t unk_s16_07;
386 int16_t unk_s16_08;
387 int16_t unk_s16_09;
388} T2FSDataLevelItem; // size of 32
389
391T2FS_CREATE_SWAP_STRUCT(T2FSDataLevelItem, (4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2));
392
393
400typedef struct __attribute__((__packed__)) s_T2FSDataLevel_unk_5_x_3 {
401 uint8_t unk[72];
403
405
406
407
411typedef struct __attribute__((__packed__)) s_T2FSDataLevel_unk_6 {
412 uint8_t unk[44];
414
416
417
418
422typedef struct __attribute__((__packed__)) s_T2FSDataLevel_unk_7_0 {
423 uint8_t unk[4];
425
427
428
429
433typedef struct __attribute__((__packed__)) s_T2FSDataLevel_unk_7_1 {
434 uint8_t unk[20];
436
438
439
440
444typedef struct __attribute__((__packed__)) s_T2FSDataLevel_unk_7_2 {
445 uint8_t unk[4];
447
449
450
451
455typedef struct __attribute__((__packed__)) s_T2FSDataLevel_unk_7_3 {
456 uint8_t unk[20];
458
460
461
462// ********************************************************************
463// Our structs
464// ********************************************************************
465
466typedef struct s_T2FSLevel {
468 uint8_t isValid;
469
471
472 // set some nodes for later use
477
478 uint8_t const *name;
480
481
482void
484
485uint32_t
487
488int
490
491int
493
494int
496
497int
499
500int
502
503int
505
506uint32_t
508
509int
510t2fs_level_get_tiled_objects(T2FSContext *ctx, T2FSLevel *level, T2FSArray *dest, uint32_t tileId);
511
512int
513t2fs_level_get_objects(T2FSContext *ctx, T2FSLevel *level, T2FSArray *dest, uint32_t tileId);
514
515int
516t2fs_level_get_items(T2FSContext *ctx, T2FSLevel *level, T2FSArray *dest, uint32_t tileId);
517
518int
519t2fs_level_get_unk5_x_3_array(T2FSContext *ctx, T2FSLevel *level, T2FSArray *dest, uint32_t tileId);
520
521// levelNode data should be loaded
522int
524
525
536int
537t2fs_level_load(T2FSContext *ctx, T2FSLevel *level, uint32_t id);
538
539
543void
545
546#endif
struct s_T2FSArray T2FSArray
struct s_T2FSDataStaticObject T2FSDataStaticObject
struct s_T2FSDataLevelMeshBuffer T2FSDataLevelMeshBuffer
struct s_T2FSDataLevel_unk_1_0 T2FSDataLevel_unk_1_0
struct s_T2FSDataLevel_unk_4_3 T2FSDataLevel_unk_4_3
struct s_T2FSDataLevel_unk_2_x_0 T2FSDataLevel_unk_2_x_0
struct s_T2FSDataStaticObjectShadow T2FSDataStaticObjectShadow
struct s_T2FSDataLevel_unk_4_2 T2FSDataLevel_unk_4_2
struct s_T2FSDataTiledObject T2FSDataTiledObject
struct s_T2FSDataLevelItem T2FSDataLevelItem
struct s_T2FSDataLevel_unk_7_0 T2FSDataLevel_unk_7_0
struct s_T2FSDataLevel_unk_4_1 T2FSDataLevel_unk_4_1
struct s_T2FSDataLevel_unk_4_0 T2FSDataLevel_unk_4_0
struct s_T2FSDataLevel_unk_7_1 T2FSDataLevel_unk_7_1
struct s_T2FSDataLevel_unk_5_x_3 T2FSDataLevel_unk_5_x_3
struct s_T2FSDataLevel_unk_7_3 T2FSDataLevel_unk_7_3
struct s_T2FSDataScriptedObject T2FSDataScriptedObject
struct s_T2FSDataWorldCoordF32 T2FSDataWorldCoordF32
struct s_T2FSDataRegionBounds T2FSDataRegionBounds
struct s_T2FSDataLevelMeshIndices T2FSDataLevelMeshIndices
struct s_T2FSDataTileBounds T2FSDataTileBounds
struct s_T2FSDataLevel_unk_7_2 T2FSDataLevel_unk_7_2
struct s_T2FSDataLevel_unk_6 T2FSDataLevel_unk_6
struct s_T2FSDataCoordF32 T2FSDataCoordF32
struct s_T2FSDataCoordS32 T2FSDataCoordS32
yeah.. not kiddin
struct s_T2FSDataLevelInfo T2FSDataLevelInfo
struct s_T2FSDataLevel_unk_2_x_1 T2FSDataLevel_unk_2_x_1
struct s_T2FSLevel T2FSLevel
void t2fs_level_clear(T2FSLevel *level)
int t2fs_level_get_scripted_objects(T2FSContext *ctx, T2FSLevel *level, T2FSArray *dest)
int t2fs_level_set_node(T2FSContext *ctx, T2FSNode *levelNode, T2FSLevel *level)
int t2fs_level_get_region_bounds(T2FSContext *ctx, T2FSLevel *level, T2FSArray *dest)
int t2fs_level_get_mesh_indices(T2FSContext *ctx, T2FSLevel *level, T2FSArray *dest)
int t2fs_level_get_unk_1_0(T2FSContext *ctx, T2FSLevel *level, T2FSArray *dest)
int t2fs_level_get_tile_bounds(T2FSContext *ctx, T2FSLevel *level, T2FSArray *dest)
int t2fs_level_get_items(T2FSContext *ctx, T2FSLevel *level, T2FSArray *dest, uint32_t tileId)
uint32_t t2fs_level_get_tile_count(T2FSLevel *level)
int t2fs_level_get_mesh_buffer(T2FSContext *ctx, T2FSLevel *level, T2FSArray *dest)
int t2fs_level_get_objects(T2FSContext *ctx, T2FSLevel *level, T2FSArray *dest, uint32_t tileId)
void t2fs_level_unload(T2FSLevel *level)
Free level data.
int t2fs_level_load(T2FSContext *ctx, T2FSLevel *level, uint32_t id)
Loads level data into memory.
int t2fs_level_get_tiled_objects(T2FSContext *ctx, T2FSLevel *level, T2FSArray *dest, uint32_t tileId)
int t2fs_level_get_unk5_x_3_array(T2FSContext *ctx, T2FSLevel *level, T2FSArray *dest, uint32_t tileId)
uint32_t t2fs_level_count(T2FSContext *ctx)
#define SASSERT_SIZE(what, size)
Definition models/common.h:26
#define T2FS_CREATE_SWAP_STRUCT(name, sizes)
Definition models/common.h:36
Definition levels.h:31
float gridMultiplier
Definition levels.h:32
uint16_t unk_u16_09
Definition levels.h:42
uint16_t unk_u16_04
Definition levels.h:37
uint16_t unk_u16_00
Definition levels.h:33
uint16_t unk_u16_02
Definition levels.h:35
uint16_t unk_u16_08
Definition levels.h:41
uint16_t unk_u16_03
Definition levels.h:36
uint16_t unk_u16_06
Definition levels.h:39
uint16_t unk_u16_07
Definition levels.h:40
uint16_t unk_u16_01
Definition levels.h:34
uint16_t unk_u16_05
Definition levels.h:38
Definition levels.h:377
int16_t unk_s16_08
Definition levels.h:386
float unk_u32_04
Definition levels.h:381
uint16_t modelId
Definition levels.h:382
int16_t unk_s16_09
Definition levels.h:387
int16_t unk_s16_07
Definition levels.h:385
uint32_t unk_u32_00
Definition levels.h:378
int16_t unk_s16_06
Definition levels.h:384
T2FSDataWorldCoordF32 position
Definition levels.h:379
int16_t unk_s16_05
Definition levels.h:383
Definition levels.h:66
uint32_t unk
Definition levels.h:68
T2FSDataCoordS32 position
needs to be scaled to something.. * 0.03f looks reasonable but it's off.. is it a fixed point thingy?
Definition levels.h:67
Definition levels.h:79
uint16_t indexC
index to entry of T2FSDataLevelMeshBuffer
Definition levels.h:85
uint16_t flags
guess, but strongly looks like flags, purpose unknown.
Definition levels.h:81
uint16_t indexToSelfC
max value seems to match last index of this array.
Definition levels.h:89
uint16_t someIndex
looks like index for T2FSDataLevel_unk_1_0
Definition levels.h:80
uint16_t indexB
index to entry of T2FSDataLevelMeshBuffer
Definition levels.h:84
uint16_t indexToSelfA
max value seems to match last index of this array.
Definition levels.h:87
uint16_t unk_u16_08
0xFFFF
Definition levels.h:92
uint16_t indexToSelfB
max value seems to match last index of this array.
Definition levels.h:88
uint16_t indexA
index to entry of T2FSDataLevelMeshBuffer
Definition levels.h:83
uint16_t unk_u16_07
0xFFFF
Definition levels.h:91
Definition levels.h:55
uint8_t unk[100]
Definition levels.h:56
Definition levels.h:118
uint8_t unk[8]
Definition levels.h:119
Definition levels.h:129
uint8_t unk[28]
Definition levels.h:130
Definition levels.h:169
uint32_t unk
Definition levels.h:170
Definition levels.h:180
uint32_t unk
Definition levels.h:181
Definition levels.h:191
uint32_t unk
Definition levels.h:192
Definition levels.h:202
uint32_t unk
Definition levels.h:203
Definition levels.h:400
uint8_t unk[72]
Definition levels.h:401
Definition levels.h:411
uint8_t unk[44]
Definition levels.h:412
Definition levels.h:422
uint8_t unk[4]
Definition levels.h:423
Definition levels.h:433
uint8_t unk[20]
Definition levels.h:434
Definition levels.h:444
uint8_t unk[4]
Definition levels.h:445
Definition levels.h:455
uint8_t unk[20]
Definition levels.h:456
Definition levels.h:106
float unk
Definition levels.h:109
float max_x
Definition levels.h:108
float min_y
Definition levels.h:107
float max_y
Definition levels.h:108
float min_x
Definition levels.h:107
Definition levels.h:146
int16_t rotz
Needs to be scaled, see T2FS_OBJ_ROT_SCALE_FACTOR.
Definition levels.h:156
T2FSDataWorldCoordF32 position
Definition levels.h:150
T2FSDataWorldCoordF32 scale
Definition levels.h:151
uint16_t unk_u16_00
0xFFFF
Definition levels.h:147
int16_t unk_u16_06
Definition levels.h:157
int16_t unk_u16_02
Definition levels.h:153
uint16_t modelId
Definition levels.h:152
int16_t unk_u16_03
Definition levels.h:154
uint16_t unk_u16_01
0xFFFF
Definition levels.h:148
int16_t unk_u16_04
Definition levels.h:155
Definition levels.h:334
float unk_u32_20
Definition levels.h:342
int8_t unk_u8_06
Definition levels.h:361
int16_t unk_u16_02
Definition levels.h:336
int16_t unk_u16_2C
Definition levels.h:350
T2FSDataWorldCoordF32 position
Definition levels.h:338
float unk_u32_1C
Definition levels.h:341
int16_t modelId
Definition levels.h:345
int8_t unk_u8_02
Definition levels.h:356
int8_t unk_u8_07
Definition levels.h:362
int8_t unk_u8_01
Definition levels.h:355
int8_t unk_u8_05
Definition levels.h:360
T2FSDataCoordF32 scale
Definition levels.h:339
int8_t unk_u8_03
Definition levels.h:357
int8_t unk_u8_00
Definition levels.h:353
int8_t rotzMultiplier
This needs testing.
Definition levels.h:352
uint8_t unk_u8_02xx
Definition levels.h:348
uint8_t unk_u8_01xx
Definition levels.h:347
int8_t unk_u8_08
Definition levels.h:363
int8_t unk_u8_04
Definition levels.h:358
float unk_u32_24
Definition levels.h:343
int16_t unk_u16_00
Definition levels.h:335
Definition levels.h:289
uint8_t unk_u8_01xx
Definition levels.h:307
int16_t unk_u16_00
Definition levels.h:290
int8_t unk_u8_02
Definition levels.h:316
int16_t unk_u16_2C
Definition levels.h:310
uint8_t unk_u8_02xx
Definition levels.h:308
int8_t unk_u8_00
Definition levels.h:313
T2FSDataWorldCoordF32 position
Definition levels.h:295
float unk_u32_24
Definition levels.h:303
int16_t unk_u16_02
Definition levels.h:291
float unk_u32_20
Definition levels.h:302
T2FSDataCoordF32 scale
Definition levels.h:299
int8_t unk_u8_04
Definition levels.h:318
int8_t rotzMultiplier
multiplied by 90
Definition levels.h:312
int8_t unk_u8_03
Definition levels.h:317
int8_t unk_u8_01
Definition levels.h:315
int16_t modelId
Definition levels.h:305
float unk_u32_1C
Definition levels.h:301
Definition levels.h:215
float max_y
Definition levels.h:217
float max_x
Definition levels.h:217
uint16_t unk2
Definition levels.h:219
float min_y
Definition levels.h:216
float min_x
Definition levels.h:216
uint16_t unk
Definition levels.h:218
Definition levels.h:240
float scale
Definition levels.h:242
uint8_t x
Multiply by the level it's grid multiplier to get the real float x.
Definition levels.h:272
uint16_t unk_u16_05
Definition levels.h:252
int8_t unk_8_08
Is this bbox minz?
Definition levels.h:265
uint8_t posFlags
Contains flags whether the x or y position is negative.
Definition levels.h:270
int8_t unk_8_11
Is this bbox maxy?
Definition levels.h:268
uint8_t unk_u8_15
Always set to 0b10000001 ? (signed -127, unsigned 129).
Definition levels.h:274
uint16_t rotFlags
Definition levels.h:250
uint16_t modelId
Definition levels.h:243
int8_t unk_8_06
Is this bbox minx?
Definition levels.h:263
uint32_t unk_u32_00
Definition levels.h:241
int8_t unk_8_07
Is this bbox maxx?
Definition levels.h:264
int8_t unk_8_09
Is this bbox maxz?
Definition levels.h:266
int16_t z
Multiply with approx 5.12f for real float z position.
Definition levels.h:260
int16_t unk_16_00
Definition levels.h:245
int8_t unk_8_10
Is this bbox miny?
Definition levels.h:267
uint8_t y
Multiply by the level it's grid multiplier to get the real float y.
Definition levels.h:273
Definition levels.h:466
T2FSNode * nodeUnk1
Definition levels.h:473
T2FSNode * nodeUnk5
Definition levels.h:476
uint8_t isValid
Definition levels.h:468
T2FSDataLevelInfo * info
Definition levels.h:470
T2FSNode * nodeUnk4
Definition levels.h:475
T2FSNode * nodeUnk3
Definition levels.h:474
T2FSNode * node
Definition levels.h:467
uint8_t const * name
Definition levels.h:478
struct s_T2FSNode T2FSNode
This is the core object to describe a path inside the tree.
Definition t2fs.h:110
struct s_T2FSContext T2FSContext
This is the core LibT2FS object that you will be passing around.
Definition t2fs.h:53