mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-18 04:23:20 +01:00
Move variables not saved in the track design to their own struct
This commit is contained in:
@@ -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<money64>(td->cost);
|
||||
ft.Add<money64>(td->gameStateData.cost);
|
||||
DrawTextBasic(dpi, screenPos, STR_TRACK_LIST_COST_AROUND, ft);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -289,7 +289,7 @@ static Widget _trackPlaceWidgets[] = {
|
||||
void OnDraw(DrawPixelInfo& dpi) override
|
||||
{
|
||||
auto ft = Formatter::Common();
|
||||
ft.Add<char*>(_trackDesign->name.c_str());
|
||||
ft.Add<char*>(_trackDesign->gameStateData.name.c_str());
|
||||
WindowDrawWidgets(*this, dpi);
|
||||
|
||||
// Draw mini tile preview
|
||||
|
||||
@@ -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<uint32_t>(_loadedTrackDesign->cost);
|
||||
ft.Add<uint32_t>(_loadedTrackDesign->gameStateData.cost);
|
||||
DrawTextBasic(dpi, screenPos, STR_TRACK_LIST_COST_AROUND, ft);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -262,7 +262,7 @@ namespace RCT1
|
||||
}
|
||||
}
|
||||
|
||||
td->name = _name;
|
||||
td->gameStateData.name = _name;
|
||||
return td;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -73,9 +73,7 @@ namespace RCT2
|
||||
|
||||
td->type = td6.Type; // 0x00
|
||||
|
||||
td->cost = 0.00_GBP;
|
||||
td->operation.rideMode = static_cast<RideMode>(td6.RideMode);
|
||||
td->trackFlags = 0;
|
||||
td->appearance.vehicleColourSettings = static_cast<VehicleColourSettings>(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);
|
||||
|
||||
|
||||
@@ -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<TrackDesign> 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);
|
||||
}
|
||||
|
||||
@@ -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<TrackDesignEntranceElement> entranceElements;
|
||||
std::vector<TrackDesignSceneryElement> 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;
|
||||
|
||||
Reference in New Issue
Block a user