1
0
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:
Gymnasiast
2024-07-03 22:18:48 +02:00
parent 56accb3790
commit e47f526067
8 changed files with 60 additions and 46 deletions

View File

@@ -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);
}
}

View File

@@ -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

View File

@@ -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);
}
}

View File

@@ -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);

View File

@@ -262,7 +262,7 @@ namespace RCT1
}
}
td->name = _name;
td->gameStateData.name = _name;
return td;
}
};

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -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;