rubidium@7139: /* $Id$ */ rubidium@7139: rubidium@7139: /** @file group.h */ rubidium@7139: rubidium@7139: #ifndef GROUP_H rubidium@7139: #define GROUP_H rubidium@7139: rubidium@7139: #include "oldpool.h" rubidium@8750: #include "player_type.h" rubidium@8750: #include "vehicle_type.h" rubidium@8750: #include "engine.h" rubidium@7139: rubidium@7139: enum { rubidium@7754: ALL_GROUP = 0xFFFD, rubidium@7139: DEFAULT_GROUP = 0xFFFE, rubidium@7139: INVALID_GROUP = 0xFFFF, rubidium@7139: }; rubidium@7139: rubidium@7878: struct Group; rubidium@7878: DECLARE_OLD_POOL(Group, Group, 5, 2047) rubidium@7878: rubidium@7878: struct Group : PoolItem { peter1138@8754: char *name; ///< Group Name rubidium@7139: rubidium@7139: uint16 num_vehicle; ///< Number of vehicles wich belong to the group rubidium@7139: PlayerID owner; ///< Group Owner rubidium@7139: VehicleTypeByte vehicle_type; ///< Vehicle type of the group rubidium@7139: rubidium@7139: bool replace_protection; ///< If set to true, the global autoreplace have no effect on the group rubidium@7139: uint16 num_engines[TOTAL_NUM_ENGINES]; ///< Caches the number of engines of each type the player owns (no need to save this) rubidium@7878: peter1138@8749: Group(PlayerID owner = INVALID_PLAYER); rubidium@7878: virtual ~Group(); rubidium@7878: rubidium@7878: bool IsValid() const; rubidium@7139: }; rubidium@7139: rubidium@7139: rubidium@7139: static inline bool IsValidGroupID(GroupID index) rubidium@7139: { rubidium@7878: return index < GetGroupPoolSize() && GetGroup(index)->IsValid(); rubidium@7139: } rubidium@7139: rubidium@7139: static inline bool IsDefaultGroupID(GroupID index) rubidium@7139: { rubidium@7754: return index == DEFAULT_GROUP; rubidium@7754: } rubidium@7754: rubidium@7754: /** rubidium@7754: * Checks if a GroupID stands for all vehicles of a player rubidium@7754: * @param id_g The GroupID to check rubidium@7754: * @return true is id_g is identical to ALL_GROUP rubidium@7754: */ rubidium@7754: static inline bool IsAllGroupID(GroupID id_g) rubidium@7754: { rubidium@7754: return id_g == ALL_GROUP; rubidium@7139: } rubidium@7139: rubidium@7878: #define FOR_ALL_GROUPS_FROM(g, start) for (g = GetGroup(start); g != NULL; g = (g->index + 1U < GetGroupPoolSize()) ? GetGroup(g->index + 1) : NULL) if (g->IsValid()) rubidium@7139: #define FOR_ALL_GROUPS(g) FOR_ALL_GROUPS_FROM(g, 0) rubidium@7139: rubidium@7139: /** rubidium@7139: * Get the current size of the GroupPool rubidium@7139: */ rubidium@7139: static inline uint GetGroupArraySize(void) rubidium@7139: { rubidium@7139: const Group *g; rubidium@7139: uint num = 0; rubidium@7139: rubidium@7139: FOR_ALL_GROUPS(g) num++; rubidium@7139: rubidium@7139: return num; rubidium@7139: } rubidium@7139: rubidium@7754: /** rubidium@7754: * Get the number of engines with EngineID id_e in the group with GroupID rubidium@7754: * id_g rubidium@7754: * @param id_g The GroupID of the group used rubidium@7754: * @param id_e The EngineID of the engine to count rubidium@7754: * @return The number of engines with EngineID id_e in the group rubidium@7754: */ rubidium@8733: uint GetGroupNumEngines(PlayerID p, GroupID id_g, EngineID id_e); rubidium@7754: rubidium@7139: static inline void IncreaseGroupNumVehicle(GroupID id_g) rubidium@7139: { rubidium@7139: if (IsValidGroupID(id_g)) GetGroup(id_g)->num_vehicle++; rubidium@7139: } rubidium@7139: rubidium@7139: static inline void DecreaseGroupNumVehicle(GroupID id_g) rubidium@7139: { rubidium@7139: if (IsValidGroupID(id_g)) GetGroup(id_g)->num_vehicle--; rubidium@7139: } rubidium@7139: rubidium@7139: rubidium@7139: void InitializeGroup(); rubidium@7139: void SetTrainGroupID(Vehicle *v, GroupID grp); rubidium@7139: void UpdateTrainGroupID(Vehicle *v); rubidium@7139: void RemoveVehicleFromGroup(const Vehicle *v); rubidium@8733: void RemoveAllGroupsForPlayer(const PlayerID p); rubidium@7139: rubidium@7139: #endif /* GROUP_H */