summaryrefslogtreecommitdiff
path: root/train.h
diff options
context:
space:
mode:
authorbjarni <bjarni@openttd.org>2005-11-18 23:41:03 +0000
committerbjarni <bjarni@openttd.org>2005-11-18 23:41:03 +0000
commit22a46798378768271af6b90cd41327155a909dd2 (patch)
tree3dd0d12983f0eaa08af460475f1f8b0a2c961d75 /train.h
parent40ec9bb1235a2231f0c883baaae73e106c67f1cf (diff)
downloadopenttd-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.h208
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 */