From 6fff2079f9c12f75d4a92d82c3f189f5cdadfe48 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sat, 20 Jul 2019 19:43:02 +0100 Subject: [PATCH] Refactor ride name to dynamic args and std::string --- src/openrct2-ui/windows/Guest.cpp | 18 +- src/openrct2-ui/windows/Ride.cpp | 19 +- src/openrct2-ui/windows/RideList.cpp | 3 +- src/openrct2/Editor.cpp | 10 - src/openrct2/actions/RideCreateAction.hpp | 11 +- src/openrct2/actions/RideSetName.hpp | 6 +- src/openrct2/actions/RideSetStatus.hpp | 6 +- src/openrct2/core/DataSerialiserTraits.h | 9 +- src/openrct2/interface/InteractiveConsole.cpp | 5 +- src/openrct2/management/Marketing.cpp | 3 +- .../paint/tile_element/Paint.Entrance.cpp | 3 +- .../paint/tile_element/Paint.LargeScenery.cpp | 15 +- .../paint/tile_element/Paint.Path.cpp | 3 +- .../paint/tile_element/Paint.Wall.cpp | 8 +- src/openrct2/peep/Guest.cpp | 9 +- src/openrct2/peep/Peep.cpp | 21 +- src/openrct2/rct1/S4Importer.cpp | 5 +- src/openrct2/ride/Ride.cpp | 196 +++++++----------- src/openrct2/ride/Ride.h | 18 +- src/openrct2/ride/TrackDesignSave.cpp | 6 +- src/openrct2/ride/Vehicle.cpp | 9 +- src/openrct2/world/Map.cpp | 3 +- 22 files changed, 154 insertions(+), 232 deletions(-) diff --git a/src/openrct2-ui/windows/Guest.cpp b/src/openrct2-ui/windows/Guest.cpp index bf24b9d9e7..9b9669feeb 100644 --- a/src/openrct2-ui/windows/Guest.cpp +++ b/src/openrct2-ui/windows/Guest.cpp @@ -1749,8 +1749,7 @@ void window_guest_rides_scroll_paint(rct_window* w, rct_drawpixelinfo* dpi, int3 auto ride = get_ride(w->list_item_positions[list_index]); if (ride != nullptr) { - set_format_arg(0, rct_string_id, ride->name); - set_format_arg(2, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs); gfx_draw_string_left(dpi, stringId, gCommonFormatArgs, COLOUR_BLACK, 0, y - 1); } } @@ -1961,8 +1960,7 @@ static rct_string_id window_guest_inventory_format_item(Peep* peep, int32_t item break; case SHOP_ITEM_PHOTO: ride = get_ride(peep->photo1_ride_ref); - set_format_arg(6, rct_string_id, ride->name); - set_format_arg(8, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs + 6); break; case SHOP_ITEM_UMBRELLA: set_format_arg(0, uint32_t, SPRITE_ID_PALETTE_COLOUR_1(peep->umbrella_colour) | ShopItems[item].Image); @@ -1978,8 +1976,7 @@ static rct_string_id window_guest_inventory_format_item(Peep* peep, int32_t item case VOUCHER_TYPE_RIDE_FREE: ride = get_ride(peep->voucher_arguments); set_format_arg(6, rct_string_id, STR_PEEP_INVENTORY_VOUCHER_RIDE_FREE); - set_format_arg(8, rct_string_id, ride->name); - set_format_arg(10, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs + 8); break; case VOUCHER_TYPE_PARK_ENTRY_HALF_PRICE: set_format_arg(6, rct_string_id, STR_PEEP_INVENTORY_VOUCHER_PARK_ENTRY_HALF_PRICE); @@ -2000,18 +1997,15 @@ static rct_string_id window_guest_inventory_format_item(Peep* peep, int32_t item break; case SHOP_ITEM_PHOTO2: ride = get_ride(peep->photo2_ride_ref); - set_format_arg(6, rct_string_id, ride->name); - set_format_arg(8, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs + 6); break; case SHOP_ITEM_PHOTO3: ride = get_ride(peep->photo3_ride_ref); - set_format_arg(6, rct_string_id, ride->name); - set_format_arg(8, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs + 6); break; case SHOP_ITEM_PHOTO4: ride = get_ride(peep->photo4_ride_ref); - set_format_arg(6, rct_string_id, ride->name); - set_format_arg(8, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs + 6); break; } diff --git a/src/openrct2-ui/windows/Ride.cpp b/src/openrct2-ui/windows/Ride.cpp index 2f941ed953..491f0ae551 100644 --- a/src/openrct2-ui/windows/Ride.cpp +++ b/src/openrct2-ui/windows/Ride.cpp @@ -1974,13 +1974,13 @@ static void window_ride_init_viewport(rct_window* w) */ static void window_ride_rename(rct_window* w) { - Ride* ride; - - ride = get_ride(w->number); - set_format_arg(16, uint32_t, ride->name_arguments); - window_text_input_open( - w, WIDX_RENAME, STR_RIDE_ATTRACTION_NAME, STR_ENTER_NEW_NAME_FOR_THIS_RIDE_ATTRACTION, ride->name, ride->name_arguments, - 32); + auto ride = get_ride(w->number); + if (ride != nullptr) + { + auto rideName = ride->GetName(); + window_text_input_raw_open( + w, WIDX_RENAME, STR_RIDE_ATTRACTION_NAME, STR_ENTER_NEW_NAME_FOR_THIS_RIDE_ATTRACTION, rideName.c_str(), 32); + } } /** @@ -2286,8 +2286,9 @@ static void populate_vehicle_type_dropdown(Ride* ride) bool selectionShouldBeExpanded; int32_t rideTypeIterator, rideTypeIteratorMax; if (gCheatsShowVehiclesFromOtherTrackTypes - && !(ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE) || ride->type == RIDE_TYPE_MAZE - || ride->type == RIDE_TYPE_MINI_GOLF)) + && !( + ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE) || ride->type == RIDE_TYPE_MAZE + || ride->type == RIDE_TYPE_MINI_GOLF)) { selectionShouldBeExpanded = true; rideTypeIterator = 0; diff --git a/src/openrct2-ui/windows/RideList.cpp b/src/openrct2-ui/windows/RideList.cpp index 4c5f5491f3..d9450b735f 100644 --- a/src/openrct2-ui/windows/RideList.cpp +++ b/src/openrct2-ui/windows/RideList.cpp @@ -608,8 +608,7 @@ static void window_ride_list_scrollpaint(rct_window* w, rct_drawpixelinfo* dpi, ride = get_ride(w->list_item_positions[i]); // Ride name - set_format_arg(0, rct_string_id, ride->name); - set_format_arg(2, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs); gfx_draw_string_left_clipped(dpi, format, gCommonFormatArgs, COLOUR_BLACK, 0, y - 1, 159); // Ride information diff --git a/src/openrct2/Editor.cpp b/src/openrct2/Editor.cpp index d59f9ea86e..48001420a5 100644 --- a/src/openrct2/Editor.cpp +++ b/src/openrct2/Editor.cpp @@ -303,16 +303,6 @@ namespace Editor } } - // - { - int32_t i; - Ride* ride; - FOR_ALL_RIDES (i, ride) - { - user_string_free(ride->name); - } - } - ride_init_all(); // diff --git a/src/openrct2/actions/RideCreateAction.hpp b/src/openrct2/actions/RideCreateAction.hpp index 2c0e195428..759683d904 100644 --- a/src/openrct2/actions/RideCreateAction.hpp +++ b/src/openrct2/actions/RideCreateAction.hpp @@ -138,16 +138,7 @@ public: ride->subtype = rideEntryIndex; ride->SetColourPreset(_colour1); ride->overall_view.xy = RCT_XY8_UNDEFINED; - - // Ride name - if (rideEntryIndex == RIDE_ENTRY_INDEX_NULL) - { - ride_set_name_to_track_default(ride, rideEntry); - } - else - { - ride_set_name_to_default(ride, rideEntry); - } + ride->SetNameToDefault(); for (int32_t i = 0; i < MAX_STATIONS; i++) { diff --git a/src/openrct2/actions/RideSetName.hpp b/src/openrct2/actions/RideSetName.hpp index 076c32ce21..2872fe1e52 100644 --- a/src/openrct2/actions/RideSetName.hpp +++ b/src/openrct2/actions/RideSetName.hpp @@ -79,9 +79,6 @@ public: GameActionResult::Ptr Execute() const override { - rct_string_id newUserStringId = user_string_allocate( - USER_STRING_HIGH_ID_NUMBER | USER_STRING_DUPLICATION_PERMITTED, _name.c_str()); - Ride* ride = get_ride(_rideIndex); if (ride->type == RIDE_TYPE_NULL) { @@ -89,8 +86,7 @@ public: return std::make_unique(GA_ERROR::INVALID_PARAMETERS, STR_CANT_RENAME_RIDE_ATTRACTION, STR_NONE); } - user_string_free(ride->name); - ride->name = newUserStringId; + ride->custom_name = _name; scrolling_text_invalidate(); gfx_invalidate_screen(); diff --git a/src/openrct2/actions/RideSetStatus.hpp b/src/openrct2/actions/RideSetStatus.hpp index 66662bc996..3ed8a0888d 100644 --- a/src/openrct2/actions/RideSetStatus.hpp +++ b/src/openrct2/actions/RideSetStatus.hpp @@ -61,8 +61,7 @@ public: GameActionResult::Ptr res = std::make_unique(); Ride* ride = get_ride(_rideIndex); res->ErrorTitle = _StatusErrorTitles[_status]; - set_format_arg_on(res->ErrorMessageArgs.data(), 6, rct_string_id, ride->name); - set_format_arg_on(res->ErrorMessageArgs.data(), 8, uint32_t, ride->name_arguments); + ride->FormatNameTo(res->ErrorMessageArgs.data() + 6); if (_rideIndex >= MAX_RIDES || _rideIndex < 0) { @@ -110,8 +109,7 @@ public: Ride* ride = get_ride(_rideIndex); res->ErrorTitle = _StatusErrorTitles[_status]; - set_format_arg_on(res->ErrorMessageArgs.data(), 6, rct_string_id, ride->name); - set_format_arg_on(res->ErrorMessageArgs.data(), 8, uint32_t, ride->name_arguments); + ride->FormatNameTo(res->ErrorMessageArgs.data() + 6); if (ride->type == RIDE_TYPE_NULL) { diff --git a/src/openrct2/core/DataSerialiserTraits.h b/src/openrct2/core/DataSerialiserTraits.h index 7d16b0c847..f44389e675 100644 --- a/src/openrct2/core/DataSerialiserTraits.h +++ b/src/openrct2/core/DataSerialiserTraits.h @@ -190,14 +190,13 @@ template<> struct DataSerializerTraits stream->Write(rideId, strlen(rideId)); - Ride* ride = get_ride(val.id); - if (ride) + auto ride = get_ride(val.id); + if (ride != nullptr) { - char rideName[256] = {}; - format_string(rideName, 256, ride->name, &ride->name_arguments); + auto rideName = ride->GetName(); stream->Write(" \"", 2); - stream->Write(rideName, strlen(rideName)); + stream->Write(rideName.c_str(), rideName.size()); stream->Write("\"", 1); } } diff --git a/src/openrct2/interface/InteractiveConsole.cpp b/src/openrct2/interface/InteractiveConsole.cpp index f73a183f2e..de15f3f86d 100644 --- a/src/openrct2/interface/InteractiveConsole.cpp +++ b/src/openrct2/interface/InteractiveConsole.cpp @@ -141,11 +141,10 @@ static int32_t cc_rides(InteractiveConsole& console, const arguments_t& argv) int32_t i; FOR_ALL_RIDES (i, ride) { - char name[128]; - format_string(name, 128, ride->name, &ride->name_arguments); + auto name = ride->GetName(); console.WriteFormatLine( "ride: %03d type: %02u subtype %03u operating mode: %02u name: %s", i, ride->type, ride->subtype, - ride->mode, name); + ride->mode, name.c_str()); } } else if (argv[0] == "set") diff --git a/src/openrct2/management/Marketing.cpp b/src/openrct2/management/Marketing.cpp index 23e342af3e..2112f56d13 100644 --- a/src/openrct2/management/Marketing.cpp +++ b/src/openrct2/management/Marketing.cpp @@ -74,8 +74,7 @@ static void marketing_raise_finished_notification(const MarketingCampaign& campa if (campaign.Type == ADVERTISING_CAMPAIGN_RIDE_FREE || campaign.Type == ADVERTISING_CAMPAIGN_RIDE) { Ride* ride = get_ride(campaign.RideId); - set_format_arg(0, rct_string_id, ride->name); - set_format_arg(2, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs); } else if (campaign.Type == ADVERTISING_CAMPAIGN_FOOD_OR_DRINK_FREE) { diff --git a/src/openrct2/paint/tile_element/Paint.Entrance.cpp b/src/openrct2/paint/tile_element/Paint.Entrance.cpp index 33922c6108..029b3e64fe 100644 --- a/src/openrct2/paint/tile_element/Paint.Entrance.cpp +++ b/src/openrct2/paint/tile_element/Paint.Entrance.cpp @@ -165,8 +165,7 @@ static void ride_entrance_exit_paint(paint_session* session, uint8_t direction, if (ride->status == RIDE_STATUS_OPEN && !(ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN)) { - set_format_arg(2, rct_string_id, ride->name); - set_format_arg(4, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs + 2); } else { diff --git a/src/openrct2/paint/tile_element/Paint.LargeScenery.cpp b/src/openrct2/paint/tile_element/Paint.LargeScenery.cpp index 5ff8143abd..90d0f1eaa6 100644 --- a/src/openrct2/paint/tile_element/Paint.LargeScenery.cpp +++ b/src/openrct2/paint/tile_element/Paint.LargeScenery.cpp @@ -316,8 +316,11 @@ void large_scenery_paint(paint_session* session, uint8_t direction, uint16_t hei if (banner->flags & BANNER_FLAG_LINKED_TO_RIDE) { auto ride = get_ride(banner->ride_index); - stringId = ride->name; - set_format_arg(0, uint32_t, ride->name_arguments); + if (ride != nullptr) + { + stringId = STR_STRINGID; + ride->FormatNameTo(gCommonFormatArgs); + } } utf8 signString[256]; format_string(signString, sizeof(signString), stringId, gCommonFormatArgs); @@ -436,9 +439,11 @@ void large_scenery_paint(paint_session* session, uint8_t direction, uint16_t hei set_format_arg(0, rct_string_id, banner->string_idx); if (banner->flags & BANNER_FLAG_LINKED_TO_RIDE) { - Ride* ride = get_ride(banner->ride_index); - set_format_arg(0, rct_string_id, ride->name); - set_format_arg(2, uint32_t, ride->name_arguments); + auto ride = get_ride(banner->ride_index); + if (ride != nullptr) + { + ride->FormatNameTo(gCommonFormatArgs); + } } utf8 signString[256]; rct_string_id stringId = STR_SCROLLING_SIGN_TEXT; diff --git a/src/openrct2/paint/tile_element/Paint.Path.cpp b/src/openrct2/paint/tile_element/Paint.Path.cpp index 16525683ef..3f4ce3b7c6 100644 --- a/src/openrct2/paint/tile_element/Paint.Path.cpp +++ b/src/openrct2/paint/tile_element/Paint.Path.cpp @@ -454,8 +454,7 @@ static void sub_6A4101( if (ride->status == RIDE_STATUS_OPEN && !(ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN)) { set_format_arg(0, rct_string_id, STR_RIDE_ENTRANCE_NAME); - set_format_arg(2, rct_string_id, ride->name); - set_format_arg(4, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs + 2); } else { diff --git a/src/openrct2/paint/tile_element/Paint.Wall.cpp b/src/openrct2/paint/tile_element/Paint.Wall.cpp index 7bad652fd2..4c6d665c22 100644 --- a/src/openrct2/paint/tile_element/Paint.Wall.cpp +++ b/src/openrct2/paint/tile_element/Paint.Wall.cpp @@ -435,9 +435,11 @@ void fence_paint(paint_session* session, uint8_t direction, int32_t height, cons set_format_arg(0, rct_string_id, banner->string_idx); if (banner->flags & BANNER_FLAG_LINKED_TO_RIDE) { - Ride* ride = get_ride(banner->ride_index); - set_format_arg(0, rct_string_id, ride->name); - set_format_arg(2, uint32_t, ride->name_arguments); + auto ride = get_ride(banner->ride_index); + if (ride != nullptr) + { + ride->FormatNameTo(gCommonFormatArgs); + } } utf8 signString[256]; diff --git a/src/openrct2/peep/Guest.cpp b/src/openrct2/peep/Guest.cpp index d6306a6763..ad0b003d6a 100644 --- a/src/openrct2/peep/Guest.cpp +++ b/src/openrct2/peep/Guest.cpp @@ -3849,8 +3849,7 @@ void Guest::UpdateRideAdvanceThroughEntrance() ride->current_issues |= RIDE_ISSUE_GUESTS_STUCK; ride->last_issue_time = gCurrentTicks; - set_format_arg(0, rct_string_id, ride->name); - set_format_arg(2, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs); if (gConfigNotifications.ride_warnings) { news_item_add_to_queue(NEWS_ITEM_RIDE, STR_GUESTS_GETTING_STUCK_ON_RIDE, current_ride); @@ -4013,8 +4012,7 @@ void Guest::UpdateRideFreeVehicleEnterRide(Ride* ride) { set_format_arg(0, rct_string_id, name_string_idx); set_format_arg(2, uint32_t, id); - set_format_arg(6, rct_string_id, ride->name); - set_format_arg(8, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs + 6); rct_string_id msg_string; if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IN_RIDE)) @@ -5169,8 +5167,7 @@ void Guest::UpdateRideLeaveExit() { set_format_arg(0, rct_string_id, name_string_idx); set_format_arg(2, uint32_t, id); - set_format_arg(6, rct_string_id, ride->name); - set_format_arg(8, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs + 6); if (gConfigNotifications.guest_left_ride) { diff --git a/src/openrct2/peep/Peep.cpp b/src/openrct2/peep/Peep.cpp index b73b0cf3a1..bab52e43ff 100644 --- a/src/openrct2/peep/Peep.cpp +++ b/src/openrct2/peep/Peep.cpp @@ -1972,9 +1972,15 @@ void peep_thought_set_format_args(rct_peep_thought* thought) uint8_t flags = PeepThoughtToActionMap[thought->type].flags; if (flags & 1) { - Ride* ride = get_ride(thought->item); - set_format_arg(2, rct_string_id, ride->name); - set_format_arg(4, uint32_t, ride->name_arguments); + auto ride = get_ride(thought->item); + if (ride != nullptr) + { + ride->FormatNameTo(gCommonFormatArgs + 2); + } + else + { + set_format_arg(2, rct_string_id, STR_NONE); + } } else if (flags & 2) { @@ -2355,8 +2361,7 @@ static void peep_interact_with_entrance(Peep* peep, int16_t x, int16_t y, TileEl { set_format_arg(0, rct_string_id, peep->name_string_idx); set_format_arg(2, uint32_t, peep->id); - set_format_arg(6, rct_string_id, ride->name); - set_format_arg(8, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs + 6); if (gConfigNotifications.guest_queuing_for_ride) { news_item_add_to_queue(NEWS_ITEM_PEEP_ON_RIDE, STR_PEEP_TRACKING_PEEP_JOINED_QUEUE_FOR_X, peep->sprite_index); @@ -2799,8 +2804,7 @@ static void peep_interact_with_path(Peep* peep, int16_t x, int16_t y, TileElemen { set_format_arg(0, rct_string_id, peep->name_string_idx); set_format_arg(2, uint32_t, peep->id); - set_format_arg(6, rct_string_id, ride->name); - set_format_arg(8, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs + 6); if (gConfigNotifications.guest_queuing_for_ride) { news_item_add_to_queue( @@ -2909,8 +2913,7 @@ static bool peep_interact_with_shop(Peep* peep, int16_t x, int16_t y, TileElemen { set_format_arg(0, rct_string_id, peep->name_string_idx); set_format_arg(2, uint32_t, peep->id); - set_format_arg(6, rct_string_id, ride->name); - set_format_arg(8, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs + 6); rct_string_id string_id = ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IN_RIDE) ? STR_PEEP_TRACKING_PEEP_IS_IN_X : STR_PEEP_TRACKING_PEEP_IS_ON_X; if (gConfigNotifications.guest_used_facility) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index f5ae4e5285..7a05cb02fb 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -3059,10 +3059,9 @@ private: Ride* ride; FOR_ALL_RIDES (i, ride) { - if (ride->name == 0) + if (ride->custom_name.empty()) { - auto rideEntry = get_ride_entry(ride->subtype); - ride_set_name_to_default(ride, rideEntry); + ride->SetNameToDefault(); } } } diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index 535f50b4e1..45567f25da 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -205,7 +205,6 @@ static void ride_breakdown_update(Ride* ride); static void ride_call_closest_mechanic(Ride* ride); static void ride_call_mechanic(Ride* ride, Peep* mechanic, int32_t forInspection); static void ride_entrance_exit_connected(Ride* ride); -static void ride_set_name_to_vehicle_default(Ride* ride, rct_ride_entry* rideEntry); static int32_t ride_get_new_breakdown_problem(Ride* ride); static void ride_inspection_update(Ride* ride); static void ride_mechanic_status_update(Ride* ride, int32_t mechanicStatus); @@ -259,9 +258,8 @@ rct_ride_entry* Ride::GetRideEntry() const rct_ride_entry* rideEntry = get_ride_entry(subtype); if (rideEntry == nullptr) { - char oldname[128]; - format_string(oldname, 128, name, &name_arguments); - log_error("Invalid ride subtype for ride %s", oldname); + auto rideName = GetName(); + log_error("Invalid ride subtype for ride %s", rideName.c_str()); } return rideEntry; } @@ -1010,16 +1008,14 @@ static int32_t ride_check_if_construction_allowed(Ride* ride) } if (ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN) { - set_format_arg(6, rct_string_id, ride->name); - set_format_arg(8, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs + 6); context_show_error(STR_CANT_START_CONSTRUCTION_ON, STR_HAS_BROKEN_DOWN_AND_REQUIRES_FIXING); return 0; } if (ride->status != RIDE_STATUS_CLOSED && ride->status != RIDE_STATUS_SIMULATING) { - set_format_arg(6, rct_string_id, ride->name); - set_format_arg(8, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs + 6); context_show_error(STR_CANT_START_CONSTRUCTION_ON, STR_MUST_BE_CLOSED_FIRST); return 0; } @@ -1942,8 +1938,7 @@ int32_t ride_modify(CoordsXYE* input) if (ride->lifecycle_flags & RIDE_LIFECYCLE_INDESTRUCTIBLE) { - set_format_arg(6, rct_string_id, ride->name); - set_format_arg(8, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs + 6); context_show_error( STR_CANT_START_CONSTRUCTION_ON, STR_LOCAL_AUTHORITY_FORBIDS_DEMOLITION_OR_MODIFICATIONS_TO_THIS_RIDE); return 0; @@ -2637,8 +2632,7 @@ void ride_prepare_breakdown(Ride* ride, int32_t breakdownReason) */ void ride_breakdown_add_news_item(Ride* ride) { - set_format_arg(0, rct_string_id, ride->name); - set_format_arg(2, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs); if (gConfigNotifications.ride_broken_down) { news_item_add_to_queue(NEWS_ITEM_RIDE, STR_RIDE_IS_BROKEN_DOWN, ride->id); @@ -2664,8 +2658,7 @@ static void ride_breakdown_status_update(Ride* ride) if (!(ride->not_fixed_timeout & 15) && ride->mechanic_status != RIDE_MECHANIC_STATUS_FIXING && ride->mechanic_status != RIDE_MECHANIC_STATUS_HAS_FIXED_STATION_BRAKES) { - set_format_arg(0, rct_string_id, ride->name); - set_format_arg(2, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs); if (gConfigNotifications.ride_warnings) { news_item_add_to_queue(NEWS_ITEM_RIDE, STR_RIDE_IS_STILL_NOT_FIXED, ride->id); @@ -3346,8 +3339,7 @@ static void ride_entrance_exit_connected(Ride* ride) if (!entrance.isNull() && !ride_entrance_exit_is_reachable(entrance)) { // name of ride is parameter of the format string - set_format_arg(0, rct_string_id, ride->name); - set_format_arg(2, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs); if (gConfigNotifications.ride_warnings) { news_item_add_to_queue(1, STR_ENTRANCE_NOT_CONNECTED, ride->id); @@ -3358,8 +3350,7 @@ static void ride_entrance_exit_connected(Ride* ride) if (!exit.isNull() && !ride_entrance_exit_is_reachable(exit)) { // name of ride is parameter of the format string - set_format_arg(0, rct_string_id, ride->name); - set_format_arg(2, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs); if (gConfigNotifications.ride_warnings) { news_item_add_to_queue(1, STR_EXIT_NOT_CONNECTED, ride->id); @@ -3443,8 +3434,7 @@ static void ride_shop_connected(Ride* ride) } // Name of ride is parameter of the format string - set_format_arg(0, rct_string_id, ride->name); - set_format_arg(2, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs); if (gConfigNotifications.ride_warnings) { news_item_add_to_queue(1, STR_ENTRANCE_NOT_CONNECTED, ride->id); @@ -3463,8 +3453,7 @@ static void ride_track_set_map_tooltip(TileElement* tileElement) auto ride = get_ride(rideIndex); set_map_tooltip_format_arg(0, rct_string_id, STR_RIDE_MAP_TIP); - set_map_tooltip_format_arg(2, rct_string_id, ride->name); - set_map_tooltip_format_arg(4, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs + 2); rct_string_id formatSecondary; int32_t arg1 = 0; @@ -3479,8 +3468,7 @@ static void ride_queue_banner_set_map_tooltip(TileElement* tileElement) auto ride = get_ride(rideIndex); set_map_tooltip_format_arg(0, rct_string_id, STR_RIDE_MAP_TIP); - set_map_tooltip_format_arg(2, rct_string_id, ride->name); - set_map_tooltip_format_arg(4, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs + 2); rct_string_id formatSecondary; int32_t arg1 = 0; @@ -3500,8 +3488,7 @@ static void ride_station_set_map_tooltip(TileElement* tileElement) set_map_tooltip_format_arg(0, rct_string_id, STR_RIDE_MAP_TIP); set_map_tooltip_format_arg(2, rct_string_id, ride->num_stations <= 1 ? STR_RIDE_STATION : STR_RIDE_STATION_X); - set_map_tooltip_format_arg(4, rct_string_id, ride->name); - set_map_tooltip_format_arg(6, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs + 4); set_map_tooltip_format_arg(10, rct_string_id, RideComponentNames[RideNameConvention[ride->type].station].capitalised); set_map_tooltip_format_arg(12, uint16_t, stationIndex + 1); @@ -3532,8 +3519,7 @@ static void ride_entrance_set_map_tooltip(TileElement* tileElement) set_map_tooltip_format_arg(0, rct_string_id, STR_RIDE_MAP_TIP); set_map_tooltip_format_arg(2, rct_string_id, ride->num_stations <= 1 ? STR_RIDE_ENTRANCE : STR_RIDE_STATION_X_ENTRANCE); - set_map_tooltip_format_arg(4, rct_string_id, ride->name); - set_map_tooltip_format_arg(6, uint32_t, ride->name_arguments); + ride->FormatNameTo(gMapTooltipFormatArgs + 4); set_map_tooltip_format_arg(12, uint16_t, stationIndex + 1); if (queueLength == 0) { @@ -3558,8 +3544,7 @@ static void ride_entrance_set_map_tooltip(TileElement* tileElement) stationIndex--; set_map_tooltip_format_arg(0, rct_string_id, ride->num_stations <= 1 ? STR_RIDE_EXIT : STR_RIDE_STATION_X_EXIT); - set_map_tooltip_format_arg(2, rct_string_id, ride->name); - set_map_tooltip_format_arg(4, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs + 2); set_map_tooltip_format_arg(10, uint16_t, stationIndex + 1); } } @@ -5745,12 +5730,15 @@ static bool ride_with_colour_config_exists(uint8_t ride_type, const TrackColour* static bool ride_name_exists(char* name) { - char buffer[256]; + char buffer[256]{}; + uint32_t formatArgs[32]{}; + Ride* ride; int32_t i; FOR_ALL_RIDES (i, ride) { - format_string(buffer, 256, ride->name, &ride->name_arguments); + ride->FormatNameTo(formatArgs); + format_string(buffer, 256, STR_STRINGID, formatArgs); if ((strcmp(buffer, name) == 0) && ride_has_any_track_elements(ride)) { return true; @@ -5833,76 +5821,19 @@ money32 ride_get_common_price(Ride* forRide) return MONEY32_UNDEFINED; } -void ride_set_name_to_default(Ride* ride, rct_ride_entry* rideEntry) +void Ride::SetNameToDefault() { - if (RideGroupManager::RideTypeIsIndependent(ride->type)) - { - ride_set_name_to_vehicle_default(ride, rideEntry); - } - else - { - ride_set_name_to_track_default(ride, rideEntry); - } -} + char rideNameBuffer[256]{}; + uint8_t rideNameArgs[32]{}; -void ride_set_name_to_track_default(Ride* ride, rct_ride_entry* rideEntry) -{ - char rideNameBuffer[256]; - ride_name_args name_args; - - ride->name = STR_NONE; - - if (RideGroupManager::RideTypeHasRideGroups(ride->type)) - { - const RideGroup* rideGroup = RideGroupManager::GetRideGroup(ride->type, rideEntry); - name_args.type_name = rideGroup->Naming.name; - } - else - { - name_args.type_name = RideNaming[ride->type].name; - } - - name_args.number = 0; + // Increment default name number until we find a unique name + default_name_number = 0; do { - name_args.number++; - format_string(rideNameBuffer, 256, 1, &name_args); + default_name_number++; + FormatNameTo(rideNameArgs); + format_string(rideNameBuffer, 256, STR_STRINGID, &rideNameArgs); } while (ride_name_exists(rideNameBuffer)); - - ride->name = 1; - ride->name_arguments_type_name = name_args.type_name; - ride->name_arguments_number = name_args.number; -} - -static void ride_set_name_to_vehicle_default(Ride* ride, rct_ride_entry* rideEntry) -{ - char rideNameBuffer[256]; - ride_name_args name_args; - - ride->name = 1; - ride->name_arguments_type_name = rideEntry->naming.name; - rct_string_id rideNameStringId = 0; - name_args.type_name = rideEntry->naming.name; - name_args.number = 0; - - do - { - name_args.number++; - format_string(rideNameBuffer, 256, ride->name, &name_args); - } while (ride_name_exists(rideNameBuffer)); - - ride->name_arguments_type_name = name_args.type_name; - ride->name_arguments_number = name_args.number; - - rideNameStringId = user_string_allocate(USER_STRING_HIGH_ID_NUMBER | USER_STRING_DUPLICATION_PERMITTED, rideNameBuffer); - if (rideNameStringId != 0) - { - ride->name = rideNameStringId; - } - else - { - ride_set_name_to_track_default(ride, rideEntry); - } } /** @@ -7305,8 +7236,7 @@ void Ride::Crash(uint8_t vehicleIndex) } } - set_format_arg(0, rct_string_id, name); - set_format_arg(2, uint32_t, name_arguments); + FormatNameTo(gCommonFormatArgs); if (gConfigNotifications.ride_crashed) { news_item_add_to_queue(NEWS_ITEM_RIDE, STR_RIDE_HAS_CRASHED, id); @@ -7317,24 +7247,9 @@ void ride_reset_all_names() { int32_t i; Ride* ride; - char rideNameBuffer[256]; - ride_name_args name_args; - FOR_ALL_RIDES (i, ride) { - ride->name = STR_NONE; - - name_args.type_name = RideNaming[ride->type].name; - name_args.number = 0; - do - { - name_args.number++; - format_string(rideNameBuffer, 256, 1, &name_args); - } while (ride_name_exists(rideNameBuffer)); - - ride->name = 1; - ride->name_arguments_type_name = name_args.type_name; - ride->name_arguments_number = name_args.number; + ride->SetNameToDefault(); } } @@ -7404,7 +7319,7 @@ rct_vehicle* ride_get_broken_vehicle(Ride* ride) */ void Ride::Delete() { - user_string_free(name); + custom_name = {}; measurement = {}; type = RIDE_TYPE_NULL; } @@ -7976,3 +7891,52 @@ void ride_clear_leftover_entrances(Ride* ride) } } } + +std::string Ride::GetName() const +{ + uint8_t args[32]{}; + FormatNameTo(args); + return format_string(STR_STRINGID, args); +} + +void Ride::FormatNameTo(void* argsV) const +{ + auto args = (uint8_t*)argsV; + if (!custom_name.empty()) + { + auto str = custom_name.c_str(); + set_format_arg_on(args, 0, rct_string_id, STR_STRING); + set_format_arg_on(args, 2, void*, str); + } + else + { + rct_string_id rideTypeName{}; + if (RideGroupManager::RideTypeIsIndependent(type)) + { + auto rideEntry = GetRideEntry(); + if (rideEntry != nullptr) + { + rideTypeName = rideEntry->naming.name; + } + } + else + { + if (RideGroupManager::RideTypeHasRideGroups(type)) + { + auto rideEntry = GetRideEntry(); + if (rideEntry != nullptr) + { + auto rideGroup = RideGroupManager::GetRideGroup(type, rideEntry); + rideTypeName = rideGroup->Naming.name; + } + } + else + { + rideTypeName = RideNaming[type].name; + } + } + set_format_arg_on(args, 0, rct_string_id, 1); + set_format_arg_on(args, 2, rct_string_id, rideTypeName); + set_format_arg_on(args, 4, uint16_t, default_name_number); + } +} diff --git a/src/openrct2/ride/Ride.h b/src/openrct2/ride/Ride.h index 484d873b78..da51e025f7 100644 --- a/src/openrct2/ride/Ride.h +++ b/src/openrct2/ride/Ride.h @@ -195,16 +195,8 @@ struct Ride VehicleColour vehicle_colours[MAX_CARS_PER_TRAIN]; // 0 = closed, 1 = open, 2 = test uint8_t status; - rct_string_id name; - union - { - uint32_t name_arguments; - struct - { - rct_string_id name_arguments_type_name; - uint16_t name_arguments_number; - }; - }; + std::string custom_name; + uint16_t default_name_number; LocationXY8 overall_view; uint16_t vehicles[MAX_VEHICLES_PER_RIDE]; // Points to the first car in the train uint8_t depart_flags; @@ -416,6 +408,10 @@ public: void QueueInsertGuestAtFront(int32_t stationIndex, Peep* peep); Peep* GetQueueHeadGuest(int32_t stationIndex) const; + void SetNameToDefault(); + std::string GetName() const; + void FormatNameTo(void* args) const; + static void UpdateAll(); }; @@ -1092,9 +1088,7 @@ int32_t ride_get_random_colour_preset_index(uint8_t ride_type); money32 ride_get_common_price(Ride* forRide); rct_ride_name get_ride_naming(const uint8_t rideType, rct_ride_entry* rideEntry); money32 ride_create_command(int32_t type, int32_t subType, int32_t flags, ride_id_t* outRideIndex, uint8_t* outRideColour); -void ride_set_name_to_default(Ride* ride, rct_ride_entry* rideEntry); -void ride_set_name_to_track_default(Ride* ride, rct_ride_entry* rideEntry); void ride_clear_for_construction(Ride* ride); void ride_entrance_exit_place_provisional_ghost(); void ride_entrance_exit_remove_ghost(); diff --git a/src/openrct2/ride/TrackDesignSave.cpp b/src/openrct2/ride/TrackDesignSave.cpp index ba72309037..62cc859dd5 100644 --- a/src/openrct2/ride/TrackDesignSave.cpp +++ b/src/openrct2/ride/TrackDesignSave.cpp @@ -182,12 +182,10 @@ bool track_design_save(ride_id_t rideIndex) } } - utf8 track_name[256]; - format_string(track_name, sizeof(track_name), ride->name, &ride->name_arguments); - + auto trackName = ride->GetName(); auto intent = Intent(WC_LOADSAVE); intent.putExtra(INTENT_EXTRA_LOADSAVE_TYPE, LOADSAVETYPE_SAVE | LOADSAVETYPE_TRACK); - intent.putExtra(INTENT_EXTRA_PATH, std::string{ track_name }); + intent.putExtra(INTENT_EXTRA_PATH, trackName); intent.putExtra(INTENT_EXTRA_CALLBACK, (void*)track_design_save_callback); context_open_intent(&intent); diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index dd60972f55..3b6e513647 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -3471,8 +3471,7 @@ static void vehicle_check_if_missing(rct_vehicle* vehicle) vehicleIndex++; set_format_arg(2, uint16_t, vehicleIndex); - set_format_arg(4, rct_string_id, ride->name); - set_format_arg(6, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs + 4); set_format_arg(10, rct_string_id, RideComponentNames[RideNameConvention[ride->type].station].singular); news_item_add_to_queue(NEWS_ITEM_RIDE, STR_NEWS_VEHICLE_HAS_STALLED, vehicle->ride); @@ -5153,8 +5152,7 @@ static void vehicle_kill_all_passengers(rct_vehicle* vehicle) if (numFatalities != 0) { - set_format_arg(2, rct_string_id, ride->name); - set_format_arg(4, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs + 2); news_item_add_to_queue(NEWS_ITEM_RIDE, STR_X_PEOPLE_DIED_ON_X, vehicle->ride); if (gParkRatingCasualtyPenalty < 500) @@ -6140,8 +6138,7 @@ void vehicle_set_map_toolbar(const rct_vehicle* vehicle) set_map_tooltip_format_arg(0, rct_string_id, STR_RIDE_MAP_TIP); set_map_tooltip_format_arg(2, rct_string_id, STR_MAP_TOOLTIP_STRINGID_STRINGID); - set_map_tooltip_format_arg(4, rct_string_id, ride->name); - set_map_tooltip_format_arg(6, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs + 4); set_map_tooltip_format_arg(10, rct_string_id, RideComponentNames[RideNameConvention[ride->type].vehicle].capitalised); set_map_tooltip_format_arg(12, uint16_t, vehicleIndex + 1); diff --git a/src/openrct2/world/Map.cpp b/src/openrct2/world/Map.cpp index f778a907cd..a374df9669 100644 --- a/src/openrct2/world/Map.cpp +++ b/src/openrct2/world/Map.cpp @@ -1298,8 +1298,7 @@ void map_obstruction_set_error_text(TileElement* tileElement) case TILE_ELEMENT_TYPE_TRACK: ride = get_ride(tileElement->AsTrack()->GetRideIndex()); errorStringId = STR_X_IN_THE_WAY; - set_format_arg(0, rct_string_id, ride->name); - set_format_arg(2, uint32_t, ride->name_arguments); + ride->FormatNameTo(gCommonFormatArgs); break; case TILE_ELEMENT_TYPE_SMALL_SCENERY: sceneryEntry = tileElement->AsSmallScenery()->GetEntry();