(svn r23861) -Feature: [NewGRF] New algorithm (activated via an engine flag) to determine the capacity of vehicles. This allows vehicles to better control the capacity for cargotypes which they know; and let cargo NewGRFs influence the capacity for cargos the vehicle NewGRF does not know, but which the vehicle is refittable to due to cargo classes.

This commit is contained in:
frosch 2012-01-28 12:11:23 +00:00
parent 90c53046c7
commit 1777809e14
2 changed files with 22 additions and 10 deletions

View File

@ -210,6 +210,7 @@ uint Engine::DetermineCapacity(const Vehicle *v, uint16 *mail_capacity) const
if (!this->CanCarryCargo()) return 0; if (!this->CanCarryCargo()) return 0;
bool new_multipliers = HasBit(this->info.misc_flags, EF_NO_DEFAULT_CARGO_MULTIPLIER);
CargoID default_cargo = this->GetDefaultCargoType(); CargoID default_cargo = this->GetDefaultCargoType();
CargoID cargo_type = (v != NULL) ? v->cargo_type : default_cargo; CargoID cargo_type = (v != NULL) ? v->cargo_type : default_cargo;
@ -217,16 +218,16 @@ uint Engine::DetermineCapacity(const Vehicle *v, uint16 *mail_capacity) const
*mail_capacity = GetEngineProperty(this->index, PROP_AIRCRAFT_MAIL_CAPACITY, this->u.air.mail_capacity, v); *mail_capacity = GetEngineProperty(this->index, PROP_AIRCRAFT_MAIL_CAPACITY, this->u.air.mail_capacity, v);
} }
/* Check the refit capacity callback if we are not in the default configuration. /* Check the refit capacity callback if we are not in the default configuration, or if we are using the new multiplier algorithm. */
* Note: This might change to become more consistent/flexible/sane, esp. when default cargo is first refittable. */
if (HasBit(this->info.callback_mask, CBM_VEHICLE_REFIT_CAPACITY) && if (HasBit(this->info.callback_mask, CBM_VEHICLE_REFIT_CAPACITY) &&
(default_cargo != cargo_type || (v != NULL && v->cargo_subtype != 0))) { (new_multipliers || default_cargo != cargo_type || (v != NULL && v->cargo_subtype != 0))) {
uint16 callback = GetVehicleCallback(CBID_VEHICLE_REFIT_CAPACITY, 0, 0, this->index, v); uint16 callback = GetVehicleCallback(CBID_VEHICLE_REFIT_CAPACITY, 0, 0, this->index, v);
if (callback != CALLBACK_FAILED) return callback; if (callback != CALLBACK_FAILED) return callback;
} }
/* Get capacity according to property resp. CB */ /* Get capacity according to property resp. CB */
uint capacity; uint capacity;
uint extra_mail_cap = 0;
switch (this->type) { switch (this->type) {
case VEH_TRAIN: case VEH_TRAIN:
capacity = GetEngineProperty(this->index, PROP_TRAIN_CARGO_CAPACITY, this->u.rail.capacity, v); capacity = GetEngineProperty(this->index, PROP_TRAIN_CARGO_CAPACITY, this->u.rail.capacity, v);
@ -246,21 +247,31 @@ uint Engine::DetermineCapacity(const Vehicle *v, uint16 *mail_capacity) const
case VEH_AIRCRAFT: case VEH_AIRCRAFT:
capacity = GetEngineProperty(this->index, PROP_AIRCRAFT_PASSENGER_CAPACITY, this->u.air.passenger_capacity, v); capacity = GetEngineProperty(this->index, PROP_AIRCRAFT_PASSENGER_CAPACITY, this->u.air.passenger_capacity, v);
if (!IsCargoInClass(cargo_type, CC_PASSENGERS)) { if (!IsCargoInClass(cargo_type, CC_PASSENGERS)) {
capacity += GetEngineProperty(this->index, PROP_AIRCRAFT_MAIL_CAPACITY, this->u.air.mail_capacity, v); extra_mail_cap = GetEngineProperty(this->index, PROP_AIRCRAFT_MAIL_CAPACITY, this->u.air.mail_capacity, v);
} }
if (cargo_type == CT_MAIL) return capacity; if (!new_multipliers && cargo_type == CT_MAIL) return capacity + extra_mail_cap;
default_cargo = CT_PASSENGERS; // Always use 'passengers' wrt. cargo multipliers default_cargo = CT_PASSENGERS; // Always use 'passengers' wrt. cargo multipliers
break; break;
default: NOT_REACHED(); default: NOT_REACHED();
} }
/* Apply multipliers depending on cargo- and vehicletype. if (!new_multipliers) {
* Note: This might change to become more consistent/flexible. */ /* Use the passenger multiplier for mail as well */
if (this->type != VEH_SHIP && default_cargo != cargo_type) { capacity += extra_mail_cap;
uint16 default_multiplier = CargoSpec::Get(default_cargo)->multiplier; extra_mail_cap = 0;
}
/* Apply multipliers depending on cargo- and vehicletype. */
if (new_multipliers || (this->type != VEH_SHIP && default_cargo != cargo_type)) {
uint16 default_multiplier = new_multipliers ? 0x100 : CargoSpec::Get(default_cargo)->multiplier;
uint16 cargo_multiplier = CargoSpec::Get(cargo_type)->multiplier; uint16 cargo_multiplier = CargoSpec::Get(cargo_type)->multiplier;
capacity = (capacity * cargo_multiplier + default_multiplier / 2) / default_multiplier; capacity *= cargo_multiplier;
if (extra_mail_cap > 0) {
uint mail_multiplier = CargoSpec::Get(CT_MAIL)->multiplier;
capacity += (default_multiplier * extra_mail_cap * cargo_multiplier + mail_multiplier / 2) / mail_multiplier;
}
capacity = (capacity + default_multiplier / 2) / default_multiplier;
} }
return capacity; return capacity;

View File

@ -156,6 +156,7 @@ enum EngineMiscFlags {
EF_RAIL_IS_MU = 2, ///< Rail vehicle is a multiple-unit (DMU/EMU) EF_RAIL_IS_MU = 2, ///< Rail vehicle is a multiple-unit (DMU/EMU)
EF_RAIL_FLIPS = 3, ///< Rail vehicle can be flipped in the depot EF_RAIL_FLIPS = 3, ///< Rail vehicle can be flipped in the depot
EF_AUTO_REFIT = 4, ///< Automatic refitting is allowed EF_AUTO_REFIT = 4, ///< Automatic refitting is allowed
EF_NO_DEFAULT_CARGO_MULTIPLIER = 5, ///< Use the new capacity algorithm. The default cargotype of the vehicle does not affect capacity multipliers. CB 15 is also called in purchase list.
}; };
/** /**