Add console command to dump vehicle stats
This commit is contained in:
@@ -1968,6 +1968,20 @@ DEF_CONSOLE_CMD(ConDumpCpdpStats)
|
||||
return true;
|
||||
}
|
||||
|
||||
DEF_CONSOLE_CMD(ConVehicleStats)
|
||||
{
|
||||
if (argc == 0) {
|
||||
IConsoleHelp("Dump vehicle stats.");
|
||||
return true;
|
||||
}
|
||||
|
||||
extern void DumpVehicleStats(char *buffer, const char *last);
|
||||
char buffer[32768];
|
||||
DumpVehicleStats(buffer, lastof(buffer));
|
||||
PrintLineByLine(buffer);
|
||||
return true;
|
||||
}
|
||||
|
||||
DEF_CONSOLE_CMD(ConCheckCaches)
|
||||
{
|
||||
if (argc == 0) {
|
||||
@@ -2238,6 +2252,7 @@ void IConsoleStdLibRegister()
|
||||
IConsoleCmdRegister("dump_command_log", ConDumpCommandLog, nullptr, true);
|
||||
IConsoleCmdRegister("dump_inflation", ConDumpInflation, nullptr, true);
|
||||
IConsoleCmdRegister("dump_cpdp_stats", ConDumpCpdpStats, nullptr, true);
|
||||
IConsoleCmdRegister("dump_veh_stats", ConVehicleStats, nullptr, true);
|
||||
IConsoleCmdRegister("check_caches", ConCheckCaches, nullptr, true);
|
||||
|
||||
/* NewGRF development stuff */
|
||||
|
@@ -3969,3 +3969,52 @@ void GetVehicleSet(VehicleSet &set, Vehicle *v, uint8 num_vehicles)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DumpVehicleStats(char *buffer, const char *last)
|
||||
{
|
||||
struct vtypestats {
|
||||
uint count[2] = { 0, 0 };
|
||||
|
||||
bool IsEmpty() const { return (count[0] | count[1]) == 0; }
|
||||
};
|
||||
struct cstats {
|
||||
vtypestats vstats[VEH_END];
|
||||
vtypestats virt_train;
|
||||
vtypestats template_train;
|
||||
};
|
||||
std::map<OwnerByte, cstats> cstatmap;
|
||||
|
||||
Vehicle *v;
|
||||
FOR_ALL_VEHICLES(v) {
|
||||
cstats &cs = cstatmap[v->owner];
|
||||
vtypestats &vs = ((v->type == VEH_TRAIN) && Train::From(v)->IsVirtual()) ? cs.virt_train : cs.vstats[v->type];
|
||||
vs.count[v->Previous() != nullptr ? 1 : 0]++;
|
||||
}
|
||||
|
||||
const TemplateVehicle *tv;
|
||||
FOR_ALL_TEMPLATES(tv) {
|
||||
cstats &cs = cstatmap[tv->owner];
|
||||
cs.template_train.count[tv->Prev() != nullptr ? 1 : 0]++;
|
||||
}
|
||||
for (auto &it : cstatmap) {
|
||||
buffer += seprintf(buffer, last, "%u: ", (uint) it.first);
|
||||
SetDParam(0, it.first);
|
||||
buffer = GetString(buffer, STR_COMPANY_NAME, last);
|
||||
buffer += seprintf(buffer, last, "\n");
|
||||
|
||||
auto line = [&](vtypestats &vs, const char *type) {
|
||||
if (vs.count[0] || vs.count[1]) {
|
||||
buffer += seprintf(buffer, last, " %10s: primary: %5u, secondary: %5u\n", type, vs.count[0], vs.count[1]);
|
||||
}
|
||||
};
|
||||
line(it.second.vstats[VEH_TRAIN], "train");
|
||||
line(it.second.vstats[VEH_ROAD], "road");
|
||||
line(it.second.vstats[VEH_SHIP], "ship");
|
||||
line(it.second.vstats[VEH_AIRCRAFT], "aircraft");
|
||||
line(it.second.vstats[VEH_EFFECT], "effect");
|
||||
line(it.second.vstats[VEH_DISASTER], "disaster");
|
||||
line(it.second.virt_train, "virt train");
|
||||
line(it.second.template_train, "tmpl train");
|
||||
buffer += seprintf(buffer, last, "\n");
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user