diff options
author | Iru Cai <mytbk920423@gmail.com> | 2018-09-02 13:37:36 +0800 |
---|---|---|
committer | Iru Cai <mytbk920423@gmail.com> | 2018-09-02 15:29:04 +0800 |
commit | 8ee435c0a9843398f173a2f7e3a8bf5b8545b67d (patch) | |
tree | 6a529c419848de1167558e0211abac71795b83e0 /csrc/game_init.c | |
parent | d8cf18ab9da32d55c28c1aead56fae78554f94fe (diff) | |
download | rich4-8ee435c0a9843398f173a2f7e3a8bf5b8545b67d.tar.xz |
refactor game_init
Diffstat (limited to 'csrc/game_init.c')
-rw-r--r-- | csrc/game_init.c | 176 |
1 files changed, 77 insertions, 99 deletions
diff --git a/csrc/game_init.c b/csrc/game_init.c index 2b194d5..4cd0e8e 100644 --- a/csrc/game_init.c +++ b/csrc/game_init.c @@ -1,10 +1,20 @@ +int mkf_jump; // 0x48a3b0 + +int initial_fund[6] = { 300000, 200000, 100000, 50000, 30000, 10000 }; // 0x46cb94 +int days[6] = { 0, 730, 365, 182, 91, 30 }; // 0x46cbe8 +/* wins when total_fund = winning_condition * initial_fund */ +int winning_condition[6] = { 0, 100, 50, 10, 5, 3 }; // 0x46cc00 + +int game_initial_fund; // 0x49908c +int traffic_initial; // 0x46cb44 + int init_new_game(int a0) { load_sound_from_mkf(0x46ccd0); dw_48a354 = malloc(0x96000); dw_48a358 = malloc(0x96000); - dw_48a3b0 = eax = load_mkf("JUMP.MKF"); - read_mkf(eax, w_4991b6*4+w_4991b8 /* sign ext */, dw_48a358, NULL); + mkf_jump = load_mkf("JUMP.MKF"); + read_mkf(mkf_jump, w_4991b6*4+w_4991b8 /* sign ext */, dw_48a358, NULL); fcn.004552b7(dw_48a354, dw_48a358, 0x96000, -16); dw_48a3a4 = allocate_some_struct(440, 155, 0, 0); dw_48a3a0 = allocate_some_struct(192, 461, 0, 0); @@ -20,33 +30,31 @@ int init_new_game(int a0) dw_46cb40 = 1; memset(0x48a35c, 0, 48); } else { - eax = nplayers - 2; - dw_46cb3c = eax; - esi = dw_49908c; - for (ebx = 0; ebx < 6; ebx++) { - if (esi != [0x46cb94 + ebx*4]) + dw_46cb3c = nplayers - 2; + for (int i = 0; i < 6; i++) { + if (game_initial_fund != initial_fund[i]) continue; - dw_46cb40 = ebx; + dw_46cb40 = i; + break; } 406f6b: - dw_46cb44 = dw_499118; + traffic_initial = dw_499118; dw_46cb48 = dw_499110; edi = dw_49911c; - for (ebx = 0; ebx < 6; ebx++) { - if (edi != [0x46cbe8 + ebx*4]) + for (int i = 0; i < 6; i++) { + if (edi != days[i]) continue; - dw_46cb4c = ebx; + dw_46cb4c = i; + break; } - edx = dw_499108; - eax = edx; - edx >>= 31; - ebp = dw_49908c; - idiv ebp; - edx = eax; - for (ebx = 0; ebx < 6; ebx++) { - if (edx != [0x46cc00 + ebx * 4]) + + edx = dw_499108 / game_initial_fund; + + for (int i = 0; i < 6; i++) { + if (edx != winning_condition[i]) continue; - dw_46cb50 = ebx; + dw_46cb50 = i; + break; } memset(0x48a35c, 0, 48); eax = players[0].character; @@ -90,16 +98,14 @@ int init_new_game(int a0) sub.WINMM.dll_mciSendStringA_9cf(0x8001); /* TODO: 0x4549cf */ - ebx = eax = fcn_4018e7(0x404e44, a0); - *(int*)(esp + 4) = eax; - unload_mkf(dw_48a3b0); + int res = fcn_4018e7(0x404e44, a0); + *(int*)(esp + 4) = res; + unload_mkf(mkf_jump); - if (ebx == 1) { - eax = dw_46cb3c + 2; - nplayers = eax; + if (res == 1) { + nplayers = dw_46cb3c + 2; dw_499104 = dw_49910c = 0; - eax = dword [dw_46cb40*4 + 0x46cb94]; - dw_49908c = eax; + game_initial_fund = initial_fund[dw_46cb40]; memset(0x499120, 0, 60); memset(0x49915c, 0, 60); for (ebx = 0; ebx < 30; ebx++) { @@ -110,66 +116,48 @@ int init_new_game(int a0) al = byte [ebx*8 + 0x47fee6]; byte [ebx + 0x497320] = al; } - ebx = 0; - goto 0x40726f; + + for (int i = 0; i < 4; i++) { + int money_in_bank; + goto 0x40726f; 4071d4: - eax = byte [esi + 0x496b81]; /* zero ext */ - *(int*)(esp + 12) = eax; - fild word [esp+12]; - fild dword [0x49908c]; - fdiv dword [0x463190]; - fmulp st(1); - fcn_00457dbc(); - fistp dword [esp]; - eax = *(int*)(esp); - dword [esi + player.cash] = eax; - eax = dw_49908c; - edx = dword [esi + player.cash]; - eax -= edx; + players[i].cash = trunc(players[i].init_cash_ratio * (game_initial_fund / 100.0)) + money_in_bank = game_initial_fund - players[i].cash; 407210: - dword [esi + player.money_in_bank] = eax; - eax = ebx * 0x68; - dl = byte [0x46cb44]; - players[ebx].traffic_method = dl; - if (dl != 0) { - eax = dl; /* zero ext */ - byte [eax + 0x497323] --; - } - dl = byte [0x46cb44] + 1; - eax = ebx * 0x68; - players[ebx].ndices = dl; - if (byte [eax + 0x496bcc] & 1) { - dw_499104++; - } - goto 407265; -407258: - memset(ebp, 0, 0x68); -407265: - ebx++; - if (ebx < 4) { + players[i].money_in_bank = money_in_bank; + players[i].traffic_method = traffic_initial; + if (traffic_initial != 0) { + eax = traffic_initial; + byte [eax + 0x497323] --; + } + players[i].ndices = traffic_initial + 1; + if (players[i].f100 & 1) { + dw_499104++; + } + continue; 40726f: - esi = ebx * 0x68; - ebp = 0x496b68 + esi; - if (ebx >= nplayers) - goto 407258; - fcn.00445a4d(ebx, 1); - fcn.00445a4d(ebx, 2); - fcn.00445a4d(ebx, 3); - fcn.00445a4d(ebx, 4); - fcn.00445a4d(ebx, 8); - fcn.00445a4d(ebx, 9); - edi = ebx * 12; + esi = i * 0x68; + ebp = &players[i]; + if (i >= nplayers) { + memset(&players[i], 0, sizeof(player_info)); + continue; + } + fcn.00445a4d(i, 1); + fcn.00445a4d(i, 2); + fcn.00445a4d(i, 3); + fcn.00445a4d(i, 4); + fcn.00445a4d(i, 8); + fcn.00445a4d(i, 9); + edi = i * 12; eax = dword [edi + 0x48a35c] & 0xff; - eax = 0x47e80c + eax*0x68; - memcpy(ebp, eax, 0x68); + memcpy(&players[i], &rich4_players[eax], sizeof(player_info)); eax = dword [edi + 0x48a35c]; eax = (eax >> 31)&1; eax++; - byte [esi + 0x496bcc] = al; + players[i].f100 = al; if ((al & 1) == 0) - goto 4071d4; - eax = dw_49908c >> 1; // signed shift - dword [esi + player.cash] = eax; + goto 4071d4; /* AI players */ + players[i].cash = money_in_bank = game_initial_fund / 2; goto 407210; } @@ -177,16 +165,10 @@ int init_new_game(int a0) memset(0x496b30, 0, 8); memset(0x496b60, 0, 8); b_496b34 = b_496b35 = b_496b66 = b_496b67 = 1; - dw_499118 = dw_46cb44; + dw_499118 = traffic_initial; dw_499110 = dw_46cb48; - eax = dw_46cb4c; - eax = dword [eax*4 + 0x46cbe8]; - dw_49911c = eax; - eax = dw_46cb50; - edx = dw_49908c; - eax = [eax*4 + 0x46cc00]; - imul eax, edx; - dw_499108 = eax; + dw_49911c = days[dw_46cb4c]; + dw_499108 = winning_condition[dw_46cb50] * game_initial_fund; w_4991b8 = w_46cb54; dw_4990e8 = 1; dw_4990e4 = dw_499084 = dw_4990dc = dw_4990ec = dw_499100 = esi = 0; @@ -206,19 +188,14 @@ int init_new_game(int a0) eax = edx * 9; eax += 0x47f072; memcpy(0x496980, eax, 432); - *(int*)(esp+8) = esi; + + float sum = 0; /* esp + 8 */ for (ebx = 0; ebx < 12; ebx++) { - eax = ebx * 9; - fld dword [esp + 8]; - fadd dword [eax*4 + 0x49698c]; - fstp dword [esp + 8]; + sum += *(float*)(ebx * 36 + 0x49698c); } - fld dword [esp+8]; - fmul dword [0x463194]; - fcn_00457dbc(); - fistp dword [0x49907c]; + dw_49907c = trunc(sum * 10.0); memset(0x4967e0, 0, 336); memset(0x4971a0, 0, 384); memset(0x4990b8, 0, 36); @@ -226,6 +203,7 @@ int init_new_game(int a0) fcn.00448b81(); fcn.0044baea(); } + // 4074c9 fcn.00454240(0x46ccd0); free(dw_48a390); |