summaryrefslogtreecommitdiff
path: root/csrc/loadsave.c
diff options
context:
space:
mode:
authorIru Cai <mytbk920423@gmail.com>2018-08-16 22:43:30 +0800
committerIru Cai <mytbk920423@gmail.com>2018-08-16 22:43:30 +0800
commit95d40036c62f26a24533d001801d88a44b5591db (patch)
treea08fcae0c9bb8274a2ca37cdd145af6db48d8eb2 /csrc/loadsave.c
parent401b18e5c4d95c20d517a162d22bac217cff432f (diff)
downloadrich4-95d40036c62f26a24533d001801d88a44b5591db.tar.xz
load_checkpoint
Diffstat (limited to 'csrc/loadsave.c')
-rw-r--r--csrc/loadsave.c140
1 files changed, 140 insertions, 0 deletions
diff --git a/csrc/loadsave.c b/csrc/loadsave.c
new file mode 100644
index 0000000..c4287a1
--- /dev/null
+++ b/csrc/loadsave.c
@@ -0,0 +1,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();
+
+ fcn_0045753a(fp, 4, 0);
+ 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;
+}