diff --git a/src/cargotype.h b/src/cargotype.h --- a/src/cargotype.h +++ b/src/cargotype.h @@ -33,6 +33,20 @@ enum TownAcceptanceEffect : byte { NUM_TAE = TAE_END, ///< Amount of town effects. }; +/** Town effect when producing cargo. */ +enum TownProductionEffect : byte { + TPE_NONE, ///< Town will not produce this cargo type. + TPE_PASSENGERS, ///< Cargo behaves passenger-like for production. + TPE_MAIL, ///< Cargo behaves mail-like for production. + NUM_TPE, + + /** + * Invalid town production effect. Used as a sentinel to indicate if a NewGRF has explicitly set an effect. + * This does not 'exist' after cargo types are finalised. + */ + INVALID_TPE, +}; + /** Cargo classes. */ enum CargoClass { CC_NOAVAILABLE = 0, ///< No cargo class has been specified @@ -65,6 +79,7 @@ struct CargoSpec { bool is_freight; ///< Cargo type is considered to be freight (affects train freight multiplier). TownAcceptanceEffect town_acceptance_effect; ///< The effect that delivering this cargo type has on towns. Also affects destination of subsidies. + TownProductionEffect town_production_effect{INVALID_TPE}; ///< The effect on town cargo production. uint8_t callback_mask; ///< Bitmask of cargo callbacks that have to be called StringID name; ///< Name of this type of cargo. @@ -171,6 +186,9 @@ struct CargoSpec { */ static IterateWrapper Iterate(size_t from = 0) { return IterateWrapper(from); } + /** List of cargo specs for each Town Product Effect. */ + static std::array, NUM_TPE> town_production_cargoes; + private: static CargoSpec array[NUM_CARGO]; ///< Array holding all CargoSpecs