Ejemplo n.º 1
0
/**
 * Subtract money from a company, including the money fraction.
 * @param company Company paying the bill.
 * @param cst     Cost of a command.
 */
void SubtractMoneyFromCompanyFract(CompanyID company, CommandCost cst)
{
	Company *c = Company::Get(company);
	byte m = c->money_fraction;
	Money cost = cst.GetCost();

	c->money_fraction = m - (byte)cost;
	cost >>= 8;
	if (c->money_fraction > m) cost++;
	if (cost != 0) SubtractMoneyFromAnyCompany(c, CommandCost(cst.GetExpensesType(), cost));
}
Ejemplo n.º 2
0
/**
 * Deduct costs of a command from the money of a company.
 * @param c Company to pay the bill.
 * @param cost Money to pay.
 */
static void SubtractMoneyFromAnyCompany(Company *c, CommandCost cost)
{
	if (cost.GetCost() == 0) return;
	assert(cost.GetExpensesType() != INVALID_EXPENSES);

	c->money -= cost.GetCost();
	c->yearly_expenses[0][cost.GetExpensesType()] += cost.GetCost();

	if (HasBit(1 << EXPENSES_TRAIN_INC    |
	           1 << EXPENSES_ROADVEH_INC  |
	           1 << EXPENSES_AIRCRAFT_INC |
	           1 << EXPENSES_SHIP_INC, cost.GetExpensesType())) {
		c->cur_economy.income -= cost.GetCost();
	} else if (HasBit(1 << EXPENSES_TRAIN_RUN    |
	                  1 << EXPENSES_ROADVEH_RUN  |
	                  1 << EXPENSES_AIRCRAFT_RUN |
	                  1 << EXPENSES_SHIP_RUN     |
	                  1 << EXPENSES_PROPERTY     |
	                  1 << EXPENSES_LOAN_INT, cost.GetExpensesType())) {
		c->cur_economy.expenses -= cost.GetCost();
	}

	InvalidateCompanyWindows(c);
}
Ejemplo n.º 3
0
/**
 * Aggreagate paste command costs without calling PastingState::DoCommand.
 *
 * The function works similarly to the PastingState::DoCommand but doesn't actually execute any
 * commands, it just collects a given result.
 *
 * When collecting a success, cost must be of type EXPENSES_CONSTRUCTION. A success also makes
 * STR_ERROR_NOTHING_TO_DO no more applies (we "did" something).
 *
 * Call PastingState::IsInterrupted to test whether the paste operation can be continued.
 *
 * @param cost The return value of the command, a cost or an error.
 * @param tile The tile the error concerns.
 * @param error_message Summary message of the error.
 *
 * @pre The company has enough money if DC_EXEC'ing.
 *
 * @see PastingState::IsInterrupted
 * @see PastingState::CollectError
 * @see PastingState::DoCommand
 */
void PastingState::CollectCost(const CommandCost &cost, TileIndex tile, StringID error_summary)
{
	if (cost.Succeeded()) {
		assert(!this->IsInterrupted());
		/* Currently only EXPENSES_CONSTRUCTION expenses are allowed when copy/pasting. If this
		 * is not sufficient, some upgrade will be required. To allow proper update of finacial
		 * statistics, the overal cost of paste operation will have to be stored separatly for
		 * each supported type of expenses. */
		assert(cost.GetExpensesType() == EXPENSES_CONSTRUCTION);

		/* make sure we are not expending too much */
		assert(!(this->dc_flags & DC_EXEC) || cost.GetCost() <= 0 || this->GetAvailableMoney() >= 0);

		this->had_success = true; // mark that we had a succes and STR_ERROR_NOTHING_TO_DO no more applies
		this->overal_cost += cost.GetCost();
		this->last_result = cost;
	} else {
		this->CollectError(tile, cost.GetErrorMessage(), error_summary);
	}
}
Ejemplo n.º 4
0
/**
 * Deduct costs of a command from the money of a company.
 * @param c Company to pay the bill.
 * @param cost Money to pay.
 */
static void SubtractMoneyFromAnyCompany(Company *c, CommandCost cost)
{
	if (cost.GetCost() == 0) return;
	assert(cost.GetExpensesType() != INVALID_EXPENSES);

	if (HasBit(1 << EXPENSES_TRAIN_INC    |
	           1 << EXPENSES_ROADVEH_INC  |
	           1 << EXPENSES_AIRCRAFT_INC |
	           1 << EXPENSES_SHIP_INC     |
			   1 << EXPENSES_SHARING_INC, cost.GetExpensesType())) {
		c->cur_economy.income -= cost.GetCost();
	} else if (HasBit(1 << EXPENSES_TRAIN_RUN    |
	                  1 << EXPENSES_ROADVEH_RUN  |
	                  1 << EXPENSES_AIRCRAFT_RUN |
//	                  1 << EXPENSES_SHIP_RUN     |
//	                  1 << EXPENSES_LOST_RUN     |
//	                  1 << EXPENSES_PROPERTY     |
//	                  1 << EXPENSES_LOAN_INT     |
                          1 << EXPENSES_SHIP_RUN , cost.GetExpensesType())) {
               if ((_settings_game.economy.day_length_balance_type == DBT_ALL_COSTS ||
                         _settings_game.economy.day_length_balance_type == DBT_RUN_COST)) {
                       cost.MultiplyCost(_settings_game.economy.day_length_balance_factor);
               }
                c->cur_economy.expenses -= cost.GetCost();
       } else if (HasBit(1 << EXPENSES_LOST_RUN, cost.GetExpensesType())) {
               if (_settings_game.economy.day_length_balance_type == DBT_ALL_COSTS) {
                       cost.AffectCost(_settings_game.economy.day_length_balance_factor);
               }
                c->cur_economy.expenses -= cost.GetCost();
       } else if (HasBit(1 << EXPENSES_SHARING_COST, cost.GetExpensesType())) {
               if (_settings_game.economy.day_length_balance_type == DBT_ALL_COSTS) {
                       cost.AffectCost(_settings_game.economy.day_length_balance_factor);
               }
                c->cur_economy.expenses -= cost.GetCost();
       } else if (HasBit(1 << EXPENSES_LOAN_INT, cost.GetExpensesType())) {
               if (_settings_game.economy.day_length_balance_type == DBT_ALL_COSTS ||
                  (_settings_game.economy.day_length_balance_type == DBT_RUN_COST &&
                       _settings_game.economy.include_loan_int_to_run)) {
                       cost.AffectCost(_settings_game.economy.day_length_balance_factor);
               }
                c->cur_economy.expenses -= cost.GetCost();
       } else if (HasBit(1 << EXPENSES_PROPERTY, cost.GetExpensesType())) {
               if (_settings_game.economy.day_length_balance_type == DBT_ALL_COSTS ||
                  (_settings_game.economy.day_length_balance_type == DBT_RUN_COST &&
                       _settings_game.economy.include_prop_main_to_run)) {
                       cost.AffectCost(_settings_game.economy.day_length_balance_factor);
               }
               c->cur_economy.expenses -= cost.GetCost();
       } else if (HasBit(1 << EXPENSES_CONSTRUCTION, cost.GetExpensesType())) {
               /* Multiply construction costs according to day length balance type. */
               if (_settings_game.economy.day_length_balance_type == DBT_ALL_COSTS) {
                       cost.AffectCost(_settings_game.economy.day_length_balance_factor);
               }
        }

       /* Subtract money. */
       c->money -= cost.GetCost();
       c->yearly_expenses[0][cost.GetExpensesType()] += cost.GetCost();

	InvalidateCompanyWindows(c);
}