diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index a4730d07f1..aae093c7cf 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -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 */ diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 050b498b75..ece52a4a6f 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -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 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"); + } +}