diff --git a/src/group_cmd.cpp b/src/group_cmd.cpp --- a/src/group_cmd.cpp +++ b/src/group_cmd.cpp @@ -55,6 +55,35 @@ void GroupStatistics::Clear() } /** + * Returns the GroupStatistics for a specific group. + * @param company Owner of the group. + * @param id_g GroupID of the group. + * @param type VehicleType of the vehicles in the group. + * @return Statistics for the group. + */ +/* static */ GroupStatistics &GroupStatistics::Get(CompanyID company, GroupID id_g, VehicleType type) +{ + if (Group::IsValidID(id_g)) { + Group *g = Group::Get(id_g); + assert(g->owner == company); + assert(g->vehicle_type == type); + return g->statistics; + } + + NOT_REACHED(); +} + +/** + * Returns the GroupStatistic for the group of a vehicle. + * @param v Vehicle. + * @return GroupStatistics for the group of the vehicle. + */ +/* static */ GroupStatistics &GroupStatistics::Get(const Vehicle *v) +{ + return GroupStatistics::Get(v->owner, v->group_id, v->type); +} + +/** * Update all caches after loading a game, changing NewGRF etc.. */ /* static */ void GroupStatistics::UpdateAfterLoad() @@ -89,10 +118,25 @@ void GroupStatistics::Clear() assert(v->owner == g->owner); g->statistics.num_engines[v->engine_type]++; - if (v->IsPrimaryVehicle()) g->statistics.num_vehicle++; + if (v->IsPrimaryVehicle()) GroupStatistics::CountVehicle(v, 1); } } +/** + * Update num_vehicle when adding or removing a vehicle. + * @param v Vehicle to count. + * @param delta +1 to add, -1 to remove. + */ +/* static */ void GroupStatistics::CountVehicle(const Vehicle *v, int delta) +{ + assert(delta == 1 || delta == -1); + if (!Group::IsValidID(v->group_id)) return; + + GroupStatistics &stats = GroupStatistics::Get(v); + + stats.num_vehicle += delta; +} + /** * Update the num engines of a groupID. Decrease the old one and increase the new one @@ -276,8 +320,7 @@ CommandCost CmdAddVehicleGroup(TileIndex if (v->owner != _current_company || !v->IsPrimaryVehicle()) return CMD_ERROR; if (flags & DC_EXEC) { - DecreaseGroupNumVehicle(v->group_id); - IncreaseGroupNumVehicle(new_g); + GroupStatistics::CountVehicle(v, -1); switch (v->type) { default: NOT_REACHED(); @@ -292,6 +335,8 @@ CommandCost CmdAddVehicleGroup(TileIndex break; } + GroupStatistics::CountVehicle(v, 1); + /* Update the Replace Vehicle Windows */ SetWindowDirty(WC_REPLACE_VEHICLE, v->type); InvalidateWindowData(GetWindowClassForVehicleType(v->type), VehicleListIdentifier(VL_GROUP_LIST, v->type, _current_company).Pack()); @@ -412,7 +457,7 @@ void RemoveVehicleFromGroup(const Vehicl { if (!v->IsPrimaryVehicle()) return; - if (!IsDefaultGroupID(v->group_id)) DecreaseGroupNumVehicle(v->group_id); + if (!IsDefaultGroupID(v->group_id)) GroupStatistics::CountVehicle(v, -1); }