From 22a46798378768271af6b90cd41327155a909dd2 Mon Sep 17 00:00:00 2001 From: bjarni Date: Fri, 18 Nov 2005 23:41:03 +0000 Subject: (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 --- train.h | 208 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 train.h (limited to 'train.h') 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 */ -- cgit v1.2.3-54-g00ecf