2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
8 /** @file cargo_type.h Types related to cargoes... */
13 #include "core/enum_type.hpp"
14 #include "core/strong_typedef_type.hpp"
16 /** Globally unique label of a cargo type. */
17 using CargoLabel
= StrongType::Typedef
<uint32_t, struct CargoLabelTag
, StrongType::Compare
>;
20 * Cargo slots to indicate a cargo type within a game.
25 * Available types of cargo
26 * Labels may be re-used between different climates.
30 static constexpr CargoLabel CT_PASSENGERS
= CargoLabel
{'PASS'};
31 static constexpr CargoLabel CT_COAL
= CargoLabel
{'COAL'};
32 static constexpr CargoLabel CT_MAIL
= CargoLabel
{'MAIL'};
33 static constexpr CargoLabel CT_OIL
= CargoLabel
{'OIL_'};
34 static constexpr CargoLabel CT_LIVESTOCK
= CargoLabel
{'LVST'};
35 static constexpr CargoLabel CT_GOODS
= CargoLabel
{'GOOD'};
36 static constexpr CargoLabel CT_GRAIN
= CargoLabel
{'GRAI'};
37 static constexpr CargoLabel CT_WOOD
= CargoLabel
{'WOOD'};
38 static constexpr CargoLabel CT_IRON_ORE
= CargoLabel
{'IORE'};
39 static constexpr CargoLabel CT_STEEL
= CargoLabel
{'STEL'};
40 static constexpr CargoLabel CT_VALUABLES
= CargoLabel
{'VALU'};
43 static constexpr CargoLabel CT_WHEAT
= CargoLabel
{'WHEA'};
44 static constexpr CargoLabel CT_PAPER
= CargoLabel
{'PAPR'};
45 static constexpr CargoLabel CT_GOLD
= CargoLabel
{'GOLD'};
46 static constexpr CargoLabel CT_FOOD
= CargoLabel
{'FOOD'};
49 static constexpr CargoLabel CT_RUBBER
= CargoLabel
{'RUBR'};
50 static constexpr CargoLabel CT_FRUIT
= CargoLabel
{'FRUI'};
51 static constexpr CargoLabel CT_MAIZE
= CargoLabel
{'MAIZ'};
52 static constexpr CargoLabel CT_COPPER_ORE
= CargoLabel
{'CORE'};
53 static constexpr CargoLabel CT_WATER
= CargoLabel
{'WATR'};
54 static constexpr CargoLabel CT_DIAMONDS
= CargoLabel
{'DIAM'};
57 static constexpr CargoLabel CT_SUGAR
= CargoLabel
{'SUGR'};
58 static constexpr CargoLabel CT_TOYS
= CargoLabel
{'TOYS'};
59 static constexpr CargoLabel CT_BATTERIES
= CargoLabel
{'BATT'};
60 static constexpr CargoLabel CT_CANDY
= CargoLabel
{'SWET'};
61 static constexpr CargoLabel CT_TOFFEE
= CargoLabel
{'TOFF'};
62 static constexpr CargoLabel CT_COLA
= CargoLabel
{'COLA'};
63 static constexpr CargoLabel CT_COTTON_CANDY
= CargoLabel
{'CTCD'};
64 static constexpr CargoLabel CT_BUBBLES
= CargoLabel
{'BUBL'};
65 static constexpr CargoLabel CT_PLASTIC
= CargoLabel
{'PLST'};
66 static constexpr CargoLabel CT_FIZZY_DRINKS
= CargoLabel
{'FZDR'};
68 /** Dummy label for engines that carry no cargo; they actually carry 0 passengers. */
69 static constexpr CargoLabel CT_NONE
= CT_PASSENGERS
;
71 static constexpr CargoLabel CT_INVALID
= CargoLabel
{UINT32_MAX
}; ///< Invalid cargo type.
73 static const CargoID NUM_ORIGINAL_CARGO
= 12; ///< Original number of cargo types.
74 static const CargoID NUM_CARGO
= 64; ///< Maximum number of cargo types in a game.
76 /* CARGO_AUTO_REFIT and CARGO_NO_REFIT are stored in save-games for refit-orders, so should not be changed. */
77 static const CargoID CARGO_AUTO_REFIT
= 0xFD; ///< Automatically choose cargo type when doing auto refitting.
78 static const CargoID CARGO_NO_REFIT
= 0xFE; ///< Do not refit cargo of a vehicle (used in vehicle orders and auto-replace/auto-renew).
80 static const CargoID INVALID_CARGO
= UINT8_MAX
;
82 /** Mixed cargo types for definitions with cargo that can vary depending on climate. */
84 MCT_LIVESTOCK_FRUIT
, ///< Cargo can be livestock or fruit.
85 MCT_GRAIN_WHEAT_MAIZE
, ///< Cargo can be grain, wheat or maize.
86 MCT_VALUABLES_GOLD_DIAMONDS
, ///< Cargo can be valuables, gold or diamonds.
90 * Special cargo filter criteria.
91 * These are used by user interface code only and must not be assigned to any entity. Not all values are valid for every UI filter.
93 namespace CargoFilterCriteria
{
94 static constexpr CargoID CF_ANY
= NUM_CARGO
; ///< Show all items independent of carried cargo (i.e. no filtering)
95 static constexpr CargoID CF_NONE
= NUM_CARGO
+ 1; ///< Show only items which do not carry cargo (e.g. train engines)
96 static constexpr CargoID CF_ENGINES
= NUM_CARGO
+ 2; ///< Show only engines (for rail vehicles only)
97 static constexpr CargoID CF_FREIGHT
= NUM_CARGO
+ 3; ///< Show only vehicles which carry any freight (non-passenger) cargo
99 static constexpr CargoID CF_NO_RATING
= NUM_CARGO
+ 4; ///< Show items with no rating (station list)
100 static constexpr CargoID CF_SELECT_ALL
= NUM_CARGO
+ 5; ///< Select all items (station list)
101 static constexpr CargoID CF_EXPAND_LIST
= NUM_CARGO
+ 6; ///< Expand list to show all items (station list)
104 /** Test whether cargo type is not CT_INVALID */
105 inline bool IsValidCargoType(CargoLabel t
) { return t
!= CT_INVALID
; }
106 /** Test whether cargo type is not INVALID_CARGO */
107 inline bool IsValidCargoID(CargoID t
) { return t
!= INVALID_CARGO
; }
109 typedef uint64_t CargoTypes
;
111 static const CargoTypes ALL_CARGOTYPES
= (CargoTypes
)UINT64_MAX
;
113 /** Class for storing amounts of cargo */
114 struct CargoArray
: std::array
<uint
, NUM_CARGO
> {
116 * Get the sum of all cargo amounts.
119 template <typename T
>
120 inline const T
GetSum() const
122 return std::reduce(this->begin(), this->end(), T
{});
126 * Get the amount of cargos that have an amount.
127 * @return The amount.
129 inline uint
GetCount() const
131 return std::count_if(this->begin(), this->end(), [](uint amount
) { return amount
!= 0; });
136 /** Types of cargo source and destination */
137 enum class SourceType
: byte
{
138 Industry
, ///< Source/destination is an industry
139 Town
, ///< Source/destination is a town
140 Headquarters
, ///< Source/destination are company headquarters
143 typedef uint16_t SourceID
; ///< Contains either industry ID, town ID or company ID (or INVALID_SOURCE)
144 static const SourceID INVALID_SOURCE
= 0xFFFF; ///< Invalid/unknown index of source
146 #endif /* CARGO_TYPE_H */