mirror of https://github.com/OpenTTD/OpenTTD.git
(svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
This commit is contained in:
parent
29c8142784
commit
4c4b035175
|
@ -16,10 +16,7 @@ static CargoSpec _cargo[NUM_CARGO];
|
|||
|
||||
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 @@ void SetupCargoForClimate(LandscapeID l)
|
|||
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 @@ void SetupCargoForClimate(LandscapeID l)
|
|||
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 @@ const CargoSpec *GetCargo(CargoID c)
|
|||
}
|
||||
|
||||
|
||||
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;
|
||||
|
|
|
@ -45,8 +45,6 @@ extern uint32 _cargo_mask;
|
|||
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);
|
||||
|
||||
|
|
|
@ -1895,8 +1895,8 @@ static void NewSpriteGroup(byte *buf, int len)
|
|||
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 @@ static CargoID TranslateCargo(uint8 feature, uint8 ctype)
|
|||
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 @@ static void FeatureMapSpriteGroup(byte *buf, int len)
|
|||
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 @@ static void FeatureMapSpriteGroup(byte *buf, int len)
|
|||
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 @@ static void CalculateRefitMasks(void)
|
|||
// 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 @@ static void CalculateRefitMasks(void)
|
|||
CargoID cargo = GetCargoIDByLabel(cl[i]);
|
||||
if (cargo == CT_INVALID) continue;
|
||||
|
||||
SETBIT(xor_mask, GetCargo(cargo)->bitnum);
|
||||
SETBIT(xor_mask, cargo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,41 +15,8 @@ enum {
|
|||
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 */
|
||||
|
|
|
@ -44,7 +44,7 @@ void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const SpriteGroup *
|
|||
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 @@ static const SpriteGroup *GetWagonOverrideSpriteSet(EngineID engine, CargoID car
|
|||
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 @@ void UnloadWagonOverrides(void)
|
|||
}
|
||||
}
|
||||
|
||||
// 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 SetCustomEngineSprites(EngineID engine, byte cargo, const SpriteGroup *grou
|
|||
*/
|
||||
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 @@ static const SpriteGroup *GetVehicleSpriteGroup(EngineID engine, const Vehicle *
|
|||
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 @@ static const SpriteGroup *GetVehicleSpriteGroup(EngineID engine, const Vehicle *
|
|||
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 @@ SpriteID GetRotorOverrideSprite(EngineID engine, const Vehicle *v, bool info_vie
|
|||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -447,20 +447,20 @@ static const SpriteGroup *StationResolveReal(const ResolverObject *object, const
|
|||
}
|
||||
|
||||
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 void NewStationResolver(ResolverObject *res, const StationSpec *statspec,
|
|||
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 @@ static const SpriteGroup *ResolveStation(ResolverObject *object)
|
|||
|
||||
group = object->u.station.statspec->spritegroup[ctype];
|
||||
if (group == NULL) {
|
||||
ctype = GC_DEFAULT;
|
||||
ctype = CT_DEFAULT;
|
||||
group = object->u.station.statspec->spritegroup[ctype];
|
||||
}
|
||||
|
||||
|
|
|
@ -79,11 +79,11 @@ typedef struct StationSpec {
|
|||
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;
|
||||
|
||||
/**
|
||||
|
|
|
@ -762,8 +762,7 @@ bool CanFillVehicle(Vehicle *v)
|
|||
*/
|
||||
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 @@ CargoID FindFirstRefittableCargo(EngineID engine_type)
|
|||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -210,10 +210,8 @@ static RefitList *BuildRefitList(const Vehicle *v)
|
|||
|
||||
/* 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 @@ uint ShowRefitOptionsList(int x, int y, uint w, EngineID engine)
|
|||
|
||||
/* 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;
|
||||
|
|
Loading…
Reference in New Issue