Merge remote-tracking branch 'upstream/develop' into new-save-format

This commit is contained in:
Gymnasiast 2021-10-26 20:14:01 +02:00
commit aac479d76d
No known key found for this signature in database
GPG Key ID: DBFFF47AB2CA3EDD
11 changed files with 63 additions and 38 deletions

View File

@ -1,5 +1,8 @@
blank_issues_enabled: true blank_issues_enabled: true
contact_links: contact_links:
- name: Feature request
url: https://github.com/OpenRCT2/OpenRCT2/discussions/categories/feature-requests
about: Request a new feature to be added to OpenRCT2.
- name: Translation / Localisation - name: Translation / Localisation
url: https://github.com/OpenRCT2/Localisation url: https://github.com/OpenRCT2/Localisation
about: For localisation issues, go to the localisation repository. about: For localisation issues, go to the localisation repository.

View File

@ -1,29 +0,0 @@
name: Feature request
description: Request a new feature to be added to OpenRCT2.
labels:
- feature
body:
- type: markdown
attributes:
value: Before filing this request, [please check if it hasn't already been suggested before](https://github.com/OpenRCT2/OpenRCT2/issues?q=is%3Aissue+label%3Afeature). If it has, please add to the existing issue instead.
- type: textarea
attributes:
label: Describe the feature
placeholder: Describe your feature idea here. You can paste or drag & drop attachments here to help on illustrating it.
validations:
required: true
- type: dropdown
attributes:
label: Feature type
description: What would this feature improve? Check all that apply.
multiple: true
options:
- Quality of life
- Multiplayer
- Plug-ins
- Other
validations:
required: true

View File

@ -3612,6 +3612,9 @@ STR_6408 :Please install “innoextract” to extract GOG Installer, then res
STR_6409 :El archivo seleccionado no es el Instalador sin conexión de GOG para RollerCoaster Tycoon 2. Puede que hayas descargado GOG Galaxy downloader stub o ha seleccionado el archivo incorrecto. STR_6409 :El archivo seleccionado no es el Instalador sin conexión de GOG para RollerCoaster Tycoon 2. Puede que hayas descargado GOG Galaxy downloader stub o ha seleccionado el archivo incorrecto.
STR_6454 :No se puede cambiar el nombre del banner… STR_6454 :No se puede cambiar el nombre del banner…
STR_6455 :No se puede cambiar el nombre del señal… STR_6455 :No se puede cambiar el nombre del señal…
STR_6456 :Captura de pantalla gigante
STR_6457 :Informar un error en GitHub
STR_6458 :Siga esto en la Vista Principal
############## ##############
# Escenarios # # Escenarios #

View File

@ -13,6 +13,7 @@
- Fix: [#13465] Creating a scenario based on a won save game results in a scenario thats instantly won. - Fix: [#13465] Creating a scenario based on a won save game results in a scenario thats instantly won.
- Fix: [#13912] “Dome park” no longer renders dome correctly. - Fix: [#13912] “Dome park” no longer renders dome correctly.
- Fix: [#14316] Closing the Track Designs Manager window causes broken state. - Fix: [#14316] Closing the Track Designs Manager window causes broken state.
- Fix: [#14482, #15258] Rides with invisibility hacks sometimes behave incorrectly.
- Fix: [#14649] ImageImporter incorrectly remaps colours outside the RCT2 palette. - Fix: [#14649] ImageImporter incorrectly remaps colours outside the RCT2 palette.
- Fix: [#14667] “Extreme Hawaiian Island” has unpurchaseable land tiles (original bug). - Fix: [#14667] “Extreme Hawaiian Island” has unpurchaseable land tiles (original bug).
- Fix: [#14741] Crash when exiting OpenRCT2 on macOS. - Fix: [#14741] Crash when exiting OpenRCT2 on macOS.
@ -21,6 +22,7 @@
- Fix: [#15142] ToonTowner's mine roofs were moved into the pirate theme scenery group instead of the mine theme scenery group. - Fix: [#15142] ToonTowner's mine roofs were moved into the pirate theme scenery group instead of the mine theme scenery group.
- Fix: [#15148] Track Designs Manager delete confirmation window doesn't display properly. - Fix: [#15148] Track Designs Manager delete confirmation window doesn't display properly.
- Fix: [#15170] Plugin: incorrect label text alignment. - Fix: [#15170] Plugin: incorrect label text alignment.
- Fix: [#15177] Crash in lightfx_add_lights_magic_vehicle().
- Fix: [#15184] Crash when hovering over water types in Object Selection. - Fix: [#15184] Crash when hovering over water types in Object Selection.
- Fix: [#15193] Crash when rides/stalls are demolished. - Fix: [#15193] Crash when rides/stalls are demolished.
- Fix: [#15197] Cannot place flat ride after removing it in construction window. - Fix: [#15197] Cannot place flat ride after removing it in construction window.
@ -42,6 +44,7 @@
- Fix: [#15514] Two different “quit to menu” menu items are available in track designer and track design manager. - Fix: [#15514] Two different “quit to menu” menu items are available in track designer and track design manager.
- Fix: [#15560] Memory leak due to OpenGL Renderer not releasing a texture. - Fix: [#15560] Memory leak due to OpenGL Renderer not releasing a texture.
- Fix: [#15567] Litter not being counted correctly during Park rating calculation (original bug). - Fix: [#15567] Litter not being counted correctly during Park rating calculation (original bug).
- Fix: [#15579] Crash in track_block_get_next().
- Fix: [#15582] [Plugin] Litter properties return incorrect values. - Fix: [#15582] [Plugin] Litter properties return incorrect values.
- Fix: [#15584] Ride income underflows when on-ride photos are making losses. - Fix: [#15584] Ride income underflows when on-ride photos are making losses.
- Fix: [#15612] Crash when placing walls beside certain scenery objects. - Fix: [#15612] Crash when placing walls beside certain scenery objects.

View File

@ -710,6 +710,8 @@ void lightfx_add_lights_magic_vehicle(const Vehicle* vehicle)
}; };
auto ride = vehicle->GetRide(); auto ride = vehicle->GetRide();
if (ride == nullptr)
return;
switch (ride->type) switch (ride->type)
{ {

View File

@ -40,7 +40,7 @@
// This string specifies which version of network stream current build uses. // This string specifies which version of network stream current build uses.
// It is used for making sure only compatible builds get connected, even within // It is used for making sure only compatible builds get connected, even within
// single OpenRCT2 version. // single OpenRCT2 version.
#define NETWORK_STREAM_VERSION "14" #define NETWORK_STREAM_VERSION "15"
#define NETWORK_STREAM_ID OPENRCT2_VERSION "-" NETWORK_STREAM_VERSION #define NETWORK_STREAM_ID OPENRCT2_VERSION "-" NETWORK_STREAM_VERSION
static Peep* _pickup_peep = nullptr; static Peep* _pickup_peep = nullptr;

View File

@ -140,9 +140,9 @@ bool RCT2TrackTypeIsBooster(uint8_t rideType, uint16_t trackType)
&& trackType == TrackElemType::Booster; && trackType == TrackElemType::Booster;
} }
track_type_t RCT2TrackTypeToOpenRCT2(RCT12TrackType origTrackType, uint8_t rideType) track_type_t RCT2TrackTypeToOpenRCT2(RCT12TrackType origTrackType, uint8_t rideType, bool convertFlat)
{ {
if (GetRideTypeDescriptor(rideType).HasFlag(RIDE_TYPE_FLAG_FLAT_RIDE)) if (convertFlat && GetRideTypeDescriptor(rideType).HasFlag(RIDE_TYPE_FLAG_FLAT_RIDE))
return RCT12FlatTrackTypeToOpenRCT2(origTrackType); return RCT12FlatTrackTypeToOpenRCT2(origTrackType);
if (origTrackType == TrackElemType::RotationControlToggleAlias && !RCT2TrackTypeIsBooster(rideType, origTrackType)) if (origTrackType == TrackElemType::RotationControlToggleAlias && !RCT2TrackTypeIsBooster(rideType, origTrackType))
return TrackElemType::RotationControlToggle; return TrackElemType::RotationControlToggle;

View File

@ -1070,7 +1070,7 @@ ObjectEntryIndex RCT2RideTypeToOpenRCT2RideType(uint8_t rct2RideType, const rct_
bool RCT2TrackTypeIsBooster(uint8_t rideType, uint16_t trackType); bool RCT2TrackTypeIsBooster(uint8_t rideType, uint16_t trackType);
bool RCT2RideTypeNeedsConversion(uint8_t rct2RideType); bool RCT2RideTypeNeedsConversion(uint8_t rct2RideType);
uint8_t OpenRCT2RideTypeToRCT2RideType(ObjectEntryIndex openrct2Type); uint8_t OpenRCT2RideTypeToRCT2RideType(ObjectEntryIndex openrct2Type);
track_type_t RCT2TrackTypeToOpenRCT2(RCT12TrackType origTrackType, uint8_t rideType); track_type_t RCT2TrackTypeToOpenRCT2(RCT12TrackType origTrackType, uint8_t rideType, bool convertFlat);
RCT12TrackType OpenRCT2TrackTypeToRCT2(track_type_t origTrackType); RCT12TrackType OpenRCT2TrackTypeToRCT2(track_type_t origTrackType);
/** /**

View File

@ -86,6 +86,7 @@ private:
rct_s6_data _s6{}; rct_s6_data _s6{};
uint8_t _gameVersion = 0; uint8_t _gameVersion = 0;
bool _isSV7 = false; bool _isSV7 = false;
std::bitset<RCT12_MAX_RIDES_IN_PARK> _isFlatRide{};
ObjectEntryIndex _pathToSurfaceMap[16]; ObjectEntryIndex _pathToSurfaceMap[16];
ObjectEntryIndex _pathToQueueSurfaceMap[16]; ObjectEntryIndex _pathToQueueSurfaceMap[16];
ObjectEntryIndex _pathToRailingMap[16]; ObjectEntryIndex _pathToRailingMap[16];
@ -237,6 +238,7 @@ public:
scenario_rand_seed(_s6.scenario_srand_0, _s6.scenario_srand_1); scenario_rand_seed(_s6.scenario_srand_0, _s6.scenario_srand_1);
DetermineFlatRideStatus();
ImportTileElements(); ImportTileElements();
ImportEntities(); ImportEntities();
@ -543,6 +545,46 @@ public:
} }
} }
/**
* This code is needed to detect hacks where a tracked ride has been made invisible
* by setting its ride type to a flat ride.
*
* The function should classify rides as follows:
* 1. If the ride type is tracked and its vehicles also belong on tracks, it should be classified as tracked.
* 2. If the ride type is a flat ride, but its vehicles belong on tracks,
* it should be classified as tracked (Crooked House mod).
* 3. If the ride type is tracked and its vehicles belong to a flat ride, it should be classified as tracked.
* 4. If the ride type is a flat ride and its vehicles also belong to a flat ride, it should be classified as a flat ride.
*/
void DetermineFlatRideStatus()
{
for (uint8_t index = 0; index < RCT12_MAX_RIDES_IN_PARK; index++)
{
auto src = &_s6.rides[index];
if (src->type == RIDE_TYPE_NULL)
continue;
auto subtype = RCTEntryIndexToOpenRCT2EntryIndex(src->subtype);
auto* rideEntry = get_ride_entry(subtype);
// If the ride is tracked, we dont need to check the vehicle any more.
if (!GetRideTypeDescriptor(src->type).HasFlag(RIDE_TYPE_FLAG_FLAT_RIDE))
{
_isFlatRide[index] = false;
continue;
}
// We have established the ride type is a flat ride, which means the vehicle now determines whether it is a
// true flat ride (scenario 4) or a tracked ride with an invisibility hack (scenario 2).
ObjectEntryIndex originalRideType = src->type;
if (rideEntry != nullptr)
{
originalRideType = ride_entry_get_first_non_null_ride_type(rideEntry);
}
const auto isFlatRide = GetRideTypeDescriptor(originalRideType).HasFlag(RIDE_TYPE_FLAG_FLAT_RIDE);
_isFlatRide.set(static_cast<size_t>(index), isFlatRide);
}
}
void ImportRide(Ride* dst, const rct2_ride* src, const ride_id_t rideIndex) void ImportRide(Ride* dst, const rct2_ride* src, const ride_id_t rideIndex)
{ {
*dst = {}; *dst = {};
@ -860,7 +902,8 @@ public:
dst.CurrentRide = RCT12RideIdToOpenRCT2RideId(src.current_ride); dst.CurrentRide = RCT12RideIdToOpenRCT2RideId(src.current_ride);
dst.State = src.state; dst.State = src.state;
if (src.current_ride < RCT12_MAX_RIDES_IN_PARK && _s6.rides[src.current_ride].type < std::size(RideTypeDescriptors)) if (src.current_ride < RCT12_MAX_RIDES_IN_PARK && _s6.rides[src.current_ride].type < std::size(RideTypeDescriptors))
dst.ProximityTrackType = RCT2TrackTypeToOpenRCT2(src.proximity_track_type, _s6.rides[src.current_ride].type); dst.ProximityTrackType = RCT2TrackTypeToOpenRCT2(
src.proximity_track_type, _s6.rides[src.current_ride].type, _isFlatRide[src.current_ride]);
else else
dst.ProximityTrackType = 0xFF; dst.ProximityTrackType = 0xFF;
dst.ProximityBaseHeight = src.proximity_base_height; dst.ProximityBaseHeight = src.proximity_base_height;
@ -1179,7 +1222,7 @@ public:
auto rideType = _s6.rides[src2->GetRideIndex()].type; auto rideType = _s6.rides[src2->GetRideIndex()].type;
track_type_t trackType = static_cast<track_type_t>(src2->GetTrackType()); track_type_t trackType = static_cast<track_type_t>(src2->GetTrackType());
dst2->SetTrackType(RCT2TrackTypeToOpenRCT2(trackType, rideType)); dst2->SetTrackType(RCT2TrackTypeToOpenRCT2(trackType, rideType, _isFlatRide[src2->GetRideIndex()]));
dst2->SetRideType(rideType); dst2->SetRideType(rideType);
dst2->SetSequenceIndex(src2->GetSequenceIndex()); dst2->SetSequenceIndex(src2->GetSequenceIndex());
dst2->SetRideIndex(RCT12RideIdToOpenRCT2RideId(src2->GetRideIndex())); dst2->SetRideIndex(RCT12RideIdToOpenRCT2RideId(src2->GetRideIndex()));
@ -1686,7 +1729,7 @@ template<> void S6Importer::ImportEntity<Vehicle>(const RCT12SpriteBase& baseSrc
dst->SetTrackType(src->GetTrackType()); dst->SetTrackType(src->GetTrackType());
// RotationControlToggle and Booster are saved as the same track piece ID // RotationControlToggle and Booster are saved as the same track piece ID
// Which one the vehicle is using must be determined // Which one the vehicle is using must be determined
if (GetRideTypeDescriptor(ride.type).HasFlag(RIDE_TYPE_FLAG_FLAT_RIDE)) if (_isFlatRide[src->ride])
{ {
dst->SetTrackType(RCT12FlatTrackTypeToOpenRCT2(src->GetTrackType())); dst->SetTrackType(RCT12FlatTrackTypeToOpenRCT2(src->GetTrackType()));
} }

View File

@ -168,7 +168,7 @@ public:
_stream.Read(&t6TrackElement, sizeof(rct_td46_track_element)); _stream.Read(&t6TrackElement, sizeof(rct_td46_track_element));
TrackDesignTrackElement trackElement{}; TrackDesignTrackElement trackElement{};
track_type_t trackType = RCT2TrackTypeToOpenRCT2(t6TrackElement.type, td->type); track_type_t trackType = RCT2TrackTypeToOpenRCT2(t6TrackElement.type, td->type, true);
if (trackType == TrackElemType::InvertedUp90ToFlatQuarterLoopAlias) if (trackType == TrackElemType::InvertedUp90ToFlatQuarterLoopAlias)
{ {
trackType = TrackElemType::MultiDimInvertedUp90ToFlatQuarterLoop; trackType = TrackElemType::MultiDimInvertedUp90ToFlatQuarterLoop;

View File

@ -525,7 +525,6 @@ bool track_block_get_next(CoordsXYE* input, CoordsXYE* output, int32_t* z, int32
return false; return false;
auto inputElement = input->element->AsTrack(); auto inputElement = input->element->AsTrack();
const auto& ted = GetTrackElementDescriptor(inputElement->GetTrackType());
if (inputElement == nullptr) if (inputElement == nullptr)
return false; return false;
@ -534,6 +533,7 @@ bool track_block_get_next(CoordsXYE* input, CoordsXYE* output, int32_t* z, int32
if (ride == nullptr) if (ride == nullptr)
return false; return false;
const auto& ted = GetTrackElementDescriptor(inputElement->GetTrackType());
const auto* trackBlock = ted.Block; const auto* trackBlock = ted.Block;
if (trackBlock == nullptr) if (trackBlock == nullptr)
return false; return false;