diff options
author | rubidium <rubidium@openttd.org> | 2007-05-19 09:40:18 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2007-05-19 09:40:18 +0000 |
commit | 7d4be11516e2ef80bcce2a61f08d1cf091401ef1 (patch) | |
tree | fcea59953bd1ce2ff5f0302669d3649bf7ca78bb /src/group.h | |
parent | 816d31f0aac2612ab1b076c5a99480b7534242ae (diff) | |
download | openttd-7d4be11516e2ef80bcce2a61f08d1cf091401ef1.tar.xz |
(svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
Diffstat (limited to 'src/group.h')
-rw-r--r-- | src/group.h | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/group.h b/src/group.h new file mode 100644 index 000000000..f68306293 --- /dev/null +++ b/src/group.h @@ -0,0 +1,97 @@ +/* $Id$ */ + +/** @file group.h */ + +#ifndef GROUP_H +#define GROUP_H + +#include "oldpool.h" + +enum { + DEFAULT_GROUP = 0xFFFE, + INVALID_GROUP = 0xFFFF, +}; + +struct Group { + StringID string_id; ///< Group Name + + uint16 num_vehicle; ///< Number of vehicles wich belong to the group + PlayerID owner; ///< Group Owner + GroupID index; ///< Array index + VehicleTypeByte vehicle_type; ///< Vehicle type of the group + + bool replace_protection; ///< If set to true, the global autoreplace have no effect on the group + uint16 num_engines[TOTAL_NUM_ENGINES]; ///< Caches the number of engines of each type the player owns (no need to save this) +}; + +DECLARE_OLD_POOL(Group, Group, 5, 2047) + + +static inline bool IsValidGroup(const Group *g) +{ + return g->string_id != STR_NULL; +} + +static inline void DestroyGroup(Group *g) +{ + DeleteName(g->string_id); +} + +static inline void DeleteGroup(Group *g) +{ + DestroyGroup(g); + g->string_id = STR_NULL; +} + +static inline bool IsValidGroupID(GroupID index) +{ + return index < GetGroupPoolSize() && IsValidGroup(GetGroup(index)); +} + +static inline bool IsDefaultGroupID(GroupID index) +{ + return (index == DEFAULT_GROUP); +} + +static inline StringID GetGroupName(GroupID index) +{ + if (!IsValidGroupID(index)) return STR_NULL; + + return GetGroup(index)->string_id; +} + + +#define FOR_ALL_GROUPS_FROM(g, start) for (g = GetGroup(start); g != NULL; g = (g->index + 1U < GetGroupPoolSize()) ? GetGroup(g->index + 1) : NULL) if (IsValidGroup(g)) +#define FOR_ALL_GROUPS(g) FOR_ALL_GROUPS_FROM(g, 0) + +/** + * Get the current size of the GroupPool + */ +static inline uint GetGroupArraySize(void) +{ + const Group *g; + uint num = 0; + + FOR_ALL_GROUPS(g) num++; + + return num; +} + +static inline void IncreaseGroupNumVehicle(GroupID id_g) +{ + if (IsValidGroupID(id_g)) GetGroup(id_g)->num_vehicle++; +} + +static inline void DecreaseGroupNumVehicle(GroupID id_g) +{ + if (IsValidGroupID(id_g)) GetGroup(id_g)->num_vehicle--; +} + + +void InitializeGroup(); +void SetTrainGroupID(Vehicle *v, GroupID grp); +void UpdateTrainGroupID(Vehicle *v); +void RemoveVehicleFromGroup(const Vehicle *v); +void RemoveAllGroupsForPlayer(const Player *p); + +#endif /* GROUP_H */ |