diff options
author | bjarni <bjarni@openttd.org> | 2005-11-18 23:41:03 +0000 |
---|---|---|
committer | bjarni <bjarni@openttd.org> | 2005-11-18 23:41:03 +0000 |
commit | 22a46798378768271af6b90cd41327155a909dd2 (patch) | |
tree | 3dd0d12983f0eaa08af460475f1f8b0a2c961d75 /train.h | |
parent | 40ec9bb1235a2231f0c883baaae73e106c67f1cf (diff) | |
download | openttd-22a46798378768271af6b90cd41327155a909dd2.tar.xz |
(svn r3218) -Feature: Multiheaded train engines will now stay in the same train
This means that any user attempt to remove a rear engine will tell the user to move the front engine instead
This fixes the assert when moving multiheaded engines (introduced in r3144)
Note: to make old savegames use this feature, some engines might be turned around in order to link engines in pairs
-Codechange: train subtype is now a bitmask
This allows fast access to info like if it is a wagon or engine and if it is in front and so on
Note: savegame version bump
Diffstat (limited to 'train.h')
-rw-r--r-- | train.h | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/train.h b/train.h new file mode 100644 index 000000000..9cb3a78d2 --- /dev/null +++ b/train.h @@ -0,0 +1,208 @@ +/* $Id$ */ + +#ifndef TRAIN_H +#define TRAIN_H + +#include "stdafx.h" +#include "vehicle.h" + + +/* + * enum to handle train subtypes + * Do not access it directly unless you have to. Use the access functions below + * This is an enum to tell what bit to access as it is a bitmask + */ + +typedef enum TrainSubtypes { + Train_Front = 0, // Leading engine of a train + Train_Articulated_Part = 1, // Articulated part of an engine + Train_Wagon = 2, // Wagon + Train_Engine = 3, // Engine, that can be front engines, but might be placed behind another engine + Train_Free_Wagon = 4, // First in a wagon chain (in depot) + Train_Multiheaded = 5, // Engine is a multiheaded +} TrainSubtype; + + +/** Check if a vehicle is front engine + * @param v vehicle to check + * @return Returns true if vehicle is a front engine + */ +static inline bool IsFrontEngine(const Vehicle *v) +{ + return HASBIT(v->subtype, Train_Front); +} + +/** Set front engine state + * @param v vehicle to change + */ +static inline void SetFrontEngine(Vehicle *v) +{ + SETBIT(v->subtype, Train_Front); +} + +/** Remove the front engine state + * @param v vehicle to change + */ +static inline void ClearFrontEngine(Vehicle *v) +{ + CLRBIT(v->subtype, Train_Front); +} + +/** Check if a vehicle is an articulated part of an engine + * @param v vehicle to check + * @return Returns true if vehicle is an articulated part + */ +static inline bool IsArticulatedPart(const Vehicle *v) +{ + return HASBIT(v->subtype, Train_Articulated_Part); +} + +/** Set a vehicle to be an articulated part + * @param v vehicle to change + */ +static inline void SetArticulatedPart(Vehicle *v) +{ + SETBIT(v->subtype, Train_Articulated_Part); +} + +/** Clear a vehicle from being an articulated part + * @param v vehicle to change + */ +static inline void ClearArticulatedPart(Vehicle *v) +{ + CLRBIT(v->subtype, Train_Articulated_Part); +} + +/** Check if a vehicle is a wagon + * @param v vehicle to check + * @return Returns true if vehicle is a wagon + */ +static inline bool IsTrainWagon(const Vehicle *v) +{ + return HASBIT(v->subtype, Train_Wagon); +} + +/** Set a vehicle to be a wagon + * @param v vehicle to change + */ +static inline void SetTrainWagon(Vehicle *v) +{ + SETBIT(v->subtype, Train_Wagon); +} + +/** Clear wagon property + * @param v vehicle to change + */ +static inline void ClearTrainWagon(Vehicle *v) +{ + CLRBIT(v->subtype, Train_Wagon); +} + +/** Check if a vehicle is an engine (can be first in a train) + * @param v vehicle to check + * @return Returns true if vehicle is an engine + */ +static inline bool IsTrainEngine(const Vehicle *v) +{ + return HASBIT(v->subtype, Train_Engine); +} + +/** Set engine status + * @param v vehicle to change + */ +static inline void SetTrainEngine(Vehicle *v) +{ + SETBIT(v->subtype, Train_Engine); +} + +/** Clear engine status + * @param v vehicle to change + */ +static inline void ClearTrainEngine(Vehicle *v) +{ + CLRBIT(v->subtype, Train_Engine); +} + +/** Check if a vehicle is a free wagon (got no engine in front of it) + * @param v vehicle to check + * @return Returns true if vehicle is a free wagon + */ +static inline bool IsFreeWagon(const Vehicle *v) +{ + return HASBIT(v->subtype, Train_Free_Wagon); +} + +/** Set if a vehicle is a free wagon + * @param v vehicle to change + */ +static inline void SetFreeWagon(Vehicle *v) +{ + SETBIT(v->subtype, Train_Free_Wagon); +} + +/** Clear a vehicle from being a free wagon + * @param v vehicle to change + */ +static inline void ClearFreeWagon(Vehicle *v) +{ + CLRBIT(v->subtype, Train_Free_Wagon); +} + +/** Check if a vehicle is a multiheaded engine + * @param v vehicle to check + * @return Returns true if vehicle is a multiheaded engine + */ +static inline bool IsMultiheaded(const Vehicle *v) +{ + return HASBIT(v->subtype, Train_Multiheaded); +} + +/** Set if a vehicle is a multiheaded engine + * @param v vehicle to change + */ +static inline void SetMultiheaded(Vehicle *v) +{ + SETBIT(v->subtype, Train_Multiheaded); +} + +/** Clear multiheaded engine property + * @param v vehicle to change + */ +static inline void ClearMultiheaded(Vehicle *v) +{ + CLRBIT(v->subtype, Train_Multiheaded); +} + +/** Get the next real (non-articulated part) vehicle in the consist. + * @param v Vehicle. + * @return Next vehicle in the consist. + */ +static inline Vehicle *GetNextVehicle(const Vehicle *v) +{ + Vehicle *u = v->next; + while (u != NULL && IsArticulatedPart(u)) { + u = u->next; + } + return u; +} + +/** Check if an engine has an articulated part. + * @param v Vehicle. + * @return True if the engine has an articulated part. + */ +static inline bool EngineHasArticPart(const Vehicle *v) +{ + return (v->next != NULL && IsArticulatedPart(v->next)); +} + +/** Get the last part of a multi-part engine. + * @param v Vehicle. + * @return Last part of the engine. + */ +static inline Vehicle *GetLastEnginePart(Vehicle *v) +{ + while (EngineHasArticPart(v)) v = v->next; + return v; +} + +#endif /* TRAIN_H */ |