summaryrefslogtreecommitdiff
path: root/csrc/loadsave.c
blob: 382f364189d0081e0b618392f3cb54b1b069a45f (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
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
int load_checkpoint(int n)
{
	char filename[16];

	sprintf(filename, "SAVE%d.DAT", n);
	FILE *fp = fopen(filename, "rb");
	if (fp == NULL) {
		return 0;
	}
	fcn_00401543();
	ebp = timeGetTime(); /* esi = 0 */
	fcn_004080f5();

	fseek(fp, 4, SEEK_SET);
	fread(&global_rich4_cfg.day, 4, 1, fp); // read day,month,year
	fread(0x4991b8, 2, 1, fp);
	fread(0x4991b6, 2, 1, fp);
	fread(0x499114, 4, 1, fp);
	fread(0x496b68, 0x68, 4, fp);
	fread(0x499104, 4, 1, fp);

	int t = *(int*)0x499114;
	for (int i = 0; i < t; i++) {
		eax = i * 0x68;
		edx = 0;
		dl = *(char*)(0x496b7b+eax);
		edx *= 0x68;
		edx = *(int*)(0x47e80c+edx);
		*(int*)(0x496b68+eax) = edx;
	}

	fread(0x498e28, 0x10, 5, fp);
	fread(0x496d08, 0x18, 0x2e, fp);
	fread(0x499120, 1, 0x3c, fp);
	fread(0x49915c, 1, 0x3c, fp);
	fread(0x499198, 1, 0x1e, fp);
	fread(0x497320, 1, 8, fp);
	fread(0x499100, 4, 1, fp);
	fread(0x497328, 4, 0x6c0, fp);
	fread(0x4971a0, 8, 0x30, fp);
	fread(0x496980, 0x24, 0xc, fp);

	for (int i = 0; i < 12; i++) {
		int32_t edx = (*(int16_t*)0x4991b6) << 2;
		edx += (*(int16_t*))0x4991b8;
		eax = edx << 2;
		eax -= edx; /* eax = edx * 3 */
		eax <<= 4; /* eax = edx * 48 */
		esi = eax << 3; /* esi = edx * 384 */
		esi += eax; /* esi = edx * 432 */
		eax = i << 3;
		eax += i; /* eax = i * 9 */
		eax <<= 2; /* eax = i * 36 */
		edx = esi + eax;
		edx = *(int*)(0x47f072+edx);
		*(int*)(0x496980+eax) = edx;
	}

	fread(0x4967e0, 0xc, 0x1c, fp);
	fread(0x49910c, 4, 1, fp);
	fread(0x499118, 4, 1, fp);
	fread(0x499110, 4, 1, fp);
	fread(0x49911c, 4, 1, fp);
	fread(0x499108, 4, 1, fp);
	fread(0x49908c, 4, 1, fp);
	fread(0x4990e8, 4, 1, fp);
	fread(0x4990e4, 4, 1, fp);
	fread(0x499084, 4, 1, fp);
	fread(0x4990dc, 4, 1, fp);
	fread(0x49907c, 4, 1, fp);
	fread(0x499078, 4, 1, fp);
	fread(0x4990ec, 4, 1, fp);
	fread(0x4990f0, 1, 4, fp);
	fread(0x4990f4, 1, 0xc, fp);
	fread(0x499080, 4, 1, fp);
	fread(0x4990b8, 1, 0x24, fp);
	fread(0x496b30, 1, 8, fp);
	fread(0x496b60, 1, 8, fp);
	fread(0x4990e0, 4, 1, fp);
	fread(0x4990b4, 4, 1, fp);
	fread(0x499090, 1, 0x24, fp);
	fread(0x496b38, 1, 0x25, fp);
	fread(0x499088, 4, 1, fp);
	fread(0x498e94, 4, 1, fp);

	dw_0x47493c = malloc(*(int*)0x498e94);
	fread(dw_0x47493c, 1, *(int*)0x498e94, fp);

	eax = *(int*)0x47493c;
	edx = *(int*)eax;
	*(int*)0x498e9c = edx;
	edx = *(int*)(eax + 4);
	ebx = eax + edx;
	*(int*)0x498e80 = ebx;
	edx = *(int*)(eax + 8);
	*(int*)0x498e98 = edx;
	edx = *(int*)(eax + 12);
	ebx = eax + edx;
	*(int*)0x498e84 = ebx;
	edx = *(int*)(eax + 16);
	*(int*)0x498e8c = edx;
	edx = *(int*)(eax + 20);
	ebx = eax + edx;
	*(int*)0x498e88 = ebx;
	edx = *(int*)(eax + 24);
	*(int*)0x498e90 = edx;
	edx = *(int*)(eax + 28);
	ebx = eax + edx;
	*(int*)0x498e7c = ebx;
	edx = *(int*)(eax + 32);
	*(int*)0x499074 = edx;
	edx = *(int*)(eax + 36);
	eax += edx;
	*(int*)0x498e78 = eax;

	for (int i = 0; i < *(int*)0x499114; i++) {
		eax = i << 3;
		eax += i; /* eax = i * 9 */
		eax <<= 2; /* eax = i * 36 */
		eax -= i; /* eax = i * 35 */
		eax <<= 2; /* eax = i * 140 */
		eax -= i; /* eax = i * 139 */
		eax <<= 3; /* eax = i * 1112 */
		esi = eax << 3; /* esi = eax * 8 */
		esi += eax; /* esi = eax * 9 = i * 10008 = i * 0x2718 */
		eax = 0x48cb80 + esi;
		fread(eax, 0x2718, 1, fp);
		*(int*)(0x48f294 + esi) = malloc(*(int*)0x498e94);
		fread(*(int*)(0x48f294+esi), 1, *(int*)0x498e94, fp);
	}
	fcn_00407ad2();
	eax = (*(int*)0x49910c) * 0x34;
	*(char*)(0x498ea0 + eax) |= 0x80;
	fcn_00456f50(GetTickCount());

	while (timeGetTime()-ebp < 1000)
		;
	fclose(fp);
	return 1;
}