diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index a765aea2d6bd..f1907b3f340d 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -3676,8 +3676,7 @@ STR_6484 :See-Through vegetation toggle STR_6485 :See-Through vehicles toggle STR_6486 :See-Through guests toggle STR_6487 :See-Through staff toggle -STR_6488 :Remove queue line cap -STR_6489 :This cheat removes the normal cap of 1000 peeps on ride queue lines +STR_6488 :{RED}Guests are complaining about the length of the queues in your park.{NEWLINE}Consider shortening problematic queues, or increase the ride’s throughput. ############# # Scenarios # diff --git a/distribution/changelog.txt b/distribution/changelog.txt index 17ded0285b67..bf001c40c445 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -23,7 +23,6 @@ - Feature: [#16806] Parkobj can load sprites from RCT image archives. - Feature: [#16831] Allow ternary colours for small and large scenery objects. - Feature: [#16872] [Plugin] Add support for custom images. -- Feature: [#16855] Added new cheat to remove the cap on queue lengths. - Improved: [#3517] Cheats are now saved with the park. - Improved: [#10150] Ride stations are now properly checked if they’re sheltered. - Improved: [#10664, #16072] Visibility status can be modified directly in the Tile Inspector's list. @@ -36,6 +35,7 @@ - Improved: [#16408] Improve --version cli option to report more compatibility information. - Improved: [#16740] Allow staff patrol areas to be defined with individual tiles rather than groups of 4x4. - Improved: [#16764] [Plugin] Add hook 'map.save', called before the map is about is saved. +- Improved: [#16925] The queue length of 1000 guests is lifted, and a warning for too long queues is added instead. - Change: [#14484] Make the Heartline Twister coaster ratings a little bit less hateful. - Change: [#16077] When importing SV6 files, the RCT1 land types are only added when they were actually used. - Change: [#16424] Following an entity in the title sequence no longer toggles underground view when it's underground. diff --git a/src/openrct2-ui/windows/Cheats.cpp b/src/openrct2-ui/windows/Cheats.cpp index d2e5cf4eeeb5..293340ba3888 100644 --- a/src/openrct2-ui/windows/Cheats.cpp +++ b/src/openrct2-ui/windows/Cheats.cpp @@ -166,7 +166,6 @@ enum WindowCheatsWidgetIdx WIDX_DISABLE_BRAKES_FAILURE, WIDX_DISABLE_ALL_BREAKDOWNS, WIDX_DISABLE_RIDE_VALUE_AGING, - WIDX_NO_CAP_ON_QUEUE_LENGTH, WIDX_TRACK_PIECES_GROUP, WIDX_ENABLE_ARBITRARY_RIDE_TYPE_CHANGES, WIDX_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES, @@ -298,18 +297,17 @@ static rct_widget window_cheats_rides_widgets[] = MakeWidget({ 11, 153}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_ENABLE_ALL_DRAWABLE_TRACK_PIECES, STR_CHEAT_ENABLE_ALL_DRAWABLE_TRACK_PIECES_TIP ), // Show all drawable track pieces MakeWidget({ 11, 174}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_ENABLE_CHAIN_LIFT_ON_ALL_TRACK, STR_CHEAT_ENABLE_CHAIN_LIFT_ON_ALL_TRACK_TIP ), // Enable chain lift on all track MakeWidget({ 11, 195}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_ALLOW_TRACK_PLACE_INVALID_HEIGHTS, STR_CHEAT_ALLOW_TRACK_PLACE_INVALID_HEIGHTS_TIP), // Allow track place at invalid heights - MakeWidget({ 5, 221}, {238, 143}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_CHEAT_GROUP_OPERATION ), // Operation group + MakeWidget({ 5, 221}, {238, 122}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_CHEAT_GROUP_OPERATION ), // Construction group MakeWidget({ 11, 237}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_SHOW_ALL_OPERATING_MODES ), // Show all operating modes MakeWidget({ 11, 258}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_UNLOCK_OPERATING_LIMITS, STR_CHEAT_UNLOCK_OPERATING_LIMITS_TIP ), // 410 km/h lift hill etc. MakeWidget({ 11, 279}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_DISABLE_BRAKES_FAILURE, STR_CHEAT_DISABLE_BRAKES_FAILURE_TIP ), // Disable brakes failure MakeWidget({ 11, 300}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_DISABLE_BREAKDOWNS, STR_CHEAT_DISABLE_BREAKDOWNS_TIP ), // Disable all breakdowns MakeWidget({ 11, 321}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_DISABLE_RIDE_VALUE_AGING, STR_CHEAT_DISABLE_RIDE_VALUE_AGING_TIP ), // Disable ride ageing - MakeWidget({ 11, 342}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_NO_CAP_ON_QUEUE_LENGTH, STR_CHEAT_NO_CAP_ON_QUEUE_LENGTH_TOOLTIP ), // No cap on ride queue lengths - MakeWidget({ 5, 368}, {238, 101}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_CHEAT_GROUP_AVAILABILITY ), // Availability group - MakeWidget({ 11, 384}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_ALLOW_ARBITRARY_RIDE_TYPE_CHANGES, STR_CHEAT_ALLOW_ARBITRARY_RIDE_TYPE_CHANGES_TIP), // Allow arbitrary ride type changes - MakeWidget({ 11, 405}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES ), // Show vehicles from other track types - MakeWidget({ 11, 426}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_DISABLE_TRAIN_LENGTH_LIMIT, STR_CHEAT_DISABLE_TRAIN_LENGTH_LIMIT_TIP ), // Disable train length limits - MakeWidget({ 11, 447}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_IGNORE_RESEARCH_STATUS, STR_CHEAT_IGNORE_RESEARCH_STATUS_TIP ), // Ignore Research Status + MakeWidget({ 5, 347}, {238, 101}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_CHEAT_GROUP_AVAILABILITY ), // Construction group + MakeWidget({ 11, 363}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_ALLOW_ARBITRARY_RIDE_TYPE_CHANGES, STR_CHEAT_ALLOW_ARBITRARY_RIDE_TYPE_CHANGES_TIP), // Allow arbitrary ride type changes + MakeWidget({ 11, 384}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES ), // Show vehicles from other track types + MakeWidget({ 11, 405}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_DISABLE_TRAIN_LENGTH_LIMIT, STR_CHEAT_DISABLE_TRAIN_LENGTH_LIMIT_TIP ), // Disable train length limits + MakeWidget({ 11, 426}, CHEAT_CHECK, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_CHEAT_IGNORE_RESEARCH_STATUS, STR_CHEAT_IGNORE_RESEARCH_STATUS_TIP ), // Ignore Research Status WIDGETS_END, }; @@ -492,7 +490,6 @@ class CheatsWindow final : public Window SetCheckboxValue(WIDX_IGNORE_RESEARCH_STATUS, gCheatsIgnoreResearchStatus); SetCheckboxValue(WIDX_ENABLE_ALL_DRAWABLE_TRACK_PIECES, gCheatsEnableAllDrawableTrackPieces); SetCheckboxValue(WIDX_ALLOW_TRACK_PLACE_INVALID_HEIGHTS, gCheatsAllowTrackPlaceInvalidHeights); - SetCheckboxValue(WIDX_NO_CAP_ON_QUEUE_LENGTH, gCheatsNoCapOnQueueLength); break; } @@ -1085,9 +1082,6 @@ class CheatsWindow final : public Window case WIDX_DISABLE_RIDE_VALUE_AGING: CheatsSet(CheatType::DisableRideValueAging, !gCheatsDisableRideValueAging); break; - case WIDX_NO_CAP_ON_QUEUE_LENGTH: - CheatsSet(CheatType::NoCapOnQueueLength, !gCheatsNoCapOnQueueLength); - break; case WIDX_IGNORE_RESEARCH_STATUS: CheatsSet(CheatType::IgnoreResearchStatus, !gCheatsIgnoreResearchStatus); break; diff --git a/src/openrct2/Cheats.cpp b/src/openrct2/Cheats.cpp index ebba00b2fc7d..35c56b716b13 100644 --- a/src/openrct2/Cheats.cpp +++ b/src/openrct2/Cheats.cpp @@ -52,7 +52,6 @@ bool gCheatsDisableRideValueAging = false; bool gCheatsIgnoreResearchStatus = false; bool gCheatsEnableAllDrawableTrackPieces = false; bool gCheatsAllowTrackPlaceInvalidHeights = false; -bool gCheatsNoCapOnQueueLength = false; void CheatsReset() { @@ -78,7 +77,6 @@ void CheatsReset() gCheatsIgnoreResearchStatus = false; gCheatsEnableAllDrawableTrackPieces = false; gCheatsAllowTrackPlaceInvalidHeights = false; - gCheatsNoCapOnQueueLength = false; } void CheatsSet(CheatType cheatType, int32_t param1 /* = 0*/, int32_t param2 /* = 0*/) @@ -127,7 +125,6 @@ void CheatsSerialise(DataSerialiser& ds) CheatEntrySerialise(ds, CheatType::IgnoreResearchStatus, gCheatsIgnoreResearchStatus, count); CheatEntrySerialise(ds, CheatType::EnableAllDrawableTrackPieces, gCheatsEnableAllDrawableTrackPieces, count); CheatEntrySerialise(ds, CheatType::AllowTrackPlaceInvalidHeights, gCheatsAllowTrackPlaceInvalidHeights, count); - CheatEntrySerialise(ds, CheatType::NoCapOnQueueLength, gCheatsNoCapOnQueueLength, count); // Remember current position and update count. uint64_t endOffset = stream.GetPosition(); @@ -147,6 +144,8 @@ void CheatsSerialise(DataSerialiser& ds) int32_t type = 0; ds << type; + static bool dummyBool; + switch (static_cast(type)) { case CheatType::SandboxMode: @@ -215,8 +214,8 @@ void CheatsSerialise(DataSerialiser& ds) case CheatType::AllowTrackPlaceInvalidHeights: ds << gCheatsAllowTrackPlaceInvalidHeights; break; - case CheatType::NoCapOnQueueLength: - ds << gCheatsNoCapOnQueueLength; + case CheatType::NoCapOnQueueLengthDummy: + ds << dummyBool; break; default: break; @@ -321,8 +320,6 @@ const char* CheatsGetName(CheatType cheatType) return language_get_string(STR_CHEAT_ENABLE_ALL_DRAWABLE_TRACK_PIECES); case CheatType::AllowTrackPlaceInvalidHeights: return language_get_string(STR_CHEAT_ALLOW_TRACK_PLACE_INVALID_HEIGHTS); - case CheatType::NoCapOnQueueLength: - return language_get_string(STR_CHEAT_NO_CAP_ON_QUEUE_LENGTH); default: return "Unknown Cheat"; } diff --git a/src/openrct2/Cheats.h b/src/openrct2/Cheats.h index f13ddbc3ccb5..1e5530927cca 100644 --- a/src/openrct2/Cheats.h +++ b/src/openrct2/Cheats.h @@ -33,7 +33,6 @@ extern bool gCheatsAllowArbitraryRideTypeChanges; extern bool gCheatsIgnoreResearchStatus; extern bool gCheatsEnableAllDrawableTrackPieces; extern bool gCheatsAllowTrackPlaceInvalidHeights; -extern bool gCheatsNoCapOnQueueLength; enum class CheatType : int32_t { @@ -86,7 +85,7 @@ enum class CheatType : int32_t CreateDucks, RemoveDucks, AllowTrackPlaceInvalidHeights, - NoCapOnQueueLength, + NoCapOnQueueLengthDummy, // Removed; this dummy exists only for deserialisation parks that had it saved Count, }; diff --git a/src/openrct2/actions/SetCheatAction.cpp b/src/openrct2/actions/SetCheatAction.cpp index 9e000510c4a3..5abbb93b6498 100644 --- a/src/openrct2/actions/SetCheatAction.cpp +++ b/src/openrct2/actions/SetCheatAction.cpp @@ -240,9 +240,6 @@ GameActions::Result SetCheatAction::Execute() const case CheatType::AllowTrackPlaceInvalidHeights: gCheatsAllowTrackPlaceInvalidHeights = _param1 != 0; break; - case CheatType::NoCapOnQueueLength: - gCheatsNoCapOnQueueLength = _param1 != 0; - break; default: { log_error("Unabled cheat: %d", _cheatType.id); @@ -308,8 +305,6 @@ ParametersRange SetCheatAction::GetParameterRange(CheatType cheatType) const [[fallthrough]]; case CheatType::EnableAllDrawableTrackPieces: [[fallthrough]]; - case CheatType::NoCapOnQueueLength: - [[fallthrough]]; case CheatType::OpenClosePark: return { { 0, 1 }, { 0, 0 } }; case CheatType::AddMoney: diff --git a/src/openrct2/entity/Guest.cpp b/src/openrct2/entity/Guest.cpp index eba306bbaeae..39f32a88a0b4 100644 --- a/src/openrct2/entity/Guest.cpp +++ b/src/openrct2/entity/Guest.cpp @@ -1947,12 +1947,6 @@ bool Guest::ShouldGoOnRide(Ride* ride, StationIndex entranceNum, bool atQueue, b if (peepAtRide) { auto& station = ride->GetStation(entranceNum); - // Peeps won't join a queue that has 1000 peeps already in it. - if (station.QueueLength >= MAX_RIDE_QUEUE_LENGTH && !gCheatsNoCapOnQueueLength) - { - peep_tried_to_enter_full_queue(this, ride); - return false; - } // Rides without queues can only have one peep waiting at a time. if (!atQueue) diff --git a/src/openrct2/entity/Guest.h b/src/openrct2/entity/Guest.h index e84efd381a75..d8831e215628 100644 --- a/src/openrct2/entity/Guest.h +++ b/src/openrct2/entity/Guest.h @@ -25,6 +25,7 @@ #define PEEP_VANDALISM_WARNING_THRESHOLD 15 #define PEEP_NOEXIT_WARNING_THRESHOLD 8 #define PEEP_LOST_WARNING_THRESHOLD 8 +#define PEEP_TOO_LONG_QUEUE_THRESHOLD 25 #define PEEP_MAX_HAPPINESS 255 #define PEEP_MAX_HUNGER 255 diff --git a/src/openrct2/entity/Peep.cpp b/src/openrct2/entity/Peep.cpp index cfca4da97a4d..f95c8681044e 100644 --- a/src/openrct2/entity/Peep.cpp +++ b/src/openrct2/entity/Peep.cpp @@ -1008,153 +1008,191 @@ void Peep::Update() void peep_problem_warnings_update() { Ride* ride; - uint32_t hunger_counter = 0, lost_counter = 0, noexit_counter = 0, thirst_counter = 0, litter_counter = 0, - disgust_counter = 0, toilet_counter = 0, vandalism_counter = 0; - uint8_t* warning_throttle = gPeepWarningThrottle; + uint32_t hungerCounter = 0, lostCounter = 0, noexitCounter = 0, thirstCounter = 0, litterCounter = 0, disgustCounter = 0, + toiletCounter = 0, vandalismCounter = 0; + uint8_t* warningThrottle = gPeepWarningThrottle; + + int32_t inQueueCounter = 0; + int32_t tooLongQueueCounter = 0; + std::map queueComplainingGuestsMap; for (auto peep : EntityList()) { - if (peep->OutsideOfPark || peep->Thoughts[0].freshness > 5) + if (peep->OutsideOfPark) + continue; + + if (peep->State == PeepState::Queuing || peep->State == PeepState::QueuingFront) + inQueueCounter++; + + if (peep->Thoughts[0].freshness > 5) continue; switch (peep->Thoughts[0].type) { case PeepThoughtType::Lost: // 0x10 - lost_counter++; + lostCounter++; break; case PeepThoughtType::Hungry: // 0x14 if (peep->GuestHeadingToRideId.IsNull()) { - hunger_counter++; + hungerCounter++; break; } ride = get_ride(peep->GuestHeadingToRideId); if (ride != nullptr && !ride->GetRideTypeDescriptor().HasFlag(RIDE_TYPE_FLAG_FLAT_RIDE)) - hunger_counter++; + hungerCounter++; break; case PeepThoughtType::Thirsty: if (peep->GuestHeadingToRideId.IsNull()) { - thirst_counter++; + thirstCounter++; break; } ride = get_ride(peep->GuestHeadingToRideId); if (ride != nullptr && !ride->GetRideTypeDescriptor().HasFlag(RIDE_TYPE_FLAG_SELLS_DRINKS)) - thirst_counter++; + thirstCounter++; break; case PeepThoughtType::Toilet: if (peep->GuestHeadingToRideId.IsNull()) { - toilet_counter++; + toiletCounter++; break; } ride = get_ride(peep->GuestHeadingToRideId); if (ride != nullptr && !ride->GetRideTypeDescriptor().HasFlag(RIDE_TYPE_FLAG_IS_TOILET)) - toilet_counter++; + toiletCounter++; break; case PeepThoughtType::BadLitter: // 0x1a - litter_counter++; + litterCounter++; break; case PeepThoughtType::CantFindExit: // 0x1b - noexit_counter++; + noexitCounter++; break; case PeepThoughtType::PathDisgusting: // 0x1f - disgust_counter++; + disgustCounter++; break; case PeepThoughtType::Vandalism: // 0x21 - vandalism_counter++; + vandalismCounter++; + break; + case PeepThoughtType::QueuingAges: + tooLongQueueCounter++; + queueComplainingGuestsMap[peep->Thoughts[0].rideId]++; break; default: break; } } // could maybe be packed into a loop, would lose a lot of clarity though - if (warning_throttle[0]) - --warning_throttle[0]; - else if (hunger_counter >= PEEP_HUNGER_WARNING_THRESHOLD && hunger_counter >= gNumGuestsInPark / 16) + if (warningThrottle[0]) + --warningThrottle[0]; + else if (hungerCounter >= PEEP_HUNGER_WARNING_THRESHOLD && hungerCounter >= gNumGuestsInPark / 16) { - warning_throttle[0] = 4; + warningThrottle[0] = 4; if (gConfigNotifications.guest_warnings) { - News::AddItemToQueue(News::ItemType::Peeps, STR_PEEPS_ARE_HUNGRY, 20, {}); + constexpr auto thoughtId = static_cast(PeepThoughtType::Hungry); + News::AddItemToQueue(News::ItemType::Peeps, STR_PEEPS_ARE_HUNGRY, thoughtId, {}); } } - if (warning_throttle[1]) - --warning_throttle[1]; - else if (thirst_counter >= PEEP_THIRST_WARNING_THRESHOLD && thirst_counter >= gNumGuestsInPark / 16) + if (warningThrottle[1]) + --warningThrottle[1]; + else if (thirstCounter >= PEEP_THIRST_WARNING_THRESHOLD && thirstCounter >= gNumGuestsInPark / 16) { - warning_throttle[1] = 4; + warningThrottle[1] = 4; if (gConfigNotifications.guest_warnings) { - News::AddItemToQueue(News::ItemType::Peeps, STR_PEEPS_ARE_THIRSTY, 21, {}); + constexpr auto thoughtId = static_cast(PeepThoughtType::Thirsty); + News::AddItemToQueue(News::ItemType::Peeps, STR_PEEPS_ARE_THIRSTY, thoughtId, {}); } } - if (warning_throttle[2]) - --warning_throttle[2]; - else if (toilet_counter >= PEEP_TOILET_WARNING_THRESHOLD && toilet_counter >= gNumGuestsInPark / 16) + if (warningThrottle[2]) + --warningThrottle[2]; + else if (toiletCounter >= PEEP_TOILET_WARNING_THRESHOLD && toiletCounter >= gNumGuestsInPark / 16) { - warning_throttle[2] = 4; + warningThrottle[2] = 4; if (gConfigNotifications.guest_warnings) { - News::AddItemToQueue(News::ItemType::Peeps, STR_PEEPS_CANT_FIND_TOILET, 22, {}); + constexpr auto thoughtId = static_cast(PeepThoughtType::Toilet); + News::AddItemToQueue(News::ItemType::Peeps, STR_PEEPS_CANT_FIND_TOILET, thoughtId, {}); } } - if (warning_throttle[3]) - --warning_throttle[3]; - else if (litter_counter >= PEEP_LITTER_WARNING_THRESHOLD && litter_counter >= gNumGuestsInPark / 32) + if (warningThrottle[3]) + --warningThrottle[3]; + else if (litterCounter >= PEEP_LITTER_WARNING_THRESHOLD && litterCounter >= gNumGuestsInPark / 32) { - warning_throttle[3] = 4; + warningThrottle[3] = 4; if (gConfigNotifications.guest_warnings) { - News::AddItemToQueue(News::ItemType::Peeps, STR_PEEPS_DISLIKE_LITTER, 26, {}); + constexpr auto thoughtId = static_cast(PeepThoughtType::BadLitter); + News::AddItemToQueue(News::ItemType::Peeps, STR_PEEPS_DISLIKE_LITTER, thoughtId, {}); } } - if (warning_throttle[4]) - --warning_throttle[4]; - else if (disgust_counter >= PEEP_DISGUST_WARNING_THRESHOLD && disgust_counter >= gNumGuestsInPark / 32) + if (warningThrottle[4]) + --warningThrottle[4]; + else if (disgustCounter >= PEEP_DISGUST_WARNING_THRESHOLD && disgustCounter >= gNumGuestsInPark / 32) { - warning_throttle[4] = 4; + warningThrottle[4] = 4; if (gConfigNotifications.guest_warnings) { - News::AddItemToQueue(News::ItemType::Peeps, STR_PEEPS_DISGUSTED_BY_PATHS, 31, {}); + constexpr auto thoughtId = static_cast(PeepThoughtType::PathDisgusting); + News::AddItemToQueue(News::ItemType::Peeps, STR_PEEPS_DISGUSTED_BY_PATHS, thoughtId, {}); } } - if (warning_throttle[5]) - --warning_throttle[5]; - else if (vandalism_counter >= PEEP_VANDALISM_WARNING_THRESHOLD && vandalism_counter >= gNumGuestsInPark / 32) + if (warningThrottle[5]) + --warningThrottle[5]; + else if (vandalismCounter >= PEEP_VANDALISM_WARNING_THRESHOLD && vandalismCounter >= gNumGuestsInPark / 32) { - warning_throttle[5] = 4; + warningThrottle[5] = 4; if (gConfigNotifications.guest_warnings) { - News::AddItemToQueue(News::ItemType::Peeps, STR_PEEPS_DISLIKE_VANDALISM, 33, {}); + constexpr auto thoughtId = static_cast(PeepThoughtType::Vandalism); + News::AddItemToQueue(News::ItemType::Peeps, STR_PEEPS_DISLIKE_VANDALISM, thoughtId, {}); } } - if (warning_throttle[6]) - --warning_throttle[6]; - else if (noexit_counter >= PEEP_NOEXIT_WARNING_THRESHOLD) + if (warningThrottle[6]) + --warningThrottle[6]; + else if (noexitCounter >= PEEP_NOEXIT_WARNING_THRESHOLD) { - warning_throttle[6] = 4; + warningThrottle[6] = 4; if (gConfigNotifications.guest_warnings) { - News::AddItemToQueue(News::ItemType::Peeps, STR_PEEPS_GETTING_LOST_OR_STUCK, 27, {}); + constexpr auto thoughtId = static_cast(PeepThoughtType::CantFindExit); + News::AddItemToQueue(News::ItemType::Peeps, STR_PEEPS_GETTING_LOST_OR_STUCK, thoughtId, {}); } } - else if (lost_counter >= PEEP_LOST_WARNING_THRESHOLD) + else if (lostCounter >= PEEP_LOST_WARNING_THRESHOLD) { - warning_throttle[6] = 4; + warningThrottle[6] = 4; + if (gConfigNotifications.guest_warnings) + { + constexpr auto thoughtId = static_cast(PeepThoughtType::Lost); + News::AddItemToQueue(News::ItemType::Peeps, STR_PEEPS_GETTING_LOST_OR_STUCK, thoughtId, {}); + } + } + + if (warningThrottle[7]) + --warningThrottle[7]; + else if (tooLongQueueCounter > PEEP_TOO_LONG_QUEUE_THRESHOLD && tooLongQueueCounter > inQueueCounter / 20) + { // The amount of guests complaining about queue duration is at least 5% of the amount of queuing guests. + // This includes guests who are no longer queuing. + warningThrottle[7] = 4; if (gConfigNotifications.guest_warnings) { - News::AddItemToQueue(News::ItemType::Peeps, STR_PEEPS_GETTING_LOST_OR_STUCK, 16, {}); + auto rideWithMostQueueComplaints = std::max_element( + queueComplainingGuestsMap.begin(), queueComplainingGuestsMap.end(), + [](auto& lhs, auto& rhs) { return lhs.second < rhs.second; }); + auto rideId = rideWithMostQueueComplaints->first.ToUnderlying(); + News::AddItemToQueue(News::ItemType::Ride, STR_PEEPS_COMPLAINING_ABOUT_QUEUE_LENGTH_WARNING, rideId, {}); } } } diff --git a/src/openrct2/localisation/StringIds.h b/src/openrct2/localisation/StringIds.h index a4f0570379b6..77af76400ac4 100644 --- a/src/openrct2/localisation/StringIds.h +++ b/src/openrct2/localisation/StringIds.h @@ -3946,8 +3946,7 @@ enum : uint16_t STR_SHORTCUT_SEE_THROUGH_GUESTS_TOGGLE = 6486, STR_SHORTCUT_SEE_THROUGH_STAFF_TOGGLE = 6487, - STR_CHEAT_NO_CAP_ON_QUEUE_LENGTH = 6488, - STR_CHEAT_NO_CAP_ON_QUEUE_LENGTH_TOOLTIP = 6489, + STR_PEEPS_COMPLAINING_ABOUT_QUEUE_LENGTH_WARNING = 6488, // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working /* MAX_STR_COUNT = 32768 */ // MAX_STR_COUNT - upper limit for number of strings, not the current count strings diff --git a/src/openrct2/ride/Ride.h b/src/openrct2/ride/Ride.h index ff8b4dc81e2d..53854975cfc2 100644 --- a/src/openrct2/ride/Ride.h +++ b/src/openrct2/ride/Ride.h @@ -879,8 +879,6 @@ enum constexpr uint32_t CONSTRUCTION_LIFT_HILL_SELECTED = 1 << 0; constexpr uint32_t CONSTRUCTION_INVERTED_TRACK_SELECTED = 1 << 1; -constexpr uint16_t MAX_RIDE_QUEUE_LENGTH = 1000; - Ride* get_ride(RideId index); struct RideManager