Merge branch 'master' into jgrpp

# Conflicts:
#	src/autoreplace_cmd.cpp
#	src/build_vehicle_gui.cpp
#	src/cargotype.cpp
#	src/economy.cpp
#	src/engine_gui.cpp
#	src/industry_cmd.cpp
#	src/industry_gui.cpp
#	src/linkgraph/linkgraph_gui.h
#	src/linkgraph/refresh.cpp
#	src/linkgraph/refresh.h
#	src/newgrf.cpp
#	src/newgrf_airporttiles.h
#	src/newgrf_roadstop.cpp
#	src/newgrf_station.cpp
#	src/newgrf_station.h
#	src/order_base.h
#	src/order_cmd.cpp
#	src/order_func.h
#	src/order_gui.cpp
#	src/pathfinder/pathfinder_type.h
#	src/saveload/afterload.cpp
#	src/subsidy_base.h
#	src/vehicle_cmd.cpp
#	src/vehicle_gui.cpp
#	src/vehicle_gui_base.h
pull/642/head
Jonathan G Rennison 4 months ago
commit 3050620189

@ -146,9 +146,9 @@ void GetArticulatedPartsEngineIDs(EngineID engine_type, bool purchase_window, st
static inline uint16_t GetVehicleDefaultCapacity(EngineID engine, CargoID *cargo_type) static inline uint16_t GetVehicleDefaultCapacity(EngineID engine, CargoID *cargo_type)
{ {
const Engine *e = Engine::Get(engine); const Engine *e = Engine::Get(engine);
CargoID cargo = (e->CanCarryCargo() ? e->GetDefaultCargoType() : (CargoID)CT_INVALID); CargoID cargo = (e->CanCarryCargo() ? e->GetDefaultCargoType() : INVALID_CARGO);
if (cargo_type != nullptr) *cargo_type = cargo; if (cargo_type != nullptr) *cargo_type = cargo;
if (cargo == CT_INVALID) return 0; if (cargo == INVALID_CARGO) return 0;
return e->GetDisplayDefaultCapacity(); return e->GetDisplayDefaultCapacity();
} }
@ -322,21 +322,21 @@ CargoTypes GetUnionOfArticulatedRefitMasks(EngineID engine, bool include_initial
* Get cargo mask of all cargoes carried by an articulated vehicle. * Get cargo mask of all cargoes carried by an articulated vehicle.
* Note: Vehicles not carrying anything are ignored * Note: Vehicles not carrying anything are ignored
* @param v the first vehicle in the chain * @param v the first vehicle in the chain
* @param cargo_type returns the common CargoID if needed. (CT_INVALID if no part is carrying something or they are carrying different things) * @param cargo_type returns the common CargoID if needed. (INVALID_CARGO if no part is carrying something or they are carrying different things)
* @return cargo mask, may be 0 if the no vehicle parts have cargo capacity * @return cargo mask, may be 0 if the no vehicle parts have cargo capacity
*/ */
CargoTypes GetCargoTypesOfArticulatedVehicle(const Vehicle *v, CargoID *cargo_type) CargoTypes GetCargoTypesOfArticulatedVehicle(const Vehicle *v, CargoID *cargo_type)
{ {
CargoTypes cargoes = 0; CargoTypes cargoes = 0;
CargoID first_cargo = CT_INVALID; CargoID first_cargo = INVALID_CARGO;
do { do {
if (v->cargo_type != CT_INVALID && v->GetEngine()->CanCarryCargo()) { if (v->cargo_type != INVALID_CARGO && v->GetEngine()->CanCarryCargo()) {
SetBit(cargoes, v->cargo_type); SetBit(cargoes, v->cargo_type);
if (first_cargo == CT_INVALID) first_cargo = v->cargo_type; if (first_cargo == INVALID_CARGO) first_cargo = v->cargo_type;
if (first_cargo != v->cargo_type) { if (first_cargo != v->cargo_type) {
if (cargo_type != nullptr) { if (cargo_type != nullptr) {
*cargo_type = CT_INVALID; *cargo_type = INVALID_CARGO;
cargo_type = nullptr; cargo_type = nullptr;
} }
} }
@ -353,7 +353,7 @@ CargoTypes GetCargoTypesOfArticulatedVehicle(const Vehicle *v, CargoID *cargo_ty
* Returns the overall cargo of an articulated vehicle if all parts are refitted to the same cargo. * Returns the overall cargo of an articulated vehicle if all parts are refitted to the same cargo.
* Note: Vehicles not carrying anything are ignored * Note: Vehicles not carrying anything are ignored
* @param v the first vehicle in the chain * @param v the first vehicle in the chain
* @return the common CargoID. (CT_INVALID if no part is carrying something or they are carrying different things) * @return the common CargoID. (INVALID_CARGO if no part is carrying something or they are carrying different things)
*/ */
CargoID GetOverallCargoOfArticulatedVehicle(const Vehicle *v) CargoID GetOverallCargoOfArticulatedVehicle(const Vehicle *v)
{ {

@ -222,31 +222,31 @@ static int GetIncompatibleRefitOrderIdForAutoreplace(const Vehicle *v, EngineID
* @param engine_type The EngineID of the vehicle that is being replaced to * @param engine_type The EngineID of the vehicle that is being replaced to
* @param part_of_chain The vehicle is part of a train * @param part_of_chain The vehicle is part of a train
* @return The cargo type to replace to * @return The cargo type to replace to
* CT_NO_REFIT is returned if no refit is needed * CARGO_NO_REFIT is returned if no refit is needed
* CT_INVALID is returned when both old and new vehicle got cargo capacity and refitting the new one to the old one's cargo type isn't possible * INVALID_CARGO is returned when both old and new vehicle got cargo capacity and refitting the new one to the old one's cargo type isn't possible
*/ */
static CargoID GetNewCargoTypeForReplace(const Vehicle *v, EngineID engine_type, bool part_of_chain) static CargoID GetNewCargoTypeForReplace(const Vehicle *v, EngineID engine_type, bool part_of_chain)
{ {
CargoTypes available_cargo_types, union_mask; CargoTypes available_cargo_types, union_mask;
GetArticulatedRefitMasks(engine_type, true, &union_mask, &available_cargo_types); GetArticulatedRefitMasks(engine_type, true, &union_mask, &available_cargo_types);
if (union_mask == 0) return CT_NO_REFIT; // Don't try to refit an engine with no cargo capacity if (union_mask == 0) return CARGO_NO_REFIT; // Don't try to refit an engine with no cargo capacity
CargoID cargo_type; CargoID cargo_type;
CargoTypes cargo_mask = GetCargoTypesOfArticulatedVehicle(v, &cargo_type); CargoTypes cargo_mask = GetCargoTypesOfArticulatedVehicle(v, &cargo_type);
if (!HasAtMostOneBit(cargo_mask)) { if (!HasAtMostOneBit(cargo_mask)) {
CargoTypes new_engine_default_cargoes = GetCargoTypesOfArticulatedParts(engine_type); CargoTypes new_engine_default_cargoes = GetCargoTypesOfArticulatedParts(engine_type);
if ((cargo_mask & new_engine_default_cargoes) == cargo_mask) { if ((cargo_mask & new_engine_default_cargoes) == cargo_mask) {
return CT_NO_REFIT; // engine_type is already a mixed cargo type which matches the incoming vehicle by default, no refit required return CARGO_NO_REFIT; // engine_type is already a mixed cargo type which matches the incoming vehicle by default, no refit required
} }
return CT_INVALID; // We cannot refit to mixed cargoes in an automated way return INVALID_CARGO; // We cannot refit to mixed cargoes in an automated way
} }
if (cargo_type == CT_INVALID) { if (cargo_type == INVALID_CARGO) {
if (v->type != VEH_TRAIN) return CT_NO_REFIT; // If the vehicle does not carry anything at all, every replacement is fine. if (v->type != VEH_TRAIN) return CARGO_NO_REFIT; // If the vehicle does not carry anything at all, every replacement is fine.
if (!part_of_chain) return CT_NO_REFIT; if (!part_of_chain) return CARGO_NO_REFIT;
/* the old engine didn't have cargo capacity, but the new one does /* the old engine didn't have cargo capacity, but the new one does
* now we will figure out what cargo the train is carrying and refit to fit this */ * now we will figure out what cargo the train is carrying and refit to fit this */
@ -257,11 +257,11 @@ static CargoID GetNewCargoTypeForReplace(const Vehicle *v, EngineID engine_type,
if (HasBit(available_cargo_types, v->cargo_type)) return v->cargo_type; if (HasBit(available_cargo_types, v->cargo_type)) return v->cargo_type;
} }
return CT_NO_REFIT; // We failed to find a cargo type on the old vehicle and we will not refit the new one return CARGO_NO_REFIT; // We failed to find a cargo type on the old vehicle and we will not refit the new one
} else { } else {
if (!HasBit(available_cargo_types, cargo_type)) return CT_INVALID; // We can't refit the vehicle to carry the cargo we want if (!HasBit(available_cargo_types, cargo_type)) return INVALID_CARGO; // We can't refit the vehicle to carry the cargo we want
if (part_of_chain && !VerifyAutoreplaceRefitForOrders(v, engine_type)) return CT_INVALID; // Some refit orders lose their effect if (part_of_chain && !VerifyAutoreplaceRefitForOrders(v, engine_type)) return INVALID_CARGO; // Some refit orders lose their effect
return cargo_type; return cargo_type;
} }
@ -332,7 +332,7 @@ static CommandCost BuildReplacementVehicleRefitFailure(EngineID e, const Vehicle
static CommandCost BuildReplacementMultiPartShipSimple(EngineID e, const Vehicle *old_veh, Vehicle **new_vehicle) static CommandCost BuildReplacementMultiPartShipSimple(EngineID e, const Vehicle *old_veh, Vehicle **new_vehicle)
{ {
/* Build the new vehicle */ /* Build the new vehicle */
CommandCost cost = DoCommand(old_veh->tile, e | (CT_INVALID << 24), 0, DC_EXEC | DC_AUTOREPLACE, GetCmdBuildVeh(old_veh)); CommandCost cost = DoCommand(old_veh->tile, e | (INVALID_CARGO << 24), 0, DC_EXEC | DC_AUTOREPLACE, GetCmdBuildVeh(old_veh));
if (cost.Failed()) return cost; if (cost.Failed()) return cost;
Vehicle *new_veh = Vehicle::Get(_new_vehicle_id); Vehicle *new_veh = Vehicle::Get(_new_vehicle_id);
@ -341,7 +341,7 @@ static CommandCost BuildReplacementMultiPartShipSimple(EngineID e, const Vehicle
Vehicle *v = new_veh; Vehicle *v = new_veh;
const Vehicle *old = old_veh; const Vehicle *old = old_veh;
for (; v != nullptr && old != nullptr; v = v->Next(), old = old->Next()) { for (; v != nullptr && old != nullptr; v = v->Next(), old = old->Next()) {
if (old->cargo_type == CT_INVALID) continue; if (old->cargo_type == INVALID_CARGO) continue;
byte subtype = GetBestFittingSubType(old, v, old->cargo_type); byte subtype = GetBestFittingSubType(old, v, old->cargo_type);
CommandCost refit_cost = DoCommand(0, v->index, old->cargo_type | (subtype << 8) | (1 << 16), DC_EXEC, GetCmdRefitVeh(v)); CommandCost refit_cost = DoCommand(0, v->index, old->cargo_type | (subtype << 8) | (1 << 16), DC_EXEC, GetCmdRefitVeh(v));
@ -375,7 +375,7 @@ static CommandCost BuildReplacementMultiPartShip(EngineID e, const Vehicle *old_
if (refit_idx == refit_mask_list.size()) { if (refit_idx == refit_mask_list.size()) {
easy_mode = false; easy_mode = false;
} }
if (old->cargo_type == CT_INVALID) continue; if (old->cargo_type == INVALID_CARGO) continue;
old_cargo_vehs[old->cargo_type] = old; old_cargo_vehs[old->cargo_type] = old;
@ -416,7 +416,7 @@ static CommandCost BuildReplacementMultiPartShip(EngineID e, const Vehicle *old_
CargoTypes available = todo & refit_mask_list[i]; CargoTypes available = todo & refit_mask_list[i];
if (available == 0) available = all_cargoes & refit_mask_list[i]; if (available == 0) available = all_cargoes & refit_mask_list[i];
if (available == 0) { if (available == 0) {
output_cargoes.push_back(CT_INVALID); output_cargoes.push_back(INVALID_CARGO);
continue; continue;
} }
@ -441,7 +441,7 @@ static CommandCost BuildReplacementMultiPartShip(EngineID e, const Vehicle *old_
if (new_vehicle == nullptr) return CommandCost(); // dry-run: success if (new_vehicle == nullptr) return CommandCost(); // dry-run: success
/* Build the new vehicle */ /* Build the new vehicle */
CommandCost cost = DoCommand(old_veh->tile, e | (CT_INVALID << 24), 0, DC_EXEC | DC_AUTOREPLACE, GetCmdBuildVeh(old_veh)); CommandCost cost = DoCommand(old_veh->tile, e | (INVALID_CARGO << 24), 0, DC_EXEC | DC_AUTOREPLACE, GetCmdBuildVeh(old_veh));
if (cost.Failed()) return cost; if (cost.Failed()) return cost;
Vehicle *new_veh = Vehicle::Get(_new_vehicle_id); Vehicle *new_veh = Vehicle::Get(_new_vehicle_id);
@ -450,7 +450,7 @@ static CommandCost BuildReplacementMultiPartShip(EngineID e, const Vehicle *old_
size_t i = 0; size_t i = 0;
for (Vehicle *v = new_veh; v != nullptr && i < output_cargoes.size(); v = v->Next(), i++) { for (Vehicle *v = new_veh; v != nullptr && i < output_cargoes.size(); v = v->Next(), i++) {
CargoID c = output_cargoes[i]; CargoID c = output_cargoes[i];
if (c == CT_INVALID) continue; if (c == INVALID_CARGO) continue;
assert(old_cargo_vehs[c] != nullptr); assert(old_cargo_vehs[c] != nullptr);
byte subtype = GetBestFittingSubType(old_cargo_vehs[c], v, c); byte subtype = GetBestFittingSubType(old_cargo_vehs[c], v, c);
@ -488,7 +488,7 @@ static CommandCost BuildReplacementVehicle(const Vehicle *old_veh, Vehicle **new
if (old_veh->type == VEH_SHIP && old_veh->Next() != nullptr) { if (old_veh->type == VEH_SHIP && old_veh->Next() != nullptr) {
CargoTypes cargoes = 0; CargoTypes cargoes = 0;
for (const Vehicle *u = old_veh; u != nullptr; u = u->Next()) { for (const Vehicle *u = old_veh; u != nullptr; u = u->Next()) {
if (u->cargo_type != CT_INVALID && u->GetEngine()->CanCarryCargo()) { if (u->cargo_type != INVALID_CARGO && u->GetEngine()->CanCarryCargo()) {
SetBit(cargoes, u->cargo_type); SetBit(cargoes, u->cargo_type);
} }
} }
@ -500,19 +500,19 @@ static CommandCost BuildReplacementVehicle(const Vehicle *old_veh, Vehicle **new
/* Does it need to be refitted */ /* Does it need to be refitted */
CargoID refit_cargo = GetNewCargoTypeForReplace(old_veh, e, part_of_chain); CargoID refit_cargo = GetNewCargoTypeForReplace(old_veh, e, part_of_chain);
if (refit_cargo == CT_INVALID) { if (refit_cargo == INVALID_CARGO) {
return BuildReplacementVehicleRefitFailure(e, old_veh); return BuildReplacementVehicleRefitFailure(e, old_veh);
} }
/* Build the new vehicle */ /* Build the new vehicle */
cost = DoCommand(old_veh->tile, e | (CT_INVALID << 24), 0, DC_EXEC | DC_AUTOREPLACE, GetCmdBuildVeh(old_veh)); cost = DoCommand(old_veh->tile, e | (INVALID_CARGO << 24), 0, DC_EXEC | DC_AUTOREPLACE, GetCmdBuildVeh(old_veh));
if (cost.Failed()) return cost; if (cost.Failed()) return cost;
Vehicle *new_veh = Vehicle::Get(_new_vehicle_id); Vehicle *new_veh = Vehicle::Get(_new_vehicle_id);
*new_vehicle = new_veh; *new_vehicle = new_veh;
/* Refit the vehicle if needed */ /* Refit the vehicle if needed */
if (refit_cargo != CT_NO_REFIT) { if (refit_cargo != CARGO_NO_REFIT) {
byte subtype = GetBestFittingSubType(old_veh, new_veh, refit_cargo); byte subtype = GetBestFittingSubType(old_veh, new_veh, refit_cargo);
cost.AddCost(DoCommand(0, new_veh->index, refit_cargo | (subtype << 8), DC_EXEC, GetCmdRefitVeh(new_veh))); cost.AddCost(DoCommand(0, new_veh->index, refit_cargo | (subtype << 8), DC_EXEC, GetCmdRefitVeh(new_veh)));

@ -197,26 +197,21 @@ static const NWidgetPart _nested_build_vehicle_widgets_train_advanced[] = {
EndContainer(), EndContainer(),
}; };
/** Special cargo filter criteria */
static const CargoID CF_ANY = CT_NO_REFIT; ///< Show all vehicles independent of carried cargo (i.e. no filtering)
static const CargoID CF_NONE = CT_INVALID; ///< Show only vehicles which do not carry cargo (e.g. train engines)
static const CargoID CF_ENGINES = CT_AUTO_REFIT; ///< Show only engines (for rail vehicles only)
bool _engine_sort_direction; ///< \c false = descending, \c true = ascending. bool _engine_sort_direction; ///< \c false = descending, \c true = ascending.
byte _engine_sort_last_criteria[] = {0, 0, 0, 0}; ///< Last set sort criteria, for each vehicle type. byte _engine_sort_last_criteria[] = {0, 0, 0, 0}; ///< Last set sort criteria, for each vehicle type.
bool _engine_sort_last_order[] = {false, false, false, false}; ///< Last set direction of the sort order, for each vehicle type. bool _engine_sort_last_order[] = {false, false, false, false}; ///< Last set direction of the sort order, for each vehicle type.
bool _engine_sort_show_hidden_engines[] = {false, false, false, false}; ///< Last set 'show hidden engines' setting for each vehicle type. bool _engine_sort_show_hidden_engines[] = {false, false, false, false}; ///< Last set 'show hidden engines' setting for each vehicle type.
bool _engine_sort_show_hidden_locos = false; ///< Last set 'show hidden locos' setting. bool _engine_sort_show_hidden_locos = false; ///< Last set 'show hidden locos' setting.
bool _engine_sort_show_hidden_wagons = false; ///< Last set 'show hidden wagons' setting. bool _engine_sort_show_hidden_wagons = false; ///< Last set 'show hidden wagons' setting.
static CargoID _engine_sort_last_cargo_criteria[] = {CF_ANY, CF_ANY, CF_ANY, CF_ANY}; ///< Last set filter criteria, for each vehicle type. static CargoID _engine_sort_last_cargo_criteria[] = {CargoFilterCriteria::CF_ANY, CargoFilterCriteria::CF_ANY, CargoFilterCriteria::CF_ANY, CargoFilterCriteria::CF_ANY}; ///< Last set filter criteria, for each vehicle type.
static byte _last_sort_criteria_loco = 0; static byte _last_sort_criteria_loco = 0;
static bool _last_sort_order_loco = false; static bool _last_sort_order_loco = false;
static CargoID _last_filter_criteria_loco = CF_ANY; static CargoID _last_filter_criteria_loco = CargoFilterCriteria::CF_ANY;
static byte _last_sort_criteria_wagon = 0; static byte _last_sort_criteria_wagon = 0;
static bool _last_sort_order_wagon = false; static bool _last_sort_order_wagon = false;
static CargoID _last_filter_criteria_wagon = CF_ANY; static CargoID _last_filter_criteria_wagon = CargoFilterCriteria::CF_ANY;
/** /**
* Determines order of engines by engineID * Determines order of engines by engineID
@ -749,13 +744,13 @@ const StringID _engine_sort_listing[][14] = {{
/** Filters vehicles by cargo and engine (in case of rail vehicle). */ /** Filters vehicles by cargo and engine (in case of rail vehicle). */
static bool CargoAndEngineFilter(const GUIEngineListItem *item, const CargoID cid) static bool CargoAndEngineFilter(const GUIEngineListItem *item, const CargoID cid)
{ {
if (cid == CF_ANY) { if (cid == CargoFilterCriteria::CF_ANY) {
return true; return true;
} else if (cid == CF_ENGINES) { } else if (cid == CargoFilterCriteria::CF_ENGINES) {
return Engine::Get(item->engine_id)->GetPower() != 0; return Engine::Get(item->engine_id)->GetPower() != 0;
} else { } else {
CargoTypes refit_mask = GetUnionOfArticulatedRefitMasks(item->engine_id, true) & _standard_cargo_mask; CargoTypes refit_mask = GetUnionOfArticulatedRefitMasks(item->engine_id, true) & _standard_cargo_mask;
return (cid == CF_NONE ? refit_mask == 0 : HasBit(refit_mask, cid)); return (cid == CargoFilterCriteria::CF_NONE ? refit_mask == 0 : HasBit(refit_mask, cid));
} }
} }
@ -1116,7 +1111,7 @@ void TestedEngineDetails::FillDefaultCapacities(const Engine *e)
this->all_capacities[this->cargo] = this->capacity; this->all_capacities[this->cargo] = this->capacity;
this->all_capacities[CT_MAIL] = this->mail_capacity; this->all_capacities[CT_MAIL] = this->mail_capacity;
} }
if (this->all_capacities.GetCount() == 0) this->cargo = CT_INVALID; if (this->all_capacities.GetCount() == 0) this->cargo = INVALID_CARGO;
} }
/** /**
@ -1163,7 +1158,7 @@ int DrawVehiclePurchaseInfo(int left, int right, int y, EngineID engine_number,
int new_y = DrawCargoCapacityInfo(left, right, y, te, refittable); int new_y = DrawCargoCapacityInfo(left, right, y, te, refittable);
if (new_y == y) { if (new_y == y) {
SetDParam(0, CT_INVALID); SetDParam(0, INVALID_CARGO);
SetDParam(2, STR_EMPTY); SetDParam(2, STR_EMPTY);
DrawString(left, right, y, STR_PURCHASE_INFO_CAPACITY); DrawString(left, right, y, STR_PURCHASE_INFO_CAPACITY);
y += GetCharacterHeight(FS_NORMAL); y += GetCharacterHeight(FS_NORMAL);
@ -1409,7 +1404,7 @@ struct BuildVehicleWindow : BuildVehicleWindowBase {
{ {
NWidgetCore *widget = this->GetWidget<NWidgetCore>(WID_BV_BUILD); NWidgetCore *widget = this->GetWidget<NWidgetCore>(WID_BV_BUILD);
bool refit = this->sel_engine != INVALID_ENGINE && this->cargo_filter_criteria != CF_ANY && this->cargo_filter_criteria != CF_NONE; bool refit = this->sel_engine != INVALID_ENGINE && this->cargo_filter_criteria != CargoFilterCriteria::CF_ANY && this->cargo_filter_criteria != CargoFilterCriteria::CF_NONE;
if (refit) refit = Engine::Get(this->sel_engine)->GetDefaultCargoType() != this->cargo_filter_criteria; if (refit) refit = Engine::Get(this->sel_engine)->GetDefaultCargoType() != this->cargo_filter_criteria;
if (this->virtual_train_mode) { if (this->virtual_train_mode) {
@ -1518,9 +1513,9 @@ struct BuildVehicleWindow : BuildVehicleWindowBase {
StringID GetCargoFilterLabel(CargoID cid) const StringID GetCargoFilterLabel(CargoID cid) const
{ {
switch (cid) { switch (cid) {
case CF_ANY: return STR_PURCHASE_INFO_ALL_TYPES; case CargoFilterCriteria::CF_ANY: return STR_PURCHASE_INFO_ALL_TYPES;
case CF_ENGINES: return STR_PURCHASE_INFO_ENGINES_ONLY; case CargoFilterCriteria::CF_ENGINES: return STR_PURCHASE_INFO_ENGINES_ONLY;
case CF_NONE: return STR_PURCHASE_INFO_NONE; case CargoFilterCriteria::CF_NONE: return STR_PURCHASE_INFO_NONE;
default: return CargoSpec::Get(cid)->name; default: return CargoSpec::Get(cid)->name;
} }
} }
@ -1530,16 +1525,16 @@ struct BuildVehicleWindow : BuildVehicleWindowBase {
{ {
/* Set the last cargo filter criteria. */ /* Set the last cargo filter criteria. */
this->cargo_filter_criteria = _engine_sort_last_cargo_criteria[this->vehicle_type]; this->cargo_filter_criteria = _engine_sort_last_cargo_criteria[this->vehicle_type];
if (this->cargo_filter_criteria < NUM_CARGO && !HasBit(_standard_cargo_mask, this->cargo_filter_criteria)) this->cargo_filter_criteria = CF_ANY; if (this->cargo_filter_criteria < NUM_CARGO && !HasBit(_standard_cargo_mask, this->cargo_filter_criteria)) this->cargo_filter_criteria = CargoFilterCriteria::CF_ANY;
this->eng_list.SetFilterFuncs(_filter_funcs); this->eng_list.SetFilterFuncs(_filter_funcs);
this->eng_list.SetFilterState(this->cargo_filter_criteria != CF_ANY); this->eng_list.SetFilterState(this->cargo_filter_criteria != CargoFilterCriteria::CF_ANY);
} }
void SelectEngine(EngineID engine) void SelectEngine(EngineID engine)
{ {
CargoID cargo = this->cargo_filter_criteria; CargoID cargo = this->cargo_filter_criteria;
if (cargo == CF_ANY || cargo == CF_ENGINES || cargo == CF_NONE) cargo = CT_INVALID; if (cargo == CargoFilterCriteria::CF_ANY || cargo == CargoFilterCriteria::CF_ENGINES || cargo == CargoFilterCriteria::CF_NONE) cargo = INVALID_CARGO;
this->sel_engine = engine; this->sel_engine = engine;
this->SetBuyVehicleText(); this->SetBuyVehicleText();
@ -1549,13 +1544,13 @@ struct BuildVehicleWindow : BuildVehicleWindowBase {
const Engine *e = Engine::Get(this->sel_engine); const Engine *e = Engine::Get(this->sel_engine);
if (!e->CanPossiblyCarryCargo()) { if (!e->CanPossiblyCarryCargo()) {
this->te.cost = 0; this->te.cost = 0;
this->te.cargo = CT_INVALID; this->te.cargo = INVALID_CARGO;
this->te.all_capacities.Clear(); this->te.all_capacities.Clear();
return; return;
} }
if (this->virtual_train_mode) { if (this->virtual_train_mode) {
if (cargo != CT_INVALID && cargo != e->GetDefaultCargoType()) { if (cargo != INVALID_CARGO && cargo != e->GetDefaultCargoType()) {
SavedRandomSeeds saved_seeds; SavedRandomSeeds saved_seeds;
SaveRandomSeeds(&saved_seeds); SaveRandomSeeds(&saved_seeds);
StringID err; StringID err;
@ -1565,7 +1560,7 @@ struct BuildVehicleWindow : BuildVehicleWindowBase {
this->te.cost = ret.GetCost(); this->te.cost = ret.GetCost();
this->te.capacity = _returned_refit_capacity; this->te.capacity = _returned_refit_capacity;
this->te.mail_capacity = _returned_mail_refit_capacity; this->te.mail_capacity = _returned_mail_refit_capacity;
this->te.cargo = (cargo == CT_INVALID) ? e->GetDefaultCargoType() : cargo; this->te.cargo = (cargo == INVALID_CARGO) ? e->GetDefaultCargoType() : cargo;
this->te.all_capacities = _returned_vehicle_capacities; this->te.all_capacities = _returned_vehicle_capacities;
delete t; delete t;
RestoreRandomSeeds(saved_seeds); RestoreRandomSeeds(saved_seeds);
@ -1581,7 +1576,7 @@ struct BuildVehicleWindow : BuildVehicleWindowBase {
this->te.cost = ret.GetCost() - e->GetCost(); this->te.cost = ret.GetCost() - e->GetCost();
this->te.capacity = _returned_refit_capacity; this->te.capacity = _returned_refit_capacity;
this->te.mail_capacity = _returned_mail_refit_capacity; this->te.mail_capacity = _returned_mail_refit_capacity;
this->te.cargo = (cargo == CT_INVALID) ? e->GetDefaultCargoType() : cargo; this->te.cargo = (cargo == INVALID_CARGO) ? e->GetDefaultCargoType() : cargo;
this->te.all_capacities = _returned_vehicle_capacities; this->te.all_capacities = _returned_vehicle_capacities;
return; return;
} }
@ -1839,14 +1834,14 @@ struct BuildVehicleWindow : BuildVehicleWindowBase {
DropDownList list; DropDownList list;
/* Add item for disabling filtering. */ /* Add item for disabling filtering. */
list.push_back(std::make_unique<DropDownListStringItem>(this->GetCargoFilterLabel(CF_ANY), CF_ANY, false)); list.push_back(std::make_unique<DropDownListStringItem>(this->GetCargoFilterLabel(CargoFilterCriteria::CF_ANY), CargoFilterCriteria::CF_ANY, false));
/* Specific filters for trains. */ /* Specific filters for trains. */
if (this->vehicle_type == VEH_TRAIN) { if (this->vehicle_type == VEH_TRAIN) {
/* Add item for locomotives only in case of trains. */ /* Add item for locomotives only in case of trains. */
list.push_back(std::make_unique<DropDownListStringItem>(this->GetCargoFilterLabel(CF_ENGINES), CF_ENGINES, false)); list.push_back(std::make_unique<DropDownListStringItem>(this->GetCargoFilterLabel(CargoFilterCriteria::CF_ENGINES), CargoFilterCriteria::CF_ENGINES, false));
/* Add item for vehicles not carrying anything, e.g. train engines. /* Add item for vehicles not carrying anything, e.g. train engines.
* This could also be useful for eyecandy vehicles of other types, but is likely too confusing for joe, */ * This could also be useful for eyecandy vehicles of other types, but is likely too confusing for joe, */
list.push_back(std::make_unique<DropDownListStringItem>(this->GetCargoFilterLabel(CF_NONE), CF_NONE, false)); list.push_back(std::make_unique<DropDownListStringItem>(this->GetCargoFilterLabel(CargoFilterCriteria::CF_NONE), CargoFilterCriteria::CF_NONE, false));
} }
/* Add cargos */ /* Add cargos */
@ -1935,7 +1930,7 @@ struct BuildVehicleWindow : BuildVehicleWindowBase {
cmd = GetCmdBuildVeh(this->vehicle_type); cmd = GetCmdBuildVeh(this->vehicle_type);
} }
CargoID cargo = this->cargo_filter_criteria; CargoID cargo = this->cargo_filter_criteria;
if (cargo == CF_ANY || cargo == CF_ENGINES || cargo == CF_NONE) cargo = CT_INVALID; if (cargo == CargoFilterCriteria::CF_ANY || cargo == CargoFilterCriteria::CF_ENGINES || cargo == CargoFilterCriteria::CF_NONE) cargo = INVALID_CARGO;
DoCommandP(this->window_number, sel_eng | (cargo << 24), 0, cmd, callback); DoCommandP(this->window_number, sel_eng | (cargo << 24), 0, cmd, callback);
/* Update last used variant in hierarchy and refresh if necessary. */ /* Update last used variant in hierarchy and refresh if necessary. */
@ -2140,7 +2135,7 @@ struct BuildVehicleWindow : BuildVehicleWindowBase {
this->cargo_filter_criteria = index; this->cargo_filter_criteria = index;
_engine_sort_last_cargo_criteria[this->vehicle_type] = this->cargo_filter_criteria; _engine_sort_last_cargo_criteria[this->vehicle_type] = this->cargo_filter_criteria;
/* deactivate filter if criteria is 'Show All', activate it otherwise */ /* deactivate filter if criteria is 'Show All', activate it otherwise */
this->eng_list.SetFilterState(this->cargo_filter_criteria != CF_ANY); this->eng_list.SetFilterState(this->cargo_filter_criteria != CargoFilterCriteria::CF_ANY);
this->eng_list.ForceRebuild(); this->eng_list.ForceRebuild();
this->SelectEngine(this->sel_engine); this->SelectEngine(this->sel_engine);
} }
@ -2301,7 +2296,8 @@ struct BuildVehicleWindowTrainAdvanced final : BuildVehicleWindowBase {
bool GetRefitButtonMode(const PanelState &state) const bool GetRefitButtonMode(const PanelState &state) const
{ {
bool refit = state.sel_engine != INVALID_ENGINE && state.cargo_filter[state.cargo_filter_criteria] != CF_ANY && state.cargo_filter[state.cargo_filter_criteria] != CF_NONE; bool refit = state.sel_engine != INVALID_ENGINE && state.cargo_filter[state.cargo_filter_criteria] != CargoFilterCriteria::CF_ANY &&
state.cargo_filter[state.cargo_filter_criteria] != CargoFilterCriteria::CF_NONE;
if (refit) refit = Engine::Get(state.sel_engine)->GetDefaultCargoType() != state.cargo_filter[state.cargo_filter_criteria]; if (refit) refit = Engine::Get(state.sel_engine)->GetDefaultCargoType() != state.cargo_filter[state.cargo_filter_criteria];
return refit; return refit;
} }
@ -2456,12 +2452,12 @@ struct BuildVehicleWindowTrainAdvanced final : BuildVehicleWindowBase {
uint filter_items = 0; uint filter_items = 0;
/* Add item for disabling filtering. */ /* Add item for disabling filtering. */
state.cargo_filter[filter_items] = CF_ANY; state.cargo_filter[filter_items] = CargoFilterCriteria::CF_ANY;
state.cargo_filter_texts[filter_items] = STR_PURCHASE_INFO_ALL_TYPES; state.cargo_filter_texts[filter_items] = STR_PURCHASE_INFO_ALL_TYPES;
filter_items++; filter_items++;
/* Add item for vehicles not carrying anything, e.g. train engines. */ /* Add item for vehicles not carrying anything, e.g. train engines. */
state.cargo_filter[filter_items] = CF_NONE; state.cargo_filter[filter_items] = CargoFilterCriteria::CF_NONE;
state.cargo_filter_texts[filter_items] = STR_PURCHASE_INFO_NONE; state.cargo_filter_texts[filter_items] = STR_PURCHASE_INFO_NONE;
filter_items++; filter_items++;
@ -2487,7 +2483,7 @@ struct BuildVehicleWindowTrainAdvanced final : BuildVehicleWindowBase {
} }
state.eng_list.SetFilterFuncs(_filter_funcs); state.eng_list.SetFilterFuncs(_filter_funcs);
state.eng_list.SetFilterState(state.cargo_filter[state.cargo_filter_criteria] != CF_ANY); state.eng_list.SetFilterState(state.cargo_filter[state.cargo_filter_criteria] != CargoFilterCriteria::CF_ANY);
} }
void SelectFirstEngine(PanelState &state) void SelectFirstEngine(PanelState &state)
@ -2501,7 +2497,7 @@ struct BuildVehicleWindowTrainAdvanced final : BuildVehicleWindowBase {
void SelectEngine(PanelState &state, const EngineID engine) void SelectEngine(PanelState &state, const EngineID engine)
{ {
CargoID cargo = state.cargo_filter[state.cargo_filter_criteria]; CargoID cargo = state.cargo_filter[state.cargo_filter_criteria];
if (cargo == CF_ANY) cargo = CF_NONE; if (cargo == CargoFilterCriteria::CF_ANY) cargo = CargoFilterCriteria::CF_NONE;
state.sel_engine = engine; state.sel_engine = engine;
@ -2510,13 +2506,13 @@ struct BuildVehicleWindowTrainAdvanced final : BuildVehicleWindowBase {
const Engine *e = Engine::Get(state.sel_engine); const Engine *e = Engine::Get(state.sel_engine);
if (!e->CanPossiblyCarryCargo()) { if (!e->CanPossiblyCarryCargo()) {
state.te.cost = 0; state.te.cost = 0;
state.te.cargo = CT_INVALID; state.te.cargo = INVALID_CARGO;
state.te.all_capacities.Clear(); state.te.all_capacities.Clear();
return; return;
} }
if (this->virtual_train_mode) { if (this->virtual_train_mode) {
if (cargo != CT_INVALID && cargo != e->GetDefaultCargoType()) { if (cargo != INVALID_CARGO && cargo != e->GetDefaultCargoType()) {
SavedRandomSeeds saved_seeds; SavedRandomSeeds saved_seeds;
SaveRandomSeeds(&saved_seeds); SaveRandomSeeds(&saved_seeds);
StringID err; StringID err;
@ -2526,7 +2522,7 @@ struct BuildVehicleWindowTrainAdvanced final : BuildVehicleWindowBase {
state.te.cost = ret.GetCost(); state.te.cost = ret.GetCost();
state.te.capacity = _returned_refit_capacity; state.te.capacity = _returned_refit_capacity;
state.te.mail_capacity = _returned_mail_refit_capacity; state.te.mail_capacity = _returned_mail_refit_capacity;
state.te.cargo = (cargo == CT_INVALID) ? e->GetDefaultCargoType() : cargo; state.te.cargo = (cargo == INVALID_CARGO) ? e->GetDefaultCargoType() : cargo;
state.te.all_capacities = _returned_vehicle_capacities; state.te.all_capacities = _returned_vehicle_capacities;
delete t; delete t;
RestoreRandomSeeds(saved_seeds); RestoreRandomSeeds(saved_seeds);
@ -2542,7 +2538,7 @@ struct BuildVehicleWindowTrainAdvanced final : BuildVehicleWindowBase {
state.te.cost = ret.GetCost() - e->GetCost(); state.te.cost = ret.GetCost() - e->GetCost();
state.te.capacity = _returned_refit_capacity; state.te.capacity = _returned_refit_capacity;
state.te.mail_capacity = _returned_mail_refit_capacity; state.te.mail_capacity = _returned_mail_refit_capacity;
state.te.cargo = (cargo == CT_INVALID) ? e->GetDefaultCargoType() : cargo; state.te.cargo = (cargo == INVALID_CARGO) ? e->GetDefaultCargoType() : cargo;
state.te.all_capacities = _returned_vehicle_capacities; state.te.all_capacities = _returned_vehicle_capacities;
return; return;
} }
@ -2586,7 +2582,7 @@ struct BuildVehicleWindowTrainAdvanced final : BuildVehicleWindowBase {
{ {
const CargoID filter_type = state.cargo_filter[state.cargo_filter_criteria]; const CargoID filter_type = state.cargo_filter[state.cargo_filter_criteria];
GUIEngineListItem item = {eid, eid, EngineDisplayFlags::None, 0}; GUIEngineListItem item = {eid, eid, EngineDisplayFlags::None, 0};
return (filter_type == CF_ANY || CargoAndEngineFilter(&item, filter_type)); return (filter_type == CargoFilterCriteria::CF_ANY || CargoAndEngineFilter(&item, filter_type));
} }
/** Filter by name and NewGRF extra text */ /** Filter by name and NewGRF extra text */
@ -2709,7 +2705,7 @@ struct BuildVehicleWindowTrainAdvanced final : BuildVehicleWindowBase {
? CcBuildWagon : CcBuildPrimaryVehicle; ? CcBuildWagon : CcBuildPrimaryVehicle;
cmd = GetCmdBuildVeh(this->vehicle_type); cmd = GetCmdBuildVeh(this->vehicle_type);
} }
if (cargo == CF_ANY || cargo == CF_ENGINES) cargo = CF_NONE; if (cargo == CargoFilterCriteria::CF_ANY || cargo == CargoFilterCriteria::CF_ENGINES) cargo = CargoFilterCriteria::CF_NONE;
DoCommandP(this->window_number, selected | (cargo << 24), 0, cmd, callback); DoCommandP(this->window_number, selected | (cargo << 24), 0, cmd, callback);
/* Update last used variant in hierarchy and refresh if necessary. */ /* Update last used variant in hierarchy and refresh if necessary. */
@ -3163,7 +3159,7 @@ struct BuildVehicleWindowTrainAdvanced final : BuildVehicleWindowBase {
this->loco.cargo_filter_criteria = static_cast<byte>(index); this->loco.cargo_filter_criteria = static_cast<byte>(index);
_last_filter_criteria_loco = this->loco.cargo_filter[this->loco.cargo_filter_criteria]; _last_filter_criteria_loco = this->loco.cargo_filter[this->loco.cargo_filter_criteria];
/* deactivate filter if criteria is 'Show All', activate it otherwise */ /* deactivate filter if criteria is 'Show All', activate it otherwise */
this->loco.eng_list.SetFilterState(this->loco.cargo_filter[this->loco.cargo_filter_criteria] != CF_ANY); this->loco.eng_list.SetFilterState(this->loco.cargo_filter[this->loco.cargo_filter_criteria] != CargoFilterCriteria::CF_ANY);
this->loco.eng_list.ForceRebuild(); this->loco.eng_list.ForceRebuild();
} }
break; break;
@ -3183,7 +3179,7 @@ struct BuildVehicleWindowTrainAdvanced final : BuildVehicleWindowBase {
this->wagon.cargo_filter_criteria = static_cast<byte>(index); this->wagon.cargo_filter_criteria = static_cast<byte>(index);
_last_filter_criteria_wagon = this->wagon.cargo_filter[this->wagon.cargo_filter_criteria]; _last_filter_criteria_wagon = this->wagon.cargo_filter[this->wagon.cargo_filter_criteria];
/* deactivate filter if criteria is 'Show All', activate it otherwise */ /* deactivate filter if criteria is 'Show All', activate it otherwise */
this->wagon.eng_list.SetFilterState(this->wagon.cargo_filter[this->wagon.cargo_filter_criteria] != CF_ANY); this->wagon.eng_list.SetFilterState(this->wagon.cargo_filter[this->wagon.cargo_filter_criteria] != CargoFilterCriteria::CF_ANY);
this->wagon.eng_list.ForceRebuild(); this->wagon.eng_list.ForceRebuild();
} }
break; break;

@ -64,18 +64,33 @@ enum CargoType {
CT_PLASTIC = 10, CT_PLASTIC = 10,
CT_FIZZY_DRINKS = 11, CT_FIZZY_DRINKS = 11,
NUM_ORIGINAL_CARGO = 12,
NUM_CARGO = 64, ///< Maximal number of cargo types in a game.
CT_AUTO_REFIT = 0xFD, ///< Automatically choose cargo type when doing auto refitting.
CT_NO_REFIT = 0xFE, ///< Do not refit cargo of a vehicle (used in vehicle orders and auto-replace/auto-new).
CT_INVALID = 0xFF, ///< Invalid cargo type. CT_INVALID = 0xFF, ///< Invalid cargo type.
}; };
static const CargoID NUM_ORIGINAL_CARGO = 12; ///< Original number of cargo types.
static const CargoID NUM_CARGO = 64; ///< Maximum number of cargo types in a game.
/* CARGO_AUTO_REFIT and CARGO_NO_REFIT are stored in save-games for refit-orders, so should not be changed. */
static const CargoID CARGO_AUTO_REFIT = 0xFD; ///< Automatically choose cargo type when doing auto refitting.
static const CargoID CARGO_NO_REFIT = 0xFE; ///< Do not refit cargo of a vehicle (used in vehicle orders and auto-replace/auto-renew).
static const CargoID INVALID_CARGO = UINT8_MAX;
/**
* Special cargo filter criteria.
* 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.
*/
namespace CargoFilterCriteria {
static constexpr CargoID CF_ANY = NUM_CARGO; ///< Show all items independent of carried cargo (i.e. no filtering)
static constexpr CargoID CF_NONE = NUM_CARGO + 1; ///< Show only items which do not carry cargo (e.g. train engines)
static constexpr CargoID CF_ENGINES = NUM_CARGO + 2; ///< Show only engines (for rail vehicles only)
static constexpr CargoID CF_FREIGHT = NUM_CARGO + 3; ///< Show only vehicles which carry any freight (non-passenger) cargo
};
/** Test whether cargo type is not CT_INVALID */ /** Test whether cargo type is not CT_INVALID */
inline bool IsValidCargoType(CargoType t) { return t != CT_INVALID; } inline bool IsValidCargoType(CargoType t) { return t != CT_INVALID; }
/** Test whether cargo type is not CT_INVALID */ /** Test whether cargo type is not INVALID_CARGO */
inline bool IsValidCargoID(CargoID t) { return t != CT_INVALID; } inline bool IsValidCargoID(CargoID t) { return t != INVALID_CARGO; }
typedef uint64_t CargoTypes; typedef uint64_t CargoTypes;

@ -89,13 +89,13 @@ Dimension GetLargestCargoIconSize()
* Get the cargo ID of a default cargo, if present. * Get the cargo ID of a default cargo, if present.
* @param l Landscape * @param l Landscape
* @param ct Default cargo type. * @param ct Default cargo type.
* @return ID number if the cargo exists, else #CT_INVALID * @return ID number if the cargo exists, else #INVALID_CARGO
*/ */
CargoID GetDefaultCargoID(LandscapeID l, CargoType ct) CargoID GetDefaultCargoID(LandscapeID l, CargoType ct)
{ {
assert(l < lengthof(_default_climate_cargo)); assert(l < lengthof(_default_climate_cargo));
if (ct == CT_INVALID) return CT_INVALID; if (ct == CT_INVALID) return INVALID_CARGO;
assert(ct < lengthof(_default_climate_cargo[0])); assert(ct < lengthof(_default_climate_cargo[0]));
CargoLabel cl = _default_climate_cargo[l][ct]; CargoLabel cl = _default_climate_cargo[l][ct];
@ -110,7 +110,7 @@ CargoID GetDefaultCargoID(LandscapeID l, CargoType ct)
/** /**
* Get the cargo ID by cargo label. * Get the cargo ID by cargo label.
* @param cl Cargo type to get. * @param cl Cargo type to get.
* @return ID number if the cargo exists, else #CT_INVALID * @return ID number if the cargo exists, else #INVALID_CARGO
*/ */
CargoID GetCargoIDByLabel(CargoLabel cl) CargoID GetCargoIDByLabel(CargoLabel cl)
{ {
@ -119,25 +119,25 @@ CargoID GetCargoIDByLabel(CargoLabel cl)
} }
/* No matching label was found, so it is invalid */ /* No matching label was found, so it is invalid */
return CT_INVALID; return INVALID_CARGO;
} }
/** /**
* Find the CargoID of a 'bitnum' value. * Find the CargoID of a 'bitnum' value.
* @param bitnum 'bitnum' to find. * @param bitnum 'bitnum' to find.
* @return First CargoID with the given bitnum, or #CT_INVALID if not found or if the provided \a bitnum is invalid. * @return First CargoID with the given bitnum, or #INVALID_CARGO if not found or if the provided \a bitnum is invalid.
*/ */
CargoID GetCargoIDByBitnum(uint8_t bitnum) CargoID GetCargoIDByBitnum(uint8_t bitnum)
{ {
if (bitnum == INVALID_CARGO_BITNUM) return CT_INVALID; if (bitnum == INVALID_CARGO_BITNUM) return INVALID_CARGO;
for (const CargoSpec *cs : CargoSpec::Iterate()) { for (const CargoSpec *cs : CargoSpec::Iterate()) {
if (cs->bitnum == bitnum) return cs->Index(); if (cs->bitnum == bitnum) return cs->Index();
} }
/* No matching label was found, so it is invalid */ /* No matching label was found, so it is invalid */
return CT_INVALID; return INVALID_CARGO;
} }
/** /**

@ -1396,10 +1396,10 @@ static void TriggerIndustryProduction(Industry *i)
} else { } else {
for (uint ci_in = 0; ci_in < lengthof(i->incoming_cargo_waiting); ci_in++) { for (uint ci_in = 0; ci_in < lengthof(i->incoming_cargo_waiting); ci_in++) {
uint cargo_waiting = i->incoming_cargo_waiting[ci_in]; uint cargo_waiting = i->incoming_cargo_waiting[ci_in];
if (cargo_waiting == 0 || i->accepts_cargo[ci_in] == CT_INVALID) continue; if (cargo_waiting == 0 || i->accepts_cargo[ci_in] == INVALID_CARGO) continue;
for (uint ci_out = 0; ci_out < lengthof(i->produced_cargo_waiting); ci_out++) { for (uint ci_out = 0; ci_out < lengthof(i->produced_cargo_waiting); ci_out++) {
if (i->produced_cargo[ci_out] == CT_INVALID) continue; if (i->produced_cargo[ci_out] == INVALID_CARGO) continue;
i->produced_cargo_waiting[ci_out] = ClampTo<uint16_t>(i->produced_cargo_waiting[ci_out] + (cargo_waiting * indspec->input_cargo_multiplier[ci_in][ci_out] / 256)); i->produced_cargo_waiting[ci_out] = ClampTo<uint16_t>(i->produced_cargo_waiting[ci_out] + (cargo_waiting * indspec->input_cargo_multiplier[ci_in][ci_out] / 256));
} }
@ -1783,7 +1783,7 @@ static void HandleStationRefit(Vehicle *v, CargoArray &consist_capleft, Station
/* Remove old capacity from consist capacity and collect refit mask. */ /* Remove old capacity from consist capacity and collect refit mask. */
IterateVehicleParts(v_start, PrepareRefitAction(consist_capleft, refit_mask)); IterateVehicleParts(v_start, PrepareRefitAction(consist_capleft, refit_mask));
bool is_auto_refit = new_cid == CT_AUTO_REFIT; bool is_auto_refit = new_cid == CARGO_AUTO_REFIT;
bool check_order = (v->First()->current_order.GetLoadType() == OLFB_CARGO_TYPE_LOAD); bool check_order = (v->First()->current_order.GetLoadType() == OLFB_CARGO_TYPE_LOAD);
if (is_auto_refit) { if (is_auto_refit) {
/* Get a refittable cargo type with waiting cargo for next_station or INVALID_STATION. */ /* Get a refittable cargo type with waiting cargo for next_station or INVALID_STATION. */
@ -1979,7 +1979,7 @@ static void LoadUnloadVehicle(Vehicle *front)
CargoStationIDStackSet next_station = front->GetNextStoppingStation(); CargoStationIDStackSet next_station = front->GetNextStoppingStation();
bool use_autorefit = front->current_order.IsRefit() && front->current_order.GetRefitCargo() == CT_AUTO_REFIT; bool use_autorefit = front->current_order.IsRefit() && front->current_order.GetRefitCargo() == CARGO_AUTO_REFIT;
CargoArray consist_capleft{}; CargoArray consist_capleft{};
bool should_reserve_consist = false; bool should_reserve_consist = false;
bool reserve_consist_cargo_type_loading = false; bool reserve_consist_cargo_type_loading = false;

@ -83,8 +83,8 @@ Engine::Engine(VehicleType type, EngineID base)
this->info.base_life = 0xFF; this->info.base_life = 0xFF;
/* Set road vehicle tractive effort to the default value */ /* Set road vehicle tractive effort to the default value */
if (type == VEH_ROAD) this->u.road.tractive_effort = 0x4C; if (type == VEH_ROAD) this->u.road.tractive_effort = 0x4C;
/* Aircraft must have CT_INVALID as default, as there is no property */ /* Aircraft must have INVALID_CARGO as default, as there is no property */
if (type == VEH_AIRCRAFT) this->info.cargo_type = CT_INVALID; if (type == VEH_AIRCRAFT) this->info.cargo_type = INVALID_CARGO;
/* Set visual effect to the default value */ /* Set visual effect to the default value */
switch (type) { switch (type) {
case VEH_TRAIN: this->u.rail.visual_effect = VE_DEFAULT; break; case VEH_TRAIN: this->u.rail.visual_effect = VE_DEFAULT; break;
@ -183,7 +183,7 @@ bool Engine::CanCarryCargo() const
default: NOT_REACHED(); default: NOT_REACHED();
} }
return this->GetDefaultCargoType() != CT_INVALID; return this->GetDefaultCargoType() != INVALID_CARGO;
} }
bool Engine::CanPossiblyCarryCargo() const bool Engine::CanPossiblyCarryCargo() const
@ -1364,7 +1364,7 @@ bool IsEngineRefittable(EngineID engine)
CargoID default_cargo = e->GetDefaultCargoType(); CargoID default_cargo = e->GetDefaultCargoType();
CargoTypes default_cargo_mask = 0; CargoTypes default_cargo_mask = 0;
SetBit(default_cargo_mask, default_cargo); SetBit(default_cargo_mask, default_cargo);
return default_cargo != CT_INVALID && ei->refit_mask != default_cargo_mask; return default_cargo != INVALID_CARGO && ei->refit_mask != default_cargo_mask;
} }
/** /**

@ -102,7 +102,7 @@ struct Engine : EnginePool::PoolItem<&_engine_pool> {
* Usually a valid cargo is returned, even though the vehicle has zero capacity, and can therefore not carry anything. But the cargotype is still used * Usually a valid cargo is returned, even though the vehicle has zero capacity, and can therefore not carry anything. But the cargotype is still used
* for livery selection etc.. * for livery selection etc..
* *
* Vehicles with CT_INVALID as default cargo are usually not available, but it can appear as default cargo of articulated parts. * Vehicles with INVALID_CARGO as default cargo are usually not available, but it can appear as default cargo of articulated parts.
* *
* @return The default cargo type. * @return The default cargo type.
* @see CanCarryCargo * @see CanCarryCargo

@ -172,7 +172,7 @@ static StringID GetEngineInfoCapacityString(EngineID engine)
CargoArray cap = GetCapacityOfArticulatedParts(engine); CargoArray cap = GetCapacityOfArticulatedParts(engine);
if (cap.GetSum<uint>() == 0) { if (cap.GetSum<uint>() == 0) {
/* no cargo at all */ /* no cargo at all */
auto tmp_params = MakeParameters(CT_INVALID, 0); auto tmp_params = MakeParameters(INVALID_CARGO, 0);
_temp_special_strings[1] = GetStringWithArgs(STR_JUST_CARGO, tmp_params); _temp_special_strings[1] = GetStringWithArgs(STR_JUST_CARGO, tmp_params);
} else { } else {
std::string buffer; std::string buffer;

@ -1009,7 +1009,8 @@ public:
std::string name = GenerateAutoNameForVehicleGroup(v); std::string name = GenerateAutoNameForVehicleGroup(v);
DoCommandP(0, VehicleListIdentifier(_ctrl_pressed ? VL_SHARED_ORDERS : VL_SINGLE_VEH, v->type, v->owner, v->index).Pack(), CF_ANY, CMD_CREATE_GROUP_FROM_LIST | CMD_MSG(STR_ERROR_GROUP_CAN_T_CREATE), nullptr, name.c_str()); DoCommandP(0, VehicleListIdentifier(_ctrl_pressed ? VL_SHARED_ORDERS : VL_SINGLE_VEH, v->type, v->owner, v->index).Pack(),
CargoFilterCriteria::CF_ANY, CMD_CREATE_GROUP_FROM_LIST | CMD_MSG(STR_ERROR_GROUP_CAN_T_CREATE), nullptr, name.c_str());
break; break;
} }

@ -118,7 +118,7 @@ struct Industry : IndustryPool::PoolItem<&_industry_pool> {
inline int GetCargoProducedIndex(CargoID cargo) const inline int GetCargoProducedIndex(CargoID cargo) const
{ {
if (cargo == CT_INVALID) return -1; if (cargo == INVALID_CARGO) return -1;
auto pos = std::find(this->produced_cargo.begin(), this->produced_cargo.end(), cargo); auto pos = std::find(this->produced_cargo.begin(), this->produced_cargo.end(), cargo);
if (pos == this->produced_cargo.end()) return -1; if (pos == this->produced_cargo.end()) return -1;
return pos - this->produced_cargo.begin(); return pos - this->produced_cargo.begin();
@ -126,7 +126,7 @@ struct Industry : IndustryPool::PoolItem<&_industry_pool> {
inline int GetCargoAcceptedIndex(CargoID cargo) const inline int GetCargoAcceptedIndex(CargoID cargo) const
{ {
if (cargo == CT_INVALID) return -1; if (cargo == INVALID_CARGO) return -1;
auto pos = std::find(this->accepts_cargo.begin(), this->accepts_cargo.end(), cargo); auto pos = std::find(this->accepts_cargo.begin(), this->accepts_cargo.end(), cargo);
if (pos == this->accepts_cargo.end()) return -1; if (pos == this->accepts_cargo.end()) return -1;
return pos - this->accepts_cargo.begin(); return pos - this->accepts_cargo.begin();

@ -424,7 +424,7 @@ static void AddAcceptedCargo_Industry(TileIndex tile, CargoArray &acceptance, Ca
auto pos = std::find(std::begin(accepts_cargo), std::end(accepts_cargo), ind->accepts_cargo[i]); auto pos = std::find(std::begin(accepts_cargo), std::end(accepts_cargo), ind->accepts_cargo[i]);
if (pos == std::end(accepts_cargo)) { if (pos == std::end(accepts_cargo)) {
/* Not found, insert */ /* Not found, insert */
pos = std::find(std::begin(accepts_cargo), std::end(accepts_cargo), CT_INVALID); pos = std::find(std::begin(accepts_cargo), std::end(accepts_cargo), INVALID_CARGO);
if (pos == std::end(accepts_cargo)) continue; // nowhere to place, give up on this one if (pos == std::end(accepts_cargo)) continue; // nowhere to place, give up on this one
*pos = ind->accepts_cargo[i]; *pos = ind->accepts_cargo[i];
} }
@ -436,7 +436,7 @@ static void AddAcceptedCargo_Industry(TileIndex tile, CargoArray &acceptance, Ca
/* Try callback for accepts list, if success override all existing accepts */ /* Try callback for accepts list, if success override all existing accepts */
uint16_t res = GetIndustryTileCallback(CBID_INDTILE_ACCEPT_CARGO, 0, 0, gfx, Industry::GetByTile(tile), tile); uint16_t res = GetIndustryTileCallback(CBID_INDTILE_ACCEPT_CARGO, 0, 0, gfx, Industry::GetByTile(tile), tile);
if (res != CALLBACK_FAILED) { if (res != CALLBACK_FAILED) {
accepts_cargo.fill(CT_INVALID); accepts_cargo.fill(INVALID_CARGO);
for (uint i = 0; i < 3; i++) accepts_cargo[i] = GetCargoTranslation(GB(res, i * 5, 5), itspec->grf_prop.grffile); for (uint i = 0; i < 3; i++) accepts_cargo[i] = GetCargoTranslation(GB(res, i * 5, 5), itspec->grf_prop.grffile);
} }
} }
@ -452,7 +452,7 @@ static void AddAcceptedCargo_Industry(TileIndex tile, CargoArray &acceptance, Ca
for (byte i = 0; i < std::size(itspec->accepts_cargo); i++) { for (byte i = 0; i < std::size(itspec->accepts_cargo); i++) {
CargoID a = accepts_cargo[i]; CargoID a = accepts_cargo[i];
if (a == CT_INVALID || cargo_acceptance[i] <= 0) continue; // work only with valid cargoes if (a == INVALID_CARGO || cargo_acceptance[i] <= 0) continue; // work only with valid cargoes
/* Add accepted cargo */ /* Add accepted cargo */
acceptance[a] += cargo_acceptance[i]; acceptance[a] += cargo_acceptance[i];
@ -526,7 +526,7 @@ static bool TransportIndustryGoods(TileIndex tile)
for (uint j = 0; j < lengthof(i->produced_cargo_waiting); j++) { for (uint j = 0; j < lengthof(i->produced_cargo_waiting); j++) {
uint cw = std::min<uint>(i->produced_cargo_waiting[j], ScaleQuantity(255u, _settings_game.economy.industry_cargo_scale_factor)); uint cw = std::min<uint>(i->produced_cargo_waiting[j], ScaleQuantity(255u, _settings_game.economy.industry_cargo_scale_factor));
if (cw > indspec->minimal_cargo && i->produced_cargo[j] != CT_INVALID) { if (cw > indspec->minimal_cargo && i->produced_cargo[j] != INVALID_CARGO) {
i->produced_cargo_waiting[j] -= cw; i->produced_cargo_waiting[j] -= cw;
/* fluctuating economy? */ /* fluctuating economy? */
@ -1024,7 +1024,7 @@ bool IsTileForestIndustry(TileIndex tile)
/* Check for wood production */ /* Check for wood production */
for (uint i = 0; i < lengthof(ind->produced_cargo); i++) { for (uint i = 0; i < lengthof(ind->produced_cargo); i++) {
/* The industry produces wood. */ /* The industry produces wood. */
if (ind->produced_cargo[i] != CT_INVALID && CargoSpec::Get(ind->produced_cargo[i])->label == 'WOOD') return true; if (ind->produced_cargo[i] != INVALID_CARGO && CargoSpec::Get(ind->produced_cargo[i])->label == 'WOOD') return true;
} }
return false; return false;
@ -1166,7 +1166,7 @@ static bool SearchLumberMillTrees(TileIndex tile, void *)
static void ChopLumberMillTrees(Industry *i) static void ChopLumberMillTrees(Industry *i)
{ {
/* Skip production if cargo slot is invalid. */ /* Skip production if cargo slot is invalid. */
if (i->produced_cargo[0] == CT_INVALID) return; if (i->produced_cargo[0] == INVALID_CARGO) return;
/* We only want to cut trees if all tiles are completed. */ /* We only want to cut trees if all tiles are completed. */
for (TileIndex tile_cur : i->location) { for (TileIndex tile_cur : i->location) {
@ -1184,7 +1184,7 @@ static void ChopLumberMillTrees(Industry *i)
static void ProduceIndustryGoodsFromRate(Industry *i, bool scale) static void ProduceIndustryGoodsFromRate(Industry *i, bool scale)
{ {
for (size_t j = 0; j < lengthof(i->produced_cargo_waiting); j++) { for (size_t j = 0; j < lengthof(i->produced_cargo_waiting); j++) {
if (i->produced_cargo[j] == CT_INVALID) continue; if (i->produced_cargo[j] == INVALID_CARGO) continue;
uint amount = i->production_rate[j]; uint amount = i->production_rate[j];
if (amount != 0 && scale) { if (amount != 0 && scale) {
amount = ScaleQuantity(amount, _settings_game.economy.industry_cargo_scale_factor); amount = ScaleQuantity(amount, _settings_game.economy.industry_cargo_scale_factor);
@ -1908,7 +1908,7 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type,
if (HasBit(indspec->callback_mask, CBM_IND_INPUT_CARGO_TYPES)) { if (HasBit(indspec->callback_mask, CBM_IND_INPUT_CARGO_TYPES)) {
/* Clear all input cargo types */ /* Clear all input cargo types */
for (size_t j = 0; j < i->accepts_cargo.size(); j++) i->accepts_cargo[j] = CT_INVALID; for (size_t j = 0; j < i->accepts_cargo.size(); j++) i->accepts_cargo[j] = INVALID_CARGO;
/* Query actual types */ /* Query actual types */
uint maxcargoes = (indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED) ? lengthof(i->accepts_cargo) : 3; uint maxcargoes = (indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED) ? lengthof(i->accepts_cargo) : 3;
for (uint j = 0; j < maxcargoes; j++) { for (uint j = 0; j < maxcargoes; j++) {
@ -1922,7 +1922,7 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type,
/* Industries without "unlimited" cargo types support depend on the specific order/slots of cargo types. /* Industries without "unlimited" cargo types support depend on the specific order/slots of cargo types.
* They need to be able to blank out specific slots without aborting the callback sequence, * They need to be able to blank out specific slots without aborting the callback sequence,
* and solve this by returning undefined cargo indexes. Skip these. */ * and solve this by returning undefined cargo indexes. Skip these. */
if (cargo == CT_INVALID && !(indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED)) continue; if (cargo == INVALID_CARGO && !(indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED)) continue;
/* Verify valid cargo */ /* Verify valid cargo */
if (std::find(indspec->accepts_cargo.begin(), indspec->accepts_cargo.end(), cargo) == indspec->accepts_cargo.end()) { if (std::find(indspec->accepts_cargo.begin(), indspec->accepts_cargo.end(), cargo) == indspec->accepts_cargo.end()) {
/* Cargo not in spec, error in NewGRF */ /* Cargo not in spec, error in NewGRF */
@ -1940,7 +1940,7 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type,
if (HasBit(indspec->callback_mask, CBM_IND_OUTPUT_CARGO_TYPES)) { if (HasBit(indspec->callback_mask, CBM_IND_OUTPUT_CARGO_TYPES)) {
/* Clear all output cargo types */ /* Clear all output cargo types */
for (size_t j = 0; j < i->produced_cargo.size(); j++) i->produced_cargo[j] = CT_INVALID; for (size_t j = 0; j < i->produced_cargo.size(); j++) i->produced_cargo[j] = INVALID_CARGO;
/* Query actual types */ /* Query actual types */
uint maxcargoes = (indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED) ? lengthof(i->produced_cargo) : 2; uint maxcargoes = (indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED) ? lengthof(i->produced_cargo) : 2;
for (uint j = 0; j < maxcargoes; j++) { for (uint j = 0; j < maxcargoes; j++) {
@ -1952,7 +1952,7 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type,
} }
CargoID cargo = GetCargoTranslation(GB(res, 0, 8), indspec->grf_prop.grffile); CargoID cargo = GetCargoTranslation(GB(res, 0, 8), indspec->grf_prop.grffile);
/* Allow older GRFs to skip slots. */ /* Allow older GRFs to skip slots. */
if (cargo == CT_INVALID && !(indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED)) continue; if (cargo == INVALID_CARGO && !(indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED)) continue;
/* Verify valid cargo */ /* Verify valid cargo */
if (std::find(indspec->produced_cargo.begin(), indspec->produced_cargo.end(), cargo) == indspec->produced_cargo.end()) { if (std::find(indspec->produced_cargo.begin(), indspec->produced_cargo.end(), cargo) == indspec->produced_cargo.end()) {
/* Cargo not in spec, error in NewGRF */ /* Cargo not in spec, error in NewGRF */
@ -2562,7 +2562,7 @@ void GenerateIndustries()
static void UpdateIndustryStatistics(Industry *i) static void UpdateIndustryStatistics(Industry *i)
{ {
for (byte j = 0; j < lengthof(i->produced_cargo); j++) { for (byte j = 0; j < lengthof(i->produced_cargo); j++) {
if (i->produced_cargo[j] != CT_INVALID) { if (i->produced_cargo[j] != INVALID_CARGO) {
byte pct = 0; byte pct = 0;
if (i->this_month_production[j] != 0) { if (i->this_month_production[j] != 0) {
i->last_prod_year = _cur_year; i->last_prod_year = _cur_year;
@ -2761,7 +2761,7 @@ static bool CheckIndustryCloseDownProtection(IndustryType type)
*/ */
static void CanCargoServiceIndustry(CargoID cargo, Industry *ind, bool *c_accepts, bool *c_produces) static void CanCargoServiceIndustry(CargoID cargo, Industry *ind, bool *c_accepts, bool *c_produces)
{ {
if (cargo == CT_INVALID) return; if (cargo == INVALID_CARGO) return;
/* Check for acceptance of cargo */ /* Check for acceptance of cargo */
if (ind->IsCargoAccepted(cargo) && !IndustryTemporarilyRefusesCargo(ind, cargo)) *c_accepts = true; if (ind->IsCargoAccepted(cargo) && !IndustryTemporarilyRefusesCargo(ind, cargo)) *c_accepts = true;
@ -2929,7 +2929,7 @@ static void ChangeIndustryProduction(Industry *i, bool monthly)
} else if (_settings_game.economy.type == ET_SMOOTH) { } else if (_settings_game.economy.type == ET_SMOOTH) {
closeit = !(i->ctlflags & (INDCTL_NO_CLOSURE | INDCTL_NO_PRODUCTION_DECREASE)); closeit = !(i->ctlflags & (INDCTL_NO_CLOSURE | INDCTL_NO_PRODUCTION_DECREASE));
for (byte j = 0; j < lengthof(i->produced_cargo); j++) { for (byte j = 0; j < lengthof(i->produced_cargo); j++) {
if (i->produced_cargo[j] == CT_INVALID) continue; if (i->produced_cargo[j] == INVALID_CARGO) continue;
uint32_t r = Random(); uint32_t r = Random();
int old_prod, new_prod, percent; int old_prod, new_prod, percent;
/* If over 60% is transported, mult is 1, else mult is -1. */ /* If over 60% is transported, mult is 1, else mult is -1. */

@ -166,7 +166,7 @@ enum CargoSuffixInOut {
* @param ind the industry (nullptr if in fund window) * @param ind the industry (nullptr if in fund window)
* @param ind_type the industry type * @param ind_type the industry type
* @param indspec the industry spec * @param indspec the industry spec
* @param cargoes array with cargotypes. for CT_INVALID no suffix will be determined * @param cargoes array with cargotypes. for INVALID_CARGO no suffix will be determined
* @param suffixes is filled with the suffixes * @param suffixes is filled with the suffixes
*/ */
template <typename TC, typename TS> template <typename TC, typename TS>
@ -177,7 +177,7 @@ static inline void GetAllCargoSuffixes(CargoSuffixInOut use_input, CargoSuffixTy
if (indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED) { if (indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED) {
/* Reworked behaviour with new many-in-many-out scheme */ /* Reworked behaviour with new many-in-many-out scheme */
for (uint j = 0; j < lengthof(suffixes); j++) { for (uint j = 0; j < lengthof(suffixes); j++) {
if (cargoes[j] != CT_INVALID) { if (cargoes[j] != INVALID_CARGO) {
byte local_id = indspec->grf_prop.grffile->cargo_map[cargoes[j]]; // should we check the value for valid? byte local_id = indspec->grf_prop.grffile->cargo_map[cargoes[j]]; // should we check the value for valid?
uint cargotype = local_id << 16 | use_input; uint cargotype = local_id << 16 | use_input;
GetCargoSuffix(cargotype, cst, ind, ind_type, indspec, suffixes[j]); GetCargoSuffix(cargotype, cst, ind, ind_type, indspec, suffixes[j]);
@ -194,13 +194,13 @@ static inline void GetAllCargoSuffixes(CargoSuffixInOut use_input, CargoSuffixTy
} }
switch (use_input) { switch (use_input) {
case CARGOSUFFIX_OUT: case CARGOSUFFIX_OUT:
if (cargoes[0] != CT_INVALID) GetCargoSuffix(3, cst, ind, ind_type, indspec, suffixes[0]); if (cargoes[0] != INVALID_CARGO) GetCargoSuffix(3, cst, ind, ind_type, indspec, suffixes[0]);
if (cargoes[1] != CT_INVALID) GetCargoSuffix(4, cst, ind, ind_type, indspec, suffixes[1]); if (cargoes[1] != INVALID_CARGO) GetCargoSuffix(4, cst, ind, ind_type, indspec, suffixes[1]);
break; break;
case CARGOSUFFIX_IN: case CARGOSUFFIX_IN:
if (cargoes[0] != CT_INVALID) GetCargoSuffix(0, cst, ind, ind_type, indspec, suffixes[0]); if (cargoes[0] != INVALID_CARGO) GetCargoSuffix(0, cst, ind, ind_type, indspec, suffixes[0]);
if (cargoes[1] != CT_INVALID) GetCargoSuffix(1, cst, ind, ind_type, indspec, suffixes[1]); if (cargoes[1] != INVALID_CARGO) GetCargoSuffix(1, cst, ind, ind_type, indspec, suffixes[1]);
if (cargoes[2] != CT_INVALID) GetCargoSuffix(2, cst, ind, ind_type, indspec, suffixes[2]); if (cargoes[2] != INVALID_CARGO) GetCargoSuffix(2, cst, ind, ind_type, indspec, suffixes[2]);
break; break;
default: default:
NOT_REACHED(); NOT_REACHED();
@ -366,7 +366,7 @@ class BuildIndustryWindow : public Window {
size_t j = 0; size_t j = 0;
for (; j < cargolistlen; j++) { for (; j < cargolistlen; j++) {
if (cargolist[j] == CT_INVALID) continue; if (cargolist[j] == INVALID_CARGO) continue;
if (firstcargo == cargolistlen) { if (firstcargo == cargolistlen) {
firstcargo = j; firstcargo = j;
j++; j++;
@ -385,7 +385,7 @@ class BuildIndustryWindow : public Window {
} }
for (; j < cargolistlen; j++) { for (; j < cargolistlen; j++) {
if (cargolist[j] == CT_INVALID) continue; if (cargolist[j] == INVALID_CARGO) continue;
SetDParam(0, CargoSpec::Get(cargolist[j])->name); SetDParam(0, CargoSpec::Get(cargolist[j])->name);
SetDParamStr(1, cargo_suffix[j].text); SetDParamStr(1, cargo_suffix[j].text);
GetString(StringBuilder(cargostring), STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION); GetString(StringBuilder(cargostring), STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION);
@ -868,7 +868,7 @@ public:
bool stockpiling = HasBit(ind->callback_mask, CBM_IND_PRODUCTION_CARGO_ARRIVAL) || HasBit(ind->callback_mask, CBM_IND_PRODUCTION_256_TICKS); bool stockpiling = HasBit(ind->callback_mask, CBM_IND_PRODUCTION_CARGO_ARRIVAL) || HasBit(ind->callback_mask, CBM_IND_PRODUCTION_256_TICKS);
for (byte j = 0; j < lengthof(i->accepts_cargo); j++) { for (byte j = 0; j < lengthof(i->accepts_cargo); j++) {
if (i->accepts_cargo[j] == CT_INVALID) continue; if (i->accepts_cargo[j] == INVALID_CARGO) continue;
has_accept = true; has_accept = true;
if (first) { if (first) {
DrawString(ir, STR_INDUSTRY_VIEW_REQUIRES); DrawString(ir, STR_INDUSTRY_VIEW_REQUIRES);
@ -908,7 +908,7 @@ public:
int button_y_offset = (line_height - SETTING_BUTTON_HEIGHT) / 2; int button_y_offset = (line_height - SETTING_BUTTON_HEIGHT) / 2;
first = true; first = true;
for (byte j = 0; j < lengthof(i->produced_cargo); j++) { for (byte j = 0; j < lengthof(i->produced_cargo); j++) {
if (i->produced_cargo[j] == CT_INVALID) continue; if (i->produced_cargo[j] == INVALID_CARGO) continue;
if (first) { if (first) {
if (has_accept) ir.top += WidgetDimensions::scaled.vsep_wide; if (has_accept) ir.top += WidgetDimensions::scaled.vsep_wide;
DrawString(ir, STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE); DrawString(ir, STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE);
@ -1004,7 +1004,7 @@ public:
if (pt.y >= this->production_offset_y) { if (pt.y >= this->production_offset_y) {
int row = (pt.y - this->production_offset_y) / this->cheat_line_height; int row = (pt.y - this->production_offset_y) / this->cheat_line_height;
for (uint j = 0; j < lengthof(i->produced_cargo); j++) { for (uint j = 0; j < lengthof(i->produced_cargo); j++) {
if (i->produced_cargo[j] == CT_INVALID) continue; if (i->produced_cargo[j] == INVALID_CARGO) continue;
row--; row--;
if (row < 0) { if (row < 0) {
line = (InfoLine)(IL_RATE1 + j); line = (InfoLine)(IL_RATE1 + j);
@ -1163,7 +1163,7 @@ static void UpdateIndustryProduction(Industry *i)
if (indspec->UsesOriginalEconomy()) i->RecomputeProductionMultipliers(); if (indspec->UsesOriginalEconomy()) i->RecomputeProductionMultipliers();
for (byte j = 0; j < lengthof(i->produced_cargo); j++) { for (byte j = 0; j < lengthof(i->produced_cargo); j++) {
if (i->produced_cargo[j] != CT_INVALID) { if (i->produced_cargo[j] != INVALID_CARGO) {
i->last_month_production[j] = ScaleQuantity(8 * i->production_rate[j], _settings_game.economy.industry_cargo_scale_factor); i->last_month_production[j] = ScaleQuantity(8 * i->production_rate[j], _settings_game.economy.industry_cargo_scale_factor);
} }
} }
@ -1240,12 +1240,6 @@ static const NWidgetPart _nested_industry_directory_widgets[] = {
typedef GUIList<const Industry *, const CargoID &, const std::pair<CargoID, CargoID> &> GUIIndustryList; typedef GUIList<const Industry *, const CargoID &, const std::pair<CargoID, CargoID> &> GUIIndustryList;
/** Special cargo filter criteria */
enum CargoFilterSpecialType {
CF_ANY = CT_NO_REFIT, ///< Show all industries (i.e. no filtering)
CF_NONE = CT_INVALID, ///< Show only industries which do not produce/accept cargo
};
/** Cargo filter functions */ /** Cargo filter functions */
/** /**
* Check whether an industry accepts and produces a certain cargo pair. * Check whether an industry accepts and produces a certain cargo pair.
@ -1261,11 +1255,11 @@ static bool CargoFilter(const Industry * const *industry, const std::pair<CargoI
bool accepted_cargo_matches; bool accepted_cargo_matches;
switch (accepted_cargo) { switch (accepted_cargo) {
case CF_ANY: case CargoFilterCriteria::CF_ANY:
accepted_cargo_matches = true; accepted_cargo_matches = true;
break; break;
case CF_NONE: case CargoFilterCriteria::CF_NONE:
accepted_cargo_matches = !(*industry)->IsCargoAccepted(); accepted_cargo_matches = !(*industry)->IsCargoAccepted();
break; break;
@ -1277,11 +1271,11 @@ static bool CargoFilter(const Industry * const *industry, const std::pair<CargoI
bool produced_cargo_matches; bool produced_cargo_matches;
switch (produced_cargo) { switch (produced_cargo) {
case CF_ANY: case CargoFilterCriteria::CF_ANY:
produced_cargo_matches = true; produced_cargo_matches = true;
break; break;
case CF_NONE: case CargoFilterCriteria::CF_NONE:
produced_cargo_matches = !(*industry)->IsCargoProduced(); produced_cargo_matches = !(*industry)->IsCargoProduced();
break; break;
@ -1339,7 +1333,7 @@ protected:
if (this->produced_cargo_filter_criteria != cid) { if (this->produced_cargo_filter_criteria != cid) {
this->produced_cargo_filter_criteria = cid; this->produced_cargo_filter_criteria = cid;
/* deactivate filter if criteria is 'Show All', activate it otherwise */ /* deactivate filter if criteria is 'Show All', activate it otherwise */
bool is_filtering_necessary = this->produced_cargo_filter_criteria != CF_ANY || this->accepted_cargo_filter_criteria != CF_ANY; bool is_filtering_necessary = this->produced_cargo_filter_criteria != CargoFilterCriteria::CF_ANY || this->accepted_cargo_filter_criteria != CargoFilterCriteria::CF_ANY;
this->industries.SetFilterState(is_filtering_necessary); this->industries.SetFilterState(is_filtering_necessary);
this->industries.SetFilterType(0); this->industries.SetFilterType(0);
@ -1356,7 +1350,7 @@ protected:
if (this->accepted_cargo_filter_criteria != cid) { if (this->accepted_cargo_filter_criteria != cid) {
this->accepted_cargo_filter_criteria = cid; this->accepted_cargo_filter_criteria = cid;
/* deactivate filter if criteria is 'Show All', activate it otherwise */ /* deactivate filter if criteria is 'Show All', activate it otherwise */
bool is_filtering_necessary = this->produced_cargo_filter_criteria != CF_ANY || this->accepted_cargo_filter_criteria != CF_ANY; bool is_filtering_necessary = this->produced_cargo_filter_criteria != CargoFilterCriteria::CF_ANY || this->accepted_cargo_filter_criteria != CargoFilterCriteria::CF_ANY;
this->industries.SetFilterState(is_filtering_necessary); this->industries.SetFilterState(is_filtering_necessary);
this->industries.SetFilterType(0); this->industries.SetFilterType(0);
@ -1367,8 +1361,8 @@ protected:
StringID GetCargoFilterLabel(CargoID cid) const StringID GetCargoFilterLabel(CargoID cid) const
{ {
switch (cid) { switch (cid) {
case CF_ANY: return STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES; case CargoFilterCriteria::CF_ANY: return STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES;
case CF_NONE: return STR_INDUSTRY_DIRECTORY_FILTER_NONE; case CargoFilterCriteria::CF_NONE: return STR_INDUSTRY_DIRECTORY_FILTER_NONE;
default: return CargoSpec::Get(cid)->name; default: return CargoSpec::Get(cid)->name;
} }
} }
@ -1378,12 +1372,12 @@ protected:
*/ */
void SetCargoFilterArray() void SetCargoFilterArray()
{ {
this->produced_cargo_filter_criteria = CF_ANY; this->produced_cargo_filter_criteria = CargoFilterCriteria::CF_ANY;
this->accepted_cargo_filter_criteria = CF_ANY; this->accepted_cargo_filter_criteria = CargoFilterCriteria::CF_ANY;
this->industries.SetFilterFuncs(_filter_funcs); this->industries.SetFilterFuncs(_filter_funcs);
bool is_filtering_necessary = this->produced_cargo_filter_criteria != CF_ANY || this->accepted_cargo_filter_criteria != CF_ANY; bool is_filtering_necessary = this->produced_cargo_filter_criteria != CargoFilterCriteria::CF_ANY || this->accepted_cargo_filter_criteria != CargoFilterCriteria::CF_ANY;
this->industries.SetFilterState(is_filtering_necessary); this->industries.SetFilterState(is_filtering_necessary);
} }
@ -1445,7 +1439,7 @@ protected:
{ {
assert(id < lengthof(i->produced_cargo)); assert(id < lengthof(i->produced_cargo));
if (i->produced_cargo[id] == CT_INVALID) return -1; if (i->produced_cargo[id] == INVALID_CARGO) return -1;
return ToPercent8(i->last_month_pct_transported[id]); return ToPercent8(i->last_month_pct_transported[id]);
} }
@ -1459,11 +1453,11 @@ protected:
static int GetCargoTransportedSortValue(const Industry *i) static int GetCargoTransportedSortValue(const Industry *i)
{ {
CargoID filter = IndustryDirectoryWindow::produced_cargo_filter; CargoID filter = IndustryDirectoryWindow::produced_cargo_filter;
if (filter == CF_NONE) return 0; if (filter == CargoFilterCriteria::CF_NONE) return 0;
int percentage = 0, produced_cargo_count = 0; int percentage = 0, produced_cargo_count = 0;
for (uint id = 0; id < lengthof(i->produced_cargo); id++) { for (uint id = 0; id < lengthof(i->produced_cargo); id++) {
if (filter == CF_ANY) { if (filter == CargoFilterCriteria::CF_ANY) {
int transported = GetCargoTransportedPercentsIfValid(i, id); int transported = GetCargoTransportedPercentsIfValid(i, id);
if (transported != -1) { if (transported != -1) {
produced_cargo_count++; produced_cargo_count++;
@ -1503,13 +1497,13 @@ protected:
/** Sort industries by production and name */ /** Sort industries by production and name */
static bool IndustryProductionSorter(const Industry * const &a, const Industry * const &b, const CargoID &filter) static bool IndustryProductionSorter(const Industry * const &a, const Industry * const &b, const CargoID &filter)
{ {
if (filter == CF_NONE) return IndustryTypeSorter(a, b, filter); if (filter == CargoFilterCriteria::CF_NONE) return IndustryTypeSorter(a, b, filter);
uint prod_a = 0, prod_b = 0; uint prod_a = 0, prod_b = 0;
for (uint i = 0; i < lengthof(a->produced_cargo); i++) { for (uint i = 0; i < lengthof(a->produced_cargo); i++) {
if (filter == CF_ANY) { if (filter == CargoFilterCriteria::CF_ANY) {
if (a->produced_cargo[i] != CT_INVALID) prod_a += a->last_month_production[i]; if (a->produced_cargo[i] != INVALID_CARGO) prod_a += a->last_month_production[i];
if (b->produced_cargo[i] != CT_INVALID) prod_b += b->last_month_production[i]; if (b->produced_cargo[i] != INVALID_CARGO) prod_b += b->last_month_production[i];
} else { } else {
if (a->produced_cargo[i] == filter) prod_a += a->last_month_production[i]; if (a->produced_cargo[i] == filter) prod_a += a->last_month_production[i];
if (b->produced_cargo[i] == filter) prod_b += b->last_month_production[i]; if (b->produced_cargo[i] == filter) prod_b += b->last_month_production[i];
@ -1553,7 +1547,7 @@ protected:
std::vector<CargoInfo> cargos; std::vector<CargoInfo> cargos;
for (byte j = 0; j < lengthof(i->produced_cargo); j++) { for (byte j = 0; j < lengthof(i->produced_cargo); j++) {
if (i->produced_cargo[j] == CT_INVALID) continue; if (i->produced_cargo[j] == INVALID_CARGO) continue;
cargos.push_back({ i->produced_cargo[j], i->last_month_production[j], cargo_suffix[j].text.c_str(), ToPercent8(i->last_month_pct_transported[j]) }); cargos.push_back({ i->produced_cargo[j], i->last_month_production[j], cargo_suffix[j].text.c_str(), ToPercent8(i->last_month_pct_transported[j]) });
} }
@ -1580,7 +1574,7 @@ protected:
/* If the produced cargo filter is active then move the filtered cargo to the beginning of the list, /* If the produced cargo filter is active then move the filtered cargo to the beginning of the list,
* because this is the one the player interested in, and that way it is not hidden in the 'n' more cargos */ * because this is the one the player interested in, and that way it is not hidden in the 'n' more cargos */
const CargoID cid = this->produced_cargo_filter_criteria; const CargoID cid = this->produced_cargo_filter_criteria;
if (cid != CF_ANY && cid != CF_NONE) { if (cid != CargoFilterCriteria::CF_ANY && cid != CargoFilterCriteria::CF_NONE) {
auto filtered_ci = std::find_if(cargos.begin(), cargos.end(), [cid](const CargoInfo &ci) -> bool { auto filtered_ci = std::find_if(cargos.begin(), cargos.end(), [cid](const CargoInfo &ci) -> bool {
return ci.cargo_id == cid; return ci.cargo_id == cid;
}); });
@ -1689,7 +1683,7 @@ public:
const CargoID acf_cid = this->accepted_cargo_filter_criteria; const CargoID acf_cid = this->accepted_cargo_filter_criteria;
for (uint i = this->vscroll->GetPosition(); i < this->industries.size(); i++) { for (uint i = this->vscroll->GetPosition(); i < this->industries.size(); i++) {
TextColour tc = TC_FROMSTRING; TextColour tc = TC_FROMSTRING;
if (acf_cid != CF_ANY && acf_cid != CF_NONE) { if (acf_cid != CargoFilterCriteria::CF_ANY && acf_cid != CargoFilterCriteria::CF_NONE) {
Industry *ind = const_cast<Industry *>(this->industries[i]); Industry *ind = const_cast<Industry *>(this->industries[i]);
if (IndustryTemporarilyRefusesCargo(ind, acf_cid)) { if (IndustryTemporarilyRefusesCargo(ind, acf_cid)) {
tc = TC_GREY | TC_FORCED; tc = TC_GREY | TC_FORCED;
@ -1744,9 +1738,9 @@ public:
DropDownList list; DropDownList list;
/* Add item for disabling filtering. */ /* Add item for disabling filtering. */
list.push_back(std::make_unique<DropDownListStringItem>(this->GetCargoFilterLabel(CF_ANY), CF_ANY, false)); list.push_back(std::make_unique<DropDownListStringItem>(this->GetCargoFilterLabel(CargoFilterCriteria::CF_ANY), CargoFilterCriteria::CF_ANY, false));
/* Add item for industries not producing anything, e.g. power plants */ /* Add item for industries not producing anything, e.g. power plants */
list.push_back(std::make_unique<DropDownListStringItem>(this->GetCargoFilterLabel(CF_NONE), CF_NONE, false)); list.push_back(std::make_unique<DropDownListStringItem>(this->GetCargoFilterLabel(CargoFilterCriteria::CF_NONE), CargoFilterCriteria::CF_NONE, false));
/* Add cargos */ /* Add cargos */
Dimension d = GetLargestCargoIconSize(); Dimension d = GetLargestCargoIconSize();
@ -1906,7 +1900,7 @@ const StringID IndustryDirectoryWindow::sorter_names[] = {
INVALID_STRING_ID INVALID_STRING_ID
}; };
CargoID IndustryDirectoryWindow::produced_cargo_filter = CF_ANY; CargoID IndustryDirectoryWindow::produced_cargo_filter = CargoFilterCriteria::CF_ANY;
/** Window definition of the industry directory gui */ /** Window definition of the industry directory gui */
@ -2000,15 +1994,15 @@ struct CargoesField {
CargoID other_accepted[MAX_CARGOES]; ///< Cargoes accepted but not used in this figure. CargoID other_accepted[MAX_CARGOES]; ///< Cargoes accepted but not used in this figure.
} industry; ///< Industry data (for #CFT_INDUSTRY). } industry; ///< Industry data (for #CFT_INDUSTRY).
struct { struct {
CargoID vertical_cargoes[MAX_CARGOES]; ///< Cargoes running from top to bottom (cargo ID or #CT_INVALID). CargoID vertical_cargoes[MAX_CARGOES]; ///< Cargoes running from top to bottom (cargo ID or #INVALID_CARGO).
uint8_t num_cargoes; ///< Number of cargoes. uint8_t num_cargoes; ///< Number of cargoes.
CargoID supp_cargoes[MAX_CARGOES]; ///< Cargoes entering from the left (index in #vertical_cargoes, or #CT_INVALID). CargoID supp_cargoes[MAX_CARGOES]; ///< Cargoes entering from the left (index in #vertical_cargoes, or #INVALID_CARGO).
uint8_t top_end; ///< Stop at the top of the vertical cargoes. uint8_t top_end; ///< Stop at the top of the vertical cargoes.
CargoID cust_cargoes[MAX_CARGOES]; ///< Cargoes leaving to the right (index in #vertical_cargoes, or #CT_INVALID). CargoID cust_cargoes[MAX_CARGOES]; ///< Cargoes leaving to the right (index in #vertical_cargoes, or #INVALID_CARGO).
uint8_t bottom_end; ///< Stop at the bottom of the vertical cargoes. uint8_t bottom_end; ///< Stop at the bottom of the vertical cargoes.
} cargo; ///< Cargo data (for #CFT_CARGO). } cargo; ///< Cargo data (for #CFT_CARGO).
struct { struct {
CargoID cargoes[MAX_CARGOES]; ///< Cargoes to display (or #CT_INVALID). CargoID cargoes[MAX_CARGOES]; ///< Cargoes to display (or #INVALID_CARGO).
bool left_align; ///< Align all cargo texts to the left (else align to the right). bool left_align; ///< Align all cargo texts to the left (else align to the right).
} cargo_label; ///< Label data (for #CFT_CARGO_LABEL). } cargo_label; ///< Label data (for #CFT_CARGO_LABEL).
StringID header; ///< Header text (for #CFT_HEADER). StringID header; ///< Header text (for #CFT_HEADER).
@ -2032,8 +2026,8 @@ struct CargoesField {
{ {
this->type = CFT_INDUSTRY; this->type = CFT_INDUSTRY;
this->u.industry.ind_type = ind_type; this->u.industry.ind_type = ind_type;
std::fill(std::begin(this->u.industry.other_accepted), std::end(this->u.industry.other_accepted), CT_INVALID); std::fill(std::begin(this->u.industry.other_accepted), std::end(this->u.industry.other_accepted), INVALID_CARGO);
std::fill(std::begin(this->u.industry.other_produced), std::end(this->u.industry.other_produced), CT_INVALID); std::fill(std::begin(this->u.industry.other_produced), std::end(this->u.industry.other_produced), INVALID_CARGO);
} }
/** /**
@ -2045,7 +2039,7 @@ struct CargoesField {
int ConnectCargo(CargoID cargo, bool producer) int ConnectCargo(CargoID cargo, bool producer)
{ {
assert(this->type == CFT_CARGO); assert(this->type == CFT_CARGO);
if (cargo == CT_INVALID) return -1; if (cargo == INVALID_CARGO) return -1;
/* Find the vertical cargo column carrying the cargo. */ /* Find the vertical cargo column carrying the cargo. */
int column = -1; int column = -1;
@ -2058,10 +2052,10 @@ struct CargoesField {
if (column < 0) return -1; if (column < 0) return -1;
if (producer) { if (producer) {
assert(this->u.cargo.supp_cargoes[column] == CT_INVALID); assert(this->u.cargo.supp_cargoes[column] == INVALID_CARGO);
this->u.cargo.supp_cargoes[column] = column; this->u.cargo.supp_cargoes[column] = column;
} else { } else {
assert(this->u.cargo.cust_cargoes[column] == CT_INVALID); assert(this->u.cargo.cust_cargoes[column] == INVALID_CARGO);
this->u.cargo.cust_cargoes[column] = column; this->u.cargo.cust_cargoes[column] = column;
} }
return column; return column;
@ -2076,15 +2070,15 @@ struct CargoesField {
assert(this->type == CFT_CARGO); assert(this->type == CFT_CARGO);
for (uint i = 0; i < MAX_CARGOES; i++) { for (uint i = 0; i < MAX_CARGOES; i++) {
if (this->u.cargo.supp_cargoes[i] != CT_INVALID) return true; if (this->u.cargo.supp_cargoes[i] != INVALID_CARGO) return true;
if (this->u.cargo.cust_cargoes[i] != CT_INVALID) return true; if (this->u.cargo.cust_cargoes[i] != INVALID_CARGO) return true;
} }
return false; return false;
} }
/** /**
* Make a piece of cargo column. * Make a piece of cargo column.
* @param cargoes Array of #CargoID (may contain #CT_INVALID). * @param cargoes Array of #CargoID (may contain #INVALID_CARGO).
* @param length Number of cargoes in \a cargoes. * @param length Number of cargoes in \a cargoes.
* @param count Number of cargoes to display (should be at least the number of valid cargoes, or \c -1 to let the method compute it). * @param count Number of cargoes to display (should be at least the number of valid cargoes, or \c -1 to let the method compute it).
* @param top_end This is the first cargo field of this column. * @param top_end This is the first cargo field of this column.
@ -2096,7 +2090,7 @@ struct CargoesField {
this->type = CFT_CARGO; this->type = CFT_CARGO;
auto insert = std::begin(this->u.cargo.vertical_cargoes); auto insert = std::begin(this->u.cargo.vertical_cargoes);
for (size_t i = 0; insert != std::end(this->u.cargo.vertical_cargoes) && i < length; i++) { for (size_t i = 0; insert != std::end(this->u.cargo.vertical_cargoes) && i < length; i++) {
if (cargoes[i] != CT_INVALID) { if (cargoes[i] != INVALID_CARGO) {
*insert = cargoes[i]; *insert = cargoes[i];
++insert; ++insert;
} }
@ -2104,16 +2098,16 @@ struct CargoesField {
this->u.cargo.num_cargoes = (count < 0) ? static_cast<uint8_t>(insert - std::begin(this->u.cargo.vertical_cargoes)) : count; this->u.cargo.num_cargoes = (count < 0) ? static_cast<uint8_t>(insert - std::begin(this->u.cargo.vertical_cargoes)) : count;
CargoIDComparator comparator; CargoIDComparator comparator;
std::sort(std::begin(this->u.cargo.vertical_cargoes), insert, comparator); std::sort(std::begin(this->u.cargo.vertical_cargoes), insert, comparator);
std::fill(insert, std::end(this->u.cargo.vertical_cargoes), CT_INVALID); std::fill(insert, std::end(this->u.cargo.vertical_cargoes), INVALID_CARGO);
this->u.cargo.top_end = top_end; this->u.cargo.top_end = top_end;
this->u.cargo.bottom_end = bottom_end; this->u.cargo.bottom_end = bottom_end;
std::fill(std::begin(this->u.cargo.supp_cargoes), std::end(this->u.cargo.supp_cargoes), CT_INVALID); std::fill(std::begin(this->u.cargo.supp_cargoes), std::end(this->u.cargo.supp_cargoes), INVALID_CARGO);
std::fill(std::begin(this->u.cargo.cust_cargoes), std::end(this->u.cargo.cust_cargoes), CT_INVALID); std::fill(std::begin(this->u.cargo.cust_cargoes), std::end(this->u.cargo.cust_cargoes), INVALID_CARGO);
} }
/** /**
* Make a field displaying cargo type names. * Make a field displaying cargo type names.
* @param cargoes Array of #CargoID (may contain #CT_INVALID). * @param cargoes Array of #CargoID (may contain #INVALID_CARGO).
* @param length Number of cargoes in \a cargoes. * @param length Number of cargoes in \a cargoes.
* @param left_align ALign texts to the left (else to the right). * @param left_align ALign texts to the left (else to the right).
*/ */
@ -2122,7 +2116,7 @@ struct CargoesField {
this->type = CFT_CARGO_LABEL; this->type = CFT_CARGO_LABEL;
uint i; uint i;
for (i = 0; i < MAX_CARGOES && i < length; i++) this->u.cargo_label.cargoes[i] = cargoes[i]; for (i = 0; i < MAX_CARGOES && i < length; i++) this->u.cargo_label.cargoes[i] = cargoes[i];
for (; i < MAX_CARGOES; i++) this->u.cargo_label.cargoes[i] = CT_INVALID; for (; i < MAX_CARGOES; i++) this->u.cargo_label.cargoes[i] = INVALID_CARGO;
this->u.cargo_label.left_align = left_align; this->u.cargo_label.left_align = left_align;
} }
@ -2202,13 +2196,13 @@ struct CargoesField {
} }
ypos1 += CargoesField::cargo_border.height + (GetCharacterHeight(FS_NORMAL) - CargoesField::cargo_line.height) / 2; ypos1 += CargoesField::cargo_border.height + (GetCharacterHeight(FS_NORMAL) - CargoesField::cargo_line.height) / 2;
for (uint i = 0; i < CargoesField::max_cargoes; i++) { for (uint i = 0; i < CargoesField::max_cargoes; i++) {
if (other_right[i] != CT_INVALID) { if (other_right[i] != INVALID_CARGO) {
const CargoSpec *csp = CargoSpec::Get(other_right[i]); const CargoSpec *csp = CargoSpec::Get(other_right[i]);
int xp = xpos + industry_width + CargoesField::cargo_stub.width; int xp = xpos + industry_width + CargoesField::cargo_stub.width;
DrawHorConnection(xpos + industry_width, xp - 1, ypos1, csp); DrawHorConnection(xpos + industry_width, xp - 1, ypos1, csp);
GfxDrawLine(xp, ypos1, xp, ypos1 + CargoesField::cargo_line.height - 1, CARGO_LINE_COLOUR); GfxDrawLine(xp, ypos1, xp, ypos1 + CargoesField::cargo_line.height - 1, CARGO_LINE_COLOUR);
} }
if (other_left[i] != CT_INVALID) { if (other_left[i] != INVALID_CARGO) {
const CargoSpec *csp = CargoSpec::Get(other_left[i]); const CargoSpec *csp = CargoSpec::Get(other_left[i]);
int xp = xpos - CargoesField::cargo_stub.width; int xp = xpos - CargoesField::cargo_stub.width;
DrawHorConnection(xp + 1, xpos - 1, ypos1, csp); DrawHorConnection(xp + 1, xpos - 1, ypos1, csp);
@ -2246,7 +2240,7 @@ struct CargoesField {
} }
ypos += CargoesField::cargo_border.height + vert_inter_industry_space / 2 + (GetCharacterHeight(FS_NORMAL) - CargoesField::cargo_line.height) / 2; ypos += CargoesField::cargo_border.height + vert_inter_industry_space / 2 + (GetCharacterHeight(FS_NORMAL) - CargoesField::cargo_line.height) / 2;
for (uint i = 0; i < MAX_CARGOES; i++) { for (uint i = 0; i < MAX_CARGOES; i++) {
if (hor_left[i] != CT_INVALID) { if (hor_left[i] != INVALID_CARGO) {
int col = hor_left[i]; int col = hor_left[i];
int dx = 0; int dx = 0;
const CargoSpec *csp = CargoSpec::Get(this->u.cargo.vertical_cargoes[col]); const CargoSpec *csp = CargoSpec::Get(this->u.cargo.vertical_cargoes[col]);
@ -2257,7 +2251,7 @@ struct CargoesField {
} }
DrawHorConnection(xpos, cargo_base - dx, ypos, csp); DrawHorConnection(xpos, cargo_base - dx, ypos, csp);
} }
if (hor_right[i] != CT_INVALID) { if (hor_right[i] != INVALID_CARGO) {
int col = hor_right[i]; int col = hor_right[i];
int dx = 0; int dx = 0;
const CargoSpec *csp = CargoSpec::Get(this->u.cargo.vertical_cargoes[col]); const CargoSpec *csp = CargoSpec::Get(this->u.cargo.vertical_cargoes[col]);
@ -2276,7 +2270,7 @@ struct CargoesField {
case CFT_CARGO_LABEL: case CFT_CARGO_LABEL:
ypos += CargoesField::cargo_border.height + vert_inter_industry_space / 2; ypos += CargoesField::cargo_border.height + vert_inter_industry_space / 2;
for (uint i = 0; i < MAX_CARGOES; i++) { for (uint i = 0; i < MAX_CARGOES; i++) {
if (this->u.cargo_label.cargoes[i] != CT_INVALID) { if (this->u.cargo_label.cargoes[i] != INVALID_CARGO) {
const CargoSpec *csp = CargoSpec::Get(this->u.cargo_label.cargoes[i]); const CargoSpec *csp = CargoSpec::Get(this->u.cargo_label.cargoes[i]);
DrawString(xpos + WidgetDimensions::scaled.framerect.left, xpos + industry_width - 1 - WidgetDimensions::scaled.framerect.right, ypos, csp->name, TC_WHITE, DrawString(xpos + WidgetDimensions::scaled.framerect.left, xpos + industry_width - 1 - WidgetDimensions::scaled.framerect.right, ypos, csp->name, TC_WHITE,
(this->u.cargo_label.left_align) ? SA_LEFT : SA_RIGHT); (this->u.cargo_label.left_align) ? SA_LEFT : SA_RIGHT);
@ -2295,7 +2289,7 @@ struct CargoesField {
* @param left Left industry neighbour if available (else \c nullptr should be supplied). * @param left Left industry neighbour if available (else \c nullptr should be supplied).
* @param right Right industry neighbour if available (else \c nullptr should be supplied). * @param right Right industry neighbour if available (else \c nullptr should be supplied).
* @param pt Click position in the cargo field. * @param pt Click position in the cargo field.
* @return Cargo clicked at, or #CT_INVALID if none. * @return Cargo clicked at, or #INVALID_CARGO if none.
*/ */
CargoID CargoClickedAt(const CargoesField *left, const CargoesField *right, Point pt) const CargoID CargoClickedAt(const CargoesField *left, const CargoesField *right, Point pt) const
{ {
@ -2314,50 +2308,50 @@ struct CargoesField {
int vpos = vert_inter_industry_space / 2 + CargoesField::cargo_border.width; int vpos = vert_inter_industry_space / 2 + CargoesField::cargo_border.width;
uint row; uint row;
for (row = 0; row < MAX_CARGOES; row++) { for (row = 0; row < MAX_CARGOES; row++) {
if (pt.y < vpos) return CT_INVALID; if (pt.y < vpos) return INVALID_CARGO;
if (pt.y < vpos + GetCharacterHeight(FS_NORMAL)) break; if (pt.y < vpos + GetCharacterHeight(FS_NORMAL)) break;
vpos += GetCharacterHeight(FS_NORMAL) + CargoesField::cargo_space.width; vpos += GetCharacterHeight(FS_NORMAL) + CargoesField::cargo_space.width;
} }
if (row == MAX_CARGOES) return CT_INVALID; if (row == MAX_CARGOES) return INVALID_CARGO;
/* row = 0 -> at first horizontal row, row = 1 -> second horizontal row, 2 = 3rd horizontal row. */ /* row = 0 -> at first horizontal row, row = 1 -> second horizontal row, 2 = 3rd horizontal row. */
if (col == 0) { if (col == 0) {
if (this->u.cargo.supp_cargoes[row] != CT_INVALID) return this->u.cargo.vertical_cargoes[this->u.cargo.supp_cargoes[row]]; if (this->u.cargo.supp_cargoes[row] != INVALID_CARGO) return this->u.cargo.vertical_cargoes[this->u.cargo.supp_cargoes[row]];
if (left != nullptr) { if (left != nullptr) {
if (left->type == CFT_INDUSTRY) return left->u.industry.other_produced[row]; if (left->type == CFT_INDUSTRY) return left->u.industry.other_produced[row];
if (left->type == CFT_CARGO_LABEL && !left->u.cargo_label.left_align) return left->u.cargo_label.cargoes[row]; if (left->type == CFT_CARGO_LABEL && !left->u.cargo_label.left_align) return left->u.cargo_label.cargoes[row];
} }
return CT_INVALID; return INVALID_CARGO;
} }
if (col == this->u.cargo.num_cargoes) { if (col == this->u.cargo.num_cargoes) {
if (this->u.cargo.cust_cargoes[row] != CT_INVALID) return this->u.cargo.vertical_cargoes[this->u.cargo.cust_cargoes[row]]; if (this->u.cargo.cust_cargoes[row] != INVALID_CARGO) return this->u.cargo.vertical_cargoes[this->u.cargo.cust_cargoes[row]];
if (right != nullptr) { if (right != nullptr) {
if (right->type == CFT_INDUSTRY) return right->u.industry.other_accepted[row]; if (right->type == CFT_INDUSTRY) return right->u.industry.other_accepted[row];
if (right->type == CFT_CARGO_LABEL && right->u.cargo_label.left_align) return right->u.cargo_label.cargoes[row]; if (right->type == CFT_CARGO_LABEL && right->u.cargo_label.left_align) return right->u.cargo_label.cargoes[row];
} }
return CT_INVALID; return INVALID_CARGO;
} }
if (row >= col) { if (row >= col) {
/* Clicked somewhere in-between vertical cargo connection. /* Clicked somewhere in-between vertical cargo connection.
* Since the horizontal connection is made in the same order as the vertical list, the above condition * Since the horizontal connection is made in the same order as the vertical list, the above condition
* ensures we are left-below the main diagonal, thus at the supplying side. * ensures we are left-below the main diagonal, thus at the supplying side.
*/ */
if (this->u.cargo.supp_cargoes[row] == CT_INVALID) return CT_INVALID; if (this->u.cargo.supp_cargoes[row] == INVALID_CARGO) return INVALID_CARGO;
return this->u.cargo.vertical_cargoes[this->u.cargo.supp_cargoes[row]]; return this->u.cargo.vertical_cargoes[this->u.cargo.supp_cargoes[row]];
} else { } else {
/* Clicked at a customer connection. */ /* Clicked at a customer connection. */
if (this->u.cargo.cust_cargoes[row] == CT_INVALID) return CT_INVALID; if (this->u.cargo.cust_cargoes[row] == INVALID_CARGO) return INVALID_CARGO;
return this->u.cargo.vertical_cargoes[this->u.cargo.cust_cargoes[row]]; return this->u.cargo.vertical_cargoes[this->u.cargo.cust_cargoes[row]];
} }
/* Clicked at a customer connection. */ /* Clicked at a customer connection. */
if (IsValidCargoID(this->u.cargo.cust_cargoes[row])) return this->u.cargo.vertical_cargoes[this->u.cargo.cust_cargoes[row]]; if (IsValidCargoID(this->u.cargo.cust_cargoes[row])) return this->u.cargo.vertical_cargoes[this->u.cargo.cust_cargoes[row]];
return CT_INVALID; return INVALID_CARGO;
} }
/** /**
* Decide what cargo the user clicked in the cargo label field. * Decide what cargo the user clicked in the cargo label field.
* @param pt Click position in the cargo label field. * @param pt Click position in the cargo label field.
* @return Cargo clicked at, or #CT_INVALID if none. * @return Cargo clicked at, or #INVALID_CARGO if none.
*/ */
CargoID CargoLabelClickedAt(Point pt) const CargoID CargoLabelClickedAt(Point pt) const
{ {
@ -2366,11 +2360,11 @@ struct CargoesField {
int vpos = vert_inter_industry_space / 2 + CargoesField::cargo_border.height; int vpos = vert_inter_industry_space / 2 + CargoesField::cargo_border.height;
uint row; uint row;
for (row = 0; row < MAX_CARGOES; row++) { for (row = 0; row < MAX_CARGOES; row++) {
if (pt.y < vpos) return CT_INVALID; if (pt.y < vpos) return INVALID_CARGO;
if (pt.y < vpos + GetCharacterHeight(FS_NORMAL)) break; if (pt.y < vpos + GetCharacterHeight(FS_NORMAL)) break;
vpos += GetCharacterHeight(FS_NORMAL) + CargoesField::cargo_space.height; vpos += GetCharacterHeight(FS_NORMAL) + CargoesField::cargo_space.height;
} }
if (row == MAX_CARGOES) return CT_INVALID; if (row == MAX_CARGOES) return INVALID_CARGO;
return this->u.cargo_label.cargoes[row]; return this->u.cargo_label.cargoes[row];
} }
@ -2425,7 +2419,7 @@ struct CargoesRow {
CargoesField *cargo_fld = this->columns + column + 1; CargoesField *cargo_fld = this->columns + column + 1;
assert(ind_fld->type == CFT_INDUSTRY && cargo_fld->type == CFT_CARGO); assert(ind_fld->type == CFT_INDUSTRY && cargo_fld->type == CFT_CARGO);
std::fill(std::begin(ind_fld->u.industry.other_produced), std::end(ind_fld->u.industry.other_produced), CT_INVALID); std::fill(std::begin(ind_fld->u.industry.other_produced), std::end(ind_fld->u.industry.other_produced), INVALID_CARGO);
if (ind_fld->u.industry.ind_type < NUM_INDUSTRYTYPES) { if (ind_fld->u.industry.ind_type < NUM_INDUSTRYTYPES) {
CargoID others[MAX_CARGOES]; // Produced cargoes not carried in the cargo column. CargoID others[MAX_CARGOES]; // Produced cargoes not carried in the cargo column.
@ -2440,7 +2434,7 @@ struct CargoesRow {
/* Allocate other cargoes in the empty holes of the horizontal cargo connections. */ /* Allocate other cargoes in the empty holes of the horizontal cargo connections. */
for (uint i = 0; i < CargoesField::max_cargoes && other_count > 0; i++) { for (uint i = 0; i < CargoesField::max_cargoes && other_count > 0; i++) {
if (cargo_fld->u.cargo.supp_cargoes[i] == CT_INVALID) ind_fld->u.industry.other_produced[i] = others[--other_count]; if (cargo_fld->u.cargo.supp_cargoes[i] == INVALID_CARGO) ind_fld->u.industry.other_produced[i] = others[--other_count];
} }
} else { } else {
/* Houses only display what is demanded. */ /* Houses only display what is demanded. */
@ -2459,7 +2453,7 @@ struct CargoesRow {
void MakeCargoLabel(int column, bool accepting) void MakeCargoLabel(int column, bool accepting)
{ {
CargoID cargoes[MAX_CARGOES]; CargoID cargoes[MAX_CARGOES];
std::fill(std::begin(cargoes), std::end(cargoes), CT_INVALID); std::fill(std::begin(cargoes), std::end(cargoes), INVALID_CARGO);
CargoesField *label_fld = this->columns + column; CargoesField *label_fld = this->columns + column;
CargoesField *cargo_fld = this->columns + (accepting ? column - 1 : column + 1); CargoesField *cargo_fld = this->columns + (accepting ? column - 1 : column + 1);
@ -2483,7 +2477,7 @@ struct CargoesRow {
CargoesField *cargo_fld = this->columns + column - 1; CargoesField *cargo_fld = this->columns + column - 1;
assert(ind_fld->type == CFT_INDUSTRY && cargo_fld->type == CFT_CARGO); assert(ind_fld->type == CFT_INDUSTRY && cargo_fld->type == CFT_CARGO);
std::fill(std::begin(ind_fld->u.industry.other_accepted), std::end(ind_fld->u.industry.other_accepted), CT_INVALID); std::fill(std::begin(ind_fld->u.industry.other_accepted), std::end(ind_fld->u.industry.other_accepted), INVALID_CARGO);
if (ind_fld->u.industry.ind_type < NUM_INDUSTRYTYPES) { if (ind_fld->u.industry.ind_type < NUM_INDUSTRYTYPES) {
CargoID others[MAX_CARGOES]; // Accepted cargoes not carried in the cargo column. CargoID others[MAX_CARGOES]; // Accepted cargoes not carried in the cargo column.
@ -2498,7 +2492,7 @@ struct CargoesRow {
/* Allocate other cargoes in the empty holes of the horizontal cargo connections. */ /* Allocate other cargoes in the empty holes of the horizontal cargo connections. */
for (uint i = 0; i < CargoesField::max_cargoes && other_count > 0; i++) { for (uint i = 0; i < CargoesField::max_cargoes && other_count > 0; i++) {
if (cargo_fld->u.cargo.cust_cargoes[i] == CT_INVALID) ind_fld->u.industry.other_accepted[i] = others[--other_count]; if (cargo_fld->u.cargo.cust_cargoes[i] == INVALID_CARGO) ind_fld->u.industry.other_accepted[i] = others[--other_count];
} }
} else { } else {
/* Houses only display what is demanded. */ /* Houses only display what is demanded. */
@ -2680,7 +2674,7 @@ struct IndustryCargoesWindow : public Window {
static bool HasCommonValidCargo(const CargoID *cargoes1, size_t length1, const CargoID *cargoes2, size_t length2) static bool HasCommonValidCargo(const CargoID *cargoes1, size_t length1, const CargoID *cargoes2, size_t length2)
{ {
while (length1 > 0) { while (length1 > 0) {
if (*cargoes1 != CT_INVALID) { if (*cargoes1 != INVALID_CARGO) {
for (size_t i = 0; i < length2; i++) if (*cargoes1 == cargoes2[i]) return true; for (size_t i = 0; i < length2; i++) if (*cargoes1 == cargoes2[i]) return true;
} }
cargoes1++; cargoes1++;
@ -2698,7 +2692,7 @@ struct IndustryCargoesWindow : public Window {
static bool HousesCanSupply(const CargoID *cargoes, size_t length) static bool HousesCanSupply(const CargoID *cargoes, size_t length)
{ {
for (size_t i = 0; i < length; i++) { for (size_t i = 0; i < length; i++) {
if (cargoes[i] == CT_INVALID) continue; if (cargoes[i] == INVALID_CARGO) continue;
if (cargoes[i] == CT_PASSENGERS || cargoes[i] == CT_MAIL) return true; if (cargoes[i] == CT_PASSENGERS || cargoes[i] == CT_MAIL) return true;
} }
return false; return false;
@ -2721,7 +2715,7 @@ struct IndustryCargoesWindow : public Window {
default: NOT_REACHED(); default: NOT_REACHED();
} }
for (size_t i = 0; i < length; i++) { for (size_t i = 0; i < length; i++) {
if (cargoes[i] == CT_INVALID) continue; if (cargoes[i] == INVALID_CARGO) continue;
for (uint h = 0; h < NUM_HOUSES; h++) { for (uint h = 0; h < NUM_HOUSES; h++) {
HouseSpec *hs = HouseSpec::Get(h); HouseSpec *hs = HouseSpec::Get(h);
@ -3095,13 +3089,13 @@ struct IndustryCargoesWindow : public Window {
CargoesField *lft = (fieldxy.x > 0) ? this->fields[fieldxy.y].columns + fieldxy.x - 1 : nullptr; CargoesField *lft = (fieldxy.x > 0) ? this->fields[fieldxy.y].columns + fieldxy.x - 1 : nullptr;
CargoesField *rgt = (fieldxy.x < 4) ? this->fields[fieldxy.y].columns + fieldxy.x + 1 : nullptr; CargoesField *rgt = (fieldxy.x < 4) ? this->fields[fieldxy.y].columns + fieldxy.x + 1 : nullptr;
CargoID cid = fld->CargoClickedAt(lft, rgt, xy); CargoID cid = fld->CargoClickedAt(lft, rgt, xy);
if (cid != CT_INVALID) this->ComputeCargoDisplay(cid); if (cid != INVALID_CARGO) this->ComputeCargoDisplay(cid);
break; break;
} }
case CFT_CARGO_LABEL: { case CFT_CARGO_LABEL: {
CargoID cid = fld->CargoLabelClickedAt(xy); CargoID cid = fld->CargoLabelClickedAt(xy);
if (cid != CT_INVALID) this->ComputeCargoDisplay(cid); if (cid != INVALID_CARGO) this->ComputeCargoDisplay(cid);
break; break;
} }
@ -3197,7 +3191,7 @@ struct IndustryCargoesWindow : public Window {
if (!CalculatePositionInWidget(pt, &fieldxy, &xy)) return false; if (!CalculatePositionInWidget(pt, &fieldxy, &xy)) return false;
const CargoesField *fld = this->fields[fieldxy.y].columns + fieldxy.x; const CargoesField *fld = this->fields[fieldxy.y].columns + fieldxy.x;
CargoID cid = CT_INVALID; CargoID cid = INVALID_CARGO;
switch (fld->type) { switch (fld->type) {
case CFT_CARGO: { case CFT_CARGO: {
CargoesField *lft = (fieldxy.x > 0) ? this->fields[fieldxy.y].columns + fieldxy.x - 1 : nullptr; CargoesField *lft = (fieldxy.x > 0) ? this->fields[fieldxy.y].columns + fieldxy.x - 1 : nullptr;
@ -3220,7 +3214,7 @@ struct IndustryCargoesWindow : public Window {
default: default:
break; break;
} }
if (cid != CT_INVALID && (this->ind_cargo < NUM_INDUSTRYTYPES || cid != this->ind_cargo - NUM_INDUSTRYTYPES)) { if (cid != INVALID_CARGO && (this->ind_cargo < NUM_INDUSTRYTYPES || cid != this->ind_cargo - NUM_INDUSTRYTYPES)) {
const CargoSpec *csp = CargoSpec::Get(cid); const CargoSpec *csp = CargoSpec::Get(cid);
SetDParam(0, csp->name); SetDParam(0, csp->name);
GuiShowTooltips(this, STR_INDUSTRY_CARGOES_CARGO_TOOLTIP, close_cond, 1); GuiShowTooltips(this, STR_INDUSTRY_CARGOES_CARGO_TOOLTIP, close_cond, 1);
@ -3315,7 +3309,7 @@ void ShowIndustryTooltip(Window *w, const TileIndex tile)
for (size_t i = 0; i < accepted_cargo_count; ++i) { for (size_t i = 0; i < accepted_cargo_count; ++i) {
CargoID required_cargo = industry->accepts_cargo[i]; CargoID required_cargo = industry->accepts_cargo[i];
if (required_cargo == CT_INVALID) { if (required_cargo == INVALID_CARGO) {
continue; continue;
} }
@ -3350,7 +3344,7 @@ void ShowIndustryTooltip(Window *w, const TileIndex tile)
if (stockpiling && _settings_client.gui.industry_tooltip_show_stockpiled) { if (stockpiling && _settings_client.gui.industry_tooltip_show_stockpiled) {
for (size_t i = 0; i < accepted_cargo_count; ++i) { for (size_t i = 0; i < accepted_cargo_count; ++i) {
CargoID stockpiled_cargo = industry->accepts_cargo[i]; CargoID stockpiled_cargo = industry->accepts_cargo[i];
if (stockpiled_cargo == CT_INVALID) continue; if (stockpiled_cargo == INVALID_CARGO) continue;
const CargoSuffix &suffix = suffixes[i]; const CargoSuffix &suffix = suffixes[i];
@ -3378,7 +3372,7 @@ void ShowIndustryTooltip(Window *w, const TileIndex tile)
for (size_t i = 0; i < produced_cargo_count; i++) { for (size_t i = 0; i < produced_cargo_count; i++) {
CargoID produced_cargo = industry->produced_cargo[i]; CargoID produced_cargo = industry->produced_cargo[i];
if (produced_cargo == CT_INVALID) continue; if (produced_cargo == INVALID_CARGO) continue;
if (!msg.empty()) msg += '\n'; if (!msg.empty()) msg += '\n';

@ -771,7 +771,7 @@ STR_SMALLMAP_LEGENDA_AIRCRAFT :{TINY_FONT}{BLA
STR_SMALLMAP_LEGENDA_TRANSPORT_ROUTES :{TINY_FONT}{BLACK}Transport Routes STR_SMALLMAP_LEGENDA_TRANSPORT_ROUTES :{TINY_FONT}{BLACK}Transport Routes
STR_SMALLMAP_LEGENDA_FOREST :{TINY_FONT}{BLACK}Forest STR_SMALLMAP_LEGENDA_FOREST :{TINY_FONT}{BLACK}Forest
STR_SMALLMAP_LEGENDA_RAILROAD_STATION :{TINY_FONT}{BLACK}Railway Station STR_SMALLMAP_LEGENDA_RAILROAD_STATION :{TINY_FONT}{BLACK}Railway Station
STR_SMALLMAP_LEGENDA_TRUCK_LOADING_BAY :{TINY_FONT}{BLACK}Truck Loading Bay STR_SMALLMAP_LEGENDA_TRUCK_LOADING_BAY :{TINY_FONT}{BLACK}Lorry Station
STR_SMALLMAP_LEGENDA_BUS_STATION :{TINY_FONT}{BLACK}Bus Station STR_SMALLMAP_LEGENDA_BUS_STATION :{TINY_FONT}{BLACK}Bus Station
STR_SMALLMAP_LEGENDA_AIRPORT_HELIPORT :{TINY_FONT}{BLACK}Airport/Heliport STR_SMALLMAP_LEGENDA_AIRPORT_HELIPORT :{TINY_FONT}{BLACK}Airport/Heliport
STR_SMALLMAP_LEGENDA_DOCK :{TINY_FONT}{BLACK}Dock STR_SMALLMAP_LEGENDA_DOCK :{TINY_FONT}{BLACK}Dock
@ -1002,6 +1002,7 @@ STR_GAME_OPTIONS_CURRENCY_HKD :Hong Kong Dolla
STR_GAME_OPTIONS_CURRENCY_INR :Indian Rupee STR_GAME_OPTIONS_CURRENCY_INR :Indian Rupee
STR_GAME_OPTIONS_CURRENCY_IDR :Indonesian Rupiah STR_GAME_OPTIONS_CURRENCY_IDR :Indonesian Rupiah
STR_GAME_OPTIONS_CURRENCY_MYR :Malaysian Ringgit STR_GAME_OPTIONS_CURRENCY_MYR :Malaysian Ringgit
STR_GAME_OPTIONS_CURRENCY_LVL :Latvian Lats
STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Autosave STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Autosave
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Select interval between automatic game saves STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Select interval between automatic game saves
@ -2723,9 +2724,9 @@ STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Maglev Construc
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Build railway track. Ctrl toggles build/remove for railway construction. Shift toggles building/showing cost estimate STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Build railway track. Ctrl toggles build/remove for railway construction. Shift toggles building/showing cost estimate
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Build railway track using the Autorail mode. Ctrl toggles build/remove for railway construction. Shift toggles building/showing cost estimate STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Build railway track using the Autorail mode. Ctrl toggles build/remove for railway construction. Shift toggles building/showing cost estimate
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Build train depot (for buying and servicing trains). Shift toggles building/showing cost estimate STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Build train depot (for buying and servicing trains). Shift toggles building/showing cost estimate
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Convert rail to waypoint. Ctrl enables joining waypoints. Shift toggles building/showing cost estimate STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Build waypoint on railway. Ctrl enables joining waypoints. Shift toggles building/showing cost estimate
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Build railway station. Ctrl enables joining stations. Shift toggles building/showing cost estimate STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Build railway station. Ctrl enables joining stations. Shift toggles building/showing cost estimate
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Build railway signals. Ctrl toggles semaphore/light signals{}Dragging builds signals along a straight stretch of rail. Ctrl builds signals till the next junction{}Ctrl+Click toggles opening the signal selection window. Shift toggles building/showing cost estimate STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Build signal on railway. Ctrl toggles semaphore/light signals{}Dragging builds signals along a straight stretch of rail. Ctrl builds signals up to the next junction or signal{}Ctrl+Click toggles opening the signal selection window. Shift toggles building/showing cost estimate
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Build railway bridge. Shift toggles building/showing cost estimate STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Build railway bridge. Shift toggles building/showing cost estimate
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Build railway tunnel. Shift toggles building/showing cost estimate STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Build railway tunnel. Shift toggles building/showing cost estimate
STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Toggle build/remove for railway track, signals, waypoints and stations. Hold Ctrl to also remove the rail of waypoints and stations STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Toggle build/remove for railway track, signals, waypoints and stations. Hold Ctrl to also remove the rail of waypoints and stations
@ -2813,7 +2814,7 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Build ro
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Build tram vehicle depot (for buying and servicing vehicles). Shift toggles building/showing cost estimate STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Build tram vehicle depot (for buying and servicing vehicles). Shift toggles building/showing cost estimate
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Build bus station. Ctrl enables joining stations. Shift toggles building/showing cost estimate STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Build bus station. Ctrl enables joining stations. Shift toggles building/showing cost estimate
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Build passenger tram station. Ctrl enables joining stations. Shift toggles building/showing cost estimate STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Build passenger tram station. Ctrl enables joining stations. Shift toggles building/showing cost estimate
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Build Truck loading bay. Ctrl enables joining stations. Shift toggles building/showing cost estimate STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Build lorry station. Ctrl enables joining stations. Shift toggles building/showing cost estimate
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Build freight tram station. Ctrl enables joining stations. Shift toggles building/showing cost estimate STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Build freight tram station. Ctrl enables joining stations. Shift toggles building/showing cost estimate
STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}Activate/Deactivate one way roads STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}Activate/Deactivate one way roads
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Build road bridge. Shift toggles building/showing cost estimate STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Build road bridge. Shift toggles building/showing cost estimate
@ -2838,7 +2839,7 @@ STR_BUILD_DEPOT_TRAM_ORIENTATION_SELECT_TOOLTIP :{BLACK}Select t
STR_STATION_BUILD_BUS_ORIENTATION :{WHITE}Bus Station Orientation STR_STATION_BUILD_BUS_ORIENTATION :{WHITE}Bus Station Orientation
STR_STATION_BUILD_BUS_ORIENTATION_TOOLTIP :{BLACK}Select bus station orientation STR_STATION_BUILD_BUS_ORIENTATION_TOOLTIP :{BLACK}Select bus station orientation
STR_STATION_BUILD_TRUCK_ORIENTATION :{WHITE}Truck Station Orientation STR_STATION_BUILD_TRUCK_ORIENTATION :{WHITE}Truck Station Orientation
STR_STATION_BUILD_TRUCK_ORIENTATION_TOOLTIP :{BLACK}Select Truck loading bay orientation STR_STATION_BUILD_TRUCK_ORIENTATION_TOOLTIP :{BLACK}Select lorry station orientation
STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION :{WHITE}Passenger Tram Station Orientation STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION :{WHITE}Passenger Tram Station Orientation
STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION_TOOLTIP :{BLACK}Select passenger tram station orientation STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION_TOOLTIP :{BLACK}Select passenger tram station orientation
STR_STATION_BUILD_CARGO_TRAM_ORIENTATION :{WHITE}Freight Tram Station Orientation STR_STATION_BUILD_CARGO_TRAM_ORIENTATION :{WHITE}Freight Tram Station Orientation
@ -3082,7 +3083,7 @@ STR_LAI_TREE_NAME_CACTUS_PLANTS :Cactus plants
STR_LAI_STATION_DESCRIPTION_RAILROAD_STATION :Railway station STR_LAI_STATION_DESCRIPTION_RAILROAD_STATION :Railway station
STR_LAI_STATION_DESCRIPTION_AIRCRAFT_HANGAR :Aircraft hangar STR_LAI_STATION_DESCRIPTION_AIRCRAFT_HANGAR :Aircraft hangar
STR_LAI_STATION_DESCRIPTION_AIRPORT :Airport STR_LAI_STATION_DESCRIPTION_AIRPORT :Airport
STR_LAI_STATION_DESCRIPTION_TRUCK_LOADING_AREA :Truck loading area STR_LAI_STATION_DESCRIPTION_TRUCK_LOADING_AREA :Lorry station
STR_LAI_STATION_DESCRIPTION_BUS_STATION :Bus station STR_LAI_STATION_DESCRIPTION_BUS_STATION :Bus station
STR_LAI_STATION_DESCRIPTION_SHIP_DOCK :Ship dock STR_LAI_STATION_DESCRIPTION_SHIP_DOCK :Ship dock
STR_LAI_STATION_DESCRIPTION_BUOY :Buoy STR_LAI_STATION_DESCRIPTION_BUOY :Buoy

@ -771,7 +771,7 @@ STR_SMALLMAP_LEGENDA_AIRCRAFT :{TINY_FONT}{BLA
STR_SMALLMAP_LEGENDA_TRANSPORT_ROUTES :{TINY_FONT}{BLACK}Transport Routes STR_SMALLMAP_LEGENDA_TRANSPORT_ROUTES :{TINY_FONT}{BLACK}Transport Routes
STR_SMALLMAP_LEGENDA_FOREST :{TINY_FONT}{BLACK}Forest STR_SMALLMAP_LEGENDA_FOREST :{TINY_FONT}{BLACK}Forest
STR_SMALLMAP_LEGENDA_RAILROAD_STATION :{TINY_FONT}{BLACK}Railroad Station STR_SMALLMAP_LEGENDA_RAILROAD_STATION :{TINY_FONT}{BLACK}Railroad Station
STR_SMALLMAP_LEGENDA_TRUCK_LOADING_BAY :{TINY_FONT}{BLACK}Truck Loading Bay STR_SMALLMAP_LEGENDA_TRUCK_LOADING_BAY :{TINY_FONT}{BLACK}Truck Station
STR_SMALLMAP_LEGENDA_BUS_STATION :{TINY_FONT}{BLACK}Bus Station STR_SMALLMAP_LEGENDA_BUS_STATION :{TINY_FONT}{BLACK}Bus Station
STR_SMALLMAP_LEGENDA_AIRPORT_HELIPORT :{TINY_FONT}{BLACK}Airport/Heliport STR_SMALLMAP_LEGENDA_AIRPORT_HELIPORT :{TINY_FONT}{BLACK}Airport/Heliport
STR_SMALLMAP_LEGENDA_DOCK :{TINY_FONT}{BLACK}Dock STR_SMALLMAP_LEGENDA_DOCK :{TINY_FONT}{BLACK}Dock
@ -1002,6 +1002,7 @@ STR_GAME_OPTIONS_CURRENCY_HKD :Hong Kong Dolla
STR_GAME_OPTIONS_CURRENCY_INR :Indian Rupee STR_GAME_OPTIONS_CURRENCY_INR :Indian Rupee
STR_GAME_OPTIONS_CURRENCY_IDR :Indonesian Rupiah STR_GAME_OPTIONS_CURRENCY_IDR :Indonesian Rupiah
STR_GAME_OPTIONS_CURRENCY_MYR :Malaysian Ringgit STR_GAME_OPTIONS_CURRENCY_MYR :Malaysian Ringgit
STR_GAME_OPTIONS_CURRENCY_LVL :Latvian Lats
STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Autosave STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Autosave
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Select interval between automatic game saves STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Select interval between automatic game saves
@ -2723,9 +2724,9 @@ STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Maglev Construc
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Build railroad track. Ctrl toggles build/remove for railroad construction. Shift toggles building/showing cost estimate STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Build railroad track. Ctrl toggles build/remove for railroad construction. Shift toggles building/showing cost estimate
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Build railroad track using the Autorail mode. Ctrl toggles build/remove for railroad construction. Shift toggles building/showing cost estimate STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Build railroad track using the Autorail mode. Ctrl toggles build/remove for railroad construction. Shift toggles building/showing cost estimate
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Build train depot (for buying and maintaining trains). Shift toggles building/showing cost estimate STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Build train depot (for buying and maintaining trains). Shift toggles building/showing cost estimate
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Convert rail to waypoint. Ctrl enables joining waypoints. Shift toggles building/showing cost estimate STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Build waypoint on railway. Ctrl enables joining waypoints. Shift toggles building/showing cost estimate
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Build railroad station. Ctrl enables joining stations. Shift toggles building/showing cost estimate STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Build railroad station. Ctrl enables joining stations. Shift toggles building/showing cost estimate
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Build railroad signals. Ctrl toggles semaphore/light signals{}Dragging builds signals along a straight stretch of track. Ctrl builds signals up to the next junction or signal{}Ctrl+Click toggles opening the signal selection window. Shift toggles building/showing cost estimate STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Build signal on railway. Ctrl toggles semaphore/light signals{}Dragging builds signals along a straight stretch of rail. Ctrl builds signals up to the next junction or signal{}Ctrl+Click toggles opening the signal selection window. Shift toggles building/showing cost estimate
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Build railroad bridge. Shift toggles building/showing cost estimate STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Build railroad bridge. Shift toggles building/showing cost estimate
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Build railroad tunnel. Shift toggles building/showing cost estimate STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Build railroad tunnel. Shift toggles building/showing cost estimate
STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Toggle build/remove for railroad track, signals, waypoints and stations. Hold Ctrl to also remove the rail of waypoints and stations STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Toggle build/remove for railroad track, signals, waypoints and stations. Hold Ctrl to also remove the rail of waypoints and stations
@ -2813,7 +2814,7 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Build ro
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Build tram vehicle depot (for buying and servicing vehicles). Shift toggles building/showing cost estimate STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Build tram vehicle depot (for buying and servicing vehicles). Shift toggles building/showing cost estimate
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Build bus station. Ctrl enables joining stations. Shift toggles building/showing cost estimate STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Build bus station. Ctrl enables joining stations. Shift toggles building/showing cost estimate
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Build passenger streetcar station. Ctrl enables joining stations. Shift toggles building/showing cost estimate STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Build passenger streetcar station. Ctrl enables joining stations. Shift toggles building/showing cost estimate
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Build truck loading bay. Ctrl enables joining stations. Shift toggles building/showing cost estimate STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Build truck station. Ctrl enables joining stations. Shift toggles building/showing cost estimate
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Build freight streetcar station. Ctrl enables joining stations. Shift toggles building/showing cost estimate STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Build freight streetcar station. Ctrl enables joining stations. Shift toggles building/showing cost estimate
STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}Activate/Deactivate one way roads STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}Activate/Deactivate one way roads
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Build road bridge. Shift toggles building/showing cost estimate STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Build road bridge. Shift toggles building/showing cost estimate
@ -2838,7 +2839,7 @@ STR_BUILD_DEPOT_TRAM_ORIENTATION_SELECT_TOOLTIP :{BLACK}Select s
STR_STATION_BUILD_BUS_ORIENTATION :{WHITE}Bus Station Orientation STR_STATION_BUILD_BUS_ORIENTATION :{WHITE}Bus Station Orientation
STR_STATION_BUILD_BUS_ORIENTATION_TOOLTIP :{BLACK}Select bus station orientation STR_STATION_BUILD_BUS_ORIENTATION_TOOLTIP :{BLACK}Select bus station orientation
STR_STATION_BUILD_TRUCK_ORIENTATION :{WHITE}Truck Station Orientation STR_STATION_BUILD_TRUCK_ORIENTATION :{WHITE}Truck Station Orientation
STR_STATION_BUILD_TRUCK_ORIENTATION_TOOLTIP :{BLACK}Select truck loading bay orientation STR_STATION_BUILD_TRUCK_ORIENTATION_TOOLTIP :{BLACK}Select truck station orientation
STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION :{WHITE}Passenger Streetcar Station Orientation STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION :{WHITE}Passenger Streetcar Station Orientation
STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION_TOOLTIP :{BLACK}Select passenger streetcar station orientation STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION_TOOLTIP :{BLACK}Select passenger streetcar station orientation
STR_STATION_BUILD_CARGO_TRAM_ORIENTATION :{WHITE}Freight Streetcar Station Orientation STR_STATION_BUILD_CARGO_TRAM_ORIENTATION :{WHITE}Freight Streetcar Station Orientation
@ -3082,7 +3083,7 @@ STR_LAI_TREE_NAME_CACTUS_PLANTS :Cactuses
STR_LAI_STATION_DESCRIPTION_RAILROAD_STATION :Railroad station STR_LAI_STATION_DESCRIPTION_RAILROAD_STATION :Railroad station
STR_LAI_STATION_DESCRIPTION_AIRCRAFT_HANGAR :Aircraft hangar STR_LAI_STATION_DESCRIPTION_AIRCRAFT_HANGAR :Aircraft hangar
STR_LAI_STATION_DESCRIPTION_AIRPORT :Airport STR_LAI_STATION_DESCRIPTION_AIRPORT :Airport
STR_LAI_STATION_DESCRIPTION_TRUCK_LOADING_AREA :Truck loading area STR_LAI_STATION_DESCRIPTION_TRUCK_LOADING_AREA :Truck station
STR_LAI_STATION_DESCRIPTION_BUS_STATION :Bus station STR_LAI_STATION_DESCRIPTION_BUS_STATION :Bus station
STR_LAI_STATION_DESCRIPTION_SHIP_DOCK :Ship dock STR_LAI_STATION_DESCRIPTION_SHIP_DOCK :Ship dock
STR_LAI_STATION_DESCRIPTION_BUOY :Buoy STR_LAI_STATION_DESCRIPTION_BUOY :Buoy

@ -1002,6 +1002,7 @@ STR_GAME_OPTIONS_CURRENCY_HKD :Hongkongin doll
STR_GAME_OPTIONS_CURRENCY_INR :Intian rupia STR_GAME_OPTIONS_CURRENCY_INR :Intian rupia
STR_GAME_OPTIONS_CURRENCY_IDR :Indonesian rupia STR_GAME_OPTIONS_CURRENCY_IDR :Indonesian rupia
STR_GAME_OPTIONS_CURRENCY_MYR :Malesian ringgit STR_GAME_OPTIONS_CURRENCY_MYR :Malesian ringgit
STR_GAME_OPTIONS_CURRENCY_LVL :Latvian lati
STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Automaattitallennus STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Automaattitallennus
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Valitse aikaväli automaattisille pelitallennuksille STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Valitse aikaväli automaattisille pelitallennuksille
@ -2723,9 +2724,9 @@ STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Maglevin rakent
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Rakenna rautateitä. Ctrl vaihtaa rakennus-/poistotilan välillä. Shift vaihtaa rakennustilan ja kustannusarvion välillä STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Rakenna rautateitä. Ctrl vaihtaa rakennus-/poistotilan välillä. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Rakenna rautatietä automaattisesti valittuun suuntaan. Ctrl vaihtaa rakennus-/poistotilan välillä. Shift vaihtaa rakennustilan ja kustannusarvion välillä STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Rakenna rautatietä automaattisesti valittuun suuntaan. Ctrl vaihtaa rakennus-/poistotilan välillä. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Rakenna veturitalli (junien ostamista ja huoltoa varten). Shift vaihtaa rakennustilan ja kustannusarvion välillä STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Rakenna veturitalli (junien ostamista ja huoltoa varten). Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Muunna raide reittipisteeksi. Ctrl liittää reittipisteet. Shift vaihtaa muuntotilan ja kustannusarvion välillä STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Rakenna reittipiste rautatielle. Ctrl mahdollistaa reittipisteiden yhdistämisen. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Rakenna rautatieasema. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Rakenna rautatieasema. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Rakenna opastimia. Ctrl vaihtaa siipi- ja valo-opastimien välillä{}Vetäminen rakentaa opastimia suoralle rataosuudelle. Ctrl rakentaa opastimia seuraavaan risteykseen tai opastimeen saakka{}Ctrl+napsautus avaa opastimenvalintaikkunan. Shift vaihtaa rakennustilan ja kustannusarvion välillä STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Rakenna opastin rautatielle. Ctrl vaihtaa siipi- ja valo-opastimien välillä{}Vetäminen rakentaa opastimia suoralle rataosuudelle. Ctrl rakentaa opastimia seuraavaan risteykseen tai opastimeen saakka{}Ctrl+napsautus avaa opastimenvalintaikkunan. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Rakenna rautatiesilta. Shift vaihtaa rakennustilan ja kustannusarvion välillä STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Rakenna rautatiesilta. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Rakenna rautatietunneli. Shift vaihtaa rakennustilan ja kustannusarvion välillä STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Rakenna rautatietunneli. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Rautatien, opastimien, reittipisteiden ja asemien rakentaminen/poisto päälle/pois. Pidä pohjassa Ctrl-näppäintä poistaaksesi myös aseman tai reittipisteen alla olevat raiteet STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Rautatien, opastimien, reittipisteiden ja asemien rakentaminen/poisto päälle/pois. Pidä pohjassa Ctrl-näppäintä poistaaksesi myös aseman tai reittipisteen alla olevat raiteet
@ -2813,7 +2814,7 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Rakenna
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Rakenna raitiotievarikko (vaunujen ostamiseen ja korjaamiseen). Shift vaihtaa rakennustilan ja kustannusarvion välillä STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Rakenna raitiotievarikko (vaunujen ostamiseen ja korjaamiseen). Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Rakenna linja-autoasema. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Rakenna linja-autoasema. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Rakenna raitiotien matkustaja-asema. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Rakenna raitiotien matkustaja-asema. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Rakenna lastauslaituri. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Rakenna lastauslaituri. Ctrl mahdollistaa laitureiden yhdistämisen yhdeksi asemaksi. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Rakenna raitiotien rahtiasema. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Rakenna raitiotien rahtiasema. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}Ota yksisuuntaiset tiet käyttöön/pois käytöstä STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}Ota yksisuuntaiset tiet käyttöön/pois käytöstä
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Rakenna maantiesilta. Shift vaihtaa rakennustilan ja kustannusarvion välillä STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Rakenna maantiesilta. Shift vaihtaa rakennustilan ja kustannusarvion välillä

@ -1151,7 +1151,7 @@ STR_SMALLMAP_LEGENDA_TRANSPORT_ROUTES :{TINY_FONT}{BLA
STR_SMALLMAP_LEGENDA_FOREST :{G=m}{TINY_FONT}{BLACK}Las STR_SMALLMAP_LEGENDA_FOREST :{G=m}{TINY_FONT}{BLACK}Las
STR_SMALLMAP_LEGENDA_FOREST.d :{TINY_FONT}{BLACK}Lasu STR_SMALLMAP_LEGENDA_FOREST.d :{TINY_FONT}{BLACK}Lasu
STR_SMALLMAP_LEGENDA_RAILROAD_STATION :{TINY_FONT}{BLACK}Stacja kolejowa STR_SMALLMAP_LEGENDA_RAILROAD_STATION :{TINY_FONT}{BLACK}Stacja kolejowa
STR_SMALLMAP_LEGENDA_TRUCK_LOADING_BAY :{TINY_FONT}{BLACK}Załadunek ciężarówek STR_SMALLMAP_LEGENDA_TRUCK_LOADING_BAY :{TINY_FONT}{BLACK}Stacja ciężarówek
STR_SMALLMAP_LEGENDA_BUS_STATION :{TINY_FONT}{BLACK}Przystanek STR_SMALLMAP_LEGENDA_BUS_STATION :{TINY_FONT}{BLACK}Przystanek
STR_SMALLMAP_LEGENDA_AIRPORT_HELIPORT :{TINY_FONT}{BLACK}Lotnisko STR_SMALLMAP_LEGENDA_AIRPORT_HELIPORT :{TINY_FONT}{BLACK}Lotnisko
STR_SMALLMAP_LEGENDA_DOCK :{TINY_FONT}{BLACK}Port STR_SMALLMAP_LEGENDA_DOCK :{TINY_FONT}{BLACK}Port
@ -1382,6 +1382,7 @@ STR_GAME_OPTIONS_CURRENCY_HKD :Dolar hongkońs
STR_GAME_OPTIONS_CURRENCY_INR :Rupia Indyjska STR_GAME_OPTIONS_CURRENCY_INR :Rupia Indyjska
STR_GAME_OPTIONS_CURRENCY_IDR :Rupia Indonezyjska STR_GAME_OPTIONS_CURRENCY_IDR :Rupia Indonezyjska
STR_GAME_OPTIONS_CURRENCY_MYR :Ringgit malezyjski STR_GAME_OPTIONS_CURRENCY_MYR :Ringgit malezyjski
STR_GAME_OPTIONS_CURRENCY_LVL :Łat łotewski
STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Autozapis STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Autozapis
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Częstotliwość automatycznego zapisu stanu gry STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Częstotliwość automatycznego zapisu stanu gry
@ -1748,7 +1749,7 @@ STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :Jeśli włączo
STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Nowe polecenia są domyślnie „bez zatrzymywania się”: {STRING} STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Nowe polecenia są domyślnie „bez zatrzymywania się”: {STRING}
STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normalnie pojazd zatrzyma się na każdej stacji, przez którą przejeżdża. Po włączeniu tej opcji, pojazd przejedzie do swojego celu bez zatrzymywania się. Zwróć uwagę na to, że to ustawienie ma wpływ tylko na nowe polecenia. Pojedyncze polecenia mogą być ustalane bez względu na wartość tej opcji STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normalnie pojazd zatrzyma się na każdej stacji, przez którą przejeżdża. Po włączeniu tej opcji, pojazd przejedzie do swojego celu bez zatrzymywania się. Zwróć uwagę na to, że to ustawienie ma wpływ tylko na nowe polecenia. Pojedyncze polecenia mogą być ustalane bez względu na wartość tej opcji
STR_CONFIG_SETTING_STOP_LOCATION :Nowe rozkazy pociągu kończą się domyślnie na {STRING} peronu STR_CONFIG_SETTING_STOP_LOCATION :Nowe polecenia pociągu domyślnie kończą się na {STRING} peronu
STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Miejsce, w którym pociąg domyślnie zatrzyma się na peronie. „Początek” oznacza blisko wjazdu, „środek” oznacza środkową część peronu, a „koniec” oznacza daleko od wjazdu. Pamiętaj, że to ustawienie określa tylko domyślną wartość dla nowych poleceń. Miejsce zatrzymania poszczególnych poleceń można ustawić, klikając na tekst danego polecenia STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Miejsce, w którym pociąg domyślnie zatrzyma się na peronie. „Początek” oznacza blisko wjazdu, „środek” oznacza środkową część peronu, a „koniec” oznacza daleko od wjazdu. Pamiętaj, że to ustawienie określa tylko domyślną wartość dla nowych poleceń. Miejsce zatrzymania poszczególnych poleceń można ustawić, klikając na tekst danego polecenia
###length 3 ###length 3
STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :początku STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :początku
@ -1817,7 +1818,7 @@ STR_CONFIG_SETTING_WARN_LOST_VEHICLE :Ostrzeż, jeśl
STR_CONFIG_SETTING_WARN_LOST_VEHICLE_HELPTEXT :Pokazuj wiadomości o pojazdach, które nie są w stanie znaleźć ścieżki do swoich wyznaczonych celów STR_CONFIG_SETTING_WARN_LOST_VEHICLE_HELPTEXT :Pokazuj wiadomości o pojazdach, które nie są w stanie znaleźć ścieżki do swoich wyznaczonych celów
STR_CONFIG_SETTING_ORDER_REVIEW :Kontroluj polecenia pojazdów: {STRING} STR_CONFIG_SETTING_ORDER_REVIEW :Kontroluj polecenia pojazdów: {STRING}
STR_CONFIG_SETTING_ORDER_REVIEW_HELPTEXT :Kiedy włączone, rozkazy wszystkich pojazdów są sprawdzane co jakiś czas, a wykryte nieprawidłowości są zgłaszane w oknach wiadomości STR_CONFIG_SETTING_ORDER_REVIEW_HELPTEXT :Kiedy włączone, polecenia wszystkich pojazdów są sprawdzane co jakiś czas, a wykryte nieprawidłowości są zgłaszane w oknach wiadomości
###length 3 ###length 3
STR_CONFIG_SETTING_ORDER_REVIEW_OFF :Nie STR_CONFIG_SETTING_ORDER_REVIEW_OFF :Nie
STR_CONFIG_SETTING_ORDER_REVIEW_EXDEPOT :Tak, ale wyklucz zatrzymane STR_CONFIG_SETTING_ORDER_REVIEW_EXDEPOT :Tak, ale wyklucz zatrzymane
@ -1871,7 +1872,7 @@ STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Oryginalny
STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis
STR_CONFIG_SETTING_TERRAIN_TYPE :Typ terenu: {STRING} STR_CONFIG_SETTING_TERRAIN_TYPE :Typ terenu: {STRING}
STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :Określa ukształtowanie terenu (tylko dla TerraGenesis) STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :Wybierz wysokość wzgórz i gór w krajobrazie
STR_CONFIG_SETTING_INDUSTRY_DENSITY :Liczba przedsiębiorstw: {STRING} STR_CONFIG_SETTING_INDUSTRY_DENSITY :Liczba przedsiębiorstw: {STRING}
STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Określa liczbę przedsiębiorstw na początku i w trakcie gry STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Określa liczbę przedsiębiorstw na początku i w trakcie gry
@ -1880,18 +1881,18 @@ STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Maksymalna odle
STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Rafinerie są budowane tylko w pobliżu krawędzi map, to znaczy na wybrzeżach dla map wyspiarskich. To ustawienie pozwala ograniczyć jak daleko od krawędzi mapy mogą być budowane rafinerie i platformy wiertnicze. Na mapach większych niż 256 pól, wartość ta jest skalowana w górę. STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Rafinerie są budowane tylko w pobliżu krawędzi map, to znaczy na wybrzeżach dla map wyspiarskich. To ustawienie pozwala ograniczyć jak daleko od krawędzi mapy mogą być budowane rafinerie i platformy wiertnicze. Na mapach większych niż 256 pól, wartość ta jest skalowana w górę.
STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Wysokość granicy wiecznych śniegów: {STRING} STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Wysokość granicy wiecznych śniegów: {STRING}
STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Wysokość linii śniegu w klimacie arktycznym. Poziom pokrywy śnieżnej wpływa na rozmieszczenie przedsiębiorstw i na warunki rozwoju miast. Może być zmodyfikowana poprzez Edytor Scenariuszy, w innym przypadku jest obliczana za pomocą ustawienia „pokrycie śniegiem” STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Wybierz, na jakiej wysokości zaczyna zalegać śnieg w krajobrazie arktycznym. Poziom pokrywy śnieżnej wpływa na rozmieszczenie przedsiębiorstw i na warunki rozwoju miast. Może być zmodyfikowana poprzez Edytor Scenariuszy, w innym przypadku jest obliczana za pomocą ustawienia „pokrycie śniegiem”
STR_CONFIG_SETTING_SNOW_COVERAGE :Pokrycie śniegiem: {STRING} STR_CONFIG_SETTING_SNOW_COVERAGE :Pokrycie śniegiem: {STRING}
STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Ustawia przybliżoną ilość śniegu w krajobrazie arktycznym. Śnieg wpływa również wpływa na rozmieszczenie przedsiębiorstw i na warunki rozwoju miast. Używane tylko podczas generowania mapy. Teren tuż ponad poziomem morza jest zawsze bez śniegu STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Wybierz przybliżoną ilość śniegu w krajobrazie arktycznym. Śnieg wpływa również wpływa na rozmieszczenie przedsiębiorstw i na warunki rozwoju miast. Używane tylko podczas generowania mapy. Teren tuż ponad poziomem wody jest zawsze bez śniegu
STR_CONFIG_SETTING_SNOW_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_SNOW_COVERAGE_VALUE :{NUM}%
STR_CONFIG_SETTING_DESERT_COVERAGE :Pokrycie pustynią: {STRING} STR_CONFIG_SETTING_DESERT_COVERAGE :Pokrycie pustynią: {STRING}
STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Ustawia przybliżoną ilość pustyni w krajobrazie tropikalnym. Pustynia wpływa również wpływa na rozmieszczenie przedsiębiorstw i na warunki rozwoju miast. Używane tylko podczas generowania mapy. STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Wybierz przybliżoną ilość pustyni w krajobrazie tropikalnym. Pustynia wpływa również na rozmieszczenie przedsiębiorstw i na warunki rozwoju miast. Używane tylko podczas generowania mapy
STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :{NUM}%
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Gładkość terenu: {STRING} STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Gładkość terenu: {STRING}
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(Tylko dla TerraGenesis) Określa liczbę wzgórz na mapie. Łagodne krajobrazy posiadają nieliczne, bardzo rozległe wzgórza, natomiast na terenach pofałdowanych jest ich znacznie więcej i mogą wyglądać podobnie STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :Wybierz kształt i ilość wzniesień. Łagodny teren ma mniejszą liczbę szerszych wzniesień, natomiast teren pofałdowany ma więcej mniejszych wzniesień.
###length 4 ###length 4
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Bardzo łagodny STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Bardzo łagodny
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :Łagodny STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :Łagodny
@ -1899,7 +1900,7 @@ STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :Pofałdowany
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :Bardzo pofałdowany STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :Bardzo pofałdowany
STR_CONFIG_SETTING_VARIETY :Różnorodność terenu: {STRING} STR_CONFIG_SETTING_VARIETY :Różnorodność terenu: {STRING}
STR_CONFIG_SETTING_VARIETY_HELPTEXT :(Tylko dla TerraGenesis) Umożliwia jednoczesne występowanie obszarów górskich i płaskich. Działa na zasadzie obniżania powierzchni, dlatego inny parametr powinien definiować teren górzysty STR_CONFIG_SETTING_VARIETY_HELPTEXT :Wybierz, czy mapa ma zawierać zarówno obszary górskie, jak i płaskie. Im większa różnorodność, tym większe różnice wysokości między obszarami górskimi i płaskimi.
STR_CONFIG_SETTING_RIVER_AMOUNT :Liczba rzek: {STRING} STR_CONFIG_SETTING_RIVER_AMOUNT :Liczba rzek: {STRING}
STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Określa liczbę rzek na mapie STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Określa liczbę rzek na mapie
@ -2435,14 +2436,17 @@ STR_CONFIG_SETTING_ACCOUNTING :Finanse
STR_CONFIG_SETTING_VEHICLES :Pojazdy STR_CONFIG_SETTING_VEHICLES :Pojazdy
STR_CONFIG_SETTING_VEHICLES_PHYSICS :Fizyka STR_CONFIG_SETTING_VEHICLES_PHYSICS :Fizyka
STR_CONFIG_SETTING_VEHICLES_ROUTING :Wyznaczanie trasy STR_CONFIG_SETTING_VEHICLES_ROUTING :Wyznaczanie trasy
STR_CONFIG_SETTING_VEHICLES_ORDERS :Polecenia
STR_CONFIG_SETTING_LIMITATIONS :Ograniczenia STR_CONFIG_SETTING_LIMITATIONS :Ograniczenia
STR_CONFIG_SETTING_ACCIDENTS :Awarie i katastrofy STR_CONFIG_SETTING_ACCIDENTS :Awarie i katastrofy
STR_CONFIG_SETTING_GENWORLD :Tworzenie mapy STR_CONFIG_SETTING_GENWORLD :Tworzenie mapy
STR_CONFIG_SETTING_ENVIRONMENT :Środowisko STR_CONFIG_SETTING_ENVIRONMENT :Środowisko
STR_CONFIG_SETTING_ENVIRONMENT_TIME :Czas
STR_CONFIG_SETTING_ENVIRONMENT_AUTHORITIES :Władze lokalne STR_CONFIG_SETTING_ENVIRONMENT_AUTHORITIES :Władze lokalne
STR_CONFIG_SETTING_ENVIRONMENT_TOWNS :Miasta STR_CONFIG_SETTING_ENVIRONMENT_TOWNS :Miasta
STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :Przedsiębiorstwa STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :Przedsiębiorstwa
STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :Dystrybucja ładunków STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :Dystrybucja ładunków
STR_CONFIG_SETTING_ENVIRONMENT_TREES :Drzewa
STR_CONFIG_SETTING_AI :Rywale STR_CONFIG_SETTING_AI :Rywale
STR_CONFIG_SETTING_AI_NPC :Gracze komputerowi STR_CONFIG_SETTING_AI_NPC :Gracze komputerowi
STR_CONFIG_SETTING_NETWORK :Sieć STR_CONFIG_SETTING_NETWORK :Sieć
@ -2579,12 +2583,20 @@ STR_LIVERY_TRAIN_TOOLTIP :{BLACK}Pokaż s
STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}Pokaż schematy koloru pojazdów STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}Pokaż schematy koloru pojazdów
STR_LIVERY_SHIP_TOOLTIP :{BLACK}Pokaż schematy koloru statków STR_LIVERY_SHIP_TOOLTIP :{BLACK}Pokaż schematy koloru statków
STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Pokaż schematy koloru samolotów STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Pokaż schematy koloru samolotów
STR_LIVERY_TRAIN_GROUP_TOOLTIP :{BLACK}Pokaż kolory grup pociągów
STR_LIVERY_ROAD_VEHICLE_GROUP_TOOLTIP :{BLACK}Pokaż kolory grup pojazdów
STR_LIVERY_SHIP_GROUP_TOOLTIP :{BLACK}Pokaż kolory grup statków
STR_LIVERY_AIRCRAFT_GROUP_TOOLTIP :{BLACK}Pokaż kolory grup samolotów
STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Wybierz główny kolor dla wybranego schematu. Ctrl+klik ustawi ten kolor dla wszystkich schematów STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Wybierz główny kolor dla wybranego schematu. Ctrl+klik ustawi ten kolor dla wszystkich schematów
STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Wybierz dodatkowy kolor dla wybranego schematu. Ctrl+klik ustawi ten kolor dla wszystkich schematów STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Wybierz dodatkowy kolor dla wybranego schematu. Ctrl+klik ustawi ten kolor dla wszystkich schematów
STR_LIVERY_PANEL_TOOLTIP :{BLACK}Wybierz schemat kolorów do zmiany, albo wiele schematów z CTRL+klik. Kliknij na okienku aby wł./wył. używanie schematu. STR_LIVERY_PANEL_TOOLTIP :{BLACK}Wybierz schemat kolorów do zmiany, albo wiele schematów z CTRL+klik. Kliknij na okienku aby wł./wył. używanie schematu.
STR_LIVERY_TRAIN_GROUP_EMPTY :Nie utworzono żadnych grup pociągów
STR_LIVERY_ROAD_VEHICLE_GROUP_EMPTY :Nie utworzono żadnych grup pojazdów
STR_LIVERY_SHIP_GROUP_EMPTY :Nie utworzono żadnych grup statków
STR_LIVERY_AIRCRAFT_GROUP_EMPTY :Nie utworzono żadnych grup samolotów
###length 23 ###length 23
STR_LIVERY_DEFAULT :Standardowy wygląd STR_LIVERY_DEFAULT :Domyślne malowanie
STR_LIVERY_STEAM :Parowóz STR_LIVERY_STEAM :Parowóz
STR_LIVERY_DIESEL :Lokomotywa spalinowa STR_LIVERY_DIESEL :Lokomotywa spalinowa
STR_LIVERY_ELECTRIC :Lokomotywa elektryczna STR_LIVERY_ELECTRIC :Lokomotywa elektryczna
@ -3092,9 +3104,9 @@ STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Konstrukcja lin
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Budowa torów kolejowych. Ctrl przełącza buduj/usuń dla konstrukcji kolejowych. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Budowa torów kolejowych. Ctrl przełącza buduj/usuń dla konstrukcji kolejowych. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Zbuduj tory kolejowe za pomocą trybu Autotory. Ctrl przełącza buduj/usuń dla konstrukcji kolejowych. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Zbuduj tory kolejowe za pomocą trybu Autotory. Ctrl przełącza buduj/usuń dla konstrukcji kolejowych. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Budowa warsztatów (do kupowania i serwisowania pociągów). Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Budowa warsztatów (do kupowania i serwisowania pociągów). Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Zamiana torów na posterunek. Ctrl umożliwia łączenie posterunków. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Zbuduj posterunek na torach. Ctrl umożliwia łączenie posterunków. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Zbuduj stację kolejową. Ctrl umożliwia łączenie stacji. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Zbuduj stację kolejową. Ctrl umożliwia łączenie stacji. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Zbuduj sygnały kolejowe. Ctrl przełącza semafory/sygnały świetlne{}Przeciągnięcie pozwala na budowę sygnałów wzdłuż prostej linii torów. Ctrl pozwala na budowę sygnałów do następnego skrzyżowania{}Ctrl+klik przełącza do okna wyboru sygnałów. Shift przełącza pomiędzy budowaniem a szacowaniem kosztów STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Zbuduj sygnały na torach. Ctrl przełącza semafory/sygnały świetlne{}Przeciąganie buduje sygnały wzdłuż prostej linii torów, z Ctrl buduje sygnały aż do najbliższego skrzyżowania lub sygnału{}Ctrl+klik przełącza wyświetlanie okna wyboru sygnałów. Shift przełącza pomiędzy budowaniem a szacowaniem jego kosztów
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Zbuduj most kolejowy. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Zbuduj most kolejowy. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Zbuduj tunel kolejowy. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Zbuduj tunel kolejowy. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów
STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Przełącz buduj/usuń dla torów kolejowych, sygnałów, posterunków i stacji. Przetrzymanie Ctrl usuwa także tory kolejowe z posterunków i stacji STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Przełącz buduj/usuń dla torów kolejowych, sygnałów, posterunków i stacji. Przetrzymanie Ctrl usuwa także tory kolejowe z posterunków i stacji
@ -3182,7 +3194,7 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Wybuduj
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Wybuduj zajezdnię tramwajową (do kupowania i serwisowania pojazdów). Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Wybuduj zajezdnię tramwajową (do kupowania i serwisowania pojazdów). Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Zbuduj przystanek autobusowy. Ctrl umożliwia łączenie stacji. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Zbuduj przystanek autobusowy. Ctrl umożliwia łączenie stacji. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Zbuduj pasażerski przystanek tramwajowy. Ctrl umożliwia łączenie stacji. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Zbuduj pasażerski przystanek tramwajowy. Ctrl umożliwia łączenie stacji. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Zbuduj stację załadunku ciężarówek. Ctrl umożliwia łączenie stacji. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Zbuduj stację ciężarówek. Ctrl umożliwia łączenie stacji. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Zbuduj tramwajową stację załadunkową. Ctrl umożliwia łączenie stacji. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Zbuduj tramwajową stację załadunkową. Ctrl umożliwia łączenie stacji. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów
STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}Włącz/wyłącz drogi jednokierunkowe STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}Włącz/wyłącz drogi jednokierunkowe
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Zbuduj most drogowy. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Zbuduj most drogowy. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów
@ -3207,7 +3219,7 @@ STR_BUILD_DEPOT_TRAM_ORIENTATION_SELECT_TOOLTIP :{BLACK}Wybierz
STR_STATION_BUILD_BUS_ORIENTATION :{WHITE}Ukierunkowanie przystanku STR_STATION_BUILD_BUS_ORIENTATION :{WHITE}Ukierunkowanie przystanku
STR_STATION_BUILD_BUS_ORIENTATION_TOOLTIP :{BLACK}Wybierz ukierunkowanie przystanku STR_STATION_BUILD_BUS_ORIENTATION_TOOLTIP :{BLACK}Wybierz ukierunkowanie przystanku
STR_STATION_BUILD_TRUCK_ORIENTATION :{WHITE}Ukierunkowanie stacji załadunku ciężarówek STR_STATION_BUILD_TRUCK_ORIENTATION :{WHITE}Ukierunkowanie stacji załadunku ciężarówek
STR_STATION_BUILD_TRUCK_ORIENTATION_TOOLTIP :{BLACK}Wybierz ukierunkowanie stacji załadunku ciężarówek STR_STATION_BUILD_TRUCK_ORIENTATION_TOOLTIP :{BLACK}Wybierz ukierunkowanie stacji ciężarówek
STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION :{WHITE}Ukierunkowanie przystanku tramwajowego STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION :{WHITE}Ukierunkowanie przystanku tramwajowego
STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION_TOOLTIP :{BLACK}Wybierz ukierunkowanie przystanku tramwajowego STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION_TOOLTIP :{BLACK}Wybierz ukierunkowanie przystanku tramwajowego
STR_STATION_BUILD_CARGO_TRAM_ORIENTATION :{WHITE}Ukierunkowanie tramwajowej stacji załadunkowej STR_STATION_BUILD_CARGO_TRAM_ORIENTATION :{WHITE}Ukierunkowanie tramwajowej stacji załadunkowej
@ -3451,7 +3463,7 @@ STR_LAI_TREE_NAME_CACTUS_PLANTS :Kaktusy
STR_LAI_STATION_DESCRIPTION_RAILROAD_STATION :Stacja kolejowa STR_LAI_STATION_DESCRIPTION_RAILROAD_STATION :Stacja kolejowa
STR_LAI_STATION_DESCRIPTION_AIRCRAFT_HANGAR :Hangar STR_LAI_STATION_DESCRIPTION_AIRCRAFT_HANGAR :Hangar
STR_LAI_STATION_DESCRIPTION_AIRPORT :Lotnisko STR_LAI_STATION_DESCRIPTION_AIRPORT :Lotnisko
STR_LAI_STATION_DESCRIPTION_TRUCK_LOADING_AREA :Stacja załadunku ciężarówek STR_LAI_STATION_DESCRIPTION_TRUCK_LOADING_AREA :Stacja ciężarówek
STR_LAI_STATION_DESCRIPTION_BUS_STATION :Przystanek STR_LAI_STATION_DESCRIPTION_BUS_STATION :Przystanek
STR_LAI_STATION_DESCRIPTION_SHIP_DOCK :Port STR_LAI_STATION_DESCRIPTION_SHIP_DOCK :Port
STR_LAI_STATION_DESCRIPTION_BUOY :Boja STR_LAI_STATION_DESCRIPTION_BUOY :Boja
@ -4948,21 +4960,21 @@ STR_ORDER_STOP_LOCATION_FAR_END :[dalszy koniec]
STR_ORDER_OUT_OF_RANGE :{RED} (Kolejny punkt docelowy jest poza zasięgiem) STR_ORDER_OUT_OF_RANGE :{RED} (Kolejny punkt docelowy jest poza zasięgiem)
STR_ORDER_CONDITIONAL_UNCONDITIONAL :Skocz do rozkazu {COMMA} STR_ORDER_CONDITIONAL_UNCONDITIONAL :Skocz do polecenia {COMMA}
STR_ORDER_CONDITIONAL_NUM :Skocz do rozkazu {COMMA} kiedy {STRING} {STRING} {COMMA} STR_ORDER_CONDITIONAL_NUM :Skocz do polecenia {COMMA}, kiedy {STRING} {STRING} {COMMA}
STR_ORDER_CONDITIONAL_TRUE_FALSE :Skocz do rozkazu {0:COMMA} kiedy {2:STRING} że {1:STRING} STR_ORDER_CONDITIONAL_TRUE_FALSE :Skocz do polecenia {0:COMMA}, kiedy {2:STRING}, że {1:STRING}
STR_INVALID_ORDER :{RED} (Błędne polecenie) STR_INVALID_ORDER :{RED} (Błędne polecenie)
# Time table window # Time table window
STR_TIMETABLE_TITLE :{WHITE}{VEHICLE} (Rozkład jazdy) STR_TIMETABLE_TITLE :{WHITE}{VEHICLE} (Rozkład jazdy)
STR_TIMETABLE_ORDER_VIEW :{BLACK}Rozkazy STR_TIMETABLE_ORDER_VIEW :{BLACK}Polecenia
STR_TIMETABLE_ORDER_VIEW_TOOLTIP :{BLACK}Przełącz do okna poleceń STR_TIMETABLE_ORDER_VIEW_TOOLTIP :{BLACK}Przełącz do okna poleceń
STR_TIMETABLE_TOOLTIP :{BLACK}Rozkład jazdy - kliknij na poleceniu aby je zaznaczyć STR_TIMETABLE_TOOLTIP :{BLACK}Rozkład jazdy - kliknij na poleceniu aby je zaznaczyć
STR_TIMETABLE_NO_TRAVEL :Nie podróżuje STR_TIMETABLE_NO_TRAVEL :Nie podróżuje
STR_TIMETABLE_NOT_TIMETABLEABLE :Podróż (automatycznie; zaplanowana przez następny ręczny rozkaz) STR_TIMETABLE_NOT_TIMETABLEABLE :Podróż (automatycznie; zaplanowana przez następne ręczne polecenie)
STR_TIMETABLE_TRAVEL_NOT_TIMETABLED :Przejazd (bez ustalonego czasu) STR_TIMETABLE_TRAVEL_NOT_TIMETABLED :Przejazd (bez ustalonego czasu)
STR_TIMETABLE_TRAVEL_NOT_TIMETABLED_SPEED :Podróżuj (poza rozkładem) z maksymalną prędkością {2:VELOCITY} STR_TIMETABLE_TRAVEL_NOT_TIMETABLED_SPEED :Podróżuj (poza rozkładem) z maksymalną prędkością {2:VELOCITY}
STR_TIMETABLE_TRAVEL_FOR :Przejazd przez {STRING} STR_TIMETABLE_TRAVEL_FOR :Przejazd przez {STRING}
@ -5319,7 +5331,7 @@ STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... przy
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Nie można usunąć części stacji... STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Nie można usunąć części stacji...
STR_ERROR_MUST_REMOVE_RAILWAY_STATION_FIRST :{WHITE}Należy najpierw usunąć stację kolejową STR_ERROR_MUST_REMOVE_RAILWAY_STATION_FIRST :{WHITE}Należy najpierw usunąć stację kolejową
STR_ERROR_CAN_T_REMOVE_BUS_STATION :{WHITE}Nie można usunąć przystanku... STR_ERROR_CAN_T_REMOVE_BUS_STATION :{WHITE}Nie można usunąć przystanku...
STR_ERROR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Nie można usunąć stacji załadunkowej... STR_ERROR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Nie można usunąć stacji ciężarówek...
STR_ERROR_CAN_T_REMOVE_PASSENGER_TRAM_STATION :{WHITE}Nie można usunąć przystanku tramwajowego... STR_ERROR_CAN_T_REMOVE_PASSENGER_TRAM_STATION :{WHITE}Nie można usunąć przystanku tramwajowego...
STR_ERROR_CAN_T_REMOVE_CARGO_TRAM_STATION :{WHITE}Nie można usunąć tramwajowej stacji załadunkowej... STR_ERROR_CAN_T_REMOVE_CARGO_TRAM_STATION :{WHITE}Nie można usunąć tramwajowej stacji załadunkowej...
STR_ERROR_MUST_REMOVE_ROAD_STOP_FIRST :{WHITE}Należy najpierw usunąć przystanek STR_ERROR_MUST_REMOVE_ROAD_STOP_FIRST :{WHITE}Należy najpierw usunąć przystanek
@ -5556,7 +5568,7 @@ STR_ERROR_CAN_T_SKIP_ORDER :{WHITE}Nie moż
STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}Nie można przejść do wybranego polecenia... STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}Nie można przejść do wybranego polecenia...
STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}... pojazd nie może jechać do wszystkich stacji STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}... pojazd nie może jechać do wszystkich stacji
STR_ERROR_CAN_T_ADD_ORDER :{WHITE}... pojazd nie może jechać do tej stacji STR_ERROR_CAN_T_ADD_ORDER :{WHITE}... pojazd nie może jechać do tej stacji
STR_ERROR_CAN_T_ADD_ORDER_SHARED :{WHITE}... pojazd dzielący ten rozkaz nie może jechać do tej stacji STR_ERROR_CAN_T_ADD_ORDER_SHARED :{WHITE}... pojazd współdzielący to polecenie nie może jechać do tej stacji
STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST :{WHITE}... nie wszystkie pojazdy mają takie same polecenia STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST :{WHITE}... nie wszystkie pojazdy mają takie same polecenia
STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST :{WHITE}... nie wszystkie pojazdy współdzielą polecenia STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST :{WHITE}... nie wszystkie pojazdy współdzielą polecenia

@ -772,7 +772,7 @@ STR_SMALLMAP_LEGENDA_AIRCRAFT :{TINY_FONT}{BLA
STR_SMALLMAP_LEGENDA_TRANSPORT_ROUTES :{TINY_FONT}{BLACK}Rotas de Transporte STR_SMALLMAP_LEGENDA_TRANSPORT_ROUTES :{TINY_FONT}{BLACK}Rotas de Transporte
STR_SMALLMAP_LEGENDA_FOREST :{TINY_FONT}{BLACK}Floresta STR_SMALLMAP_LEGENDA_FOREST :{TINY_FONT}{BLACK}Floresta
STR_SMALLMAP_LEGENDA_RAILROAD_STATION :{TINY_FONT}{BLACK}Estação Ferroviária STR_SMALLMAP_LEGENDA_RAILROAD_STATION :{TINY_FONT}{BLACK}Estação Ferroviária
STR_SMALLMAP_LEGENDA_TRUCK_LOADING_BAY :{TINY_FONT}{BLACK}Área de Carregamento de Camiões STR_SMALLMAP_LEGENDA_TRUCK_LOADING_BAY :{TINY_FONT}{BLACK}Estação de Camiões
STR_SMALLMAP_LEGENDA_BUS_STATION :{TINY_FONT}{BLACK}Estação de Autocarros STR_SMALLMAP_LEGENDA_BUS_STATION :{TINY_FONT}{BLACK}Estação de Autocarros
STR_SMALLMAP_LEGENDA_AIRPORT_HELIPORT :{TINY_FONT}{BLACK}Aeroporto/Heliporto STR_SMALLMAP_LEGENDA_AIRPORT_HELIPORT :{TINY_FONT}{BLACK}Aeroporto/Heliporto
STR_SMALLMAP_LEGENDA_DOCK :{TINY_FONT}{BLACK}Doca STR_SMALLMAP_LEGENDA_DOCK :{TINY_FONT}{BLACK}Doca
@ -1003,6 +1003,7 @@ STR_GAME_OPTIONS_CURRENCY_HKD :Dólar de Hong
STR_GAME_OPTIONS_CURRENCY_INR :Rupia Indiana STR_GAME_OPTIONS_CURRENCY_INR :Rupia Indiana
STR_GAME_OPTIONS_CURRENCY_IDR :Rupia Indonésia STR_GAME_OPTIONS_CURRENCY_IDR :Rupia Indonésia
STR_GAME_OPTIONS_CURRENCY_MYR :Ringgit da Malásia STR_GAME_OPTIONS_CURRENCY_MYR :Ringgit da Malásia
STR_GAME_OPTIONS_CURRENCY_LVL :Lats da Letónia
STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Guardar automaticamente STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Guardar automaticamente
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Seleccionar o intervalo para guardar automático STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Seleccionar o intervalo para guardar automático
@ -2056,14 +2057,17 @@ STR_CONFIG_SETTING_ACCOUNTING :Contabilidade
STR_CONFIG_SETTING_VEHICLES :Veículos STR_CONFIG_SETTING_VEHICLES :Veículos
STR_CONFIG_SETTING_VEHICLES_PHYSICS :Física STR_CONFIG_SETTING_VEHICLES_PHYSICS :Física
STR_CONFIG_SETTING_VEHICLES_ROUTING :Em rota STR_CONFIG_SETTING_VEHICLES_ROUTING :Em rota
STR_CONFIG_SETTING_VEHICLES_ORDERS :Ordens
STR_CONFIG_SETTING_LIMITATIONS :Limitações STR_CONFIG_SETTING_LIMITATIONS :Limitações
STR_CONFIG_SETTING_ACCIDENTS :Desastres / Acidentes STR_CONFIG_SETTING_ACCIDENTS :Desastres / Acidentes
STR_CONFIG_SETTING_GENWORLD :Geração do mundo STR_CONFIG_SETTING_GENWORLD :Geração do mundo
STR_CONFIG_SETTING_ENVIRONMENT :Meio Ambiente STR_CONFIG_SETTING_ENVIRONMENT :Meio Ambiente
STR_CONFIG_SETTING_ENVIRONMENT_TIME :Tempo
STR_CONFIG_SETTING_ENVIRONMENT_AUTHORITIES :Autoridades STR_CONFIG_SETTING_ENVIRONMENT_AUTHORITIES :Autoridades
STR_CONFIG_SETTING_ENVIRONMENT_TOWNS :Localidades STR_CONFIG_SETTING_ENVIRONMENT_TOWNS :Localidades
STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :Industrias STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :Industrias
STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :Distribuição de Carga STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :Distribuição de Carga
STR_CONFIG_SETTING_ENVIRONMENT_TREES :Árvores
STR_CONFIG_SETTING_AI :Oponentes STR_CONFIG_SETTING_AI :Oponentes
STR_CONFIG_SETTING_AI_NPC :Jogadores Computador STR_CONFIG_SETTING_AI_NPC :Jogadores Computador
STR_CONFIG_SETTING_NETWORK :Rede STR_CONFIG_SETTING_NETWORK :Rede
@ -2721,9 +2725,9 @@ STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Construir Magle
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Construir linha férrea. Ctrl alterna a construção/remoção de linha férrea. Shift alterna construir/mostrar custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Construir linha férrea. Ctrl alterna a construção/remoção de linha férrea. Shift alterna construir/mostrar custo estimado
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Construir caminhos-de-ferro usando o modo automático. Ctrl alterna a construção/remoção de caminhos-de-ferro. Shift alterna construir/mostrar custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Construir caminhos-de-ferro usando o modo automático. Ctrl alterna a construção/remoção de caminhos-de-ferro. Shift alterna construir/mostrar custo estimado
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Construir depósito ferroviário (para compra e manutenção de comboios). Shift alterna construir/mostrar custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Construir depósito ferroviário (para compra e manutenção de comboios). Shift alterna construir/mostrar custo estimado
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Converter linha em ponto de controlo. Ctrl permite juntar pontos de controlo. Shift alterna construir/mostrar custo estimado STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Construir ponto de controlo na ferrovia. Ctrl permite juntar pontos de controlo. Shift alterna construir/mostrar custo estimado
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Construir estação ferroviária. Ctrl permite juntar estações. Shift alterna construir/mostrar custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Construir estação ferroviária. Ctrl permite juntar estações. Shift alterna construir/mostrar custo estimado
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Construir sinais ferroviários. Ctrl alterna entre semáforos/sinais elétricos{}Arrastar constrói sinais ao longo de uma linha reta de carris. Ctrl constrói sinais até a próxima junção ou sinal{}Ctrl+Clique alterna entre abrir a janela de seleção de sinais. Shift alterna construir/mostrar custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Construir sinais na ferrovia. Ctrl alterna entre semáforos/sinais elétricos{}Arrastar constrói sinais ao longo de uma linha reta de carris. Ctrl constrói sinais até a próxima junção ou sinal{}Ctrl+Clique alterna entre abrir a janela de seleção de sinais. Shift alterna construir/mostrar custo estimado
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Construir ponte ferroviária. Shift alterna construir/mostrar custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Construir ponte ferroviária. Shift alterna construir/mostrar custo estimado
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Construir túnel ferroviário. Shift alterna construir/mostrar custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Construir túnel ferroviário. Shift alterna construir/mostrar custo estimado
STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Alternar entre construir/remover linha férrea, sinais, pontos de passagem e estações. Fixar o Ctrl também remove a linha férrea de pontos de passagem e estações STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Alternar entre construir/remover linha férrea, sinais, pontos de passagem e estações. Fixar o Ctrl também remove a linha férrea de pontos de passagem e estações
@ -2811,7 +2815,7 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Construi
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Construir garagem para elétricos (para compra e manutenção). Shift alterna construir/mostrar custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Construir garagem para elétricos (para compra e manutenção). Shift alterna construir/mostrar custo estimado
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Construir estação de autocarros. Ctrl permite juntar estações. Shift alterna construir/mostrar custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Construir estação de autocarros. Ctrl permite juntar estações. Shift alterna construir/mostrar custo estimado
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Construir paragem de elétricos para passageiros. Ctrl permite juntar estações. Shift alterna construir/mostrar custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Construir paragem de elétricos para passageiros. Ctrl permite juntar estações. Shift alterna construir/mostrar custo estimado
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Construir área de carregamento de camiões. Ctrl permite juntar estações. Shift alterna construir/mostrar custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Construir estação de camiões. Ctrl permite juntar estações. Shift alterna construir/mostrar custo estimado
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Construir paragem de elétricos para carga. Ctrl permite juntar estações. Shift alterna construir/mostrar custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Construir paragem de elétricos para carga. Ctrl permite juntar estações. Shift alterna construir/mostrar custo estimado
STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}Ativar/Desativar estradas de sentido único STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}Ativar/Desativar estradas de sentido único
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Construir ponte rodoviária. Shift alterna construir/mostrar custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Construir ponte rodoviária. Shift alterna construir/mostrar custo estimado
@ -2836,7 +2840,7 @@ STR_BUILD_DEPOT_TRAM_ORIENTATION_SELECT_TOOLTIP :{BLACK}Selecion
STR_STATION_BUILD_BUS_ORIENTATION :{WHITE}Orientação da estação de autocarros STR_STATION_BUILD_BUS_ORIENTATION :{WHITE}Orientação da estação de autocarros
STR_STATION_BUILD_BUS_ORIENTATION_TOOLTIP :{BLACK}Seleccionar a orientação da estação de autocarros STR_STATION_BUILD_BUS_ORIENTATION_TOOLTIP :{BLACK}Seleccionar a orientação da estação de autocarros
STR_STATION_BUILD_TRUCK_ORIENTATION :{WHITE}Orientação da estação de carga STR_STATION_BUILD_TRUCK_ORIENTATION :{WHITE}Orientação da estação de carga
STR_STATION_BUILD_TRUCK_ORIENTATION_TOOLTIP :{BLACK}Seleccionar a orientação da estação de carregamento de camiões STR_STATION_BUILD_TRUCK_ORIENTATION_TOOLTIP :{BLACK}Selecionar a orientação da estação de camiões
STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION :{WHITE}Orientação da Estação de Eléctricos de Passageiros STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION :{WHITE}Orientação da Estação de Eléctricos de Passageiros
STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION_TOOLTIP :{BLACK}Seleccionar orientação da estação de eléctricos STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION_TOOLTIP :{BLACK}Seleccionar orientação da estação de eléctricos
STR_STATION_BUILD_CARGO_TRAM_ORIENTATION :{WHITE}Orientação da Estação de Eléctricos STR_STATION_BUILD_CARGO_TRAM_ORIENTATION :{WHITE}Orientação da Estação de Eléctricos
@ -3080,7 +3084,7 @@ STR_LAI_TREE_NAME_CACTUS_PLANTS :Cactos
STR_LAI_STATION_DESCRIPTION_RAILROAD_STATION :Estação ferroviária STR_LAI_STATION_DESCRIPTION_RAILROAD_STATION :Estação ferroviária
STR_LAI_STATION_DESCRIPTION_AIRCRAFT_HANGAR :Hangar STR_LAI_STATION_DESCRIPTION_AIRCRAFT_HANGAR :Hangar
STR_LAI_STATION_DESCRIPTION_AIRPORT :Aeroporto STR_LAI_STATION_DESCRIPTION_AIRPORT :Aeroporto
STR_LAI_STATION_DESCRIPTION_TRUCK_LOADING_AREA :Área de carregamento de camiões STR_LAI_STATION_DESCRIPTION_TRUCK_LOADING_AREA :Estação de camiões
STR_LAI_STATION_DESCRIPTION_BUS_STATION :Estação de autocarros STR_LAI_STATION_DESCRIPTION_BUS_STATION :Estação de autocarros
STR_LAI_STATION_DESCRIPTION_SHIP_DOCK :Doca STR_LAI_STATION_DESCRIPTION_SHIP_DOCK :Doca
STR_LAI_STATION_DESCRIPTION_BUOY :Bóia STR_LAI_STATION_DESCRIPTION_BUOY :Bóia

@ -1147,6 +1147,7 @@ STR_GAME_OPTIONS_CURRENCY_HKD :Гонконг
STR_GAME_OPTIONS_CURRENCY_INR :Индийская рупия STR_GAME_OPTIONS_CURRENCY_INR :Индийская рупия
STR_GAME_OPTIONS_CURRENCY_IDR :Индонезийская рупия STR_GAME_OPTIONS_CURRENCY_IDR :Индонезийская рупия
STR_GAME_OPTIONS_CURRENCY_MYR :Малайзийский ринггит STR_GAME_OPTIONS_CURRENCY_MYR :Малайзийский ринггит
STR_GAME_OPTIONS_CURRENCY_LVL :Латвийский лат
STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Автосохранение STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Автосохранение
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Интервал автосохранения игры STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Интервал автосохранения игры
@ -2886,9 +2887,9 @@ STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Магнитн
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Строительство железной дороги. При нажатом Ctrl - удаление путей. При нажатом Shift - оценка стоимости строительства. STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Строительство железной дороги. При нажатом Ctrl - удаление путей. При нажатом Shift - оценка стоимости строительства.
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Строительство ж/д путей в автоматическом режиме. При нажатом Ctrl - удаление путей. При нажатом Shift - оценка стоимости строительства. STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Строительство ж/д путей в автоматическом режиме. При нажатом Ctrl - удаление путей. При нажатом Shift - оценка стоимости строительства.
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Строительство депо (для приобретения и обслуживания поездов). При нажатом Shift - оценка стоимости строительства. STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Строительство депо (для приобретения и обслуживания поездов). При нажатом Shift - оценка стоимости строительства.
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Установка на рельсах точек пути. Нажатие Ctrl позволяет объединять точки. При нажатом Shift - оценка стоимости строительства. STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Установка на рельсах маршрутных точек. Нажатие Ctrl позволяет объединять точки. При нажатом Shift - оценка стоимости строительства.
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Строительство ж/д станций. Нажатие Ctrl позволяет объединять станции. При нажатом Shift - оценка стоимости строительства. STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Строительство ж/д станций. Нажатие Ctrl позволяет объединять станции. При нажатом Shift - оценка стоимости строительства.
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Установка сигналов. Ctrl переключает семафоры/светофоры.{}Перетаскиванием можно строить сигналы на прямом участке пути. С нажатым Ctrl - строительство сигналов до ближайшего пересечения или сигнала.{}Ctrl+щелчок переключает открытие окна выбора сигналов. При нажатом Shift - оценка стоимости строительства. STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Установка сигналов на ж/д путях. Ctrl переключает семафоры/светофоры.{}Перетаскиванием можно строить сигналы на прямом участке пути. С нажатым Ctrl - строительство сигналов до ближайшего пересечения или сигнала.{}Ctrl+щелчок переключает открытие окна выбора сигналов. При нажатом Shift - оценка стоимости строительства.
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Строительство ж/д мостов. При нажатом Shift - оценка стоимости строительства. STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Строительство ж/д мостов. При нажатом Shift - оценка стоимости строительства.
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Строительство ж/д туннелей. При нажатом Shift - оценка стоимости строительства. STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Строительство ж/д туннелей. При нажатом Shift - оценка стоимости строительства.
STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Переключение между строительством и удалением ж/д путей, сигналов, станций. При нажатом Ctrl убирает станции с рельсами. STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Переключение между строительством и удалением ж/д путей, сигналов, станций. При нажатом Ctrl убирает станции с рельсами.

@ -379,6 +379,10 @@ STR_COLOUR_WHITE :Bela
STR_COLOUR_RANDOM :Nasumična STR_COLOUR_RANDOM :Nasumična
###length 17 ###length 17
STR_COLOUR_SECONDARY_GREEN :Zelena
STR_COLOUR_SECONDARY_ORANGE :Narandžasta
STR_COLOUR_SECONDARY_BROWN :Braon
STR_COLOUR_SECONDARY_SAME_AS_PRIMARY :Identično primarnom
# Units used in OpenTTD # Units used in OpenTTD
@ -678,6 +682,7 @@ STR_NEWS_MENU_DELETE_ALL_MESSAGES :Obriši sve por
# About menu # About menu
STR_ABOUT_MENU_LAND_BLOCK_INFO :Podaci o zemljištu STR_ABOUT_MENU_LAND_BLOCK_INFO :Podaci o zemljištu
STR_ABOUT_MENU_HELP :Pomoć & priručnici
STR_ABOUT_MENU_TOGGLE_CONSOLE :Uključi/isključi konzolu STR_ABOUT_MENU_TOGGLE_CONSOLE :Uključi/isključi konzolu
STR_ABOUT_MENU_AI_DEBUG :Korekcija VI / skripte igre STR_ABOUT_MENU_AI_DEBUG :Korekcija VI / skripte igre
STR_ABOUT_MENU_SCREENSHOT :Sačuvaj sliku STR_ABOUT_MENU_SCREENSHOT :Sačuvaj sliku
@ -1106,12 +1111,16 @@ STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Kopiraj
# Game options window # Game options window
STR_GAME_OPTIONS_CAPTION :{WHITE}Opcije STR_GAME_OPTIONS_CAPTION :{WHITE}Opcije
STR_GAME_OPTIONS_TAB_GRAPHICS :Grrafika
STR_GAME_OPTIONS_SFX_VOLUME :Zvučni efekti
STR_GAME_OPTIONS_VOLUME_0 :0%
STR_GAME_OPTIONS_CURRENCY_UNITS_FRAME :{BLACK}Valuta STR_GAME_OPTIONS_CURRENCY_UNITS_FRAME :{BLACK}Valuta
STR_GAME_OPTIONS_CURRENCY_UNITS_DROPDOWN_TOOLTIP :{BLACK}Izbor valute STR_GAME_OPTIONS_CURRENCY_UNITS_DROPDOWN_TOOLTIP :{BLACK}Izbor valute
STR_GAME_OPTIONS_CURRENCY_CODE :{STRING} ({STRING})
###length 43 ###length 43
STR_GAME_OPTIONS_CURRENCY_GBP :Britanska funta STR_GAME_OPTIONS_CURRENCY_GBP :Britanska funta
@ -1163,6 +1172,7 @@ STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Izbor vr
# Autosave dropdown # Autosave dropdown
###length 5 ###length 5
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_OFF :Isključeno STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_OFF :Isključeno
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_10_MINUTES :Svakih 10 minuta
STR_GAME_OPTIONS_LANGUAGE :{BLACK}Jezik STR_GAME_OPTIONS_LANGUAGE :{BLACK}Jezik
STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}Odaberi jezik za interfejs STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}Odaberi jezik za interfejs
@ -1199,6 +1209,7 @@ STR_GAME_OPTIONS_GUI_SCALE_3X :3x
STR_GAME_OPTIONS_GUI_SCALE_4X :4x STR_GAME_OPTIONS_GUI_SCALE_4X :4x
STR_GAME_OPTIONS_GUI_SCALE_5X :5x STR_GAME_OPTIONS_GUI_SCALE_5X :5x
STR_GAME_OPTIONS_PARTICIPATE_SURVEY_LINK_TOOLTIP :{BLACK}Ovo otvara pretraživač sa više informacija o automatskim anketama
STR_GAME_OPTIONS_GRAPHICS :{BLACK}Grafike STR_GAME_OPTIONS_GRAPHICS :{BLACK}Grafike
@ -1219,6 +1230,7 @@ STR_GAME_OPTIONS_BASE_MUSIC :{BLACK}Osnovni
STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}Odaberi željeni skup osnovne muzike STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}Odaberi željeni skup osnovne muzike
STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}Dodatni podaci o osnovnom skupu muzike STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}Dodatni podaci o osnovnom skupu muzike
STR_BASESET_STATUS :{STRING} {RED}({NUM} fajl{P '' a ovi} nedostaj{P e e u}/{P je su su} korumpiran{P '' a i}
STR_ERROR_RESOLUTION_LIST_FAILED :{WHITE}Neuspešno dobijanje spiska podržanih rezolucija STR_ERROR_RESOLUTION_LIST_FAILED :{WHITE}Neuspešno dobijanje spiska podržanih rezolucija
STR_ERROR_FULLSCREEN_FAILED :{WHITE}Neuspešno prebacivanje u ceo ekran STR_ERROR_FULLSCREEN_FAILED :{WHITE}Neuspešno prebacivanje u ceo ekran
@ -1381,9 +1393,11 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_LEFT :Levo
STR_CONFIG_SETTING_HORIZONTAL_POS_CENTER :Sredina STR_CONFIG_SETTING_HORIZONTAL_POS_CENTER :Sredina
STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Desno STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Desno
STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}sekund{P a e e}
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Najveći zajam na početku: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Najveći zajam na početku: {STRING}
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Najveći iznos koji preduzeće može da pozajmi (ne uzimajući u obzir inflaciju) STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Najveći iznos koji preduzeće može da pozajmi (ne uzimajući u obzir inflaciju)
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_VALUE :{CURRENCY_LONG}
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_INTEREST_RATE :Kamatna stopa: {STRING} STR_CONFIG_SETTING_INTEREST_RATE :Kamatna stopa: {STRING}
@ -1790,6 +1804,8 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Omogući upotre
STR_CONFIG_SETTING_LOADING_INDICATORS :Koristiti pokazatelj utovarivanja: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS :Koristiti pokazatelj utovarivanja: {STRING}
STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Odaberi da li će se prikazati indikatori utovara i istovara iznad vozila STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Odaberi da li će se prikazati indikatori utovara i istovara iznad vozila
STR_CONFIG_SETTING_TIMETABLE_MODE :Jedinica vremena za red vožnje: {STRING}
STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Izaberi jedinicu vremena koja se koristi za redove vožnje
###length 3 ###length 3
STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Prikazivanje polaska i dolaska u rasporedima: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Prikazivanje polaska i dolaska u rasporedima: {STRING}
@ -2123,6 +2139,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :Imperijalne mer
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :Metričke mere (km/h) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :Metričke mere (km/h)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :SI (m/s) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :SI (m/s)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS :Jedinice igre (pločica/dan) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS :Jedinice igre (pločica/dan)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_KNOTS :Čvorovi
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Mere za snagu vozila: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Mere za snagu vozila: {STRING}
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Kada je prikazana snaga vozila u korisničkom interfejsu, prikaži je u odabranim jedinicama STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Kada je prikazana snaga vozila u korisničkom interfejsu, prikaži je u odabranim jedinicama
@ -2176,10 +2193,12 @@ STR_CONFIG_SETTING_LIMITATIONS :Ograničenja
STR_CONFIG_SETTING_ACCIDENTS :Katastrofe / Nezgode STR_CONFIG_SETTING_ACCIDENTS :Katastrofe / Nezgode
STR_CONFIG_SETTING_GENWORLD :Stvaranje sveta STR_CONFIG_SETTING_GENWORLD :Stvaranje sveta
STR_CONFIG_SETTING_ENVIRONMENT :Okoliš STR_CONFIG_SETTING_ENVIRONMENT :Okoliš
STR_CONFIG_SETTING_ENVIRONMENT_TIME :Vreme
STR_CONFIG_SETTING_ENVIRONMENT_AUTHORITIES :Vlasti STR_CONFIG_SETTING_ENVIRONMENT_AUTHORITIES :Vlasti
STR_CONFIG_SETTING_ENVIRONMENT_TOWNS :Naselja STR_CONFIG_SETTING_ENVIRONMENT_TOWNS :Naselja
STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :Fabrike STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :Fabrike
STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :Distribucija tereta STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :Distribucija tereta
STR_CONFIG_SETTING_ENVIRONMENT_TREES :Drveće
STR_CONFIG_SETTING_AI :Suparnici STR_CONFIG_SETTING_AI :Suparnici
STR_CONFIG_SETTING_AI_NPC :Računar STR_CONFIG_SETTING_AI_NPC :Računar
STR_CONFIG_SETTING_NETWORK :Mreža STR_CONFIG_SETTING_NETWORK :Mreža
@ -2221,6 +2240,7 @@ STR_CONFIG_ERROR_SPRITECACHE_TOO_BIG :{WHITE}Dodela {
# Video initalization errors # Video initalization errors
STR_VIDEO_DRIVER_ERROR :{WHITE}Greška sa podešavanjima videa... STR_VIDEO_DRIVER_ERROR :{WHITE}Greška sa podešavanjima videa...
STR_VIDEO_DRIVER_ERROR_NO_HARDWARE_ACCELERATION :{WHITE}... kompatibilan GPU nije pronađen. Hardversko ubrzanje je isključeno STR_VIDEO_DRIVER_ERROR_NO_HARDWARE_ACCELERATION :{WHITE}... kompatibilan GPU nije pronađen. Hardversko ubrzanje je isključeno
STR_VIDEO_DRIVER_ERROR_HARDWARE_ACCELERATION_CRASH :{WHITE}... GPU drajver je oborio igru. Hardversko ubrzanje je onemogućeno
# Intro window # Intro window
STR_INTRO_CAPTION :{WHITE}OpenTTD {REV} STR_INTRO_CAPTION :{WHITE}OpenTTD {REV}
@ -2277,6 +2297,9 @@ STR_ABANDON_GAME_QUERY :{YELLOW}Da li z
STR_ABANDON_SCENARIO_QUERY :{YELLOW}Da li zaista želiš da napustiš ovaj scenario? STR_ABANDON_SCENARIO_QUERY :{YELLOW}Da li zaista želiš da napustiš ovaj scenario?
# Help window # Help window
STR_HELP_WINDOW_DOCUMENTS :{BLACK}Dokumenti
STR_HELP_WINDOW_KNOWN_BUGS :{BLACK}Poznati Bagovi
STR_HELP_WINDOW_LICENSE :{BLACK}Licenca
# Cheat window # Cheat window
STR_CHEATS :{WHITE}Varanja STR_CHEATS :{WHITE}Varanja
@ -2301,9 +2324,11 @@ STR_LIVERY_TRAIN_TOOLTIP :{BLACK}Prikaži
STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}Prikaži šeme boja drumskih vozila STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}Prikaži šeme boja drumskih vozila
STR_LIVERY_SHIP_TOOLTIP :{BLACK}Prikaži šeme boja brodova STR_LIVERY_SHIP_TOOLTIP :{BLACK}Prikaži šeme boja brodova
STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Prikaži šeme boja letelica STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Prikaži šeme boja letelica
STR_LIVERY_SHIP_GROUP_TOOLTIP :{BLACK}Prikaži boje grupa brodova
STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Izaberi osnovnu boju za označenu kategoriju. Ctrl+klik će izabrati ovu boju za sve kategorije STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Izaberi osnovnu boju za označenu kategoriju. Ctrl+klik će izabrati ovu boju za sve kategorije
STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Izaberi dodatnu boju za označenu kategoriju. Ctrl+klik će izabrati ovu boju za sve kategorije STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Izaberi dodatnu boju za označenu kategoriju. Ctrl+klik će izabrati ovu boju za sve kategorije
STR_LIVERY_PANEL_TOOLTIP :{BLACK}Označi šemu boja za izmenu, ili više njih koristeći Ctrl+klik. Klikom na kutijicu aktivira se upotreba date šeme STR_LIVERY_PANEL_TOOLTIP :{BLACK}Označi šemu boja za izmenu, ili više njih koristeći Ctrl+klik. Klikom na kutijicu aktivira se upotreba date šeme
STR_LIVERY_AIRCRAFT_GROUP_EMPTY :Nijedna grupa letelica nije formirana
###length 23 ###length 23
STR_LIVERY_DEFAULT :Uobičajene boje STR_LIVERY_DEFAULT :Uobičajene boje
@ -2525,6 +2550,7 @@ STR_NETWORK_CLIENT_LIST_NEW_COMPANY :(novo preduzeć
STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}Napravi novo preduzeće i pridruži mu se STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}Napravi novo preduzeće i pridruži mu se
STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP :{BLACK}Ovo si ti STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP :{BLACK}Ovo si ti
STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}Ovo je domaćin igre STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}Ovo je domaćin igre
STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}{NUM} klijen{P t ata ata} - {NUM}/{NUM} preduzeć{P e a a}
# Matches ConnectionType # Matches ConnectionType
###length 5 ###length 5
@ -2551,6 +2577,9 @@ STR_NETWORK_ASK_RELAY_NO :{BLACK}Ne
STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Da, jednom STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Da, jednom
STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Da, ne pitaj ponovo STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Da, ne pitaj ponovo
STR_NETWORK_ASK_SURVEY_TEXT :Da li želiš da učestvuješ u automatskoj anketi?{}OpenTTD će slati anketu kada izlaziš iz igre.{}Možeš promentiti ovo podešavanje u bilo kom trenutku pod "Opcijama igre".
STR_NETWORK_ASK_SURVEY_PREVIEW :Pregledaj rezultate ankete
STR_NETWORK_ASK_SURVEY_LINK :O anketi i privatnosti
STR_NETWORK_SPECTATORS :Posmatrači STR_NETWORK_SPECTATORS :Posmatrači
@ -2867,6 +2896,8 @@ STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Povećav
STR_SELECT_RAIL_BRIDGE_CAPTION :{WHITE}Izbor železničkog mosta STR_SELECT_RAIL_BRIDGE_CAPTION :{WHITE}Izbor železničkog mosta
STR_SELECT_ROAD_BRIDGE_CAPTION :{WHITE}Izbor drumskog mosta STR_SELECT_ROAD_BRIDGE_CAPTION :{WHITE}Izbor drumskog mosta
STR_SELECT_BRIDGE_SELECTION_TOOLTIP :{BLACK}Izbor mosta - gradnja se potvrđuje klikom na željeni most STR_SELECT_BRIDGE_SELECTION_TOOLTIP :{BLACK}Izbor mosta - gradnja se potvrđuje klikom na željeni most
STR_SELECT_BRIDGE_INFO_NAME :{GOLD}{STRING}
STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED :{GOLD}{STRING},{} {VELOCITY}
STR_BRIDGE_NAME_SUSPENSION_STEEL :Viseći, čelični STR_BRIDGE_NAME_SUSPENSION_STEEL :Viseći, čelični
STR_BRIDGE_NAME_GIRDER_STEEL :Gredni, čelični STR_BRIDGE_NAME_GIRDER_STEEL :Gredni, čelični
STR_BRIDGE_NAME_CANTILEVER_STEEL :Obešeni, čelični STR_BRIDGE_NAME_CANTILEVER_STEEL :Obešeni, čelični
@ -3298,6 +3329,7 @@ STR_MAPGEN_MAPSIZE :{BLACK}Veličin
STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Izaberi veličinu mape u pločicama. Broj dostupnih pločica će biti neznatno manji STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Izaberi veličinu mape u pločicama. Broj dostupnih pločica će biti neznatno manji
STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_BY :{BLACK}*
STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Broj naselja: STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Broj naselja:
STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP :{BLACK}Izaberi gustinu gradova, ili unesi broj
STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Imena naselja: STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Imena naselja:
STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Izaberi stil imena naselja STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Izaberi stil imena naselja
STR_MAPGEN_DATE :{BLACK}Datum: STR_MAPGEN_DATE :{BLACK}Datum:
@ -3319,6 +3351,7 @@ STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Broj rek
STR_MAPGEN_SMOOTHNESS :{BLACK}Postepenost: STR_MAPGEN_SMOOTHNESS :{BLACK}Postepenost:
STR_MAPGEN_VARIETY :{BLACK}Raznolikost: STR_MAPGEN_VARIETY :{BLACK}Raznolikost:
STR_MAPGEN_GENERATE :{WHITE}Napravi STR_MAPGEN_GENERATE :{WHITE}Napravi
STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Kreiraj svet i igraj OpenTTD!
STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Podešavanja NewGRF STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Podešavanja NewGRF
STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Prikazuje podešavanja NewGRF STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Prikazuje podešavanja NewGRF
STR_MAPGEN_AI_SETTINGS :{BLACK}Podešavanja VI STR_MAPGEN_AI_SETTINGS :{BLACK}Podešavanja VI
@ -4677,6 +4710,7 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Vozilo t
STR_TIMETABLE_STATUS_LATE :{BLACK}Vozilo trenutno kasni za {STRING} od rasporeda STR_TIMETABLE_STATUS_LATE :{BLACK}Vozilo trenutno kasni za {STRING} od rasporeda
STR_TIMETABLE_STATUS_EARLY :{BLACK}Vozilo trenutno žuri za {STRING} od rasporeda STR_TIMETABLE_STATUS_EARLY :{BLACK}Vozilo trenutno žuri za {STRING} od rasporeda
STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Ovaj raspored još nije počeo STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Ovaj raspored još nije počeo
STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Ovaj red vožnje će započeti za {COMMA} sekund{P u e e}
@ -4702,6 +4736,7 @@ STR_TIMETABLE_EXPECTED :{BLACK}Očekiva
STR_TIMETABLE_SCHEDULED :{BLACK}Po planu STR_TIMETABLE_SCHEDULED :{BLACK}Po planu
STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Prebacivanje između prikaza očekivanog i po planu STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Prebacivanje između prikaza očekivanog i po planu
STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE :D: {COLOUR}{COMMA} sek
# Date window (for timetable) # Date window (for timetable)
@ -4793,6 +4828,7 @@ STR_AI_SETTINGS_SETTING :{STRING}: {ORAN
# Textfile window # Textfile window
STR_TEXTFILE_JUMPLIST_ITEM :{WHITE}{STRING}
STR_TEXTFILE_WRAP_TEXT :{WHITE}Prelomiti tekst STR_TEXTFILE_WRAP_TEXT :{WHITE}Prelomiti tekst
STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK} Prelomiti tekst prozora tako da stane bez potrebe skrolovanja STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK} Prelomiti tekst prozora tako da stane bez potrebe skrolovanja
STR_TEXTFILE_VIEW_README :{BLACK}Prikaži uputstvo STR_TEXTFILE_VIEW_README :{BLACK}Prikaži uputstvo
@ -4802,6 +4838,7 @@ STR_TEXTFILE_VIEW_LICENCE :{BLACK}Licenca
STR_TEXTFILE_README_CAPTION :{WHITE}{STRING} uputstvo za {STRING} STR_TEXTFILE_README_CAPTION :{WHITE}{STRING} uputstvo za {STRING}
STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING} izmene od {STRING} STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING} izmene od {STRING}
STR_TEXTFILE_LICENCE_CAPTION :{WHITE}{STRING} licenca od {STRING} STR_TEXTFILE_LICENCE_CAPTION :{WHITE}{STRING} licenca od {STRING}
STR_TEXTFILE_GAME_MANUAL_CAPTION :{WHITE}OpenTTD dokument '{STRING}'
# Vehicle loading indicators # Vehicle loading indicators
@ -5240,6 +5277,7 @@ STR_ERROR_TOO_FAR_FROM_PREVIOUS_DESTINATION :{WHITE}... prev
STR_ERROR_AIRCRAFT_NOT_ENOUGH_RANGE :{WHITE}... letelica nema dovoljan domet STR_ERROR_AIRCRAFT_NOT_ENOUGH_RANGE :{WHITE}... letelica nema dovoljan domet
# Extra messages which go on the third line of errors, explaining why orders failed # Extra messages which go on the third line of errors, explaining why orders failed
STR_ERROR_NO_BUS_STATION :{WHITE}Nema autobuske stanice
# Timetable related errors # Timetable related errors
STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Raspored se ne može dodeliti vozilu... STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Raspored se ne može dodeliti vozilu...
@ -5729,6 +5767,7 @@ STR_JUST_COMMA :{COMMA}
STR_JUST_CURRENCY_SHORT :{CURRENCY_SHORT} STR_JUST_CURRENCY_SHORT :{CURRENCY_SHORT}
STR_JUST_CURRENCY_LONG :{CURRENCY_LONG} STR_JUST_CURRENCY_LONG :{CURRENCY_LONG}
STR_JUST_CARGO_LIST :{CARGO_LIST} STR_JUST_CARGO_LIST :{CARGO_LIST}
STR_JUST_DECIMAL :{DECIMAL}
STR_JUST_INT :{NUM} STR_JUST_INT :{NUM}
STR_JUST_DATE_TINY :{DATE_TINY} STR_JUST_DATE_TINY :{DATE_TINY}
STR_JUST_DATE_SHORT :{DATE_SHORT} STR_JUST_DATE_SHORT :{DATE_SHORT}

@ -207,7 +207,7 @@ STR_COLOUR_SECONDARY_ORANGE :橘黄色
STR_COLOUR_SECONDARY_BROWN :棕 色 STR_COLOUR_SECONDARY_BROWN :棕 色
STR_COLOUR_SECONDARY_GREY :浅灰色 STR_COLOUR_SECONDARY_GREY :浅灰色
STR_COLOUR_SECONDARY_WHITE :白 色 STR_COLOUR_SECONDARY_WHITE :白 色
STR_COLOUR_SECONDARY_SAME_AS_PRIMARY :主色调相同 STR_COLOUR_SECONDARY_SAME_AS_PRIMARY :主色调
# Units used in OpenTTD # Units used in OpenTTD
@ -1002,6 +1002,7 @@ STR_GAME_OPTIONS_CURRENCY_HKD :港币
STR_GAME_OPTIONS_CURRENCY_INR :印度卢布 STR_GAME_OPTIONS_CURRENCY_INR :印度卢布
STR_GAME_OPTIONS_CURRENCY_IDR :印尼盾 STR_GAME_OPTIONS_CURRENCY_IDR :印尼盾
STR_GAME_OPTIONS_CURRENCY_MYR :马来西亚林吉特 STR_GAME_OPTIONS_CURRENCY_MYR :马来西亚林吉特
STR_GAME_OPTIONS_CURRENCY_LVL :拉脱维亚拉特
STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}自动保存 STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}自动保存
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}选择自动保存的周期 STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}选择自动保存的周期
@ -1359,7 +1360,7 @@ STR_CONFIG_SETTING_SIGNALSIDE :显示信号灯
STR_CONFIG_SETTING_SIGNALSIDE_HELPTEXT :选择在铁路哪一边放置信号灯 STR_CONFIG_SETTING_SIGNALSIDE_HELPTEXT :选择在铁路哪一边放置信号灯
###length 3 ###length 3
STR_CONFIG_SETTING_SIGNALSIDE_LEFT :在左边 STR_CONFIG_SETTING_SIGNALSIDE_LEFT :在左边
STR_CONFIG_SETTING_SIGNALSIDE_DRIVING_SIDE :在前进方向 STR_CONFIG_SETTING_SIGNALSIDE_DRIVING_SIDE :道路通行方向
STR_CONFIG_SETTING_SIGNALSIDE_RIGHT :在右侧 STR_CONFIG_SETTING_SIGNALSIDE_RIGHT :在右侧
STR_CONFIG_SETTING_SHOWFINANCES :在年终显示财务报表:{STRING} STR_CONFIG_SETTING_SHOWFINANCES :在年终显示财务报表:{STRING}
@ -1549,8 +1550,8 @@ STR_CONFIG_SETTING_SE_FLAT_WORLD_HEIGHT :由水面场景
STR_CONFIG_SETTING_EDGES_NOT_EMPTY :{WHITE}一个或多个北边的地块不是闲置的 STR_CONFIG_SETTING_EDGES_NOT_EMPTY :{WHITE}一个或多个北边的地块不是闲置的
STR_CONFIG_SETTING_EDGES_NOT_WATER :{WHITE}一个或多个地图某边的地块不是水域 STR_CONFIG_SETTING_EDGES_NOT_WATER :{WHITE}一个或多个地图某边的地块不是水域
STR_CONFIG_SETTING_STATION_SPREAD :车站占地上限格数 {STRING} STR_CONFIG_SETTING_STATION_SPREAD :最大车站范围 {STRING}
STR_CONFIG_SETTING_STATION_SPREAD_HELPTEXT :设置车站最大占地面积,注意:太大影响游戏速度 STR_CONFIG_SETTING_STATION_SPREAD_HELPTEXT :设置车站的最大范围,即最大长宽。请注意较高数值会使游戏变慢。
STR_CONFIG_SETTING_SERVICEATHELIPAD :直升机在降落平台自动保养:{STRING} STR_CONFIG_SETTING_SERVICEATHELIPAD :直升机在降落平台自动保养:{STRING}
STR_CONFIG_SETTING_SERVICEATHELIPAD_HELPTEXT :直升飞机在降落平台自动保养,即使机场没有机库 STR_CONFIG_SETTING_SERVICEATHELIPAD_HELPTEXT :直升飞机在降落平台自动保养,即使机场没有机库
@ -2723,7 +2724,7 @@ STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :磁悬浮铁路
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}建设轨道。按住 Ctrl 键切换建设/移除轨道。按住 Shift 键显示预计费用。 STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}建设轨道。按住 Ctrl 键切换建设/移除轨道。按住 Shift 键显示预计费用。
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}使用多向路轨工具铺设轨道。按住 Ctrl 键切换建设/移除轨道。按住 Shift 键显示预计费用。 STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}使用多向路轨工具铺设轨道。按住 Ctrl 键切换建设/移除轨道。按住 Shift 键显示预计费用。
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}建设列车车库(可以购买或维护列车)按住 Shift 键显示预计费用。 STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}建设列车车库(可以购买或维护列车)按住 Shift 键显示预计费用。
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}将铁路变为路点。按住 Ctrl 键允许合并路点。按住 Shift 键显示预计费用。 STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}建设铁路路点。按住 Ctrl 键允许合并路点。按住 Shift 键显示预计费用。
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}建设火车站。按住 Ctrl 键允许合并站台。按住 Shift 键显示预计费用。 STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}建设火车站。按住 Ctrl 键允许合并站台。按住 Shift 键显示预计费用。
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}建造铁路信号。{} 按住 Ctrl 键点选铁路,系统会切换悬臂式/电子式信号灯,或者更改被点选信号灯的种类{} 在一段直线铁路上拖拽,系统会依照设置的信号间距,沿铁路建立信号灯。如果按住 Ctrl 键拖拽,系统会建造信号灯至拖拽方向前的下一个道岔{} 如果按住 Shift 键点击铁路或在铁路上拖拽,系统会显示建置成本但不设置信号灯{} 如果按住 Ctrl 键点击此键,系统会切换信号灯选择窗口的显示状态 STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}建造铁路信号。{} 按住 Ctrl 键点选铁路,系统会切换悬臂式/电子式信号灯,或者更改被点选信号灯的种类{} 在一段直线铁路上拖拽,系统会依照设置的信号间距,沿铁路建立信号灯。如果按住 Ctrl 键拖拽,系统会建造信号灯至拖拽方向前的下一个道岔{} 如果按住 Shift 键点击铁路或在铁路上拖拽,系统会显示建置成本但不设置信号灯{} 如果按住 Ctrl 键点击此键,系统会切换信号灯选择窗口的显示状态
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}建设铁路桥梁。按住 Shift 键显示预计费用。 STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}建设铁路桥梁。按住 Shift 键显示预计费用。

@ -306,7 +306,7 @@ public:
} }
/** Bare constructor, only for save/load. */ /** Bare constructor, only for save/load. */
LinkGraph() : cargo(CT_INVALID), last_compression(0) {} LinkGraph() : cargo(INVALID_CARGO), last_compression(0) {}
/** /**
* Real constructor. * Real constructor.
* @param cargo Cargo the link graph is about. * @param cargo Cargo the link graph is about.

@ -23,7 +23,7 @@
* Only the cargo type of the most saturated linkgraph is taken into account. * Only the cargo type of the most saturated linkgraph is taken into account.
*/ */
struct LinkProperties { struct LinkProperties {
LinkProperties() : capacity(0), usage(0), planned(0), cargo(CT_INVALID), time(0), shared(false) {} LinkProperties() : capacity(0), usage(0), planned(0), cargo(INVALID_CARGO), time(0), shared(false) {}
/** Return the usage of the link to display. */ /** Return the usage of the link to display. */
uint Usage() const { return std::max(this->usage, this->planned); } uint Usage() const { return std::max(this->usage, this->planned); }

@ -74,7 +74,7 @@
* @param is_full_loading If the vehicle is full loading. * @param is_full_loading If the vehicle is full loading.
*/ */
LinkRefresher::LinkRefresher(Vehicle *vehicle, HopSet *seen_hops, bool allow_merge, bool is_full_loading, CargoTypes cargo_mask) : LinkRefresher::LinkRefresher(Vehicle *vehicle, HopSet *seen_hops, bool allow_merge, bool is_full_loading, CargoTypes cargo_mask) :
vehicle(vehicle), seen_hops(seen_hops), cargo(CT_INVALID), allow_merge(allow_merge), vehicle(vehicle), seen_hops(seen_hops), cargo(INVALID_CARGO), allow_merge(allow_merge),
is_full_loading(is_full_loading), cargo_mask(cargo_mask) is_full_loading(is_full_loading), cargo_mask(cargo_mask)
{ {
memset(this->capacities, 0, sizeof(this->capacities)); memset(this->capacities, 0, sizeof(this->capacities));

@ -60,7 +60,7 @@ protected:
struct Hop { struct Hop {
OrderID from; ///< Last order where vehicle could interact with cargo or absolute first order. OrderID from; ///< Last order where vehicle could interact with cargo or absolute first order.
OrderID to; ///< Next order to be processed. OrderID to; ///< Next order to be processed.
CargoID cargo; ///< Cargo the consist is probably carrying or CT_INVALID if unknown. CargoID cargo; ///< Cargo the consist is probably carrying or INVALID_CARGO if unknown.
uint8_t flags; ///< Flags, for branches uint8_t flags; ///< Flags, for branches
/** /**

@ -868,7 +868,7 @@ static CargoTypes TranslateRefitMask(uint32_t refit_mask)
CargoTypes result = 0; CargoTypes result = 0;
for (uint8_t bit : SetBitIterator(refit_mask)) { for (uint8_t bit : SetBitIterator(refit_mask)) {
CargoID cargo = GetCargoTranslation(bit, _cur.grffile, true); CargoID cargo = GetCargoTranslation(bit, _cur.grffile, true);
if (cargo != CT_INVALID) SetBit(result, cargo); if (cargo != INVALID_CARGO) SetBit(result, cargo);
} }
return result; return result;
} }
@ -1094,15 +1094,15 @@ static ChangeInfoResult RailVehicleChangeInfo(uint engine, int numinfo, int prop
if (ctype == 0xFF) { if (ctype == 0xFF) {
/* 0xFF is specified as 'use first refittable' */ /* 0xFF is specified as 'use first refittable' */
ei->cargo_type = CT_INVALID; ei->cargo_type = INVALID_CARGO;
} else if (_cur.grffile->grf_version >= 8) { } else if (_cur.grffile->grf_version >= 8) {
/* Use translated cargo. Might result in CT_INVALID (first refittable), if cargo is not defined. */ /* Use translated cargo. Might result in INVALID_CARGO (first refittable), if cargo is not defined. */
ei->cargo_type = GetCargoTranslation(ctype, _cur.grffile); ei->cargo_type = GetCargoTranslation(ctype, _cur.grffile);
} else if (ctype < NUM_CARGO) { } else if (ctype < NUM_CARGO) {
/* Use untranslated cargo. */ /* Use untranslated cargo. */
ei->cargo_type = ctype; ei->cargo_type = ctype;
} else { } else {
ei->cargo_type = CT_INVALID; ei->cargo_type = INVALID_CARGO;
grfmsg(2, "RailVehicleChangeInfo: Invalid cargo type %d, using first refittable", ctype); grfmsg(2, "RailVehicleChangeInfo: Invalid cargo type %d, using first refittable", ctype);
} }
break; break;
@ -1259,7 +1259,7 @@ static ChangeInfoResult RailVehicleChangeInfo(uint engine, int numinfo, int prop
ctt = 0; ctt = 0;
while (count--) { while (count--) {
CargoID ctype = GetCargoTranslation(buf->ReadByte(), _cur.grffile); CargoID ctype = GetCargoTranslation(buf->ReadByte(), _cur.grffile);
if (ctype == CT_INVALID) continue; if (ctype == INVALID_CARGO) continue;
SetBit(ctt, ctype); SetBit(ctt, ctype);
} }
break; break;
@ -1356,15 +1356,15 @@ static ChangeInfoResult RoadVehicleChangeInfo(uint engine, int numinfo, int prop
if (ctype == 0xFF) { if (ctype == 0xFF) {
/* 0xFF is specified as 'use first refittable' */ /* 0xFF is specified as 'use first refittable' */
ei->cargo_type = CT_INVALID; ei->cargo_type = INVALID_CARGO;
} else if (_cur.grffile->grf_version >= 8) { } else if (_cur.grffile->grf_version >= 8) {
/* Use translated cargo. Might result in CT_INVALID (first refittable), if cargo is not defined. */ /* Use translated cargo. Might result in INVALID_CARGO (first refittable), if cargo is not defined. */
ei->cargo_type = GetCargoTranslation(ctype, _cur.grffile); ei->cargo_type = GetCargoTranslation(ctype, _cur.grffile);
} else if (ctype < NUM_CARGO) { } else if (ctype < NUM_CARGO) {
/* Use untranslated cargo. */ /* Use untranslated cargo. */
ei->cargo_type = ctype; ei->cargo_type = ctype;
} else { } else {
ei->cargo_type = CT_INVALID; ei->cargo_type = INVALID_CARGO;
grfmsg(2, "RailVehicleChangeInfo: Invalid cargo type %d, using first refittable", ctype); grfmsg(2, "RailVehicleChangeInfo: Invalid cargo type %d, using first refittable", ctype);
} }
break; break;
@ -1469,7 +1469,7 @@ static ChangeInfoResult RoadVehicleChangeInfo(uint engine, int numinfo, int prop
ctt = 0; ctt = 0;
while (count--) { while (count--) {
CargoID ctype = GetCargoTranslation(buf->ReadByte(), _cur.grffile); CargoID ctype = GetCargoTranslation(buf->ReadByte(), _cur.grffile);
if (ctype == CT_INVALID) continue; if (ctype == INVALID_CARGO) continue;
SetBit(ctt, ctype); SetBit(ctt, ctype);
} }
break; break;
@ -1552,15 +1552,15 @@ static ChangeInfoResult ShipVehicleChangeInfo(uint engine, int numinfo, int prop
if (ctype == 0xFF) { if (ctype == 0xFF) {
/* 0xFF is specified as 'use first refittable' */ /* 0xFF is specified as 'use first refittable' */
ei->cargo_type = CT_INVALID; ei->cargo_type = INVALID_CARGO;
} else if (_cur.grffile->grf_version >= 8) { } else if (_cur.grffile->grf_version >= 8) {
/* Use translated cargo. Might result in CT_INVALID (first refittable), if cargo is not defined. */ /* Use translated cargo. Might result in INVALID_CARGO (first refittable), if cargo is not defined. */
ei->cargo_type = GetCargoTranslation(ctype, _cur.grffile); ei->cargo_type = GetCargoTranslation(ctype, _cur.grffile);
} else if (ctype < NUM_CARGO) { } else if (ctype < NUM_CARGO) {
/* Use untranslated cargo. */ /* Use untranslated cargo. */
ei->cargo_type = ctype; ei->cargo_type = ctype;
} else { } else {
ei->cargo_type = CT_INVALID; ei->cargo_type = INVALID_CARGO;
grfmsg(2, "ShipVehicleChangeInfo: Invalid cargo type %d, using first refittable", ctype); grfmsg(2, "ShipVehicleChangeInfo: Invalid cargo type %d, using first refittable", ctype);
} }
break; break;
@ -1653,7 +1653,7 @@ static ChangeInfoResult ShipVehicleChangeInfo(uint engine, int numinfo, int prop
ctt = 0; ctt = 0;
while (count--) { while (count--) {
CargoID ctype = GetCargoTranslation(buf->ReadByte(), _cur.grffile); CargoID ctype = GetCargoTranslation(buf->ReadByte(), _cur.grffile);
if (ctype == CT_INVALID) continue; if (ctype == INVALID_CARGO) continue;
SetBit(ctt, ctype); SetBit(ctt, ctype);
} }
break; break;
@ -1815,7 +1815,7 @@ static ChangeInfoResult AircraftVehicleChangeInfo(uint engine, int numinfo, int
ctt = 0; ctt = 0;
while (count--) { while (count--) {
CargoID ctype = GetCargoTranslation(buf->ReadByte(), _cur.grffile); CargoID ctype = GetCargoTranslation(buf->ReadByte(), _cur.grffile);
if (ctype == CT_INVALID) continue; if (ctype == INVALID_CARGO) continue;
SetBit(ctt, ctype); SetBit(ctt, ctype);
} }
break; break;
@ -2537,7 +2537,7 @@ static ChangeInfoResult TownHouseChangeInfo(uint hid, int numinfo, int prop, con
uint8_t cargo_part = GB(cargotypes, 8 * j, 8); uint8_t cargo_part = GB(cargotypes, 8 * j, 8);
CargoID cargo = GetCargoTranslation(cargo_part, _cur.grffile); CargoID cargo = GetCargoTranslation(cargo_part, _cur.grffile);
if (cargo == CT_INVALID) { if (cargo == INVALID_CARGO) {
/* Disable acceptance of invalid cargo type */ /* Disable acceptance of invalid cargo type */
housespec->cargo_acceptance[j] = 0; housespec->cargo_acceptance[j] = 0;
} else { } else {
@ -2555,7 +2555,7 @@ static ChangeInfoResult TownHouseChangeInfo(uint hid, int numinfo, int prop, con
byte count = buf->ReadByte(); byte count = buf->ReadByte();
for (byte j = 0; j < count; j++) { for (byte j = 0; j < count; j++) {
CargoID cargo = GetCargoTranslation(buf->ReadByte(), _cur.grffile); CargoID cargo = GetCargoTranslation(buf->ReadByte(), _cur.grffile);
if (cargo != CT_INVALID) SetBit(housespec->watched_cargoes, cargo); if (cargo != INVALID_CARGO) SetBit(housespec->watched_cargoes, cargo);
} }
break; break;
} }
@ -2583,7 +2583,7 @@ static ChangeInfoResult TownHouseChangeInfo(uint hid, int numinfo, int prop, con
housespec->accepts_cargo[i] = GetCargoTranslation(buf->ReadByte(), _cur.grffile); housespec->accepts_cargo[i] = GetCargoTranslation(buf->ReadByte(), _cur.grffile);
housespec->cargo_acceptance[i] = buf->ReadByte(); housespec->cargo_acceptance[i] = buf->ReadByte();
} else { } else {
housespec->accepts_cargo[i] = CT_INVALID; housespec->accepts_cargo[i] = INVALID_CARGO;
housespec->cargo_acceptance[i] = 0; housespec->cargo_acceptance[i] = 0;
} }
} }
@ -3344,7 +3344,7 @@ static ChangeInfoResult IndustrytilesChangeInfo(uint indtid, int numinfo, int pr
/* Tile acceptance can be negative to counteract the INDTILE_SPECIAL_ACCEPTS_ALL_CARGO flag */ /* Tile acceptance can be negative to counteract the INDTILE_SPECIAL_ACCEPTS_ALL_CARGO flag */
tsp->acceptance[i] = (int8_t)buf->ReadByte(); tsp->acceptance[i] = (int8_t)buf->ReadByte();
} else { } else {
tsp->accepts_cargo[i] = CT_INVALID; tsp->accepts_cargo[i] = INVALID_CARGO;
tsp->acceptance[i] = 0; tsp->acceptance[i] = 0;
} }
} }
@ -3471,8 +3471,8 @@ static bool ValidateIndustryLayout(const IndustryTileLayout &layout)
} }
bool have_regular_tile = false; bool have_regular_tile = false;
for (size_t i = 0; i < size; i++) { for (const auto &tilelayout : layout) {
if (layout[i].gfx != GFX_WATERTILE_SPECIALCHECK) { if (tilelayout.gfx != GFX_WATERTILE_SPECIALCHECK) {
have_regular_tile = true; have_regular_tile = true;
break; break;
} }
@ -3791,7 +3791,7 @@ static ChangeInfoResult IndustriesChangeInfo(uint indid, int numinfo, int prop,
CargoID cargo = GetCargoTranslation(buf->ReadByte(), _cur.grffile); CargoID cargo = GetCargoTranslation(buf->ReadByte(), _cur.grffile);
indsp->produced_cargo[i] = cargo; indsp->produced_cargo[i] = cargo;
} else { } else {
indsp->produced_cargo[i] = CT_INVALID; indsp->produced_cargo[i] = INVALID_CARGO;
} }
} }
break; break;
@ -3809,7 +3809,7 @@ static ChangeInfoResult IndustriesChangeInfo(uint indid, int numinfo, int prop,
CargoID cargo = GetCargoTranslation(buf->ReadByte(), _cur.grffile); CargoID cargo = GetCargoTranslation(buf->ReadByte(), _cur.grffile);
indsp->accepts_cargo[i] = cargo; indsp->accepts_cargo[i] = cargo;
} else { } else {
indsp->accepts_cargo[i] = CT_INVALID; indsp->accepts_cargo[i] = INVALID_CARGO;
} }
} }
break; break;
@ -6246,7 +6246,7 @@ static void NewSpriteGroup(ByteReader *buf)
for (uint i = 0; i < group->num_input; i++) { for (uint i = 0; i < group->num_input; i++) {
byte rawcargo = buf->ReadByte(); byte rawcargo = buf->ReadByte();
CargoID cargo = GetCargoTranslation(rawcargo, _cur.grffile); CargoID cargo = GetCargoTranslation(rawcargo, _cur.grffile);
if (cargo == CT_INVALID) { if (cargo == INVALID_CARGO) {
/* The mapped cargo is invalid. This is permitted at this point, /* The mapped cargo is invalid. This is permitted at this point,
* as long as the result is not used. Mark it invalid so this * as long as the result is not used. Mark it invalid so this
* can be tested later. */ * can be tested later. */
@ -6268,7 +6268,7 @@ static void NewSpriteGroup(ByteReader *buf)
for (uint i = 0; i < group->num_output; i++) { for (uint i = 0; i < group->num_output; i++) {
byte rawcargo = buf->ReadByte(); byte rawcargo = buf->ReadByte();
CargoID cargo = GetCargoTranslation(rawcargo, _cur.grffile); CargoID cargo = GetCargoTranslation(rawcargo, _cur.grffile);
if (cargo == CT_INVALID) { if (cargo == INVALID_CARGO) {
/* Mark this result as invalid to use */ /* Mark this result as invalid to use */
group->version = 0xFF; group->version = 0xFF;
} else if (std::find(group->cargo_output, group->cargo_output + i, cargo) != group->cargo_output + i) { } else if (std::find(group->cargo_output, group->cargo_output + i, cargo) != group->cargo_output + i) {
@ -6303,14 +6303,14 @@ static void NewSpriteGroup(ByteReader *buf)
static CargoID TranslateCargo(uint8_t feature, uint8_t ctype) static CargoID TranslateCargo(uint8_t feature, uint8_t ctype)
{ {
/* Special cargo types for purchase list and stations */ /* Special cargo types for purchase list and stations */
if ((feature == GSF_STATIONS || feature == GSF_ROADSTOPS) && ctype == 0xFE) return CT_DEFAULT_NA; if ((feature == GSF_STATIONS || feature == GSF_ROADSTOPS) && ctype == 0xFE) return SpriteGroupCargo::SG_DEFAULT_NA;
if (ctype == 0xFF) return CT_PURCHASE; if (ctype == 0xFF) return SpriteGroupCargo::SG_PURCHASE;
if (_cur.grffile->cargo_list.empty()) { if (_cur.grffile->cargo_list.empty()) {
/* No cargo table, so use bitnum values */ /* No cargo table, so use bitnum values */
if (ctype >= 32) { if (ctype >= 32) {
grfmsg(1, "TranslateCargo: Cargo bitnum %d out of range (max 31), skipping.", ctype); grfmsg(1, "TranslateCargo: Cargo bitnum %d out of range (max 31), skipping.", ctype);
return CT_INVALID; return INVALID_CARGO;
} }
for (const CargoSpec *cs : CargoSpec::Iterate()) { for (const CargoSpec *cs : CargoSpec::Iterate()) {
@ -6321,30 +6321,30 @@ static CargoID TranslateCargo(uint8_t feature, uint8_t ctype)
} }
grfmsg(5, "TranslateCargo: Cargo bitnum %d not available in this climate, skipping.", ctype); grfmsg(5, "TranslateCargo: Cargo bitnum %d not available in this climate, skipping.", ctype);
return CT_INVALID; return INVALID_CARGO;
} }
/* Check if the cargo type is out of bounds of the cargo translation table */ /* Check if the cargo type is out of bounds of the cargo translation table */
if (ctype >= _cur.grffile->cargo_list.size()) { if (ctype >= _cur.grffile->cargo_list.size()) {
grfmsg(1, "TranslateCargo: Cargo type %d out of range (max %d), skipping.", ctype, (unsigned int)_cur.grffile->cargo_list.size() - 1); grfmsg(1, "TranslateCargo: Cargo type %d out of range (max %d), skipping.", ctype, (unsigned int)_cur.grffile->cargo_list.size() - 1);
return CT_INVALID; return INVALID_CARGO;
} }
/* Look up the cargo label from the translation table */ /* Look up the cargo label from the translation table */
CargoLabel cl = _cur.grffile->cargo_list[ctype]; CargoLabel cl = _cur.grffile->cargo_list[ctype];
if (cl == 0) { if (cl == 0) {
grfmsg(5, "TranslateCargo: Cargo type %d not available in this climate, skipping.", ctype); grfmsg(5, "TranslateCargo: Cargo type %d not available in this climate, skipping.", ctype);
return CT_INVALID; return INVALID_CARGO;
} }
ctype = GetCargoIDByLabel(cl); CargoID cid = GetCargoIDByLabel(cl);
if (ctype == CT_INVALID) { if (cid == INVALID_CARGO) {
grfmsg(5, "TranslateCargo: Cargo '%c%c%c%c' unsupported, skipping.", GB(cl, 24, 8), GB(cl, 16, 8), GB(cl, 8, 8), GB(cl, 0, 8)); grfmsg(5, "TranslateCargo: Cargo '%c%c%c%c' unsupported, skipping.", GB(cl, 24, 8), GB(cl, 16, 8), GB(cl, 8, 8), GB(cl, 0, 8));
return CT_INVALID; return INVALID_CARGO;
} }
grfmsg(6, "TranslateCargo: Cargo '%c%c%c%c' mapped to cargo type %d.", GB(cl, 24, 8), GB(cl, 16, 8), GB(cl, 8, 8), GB(cl, 0, 8), ctype); grfmsg(6, "TranslateCargo: Cargo '%c%c%c%c' mapped to cargo type %d.", GB(cl, 24, 8), GB(cl, 16, 8), GB(cl, 8, 8), GB(cl, 0, 8), cid);
return ctype; return cid;
} }
@ -6407,8 +6407,8 @@ static void VehicleMapSpriteGroup(ByteReader *buf, byte feature, uint8_t idcount
grfmsg(8, "VehicleMapSpriteGroup: * [%d] Cargo type 0x%X, group id 0x%02X", c, ctype, groupid); grfmsg(8, "VehicleMapSpriteGroup: * [%d] Cargo type 0x%X, group id 0x%02X", c, ctype, groupid);
ctype = TranslateCargo(feature, ctype); CargoID cid = TranslateCargo(feature, ctype);
if (ctype == CT_INVALID) continue; if (cid == INVALID_CARGO) continue;
for (uint i = 0; i < idcount; i++) { for (uint i = 0; i < idcount; i++) {
EngineID engine = engines[i]; EngineID engine = engines[i];
@ -6416,9 +6416,9 @@ static void VehicleMapSpriteGroup(ByteReader *buf, byte feature, uint8_t idcount
grfmsg(7, "VehicleMapSpriteGroup: [%d] Engine %d...", i, engine); grfmsg(7, "VehicleMapSpriteGroup: [%d] Engine %d...", i, engine);
if (wagover) { if (wagover) {
SetWagonOverrideSprites(engine, ctype, GetGroupByID(groupid), last_engines, last_engines_count); SetWagonOverrideSprites(engine, cid, GetGroupByID(groupid), last_engines, last_engines_count);
} else { } else {
SetCustomEngineSprites(engine, ctype, GetGroupByID(groupid)); SetCustomEngineSprites(engine, cid, GetGroupByID(groupid));
} }
} }
} }
@ -6432,9 +6432,9 @@ static void VehicleMapSpriteGroup(ByteReader *buf, byte feature, uint8_t idcount
EngineID engine = engines[i]; EngineID engine = engines[i];
if (wagover) { if (wagover) {
SetWagonOverrideSprites(engine, CT_DEFAULT, GetGroupByID(groupid), last_engines, last_engines_count); SetWagonOverrideSprites(engine, SpriteGroupCargo::SG_DEFAULT, GetGroupByID(groupid), last_engines, last_engines_count);
} else { } else {
SetCustomEngineSprites(engine, CT_DEFAULT, GetGroupByID(groupid)); SetCustomEngineSprites(engine, SpriteGroupCargo::SG_DEFAULT, GetGroupByID(groupid));
SetEngineGRF(engine, _cur.grffile); SetEngineGRF(engine, _cur.grffile);
} }
} }
@ -6487,7 +6487,7 @@ static void StationMapSpriteGroup(ByteReader *buf, uint8_t idcount)
if (!IsValidGroupID(groupid, "StationMapSpriteGroup")) continue; if (!IsValidGroupID(groupid, "StationMapSpriteGroup")) continue;
ctype = TranslateCargo(GSF_STATIONS, ctype); ctype = TranslateCargo(GSF_STATIONS, ctype);
if (ctype == CT_INVALID) continue; if (ctype == INVALID_CARGO) continue;
for (uint i = 0; i < idcount; i++) { for (uint i = 0; i < idcount; i++) {
StationSpec *statspec = stations[i] >= _cur.grffile->stations.size() ? nullptr : _cur.grffile->stations[stations[i]].get(); StationSpec *statspec = stations[i] >= _cur.grffile->stations.size() ? nullptr : _cur.grffile->stations[stations[i]].get();
@ -6517,7 +6517,7 @@ static void StationMapSpriteGroup(ByteReader *buf, uint8_t idcount)
continue; continue;
} }
statspec->grf_prop.spritegroup[CT_DEFAULT] = GetGroupByID(groupid); statspec->grf_prop.spritegroup[SpriteGroupCargo::SG_DEFAULT] = GetGroupByID(groupid);
statspec->grf_prop.grffile = _cur.grffile; statspec->grf_prop.grffile = _cur.grffile;
statspec->grf_prop.local_id = stations[i]; statspec->grf_prop.local_id = stations[i];
StationClass::Assign(statspec); StationClass::Assign(statspec);
@ -6877,7 +6877,7 @@ static void RoadStopMapSpriteGroup(ByteReader *buf, uint8_t idcount)
if (!IsValidGroupID(groupid, "RoadStopMapSpriteGroup")) continue; if (!IsValidGroupID(groupid, "RoadStopMapSpriteGroup")) continue;
ctype = TranslateCargo(GSF_ROADSTOPS, ctype); ctype = TranslateCargo(GSF_ROADSTOPS, ctype);
if (ctype == CT_INVALID) continue; if (ctype == INVALID_CARGO) continue;
for (uint i = 0; i < idcount; i++) { for (uint i = 0; i < idcount; i++) {
RoadStopSpec *roadstopspec = (roadstops[i] >= _cur.grffile->roadstops.size()) ? nullptr : _cur.grffile->roadstops[roadstops[i]].get(); RoadStopSpec *roadstopspec = (roadstops[i] >= _cur.grffile->roadstops.size()) ? nullptr : _cur.grffile->roadstops[roadstops[i]].get();
@ -6912,7 +6912,7 @@ static void RoadStopMapSpriteGroup(ByteReader *buf, uint8_t idcount)
continue; continue;
} }
roadstopspec->grf_prop.spritegroup[CT_DEFAULT] = GetGroupByID(groupid); roadstopspec->grf_prop.spritegroup[SpriteGroupCargo::SG_DEFAULT] = GetGroupByID(groupid);
roadstopspec->grf_prop.grffile = _cur.grffile; roadstopspec->grf_prop.grffile = _cur.grffile;
roadstopspec->grf_prop.local_id = roadstops[i]; roadstopspec->grf_prop.local_id = roadstops[i];
RoadStopClass::Assign(roadstopspec); RoadStopClass::Assign(roadstopspec);
@ -7732,9 +7732,9 @@ static void SkipIf(ByteReader *buf)
if (condtype >= 0x0B) { if (condtype >= 0x0B) {
/* Tests that ignore 'param' */ /* Tests that ignore 'param' */
switch (condtype) { switch (condtype) {
case 0x0B: result = GetCargoIDByLabel(BSWAP32(cond_val)) == CT_INVALID; case 0x0B: result = GetCargoIDByLabel(BSWAP32(cond_val)) == INVALID_CARGO;
break; break;
case 0x0C: result = GetCargoIDByLabel(BSWAP32(cond_val)) != CT_INVALID; case 0x0C: result = GetCargoIDByLabel(BSWAP32(cond_val)) != INVALID_CARGO;
break; break;
case 0x0D: result = GetRailTypeByLabel(BSWAP32(cond_val)) == INVALID_RAILTYPE; case 0x0D: result = GetRailTypeByLabel(BSWAP32(cond_val)) == INVALID_RAILTYPE;
break; break;
@ -10587,7 +10587,7 @@ static void CalculateRefitMasks()
CargoTypes original_known_cargoes = 0; CargoTypes original_known_cargoes = 0;
for (int ct = 0; ct != NUM_ORIGINAL_CARGO; ++ct) { for (int ct = 0; ct != NUM_ORIGINAL_CARGO; ++ct) {
CargoID cid = GetDefaultCargoID(_settings_game.game_creation.landscape, static_cast<CargoType>(ct)); CargoID cid = GetDefaultCargoID(_settings_game.game_creation.landscape, static_cast<CargoType>(ct));
if (cid != CT_INVALID) SetBit(original_known_cargoes, cid); if (cid != INVALID_CARGO) SetBit(original_known_cargoes, cid);
} }
for (Engine *e : Engine::Iterate()) { for (Engine *e : Engine::Iterate()) {
@ -10677,7 +10677,7 @@ static void CalculateRefitMasks()
/* Translate cargo_type using the original climate-specific cargo table. */ /* Translate cargo_type using the original climate-specific cargo table. */
ei->cargo_type = GetDefaultCargoID(_settings_game.game_creation.landscape, static_cast<CargoType>(ei->cargo_type)); ei->cargo_type = GetDefaultCargoID(_settings_game.game_creation.landscape, static_cast<CargoType>(ei->cargo_type));
if (ei->cargo_type != CT_INVALID) ClrBit(_gted[engine].ctt_exclude_mask, ei->cargo_type); if (ei->cargo_type != INVALID_CARGO) ClrBit(_gted[engine].ctt_exclude_mask, ei->cargo_type);
} }
/* Compute refittability */ /* Compute refittability */
@ -10706,17 +10706,17 @@ static void CalculateRefitMasks()
} }
/* Clear invalid cargoslots (from default vehicles or pre-NewCargo GRFs) */ /* Clear invalid cargoslots (from default vehicles or pre-NewCargo GRFs) */
if (ei->cargo_type != CT_INVALID && !HasBit(_cargo_mask, ei->cargo_type)) ei->cargo_type = CT_INVALID; if (ei->cargo_type != INVALID_CARGO && !HasBit(_cargo_mask, ei->cargo_type)) ei->cargo_type = INVALID_CARGO;
/* Ensure that the vehicle is either not refittable, or that the default cargo is one of the refittable cargoes. /* Ensure that the vehicle is either not refittable, or that the default cargo is one of the refittable cargoes.
* Note: Vehicles refittable to no cargo are handle differently to vehicle refittable to a single cargo. The latter might have subtypes. */ * Note: Vehicles refittable to no cargo are handle differently to vehicle refittable to a single cargo. The latter might have subtypes. */
if (!only_defaultcargo && (e->type != VEH_SHIP || e->u.ship.old_refittable) && ei->cargo_type != CT_INVALID && !HasBit(ei->refit_mask, ei->cargo_type)) { if (!only_defaultcargo && (e->type != VEH_SHIP || e->u.ship.old_refittable) && IsValidCargoID(ei->cargo_type) && !HasBit(ei->refit_mask, ei->cargo_type)) {
ei->cargo_type = CT_INVALID; ei->cargo_type = INVALID_CARGO;
} }
/* Check if this engine's cargo type is valid. If not, set to the first refittable /* Check if this engine's cargo type is valid. If not, set to the first refittable
* cargo type. Finally disable the vehicle, if there is still no cargo. */ * cargo type. Finally disable the vehicle, if there is still no cargo. */
if (ei->cargo_type == CT_INVALID && ei->refit_mask != 0) { if (ei->cargo_type == INVALID_CARGO && ei->refit_mask != 0) {
/* Figure out which CTT to use for the default cargo, if it is 'first refittable'. */ /* Figure out which CTT to use for the default cargo, if it is 'first refittable'. */
const GRFFile *file = _gted[engine].defaultcargo_grf; const GRFFile *file = _gted[engine].defaultcargo_grf;
if (file == nullptr) file = e->GetGRF(); if (file == nullptr) file = e->GetGRF();
@ -10732,12 +10732,12 @@ static void CalculateRefitMasks()
} }
} }
if (ei->cargo_type == CT_INVALID) { if (ei->cargo_type == INVALID_CARGO) {
/* Use first refittable cargo slot */ /* Use first refittable cargo slot */
ei->cargo_type = (CargoID)FindFirstBit(ei->refit_mask); ei->cargo_type = (CargoID)FindFirstBit(ei->refit_mask);
} }
} }
if (ei->cargo_type == CT_INVALID) ei->climates = 0; if (ei->cargo_type == INVALID_CARGO) ei->climates = 0;
/* Clear refit_mask for not refittable ships */ /* Clear refit_mask for not refittable ships */
if (e->type == VEH_SHIP && !e->u.ship.old_refittable) { if (e->type == VEH_SHIP && !e->u.ship.old_refittable) {
@ -11033,15 +11033,14 @@ static void FinaliseIndustriesArray()
} }
} }
for (uint j = 0; j < NUM_INDUSTRYTYPES; j++) { for (auto &indsp : _industry_specs) {
IndustrySpec *indsp = &_industry_specs[j]; if (indsp.enabled && indsp.grf_prop.grffile != nullptr) {
if (indsp->enabled && indsp->grf_prop.grffile != nullptr) { for (auto &conflicting : indsp.conflicting) {
for (uint i = 0; i < 3; i++) { conflicting = MapNewGRFIndustryType(conflicting, indsp.grf_prop.grffile->grfid);
indsp->conflicting[i] = MapNewGRFIndustryType(indsp->conflicting[i], indsp->grf_prop.grffile->grfid);
} }
} }
if (!indsp->enabled) { if (!indsp.enabled) {
indsp->name = STR_NEWGRF_INVALID_INDUSTRYTYPE; indsp.name = STR_NEWGRF_INVALID_INDUSTRYTYPE;
} }
} }
} }

@ -85,8 +85,8 @@ private:
}; };
void AnimateAirportTile(TileIndex tile); void AnimateAirportTile(TileIndex tile);
void AirportTileAnimationTrigger(Station *st, TileIndex tile, AirpAnimationTrigger trigger, CargoID cargo_type = CT_INVALID); void AirportTileAnimationTrigger(Station *st, TileIndex tile, AirpAnimationTrigger trigger, CargoID cargo_type = INVALID_CARGO);
void AirportAnimationTrigger(Station *st, AirpAnimationTrigger trigger, CargoID cargo_type = CT_INVALID); void AirportAnimationTrigger(Station *st, AirpAnimationTrigger trigger, CargoID cargo_type = INVALID_CARGO);
uint8_t GetAirportTileAnimationSpeed(TileIndex tile); uint8_t GetAirportTileAnimationSpeed(TileIndex tile);
bool DrawNewAirportTile(TileInfo *ti, Station *st, const AirportTileSpec *airts); bool DrawNewAirportTile(TileInfo *ti, Station *st, const AirportTileSpec *airts);

@ -74,13 +74,13 @@ uint16_t GetCargoCallback(CallbackID callback, uint32_t param1, uint32_t param2,
* @param usebit Defines the meaning of \a cargo for GRF version < 7. * @param usebit Defines the meaning of \a cargo for GRF version < 7.
* If true, then \a cargo is a bitnum. If false, then \a cargo is a cargoslot. * If true, then \a cargo is a bitnum. If false, then \a cargo is a cargoslot.
* For GRF version >= 7 \a cargo is always a translated cargo bit. * For GRF version >= 7 \a cargo is always a translated cargo bit.
* @return CargoID or CT_INVALID if the cargo is not available. * @return CargoID or INVALID_CARGO if the cargo is not available.
*/ */
CargoID GetCargoTranslation(uint8_t cargo, const GRFFile *grffile, bool usebit) CargoID GetCargoTranslation(uint8_t cargo, const GRFFile *grffile, bool usebit)
{ {
/* Pre-version 7 uses the 'climate dependent' ID in callbacks and properties, i.e. cargo is the cargo ID */ /* Pre-version 7 uses the 'climate dependent' ID in callbacks and properties, i.e. cargo is the cargo ID */
if (grffile->grf_version < 7 && !usebit) { if (grffile->grf_version < 7 && !usebit) {
if (cargo >= CargoSpec::GetArraySize() || !CargoSpec::Get(cargo)->IsValid()) return CT_INVALID; if (cargo >= CargoSpec::GetArraySize() || !CargoSpec::Get(cargo)->IsValid()) return INVALID_CARGO;
return cargo; return cargo;
} }
@ -94,5 +94,5 @@ CargoID GetCargoTranslation(uint8_t cargo, const GRFFile *grffile, bool usebit)
/* Else the cargo value is a 'climate independent' 'bitnum' */ /* Else the cargo value is a 'climate independent' 'bitnum' */
return GetCargoIDByBitnum(cargo); return GetCargoIDByBitnum(cargo);
} }
return CT_INVALID; return INVALID_CARGO;
} }

@ -14,9 +14,16 @@
#include "cargo_type.h" #include "cargo_type.h"
#include "gfx_type.h" #include "gfx_type.h"
static const CargoID CT_DEFAULT = NUM_CARGO + 0; /**
static const CargoID CT_PURCHASE = NUM_CARGO + 1; * Sprite Group Cargo types.
static const CargoID CT_DEFAULT_NA = NUM_CARGO + 2; * These special cargo types are used when resolving sprite groups when non-cargo-specific sprites or callbacks are needed,
* e.g. in purchase lists, or if no specific cargo type sprite group is supplied.
*/
namespace SpriteGroupCargo {
static constexpr CargoID SG_DEFAULT = NUM_CARGO; ///< Default type used when no more-specific cargo matches.
static constexpr CargoID SG_PURCHASE = NUM_CARGO + 1; ///< Used in purchase lists before an item exists.
static constexpr CargoID SG_DEFAULT_NA = NUM_CARGO + 2; ///< Used only by stations and roads when no more-specific cargo matches.
};
/* Forward declarations of structs used */ /* Forward declarations of structs used */
struct CargoSpec; struct CargoSpec;

@ -799,7 +799,7 @@ struct NewGRFInspectWindow : Window {
break; break;
case NIT_CARGO: case NIT_CARGO:
string = value != CT_INVALID ? CargoSpec::Get(value)->name : STR_QUANTITY_N_A; string = (value != INVALID_CARGO) ? CargoSpec::Get(value)->name : STR_QUANTITY_N_A;
break; break;
default: default:

@ -38,7 +38,7 @@ void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const SpriteGroup *
{ {
Engine *e = Engine::Get(engine); Engine *e = Engine::Get(engine);
assert(cargo < NUM_CARGO + 2); // Include CT_DEFAULT and CT_PURCHASE pseudo cargoes. assert(cargo < NUM_CARGO + 2); // Include SpriteGroupCargo::SG_DEFAULT and SpriteGroupCargo::SG_PURCHASE pseudo cargoes.
WagonOverride *wo = &e->overrides.emplace_back(); WagonOverride *wo = &e->overrides.emplace_back();
wo->group = group; wo->group = group;
@ -51,7 +51,7 @@ const SpriteGroup *GetWagonOverrideSpriteSet(EngineID engine, CargoID cargo, Eng
const Engine *e = Engine::Get(engine); const Engine *e = Engine::Get(engine);
for (const WagonOverride &wo : e->overrides) { for (const WagonOverride &wo : e->overrides) {
if (wo.cargo != cargo && wo.cargo != CT_DEFAULT) continue; if (wo.cargo != cargo && wo.cargo != SpriteGroupCargo::SG_DEFAULT) continue;
if (std::find(wo.engines.begin(), wo.engines.end(), overriding_engine) != wo.engines.end()) return wo.group; if (std::find(wo.engines.begin(), wo.engines.end(), overriding_engine) != wo.engines.end()) return wo.group;
} }
return nullptr; return nullptr;
@ -591,8 +591,8 @@ static uint32_t VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *objec
/* Pick the most common cargo type */ /* Pick the most common cargo type */
auto cargo_it = std::max_element(std::begin(common_cargoes), std::end(common_cargoes)); auto cargo_it = std::max_element(std::begin(common_cargoes), std::end(common_cargoes));
/* Return CT_INVALID if nothing is carried */ /* Return INVALID_CARGO if nothing is carried */
CargoID common_cargo_type = (*cargo_it == 0) ? (CargoID)CT_INVALID : static_cast<CargoID>(std::distance(std::begin(common_cargoes), cargo_it)); CargoID common_cargo_type = (*cargo_it == 0) ? INVALID_CARGO : static_cast<CargoID>(std::distance(std::begin(common_cargoes), cargo_it));
/* Count subcargo types of common_cargo_type */ /* Count subcargo types of common_cargo_type */
std::array<uint8_t, UINT8_MAX + 1> common_subtypes{}; std::array<uint8_t, UINT8_MAX + 1> common_subtypes{};
@ -627,7 +627,7 @@ static uint32_t VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *objec
* And this is only done by CheckCaches(). * And this is only done by CheckCaches().
*/ */
const GRFFile *grffile = object->ro.grffile; const GRFFile *grffile = object->ro.grffile;
uint8_t common_bitnum = (common_cargo_type == CT_INVALID) ? 0xFF : uint8_t common_bitnum = (common_cargo_type == INVALID_CARGO) ? 0xFF :
(grffile == nullptr || grffile->grf_version < 8) ? CargoSpec::Get(common_cargo_type)->bitnum : grffile->cargo_map[common_cargo_type]; (grffile == nullptr || grffile->grf_version < 8) ? CargoSpec::Get(common_cargo_type)->bitnum : grffile->cargo_map[common_cargo_type];
return (v->grf_cache.consist_cargo_information & 0xFFFF00FF) | common_bitnum << 8; return (v->grf_cache.consist_cargo_information & 0xFFFF00FF) | common_bitnum << 8;
@ -1109,7 +1109,7 @@ static uint32_t VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *objec
case 0x47: { // Vehicle cargo info case 0x47: { // Vehicle cargo info
const Engine *e = Engine::Get(this->self_type); const Engine *e = Engine::Get(this->self_type);
CargoID cargo_type = e->GetDefaultCargoType(); CargoID cargo_type = e->GetDefaultCargoType();
if (cargo_type != CT_INVALID) { if (cargo_type != INVALID_CARGO) {
const CargoSpec *cs = CargoSpec::Get(cargo_type); const CargoSpec *cs = CargoSpec::Get(cargo_type);
return (cs->classes << 16) | (cs->weight << 8) | this->ro.grffile->cargo_map[cargo_type]; return (cs->classes << 16) | (cs->weight << 8) | this->ro.grffile->cargo_map[cargo_type];
} else { } else {
@ -1204,7 +1204,7 @@ VehicleResolverObject::VehicleResolverObject(EngineID engine_type, const Vehicle
cached_relative_count(0) cached_relative_count(0)
{ {
if (wagon_override == WO_SELF) { if (wagon_override == WO_SELF) {
this->root_spritegroup = GetWagonOverrideSpriteSet(engine_type, CT_DEFAULT, engine_type); this->root_spritegroup = GetWagonOverrideSpriteSet(engine_type, SpriteGroupCargo::SG_DEFAULT, engine_type);
} else { } else {
if (wagon_override != WO_NONE && v != nullptr && v->IsGroundVehicle()) { if (wagon_override != WO_NONE && v != nullptr && v->IsGroundVehicle()) {
assert(v->engine_type == engine_type); // overrides make little sense with fake scopes assert(v->engine_type == engine_type); // overrides make little sense with fake scopes
@ -1221,9 +1221,9 @@ VehicleResolverObject::VehicleResolverObject(EngineID engine_type, const Vehicle
if (this->root_spritegroup == nullptr) { if (this->root_spritegroup == nullptr) {
const Engine *e = Engine::Get(engine_type); const Engine *e = Engine::Get(engine_type);
CargoID cargo = v != nullptr ? v->cargo_type : CT_PURCHASE; CargoID cargo = v != nullptr ? v->cargo_type : SpriteGroupCargo::SG_PURCHASE;
assert(cargo < lengthof(e->grf_prop.spritegroup)); assert(cargo < lengthof(e->grf_prop.spritegroup));
this->root_spritegroup = e->grf_prop.spritegroup[cargo] != nullptr ? e->grf_prop.spritegroup[cargo] : e->grf_prop.spritegroup[CT_DEFAULT]; this->root_spritegroup = e->grf_prop.spritegroup[cargo] != nullptr ? e->grf_prop.spritegroup[cargo] : e->grf_prop.spritegroup[SpriteGroupCargo::SG_DEFAULT];
} }
} }
} }
@ -1399,7 +1399,7 @@ static void DoTriggerVehicle(Vehicle *v, VehicleTrigger trigger, uint16_t base_r
v->waiting_triggers |= trigger; v->waiting_triggers |= trigger;
const Engine *e = Engine::Get(v->engine_type); const Engine *e = Engine::Get(v->engine_type);
if (!(e->grf_prop.spritegroup[v->cargo_type] || e->grf_prop.spritegroup[CT_DEFAULT])) return; if (!(e->grf_prop.spritegroup[v->cargo_type] || e->grf_prop.spritegroup[SpriteGroupCargo::SG_DEFAULT])) return;
} }
/* Rerandomise bits. Scopes other than SELF are invalid for rerandomisation. For bug-to-bug-compatibility with TTDP we ignore the scope. */ /* Rerandomise bits. Scopes other than SELF are invalid for rerandomisation. For bug-to-bug-compatibility with TTDP we ignore the scope. */
@ -1618,7 +1618,7 @@ void AnalyseEngineCallbacks()
}; };
for (uint i = 0; i < NUM_CARGO + 2; i++) { for (uint i = 0; i < NUM_CARGO + 2; i++) {
process_sg(e->grf_prop.spritegroup[i], i == CT_PURCHASE); process_sg(e->grf_prop.spritegroup[i], i == SpriteGroupCargo::SG_PURCHASE);
} }
for (const WagonOverride &wo : e->overrides) { for (const WagonOverride &wo : e->overrides) {
process_sg(wo.group, false); process_sg(wo.group, false);
@ -1631,9 +1631,9 @@ void AnalyseEngineCallbacks()
} }
} }
if (refit_cap_whitelist_ok && non_purchase_groups <= 1 && HasBit(e->info.callback_mask, CBM_VEHICLE_REFIT_CAPACITY) && e->grf_prop.spritegroup[CT_DEFAULT] != nullptr) { if (refit_cap_whitelist_ok && non_purchase_groups <= 1 && HasBit(e->info.callback_mask, CBM_VEHICLE_REFIT_CAPACITY) && e->grf_prop.spritegroup[SpriteGroupCargo::SG_DEFAULT] != nullptr) {
const SpriteGroup *purchase_sg = e->grf_prop.spritegroup[CT_PURCHASE]; const SpriteGroup *purchase_sg = e->grf_prop.spritegroup[SpriteGroupCargo::SG_PURCHASE];
e->grf_prop.spritegroup[CT_PURCHASE] = nullptr; // Temporarily disable separate purchase sprite group e->grf_prop.spritegroup[SpriteGroupCargo::SG_PURCHASE] = nullptr; // Temporarily disable separate purchase sprite group
if (refit_cap_no_var_47) { if (refit_cap_no_var_47) {
cb_refit_cap_values[GetVehicleCallback(CBID_VEHICLE_REFIT_CAPACITY, 0, 0, e->index, nullptr)] = ALL_CARGOTYPES; cb_refit_cap_values[GetVehicleCallback(CBID_VEHICLE_REFIT_CAPACITY, 0, 0, e->index, nullptr)] = ALL_CARGOTYPES;
} else { } else {
@ -1644,7 +1644,7 @@ void AnalyseEngineCallbacks()
} }
e->info.cargo_type = default_cb; e->info.cargo_type = default_cb;
} }
e->grf_prop.spritegroup[CT_PURCHASE] = purchase_sg; e->grf_prop.spritegroup[SpriteGroupCargo::SG_PURCHASE] = purchase_sg;
bool all_ok = true; bool all_ok = true;
uint index = 0; uint index = 0;
e->refit_capacity_values.reset(MallocT<EngineRefitCapacityValue>(cb_refit_cap_values.size())); e->refit_capacity_values.reset(MallocT<EngineRefitCapacityValue>(cb_refit_cap_values.size()));
@ -1681,8 +1681,8 @@ void DumpVehicleSpriteGroup(const Vehicle *v, SpriteGroupDumper &dumper)
root_spritegroup = e->grf_prop.spritegroup[cargo]; root_spritegroup = e->grf_prop.spritegroup[cargo];
seprintf(buffer, lastof(buffer), "Cargo: %u", cargo); seprintf(buffer, lastof(buffer), "Cargo: %u", cargo);
} else { } else {
root_spritegroup = e->grf_prop.spritegroup[CT_DEFAULT]; root_spritegroup = e->grf_prop.spritegroup[SpriteGroupCargo::SG_DEFAULT];
seprintf(buffer, lastof(buffer), "CT_DEFAULT"); seprintf(buffer, lastof(buffer), "SG_DEFAULT");
} }
dumper.Print(buffer); dumper.Print(buffer);
} }
@ -1693,11 +1693,11 @@ void DumpVehicleSpriteGroup(const Vehicle *v, SpriteGroupDumper &dumper)
if (e->grf_prop.spritegroup[i] != root_spritegroup && e->grf_prop.spritegroup[i] != nullptr) { if (e->grf_prop.spritegroup[i] != root_spritegroup && e->grf_prop.spritegroup[i] != nullptr) {
dumper.Print(""); dumper.Print("");
switch (i) { switch (i) {
case CT_DEFAULT: case SpriteGroupCargo::SG_DEFAULT:
seprintf(buffer, lastof(buffer), "OTHER SPRITE GROUP: CT_DEFAULT"); seprintf(buffer, lastof(buffer), "OTHER SPRITE GROUP: SG_DEFAULT");
break; break;
case CT_PURCHASE: case SpriteGroupCargo::SG_PURCHASE:
seprintf(buffer, lastof(buffer), "OTHER SPRITE GROUP: CT_PURCHASE"); seprintf(buffer, lastof(buffer), "OTHER SPRITE GROUP: SG_PURCHASE");
break; break;
default: default:
seprintf(buffer, lastof(buffer), "OTHER SPRITE GROUP: Cargo: %u", i); seprintf(buffer, lastof(buffer), "OTHER SPRITE GROUP: Cargo: %u", i);

@ -378,7 +378,7 @@ static uint32_t GetDistanceFromNearbyHouse(uint8_t parameter, TileIndex tile, Ho
/* Cargo acceptance history of nearby stations */ /* Cargo acceptance history of nearby stations */
case 0x64: { case 0x64: {
CargoID cid = GetCargoTranslation(parameter, this->ro.grffile); CargoID cid = GetCargoTranslation(parameter, this->ro.grffile);
if (cid == CT_INVALID) return 0; if (cid == INVALID_CARGO) return 0;
/* Extract tile offset. */ /* Extract tile offset. */
int8_t x_offs = GB(GetRegister(0x100), 0, 8); int8_t x_offs = GB(GetRegister(0x100), 0, 8);

@ -342,7 +342,7 @@ uint32_t IndustriesScopeResolver::GetCountAndDistanceOfClosestInstance(byte para
case 0x70: case 0x70:
case 0x71: { case 0x71: {
CargoID cargo = GetCargoTranslation(parameter, this->ro.grffile); CargoID cargo = GetCargoTranslation(parameter, this->ro.grffile);
if (cargo == CT_INVALID) return 0; if (cargo == INVALID_CARGO) return 0;
int index = this->industry->GetCargoProducedIndex(cargo); int index = this->industry->GetCargoProducedIndex(cargo);
if (index < 0) return 0; // invalid cargo if (index < 0) return 0; // invalid cargo
switch (variable) { switch (variable) {
@ -361,7 +361,7 @@ uint32_t IndustriesScopeResolver::GetCountAndDistanceOfClosestInstance(byte para
case 0x6E: case 0x6E:
case 0x6F: { case 0x6F: {
CargoID cargo = GetCargoTranslation(parameter, this->ro.grffile); CargoID cargo = GetCargoTranslation(parameter, this->ro.grffile);
if (cargo == CT_INVALID) return 0; if (cargo == INVALID_CARGO) return 0;
int index = this->industry->GetCargoAcceptedIndex(cargo); int index = this->industry->GetCargoAcceptedIndex(cargo);
if (index < 0) return 0; // invalid cargo if (index < 0) return 0; // invalid cargo
if (variable == 0x6E) return this->industry->last_cargo_accepted_at[index].base(); if (variable == 0x6E) return this->industry->last_cargo_accepted_at[index].base();
@ -669,11 +669,11 @@ void IndustryProductionCallback(Industry *ind, int reason)
if (group->version < 2) { if (group->version < 2) {
/* Callback parameters map directly to industry cargo slot indices */ /* Callback parameters map directly to industry cargo slot indices */
for (uint i = 0; i < group->num_input; i++) { for (uint i = 0; i < group->num_input; i++) {
if (ind->accepts_cargo[i] == CT_INVALID) continue; if (ind->accepts_cargo[i] == INVALID_CARGO) continue;
ind->incoming_cargo_waiting[i] = ClampTo<uint16_t>(ind->incoming_cargo_waiting[i] - DerefIndProd(group->subtract_input[i], deref) * multiplier); ind->incoming_cargo_waiting[i] = ClampTo<uint16_t>(ind->incoming_cargo_waiting[i] - DerefIndProd(group->subtract_input[i], deref) * multiplier);
} }
for (uint i = 0; i < group->num_output; i++) { for (uint i = 0; i < group->num_output; i++) {
if (ind->produced_cargo[i] == CT_INVALID) continue; if (ind->produced_cargo[i] == INVALID_CARGO) continue;
ind->produced_cargo_waiting[i] = ClampTo<uint16_t>(ind->produced_cargo_waiting[i] + std::max(DerefIndProd(group->add_output[i], deref), 0) * multiplier); ind->produced_cargo_waiting[i] = ClampTo<uint16_t>(ind->produced_cargo_waiting[i] + std::max(DerefIndProd(group->add_output[i], deref), 0) * multiplier);
} }
} else { } else {

@ -261,11 +261,11 @@ RoadStopResolverObject::RoadStopResolverObject(const RoadStopSpec *roadstopspec,
this->town_scope = nullptr; this->town_scope = nullptr;
CargoID ctype = CT_DEFAULT_NA; CargoID ctype = SpriteGroupCargo::SG_DEFAULT_NA;
if (st == nullptr) { if (st == nullptr) {
/* No station, so we are in a purchase list */ /* No station, so we are in a purchase list */
ctype = CT_PURCHASE; ctype = SpriteGroupCargo::SG_PURCHASE;
} else if (Station::IsExpected(st)) { } else if (Station::IsExpected(st)) {
const Station *station = Station::From(st); const Station *station = Station::From(st);
/* Pick the first cargo that we have waiting */ /* Pick the first cargo that we have waiting */
@ -279,7 +279,7 @@ RoadStopResolverObject::RoadStopResolverObject(const RoadStopSpec *roadstopspec,
} }
if (roadstopspec->grf_prop.spritegroup[ctype] == nullptr) { if (roadstopspec->grf_prop.spritegroup[ctype] == nullptr) {
ctype = CT_DEFAULT; ctype = SpriteGroupCargo::SG_DEFAULT;
} }
/* Remember the cargo type we've picked */ /* Remember the cargo type we've picked */
@ -431,8 +431,8 @@ void TriggerRoadStopAnimation(BaseStation *st, TileIndex trigger_tile, StationAn
const RoadStopSpec *ss = GetRoadStopSpec(cur_tile); const RoadStopSpec *ss = GetRoadStopSpec(cur_tile);
if (ss != nullptr && HasBit(ss->animation.triggers, trigger)) { if (ss != nullptr && HasBit(ss->animation.triggers, trigger)) {
CargoID cargo; CargoID cargo;
if (cargo_type == CT_INVALID) { if (cargo_type == INVALID_CARGO) {
cargo = CT_INVALID; cargo = INVALID_CARGO;
} else { } else {
cargo = ss->grf_prop.grffile->cargo_map[cargo_type]; cargo = ss->grf_prop.grffile->cargo_map[cargo_type];
} }
@ -464,7 +464,7 @@ void TriggerRoadStopRandomisation(Station *st, TileIndex tile, RoadStopRandomTri
/* Check the cached cargo trigger bitmask to see if we need /* Check the cached cargo trigger bitmask to see if we need
* to bother with any further processing. */ * to bother with any further processing. */
if (st->cached_roadstop_cargo_triggers == 0) return; if (st->cached_roadstop_cargo_triggers == 0) return;
if (cargo_type != CT_INVALID && !HasBit(st->cached_roadstop_cargo_triggers, cargo_type)) return; if (cargo_type != INVALID_CARGO && !HasBit(st->cached_roadstop_cargo_triggers, cargo_type)) return;
SetBit(st->waiting_triggers, trigger); SetBit(st->waiting_triggers, trigger);
@ -484,7 +484,7 @@ void TriggerRoadStopRandomisation(Station *st, TileIndex tile, RoadStopRandomTri
if ((ss->cargo_triggers & ~empty_mask) != 0) return; if ((ss->cargo_triggers & ~empty_mask) != 0) return;
} }
if (cargo_type == CT_INVALID || HasBit(ss->cargo_triggers, cargo_type)) { if (cargo_type == INVALID_CARGO || HasBit(ss->cargo_triggers, cargo_type)) {
RoadStopResolverObject object(ss, st, cur_tile, INVALID_ROADTYPE, GetStationType(cur_tile), GetStationGfx(cur_tile)); RoadStopResolverObject object(ss, st, cur_tile, INVALID_ROADTYPE, GetStationType(cur_tile), GetStationGfx(cur_tile));
object.waiting_triggers = st->waiting_triggers; object.waiting_triggers = st->waiting_triggers;
@ -682,11 +682,11 @@ void StationUpdateRoadStopCachedTriggers(BaseStation *st)
void DumpRoadStopSpriteGroup(const BaseStation *st, const RoadStopSpec *spec, SpriteGroupDumper &dumper) void DumpRoadStopSpriteGroup(const BaseStation *st, const RoadStopSpec *spec, SpriteGroupDumper &dumper)
{ {
CargoID ctype = CT_DEFAULT_NA; CargoID ctype = SpriteGroupCargo::SG_DEFAULT_NA;
if (st == nullptr) { if (st == nullptr) {
/* No station, so we are in a purchase list */ /* No station, so we are in a purchase list */
ctype = CT_PURCHASE; ctype = SpriteGroupCargo::SG_PURCHASE;
} else if (Station::IsExpected(st)) { } else if (Station::IsExpected(st)) {
const Station *station = Station::From(st); const Station *station = Station::From(st);
/* Pick the first cargo that we have waiting */ /* Pick the first cargo that we have waiting */
@ -700,7 +700,7 @@ void DumpRoadStopSpriteGroup(const BaseStation *st, const RoadStopSpec *spec, Sp
} }
if (spec->grf_prop.spritegroup[ctype] == nullptr) { if (spec->grf_prop.spritegroup[ctype] == nullptr) {
ctype = CT_DEFAULT; ctype = SpriteGroupCargo::SG_DEFAULT;
} }
dumper.DumpSpriteGroup(spec->grf_prop.spritegroup[ctype], 0); dumper.DumpSpriteGroup(spec->grf_prop.spritegroup[ctype], 0);

@ -192,8 +192,8 @@ uint16_t GetRoadStopCallback(CallbackID callback, uint32_t param1, uint32_t para
void AnimateRoadStopTile(TileIndex tile); void AnimateRoadStopTile(TileIndex tile);
uint8_t GetRoadStopTileAnimationSpeed(TileIndex tile); uint8_t GetRoadStopTileAnimationSpeed(TileIndex tile);
void TriggerRoadStopAnimation(BaseStation *st, TileIndex tile, StationAnimationTrigger trigger, CargoID cargo_type = CT_INVALID); void TriggerRoadStopAnimation(BaseStation *st, TileIndex tile, StationAnimationTrigger trigger, CargoID cargo_type = INVALID_CARGO);
void TriggerRoadStopRandomisation(Station *st, TileIndex tile, RoadStopRandomTrigger trigger, CargoID cargo_type = CT_INVALID); void TriggerRoadStopRandomisation(Station *st, TileIndex tile, RoadStopRandomTrigger trigger, CargoID cargo_type = INVALID_CARGO);
bool GetIfNewStopsByType(RoadStopType rs, RoadType roadtype); bool GetIfNewStopsByType(RoadStopType rs, RoadType roadtype);
bool GetIfClassHasNewStopsByType(RoadStopClass *roadstopclass, RoadStopType rs, RoadType roadtype); bool GetIfClassHasNewStopsByType(RoadStopClass *roadstopclass, RoadStopType rs, RoadType roadtype);

@ -434,7 +434,7 @@ uint32_t Station::GetNewGRFVariable(const ResolverObject &object, uint16_t varia
if ((variable >= 0x60 && variable <= 0x65) || variable == 0x69) { if ((variable >= 0x60 && variable <= 0x65) || variable == 0x69) {
CargoID c = GetCargoTranslation(parameter, object.grffile); CargoID c = GetCargoTranslation(parameter, object.grffile);
if (c == CT_INVALID) { if (c == INVALID_CARGO) {
switch (variable) { switch (variable) {
case 0x62: return 0xFFFFFFFF; case 0x62: return 0xFFFFFFFF;
case 0x64: return 0xFF00; case 0x64: return 0xFF00;
@ -522,13 +522,13 @@ uint32_t Waypoint::GetNewGRFVariable(const ResolverObject &object, uint16_t vari
const Station *st = Station::From(this->station_scope.st); const Station *st = Station::From(this->station_scope.st);
switch (this->station_scope.cargo_type) { switch (this->station_scope.cargo_type) {
case CT_INVALID: case INVALID_CARGO:
case CT_DEFAULT_NA: case SpriteGroupCargo::SG_DEFAULT_NA:
case CT_PURCHASE: case SpriteGroupCargo::SG_PURCHASE:
cargo = 0; cargo = 0;
break; break;
case CT_DEFAULT: case SpriteGroupCargo::SG_DEFAULT:
for (const GoodsEntry &ge : st->goods) { for (const GoodsEntry &ge : st->goods) {
cargo += ge.CargoTotalCount(); cargo += ge.CargoTotalCount();
} }
@ -585,11 +585,11 @@ StationResolverObject::StationResolverObject(const StationSpec *statspec, BaseSt
/* Invalidate all cached vars */ /* Invalidate all cached vars */
_svc.valid = 0; _svc.valid = 0;
CargoID ctype = CT_DEFAULT_NA; CargoID ctype = SpriteGroupCargo::SG_DEFAULT_NA;
if (this->station_scope.st == nullptr) { if (this->station_scope.st == nullptr) {
/* No station, so we are in a purchase list */ /* No station, so we are in a purchase list */
ctype = CT_PURCHASE; ctype = SpriteGroupCargo::SG_PURCHASE;
} else if (Station::IsExpected(this->station_scope.st)) { } else if (Station::IsExpected(this->station_scope.st)) {
const Station *st = Station::From(this->station_scope.st); const Station *st = Station::From(this->station_scope.st);
/* Pick the first cargo that we have waiting */ /* Pick the first cargo that we have waiting */
@ -603,7 +603,7 @@ StationResolverObject::StationResolverObject(const StationSpec *statspec, BaseSt
} }
if (this->station_scope.statspec->grf_prop.spritegroup[ctype] == nullptr) { if (this->station_scope.statspec->grf_prop.spritegroup[ctype] == nullptr) {
ctype = CT_DEFAULT; ctype = SpriteGroupCargo::SG_DEFAULT;
} }
/* Remember the cargo type we've picked */ /* Remember the cargo type we've picked */
@ -923,8 +923,8 @@ void TriggerStationAnimation(BaseStation *st, TileIndex trigger_tile, StationAni
const StationSpec *ss = GetStationSpec(tile); const StationSpec *ss = GetStationSpec(tile);
if (ss != nullptr && HasBit(ss->animation.triggers, trigger)) { if (ss != nullptr && HasBit(ss->animation.triggers, trigger)) {
CargoID cargo; CargoID cargo;
if (cargo_type == CT_INVALID) { if (cargo_type == INVALID_CARGO) {
cargo = CT_INVALID; cargo = INVALID_CARGO;
} else { } else {
cargo = ss->grf_prop.grffile->cargo_map[cargo_type]; cargo = ss->grf_prop.grffile->cargo_map[cargo_type];
} }
@ -954,7 +954,7 @@ void TriggerStationRandomisation(Station *st, TileIndex trigger_tile, StationRan
/* Check the cached cargo trigger bitmask to see if we need /* Check the cached cargo trigger bitmask to see if we need
* to bother with any further processing. */ * to bother with any further processing. */
if (st->cached_cargo_triggers == 0) return; if (st->cached_cargo_triggers == 0) return;
if (cargo_type != CT_INVALID && !HasBit(st->cached_cargo_triggers, cargo_type)) return; if (cargo_type != INVALID_CARGO && !HasBit(st->cached_cargo_triggers, cargo_type)) return;
uint32_t whole_reseed = 0; uint32_t whole_reseed = 0;
ETileArea area = ETileArea(st, trigger_tile, tas[trigger]); ETileArea area = ETileArea(st, trigger_tile, tas[trigger]);
@ -978,7 +978,7 @@ void TriggerStationRandomisation(Station *st, TileIndex trigger_tile, StationRan
if ((ss->cargo_triggers & ~empty_mask) != 0) continue; if ((ss->cargo_triggers & ~empty_mask) != 0) continue;
} }
if (cargo_type == CT_INVALID || HasBit(ss->cargo_triggers, cargo_type)) { if (cargo_type == INVALID_CARGO || HasBit(ss->cargo_triggers, cargo_type)) {
StationResolverObject object(ss, st, tile, INVALID_RAILTYPE, CBID_RANDOM_TRIGGER, 0); StationResolverObject object(ss, st, tile, INVALID_RAILTYPE, CBID_RANDOM_TRIGGER, 0);
object.waiting_triggers = st->waiting_triggers; object.waiting_triggers = st->waiting_triggers;
@ -1039,14 +1039,14 @@ void DumpStationSpriteGroup(const StationSpec *statspec, BaseStation *st, Sprite
StationResolverObject ro(statspec, st, INVALID_TILE, INVALID_RAILTYPE); StationResolverObject ro(statspec, st, INVALID_TILE, INVALID_RAILTYPE);
switch (ro.station_scope.cargo_type) { switch (ro.station_scope.cargo_type) {
case CT_DEFAULT: case SpriteGroupCargo::SG_DEFAULT:
seprintf(buffer, lastof(buffer), "CT_DEFAULT"); seprintf(buffer, lastof(buffer), "SG_DEFAULT");
break; break;
case CT_PURCHASE: case SpriteGroupCargo::SG_PURCHASE:
seprintf(buffer, lastof(buffer), "CT_PURCHASE"); seprintf(buffer, lastof(buffer), "SG_PURCHASE");
break; break;
case CT_DEFAULT_NA: case SpriteGroupCargo::SG_DEFAULT_NA:
seprintf(buffer, lastof(buffer), "CT_DEFAULT_NA"); seprintf(buffer, lastof(buffer), "SG_DEFAULT_NA");
break; break;
default: default:
seprintf(buffer, lastof(buffer), "Cargo: %u", ro.station_scope.cargo_type); seprintf(buffer, lastof(buffer), "Cargo: %u", ro.station_scope.cargo_type);
@ -1060,14 +1060,14 @@ void DumpStationSpriteGroup(const StationSpec *statspec, BaseStation *st, Sprite
if (statspec->grf_prop.spritegroup[i] != ro.root_spritegroup && statspec->grf_prop.spritegroup[i] != nullptr) { if (statspec->grf_prop.spritegroup[i] != ro.root_spritegroup && statspec->grf_prop.spritegroup[i] != nullptr) {
dumper.Print(""); dumper.Print("");
switch (i) { switch (i) {
case CT_DEFAULT: case SpriteGroupCargo::SG_DEFAULT:
seprintf(buffer, lastof(buffer), "OTHER SPRITE GROUP: CT_DEFAULT"); seprintf(buffer, lastof(buffer), "OTHER SPRITE GROUP: SG_DEFAULT");
break; break;
case CT_PURCHASE: case SpriteGroupCargo::SG_PURCHASE:
seprintf(buffer, lastof(buffer), "OTHER SPRITE GROUP: CT_PURCHASE"); seprintf(buffer, lastof(buffer), "OTHER SPRITE GROUP: SG_PURCHASE");
break; break;
case CT_DEFAULT_NA: case SpriteGroupCargo::SG_DEFAULT_NA:
seprintf(buffer, lastof(buffer), "OTHER SPRITE GROUP: CT_DEFAULT_NA"); seprintf(buffer, lastof(buffer), "OTHER SPRITE GROUP: SG_DEFAULT_NA");
break; break;
default: default:
seprintf(buffer, lastof(buffer), "OTHER SPRITE GROUP: Cargo: %u", i); seprintf(buffer, lastof(buffer), "OTHER SPRITE GROUP: Cargo: %u", i);

@ -39,7 +39,7 @@ struct StationScopeResolver : public ScopeResolver {
* @param rt %RailType of the station (unbuilt stations only). * @param rt %RailType of the station (unbuilt stations only).
*/ */
StationScopeResolver(ResolverObject &ro, const StationSpec *statspec, BaseStation *st, TileIndex tile, RailType rt) StationScopeResolver(ResolverObject &ro, const StationSpec *statspec, BaseStation *st, TileIndex tile, RailType rt)
: ScopeResolver(ro), tile(tile), st(st), statspec(statspec), cargo_type(CT_INVALID), axis(INVALID_AXIS), rt(rt) : ScopeResolver(ro), tile(tile), st(st), statspec(statspec), cargo_type(INVALID_CARGO), axis(INVALID_AXIS), rt(rt)
{ {
} }
@ -219,8 +219,8 @@ bool DrawStationTile(int x, int y, RailType railtype, Axis axis, StationClassID
void AnimateStationTile(TileIndex tile); void AnimateStationTile(TileIndex tile);
uint8_t GetStationTileAnimationSpeed(TileIndex tile); uint8_t GetStationTileAnimationSpeed(TileIndex tile);
void TriggerStationAnimation(BaseStation *st, TileIndex tile, StationAnimationTrigger trigger, CargoID cargo_type = CT_INVALID); void TriggerStationAnimation(BaseStation *st, TileIndex tile, StationAnimationTrigger trigger, CargoID cargo_type = INVALID_CARGO);
void TriggerStationRandomisation(Station *st, TileIndex tile, StationRandomTrigger trigger, CargoID cargo_type = CT_INVALID); void TriggerStationRandomisation(Station *st, TileIndex tile, StationRandomTrigger trigger, CargoID cargo_type = INVALID_CARGO);
void StationUpdateCachedTriggers(BaseStation *st); void StationUpdateCachedTriggers(BaseStation *st);
void UpdateStationTileCacheFlags(bool force_update); void UpdateStationTileCacheFlags(bool force_update);

@ -171,7 +171,7 @@ public:
Order *next; ///< Pointer to next order. If nullptr, end of list Order *next; ///< Pointer to next order. If nullptr, end of list
Order() : flags(0), refit_cargo(CT_NO_REFIT), max_speed(UINT16_MAX) {} Order() : flags(0), refit_cargo(CARGO_NO_REFIT), max_speed(UINT16_MAX) {}
~Order(); ~Order();
Order(uint64_t packed); Order(uint64_t packed);
@ -213,7 +213,7 @@ public:
void Free(); void Free();
void MakeGoToStation(StationID destination); void MakeGoToStation(StationID destination);
void MakeGoToDepot(DepotID destination, OrderDepotTypeFlags order, OrderNonStopFlags non_stop_type = ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS, OrderDepotActionFlags action = ODATF_SERVICE_ONLY, CargoID cargo = CT_NO_REFIT); void MakeGoToDepot(DepotID destination, OrderDepotTypeFlags order, OrderNonStopFlags non_stop_type = ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS, OrderDepotActionFlags action = ODATF_SERVICE_ONLY, CargoID cargo = CARGO_NO_REFIT);
void MakeGoToWaypoint(StationID destination); void MakeGoToWaypoint(StationID destination);
void MakeLoading(bool ordered); void MakeLoading(bool ordered);
void MakeLeaveStation(); void MakeLeaveStation();
@ -263,14 +263,14 @@ public:
* @pre IsType(OT_GOTO_DEPOT) || IsType(OT_GOTO_STATION) * @pre IsType(OT_GOTO_DEPOT) || IsType(OT_GOTO_STATION)
* @return true if a refit should happen. * @return true if a refit should happen.
*/ */
inline bool IsRefit() const { return this->refit_cargo < NUM_CARGO || this->refit_cargo == CT_AUTO_REFIT; } inline bool IsRefit() const { return this->refit_cargo < NUM_CARGO || this->refit_cargo == CARGO_AUTO_REFIT; }
/** /**
* Is this order a auto-refit order. * Is this order a auto-refit order.
* @pre IsType(OT_GOTO_DEPOT) || IsType(OT_GOTO_STATION) * @pre IsType(OT_GOTO_DEPOT) || IsType(OT_GOTO_STATION)
* @return true if a auto-refit should happen. * @return true if a auto-refit should happen.
*/ */
inline bool IsAutoRefit() const { return this->refit_cargo == CT_AUTO_REFIT; } inline bool IsAutoRefit() const { return this->refit_cargo == CARGO_AUTO_REFIT; }
/** /**
* Get the cargo to to refit to. * Get the cargo to to refit to.

@ -340,7 +340,7 @@ Order::Order(uint64_t packed)
this->dest = GB(packed, 24, 16); this->dest = GB(packed, 24, 16);
this->extra = nullptr; this->extra = nullptr;
this->next = nullptr; this->next = nullptr;
this->refit_cargo = CT_NO_REFIT; this->refit_cargo = CARGO_NO_REFIT;
this->occupancy = 0; this->occupancy = 0;
this->wait_time = 0; this->wait_time = 0;
this->travel_time = 0; this->travel_time = 0;
@ -1804,7 +1804,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32_t p1, uin
VehicleID veh = GB(p1, 0, 20); VehicleID veh = GB(p1, 0, 20);
ModifyOrderFlags mof = Extract<ModifyOrderFlags, 0, 8>(p2); ModifyOrderFlags mof = Extract<ModifyOrderFlags, 0, 8>(p2);
uint16_t data = GB(p2, 8, 16); uint16_t data = GB(p2, 8, 16);
CargoID cargo_id = (mof == MOF_CARGO_TYPE_UNLOAD || mof == MOF_CARGO_TYPE_LOAD) ? (CargoID) GB(p2, 24, 8) : (CargoID) CT_INVALID; CargoID cargo_id = (mof == MOF_CARGO_TYPE_UNLOAD || mof == MOF_CARGO_TYPE_LOAD) ? (CargoID) GB(p2, 24, 8) : (CargoID) INVALID_CARGO;
if (mof >= MOF_END) return CMD_ERROR; if (mof >= MOF_END) return CMD_ERROR;
@ -1878,7 +1878,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32_t p1, uin
break; break;
case MOF_CARGO_TYPE_UNLOAD: case MOF_CARGO_TYPE_UNLOAD:
if (cargo_id >= NUM_CARGO && cargo_id != CT_INVALID) return CMD_ERROR; if (cargo_id >= NUM_CARGO && cargo_id != INVALID_CARGO) return CMD_ERROR;
if (data == OUFB_CARGO_TYPE_UNLOAD) return CMD_ERROR; if (data == OUFB_CARGO_TYPE_UNLOAD) return CMD_ERROR;
/* FALL THROUGH */ /* FALL THROUGH */
case MOF_UNLOAD: case MOF_UNLOAD:
@ -1892,7 +1892,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32_t p1, uin
break; break;
case MOF_CARGO_TYPE_LOAD: case MOF_CARGO_TYPE_LOAD:
if (cargo_id >= NUM_CARGO && cargo_id != CT_INVALID) return CMD_ERROR; if (cargo_id >= NUM_CARGO && cargo_id != INVALID_CARGO) return CMD_ERROR;
if (data == OLFB_CARGO_TYPE_LOAD || data == OLF_FULL_LOAD_ANY) return CMD_ERROR; if (data == OLFB_CARGO_TYPE_LOAD || data == OLF_FULL_LOAD_ANY) return CMD_ERROR;
/* FALL THROUGH */ /* FALL THROUGH */
case MOF_LOAD: case MOF_LOAD:
@ -2090,7 +2090,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32_t p1, uin
case MOF_NON_STOP: case MOF_NON_STOP:
order->SetNonStopType((OrderNonStopFlags)data); order->SetNonStopType((OrderNonStopFlags)data);
if (data & ONSF_NO_STOP_AT_DESTINATION_STATION) { if (data & ONSF_NO_STOP_AT_DESTINATION_STATION) {
order->SetRefit(CT_NO_REFIT); order->SetRefit(CARGO_NO_REFIT);
order->SetLoadType(OLF_LOAD_IF_POSSIBLE); order->SetLoadType(OLF_LOAD_IF_POSSIBLE);
order->SetUnloadType(OUF_UNLOAD_IF_POSSIBLE); order->SetUnloadType(OUF_UNLOAD_IF_POSSIBLE);
if (order->IsWaitTimetabled() || order->GetWaitTime() > 0) { if (order->IsWaitTimetabled() || order->GetWaitTime() > 0) {
@ -2111,7 +2111,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32_t p1, uin
break; break;
case MOF_CARGO_TYPE_UNLOAD: case MOF_CARGO_TYPE_UNLOAD:
if (cargo_id == CT_INVALID) { if (cargo_id == INVALID_CARGO) {
for (CargoID i = 0; i < NUM_CARGO; i++) { for (CargoID i = 0; i < NUM_CARGO; i++) {
order->SetUnloadType((OrderUnloadFlags)data, i); order->SetUnloadType((OrderUnloadFlags)data, i);
} }
@ -2122,11 +2122,11 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32_t p1, uin
case MOF_LOAD: case MOF_LOAD:
order->SetLoadType((OrderLoadFlags)data); order->SetLoadType((OrderLoadFlags)data);
if (data & OLFB_NO_LOAD) order->SetRefit(CT_NO_REFIT); if (data & OLFB_NO_LOAD) order->SetRefit(CARGO_NO_REFIT);
break; break;
case MOF_CARGO_TYPE_LOAD: case MOF_CARGO_TYPE_LOAD:
if (cargo_id == CT_INVALID) { if (cargo_id == INVALID_CARGO) {
for (CargoID i = 0; i < NUM_CARGO; i++) { for (CargoID i = 0; i < NUM_CARGO; i++) {
order->SetLoadType((OrderLoadFlags)data, i); order->SetLoadType((OrderLoadFlags)data, i);
} }
@ -2146,19 +2146,19 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32_t p1, uin
case DA_SERVICE: case DA_SERVICE:
order->SetDepotOrderType((OrderDepotTypeFlags)(order->GetDepotOrderType() | ODTFB_SERVICE)); order->SetDepotOrderType((OrderDepotTypeFlags)(order->GetDepotOrderType() | ODTFB_SERVICE));
order->SetDepotActionType((OrderDepotActionFlags)(base_order_action_type)); order->SetDepotActionType((OrderDepotActionFlags)(base_order_action_type));
order->SetRefit(CT_NO_REFIT); order->SetRefit(CARGO_NO_REFIT);
break; break;
case DA_STOP: case DA_STOP:
order->SetDepotOrderType((OrderDepotTypeFlags)(order->GetDepotOrderType() & ~ODTFB_SERVICE)); order->SetDepotOrderType((OrderDepotTypeFlags)(order->GetDepotOrderType() & ~ODTFB_SERVICE));
order->SetDepotActionType((OrderDepotActionFlags)(base_order_action_type | ODATFB_HALT)); order->SetDepotActionType((OrderDepotActionFlags)(base_order_action_type | ODATFB_HALT));
order->SetRefit(CT_NO_REFIT); order->SetRefit(CARGO_NO_REFIT);
break; break;
case DA_SELL: case DA_SELL:
order->SetDepotOrderType((OrderDepotTypeFlags)(order->GetDepotOrderType() & ~ODTFB_SERVICE)); order->SetDepotOrderType((OrderDepotTypeFlags)(order->GetDepotOrderType() & ~ODTFB_SERVICE));
order->SetDepotActionType((OrderDepotActionFlags)(base_order_action_type | ODATFB_HALT | ODATFB_SELL)); order->SetDepotActionType((OrderDepotActionFlags)(base_order_action_type | ODATFB_HALT | ODATFB_SELL));
order->SetRefit(CT_NO_REFIT); order->SetRefit(CARGO_NO_REFIT);
break; break;
default: default:
@ -2374,7 +2374,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32_t p1, uin
} }
switch (mof) { switch (mof) {
case MOF_CARGO_TYPE_UNLOAD: case MOF_CARGO_TYPE_UNLOAD:
if (cargo_id == CT_INVALID) { if (cargo_id == INVALID_CARGO) {
for (CargoID i = 0; i < NUM_CARGO; i++) { for (CargoID i = 0; i < NUM_CARGO; i++) {
u->current_order.SetUnloadType((OrderUnloadFlags)data, i); u->current_order.SetUnloadType((OrderUnloadFlags)data, i);
} }
@ -2384,7 +2384,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32_t p1, uin
break; break;
case MOF_CARGO_TYPE_LOAD: case MOF_CARGO_TYPE_LOAD:
if (cargo_id == CT_INVALID) { if (cargo_id == INVALID_CARGO) {
for (CargoID i = 0; i < NUM_CARGO; i++) { for (CargoID i = 0; i < NUM_CARGO; i++) {
u->current_order.SetLoadType((OrderLoadFlags)data, i); u->current_order.SetLoadType((OrderLoadFlags)data, i);
} }
@ -2717,7 +2717,7 @@ CommandCost CmdOrderRefit(TileIndex tile, DoCommandFlag flags, uint32_t p1, uint
VehicleOrderID order_number = GB(p2, 16, 16); VehicleOrderID order_number = GB(p2, 16, 16);
CargoID cargo = GB(p2, 0, 8); CargoID cargo = GB(p2, 0, 8);
if (cargo >= NUM_CARGO && cargo != CT_NO_REFIT && cargo != CT_AUTO_REFIT) return CMD_ERROR; if (cargo >= NUM_CARGO && cargo != CARGO_NO_REFIT && cargo != CARGO_AUTO_REFIT) return CMD_ERROR;
const Vehicle *v = Vehicle::GetIfValid(veh); const Vehicle *v = Vehicle::GetIfValid(veh);
if (v == nullptr || !v->IsPrimaryVehicle()) return CMD_ERROR; if (v == nullptr || !v->IsPrimaryVehicle()) return CMD_ERROR;
@ -2729,7 +2729,7 @@ CommandCost CmdOrderRefit(TileIndex tile, DoCommandFlag flags, uint32_t p1, uint
if (order == nullptr) return CMD_ERROR; if (order == nullptr) return CMD_ERROR;
/* Automatic refit cargo is only supported for goto station orders. */ /* Automatic refit cargo is only supported for goto station orders. */
if (cargo == CT_AUTO_REFIT && !order->IsType(OT_GOTO_STATION)) return CMD_ERROR; if (cargo == CARGO_AUTO_REFIT && !order->IsType(OT_GOTO_STATION)) return CMD_ERROR;
if (order->GetLoadType() & OLFB_NO_LOAD) return CMD_ERROR; if (order->GetLoadType() & OLFB_NO_LOAD) return CMD_ERROR;
@ -2737,7 +2737,7 @@ CommandCost CmdOrderRefit(TileIndex tile, DoCommandFlag flags, uint32_t p1, uint
order->SetRefit(cargo); order->SetRefit(cargo);
/* Make the depot order an 'always go' order. */ /* Make the depot order an 'always go' order. */
if (cargo != CT_NO_REFIT && order->IsType(OT_GOTO_DEPOT)) { if (cargo != CARGO_NO_REFIT && order->IsType(OT_GOTO_DEPOT)) {
order->SetDepotOrderType((OrderDepotTypeFlags)(order->GetDepotOrderType() & ~ODTFB_SERVICE)); order->SetDepotOrderType((OrderDepotTypeFlags)(order->GetDepotOrderType() & ~ODTFB_SERVICE));
order->SetDepotActionType((OrderDepotActionFlags)(order->GetDepotActionType() & ~(ODATFB_HALT | ODATFB_SELL))); order->SetDepotActionType((OrderDepotActionFlags)(order->GetDepotActionType() & ~(ODATFB_HALT | ODATFB_SELL)));
} }

@ -264,7 +264,7 @@ public:
this->GetWidget<NWidgetCore>(widget)->SetDataTip(this->cargo_type_order_dropdown[this->GetOrderActionTypeForCargo(cargo_id)], STR_CARGO_TYPE_LOAD_ORDERS_DROP_TOOLTIP + this->variant); this->GetWidget<NWidgetCore>(widget)->SetDataTip(this->cargo_type_order_dropdown[this->GetOrderActionTypeForCargo(cargo_id)], STR_CARGO_TYPE_LOAD_ORDERS_DROP_TOOLTIP + this->variant);
this->SetWidgetDirty(widget); this->SetWidgetDirty(widget);
} else if (widget == WID_CTO_SET_TO_ALL_DROPDOWN) { } else if (widget == WID_CTO_SET_TO_ALL_DROPDOWN) {
ModifyOrder(this->vehicle, this->order_id, mof | (action_type << 8) | (CT_INVALID << 24)); ModifyOrder(this->vehicle, this->order_id, mof | (action_type << 8) | (INVALID_CARGO << 24));
for (int i = 0; i < (int)_sorted_standard_cargo_specs.size(); i++) { for (int i = 0; i < (int)_sorted_standard_cargo_specs.size(); i++) {
const CargoSpec *cs = _sorted_cargo_specs[i]; const CargoSpec *cs = _sorted_cargo_specs[i];
@ -1812,10 +1812,10 @@ private:
{ {
if (_ctrl_pressed) { if (_ctrl_pressed) {
/* Cancel refitting */ /* Cancel refitting */
DoCommandP(this->vehicle->tile, this->vehicle->index, (this->OrderGetSel() << 16) | (CT_NO_REFIT << 8) | CT_NO_REFIT, CMD_ORDER_REFIT); DoCommandP(this->vehicle->tile, this->vehicle->index, (this->OrderGetSel() << 16) | (CARGO_NO_REFIT << 8) | CARGO_NO_REFIT, CMD_ORDER_REFIT);
} else { } else {
if (i == 1) { // Auto-refit to available cargo type. if (i == 1) { // Auto-refit to available cargo type.
DoCommandP(this->vehicle->tile, this->vehicle->index, (this->OrderGetSel() << 16) | CT_AUTO_REFIT, CMD_ORDER_REFIT); DoCommandP(this->vehicle->tile, this->vehicle->index, (this->OrderGetSel() << 16) | CARGO_AUTO_REFIT, CMD_ORDER_REFIT);
} else { } else {
ShowVehicleRefitWindow(this->vehicle, this->OrderGetSel(), this, auto_refit); ShowVehicleRefitWindow(this->vehicle, this->OrderGetSel(), this, auto_refit);
} }
@ -3225,7 +3225,7 @@ public:
} }
if (this->query_text_widget == WID_O_ADD_VEH_GROUP) { if (this->query_text_widget == WID_O_ADD_VEH_GROUP) {
DoCommandP(0, VehicleListIdentifier(VL_SINGLE_VEH, this->vehicle->type, this->vehicle->owner, this->vehicle->index).Pack(), CF_ANY, CMD_CREATE_GROUP_FROM_LIST | CMD_MSG(STR_ERROR_GROUP_CAN_T_CREATE), nullptr, str); DoCommandP(0, VehicleListIdentifier(VL_SINGLE_VEH, this->vehicle->type, this->vehicle->owner, this->vehicle->index).Pack(), CargoFilterCriteria::CF_ANY, CMD_CREATE_GROUP_FROM_LIST | CMD_MSG(STR_ERROR_GROUP_CAN_T_CREATE), nullptr, str);
} }
if (this->query_text_widget == WID_O_TEXT_LABEL && str != nullptr) { if (this->query_text_widget == WID_O_TEXT_LABEL && str != nullptr) {

@ -1831,11 +1831,11 @@ bool AfterLoadGame()
/* Setting no refit flags to all orders in savegames from before refit in orders were added */ /* Setting no refit flags to all orders in savegames from before refit in orders were added */
if (IsSavegameVersionBefore(SLV_36)) { if (IsSavegameVersionBefore(SLV_36)) {
for (Order *order : Order::Iterate()) { for (Order *order : Order::Iterate()) {
order->SetRefit(CT_NO_REFIT); order->SetRefit(CARGO_NO_REFIT);
} }
for (Vehicle *v : Vehicle::Iterate()) { for (Vehicle *v : Vehicle::Iterate()) {
v->current_order.SetRefit(CT_NO_REFIT); v->current_order.SetRefit(CARGO_NO_REFIT);
} }
} }
@ -3573,7 +3573,7 @@ bool AfterLoadGame()
/* Make sure added industry cargo slots are cleared */ /* Make sure added industry cargo slots are cleared */
for (Industry *i : Industry::Iterate()) { for (Industry *i : Industry::Iterate()) {
for (size_t ci = 2; ci < lengthof(i->produced_cargo); ci++) { for (size_t ci = 2; ci < lengthof(i->produced_cargo); ci++) {
i->produced_cargo[ci] = CT_INVALID; i->produced_cargo[ci] = INVALID_CARGO;
i->produced_cargo_waiting[ci] = 0; i->produced_cargo_waiting[ci] = 0;
i->production_rate[ci] = 0; i->production_rate[ci] = 0;
i->last_month_production[ci] = 0; i->last_month_production[ci] = 0;
@ -3583,13 +3583,13 @@ bool AfterLoadGame()
i->this_month_transported[ci] = 0; i->this_month_transported[ci] = 0;
} }
for (size_t ci = 3; ci < lengthof(i->accepts_cargo); ci++) { for (size_t ci = 3; ci < lengthof(i->accepts_cargo); ci++) {
i->accepts_cargo[ci] = CT_INVALID; i->accepts_cargo[ci] = INVALID_CARGO;
i->incoming_cargo_waiting[ci] = 0; i->incoming_cargo_waiting[ci] = 0;
} }
/* Make sure last_cargo_accepted_at is copied to elements for every valid input cargo. /* Make sure last_cargo_accepted_at is copied to elements for every valid input cargo.
* The loading routine should put the original singular value into the first array element. */ * The loading routine should put the original singular value into the first array element. */
for (size_t ci = 0; ci < lengthof(i->accepts_cargo); ci++) { for (size_t ci = 0; ci < lengthof(i->accepts_cargo); ci++) {
if (i->accepts_cargo[ci] != CT_INVALID) { if (i->accepts_cargo[ci] != INVALID_CARGO) {
i->last_cargo_accepted_at[ci] = i->last_cargo_accepted_at[0]; i->last_cargo_accepted_at[ci] = i->last_cargo_accepted_at[0];
} else { } else {
i->last_cargo_accepted_at[ci] = 0; i->last_cargo_accepted_at[ci] = 0;

@ -56,9 +56,9 @@ public:
*/ */
enum SpecialCargoID { enum SpecialCargoID {
/* Note: these values represent part of the in-game CargoTypes enum */ /* Note: these values represent part of the in-game CargoTypes enum */
CT_AUTO_REFIT = ::CT_AUTO_REFIT, ///< Automatically choose cargo type when doing auto-refitting. CT_AUTO_REFIT = ::CARGO_AUTO_REFIT, ///< Automatically choose cargo type when doing auto-refitting.
CT_NO_REFIT = ::CT_NO_REFIT, ///< Do not refit cargo of a vehicle. CT_NO_REFIT = ::CARGO_NO_REFIT, ///< Do not refit cargo of a vehicle.
CT_INVALID = ::CT_INVALID, ///< An invalid cargo type. CT_INVALID = ::INVALID_CARGO, ///< An invalid cargo type.
}; };
/** /**

@ -31,7 +31,7 @@ ScriptCargoList_IndustryAccepting::ScriptCargoList_IndustryAccepting(IndustryID
Industry *ind = ::Industry::Get(industry_id); Industry *ind = ::Industry::Get(industry_id);
for (uint i = 0; i < lengthof(ind->accepts_cargo); i++) { for (uint i = 0; i < lengthof(ind->accepts_cargo); i++) {
CargoID cargo_id = ind->accepts_cargo[i]; CargoID cargo_id = ind->accepts_cargo[i];
if (cargo_id != CT_INVALID) { if (cargo_id != INVALID_CARGO) {
this->AddItem(cargo_id); this->AddItem(cargo_id);
} }
} }
@ -44,7 +44,7 @@ ScriptCargoList_IndustryProducing::ScriptCargoList_IndustryProducing(IndustryID
Industry *ind = ::Industry::Get(industry_id); Industry *ind = ::Industry::Get(industry_id);
for (uint i = 0; i < lengthof(ind->produced_cargo); i++) { for (uint i = 0; i < lengthof(ind->produced_cargo); i++) {
CargoID cargo_id = ind->produced_cargo[i]; CargoID cargo_id = ind->produced_cargo[i];
if (cargo_id != CT_INVALID) { if (cargo_id != INVALID_CARGO) {
this->AddItem(cargo_id); this->AddItem(cargo_id);
} }
} }

@ -50,12 +50,12 @@
/* static */ CargoID ScriptEngine::GetCargoType(EngineID engine_id) /* static */ CargoID ScriptEngine::GetCargoType(EngineID engine_id)
{ {
if (!IsValidEngine(engine_id)) return CT_INVALID; if (!IsValidEngine(engine_id)) return INVALID_CARGO;
CargoArray cap = ::GetCapacityOfArticulatedParts(engine_id); CargoArray cap = ::GetCapacityOfArticulatedParts(engine_id);
auto it = std::max_element(std::cbegin(cap), std::cend(cap)); auto it = std::max_element(std::cbegin(cap), std::cend(cap));
if (*it == 0) return CT_INVALID; if (*it == 0) return INVALID_CARGO;
return CargoID(std::distance(std::cbegin(cap), it)); return CargoID(std::distance(std::cbegin(cap), it));
} }

@ -37,11 +37,11 @@ std::optional<std::string> ScriptEventEnginePreview::GetName()
CargoID ScriptEventEnginePreview::GetCargoType() CargoID ScriptEventEnginePreview::GetCargoType()
{ {
if (!this->IsEngineValid()) return CT_INVALID; if (!this->IsEngineValid()) return INVALID_CARGO;
CargoArray cap = ::GetCapacityOfArticulatedParts(this->engine); CargoArray cap = ::GetCapacityOfArticulatedParts(this->engine);
auto it = std::max_element(std::cbegin(cap), std::cend(cap)); auto it = std::max_element(std::cbegin(cap), std::cend(cap));
if (*it == 0) return CT_INVALID; if (*it == 0) return INVALID_CARGO;
return CargoID(std::distance(std::cbegin(cap), it)); return CargoID(std::distance(std::cbegin(cap), it));
} }

@ -229,7 +229,7 @@
Industry *i = Industry::GetIfValid(industry_id); Industry *i = Industry::GetIfValid(industry_id);
if (i == nullptr) return ScriptDate::DATE_INVALID; if (i == nullptr) return ScriptDate::DATE_INVALID;
if (cargo_type == CT_INVALID) { if (cargo_type == INVALID_CARGO) {
return (ScriptDate::Date)std::accumulate(std::begin(i->last_cargo_accepted_at), std::end(i->last_cargo_accepted_at), Date(0), [](Date a, Date b) { return std::max(a, b); }).base(); return (ScriptDate::Date)std::accumulate(std::begin(i->last_cargo_accepted_at), std::end(i->last_cargo_accepted_at), Date(0), [](Date a, Date b) { return std::max(a, b); }).base();
} else { } else {
int index = i->GetCargoAcceptedIndex(cargo_type); int index = i->GetCargoAcceptedIndex(cargo_type);

@ -258,9 +258,9 @@ public:
/** /**
* Get the last date this industry accepted any cargo delivery. * Get the last date this industry accepted any cargo delivery.
* @param industry_id The index of the industry. * @param industry_id The index of the industry.
* @param cargo_type The cargo to query, or CT_INVALID to query latest of all accepted cargoes. * @param cargo_type The cargo to query, or INVALID_CARGO to query latest of all accepted cargoes.
* @pre IsValidIndustry(industry_id). * @pre IsValidIndustry(industry_id).
* @pre IsValidCargo(cargo_type) || cargo_type == CT_INVALID. * @pre IsValidCargo(cargo_type) || cargo_type == INVALID_CARGO.
* @return Date the industry last received cargo from a delivery, or ScriptDate::DATE_INVALID on error. * @return Date the industry last received cargo from a delivery, or ScriptDate::DATE_INVALID on error.
* @api -ai * @api -ai
*/ */

@ -376,11 +376,11 @@ static int ScriptOrderPositionToRealOrderPosition(VehicleID vehicle_id, ScriptOr
/* static */ CargoID ScriptOrder::GetOrderRefit(VehicleID vehicle_id, OrderPosition order_position) /* static */ CargoID ScriptOrder::GetOrderRefit(VehicleID vehicle_id, OrderPosition order_position)
{ {
if (!IsValidVehicleOrder(vehicle_id, order_position)) return CT_NO_REFIT; if (!IsValidVehicleOrder(vehicle_id, order_position)) return CARGO_NO_REFIT;
if (order_position != ORDER_CURRENT && !IsGotoStationOrder(vehicle_id, order_position) && !IsGotoDepotOrder(vehicle_id, order_position)) return CT_NO_REFIT; if (order_position != ORDER_CURRENT && !IsGotoStationOrder(vehicle_id, order_position) && !IsGotoDepotOrder(vehicle_id, order_position)) return CARGO_NO_REFIT;
const Order *order = ::ResolveOrder(vehicle_id, order_position); const Order *order = ::ResolveOrder(vehicle_id, order_position);
return order->IsRefit() ? order->GetRefitCargo() : (CargoID)CT_NO_REFIT; return order->IsRefit() ? order->GetRefitCargo() : CARGO_NO_REFIT;
} }
/* static */ bool ScriptOrder::SetOrderJumpTo(VehicleID vehicle_id, OrderPosition order_position, OrderPosition jump_to) /* static */ bool ScriptOrder::SetOrderJumpTo(VehicleID vehicle_id, OrderPosition order_position, OrderPosition jump_to)
@ -446,8 +446,8 @@ static int ScriptOrderPositionToRealOrderPosition(VehicleID vehicle_id, ScriptOr
{ {
EnforceCompanyModeValid(false); EnforceCompanyModeValid(false);
EnforcePrecondition(false, IsValidVehicleOrder(vehicle_id, order_position)); EnforcePrecondition(false, IsValidVehicleOrder(vehicle_id, order_position));
EnforcePrecondition(false, IsGotoStationOrder(vehicle_id, order_position) || (IsGotoDepotOrder(vehicle_id, order_position) && refit_cargo != CT_AUTO_REFIT)); EnforcePrecondition(false, IsGotoStationOrder(vehicle_id, order_position) || (IsGotoDepotOrder(vehicle_id, order_position) && refit_cargo != CARGO_AUTO_REFIT));
EnforcePrecondition(false, ScriptCargo::IsValidCargo(refit_cargo) || refit_cargo == CT_AUTO_REFIT || refit_cargo == CT_NO_REFIT); EnforcePrecondition(false, ScriptCargo::IsValidCargo(refit_cargo) || refit_cargo == CARGO_AUTO_REFIT || refit_cargo == CARGO_NO_REFIT);
uint32_t p1 = vehicle_id; uint32_t p1 = vehicle_id;
uint32_t p2 = refit_cargo | ScriptOrderPositionToRealOrderPosition(vehicle_id, ScriptOrder::ResolveOrderPosition(vehicle_id, order_position)) << 16; uint32_t p2 = refit_cargo | ScriptOrderPositionToRealOrderPosition(vehicle_id, ScriptOrder::ResolveOrderPosition(vehicle_id, order_position)) << 16;

@ -66,7 +66,7 @@
/* static */ CargoID ScriptSubsidy::GetCargoType(SubsidyID subsidy_id) /* static */ CargoID ScriptSubsidy::GetCargoType(SubsidyID subsidy_id)
{ {
if (!IsValidSubsidy(subsidy_id)) return CT_INVALID; if (!IsValidSubsidy(subsidy_id)) return INVALID_CARGO;
return ::Subsidy::Get(subsidy_id)->cargo_type; return ::Subsidy::Get(subsidy_id)->cargo_type;
} }

@ -98,7 +98,7 @@ ScriptTileList_IndustryAccepting::ScriptTileList_IndustryAccepting(IndustryID in
{ {
bool cargo_accepts = false; bool cargo_accepts = false;
for (byte j = 0; j < lengthof(i->accepts_cargo); j++) { for (byte j = 0; j < lengthof(i->accepts_cargo); j++) {
if (i->accepts_cargo[j] != CT_INVALID && acceptance[i->accepts_cargo[j]] != 0) cargo_accepts = true; if (i->accepts_cargo[j] != INVALID_CARGO && acceptance[i->accepts_cargo[j]] != 0) cargo_accepts = true;
} }
if (!cargo_accepts) continue; if (!cargo_accepts) continue;
} }

@ -72,7 +72,7 @@
{ {
EnforceCompanyModeValid(VEHICLE_INVALID); EnforceCompanyModeValid(VEHICLE_INVALID);
EnforcePrecondition(VEHICLE_INVALID, ScriptEngine::IsBuildable(engine_id)); EnforcePrecondition(VEHICLE_INVALID, ScriptEngine::IsBuildable(engine_id));
EnforcePrecondition(VEHICLE_INVALID, cargo == CT_INVALID || ScriptCargo::IsValidCargo(cargo)); EnforcePrecondition(VEHICLE_INVALID, cargo == INVALID_CARGO || ScriptCargo::IsValidCargo(cargo));
::VehicleType type = ::Engine::Get(engine_id)->type; ::VehicleType type = ::Engine::Get(engine_id)->type;
@ -86,7 +86,7 @@
/* static */ VehicleID ScriptVehicle::BuildVehicle(TileIndex depot, EngineID engine_id) /* static */ VehicleID ScriptVehicle::BuildVehicle(TileIndex depot, EngineID engine_id)
{ {
return _BuildVehicleInternal(depot, engine_id, CT_INVALID); return _BuildVehicleInternal(depot, engine_id, INVALID_CARGO);
} }
/* static */ VehicleID ScriptVehicle::BuildVehicleWithRefit(TileIndex depot, EngineID engine_id, CargoID cargo) /* static */ VehicleID ScriptVehicle::BuildVehicleWithRefit(TileIndex depot, EngineID engine_id, CargoID cargo)

@ -1440,7 +1440,7 @@ static bool LoadOldSubsidy(LoadgameState *ls, int num)
{ {
Subsidy *s = new (num) Subsidy(); Subsidy *s = new (num) Subsidy();
bool ret = LoadChunk(ls, s, subsidy_chunk); bool ret = LoadChunk(ls, s, subsidy_chunk);
if (s->cargo_type == CT_INVALID) delete s; if (s->cargo_type == INVALID_CARGO) delete s;
return ret; return ret;
} }

@ -169,7 +169,7 @@ static bool CMSAMine(TileIndex tile)
for (uint i = 0; i < lengthof(ind->produced_cargo); i++) { for (uint i = 0; i < lengthof(ind->produced_cargo); i++) {
/* The industry extracts something non-liquid, i.e. no oil or plastic, so it is a mine. /* The industry extracts something non-liquid, i.e. no oil or plastic, so it is a mine.
* Also the production of passengers and mail is ignored. */ * Also the production of passengers and mail is ignored. */
if (ind->produced_cargo[i] != CT_INVALID && if (ind->produced_cargo[i] != INVALID_CARGO &&
(CargoSpec::Get(ind->produced_cargo[i])->classes & (CC_LIQUID | CC_PASSENGERS | CC_MAIL)) == 0) { (CargoSpec::Get(ind->produced_cargo[i])->classes & (CC_LIQUID | CC_PASSENGERS | CC_MAIL)) == 0) {
return true; return true;
} }
@ -639,7 +639,7 @@ CargoArray GetProductionAroundTiles(TileIndex north_tile, int w, int h, int rad)
for (uint j = 0; j < lengthof(i->produced_cargo); j++) { for (uint j = 0; j < lengthof(i->produced_cargo); j++) {
CargoID cargo = i->produced_cargo[j]; CargoID cargo = i->produced_cargo[j];
if (cargo != CT_INVALID) produced[cargo]++; if (cargo != INVALID_CARGO) produced[cargo]++;
} }
} }

@ -1927,7 +1927,7 @@ struct StationViewWindow : public Window {
* @param cargo Current cargo being drawn (if cargo column has been passed). * @param cargo Current cargo being drawn (if cargo column has been passed).
* @return row (in "pos" counting) after the one we have last drawn to. * @return row (in "pos" counting) after the one we have last drawn to.
*/ */
int DrawEntries(CargoDataEntry *entry, const Rect &r, int pos, int maxrows, int column, CargoID cargo = CT_INVALID) int DrawEntries(CargoDataEntry *entry, const Rect &r, int pos, int maxrows, int column, CargoID cargo = INVALID_CARGO)
{ {
if (this->sortings[column] == CargoSortType::AsGrouping) { if (this->sortings[column] == CargoSortType::AsGrouping) {
if (this->groupings[column] != GR_CARGO) { if (this->groupings[column] != GR_CARGO) {

@ -1481,9 +1481,9 @@ static void FormatString(StringBuilder builder, const char *str_arg, StringParam
case SCC_CARGO_LONG: { // {CARGO_LONG} case SCC_CARGO_LONG: { // {CARGO_LONG}
/* First parameter is cargo type, second parameter is cargo count */ /* First parameter is cargo type, second parameter is cargo count */
CargoID cargo = args.GetNextParameter<CargoID>(); CargoID cargo = args.GetNextParameter<CargoID>();
if (cargo != CT_INVALID && cargo >= CargoSpec::GetArraySize()) break; if (cargo != INVALID_CARGO && cargo >= CargoSpec::GetArraySize()) break;
StringID cargo_str = (cargo == CT_INVALID) ? STR_QUANTITY_N_A : CargoSpec::Get(cargo)->quantifier; StringID cargo_str = (cargo == INVALID_CARGO) ? STR_QUANTITY_N_A : CargoSpec::Get(cargo)->quantifier;
auto tmp_args = MakeParameters(args.GetNextParameter<int64_t>()); auto tmp_args = MakeParameters(args.GetNextParameter<int64_t>());
GetStringWithArgs(builder, cargo_str, tmp_args); GetStringWithArgs(builder, cargo_str, tmp_args);
break; break;

@ -392,12 +392,12 @@ bool FindSubsidyIndustryCargoRoute()
int num_cargos = 0; int num_cargos = 0;
uint cargo_index; uint cargo_index;
for (cargo_index = 0; cargo_index < lengthof(src_ind->produced_cargo); cargo_index++) { for (cargo_index = 0; cargo_index < lengthof(src_ind->produced_cargo); cargo_index++) {
if (src_ind->produced_cargo[cargo_index] != CT_INVALID) num_cargos++; if (src_ind->produced_cargo[cargo_index] != INVALID_CARGO) num_cargos++;
} }
if (num_cargos == 0) return false; // industry produces nothing if (num_cargos == 0) return false; // industry produces nothing
int cargo_num = RandomRange(num_cargos) + 1; int cargo_num = RandomRange(num_cargos) + 1;
for (cargo_index = 0; cargo_index < lengthof(src_ind->produced_cargo); cargo_index++) { for (cargo_index = 0; cargo_index < lengthof(src_ind->produced_cargo); cargo_index++) {
if (src_ind->produced_cargo[cargo_index] != CT_INVALID) cargo_num--; if (src_ind->produced_cargo[cargo_index] != INVALID_CARGO) cargo_num--;
if (cargo_num == 0) break; if (cargo_num == 0) break;
} }
assert(cargo_num == 0); // indicates loop didn't break as intended assert(cargo_num == 0); // indicates loop didn't break as intended
@ -409,7 +409,7 @@ bool FindSubsidyIndustryCargoRoute()
* or if the pct transported is already large enough * or if the pct transported is already large enough
* or if the cargo is automatically distributed */ * or if the cargo is automatically distributed */
if (total == 0 || trans > SUBSIDY_MAX_PCT_TRANSPORTED || if (total == 0 || trans > SUBSIDY_MAX_PCT_TRANSPORTED ||
cid == CT_INVALID || cid == INVALID_CARGO ||
_settings_game.linkgraph.GetDistributionType(cid) != DT_MANUAL) { _settings_game.linkgraph.GetDistributionType(cid) != DT_MANUAL) {
return false; return false;
} }

@ -20,7 +20,7 @@ extern SubsidyPool _subsidy_pool;
/** Struct about subsidies, offered and awarded */ /** Struct about subsidies, offered and awarded */
struct Subsidy : SubsidyPool::PoolItem<&_subsidy_pool> { struct Subsidy : SubsidyPool::PoolItem<&_subsidy_pool> {
CargoID cargo_type; ///< Cargo type involved in this subsidy, CT_INVALID for invalid subsidy CargoID cargo_type; ///< Cargo type involved in this subsidy, INVALID_CARGO for invalid subsidy
uint16_t remaining; ///< Remaining months when this subsidy is valid uint16_t remaining; ///< Remaining months when this subsidy is valid
CompanyID awarded; ///< Subsidy is awarded to this company; INVALID_COMPANY if it's not awarded to anyone CompanyID awarded; ///< Subsidy is awarded to this company; INVALID_COMPANY if it's not awarded to anyone
SourceType src_type; ///< Source of subsidised path (SourceType::Industry or SourceType::Town) SourceType src_type; ///< Source of subsidised path (SourceType::Industry or SourceType::Town)

@ -248,7 +248,7 @@ class NIHVehicle : public NIHelper {
seprintf(buffer, lastof(buffer), " V Cache: max speed: %u, cargo age period: %u, vis effect: %u", seprintf(buffer, lastof(buffer), " V Cache: max speed: %u, cargo age period: %u, vis effect: %u",
v->vcache.cached_max_speed, v->vcache.cached_cargo_age_period, v->vcache.cached_vis_effect); v->vcache.cached_max_speed, v->vcache.cached_cargo_age_period, v->vcache.cached_vis_effect);
output.print(buffer); output.print(buffer);
if (v->cargo_type != CT_INVALID) { if (v->cargo_type != INVALID_CARGO) {
seprintf(buffer, lastof(buffer), " V Cargo: type: %u, sub type: %u, cap: %u, transfer: %u, deliver: %u, keep: %u, load: %u", seprintf(buffer, lastof(buffer), " V Cargo: type: %u, sub type: %u, cap: %u, transfer: %u, deliver: %u, keep: %u, load: %u",
v->cargo_type, v->cargo_subtype, v->cargo_cap, v->cargo_type, v->cargo_subtype, v->cargo_cap,
v->cargo.ActionCount(VehicleCargoList::MTA_TRANSFER), v->cargo.ActionCount(VehicleCargoList::MTA_DELIVER), v->cargo.ActionCount(VehicleCargoList::MTA_TRANSFER), v->cargo.ActionCount(VehicleCargoList::MTA_DELIVER),
@ -545,7 +545,7 @@ class NIHVehicle : public NIHelper {
if (root_spritegroup == nullptr) { if (root_spritegroup == nullptr) {
CargoID cargo = v->cargo_type; CargoID cargo = v->cargo_type;
assert(cargo < lengthof(e->grf_prop.spritegroup)); assert(cargo < lengthof(e->grf_prop.spritegroup));
root_spritegroup = e->grf_prop.spritegroup[cargo] != nullptr ? e->grf_prop.spritegroup[cargo] : e->grf_prop.spritegroup[CT_DEFAULT]; root_spritegroup = e->grf_prop.spritegroup[cargo] != nullptr ? e->grf_prop.spritegroup[cargo] : e->grf_prop.spritegroup[SpriteGroupCargo::SG_DEFAULT];
} }
auto iter = e->sprite_group_cb36_properties_used.find(root_spritegroup); auto iter = e->sprite_group_cb36_properties_used.find(root_spritegroup);
if (iter != e->sprite_group_cb36_properties_used.end()) { if (iter != e->sprite_group_cb36_properties_used.end()) {
@ -1196,7 +1196,7 @@ class NIHIndustry : public NIHelper {
} }
output.print(" Produces:"); output.print(" Produces:");
for (uint i = 0; i < lengthof(ind->produced_cargo); i++) { for (uint i = 0; i < lengthof(ind->produced_cargo); i++) {
if (ind->produced_cargo[i] != CT_INVALID) { if (ind->produced_cargo[i] != INVALID_CARGO) {
seprintf(buffer, lastof(buffer), " %s:", GetStringPtr(CargoSpec::Get(ind->produced_cargo[i])->name)); seprintf(buffer, lastof(buffer), " %s:", GetStringPtr(CargoSpec::Get(ind->produced_cargo[i])->name));
output.print(buffer); output.print(buffer);
seprintf(buffer, lastof(buffer), " Waiting: %u, rate: %u", seprintf(buffer, lastof(buffer), " Waiting: %u, rate: %u",
@ -1212,7 +1212,7 @@ class NIHIndustry : public NIHelper {
} }
output.print(" Accepts:"); output.print(" Accepts:");
for (uint i = 0; i < lengthof(ind->accepts_cargo); i++) { for (uint i = 0; i < lengthof(ind->accepts_cargo); i++) {
if (ind->accepts_cargo[i] != CT_INVALID) { if (ind->accepts_cargo[i] != INVALID_CARGO) {
seprintf(buffer, lastof(buffer), " %s: waiting: %u", seprintf(buffer, lastof(buffer), " %s: waiting: %u",
GetStringPtr(CargoSpec::Get(ind->accepts_cargo[i])->name), ind->incoming_cargo_waiting[i]); GetStringPtr(CargoSpec::Get(ind->accepts_cargo[i])->name), ind->incoming_cargo_waiting[i]);
output.print(buffer); output.print(buffer);

@ -1130,7 +1130,7 @@ struct TimetableWindow : GeneralVehicleWindow {
} }
case WID_VT_ADD_VEH_GROUP: { case WID_VT_ADD_VEH_GROUP: {
DoCommandP(0, VehicleListIdentifier(VL_SINGLE_VEH, v->type, v->owner, v->index).Pack(), CF_ANY, CMD_CREATE_GROUP_FROM_LIST | CMD_MSG(STR_ERROR_GROUP_CAN_T_CREATE), nullptr, str); DoCommandP(0, VehicleListIdentifier(VL_SINGLE_VEH, v->type, v->owner, v->index).Pack(), CargoFilterCriteria::CF_ANY, CMD_CREATE_GROUP_FROM_LIST | CMD_MSG(STR_ERROR_GROUP_CAN_T_CREATE), nullptr, str);
break; break;
} }
} }

@ -718,7 +718,7 @@ static void TileLoop_Town(TileIndex tile)
if (callback == CALLBACK_FAILED || callback == CALLBACK_HOUSEPRODCARGO_END) break; if (callback == CALLBACK_FAILED || callback == CALLBACK_HOUSEPRODCARGO_END) break;
CargoID cargo = GetCargoTranslation(GB(callback, 8, 7), hs->grf_prop.grffile); CargoID cargo = GetCargoTranslation(GB(callback, 8, 7), hs->grf_prop.grffile);
if (cargo == CT_INVALID) continue; if (cargo == INVALID_CARGO) continue;
uint amt = GB(callback, 0, 8); uint amt = GB(callback, 0, 8);
if (amt == 0) continue; if (amt == 0) continue;
@ -858,7 +858,7 @@ void AddProducedHouseCargo(HouseID house_id, TileIndex tile, CargoArray &produce
CargoID cargo = GetCargoTranslation(GB(callback, 8, 7), hs->grf_prop.grffile); CargoID cargo = GetCargoTranslation(GB(callback, 8, 7), hs->grf_prop.grffile);
if (cargo == CT_INVALID) continue; if (cargo == INVALID_CARGO) continue;
produced[cargo]++; produced[cargo]++;
} }
} else { } else {
@ -878,7 +878,7 @@ static void AddProducedCargo_Town(TileIndex tile, CargoArray &produced)
static inline void AddAcceptedCargoSetMask(CargoID cargo, uint amount, CargoArray &acceptance, CargoTypes *always_accepted) static inline void AddAcceptedCargoSetMask(CargoID cargo, uint amount, CargoArray &acceptance, CargoTypes *always_accepted)
{ {
if (cargo == CT_INVALID || amount == 0) return; if (cargo == INVALID_CARGO || amount == 0) return;
acceptance[cargo] += amount; acceptance[cargo] += amount;
SetBit(*always_accepted, cargo); SetBit(*always_accepted, cargo);
} }

@ -7110,7 +7110,7 @@ CommandCost CmdBuildVirtualRailVehicle(TileIndex tile, DoCommandFlag flags, uint
/* Validate the cargo type. */ /* Validate the cargo type. */
CargoID cargo = GB(p1, 24, 8); CargoID cargo = GB(p1, 24, 8);
if (cargo >= NUM_CARGO && cargo != CT_INVALID) return CMD_ERROR; if (cargo >= NUM_CARGO && cargo != INVALID_CARGO) return CMD_ERROR;
bool should_execute = (flags & DC_EXEC) != 0; bool should_execute = (flags & DC_EXEC) != 0;
@ -7122,7 +7122,7 @@ CommandCost CmdBuildVirtualRailVehicle(TileIndex tile, DoCommandFlag flags, uint
return_cmd_error(err); return_cmd_error(err);
} }
if (cargo != CT_INVALID) { if (cargo != INVALID_CARGO) {
CargoID default_cargo = Engine::Get(eid)->GetDefaultCargoType(); CargoID default_cargo = Engine::Get(eid)->GetDefaultCargoType();
if (default_cargo != cargo) { if (default_cargo != cargo) {
CommandCost refit_res = CmdRefitVehicle(tile, flags, train->index, cargo, nullptr); CommandCost refit_res = CmdRefitVehicle(tile, flags, train->index, cargo, nullptr);
@ -7210,12 +7210,12 @@ CommandCost CmdTemplateReplaceVehicle(TileIndex tile, DoCommandFlag flags, uint3
const bool need_refit = (diff & TBTRDF_REFIT); const bool need_refit = (diff & TBTRDF_REFIT);
const bool refit_to_template = tv->refit_as_template; const bool refit_to_template = tv->refit_as_template;
CargoID store_refit_ct = CT_INVALID; CargoID store_refit_ct = INVALID_CARGO;
uint16_t store_refit_csubt = 0; uint16_t store_refit_csubt = 0;
// if a train shall keep its old refit, store the refit setting of its first vehicle // if a train shall keep its old refit, store the refit setting of its first vehicle
if (!refit_to_template) { if (!refit_to_template) {
for (Train *getc = incoming; getc != nullptr; getc = getc->GetNextUnit()) { for (Train *getc = incoming; getc != nullptr; getc = getc->GetNextUnit()) {
if (getc->cargo_type != CT_INVALID && getc->cargo_cap > 0) { if (getc->cargo_type != INVALID_CARGO && getc->cargo_cap > 0) {
store_refit_ct = getc->cargo_type; store_refit_ct = getc->cargo_type;
break; break;
} }
@ -7276,7 +7276,7 @@ CommandCost CmdTemplateReplaceVehicle(TileIndex tile, DoCommandFlag flags, uint3
} }
CargoID refit_cargo = refit_to_template ? cur_tmpl->cargo_type : store_refit_ct; CargoID refit_cargo = refit_to_template ? cur_tmpl->cargo_type : store_refit_ct;
uint32_t refit_cmd = (refit_cargo != CT_INVALID) ? (refit_cargo << 24) : 0; uint32_t refit_cmd = (refit_cargo != INVALID_CARGO) ? (refit_cargo << 24) : 0;
buy.AddCost(DoCommand(tile, cur_tmpl->engine_type | (1 << 16) | refit_cmd, 0, flags, CMD_BUILD_VEHICLE)); buy.AddCost(DoCommand(tile, cur_tmpl->engine_type | (1 << 16) | refit_cmd, 0, flags, CMD_BUILD_VEHICLE));
}; };
for (const TemplateVehicle *cur_tmpl = tv; cur_tmpl != nullptr; cur_tmpl = cur_tmpl->GetNextUnit()) { for (const TemplateVehicle *cur_tmpl = tv; cur_tmpl != nullptr; cur_tmpl = cur_tmpl->GetNextUnit()) {

@ -214,7 +214,7 @@ static void TrainDetailsCargoTab(const CargoSummaryItem *item, int left, int rig
SetDParam(3, _settings_game.vehicle.freight_trains); SetDParam(3, _settings_game.vehicle.freight_trains);
str = FreightWagonMult(item->cargo) > 1 ? STR_VEHICLE_DETAILS_CARGO_FROM_MULT : STR_VEHICLE_DETAILS_CARGO_FROM; str = FreightWagonMult(item->cargo) > 1 ? STR_VEHICLE_DETAILS_CARGO_FROM_MULT : STR_VEHICLE_DETAILS_CARGO_FROM;
} else { } else {
str = item->cargo == CT_INVALID ? STR_QUANTITY_N_A : STR_VEHICLE_DETAILS_CARGO_EMPTY; str = item->cargo == INVALID_CARGO ? STR_QUANTITY_N_A : STR_VEHICLE_DETAILS_CARGO_EMPTY;
} }
DrawString(left, right, y, str, TC_LIGHT_BLUE); DrawString(left, right, y, str, TC_LIGHT_BLUE);
@ -306,7 +306,7 @@ static void TrainDetailsInfoTab(const Train *v, int left, int right, int y, byte
static void TrainDetailsCapacityTab(const CargoSummaryItem *item, int left, int right, int y) static void TrainDetailsCapacityTab(const CargoSummaryItem *item, int left, int right, int y)
{ {
StringID str; StringID str;
if (item->cargo != CT_INVALID) { if (item->cargo != INVALID_CARGO) {
SetDParam(0, item->cargo); SetDParam(0, item->cargo);
SetDParam(1, item->capacity); SetDParam(1, item->capacity);
SetDParam(4, item->subtype); SetDParam(4, item->subtype);
@ -332,9 +332,9 @@ static void GetCargoSummaryOfArticulatedVehicle(const Train *v, CargoSummary &su
if (!v->GetEngine()->CanCarryCargo()) continue; if (!v->GetEngine()->CanCarryCargo()) continue;
CargoSummaryItem new_item; CargoSummaryItem new_item;
new_item.cargo = v->cargo_cap > 0 ? v->cargo_type : (CargoID)CT_INVALID; new_item.cargo = v->cargo_cap > 0 ? v->cargo_type : INVALID_CARGO;
new_item.subtype = GetCargoSubtypeText(v); new_item.subtype = GetCargoSubtypeText(v);
if (new_item.cargo == CT_INVALID && new_item.subtype == STR_EMPTY) continue; if (new_item.cargo == INVALID_CARGO && new_item.subtype == STR_EMPTY) continue;
auto item = std::find(std::begin(summary), std::end(summary), new_item); auto item = std::find(std::begin(summary), std::end(summary), new_item);
if (item == std::end(summary)) { if (item == std::end(summary)) {

@ -295,7 +295,7 @@ bool Vehicle::NeedsServicing() const
if (union_mask != 0 && v->type == VEH_SHIP && v->Next() != nullptr) { if (union_mask != 0 && v->type == VEH_SHIP && v->Next() != nullptr) {
CargoTypes cargoes = 0; CargoTypes cargoes = 0;
for (const Vehicle *u = v; u != nullptr; u = u->Next()) { for (const Vehicle *u = v; u != nullptr; u = u->Next()) {
if (u->cargo_type != CT_INVALID && u->GetEngine()->CanCarryCargo()) { if (u->cargo_type != INVALID_CARGO && u->GetEngine()->CanCarryCargo()) {
SetBit(cargoes, u->cargo_type); SetBit(cargoes, u->cargo_type);
} }
} }
@ -319,7 +319,7 @@ bool Vehicle::NeedsServicing() const
/* engine_type is already a mixed cargo type which matches the incoming vehicle by default, no refit required */ /* engine_type is already a mixed cargo type which matches the incoming vehicle by default, no refit required */
} else { } else {
/* Did the old vehicle carry anything? */ /* Did the old vehicle carry anything? */
if (cargo_type != CT_INVALID) { if (cargo_type != INVALID_CARGO) {
/* We can't refit the vehicle to carry the cargo we want */ /* We can't refit the vehicle to carry the cargo we want */
if (!HasBit(available_cargo_types, cargo_type)) continue; if (!HasBit(available_cargo_types, cargo_type)) continue;
} }
@ -2987,7 +2987,7 @@ bool CanBuildVehicleInfrastructure(VehicleType type, byte subtype)
*/ */
LiveryScheme GetEngineLiveryScheme(EngineID engine_type, EngineID parent_engine_type, const Vehicle *v) LiveryScheme GetEngineLiveryScheme(EngineID engine_type, EngineID parent_engine_type, const Vehicle *v)
{ {
CargoID cargo_type = v == nullptr ? (CargoID)CT_INVALID : v->cargo_type; CargoID cargo_type = v == nullptr ? INVALID_CARGO : v->cargo_type;
const Engine *e = Engine::Get(engine_type); const Engine *e = Engine::Get(engine_type);
switch (e->type) { switch (e->type) {
default: NOT_REACHED(); default: NOT_REACHED();
@ -3000,8 +3000,8 @@ LiveryScheme GetEngineLiveryScheme(EngineID engine_type, EngineID parent_engine_
/* Note: Luckily cargo_type is not needed for engines */ /* Note: Luckily cargo_type is not needed for engines */
} }
if (cargo_type == CT_INVALID) cargo_type = e->GetDefaultCargoType(); if (cargo_type == INVALID_CARGO) cargo_type = e->GetDefaultCargoType();
if (cargo_type == CT_INVALID) cargo_type = CT_GOODS; // The vehicle does not carry anything, let's pick some freight cargo if (cargo_type == INVALID_CARGO) cargo_type = CT_GOODS; // The vehicle does not carry anything, let's pick some freight cargo
if (e->u.rail.railveh_type == RAILVEH_WAGON) { if (e->u.rail.railveh_type == RAILVEH_WAGON) {
if (!CargoSpec::Get(cargo_type)->is_freight) { if (!CargoSpec::Get(cargo_type)->is_freight) {
if (parent_engine_type == INVALID_ENGINE) { if (parent_engine_type == INVALID_ENGINE) {
@ -3040,8 +3040,8 @@ LiveryScheme GetEngineLiveryScheme(EngineID engine_type, EngineID parent_engine_
e = Engine::Get(engine_type); e = Engine::Get(engine_type);
cargo_type = v->First()->cargo_type; cargo_type = v->First()->cargo_type;
} }
if (cargo_type == CT_INVALID) cargo_type = e->GetDefaultCargoType(); if (cargo_type == INVALID_CARGO) cargo_type = e->GetDefaultCargoType();
if (cargo_type == CT_INVALID) cargo_type = CT_GOODS; // The vehicle does not carry anything, let's pick some freight cargo if (cargo_type == INVALID_CARGO) cargo_type = CT_GOODS; // The vehicle does not carry anything, let's pick some freight cargo
/* Important: Use Tram Flag of front part. Luckily engine_type refers to the front part here. */ /* Important: Use Tram Flag of front part. Luckily engine_type refers to the front part here. */
if (HasBit(e->info.misc_flags, EF_ROAD_TRAM)) { if (HasBit(e->info.misc_flags, EF_ROAD_TRAM)) {
@ -3053,8 +3053,8 @@ LiveryScheme GetEngineLiveryScheme(EngineID engine_type, EngineID parent_engine_
} }
case VEH_SHIP: case VEH_SHIP:
if (cargo_type == CT_INVALID) cargo_type = e->GetDefaultCargoType(); if (cargo_type == INVALID_CARGO) cargo_type = e->GetDefaultCargoType();
if (cargo_type == CT_INVALID) cargo_type = CT_GOODS; // The vehicle does not carry anything, let's pick some freight cargo if (cargo_type == INVALID_CARGO) cargo_type = CT_GOODS; // The vehicle does not carry anything, let's pick some freight cargo
return IsCargoInClass(cargo_type, CC_PASSENGERS) ? LS_PASSENGER_SHIP : LS_FREIGHT_SHIP; return IsCargoInClass(cargo_type, CC_PASSENGERS) ? LS_PASSENGER_SHIP : LS_FREIGHT_SHIP;
case VEH_AIRCRAFT: case VEH_AIRCRAFT:

@ -111,16 +111,16 @@ CommandCost CmdBuildVehicle(TileIndex tile, DoCommandFlag flags, uint32_t p1, ui
/* Validate the cargo type. */ /* Validate the cargo type. */
CargoID cargo = GB(p1, 24, 8); CargoID cargo = GB(p1, 24, 8);
if (cargo >= NUM_CARGO && cargo != CT_INVALID) return CMD_ERROR; if (cargo >= NUM_CARGO && cargo != INVALID_CARGO) return CMD_ERROR;
const Engine *e = Engine::Get(eid); const Engine *e = Engine::Get(eid);
CommandCost value(EXPENSES_NEW_VEHICLES, e->GetCost()); CommandCost value(EXPENSES_NEW_VEHICLES, e->GetCost());
/* Engines without valid cargo should not be available */ /* Engines without valid cargo should not be available */
CargoID default_cargo = e->GetDefaultCargoType(); CargoID default_cargo = e->GetDefaultCargoType();
if (default_cargo == CT_INVALID) return CMD_ERROR; if (default_cargo == INVALID_CARGO) return CMD_ERROR;
bool refitting = cargo != CT_INVALID && cargo != default_cargo; bool refitting = cargo != INVALID_CARGO && cargo != default_cargo;
/* Check whether the number of vehicles we need to build can be built according to pool space. */ /* Check whether the number of vehicles we need to build can be built according to pool space. */
uint num_vehicles; uint num_vehicles;
@ -1550,7 +1550,7 @@ CommandCost CmdCloneVehicle(TileIndex tile, DoCommandFlag flags, uint32_t p1, ui
DoCommandFlag build_flags = flags; DoCommandFlag build_flags = flags;
if ((flags & DC_EXEC) && !v->IsPrimaryVehicle()) build_flags |= DC_AUTOREPLACE; if ((flags & DC_EXEC) && !v->IsPrimaryVehicle()) build_flags |= DC_AUTOREPLACE;
CommandCost cost = DoCommand(tile, v->engine_type | (1 << 16) | (CT_INVALID << 24), 0, build_flags, GetCmdBuildVeh(v)); CommandCost cost = DoCommand(tile, v->engine_type | (1 << 16) | (INVALID_CARGO << 24), 0, build_flags, GetCmdBuildVeh(v));
if (cost.Failed()) { if (cost.Failed()) {
/* Can't build a part, then sell the stuff we already made; clear up the mess */ /* Can't build a part, then sell the stuff we already made; clear up the mess */
@ -1630,9 +1630,9 @@ CommandCost CmdCloneVehicle(TileIndex tile, DoCommandFlag flags, uint32_t p1, ui
} }
} else { } else {
const Engine *e = v->GetEngine(); const Engine *e = v->GetEngine();
CargoID initial_cargo = (e->CanCarryCargo() ? e->GetDefaultCargoType() : (CargoID)CT_INVALID); CargoID initial_cargo = (e->CanCarryCargo() ? e->GetDefaultCargoType() : INVALID_CARGO);
if (v->cargo_type != initial_cargo && initial_cargo != CT_INVALID) { if (v->cargo_type != initial_cargo && initial_cargo != INVALID_CARGO) {
bool dummy; bool dummy;
total_cost.AddCost(GetRefitCost(nullptr, v->engine_type, v->cargo_type, v->cargo_subtype, &dummy)); total_cost.AddCost(GetRefitCost(nullptr, v->engine_type, v->cargo_type, v->cargo_subtype, &dummy));
} }

@ -286,7 +286,7 @@ void BaseVehicleListWindow::BuildVehicleList()
static bool GroupCargoFilter(const GUIVehicleGroup* group, const CargoID cid) static bool GroupCargoFilter(const GUIVehicleGroup* group, const CargoID cid)
{ {
if (cid == CF_ANY) return true; if (cid == CargoFilterCriteria::CF_ANY) return true;
for (VehicleList::const_iterator v = group->vehicles_begin; v != group->vehicles_end; ++v) { for (VehicleList::const_iterator v = group->vehicles_begin; v != group->vehicles_end; ++v) {
if (VehicleCargoFilter(*v, cid)) return true; if (VehicleCargoFilter(*v, cid)) return true;
} }
@ -306,7 +306,7 @@ void BaseVehicleListWindow::SetCargoFilter(CargoID cid)
if (this->cargo_filter_criteria != cid) { if (this->cargo_filter_criteria != cid) {
this->cargo_filter_criteria = cid; this->cargo_filter_criteria = cid;
/* Deactivate filter if criteria is 'Show All', activate it otherwise. */ /* Deactivate filter if criteria is 'Show All', activate it otherwise. */
this->vehgroups.SetFilterState(this->cargo_filter_criteria != CF_ANY); this->vehgroups.SetFilterState(this->cargo_filter_criteria != CargoFilterCriteria::CF_ANY);
this->vehgroups.SetFilterType(0); this->vehgroups.SetFilterType(0);
this->vehgroups.ForceRebuild(); this->vehgroups.ForceRebuild();
} }
@ -315,9 +315,9 @@ void BaseVehicleListWindow::SetCargoFilter(CargoID cid)
/** Populate the filter list and set the cargo filter criteria. */ /** Populate the filter list and set the cargo filter criteria. */
void BaseVehicleListWindow::SetCargoFilterArray() void BaseVehicleListWindow::SetCargoFilterArray()
{ {
this->cargo_filter_criteria = CF_ANY; this->cargo_filter_criteria = CargoFilterCriteria::CF_ANY;
this->vehgroups.SetFilterFuncs(_filter_funcs); this->vehgroups.SetFilterFuncs(_filter_funcs);
this->vehgroups.SetFilterState(this->cargo_filter_criteria != CF_ANY); this->vehgroups.SetFilterState(this->cargo_filter_criteria != CargoFilterCriteria::CF_ANY);
} }
/** Filter the engine list against the currently selected cargo filter */ /** Filter the engine list against the currently selected cargo filter */
@ -372,9 +372,9 @@ void BaseVehicleListWindow::OnInit()
StringID BaseVehicleListWindow::GetCargoFilterLabel(CargoID cid) const StringID BaseVehicleListWindow::GetCargoFilterLabel(CargoID cid) const
{ {
switch (cid) { switch (cid) {
case CF_ANY: return STR_CARGO_TYPE_FILTER_ALL; case CargoFilterCriteria::CF_ANY: return STR_CARGO_TYPE_FILTER_ALL;
case CF_FREIGHT: return STR_CARGO_TYPE_FILTER_FREIGHT; case CargoFilterCriteria::CF_FREIGHT: return STR_CARGO_TYPE_FILTER_FREIGHT;
case CF_NONE: return STR_CARGO_TYPE_FILTER_NONE; case CargoFilterCriteria::CF_NONE: return STR_CARGO_TYPE_FILTER_NONE;
default: return CargoSpec::Get(cid)->name; default: return CargoSpec::Get(cid)->name;
} }
} }
@ -389,11 +389,11 @@ DropDownList BaseVehicleListWindow::BuildCargoDropDownList(bool full) const
DropDownList list; DropDownList list;
/* Add item for disabling filtering. */ /* Add item for disabling filtering. */
list.push_back(std::make_unique<DropDownListStringItem>(this->GetCargoFilterLabel(CF_ANY), CF_ANY, false)); list.push_back(std::make_unique<DropDownListStringItem>(this->GetCargoFilterLabel(CargoFilterCriteria::CF_ANY), CargoFilterCriteria::CF_ANY, false));
/* Add item for freight (i.e. vehicles with cargo capacity and with no passenger capacity). */ /* Add item for freight (i.e. vehicles with cargo capacity and with no passenger capacity). */
list.push_back(std::make_unique<DropDownListStringItem>(this->GetCargoFilterLabel(CF_FREIGHT), CF_FREIGHT, false)); list.push_back(std::make_unique<DropDownListStringItem>(this->GetCargoFilterLabel(CargoFilterCriteria::CF_FREIGHT), CargoFilterCriteria::CF_FREIGHT, false));
/* Add item for vehicles not carrying anything, e.g. train engines. */ /* Add item for vehicles not carrying anything, e.g. train engines. */
list.push_back(std::make_unique<DropDownListStringItem>(this->GetCargoFilterLabel(CF_NONE), CF_NONE, false)); list.push_back(std::make_unique<DropDownListStringItem>(this->GetCargoFilterLabel(CargoFilterCriteria::CF_NONE), CargoFilterCriteria::CF_NONE, false));
/* Add cargos */ /* Add cargos */
Dimension d = GetLargestCargoIconSize(); Dimension d = GetLargestCargoIconSize();
@ -834,7 +834,7 @@ struct RefitWindow : public Window {
{ {
size_t scroll_row = 0; size_t scroll_row = 0;
size_t rows = 0; size_t rows = 0;
CargoID cargo = this->selected_refit == nullptr ? (CargoID)CT_INVALID : this->selected_refit->cargo; CargoID cargo = this->selected_refit == nullptr ? INVALID_CARGO : this->selected_refit->cargo;
for (const auto &pair : this->refit_list) { for (const auto &pair : this->refit_list) {
if (pair.first == cargo) { if (pair.first == cargo) {

@ -110,16 +110,16 @@ void BuildDepotVehicleList(VehicleType type, TileIndex tile, VehicleList *engine
/** Cargo filter functions */ /** Cargo filter functions */
bool VehicleCargoFilter(const Vehicle *v, const CargoID cid) bool VehicleCargoFilter(const Vehicle *v, const CargoID cid)
{ {
if (cid == CF_ANY) { if (cid == CargoFilterCriteria::CF_ANY) {
return true; return true;
} else if (cid == CF_NONE) { } else if (cid == CargoFilterCriteria::CF_NONE) {
for (const Vehicle *w = v; w != nullptr; w = w->Next()) { for (const Vehicle *w = v; w != nullptr; w = w->Next()) {
if (w->cargo_cap > 0) { if (w->cargo_cap > 0) {
return false; return false;
} }
} }
return true; return true;
} else if (cid == CF_FREIGHT) { } else if (cid == CargoFilterCriteria::CF_FREIGHT) {
bool have_capacity = false; bool have_capacity = false;
for (const Vehicle *w = v; w != nullptr; w = w->Next()) { for (const Vehicle *w = v; w != nullptr; w = w->Next()) {
if (w->cargo_cap) { if (w->cargo_cap) {
@ -152,7 +152,7 @@ bool GenerateVehicleSortList(VehicleList *list, const VehicleListIdentifier &vli
list->clear(); list->clear();
auto add_veh = [&](const Vehicle *v) { auto add_veh = [&](const Vehicle *v) {
if (cid == CF_ANY || VehicleCargoFilter(v, cid)) list->push_back(v); if (cid == CargoFilterCriteria::CF_ANY || VehicleCargoFilter(v, cid)) list->push_back(v);
}; };
auto fill_all_vehicles = [&]() { auto fill_all_vehicles = [&]() {

@ -52,18 +52,11 @@ struct VehicleListIdentifier {
VehicleListIdentifier() : type(), vtype(), company(), index() {} VehicleListIdentifier() : type(), vtype(), company(), index() {}
}; };
/** Special cargo filter criteria */
enum VehicleCargoFilterSpecialType {
CF_ANY = CT_NO_REFIT, ///< Show all vehicles independent of carried cargo (i.e. no filtering)
CF_NONE = CT_INVALID, ///< Show only vehicles which do not carry cargo (e.g. train engines)
CF_FREIGHT = CT_AUTO_REFIT, ///< Show only vehicles which carry any freight (non-passenger) cargo
};
/** A list of vehicles. */ /** A list of vehicles. */
typedef std::vector<const Vehicle *> VehicleList; typedef std::vector<const Vehicle *> VehicleList;
bool VehicleCargoFilter(const Vehicle *v, const CargoID cid); bool VehicleCargoFilter(const Vehicle *v, const CargoID cid);
bool GenerateVehicleSortList(VehicleList *list, const VehicleListIdentifier &identifier, const CargoID cid = CF_ANY); bool GenerateVehicleSortList(VehicleList *list, const VehicleListIdentifier &identifier, const CargoID cid = CargoFilterCriteria::CF_ANY);
void BuildDepotVehicleList(VehicleType type, TileIndex tile, VehicleList *engine_list, VehicleList *wagon_list, bool individual_wagons = false); void BuildDepotVehicleList(VehicleType type, TileIndex tile, VehicleList *engine_list, VehicleList *wagon_list, bool individual_wagons = false);
uint GetUnitNumberDigits(VehicleList &vehicles); uint GetUnitNumberDigits(VehicleList &vehicles);

@ -236,12 +236,12 @@ SpriteID TileZoneCheckUnservedIndustriesEvaluation(TileIndex tile, Owner owner)
return ZONING_INVALID_SPRITE_ID; return ZONING_INVALID_SPRITE_ID;
} else if (st->facilities & (FACIL_BUS_STOP | FACIL_TRUCK_STOP)) { } else if (st->facilities & (FACIL_BUS_STOP | FACIL_TRUCK_STOP)) {
for (uint i = 0; i < lengthof(ind->produced_cargo); i++) { for (uint i = 0; i < lengthof(ind->produced_cargo); i++) {
if (ind->produced_cargo[i] != CT_INVALID && st->facilities & (IsCargoInClass(ind->produced_cargo[i], CC_PASSENGERS) ? FACIL_BUS_STOP : FACIL_TRUCK_STOP)) { if (ind->produced_cargo[i] != INVALID_CARGO && st->facilities & (IsCargoInClass(ind->produced_cargo[i], CC_PASSENGERS) ? FACIL_BUS_STOP : FACIL_TRUCK_STOP)) {
return ZONING_INVALID_SPRITE_ID; return ZONING_INVALID_SPRITE_ID;
} }
} }
for (uint i = 0; i < lengthof(ind->accepts_cargo); i++) { for (uint i = 0; i < lengthof(ind->accepts_cargo); i++) {
if (ind->accepts_cargo[i] != CT_INVALID && st->facilities & (IsCargoInClass(ind->accepts_cargo[i], CC_PASSENGERS) ? FACIL_BUS_STOP : FACIL_TRUCK_STOP)) { if (ind->accepts_cargo[i] != INVALID_CARGO && st->facilities & (IsCargoInClass(ind->accepts_cargo[i], CC_PASSENGERS) ? FACIL_BUS_STOP : FACIL_TRUCK_STOP)) {
return ZONING_INVALID_SPRITE_ID; return ZONING_INVALID_SPRITE_ID;
} }
} }

Loading…
Cancel
Save