* Decrease the loan of your company. * @param flags operation to perform * @param cmd when LoanCommand::Interval: pays back LOAN_INTERVAL, * when LoanCommand::Max: pays back the maximum loan permitting money (press CTRL), * when LoanCommand::Amount: pays back the amount specified in \c amount * @param amount amount to decrease the loan with, multitude of LOAN_INTERVAL. O
| 83 | * @return the cost of this operation or an error |
| 84 | */ |
| 85 | CommandCost CmdDecreaseLoan(DoCommandFlags flags, LoanCommand cmd, Money amount) |
| 86 | { |
| 87 | Company *c = Company::Get(_current_company); |
| 88 | |
| 89 | if (c->current_loan == 0) return CommandCost(STR_ERROR_LOAN_ALREADY_REPAID); |
| 90 | |
| 91 | Money loan; |
| 92 | switch (cmd) { |
| 93 | default: return CMD_ERROR; // Invalid method |
| 94 | case LoanCommand::Interval: // Pay back one step |
| 95 | loan = std::min(c->current_loan, (Money)LOAN_INTERVAL); |
| 96 | break; |
| 97 | case LoanCommand::Max: // Pay back as much as possible |
| 98 | loan = std::max(std::min(c->current_loan, GetAvailableMoneyForCommand()), (Money)LOAN_INTERVAL); |
| 99 | loan -= loan % LOAN_INTERVAL; |
| 100 | break; |
| 101 | case LoanCommand::Amount: // Repay the given amount of loan |
| 102 | loan = amount; |
| 103 | if (loan % LOAN_INTERVAL != 0 || loan < LOAN_INTERVAL || loan > c->current_loan) return CMD_ERROR; // Invalid amount to loan |
| 104 | break; |
| 105 | } |
| 106 | |
| 107 | if (GetAvailableMoneyForCommand() < loan) { |
| 108 | return CommandCostWithParam(STR_ERROR_CURRENCY_REQUIRED, loan); |
| 109 | } |
| 110 | |
| 111 | if (flags.Test(DoCommandFlag::Execute)) { |
| 112 | c->money -= loan; |
| 113 | c->current_loan -= loan; |
| 114 | InvalidateCompanyWindows(c); |
| 115 | } |
| 116 | return CommandCost(); |
| 117 | } |
| 118 | |
| 119 | /** |
| 120 | * Sets the max loan amount of your company. Does not respect the global loan setting. |
nothing calls this directly
no test coverage detected