changeset 17125:9889a00e0d4c draft

(svn r21862) -Codechange: Unify subtype handling between road vehicles and trains.
author terkhen <terkhen@openttd.org>
date Wed, 19 Jan 2011 20:04:09 +0000
parents d216354fbd5e
children 5b41f311a643
files src/ground_vehicle.hpp src/roadveh.h src/saveload/saveload.cpp src/saveload/vehicle_sl.cpp src/train.h
diffstat 5 files changed, 127 insertions(+), 145 deletions(-) [+]
line wrap: on
line diff
--- a/src/ground_vehicle.hpp
+++ b/src/ground_vehicle.hpp
@@ -162,6 +162,114 @@
 		GVSF_FREE_WAGON       = 4, ///< First in a wagon chain (in depot) (not used for road vehicles).
 		GVSF_MULTIHEADED      = 5, ///< Engine is multiheaded (not used for road vehicles).
 	};
+
+	/**
+	 * Set front engine state.
+	 */
+	FORCEINLINE void SetFrontEngine() { SetBit(this->subtype, GVSF_FRONT); }
+
+	/**
+	 * Remove the front engine state.
+	 */
+	FORCEINLINE void ClearFrontEngine() { ClrBit(this->subtype, GVSF_FRONT); }
+
+	/**
+	 * Set a vehicle to be an articulated part.
+	 */
+	FORCEINLINE void SetArticulatedPart() { SetBit(this->subtype, GVSF_ARTICULATED_PART); }
+
+	/**
+	 * Clear a vehicle from being an articulated part.
+	 */
+	FORCEINLINE void ClearArticulatedPart() { ClrBit(this->subtype, GVSF_ARTICULATED_PART); }
+
+	/**
+	 * Set a vehicle to be a wagon.
+	 */
+	FORCEINLINE void SetWagon() { SetBit(this->subtype, GVSF_WAGON); }
+
+	/**
+	 * Clear wagon property.
+	 */
+	FORCEINLINE void ClearWagon() { ClrBit(this->subtype, GVSF_WAGON); }
+
+	/**
+	 * Set engine status.
+	 */
+	FORCEINLINE void SetEngine() { SetBit(this->subtype, GVSF_ENGINE); }
+
+	/**
+	 * Clear engine status.
+	 */
+	FORCEINLINE void ClearEngine() { ClrBit(this->subtype, GVSF_ENGINE); }
+
+	/**
+	 * Set a vehicle as a free wagon.
+	 */
+	FORCEINLINE void SetFreeWagon() { SetBit(this->subtype, GVSF_FREE_WAGON); }
+
+	/**
+	 * Clear a vehicle from being a free wagon.
+	 */
+	FORCEINLINE void ClearFreeWagon() { ClrBit(this->subtype, GVSF_FREE_WAGON); }
+
+	/**
+	 * Set a vehicle as a multiheaded engine.
+	 */
+	FORCEINLINE void SetMultiheaded() { SetBit(this->subtype, GVSF_MULTIHEADED); }
+
+	/**
+	 * Clear multiheaded engine property.
+	 */
+	FORCEINLINE void ClearMultiheaded() { ClrBit(this->subtype, GVSF_MULTIHEADED); }
+
+	/**
+	 * Check if the vehicle is a front engine.
+	 * @return Returns true if the vehicle is a front engine.
+	 */
+	FORCEINLINE bool IsFrontEngine() const { return HasBit(this->subtype, GVSF_FRONT); }
+
+	/**
+	 * Check if the vehicle is a free wagon (got no engine in front of it).
+	 * @return Returns true if the vehicle is a free wagon.
+	 */
+	FORCEINLINE bool IsFreeWagon() const { return HasBit(this->subtype, GVSF_FREE_WAGON); }
+
+	/**
+	 * Check if a vehicle is an engine (can be first in a consist).
+	 * @return Returns true if vehicle is an engine.
+	 */
+	FORCEINLINE bool IsEngine() const { return HasBit(this->subtype, GVSF_ENGINE); }
+
+	/**
+	 * Check if a vehicle is a wagon.
+	 * @return Returns true if vehicle is a wagon.
+	 */
+	FORCEINLINE bool IsWagon() const { return HasBit(this->subtype, GVSF_WAGON); }
+
+	/**
+	 * Check if the vehicle is a multiheaded engine.
+	 * @return Returns true if the vehicle is a multiheaded engine.
+	 */
+	FORCEINLINE bool IsMultiheaded() const { return HasBit(this->subtype, GVSF_MULTIHEADED); }
+
+	/**
+	 * Tell if we are dealing with the rear end of a multiheaded engine.
+	 * @return True if the engine is the rear part of a dualheaded engine.
+	 */
+	FORCEINLINE bool IsRearDualheaded() const { return this->IsMultiheaded() && !this->IsEngine(); }
+
+	/**
+	 * Check if the vehicle is an articulated part of an engine.
+	 * @return Returns true if the vehicle is an articulated part.
+	 */
+	FORCEINLINE bool IsArticulatedPart() const { return HasBit(this->subtype, GVSF_ARTICULATED_PART); }
+
+	/**
+	 * Check if an engine has an articulated part.
+	 * @return True if the engine has an articulated part.
+	 */
+	FORCEINLINE bool HasArticulatedPart() const { return this->Next() != NULL && this->Next()->IsArticulatedPart(); }
 };
 
 #endif /* GROUND_VEHICLE_HPP */
--- a/src/roadveh.h
+++ b/src/roadveh.h
@@ -75,12 +75,6 @@
 static const uint RVC_DRIVE_THROUGH_STOP_FRAME           = 11;
 static const uint RVC_DEPOT_STOP_FRAME                   = 11;
 
-enum RoadVehicleSubType {
-	RVST_FRONT,
-	RVST_ARTIC_PART,
-};
-
-
 void RoadVehUpdateCache(RoadVehicle *v);
 
 /**
@@ -128,34 +122,6 @@
 
 	int GetCurrentMaxSpeed() const;
 
-	/**
-	 * Check if vehicle is a front engine
-	 * @return Returns true if vehicle is a front engine
-	 */
-	FORCEINLINE bool IsFrontEngine() const { return this->subtype == RVST_FRONT; }
-
-	/**
-	 * Set front engine state
-	 */
-	FORCEINLINE void SetFrontEngine() { this->subtype = RVST_FRONT; }
-
-	/**
-	 * Check if vehicl is an articulated part of an engine
-	 * @return Returns true if vehicle is an articulated part
-	 */
-	FORCEINLINE bool IsArticulatedPart() const { return this->subtype == RVST_ARTIC_PART; }
-
-	/**
-	 * Set a vehicle to be an articulated part
-	 */
-	FORCEINLINE void SetArticulatedPart() { this->subtype = RVST_ARTIC_PART; }
-
-	/**
-	 * Check if an engine has an articulated part.
-	 * @return True if the engine has an articulated part.
-	 */
-	FORCEINLINE bool HasArticulatedPart() const { return this->Next() != NULL && this->Next()->IsArticulatedPart(); }
-
 protected: // These functions should not be called outside acceleration code.
 
 	/**
--- a/src/saveload/saveload.cpp
+++ b/src/saveload/saveload.cpp
@@ -221,8 +221,9 @@
  *  154   21426
  *  155   21453
  *  156   21728
+ *  157   21862
  */
-extern const uint16 SAVEGAME_VERSION = 156; ///< Current savegame version of OpenTTD.
+extern const uint16 SAVEGAME_VERSION = 157; ///< Current savegame version of OpenTTD.
 
 SavegameType _savegame_type; ///< type of savegame we are loading
 
--- a/src/saveload/vehicle_sl.cpp
+++ b/src/saveload/vehicle_sl.cpp
@@ -308,6 +308,23 @@
 		}
 	}
 
+	if (IsSavegameVersionBefore(157)) {
+		/* The road vehicle subtype was converted to a flag. */
+		RoadVehicle *rv;
+		FOR_ALL_ROADVEHICLES(rv) {
+			if (rv->subtype == 0) {
+				/* The road vehicle is at the front. */
+				rv->SetFrontEngine();
+			} else if (rv->subtype == 1) {
+				/* The road vehicle is an articulated part. */
+				rv->subtype = 0;
+				rv->SetArticulatedPart();
+			} else {
+				NOT_REACHED();
+			}
+		}
+	}
+
 	CheckValidVehicles();
 
 	FOR_ALL_VEHICLES(v) {
--- a/src/train.h
+++ b/src/train.h
@@ -138,116 +138,6 @@
 	int GetCurrentMaxSpeed() const;
 
 	/**
-	 * Set front engine state
-	 */
-	FORCEINLINE void SetFrontEngine() { SetBit(this->subtype, GVSF_FRONT); }
-
-	/**
-	 * Remove the front engine state
-	 */
-	FORCEINLINE void ClearFrontEngine() { ClrBit(this->subtype, GVSF_FRONT); }
-
-	/**
-	 * Set a vehicle to be an articulated part
-	 */
-	FORCEINLINE void SetArticulatedPart() { SetBit(this->subtype, GVSF_ARTICULATED_PART); }
-
-	/**
-	 * Clear a vehicle from being an articulated part
-	 */
-	FORCEINLINE void ClearArticulatedPart() { ClrBit(this->subtype, GVSF_ARTICULATED_PART); }
-
-	/**
-	 * Set a vehicle to be a wagon
-	 */
-	FORCEINLINE void SetWagon() { SetBit(this->subtype, GVSF_WAGON); }
-
-	/**
-	 * Clear wagon property
-	 */
-	FORCEINLINE void ClearWagon() { ClrBit(this->subtype, GVSF_WAGON); }
-
-	/**
-	 * Set engine status
-	 */
-	FORCEINLINE void SetEngine() { SetBit(this->subtype, GVSF_ENGINE); }
-
-	/**
-	 * Clear engine status
-	 */
-	FORCEINLINE void ClearEngine() { ClrBit(this->subtype, GVSF_ENGINE); }
-
-	/**
-	 * Set if a vehicle is a free wagon
-	 */
-	FORCEINLINE void SetFreeWagon() { SetBit(this->subtype, GVSF_FREE_WAGON); }
-
-	/**
-	 * Clear a vehicle from being a free wagon
-	 */
-	FORCEINLINE void ClearFreeWagon() { ClrBit(this->subtype, GVSF_FREE_WAGON); }
-
-	/**
-	 * Set if a vehicle is a multiheaded engine
-	 */
-	FORCEINLINE void SetMultiheaded() { SetBit(this->subtype, GVSF_MULTIHEADED); }
-
-	/**
-	 * Clear multiheaded engine property
-	 */
-	FORCEINLINE void ClearMultiheaded() { ClrBit(this->subtype, GVSF_MULTIHEADED); }
-
-
-	/**
-	 * Check if train is a front engine
-	 * @return Returns true if train is a front engine
-	 */
-	FORCEINLINE bool IsFrontEngine() const { return HasBit(this->subtype, GVSF_FRONT); }
-
-	/**
-	 * Check if train is a free wagon (got no engine in front of it)
-	 * @return Returns true if train is a free wagon
-	 */
-	FORCEINLINE bool IsFreeWagon() const { return HasBit(this->subtype, GVSF_FREE_WAGON); }
-
-	/**
-	 * Check if a vehicle is an engine (can be first in a train)
-	 * @return Returns true if vehicle is an engine
-	 */
-	FORCEINLINE bool IsEngine() const { return HasBit(this->subtype, GVSF_ENGINE); }
-
-	/**
-	 * Check if a train is a wagon
-	 * @return Returns true if vehicle is a wagon
-	 */
-	FORCEINLINE bool IsWagon() const { return HasBit(this->subtype, GVSF_WAGON); }
-
-	/**
-	 * Check if train is a multiheaded engine
-	 * @return Returns true if vehicle is a multiheaded engine
-	 */
-	FORCEINLINE bool IsMultiheaded() const { return HasBit(this->subtype, GVSF_MULTIHEADED); }
-
-	/**
-	 * Tell if we are dealing with the rear end of a multiheaded engine.
-	 * @return True if the engine is the rear part of a dualheaded engine.
-	 */
-	FORCEINLINE bool IsRearDualheaded() const { return this->IsMultiheaded() && !this->IsEngine(); }
-
-	/**
-	 * Check if train is an articulated part of an engine
-	 * @return Returns true if train is an articulated part
-	 */
-	FORCEINLINE bool IsArticulatedPart() const { return HasBit(this->subtype, GVSF_ARTICULATED_PART); }
-
-	/**
-	 * Check if an engine has an articulated part.
-	 * @return True if the engine has an articulated part.
-	 */
-	FORCEINLINE bool HasArticulatedPart() const { return this->Next() != NULL && this->Next()->IsArticulatedPart(); }
-
-
-	/**
 	 * Get the next part of a multi-part engine.
 	 * Will only work on a multi-part engine (this->EngineHasArticPart() == true),
 	 * Result is undefined for normal engine.