(svn r11045) -Codechange: added a function to tell if a vehicle is the rear part of a dualheaded train engine
authorbjarni
Wed, 05 Sep 2007 10:15:23 +0000
changeset 8022 32b885de2410
parent 8021 9825c7a74648
child 8023 67fdef8a686e
(svn r11045) -Codechange: added a function to tell if a vehicle is the rear part of a dualheaded train engine
src/autoreplace_cmd.cpp
src/train.h
src/train_cmd.cpp
src/vehicle.cpp
--- a/src/autoreplace_cmd.cpp	Wed Sep 05 09:31:15 2007 +0000
+++ b/src/autoreplace_cmd.cpp	Wed Sep 05 10:15:23 2007 +0000
@@ -202,7 +202,7 @@
 			/* Get the vehicle in front of the one we move out */
 			Vehicle *front = old_v->Previous();
 			/* If the vehicle in front is the rear end of a dualheaded engine, then we need to use the one in front of that one */
-			if (IsMultiheaded(front) && !IsTrainEngine(front)) front = front->Previous();
+			if (IsRearDualheaded(front)) front = front->Previous();
 			/* Now we move the old one out of the train */
 			DoCommand(0, (INVALID_VEHICLE << 16) | old_v->index, 0, DC_EXEC, CMD_MOVE_RAIL_VEHICLE);
 			/* Add the new vehicle */
@@ -250,7 +250,7 @@
 
 		if (old_v->type == VEH_TRAIN && IsFrontEngine(old_v)) {
 			Vehicle *next_veh = GetNextVehicle(old_v);
-			if (IsMultiheaded(next_veh) && !IsTrainEngine(next_veh)) next_veh = next_veh->Next(); // don't try to move the rear multiheaded engine
+			if (IsRearDualheaded(next_veh)) next_veh = next_veh->Next(); // don't try to move the rear multiheaded engine
 			if (next_veh != NULL) {
 				/* Verify that the wagons can be placed on the engine in question.
 				 * This is done by building an engine, test if the wagons can be added and then sell the test engine. */
@@ -337,7 +337,7 @@
 		cost = CommandCost();
 		w = v;
 		do {
-			if (w->type == VEH_TRAIN && IsMultiheaded(w) && !IsTrainEngine(w)) {
+			if (w->type == VEH_TRAIN && IsRearDualheaded(w)) {
 				/* we build the rear ends of multiheaded trains with the front ones */
 				continue;
 			}
--- a/src/train.h	Wed Sep 05 09:31:15 2007 +0000
+++ b/src/train.h	Wed Sep 05 10:15:23 2007 +0000
@@ -225,6 +225,16 @@
 	return v;
 }
 
+/** Tell if we are dealing with the rear end of a multiheaded engine.
+ * @param v Vehicle.
+ * @return True if the engine is the rear part of a dualheaded engine.
+ */
+static inline bool IsRearDualheaded(const Vehicle *v)
+{
+	assert(v->type == VEH_TRAIN);
+	return (IsMultiheaded(v) && !IsTrainEngine(v));
+}
+
 /** Get the next real (non-articulated part) vehicle in the consist.
  * @param v Vehicle.
  * @return Next vehicle in the consist.
--- a/src/train_cmd.cpp	Wed Sep 05 09:31:15 2007 +0000
+++ b/src/train_cmd.cpp	Wed Sep 05 10:15:23 2007 +0000
@@ -798,7 +798,7 @@
 		 * engines with more articulated parts than before works correctly.
 		 *
 		 * Also skip counting rear ends of multiheaded engines */
-		if (!IsArticulatedPart(v) && !(!IsTrainEngine(v) && IsMultiheaded(v))) count++;
+		if (!IsArticulatedPart(v) && !IsRearDualheaded(v)) count++;
 		if (v->u.rail.track != TRACK_BIT_DEPOT || v->tile != tile ||
 				(IsFrontEngine(v) && needs_to_be_stopped && !(v->vehstatus & VS_STOPPED))) {
 			return -1;
@@ -953,7 +953,7 @@
 		dst_head = NULL;
 	}
 
-	if (IsMultiheaded(src) && !IsTrainEngine(src)) return_cmd_error(STR_REAR_ENGINE_FOLLOW_FRONT_ERROR);
+	if (IsRearDualheaded(src)) return_cmd_error(STR_REAR_ENGINE_FOLLOW_FRONT_ERROR);
 
 	/* when moving all wagons, we can't have the same src_head and dst_head */
 	if (HASBIT(p2, 0) && src_head == dst_head) return CommandCost();
@@ -1221,7 +1221,7 @@
 		return_cmd_error(STR_881A_TRAINS_CAN_ONLY_BE_ALTERED);
 	}
 
-	if (IsMultiheaded(v) && !IsTrainEngine(v)) return_cmd_error(STR_REAR_ENGINE_FOLLOW_FRONT_ERROR);
+	if (IsRearDualheaded(v)) return_cmd_error(STR_REAR_ENGINE_FOLLOW_FRONT_ERROR);
 
 	if (flags & DC_EXEC) {
 		if (v == first && IsFrontEngine(first)) {
--- a/src/vehicle.cpp	Wed Sep 05 09:31:15 2007 +0000
+++ b/src/vehicle.cpp	Wed Sep 05 10:15:23 2007 +0000
@@ -500,7 +500,7 @@
 		case VEH_AIRCRAFT: return IsNormalAircraft(v); // don't count plane shadows and helicopter rotors
 		case VEH_TRAIN:
 			return !IsArticulatedPart(v) && // tenders and other articulated parts
-			(!IsMultiheaded(v) || IsTrainEngine(v)); // rear parts of multiheaded engines
+			!IsRearDualheaded(v); // rear parts of multiheaded engines
 		case VEH_ROAD: return IsRoadVehFront(v);
 		case VEH_SHIP: return true;
 		default: return false; // Only count player buildable vehicles
@@ -1733,7 +1733,7 @@
 	v = v_front;
 
 	do {
-		if (v->type == VEH_TRAIN && IsMultiheaded(v) && !IsTrainEngine(v)) {
+		if (v->type == VEH_TRAIN && IsRearDualheaded(v)) {
 			/* we build the rear ends of multiheaded trains with the front ones */
 			continue;
 		}