diff --git a/src/openrct2-ui/windows/InstallTrack.cpp b/src/openrct2-ui/windows/InstallTrack.cpp index 1bb876c434..def17b0a04 100644 --- a/src/openrct2-ui/windows/InstallTrack.cpp +++ b/src/openrct2-ui/windows/InstallTrack.cpp @@ -170,7 +170,7 @@ static Widget window_install_track_widgets[] = { // Warnings const TrackDesign* td = _trackDesign.get(); - if (td->trackFlags & TRACK_DESIGN_FLAG_SCENERY_UNAVAILABLE) + if (td->gameStateData.hasFlag(TrackDesignGameStateFlag::SceneryUnavailable)) { if (!gTrackDesignSceneryToggle) { @@ -353,10 +353,10 @@ static Widget window_install_track_widgets[] = { screenPos.y += kListRowHeight; } - if (td->cost != 0) + if (td->gameStateData.cost != 0) { auto ft = Formatter(); - ft.Add(td->cost); + ft.Add(td->gameStateData.cost); DrawTextBasic(dpi, screenPos, STR_TRACK_LIST_COST_AROUND, ft); } } diff --git a/src/openrct2-ui/windows/TrackDesignPlace.cpp b/src/openrct2-ui/windows/TrackDesignPlace.cpp index 51b2df4d92..e858232f84 100644 --- a/src/openrct2-ui/windows/TrackDesignPlace.cpp +++ b/src/openrct2-ui/windows/TrackDesignPlace.cpp @@ -289,7 +289,7 @@ static Widget _trackPlaceWidgets[] = { void OnDraw(DrawPixelInfo& dpi) override { auto ft = Formatter::Common(); - ft.Add(_trackDesign->name.c_str()); + ft.Add(_trackDesign->gameStateData.name.c_str()); WindowDrawWidgets(*this, dpi); // Draw mini tile preview diff --git a/src/openrct2-ui/windows/TrackList.cpp b/src/openrct2-ui/windows/TrackList.cpp index 32327352fa..3410ab1df5 100644 --- a/src/openrct2-ui/windows/TrackList.cpp +++ b/src/openrct2-ui/windows/TrackList.cpp @@ -136,7 +136,7 @@ static Widget _trackListWidgets[] = { return; } - if (_loadedTrackDesign->trackFlags & TRACK_DESIGN_FLAG_SCENERY_UNAVAILABLE) + if (_loadedTrackDesign->gameStateData.hasFlag(TrackDesignGameStateFlag::SceneryUnavailable)) { gTrackDesignSceneryToggle = true; } @@ -152,7 +152,7 @@ static Widget _trackListWidgets[] = { else { if (_loadedTrackDesignIndex != TRACK_DESIGN_INDEX_UNLOADED - && (_loadedTrackDesign->trackFlags & TRACK_DESIGN_FLAG_VEHICLE_UNAVAILABLE)) + && (_loadedTrackDesign->gameStateData.hasFlag(TrackDesignGameStateFlag::VehicleUnavailable))) { ContextShowError(STR_THIS_DESIGN_WILL_BE_BUILT_WITH_AN_ALTERNATIVE_VEHICLE_TYPE, STR_NONE, {}); } @@ -515,7 +515,7 @@ static Widget _trackListWidgets[] = { screenPos.y = windowPos.y + tdWidget.bottom - 12; // Warnings - if ((_loadedTrackDesign->trackFlags & TRACK_DESIGN_FLAG_VEHICLE_UNAVAILABLE) + if ((_loadedTrackDesign->gameStateData.hasFlag(TrackDesignGameStateFlag::VehicleUnavailable)) && !(gScreenFlags & SCREEN_FLAGS_TRACK_MANAGER)) { // Vehicle design not available @@ -523,7 +523,7 @@ static Widget _trackListWidgets[] = { screenPos.y -= kScrollableRowHeight; } - if (_loadedTrackDesign->trackFlags & TRACK_DESIGN_FLAG_SCENERY_UNAVAILABLE) + if (_loadedTrackDesign->gameStateData.hasFlag(TrackDesignGameStateFlag::SceneryUnavailable)) { if (!gTrackDesignSceneryToggle) { @@ -665,10 +665,10 @@ static Widget _trackListWidgets[] = { screenPos.y += kListRowHeight; } - if (_loadedTrackDesign->cost != 0) + if (_loadedTrackDesign->gameStateData.cost != 0) { ft = Formatter(); - ft.Add(_loadedTrackDesign->cost); + ft.Add(_loadedTrackDesign->gameStateData.cost); DrawTextBasic(dpi, screenPos, STR_TRACK_LIST_COST_AROUND, ft); } } diff --git a/src/openrct2/actions/TrackDesignAction.cpp b/src/openrct2/actions/TrackDesignAction.cpp index 9c4fd8b0cc..29f000332a 100644 --- a/src/openrct2/actions/TrackDesignAction.cpp +++ b/src/openrct2/actions/TrackDesignAction.cpp @@ -262,7 +262,7 @@ GameActions::Result TrackDesignAction::Execute() const for (int32_t count = 1; count == 1 || r.Error != GameActions::Status::Ok; ++count) { - auto name = count == 1 ? _td.name : (_td.name + " " + std::to_string(count)); + auto name = count == 1 ? _td.gameStateData.name : (_td.gameStateData.name + " " + std::to_string(count)); auto gameAction = RideSetNameAction(ride->id, name); gameAction.SetFlags(GetFlags()); r = GameActions::ExecuteNested(&gameAction); diff --git a/src/openrct2/rct1/T4Importer.cpp b/src/openrct2/rct1/T4Importer.cpp index c73409b088..70fb6eafd7 100644 --- a/src/openrct2/rct1/T4Importer.cpp +++ b/src/openrct2/rct1/T4Importer.cpp @@ -262,7 +262,7 @@ namespace RCT1 } } - td->name = _name; + td->gameStateData.name = _name; return td; } }; diff --git a/src/openrct2/rct2/T6Importer.cpp b/src/openrct2/rct2/T6Importer.cpp index 09bd6f0292..853f591037 100644 --- a/src/openrct2/rct2/T6Importer.cpp +++ b/src/openrct2/rct2/T6Importer.cpp @@ -73,9 +73,7 @@ namespace RCT2 td->type = td6.Type; // 0x00 - td->cost = 0.00_GBP; td->operation.rideMode = static_cast(td6.RideMode); - td->trackFlags = 0; td->appearance.vehicleColourSettings = static_cast(td6.VersionAndColourScheme & 0x3); for (auto i = 0; i < Limits::kMaxVehicleColours; ++i) { @@ -200,7 +198,7 @@ namespace RCT2 td->sceneryElements.push_back(std::move(sceneryElement)); } - td->name = _name; + td->gameStateData.name = _name; UpdateRideType(td); diff --git a/src/openrct2/ride/TrackDesign.cpp b/src/openrct2/ride/TrackDesign.cpp index 32c58cab7d..ef0dce9a93 100644 --- a/src/openrct2/ride/TrackDesign.cpp +++ b/src/openrct2/ride/TrackDesign.cpp @@ -551,15 +551,15 @@ void TrackDesign::Serialise(DataSerialiser& stream) { if (stream.IsLogging()) { - stream << DS_TAG(name); + stream << DS_TAG(gameStateData.name); // There is too much information logged. // See sub actions for this information if required. return; } stream << DS_TAG(type); - stream << DS_TAG(cost); + stream << DS_TAG(gameStateData.cost); stream << DS_TAG(operation.rideMode); - stream << DS_TAG(trackFlags); + stream << DS_TAG(gameStateData.flags); stream << DS_TAG(appearance.vehicleColourSettings); stream << DS_TAG(appearance.vehicleColours); stream << DS_TAG(appearance.stationObjectIdentifier); @@ -594,7 +594,7 @@ void TrackDesign::Serialise(DataSerialiser& stream) stream << DS_TAG(entranceElements); stream << DS_TAG(sceneryElements); - stream << DS_TAG(name); + stream << DS_TAG(gameStateData.name); } std::unique_ptr TrackDesignImport(const utf8* path) @@ -1870,10 +1870,11 @@ static money64 TrackDesignCreateRide(int32_t type, int32_t subType, int32_t flag * ebx = ride_id * cost = edi */ -static bool TrackDesignPlacePreview(TrackDesignState& tds, TrackDesign* td, money64* cost, Ride** outRide, uint8_t* flags) +static bool TrackDesignPlacePreview( + TrackDesignState& tds, TrackDesign* td, Ride** outRide, TrackDesignGameStateData& gameStateData) { *outRide = nullptr; - *flags = 0; + gameStateData.flags = 0; auto& gameState = GetGameState(); auto& objManager = GetContext()->GetObjectManager(); @@ -1925,7 +1926,7 @@ static bool TrackDesignPlacePreview(TrackDesignState& tds, TrackDesign* td, mone if (tds.hasScenery) { - *flags |= TRACK_DESIGN_FLAG_HAS_SCENERY; + gameStateData.setFlag(TrackDesignGameStateFlag::HasScenery, true); } z += 16 - tds.placeSceneryZ; @@ -1934,7 +1935,7 @@ static bool TrackDesignPlacePreview(TrackDesignState& tds, TrackDesign* td, mone if (_trackDesignPlaceStateSceneryUnavailable) { placeScenery = false; - *flags |= TRACK_DESIGN_FLAG_SCENERY_UNAVAILABLE; + gameStateData.setFlag(TrackDesignGameStateFlag::SceneryUnavailable, true); } auto res = TrackDesignPlaceVirtual( @@ -1946,16 +1947,16 @@ static bool TrackDesignPlacePreview(TrackDesignState& tds, TrackDesign* td, mone { if (entry_index == OBJECT_ENTRY_INDEX_NULL) { - *flags |= TRACK_DESIGN_FLAG_VEHICLE_UNAVAILABLE; + gameStateData.setFlag(TrackDesignGameStateFlag::VehicleUnavailable, true); } else if (!RideEntryIsInvented(entry_index) && !GetGameState().Cheats.IgnoreResearchStatus) { - *flags |= TRACK_DESIGN_FLAG_VEHICLE_UNAVAILABLE; + gameStateData.setFlag(TrackDesignGameStateFlag::VehicleUnavailable, true); } _currentTrackPieceDirection = backup_rotation; _trackDesignDrawingPreview = false; - *cost = res.Cost; + gameStateData.cost = res.Cost; *outRide = ride; return true; } @@ -2067,17 +2068,15 @@ void TrackDesignDrawPreview(TrackDesign* td, uint8_t* pixels) TrackDesignState tds{}; - money64 cost; Ride* ride; - uint8_t flags; - if (!TrackDesignPlacePreview(tds, td, &cost, &ride, &flags)) + TrackDesignGameStateData updatedGameStateData = td->gameStateData; + if (!TrackDesignPlacePreview(tds, td, &ride, updatedGameStateData)) { std::fill_n(pixels, kTrackPreviewImageSize * 4, 0x00); UnstashMap(); return; } - td->cost = cost; - td->trackFlags = flags & 7; + td->gameStateData = updatedGameStateData; CoordsXYZ centre = { (tds.previewMin.x + tds.previewMax.x) / 2 + 16, (tds.previewMin.y + tds.previewMax.y) / 2 + 16, (tds.previewMin.z + tds.previewMax.z) / 2 }; @@ -2184,3 +2183,16 @@ bool TrackDesignAreEntranceAndExitPlaced() } #pragma endregion + +bool TrackDesignGameStateData::hasFlag(TrackDesignGameStateFlag flag) const +{ + return flags & EnumToFlag(flag); +} + +void TrackDesignGameStateData::setFlag(TrackDesignGameStateFlag flag, bool on) +{ + if (on) + flags |= EnumToFlag(flag); + else + flags &= ~EnumToFlag(flag); +} diff --git a/src/openrct2/ride/TrackDesign.h b/src/openrct2/ride/TrackDesign.h index 29d99ea2fa..e79adb36e7 100644 --- a/src/openrct2/ride/TrackDesign.h +++ b/src/openrct2/ride/TrackDesign.h @@ -131,6 +131,13 @@ struct TrackDesignMazeElement class DataSerialiser; enum class RideMode : uint8_t; +enum class TrackDesignGameStateFlag +{ + SceneryUnavailable, + HasScenery, + VehicleUnavailable, +}; + struct TrackDesignOperatingSettings { RideMode rideMode{}; @@ -175,11 +182,20 @@ struct TrackDesignStatistics TileCoordsXY spaceRequired{}; }; +// Not saved in the track design, but calculated when trying to place one. +struct TrackDesignGameStateData +{ + u8string name{}; + uint8_t flags{}; + money64 cost = 0.00_GBP; + + bool hasFlag(TrackDesignGameStateFlag flag) const; + void setFlag(TrackDesignGameStateFlag flag, bool on); +}; + struct TrackDesign { uint8_t type; - money64 cost; - uint8_t trackFlags; uint8_t numberOfTrains; uint8_t numberOfCarsPerTrain; ObjectEntryDescriptor vehicleObject; @@ -193,7 +209,7 @@ struct TrackDesign std::vector entranceElements; std::vector sceneryElements; - std::string name; + TrackDesignGameStateData gameStateData{}; public: ResultWithMessage CreateTrackDesign(TrackDesignState& tds, const Ride& ride); @@ -207,18 +223,6 @@ private: CoordsXYE MazeGetFirstElement(const Ride& ride); }; -enum -{ - TDPF_PLACE_SCENERY = 1 << 0, -}; - -enum -{ - TRACK_DESIGN_FLAG_SCENERY_UNAVAILABLE = (1 << 0), - TRACK_DESIGN_FLAG_HAS_SCENERY = (1 << 1), - TRACK_DESIGN_FLAG_VEHICLE_UNAVAILABLE = (1 << 2), -}; - extern bool gTrackDesignSceneryToggle; extern bool _trackDesignDrawingPreview;