summaryrefslogtreecommitdiff
path: root/csrc/mkf.c
blob: 5f2189e4376af63a7198b2de84f15e18388d4970 (plain)
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
struct mkf
{
	HANDLE handle;
	char *data;
};
struct mkf mkf_data[16] = { {-1, NULL} }; // 0x4762f4

uint32_t load_mkf(const char *fn)
{
	int i;
	int32_t x;
	int sz;

	if (mkf_data[0].handle == -1)
		memset(mkf_data, 0, sizeof(mkf_data));

	HANDLE fhdl = CreateFileA(fn, 0x80000000, 0, 0, 3, 128, 0);
	if (fhdl == -1)
		return -1;

	for (i = 0; mkf_data[i].handle != 0; i++)
		;

	mkf_data[i].handle = fhdl;
	ReadFile(fhdl, &x, 4, &sz, NULL);
	int filesz = GetFileSize(fhdl, NULL);
	int t = filesz - x;
	SetFilePointer(fhdl, x, 0, 0);
	mkf_data[i].data = (char*)malloc(t);
	ReadFile(fhdl, mkf_data[i].data, t, &sz, NULL);
	return i;
}

char * read_mkf(int mkf_idx, int a1, char *buf, int *bufsize) //0x00450441
{
	uint32_t data[4];
	int sz;

	HANDLE hdl = mkf_data[mkf_idx].handle;
	if (hdl == 0)
		return 0;

	SetFilePointer(hdl, mkf_data[mkf_idx].data[a1*4], 0, 0);
	ReadFile(hdl, data, 16, &sz, NULL);

	if (buf == NULL) {
		buf = malloc(data[0]);
	}

	int bufsz = data[0];
	if (data[1] == bufsz) {
		ReadFile(hdl, buf, bufsz, &sz, NULL);
	} else {
		char *tmpbuf = malloc(data[1]);
		ReadFile(hdl, tmpbuf, data[1], &sz, NULL);
		fcn_00455040(buf, tmpbuf);
		free(tmpbuf);
	}
	if (data[3] != 0) {
		fcn_00451801(buf+data[2], data[3]);
	}
	if (bufsize != NULL) {
		*bufsize = data[0];
	}
	if (strncmp(buf, "SPR", 3) == 0
			|| strncmp(buf, "SMP", 3) == 0) {
		fcn_00450069(buf);
	}
	return buf;
}