OpenTTD Source  20241124-master-g9399a92a4f
industry_cmd.cpp File Reference

Handling of industry tiles. More...

#include "stdafx.h"
#include "clear_map.h"
#include "industry.h"
#include "station_base.h"
#include "landscape.h"
#include "viewport_func.h"
#include "command_func.h"
#include "town.h"
#include "news_func.h"
#include "cheat_type.h"
#include "company_base.h"
#include "genworld.h"
#include "tree_map.h"
#include "newgrf_cargo.h"
#include "newgrf_debug.h"
#include "newgrf_industrytiles.h"
#include "autoslope.h"
#include "water.h"
#include "strings_internal.h"
#include "window_func.h"
#include "vehicle_func.h"
#include "sound_func.h"
#include "animated_tile_func.h"
#include "effectvehicle_func.h"
#include "effectvehicle_base.h"
#include "ai/ai.hpp"
#include "core/pool_func.hpp"
#include "subsidy_func.h"
#include "core/backup_type.hpp"
#include "object_base.h"
#include "game/game.hpp"
#include "error.h"
#include "string_func.h"
#include "industry_cmd.h"
#include "landscape_cmd.h"
#include "terraform_cmd.h"
#include "timer/timer.h"
#include "timer/timer_game_calendar.h"
#include "timer/timer_game_economy.h"
#include "timer/timer_game_tick.h"
#include "table/strings.h"
#include "table/industry_land.h"
#include "table/build_industry.h"
#include "safeguards.h"

Go to the source code of this file.

Typedefs

typedef void IndustryDrawTileProc(const TileInfo *ti)
 
typedef CommandCost CheckNewIndustryProc(TileIndex tile)
 Industrytype check function signature. More...
 

Functions

void ShowIndustryViewWindow (int industry)
 
void BuildOilRig (TileIndex tile)
 
static int WhoCanServiceIndustry (Industry *ind)
 Compute who can service the industry. More...
 
void ResetIndustries ()
 This function initialize the spec arrays of both industry and industry tiles. More...
 
IndustryType GetIndustryType (Tile tile)
 Retrieve the type for this industry. More...
 
const IndustrySpecGetIndustrySpec (IndustryType thistype)
 Accessor for array _industry_specs. More...
 
const IndustryTileSpecGetIndustryTileSpec (IndustryGfx gfx)
 Accessor for array _industry_tile_specs. More...
 
static void IndustryDrawSugarMine (const TileInfo *ti)
 
static void IndustryDrawToffeeQuarry (const TileInfo *ti)
 
static void IndustryDrawBubbleGenerator (const TileInfo *ti)
 
static void IndustryDrawToyFactory (const TileInfo *ti)
 
static void IndustryDrawCoalPlantSparks (const TileInfo *ti)
 
static void DrawTile_Industry (TileInfo *ti)
 
static int GetSlopePixelZ_Industry (TileIndex tile, uint, uint, bool)
 
static Foundation GetFoundation_Industry (TileIndex tile, Slope tileh)
 
static void AddAcceptedCargo_Industry (TileIndex tile, CargoArray &acceptance, CargoTypes &always_accepted)
 
static void GetTileDesc_Industry (TileIndex tile, TileDesc *td)
 
static CommandCost ClearTile_Industry (TileIndex tile, DoCommandFlag flags)
 
static bool TransportIndustryGoods (TileIndex tile)
 Move produced cargo from industry to nearby stations. More...
 
static void AnimateSugarSieve (TileIndex tile)
 
static void AnimateToffeeQuarry (TileIndex tile)
 
static void AnimateBubbleCatcher (TileIndex tile)
 
static void AnimatePowerPlantSparks (TileIndex tile)
 
static void AnimateToyFactory (TileIndex tile)
 
static void AnimatePlasticFountain (TileIndex tile, IndustryGfx gfx)
 
static void AnimateOilWell (TileIndex tile, IndustryGfx gfx)
 
static void AnimateMineTower (TileIndex tile)
 
static void AnimateTile_Industry (TileIndex tile)
 
static void CreateChimneySmoke (TileIndex tile)
 
static void MakeIndustryTileBigger (TileIndex tile)
 
static void TileLoopIndustry_BubbleGenerator (TileIndex tile)
 
static void TileLoop_Industry (TileIndex tile)
 
static bool ClickTile_Industry (TileIndex tile)
 
static TrackStatus GetTileTrackStatus_Industry (TileIndex, TransportType, uint, DiagDirection)
 
static void ChangeTileOwner_Industry (TileIndex tile, Owner old_owner, Owner new_owner)
 
bool IsTileForestIndustry (TileIndex tile)
 Check whether the tile is a forest. More...
 
static bool IsSuitableForFarmField (TileIndex tile, bool allow_fields)
 Check whether the tile can be replaced by a farm field. More...
 
static void SetupFarmFieldFence (TileIndex tile, int size, uint8_t type, DiagDirection side)
 Build farm field fence. More...
 
static void PlantFarmField (TileIndex tile, IndustryID industry)
 
void PlantRandomFarmField (const Industry *i)
 
static bool SearchLumberMillTrees (TileIndex tile, void *)
 Search callback function for ChopLumberMillTrees. More...
 
static void ChopLumberMillTrees (Industry *i)
 Perform a circular search around the Lumber Mill in order to find trees to cut. More...
 
static void ProduceIndustryGoodsHelper (Industry *i, bool scale)
 Helper for ProduceIndustryGoods that scales and produces cargos. More...
 
static void ProduceIndustryGoods (Industry *i)
 
void OnTick_Industry ()
 
static CommandCost CheckNewIndustry_NULL (TileIndex)
 Check the conditions of CHECK_NOTHING (Always succeeds). More...
 
static CommandCost CheckNewIndustry_Forest (TileIndex tile)
 Check the conditions of CHECK_FOREST (Industry should be build above snow-line in arctic climate). More...
 
static bool CheckScaledDistanceFromEdge (TileIndex tile, uint maxdist)
 Check if a tile is within a distance from map edges, scaled by map dimensions independently. More...
 
static CommandCost CheckNewIndustry_OilRefinery (TileIndex tile)
 Check the conditions of CHECK_REFINERY (Industry should be positioned near edge of the map). More...
 
static CommandCost CheckNewIndustry_OilRig (TileIndex tile)
 Check the conditions of CHECK_OIL_RIG (Industries at sea should be positioned near edge of the map). More...
 
static CommandCost CheckNewIndustry_Farm (TileIndex tile)
 Check the conditions of CHECK_FARM (Industry should be below snow-line in arctic). More...
 
static CommandCost CheckNewIndustry_Plantation (TileIndex tile)
 Check the conditions of CHECK_PLANTATION (Industry should NOT be in the desert). More...
 
static CommandCost CheckNewIndustry_Water (TileIndex tile)
 Check the conditions of CHECK_WATER (Industry should be in the desert). More...
 
static CommandCost CheckNewIndustry_Lumbermill (TileIndex tile)
 Check the conditions of CHECK_LUMBERMILL (Industry should be in the rain forest). More...
 
static CommandCost CheckNewIndustry_BubbleGen (TileIndex tile)
 Check the conditions of CHECK_BUBBLEGEN (Industry should be in low land). More...
 
static CommandCost FindTownForIndustry (TileIndex tile, IndustryType type, Town **t)
 Find a town for the industry, while checking for multiple industries in the same town. More...
 
bool IsSlopeRefused (Slope current, Slope refused)
 
static CommandCost CheckIfIndustryTilesAreFree (TileIndex tile, const IndustryTileLayout &layout, IndustryType type)
 Are the tiles of the industry free? More...
 
static CommandCost CheckIfIndustryTileSlopes (TileIndex tile, const IndustryTileLayout &layout, size_t layout_index, IndustryType type, uint16_t initial_random_bits, Owner founder, IndustryAvailabilityCallType creation_type, bool *custom_shape_check=nullptr)
 Check slope requirements for industry tiles. More...
 
static CommandCost CheckIfIndustryIsAllowed (TileIndex tile, IndustryType type, const Town *t)
 Is the industry allowed to be built at this place for the town? More...
 
static bool CheckCanTerraformSurroundingTiles (TileIndex tile, uint height, int internal)
 
static bool CheckIfCanLevelIndustryPlatform (TileIndex tile, DoCommandFlag flags, const IndustryTileLayout &layout)
 This function tries to flatten out the land below an industry, without damaging the surroundings too much.
 
static CommandCost CheckIfFarEnoughFromConflictingIndustry (TileIndex tile, IndustryType type)
 Check that the new industry is far enough from conflicting industries. More...
 
static void AdvertiseIndustryOpening (const Industry *ind)
 Advertise about a new industry opening. More...
 
static void PopulateStationsNearby (Industry *ind)
 Populate an industry's list of nearby stations, and if it accepts any cargo, also add the industry to each station's nearby industry list. More...
 
static void DoCreateNewIndustry (Industry *i, TileIndex tile, IndustryType type, const IndustryTileLayout &layout, size_t layout_index, Town *t, Owner founder, uint16_t initial_random_bits)
 Put an industry on the map. More...
 
static CommandCost CreateNewIndustryHelper (TileIndex tile, IndustryType type, DoCommandFlag flags, const IndustrySpec *indspec, size_t layout_index, uint32_t random_var8f, uint16_t random_initial_bits, Owner founder, IndustryAvailabilityCallType creation_type, Industry **ip)
 Helper function for Build/Fund an industry. More...
 
CommandCost CmdBuildIndustry (DoCommandFlag flags, TileIndex tile, IndustryType it, uint32_t first_layout, bool fund, uint32_t seed)
 Build/Fund an industry. More...
 
CommandCost CmdIndustrySetFlags (DoCommandFlag flags, IndustryID ind_id, IndustryControlFlags ctlflags)
 Set industry control flags. More...
 
CommandCost CmdIndustrySetProduction (DoCommandFlag flags, IndustryID ind_id, uint8_t prod_level, bool show_news, const std::string &custom_news)
 Set industry production. More...
 
CommandCost CmdIndustrySetExclusivity (DoCommandFlag flags, IndustryID ind_id, Owner company_id, bool consumer)
 Change exclusive consumer or supplier for the industry. More...
 
CommandCost CmdIndustrySetText (DoCommandFlag flags, IndustryID ind_id, const std::string &text)
 Change additional industry text. More...
 
static IndustryCreateNewIndustry (TileIndex tile, IndustryType type, IndustryAvailabilityCallType creation_type)
 Create a new industry of random layout. More...
 
static uint32_t GetScaledIndustryGenerationProbability (IndustryType it, bool *force_at_least_one)
 Compute the appearance probability for an industry during map creation. More...
 
static uint16_t GetIndustryGamePlayProbability (IndustryType it, uint8_t *min_number)
 Compute the probability for constructing a new industry during game play. More...
 
static uint GetNumberOfIndustries ()
 Get wanted number of industries on the map. More...
 
static IndustryPlaceIndustry (IndustryType type, IndustryAvailabilityCallType creation_type, bool try_hard)
 Try to place the industry in the game. More...
 
static void PlaceInitialIndustry (IndustryType type, bool try_hard)
 Try to build a industry on the map. More...
 
static uint GetCurrentTotalNumberOfIndustries ()
 Get total number of industries existing in the game. More...
 
void GenerateIndustries ()
 This function will create random industries during game creation. More...
 
static void UpdateIndustryStatistics (Industry *i)
 Monthly update of industry statistics. More...
 
void ClearAllIndustryCachedNames ()
 
static bool CheckIndustryCloseDownProtection (IndustryType type)
 Protects an industry from closure if the appropriate flags and conditions are met INDUSTRYBEH_CANCLOSE_LASTINSTANCE must be set (which, by default, it is not) and the count of industries of this type must one (or lower) in order to be protected against closure. More...
 
static void CanCargoServiceIndustry (CargoID cargo, Industry *ind, bool *c_accepts, bool *c_produces)
 Can given cargo type be accepted or produced by the industry? More...
 
static void ReportNewsProductionChangeIndustry (Industry *ind, CargoID type, int percent)
 Report news that industry production has changed significantly. More...
 
static void ChangeIndustryProduction (Industry *i, bool monthly)
 Change industry production or do closure. More...
 
void InitializeIndustries ()
 
void CheckIndustries ()
 Verify whether the generated industries are complete, and warn the user if not.
 
static CommandCost TerraformTile_Industry (TileIndex tile, DoCommandFlag flags, int z_new, Slope tileh_new)
 
void TrimIndustryAcceptedProduced (Industry *ind)
 Remove unused industry accepted/produced slots – entries after the last slot with valid cargo. More...
 

Variables

IndustryPool _industry_pool ("Industry")
 
static uint8_t _industry_sound_ctr
 
static TileIndex _industry_sound_tile
 
IndustrySpec _industry_specs [NUM_INDUSTRYTYPES]
 
IndustryTileSpec _industry_tile_specs [NUM_INDUSTRYTILES]
 
IndustryBuildData _industry_builder
 In-game manager of industries.
 
static IndustryDrawTileProc *const _industry_draw_tile_procs [5]
 
static const uint8_t _plantfarmfield_type [] = {1, 1, 1, 1, 1, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6}
 
bool _ignore_restrictions
 
static CheckNewIndustryProc *const _check_new_industry_procs [CHECK_END]
 Check functions for different types of industry. More...
 
static const uint PERCENT_TRANSPORTED_60 = 153
 
static const uint PERCENT_TRANSPORTED_80 = 204
 
static IntervalTimer< TimerGameEconomy_economy_industries_daily ({TimerGameEconomy::DAY, TimerGameEconomy::Priority::INDUSTRY}, [](auto) { _economy.industry_daily_change_counter+=_economy.industry_daily_increment;uint16_t change_loop=_economy.industry_daily_change_counter >> 16;_economy.industry_daily_change_counter &=0xFFFF;if(change_loop==0) { return;} Backup< CompanyID > cur_company(_current_company, OWNER_NONE);uint perc=3;if((_industry_builder.wanted_inds >> 16) > GetCurrentTotalNumberOfIndustries()) { perc=std::min(9u, perc+(_industry_builder.wanted_inds >> 16) - GetCurrentTotalNumberOfIndustries());} for(uint16_t j=0;j< change_loop;j++) { if(Chance16(perc, 100)) { _industry_builder.TryBuildNewIndustry();} else { Industry *i=Industry::GetRandom();if(i !=nullptr) { ChangeIndustryProduction(i, false);SetWindowDirty(WC_INDUSTRY_VIEW, i->index);} } } cur_company.Restore();InvalidateWindowData(WC_INDUSTRY_DIRECTORY, 0, IDIWD_PRODUCTION_CHANGE);})
 Every economy day handler for the industry changes Taking the original map size of 256*256, the number of random changes was always of just one unit. More...
 
static IntervalTimer< TimerGameEconomy_economy_industries_monthly ({TimerGameEconomy::MONTH, TimerGameEconomy::Priority::INDUSTRY}, [](auto) { Backup< CompanyID > cur_company(_current_company, OWNER_NONE);_industry_builder.EconomyMonthlyLoop();for(Industry *i :Industry::Iterate()) { UpdateIndustryStatistics(i);if(i->prod_level==PRODLEVEL_CLOSURE) { delete i;} else { ChangeIndustryProduction(i, true);SetWindowDirty(WC_INDUSTRY_VIEW, i->index);} } cur_company.Restore();InvalidateWindowData(WC_INDUSTRY_DIRECTORY, 0, IDIWD_PRODUCTION_CHANGE);})
 
const TileTypeProcs _tile_type_industry_procs
 

Detailed Description

Handling of industry tiles.

Definition in file industry_cmd.cpp.

Typedef Documentation

◆ CheckNewIndustryProc

typedef CommandCost CheckNewIndustryProc(TileIndex tile)

Industrytype check function signature.

Parameters
tileTile to check.
Returns
Succeeded or failed command.

Definition at line 1408 of file industry_cmd.cpp.

Function Documentation

◆ AdvertiseIndustryOpening()

static void AdvertiseIndustryOpening ( const Industry ind)
static

◆ CanCargoServiceIndustry()

static void CanCargoServiceIndustry ( CargoID  cargo,
Industry ind,
bool *  c_accepts,
bool *  c_produces 
)
static

Can given cargo type be accepted or produced by the industry?

Parameters
cargoCargo type
indIndustry
*c_acceptsPointer to boolean for acceptance of cargo
*c_producesPointer to boolean for production of cargo
Returns
: *c_accepts is set when industry accepts the cargo type, *c_produces is set when the industry produces the cargo type

Definition at line 2690 of file industry_cmd.cpp.

References IndustryTemporarilyRefusesCargo(), Industry::IsCargoAccepted(), Industry::IsCargoProduced(), and IsValidCargoID().

◆ ChangeIndustryProduction()

static void ChangeIndustryProduction ( Industry i,
bool  monthly 
)
static

Change industry production or do closure.

Parameters
iIndustry for which changes are performed
monthlytrue if it's the monthly call, false if it's the random call

< reinitialize production_rate to match prod_level

Definition at line 2795 of file industry_cmd.cpp.

References IndustrySpec::callback_mask, CBM_IND_MONTHLYPROD_CHANGE, CBM_IND_PRODUCTION_CHANGE, GetIndustrySpec(), HasBit(), Industry::type, and IndustrySpec::UsesOriginalEconomy().

◆ CheckIfFarEnoughFromConflictingIndustry()

static CommandCost CheckIfFarEnoughFromConflictingIndustry ( TileIndex  tile,
IndustryType  type 
)
static

Check that the new industry is far enough from conflicting industries.

Parameters
tileTile to construct the industry.
typeType of the new industry.
Returns
Succeeded or failed command.

Definition at line 1694 of file industry_cmd.cpp.

References IndustrySpec::conflicting, and GetIndustrySpec().

◆ CheckIfIndustryIsAllowed()

static CommandCost CheckIfIndustryIsAllowed ( TileIndex  tile,
IndustryType  type,
const Town t 
)
static

Is the industry allowed to be built at this place for the town?

Parameters
tileTile to construct the industry.
typeType of the industry.
tTown authority that the industry belongs to.
Returns
Succeeded or failed command.

Definition at line 1577 of file industry_cmd.cpp.

References Town::cache, DistanceMax(), GetIndustrySpec(), INDUSTRYBEH_ONLY_NEARTOWN, INDUSTRYBEH_TOWN1200_MORE, TownCache::population, return_cmd_error, and Town::xy.

◆ CheckIfIndustryTilesAreFree()

◆ CheckIfIndustryTileSlopes()

static CommandCost CheckIfIndustryTileSlopes ( TileIndex  tile,
const IndustryTileLayout layout,
size_t  layout_index,
IndustryType  type,
uint16_t  initial_random_bits,
Owner  founder,
IndustryAvailabilityCallType  creation_type,
bool *  custom_shape_check = nullptr 
)
static

Check slope requirements for industry tiles.

Parameters
tilePosition to check.
layoutIndustry tiles table.
layout_indexThe index of the layout to build/fund
typeType of the industry.
initial_random_bitsThe random bits the industry is going to have after construction.
founderIndustry founder
creation_typeThe circumstances the industry is created under.
[out]custom_shape_checkPerform custom check for the site.
Returns
Failed or succeeded command.

Definition at line 1535 of file industry_cmd.cpp.

◆ CheckIndustryCloseDownProtection()

static bool CheckIndustryCloseDownProtection ( IndustryType  type)
static

Protects an industry from closure if the appropriate flags and conditions are met INDUSTRYBEH_CANCLOSE_LASTINSTANCE must be set (which, by default, it is not) and the count of industries of this type must one (or lower) in order to be protected against closure.

Parameters
typeIndustryType been queried
Returns
true if protection is on, false otherwise (except for oil wells)

Definition at line 2672 of file industry_cmd.cpp.

References _settings_game, IndustrySpec::behaviour, GameSettings::game_creation, GetIndustrySpec(), INDUSTRYBEH_DONT_INCR_PROD, and GameCreationSettings::landscape.

◆ CheckNewIndustry_BubbleGen()

static CommandCost CheckNewIndustry_BubbleGen ( TileIndex  tile)
static

Check the conditions of CHECK_BUBBLEGEN (Industry should be in low land).

Parameters
tileTile to perform the checking.
Returns
Succeeded or failed command.

Definition at line 1395 of file industry_cmd.cpp.

References GetTileZ(), and return_cmd_error.

◆ CheckNewIndustry_Farm()

static CommandCost CheckNewIndustry_Farm ( TileIndex  tile)
static

Check the conditions of CHECK_FARM (Industry should be below snow-line in arctic).

Parameters
tileTile to perform the checking.
Returns
Succeeded or failed command.

Definition at line 1341 of file industry_cmd.cpp.

References _settings_game, GameSettings::game_creation, and GameCreationSettings::landscape.

◆ CheckNewIndustry_Forest()

static CommandCost CheckNewIndustry_Forest ( TileIndex  tile)
static

Check the conditions of CHECK_FOREST (Industry should be build above snow-line in arctic climate).

Parameters
tileTile to perform the checking.
Returns
Succeeded or failed command.

Definition at line 1272 of file industry_cmd.cpp.

References _settings_game, GameSettings::game_creation, and GameCreationSettings::landscape.

◆ CheckNewIndustry_Lumbermill()

static CommandCost CheckNewIndustry_Lumbermill ( TileIndex  tile)
static

Check the conditions of CHECK_LUMBERMILL (Industry should be in the rain forest).

Parameters
tileTile to perform the checking.
Returns
Succeeded or failed command.

Definition at line 1382 of file industry_cmd.cpp.

References GetTropicZone(), return_cmd_error, and TROPICZONE_RAINFOREST.

◆ CheckNewIndustry_NULL()

static CommandCost CheckNewIndustry_NULL ( TileIndex  )
static

Check the conditions of CHECK_NOTHING (Always succeeds).

Returns
Succeeded or failed command.

Definition at line 1262 of file industry_cmd.cpp.

◆ CheckNewIndustry_OilRefinery()

static CommandCost CheckNewIndustry_OilRefinery ( TileIndex  tile)
static

Check the conditions of CHECK_REFINERY (Industry should be positioned near edge of the map).

Parameters
tileTile to perform the checking.
Returns
Succeeded or failed command.

Definition at line 1310 of file industry_cmd.cpp.

◆ CheckNewIndustry_OilRig()

static CommandCost CheckNewIndustry_OilRig ( TileIndex  tile)
static

Check the conditions of CHECK_OIL_RIG (Industries at sea should be positioned near edge of the map).

Parameters
tileTile to perform the checking.
Returns
Succeeded or failed command.

Definition at line 1326 of file industry_cmd.cpp.

◆ CheckNewIndustry_Plantation()

static CommandCost CheckNewIndustry_Plantation ( TileIndex  tile)
static

Check the conditions of CHECK_PLANTATION (Industry should NOT be in the desert).

Parameters
tileTile to perform the checking.
Returns
Succeeded or failed command.

Definition at line 1356 of file industry_cmd.cpp.

References GetTropicZone(), return_cmd_error, and TROPICZONE_DESERT.

◆ CheckNewIndustry_Water()

static CommandCost CheckNewIndustry_Water ( TileIndex  tile)
static

Check the conditions of CHECK_WATER (Industry should be in the desert).

Parameters
tileTile to perform the checking.
Returns
Succeeded or failed command.

Definition at line 1369 of file industry_cmd.cpp.

References GetTropicZone(), return_cmd_error, and TROPICZONE_DESERT.

◆ CheckScaledDistanceFromEdge()

static bool CheckScaledDistanceFromEdge ( TileIndex  tile,
uint  maxdist 
)
static

Check if a tile is within a distance from map edges, scaled by map dimensions independently.

Each dimension is checked independently, and dimensions smaller than 256 are not scaled.

Parameters
tileWhich tile to check distance of.
maxdistNormal distance on a 256x256 map.
Returns
True if the tile is near the map edge.

Definition at line 1289 of file industry_cmd.cpp.

References DIAGDIR_NE, DIAGDIR_NW, DIAGDIR_SE, DIAGDIR_SW, DistanceFromEdgeDir(), Map::SizeX(), and Map::SizeY().

◆ ChopLumberMillTrees()

static void ChopLumberMillTrees ( Industry i)
static

Perform a circular search around the Lumber Mill in order to find trees to cut.

Parameters
iindustry

Definition at line 1129 of file industry_cmd.cpp.

References CircularTileSearch(), IsIndustryCompleted(), IsValidCargoID(), Industry::location, Industry::produced, ScaleByCargoScale(), SearchLumberMillTrees(), OrthogonalTileArea::tile, and Industry::TileBelongsToIndustry().

◆ CmdBuildIndustry()

CommandCost CmdBuildIndustry ( DoCommandFlag  flags,
TileIndex  tile,
IndustryType  it,
uint32_t  first_layout,
bool  fund,
uint32_t  seed 
)

Build/Fund an industry.

Parameters
flagsof operations to conduct
tiletile where industry is built
itindustry type see build_industry.h and see industry.h
first_layoutfirst layout to try
fundfalse = prospect, true = fund (only valid if current company is DEITY)
seedseed to use for desyncfree randomisations
Returns
the cost of this operation or an error

Definition at line 2048 of file industry_cmd.cpp.

References CMD_ERROR, IndustrySpec::enabled, GetIndustrySpec(), IndustrySpec::layouts, and NUM_INDUSTRYTYPES.

◆ CmdIndustrySetExclusivity()

CommandCost CmdIndustrySetExclusivity ( DoCommandFlag  flags,
IndustryID  ind_id,
Owner  company_id,
bool  consumer 
)

Change exclusive consumer or supplier for the industry.

Parameters
flagsType of operation.
ind_idIndustryID
company_idCompanyID to set or INVALID_OWNER (available to everyone) or OWNER_NONE (neutral stations only) or OWNER_DEITY (no one)
consumerSet exclusive consumer if true, supplier if false.
Returns
Empty cost or an error.

Definition at line 2218 of file industry_cmd.cpp.

References _current_company, CMD_ERROR, DC_EXEC, Industry::exclusive_consumer, Industry::exclusive_supplier, Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_industry_pool >::GetIfValid(), INVALID_OWNER, Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_company_pool >::IsValidID(), OWNER_DEITY, and OWNER_NONE.

◆ CmdIndustrySetFlags()

CommandCost CmdIndustrySetFlags ( DoCommandFlag  flags,
IndustryID  ind_id,
IndustryControlFlags  ctlflags 
)

Set industry control flags.

Parameters
flagsType of operation.
ind_idIndustryID
ctlflagsIndustryControlFlags
Returns
Empty cost or an error.

Definition at line 2140 of file industry_cmd.cpp.

References _current_company, CMD_ERROR, Industry::ctlflags, DC_EXEC, Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_industry_pool >::GetIfValid(), INDCTL_MASK, and OWNER_DEITY.

◆ CmdIndustrySetProduction()

CommandCost CmdIndustrySetProduction ( DoCommandFlag  flags,
IndustryID  ind_id,
uint8_t  prod_level,
bool  show_news,
const std::string &  custom_news 
)

◆ CmdIndustrySetText()

CommandCost CmdIndustrySetText ( DoCommandFlag  flags,
IndustryID  ind_id,
const std::string &  text 
)

◆ CreateNewIndustry()

static Industry* CreateNewIndustry ( TileIndex  tile,
IndustryType  type,
IndustryAvailabilityCallType  creation_type 
)
static

Create a new industry of random layout.

Parameters
tileThe location to build the industry.
typeThe industry type to build.
creation_typeThe circumstances the industry is created under.
Returns
the created industry or nullptr if it failed.

Definition at line 2270 of file industry_cmd.cpp.

References GetIndustrySpec().

Referenced by PlaceIndustry().

◆ CreateNewIndustryHelper()

static CommandCost CreateNewIndustryHelper ( TileIndex  tile,
IndustryType  type,
DoCommandFlag  flags,
const IndustrySpec indspec,
size_t  layout_index,
uint32_t  random_var8f,
uint16_t  random_initial_bits,
Owner  founder,
IndustryAvailabilityCallType  creation_type,
Industry **  ip 
)
static

Helper function for Build/Fund an industry.

Parameters
tiletile where industry is built
typeof industry to build
flagsof operations to conduct
indspecpointer to industry specifications
layout_indexthe index of the itsepc to build/fund
random_var8frandom seed (possibly) used by industries
random_initial_bitsThe random bits the industry is going to have after construction.
founderFounder of the industry
creation_typeThe circumstances the industry is created under.
[out]ipPointer to store newly created industry.
Returns
Succeeded or failed command.
Postcondition
*ip contains the newly created industry if all checks are successful and the flags request actual creation, else it contains nullptr afterwards.

Definition at line 1984 of file industry_cmd.cpp.

◆ DoCreateNewIndustry()

static void DoCreateNewIndustry ( Industry i,
TileIndex  tile,
IndustryType  type,
const IndustryTileLayout layout,
size_t  layout_index,
Town t,
Owner  founder,
uint16_t  initial_random_bits 
)
static

Put an industry on the map.

Parameters
iJust allocated poolitem, mostly empty.
tileNorth tile of the industry.
typeType of the industry.
layoutIndustrylayout to build.
layout_indexNumber of the industry layout.
tNearest town.
founderFounder of the industry; OWNER_NONE in case of random construction.
initial_random_bitsRandom bits for the industry.

Definition at line 1764 of file industry_cmd.cpp.

◆ FindTownForIndustry()

static CommandCost FindTownForIndustry ( TileIndex  tile,
IndustryType  type,
Town **  t 
)
static

Find a town for the industry, while checking for multiple industries in the same town.

Parameters
tilePosition of the industry to build.
typeIndustry type.
[out]tPointer to return town for the new industry, nullptr is written if no good town can be found.
Returns
Succeeded or failed command.
Precondition
*t != nullptr
Postcondition
*t points to a town on success, and nullptr on failure.

Definition at line 1433 of file industry_cmd.cpp.

References _settings_game, ClosestTownFromTile(), GameSettings::economy, Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_industry_pool >::Get(), Industry::industries, EconomySettings::multiple_industry_per_town, and return_cmd_error.

◆ GenerateIndustries()

void GenerateIndustries ( )

This function will create random industries during game creation.

It will scale the amount of industries by mapsize and difficulty level.

Definition at line 2445 of file industry_cmd.cpp.

◆ GetCurrentTotalNumberOfIndustries()

static uint GetCurrentTotalNumberOfIndustries ( )
static

Get total number of industries existing in the game.

Returns
Number of industries currently in the game.

Definition at line 2397 of file industry_cmd.cpp.

References Industry::industries.

Referenced by IndustryBuildData::EconomyMonthlyLoop(), and IndustryBuildData::Reset().

◆ GetIndustryGamePlayProbability()

static uint16_t GetIndustryGamePlayProbability ( IndustryType  it,
uint8_t *  min_number 
)
static

Compute the probability for constructing a new industry during game play.

Parameters
itIndustry type to compute.
[out]min_numberMinimal number of industries that should exist at the map.
Returns
Relative probability for the industry to appear.

Definition at line 2315 of file industry_cmd.cpp.

Referenced by IndustryTypeBuildData::GetIndustryTypeData().

◆ GetIndustrySpec()

const IndustrySpec* GetIndustrySpec ( IndustryType  thistype)

Accessor for array _industry_specs.

Array of industries data.

This will ensure at once : proper access and not allowing modifications of it.

Parameters
thistypeof industry (which is the index in _industry_specs)
Precondition
thistype < NUM_INDUSTRYTYPES
Returns
a pointer to the corresponding industry spec

Definition at line 123 of file industry_cmd.cpp.

References NUM_INDUSTRYTYPES.

Referenced by AdvertiseIndustryOpening(), BuildIndustriesLegend(), ChangeIndustryProduction(), CheckIfFarEnoughFromConflictingIndustry(), CheckIfIndustryIsAllowed(), CheckIfIndustryTilesAreFree(), CheckIndustries(), CheckIndustryCloseDownProtection(), CmdBuildIndustry(), CmdIndustrySetProduction(), CMSAMine(), IndustryCargoesWindow::ComputeCargoDisplay(), IndustryCargoesWindow::ComputeIndustryDisplay(), IndustryCargoesWindow::CountMatchingAcceptingIndustries(), IndustryCargoesWindow::CountMatchingProducingIndustries(), CreateNewIndustry(), Disaster_Helicopter_Init(), IndustryViewWindow::DrawInfo(), FindNearIndustryName(), GetCountAndDistanceOfClosestInstance(), IndustriesResolverObject::GetDebugID(), GetGrffile(), NIHIndustry::GetGRFID(), GetIndustryProbabilityCallback(), IndustryDirectoryWindow::GetIndustryString(), GetScaledIndustryGenerationProbability(), NIHIndustry::GetSpec(), IndustriesScopeResolver::GetVariable(), IndustriesResolverObject::IndustriesResolverObject(), IndustryProductionCallback(), IndustryTemporarilyRefusesCargo(), IndustryTypeNameSorter(), NIHIndustry::IsInspectable(), IsTileForestIndustry(), IndustryCargoesWindow::OnInit(), Industry::RecomputeProductionMultipliers(), ShowIndustryCargoesWindow(), TransportIndustryGoods(), and TriggerIndustryProduction().

◆ GetIndustryTileSpec()

const IndustryTileSpec* GetIndustryTileSpec ( IndustryGfx  gfx)

Accessor for array _industry_tile_specs.

Array of industry tiles data.

This will ensure at once : proper access and not allowing modifications of it.

Parameters
gfxof industrytile (which is the index in _industry_tile_specs)
Precondition
gfx < INVALID_INDUSTRYTILE
Returns
a pointer to the corresponding industrytile spec

Definition at line 137 of file industry_cmd.cpp.

References INVALID_INDUSTRYTILE.

Referenced by CheckIfIndustryTilesAreFree(), DoTriggerIndustryTile(), IndustryTileResolverObject::GetDebugID(), NIHIndustryTile::GetGRFID(), GetIndTileGrffile(), GetIndustryIDAtOffset(), NIHIndustryTile::GetSpec(), IndustryTileResolverObject::IndustryTileResolverObject(), and NIHIndustryTile::IsInspectable().

◆ GetIndustryType()

IndustryType GetIndustryType ( Tile  tile)

Retrieve the type for this industry.

Although it is accessed by a tile, it will return the general type of industry, and not the sprite index as would do GetIndustryGfx.

Parameters
tilethat is queried
Precondition
IsTileType(tile, MP_INDUSTRY)
Returns
general type for this industry, as defined in industry.h

Definition at line 106 of file industry_cmd.cpp.

References Industry::GetByTile(), IsTileType(), MP_INDUSTRY, and Industry::type.

Referenced by FindNearIndustryName().

◆ GetNumberOfIndustries()

static uint GetNumberOfIndustries ( )
static

Get wanted number of industries on the map.

Returns
Wanted number of industries at the map.

Definition at line 2339 of file industry_cmd.cpp.

◆ GetScaledIndustryGenerationProbability()

static uint32_t GetScaledIndustryGenerationProbability ( IndustryType  it,
bool *  force_at_least_one 
)
static

Compute the appearance probability for an industry during map creation.

Parameters
itIndustry type to compute.
[out]force_at_least_oneReturns whether at least one instance should be forced on map creation.
Returns
Relative probability for the industry to appear.

Definition at line 2289 of file industry_cmd.cpp.

References _settings_game, IndustrySpec::appear_creation, IndustrySpec::enabled, GameSettings::game_creation, GetIndustrySpec(), GameCreationSettings::landscape, and IndustrySpec::layouts.

Referenced by CheckIndustries().

◆ IsSuitableForFarmField()

static bool IsSuitableForFarmField ( TileIndex  tile,
bool  allow_fields 
)
static

Check whether the tile can be replaced by a farm field.

Parameters
tilethe tile to investigate.
allow_fieldsif true, the method will return true even if the tile is a farm tile, otherwise the tile may not be a farm tile
Returns
true if the tile can become a farm field

Definition at line 1000 of file industry_cmd.cpp.

References CLEAR_DESERT, CLEAR_FIELDS, CLEAR_SNOW, GetTileType(), GetTreeGround(), IsClearGround(), MP_CLEAR, MP_TREES, and TREE_GROUND_SHORE.

◆ IsTileForestIndustry()

bool IsTileForestIndustry ( TileIndex  tile)

Check whether the tile is a forest.

Parameters
tilethe tile to investigate.
Returns
true if and only if the tile is a forest

Definition at line 977 of file industry_cmd.cpp.

References Industry::GetByTile(), GetIndustrySpec(), INDUSTRYLIFE_ORGANIC, IsTileType(), IndustrySpec::life_type, MP_INDUSTRY, Industry::produced, and Industry::type.

◆ PlaceIndustry()

static Industry* PlaceIndustry ( IndustryType  type,
IndustryAvailabilityCallType  creation_type,
bool  try_hard 
)
static

Try to place the industry in the game.

Since there is no feedback why placement fails, there is no other option than to try a few times before concluding it does not work.

Parameters
typeIndustry type of the desired industry.
try_hardTry very hard to find a place. (Used to place at least one industry per type.)
Returns
Pointer to created industry, or nullptr if creation failed.

Definition at line 2368 of file industry_cmd.cpp.

References CreateNewIndustry(), and RandomTile.

Referenced by PlaceInitialIndustry(), and IndustryBuildData::TryBuildNewIndustry().

◆ PlaceInitialIndustry()

static void PlaceInitialIndustry ( IndustryType  type,
bool  try_hard 
)
static

Try to build a industry on the map.

Parameters
typeIndustryType of the desired industry
try_hardTry very hard to find a place. (Used to place at least one industry per type)

Definition at line 2383 of file industry_cmd.cpp.

References _current_company, GWP_INDUSTRY, IACT_MAPGENERATION, IncreaseGeneratingWorldProgress(), OWNER_NONE, PlaceIndustry(), and Backup< T >::Restore().

◆ PopulateStationsNearby()

static void PopulateStationsNearby ( Industry ind)
static

Populate an industry's list of nearby stations, and if it accepts any cargo, also add the industry to each station's nearby industry list.

Parameters
indIndustry

Definition at line 1735 of file industry_cmd.cpp.

References _settings_game, ForAllStationsAroundTiles(), Station::industries_near, Industry::location, Industry::neutral_station, StationSettings::serve_neutral_industries, GameSettings::station, and Industry::stations_near.

◆ ProduceIndustryGoodsHelper()

static void ProduceIndustryGoodsHelper ( Industry i,
bool  scale 
)
static

Helper for ProduceIndustryGoods that scales and produces cargos.

Parameters
iThe industry
scaleShould we scale production of this cargo directly?

Definition at line 1153 of file industry_cmd.cpp.

References IsValidCargoID(), and Industry::produced.

◆ ReportNewsProductionChangeIndustry()

static void ReportNewsProductionChangeIndustry ( Industry ind,
CargoID  type,
int  percent 
)
static

Report news that industry production has changed significantly.

Parameters
indIndustry with changed production
typeCargo type that has changed
percentPercentage of change (>0 means increase, <0 means decrease)

Definition at line 2767 of file industry_cmd.cpp.

References NT_INDUSTRY_COMPANY, NT_INDUSTRY_NOBODY, NT_INDUSTRY_OTHER, and WhoCanServiceIndustry().

◆ ResetIndustries()

void ResetIndustries ( )

This function initialize the spec arrays of both industry and industry tiles.

It adjusts the enabling of the industry too, based on climate availability. This will allow for clearer testings

Definition at line 80 of file industry_cmd.cpp.

◆ SearchLumberMillTrees()

static bool SearchLumberMillTrees ( TileIndex  tile,
void *   
)
static

Search callback function for ChopLumberMillTrees.

Parameters
tileto test
Returns
the result of the test

Definition at line 1106 of file industry_cmd.cpp.

References _current_company, GetTreeGrowth(), Grown, IsTileType(), MP_TREES, and OWNER_NONE.

Referenced by ChopLumberMillTrees().

◆ SetupFarmFieldFence()

static void SetupFarmFieldFence ( TileIndex  tile,
int  size,
uint8_t  type,
DiagDirection  side 
)
static

Build farm field fence.

Parameters
tilethe tile to position the fence on
sizethe size of the field being planted in tiles
typetype of fence to set
sidethe side of the tile to attempt placement

Definition at line 1016 of file industry_cmd.cpp.

References Chance16(), CLEAR_FIELDS, DiagDirToAxis(), GetFence(), IsClearGround(), IsTileType(), MP_CLEAR, OtherAxis(), ReverseDiagDir(), SetFence(), TileOffsByAxis(), TileOffsByDiagDir(), and Map::WrapToMap().

◆ TransportIndustryGoods()

static bool TransportIndustryGoods ( TileIndex  tile)
static

Move produced cargo from industry to nearby stations.

Parameters
tileIndustry tile
Returns
true if any cargo was moved.

Definition at line 524 of file industry_cmd.cpp.

References EconomyIsInRecession(), Industry::GetByTile(), GetIndustrySpec(), IsValidCargoID(), IndustrySpec::minimal_cargo, Industry::produced, and Industry::type.

◆ TrimIndustryAcceptedProduced()

void TrimIndustryAcceptedProduced ( Industry ind)

Remove unused industry accepted/produced slots – entries after the last slot with valid cargo.

Parameters
indIndustry to trim slots.

Definition at line 3213 of file industry_cmd.cpp.

References Industry::accepted, and Industry::produced.

◆ UpdateIndustryStatistics()

static void UpdateIndustryStatistics ( Industry i)
static

Monthly update of industry statistics.

Parameters
iIndustry to update.

Definition at line 2496 of file industry_cmd.cpp.

References IsValidCargoID(), and Industry::produced.

◆ WhoCanServiceIndustry()

int WhoCanServiceIndustry ( Industry ind)
static

Compute who can service the industry.

Here, 'can service' means that they have trains and stations close enough to the industry with the right cargo type and the right orders (ie has the technical means).

Parameters
indIndustry being investigated.
Returns
: 0 if nobody can service the industry, 2 if the local company can service the industry, and 1 otherwise (only competitors can service the industry)

Definition at line 2714 of file industry_cmd.cpp.

References Industry::stations_near.

Referenced by CmdIndustrySetProduction(), and ReportNewsProductionChangeIndustry().

Variable Documentation

◆ _check_new_industry_procs

CheckNewIndustryProc* const _check_new_industry_procs[CHECK_END]
static
Initial value:
= {
}
static CommandCost CheckNewIndustry_Water(TileIndex tile)
Check the conditions of CHECK_WATER (Industry should be in the desert).
static CommandCost CheckNewIndustry_OilRefinery(TileIndex tile)
Check the conditions of CHECK_REFINERY (Industry should be positioned near edge of the map).
static CommandCost CheckNewIndustry_BubbleGen(TileIndex tile)
Check the conditions of CHECK_BUBBLEGEN (Industry should be in low land).
static CommandCost CheckNewIndustry_Farm(TileIndex tile)
Check the conditions of CHECK_FARM (Industry should be below snow-line in arctic).
static CommandCost CheckNewIndustry_Plantation(TileIndex tile)
Check the conditions of CHECK_PLANTATION (Industry should NOT be in the desert).
static CommandCost CheckNewIndustry_Forest(TileIndex tile)
Check the conditions of CHECK_FOREST (Industry should be build above snow-line in arctic climate).
static CommandCost CheckNewIndustry_OilRig(TileIndex tile)
Check the conditions of CHECK_OIL_RIG (Industries at sea should be positioned near edge of the map).
static CommandCost CheckNewIndustry_NULL(TileIndex)
Check the conditions of CHECK_NOTHING (Always succeeds).
static CommandCost CheckNewIndustry_Lumbermill(TileIndex tile)
Check the conditions of CHECK_LUMBERMILL (Industry should be in the rain forest).

Check functions for different types of industry.

Definition at line 1411 of file industry_cmd.cpp.

◆ _economy_industries_daily

IntervalTimer<TimerGameEconomy> _economy_industries_daily({TimerGameEconomy::DAY, TimerGameEconomy::Priority::INDUSTRY},[](auto) { _economy.industry_daily_change_counter+=_economy.industry_daily_increment; uint16_t change_loop=_economy.industry_daily_change_counter >> 16; _economy.industry_daily_change_counter &=0xFFFF;if(change_loop==0) { return; } Backup< CompanyID > cur_company(_current_company, OWNER_NONE); uint perc=3; if((_industry_builder.wanted_inds >> 16) > GetCurrentTotalNumberOfIndustries()) { perc=std::min(9u, perc+(_industry_builder.wanted_inds >> 16) - GetCurrentTotalNumberOfIndustries());} for(uint16_t j=0;j< change_loop;j++) { if(Chance16(perc, 100)) { _industry_builder.TryBuildNewIndustry();} else { Industry *i=Industry::GetRandom();if(i !=nullptr) { ChangeIndustryProduction(i, false);SetWindowDirty(WC_INDUSTRY_VIEW, i->index);} } } cur_company.Restore(); InvalidateWindowData(WC_INDUSTRY_DIRECTORY, 0, IDIWD_PRODUCTION_CHANGE);}) ( {TimerGameEconomy::DAY, TimerGameEconomy::Priority::INDUSTRY}  ,
[] (auto) { _economy.industry_daily_change_counter+=_economy.industry_daily_increment;uint16_t change_loop=_economy.industry_daily_change_counter >> 16;_economy.industry_daily_change_counter &=0xFFFF;if(change_loop==0) { return;} Backup< CompanyID > cur_company(_current_company, OWNER_NONE);uint perc=3;if((_industry_builder.wanted_inds >> 16) > GetCurrentTotalNumberOfIndustries()) { perc=std::min(9u, perc+(_industry_builder.wanted_inds >> 16) - GetCurrentTotalNumberOfIndustries());} for(uint16_t j=0;j< change_loop;j++) { if(Chance16(perc, 100)) { _industry_builder.TryBuildNewIndustry();} else { Industry *i=Industry::GetRandom();if(i !=nullptr) { ChangeIndustryProduction(i, false);SetWindowDirty(WC_INDUSTRY_VIEW, i->index);} } } cur_company.Restore();InvalidateWindowData(WC_INDUSTRY_DIRECTORY, 0, IDIWD_PRODUCTION_CHANGE);}   
)
static

Every economy day handler for the industry changes Taking the original map size of 256*256, the number of random changes was always of just one unit.

But it cannot be the same on smaller or bigger maps. That number has to be scaled up or down. For small maps, it implies that less than one change per month is required, while on bigger maps, it would be way more. The daily loop handles those changes.

◆ _industry_draw_tile_procs

IndustryDrawTileProc* const _industry_draw_tile_procs[5]
static
Initial value:
= {
IndustryDrawSugarMine,
IndustryDrawToffeeQuarry,
IndustryDrawBubbleGenerator,
IndustryDrawToyFactory,
IndustryDrawCoalPlantSparks,
}

Definition at line 317 of file industry_cmd.cpp.

◆ _tile_type_industry_procs

const TileTypeProcs _tile_type_industry_procs
extern
Initial value:
= {
DrawTile_Industry,
GetSlopePixelZ_Industry,
ClearTile_Industry,
AddAcceptedCargo_Industry,
GetTileDesc_Industry,
GetTileTrackStatus_Industry,
ClickTile_Industry,
AnimateTile_Industry,
TileLoop_Industry,
ChangeTileOwner_Industry,
nullptr,
nullptr,
GetFoundation_Industry,
TerraformTile_Industry,
}

Definition at line 56 of file landscape.cpp.