group.h

Go to the documentation of this file.
00001 /* $Id: group.h 22985 2011-10-03 17:26:37Z frosch $ */
00002 
00003 /*
00004  * This file is part of OpenTTD.
00005  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
00006  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00007  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
00008  */
00009 
00012 #ifndef GROUP_H
00013 #define GROUP_H
00014 
00015 #include "group_type.h"
00016 #include "core/pool_type.hpp"
00017 #include "company_type.h"
00018 #include "vehicle_type.h"
00019 #include "engine_type.h"
00020 
00021 typedef Pool<Group, GroupID, 16, 64000> GroupPool;
00022 extern GroupPool _group_pool; 
00023 
00025 struct GroupStatistics {
00026   uint16 num_vehicle;                     
00027   uint16 *num_engines;                    
00028 
00029   bool autoreplace_defined;               
00030   bool autoreplace_finished;              
00031 
00032   uint16 num_profit_vehicle;              
00033   Money profit_last_year;                 
00034 
00035   GroupStatistics();
00036   ~GroupStatistics();
00037 
00038   void Clear();
00039 
00040   void ClearProfits()
00041   {
00042     this->num_profit_vehicle = 0;
00043     this->profit_last_year = 0;
00044   }
00045 
00046   void ClearAutoreplace()
00047   {
00048     this->autoreplace_defined = false;
00049     this->autoreplace_finished = false;
00050   }
00051 
00052   static GroupStatistics &Get(CompanyID company, GroupID id_g, VehicleType type);
00053   static GroupStatistics &Get(const Vehicle *v);
00054   static GroupStatistics &GetAllGroup(const Vehicle *v);
00055 
00056   static void CountVehicle(const Vehicle *v, int delta);
00057   static void CountEngine(const Vehicle *v, int delta);
00058   static void VehicleReachedProfitAge(const Vehicle *v);
00059 
00060   static void UpdateProfits();
00061   static void UpdateAfterLoad();
00062   static void UpdateAutoreplace(CompanyID company);
00063 };
00064 
00066 struct Group : GroupPool::PoolItem<&_group_pool> {
00067   char *name;                             
00068   OwnerByte owner;                        
00069   VehicleTypeByte vehicle_type;           
00070 
00071   bool replace_protection;                
00072   GroupStatistics statistics;             
00073 
00074   Group(CompanyID owner = INVALID_COMPANY);
00075   ~Group();
00076 };
00077 
00078 
00079 static inline bool IsDefaultGroupID(GroupID index)
00080 {
00081   return index == DEFAULT_GROUP;
00082 }
00083 
00089 static inline bool IsAllGroupID(GroupID id_g)
00090 {
00091   return id_g == ALL_GROUP;
00092 }
00093 
00094 #define FOR_ALL_GROUPS_FROM(var, start) FOR_ALL_ITEMS_FROM(Group, group_index, var, start)
00095 #define FOR_ALL_GROUPS(var) FOR_ALL_GROUPS_FROM(var, 0)
00096 
00100 static inline uint GetGroupArraySize()
00101 {
00102   const Group *g;
00103   uint num = 0;
00104 
00105   FOR_ALL_GROUPS(g) num++;
00106 
00107   return num;
00108 }
00109 
00110 uint GetGroupNumEngines(CompanyID company, GroupID id_g, EngineID id_e);
00111 
00112 void SetTrainGroupID(Train *v, GroupID grp);
00113 void UpdateTrainGroupID(Train *v);
00114 void RemoveVehicleFromGroup(const Vehicle *v);
00115 void RemoveAllGroupsForCompany(const CompanyID company);
00116 
00117 extern GroupID _new_group_id;
00118 
00119 #endif /* GROUP_H */