summaryrefslogtreecommitdiff
path: root/src/articulated_vehicles.cpp
diff options
context:
space:
mode:
authorfrosch <frosch@openttd.org>2009-12-20 14:28:55 +0000
committerfrosch <frosch@openttd.org>2009-12-20 14:28:55 +0000
commit1e1fa9ff2eee6f194e2b3172f1cf0439113f50a6 (patch)
tree11b2f4bcb802a0326aae35068196a1ba1d4da6d8 /src/articulated_vehicles.cpp
parente5ebae1085f40e25d9e939c5bd3ed29c2fd513c1 (diff)
downloadopenttd-1e1fa9ff2eee6f194e2b3172f1cf0439113f50a6.tar.xz
(svn r18566) -Codechange: When both the union and intersection of refit masks of articulated vehicles are needed, they can be determined at once.
Diffstat (limited to 'src/articulated_vehicles.cpp')
-rw-r--r--src/articulated_vehicles.cpp59
1 files changed, 29 insertions, 30 deletions
diff --git a/src/articulated_vehicles.cpp b/src/articulated_vehicles.cpp
index ccc929102..80a30952b 100644
--- a/src/articulated_vehicles.cpp
+++ b/src/articulated_vehicles.cpp
@@ -148,28 +148,43 @@ bool IsArticulatedVehicleRefittable(EngineID engine)
}
/**
- * Ors the refit_masks of all articulated parts.
+ * Merges the refit_masks of all articulated parts.
* @param engine the first part
* @param include_initial_cargo_type if true the default cargo type of the vehicle is included; if false only the refit_mask
- * @return bit mask of CargoIDs which are a refit option for at least one articulated part
+ * @param union_mask returns bit mask of CargoIDs which are a refit option for at least one articulated part
+ * @param intersection_mask returns bit mask of CargoIDs which are a refit option for every articulated part (with default capacity > 0)
*/
-uint32 GetUnionOfArticulatedRefitMasks(EngineID engine, bool include_initial_cargo_type)
+void GetArticulatedRefitMasks(EngineID engine, bool include_initial_cargo_type, uint32 *union_mask, uint32 *intersection_mask)
{
const Engine *e = Engine::Get(engine);
- uint32 cargos = GetAvailableVehicleCargoTypes(engine, include_initial_cargo_type);
-
- if (e->type != VEH_TRAIN && e->type != VEH_ROAD) return cargos;
+ uint32 veh_cargos = GetAvailableVehicleCargoTypes(engine, include_initial_cargo_type);
+ *union_mask = veh_cargos;
+ *intersection_mask = (veh_cargos != 0) ? veh_cargos : UINT32_MAX;
- if (!HasBit(e->info.callback_mask, CBM_VEHICLE_ARTIC_ENGINE)) return cargos;
+ if (e->type != VEH_TRAIN && e->type != VEH_ROAD) return;
+ if (!HasBit(e->info.callback_mask, CBM_VEHICLE_ARTIC_ENGINE)) return;
for (uint i = 1; i < MAX_ARTICULATED_PARTS; i++) {
EngineID artic_engine = GetNextArticPart(i, engine);
if (artic_engine == INVALID_ENGINE) break;
- cargos |= GetAvailableVehicleCargoTypes(artic_engine, include_initial_cargo_type);
+ veh_cargos = GetAvailableVehicleCargoTypes(artic_engine, include_initial_cargo_type);;
+ *union_mask |= veh_cargos;
+ if (veh_cargos != 0) *intersection_mask &= veh_cargos;
}
+}
- return cargos;
+/**
+ * Ors the refit_masks of all articulated parts.
+ * @param engine the first part
+ * @param include_initial_cargo_type if true the default cargo type of the vehicle is included; if false only the refit_mask
+ * @return bit mask of CargoIDs which are a refit option for at least one articulated part
+ */
+uint32 GetUnionOfArticulatedRefitMasks(EngineID engine, bool include_initial_cargo_type)
+{
+ uint32 union_mask, intersection_mask;
+ GetArticulatedRefitMasks(engine, include_initial_cargo_type, &union_mask, &intersection_mask);
+ return union_mask;
}
/**
@@ -180,25 +195,9 @@ uint32 GetUnionOfArticulatedRefitMasks(EngineID engine, bool include_initial_car
*/
uint32 GetIntersectionOfArticulatedRefitMasks(EngineID engine, bool include_initial_cargo_type)
{
- const Engine *e = Engine::Get(engine);
- uint32 cargos = UINT32_MAX;
-
- uint32 veh_cargos = GetAvailableVehicleCargoTypes(engine, include_initial_cargo_type);
- if (veh_cargos != 0) cargos &= veh_cargos;
-
- if (e->type != VEH_TRAIN && e->type != VEH_ROAD) return cargos;
-
- if (!HasBit(e->info.callback_mask, CBM_VEHICLE_ARTIC_ENGINE)) return cargos;
-
- for (uint i = 1; i < MAX_ARTICULATED_PARTS; i++) {
- EngineID artic_engine = GetNextArticPart(i, engine);
- if (artic_engine == INVALID_ENGINE) break;
-
- veh_cargos = GetAvailableVehicleCargoTypes(artic_engine, include_initial_cargo_type);
- if (veh_cargos != 0) cargos &= veh_cargos;
- }
-
- return cargos;
+ uint32 union_mask, intersection_mask;
+ GetArticulatedRefitMasks(engine, include_initial_cargo_type, &union_mask, &intersection_mask);
+ return intersection_mask;
}
@@ -253,8 +252,8 @@ void CheckConsistencyOfArticulatedVehicle(const Vehicle *v)
{
const Engine *engine = Engine::Get(v->engine_type);
- uint32 purchase_refit_union = GetUnionOfArticulatedRefitMasks(v->engine_type, true);
- uint32 purchase_refit_intersection = GetIntersectionOfArticulatedRefitMasks(v->engine_type, true);
+ uint32 purchase_refit_union, purchase_refit_intersection;
+ GetArticulatedRefitMasks(v->engine_type, true, &purchase_refit_union, &purchase_refit_intersection);
CargoArray purchase_default_capacity = GetCapacityOfArticulatedParts(v->engine_type);
uint32 real_refit_union = 0;