Skip to content

Commit 1d6c61f

Browse files
committed
Some more WIP. Skip full SSYM blocks since STRI blocks aren't fully known and causes parse issues.
1 parent 9674527 commit 1d6c61f

File tree

2 files changed

+66
-19
lines changed

2 files changed

+66
-19
lines changed

Source/BlockInfo.h

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ struct Block_SSYM
103103
{
104104
// SSYM
105105
uint32_t cookie;
106-
uint32_t unk1;
106+
uint32_t size;
107107
uint32_t unk2;
108108
};
109109

@@ -146,7 +146,8 @@ struct Block_TPGE
146146
uint32_t unk3;
147147
uint32_t unk4;
148148
uint32_t unk5;
149-
uint32_t unk6;
149+
// XXX: Sometimes doesn't exist?
150+
// uint32_t unk6;
150151
};
151152

152153
struct Block_TPIB
@@ -296,3 +297,16 @@ struct Block_KWGS
296297
uint32_t local_y;
297298
uint32_t local_z;
298299
};
300+
301+
struct Block_RLOC
302+
{
303+
// RLOC
304+
uint32_t cookie;
305+
uint32_t unk1;
306+
uint32_t unk2;
307+
uint32_t unk3;
308+
uint32_t unk4;
309+
uint32_t unk5;
310+
uint32_t unk6;
311+
312+
};

Source/Main.cpp

Lines changed: 50 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ bool ParseSingleBlock(uint8_t* blockBlob, size_t *blockSize)
8686
{
8787
Block_VERT* block = reinterpret_cast<Block_VERT*>(blockBlob);
8888
printf("Block_VERT\n");
89+
printf("\tunk1 = 0x%08x\n", block->unk1);
90+
8991
assert(block->unk1 == 0x45c);
9092
*blockSize = sizeof(Block_VERT);
9193
}
@@ -94,6 +96,8 @@ bool ParseSingleBlock(uint8_t* blockBlob, size_t *blockSize)
9496
{
9597
Block_FRAG* block = reinterpret_cast<Block_FRAG*>(blockBlob);
9698
printf("Block_FRAG\n");
99+
printf("\tunk1 = 0x%08x\n", block->unk1);
100+
97101
assert(block->unk1 == 0x37c);
98102
*blockSize = sizeof(Block_FRAG);
99103
}
@@ -102,7 +106,10 @@ bool ParseSingleBlock(uint8_t* blockBlob, size_t *blockSize)
102106
{
103107
Block_COMP* block = reinterpret_cast<Block_COMP*>(blockBlob);
104108
printf("Block_COMP\n");
105-
assert(block->unk1 == 0x1a8);
109+
printf("\tunk1 = 0x%08x\n", block->unk1);
110+
111+
// XXX: Changes, probably a size
112+
//assert(block->unk1 == 0x1a8);
106113
*blockSize = sizeof(Block_COMP);
107114
}
108115
break;
@@ -162,13 +169,13 @@ bool ParseSingleBlock(uint8_t* blockBlob, size_t *blockSize)
162169
{
163170
Block_SSYM* block = reinterpret_cast<Block_SSYM*>(blockBlob);
164171
printf("Block_SSYM\n");
165-
printf("\tunk1 = 0x%08x\n", block->unk1);
172+
printf("\tsize = 0x%08x\n", block->size);
166173
printf("\tunk2 = 0x%08x\n", block->unk2);
167174

168175
// XXX: Sometimes different
169-
//assert(block->unk1 == 0xa8);
170176
//assert(block->unk2 == 0x2);
171-
*blockSize = sizeof(Block_SSYM);
177+
// XXX: Skipping the entire SSYM because parsing of sub blocks(STRI) aren't complete
178+
*blockSize = sizeof(Block_SSYM) + block->size - 4;
172179
}
173180
break;
174181
case COOKIE("SYMB"):
@@ -247,16 +254,16 @@ bool ParseSingleBlock(uint8_t* blockBlob, size_t *blockSize)
247254
printf("\tunk3 = 0x%08x\n", block->unk3);
248255
printf("\tunk4 = 0x%08x\n", block->unk4);
249256
printf("\tunk5 = 0x%08x\n", block->unk5);
250-
printf("\tunk6 = 0x%08x\n", block->unk6);
257+
//printf("\tunk6 = 0x%08x\n", block->unk6);
251258

252259
assert(block->unk1 == 0xc);
253260
// XXX: Sometimes different
254261
//assert(block->unk2 == 0x01020102);
255262
//assert(block->unk3 == 0x1);
256263
// Probably a bitfield
257264
//assert(block->unk4 == 0x8);
258-
assert(block->unk5 == 0x0 || block->unk5 == 0x45535054);
259-
assert(block->unk6 == 0x0 || block->unk6 == 0x3c);
265+
//assert(block->unk5 == 0x0 || block->unk5 == 0x45535054);
266+
//assert(block->unk6 == 0x0 || block->unk6 == 0x3c);
260267
*blockSize = sizeof(Block_TPGE);
261268
}
262269
break;
@@ -296,7 +303,8 @@ bool ParseSingleBlock(uint8_t* blockBlob, size_t *blockSize)
296303
printf("\tunk2 = 0x%08x\n", block->unk2);
297304

298305
assert(block->unk1 == 0x20);
299-
assert(block->unk2 == 0x18);
306+
// XXX: Probably an array size
307+
//assert(block->unk2 == 0x18);
300308

301309
*blockSize = sizeof(Block_TPAR);
302310
}
@@ -310,11 +318,13 @@ bool ParseSingleBlock(uint8_t* blockBlob, size_t *blockSize)
310318
printf("\tunk3 = 0x%08x\n", block->unk3);
311319

312320

313-
assert(block->unk1 == 0x4);
314-
assert(block->unk2 == 0x0);
315-
assert(block->unk3 == 0x1);
321+
// XXX: sometimes different
322+
//assert(block->unk1 == 0x4);
323+
//assert(block->unk2 == 0x0);
324+
//assert(block->unk3 == 0x1);
316325

317-
*blockSize = sizeof(Block_UBUF);
326+
// XXX: unk2...?
327+
*blockSize = sizeof(Block_UBUF) + (block->unk2 ? 4 : 0);
318328
}
319329
break;
320330
case COOKIE("EBIN"):
@@ -332,10 +342,12 @@ bool ParseSingleBlock(uint8_t* blockBlob, size_t *blockSize)
332342
//assert(block->unk1 == 0xd4);
333343
assert(block->unk2 == 0x0);
334344
assert(block->unk3 == ~0U);
335-
assert(block->unk4 == 0x0);
345+
//assert(block->unk4 == 0x0);
336346
assert(block->unk5 == 0x0);
337-
assert(block->unk6 == ~0U);
338-
*blockSize = sizeof(Block_EBIN);
347+
//assert(block->unk6 == ~0U);
348+
349+
// XXX: unk4...?
350+
*blockSize = sizeof(Block_EBIN) + (block->unk4 ? -4 : 0);
339351
}
340352
break;
341353
case COOKIE("FSHA"):
@@ -354,7 +366,7 @@ bool ParseSingleBlock(uint8_t* blockBlob, size_t *blockSize)
354366
assert(block->unk2 == 0x0);
355367
assert(block->unk3 == 0x0);
356368
assert(block->unk4 == 0x20);
357-
assert(block->unk5 == 0x0);
369+
//assert(block->unk5 == 0x0);
358370
// XXX:Sometimes different
359371
// Probably a bitfield
360372
//assert(block->unk6 == 0x0);
@@ -454,7 +466,8 @@ bool ParseSingleBlock(uint8_t* blockBlob, size_t *blockSize)
454466
printf("Block_CCOM\n");
455467
printf("\tunk1 = 0x%08x\n", block->unk1);
456468

457-
assert(block->unk1 == 0x180);
469+
// XXX: Probably a size
470+
// assert(block->unk1 == 0x180);
458471
*blockSize = sizeof(Block_CCOM);
459472
}
460473
break;
@@ -478,7 +491,27 @@ bool ParseSingleBlock(uint8_t* blockBlob, size_t *blockSize)
478491
*blockSize = sizeof(Block_KWGS);
479492
}
480493
break;
494+
case COOKIE("RLOC"):
495+
{
496+
Block_RLOC* block = reinterpret_cast<Block_RLOC*>(blockBlob);
497+
printf("Block_RLOC\n");
498+
printf("\tunk1 = 0x%08x\n", block->unk1);
499+
printf("\tunk2 = 0x%08x\n", block->unk2);
500+
printf("\tunk3 = 0x%08x\n", block->unk3);
501+
printf("\tunk4 = 0x%08x\n", block->unk4);
502+
printf("\tunk5 = 0x%08x\n", block->unk5);
503+
printf("\tunk6 = 0x%08x\n", block->unk6);
481504

505+
assert(block->unk1 == 0x10);
506+
assert(block->unk2 == 0x0);
507+
assert(block->unk3 == 0x0);
508+
assert(block->unk4 == 0x0);
509+
assert(block->unk5 == 0x8);
510+
// XXX: Sometimes different
511+
//assert(block->unk6 == 0x0);
512+
*blockSize = sizeof(Block_RLOC);
513+
}
514+
break;
482515

483516
default:
484517
{

0 commit comments

Comments
 (0)