From a8f56fe7b3c49fba98d20b36f5b24b00476da55e Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 25 Feb 2025 20:55:11 +0000 Subject: [PATCH] Add: Variable to test how many vehicles in a chain contain a specific badge. (#13594) --- src/newgrf_engine.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/newgrf_engine.cpp b/src/newgrf_engine.cpp index 196b3a93cb..ffdf33dae0 100644 --- a/src/newgrf_engine.cpp +++ b/src/newgrf_engine.cpp @@ -692,6 +692,23 @@ static uint32_t VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *objec default: return 0x00; } + case 0x64: { // Count consist's badge ID occurrence + if (v->type != VEH_TRAIN) return GetBadgeVariableResult(*object->ro.grffile, v->GetEngine()->badges, parameter); + + /* Look up badge index. */ + if (parameter >= std::size(object->ro.grffile->badge_list)) return UINT_MAX; + BadgeID index = object->ro.grffile->badge_list[parameter]; + + /* Count number of vehicles that contain this badge index. */ + uint count = 0; + for (; v != nullptr; v = v->Next()) { + const auto &badges = v->GetEngine()->badges; + if (std::ranges::find(badges, index) != std::end(badges)) count++; + } + + return count; + } + case 0x7A: return GetBadgeVariableResult(*object->ro.grffile, v->GetEngine()->badges, parameter); case 0xFE: