1 /*
2  * This file is part of OpenTTD.
3  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6  */
7 
8 /** @file cargo_const.h Table of all default cargo types */
9 
10 /** Construction macros for the #CargoSpec StringID entries. */
11 #define MK_STR_CARGO_PLURAL(label_plural) STR_CARGO_PLURAL_ ## label_plural
12 #define MK_STR_CARGO_SINGULAR(label_singular) STR_CARGO_SINGULAR_ ## label_singular
13 #define MK_STR_QUANTITY(label_plural) STR_QUANTITY_ ## label_plural
14 #define MK_STR_ABBREV(label_plural) STR_ABBREV_ ## label_plural
15 /** Construction macros for the #CargoSpec SpriteID entry. */
16 #define MK_SPRITE(label_plural) SPR_CARGO_ ## label_plural
17 
18 /**
19  * Construction macro for a #CargoSpec structure.
20  * The order of arguments matches the order in which they are defined in #CargoSpec.
21  * Some macros are used to automatically expand to the correct StringID consts, this
22  * means that adding/changing a cargo spec requires updating of the following strings:
23  * - STR_CARGO_PLURAL_<str_plural>
24  * - STR_CARGO_SINGULAR_<str_singular>
25  * - STR_QUANTITY_<str_plural>
26  * - STR_ABBREV_<str_plural>
27  * And the following sprite:
28  * - SPR_CARGO_<str_plural>
29  *
30  * @param bt           Cargo bit number, is #INVALID_CARGO for a non-used spec.
31  * @param label        Unique label of the cargo type.
32  * @param colour       CargoSpec->legend_colour and CargoSpec->rating_colour.
33  * @param weight       Weight of a single unit of this cargo type in 1/16 ton (62.5 kg).
34  * @param mult         Capacity multiplier for vehicles. (8 fractional bits).
35  * @param ip           CargoSpec->initial_payment.
36  * @param td1          CargoSpec->transit_days[0].
37  * @param td2          CargoSpec->transit_days[1].
38  * @param freight      Cargo type is considered to be freight (affects train freight multiplier).
39  * @param te           The effect that delivering this cargo type has on towns. Also affects destination of subsidies.
40  * @param str_plural   The name suffix used to populate CargoSpec->name, CargoSpec->quantifier,
41  *                     CargoSpec->abbrev and CargoSpec->sprite. See above for more detailed information.
42  * @param str_singular The name suffix used to populate CargoSpec->name_single. See above for more information.
43  * @param str_volume   Name of a single unit of cargo of this type.
44  * @param classes      Classes of this cargo type. @see CargoClass
45  */
46 #define MK(bt, label, colour, weight, mult, ip, td1, td2, freight, te, str_plural, str_singular, str_volume, classes) \
47 		{bt, label, colour, colour, weight, mult, ip, {td1, td2}, freight, te, 0, 0, \
48 		MK_STR_CARGO_PLURAL(str_plural), MK_STR_CARGO_SINGULAR(str_singular), str_volume, MK_STR_QUANTITY(str_plural), MK_STR_ABBREV(str_plural), \
49 		MK_SPRITE(str_plural), classes, nullptr, nullptr, 0}
50 
51 /** Cargo types available by default. */
52 static const CargoSpec _default_cargo[] = {
53 	MK(   0, 'PASS', 152,  1, 0x400, 3185,  0,  24, false, TE_PASSENGERS,   PASSENGERS,    PASSENGER, STR_PASSENGERS, CC_PASSENGERS),
54 	MK(   1, 'COAL',   6, 16, 0x100, 5916,  7, 255,  true,       TE_NONE,         COAL,         COAL,       STR_TONS, CC_BULK),
55 	MK(   2, 'MAIL',  15,  4, 0x200, 4550, 20,  90, false,       TE_MAIL,         MAIL,         MAIL,       STR_BAGS, CC_MAIL),
56 	/* Oil in temperate and arctic */
57 	MK(   3, 'OIL_', 174, 16, 0x100, 4437, 25, 255,  true,       TE_NONE,          OIL,          OIL,     STR_LITERS, CC_LIQUID),
58 	/* Oil in subtropic */
59 	MK(   3, 'OIL_', 174, 16, 0x100, 4892, 25, 255,  true,       TE_NONE,          OIL,          OIL,     STR_LITERS, CC_LIQUID),
60 	MK(   4, 'LVST', 208,  3, 0x100, 4322,  4,  18,  true,       TE_NONE,    LIVESTOCK,    LIVESTOCK,      STR_ITEMS, CC_PIECE_GOODS),
61 	MK(   5, 'GOOD', 194,  8, 0x200, 6144,  5,  28,  true,      TE_GOODS,        GOODS,        GOODS,     STR_CRATES, CC_EXPRESS),
62 	MK(   6, 'GRAI', 191, 16, 0x100, 4778,  4,  40,  true,       TE_NONE,        GRAIN,        GRAIN,       STR_TONS, CC_BULK),
63 	MK(   6, 'WHEA', 191, 16, 0x100, 4778,  4,  40,  true,       TE_NONE,        WHEAT,        WHEAT,       STR_TONS, CC_BULK),
64 	MK(   6, 'MAIZ', 191, 16, 0x100, 4322,  4,  40,  true,       TE_NONE,        MAIZE,        MAIZE,       STR_TONS, CC_BULK),
65 	/* Wood in temperate and arctic */
66 	MK(   7, 'WOOD',  84, 16, 0x100, 5005, 15, 255,  true,       TE_NONE,         WOOD,         WOOD,       STR_TONS, CC_PIECE_GOODS),
67 	/* Wood in subtropic */
68 	MK(   7, 'WOOD',  84, 16, 0x100, 7964, 15, 255,  true,       TE_NONE,         WOOD,         WOOD,       STR_TONS, CC_PIECE_GOODS),
69 	MK(   8, 'IORE', 184, 16, 0x100, 5120,  9, 255,  true,       TE_NONE,     IRON_ORE,     IRON_ORE,       STR_TONS, CC_BULK),
70 	MK(   9, 'STEL',  10, 16, 0x100, 5688,  7, 255,  true,       TE_NONE,        STEEL,        STEEL,       STR_TONS, CC_PIECE_GOODS),
71 	MK(  10, 'VALU', 202,  2, 0x100, 7509,  1,  32,  true,       TE_NONE,    VALUABLES,    VALUABLES,       STR_BAGS, CC_ARMOURED),
72 	MK(  10, 'GOLD', 202,  8, 0x100, 5802, 10,  40,  true,       TE_NONE,         GOLD,         GOLD,       STR_BAGS, CC_ARMOURED),
73 	MK(  10, 'DIAM', 202,  2, 0x100, 5802, 10, 255,  true,       TE_NONE,     DIAMONDS,      DIAMOND,       STR_BAGS, CC_ARMOURED),
74 	MK(  11, 'PAPR',  10, 16, 0x100, 5461,  7,  60,  true,       TE_NONE,        PAPER,        PAPER,       STR_TONS, CC_PIECE_GOODS),
75 	MK(  12, 'FOOD',  48, 16, 0x100, 5688,  0,  30,  true,       TE_FOOD,         FOOD,         FOOD,       STR_TONS, CC_EXPRESS | CC_REFRIGERATED),
76 	MK(  13, 'FRUT', 208, 16, 0x100, 4209,  0,  15,  true,       TE_NONE,        FRUIT,        FRUIT,       STR_TONS, CC_BULK | CC_REFRIGERATED),
77 	MK(  14, 'CORE', 184, 16, 0x100, 4892, 12, 255,  true,       TE_NONE,   COPPER_ORE,   COPPER_ORE,       STR_TONS, CC_BULK),
78 	MK(  15, 'WATR',  10, 16, 0x100, 4664, 20,  80,  true,      TE_WATER,        WATER,        WATER,     STR_LITERS, CC_LIQUID),
79 	MK(  16, 'RUBR',   6, 16, 0x100, 4437,  2,  20,  true,       TE_NONE,       RUBBER,       RUBBER,     STR_LITERS, CC_LIQUID),
80 	MK(  17, 'SUGR',   6, 16, 0x100, 4437, 20, 255,  true,       TE_NONE,        SUGAR,        SUGAR,       STR_TONS, CC_BULK),
81 	MK(  18, 'TOYS', 174,  2, 0x100, 5574, 25, 255,  true,       TE_NONE,         TOYS,          TOY,      STR_ITEMS, CC_PIECE_GOODS),
82 	MK(  19, 'BATT', 208,  4, 0x100, 4322,  2,  30,  true,       TE_NONE,    BATTERIES,      BATTERY,      STR_ITEMS, CC_PIECE_GOODS),
83 	MK(  20, 'SWET', 194,  5, 0x200, 6144,  8,  40,  true,      TE_GOODS,       SWEETS,       SWEETS,       STR_BAGS, CC_EXPRESS),
84 	MK(  21, 'TOFF', 191, 16, 0x100, 4778, 14,  60,  true,       TE_NONE,       TOFFEE,       TOFFEE,       STR_TONS, CC_BULK),
85 	MK(  22, 'COLA',  84, 16, 0x100, 4892,  5,  75,  true,       TE_NONE,         COLA,         COLA,     STR_LITERS, CC_LIQUID),
86 	MK(  23, 'CTCD', 184, 16, 0x100, 5005, 10,  25,  true,       TE_NONE,   CANDYFLOSS,   CANDYFLOSS,       STR_TONS, CC_BULK),
87 	MK(  24, 'BUBL',  10,  1, 0x100, 5077, 20,  80,  true,       TE_NONE,      BUBBLES,       BUBBLE,      STR_ITEMS, CC_PIECE_GOODS),
88 	MK(  25, 'PLST', 202, 16, 0x100, 4664, 30, 255,  true,       TE_NONE,      PLASTIC,      PLASTIC,     STR_LITERS, CC_LIQUID),
89 	MK(  26, 'FZDR',  48,  2, 0x100, 6250, 30,  50,  true,       TE_FOOD, FIZZY_DRINKS,  FIZZY_DRINK,      STR_ITEMS, CC_PIECE_GOODS),
90 
91 	/* Void slot in temperate */
92 	MK(0xFF,      0,   1,  0, 0x100, 5688,  0,  30,  true,       TE_NONE,      NOTHING,      NOTHING,       STR_TONS, CC_NOAVAILABLE),
93 	/* Void slot in arctic */
94 	MK(0xFF,      0, 184,  0, 0x100, 5120,  9, 255,  true,       TE_NONE,      NOTHING,      NOTHING,       STR_TONS, CC_NOAVAILABLE),
95 };
96 
97 
98 /** Table of cargo types available in each climate, by default */
99 static const CargoLabel _default_climate_cargo[NUM_LANDSCAPE][NUM_ORIGINAL_CARGO] = {
100 	{ 'PASS', 'COAL', 'MAIL', 'OIL_', 'LVST', 'GOOD', 'GRAI', 'WOOD', 'IORE', 'STEL', 'VALU',     33, },
101 	{ 'PASS', 'COAL', 'MAIL', 'OIL_', 'LVST', 'GOOD', 'WHEA', 'WOOD',     34, 'PAPR', 'GOLD', 'FOOD', },
102 	{ 'PASS', 'RUBR', 'MAIL',      4, 'FRUT', 'GOOD', 'MAIZ',     11, 'CORE', 'WATR', 'DIAM', 'FOOD', },
103 	{ 'PASS', 'SUGR', 'MAIL', 'TOYS', 'BATT', 'SWET', 'TOFF', 'COLA', 'CTCD', 'BUBL', 'PLST', 'FZDR', },
104 };
105 
106