diff --git a/src/game.c b/src/game.c index b8fbee2836..9abc02993e 100644 --- a/src/game.c +++ b/src/game.c @@ -904,7 +904,7 @@ static uint32 game_do_command_table[58] = { 0x006E5597, 0x006B893C, 0x006B8E1B, - 0x0069DFB3, + 0, 0, 0x006D13FE, 0, @@ -967,7 +967,7 @@ static GAME_COMMAND_POINTER* new_game_command_table[58] = { game_command_emptysub, game_command_emptysub, game_command_emptysub, - game_command_emptysub, + game_command_set_current_loan, game_command_set_research_funding, game_command_emptysub, game_command_start_campaign, diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index be11141345..a017053ae2 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -822,6 +822,7 @@ enum { STR_TILE_SMOOTHING_TIP = 2362, STR_GRIDLINES = 2363, STR_GRIDLINES_TIP = 2364, + STR_BANK_REFUSES_TO_INCREASE_LOAN = 2365, STR_CELSIUS = 2366, STR_FAHRENHEIT = 2367, //STR_NONE = 2368, diff --git a/src/management/finance.c b/src/management/finance.c index d8426ed1ef..60a5705573 100644 --- a/src/management/finance.c +++ b/src/management/finance.c @@ -19,7 +19,9 @@ *****************************************************************************/ #include "../addresses.h" +#include "../game.h" #include "../interface/window.h" +#include "../localisation/localisation.h" #include "../peep/peep.h" #include "../ride/ride.h" #include "../world/park.h" @@ -239,7 +241,7 @@ void sub_69E869() { // This subroutine is loan related and is used for cheat detection sint32 value = 0x70093A; - value -= RCT2_GLOBAL(0x013573DC, money32); // Cheat detection + value -= RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32); value = ror32(value, 5); value -= RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32); value = ror32(value, 7); @@ -247,3 +249,50 @@ void sub_69E869() value = ror32(value, 3); RCT2_GLOBAL(0x013587C4, sint32) = value; } + +void finance_set_loan(money32 loan) +{ + game_do_command(0, GAME_COMMAND_FLAG_APPLY, 0, loan, GAME_COMMAND_SET_CURRENT_LOAN, 0, 0); +} + +/** + * + * rct2: 0x0069DFB3 + */ +void game_command_set_current_loan(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) +{ + money32 money, loanDifference, currentLoan; + money32 newLoan = *edx; + + currentLoan = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32); + money = DECRYPT_MONEY(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, money32)); + loanDifference = currentLoan - newLoan; + + RCT2_GLOBAL(0x0141F56C, uint8) = 52; + if (newLoan > currentLoan) { + if (newLoan > RCT2_GLOBAL(RCT2_ADDRESS_MAXIMUM_LOAN, money32)) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_BANK_REFUSES_TO_INCREASE_LOAN; + *ebx = MONEY32_UNDEFINED; + return; + } + } else { + if (loanDifference > money) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16) = STR_NOT_ENOUGH_CASH_AVAILABLE; + *ebx = MONEY32_UNDEFINED; + return; + } + } + + if (*ebx & GAME_COMMAND_FLAG_APPLY) { + money -= loanDifference; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) = newLoan; + RCT2_GLOBAL(RCT2_ADDRESS_INITIAL_CASH, money32) = money; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, money32) = ENCRYPT_MONEY(money); + sub_69E869(); + + window_invalidate_by_class(WC_FINANCES); + RCT2_GLOBAL(0x009A9804, uint16) |= 1; + } + + *ebx = 0; +} \ No newline at end of file diff --git a/src/management/finance.h b/src/management/finance.h index f87998ab15..0f3f1cf081 100644 --- a/src/management/finance.h +++ b/src/management/finance.h @@ -44,4 +44,7 @@ void finance_init(); void finance_update_daily_profit(); void sub_69E869(); +void finance_set_loan(money32 loan); +void game_command_set_current_loan(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); + #endif \ No newline at end of file diff --git a/src/windows/finances.c b/src/windows/finances.c index 84f8732025..c24e0fab99 100644 --- a/src/windows/finances.c +++ b/src/windows/finances.c @@ -599,13 +599,13 @@ static void window_finances_summary_mousedown(int widgetIndex, rct_window*w, rct case WIDX_LOAN_INCREASE: newLoan = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) + MONEY(1000, 00); RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_CANT_BORROW_ANY_MORE_MONEY; - game_do_command(0, 1, 0, newLoan, GAME_COMMAND_SET_CURRENT_LOAN, 0, 0); + finance_set_loan(newLoan); break; case WIDX_LOAN_DECREASE: if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) > 0) { newLoan = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32) - MONEY(1000, 00); RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_CANT_PAY_BACK_LOAN; - game_do_command(0, 1, 0, newLoan, GAME_COMMAND_SET_CURRENT_LOAN, 0, 0); + finance_set_loan(newLoan); } break; }