From 3f8890afdea6c9246add7db22e6f6e80bb34a8cb Mon Sep 17 00:00:00 2001 From: Ted John Date: Sun, 21 Jul 2019 02:22:03 +0100 Subject: [PATCH] Fix remaining errors and a few bugs --- src/openrct2/rct1/S4Importer.cpp | 12 +- src/openrct2/rct2/S6Exporter.cpp | 23 +++- src/openrct2/rct2/S6Importer.cpp | 18 ++- src/openrct2/ride/Ride.cpp | 182 ++++++++++++++++-------------- src/openrct2/ride/Ride.h | 3 +- src/openrct2/ride/TrackDesign.cpp | 13 +-- src/openrct2/ride/Vehicle.cpp | 44 ++++---- test/tests/Pathfinding.cpp | 5 +- 8 files changed, 168 insertions(+), 132 deletions(-) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 7a05cb02fb..9002b24435 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -781,18 +781,10 @@ private: } // Ride name - dst->name = 0; if (is_user_string_id(src->name)) { - std::string rideName = GetUserString(src->name); - if (!rideName.empty()) - { - rct_string_id rideNameStringId = user_string_allocate(USER_STRING_HIGH_ID_NUMBER, rideName.c_str()); - if (rideNameStringId != 0) - { - dst->name = rideNameStringId; - } - } + auto rideName = GetUserString(src->name); + dst->custom_name = rct2_to_utf8(rideName, RCT2_LANGUAGE_ID_ENGLISH_UK); } dst->status = src->status; diff --git a/src/openrct2/rct2/S6Exporter.cpp b/src/openrct2/rct2/S6Exporter.cpp index f95969bb9f..e8b3f56a56 100644 --- a/src/openrct2/rct2/S6Exporter.cpp +++ b/src/openrct2/rct2/S6Exporter.cpp @@ -496,8 +496,27 @@ void S6Exporter::ExportRide(rct2_ride* dst, const Ride* src) // pad_046; dst->status = src->status; - dst->name = src->name; - dst->name_arguments = src->name_arguments; + if (src->custom_name.empty()) + { + // Default name with number + dst->name = RideNaming[src->type].name; + dst->name_arguments_number = src->default_name_number; + } + else + { + // Custom name, allocate user string for ride + auto rideName = utf8_to_rct2(src->custom_name); + auto stringId = user_string_allocate(USER_STRING_HIGH_ID_NUMBER | USER_STRING_DUPLICATION_PERMITTED, rideName.c_str()); + if (stringId != 0) + { + dst->name = stringId; + dst->name_arguments = 0; + } + else + { + log_warning("Unable to allocate user string for ride: %s.", src->custom_name.c_str()); + } + } dst->overall_view = src->overall_view; diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index 18c7193472..1eed933f19 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -523,8 +523,16 @@ public: // pad_046; dst->status = src->status; - dst->name = src->name; - dst->name_arguments = src->name_arguments; + + dst->default_name_number = src->name_arguments_number; + if (is_user_string_id(src->name)) + { + dst->custom_name = GetUserString(src->name); + } + else + { + dst->default_name_number = src->name_arguments_number; + } dst->overall_view = src->overall_view; @@ -1514,6 +1522,12 @@ public: dst->sprite_bottom = src->sprite_bottom; dst->sprite_direction = src->sprite_direction; } + + std::string GetUserString(rct_string_id stringId) + { + const char* originalString = _s6.custom_strings[(stringId - USER_STRING_START) % 1024]; + return rct2_to_utf8(originalString, RCT2_LANGUAGE_ID_ENGLISH_UK); + } }; std::unique_ptr ParkImporter::CreateS6(IObjectRepository& objectRepository) diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index 45567f25da..f90f53430a 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -3449,103 +3449,109 @@ static void ride_shop_connected(Ride* ride) static void ride_track_set_map_tooltip(TileElement* tileElement) { - ride_id_t rideIndex = tileElement->AsTrack()->GetRideIndex(); + auto rideIndex = tileElement->AsTrack()->GetRideIndex(); auto ride = get_ride(rideIndex); - - set_map_tooltip_format_arg(0, rct_string_id, STR_RIDE_MAP_TIP); - ride->FormatNameTo(gCommonFormatArgs + 2); - - rct_string_id formatSecondary; - int32_t arg1 = 0; - ride_get_status(ride, &formatSecondary, &arg1); - set_map_tooltip_format_arg(8, rct_string_id, formatSecondary); - set_map_tooltip_format_arg(10, uint32_t, arg1); + if (ride != nullptr) + { + set_map_tooltip_format_arg(0, rct_string_id, STR_RIDE_MAP_TIP); + auto nameArgLen = ride->FormatNameTo(gMapTooltipFormatArgs + 2); + ride->FormatStatusTo(gMapTooltipFormatArgs + 2 + nameArgLen); + } } static void ride_queue_banner_set_map_tooltip(TileElement* tileElement) { - ride_id_t rideIndex = tileElement->AsPath()->GetRideIndex(); + auto rideIndex = tileElement->AsPath()->GetRideIndex(); auto ride = get_ride(rideIndex); - - set_map_tooltip_format_arg(0, rct_string_id, STR_RIDE_MAP_TIP); - ride->FormatNameTo(gCommonFormatArgs + 2); - - rct_string_id formatSecondary; - int32_t arg1 = 0; - ride_get_status(ride, &formatSecondary, &arg1); - set_map_tooltip_format_arg(8, rct_string_id, formatSecondary); - set_map_tooltip_format_arg(10, uint32_t, arg1); + if (ride != nullptr) + { + set_map_tooltip_format_arg(0, rct_string_id, STR_RIDE_MAP_TIP); + auto nameArgLen = ride->FormatNameTo(gMapTooltipFormatArgs + 2); + ride->FormatStatusTo(gMapTooltipFormatArgs + 2 + nameArgLen); + } } static void ride_station_set_map_tooltip(TileElement* tileElement) { - ride_id_t rideIndex = tileElement->AsTrack()->GetRideIndex(); + auto rideIndex = tileElement->AsTrack()->GetRideIndex(); auto ride = get_ride(rideIndex); - auto stationIndex = tileElement->AsTrack()->GetStationIndex(); - for (int32_t i = stationIndex; i >= 0; i--) - if (ride->stations[i].Start.xy == RCT_XY8_UNDEFINED) - stationIndex--; - - 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); - 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); - - rct_string_id formatSecondary; - int32_t arg1; - ride_get_status(ride, &formatSecondary, &arg1); - set_map_tooltip_format_arg(14, rct_string_id, formatSecondary); - set_map_tooltip_format_arg(16, uint32_t, arg1); -} - -static void ride_entrance_set_map_tooltip(TileElement* tileElement) -{ - ride_id_t rideIndex = tileElement->AsEntrance()->GetRideIndex(); - auto ride = get_ride(rideIndex); - - // Get the station - auto stationIndex = tileElement->AsEntrance()->GetStationIndex(); - for (int32_t i = stationIndex; i >= 0; i--) - if (ride->stations[i].Start.xy == RCT_XY8_UNDEFINED) - stationIndex--; - - if (tileElement->AsEntrance()->GetEntranceType() == ENTRANCE_TYPE_RIDE_ENTRANCE) + if (ride != nullptr) { - // Get the queue length - int32_t queueLength = 0; - if (!ride_get_entrance_location(ride, stationIndex).isNull()) - queueLength = ride->stations[stationIndex].QueueLength; - - 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); - ride->FormatNameTo(gMapTooltipFormatArgs + 4); - set_map_tooltip_format_arg(12, uint16_t, stationIndex + 1); - if (queueLength == 0) - { - set_map_tooltip_format_arg(14, rct_string_id, STR_QUEUE_EMPTY); - } - else if (queueLength == 1) - { - set_map_tooltip_format_arg(14, rct_string_id, STR_QUEUE_ONE_PERSON); - } - else - { - set_map_tooltip_format_arg(14, rct_string_id, STR_QUEUE_PEOPLE); - } - set_map_tooltip_format_arg(16, uint16_t, queueLength); - } - else - { - // Get the station - stationIndex = tileElement->AsEntrance()->GetStationIndex(); + auto stationIndex = tileElement->AsTrack()->GetStationIndex(); for (int32_t i = stationIndex; i >= 0; i--) if (ride->stations[i].Start.xy == RCT_XY8_UNDEFINED) stationIndex--; - set_map_tooltip_format_arg(0, rct_string_id, ride->num_stations <= 1 ? STR_RIDE_EXIT : STR_RIDE_STATION_X_EXIT); - ride->FormatNameTo(gCommonFormatArgs + 2); - set_map_tooltip_format_arg(10, uint16_t, stationIndex + 1); + size_t argPos = 0; + set_map_tooltip_format_arg(argPos, rct_string_id, STR_RIDE_MAP_TIP); + argPos += sizeof(rct_string_id); + set_map_tooltip_format_arg(argPos, rct_string_id, ride->num_stations <= 1 ? STR_RIDE_STATION : STR_RIDE_STATION_X); + argPos += sizeof(rct_string_id); + argPos += ride->FormatNameTo(gMapTooltipFormatArgs + argPos); + set_map_tooltip_format_arg( + argPos, rct_string_id, RideComponentNames[RideNameConvention[ride->type].station].capitalised); + argPos += sizeof(rct_string_id); + set_map_tooltip_format_arg(argPos, uint16_t, stationIndex + 1); + argPos += sizeof(uint16_t); + ride->FormatStatusTo(gMapTooltipFormatArgs + argPos); + } +} + +static void ride_entrance_set_map_tooltip(TileElement* tileElement) +{ + auto rideIndex = tileElement->AsEntrance()->GetRideIndex(); + auto ride = get_ride(rideIndex); + if (ride != nullptr) + { + // Get the station + auto stationIndex = tileElement->AsEntrance()->GetStationIndex(); + for (int32_t i = stationIndex; i >= 0; i--) + if (ride->stations[i].Start.xy == RCT_XY8_UNDEFINED) + stationIndex--; + + if (tileElement->AsEntrance()->GetEntranceType() == ENTRANCE_TYPE_RIDE_ENTRANCE) + { + // Get the queue length + int32_t queueLength = 0; + if (!ride_get_entrance_location(ride, stationIndex).isNull()) + queueLength = ride->stations[stationIndex].QueueLength; + + size_t argPos = 0; + set_map_tooltip_format_arg(argPos, rct_string_id, STR_RIDE_MAP_TIP); + argPos += sizeof(rct_string_id); + set_map_tooltip_format_arg( + argPos, rct_string_id, ride->num_stations <= 1 ? STR_RIDE_ENTRANCE : STR_RIDE_STATION_X_ENTRANCE); + argPos += sizeof(rct_string_id); + argPos += ride->FormatNameTo(gMapTooltipFormatArgs + argPos); + set_map_tooltip_format_arg(argPos, uint16_t, stationIndex + 1); + argPos += sizeof(uint16_t); + if (queueLength == 0) + { + set_map_tooltip_format_arg(argPos, rct_string_id, STR_QUEUE_EMPTY); + } + else if (queueLength == 1) + { + set_map_tooltip_format_arg(argPos, rct_string_id, STR_QUEUE_ONE_PERSON); + } + else + { + set_map_tooltip_format_arg(argPos, rct_string_id, STR_QUEUE_PEOPLE); + } + argPos += sizeof(rct_string_id); + set_map_tooltip_format_arg(argPos, uint16_t, queueLength); + } + else + { + // Get the station + stationIndex = tileElement->AsEntrance()->GetStationIndex(); + for (int32_t i = stationIndex; i >= 0; i--) + if (ride->stations[i].Start.xy == RCT_XY8_UNDEFINED) + stationIndex--; + + set_map_tooltip_format_arg(0, rct_string_id, ride->num_stations <= 1 ? STR_RIDE_EXIT : STR_RIDE_STATION_X_EXIT); + auto nameArgLen = ride->FormatNameTo(gMapTooltipFormatArgs + 2); + set_map_tooltip_format_arg(2 + nameArgLen, uint16_t, stationIndex + 1); + } } } @@ -7899,7 +7905,7 @@ std::string Ride::GetName() const return format_string(STR_STRINGID, args); } -void Ride::FormatNameTo(void* argsV) const +size_t Ride::FormatNameTo(void* argsV) const { auto args = (uint8_t*)argsV; if (!custom_name.empty()) @@ -7907,6 +7913,7 @@ void Ride::FormatNameTo(void* argsV) const 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); + return sizeof(rct_string_id) + sizeof(void*); } else { @@ -7938,5 +7945,16 @@ void Ride::FormatNameTo(void* argsV) const 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); + return sizeof(rct_string_id) + sizeof(rct_string_id) + sizeof(uint16_t); } } + +void Ride::FormatStatusTo(void* argsV) const +{ + auto args = (uint8_t*)argsV; + rct_string_id stringId{}; + int32_t arg32{}; + ride_get_status(this, &stringId, &arg32); + set_format_arg_on(args, 0, rct_string_id, stringId); + set_format_arg_on(args, 2, uint32_t, arg32); +} diff --git a/src/openrct2/ride/Ride.h b/src/openrct2/ride/Ride.h index da51e025f7..61c2ed93ad 100644 --- a/src/openrct2/ride/Ride.h +++ b/src/openrct2/ride/Ride.h @@ -410,7 +410,8 @@ public: void SetNameToDefault(); std::string GetName() const; - void FormatNameTo(void* args) const; + size_t FormatNameTo(void* args) const; + void FormatStatusTo(void* args) const; static void UpdateAll(); }; diff --git a/src/openrct2/ride/TrackDesign.cpp b/src/openrct2/ride/TrackDesign.cpp index 9b735dbc87..47f8d22f6b 100644 --- a/src/openrct2/ride/TrackDesign.cpp +++ b/src/openrct2/ride/TrackDesign.cpp @@ -1721,14 +1721,7 @@ static bool track_design_place_preview(rct_track_td6* td6, money32* cost, Ride** } auto ride = get_ride(rideIndex); - rct_string_id new_ride_name = user_string_allocate(USER_STRING_HIGH_ID_NUMBER | USER_STRING_DUPLICATION_PERMITTED, ""); - if (new_ride_name != 0) - { - rct_string_id old_name = ride->name; - ride->name = new_ride_name; - user_string_free(old_name); - } - + ride->custom_name = {}; ride->entrance_style = td6->entrance_style; for (int32_t i = 0; i < RCT12_NUM_COLOUR_SCHEMES; i++) @@ -1796,9 +1789,7 @@ static bool track_design_place_preview(rct_track_td6* td6, money32* cost, Ride** else { _currentTrackPieceDirection = backup_rotation; - user_string_free(ride->name); - ride->type = RIDE_TYPE_NULL; - ride->measurement = {}; + ride->Delete(); byte_9D8150 = false; return false; } diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index 3b6e513647..92f83c5c81 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -3471,8 +3471,8 @@ static void vehicle_check_if_missing(rct_vehicle* vehicle) vehicleIndex++; set_format_arg(2, uint16_t, vehicleIndex); - ride->FormatNameTo(gCommonFormatArgs + 4); - set_format_arg(10, rct_string_id, RideComponentNames[RideNameConvention[ride->type].station].singular); + auto nameArgLen = ride->FormatNameTo(gCommonFormatArgs + 4); + set_format_arg(4 + nameArgLen, rct_string_id, RideComponentNames[RideNameConvention[ride->type].station].singular); news_item_add_to_queue(NEWS_ITEM_RIDE, STR_NEWS_VEHICLE_HAS_STALLED, vehicle->ride); } @@ -6127,27 +6127,29 @@ GForces vehicle_get_g_forces(const rct_vehicle* vehicle) void vehicle_set_map_toolbar(const rct_vehicle* vehicle) { - Ride* ride; - int32_t vehicleIndex; + auto ride = get_ride(vehicle->ride); + if (ride != nullptr) + { + vehicle = vehicle->GetHead(); - ride = get_ride(vehicle->ride); - vehicle = vehicle->GetHead(); - for (vehicleIndex = 0; vehicleIndex < 32; vehicleIndex++) - if (ride->vehicles[vehicleIndex] == vehicle->sprite_index) - break; + int32_t vehicleIndex; + for (vehicleIndex = 0; vehicleIndex < 32; vehicleIndex++) + if (ride->vehicles[vehicleIndex] == vehicle->sprite_index) + break; - 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); - 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); - - rct_string_id formatSecondary; - int32_t arg1; - ride_get_status(ride, &formatSecondary, &arg1); - set_map_tooltip_format_arg(14, rct_string_id, formatSecondary); - // TODO: odd cast - set_map_tooltip_format_arg(16, uint32_t, (uint16_t)arg1); + size_t argPos = 0; + set_map_tooltip_format_arg(argPos, rct_string_id, STR_RIDE_MAP_TIP); + argPos += sizeof(rct_string_id); + set_map_tooltip_format_arg(argPos, rct_string_id, STR_MAP_TOOLTIP_STRINGID_STRINGID); + argPos += sizeof(rct_string_id); + argPos += ride->FormatNameTo(gMapTooltipFormatArgs + argPos); + set_map_tooltip_format_arg( + argPos, rct_string_id, RideComponentNames[RideNameConvention[ride->type].vehicle].capitalised); + argPos += sizeof(rct_string_id); + set_map_tooltip_format_arg(argPos, uint16_t, vehicleIndex + 1); + argPos += sizeof(uint16_t); + ride->FormatStatusTo(gMapTooltipFormatArgs + argPos); + } } rct_vehicle* vehicle_get_head(const rct_vehicle* vehicle) diff --git a/test/tests/Pathfinding.cpp b/test/tests/Pathfinding.cpp index 1c0b6c2f3b..6c965985dd 100644 --- a/test/tests/Pathfinding.cpp +++ b/test/tests/Pathfinding.cpp @@ -55,9 +55,8 @@ protected: Ride* ride; FOR_ALL_RIDES ((*outRideIndex), ride) { - char thisName[256]; - format_string(thisName, sizeof(thisName), ride->name, &ride->name_arguments); - if (!_strnicmp(thisName, name, sizeof(thisName))) + auto thisName = ride->GetName(); + if (!_strnicmp(thisName.c_str(), name, sizeof(thisName))) return ride; }