(svn r21862) -Codechange: Unify subtype handling between road vehicles and trains.

This commit is contained in:
terkhen 2011-01-19 20:04:09 +00:00
parent be44f1306f
commit d426906a01
5 changed files with 127 additions and 145 deletions

View File

@ -162,6 +162,114 @@ struct GroundVehicle : public SpecializedVehicle<T, Type> {
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 */

View File

@ -75,12 +75,6 @@ static const uint RVC_TURN_AROUND_START_FRAME_SHORT_TRAM = 16;
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 @@ struct RoadVehicle : public GroundVehicle<RoadVehicle, VEH_ROAD> {
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.
/**

View File

@ -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

View File

@ -308,6 +308,23 @@ void AfterLoadVehicles(bool part_of_load)
}
}
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) {

View File

@ -137,116 +137,6 @@ struct Train : public GroundVehicle<Train, VEH_TRAIN> {
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),