Add console command to dump vehicle stats

pull/91/head
Jonathan G Rennison 5 years ago
parent 13291899cd
commit 1e51d7af2f

@ -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");
}
}

Loading…
Cancel
Save