changeset 6148:4b171c8e99ce draft

(svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
author peter1138 <peter1138@openttd.org>
date Sat, 24 Feb 2007 23:36:40 +0000
parents a7aecaae3414
children fd41bc68fae5
files src/cargotype.cpp src/cargotype.h src/newgrf.cpp src/newgrf_cargo.h src/newgrf_engine.cpp src/newgrf_station.cpp src/newgrf_station.h src/vehicle.cpp src/vehicle_gui.cpp
diffstat 9 files changed, 42 insertions(+), 114 deletions(-) [+]
line wrap: on
line diff
--- a/src/cargotype.cpp
+++ b/src/cargotype.cpp
@@ -16,10 +16,7 @@
 
 static const byte INVALID_CARGO = 0xFF;
 
-/* Quick mapping from cargo type 'bitnums' to real cargo IDs */
-static CargoID _cargo_bitnum_map[32];
-
-/* Bitmask of cargo type 'bitnums' availabe */
+/* Bitmask of cargo types available */
 uint32 _cargo_mask;
 
 
@@ -31,7 +28,6 @@
 	memset(_cargo, 0, sizeof(_cargo));
 	for (CargoID i = 0; i < lengthof(_cargo); i++) _cargo[i].bitnum = INVALID_CARGO;
 
-	memset(_cargo_bitnum_map, CT_INVALID, sizeof(_cargo_bitnum_map));
 	_cargo_mask = 0;
 
 	for (CargoID i = 0; i < lengthof(_default_climate_cargo[l]); i++) {
@@ -43,12 +39,8 @@
 			if (_default_cargo[j].label == cl) {
 				_cargo[i] = _default_cargo[j];
 
-				/* Populate the bitnum map and masks */
-				byte bitnum = _cargo[i].bitnum;
-				if (bitnum < lengthof(_cargo_bitnum_map)) {
-					_cargo_bitnum_map[bitnum] = i;
-					SETBIT(_cargo_mask, bitnum);
-				}
+				/* Populate the available cargo mask */
+				SETBIT(_cargo_mask, i);
 				break;
 			}
 		}
@@ -63,14 +55,6 @@
 }
 
 
-CargoID GetCargoIDByBitnum(byte bitnum)
-{
-	assert(bitnum < lengthof(_cargo_bitnum_map));
-	assert(_cargo_bitnum_map[bitnum] != CT_INVALID);
-	return _cargo_bitnum_map[bitnum];
-}
-
-
 bool CargoSpec::IsValid() const
 {
 	return bitnum != INVALID_CARGO;
--- a/src/cargotype.h
+++ b/src/cargotype.h
@@ -45,8 +45,6 @@
 void SetupCargoForClimate(LandscapeID l);
 /* Retrieve cargo details for the given cargo ID */
 const CargoSpec *GetCargo(CargoID c);
-/* Get the cargo ID of a cargo bitnum */
-CargoID GetCargoIDByBitnum(byte bitnum);
 /* Get the cargo ID with the cargo label */
 CargoID GetCargoIDByLabel(CargoLabel cl);
 
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -1895,8 +1895,8 @@
 static CargoID TranslateCargo(uint8 feature, uint8 ctype)
 {
 	/* Special cargo types for purchase list and stations */
-	if (feature == GSF_STATION && ctype == 0xFE) return GC_DEFAULT_NA;
-	if (ctype == 0xFF) return GC_PURCHASE;
+	if (feature == GSF_STATION && ctype == 0xFE) return CT_DEFAULT_NA;
+	if (ctype == 0xFF) return CT_PURCHASE;
 
 	/* Check if the cargo type is out of bounds of the cargo translation table */
 	if (ctype >= (_cur_grffile->cargo_max == 0 ? _default_cargo_max : _cur_grffile->cargo_max)) {
@@ -1917,9 +1917,6 @@
 		return CT_INVALID;
 	}
 
-	/* Remap back to global cargo */
-	ctype = GetCargo(ctype)->bitnum;
-
 	grfmsg(6, "FeatureMapSpriteGroup: 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);
 	return ctype;
 }
@@ -2016,7 +2013,7 @@
 				uint8 stid = buf[3 + i];
 				StationSpec *statspec = _cur_grffile->stations[stid];
 
-				statspec->spritegroup[GC_DEFAULT] = _cur_grffile->spritegroups[groupid];
+				statspec->spritegroup[CT_DEFAULT] = _cur_grffile->spritegroups[groupid];
 				statspec->grfid = _cur_grffile->grfid;
 				statspec->localidx = stid;
 				SetCustomStationSpec(statspec);
@@ -2106,10 +2103,10 @@
 					SetRotorOverrideSprites(engine, _cur_grffile->spritegroups[groupid]);
 				} else {
 					// TODO: No multiple cargo types per vehicle yet. --pasky
-					SetWagonOverrideSprites(engine, GC_DEFAULT, _cur_grffile->spritegroups[groupid], last_engines, last_engines_count);
+					SetWagonOverrideSprites(engine, CT_DEFAULT, _cur_grffile->spritegroups[groupid], last_engines, last_engines_count);
 				}
 			} else {
-				SetCustomEngineSprites(engine, GC_DEFAULT, _cur_grffile->spritegroups[groupid]);
+				SetCustomEngineSprites(engine, CT_DEFAULT, _cur_grffile->spritegroups[groupid]);
 				SetEngineGRF(engine, _cur_grffile);
 				last_engines[i] = engine;
 			}
@@ -3813,8 +3810,8 @@
 			// Build up the list of cargo types from the set cargo classes.
 			for (i = 0; i < NUM_CARGO; i++) {
 				const CargoSpec *cs = GetCargo(i);
-				if (cargo_allowed[engine]    & cs->classes) SETBIT(mask,     cs->bitnum);
-				if (cargo_disallowed[engine] & cs->classes) SETBIT(not_mask, cs->bitnum);
+				if (cargo_allowed[engine]    & cs->classes) SETBIT(mask,     i);
+				if (cargo_disallowed[engine] & cs->classes) SETBIT(not_mask, i);
 			}
 		} else {
 			// Don't apply default refit mask to wagons or engines with no capacity
@@ -3831,7 +3828,7 @@
 					CargoID cargo = GetCargoIDByLabel(cl[i]);
 					if (cargo == CT_INVALID) continue;
 
-					SETBIT(xor_mask, GetCargo(cargo)->bitnum);
+					SETBIT(xor_mask, cargo);
 				}
 			}
 		}
--- a/src/newgrf_cargo.h
+++ b/src/newgrf_cargo.h
@@ -15,41 +15,8 @@
 	CC_REFRIGERATED = 1 << 7,
 };
 
-enum GlobalCargo {
-	GC_PASSENGERS   =   0,
-	GC_COAL         =   1,
-	GC_MAIL         =   2,
-	GC_OIL          =   3,
-	GC_LIVESTOCK    =   4,
-	GC_GOODS        =   5,
-	GC_GRAIN        =   6, // GC_WHEAT / GC_MAIZE
-	GC_WOOD         =   7,
-	GC_IRON_ORE     =   8,
-	GC_STEEL        =   9,
-	GC_VALUABLES    =  10, // GC_GOLD / GC_DIAMONDS
-	GC_PAPER        =  11,
-	GC_FOOD         =  12,
-	GC_FRUIT        =  13,
-	GC_COPPER_ORE   =  14,
-	GC_WATER        =  15,
-	GC_RUBBER       =  16,
-	GC_SUGAR        =  17,
-	GC_TOYS         =  18,
-	GC_BATTERIES    =  19,
-	GC_CANDY        =  20,
-	GC_TOFFEE       =  21,
-	GC_COLA         =  22,
-	GC_COTTON_CANDY =  23,
-	GC_BUBBLES      =  24,
-	GC_PLASTIC      =  25,
-	GC_FIZZY_DRINKS =  26,
-	GC_PAPER_TEMP   =  27,
-	GC_UNDEFINED    =  28, // undefined; unused slot in arctic climate
-	GC_DEFAULT      =  29,
-	GC_PURCHASE     =  30,
-	GC_DEFAULT_NA   =  31, // New stations only
-	GC_INVALID      = 255,
-	NUM_GLOBAL_CID  =  32
-};
+static const CargoID CT_DEFAULT      = NUM_CARGO + 0;
+static const CargoID CT_PURCHASE     = NUM_CARGO + 1;
+static const CargoID CT_DEFAULT_NA   = NUM_CARGO + 2;
 
 #endif /* NEWGRF_CARGO_H */
--- a/src/newgrf_engine.cpp
+++ b/src/newgrf_engine.cpp
@@ -44,7 +44,7 @@
 	WagonOverride *wo;
 
 	assert(engine < TOTAL_NUM_ENGINES);
-	assert(cargo < NUM_GLOBAL_CID);
+	assert(cargo < NUM_CARGO + 1); // Include CT_DEFAULT pseudo cargo. CT_PURCHASE does not apply to overrides.
 
 	wos = &_engine_wagon_overrides[engine];
 	wos->overrides_count++;
@@ -76,7 +76,7 @@
 		int j;
 
 		for (j = 0; j < wo->trains; j++) {
-			if (wo->train_id[j] == overriding_engine && (wo->cargo == cargo || wo->cargo == GC_DEFAULT)) return wo->group;
+			if (wo->train_id[j] == overriding_engine && (wo->cargo == cargo || wo->cargo == CT_DEFAULT)) return wo->group;
 		}
 	}
 	return NULL;
@@ -105,17 +105,14 @@
 	}
 }
 
-// 0 - 28 are cargos, 29 is default, 30 is the advert (purchase list)
-// (It isn't and shouldn't be like this in the GRF files since new cargo types
-// may appear in future - however it's more convenient to store it like this in
-// memory. --pasky)
-static const SpriteGroup *_engine_custom_sprites[TOTAL_NUM_ENGINES][NUM_GLOBAL_CID];
+/* Space for NUM_CARGO real cargos and 2 pseudo cargos, CT_DEFAULT and CT_PURCHASE */
+static const SpriteGroup *_engine_custom_sprites[TOTAL_NUM_ENGINES][NUM_CARGO + 2];
 static const GRFFile *_engine_grf[TOTAL_NUM_ENGINES];
 
 void SetCustomEngineSprites(EngineID engine, byte cargo, const SpriteGroup *group)
 {
-	assert(engine < TOTAL_NUM_ENGINES);
-	assert(cargo < NUM_GLOBAL_CID);
+	assert(engine < lengthof(_engine_custom_sprites));
+	assert(cargo < lengthof(*_engine_custom_sprites));
 
 	if (_engine_custom_sprites[engine][cargo] != NULL) {
 		grfmsg(6, "SetCustomEngineSprites: engine %d cargo %d already has group -- replacing", engine, cargo);
@@ -128,15 +125,8 @@
  */
 void UnloadCustomEngineSprites(void)
 {
-	EngineID engine;
-	CargoID cargo;
-
-	for (engine = 0; engine < TOTAL_NUM_ENGINES; engine++) {
-		for (cargo = 0; cargo < NUM_GLOBAL_CID; cargo++) {
-			_engine_custom_sprites[engine][cargo] = NULL;
-		}
-		_engine_grf[engine] = 0;
-	}
+	memset(_engine_custom_sprites, 0, sizeof(_engine_custom_sprites));
+	memset(_engine_grf, 0, sizeof(_engine_grf));
 }
 
 static const SpriteGroup *heli_rotor_custom_sprites[NUM_AIRCRAFT_ENGINES];
@@ -818,12 +808,9 @@
 	CargoID cargo;
 
 	if (v == NULL) {
-		cargo = GC_PURCHASE;
+		cargo = CT_PURCHASE;
 	} else {
-		const CargoSpec *cs = GetCargo(v->cargo_type);
-		assert(cs->IsValid());
-
-		cargo = cs->bitnum;
+		cargo = v->cargo_type;
 
 		if (v->type == VEH_Train) {
 			group = GetWagonOverrideSpriteSet(engine, cargo, v->u.rail.first_engine);
@@ -836,7 +823,7 @@
 	if (group != NULL) return group;
 
 	/* Fall back to the default set if the selected cargo type is not defined */
-	return _engine_custom_sprites[engine][GC_DEFAULT];
+	return _engine_custom_sprites[engine][CT_DEFAULT];
 }
 
 
@@ -888,7 +875,7 @@
 bool UsesWagonOverride(const Vehicle* v)
 {
 	assert(v->type == VEH_Train);
-	return GetWagonOverrideSpriteSet(v->engine_type, GetCargo(v->cargo_type)->bitnum, v->u.rail.first_engine) != NULL;
+	return GetWagonOverrideSpriteSet(v->engine_type, v->cargo_type, v->u.rail.first_engine) != NULL;
 }
 
 /**
--- a/src/newgrf_station.cpp
+++ b/src/newgrf_station.cpp
@@ -447,20 +447,20 @@
 	}
 
 	switch (cargo_type) {
-		case GC_INVALID:
-		case GC_DEFAULT_NA:
-		case GC_PURCHASE:
+		case CT_INVALID:
+		case CT_DEFAULT_NA:
+		case CT_PURCHASE:
 			cargo = 0;
 			break;
 
-		case GC_DEFAULT:
+		case CT_DEFAULT:
 			for (cargo_type = 0; cargo_type < NUM_CARGO; cargo_type++) {
 				cargo += GB(st->goods[cargo_type].waiting_acceptance, 0, 12);
 			}
 			break;
 
 		default:
-			cargo = GB(st->goods[GetCargoIDByBitnum(cargo_type)].waiting_acceptance, 0, 12);
+			cargo = GB(st->goods[cargo_type].waiting_acceptance, 0, 12);
 			break;
 	}
 
@@ -506,18 +506,18 @@
 static const SpriteGroup *ResolveStation(ResolverObject *object)
 {
 	const SpriteGroup *group;
-	CargoID ctype = GC_DEFAULT_NA;
+	CargoID ctype = CT_DEFAULT_NA;
 
 	if (object->u.station.st == NULL) {
 		/* No station, so we are in a purchase list */
-		ctype = GC_PURCHASE;
+		ctype = CT_PURCHASE;
 	} else {
 		/* Pick the first cargo that we have waiting */
 		for (CargoID cargo = 0; cargo < NUM_CARGO; cargo++) {
 			const CargoSpec *cs = GetCargo(cargo);
-			if (cs->IsValid() && object->u.station.statspec->spritegroup[cs->bitnum] != NULL &&
+			if (cs->IsValid() && object->u.station.statspec->spritegroup[cargo] != NULL &&
 					GB(object->u.station.st->goods[cargo].waiting_acceptance, 0, 12) != 0) {
-				ctype = cs->bitnum;
+				ctype = cargo;
 				break;
 			}
 		}
@@ -525,7 +525,7 @@
 
 	group = object->u.station.statspec->spritegroup[ctype];
 	if (group == NULL) {
-		ctype = GC_DEFAULT;
+		ctype = CT_DEFAULT;
 		group = object->u.station.statspec->spritegroup[ctype];
 	}
 
--- a/src/newgrf_station.h
+++ b/src/newgrf_station.h
@@ -79,11 +79,11 @@
 	bool copied_layouts;
 
 	/**
-	 * NUM_GLOBAL_CID sprite groups.
+	 * NUM_CARGO real cargo plus three pseudo cargo sprite groups.
 	 * Used for obtaining the sprite offset of custom sprites, and for
 	 * evaluating callbacks.
 	 */
-	const struct SpriteGroup *spritegroup[NUM_GLOBAL_CID];
+	const struct SpriteGroup *spritegroup[NUM_CARGO + 3];
 } StationSpec;
 
 /**
--- a/src/vehicle.cpp
+++ b/src/vehicle.cpp
@@ -762,8 +762,7 @@
  */
 bool CanRefitTo(EngineID engine_type, CargoID cid_to)
 {
-	CargoID cid = GetCargo(cid_to)->bitnum;
-	return HASBIT(EngInfo(engine_type)->refit_mask, cid);
+	return HASBIT(EngInfo(engine_type)->refit_mask, cid_to);
 }
 
 /** Find the first cargo type that an engine can be refitted to.
@@ -776,7 +775,7 @@
 
 	if (refit_mask != 0) {
 		for (CargoID cid = CT_PASSENGERS; cid < NUM_CARGO; cid++) {
-			if (HASBIT(refit_mask, GetCargo(cid)->bitnum)) return cid;
+			if (HASBIT(refit_mask, cid)) return cid;
 		}
 	}
 
--- a/src/vehicle_gui.cpp
+++ b/src/vehicle_gui.cpp
@@ -210,10 +210,8 @@
 
 		/* Loop through all cargos in the refit mask */
 		for (CargoID cid = 0; cid != NUM_CARGO && num_lines < max_lines; cid++) {
-			const CargoSpec *cs = GetCargo(cid);
-
 			/* Skip cargo type if it's not listed */
-			if (!HASBIT(cmask, cs->bitnum)) continue;
+			if (!HASBIT(cmask, cid)) continue;
 
 			/* Check the vehicle's callback mask for cargo suffixes */
 			if (HASBIT(callbackmask, CBM_CARGO_SUFFIX)) {
@@ -516,9 +514,7 @@
 
 		/* Add each cargo type to the list */
 		for (CargoID cid = 0; cid < NUM_CARGO; cid++) {
-			const CargoSpec *cs = GetCargo(cid);
-
-			if (!HASBIT(cmask, cs->bitnum)) continue;
+			if (!HASBIT(cmask, cid)) continue;
 
 			if (!first) b = strecpy(b, ", ", lastof(_userstring));
 			first = false;