File diff r26119:a6e64747fa5d → r26120:15c912177c88
src/misc_cmd.cpp
Show inline comments
 
@@ -28,22 +28,16 @@
 

	
 
#include "safeguards.h"
 

	
 
/* Make sure we can discard lower 2 bits of 64bit amount when passing it to Cmd[In|De]creaseLoan() */
 
static_assert((LOAN_INTERVAL & 3) == 0);
 

	
 
/**
 
 * Increase the loan of your company.
 
 * @param flags operation to perform
 
 * @param tile unused
 
 * @param p1 higher half of amount to increase the loan with, multitude of LOAN_INTERVAL. Only used when (p2 & 3) == 2.
 
 * @param p2 (bit 2-31) - lower half of amount (lower 2 bits assumed to be 0)
 
 *           (bit 0-1)  - when 0: loans LOAN_INTERVAL
 
 *                        when 1: loans the maximum loan permitting money (press CTRL),
 
 *                        when 2: loans the amount specified in p1 and p2
 
 * @param text unused
 
 * @param cmd when LoanCommand::Interval: loans LOAN_INTERVAL,
 
 *            when LoanCommand::Max: loans the maximum loan permitting money (press CTRL),
 
 *            when LoanCommand::Amount: loans the amount specified in \c amount
 
 * @param amount amount to increase the loan with, multitude of LOAN_INTERVAL. Only used when cmd == LoanCommand::Amount.
 
 * @return the cost of this operation or an error
 
 */
 
CommandCost CmdIncreaseLoan(DoCommandFlag flags, TileIndex tile, uint32 p1, uint32 p2, const std::string &text)
 
CommandCost CmdIncreaseLoan(DoCommandFlag flags, LoanCommand cmd, Money amount)
 
{
 
	Company *c = Company::Get(_current_company);
 

	
 
@@ -53,16 +47,16 @@ CommandCost CmdIncreaseLoan(DoCommandFla
 
	}
 

	
 
	Money loan;
 
	switch (p2 & 3) {
 
	switch (cmd) {
 
		default: return CMD_ERROR; // Invalid method
 
		case 0: // Take some extra loan
 
		case LoanCommand::Interval: // Take some extra loan
 
			loan = LOAN_INTERVAL;
 
			break;
 
		case 1: // Take a loan as big as possible
 
		case LoanCommand::Max: // Take a loan as big as possible
 
			loan = _economy.max_loan - c->current_loan;
 
			break;
 
		case 2: // Take the given amount of loan
 
			loan = ((uint64)p1 << 32) | (p2 & 0xFFFFFFFC);
 
		case LoanCommand::Amount: // Take the given amount of loan
 
			loan = amount;
 
			if (loan < LOAN_INTERVAL || c->current_loan + loan > _economy.max_loan || loan % LOAN_INTERVAL != 0) return CMD_ERROR;
 
			break;
 
	}
 
@@ -82,33 +76,30 @@ CommandCost CmdIncreaseLoan(DoCommandFla
 
/**
 
 * Decrease the loan of your company.
 
 * @param flags operation to perform
 
 * @param tile unused
 
 * @param p1 higher half of amount to decrease the loan with, multitude of LOAN_INTERVAL. Only used when (p2 & 3) == 2.
 
 * @param p2 (bit 2-31) - lower half of amount (lower 2 bits assumed to be 0)
 
 *           (bit 0-1)  - when 0: pays back LOAN_INTERVAL
 
 *                        when 1: pays back the maximum loan permitting money (press CTRL),
 
 *                        when 2: pays back the amount specified in p1 and p2
 
 * @param text unused
 
 * @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. Only used when cmd == LoanCommand::Amount.
 
 * @return the cost of this operation or an error
 
 */
 
CommandCost CmdDecreaseLoan(DoCommandFlag flags, TileIndex tile, uint32 p1, uint32 p2, const std::string &text)
 
CommandCost CmdDecreaseLoan(DoCommandFlag flags, LoanCommand cmd, Money amount)
 
{
 
	Company *c = Company::Get(_current_company);
 

	
 
	if (c->current_loan == 0) return_cmd_error(STR_ERROR_LOAN_ALREADY_REPAYED);
 

	
 
	Money loan;
 
	switch (p2 & 3) {
 
	switch (cmd) {
 
		default: return CMD_ERROR; // Invalid method
 
		case 0: // Pay back one step
 
		case LoanCommand::Interval: // Pay back one step
 
			loan = std::min(c->current_loan, (Money)LOAN_INTERVAL);
 
			break;
 
		case 1: // Pay back as much as possible
 
		case LoanCommand::Max: // Pay back as much as possible
 
			loan = std::max(std::min(c->current_loan, c->money), (Money)LOAN_INTERVAL);
 
			loan -= loan % LOAN_INTERVAL;
 
			break;
 
		case 2: // Repay the given amount of loan
 
			loan = ((uint64)p1 << 32) | (p2 & 0xFFFFFFFC);
 
		case LoanCommand::Amount: // Repay the given amount of loan
 
			loan = amount;
 
			if (loan % LOAN_INTERVAL != 0 || loan < LOAN_INTERVAL || loan > c->current_loan) return CMD_ERROR; // Invalid amount to loan
 
			break;
 
	}
 
@@ -135,7 +126,7 @@ CommandCost CmdDecreaseLoan(DoCommandFla
 
static void AskUnsafeUnpauseCallback(Window *w, bool confirmed)
 
{
 
	if (confirmed) {
 
		Command<CMD_PAUSE>::Post(0, PM_PAUSED_ERROR, 0, {});
 
		Command<CMD_PAUSE>::Post(PM_PAUSED_ERROR, false);
 
	}
 
}
 

	
 
@@ -145,15 +136,13 @@ static void AskUnsafeUnpauseCallback(Win
 
 * unpaused. A bitset is used instead of a boolean value/counter to have
 
 * more control over the game when saving/loading, etc.
 
 * @param flags operation to perform
 
 * @param tile unused
 
 * @param p1 the pause mode to change
 
 * @param p2 1 pauses, 0 unpauses this mode
 
 * @param text unused
 
 * @param mode the pause mode to change
 
 * @param pause true pauses, false unpauses this mode
 
 * @return the cost of this operation or an error
 
 */
 
CommandCost CmdPause(DoCommandFlag flags, TileIndex tile, uint32 p1, uint32 p2, const std::string &text)
 
CommandCost CmdPause(DoCommandFlag flags, PauseMode mode, bool pause)
 
{
 
	switch (p1) {
 
	switch (mode) {
 
		case PM_PAUSED_SAVELOAD:
 
		case PM_PAUSED_ERROR:
 
		case PM_PAUSED_NORMAL:
 
@@ -169,7 +158,7 @@ CommandCost CmdPause(DoCommandFlag flags
 
		default: return CMD_ERROR;
 
	}
 
	if (flags & DC_EXEC) {
 
		if (p1 == PM_PAUSED_NORMAL && _pause_mode & PM_PAUSED_ERROR) {
 
		if (mode == PM_PAUSED_NORMAL && _pause_mode & PM_PAUSED_ERROR) {
 
			ShowQuery(
 
				STR_NEWGRF_UNPAUSE_WARNING_TITLE,
 
				STR_NEWGRF_UNPAUSE_WARNING,
 
@@ -179,13 +168,13 @@ CommandCost CmdPause(DoCommandFlag flags
 
		} else {
 
			PauseMode prev_mode = _pause_mode;
 

	
 
			if (p2 == 0) {
 
				_pause_mode = static_cast<PauseMode>(_pause_mode & (byte)~p1);
 
			if (pause) {
 
				_pause_mode |= mode;
 
			} else {
 
				_pause_mode = static_cast<PauseMode>(_pause_mode | (byte)p1);
 
				_pause_mode &= ~mode;
 
			}
 

	
 
			NetworkHandlePauseChange(prev_mode, (PauseMode)p1);
 
			NetworkHandlePauseChange(prev_mode, mode);
 
		}
 

	
 
		SetWindowDirty(WC_STATUS_BAR, 0);
 
@@ -197,33 +186,25 @@ CommandCost CmdPause(DoCommandFlag flags
 
/**
 
 * Change the financial flow of your company.
 
 * @param flags operation to perform
 
 * @param tile unused
 
 * @param p1 the amount of money to receive (if positive), or spend (if negative)
 
 * @param p2 unused
 
 * @param text unused
 
 * @param amount the amount of money to receive (if positive), or spend (if negative)
 
 * @return the cost of this operation or an error
 
 */
 
CommandCost CmdMoneyCheat(DoCommandFlag flags, TileIndex tile, uint32 p1, uint32 p2, const std::string &text)
 
CommandCost CmdMoneyCheat(DoCommandFlag flags, Money amount)
 
{
 
	return CommandCost(EXPENSES_OTHER, -(int32)p1);
 
	return CommandCost(EXPENSES_OTHER, -amount);
 
}
 

	
 
/**
 
 * Change the bank bank balance of a company by inserting or removing money without affecting the loan.
 
 * @param flags operation to perform
 
 * @param tile tile to show text effect on (if not 0)
 
 * @param p1 the amount of money to receive (if positive), or spend (if negative)
 
 * @param p2 (bit 0-7)  - the company ID.
 
 *           (bit 8-15) - the expenses type which should register the cost/income @see ExpensesType.
 
 * @param text unused
 
 * @param delta the amount of money to receive (if positive), or spend (if negative)
 
 * @param company the company ID.
 
 * @param expenses_type the expenses type which should register the cost/income @see ExpensesType.
 
 * @return zero cost or an error
 
 */
 
CommandCost CmdChangeBankBalance(DoCommandFlag flags, TileIndex tile, uint32 p1, uint32 p2, const std::string &text)
 
CommandCost CmdChangeBankBalance(DoCommandFlag flags, TileIndex tile, Money delta, CompanyID company, ExpensesType expenses_type)
 
{
 
	int32 delta = (int32)p1;
 
	CompanyID company = (CompanyID) GB(p2, 0, 8);
 
	ExpensesType expenses_type = Extract<ExpensesType, 8, 8>(p2);
 

	
 
	if (!Company::IsValidID(company)) return CMD_ERROR;
 
	if (expenses_type >= EXPENSES_END) return CMD_ERROR;
 
	if (_current_company != OWNER_DEITY) return CMD_ERROR;