(svn r8826) -Codechange: Replace _cargoc's separate arrays with a regular struct array (with accessor) and implement new initialization method using cargo labels.
authorpeter1138
Tue, 20 Feb 2007 22:09:21 +0000
changeset 6417 26acff62d001
parent 6416 be4399248c60
child 6418 a80dba2d8243
(svn r8826) -Codechange: Replace _cargoc's separate arrays with a regular struct array (with accessor) and implement new initialization method using cargo labels.
projects/openttd.vcproj
projects/openttd_vs80.vcproj
source.list
src/build_vehicle_gui.cpp
src/cargotype.cpp
src/cargotype.h
src/economy.cpp
src/graph_gui.cpp
src/gui.h
src/industry_cmd.cpp
src/industry_gui.cpp
src/misc.cpp
src/misc_gui.cpp
src/newgrf.cpp
src/newgrf_engine.cpp
src/order_gui.cpp
src/station_cmd.cpp
src/station_gui.cpp
src/strings.cpp
src/table/cargo_const.h
src/table/landscape_const.h
src/train_cmd.cpp
src/variables.h
src/vehicle_gui.cpp
--- a/projects/openttd.vcproj	Tue Feb 20 17:52:43 2007 +0000
+++ b/projects/openttd.vcproj	Tue Feb 20 22:09:21 2007 +0000
@@ -173,6 +173,9 @@
 				RelativePath=".\..\src\callback_table.cpp">
 			</File>
 			<File
+				RelativePath=".\..\src\cargotype.cpp">
+			</File>
+			<File
 				RelativePath=".\..\src\command.cpp">
 			</File>
 			<File
@@ -399,6 +402,9 @@
 				RelativePath=".\..\src\bmp.h">
 			</File>
 			<File
+				RelativePath=".\..\src\cargotype.h">
+			</File>
+			<File
 				RelativePath=".\..\src\command.h">
 			</File>
 			<File
@@ -849,6 +855,9 @@
 				RelativePath=".\..\src\table\build_industry.h">
 			</File>
 			<File
+				RelativePath=".\..\src\table\cargo_const.h">
+			</File>
+			<File
 				RelativePath=".\..\src\table\clear_land.h">
 			</File>
 			<File
@@ -864,9 +873,6 @@
 				RelativePath=".\..\src\table\industry_land.h">
 			</File>
 			<File
-				RelativePath=".\..\src\table\landscape_const.h">
-			</File>
-			<File
 				RelativePath=".\..\src\table\landscape_sprite.h">
 			</File>
 			<File
--- a/projects/openttd_vs80.vcproj	Tue Feb 20 17:52:43 2007 +0000
+++ b/projects/openttd_vs80.vcproj	Tue Feb 20 22:09:21 2007 +0000
@@ -456,6 +456,9 @@
 				RelativePath=".\..\src\callback_table.cpp">
 			</File>
 			<File
+				RelativePath=".\..\src\cargotype.cpp">
+			</File>
+			<File
 				RelativePath=".\..\src\command.cpp">
 			</File>
 			<File
@@ -682,6 +685,9 @@
 				RelativePath=".\..\src\bmp.h">
 			</File>
 			<File
+				RelativePath=".\..\src\cargotype.h">
+			</File>
+			<File
 				RelativePath=".\..\src\command.h">
 			</File>
 			<File
@@ -1132,6 +1138,9 @@
 				RelativePath=".\..\src\table\build_industry.h">
 			</File>
 			<File
+				RelativePath=".\..\src\table\cargo_const.h">
+			</File>
+			<File
 				RelativePath=".\..\src\table\clear_land.h">
 			</File>
 			<File
@@ -1147,9 +1156,6 @@
 				RelativePath=".\..\src\table\industry_land.h">
 			</File>
 			<File
-				RelativePath=".\..\src\table\landscape_const.h">
-			</File>
-			<File
 				RelativePath=".\..\src\table\landscape_sprite.h">
 			</File>
 			<File
--- a/source.list	Tue Feb 20 17:52:43 2007 +0000
+++ b/source.list	Tue Feb 20 22:09:21 2007 +0000
@@ -3,6 +3,7 @@
 aystar.cpp
 bmp.cpp
 callback_table.cpp
+cargotype.cpp
 command.cpp
 console.cpp
 console_cmds.cpp
@@ -100,6 +101,7 @@
 airport_movement.h
 aystar.h
 bmp.h
+cargotype.h
 command.h
 console.h
 currency.h
@@ -252,12 +254,12 @@
 table/animcursors.h
 table/autorail.h
 table/build_industry.h
+table/cargo_const.h
 table/clear_land.h
 table/elrail_data.h
 table/engines.h
 table/genland.h
 table/industry_land.h
-table/landscape_const.h
 table/landscape_sprite.h
 table/namegen.h
 table/palettes.h
--- a/src/build_vehicle_gui.cpp	Tue Feb 20 17:52:43 2007 +0000
+++ b/src/build_vehicle_gui.cpp	Tue Feb 20 22:09:21 2007 +0000
@@ -24,6 +24,7 @@
 #include "newgrf_engine.h"
 #include "date.h"
 #include "strings.h"
+#include "cargotype.h"
 
 
 enum BuildVehicleWidgets {
@@ -381,7 +382,7 @@
 
 	/* Wagon weight - (including cargo) */
 	SetDParam(0, rvi->weight);
-	SetDParam(1, (_cargoc.weights[rvi->cargo_type] * rvi->capacity >> 4) + rvi->weight);
+	SetDParam(1, (GetCargo(rvi->cargo_type)->weight * rvi->capacity >> 4) + rvi->weight);
 	DrawString(x, y, STR_PURCHASE_INFO_WEIGHT_CWEIGHT, 0);
 	y += 10;
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cargotype.cpp	Tue Feb 20 22:09:21 2007 +0000
@@ -0,0 +1,46 @@
+/* $Id$ */
+
+#include "stdafx.h"
+#include "openttd.h"
+#include "macros.h"
+#include "table/sprites.h"
+#include "table/strings.h"
+#include "newgrf_cargo.h"
+#include "cargotype.h"
+
+#include "table/cargo_const.h"
+
+static CargoSpec _cargo[NUM_CARGO];
+
+static const byte INVALID_CARGO = 0xFF;
+
+
+void SetupCargoForClimate(LandscapeID l)
+{
+	assert(l < lengthof(_default_climate_cargo));
+
+	/* Reset and disable all cargo types */
+	memset(_cargo, 0, sizeof(_cargo));
+	for (CargoID i = 0; i < lengthof(_cargo); i++) _cargo[i].bitnum = INVALID_CARGO;
+
+	for (CargoID i = 0; i < lengthof(_default_climate_cargo[l]); i++) {
+		CargoLabel cl = _default_climate_cargo[l][i];
+
+		/* Loop through each of the default cargo types to see if
+		 * the label matches */
+		for (uint j = 0; j < lengthof(_default_cargo); j++) {
+			if (_default_cargo[j].label == cl) {
+				_cargo[i] = _default_cargo[j];
+				break;
+			}
+		}
+	}
+}
+
+
+const CargoSpec *GetCargo(CargoID c)
+{
+	assert(c < lengthof(_cargo));
+	return &_cargo[c];
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cargotype.h	Tue Feb 20 22:09:21 2007 +0000
@@ -0,0 +1,42 @@
+/* $Id$ */
+
+#ifndef CARGOTYPE_H
+#define CARGOTYPE_H
+
+
+typedef uint32 CargoLabel;
+
+
+typedef struct CargoSpec {
+	uint8 bitnum;
+	CargoLabel label;
+	uint32 grfid;
+	uint8 legend_colour;
+	uint8 rating_colour;
+	uint8 weight;
+	uint16 initial_payment;
+	uint8 transit_days[2];
+
+	bool is_freight;
+	uint8 substitutetowngrowth;
+	uint16 multipliertowngrowth;
+	uint8 callbackflags;
+
+	StringID name;
+	StringID name_plural;
+	StringID units_volume;
+	StringID quantifier;
+	StringID abbrev;
+
+	SpriteID sprite;
+
+	uint16 classes;
+} CargoSpec;
+
+
+/* Set up the default cargo types for the given landscape type */
+void SetupCargoForClimate(LandscapeID l);
+/* Retrieve cargo details for the given cargo ID */
+const CargoSpec *GetCargo(CargoID c);
+
+#endif /* CARGOTYPE_H */
--- a/src/economy.cpp	Tue Feb 20 17:52:43 2007 +0000
+++ b/src/economy.cpp	Tue Feb 20 22:09:21 2007 +0000
@@ -33,6 +33,7 @@
 #include "newgrf_callbacks.h"
 #include "unmovable.h"
 #include "date.h"
+#include "cargotype.h"
 
 // Score info
 const ScoreInfo _score_info[] = {
@@ -807,7 +808,8 @@
 	Pair tp;
 
 	/* if mode is false, use the singular form */
-	SetDParam(0, _cargoc.names_s[s->cargo_type] + (mode ? 0 : 32));
+	const CargoSpec *cs = GetCargo(s->cargo_type);
+	SetDParam(0, mode ? cs->name_plural : cs->name);
 
 	if (s->age < 12) {
 		if (s->cargo_type != CT_PASSENGERS && s->cargo_type != CT_MAIL) {
@@ -1087,6 +1089,7 @@
 int32 GetTransportedGoodsIncome(uint num_pieces, uint dist, byte transit_days, CargoID cargo_type)
 {
 	CargoID cargo = cargo_type;
+	const CargoSpec *cs = GetCargo(cargo_type);
 	byte f;
 
 	/* zero the distance if it's the bank and very short transport. */
@@ -1094,12 +1097,12 @@
 		dist = 0;
 
 	f = 255;
-	if (transit_days > _cargoc.transit_days_1[cargo]) {
-		transit_days -= _cargoc.transit_days_1[cargo];
+	if (transit_days > cs->transit_days[0]) {
+		transit_days -= cs->transit_days[0];
 		f -= transit_days;
 
-		if (transit_days > _cargoc.transit_days_2[cargo]) {
-			transit_days -= _cargoc.transit_days_2[cargo];
+		if (transit_days > cs->transit_days[1]) {
+			transit_days -= cs->transit_days[1];
 
 			if (f < transit_days) {
 				f = 0;
--- a/src/graph_gui.cpp	Tue Feb 20 17:52:43 2007 +0000
+++ b/src/graph_gui.cpp	Tue Feb 20 22:09:21 2007 +0000
@@ -13,8 +13,7 @@
 #include "variables.h"
 #include "date.h"
 #include "helpers.hpp"
-
-const byte _cargo_colours[NUM_CARGO] = {152, 32, 15, 174, 208, 194, 191, 84, 184, 10, 202, 48};
+#include "cargotype.h"
 
 /* Bitmasks of player and cargo indices that shouldn't be drawn. */
 static uint _legend_excluded_players;
@@ -749,13 +748,14 @@
 			 * clk_dif will move one pixel down and one pixel to the right
 			 * when the button is clicked */
 			byte clk_dif = IsWindowWidgetLowered(w, i + 3) ? 1 : 0;
+			const CargoSpec *cs = GetCargo(i);
 
 			GfxFillRect(x + clk_dif, y + clk_dif, x + 8 + clk_dif, y + 5 + clk_dif, 0);
-			GfxFillRect(x + 1 + clk_dif, y + 1 + clk_dif, x + 7 + clk_dif, y + 4 + clk_dif, _cargo_colours[i]);
-			SetDParam(0, _cargoc.names_s[i]);
+			GfxFillRect(x + 1 + clk_dif, y + 1 + clk_dif, x + 7 + clk_dif, y + 4 + clk_dif, cs->legend_colour);
+			SetDParam(0, cs->name != 0 ? cs->name : (StringID)STR_EMPTY);
 			DrawString(x + 14 + clk_dif, y + clk_dif, STR_7065, 0);
 			y += 8;
-			gd.colors[i] = _cargo_colours[i];
+			gd.colors[i] = cs->legend_colour;
 			for (j = 0; j != 20; j++) {
 				gd.cost[i][j] = GetTransportedGoodsIncome(10, 20, j * 6 + 6, i);
 			}
--- a/src/gui.h	Tue Feb 20 17:52:43 2007 +0000
+++ b/src/gui.h	Tue Feb 20 22:09:21 2007 +0000
@@ -20,7 +20,6 @@
 void DrawArrowButtons(int x, int y, int ctab, byte state, bool clickable_left, bool clickable_right);
 
 /* graph_gui.c */
-extern const byte _cargo_colours[NUM_CARGO];
 void ShowOperatingProfitGraph(void);
 void ShowIncomeGraph(void);
 void ShowDeliveredCargoGraph(void);
--- a/src/industry_cmd.cpp	Tue Feb 20 17:52:43 2007 +0000
+++ b/src/industry_cmd.cpp	Tue Feb 20 22:09:21 2007 +0000
@@ -26,6 +26,7 @@
 #include "date.h"
 #include "water_map.h"
 #include "tree_map.h"
+#include "cargotype.h"
 
 void ShowIndustryViewWindow(int industry);
 void BuildOilRig(TileIndex tile);
@@ -1624,7 +1625,7 @@
 				mag = abs(percent);
 				if (mag >= 10) {
 					SetDParam(2, mag);
-					SetDParam(0, _cargoc.names_s[i->produced_cargo[j]]);
+					SetDParam(0, GetCargo(i->produced_cargo[j])->name);
 					SetDParam(1, i->index);
 					AddNewsItem(
 						percent >= 0 ? STR_INDUSTRY_PROD_GOUP : STR_INDUSTRY_PROD_GODOWN,
--- a/src/industry_gui.cpp	Tue Feb 20 17:52:43 2007 +0000
+++ b/src/industry_gui.cpp	Tue Feb 20 22:09:21 2007 +0000
@@ -17,6 +17,7 @@
 #include "town.h"
 #include "variables.h"
 #include "helpers.hpp"
+#include "cargotype.h"
 
 const byte _build_industry_types[4][12] = {
 	{  1,  2,  4,  6,  8,  0,  3,  5,  9, 11, 18 },
@@ -303,13 +304,13 @@
 		if (i->accepts_cargo[0] != CT_INVALID) {
 			StringID str;
 
-			SetDParam(0, _cargoc.names_s[i->accepts_cargo[0]]);
+			SetDParam(0, GetCargo(i->accepts_cargo[0])->name);
 			str = STR_4827_REQUIRES;
 			if (i->accepts_cargo[1] != CT_INVALID) {
-				SetDParam(1, _cargoc.names_s[i->accepts_cargo[1]]);
+				SetDParam(1, GetCargo(i->accepts_cargo[1])->name);
 				str = STR_4828_REQUIRES;
 				if (i->accepts_cargo[2] != CT_INVALID) {
-					SetDParam(2, _cargoc.names_s[i->accepts_cargo[2]]);
+					SetDParam(2, GetCargo(i->accepts_cargo[2])->name);
 					str = STR_4829_REQUIRES;
 				}
 			}
--- a/src/misc.cpp	Tue Feb 20 17:52:43 2007 +0000
+++ b/src/misc.cpp	Tue Feb 20 22:09:21 2007 +0000
@@ -16,8 +16,8 @@
 #include "vehicle_gui.h"
 #include "variables.h"
 #include "ai/ai.h"
-#include "table/landscape_const.h"
 #include "date.h"
+#include "cargotype.h"
 
 char _name_array[512][32];
 
@@ -237,28 +237,11 @@
 // Calculate constants that depend on the landscape type.
 void InitializeLandscapeVariables(bool only_constants)
 {
-	const CargoTypesValues *lpd;
-	uint i;
-	StringID str;
-
-	lpd = &_cargo_types_base_values[_opt.landscape];
-
-	for (i = 0; i != NUM_CARGO; i++) {
-		_cargoc.sprites[i] = lpd->sprites[i];
+	if (only_constants) return;
 
-		str = lpd->names[i];
-		_cargoc.names_s[i] = str;
-		_cargoc.names_long[i] = (str += 0x40);
-		_cargoc.names_short[i] = (str += 0x20);
-		_cargoc.weights[i] = lpd->weights[i];
-
-		if (!only_constants) {
-			_cargo_payment_rates[i] = lpd->initial_cargo_payment[i];
-			_cargo_payment_rates_frac[i] = 0;
-		}
-
-		_cargoc.transit_days_1[i] = lpd->transit_days_table_1[i];
-		_cargoc.transit_days_2[i] = lpd->transit_days_table_2[i];
+	for (CargoID i = 0; i != NUM_CARGO; i++) {
+		_cargo_payment_rates[i] = GetCargo(i)->initial_payment;
+		_cargo_payment_rates_frac[i] = 0;
 	}
 }
 
--- a/src/misc_gui.cpp	Tue Feb 20 17:52:43 2007 +0000
+++ b/src/misc_gui.cpp	Tue Feb 20 22:09:21 2007 +0000
@@ -30,6 +30,7 @@
 #include "tgp.h"
 #include "settings.h"
 #include "date.h"
+#include "cargotype.h"
 
 #include "fios.h"
 /* Variables to display file lists */
@@ -153,10 +154,10 @@
 				/* If the accepted value is less than 8, show it in 1/8:ths */
 				if (ac[i] < 8) {
 					SetDParam(0, ac[i]);
-					SetDParam(1, _cargoc.names_s[i]);
+					SetDParam(1, GetCargo(i)->name);
 					p = GetString(p, STR_01D1_8, lastof(_landinfo_data[5]));
 				} else {
-					p = GetString(p, _cargoc.names_s[i], lastof(_landinfo_data[5]));
+					p = GetString(p, GetCargo(i)->name, lastof(_landinfo_data[5]));
 				}
 			}
 		}
@@ -740,7 +741,7 @@
 				*b++ = ',';
 				*b++ = ' ';
 			}
-			b = InlineString(b, _cargoc.names_s[i]);
+			b = InlineString(b, GetCargo(i)->name);
 		}
 	}
 
--- a/src/newgrf.cpp	Tue Feb 20 17:52:43 2007 +0000
+++ b/src/newgrf.cpp	Tue Feb 20 22:09:21 2007 +0000
@@ -31,6 +31,7 @@
 #include "newgrf_sound.h"
 #include "newgrf_spritegroup.h"
 #include "helpers.hpp"
+#include "cargotype.h"
 
 /* TTDPatch extended GRF format codec
  * (c) Petr Baudis 2004 (GPL'd)
@@ -3519,6 +3520,9 @@
 	// Add engine type to engine data. This is needed for the refit precalculation.
 	AddTypeToEngines();
 
+	/* Set up the default cargo types */
+	SetupCargoForClimate(_opt.landscape);
+
 	/* Reset misc GRF features and train list display variables */
 	_misc_grf_features = 0;
 	_traininfo_vehicle_pitch = 0;
--- a/src/newgrf_engine.cpp	Tue Feb 20 17:52:43 2007 +0000
+++ b/src/newgrf_engine.cpp	Tue Feb 20 22:09:21 2007 +0000
@@ -18,43 +18,8 @@
 #include "newgrf_cargo.h"
 #include "date.h"
 #include "helpers.hpp"
-
-
+#include "cargotype.h"
 
-/* Default cargo classes */
-static const uint16 _cargo_classes[NUM_GLOBAL_CID] = {
-	CC_PASSENGERS,
-	CC_BULK,
-	CC_MAIL,
-	CC_LIQUID,
-	CC_PIECE_GOODS,
-	CC_EXPRESS,
-	CC_BULK,
-	CC_PIECE_GOODS,
-	CC_BULK,
-	CC_PIECE_GOODS,
-	CC_ARMOURED,
-	CC_PIECE_GOODS,
-	CC_REFRIGERATED | CC_EXPRESS,
-	CC_REFRIGERATED | CC_EXPRESS,
-	CC_BULK,
-	CC_LIQUID,
-	CC_LIQUID,
-	CC_BULK,
-	CC_PIECE_GOODS,
-	CC_PIECE_GOODS,
-	CC_EXPRESS,
-	CC_BULK,
-	CC_LIQUID,
-	CC_BULK,
-	CC_PIECE_GOODS,
-	CC_LIQUID,
-	CC_PIECE_GOODS,
-	CC_PIECE_GOODS,
-	CC_NOAVAILABLE,
-	CC_NOAVAILABLE,
-	CC_NOAVAILABLE,
-};
 
 int _traininfo_vehicle_pitch = 0;
 int _traininfo_vehicle_width = 29;
@@ -587,7 +552,7 @@
 				if (u->cargo_cap == 0) continue;
 				/* Map from climate to global cargo ID */
 				cargo = _global_cargo_id[_opt.landscape][u->cargo_type];
-				cargo_classes |= _cargo_classes[cargo];
+				cargo_classes |= GetCargo(cargo)->classes;
 				common_cargos[cargo]++;
 				user_def_data |= RailVehInfo(u->engine_type)->user_def_data;
 			}
@@ -644,8 +609,9 @@
 			 * cccc - the cargo class value of the cargo transported by the vehicle.
 			 */
 			CargoID cid = _global_cargo_id[_opt.landscape][v->cargo_type];
+			const CargoSpec *cs = GetCargo(v->cargo_type);
 
-			return (_cargo_classes[cid] << 16) | (_cargoc.weights[v->cargo_type] << 8) | cid;
+			return (cs->classes << 16) | (cs->weight << 8) | cid;
 		}
 
 		case 0x48: return GetVehicleTypeInfo(v->engine_type); /* Vehicle Type Info */
--- a/src/order_gui.cpp	Tue Feb 20 17:52:43 2007 +0000
+++ b/src/order_gui.cpp	Tue Feb 20 22:09:21 2007 +0000
@@ -22,6 +22,7 @@
 #include "train.h"
 #include "water_map.h"
 #include "vehicle_gui.h"
+#include "cargotype.h"
 
 enum OrderWindowWidgets {
 	ORDER_WIDGET_CLOSEBOX = 0,
@@ -180,7 +181,7 @@
 					SetDParam(1, s);
 					if (order->refit_cargo < NUM_CARGO) {
 						SetDParam(3, STR_REFIT_ORDER);
-						SetDParam(4, _cargoc.names_s[order->refit_cargo]);
+						SetDParam(4, GetCargo(order->refit_cargo)->name);
 					} else {
 						SetDParam(3, STR_EMPTY);
 					}
--- a/src/station_cmd.cpp	Tue Feb 20 17:52:43 2007 +0000
+++ b/src/station_cmd.cpp	Tue Feb 20 22:09:21 2007 +0000
@@ -37,6 +37,7 @@
 #include "helpers.hpp"
 #include "misc/autoptr.hpp"
 #include "road.h"
+#include "cargotype.h"
 
 /**
  * Called if a new block is added to the station-pool
@@ -361,7 +362,7 @@
 static void ShowRejectOrAcceptNews(const Station *st, uint num_items, CargoID *cargo, StringID msg)
 {
 	for (uint i = 0; i < num_items; i++) {
-		SetDParam(i + 1, _cargoc.names_s[cargo[i]]);
+		SetDParam(i + 1, GetCargo(cargo[i])->name);
 	}
 
 	SetDParam(0, st->index);
--- a/src/station_gui.cpp	Tue Feb 20 17:52:43 2007 +0000
+++ b/src/station_gui.cpp	Tue Feb 20 22:09:21 2007 +0000
@@ -20,6 +20,7 @@
 #include "vehicle.h"
 #include "table/sprites.h"
 #include "helpers.hpp"
+#include "cargotype.h"
 
 enum StationListWidgets {
 	STATIONLIST_WIDGET_CLOSEBOX = 0,
@@ -57,7 +58,10 @@
  * @param rating ratings data for that particular cargo */
 static void StationsWndShowStationRating(int x, int y, CargoID type, uint amount, byte rating)
 {
-	int colour = _cargo_colours[type];
+	const CargoSpec *cs = GetCargo(type);
+	if (cs->bitnum == 0xFF) return;
+
+	int colour = cs->rating_colour;
 	uint w = (minu(amount, 576) + 5) / 36;
 
 	/* Draw total cargo (limited) on station (fits into 16 pixels) */
@@ -73,7 +77,7 @@
 		}
 	}
 
-	DrawString(x + 1, y, _cargoc.names_short[type], 0x10);
+	DrawString(x + 1, y, cs->abbrev, 0x10);
 
 	/* Draw green/red ratings bar (fits into 14 pixels) */
 	y += 8;
@@ -323,8 +327,11 @@
 			for (i = 0; i < NUM_CARGO; i++) {
 				cg_ofst = IsWindowWidgetLowered(w, i + STATIONLIST_WIDGET_CARGOSTART) ? 2 : 1;
 
-				GfxFillRect(x + cg_ofst, y + cg_ofst, x + cg_ofst + 10 , y + cg_ofst + 7, _cargo_colours[i]);
-				DrawStringCentered(x + 6 + cg_ofst, y + cg_ofst, _cargoc.names_short[i], 0x10);
+				const CargoSpec *cs = GetCargo(i);
+				if (cs->bitnum != 0xFF) {
+					GfxFillRect(x + cg_ofst, y + cg_ofst, x + cg_ofst + 10 , y + cg_ofst + 7, cs->rating_colour);
+					DrawStringCentered(x + 6 + cg_ofst, y + cg_ofst, cs->abbrev, 0x10);
+				}
 				x += 14;
 			}
 
@@ -656,7 +663,7 @@
 			int cur_x = x;
 			num = min(num, 23);
 			do {
-				DrawSprite(_cargoc.sprites[i], PAL_NONE, cur_x, y);
+				DrawSprite(GetCargo(i)->sprite, PAL_NONE, cur_x, y);
 				cur_x += 10;
 			} while (--num);
 		}
@@ -701,7 +708,7 @@
 					*b++ = ',';
 					*b++ = ' ';
 				}
-				b = InlineString(b, _cargoc.names_s[i]);
+				b = InlineString(b, GetCargo(i)->name);
 			}
 		}
 
@@ -716,7 +723,7 @@
 		y = 77;
 		for (i = 0; i != NUM_CARGO; i++) {
 			if (st->goods[i].enroute_from != INVALID_STATION) {
-				SetDParam(0, _cargoc.names_s[i]);
+				SetDParam(0, GetCargo(i)->name);
 				SetDParam(2, st->goods[i].rating * 101 >> 8);
 				SetDParam(1, STR_3035_APPALLING + (st->goods[i].rating >> 5));
 				DrawString(8, y, STR_303D, 0);
--- a/src/strings.cpp	Tue Feb 20 17:52:43 2007 +0000
+++ b/src/strings.cpp	Tue Feb 20 22:09:21 2007 +0000
@@ -17,12 +17,12 @@
 #include "industry.h"
 #include "variables.h"
 #include "newgrf_text.h"
-#include "table/landscape_const.h"
 #include "table/control_codes.h"
 #include "music.h"
 #include "date.h"
 #include "industry.h"
 #include "helpers.hpp"
+#include "cargotype.h"
 
 /* for opendir/readdir/closedir */
 # include "fios.h"
@@ -561,7 +561,7 @@
 				// Short description of cargotypes. Layout:
 				// 8-bit = cargo type
 				// 16-bit = cargo count
-				StringID cargo_str = _cargo_types_base_values[_opt_ptr->landscape].units_volume[GetInt32(&argv)];
+				StringID cargo_str = GetCargo(GetInt32(&argv))->units_volume;
 				switch (cargo_str) {
 					case STR_TONS: {
 						int32 args[1];
@@ -685,7 +685,7 @@
 				//   8bit   - cargo type
 				//   16-bit - cargo count
 				CargoID cargo = GetInt32(&argv);
-				StringID cargo_str = (cargo == CT_INVALID) ? (StringID)STR_8838_N_A : _cargoc.names_long[cargo];
+				StringID cargo_str = (cargo == CT_INVALID) ? (StringID)STR_8838_N_A : GetCargo(cargo)->quantifier;
 				buff = GetStringWithArgs(buff, cargo_str, argv++, last);
 				break;
 			}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/table/cargo_const.h	Tue Feb 20 22:09:21 2007 +0000
@@ -0,0 +1,142 @@
+/* $Id$ */
+
+/* Table of all default cargo types */
+
+#define MK(bt, label, c, e, f, g, h, fr, ks1, ks2, ks3, ks4, ks5, l, m) \
+          {bt, label, 0, c, c, e, f, {g, h}, fr, 0, 0, 0, ks1, ks2, ks3, ks4, ks5, l, m}
+static const CargoSpec _default_cargo[] = {
+	MK(  0, 'PASS', 152,  1, 3185,  0,  24, false,
+		STR_000F_PASSENGERS,     STR_002F_PASSENGER,      STR_PASSENGERS, STR_QUANTITY_PASSENGERS,   STR_ABBREV_PASSENGERS,
+		SPR_CARGO_PASSENGER,     CC_PASSENGERS  ),
+
+	MK(  1, 'COAL',  32, 16, 5916,  7, 255, true,
+		STR_0010_COAL,           STR_0030_COAL,           STR_TONS,       STR_QUANTITY_COAL,         STR_ABBREV_COAL,
+		SPR_CARGO_COAL,          CC_BULK        ),
+
+	MK(  2, 'MAIL',  15,  4, 4550, 20,  90, false,
+		STR_0011_MAIL,           STR_0031_MAIL,           STR_BAGS,       STR_QUANTITY_MAIL,         STR_ABBREV_MAIL,
+		SPR_CARGO_MAIL,          CC_MAIL        ),
+
+	MK(  3, 'OIL_', 174, 16, 4437, 25, 255, true,
+		STR_0012_OIL,            STR_0032_OIL,            STR_LITERS,     STR_QUANTITY_OIL,          STR_ABBREV_OIL,
+		SPR_CARGO_OIL,           CC_LIQUID      ),
+
+	MK(  4, 'LVST', 208,  3, 4322,  4,  18, true,
+		STR_0013_LIVESTOCK,      STR_0033_LIVESTOCK,      STR_ITEMS,      STR_QUANTITY_LIVESTOCK,    STR_ABBREV_LIVESTOCK,
+		SPR_CARGO_LIVESTOCK,     CC_PIECE_GOODS ),
+
+	MK(  5, 'GOOD', 194,  8, 6144,  5,  28, true,
+		STR_0014_GOODS,          STR_0034_GOODS,          STR_CRATES,     STR_QUANTITY_GOODS,        STR_ABBREV_GOODS,
+		SPR_CARGO_GOODS,         CC_EXPRESS     ),
+
+	MK(  6, 'GRAI', 191, 16, 4778,  4,  40, true,
+		STR_0015_GRAIN,          STR_0035_GRAIN,          STR_TONS,       STR_QUANTITY_GRAIN,        STR_ABBREV_GRAIN,
+		SPR_CARGO_GRAIN,         CC_BULK        ),
+
+	MK(  6, 'WHEA', 191, 16, 4778,  4,  40, true,
+		STR_0022_WHEAT,          STR_0042_WHEAT,          STR_TONS,       STR_QUANTITY_WHEAT,        STR_ABBREV_WHEAT,
+		SPR_CARGO_GRAIN,         CC_BULK        ),
+
+	MK(  6, 'MAIZ', 191,  6, 4778,  4,  40, true,
+		STR_001B_MAIZE,          STR_003B_MAIZE,          STR_TONS,       STR_QUANTITY_MAIZE,        STR_ABBREV_MAIZE,
+		SPR_CARGO_GRAIN,         CC_BULK        ),
+
+	MK(  7, 'WOOD',  84, 16, 5005, 15, 255, true,
+		STR_0016_WOOD,           STR_0036_WOOD,           STR_TONS,       STR_QUANTITY_WOOD,         STR_ABBREV_WOOD,
+		SPR_CARGO_WOOD,          CC_PIECE_GOODS ),
+
+	MK(  8, 'IORE', 184, 16, 5120,  9, 255, true,
+		STR_0017_IRON_ORE,       STR_0037_IRON_ORE,       STR_TONS,       STR_QUANTITY_IRON_ORE,     STR_ABBREV_IRON_ORE,
+		SPR_CARGO_IRON_ORE,      CC_BULK        ),
+
+	MK(  9, 'STEL',  10, 16, 5688,  7, 255, true,
+		STR_0018_STEEL,          STR_0038_STEEL,          STR_TONS,       STR_QUANTITY_STEEL,        STR_ABBREV_STEEL,
+		SPR_CARGO_STEEL,         CC_PIECE_GOODS ),
+
+	MK( 10, 'VALU', 202,  2, 7509,  1,  32, true,
+		STR_0019_VALUABLES,      STR_0039_VALUABLES,      STR_BAGS,       STR_QUANTITY_VALUABLES,    STR_ABBREV_VALUABLES,
+		SPR_CARGO_VALUES_GOLD,   CC_ARMOURED    ),
+
+	MK( 10, 'GOLD', 202,  8, 7509, 10,  40, true,
+		STR_0020_GOLD,           STR_0040_GOLD,           STR_BAGS,       STR_QUANTITY_GOLD,         STR_ABBREV_GOLD,
+		SPR_CARGO_VALUES_GOLD,   CC_ARMOURED    ),
+
+	MK( 10, 'DIAM', 202,  2, 7509, 10, 255, true,
+		STR_001D_DIAMONDS,       STR_003D_DIAMOND,        STR_BAGS,       STR_QUANTITY_DIAMONDS,     STR_ABBREV_DIAMONDS,
+		SPR_CARGO_DIAMONDS,      CC_ARMOURED    ),
+
+	MK( 11, 'PAPR',  10, 16, 5688,  7,  60, true,
+		STR_001F_PAPER,          STR_003F_PAPER,          STR_TONS,       STR_QUANTITY_PAPER,        STR_ABBREV_PAPER,
+		SPR_CARGO_PAPER,         CC_PIECE_GOODS ),
+
+	MK( 12, 'FOOD',  48, 16, 5688,  0,  30, true,
+		STR_001E_FOOD,           STR_003E_FOOD,           STR_TONS,       STR_QUANTITY_FOOD,         STR_ABBREV_FOOD,
+		SPR_CARGO_FOOD,          CC_EXPRESS     | CC_REFRIGERATED),
+
+	MK( 13, 'FRUT', 208,  6, 4322,  0,  15, true,
+		STR_001C_FRUIT,          STR_003C_FRUIT,          STR_TONS,       STR_QUANTITY_FRUIT,        STR_ABBREV_FRUIT,
+		SPR_CARGO_FRUIT,         CC_BULK        | CC_REFRIGERATED),
+
+	MK( 14, 'CORE', 184,  6, 5120, 12, 255, true,
+		STR_001A_COPPER_ORE,     STR_003A_COPPER_ORE,     STR_TONS,       STR_QUANTITY_COPPER_ORE,   STR_ABBREV_COPPER_ORE,
+		SPR_CARGO_COPPER_ORE,    CC_BULK        ),
+
+	MK( 15, 'WATR',  10,  6, 5688, 20,  80, true,
+		STR_0021_WATER,          STR_0041_WATER,          STR_LITERS,     STR_QUANTITY_WATER,        STR_ABBREV_WATER,
+		SPR_CARGO_WATERCOLA,     CC_LIQUID      ),
+
+	MK( 16, 'RUBR',  32,  6, 5916,  2,  20, true,
+		STR_0023_RUBBER,         STR_0043_RUBBER,         STR_LITERS,     STR_QUANTITY_RUBBER,       STR_ABBREV_RUBBER,
+		SPR_CARGO_RUBBER,        CC_LIQUID      ),
+
+	MK( 17, 'SUGR',  32, 16, 5916, 20, 255, true,
+		STR_0024_SUGAR,          STR_0044_SUGAR,          STR_TONS,       STR_QUANTITY_SUGAR,        STR_ABBREV_SUGAR,
+		SPR_CARGO_SUGAR,         CC_BULK        ),
+
+	MK( 18, 'TOYS', 174,  2, 4437, 25, 255, true,
+		STR_0025_TOYS,           STR_0045_TOY,            STR_NOTHING,    STR_QUANTITY_TOYS,         STR_ABBREV_TOYS,
+		SPR_CARGO_TOYS,          CC_PIECE_GOODS ),
+
+	MK( 19, 'BATT', 208,  4, 4322,  2,  30, true,
+		STR_002B_BATTERIES,      STR_004B_BATTERY,        STR_NOTHING,    STR_QUANTITY_BATTERIES,    STR_ABBREV_BATTERIES,
+		SPR_CARGO_BATTERIES,     CC_PIECE_GOODS ),
+
+	MK( 20, 'SWET', 194,  5, 6144,  8,  40, true,
+		STR_0026_CANDY,          STR_0046_CANDY,          STR_TONS,       STR_QUANTITY_SWEETS,       STR_ABBREV_SWEETS,
+		SPR_CARGO_CANDY,         CC_EXPRESS     ),
+
+	MK( 21, 'TOFF', 191, 16, 4778, 14,  60, true,
+		STR_002A_TOFFEE,         STR_004A_TOFFEE,         STR_TONS,       STR_QUANTITY_TOFFEE,       STR_ABBREV_TOFFEE,
+		SPR_CARGO_TOFFEE,        CC_BULK        ),
+
+	MK( 22, 'COLA',  84, 16, 5005,  5,  75, true,
+		STR_0027_COLA,           STR_0047_COLA,           STR_LITERS,     STR_QUANTITY_COLA,         STR_ABBREV_COLA,
+		SPR_CARGO_WATERCOLA,     CC_LIQUID      ),
+
+	MK( 23, 'CTCD', 184, 16, 5120, 10,  25, true,
+		STR_0028_COTTON_CANDY,   STR_0048_COTTON_CANDY,   STR_TONS,       STR_QUANTITY_CANDYFLOSS,   STR_ABBREV_CANDYFLOSS,
+		SPR_CARGO_COTTONCANDY,   CC_BULK        ),
+
+	MK( 24, 'BUBL',  10,  1, 5688, 20,  80, true,
+		STR_0029_BUBBLES,        STR_0049_BUBBLE,         STR_NOTHING,    STR_QUANTITY_BUBBLES,      STR_ABBREV_BUBBLES,
+		SPR_CARGO_BUBBLES,       CC_PIECE_GOODS ),
+
+	MK( 25, 'PLST', 202, 16, 7509, 30, 255, true,
+		STR_002C_PLASTIC,        STR_004C_PLASTIC,        STR_LITERS,     STR_QUANTITY_PLASTIC,      STR_ABBREV_PLASTIC,
+		SPR_CARGO_PLASTIC,       CC_LIQUID      ),
+
+	MK( 26, 'FZDR',  48,  2, 5688, 30,  50, true,
+		STR_002D_FIZZY_DRINKS,   STR_004D_FIZZY_DRINK,    STR_NOTHING,    STR_QUANTITY_FIZZY_DRINKS, STR_ABBREV_FIZZY_DRINKS,
+		SPR_CARGO_FIZZYDRINK,    CC_PIECE_GOODS ),
+
+};
+
+
+/* Table of which cargo types are available in each climate, by default */
+static const CargoLabel _default_climate_cargo[NUM_LANDSCAPE][12] = {
+	{ 'PASS', 'COAL', 'MAIL', 'OIL_', 'LVST', 'GOOD', 'GRAI', 'WOOD', 'IORE', 'STEL', 'VALU', 'VOID', },
+	{ 'PASS', 'COAL', 'MAIL', 'OIL_', 'LVST', 'GOOD', 'WHEA', 'WOOD', 'VOID', 'PAPR', 'GOLD', 'FOOD', },
+	{ 'PASS', 'RUBR', 'MAIL', 'OIL_', 'FRUT', 'GOOD', 'MAIZ', 'WOOD', 'CORE', 'WATR', 'DIAM', 'FOOD', },
+	{ 'PASS', 'SUGR', 'MAIL', 'TOYS', 'BATT', 'SWET', 'TOFF', 'COLA', 'CTCD', 'BUBL', 'PLST', 'FZDR', },
+};
+
--- a/src/table/landscape_const.h	Tue Feb 20 17:52:43 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,257 +0,0 @@
-/* $Id$ */
-
-#include "sprites.h"
-
-typedef struct CargoTypesValues {
-	StringID names[NUM_CARGO];
-	StringID units_volume[NUM_CARGO];
-	byte weights[NUM_CARGO];
-	SpriteID sprites[NUM_CARGO];
-
-	uint16 initial_cargo_payment[NUM_CARGO];
-	byte transit_days_table_1[NUM_CARGO];
-	byte transit_days_table_2[NUM_CARGO];
-} CargoTypesValues;
-
-
-static const CargoTypesValues _cargo_types_base_values[4] = {
-	{
-		/* normal names */
-		{
-			STR_000F_PASSENGERS,
-			STR_0010_COAL,
-			STR_0011_MAIL,
-			STR_0012_OIL,
-			STR_0013_LIVESTOCK,
-			STR_0014_GOODS,
-			STR_0015_GRAIN,
-			STR_0016_WOOD,
-			STR_0017_IRON_ORE,
-			STR_0018_STEEL,
-			STR_0019_VALUABLES,
-			STR_000E,
-		},
-
-		{ /* normal units of volume */
-			STR_PASSENGERS,
-			STR_TONS,
-			STR_BAGS,
-			STR_LITERS,
-			STR_ITEMS,
-			STR_CRATES,
-			STR_TONS,
-			STR_TONS,
-			STR_TONS,
-			STR_TONS,
-			STR_BAGS,
-			STR_RES_OTHER
-		},
-
-		/* normal weights */
-		{
-			1, 16, 4, 16, 3, 8, 16, 16, 16, 16, 2, 0,
-		},
-
-		/* normal sprites */
-		{
-			SPR_CARGO_PASSENGER,      SPR_CARGO_COAL,  SPR_CARGO_MAIL, SPR_CARGO_OIL,      SPR_CARGO_LIVESTOCK,
-			SPR_CARGO_GOODS,          SPR_CARGO_GRAIN, SPR_CARGO_WOOD, SPR_CARGO_IRON_ORE, SPR_CARGO_STEEL,
-			SPR_CARGO_VALUES_GOLD,    SPR_ASCII_SPACE
-		},
-
-		/* normal initial cargo payment */
-		{
-			3185, 5916, 4550, 4437, 4322, 6144, 4778, 5005, 5120, 5688, 7509, 5688
-		},
-
-		/* normal transit days table 1 */
-		{
-			0, 7, 20, 25, 4, 5, 4, 15, 9, 7, 1, 0,
-		},
-
-		/* normal transit days table 2 */
-		{
-			24, 255, 90, 255, 18, 28, 40, 255, 255, 255, 32, 30,
-		},
-	},
-
-	{
-		/* hilly names */
-		{
-			STR_000F_PASSENGERS,
-			STR_0010_COAL,
-			STR_0011_MAIL,
-			STR_0012_OIL,
-			STR_0013_LIVESTOCK,
-			STR_0014_GOODS,
-			STR_0022_WHEAT,
-			STR_0016_WOOD,
-			STR_000E,
-			STR_001F_PAPER,
-			STR_0020_GOLD,
-			STR_001E_FOOD,
-		},
-
-		{ /* hilly units of volume */
-			STR_PASSENGERS,
-			STR_TONS,
-			STR_BAGS,
-			STR_LITERS,
-			STR_ITEMS,
-			STR_CRATES,
-			STR_TONS,
-			STR_TONS,
-			STR_RES_OTHER,
-			STR_TONS,
-			STR_BAGS,
-			STR_TONS
-		},
-
-		/* hilly weights */
-		{
-			1, 16, 4, 16, 3, 8, 16, 16, 0, 16, 8, 16
-		},
-
-		/* hilly sprites */
-		{
-			SPR_CARGO_PASSENGER,   SPR_CARGO_COAL,  SPR_CARGO_MAIL, SPR_CARGO_OIL,   SPR_CARGO_LIVESTOCK,
-			SPR_CARGO_GOODS,       SPR_CARGO_GRAIN, SPR_CARGO_WOOD, SPR_ASCII_SPACE, SPR_CARGO_PAPER,
-			SPR_CARGO_VALUES_GOLD, SPR_CARGO_FOOD
-		},
-
-		/* hilly initial cargo payment */
-		{
-			3185, 5916, 4550, 4437, 4322, 6144, 4778, 5005, 5120, 5461, 5802, 5688
-		},
-
-		/* hilly transit days table 1 */
-		{
-			0, 7, 20, 25, 4, 5, 4, 15, 9, 7, 10, 0,
-		},
-
-		/* hilly transit days table 2 */
-		{
-			24, 255, 90, 255, 18, 28, 40, 255, 255, 60, 40, 30
-		},
-	},
-
-	{
-		/* desert names */
-		{
-			STR_000F_PASSENGERS,
-			STR_0023_RUBBER,
-			STR_0011_MAIL,
-			STR_0012_OIL,
-			STR_001C_FRUIT,
-			STR_0014_GOODS,
-			STR_001B_MAIZE,
-			STR_0016_WOOD,
-			STR_001A_COPPER_ORE,
-			STR_0021_WATER,
-			STR_001D_DIAMONDS,
-			STR_001E_FOOD
-		},
-
-		{ /* desert units of volume */
-			STR_PASSENGERS,
-			STR_LITERS,
-			STR_BAGS,
-			STR_LITERS,
-			STR_TONS,
-			STR_CRATES,
-			STR_TONS,
-			STR_TONS,
-			STR_TONS,
-			STR_LITERS,
-			STR_BAGS,
-			STR_TONS
-		},
-
-		/* desert weights */
-		{
-			1, 16, 4, 16, 16, 8, 16, 16, 16, 16, 2, 16,
-		},
-
-		/* desert sprites */
-		{
-			SPR_CARGO_PASSENGER, SPR_CARGO_RUBBER, SPR_CARGO_MAIL, SPR_CARGO_OIL,        SPR_CARGO_FRUIT,
-			SPR_CARGO_GOODS,     SPR_CARGO_GRAIN,  SPR_CARGO_WOOD, SPR_CARGO_COPPER_ORE, SPR_CARGO_WATERCOLA,
-			SPR_CARGO_DIAMONDS,  SPR_CARGO_FOOD
-		},
-
-		/* desert initial cargo payment */
-		{
-			3185, 4437, 4550, 4892, 4209, 6144, 4322, 7964, 4892, 4664, 5802, 5688
-		},
-
-		/* desert transit days table 1 */
-		{
-			0, 2, 20, 25, 0, 5, 4, 15, 12, 20, 10, 0
-		},
-
-		/* desert transit days table 2 */
-		{
-			24, 20, 90, 255, 15, 28, 40, 255, 255, 80, 255, 30
-		},
-	},
-
-	{
-		/* candy names */
-		{
-			STR_000F_PASSENGERS,
-			STR_0024_SUGAR,
-			STR_0011_MAIL,
-			STR_0025_TOYS,
-			STR_002B_BATTERIES,
-			STR_0026_CANDY,
-			STR_002A_TOFFEE,
-			STR_0027_COLA,
-			STR_0028_COTTON_CANDY,
-			STR_0029_BUBBLES,
-			STR_002C_PLASTIC,
-			STR_002D_FIZZY_DRINKS,
-		},
-
-		{ /* candy unitrs of volume */
-			STR_PASSENGERS,
-			STR_TONS,
-			STR_BAGS,
-			STR_NOTHING,
-			STR_NOTHING,
-			STR_TONS,
-			STR_TONS,
-			STR_LITERS,
-			STR_TONS,
-			STR_NOTHING,
-			STR_LITERS,
-			STR_NOTHING
-		},
-
-		/* candy weights */
-		{
-			1, 16, 4, 2, 4, 5, 16, 16, 16, 1, 16, 2
-		},
-
-		/* candy sprites */
-		{
-			SPR_CARGO_PASSENGER, SPR_CARGO_SUGAR,  SPR_CARGO_MAIL,      SPR_CARGO_TOYS,        SPR_CARGO_BATTERIES,
-			SPR_CARGO_CANDY,     SPR_CARGO_TOFFEE, SPR_CARGO_WATERCOLA, SPR_CARGO_COTTONCANDY, SPR_CARGO_BUBBLES,
-			SPR_CARGO_PLASTIC,   SPR_CARGO_FIZZYDRINK
-		},
-
-		/* candy initial cargo payment */
-		{
-			3185, 4437, 4550, 5574, 4322, 6144, 4778, 4892, 5005, 5077, 4664, 6250
-		},
-
-		/* candy transit days table 1 */
-		{
-			0, 20, 20, 25, 2, 8, 14, 5, 10, 20, 30, 30,
-		},
-
-		/* candy transit days table 2 */
-		{
-			24, 255, 90, 255, 30, 40, 60, 75, 25, 80, 255, 50
-		},
-	}
-};
--- a/src/train_cmd.cpp	Tue Feb 20 17:52:43 2007 +0000
+++ b/src/train_cmd.cpp	Tue Feb 20 22:09:21 2007 +0000
@@ -33,6 +33,7 @@
 #include "direction.h"
 #include "yapf/yapf.h"
 #include "date.h"
+#include "cargotype.h"
 
 static bool TrainCheckIfLineEnds(Vehicle *v);
 static void TrainController(Vehicle *v, bool update_image);
@@ -106,7 +107,7 @@
 
 	for (u = v; u != NULL; u = u->next) {
 		const RailVehicleInfo *rvi = RailVehInfo(u->engine_type);
-		uint32 vweight = (_cargoc.weights[u->cargo_type] * u->cargo_count * FreightWagonMult(u->cargo_type)) / 16;
+		uint32 vweight = (GetCargo(u->cargo_type)->weight * u->cargo_count * FreightWagonMult(u->cargo_type)) / 16;
 
 		// Vehicle weight is not added for articulated parts.
 		if (!IsArticulatedPart(u)) {
--- a/src/variables.h	Tue Feb 20 17:52:43 2007 +0000
+++ b/src/variables.h	Tue Feb 20 22:09:21 2007 +0000
@@ -337,19 +337,6 @@
 VARDEF char *_highscore_file;
 VARDEF char *_log_file;
 
-// NOSAVE: These can be recalculated from InitializeLandscapeVariables
-typedef struct {
-	StringID names_s[NUM_CARGO];
-	StringID names_long[NUM_CARGO];
-	StringID names_short[NUM_CARGO];
-	byte weights[NUM_CARGO];
-	SpriteID sprites[NUM_CARGO];
-	byte transit_days_1[NUM_CARGO];
-	byte transit_days_2[NUM_CARGO];
-} CargoConst;
-
-VARDEF CargoConst _cargoc;
-
 
 static inline void SetDParamX(uint32 *s, uint n, uint32 v)
 {
--- a/src/vehicle_gui.cpp	Tue Feb 20 17:52:43 2007 +0000
+++ b/src/vehicle_gui.cpp	Tue Feb 20 22:09:21 2007 +0000
@@ -28,6 +28,7 @@
 #include "roadveh.h"
 #include "depot.h"
 #include "helpers.hpp"
+#include "cargotype.h"
 
 typedef struct Sorting {
 	Listing aircraft;
@@ -304,7 +305,7 @@
 
 		if (i >= pos && i < pos + rows) {
 			/* Draw the cargo name */
-			int last_x = DrawString(2, y, _cargoc.names_s[refit[i].cargo], colour);
+			int last_x = DrawString(2, y, GetCargo(refit[i].cargo)->name, colour);
 
 			/* If the callback succeeded, draw the cargo suffix */
 			if (refit[i].value != CALLBACK_FAILED) {
@@ -521,7 +522,7 @@
 		for (cid = 0; cmask != 0; cmask >>= 1, cid++) {
 			if (!HASBIT(cmask, 0)) continue;
 
-			b = InlineString(b, _cargoc.names_s[_local_cargo_id_ctype[cid]]);
+			b = InlineString(b, GetCargo(_local_cargo_id_ctype[cid])->name);
 			if (cmask > 1) b = strecpy(b, ", ", lastof(_userstring));
 		}
 	}