23 #include "table/strings.h"
35 this->num_vehicle = 0;
36 this->profit_last_year = 0;
37 this->num_vehicle_min_age = 0;
38 this->profit_last_year_min_age = 0;
41 this->num_engines.clear();
52 if (found != std::end(this->
num_engines))
return found->second;
67 assert(g->
owner == company);
72 if (IsDefaultGroupID(id_g))
return Company::Get(company)->group_default[type];
106 c->group_all[type].Clear();
107 c->group_default[type].Clear();
113 g->statistics.Clear();
117 if (!v->IsEngineCountable())
continue;
135 assert(delta == 1 || delta == -1);
160 assert(delta == 1 || delta == -1);
199 c->group_all[type].ClearProfits();
200 c->group_default[type].ClearProfits();
206 g->statistics.ClearProfits();
210 if (v->IsPrimaryVehicle()) {
232 if (g->owner != company)
continue;
233 g->statistics.ClearAutoreplace();
256 if (old_g != new_g) {
270 return &c->livery[LS_DEFAULT];
288 if (v->group_id == g->
index && (!v->IsGroundVehicle() || v->IsFrontEngine())) {
289 for (
Vehicle *u = v; u !=
nullptr; u = u->
Next()) {
290 u->colourmap = PAL_NONE;
291 u->InvalidateNewGRFCache();
298 if (cg->parent == g->
index) {
322 Group::Group(
Owner owner)
392 if (gp->parent == g->
index) {
441 bool reset = text.empty();
474 const Livery *livery = GetParentLivery(g);
508 default: NOT_REACHED();
518 for (
Vehicle *u = v; u !=
nullptr; u = u->
Next()) {
519 u->colourmap = PAL_NONE;
520 u->InvalidateNewGRFCache();
521 u->UpdateViewport(
true);
552 for (
const Vehicle *v : list) {
564 if (ret.Failed())
return { ret, new_group_id };
566 new_g = new_group_id;
570 for (
const Vehicle *vc : list) {
614 if (v->type == type && v->IsPrimaryVehicle()) {
615 if (v->group_id != id_g)
continue;
646 if (v->IsPrimaryVehicle()) {
647 if (v->group_id != group_id)
continue;
673 if (colour >= COLOUR_END && colour != INVALID_COLOUR)
return CMD_ERROR;
678 if (colour == INVALID_COLOUR) colour = GetParentLivery(g)->
colour1;
682 if (colour == INVALID_COLOUR) colour = GetParentLivery(g)->
colour2;
706 if (!children)
return;
727 if (flag >= GroupFlags::GF_END)
return CMD_ERROR;
751 for (
Vehicle *u = v; u !=
nullptr; u = u->
Next()) {
755 u->colourmap = PAL_NONE;
756 u->InvalidateNewGRFCache();
757 u->UpdateViewport(
true);
778 for (
Vehicle *u = v; u !=
nullptr; u = u->
Next()) {
782 u->colourmap = PAL_NONE;
783 u->InvalidateNewGRFCache();
860 void RemoveAllGroupsForCompany(
const CompanyID company)
863 if (company == g->
owner)
delete g;
879 if (search == group)
return true;
Base class for autoreplaces/autorenews.
Functions related to autoreplacing.
CommandCost RemoveEngineReplacementForCompany(Company *c, EngineID engine, GroupID group, DoCommandFlag flags)
Remove an engine replacement for the company.
constexpr debug_inline bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.
constexpr T AssignBit(T &x, const uint8_t y, bool value)
Assigns a bit in a variable.
constexpr T SetBit(T &x, const uint8_t y)
Set a bit in a variable.
constexpr T ClrBit(T &x, const uint8_t y)
Clears a bit in a variable.
Common return value for all commands.
UnitID UseID(UnitID index)
Use a unit number.
void ReleaseID(UnitID index)
Release a unit number.
UnitID NextID() const
Find first unused unit number.
Functions related to commands.
static const CommandCost CMD_ERROR
Define a default return value for a failed command.
#define return_cmd_error(errcode)
Returns from a function with a specific StringID as error.
DoCommandFlag
List of flags for a command.
@ DC_EXEC
execute the given command
CompanyID _current_company
Company currently doing an action.
Functions related to companies.
Owner
Enum for all companies/owners.
@ MAX_COMPANIES
Maximum number of companies.
uint16_t EngineID
Unique identification number of an engine.
@ GF_REPLACE_WAGON_REMOVAL
If set, autoreplace will perform wagon removal on vehicles in this group.
GroupPool _group_pool
Pool of groups.
bool IsAllGroupID(GroupID id_g)
Checks if a GroupID stands for all vehicles of a company.
Money GetGroupProfitLastYearMinAge(CompanyID company, GroupID id_g, VehicleType type)
Get last year's profit of vehicles above minimum age for the group with GroupID id_g and its sub-grou...
CommandCost CmdAlterGroup(DoCommandFlag flags, AlterGroupMode mode, GroupID group_id, GroupID parent_id, const std::string &text)
Alter a group.
CommandCost CmdSetGroupFlag(DoCommandFlag flags, GroupID group_id, GroupFlags flag, bool value, bool recursive)
(Un)set group flag from a group
CommandCost CmdRemoveAllVehiclesGroup(DoCommandFlag flags, GroupID group_id)
Remove all vehicles from a group.
void UpdateCompanyGroupLiveries(const Company *c)
Update group liveries for a company.
CommandCost CmdDeleteGroup(DoCommandFlag flags, GroupID group_id)
Add all vehicles in the given group to the default group and then deletes the group.
void SetTrainGroupID(Train *v, GroupID new_g)
Affect the groupID of a train to new_g.
std::tuple< CommandCost, GroupID > CmdCreateGroup(DoCommandFlag flags, VehicleType vt, GroupID parent_group)
Create a new vehicle group.
std::tuple< CommandCost, GroupID > CmdAddVehicleGroup(DoCommandFlag flags, GroupID group_id, VehicleID veh_id, bool add_shared, const VehicleListIdentifier &vli)
Add a vehicle to a group.
void UpdateTrainGroupID(Train *v)
Recalculates the groupID of a train.
static void SetGroupFlag(Group *g, GroupFlags flag, bool set, bool children)
Set group flag for a group and its sub-groups.
uint GetGroupNumEngines(CompanyID company, GroupID id_g, EngineID id_e)
Get the number of engines with EngineID id_e in the group with GroupID id_g and its sub-groups.
static void UpdateNumEngineGroup(const Vehicle *v, GroupID old_g, GroupID new_g)
Update the num engines of a groupID.
CommandCost CmdAddSharedVehicleGroup(DoCommandFlag flags, GroupID id_g, VehicleType type)
Add all shared vehicles of all vehicles from a group.
static void AddVehicleToGroup(Vehicle *v, GroupID new_g)
Do add a vehicle to a group.
static void PropagateChildLivery(const Group *g, bool reset_cache)
Propagate a livery change to a group's children, and optionally update cached vehicle colourmaps.
uint GetGroupNumVehicle(CompanyID company, GroupID id_g, VehicleType type)
Get the number of vehicles in the group with GroupID id_g and its sub-groups.
uint GetGroupNumVehicleMinAge(CompanyID company, GroupID id_g, VehicleType type)
Get the number of vehicles above profit minimum age in the group with GroupID id_g and its sub-groups...
bool GroupIsInGroup(GroupID search, GroupID group)
Test if GroupID group is a descendant of (or is) GroupID search.
CommandCost CmdSetGroupLivery(DoCommandFlag flags, GroupID group_id, bool primary, Colours colour)
Set the livery for a vehicle group.
Command definitions related to engine groups.
AlterGroupMode
Action for CmdAlterGroup.
@ Rename
Change group name.
@ SetParent
Change group parent.
void MarkWholeScreenDirty()
This function mark the whole screen as dirty.
uint16_t GroupID
Type for all group identifiers.
static const GroupID DEFAULT_GROUP
Ungrouped vehicles are in this group.
static const GroupID NEW_GROUP
Sentinel for a to-be-created group.
static const uint MAX_LENGTH_GROUP_NAME_CHARS
The maximum length of a group name in characters including '\0'.
static const GroupID INVALID_GROUP
Sentinel for invalid groups.
static const GroupID ALL_GROUP
All vehicles are in this group.
Functions related to order backups.
Some methods of Pool are placed here in order to reduce compilation time and binary size.
#define INSTANTIATE_POOL_METHODS(name)
Force instantiation of pool methods so we don't get linker errors.
A number of safeguards to prevent using unsafe methods.
Definition of base types and functions in a cross-platform compatible way.
size_t Utf8StringLength(const char *s)
Get the length of an UTF-8 encoded string in number of characters and thus not the number of bytes th...
Functions related to low-level strings.
VehicleType type
Type of vehicle.
CompanySettings settings
settings specific for each company
EngineRenewList engine_renew_list
Engine renewals of this company.
bool renew_keep_length
sell some wagons if after autoreplace the train is longer than before
GroupStatistics group_default[VEH_COMPANY_END]
NOSAVE: Statistics for the DEFAULT_GROUP group.
GroupStatistics group_all[VEH_COMPANY_END]
NOSAVE: Statistics for the ALL_GROUP group.
Struct to store engine replacements.
VehicleType type
Vehicle type, ie VEH_ROAD, VEH_TRAIN, etc.
bool IsFreeWagon() const
Check if the vehicle is a free wagon (got no engine in front of it).
Statistics and caches on the vehicles in a group.
static void CountVehicle(const Vehicle *v, int delta)
Update num_vehicle when adding or removing a vehicle.
static void AddProfitLastYear(const Vehicle *v)
Add a vehicle's last year profit to the profit sum of its group.
static void VehicleReachedMinAge(const Vehicle *v)
Add a vehicle to the profit sum of its group.
uint16_t GetNumEngines(EngineID engine) const
Get number of vehicles of a specific engine ID.
Money profit_last_year
Sum of profits for all vehicles.
static GroupStatistics & GetAllGroup(const Vehicle *v)
Returns the GroupStatistic for the ALL_GROUPO of a vehicle type.
static void UpdateAfterLoad()
Update all caches after loading a game, changing NewGRF, etc.
static void CountEngine(const Vehicle *v, int delta)
Update num_engines when adding/removing an engine.
uint16_t num_vehicle
Number of vehicles.
Money profit_last_year_min_age
Sum of profits for vehicles considered for profit statistics.
static void UpdateAutoreplace(CompanyID company)
Update autoreplace_defined and autoreplace_finished of all statistics of a company.
static void UpdateProfits()
Recompute the profits for all groups.
bool autoreplace_defined
Are any autoreplace rules set?
static GroupStatistics & Get(CompanyID company, GroupID id_g, VehicleType type)
Returns the GroupStatistics for a specific group.
bool autoreplace_finished
Have all autoreplacement finished?
std::map< EngineID, uint16_t > num_engines
Caches the number of engines of each type the company owns.
uint16_t num_vehicle_min_age
Number of vehicles considered for profit statistics;.
Livery livery
Custom colour scheme for vehicles in this group.
GroupID parent
Parent group.
GroupStatistics statistics
NOSAVE: Statistics and caches on the vehicles in the group.
VehicleType vehicle_type
Vehicle type of the group.
bool folded
NOSAVE: Is this group folded in the group view?
std::string name
Group Name.
uint16_t number
Per-company group number.
uint8_t flags
Group flags.
Information about a particular livery.
Colours colour2
Second colour, for vehicles with 2CC support.
Colours colour1
First colour, for all vehicles.
uint8_t in_use
Bit 0 set if this livery should override the default livery first colour, Bit 1 for the second colour...
static void ClearGroup(GroupID group)
Clear the group of all backups having this group ID.
Tindex index
Index of this pool item.
static Titem * Get(size_t index)
Returns Titem with given index.
static bool IsValidID(size_t index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
static bool CanAllocateItem(size_t n=1)
Helper functions so we can use PoolItem::Function() instead of _poolitem_pool.Function()
static Titem * GetIfValid(size_t index)
Returns Titem with given index.
static Pool::IterateWrapper< Titem > Iterate(size_t from=0)
Returns an iterable ensemble of all valid Titem.
Base class for all pools.
static T * From(Vehicle *v)
Converts a Vehicle to SpecializedVehicle with type checking.
T * Next() const
Get next vehicle in the chain.
'Train' is either a loco or a wagon.
The information about a vehicle list.
uint32_t Pack() const
Pack a VehicleListIdentifier in a single uint32.
EngineID engine_type
The type of engine used for this vehicle.
TimerGameEconomy::Date economy_age
Age in economy days.
GroupID group_id
Index of group Pool array.
bool IsEngineCountable() const
Check if a vehicle is counted in num_engines in each company struct.
Vehicle * Next() const
Get the next vehicle of this vehicle.
debug_inline bool IsFrontEngine() const
Check if the vehicle is a front engine.
Money GetDisplayProfitLastYear() const
Gets the profit vehicle had last year.
Vehicle * FirstShared() const
Get the first vehicle of this vehicle chain.
Vehicle * NextShared() const
Get the next vehicle of the shared vehicle chain.
TileIndex tile
Current tile index.
Owner owner
Which company owns the vehicle?
Base for the train class.
Functions related to vehicles.
static const TimerGameEconomy::Date VEHICLE_PROFIT_MIN_AGE
Only vehicles older than this have a meaningful profit.
bool IsCompanyBuildableVehicleType(VehicleType type)
Is the given vehicle type buildable by a company?
WindowClass GetWindowClassForVehicleType(VehicleType vt)
Get WindowClass for vehicle list of given vehicle type.
VehicleType
Available vehicle types.
@ VEH_ROAD
Road vehicle type.
@ VEH_AIRCRAFT
Aircraft vehicle type.
@ VEH_SHIP
Ship vehicle type.
@ VEH_TRAIN
Train vehicle type.
@ VEH_COMPANY_END
Last company-ownable type.
uint32_t VehicleID
The type all our vehicle IDs have.
static const VehicleID INVALID_VEHICLE
Constant representing a non-existing vehicle.
bool GenerateVehicleSortList(VehicleList *list, const VehicleListIdentifier &vli)
Generate a list of vehicles based on window type.
Functions and type for generating vehicle lists.
std::vector< const Vehicle * > VehicleList
A list of vehicles.
void CloseWindowById(WindowClass cls, WindowNumber number, bool force, int data)
Close a window by its class and window number (if it is open).
void InvalidateWindowData(WindowClass cls, WindowNumber number, int data, bool gui_scope)
Mark window data of the window of a given class and specific window number as invalid (in need of re-...
void SetWindowDirty(WindowClass cls, WindowNumber number)
Mark window as dirty (in need of repainting)
void InvalidateWindowClassesData(WindowClass cls, int data, bool gui_scope)
Mark window data of all windows of a given class as invalid (in need of re-computing) Note that by de...
@ WC_COMPANY_COLOUR
Company colour selection; Window numbers:
@ WC_VEHICLE_DEPOT
Depot view; Window numbers:
@ WC_REPLACE_VEHICLE
Replace vehicle window; Window numbers:
@ WC_VEHICLE_DETAILS
Vehicle details; Window numbers:
@ WC_VEHICLE_VIEW
Vehicle view; Window numbers: