diff options
author | Iru Cai <mytbk920423@gmail.com> | 2018-08-16 22:43:30 +0800 |
---|---|---|
committer | Iru Cai <mytbk920423@gmail.com> | 2018-08-16 22:43:30 +0800 |
commit | 95d40036c62f26a24533d001801d88a44b5591db (patch) | |
tree | a08fcae0c9bb8274a2ca37cdd145af6db48d8eb2 /csrc/loadsave.c | |
parent | 401b18e5c4d95c20d517a162d22bac217cff432f (diff) | |
download | rich4-95d40036c62f26a24533d001801d88a44b5591db.tar.xz |
load_checkpoint
Diffstat (limited to 'csrc/loadsave.c')
-rw-r--r-- | csrc/loadsave.c | 140 |
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; +} |