summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles Pigott <charlespigott@googlemail.com>2019-03-26 00:07:20 +0000
committerPeterN <peter@fuzzle.org>2019-03-27 06:58:48 +0000
commit8890436af1e9dbff7279dd3cf4c3659a3ad973d6 (patch)
tree72f5d48e8ffff58e43e7dfd0933f0908f09c759a
parenta393c9469545f4bd1e6e2fd1a593d35bb98f16ca (diff)
downloadopenttd-8890436af1e9dbff7279dd3cf4c3659a3ad973d6.tar.xz
Add #6189: Groups now count the total number of vehicles in subgroups (3298)
-rw-r--r--src/group.h3
-rw-r--r--src/group_cmd.cpp54
-rw-r--r--src/group_gui.cpp34
-rw-r--r--src/lang/english.txt2
4 files changed, 82 insertions, 11 deletions
diff --git a/src/group.h b/src/group.h
index ea4f7e130..8bb8d794f 100644
--- a/src/group.h
+++ b/src/group.h
@@ -100,6 +100,9 @@ static inline bool IsAllGroupID(GroupID id_g)
uint GetGroupNumEngines(CompanyID company, GroupID id_g, EngineID id_e);
+uint GetGroupNumVehicle(CompanyID company, GroupID id_g, VehicleType type);
+uint GetGroupNumProfitVehicle(CompanyID company, GroupID id_g, VehicleType type);
+Money GetGroupProfitLastYear(CompanyID company, GroupID id_g, VehicleType type);
void SetTrainGroupID(Train *v, GroupID grp);
void UpdateTrainGroupID(Train *v);
diff --git a/src/group_cmd.cpp b/src/group_cmd.cpp
index 3c9b3850a..bb86c6b34 100644
--- a/src/group_cmd.cpp
+++ b/src/group_cmd.cpp
@@ -808,6 +808,60 @@ uint GetGroupNumEngines(CompanyID company, GroupID id_g, EngineID id_e)
return count + GroupStatistics::Get(company, id_g, e->type).num_engines[id_e];
}
+/**
+ * Get the number of vehicles in the group with GroupID
+ * id_g and its sub-groups.
+ * @param company The company the group belongs to
+ * @param id_g The GroupID of the group used
+ * @param type The vehicle type of the group
+ * @return The number of vehicles in the group
+ */
+uint GetGroupNumVehicle(CompanyID company, GroupID id_g, VehicleType type)
+{
+ uint count = 0;
+ const Group *g;
+ FOR_ALL_GROUPS(g) {
+ if (g->parent == id_g) count += GetGroupNumVehicle(company, g->index, type);
+ }
+ return count + GroupStatistics::Get(company, id_g, type).num_vehicle;
+}
+
+/**
+ * Get the number of vehicles above profit minimum age in the group with GroupID
+ * id_g and its sub-groups.
+ * @param company The company the group belongs to
+ * @param id_g The GroupID of the group used
+ * @param type The vehicle type of the group
+ * @return The number of vehicles above profit minimum age in the group
+ */
+uint GetGroupNumProfitVehicle(CompanyID company, GroupID id_g, VehicleType type)
+{
+ uint count = 0;
+ const Group *g;
+ FOR_ALL_GROUPS(g) {
+ if (g->parent == id_g) count += GetGroupNumProfitVehicle(company, g->index, type);
+ }
+ return count + GroupStatistics::Get(company, id_g, type).num_profit_vehicle;
+}
+
+/**
+ * Get last year's profit for the group with GroupID
+ * id_g and its sub-groups.
+ * @param company The company the group belongs to
+ * @param id_g The GroupID of the group used
+ * @param type The vehicle type of the group
+ * @return Last year's profit for the group
+ */
+Money GetGroupProfitLastYear(CompanyID company, GroupID id_g, VehicleType type)
+{
+ Money sum = 0;
+ const Group *g;
+ FOR_ALL_GROUPS(g) {
+ if (g->parent == id_g) sum += GetGroupProfitLastYear(company, g->index, type);
+ }
+ return sum + GroupStatistics::Get(company, id_g, type).profit_last_year;
+}
+
void RemoveAllGroupsForCompany(const CompanyID company)
{
Group *g;
diff --git a/src/group_gui.cpp b/src/group_gui.cpp
index ca0b194f3..97c310e6f 100644
--- a/src/group_gui.cpp
+++ b/src/group_gui.cpp
@@ -213,8 +213,10 @@ private:
}
this->tiny_step_height = max(this->tiny_step_height, this->column_size[VGC_PROFIT].height);
- SetDParamMaxValue(0, GroupStatistics::Get(this->vli.company, ALL_GROUP, this->vli.vtype).num_vehicle, 3, FS_SMALL);
- this->column_size[VGC_NUMBER] = GetStringBoundingBox(STR_TINY_COMMA);
+ int num_vehicle = GetGroupNumVehicle(this->vli.company, ALL_GROUP, this->vli.vtype);
+ SetDParamMaxValue(0, num_vehicle, 3, FS_SMALL);
+ SetDParamMaxValue(1, num_vehicle, 3, FS_SMALL);
+ this->column_size[VGC_NUMBER] = GetStringBoundingBox(STR_GROUP_COUNT_WITH_SUBGROUP);
this->tiny_step_height = max(this->tiny_step_height, this->column_size[VGC_NUMBER].height);
this->tiny_step_height += WD_MATRIX_TOP;
@@ -275,11 +277,13 @@ private:
/* draw the profit icon */
x = rtl ? x - 2 - this->column_size[VGC_PROFIT].width : x + 2 + this->column_size[VGC_AUTOREPLACE].width;
SpriteID spr;
- if (stats.num_profit_vehicle == 0) {
+ uint num_profit_vehicle = GetGroupNumProfitVehicle(this->vli.company, g_id, this->vli.vtype);
+ Money profit_last_year = GetGroupProfitLastYear(this->vli.company, g_id, this->vli.vtype);
+ if (num_profit_vehicle == 0) {
spr = SPR_PROFIT_NA;
- } else if (stats.profit_last_year < 0) {
+ } else if (profit_last_year < 0) {
spr = SPR_PROFIT_NEGATIVE;
- } else if (stats.profit_last_year < 10000 * stats.num_profit_vehicle) { // TODO magic number
+ } else if (profit_last_year < (Money) 10000 * num_profit_vehicle) { // TODO magic number
spr = SPR_PROFIT_SOME;
} else {
spr = SPR_PROFIT_LOT;
@@ -288,8 +292,16 @@ private:
/* draw the number of vehicles of the group */
x = rtl ? x - 2 - this->column_size[VGC_NUMBER].width : x + 2 + this->column_size[VGC_PROFIT].width;
- SetDParam(0, stats.num_vehicle);
- DrawString(x, x + this->column_size[VGC_NUMBER].width - 1, y + (this->tiny_step_height - this->column_size[VGC_NUMBER].height) / 2, STR_TINY_COMMA, colour, SA_RIGHT | SA_FORCE);
+ int num_vehicle_with_subgroups = GetGroupNumVehicle(this->vli.company, g_id, this->vli.vtype);
+ int num_vehicle = GroupStatistics::Get(this->vli.company, g_id, this->vli.vtype).num_vehicle;
+ if (IsAllGroupID(g_id) || IsDefaultGroupID(g_id) || num_vehicle_with_subgroups == num_vehicle) {
+ SetDParam(0, num_vehicle);
+ DrawString(x, x + this->column_size[VGC_NUMBER].width - 1, y + (this->tiny_step_height - this->column_size[VGC_NUMBER].height) / 2, STR_TINY_COMMA, colour, SA_RIGHT | SA_FORCE);
+ } else {
+ SetDParam(0, num_vehicle);
+ SetDParam(1, num_vehicle_with_subgroups - num_vehicle);
+ DrawString(x, x + this->column_size[VGC_NUMBER].width - 1, y + (this->tiny_step_height - this->column_size[VGC_NUMBER].height) / 2, STR_GROUP_COUNT_WITH_SUBGROUP, colour, SA_RIGHT | SA_FORCE);
+ }
}
/**
@@ -463,12 +475,12 @@ public:
SetDParam(2, this->vehicles.size());
SetDParam(3, this->vehicles.size());
} else {
- const Group *g = Group::Get(this->vli.index);
+ uint num_vehicle = GetGroupNumVehicle(this->vli.company, this->vli.index, this->vli.vtype);
SetDParam(0, STR_GROUP_NAME);
- SetDParam(1, g->index);
- SetDParam(2, g->statistics.num_vehicle);
- SetDParam(3, g->statistics.num_vehicle);
+ SetDParam(1, this->vli.index);
+ SetDParam(2, num_vehicle);
+ SetDParam(3, num_vehicle);
}
break;
}
diff --git a/src/lang/english.txt b/src/lang/english.txt
index 032801ae5..61fa2a91b 100644
--- a/src/lang/english.txt
+++ b/src/lang/english.txt
@@ -3437,6 +3437,8 @@ STR_GROUP_DEFAULT_ROAD_VEHICLES :Ungrouped road
STR_GROUP_DEFAULT_SHIPS :Ungrouped ships
STR_GROUP_DEFAULT_AIRCRAFTS :Ungrouped aircraft
+STR_GROUP_COUNT_WITH_SUBGROUP :{TINY_FONT}{COMMA} (+{COMMA})
+
STR_GROUPS_CLICK_ON_GROUP_FOR_TOOLTIP :{BLACK}Groups - click on a group to list all vehicles of this group. Drag and drop groups to arrange hierarchy.
STR_GROUP_CREATE_TOOLTIP :{BLACK}Click to create a group
STR_GROUP_DELETE_TOOLTIP :{BLACK}Delete the selected group