summaryrefslogtreecommitdiff
path: root/csrc/game_init.c
diff options
context:
space:
mode:
authorIru Cai <mytbk920423@gmail.com>2018-09-02 13:37:36 +0800
committerIru Cai <mytbk920423@gmail.com>2018-09-02 15:29:04 +0800
commit8ee435c0a9843398f173a2f7e3a8bf5b8545b67d (patch)
tree6a529c419848de1167558e0211abac71795b83e0 /csrc/game_init.c
parentd8cf18ab9da32d55c28c1aead56fae78554f94fe (diff)
downloadrich4-8ee435c0a9843398f173a2f7e3a8bf5b8545b67d.tar.xz
refactor game_init
Diffstat (limited to 'csrc/game_init.c')
-rw-r--r--csrc/game_init.c176
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);