2007-02-20 22:09:21 +00:00
/* $Id$ */
2009-08-21 20:21:05 +00:00
/*
* This file is part of OpenTTD .
* OpenTTD is free software ; you can redistribute it and / or modify it under the terms of the GNU General Public License as published by the Free Software Foundation , version 2.
* OpenTTD is distributed in the hope that it will be useful , but WITHOUT ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE .
* See the GNU General Public License for more details . You should have received a copy of the GNU General Public License along with OpenTTD . If not , see < http : //www.gnu.org/licenses/>.
*/
2011-12-15 21:56:00 +00:00
/** @file cargotype.h Types/functions related to cargoes. */
2007-02-23 11:50:43 +00:00
2007-02-20 22:09:21 +00:00
# ifndef CARGOTYPE_H
# define CARGOTYPE_H
2009-09-06 20:36:17 +00:00
# include "economy_type.h"
2007-12-21 22:50:51 +00:00
# include "cargo_type.h"
2007-12-23 10:56:02 +00:00
# include "gfx_type.h"
2008-04-17 11:47:22 +00:00
# include "strings_type.h"
2008-05-07 09:07:19 +00:00
# include "landscape_type.h"
2007-02-20 22:09:21 +00:00
2009-12-05 21:39:28 +00:00
/** Globally unique label of a cargo type. */
2007-02-20 22:09:21 +00:00
typedef uint32 CargoLabel ;
2009-12-05 21:39:28 +00:00
/** Town growth effect when delivering cargo. */
2007-03-15 22:48:46 +00:00
enum TownEffect {
2011-11-23 16:05:19 +00:00
TE_BEGIN = 0 ,
TE_NONE = TE_BEGIN , ///< Cargo has no effect.
TE_PASSENGERS , ///< Cargo behaves passenger-like.
TE_MAIL , ///< Cargo behaves mail-like.
TE_GOODS , ///< Cargo behaves goods/candy-like.
TE_WATER , ///< Cargo behaves water-like.
TE_FOOD , ///< Cargo behaves food/fizzy-drinks-like.
TE_END , ///< End of town effects.
NUM_TE = TE_END , ///< Amount of town effects.
2007-03-15 22:48:46 +00:00
} ;
2009-12-05 21:39:28 +00:00
/** Cargo classes. */
2009-11-05 19:46:17 +00:00
enum CargoClass {
CC_NOAVAILABLE = 0 , ///< No cargo class has been specified
CC_PASSENGERS = 1 < < 0 , ///< Passengers
CC_MAIL = 1 < < 1 , ///< Mail
CC_EXPRESS = 1 < < 2 , ///< Express cargo (Goods, Food, Candy, but also possible for passengers)
CC_ARMOURED = 1 < < 3 , ///< Armoured cargo (Valuables, Gold, Diamonds)
CC_BULK = 1 < < 4 , ///< Bulk cargo (Coal, Grain etc., Ores, Fruit)
CC_PIECE_GOODS = 1 < < 5 , ///< Piece goods (Livestock, Wood, Steel, Paper)
CC_LIQUID = 1 < < 6 , ///< Liquids (Oil, Water, Rubber)
CC_REFRIGERATED = 1 < < 7 , ///< Refrigerated cargo (Food, Fruit)
CC_HAZARDOUS = 1 < < 8 , ///< Hazardous cargo (Nuclear Fuel, Explosives, etc.)
CC_COVERED = 1 < < 9 , ///< Covered/Sheltered Freight (Transporation in Box Vans, Silo Wagons, etc.)
2011-12-19 17:48:04 +00:00
CC_SPECIAL = 1 < < 15 , ///< Special bit used for livery refit tricks instead of normal cargoes.
2009-11-05 19:46:17 +00:00
} ;
2007-02-20 22:09:21 +00:00
2009-12-05 21:39:28 +00:00
static const byte INVALID_CARGO = 0xFF ; ///< Constant representing invalid cargo
2009-06-25 23:49:59 +00:00
2009-12-05 21:39:28 +00:00
/** Specification of a cargo type. */
2007-03-07 12:11:48 +00:00
struct CargoSpec {
2009-12-05 21:39:28 +00:00
uint8 bitnum ; ///< Cargo bit number, is #INVALID_CARGO for a non-used spec.
CargoLabel label ; ///< Unique label of the cargo type.
2007-02-20 22:09:21 +00:00
uint8 legend_colour ;
uint8 rating_colour ;
2009-12-05 21:39:28 +00:00
uint8 weight ; ///< Weight of a single unit of this cargo type in 1/16 ton (62.5 kg).
2012-01-28 12:08:03 +00:00
uint16 multiplier ; ///< Capacity multiplier for vehicles. (8 fractional bits)
2007-02-20 22:09:21 +00:00
uint16 initial_payment ;
uint8 transit_days [ 2 ] ;
2009-12-05 21:39:28 +00:00
bool is_freight ; ///< Cargo type is considered to be freight (affects train freight multiplier).
TownEffect town_effect ; ///< The effect that delivering this cargo type has on towns. Also affects destination of subsidies.
uint16 multipliertowngrowth ; ///< Size of the effect.
uint8 callback_mask ; ///< Bitmask of cargo callbacks that have to be called
2007-02-20 22:09:21 +00:00
2009-12-05 21:39:28 +00:00
StringID name ; ///< Name of this type of cargo.
StringID name_single ; ///< Name of a single entity of this type of cargo.
StringID units_volume ; ///< Name of a single unit of cargo of this type.
StringID quantifier ; ///< Text for multiple units of cargo of this type.
StringID abbrev ; ///< Two letter abbreviation for this cargo type.
2007-02-20 22:09:21 +00:00
2009-12-05 21:39:28 +00:00
SpriteID sprite ; ///< Icon to display this cargo type, may be \c 0xFFF (which means to resolve an action123 chain).
2007-02-20 22:09:21 +00:00
2009-12-05 21:39:28 +00:00
uint16 classes ; ///< Classes of this cargo type. @see CargoClass
const struct GRFFile * grffile ; ///< NewGRF where #group belongs to.
2007-03-23 20:55:45 +00:00
const struct SpriteGroup * group ;
2007-02-23 09:56:20 +00:00
2009-09-06 20:36:17 +00:00
Money current_payment ;
2009-07-16 20:40:06 +00:00
/**
* Determines index of this cargospec
* @ return index ( in the CargoSpec : : array array )
*/
2011-12-20 17:57:56 +00:00
inline CargoID Index ( ) const
2009-07-16 20:40:06 +00:00
{
return this - CargoSpec : : array ;
}
/**
* Tests for validity of this cargospec
* @ return is this cargospec valid ?
* @ note assert ( cs - > IsValid ( ) ) can be triggered when GRF config is modified
*/
2011-12-20 17:57:56 +00:00
inline bool IsValid ( ) const
2009-06-25 23:49:59 +00:00
{
return this - > bitnum ! = INVALID_CARGO ;
}
2009-07-16 19:00:13 +00:00
2009-07-16 20:40:06 +00:00
/**
2009-07-16 21:37:59 +00:00
* Total number of cargospecs , both valid and invalid
* @ return length of CargoSpec : : array
2009-07-16 20:40:06 +00:00
*/
2011-12-20 17:57:56 +00:00
static inline size_t GetArraySize ( )
2009-07-16 20:40:06 +00:00
{
return lengthof ( CargoSpec : : array ) ;
}
2009-07-16 19:00:13 +00:00
/**
* Retrieve cargo details for the given cargo ID
2009-07-16 20:40:06 +00:00
* @ param index ID of cargo
* @ pre index is a valid cargo ID
2009-07-16 19:00:13 +00:00
*/
2011-12-20 17:57:56 +00:00
static inline CargoSpec * Get ( size_t index )
2009-07-16 19:00:13 +00:00
{
2009-07-16 20:40:06 +00:00
assert ( index < lengthof ( CargoSpec : : array ) ) ;
return & CargoSpec : : array [ index ] ;
2009-07-16 19:00:13 +00:00
}
2009-12-05 16:00:58 +00:00
SpriteID GetCargoIcon ( ) const ;
2009-07-16 19:00:13 +00:00
private :
2009-07-16 21:37:59 +00:00
static CargoSpec array [ NUM_CARGO ] ; ///< Array holding all CargoSpecs
2009-07-16 19:00:13 +00:00
friend void SetupCargoForClimate ( LandscapeID l ) ;
2007-03-07 12:11:48 +00:00
} ;
2007-02-20 22:09:21 +00:00
2007-02-22 22:09:51 +00:00
extern uint32 _cargo_mask ;
2007-02-20 22:09:21 +00:00
void SetupCargoForClimate ( LandscapeID l ) ;
2007-02-24 19:36:47 +00:00
CargoID GetCargoIDByLabel ( CargoLabel cl ) ;
2007-04-13 19:32:18 +00:00
CargoID GetCargoIDByBitnum ( uint8 bitnum ) ;
2007-02-22 22:09:51 +00:00
2010-04-01 19:48:28 +00:00
void InitializeSortedCargoSpecs ( ) ;
extern const CargoSpec * _sorted_cargo_specs [ NUM_CARGO ] ;
extern uint8 _sorted_cargo_specs_size ;
2010-04-07 14:17:29 +00:00
extern uint8 _sorted_standard_cargo_specs_size ;
2010-04-01 19:48:28 +00:00
2010-08-01 19:22:34 +00:00
/**
* Does cargo \ a c have cargo class \ a cc ?
2009-12-05 21:39:28 +00:00
* @ param c Cargo type .
* @ param cc Cargo class .
* @ return The type fits in the class .
*/
2009-11-05 19:46:17 +00:00
static inline bool IsCargoInClass ( CargoID c , CargoClass cc )
2007-03-18 22:07:44 +00:00
{
2009-07-16 19:00:13 +00:00
return ( CargoSpec : : Get ( c ) - > classes & cc ) ! = 0 ;
2007-03-18 22:07:44 +00:00
}
2009-07-16 20:40:06 +00:00
# define FOR_ALL_CARGOSPECS_FROM(var, start) for (size_t cargospec_index = start; var = NULL, cargospec_index < CargoSpec::GetArraySize(); cargospec_index++) \
if ( ( var = CargoSpec : : Get ( cargospec_index ) ) - > IsValid ( ) )
# define FOR_ALL_CARGOSPECS(var) FOR_ALL_CARGOSPECS_FROM(var, 0)
2010-05-11 21:01:01 +00:00
# define FOR_EACH_SET_CARGO_ID(var, cargo_bits) FOR_EACH_SET_BIT_EX(CargoID, var, uint, cargo_bits)
2012-12-01 13:12:39 +00:00
/**
* Loop header for iterating over cargoes , sorted by name . This includes phony cargoes like regearing cargoes .
* @ param var Reference getting the cargospec .
* @ see CargoSpec
*/
2010-04-02 12:20:41 +00:00
# define FOR_ALL_SORTED_CARGOSPECS(var) for (uint8 index = 0; var = _sorted_cargo_specs[index], index < _sorted_cargo_specs_size; index++)
2012-12-01 13:12:39 +00:00
/**
* Loop header for iterating over ' real ' cargoes , sorted by name . Phony cargoes like regearing cargoes are skipped .
* @ param var Reference getting the cargospec .
* @ see CargoSpec
*/
2010-04-07 14:17:29 +00:00
# define FOR_ALL_SORTED_STANDARD_CARGOSPECS(var) for (uint8 index = 0; var = _sorted_cargo_specs[index], index < _sorted_standard_cargo_specs_size; index++)
2007-02-20 22:09:21 +00:00
# endif /* CARGOTYPE_H */