OpenTTD Source 20260206-master-g4d4e37dbf1
engine.cpp File Reference

Base for all engine handling. More...

#include "stdafx.h"
#include "core/container_func.hpp"
#include "company_func.h"
#include "command_func.h"
#include "news_func.h"
#include "aircraft.h"
#include "newgrf.h"
#include "newgrf_engine.h"
#include "strings_func.h"
#include "core/random_func.hpp"
#include "window_func.h"
#include "autoreplace_gui.h"
#include "string_func.h"
#include "ai/ai.hpp"
#include "core/pool_func.hpp"
#include "engine_gui.h"
#include "engine_func.h"
#include "engine_base.h"
#include "company_base.h"
#include "vehicle_func.h"
#include "articulated_vehicles.h"
#include "error.h"
#include "timer/timer.h"
#include "timer/timer_game_tick.h"
#include "timer/timer_game_calendar.h"
#include "table/strings.h"
#include "table/engines.h"
#include "safeguards.h"

Go to the source code of this file.

Functions

void SetupEngines ()
 Initialise the engine pool with the data from the original vehicles.
void ShowEnginePreviewWindow (EngineID engine)
static bool IsWagon (EngineID index)
 Determine whether an engine type is a wagon (and not a loco).
static void ClearLastVariant (EngineID engine_id, VehicleType type)
 Ensure engine is not set as the last used variant for any other engine.
void CalcEngineReliability (Engine *e, bool new_month)
 Update Engine::reliability and (if needed) update the engine GUIs.
void SetYearEngineAgingStops ()
 Compute the value for _year_engine_aging_stops.
void StartupOneEngine (Engine *e, const TimerGameCalendar::YearMonthDay &aging_ymd, uint32_t seed)
 Start/initialise one engine.
void StartupEngines ()
 Start/initialise all our engines.
static void EnableEngineForCompany (EngineID eid, CompanyID company)
 Allows engine eid to be used by a company company.
static void DisableEngineForCompany (EngineID eid, CompanyID company)
 Forbids engine eid to be used by a company company.
static void AcceptEnginePreview (EngineID eid, CompanyID company, int recursion_depth=0)
 Company company accepts engine eid for preview.
static CompanyID GetPreviewCompany (Engine *e)
 Get the best company for an engine preview.
static bool IsVehicleTypeDisabled (VehicleType type, bool ai)
 Checks if a vehicle type is disabled for all/ai companies.
void ClearEnginesHiddenFlagOfCompany (CompanyID cid)
 Clear the 'hidden' flag for all engines of a new company.
CommandCost CmdSetVehicleVisibility (DoCommandFlags flags, EngineID engine_id, bool hide)
 Set the visibility of an engine.
CommandCost CmdWantEnginePreview (DoCommandFlags flags, EngineID engine_id)
 Accept an engine prototype.
CommandCost CmdEngineCtrl (DoCommandFlags flags, EngineID engine_id, CompanyID company_id, bool allow)
 Allow or forbid a specific company to use an engine.
static void NewVehicleAvailable (Engine *e)
 An engine has become available for general use.
void CalendarEnginesMonthlyLoop ()
 Monthly update of the availability, reliability, and preview offers of the engines.
static bool IsUniqueEngineName (const std::string &name)
 Is name still free as name for an engine?
CommandCost CmdRenameEngine (DoCommandFlags flags, EngineID engine_id, const std::string &text)
 Rename an engine.
bool IsEngineBuildable (EngineID engine, VehicleType type, CompanyID company)
 Check if an engine is buildable.
bool IsEngineRefittable (EngineID engine)
 Check if an engine is refittable.
void CheckEngines ()
 Check for engines that have an appropriate availability.

Variables

EnginePool _engine_pool ("Engine")
EngineOverrideManager _engine_mngr
static TimerGameCalendar::Year _year_engine_aging_stops
 Year that engine aging stops.
const uint8_t _engine_counts [4]
 Number of engines of each vehicle type in original engine data.
const uint8_t _engine_offsets [4]
 Offset of the first engine of each vehicle type in original engine data.
static const IntervalTimer< TimerGameCalendar_calendar_engines_daily ({TimerGameCalendar::Trigger::Day, TimerGameCalendar::Priority::Engine}, [](auto) { for(Company *c :Company::Iterate()) { c->avail_railtypes=AddDateIntroducedRailTypes(c->avail_railtypes, TimerGameCalendar::date);c->avail_roadtypes=AddDateIntroducedRoadTypes(c->avail_roadtypes, TimerGameCalendar::date);} if(TimerGameCalendar::year >=_year_engine_aging_stops) return;for(Engine *e :Engine::Iterate()) { EngineID i=e->index;if(e->flags.Test(EngineFlag::ExclusivePreview)) { if(e->preview_company !=CompanyID::Invalid()) { if(!--e->preview_wait) { CloseWindowById(WC_ENGINE_PREVIEW, i);e->preview_company=CompanyID::Invalid();} } else if(e->preview_asked.Count()< MAX_COMPANIES) { e->preview_company=GetPreviewCompany(e);if(e->preview_company==CompanyID::Invalid()) { e->preview_asked.Set();continue;} e->preview_asked.Set(e->preview_company);e->preview_wait=20;if(!IsVehicleTypeDisabled(e->type, true)) AI::NewEvent(e->preview_company, new ScriptEventEnginePreview(i));if(IsInteractiveCompany(e->preview_company)) ShowEnginePreviewWindow(i);} } } })
 Daily check to offer an exclusive engine preview to the companies.
static const IntervalTimer< TimerGameCalendar_calendar_engines_monthly ({TimerGameCalendar::Trigger::Month, TimerGameCalendar::Priority::Engine}, [](auto) { CalendarEnginesMonthlyLoop();})

Detailed Description

Base for all engine handling.

Definition in file engine.cpp.

Function Documentation

◆ AcceptEnginePreview()

void AcceptEnginePreview ( EngineID eid,
CompanyID company,
int recursion_depth = 0 )
static

Company company accepts engine eid for preview.

Parameters
eidEngine being accepted (is under preview).
companyCurrent company previewing the engine.
recursion_depthRecursion depth to avoid infinite loop.

Definition at line 887 of file engine.cpp.

References AcceptEnginePreview(), EnableEngineForCompany(), InvalidateWindowData(), Engine::IterateType(), JoinPreview, Engine::preview_asked, Engine::preview_company, BaseBitSet< Timpl, Tvalue_type, Tstorage, Tmask >::Set(), Engine::type, and WC_ENGINE_PREVIEW.

Referenced by AcceptEnginePreview(), and CmdWantEnginePreview().

◆ CalcEngineReliability()

◆ CalendarEnginesMonthlyLoop()

◆ CheckEngines()

void CheckEngines ( )

Check for engines that have an appropriate availability.

Definition at line 1318 of file engine.cpp.

References Available, GetEncodedString(), RAILVEH_WAGON, ShowErrorMessage(), VEH_TRAIN, and WL_WARNING.

◆ ClearEnginesHiddenFlagOfCompany()

void ClearEnginesHiddenFlagOfCompany ( CompanyID cid)

Clear the 'hidden' flag for all engines of a new company.

Parameters
cidCompany being created.

Definition at line 1009 of file engine.cpp.

Referenced by DoStartupNewCompany().

◆ ClearLastVariant()

void ClearLastVariant ( EngineID engine_id,
VehicleType type )
static

Ensure engine is not set as the last used variant for any other engine.

Parameters
engine_idEngine being removed.
typeType of engine.

Definition at line 639 of file engine.cpp.

References Engine::IterateType().

Referenced by CalcEngineReliability(), and DisableEngineForCompany().

◆ CmdEngineCtrl()

CommandCost CmdEngineCtrl ( DoCommandFlags flags,
EngineID engine_id,
CompanyID company_id,
bool allow )

Allow or forbid a specific company to use an engine.

Parameters
flagsoperation to perform
engine_idengine id
company_idCompany to allow/forbid the use of an engine.
allowfalse to forbid, true to allow.
Returns
the cost of this operation or an error

Definition at line 1062 of file engine.cpp.

References _current_company, CMD_ERROR, DisableEngineForCompany(), EnableEngineForCompany(), Execute, OWNER_DEITY, and BaseBitSet< Timpl, Tvalue_type, Tstorage, Tmask >::Test().

◆ CmdRenameEngine()

CommandCost CmdRenameEngine ( DoCommandFlags flags,
EngineID engine_id,
const std::string & text )

Rename an engine.

Parameters
flagsoperation to perform
engine_idengine ID to rename
textthe new name or an empty string when resetting to the default
Returns
the cost of this operation or an error

Definition at line 1217 of file engine.cpp.

References CMD_ERROR, Execute, IsUniqueEngineName(), MarkWholeScreenDirty(), MAX_LENGTH_ENGINE_NAME_CHARS, Engine::name, BaseBitSet< Timpl, Tvalue_type, Tstorage, Tmask >::Test(), and Utf8StringLength().

◆ CmdSetVehicleVisibility()

CommandCost CmdSetVehicleVisibility ( DoCommandFlags flags,
EngineID engine_id,
bool hide )

Set the visibility of an engine.

Parameters
flagsOperation to perform.
engine_idEngine id..
hideSet for hidden, unset for visible.
Returns
The cost of this operation or an error.

Definition at line 1023 of file engine.cpp.

References _current_company, AddRemoveEngineFromAutoreplaceAndBuildWindows(), CMD_ERROR, Engine::company_hidden, Execute, IsEngineBuildable(), BaseBitSet< Timpl, Tvalue_type, Tstorage, Tmask >::Set(), BaseBitSet< Timpl, Tvalue_type, Tstorage, Tmask >::Test(), and Engine::type.

◆ CmdWantEnginePreview()

CommandCost CmdWantEnginePreview ( DoCommandFlags flags,
EngineID engine_id )

Accept an engine prototype.

XXX - it is possible that the top-company changes while you are waiting to accept the offer? Then it becomes invalid

Parameters
flagsoperation to perform
engine_idengine-prototype offered
Returns
the cost of this operation or an error

Definition at line 1044 of file engine.cpp.

References _current_company, AcceptEnginePreview(), CMD_ERROR, ExclusivePreview, Execute, Engine::flags, Engine::preview_company, and BaseBitSet< Timpl, Tvalue_type, Tstorage, Tmask >::Test().

◆ DisableEngineForCompany()

void DisableEngineForCompany ( EngineID eid,
CompanyID company )
static

Forbids engine eid to be used by a company company.

Parameters
eidThe engine to disable.
companyThe company to forbid using the engine.

Definition at line 863 of file engine.cpp.

References _local_company, AddRemoveEngineFromAutoreplaceAndBuildWindows(), Company::avail_railtypes, Company::avail_roadtypes, ClearLastVariant(), Engine::company_avail, GetCompanyRailTypes(), GetCompanyRoadTypes(), BaseBitSet< Timpl, Tvalue_type, Tstorage, Tmask >::Reset(), Engine::type, VEH_ROAD, and VEH_TRAIN.

Referenced by CmdEngineCtrl().

◆ EnableEngineForCompany()

void EnableEngineForCompany ( EngineID eid,
CompanyID company )
static

◆ GetPreviewCompany()

CompanyID GetPreviewCompany ( Engine * e)
static

Get the best company for an engine preview.

Parameters
eEngine to preview.
Returns
Best company if it exists, CompanyID::Invalid() otherwise.

Definition at line 919 of file engine.cpp.

References GetUnionOfArticulatedRefitMasks(), HasBit(), Engine::preview_asked, BaseBitSet< Timpl, Tvalue_type, Tstorage, Tmask >::Test(), Engine::type, and VEH_TRAIN.

◆ IsEngineBuildable()

bool IsEngineBuildable ( EngineID engine,
VehicleType type,
CompanyID company )

◆ IsEngineRefittable()

bool IsEngineRefittable ( EngineID engine)

Check if an engine is refittable.

Note: Likely you want to use IsArticulatedVehicleRefittable().

Parameters
engineindex of the engine to check.
Returns
true if the engine is refittable.

Definition at line 1292 of file engine.cpp.

References EngineInfo::callback_mask, Engine::CanCarryCargo(), CargoSuffix, Engine::GetDefaultCargoType(), IsValidCargoType(), SetBit(), and BaseBitSet< Timpl, Tvalue_type, Tstorage, Tmask >::Test().

Referenced by IsArticulatedVehicleRefittable(), IsVehicleRefittable(), and OrdersWindow::UpdateAutoRefitState().

◆ IsUniqueEngineName()

bool IsUniqueEngineName ( const std::string & name)
static

Is name still free as name for an engine?

Parameters
nameNew name of an engine.
Returns
false if the name is being used already, else true.

Definition at line 1201 of file engine.cpp.

Referenced by CmdRenameEngine().

◆ IsVehicleTypeDisabled()

bool IsVehicleTypeDisabled ( VehicleType type,
bool ai )
static

Checks if a vehicle type is disabled for all/ai companies.

Parameters
typeThe vehicle type which shall be checked.
aiIf true, check if the type is disabled for AI companies, otherwise check if the vehicle type is disabled for human companies.
Returns
Whether or not a vehicle type is disabled.

Definition at line 953 of file engine.cpp.

References _settings_game, VEH_AIRCRAFT, VEH_ROAD, VEH_SHIP, and VEH_TRAIN.

Referenced by CalendarEnginesMonthlyLoop(), and NewVehicleAvailable().

◆ IsWagon()

bool IsWagon ( EngineID index)
static

Determine whether an engine type is a wagon (and not a loco).

Parameters
indexEngine getting queried.
Returns
Whether the queried engine is a wagon.

Definition at line 628 of file engine.cpp.

References RAILVEH_WAGON, Engine::type, and VEH_TRAIN.

Referenced by CalendarEnginesMonthlyLoop(), and NewVehicleAvailable().

◆ NewVehicleAvailable()

◆ SetupEngines()

void SetupEngines ( )

Initialise the engine pool with the data from the original vehicles.

Definition at line 604 of file engine.cpp.

References _engine_counts, CloseWindowByClass(), VEH_COMPANY_END, and WC_ENGINE_PREVIEW.

Referenced by ResetNewGRFData().

◆ SetYearEngineAgingStops()

◆ ShowEnginePreviewWindow()

void ShowEnginePreviewWindow ( EngineID engine)

Definition at line 281 of file engine_gui.cpp.

◆ StartupEngines()

◆ StartupOneEngine()

Variable Documentation

◆ _engine_counts

const uint8_t _engine_counts[4]
Initial value:
= {
lengthof(_orig_rail_vehicle_info),
lengthof(_orig_road_vehicle_info),
lengthof(_orig_ship_vehicle_info),
lengthof(_orig_aircraft_vehicle_info),
}
#define lengthof(array)
Return the length of an fixed size array.
Definition stdafx.h:271

Number of engines of each vehicle type in original engine data.

Definition at line 54 of file engine.cpp.

Referenced by GetNewEngine(), ParamSet(), EngineOverrideManager::ResetToDefaultMapping(), and SetupEngines().

◆ _engine_mngr

EngineOverrideManager _engine_mngr

Definition at line 45 of file engine.cpp.

◆ _engine_offsets

const uint8_t _engine_offsets[4]
Initial value:
= {
0,
lengthof(_orig_rail_vehicle_info),
lengthof(_orig_rail_vehicle_info) + lengthof(_orig_road_vehicle_info),
lengthof(_orig_rail_vehicle_info) + lengthof(_orig_road_vehicle_info) + lengthof(_orig_ship_vehicle_info),
}

Offset of the first engine of each vehicle type in original engine data.

Definition at line 62 of file engine.cpp.

Referenced by ParamSet().

◆ _year_engine_aging_stops

TimerGameCalendar::Year _year_engine_aging_stops
static

Year that engine aging stops.

Engines will not reduce in reliability and no more engines will be introduced

Definition at line 51 of file engine.cpp.

Referenced by CalendarEnginesMonthlyLoop(), SetYearEngineAgingStops(), and StartupEngines().