Typedefs | Functions | Variables

economy.cpp File Reference

Handling of the economy. More...

#include "stdafx.h"
#include "company_func.h"
#include "command_func.h"
#include "industry.h"
#include "town.h"
#include "news_func.h"
#include "network/network.h"
#include "network/network_func.h"
#include "ai/ai.hpp"
#include "aircraft.h"
#include "newgrf_engine.h"
#include "engine_base.h"
#include "ground_vehicle.hpp"
#include "newgrf_cargo.h"
#include "newgrf_sound.h"
#include "newgrf_industrytiles.h"
#include "newgrf_station.h"
#include "newgrf_airporttiles.h"
#include "object.h"
#include "strings_func.h"
#include "date_func.h"
#include "vehicle_func.h"
#include "sound_func.h"
#include "autoreplace_func.h"
#include "company_gui.h"
#include "signs_base.h"
#include "subsidy_base.h"
#include "subsidy_func.h"
#include "station_base.h"
#include "waypoint_base.h"
#include "economy_base.h"
#include "core/pool_func.hpp"
#include "core/backup_type.hpp"
#include "cargo_type.h"
#include "water.h"
#include "game/game.hpp"
#include "cargomonitor.h"
#include "goal_base.h"
#include "table/strings.h"
#include "table/pricebase.h"

Go to the source code of this file.

Typedefs

typedef SmallVector< Industry *, 16 > SmallIndustryList

Functions

static int32 BigMulS (const int32 a, const int32 b, const uint8 shift)
 Multiply two integer values and shift the results to right.
Money CalculateCompanyValue (const Company *c, bool including_loan)
 Calculate the value of the company.
int UpdateCompanyRatingAndValue (Company *c, bool update)
 if update is set to true, the economy is updated with this score (also the house is updated, should only be true in the on-tick event)
void ChangeOwnershipOfCompanyItems (Owner old_owner, Owner new_owner)
 Change the ownership of all the items of a company.
static void CompanyCheckBankrupt (Company *c)
 Check for bankruptcy of a company.
static void CompaniesGenStatistics ()
 Update the finances of all companies.
bool AddInflation (bool check_year)
 Add monthly inflation.
void RecomputePrices ()
 Computes all prices, payments and maximum loan.
static void CompaniesPayInterest ()
 Let all companies pay the monthly interest on their loan.
static void HandleEconomyFluctuations ()
void ResetPriceBaseMultipliers ()
 Reset changes to the price base multipliers.
void SetPriceBaseMultiplier (Price price, int factor)
 Change a price base by the given factor.
void StartupIndustryDailyChanges (bool init_counter)
 Initialize the variables that will maintain the daily industry change system.
void StartupEconomy ()
void InitializeEconomy ()
 Resets economy to initial values.
Money GetPrice (Price index, uint cost_factor, const GRFFile *grf_file, int shift)
 Determine a certain price.
Money GetTransportedGoodsIncome (uint num_pieces, uint dist, byte transit_days, CargoID cargo_type)
static uint DeliverGoodsToIndustry (const Station *st, CargoID cargo_type, uint num_pieces, IndustryID source)
 Transfer goods from station to industry.
static Money DeliverGoods (int num_pieces, CargoID cargo_type, StationID dest, TileIndex source_tile, byte days_in_transit, Company *company, SourceType src_type, SourceID src)
 Delivers goods to industries/towns and calculates the payment.
static void TriggerIndustryProduction (Industry *i)
 Inform the industry about just delivered cargo DeliverGoodsToIndustry() silently incremented incoming_cargo_waiting, now it is time to do something with the new cargo.
void PrepareUnload (Vehicle *front_v)
 Prepare the vehicle to be unloaded.
static byte GetLoadAmount (Vehicle *v)
 Gets the amount of cargo the given vehicle can load in the current tick.
static void ReserveConsist (Station *st, Vehicle *u, CargoArray *consist_capleft, StationID next_station)
 Reserves cargo if the full load order and improved_load is set or if the current order allows autorefit.
static bool IsArticulatedVehicleEmpty (Vehicle *v)
 Checks whether an articulated vehicle is empty.
static void LoadUnloadVehicle (Vehicle *front)
 Loads/unload the vehicle if possible.
void LoadUnloadStation (Station *st)
 Load/unload the vehicles in this station according to the order they entered.
void CompaniesMonthlyLoop ()
 Monthly update of the economic data (of the companies as well as economic fluctuations).
static void DoAcquireCompany (Company *c)
int GetAmountOwnedBy (const Company *c, Owner owner)
CommandCost CmdBuyShareInCompany (TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
 Acquire shares in an opposing company.
CommandCost CmdSellShareInCompany (TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
 Sell shares in an opposing company.
CommandCost CmdBuyCompany (TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
 Buy up another company.

Variables

CargoPaymentPool _cargo_payment_pool ("CargoPayment")
 The actual pool to store cargo payments in.
const ScoreInfo _score_info []
 Score info, values used for computing the detailed performance rating.
int _score_part [MAX_COMPANIES][SCORE_END]
Economy _economy
Prices _price
Money _additional_cash_required
static PriceMultipliers _price_base_multiplier
static SmallIndustryList _cargo_delivery_destinations
 The industries we've currently brought cargo to.

Detailed Description

Handling of the economy.

Definition in file economy.cpp.


Function Documentation

bool AddInflation ( bool  check_year  ) 

Add monthly inflation.

Parameters:
check_year Shall the inflation get stopped after 170 years?
Returns:
true if inflation is maxed and nothing was changed

Definition at line 686 of file economy.cpp.

References _cur_year, _settings_game, GameSettings::game_creation, Economy::infl_amount, Economy::infl_amount_pr, Economy::inflation_payment, Economy::inflation_prices, MAX_INFLATION, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR, and GameCreationSettings::starting_year.

Referenced by AfterLoadGame(), and CompaniesMonthlyLoop().

static int32 BigMulS ( const int32  a,
const int32  b,
const uint8  shift 
) [inline, static]

Multiply two integer values and shift the results to right.

This function multiplies two integer values. The result is shifted by the amount of shift to right.

Parameters:
a The first integer
b The second integer
shift The amount to shift the value to right.
Returns:
The shifted result

Definition at line 70 of file economy.cpp.

Money CalculateCompanyValue ( const Company c,
bool  including_loan 
)

Calculate the value of the company.

That is the value of all assets (vehicles, stations, etc) and money minus the loan, except when including_loan is false which is useful when we want to calculate the value for bankruptcy.

Parameters:
c the company to get the value of.
including_loan include the loan in the company value.
Returns:
the value of the company.

Definition at line 108 of file economy.cpp.

References CountBits(), CompanyProperties::current_loan, BaseStation::facilities, FOR_ALL_VEHICLES, SpecializedVehicle< Aircraft, VEH_AIRCRAFT >::From(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, Aircraft::IsNormalAircraft(), max(), CompanyProperties::money, Vehicle::owner, BaseStation::owner, BaseVehicle::type, Vehicle::value, VEH_AIRCRAFT, VEH_ROAD, VEH_SHIP, and VEH_TRAIN.

Referenced by CmdBuyShareInCompany(), CmdSellShareInCompany(), CompanyCheckBankrupt(), CompanyWindow::SetStringParameters(), and UpdateCompanyRatingAndValue().

void ChangeOwnershipOfCompanyItems ( Owner  old_owner,
Owner  new_owner 
)

Change the ownership of all the items of a company.

Parameters:
old_owner The company that gets removed.
new_owner The company to merge to, or INVALID_OWNER to remove the company.

Definition at line 284 of file economy.cpp.

References _current_company, _local_company, _networking, AddTrackToSignalBuffer(), Subsidy::awarded, Vehicle::cargo_payment, Backup< T >::Change(), ChangeTileOwner(), ChangeWindowOwner(), ClearCargoDeliveryMonitoring(), ClearCargoPickupMonitoring(), ClrBit(), CMD_SELL_SHARE_IN_COMPANY, Vehicle::colourmap, Goal::company, GroupStatistics::CountEngine(), GroupStatistics::CountVehicle(), DC_BANKRUPT, DC_EXEC, DoCommand(), Town::exclusive_counter, Town::exclusivity, FOR_ALL_VEHICLES, FOR_ALL_WAYPOINTS, Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_company_pool >::Get(), GetTrackBits(), HasBit(), HasSignalOnTrack(), HasSignals(), Town::have_ratings, Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, INVALID_OWNER, Vehicle::InvalidateNewGRFCache(), IsCompanyBuildableVehicleType(), Vehicle::IsEngineCountable(), IsLevelCrossingTile(), Vehicle::IsPrimaryVehicle(), IsTileOwner(), IsTileType(), MapSize(), MarkWholeScreenDirty(), max(), MP_RAILWAY, NetworkClientsToSpectators(), FreeUnitIDGenerator::NextID(), BaseStation::owner, CargoPayment::owner, Group::owner, Vehicle::owner, OWNER_NONE, Vehicle::Previous(), Town::ratings, RebuildSubsidisedSourceAndDestinationCache(), RemoveAllEngineReplacementForCompany(), RemoveFirstTrack(), Backup< T >::Restore(), SetBit(), SetLocalCompany(), CompanyProperties::share_owners, SubtractMoneyFromCompany(), TRACK_BIT_NONE, BaseVehicle::type, Vehicle::unitnumber, GroupStatistics::UpdateAutoreplace(), UpdateLevelCrossing(), UpdateSignalsInBuffer(), VEH_AIRCRAFT, VEH_ROAD, VEH_SHIP, and VEH_TRAIN.

Referenced by CmdCompanyCtrl(), and ResetLandscapeConfirmationCallback().

CommandCost CmdBuyCompany ( TileIndex  tile,
DoCommandFlag  flags,
uint32  p1,
uint32  p2,
const char *  text 
)

Buy up another company.

When a competing company is gone bankrupt you get the chance to purchase that company.

Todo:
currently this only works for AI companies
Parameters:
tile unused
flags type of operation
p1 company to buy up
p2 unused
text unused
Returns:
the cost of this operation or an error

Definition at line 1898 of file economy.cpp.

References _current_company, _local_company, _networking, CompanyProperties::bankrupt_asked, CMD_ERROR, DC_EXEC, EXPENSES_OTHER, Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_company_pool >::GetIfValid(), HasBit(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, and MayCompanyTakeOver().

CommandCost CmdBuyShareInCompany ( TileIndex  tile,
DoCommandFlag  flags,
uint32  p1,
uint32  p2,
const char *  text 
)
CommandCost CmdSellShareInCompany ( TileIndex  tile,
DoCommandFlag  flags,
uint32  p1,
uint32  p2,
const char *  text 
)

Sell shares in an opposing company.

Parameters:
tile unused
flags type of operation
p1 company to sell the shares from
p2 unused
text unused
Returns:
the cost of this operation or an error

Definition at line 1857 of file economy.cpp.

References _current_company, _settings_game, EconomySettings::allow_shares, CalculateCompanyValue(), CMD_ERROR, CompanyAdminUpdate(), DC_BANKRUPT, DC_EXEC, GameSettings::economy, EXPENSES_OTHER, Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_company_pool >::GetIfValid(), InvalidateWindowData(), CompanyProperties::share_owners, and WC_COMPANY.

static void CompaniesGenStatistics (  )  [static]
static void CompaniesPayInterest (  )  [static]
static void CompanyCheckBankrupt ( Company c  )  [static]
static Money DeliverGoods ( int  num_pieces,
CargoID  cargo_type,
StationID  dest,
TileIndex  source_tile,
byte  days_in_transit,
Company company,
SourceType  src_type,
SourceID  src 
) [static]

Delivers goods to industries/towns and calculates the payment.

Parameters:
num_pieces amount of cargo delivered
cargo_type the type of cargo that is delivered
dest Station the cargo has been unloaded
source_tile The origin of the cargo for distance calculation
days_in_transit Travel time
company The company delivering the cargo
src_type Type of source of cargo (industry, town, headquarters)
src Index of source of cargo
Returns:
Revenue for delivering cargo
Note:
The cargo is just added to the stockpile of the industry. It is due to the caller to trigger the industry's production machinery

Definition at line 1048 of file economy.cpp.

References _settings_game, GoodsEntry::acceptance_pickup, AddCargoDelivery(), Station::always_accepted, CheckSubsidised(), CompanyProperties::cur_economy, CompanyEconomyEntry::delivered_cargo, DeliverGoodsToIndustry(), GameSettings::difficulty, DistanceManhattan(), GoodsEntry::GES_ACCEPTED_BIGTICK, GoodsEntry::GES_CURRENT_MONTH, GoodsEntry::GES_EVER_ACCEPTED, CargoSpec::Get(), SpecializedStation< Station, false >::Get(), Station::goods, HasBit(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, TransportedCargoStat< Tstorage >::new_act, Town::received, SetBit(), ST_INDUSTRY, DifficultySettings::subsidy_multiplier, BaseStation::town, CargoSpec::town_effect, and BaseStation::xy.

Referenced by CargoPayment::PayFinalDelivery().

static uint DeliverGoodsToIndustry ( const Station st,
CargoID  cargo_type,
uint  num_pieces,
IndustryID  source 
) [static]

Transfer goods from station to industry.

All cargo is delivered to the nearest (Manhattan) industry to the station sign, which is inside the acceptance rectangle and actually accepts the cargo.

Parameters:
st The station that accepted the cargo
cargo_type Type of cargo delivered
num_pieces Amount of cargo delivered
source The source of the cargo
Returns:
actually accepted pieces of cargo

Definition at line 998 of file economy.cpp.

References Industry::accepts_cargo, SmallVector< T, S >::Include(), Industry::incoming_cargo_waiting, Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, Station::industries_near, IndustryTemporarilyRefusesCargo(), SmallVector< T, S >::Length(), lengthof, and min().

Referenced by DeliverGoods().

static byte GetLoadAmount ( Vehicle v  )  [static]

Gets the amount of cargo the given vehicle can load in the current tick.

This is only about loading speed. The free capacity is ignored.

Parameters:
v Vehicle to be queried.
Returns:
Amount of cargo the vehicle can load at once.

Definition at line 1252 of file economy.cpp.

References _settings_game, CALLBACK_FAILED, EngineInfo::callback_mask, CBID_VEHICLE_LOAD_AMOUNT, CBM_VEHICLE_LOAD_AMOUNT, CeilDiv(), Vehicle::engine_type, ErrorUnknownCallbackResult(), SpecializedVehicle< Aircraft, VEH_AIRCRAFT >::From(), GB(), Vehicle::GetEngine(), Engine::GetGRF(), Engine::GetGRFID(), GetVehicleCallback(), OrderSettings::gradual_loading, HasBit(), Aircraft::IsNormalAircraft(), GameSettings::order, PROP_VEHICLE_LOAD_AMOUNT, BaseVehicle::type, and VEH_AIRCRAFT.

Referenced by LoadUnloadVehicle().

Money GetPrice ( Price  index,
uint  cost_factor,
const GRFFile grf_file,
int  shift 
)

Determine a certain price.

Parameters:
index Price base
cost_factor Price factor
grf_file NewGRF to use local price multipliers from.
shift Extra bit shifting after the computation
Returns:
Price

Definition at line 922 of file economy.cpp.

References GRFFile::price_base_multipliers.

Referenced by ObjectSpec::GetBuildCost(), ObjectSpec::GetClearCost(), Engine::GetCost(), GetRefitCost(), Train::GetRunningCost(), Ship::GetRunningCost(), RoadVehicle::GetRunningCost(), Engine::GetRunningCost(), and Aircraft::GetRunningCost().

static bool IsArticulatedVehicleEmpty ( Vehicle v  )  [static]

Checks whether an articulated vehicle is empty.

Parameters:
v Vehicle
Returns:
true if all parts are empty.

Definition at line 1333 of file economy.cpp.

References Vehicle::cargo, Vehicle::GetFirstEnginePart(), Vehicle::GetNextArticulatedPart(), Vehicle::HasArticulatedPart(), and VehicleCargoList::TotalCount().

Referenced by LoadUnloadVehicle().

void LoadUnloadStation ( Station st  ) 

Load/unload the vehicles in this station according to the order they entered.

Parameters:
st the station to do the loading/unloading for

Definition at line 1705 of file economy.cpp.

References SmallVector< T, S >::Begin(), SmallVector< T, S >::Clear(), SmallVector< T, S >::End(), Vehicle::load_unload_ticks, LoadUnloadVehicle(), TriggerIndustryProduction(), Vehicle::vehstatus, VS_CRASHED, and VS_STOPPED.

static void LoadUnloadVehicle ( Vehicle front  )  [static]

Loads/unload the vehicle if possible.

Parameters:
front the vehicle to be (un)loaded

Definition at line 1348 of file economy.cpp.

References _cur_year, _current_company, _local_company, _returned_refit_capacity, _settings_client, _settings_game, AAT_STATION_CARGO_TAKEN, GoodsEntry::acceptance_pickup, StationCargoList::AvailableCount(), Vehicle::build_year, VehicleCache::cached_max_speed, GroundVehicleCache::cached_total_length, CalcPercentVehicleFilled(), Vehicle::cargo, GoodsEntry::cargo, Vehicle::cargo_cap, Vehicle::cargo_payment, Vehicle::cargo_type, CC_PASSENGERS, ClrBit(), COMPANY_SPECTATOR, CT_AUTO_REFIT, CT_NO_REFIT, Vehicle::cur_speed, Vehicle::current_order, BaseConsist::current_order_time, DC_EXEC, DC_QUERY_COST, DoCommand(), Vehicle::engine_type, Vehicle::fill_percent_te_id, SpecializedVehicle< Aircraft, VEH_AIRCRAFT >::From(), GoodsEntry::GES_ACCEPTANCE, SpecializedStation< Station, false >::Get(), CommandCost::GetCost(), Vehicle::GetGroundVehicleCache(), GetLoadAmount(), Order::GetLoadType(), Vehicle::GetNextArticulatedPart(), Vehicle::GetNextStoppingStation(), Station::GetPlatformLength(), Order::GetRefitCargo(), GetStationIndex(), Order::GetUnloadType(), GetWindowClassForVehicleType(), Station::goods, OrderSettings::gradual_loading, ClientSettings::gui, Vehicle::HasArticulatedPart(), HasBit(), StationCargoList::HasCargoFor(), OrderSettings::improved_load, Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, IsArticulatedVehicleEmpty(), IsCargoInClass(), Aircraft::IsNormalAircraft(), Order::IsRefit(), IsTileType(), Order::IsType(), GoodsEntry::last_age, GoodsEntry::last_speed, Vehicle::last_station_visited, BaseConsist::lateness_counter, StationCargoList::Load(), Vehicle::load_unload_ticks, GUISettings::loading_indicators, Vehicle::MarkDirty(), Station::MarkTilesDirty(), max(), min(), MP_STATION, CargoList< VehicleCargoList, CargoPacketList >::MTA_DELIVER, CargoList< VehicleCargoList, CargoPacketList >::MTA_LOAD, CargoList< VehicleCargoList, CargoPacketList >::MTA_TRANSFER, Vehicle::Next(), OLFB_NO_LOAD, GameSettings::order, OUFB_TRANSFER, Vehicle::owner, Vehicle::Previous(), Vehicle::profit_this_year, Vehicle::RefreshNextHopsStats(), VehicleCargoList::RemainingCount(), StationCargoList::Reserve(), ReserveConsist(), Backup< T >::Restore(), SAT_CARGO_TAKEN, SAT_TRAIN_LOADS, SB(), SetBit(), CargoPayment::SetCargo(), SetWindowDirty(), ShowFillingPercent(), SRT_CARGO_TAKEN, SRT_TRAIN_LOADS, VehicleCargoList::StoredCount(), CommandCost::Succeeded(), Vehicle::tile, TILE_SIZE, GoodsEntry::time_since_pickup, StationCargoList::TotalCount(), VehicleCargoList::TotalCount(), TriggerStationRandomisation(), BaseVehicle::type, UpdateFillingPercent(), Vehicle::vcache, VEH_AIRCRAFT, VEH_ROAD, VEH_SHIP, VEH_TRAIN, BaseConsist::vehicle_flags, VF_CARGO_UNLOADING, VF_LOADING_FINISHED, VF_STOP_LOADING, Order::wait_time, WC_STATION_VIEW, WC_VEHICLE_DETAILS, Vehicle::x_pos, BaseStation::xy, Vehicle::y_pos, and Vehicle::z_pos.

Referenced by LoadUnloadStation().

void PrepareUnload ( Vehicle front_v  ) 
static void ReserveConsist ( Station st,
Vehicle u,
CargoArray consist_capleft,
StationID  next_station 
) [static]

Reserves cargo if the full load order and improved_load is set or if the current order allows autorefit.

Parameters:
st Station where the consist is loading at the moment.
u Front of the loading vehicle consist.
consist_capleft If given, save free capacities after reserving there.
next_station Station the vehicle will stop at next.

Definition at line 1289 of file economy.cpp.

References GoodsEntry::cargo, Vehicle::cargo, Vehicle::cargo_cap, Vehicle::cargo_type, Station::goods, HasBit(), Vehicle::Next(), VehicleCargoList::RemainingCount(), StationCargoList::Reserve(), SetBit(), and BaseStation::xy.

Referenced by LoadUnloadVehicle().

void SetPriceBaseMultiplier ( Price  price,
int  factor 
)

Change a price base by the given factor.

The price base is altered by factors of two. NewBaseCost = OldBaseCost * 2^n

Parameters:
price Index of price base to change.
factor Amount to change by.

Definition at line 863 of file economy.cpp.

References Clamp(), and MIN_PRICE_MODIFIER.

Referenced by FinalisePriceBaseMultipliers().

void StartupIndustryDailyChanges ( bool  init_counter  ) 

Initialize the variables that will maintain the daily industry change system.

Parameters:
init_counter specifies if the counter is required to be initialized

Definition at line 873 of file economy.cpp.

References Economy::industry_daily_change_counter, Economy::industry_daily_increment, MapLogX(), and MapLogY().

Referenced by Load_ECMY().

static void TriggerIndustryProduction ( Industry i  )  [static]
int UpdateCompanyRatingAndValue ( Company c,
bool  update 
)

Variable Documentation

The industries we've currently brought cargo to.

Definition at line 987 of file economy.cpp.

The actual pool to store cargo payments in.

Initial value:
 {
  {     120, 100}, 
  {      80, 100}, 
  {   10000, 100}, 
  {   50000,  50}, 
  {  100000, 100}, 
  {   40000, 400}, 
  {       8,  50}, 
  {10000000,  50}, 
  {  250000,  50}, 
  {       0,   0}  
}

Score info, values used for computing the detailed performance rating.

Definition at line 80 of file economy.cpp.

Referenced by PerformanceRatingDetailWindow::DrawWidget().