-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathINFOSection.h
111 lines (104 loc) · 2.75 KB
/
INFOSection.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
//#include <sar.h>
vector<audio> sounds;
vector<player> players;
vector<soundSet> sets;
vector<group> groups;
typedef struct {
u32 id;
u32 offset;
u32 size;
u32 audioTableOffset; // 0x2100
u32 audioCount;
u32 setTableOffset; // 0x2104
u32 setCount;
u32 bankTableOffset; // 0x2101
u32 bankCount;
u32 warcTableOffset; // 0x2103
u32 warcCount;
u32 groupTableOffset; // 0x2105
u32 groupCount;
u32 playerTableOffset; // 0x2102
u32 playerCount;
u32 fileTableOffset; // 0x2106
u32 fileCount;
u32 fileTableEnd; // 0x220B
void processInfoTable(FILE * &csar) {
fseek(csar, offset, SEEK_SET);
if (id = ReadBE(csar, 32) != 0x494E464F) {
printf("INFO section not found\n");
fclose(csar);
exit(1);
}
else {
fseek(csar, offset + 8, SEEK_SET);
for (i = 0; i < 8; i++)
{
tempHeader = ReadLE(csar, 16);
fseek(csar, 2, SEEK_CUR);
switch (tempHeader) {
case 0x2100:
audioTableOffset = ReadLE(csar, 32); // Found audio table pointer
break;
case 0x2101:
bankTableOffset = ReadLE(csar, 32); // Found bank table pointer
break;
case 0x2102:
playerTableOffset = ReadLE(csar, 32); // Found player table pointer
break;
case 0x2103:
warcTableOffset = ReadLE(csar, 32); // Found wave archive table pointer
break;
case 0x2104:
setTableOffset = ReadLE(csar, 32); // Found WSD/SEQ set table pointer
break;
case 0x2105:
groupTableOffset = ReadLE(csar, 32); // Found group table pointer
break;
case 0x2106:
fileTableOffset = ReadLE(csar, 32); // Found file table pointer
break;
case 0x220B:
fileTableEnd = ReadLE(csar, 32); // Found end of file table
printf("File table ends at %X\n", offset + 8 + fileTableEnd);
break;
default:
printf("Unrecognized table pointer\n");
fclose(csar);
exit(1);
}
}
}
}
void readBankTable(FILE * &csar) {
fseek(csar, offset + 8 + bankTableOffset, SEEK_SET);
bankCount = ReadLE(csar, 32);
banks.resize(bankCount);
for (i = 0; i < (int)bankCount; i++) {
banks[i].id = i;
tempHeader = ReadLE(csar, 16);
fseek(csar, 2, SEEK_CUR);
if (tempHeader == 0x2206) {
banks[i].offset = ReadLE(csar, 32);
// printf("Bank %d info located at %X\n", i, infoSec.offset + 8 + infoSec.bankTableOffset + banks[i].offset);
}
else {
fseek(csar, 4, SEEK_CUR);
}
}
}
void readFileTable(FILE * &csar) {
fseek(csar, offset + 8 + fileTableOffset, SEEK_SET);
fileCount = ReadLE(csar, 32);
files.resize(fileCount);
// Getting info pointers for files
for (i = 0; i < (int)fileCount; i++) {
tempHeader = ReadLE(csar, 16);
fseek(csar, 2, SEEK_CUR);
if (tempHeader == 0x220A)
files[i].offset = ReadLE(csar, 32);
else {
fseek(csar, 4, SEEK_CUR);
}
}
}
} infoSection;