Merge pull request #26180 from Gymnasiast/refactor/track-data-continued-2

Start splitting up TrackData.cpp
This commit is contained in:
Michael Steenbeek
2026-03-12 22:53:26 +01:00
committed by GitHub
16 changed files with 6141 additions and 5856 deletions
+13
View File
@@ -558,6 +558,19 @@
<ClInclude Include="ride\rtd\water\SplashBoats.h" />
<ClInclude Include="ride\rtd\water\SubmarineRide.h" />
<ClInclude Include="ride\ted\PitchAndRoll.h" />
<ClInclude Include="ride\ted\TED.Corkscrew.h" />
<ClInclude Include="ride\ted\TED.DiveLoop.h" />
<ClInclude Include="ride\ted\TED.FlatRide.h" />
<ClInclude Include="ride\ted\TED.HalfHelix.h" />
<ClInclude Include="ride\ted\TED.Heartline.h" />
<ClInclude Include="ride\ted\TED.LongBase.h" />
<ClInclude Include="ride\ted\TED.Loop.h" />
<ClInclude Include="ride\ted\TED.Maze.h" />
<ClInclude Include="ride\ted\TED.MiniGolf.h" />
<ClInclude Include="ride\ted\TED.SBend.h" />
<ClInclude Include="ride\ted\TED.Station.h" />
<ClInclude Include="ride\ted\TED.Water.h" />
<ClInclude Include="ride\ted\TED.ZeroG.h" />
<ClInclude Include="ride\ted\TrackElementDescriptor.h" />
<ClInclude Include="ride\ted\TrackElemType.h" />
<ClInclude Include="ride\ted\TrackGroup.h" />
File diff suppressed because it is too large Load Diff
+597
View File
@@ -0,0 +1,597 @@
/*****************************************************************************
* Copyright (c) 2014-2026 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
#pragma once
#include "../../localisation/StringIds.h"
#include "TrackElementDescriptor.h"
namespace OpenRCT2::TrackMetadata
{
using PS = PaintSegment;
static constexpr SequenceDescriptor kLeftCorkscrewUpSeq0 = {
.clearance = { 0, 0, 0, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.metalSupports = { MetalSupportPlace::centre },
.blockedSegments = { {
EnumsToFlags(PS::top, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft), // narrow
EnumsToFlags(PS::top, PS::right, PS::bottom, PS::centre, PS::topRight, PS::bottomLeft, PS::bottomRight), // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kLeftCorkscrewUpSeq1 = {
.clearance = { -32, 0, 24, 32, { 0b0111, 0 }, {} },
.allowedWallEdges = 0b0011,
.blockedSegments = { {
kSegmentsAll, // narrow
kSegmentsAll, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kLeftCorkscrewUpSeq2 = {
.clearance = { -32, -32, 48, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0101,
.flags = { SequenceFlag::hasHeightMarker },
.metalSupports = { MetalSupportPlace::centre },
.invertSegmentBlocking = true,
.blockedSegments = { {
EnumsToFlags(PS::left, PS::centre, PS::topLeft, PS::bottomLeft, PS::bottomRight), // narrow
EnumsToFlags(PS::top, PS::right, PS::bottom, PS::centre, PS::topLeft, PS::topRight, PS::bottomRight), // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kRightCorkscrewUpSeq0 = {
.clearance = { 0, 0, 0, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.metalSupports = { MetalSupportPlace::centre },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftCorkscrewUpSeq0.blockedSegments),
};
static constexpr SequenceDescriptor kRightCorkscrewUpSeq1 = {
.clearance = { -32, 0, 24, 32, { 0b1011, 0 }, {} },
.allowedWallEdges = 0b1001,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftCorkscrewUpSeq1.blockedSegments),
};
static constexpr SequenceDescriptor kRightCorkscrewUpSeq2 = {
.clearance = { -32, 32, 48, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0101,
.flags = { SequenceFlag::hasHeightMarker },
.metalSupports = { MetalSupportPlace::centre },
.invertSegmentBlocking = true,
.blockedSegments = { {
EnumsToFlags(PS::left, PS::centre, PS::topLeft, PS::bottomLeft, PS::bottomRight), // narrow
EnumsToFlags(PS::top, PS::left, PS::right, PS::centre, PS::topLeft, PS::topRight, PS::bottomRight), // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kLeftCorkscrewDownSeq0 = {
.clearance = { 0, 0, -32, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.metalSupports = { MetalSupportPlace::centre },
.invertSegmentBlocking = true,
.blockedSegments = blockedSegmentsRotate(kRightCorkscrewUpSeq2.blockedSegments, 1),
};
static constexpr SequenceDescriptor kLeftCorkscrewDownSeq1 = {
.clearance = { -32, 0, -56, 32, { 0b0111, 0 }, {} },
.allowedWallEdges = 0b0011,
.blockedSegments = blockedSegmentsRotate(kRightCorkscrewUpSeq1.blockedSegments, 1),
};
static constexpr SequenceDescriptor kLeftCorkscrewDownSeq2 = {
.clearance = { -32, -32, -80, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0101,
.flags = { SequenceFlag::hasHeightMarker },
.metalSupports = { MetalSupportPlace::centre },
.blockedSegments = blockedSegmentsRotate(kRightCorkscrewUpSeq0.blockedSegments, 1),
};
static constexpr SequenceDescriptor kRightCorkscrewDownSeq0 = {
.clearance = { 0, 0, -32, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.metalSupports = { MetalSupportPlace::centre },
.invertSegmentBlocking = true,
.blockedSegments = blockedSegmentsRotate(kLeftCorkscrewUpSeq2.blockedSegments, 3),
};
static constexpr SequenceDescriptor kRightCorkscrewDownSeq1 = {
.clearance = { -32, 0, -56, 32, { 0b1011, 0 }, {} },
.allowedWallEdges = 0b1001,
.blockedSegments = blockedSegmentsRotate(kLeftCorkscrewUpSeq1.blockedSegments, 3),
};
static constexpr SequenceDescriptor kRightCorkscrewDownSeq2 = {
.clearance = { -32, 32, -80, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0101,
.flags = { SequenceFlag::hasHeightMarker },
.metalSupports = { MetalSupportPlace::centre },
.blockedSegments = blockedSegmentsRotate(kLeftCorkscrewUpSeq0.blockedSegments, 3),
};
static constexpr SequenceDescriptor kLeftFlyerCorkscrewUpSeq0 = {
.clearance = { 0, 0, 0, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.blockedSegments = kLeftCorkscrewUpSeq0.blockedSegments,
};
static constexpr SequenceDescriptor kLeftFlyerCorkscrewUpSeq1 = {
.clearance = { -32, 0, 24, 32, { 0b0111, 0 }, {} },
.allowedWallEdges = 0b0011,
.blockedSegments = kLeftCorkscrewUpSeq1.blockedSegments,
};
static constexpr SequenceDescriptor kLeftFlyerCorkscrewUpSeq2 = {
.clearance = { -32, -32, 48, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0101,
.flags = { SequenceFlag::hasHeightMarker },
.invertSegmentBlocking = true,
.blockedSegments = kLeftCorkscrewUpSeq2.blockedSegments,
};
static constexpr SequenceDescriptor kRightFlyerCorkscrewUpSeq0 = {
.clearance = { 0, 0, 0, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.blockedSegments = kRightCorkscrewUpSeq0.blockedSegments,
};
static constexpr SequenceDescriptor kRightFlyerCorkscrewUpSeq1 = {
.clearance = { -32, 0, 24, 32, { 0b1011, 0 }, {} },
.allowedWallEdges = 0b1001,
.blockedSegments = kRightCorkscrewUpSeq1.blockedSegments,
};
static constexpr SequenceDescriptor kRightFlyerCorkscrewUpSeq2 = {
.clearance = { -32, 32, 48, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0101,
.flags = { SequenceFlag::hasHeightMarker },
.invertSegmentBlocking = true,
.blockedSegments = kRightCorkscrewUpSeq2.blockedSegments,
};
static constexpr SequenceDescriptor kLeftFlyerCorkscrewDownSeq0 = {
.clearance = { 0, 0, 0, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.blockedSegments = { {
kSegmentsUnimplemented, // narrow
EnumsToFlags(PS::top, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft), // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kLeftFlyerCorkscrewDownSeq1 = {
.clearance = { -32, 0, -24, 32, { 0b0111, 0 }, {} },
.allowedWallEdges = 0b0011,
.blockedSegments = { {
kSegmentsUnimplemented, // narrow
kSegmentsAll, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kLeftFlyerCorkscrewDownSeq2 = {
.clearance = { -32, -32, -48, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0101,
.flags = { SequenceFlag::hasHeightMarker },
.invertSegmentBlocking = true,
.blockedSegments = { {
kSegmentsUnimplemented, // narrow
EnumsToFlags(PS::bottom, PS::centre, PS::topLeft, PS::bottomLeft, PS::bottomRight), // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kRightFlyerCorkscrewDownSeq0 = {
.clearance = { 0, 0, 0, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.blockedSegments = { {
kSegmentsUnimplemented, // narrow
EnumsToFlags(PS::bottom, PS::centre, PS::topRight, PS::bottomLeft, PS::bottomRight), // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kRightFlyerCorkscrewDownSeq1 = {
.clearance = { -32, 0, -24, 32, { 0b1011, 0 }, {} },
.allowedWallEdges = 0b1001,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftFlyerCorkscrewDownSeq1.blockedSegments),
};
static constexpr SequenceDescriptor kRightFlyerCorkscrewDownSeq2 = {
.clearance = { -32, 32, -48, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0101,
.flags = { SequenceFlag::hasHeightMarker },
.invertSegmentBlocking = true,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftFlyerCorkscrewDownSeq2.blockedSegments),
};
static constexpr SequenceDescriptor kLeftLargeCorkscrewUpSeq0 = {
.clearance = { 0, 0, 0, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.blockedSegments = { {
EnumsToFlags(PS::top, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kLeftLargeCorkscrewUpSeq1 = {
.clearance = { -32, 0, 8, 32, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0010,
.blockedSegments = { {
EnumsToFlags(PS::top, PS::left, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kLeftLargeCorkscrewUpSeq2 = {
.clearance = { -64, 0, 32, 24, { 0b0111, 0 }, {} },
.allowedWallEdges = 0b0011,
.blockedSegments = { {
EnumsToFlags(PS::left, PS::centre, PS::topLeft, PS::bottomLeft), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kLeftLargeCorkscrewUpSeq3 = {
.clearance = { -32, -32, 32, 24, { 0b1000, 0 }, {} },
.allowedWallEdges = 0b1100,
.blockedSegments = { {
kSegmentsNone, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kLeftLargeCorkscrewUpSeq4 = {
.clearance = { -64, -32, 48, 40, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0001,
.invertSegmentBlocking = true,
.blockedSegments = { {
EnumsToFlags(PS::left, PS::bottom, PS::centre, PS::topLeft, PS::bottomLeft, PS::bottomRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kLeftLargeCorkscrewUpSeq5 = {
.clearance = { -64, -64, 72, 24, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0101,
.flags = { SequenceFlag::hasHeightMarker },
.invertSegmentBlocking = true,
.blockedSegments = { {
EnumsToFlags(PS::left, PS::bottom, PS::centre, PS::topLeft, PS::bottomLeft, PS::bottomRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kRightLargeCorkscrewUpSeq0 = {
.clearance = { 0, 0, 0, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeCorkscrewUpSeq0.blockedSegments),
};
static constexpr SequenceDescriptor kRightLargeCorkscrewUpSeq1 = {
.clearance = { -32, 0, 8, 32, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1000,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeCorkscrewUpSeq1.blockedSegments),
};
static constexpr SequenceDescriptor kRightLargeCorkscrewUpSeq2 = {
.clearance = { -64, 0, 32, 24, { 0b1011, 0 }, {} },
.allowedWallEdges = 0b1001,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeCorkscrewUpSeq2.blockedSegments),
};
static constexpr SequenceDescriptor kRightLargeCorkscrewUpSeq3 = {
.clearance = { -32, 32, 32, 24, { 0b0100, 0 }, {} },
.allowedWallEdges = 0b0110,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeCorkscrewUpSeq3.blockedSegments),
};
static constexpr SequenceDescriptor kRightLargeCorkscrewUpSeq4 = {
.clearance = { -64, 32, 48, 40, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0001,
.invertSegmentBlocking = true,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeCorkscrewUpSeq4.blockedSegments),
};
static constexpr SequenceDescriptor kRightLargeCorkscrewUpSeq5 = {
.clearance = { -64, 64, 72, 24, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0101,
.flags = { SequenceFlag::hasHeightMarker },
.invertSegmentBlocking = true,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeCorkscrewUpSeq5.blockedSegments),
};
static constexpr SequenceDescriptor kLeftLargeCorkscrewDownSeq0 = {
.clearance = { 0, 0, -40, 24, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.invertSegmentBlocking = true,
.blockedSegments = blockedSegmentsRotate(kRightLargeCorkscrewUpSeq5.blockedSegments, 1),
};
static constexpr SequenceDescriptor kLeftLargeCorkscrewDownSeq1 = {
.clearance = { -32, 0, -64, 40, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0010,
.invertSegmentBlocking = true,
.blockedSegments = blockedSegmentsRotate(kRightLargeCorkscrewUpSeq4.blockedSegments, 1),
};
static constexpr SequenceDescriptor kLeftLargeCorkscrewDownSeq2 = {
.clearance = { -32, -32, -80, 24, { 0b1000, 0 }, {} },
.allowedWallEdges = 0b1100,
.blockedSegments = blockedSegmentsRotate(kRightLargeCorkscrewUpSeq3.blockedSegments, 1),
};
static constexpr SequenceDescriptor kLeftLargeCorkscrewDownSeq3 = {
.clearance = { -64, 0, -80, 24, { 0b0111, 0 }, {} },
.allowedWallEdges = 0b0011,
.blockedSegments = blockedSegmentsRotate(kRightLargeCorkscrewUpSeq2.blockedSegments, 1),
};
static constexpr SequenceDescriptor kLeftLargeCorkscrewDownSeq4 = {
.clearance = { -64, -32, -104, 32, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0001,
.blockedSegments = blockedSegmentsRotate(kRightLargeCorkscrewUpSeq1.blockedSegments, 1),
};
static constexpr SequenceDescriptor kLeftLargeCorkscrewDownSeq5 = {
.clearance = { -64, -64, -112, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0101,
.flags = { SequenceFlag::hasHeightMarker },
.blockedSegments = blockedSegmentsRotate(kRightLargeCorkscrewUpSeq0.blockedSegments, 1),
};
static constexpr SequenceDescriptor kRightLargeCorkscrewDownSeq0 = {
.clearance = { 0, 0, -40, 24, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.invertSegmentBlocking = true,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeCorkscrewDownSeq0.blockedSegments),
};
static constexpr SequenceDescriptor kRightLargeCorkscrewDownSeq1 = {
.clearance = { -32, 0, -64, 40, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1000,
.invertSegmentBlocking = true,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeCorkscrewDownSeq1.blockedSegments),
};
static constexpr SequenceDescriptor kRightLargeCorkscrewDownSeq2 = {
.clearance = { -32, 32, -80, 24, { 0b0100, 0 }, {} },
.allowedWallEdges = 0b0110,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeCorkscrewDownSeq2.blockedSegments),
};
static constexpr SequenceDescriptor kRightLargeCorkscrewDownSeq3 = {
.clearance = { -64, 0, -80, 24, { 0b1011, 0 }, {} },
.allowedWallEdges = 0b1001,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeCorkscrewDownSeq3.blockedSegments),
};
static constexpr SequenceDescriptor kRightLargeCorkscrewDownSeq4 = {
.clearance = { -64, 32, -104, 32, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0001,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeCorkscrewDownSeq4.blockedSegments),
};
static constexpr SequenceDescriptor kRightLargeCorkscrewDownSeq5 = {
.clearance = { -64, 64, -112, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0101,
.flags = { SequenceFlag::hasHeightMarker },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeCorkscrewDownSeq5.blockedSegments),
};
constexpr auto kTEDLeftCorkscrewUp = TrackElementDescriptor{
.description = STR_HALF_CORKSCREW_LEFT,
.coordinates = { 0, 3, 0, 80, -32, -32 },
.pieceLength = 55,
.curveChain = { TrackElemType::rightCorkscrewDown, TrackCurve::none },
.priceModifier = 229376,
.mirrorElement = TrackElemType::rightCorkscrewUp,
.flags = { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::inversionToNormal },
.definition = { TrackGroup::corkscrew, TrackPitch::none, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none, 0 },
.verticalFactor = EvaluatorConst<52>,
.lateralFactor = EvaluatorConst<70>,
.sequenceData = { 3, { kLeftCorkscrewUpSeq0, kLeftCorkscrewUpSeq1, kLeftCorkscrewUpSeq2 } },
};
constexpr auto kTEDRightCorkscrewUp = TrackElementDescriptor{
.description = STR_HALF_CORKSCREW_RIGHT,
.coordinates = { 0, 1, 0, 80, -32, 32 },
.pieceLength = 55,
.curveChain = { TrackElemType::leftCorkscrewDown, TrackCurve::none },
.priceModifier = 229376,
.mirrorElement = TrackElemType::leftCorkscrewUp,
.flags = { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::inversionToNormal },
.definition = { TrackGroup::corkscrew, TrackPitch::none, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none, 0 },
.verticalFactor = EvaluatorConst<52>,
.lateralFactor = EvaluatorConst<-70>,
.sequenceData = { 3, { kRightCorkscrewUpSeq0, kRightCorkscrewUpSeq1, kRightCorkscrewUpSeq2 } },
};
constexpr auto kTEDLeftCorkscrewDown = TrackElementDescriptor{
.description = STR_HALF_CORKSCREW_LEFT,
.coordinates = { 0, 3, 0, -80, -32, -32 },
.pieceLength = 55,
.curveChain = { TrackCurve::none, TrackElemType::rightCorkscrewUp },
.priceModifier = 229376,
.mirrorElement = TrackElemType::rightCorkscrewDown,
.flags = { TrackElementFlag::down, TrackElementFlag::inversionToNormal },
.definition = { TrackGroup::corkscrew, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown,
-32 },
.verticalFactor = EvaluatorConst<52>,
.lateralFactor = EvaluatorConst<-70>,
.sequenceData = { 3, { kLeftCorkscrewDownSeq0, kLeftCorkscrewDownSeq1, kLeftCorkscrewDownSeq2 } },
};
constexpr auto kTEDRightCorkscrewDown = TrackElementDescriptor{
.description = STR_HALF_CORKSCREW_RIGHT,
.coordinates = { 0, 1, 0, -80, -32, 32 },
.pieceLength = 55,
.curveChain = { TrackCurve::none, TrackElemType::leftCorkscrewUp },
.priceModifier = 229376,
.mirrorElement = TrackElemType::leftCorkscrewDown,
.flags = { TrackElementFlag::down, TrackElementFlag::inversionToNormal },
.definition = { TrackGroup::corkscrew, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown,
-32 },
.verticalFactor = EvaluatorConst<52>,
.lateralFactor = EvaluatorConst<70>,
.sequenceData = { 3, { kRightCorkscrewDownSeq0, kRightCorkscrewDownSeq1, kRightCorkscrewDownSeq2 } },
};
constexpr auto kTEDLeftFlyerCorkscrewUp = TrackElementDescriptor{
.description = STR_HALF_CORKSCREW_LEFT,
.coordinates = { 0, 3, 0, 48, -32, -32 },
.pieceLength = 64,
.curveChain = { TrackCurve::none, TrackCurve::none },
.priceModifier = 229376,
.mirrorElement = TrackElemType::rightFlyerCorkscrewUp,
.flags = { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::inversionToNormal },
.definition = { TrackGroup::corkscrewUninverted, TrackPitch::none, TrackPitch::none, TrackRoll::upsideDown,
TrackRoll::none, 0 },
.verticalFactor = EvaluatorConst<52>,
.lateralFactor = EvaluatorConst<70>,
.sequenceData = { 3, { kLeftFlyerCorkscrewUpSeq0, kLeftFlyerCorkscrewUpSeq1, kLeftFlyerCorkscrewUpSeq2 } },
};
constexpr auto kTEDRightFlyerCorkscrewUp = TrackElementDescriptor{
.description = STR_HALF_CORKSCREW_RIGHT,
.coordinates = { 0, 1, 0, 48, -32, 32 },
.pieceLength = 64,
.curveChain = { TrackCurve::none, TrackCurve::none },
.priceModifier = 229376,
.mirrorElement = TrackElemType::leftFlyerCorkscrewUp,
.flags = { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::inversionToNormal },
.definition = { TrackGroup::corkscrewUninverted, TrackPitch::none, TrackPitch::none, TrackRoll::upsideDown,
TrackRoll::none, 0 },
.verticalFactor = EvaluatorConst<52>,
.lateralFactor = EvaluatorConst<-70>,
.sequenceData = { 3, { kRightFlyerCorkscrewUpSeq0, kRightFlyerCorkscrewUpSeq1, kRightFlyerCorkscrewUpSeq2 } },
};
constexpr auto kTEDLeftFlyerCorkscrewDown = TrackElementDescriptor{
.description = STR_HALF_CORKSCREW_LEFT,
.coordinates = { 0, 3, 0, -48, -32, -32 },
.pieceLength = 64,
.curveChain = { TrackCurve::none, TrackCurve::none },
.priceModifier = 229376,
.mirrorElement = TrackElemType::rightFlyerCorkscrewDown,
.flags = { TrackElementFlag::down, TrackElementFlag::inversionToNormal },
.definition = { TrackGroup::corkscrewInverted, TrackPitch::none, TrackPitch::none, TrackRoll::upsideDown,
TrackRoll::none, -32 },
.verticalFactor = EvaluatorConst<52>,
.lateralFactor = EvaluatorConst<-70>,
.sequenceData = { 3, { kLeftFlyerCorkscrewDownSeq0, kLeftFlyerCorkscrewDownSeq1, kLeftFlyerCorkscrewDownSeq2 } },
};
constexpr auto kTEDRightFlyerCorkscrewDown = TrackElementDescriptor{
.description = STR_HALF_CORKSCREW_RIGHT,
.coordinates = { 0, 1, 0, -48, -32, 32 },
.pieceLength = 64,
.curveChain = { TrackCurve::none, TrackCurve::none },
.priceModifier = 229376,
.mirrorElement = TrackElemType::leftFlyerCorkscrewDown,
.flags = { TrackElementFlag::down, TrackElementFlag::inversionToNormal },
.definition = { TrackGroup::corkscrewInverted, TrackPitch::none, TrackPitch::none, TrackRoll::upsideDown,
TrackRoll::none, -32 },
.verticalFactor = EvaluatorConst<52>,
.lateralFactor = EvaluatorConst<70>,
.sequenceData = { 3, { kRightFlyerCorkscrewDownSeq0, kRightFlyerCorkscrewDownSeq1, kRightFlyerCorkscrewDownSeq2 } },
};
constexpr auto kTEDLeftLargeCorkscrewUp = TrackElementDescriptor{
.description = STR_LARGE_HALF_CORKSCREW_LEFT,
.coordinates = { 0, 3, 0, 112, -64, -64 },
.pieceLength = 96,
.curveChain = { TrackElemType::rightLargeCorkscrewDown, TrackCurve::none },
.priceModifier = 360448,
.mirrorElement = TrackElemType::rightLargeCorkscrewUp,
.flags = { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::inversionToNormal },
.definition = { TrackGroup::corkscrewLarge, TrackPitch::none, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none,
32 },
.verticalFactor = EvaluatorConst<89>,
.lateralFactor = EvaluatorConst<117>,
.sequenceData = { 6,
{ kLeftLargeCorkscrewUpSeq0, kLeftLargeCorkscrewUpSeq1, kLeftLargeCorkscrewUpSeq2,
kLeftLargeCorkscrewUpSeq3, kLeftLargeCorkscrewUpSeq4, kLeftLargeCorkscrewUpSeq5 } },
};
constexpr auto kTEDRightLargeCorkscrewUp = TrackElementDescriptor{
.description = STR_LARGE_HALF_CORKSCREW_RIGHT,
.coordinates = { 0, 1, 0, 112, -64, 64 },
.pieceLength = 96,
.curveChain = { TrackElemType::leftLargeCorkscrewDown, TrackCurve::none },
.priceModifier = 360448,
.mirrorElement = TrackElemType::leftLargeCorkscrewUp,
.flags = { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::inversionToNormal },
.definition = { TrackGroup::corkscrewLarge, TrackPitch::none, TrackPitch::none, TrackRoll::upsideDown, TrackRoll::none,
32 },
.verticalFactor = EvaluatorConst<89>,
.lateralFactor = EvaluatorConst<-117>,
.sequenceData = { 6,
{ kRightLargeCorkscrewUpSeq0, kRightLargeCorkscrewUpSeq1, kRightLargeCorkscrewUpSeq2,
kRightLargeCorkscrewUpSeq3, kRightLargeCorkscrewUpSeq4, kRightLargeCorkscrewUpSeq5 } },
};
constexpr auto kTEDLeftLargeCorkscrewDown = TrackElementDescriptor{
.description = STR_LARGE_HALF_CORKSCREW_LEFT,
.coordinates = { 0, 3, 0, -112, -64, -64 },
.pieceLength = 96,
.curveChain = { TrackCurve::none, TrackElemType::rightLargeCorkscrewUp },
.priceModifier = 360448,
.mirrorElement = TrackElemType::rightLargeCorkscrewDown,
.flags = { TrackElementFlag::down, TrackElementFlag::inversionToNormal },
.definition = { TrackGroup::corkscrewLarge, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown,
-32 },
.verticalFactor = EvaluatorConst<89>,
.lateralFactor = EvaluatorConst<-117>,
.sequenceData = { 6,
{ kLeftLargeCorkscrewDownSeq0, kLeftLargeCorkscrewDownSeq1, kLeftLargeCorkscrewDownSeq2,
kLeftLargeCorkscrewDownSeq3, kLeftLargeCorkscrewDownSeq4, kLeftLargeCorkscrewDownSeq5 } },
};
constexpr auto kTEDRightLargeCorkscrewDown = TrackElementDescriptor{
.description = STR_LARGE_HALF_CORKSCREW_RIGHT,
.coordinates = { 0, 1, 0, -112, -64, 64 },
.pieceLength = 96,
.curveChain = { TrackCurve::none, TrackElemType::leftLargeCorkscrewUp },
.priceModifier = 360448,
.mirrorElement = TrackElemType::leftLargeCorkscrewDown,
.flags = { TrackElementFlag::down, TrackElementFlag::inversionToNormal },
.definition = { TrackGroup::corkscrewLarge, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown,
-32 },
.verticalFactor = EvaluatorConst<89>,
.lateralFactor = EvaluatorConst<117>,
.sequenceData = { 6,
{ kRightLargeCorkscrewDownSeq0, kRightLargeCorkscrewDownSeq1, kRightLargeCorkscrewDownSeq2,
kRightLargeCorkscrewDownSeq3, kRightLargeCorkscrewDownSeq4, kRightLargeCorkscrewDownSeq5 } },
};
} // namespace OpenRCT2::TrackMetadata
+294
View File
@@ -0,0 +1,294 @@
/*****************************************************************************
* Copyright (c) 2014-2026 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
#pragma once
#include "../../localisation/StringIds.h"
#include "TrackElementDescriptor.h"
#include <cstdint>
namespace OpenRCT2::TrackMetadata
{
using PS = PaintSegment;
static int32_t EvaluatorDiveLoopUp(const int16_t progress)
{
return 385 - 2 * progress;
}
static int32_t EvaluatorDiveLoopDown(const int16_t progress)
{
return 67 + 2 * progress;
}
static int32_t EvaluatorDiveLoopUpLeft(const int16_t progress)
{
return 380 - 2 * progress;
}
static int32_t EvaluatorDiveLoopUpRight(const int16_t progress)
{
return 2 * progress - 380;
}
static int32_t EvaluatorDiveLoopDownLeft(const int16_t progress)
{
return -(62 + 2 * progress);
}
static int32_t EvaluatorDiveLoopDownRight(const int16_t progress)
{
return 62 + 2 * progress;
}
static constexpr SequenceDescriptor kLeftEighthDiveLoopUpToOrthogonalSeq0 = {
.clearance = { 0, 0, 0, 64, { 0b1101, 0 }, {} },
.allowedWallEdges = 0b0000,
.flags = { SequenceFlag::hasHeightMarker },
.blockedSegments = { {
EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kLeftEighthDiveLoopUpToOrthogonalSeq1 = {
.clearance = { 0, 32, 0, 88, { 0b0100, 0 }, {} },
.allowedWallEdges = 0b0110,
.blockedSegments = { {
EnumsToFlags(PS::top, PS::centre, PS::topLeft, PS::topRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kLeftEighthDiveLoopUpToOrthogonalSeq2 = {
.clearance = { -32, 0, 0, 88, { 0b0001, 0 }, {} },
.allowedWallEdges = 0b1001,
.blockedSegments = { {
EnumsToFlags(PS::bottom, PS::centre, PS::bottomLeft, PS::bottomRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kLeftEighthDiveLoopUpToOrthogonalSeq3 = {
.clearance = { -32, 32, 32, 80, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0010,
.blockedSegments = { {
EnumsToFlags(PS::top, PS::left, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kLeftEighthDiveLoopUpToOrthogonalSeq4 = {
.clearance = { -64, 32, 80, 48, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.invertSegmentBlocking = true,
.blockedSegments = { {
EnumsToFlags(PS::top, PS::left, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kLeftEighthDiveLoopUpToOrthogonalSeq5 = {
.clearance = { -96, 32, 112, 24, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.invertSegmentBlocking = true,
.blockedSegments = { {
EnumsToFlags(PS::top, PS::left, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kRightEighthDiveLoopUpToOrthogonalSeq0 = {
.clearance = { 0, 0, 0, 64, { 0b1101, 0 }, {} },
.allowedWallEdges = 0b0000,
.flags = { SequenceFlag::hasHeightMarker },
.blockedSegments = blockedSegmentsRotate(
blockedSegmentsFlipXAxis(kLeftEighthDiveLoopUpToOrthogonalSeq0.blockedSegments), 1),
};
static constexpr SequenceDescriptor kRightEighthDiveLoopUpToOrthogonalSeq1 = {
.clearance = { -32, 0, 0, 88, { 0b0001, 0 }, {} },
.allowedWallEdges = 0b1001,
.blockedSegments = blockedSegmentsRotate(
blockedSegmentsFlipXAxis(kLeftEighthDiveLoopUpToOrthogonalSeq1.blockedSegments), 1),
};
static constexpr SequenceDescriptor kRightEighthDiveLoopUpToOrthogonalSeq2 = {
.clearance = { 0, 32, 0, 88, { 0b0100, 0 }, {} },
.allowedWallEdges = 0b0110,
.blockedSegments = blockedSegmentsRotate(
blockedSegmentsFlipXAxis(kLeftEighthDiveLoopUpToOrthogonalSeq2.blockedSegments), 1),
};
static constexpr SequenceDescriptor kRightEighthDiveLoopUpToOrthogonalSeq3 = {
.clearance = { -32, 32, 32, 80, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0001,
.blockedSegments = blockedSegmentsRotate(
blockedSegmentsFlipXAxis(kLeftEighthDiveLoopUpToOrthogonalSeq3.blockedSegments), 1),
};
static constexpr SequenceDescriptor kRightEighthDiveLoopUpToOrthogonalSeq4 = {
.clearance = { -32, 64, 80, 48, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0101,
.invertSegmentBlocking = true,
.blockedSegments = blockedSegmentsRotate(
blockedSegmentsFlipXAxis(kLeftEighthDiveLoopUpToOrthogonalSeq4.blockedSegments), 1),
};
static constexpr SequenceDescriptor kRightEighthDiveLoopUpToOrthogonalSeq5 = {
.clearance = { -32, 96, 112, 24, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0101,
.flags = { SequenceFlag::hasHeightMarker },
.invertSegmentBlocking = true,
.blockedSegments = blockedSegmentsRotate(
blockedSegmentsFlipXAxis(kLeftEighthDiveLoopUpToOrthogonalSeq5.blockedSegments), 1),
};
static constexpr SequenceDescriptor kLeftEighthDiveLoopDownToDiagSeq0 = {
.clearance = { 0, 0, 112, 24, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.invertSegmentBlocking = true,
.blockedSegments = blockedSegmentsRotate(kRightEighthDiveLoopUpToOrthogonalSeq5.blockedSegments, 1),
};
static constexpr SequenceDescriptor kLeftEighthDiveLoopDownToDiagSeq1 = {
.clearance = { -32, 0, 80, 48, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.invertSegmentBlocking = true,
.blockedSegments = blockedSegmentsRotate(kRightEighthDiveLoopUpToOrthogonalSeq4.blockedSegments, 1),
};
static constexpr SequenceDescriptor kLeftEighthDiveLoopDownToDiagSeq2 = {
.clearance = { -64, 0, 32, 80, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0010,
.blockedSegments = blockedSegmentsRotate(kRightEighthDiveLoopUpToOrthogonalSeq3.blockedSegments, 1),
};
static constexpr SequenceDescriptor kLeftEighthDiveLoopDownToDiagSeq3 = {
.clearance = { -64, -32, 0, 88, { 0b1000, 0 }, {} },
.allowedWallEdges = 0b1100,
.blockedSegments = blockedSegmentsRotate(kRightEighthDiveLoopUpToOrthogonalSeq2.blockedSegments, 1),
};
static constexpr SequenceDescriptor kLeftEighthDiveLoopDownToDiagSeq4 = {
.clearance = { -96, 0, 0, 88, { 0b0010, 0 }, {} },
.allowedWallEdges = 0b0011,
.blockedSegments = blockedSegmentsRotate(kRightEighthDiveLoopUpToOrthogonalSeq1.blockedSegments, 1),
};
static constexpr SequenceDescriptor kLeftEighthDiveLoopDownToDiagSeq5 = {
.clearance = { -96, -32, 0, 64, { 0b0001, 0 }, {} },
.allowedWallEdges = 0b0000,
.flags = { SequenceFlag::hasHeightMarker },
.blockedSegments = blockedSegmentsRotate(kRightEighthDiveLoopUpToOrthogonalSeq0.blockedSegments, 1),
};
static constexpr SequenceDescriptor kRightEighthDiveLoopDownToDiagSeq0 = {
.clearance = { 0, 0, 112, 24, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.invertSegmentBlocking = true,
.blockedSegments = blockedSegmentsRotate(kLeftEighthDiveLoopUpToOrthogonalSeq5.blockedSegments, 2),
};
static constexpr SequenceDescriptor kRightEighthDiveLoopDownToDiagSeq1 = {
.clearance = { -32, 0, 80, 48, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.invertSegmentBlocking = true,
.blockedSegments = blockedSegmentsRotate(kLeftEighthDiveLoopUpToOrthogonalSeq4.blockedSegments, 2),
};
static constexpr SequenceDescriptor kRightEighthDiveLoopDownToDiagSeq2 = {
.clearance = { -64, 0, 32, 80, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1000,
.blockedSegments = blockedSegmentsRotate(kLeftEighthDiveLoopUpToOrthogonalSeq3.blockedSegments, 2),
};
static constexpr SequenceDescriptor kRightEighthDiveLoopDownToDiagSeq3 = {
.clearance = { -64, 32, 0, 88, { 0b0100, 0 }, {} },
.allowedWallEdges = 0b0110,
.blockedSegments = blockedSegmentsRotate(kLeftEighthDiveLoopUpToOrthogonalSeq2.blockedSegments, 2),
};
static constexpr SequenceDescriptor kRightEighthDiveLoopDownToDiagSeq4 = {
.clearance = { -96, 0, 0, 88, { 0b0001, 0 }, {} },
.allowedWallEdges = 0b1001,
.blockedSegments = blockedSegmentsRotate(kLeftEighthDiveLoopUpToOrthogonalSeq1.blockedSegments, 2),
};
static constexpr SequenceDescriptor kRightEighthDiveLoopDownToDiagSeq5 = {
.clearance = { -96, 32, 0, 64, { 0b0010, 0 }, {} },
.allowedWallEdges = 0b0000,
.flags = { SequenceFlag::hasHeightMarker },
.blockedSegments = blockedSegmentsRotate(kLeftEighthDiveLoopUpToOrthogonalSeq0.blockedSegments, 2),
};
constexpr auto kTEDLeftEighthDiveLoopUpToOrthogonal = TrackElementDescriptor{
.description = STR_DIVE_LOOP_LEFT,
.coordinates = { 4, 0, 0, 152, -96, 32 },
.pieceLength = 165,
.curveChain = { TrackElemType::rightEighthDiveLoopDownToDiag, TrackCurve::none },
.priceModifier = 458752,
.mirrorElement = TrackElemType::rightEighthDiveLoopUpToOrthogonal,
.flags = { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::normalToInversion,
TrackElementFlag::inversionToNormal },
.definition = { TrackGroup::diveLoop, TrackPitch::none, TrackPitch::up60, TrackRoll::upsideDown, TrackRoll::none, 56 },
.spinFunction = SpinFunction::l9,
.verticalFactor = EvaluatorDiveLoopUp,
.lateralFactor = EvaluatorDiveLoopUpLeft,
.sequenceData = { 6,
{ kLeftEighthDiveLoopUpToOrthogonalSeq0, kLeftEighthDiveLoopUpToOrthogonalSeq1,
kLeftEighthDiveLoopUpToOrthogonalSeq2, kLeftEighthDiveLoopUpToOrthogonalSeq3,
kLeftEighthDiveLoopUpToOrthogonalSeq4, kLeftEighthDiveLoopUpToOrthogonalSeq5 } },
};
constexpr auto kTEDRightEighthDiveLoopUpToOrthogonal = TrackElementDescriptor{
.description = STR_DIVE_LOOP_RIGHT,
.coordinates = { 4, 1, 0, 152, -32, 96 },
.pieceLength = 165,
.curveChain = { TrackElemType::leftEighthDiveLoopDownToDiag, TrackCurve::none },
.priceModifier = 458752,
.mirrorElement = TrackElemType::leftEighthDiveLoopUpToOrthogonal,
.flags = { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::normalToInversion,
TrackElementFlag::inversionToNormal },
.definition = { TrackGroup::diveLoop, TrackPitch::none, TrackPitch::up60, TrackRoll::upsideDown, TrackRoll::none, 56 },
.spinFunction = SpinFunction::r9,
.verticalFactor = EvaluatorDiveLoopUp,
.lateralFactor = EvaluatorDiveLoopUpRight,
.sequenceData = { 6,
{ kRightEighthDiveLoopUpToOrthogonalSeq0, kRightEighthDiveLoopUpToOrthogonalSeq1,
kRightEighthDiveLoopUpToOrthogonalSeq2, kRightEighthDiveLoopUpToOrthogonalSeq3,
kRightEighthDiveLoopUpToOrthogonalSeq4, kRightEighthDiveLoopUpToOrthogonalSeq5 } },
};
constexpr auto kTEDLeftEighthDiveLoopDownToDiag = TrackElementDescriptor{
.description = STR_DIVE_LOOP_LEFT,
.coordinates = { 0, 7, 152, 0, -96, -32 },
.pieceLength = 165,
.curveChain = { TrackCurve::none, TrackElemType::rightEighthDiveLoopUpToOrthogonal },
.priceModifier = 458752,
.mirrorElement = TrackElemType::rightEighthDiveLoopDownToDiag,
.flags = { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::inversionToNormal },
.definition = { TrackGroup::diveLoop, TrackPitch::down60, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown,
-56 },
.spinFunction = SpinFunction::l9,
.verticalFactor = EvaluatorDiveLoopDown,
.lateralFactor = EvaluatorDiveLoopDownLeft,
.sequenceData = { 6,
{ kLeftEighthDiveLoopDownToDiagSeq0, kLeftEighthDiveLoopDownToDiagSeq1,
kLeftEighthDiveLoopDownToDiagSeq2, kLeftEighthDiveLoopDownToDiagSeq3,
kLeftEighthDiveLoopDownToDiagSeq4, kLeftEighthDiveLoopDownToDiagSeq5 } },
};
constexpr auto kTEDRightEighthDiveLoopDownToDiag = TrackElementDescriptor{
.description = STR_DIVE_LOOP_RIGHT,
.coordinates = { 0, 4, 152, 0, -96, 32 },
.pieceLength = 165,
.curveChain = { TrackCurve::none, TrackElemType::leftEighthDiveLoopUpToOrthogonal },
.priceModifier = 458752,
.mirrorElement = TrackElemType::leftEighthDiveLoopDownToDiag,
.flags = { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight, TrackElementFlag::inversionToNormal },
.definition = { TrackGroup::diveLoop, TrackPitch::down60, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown,
-56 },
.spinFunction = SpinFunction::r9,
.verticalFactor = EvaluatorDiveLoopDown,
.lateralFactor = EvaluatorDiveLoopDownRight,
.sequenceData = { 6,
{ kRightEighthDiveLoopDownToDiagSeq0, kRightEighthDiveLoopDownToDiagSeq1,
kRightEighthDiveLoopDownToDiagSeq2, kRightEighthDiveLoopDownToDiagSeq3,
kRightEighthDiveLoopDownToDiagSeq4, kRightEighthDiveLoopDownToDiagSeq5 } },
};
} // namespace OpenRCT2::TrackMetadata
+477
View File
@@ -0,0 +1,477 @@
/*****************************************************************************
* Copyright (c) 2014-2026 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
#pragma once
#include "../../localisation/StringIds.h"
#include "TrackElementDescriptor.h"
namespace OpenRCT2::TrackMetadata
{
using PS = PaintSegment;
static constexpr SequenceDescriptor kFlatTrack1x4ASeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin,
SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack1x4ASeq1 = {
.clearance = { -64, 0, 0, 0, { 0b1111, 0 }, {} },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack1x4ASeq2 = {
.clearance = { -32, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionNW, SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack1x4ASeq3 = {
.clearance = { 32, 0, 0, 0, { 0b1111, 0 }, { ClearanceFlag::flag1 } },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack2x2Seq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin,
SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack2x2Seq1 = {
.clearance = { 0, 32, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack2x2Seq2 = {
.clearance = { 32, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionSW, SequenceFlag::entranceConnectionNW, SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack2x2Seq3 = {
.clearance = { 32, 32, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack4x4Seq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin,
SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack4x4Seq1 = {
.clearance = { 0, 32, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionNE },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack4x4Seq2 = {
.clearance = { 0, 64, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionNE },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack4x4Seq3 = {
.clearance = { 0, 96, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack4x4Seq4 = {
.clearance = { 32, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionNW },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack4x4Seq5 = {
.clearance = { 32, 32, 0, 0, { 0b1111, 0 }, {} },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack4x4Seq6 = {
.clearance = { 32, 64, 0, 0, { 0b1111, 0 }, {} },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack4x4Seq7 = {
.clearance = { 32, 96, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionSE },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack4x4Seq8 = {
.clearance = { 64, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionNW },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack4x4Seq9 = {
.clearance = { 64, 32, 0, 0, { 0b1111, 0 }, {} },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack4x4Seq10 = {
.clearance = { 64, 64, 0, 0, { 0b1111, 0 }, {} },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack4x4Seq11 = {
.clearance = { 64, 96, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionSE },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack4x4Seq12 = {
.clearance = { 96, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionSW, SequenceFlag::entranceConnectionNW, SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack4x4Seq13 = {
.clearance = { 96, 32, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionSW },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack4x4Seq14 = {
.clearance = { 96, 64, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionSW },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack4x4Seq15 = {
.clearance = { 96, 96, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack2x4Seq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin,
SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack2x4Seq1 = {
.clearance = { 0, 32, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionNE },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack2x4Seq2 = {
.clearance = { 0, 64, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionNE },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack2x4Seq3 = {
.clearance = { 0, 96, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack2x4Seq4 = {
.clearance = { 32, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionSW, SequenceFlag::entranceConnectionNW, SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack2x4Seq5 = {
.clearance = { 32, 32, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionSW },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack2x4Seq6 = {
.clearance = { 32, 64, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionSW },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack2x4Seq7 = {
.clearance = { 32, 96, 0, 0, { 0b1111, 0 }, { ClearanceFlag::flag1 } },
.flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack1x5Seq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack1x5Seq1 = {
.clearance = { -64, 0, 0, 0, { 0b1111, 0 }, {} },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack1x5Seq2 = {
.clearance = { -32, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionNW, SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack1x5Seq3 = {
.clearance = { 32, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionNW, SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack1x5Seq4 = {
.clearance = { 64, 0, 0, 0, { 0b1111, 0 }, { ClearanceFlag::flag1 } },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack1x1ASeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::trackOrigin, SequenceFlag::connectsToPath,
SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack1x4BSeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::trackOrigin, SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack1x4BSeq1 = {
.clearance = { -64, 0, 0, 0, { 0b1111, 0 }, {} },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack1x4BSeq2 = {
.clearance = { -32, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack1x4BSeq3 = {
.clearance = { 32, 0, 0, 0, { 0b1111, 0 }, { ClearanceFlag::flag1 } },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack1x1BSeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW,
SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin, SequenceFlag::connectsToPath,
SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack1x4CSeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack1x4CSeq1 = {
.clearance = { -64, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionNW,
SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack1x4CSeq2 = {
.clearance = { -32, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionNW },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack1x4CSeq3 = {
.clearance = { 32, 0, 0, 0, { 0b1111, 0 }, { ClearanceFlag::flag1 } },
.flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, SequenceFlag::entranceConnectionNW,
SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack3x3Seq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::trackOrigin },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack3x3Seq1 = {
.clearance = { -32, -32, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionNW, SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack3x3Seq2 = {
.clearance = { -32, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionNE },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack3x3Seq3 = {
.clearance = { -32, 32, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack3x3Seq4 = {
.clearance = { 0, -32, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionNW },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack3x3Seq5 = {
.clearance = { 0, 32, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionSE },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack3x3Seq6 = {
.clearance = { 32, -32, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionSW, SequenceFlag::entranceConnectionNW, SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack3x3Seq7 = {
.clearance = { 32, 32, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW, SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kFlatTrack3x3Seq8 = {
.clearance = { 32, 0, 0, 0, { 0b1111, 0 }, { ClearanceFlag::flag1 } },
.flags = { SequenceFlag::entranceConnectionSW },
.woodenSupports = { WoodenSupportSubType::neSw },
};
constexpr auto kTEDFlatTrack1x4A = TrackElementDescriptor{
.coordinates = { 0, 2, 0, 0, 0, 32 },
.pieceLength = 0,
.curveChain = { TrackElemType::none, TrackElemType::none },
.priceModifier = 262144,
.mirrorElement = TrackElemType::flatTrack1x4A,
.flags = {},
.definition = { TrackGroup::flatRideBase, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.sequenceData = { 4, { kFlatTrack1x4ASeq0, kFlatTrack1x4ASeq1, kFlatTrack1x4ASeq2, kFlatTrack1x4ASeq3 } },
};
constexpr auto kTEDFlatTrack2x2 = TrackElementDescriptor{
.description = STR_BASE_SIZE_2_X_2,
.coordinates = { 0, 2, 0, 0, 0, 32 },
.pieceLength = 0,
.curveChain = { TrackCurve::none, TrackCurve::none },
.priceModifier = 262144,
.mirrorElement = TrackElemType::flatTrack2x2,
.flags = {},
.definition = { TrackGroup::flatRideBase, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.sequenceData = { 4, { kFlatTrack2x2Seq0, kFlatTrack2x2Seq1, kFlatTrack2x2Seq2, kFlatTrack2x2Seq3 } },
};
constexpr auto kTEDFlatTrack4x4 = TrackElementDescriptor{
.description = STR_BASE_SIZE_4_X_4,
.coordinates = { 0, 2, 0, 0, 0, 32 },
.pieceLength = 0,
.curveChain = { TrackCurve::none, TrackCurve::none },
.priceModifier = 1048576, // TrackElemType::flatTrack4x4
.mirrorElement = TrackElemType::flatTrack4x4,
.flags = {},
.definition = { TrackGroup::flatRideBase, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.sequenceData = { 16,
{ kFlatTrack4x4Seq0, kFlatTrack4x4Seq1, kFlatTrack4x4Seq2, kFlatTrack4x4Seq3, kFlatTrack4x4Seq4,
kFlatTrack4x4Seq5, kFlatTrack4x4Seq6, kFlatTrack4x4Seq7, kFlatTrack4x4Seq8, kFlatTrack4x4Seq9,
kFlatTrack4x4Seq10, kFlatTrack4x4Seq11, kFlatTrack4x4Seq12, kFlatTrack4x4Seq13, kFlatTrack4x4Seq14,
kFlatTrack4x4Seq15 } },
};
constexpr auto kTEDFlatTrack2x4 = TrackElementDescriptor{
.description = STR_BASE_SIZE_2_X_4,
.coordinates = { 0, 2, 0, 0, 0, 32 },
.pieceLength = 0,
.curveChain = { TrackElemType::none, TrackElemType::none },
.priceModifier = 524288,
.mirrorElement = TrackElemType::flatTrack2x4,
.flags = { TrackElementFlag::onlyAboveGround },
.definition = { TrackGroup::flatRideBase, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.sequenceData = { 8,
{ kFlatTrack2x4Seq0, kFlatTrack2x4Seq1, kFlatTrack2x4Seq2, kFlatTrack2x4Seq3, kFlatTrack2x4Seq4,
kFlatTrack2x4Seq5, kFlatTrack2x4Seq6, kFlatTrack2x4Seq7 } },
};
constexpr auto kTEDFlatTrack1x5 = TrackElementDescriptor{
.description = STR_BASE_SIZE_5_X_1,
.coordinates = { 0, 2, 0, 0, 0, 32 },
.pieceLength = 0,
.curveChain = { TrackElemType::none, TrackElemType::none },
.priceModifier = 327680,
.mirrorElement = TrackElemType::flatTrack1x5,
.flags = {},
.definition = { TrackGroup::flatRideBase, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.sequenceData = { 5,
{ kFlatTrack1x5Seq0, kFlatTrack1x5Seq1, kFlatTrack1x5Seq2, kFlatTrack1x5Seq3, kFlatTrack1x5Seq4 } },
};
constexpr auto kTEDFlatTrack1x1A = TrackElementDescriptor{
.coordinates = { 0, 2, 0, 0, 0, 32 },
.pieceLength = 0,
.curveChain = { TrackElemType::none, TrackElemType::none },
.priceModifier = 65536,
.mirrorElement = TrackElemType::flatTrack1x1A,
.flags = {},
.definition = { TrackGroup::flatRideBase, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.sequenceData = { 1, { kFlatTrack1x1ASeq0 } },
};
constexpr auto kTEDFlatTrack1x4B = TrackElementDescriptor{
.coordinates = { 0, 2, 0, 0, 0, 32 },
.pieceLength = 0,
.curveChain = { TrackElemType::none, TrackElemType::none },
.priceModifier = 262144,
.mirrorElement = TrackElemType::flatTrack1x4B,
.flags = {},
.definition = { TrackGroup::flatRideBase, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.sequenceData = { 4, { kFlatTrack1x4BSeq0, kFlatTrack1x4BSeq1, kFlatTrack1x4BSeq2, kFlatTrack1x4BSeq3 } },
};
constexpr auto kTEDFlatTrack1x1B = TrackElementDescriptor{
.coordinates = { 0, 2, 0, 0, 0, 32 },
.pieceLength = 0,
.curveChain = { TrackElemType::none, TrackElemType::none },
.priceModifier = 65536,
.mirrorElement = TrackElemType::flatTrack1x1B,
.flags = {},
.definition = { TrackGroup::flatRideBase, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.sequenceData = { 1, { kFlatTrack1x1BSeq0 } },
};
constexpr auto kTEDFlatTrack1x4C = TrackElementDescriptor{
.coordinates = { 0, 2, 0, 0, 0, 32 },
.pieceLength = 0,
.curveChain = { TrackElemType::none, TrackElemType::none },
.priceModifier = 262144,
.mirrorElement = TrackElemType::flatTrack1x4C,
.flags = {},
.definition = { TrackGroup::flatRideBase, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, -40 },
.sequenceData = { 4, { kFlatTrack1x4CSeq0, kFlatTrack1x4CSeq1, kFlatTrack1x4CSeq2, kFlatTrack1x4CSeq3 } },
};
constexpr auto kTEDFlatTrack3x3 = TrackElementDescriptor{
.coordinates = { 0, 0, 0, 96, 32, 0 },
.pieceLength = 0,
.curveChain = { TrackElemType::none, TrackElemType::none },
.priceModifier = 524288,
.mirrorElement = TrackElemType::flatTrack3x3,
.flags = {},
.definition = { TrackGroup::flatRideBase, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.sequenceData = { 9,
{ kFlatTrack3x3Seq0, kFlatTrack3x3Seq1, kFlatTrack3x3Seq2, kFlatTrack3x3Seq3, kFlatTrack3x3Seq4,
kFlatTrack3x3Seq5, kFlatTrack3x3Seq6, kFlatTrack3x3Seq7, kFlatTrack3x3Seq8 } },
};
} // namespace OpenRCT2::TrackMetadata
+935
View File
@@ -0,0 +1,935 @@
/*****************************************************************************
* Copyright (c) 2014-2026 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
#pragma once
#include "../../localisation/StringIds.h"
#include "TrackElementDescriptor.h"
namespace OpenRCT2::TrackMetadata
{
using PS = PaintSegment;
static constexpr SequenceDescriptor kLeftHalfBankedHelixUpSmallSeq0 = {
.clearance = { 0, 0, 0, 0, { 0b0111, 0 }, {} },
.allowedWallEdges = 0b0010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::corner3 },
.metalSupports = { MetalSupportPlace::centre },
.blockedSegments = { {
EnumsToFlags(PS::top, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixUpSmallSeq1 = {
.clearance = { 0, -32, 0, 0, { 0b1000, 0 }, { ClearanceFlag::flag0 } },
.allowedWallEdges = 0b1100,
.woodenSupports = { WoodenSupportSubType::corner1 },
.blockedSegments = { {
kSegmentsNone, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsNone, // wide
} },
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixUpSmallSeq2 = {
.clearance = { -32, 0, 0, 4, { 0b0010, 0 }, {} },
.allowedWallEdges = 0b0011,
.blockedSegments = { {
EnumsToFlags(PS::left, PS::centre, PS::topLeft, PS::bottomLeft), // narrow
kSegmentsUnimplemented, // inverted
EnumsToFlags(PS::left, PS::centre, PS::topLeft, PS::bottomLeft), // wide
} },
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixUpSmallSeq3 = {
.clearance = { -32, -32, 0, 4, { 0b0111, 0 }, {} },
.allowedWallEdges = 0b0001,
.woodenSupports = { WoodenSupportSubType::corner3 },
.metalSupports = { MetalSupportPlace::centre },
.extraSupportRotation = -1,
.blockedSegments = { {
EnumsToFlags(PS::bottom, PS::centre, PS::topLeft, PS::bottomLeft, PS::bottomRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixUpSmallSeq4 = {
.clearance = { -32, -64, 8, 0, { 0b1011, 0 }, {} },
.allowedWallEdges = 0b0001,
.woodenSupports = { WoodenSupportSubType::corner2 },
.metalSupports = { MetalSupportPlace::centre },
.extraSupportRotation = -1,
.blockedSegments = { {
EnumsToFlags(PS::left, PS::centre, PS::topLeft, PS::bottomLeft, PS::bottomRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixUpSmallSeq5 = {
.clearance = { 0, -64, 8, 0, { 0b0100, 0b0000 }, { ClearanceFlag::flag0 } },
.allowedWallEdges = 0b0110,
.woodenSupports = { WoodenSupportSubType::corner0 },
.blockedSegments = { {
kSegmentsNone, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsNone, // wide
} },
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixUpSmallSeq6 = {
.clearance = { -32, -96, 8, 4, { 0b0001, 0 }, {} },
.allowedWallEdges = 0b1001,
.blockedSegments = { {
EnumsToFlags(PS::bottom, PS::centre, PS::bottomLeft, PS::bottomRight), // narrow
kSegmentsUnimplemented, // inverted
EnumsToFlags(PS::bottom, PS::centre, PS::bottomLeft, PS::bottomRight), // wide
} },
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixUpSmallSeq7 = {
.clearance = { 0, -96, 8, 4, { 0b1011, 0 }, {} },
.allowedWallEdges = 0b1000,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::corner2 },
.metalSupports = { MetalSupportPlace::centre },
.extraSupportRotation = -2,
.blockedSegments = { {
EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomLeft, PS::bottomRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kRightHalfBankedHelixUpSmallSeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1011, 0 }, {} },
.allowedWallEdges = 0b1000,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::corner2 },
.metalSupports = { MetalSupportPlace::centre },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHalfBankedHelixUpSmallSeq0.blockedSegments),
};
static constexpr SequenceDescriptor kRightHalfBankedHelixUpSmallSeq1 = {
.clearance = { 0, 32, 0, 0, { 0b0100, 0b0000 }, { ClearanceFlag::flag0 } },
.allowedWallEdges = 0b0110,
.woodenSupports = { WoodenSupportSubType::corner0 },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHalfBankedHelixUpSmallSeq1.blockedSegments),
};
static constexpr SequenceDescriptor kRightHalfBankedHelixUpSmallSeq2 = {
.clearance = { -32, 0, 0, 4, { 0b0001, 0 }, {} },
.allowedWallEdges = 0b1001,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHalfBankedHelixUpSmallSeq2.blockedSegments),
};
static constexpr SequenceDescriptor kRightHalfBankedHelixUpSmallSeq3 = {
.clearance = { -32, 32, 0, 4, { 0b1011, 0 }, {} },
.allowedWallEdges = 0b0001,
.woodenSupports = { WoodenSupportSubType::corner2 },
.metalSupports = { MetalSupportPlace::centre },
.extraSupportRotation = 1,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHalfBankedHelixUpSmallSeq3.blockedSegments),
};
static constexpr SequenceDescriptor kRightHalfBankedHelixUpSmallSeq4 = {
.clearance = { -32, 64, 8, 0, { 0b0111, 0 }, {} },
.allowedWallEdges = 0b0001,
.woodenSupports = { WoodenSupportSubType::corner3 },
.metalSupports = { MetalSupportPlace::centre },
.extraSupportRotation = 1,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHalfBankedHelixUpSmallSeq4.blockedSegments),
};
static constexpr SequenceDescriptor kRightHalfBankedHelixUpSmallSeq5 = {
.clearance = { 0, 64, 8, 0, { 0b1000, 0 }, { ClearanceFlag::flag0 } },
.allowedWallEdges = 0b1100,
.woodenSupports = { WoodenSupportSubType::corner1 },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHalfBankedHelixUpSmallSeq5.blockedSegments),
};
static constexpr SequenceDescriptor kRightHalfBankedHelixUpSmallSeq6 = {
.clearance = { -32, 96, 8, 4, { 0b0010, 0 }, {} },
.allowedWallEdges = 0b0011,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHalfBankedHelixUpSmallSeq6.blockedSegments),
};
static constexpr SequenceDescriptor kRightHalfBankedHelixUpSmallSeq7 = {
.clearance = { 0, 96, 8, 4, { 0b0111, 0 }, {} },
.allowedWallEdges = 0b0010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::corner3 },
.metalSupports = { MetalSupportPlace::centre },
.extraSupportRotation = 2,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHalfBankedHelixUpSmallSeq7.blockedSegments),
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixDownSmallSeq0 = {
.clearance = { 0, 0, 8, 4, { 0b0111, 0 }, {} },
.allowedWallEdges = 0b0010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::corner2 },
.metalSupports = { MetalSupportPlace::centre },
.blockedSegments = kLeftHalfBankedHelixUpSmallSeq0.blockedSegments,
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixDownSmallSeq1 = {
.clearance = { 0, -32, 8, 4, { 0b1000, 0 }, { ClearanceFlag::flag0 } },
.allowedWallEdges = 0b1100,
.woodenSupports = { WoodenSupportSubType::corner0 },
.blockedSegments = kLeftHalfBankedHelixUpSmallSeq1.blockedSegments,
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixDownSmallSeq2 = {
.clearance = { -32, 0, 8, 0, { 0b0010, 0 }, {} },
.allowedWallEdges = 0b0011,
.blockedSegments = kLeftHalfBankedHelixUpSmallSeq2.blockedSegments,
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixDownSmallSeq3 = {
.clearance = { -32, -32, 8, 0, { 0b0111, 0 }, {} },
.allowedWallEdges = 0b0001,
.woodenSupports = { WoodenSupportSubType::corner2 },
.metalSupports = { MetalSupportPlace::centre },
.extraSupportRotation = -1,
.blockedSegments = kLeftHalfBankedHelixUpSmallSeq3.blockedSegments,
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixDownSmallSeq4 = {
.clearance = { -32, -64, 0, 4, { 0b1011, 0 }, {} },
.allowedWallEdges = 0b0001,
.woodenSupports = { WoodenSupportSubType::corner3 },
.metalSupports = { MetalSupportPlace::centre },
.extraSupportRotation = -1,
.blockedSegments = kLeftHalfBankedHelixUpSmallSeq4.blockedSegments,
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixDownSmallSeq5 = {
.clearance = { 0, -64, 0, 4, { 0b0100, 0 }, { ClearanceFlag::flag0 } },
.allowedWallEdges = 0b0110,
.woodenSupports = { WoodenSupportSubType::corner1 },
.blockedSegments = kLeftHalfBankedHelixUpSmallSeq5.blockedSegments,
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixDownSmallSeq6 = {
.clearance = { -32, -96, 0, 0, { 0b0001, 0 }, {} },
.allowedWallEdges = 0b1001,
.blockedSegments = kLeftHalfBankedHelixUpSmallSeq6.blockedSegments,
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixDownSmallSeq7 = {
.clearance = { 0, -96, 0, 0, { 0b1011, 0 }, {} },
.allowedWallEdges = 0b1000,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::corner3 },
.metalSupports = { MetalSupportPlace::centre },
.extraSupportRotation = -2,
.blockedSegments = kLeftHalfBankedHelixUpSmallSeq7.blockedSegments,
};
static constexpr SequenceDescriptor kRightHalfBankedHelixDownSmallSeq0 = {
.clearance = { 0, 0, 8, 4, { 0b1011, 0 }, {} },
.allowedWallEdges = 0b1000,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::corner3 },
.metalSupports = { MetalSupportPlace::centre },
.blockedSegments = kRightHalfBankedHelixUpSmallSeq0.blockedSegments,
};
static constexpr SequenceDescriptor kRightHalfBankedHelixDownSmallSeq1 = {
.clearance = { 0, 32, 8, 4, { 0b0100, 0 }, { ClearanceFlag::flag0 } },
.allowedWallEdges = 0b0110,
.woodenSupports = { WoodenSupportSubType::corner1 },
.blockedSegments = kRightHalfBankedHelixUpSmallSeq1.blockedSegments,
};
static constexpr SequenceDescriptor kRightHalfBankedHelixDownSmallSeq2 = {
.clearance = { -32, 0, 8, 0, { 0b0001, 0 }, {} },
.allowedWallEdges = 0b1001,
.blockedSegments = kRightHalfBankedHelixUpSmallSeq2.blockedSegments,
};
static constexpr SequenceDescriptor kRightHalfBankedHelixDownSmallSeq3 = {
.clearance = { -32, 32, 8, 0, { 0b1011, 0 }, {} },
.allowedWallEdges = 0b0001,
.woodenSupports = { WoodenSupportSubType::corner3 },
.metalSupports = { MetalSupportPlace::centre },
.extraSupportRotation = 1,
.blockedSegments = kRightHalfBankedHelixUpSmallSeq3.blockedSegments,
};
static constexpr SequenceDescriptor kRightHalfBankedHelixDownSmallSeq4 = {
.clearance = { -32, 64, 0, 4, { 0b0111, 0 }, {} },
.allowedWallEdges = 0b0001,
.woodenSupports = { WoodenSupportSubType::corner2 },
.metalSupports = { MetalSupportPlace::centre },
.extraSupportRotation = 1,
.blockedSegments = kRightHalfBankedHelixUpSmallSeq4.blockedSegments,
};
static constexpr SequenceDescriptor kRightHalfBankedHelixDownSmallSeq5 = {
.clearance = { 0, 64, 0, 4, { 0b1000, 0 }, { ClearanceFlag::flag0 } },
.allowedWallEdges = 0b1100,
.woodenSupports = { WoodenSupportSubType::corner0 },
.blockedSegments = kRightHalfBankedHelixUpSmallSeq5.blockedSegments,
};
static constexpr SequenceDescriptor kRightHalfBankedHelixDownSmallSeq6 = {
.clearance = { -32, 96, 0, 0, { 0b0010, 0 }, {} },
.allowedWallEdges = 0b0011,
.blockedSegments = kRightHalfBankedHelixUpSmallSeq6.blockedSegments,
};
static constexpr SequenceDescriptor kRightHalfBankedHelixDownSmallSeq7 = {
.clearance = { 0, 96, 0, 0, { 0b0111, 0 }, {} },
.allowedWallEdges = 0b0010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::corner2 },
.metalSupports = { MetalSupportPlace::centre },
.extraSupportRotation = 2,
.blockedSegments = kRightHalfBankedHelixUpSmallSeq7.blockedSegments,
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixUpLargeSeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.metalSupports = { MetalSupportPlace::centre },
.blockedSegments = { {
EnumsToFlags(PS::top, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixUpLargeSeq1 = {
.clearance = { 0, -32, 0, 0, { 0b1000, 0 }, { ClearanceFlag::flag0 } },
.allowedWallEdges = 0b1100,
.blockedSegments = { {
kSegmentsNone, // narrow
kSegmentsUnimplemented, // inverted
EnumsToFlags(PS::right, PS::topRight, PS::bottomRight), // wide
} },
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixUpLargeSeq2 = {
.clearance = { -32, 0, 0, 0, { 0b0111, 0 }, {} },
.allowedWallEdges = 0b0011,
.woodenSupports = { WoodenSupportSubType::corner3 },
.blockedSegments = { {
EnumsToFlags(PS::top, PS::left, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft), // narrow
kSegmentsUnimplemented, // inverted
EnumsToFlags(PS::top, PS::left, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft), // wide
} },
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixUpLargeSeq3 = {
.clearance = { -32, -32, 0, 0, { 0b1101, 0 }, {} },
.woodenSupports = { WoodenSupportSubType::corner1 },
.blockedSegments = { {
EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // narrow
kSegmentsUnimplemented, // inverted
EnumsToFlags(
PS::top, PS::right, PS::bottom, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft,
PS::bottomRight), // wide
} },
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixUpLargeSeq4 = {
.clearance = { -32, -64, 0, 4, { 0b1000, 0 }, { ClearanceFlag::flag0 } },
.allowedWallEdges = 0b1100,
.blockedSegments = { {
kSegmentsNone, // narrow
kSegmentsUnimplemented, // inverted
EnumsToFlags(PS::right, PS::topRight, PS::bottomRight), // wide
} },
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixUpLargeSeq5 = {
.clearance = { -64, -32, 0, 4, { 0b0111, 0 }, {} },
.allowedWallEdges = 0b0011,
.woodenSupports = { WoodenSupportSubType::corner3 },
.blockedSegments = { {
EnumsToFlags(PS::left, PS::bottom, PS::centre, PS::topLeft, PS::bottomLeft, PS::bottomRight), // narrow
kSegmentsUnimplemented, // inverted
EnumsToFlags(PS::left, PS::bottom, PS::centre, PS::topLeft, PS::bottomLeft, PS::bottomRight), // wide
} },
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixUpLargeSeq6 = {
.clearance = { -64, -64, 0, 4, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0001,
.woodenSupports = { WoodenSupportSubType::nwSe },
.metalSupports = { MetalSupportPlace::centre },
.extraSupportRotation = -1,
.blockedSegments = { {
EnumsToFlags(PS::bottom, PS::centre, PS::topLeft, PS::bottomLeft, PS::bottomRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixUpLargeSeq7 = {
.clearance = { -64, -96, 8, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0001,
.woodenSupports = { WoodenSupportSubType::nwSe },
.metalSupports = { MetalSupportPlace::centre },
.extraSupportRotation = -1,
.blockedSegments = { {
EnumsToFlags(PS::left, PS::centre, PS::topLeft, PS::bottomLeft, PS::bottomRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixUpLargeSeq8 = {
.clearance = { -32, -96, 8, 0, { 0b0100, 0 }, { ClearanceFlag::flag0 } },
.allowedWallEdges = 0b0110,
.blockedSegments = { {
kSegmentsNone, // narrow
kSegmentsUnimplemented, // inverted
EnumsToFlags(PS::top, PS::topLeft, PS::topRight), // wide
} },
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixUpLargeSeq9 = {
.clearance = { -64, -128, 8, 0, { 0b1011, 0 }, {} },
.allowedWallEdges = 0b1001,
.woodenSupports = { WoodenSupportSubType::corner2 },
.blockedSegments = { {
EnumsToFlags(PS::left, PS::bottom, PS::centre, PS::topLeft, PS::bottomLeft, PS::bottomRight), // narrow
kSegmentsUnimplemented, // inverted
EnumsToFlags(PS::left, PS::bottom, PS::centre, PS::topLeft, PS::bottomLeft, PS::bottomRight), // wide
} },
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixUpLargeSeq10 = {
.clearance = { -32, -128, 8, 0, { 0b1110, 0 }, {} },
.woodenSupports = { WoodenSupportSubType::corner0 },
.blockedSegments = { {
EnumsToFlags(PS::top, PS::centre, PS::topLeft, PS::topRight), // narrow
kSegmentsUnimplemented, // inverted
EnumsToFlags(
PS::top, PS::left, PS::right, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft,
PS::bottomRight), // wide
} },
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixUpLargeSeq11 = {
.clearance = { 0, -128, 8, 4, { 0b0100, 0 }, { ClearanceFlag::flag0 } },
.allowedWallEdges = 0b0110,
.blockedSegments = { {
kSegmentsNone, // narrow
kSegmentsUnimplemented, // inverted
EnumsToFlags(PS::top, PS::topLeft, PS::topRight), // wide
} },
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixUpLargeSeq12 = {
.clearance = { -32, -160, 8, 4, { 0b1011, 0 }, {} },
.allowedWallEdges = 0b1001,
.woodenSupports = { WoodenSupportSubType::corner2 },
.blockedSegments = { {
EnumsToFlags(PS::right, PS::bottom, PS::centre, PS::topRight, PS::bottomLeft, PS::bottomRight), // narrow
kSegmentsUnimplemented, // inverted
EnumsToFlags(PS::right, PS::bottom, PS::centre, PS::topRight, PS::bottomLeft, PS::bottomRight), // wide
} },
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixUpLargeSeq13 = {
.clearance = { 0, -160, 8, 4, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1000,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.metalSupports = { MetalSupportPlace::centre },
.extraSupportRotation = -2,
.blockedSegments = { {
EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomLeft, PS::bottomRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kRightHalfBankedHelixUpLargeSeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1000,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.metalSupports = { MetalSupportPlace::centre },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHalfBankedHelixUpLargeSeq0.blockedSegments),
};
static constexpr SequenceDescriptor kRightHalfBankedHelixUpLargeSeq1 = {
.clearance = { 0, 32, 0, 0, { 0b0100, 0 }, { ClearanceFlag::flag0 } },
.allowedWallEdges = 0b0110,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHalfBankedHelixUpLargeSeq1.blockedSegments),
};
static constexpr SequenceDescriptor kRightHalfBankedHelixUpLargeSeq2 = {
.clearance = { -32, 0, 0, 0, { 0b1011, 0 }, {} },
.allowedWallEdges = 0b1001,
.woodenSupports = { WoodenSupportSubType::corner2 },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHalfBankedHelixUpLargeSeq2.blockedSegments),
};
static constexpr SequenceDescriptor kRightHalfBankedHelixUpLargeSeq3 = {
.clearance = { -32, 32, 0, 0, { 0b1110, 0 }, {} },
.woodenSupports = { WoodenSupportSubType::corner0 },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHalfBankedHelixUpLargeSeq3.blockedSegments),
};
static constexpr SequenceDescriptor kRightHalfBankedHelixUpLargeSeq4 = {
.clearance = { -32, 64, 0, 4, { 0b0100, 0 }, { ClearanceFlag::flag0 } },
.allowedWallEdges = 0b0110,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHalfBankedHelixUpLargeSeq4.blockedSegments),
};
static constexpr SequenceDescriptor kRightHalfBankedHelixUpLargeSeq5 = {
.clearance = { -64, 32, 0, 4, { 0b1011, 0 }, {} },
.allowedWallEdges = 0b1001,
.woodenSupports = { WoodenSupportSubType::corner2 },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHalfBankedHelixUpLargeSeq5.blockedSegments),
};
static constexpr SequenceDescriptor kRightHalfBankedHelixUpLargeSeq6 = {
.clearance = { -64, 64, 0, 4, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0001,
.woodenSupports = { WoodenSupportSubType::nwSe },
.metalSupports = { MetalSupportPlace::centre },
.extraSupportRotation = 1,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHalfBankedHelixUpLargeSeq6.blockedSegments),
};
static constexpr SequenceDescriptor kRightHalfBankedHelixUpLargeSeq7 = {
.clearance = { -64, 96, 8, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0001,
.woodenSupports = { WoodenSupportSubType::nwSe },
.metalSupports = { MetalSupportPlace::centre },
.extraSupportRotation = 1,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHalfBankedHelixUpLargeSeq7.blockedSegments),
};
static constexpr SequenceDescriptor kRightHalfBankedHelixUpLargeSeq8 = {
.clearance = { -32, 96, 8, 0, { 0b1000, 0 }, { ClearanceFlag::flag0 } },
.allowedWallEdges = 0b1100,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHalfBankedHelixUpLargeSeq8.blockedSegments),
};
static constexpr SequenceDescriptor kRightHalfBankedHelixUpLargeSeq9 = {
.clearance = { -64, 128, 8, 0, { 0b0111, 0 }, {} },
.allowedWallEdges = 0b0011,
.woodenSupports = { WoodenSupportSubType::corner3 },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHalfBankedHelixUpLargeSeq9.blockedSegments),
};
static constexpr SequenceDescriptor kRightHalfBankedHelixUpLargeSeq10 = {
.clearance = { -32, 128, 8, 0, { 0b1101, 0 }, {} },
.woodenSupports = { WoodenSupportSubType::corner1 },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHalfBankedHelixUpLargeSeq10.blockedSegments),
};
static constexpr SequenceDescriptor kRightHalfBankedHelixUpLargeSeq11 = {
.clearance = { 0, 128, 8, 4, { 0b1000, 0 }, { ClearanceFlag::flag0 } },
.allowedWallEdges = 0b1100,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHalfBankedHelixUpLargeSeq11.blockedSegments),
};
static constexpr SequenceDescriptor kRightHalfBankedHelixUpLargeSeq12 = {
.clearance = { -32, 160, 8, 4, { 0b0111, 0 }, {} },
.allowedWallEdges = 0b0011,
.woodenSupports = { WoodenSupportSubType::corner3 },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHalfBankedHelixUpLargeSeq12.blockedSegments),
};
static constexpr SequenceDescriptor kRightHalfBankedHelixUpLargeSeq13 = {
.clearance = { 0, 160, 8, 4, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.metalSupports = { MetalSupportPlace::centre },
.extraSupportRotation = 2,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHalfBankedHelixUpLargeSeq13.blockedSegments),
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixDownLargeSeq0 = {
.clearance = { 0, 0, 8, 4, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.metalSupports = { MetalSupportPlace::centre },
.blockedSegments = kLeftHalfBankedHelixUpLargeSeq0.blockedSegments,
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixDownLargeSeq1 = {
.clearance = { 0, -32, 8, 4, { 0b1000, 0 }, { ClearanceFlag::flag0 } },
.allowedWallEdges = 0b1100,
.blockedSegments = kLeftHalfBankedHelixUpLargeSeq1.blockedSegments,
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixDownLargeSeq2 = {
.clearance = { -32, 0, 8, 4, { 0b0111, 0 }, {} },
.allowedWallEdges = 0b0011,
.woodenSupports = { WoodenSupportSubType::corner2 },
.blockedSegments = kLeftHalfBankedHelixUpLargeSeq2.blockedSegments,
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixDownLargeSeq3 = {
.clearance = { -32, -32, 8, 0, { 0b1101, 0 }, {} },
.woodenSupports = { WoodenSupportSubType::corner0 },
.blockedSegments = kLeftHalfBankedHelixUpLargeSeq3.blockedSegments,
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixDownLargeSeq4 = {
.clearance = { -32, -64, 8, 0, { 0b1000, 0 }, { ClearanceFlag::flag0 } },
.allowedWallEdges = 0b1100,
.blockedSegments = kLeftHalfBankedHelixUpLargeSeq4.blockedSegments,
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixDownLargeSeq5 = {
.clearance = { -64, -32, 8, 0, { 0b0111, 0 }, {} },
.allowedWallEdges = 0b0011,
.woodenSupports = { WoodenSupportSubType::corner2 },
.blockedSegments = kLeftHalfBankedHelixUpLargeSeq5.blockedSegments,
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixDownLargeSeq6 = {
.clearance = { -64, -64, 8, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0001,
.woodenSupports = { WoodenSupportSubType::nwSe },
.metalSupports = { MetalSupportPlace::centre },
.extraSupportRotation = -1,
.blockedSegments = kLeftHalfBankedHelixUpLargeSeq6.blockedSegments,
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixDownLargeSeq7 = {
.clearance = { -64, -96, 0, 4, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0001,
.woodenSupports = { WoodenSupportSubType::nwSe },
.metalSupports = { MetalSupportPlace::centre },
.extraSupportRotation = -1,
.blockedSegments = kLeftHalfBankedHelixUpLargeSeq7.blockedSegments,
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixDownLargeSeq8 = {
.clearance = { -32, -96, 0, 4, { 0b0100, 0 }, { ClearanceFlag::flag0 } },
.allowedWallEdges = 0b0110,
.blockedSegments = kLeftHalfBankedHelixUpLargeSeq8.blockedSegments,
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixDownLargeSeq9 = {
.clearance = { -64, -128, 0, 4, { 0b1011, 0 }, {} },
.allowedWallEdges = 0b1001,
.woodenSupports = { WoodenSupportSubType::corner3 },
.blockedSegments = kLeftHalfBankedHelixUpLargeSeq9.blockedSegments,
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixDownLargeSeq10 = {
.clearance = { -32, -128, 0, 0, { 0b1110, 0 }, {} },
.woodenSupports = { WoodenSupportSubType::corner1 },
.blockedSegments = kLeftHalfBankedHelixUpLargeSeq10.blockedSegments,
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixDownLargeSeq11 = {
.clearance = { 0, -128, 0, 0, { 0b0100, 0b0000 }, { ClearanceFlag::flag0 } },
.allowedWallEdges = 0b0110,
.blockedSegments = kLeftHalfBankedHelixUpLargeSeq11.blockedSegments,
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixDownLargeSeq12 = {
.clearance = { -32, -160, 0, 0, { 0b1011, 0 }, {} },
.allowedWallEdges = 0b1001,
.woodenSupports = { WoodenSupportSubType::corner3 },
.blockedSegments = kLeftHalfBankedHelixUpLargeSeq12.blockedSegments,
};
static constexpr SequenceDescriptor kLeftHalfBankedHelixDownLargeSeq13 = {
.clearance = { 0, -160, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1000,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.metalSupports = { MetalSupportPlace::centre },
.extraSupportRotation = -2,
.blockedSegments = kLeftHalfBankedHelixUpLargeSeq13.blockedSegments,
};
static constexpr SequenceDescriptor kRightHalfBankedHelixDownLargeSeq0 = {
.clearance = { 0, 0, 8, 4, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1000,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.metalSupports = { MetalSupportPlace::centre },
.blockedSegments = kRightHalfBankedHelixUpLargeSeq0.blockedSegments,
};
static constexpr SequenceDescriptor kRightHalfBankedHelixDownLargeSeq1 = {
.clearance = { 0, 32, 8, 4, { 0b0100, 0 }, { ClearanceFlag::flag0 } },
.allowedWallEdges = 0b0110,
.blockedSegments = kRightHalfBankedHelixUpLargeSeq1.blockedSegments,
};
static constexpr SequenceDescriptor kRightHalfBankedHelixDownLargeSeq2 = {
.clearance = { -32, 0, 8, 4, { 0b1011, 0 }, {} },
.allowedWallEdges = 0b1001,
.woodenSupports = { WoodenSupportSubType::corner3 },
.blockedSegments = kRightHalfBankedHelixUpLargeSeq2.blockedSegments,
};
static constexpr SequenceDescriptor kRightHalfBankedHelixDownLargeSeq3 = {
.clearance = { -32, 32, 8, 0, { 0b1110, 0 }, {} },
.woodenSupports = { WoodenSupportSubType::corner1 },
.blockedSegments = kRightHalfBankedHelixUpLargeSeq3.blockedSegments,
};
static constexpr SequenceDescriptor kRightHalfBankedHelixDownLargeSeq4 = {
.clearance = { -32, 64, 8, 0, { 0b0100, 0 }, { ClearanceFlag::flag0 } },
.allowedWallEdges = 0b0110,
.blockedSegments = kRightHalfBankedHelixUpLargeSeq4.blockedSegments,
};
static constexpr SequenceDescriptor kRightHalfBankedHelixDownLargeSeq5 = {
.clearance = { -64, 32, 8, 0, { 0b1011, 0 }, {} },
.allowedWallEdges = 0b1001,
.woodenSupports = { WoodenSupportSubType::corner3 },
.blockedSegments = kRightHalfBankedHelixUpLargeSeq5.blockedSegments,
};
static constexpr SequenceDescriptor kRightHalfBankedHelixDownLargeSeq6 = {
.clearance = { -64, 64, 8, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0001,
.woodenSupports = { WoodenSupportSubType::nwSe },
.metalSupports = { MetalSupportPlace::centre },
.extraSupportRotation = 1,
.blockedSegments = kRightHalfBankedHelixUpLargeSeq6.blockedSegments,
};
static constexpr SequenceDescriptor kRightHalfBankedHelixDownLargeSeq7 = {
.clearance = { -64, 96, 0, 4, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0001,
.woodenSupports = { WoodenSupportSubType::nwSe },
.metalSupports = { MetalSupportPlace::centre },
.extraSupportRotation = 1,
.blockedSegments = kRightHalfBankedHelixUpLargeSeq7.blockedSegments,
};
static constexpr SequenceDescriptor kRightHalfBankedHelixDownLargeSeq8 = {
.clearance = { -32, 96, 0, 4, { 0b1000, 0 }, { ClearanceFlag::flag0 } },
.allowedWallEdges = 0b1100,
.blockedSegments = kRightHalfBankedHelixUpLargeSeq8.blockedSegments,
};
static constexpr SequenceDescriptor kRightHalfBankedHelixDownLargeSeq9 = {
.clearance = { -64, 128, 0, 4, { 0b0111, 0 }, {} },
.allowedWallEdges = 0b0011,
.woodenSupports = { WoodenSupportSubType::corner2 },
.blockedSegments = kRightHalfBankedHelixUpLargeSeq9.blockedSegments,
};
static constexpr SequenceDescriptor kRightHalfBankedHelixDownLargeSeq10 = {
.clearance = { -32, 128, 0, 0, { 0b1101, 0 }, {} },
.woodenSupports = { WoodenSupportSubType::corner0 },
.blockedSegments = kRightHalfBankedHelixUpLargeSeq10.blockedSegments,
};
static constexpr SequenceDescriptor kRightHalfBankedHelixDownLargeSeq11 = {
.clearance = { 0, 128, 0, 0, { 0b1000, 0 }, { ClearanceFlag::flag0 } },
.allowedWallEdges = 0b1100,
.blockedSegments = kRightHalfBankedHelixUpLargeSeq11.blockedSegments,
};
static constexpr SequenceDescriptor kRightHalfBankedHelixDownLargeSeq12 = {
.clearance = { -32, 160, 0, 0, { 0b0111, 0 }, {} },
.allowedWallEdges = 0b0011,
.woodenSupports = { WoodenSupportSubType::corner2 },
.blockedSegments = kRightHalfBankedHelixUpLargeSeq12.blockedSegments,
};
static constexpr SequenceDescriptor kRightHalfBankedHelixDownLargeSeq13 = {
.clearance = { 0, 160, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.metalSupports = { MetalSupportPlace::centre },
.extraSupportRotation = 2,
.blockedSegments = kRightHalfBankedHelixUpLargeSeq13.blockedSegments,
};
constexpr auto kTEDLeftHalfBankedHelixUpSmall = TrackElementDescriptor{
.description = STR_HELIX_UP_SMALL,
.coordinates = { 0, 2, 0, 16, 0, -96 },
.pieceLength = 150,
.curveChain = { TrackElemType::leftHalfBankedHelixUpSmall, TrackElemType::leftHalfBankedHelixUpSmall },
.priceModifier = 328192,
.mirrorElement = TrackElemType::rightHalfBankedHelixUpSmall,
.flags = { TrackElementFlag::turnLeft, TrackElementFlag::helix, TrackElementFlag::banked },
.definition = { TrackGroup::helixUpBankedHalf, TrackPitch::none, TrackPitch::none, TrackRoll::left, TrackRoll::left,
0 },
.spinFunction = SpinFunction::l7,
.verticalFactor = EvaluatorConst<100>,
.lateralFactor = EvaluatorConst<100>,
.sequenceData = { 8,
{ kLeftHalfBankedHelixUpSmallSeq0, kLeftHalfBankedHelixUpSmallSeq1, kLeftHalfBankedHelixUpSmallSeq2,
kLeftHalfBankedHelixUpSmallSeq3, kLeftHalfBankedHelixUpSmallSeq4, kLeftHalfBankedHelixUpSmallSeq5,
kLeftHalfBankedHelixUpSmallSeq6, kLeftHalfBankedHelixUpSmallSeq7 } },
};
constexpr auto kTEDRightHalfBankedHelixUpSmall = TrackElementDescriptor{
.description = STR_HELIX_UP_SMALL,
.coordinates = { 0, 2, 0, 16, 0, 96 },
.pieceLength = 150,
.curveChain = { TrackElemType::rightHalfBankedHelixUpSmall, TrackElemType::rightHalfBankedHelixUpSmall },
.priceModifier = 328192,
.mirrorElement = TrackElemType::leftHalfBankedHelixUpSmall,
.flags = { TrackElementFlag::turnRight, TrackElementFlag::helix, TrackElementFlag::banked },
.definition = { TrackGroup::helixUpBankedHalf, TrackPitch::none, TrackPitch::none, TrackRoll::right, TrackRoll::right,
0 },
.spinFunction = SpinFunction::r7,
.verticalFactor = EvaluatorConst<100>,
.lateralFactor = EvaluatorConst<-100>,
.sequenceData = { 8,
{ kRightHalfBankedHelixUpSmallSeq0, kRightHalfBankedHelixUpSmallSeq1,
kRightHalfBankedHelixUpSmallSeq2, kRightHalfBankedHelixUpSmallSeq3,
kRightHalfBankedHelixUpSmallSeq4, kRightHalfBankedHelixUpSmallSeq5,
kRightHalfBankedHelixUpSmallSeq6, kRightHalfBankedHelixUpSmallSeq7 } },
};
constexpr auto kTEDLeftHalfBankedHelixDownSmall = TrackElementDescriptor{
.description = STR_HELIX_DOWN_SMALL,
.coordinates = { 0, 2, 16, 0, 0, -96 },
.pieceLength = 150,
.curveChain = { TrackElemType::leftHalfBankedHelixDownSmall, TrackElemType::leftHalfBankedHelixDownSmall },
.priceModifier = 328192,
.mirrorElement = TrackElemType::rightHalfBankedHelixDownSmall,
.flags = { TrackElementFlag::turnLeft, TrackElementFlag::helix, TrackElementFlag::banked },
.definition = { TrackGroup::helixDownBankedHalf, TrackPitch::none, TrackPitch::none, TrackRoll::left, TrackRoll::left,
0 },
.spinFunction = SpinFunction::l7,
.verticalFactor = EvaluatorConst<100>,
.lateralFactor = EvaluatorConst<100>,
.sequenceData = { 8,
{ kLeftHalfBankedHelixDownSmallSeq0, kLeftHalfBankedHelixDownSmallSeq1,
kLeftHalfBankedHelixDownSmallSeq2, kLeftHalfBankedHelixDownSmallSeq3,
kLeftHalfBankedHelixDownSmallSeq4, kLeftHalfBankedHelixDownSmallSeq5,
kLeftHalfBankedHelixDownSmallSeq6, kLeftHalfBankedHelixDownSmallSeq7 } },
};
constexpr auto kTEDRightHalfBankedHelixDownSmall = TrackElementDescriptor{
.description = STR_HELIX_DOWN_SMALL,
.coordinates = { 0, 2, 16, 0, 0, 96 },
.pieceLength = 150,
.curveChain = { TrackElemType::rightHalfBankedHelixDownSmall, TrackElemType::rightHalfBankedHelixDownSmall },
.priceModifier = 328192,
.mirrorElement = TrackElemType::leftHalfBankedHelixDownSmall,
.flags = { TrackElementFlag::turnRight, TrackElementFlag::helix, TrackElementFlag::banked },
.definition = { TrackGroup::helixDownBankedHalf, TrackPitch::none, TrackPitch::none, TrackRoll::right, TrackRoll::right,
0 },
.spinFunction = SpinFunction::r7,
.verticalFactor = EvaluatorConst<100>,
.lateralFactor = EvaluatorConst<-100>,
.sequenceData = { 8,
{ kRightHalfBankedHelixDownSmallSeq0, kRightHalfBankedHelixDownSmallSeq1,
kRightHalfBankedHelixDownSmallSeq2, kRightHalfBankedHelixDownSmallSeq3,
kRightHalfBankedHelixDownSmallSeq4, kRightHalfBankedHelixDownSmallSeq5,
kRightHalfBankedHelixDownSmallSeq6, kRightHalfBankedHelixDownSmallSeq7 } },
};
constexpr auto kTEDLeftHalfBankedHelixUpLarge = TrackElementDescriptor{
.description = STR_HELIX_UP_LARGE,
.coordinates = { 0, 2, 0, 16, 0, -160 },
.pieceLength = 248,
.curveChain = { TrackElemType::leftHalfBankedHelixUpLarge, TrackElemType::leftHalfBankedHelixUpLarge },
.priceModifier = 547072,
.mirrorElement = TrackElemType::rightHalfBankedHelixUpLarge,
.flags = { TrackElementFlag::turnLeft, TrackElementFlag::helix, TrackElementFlag::banked },
.definition = { TrackGroup::helixUpBankedHalf, TrackPitch::none, TrackPitch::none, TrackRoll::left, TrackRoll::left,
0 },
.spinFunction = SpinFunction::l8,
.verticalFactor = EvaluatorConst<200>,
.lateralFactor = EvaluatorConst<160>,
.sequenceData = { 14,
{ kLeftHalfBankedHelixUpLargeSeq0, kLeftHalfBankedHelixUpLargeSeq1, kLeftHalfBankedHelixUpLargeSeq2,
kLeftHalfBankedHelixUpLargeSeq3, kLeftHalfBankedHelixUpLargeSeq4, kLeftHalfBankedHelixUpLargeSeq5,
kLeftHalfBankedHelixUpLargeSeq6, kLeftHalfBankedHelixUpLargeSeq7, kLeftHalfBankedHelixUpLargeSeq8,
kLeftHalfBankedHelixUpLargeSeq9, kLeftHalfBankedHelixUpLargeSeq10, kLeftHalfBankedHelixUpLargeSeq11,
kLeftHalfBankedHelixUpLargeSeq12, kLeftHalfBankedHelixUpLargeSeq13 } },
};
constexpr auto kTEDRightHalfBankedHelixUpLarge = TrackElementDescriptor{
.description = STR_HELIX_UP_LARGE,
.coordinates = { 0, 2, 0, 16, 0, 160 },
.pieceLength = 248,
.curveChain = { TrackElemType::rightHalfBankedHelixUpLarge, TrackElemType::rightHalfBankedHelixUpLarge },
.priceModifier = 547072,
.mirrorElement = TrackElemType::leftHalfBankedHelixUpLarge,
.flags = { TrackElementFlag::turnRight, TrackElementFlag::helix, TrackElementFlag::banked },
.definition = { TrackGroup::helixUpBankedHalf, TrackPitch::none, TrackPitch::none, TrackRoll::right, TrackRoll::right,
0 },
.spinFunction = SpinFunction::r8,
.verticalFactor = EvaluatorConst<200>,
.lateralFactor = EvaluatorConst<-160>,
.sequenceData = { 14,
{ kRightHalfBankedHelixUpLargeSeq0, kRightHalfBankedHelixUpLargeSeq1,
kRightHalfBankedHelixUpLargeSeq2, kRightHalfBankedHelixUpLargeSeq3,
kRightHalfBankedHelixUpLargeSeq4, kRightHalfBankedHelixUpLargeSeq5,
kRightHalfBankedHelixUpLargeSeq6, kRightHalfBankedHelixUpLargeSeq7,
kRightHalfBankedHelixUpLargeSeq8, kRightHalfBankedHelixUpLargeSeq9,
kRightHalfBankedHelixUpLargeSeq10, kRightHalfBankedHelixUpLargeSeq11,
kRightHalfBankedHelixUpLargeSeq12, kRightHalfBankedHelixUpLargeSeq13 } },
};
constexpr auto kTEDLeftHalfBankedHelixDownLarge = TrackElementDescriptor{
.description = STR_HELIX_DOWN_LARGE,
.coordinates = { 0, 2, 16, 0, 0, -160 },
.pieceLength = 248,
.curveChain = { TrackElemType::leftHalfBankedHelixDownLarge, TrackElemType::leftHalfBankedHelixDownLarge },
.priceModifier = 547072,
.mirrorElement = TrackElemType::rightHalfBankedHelixDownLarge,
.flags = { TrackElementFlag::turnLeft, TrackElementFlag::helix, TrackElementFlag::banked },
.definition = { TrackGroup::helixDownBankedHalf, TrackPitch::none, TrackPitch::none, TrackRoll::left, TrackRoll::left,
0 },
.spinFunction = SpinFunction::l8,
.verticalFactor = EvaluatorConst<200>,
.lateralFactor = EvaluatorConst<160>,
.sequenceData = { 14,
{ kLeftHalfBankedHelixDownLargeSeq0, kLeftHalfBankedHelixDownLargeSeq1,
kLeftHalfBankedHelixDownLargeSeq2, kLeftHalfBankedHelixDownLargeSeq3,
kLeftHalfBankedHelixDownLargeSeq4, kLeftHalfBankedHelixDownLargeSeq5,
kLeftHalfBankedHelixDownLargeSeq6, kLeftHalfBankedHelixDownLargeSeq7,
kLeftHalfBankedHelixDownLargeSeq8, kLeftHalfBankedHelixDownLargeSeq9,
kLeftHalfBankedHelixDownLargeSeq10, kLeftHalfBankedHelixDownLargeSeq11,
kLeftHalfBankedHelixDownLargeSeq12, kLeftHalfBankedHelixDownLargeSeq13 } },
};
constexpr auto kTEDRightHalfBankedHelixDownLarge = TrackElementDescriptor{
.description = STR_HELIX_DOWN_LARGE,
.coordinates = { 0, 2, 16, 0, 0, 160 },
.pieceLength = 248,
.curveChain = { TrackElemType::rightHalfBankedHelixDownLarge, TrackElemType::rightHalfBankedHelixDownLarge },
.priceModifier = 547072,
.mirrorElement = TrackElemType::leftHalfBankedHelixDownLarge,
.flags = { TrackElementFlag::turnRight, TrackElementFlag::helix, TrackElementFlag::banked },
.definition = { TrackGroup::helixDownBankedHalf, TrackPitch::none, TrackPitch::none, TrackRoll::right, TrackRoll::right,
0 },
.spinFunction = SpinFunction::r8,
.verticalFactor = EvaluatorConst<200>,
.lateralFactor = EvaluatorConst<-160>,
.sequenceData = { 14,
{ kRightHalfBankedHelixDownLargeSeq0, kRightHalfBankedHelixDownLargeSeq1,
kRightHalfBankedHelixDownLargeSeq2, kRightHalfBankedHelixDownLargeSeq3,
kRightHalfBankedHelixDownLargeSeq4, kRightHalfBankedHelixDownLargeSeq5,
kRightHalfBankedHelixDownLargeSeq6, kRightHalfBankedHelixDownLargeSeq7,
kRightHalfBankedHelixDownLargeSeq8, kRightHalfBankedHelixDownLargeSeq9,
kRightHalfBankedHelixDownLargeSeq10, kRightHalfBankedHelixDownLargeSeq11,
kRightHalfBankedHelixDownLargeSeq12, kRightHalfBankedHelixDownLargeSeq13 } },
};
} // namespace OpenRCT2::TrackMetadata
+296
View File
@@ -0,0 +1,296 @@
/*****************************************************************************
* Copyright (c) 2014-2026 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
#pragma once
#include "../../localisation/StringIds.h"
#include "TrackElementDescriptor.h"
#include <cstdint>
namespace OpenRCT2::TrackMetadata
{
using PS = PaintSegment;
static int32_t EvaluatorHeartLineTransferUp(const int16_t progress)
{
if (progress < 32)
return 103;
if (progress < 64)
return -103;
if (progress < 96)
return 0;
if (progress < 128)
return 103;
return -103;
}
static int32_t EvaluatorHeartLineTransferDown(const int16_t progress)
{
if (progress < 32)
return -103;
if (progress < 64)
return 103;
if (progress < 96)
return 0;
if (progress < 128)
return -103;
return 103;
}
static constexpr SequenceDescriptor kHeartLineTransferUpSeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp25Deg },
.blockedSegments = { {
kSegmentsUnimplemented, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kHeartLineTransferUpSeq1 = {
.clearance = { -32, 0, 0, 32, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25DegToFlat },
.blockedSegments = { {
kSegmentsUnimplemented, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kHeartLineTransferUpSeq2 = {
.clearance = { -64, 0, 16, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
kSegmentsUnimplemented, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kHeartLineTransferUpSeq3 = {
.clearance = { 0, 0, 32, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.blockedSegments = { {
kSegmentsUnimplemented, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kHeartLineTransferDownSeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.blockedSegments = kHeartLineTransferUpSeq3.blockedSegments,
};
static constexpr SequenceDescriptor kHeartLineTransferDownSeq1 = {
.clearance = { -32, 0, -32, 32, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up25DegToFlat },
.blockedSegments = kHeartLineTransferUpSeq2.blockedSegments,
};
static constexpr SequenceDescriptor kHeartLineTransferDownSeq2 = {
.clearance = { -64, 0, -16, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = kHeartLineTransferUpSeq1.blockedSegments,
};
static constexpr SequenceDescriptor kHeartLineTransferDownSeq3 = {
.clearance = { 0, 0, -32, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp25Deg },
.blockedSegments = kHeartLineTransferUpSeq0.blockedSegments,
};
static constexpr SequenceDescriptor kLeftHeartLineRollSeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
kSegmentsUnimplemented, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kLeftHeartLineRollSeq1 = {
.clearance = { -32, 0, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
kSegmentsUnimplemented, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kLeftHeartLineRollSeq2 = {
.clearance = { -64, 0, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
kSegmentsUnimplemented, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kLeftHeartLineRollSeq3 = {
.clearance = { -96, 0, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
kSegmentsUnimplemented, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kLeftHeartLineRollSeq4 = {
.clearance = { -128, 0, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
kSegmentsUnimplemented, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kLeftHeartLineRollSeq5 = {
.clearance = { -160, 0, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
kSegmentsUnimplemented, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kRightHeartLineRollSeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHeartLineRollSeq0.blockedSegments),
};
static constexpr SequenceDescriptor kRightHeartLineRollSeq1 = {
.clearance = { -32, 0, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHeartLineRollSeq1.blockedSegments),
};
static constexpr SequenceDescriptor kRightHeartLineRollSeq2 = {
.clearance = { -64, 0, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHeartLineRollSeq2.blockedSegments),
};
static constexpr SequenceDescriptor kRightHeartLineRollSeq3 = {
.clearance = { -96, 0, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHeartLineRollSeq3.blockedSegments),
};
static constexpr SequenceDescriptor kRightHeartLineRollSeq4 = {
.clearance = { -128, 0, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHeartLineRollSeq4.blockedSegments),
};
static constexpr SequenceDescriptor kRightHeartLineRollSeq5 = {
.clearance = { -160, 0, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftHeartLineRollSeq5.blockedSegments),
};
constexpr auto kTEDHeartLineTransferUp = TrackElementDescriptor{
.description = STR_UPPER_TRANSFER,
.coordinates = { 0, 2, 0, 32, 0, 0 },
.pieceLength = 16,
.curveChain = { TrackCurve::none, TrackCurve::none },
.priceModifier = 294912,
.mirrorElement = TrackElemType::heartLineTransferUp,
.flags = {},
.definition = { TrackGroup::heartlineTransfer, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none,
0 },
.verticalFactor = EvaluatorHeartLineTransferUp,
.sequenceData = { 4,
{ kHeartLineTransferUpSeq0, kHeartLineTransferUpSeq1, kHeartLineTransferUpSeq2,
kHeartLineTransferUpSeq3 } },
};
constexpr auto kTEDHeartLineTransferDown = TrackElementDescriptor{
.description = STR_LOWER_TRANSFER,
.coordinates = { 0, 2, 0, -32, 0, 0 },
.pieceLength = 16,
.curveChain = { TrackCurve::none, TrackCurve::none },
.priceModifier = 294912,
.mirrorElement = TrackElemType::heartLineTransferDown,
.flags = {},
.definition = { TrackGroup::heartlineTransfer, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none,
0 },
.verticalFactor = EvaluatorHeartLineTransferDown,
.sequenceData = { 4,
{ kHeartLineTransferDownSeq0, kHeartLineTransferDownSeq1, kHeartLineTransferDownSeq2,
kHeartLineTransferDownSeq3 } },
};
constexpr auto kTEDLeftHeartLineRoll = TrackElementDescriptor{
.description = STR_HEARTLINE_ROLL_LEFT,
.coordinates = { 0, 0, 0, 0, -160, 0 },
.pieceLength = 64,
.curveChain = { TrackCurve::none, TrackCurve::none },
.priceModifier = 417792,
.mirrorElement = TrackElemType::rightHeartLineRoll,
.flags = { TrackElementFlag::normalToInversion, TrackElementFlag::inversionToNormal,
TrackElementFlag::canBePartlyUnderground },
.definition = { TrackGroup::heartlineRoll, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.lateralFactor = EvaluatorConst<98>,
.sequenceData = { 6,
{ kLeftHeartLineRollSeq0, kLeftHeartLineRollSeq1, kLeftHeartLineRollSeq2, kLeftHeartLineRollSeq3,
kLeftHeartLineRollSeq4, kLeftHeartLineRollSeq5 } },
};
constexpr auto kTEDRightHeartLineRoll = TrackElementDescriptor{
.description = STR_HEARTLINE_ROLL_RIGHT,
.coordinates = { 0, 0, 0, 0, -160, 0 },
.pieceLength = 64,
.curveChain = { TrackCurve::none, TrackCurve::none },
.priceModifier = 417792,
.mirrorElement = TrackElemType::leftHeartLineRoll,
.flags = { TrackElementFlag::normalToInversion, TrackElementFlag::inversionToNormal,
TrackElementFlag::canBePartlyUnderground },
.definition = { TrackGroup::heartlineRoll, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.lateralFactor = EvaluatorConst<-98>,
.sequenceData = { 6,
{ kRightHeartLineRollSeq0, kRightHeartLineRollSeq1, kRightHeartLineRollSeq2, kRightHeartLineRollSeq3,
kRightHeartLineRollSeq4, kRightHeartLineRollSeq5 } },
};
} // namespace OpenRCT2::TrackMetadata
+503
View File
@@ -0,0 +1,503 @@
/*****************************************************************************
* Copyright (c) 2014-2026 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
#pragma once
#include "../../localisation/StringIds.h"
#include "TrackElementDescriptor.h"
namespace OpenRCT2::TrackMetadata
{
using PS = PaintSegment;
static constexpr SequenceDescriptor kFlatToUp60LongBaseSeq0 = {
.clearance = { 0, 0, 0, 8, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp60DegLongBaseSeq0 },
.metalSupports = { MetalSupportPlace::centre, true },
.blockedSegments = kFlatStraightBlockedSegments,
};
static constexpr SequenceDescriptor kFlatToUp60LongBaseSeq1 = {
.clearance = { -32, 0, 0, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp60DegLongBaseSeq1 },
.metalSupports = { MetalSupportPlace::centre, true },
.blockedSegments = kFlatStraightBlockedSegments,
};
static constexpr SequenceDescriptor kFlatToUp60LongBaseSeq2 = {
.clearance = { -64, 0, 16, 24, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp60DegLongBaseSeq2 },
.metalSupports = { MetalSupportPlace::centre, true },
.blockedSegments = kFlatStraightBlockedSegments,
};
static constexpr SequenceDescriptor kFlatToUp60LongBaseSeq3 = {
.clearance = { -96, 0, 40, 48, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp60DegLongBaseSeq3 },
.metalSupports = { MetalSupportPlace::centre, true },
.blockedSegments = kFlatStraightBlockedSegments,
};
static constexpr SequenceDescriptor kUp60ToFlatLongBaseSeq0 = {
.clearance = { 0, 0, 0, 48, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up60DegToFlatLongBaseSeq0 },
.metalSupports = { MetalSupportPlace::centre, true },
.blockedSegments = kFlatStraightBlockedSegments,
};
static constexpr SequenceDescriptor kUp60ToFlatLongBaseSeq1 = {
.clearance = { -32, 0, 40, 48, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up60DegToFlatLongBaseSeq1 },
.metalSupports = { MetalSupportPlace::centre, true },
.blockedSegments = kFlatStraightBlockedSegments,
};
static constexpr SequenceDescriptor kUp60ToFlatLongBaseSeq2 = {
.clearance = { -64, 0, 64, 24, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up60DegToFlatLongBaseSeq2 },
.metalSupports = { MetalSupportPlace::centre, true },
.blockedSegments = kFlatStraightBlockedSegments,
};
static constexpr SequenceDescriptor kUp60ToFlatLongBaseSeq3 = {
.clearance = { -96, 0, 80, 8, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up60DegToFlatLongBaseSeq3 },
.metalSupports = { MetalSupportPlace::centre, true },
.blockedSegments = kFlatStraightBlockedSegments,
};
static constexpr SequenceDescriptor kDown60ToFlatLongBaseSeq0 = {
.clearance = { 0, 0, 40, 48, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp60DegLongBaseSeq3 },
.metalSupports = { MetalSupportPlace::centre, true },
.extraSupportRotation = 2,
.blockedSegments = kFlatStraightBlockedSegments,
};
static constexpr SequenceDescriptor kDown60ToFlatLongBaseSeq1 = {
.clearance = { -32, 0, 16, 24, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp60DegLongBaseSeq2 },
.metalSupports = { MetalSupportPlace::centre, true },
.extraSupportRotation = 2,
.blockedSegments = kFlatStraightBlockedSegments,
};
static constexpr SequenceDescriptor kDown60ToFlatLongBaseSeq2 = {
.clearance = { -64, 0, 0, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp60DegLongBaseSeq1 },
.metalSupports = { MetalSupportPlace::centre, true },
.extraSupportRotation = 2,
.blockedSegments = kFlatStraightBlockedSegments,
};
static constexpr SequenceDescriptor kDown60ToFlatLongBaseSeq3 = {
.clearance = { -96, 0, 0, 8, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::flatToUp60DegLongBaseSeq0 },
.metalSupports = { MetalSupportPlace::centre, true },
.extraSupportRotation = 2,
.blockedSegments = kFlatStraightBlockedSegments,
};
static constexpr SequenceDescriptor kFlatToDown60LongBaseSeq0 = {
.clearance = { 0, 0, 80, 8, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up60DegToFlatLongBaseSeq3 },
.metalSupports = { MetalSupportPlace::centre, true },
.extraSupportRotation = 2,
.blockedSegments = kFlatStraightBlockedSegments,
};
static constexpr SequenceDescriptor kFlatToDown60LongBaseSeq1 = {
.clearance = { -32, 0, 64, 24, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up60DegToFlatLongBaseSeq2 },
.metalSupports = { MetalSupportPlace::centre, true },
.extraSupportRotation = 2,
.blockedSegments = kFlatStraightBlockedSegments,
};
static constexpr SequenceDescriptor kFlatToDown60LongBaseSeq2 = {
.clearance = { -64, 0, 40, 48, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up60DegToFlatLongBaseSeq1 },
.metalSupports = { MetalSupportPlace::centre, true },
.extraSupportRotation = 2,
.blockedSegments = kFlatStraightBlockedSegments,
};
static constexpr SequenceDescriptor kFlatToDown60LongBaseSeq3 = {
.clearance = { -96, 0, 0, 48, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw, WoodenSupportTransitionType::up60DegToFlatLongBaseSeq0 },
.metalSupports = { MetalSupportPlace::centre, true },
.extraSupportRotation = 2,
.blockedSegments = kFlatStraightBlockedSegments,
};
static constexpr SequenceDescriptor kDiagFlatToUp60LongBaseSeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1101, 0 }, {} },
.allowedWallEdges = 0b0000,
.flags = { SequenceFlag::hasHeightMarker },
.blockedSegments = { {
EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kDiagFlatToUp60LongBaseSeq1 = {
.clearance = { 0, 32, 0, 16, { 0b0100, 0 }, {} },
.allowedWallEdges = 0b0110,
.blockedSegments = { {
EnumsToFlags(PS::top, PS::centre, PS::topLeft, PS::topRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kDiagFlatToUp60LongBaseSeq2 = {
.clearance = { -32, 0, 0, 16, { 0b0001, 0 }, {} },
.allowedWallEdges = 0b1001,
.blockedSegments = { {
EnumsToFlags(PS::bottom, PS::centre, PS::bottomLeft, PS::bottomRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kDiagFlatToUp60LongBaseSeq3 = {
.clearance = { -32, 32, 0, 32, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0000,
.blockedSegments = { {
EnumsToFlags(PS::left, PS::right, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft, PS::bottomRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kDiagFlatToUp60LongBaseSeq4 = {
.clearance = { -32, 64, 8, 40, { 0b0100, 0 }, {} },
.allowedWallEdges = 0b0110,
.blockedSegments = { {
EnumsToFlags(PS::top, PS::centre, PS::topLeft, PS::topRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kDiagFlatToUp60LongBaseSeq5 = {
.clearance = { -64, 32, 8, 40, { 0b0001, 0 }, {} },
.allowedWallEdges = 0b1001,
.blockedSegments = { {
EnumsToFlags(PS::bottom, PS::centre, PS::bottomLeft, PS::bottomRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kDiagFlatToUp60LongBaseSeq6 = {
.clearance = { -64, 64, 8, 64, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0000,
.blockedSegments = { {
EnumsToFlags(PS::left, PS::right, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft, PS::bottomRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kDiagFlatToUp60LongBaseSeq7 = {
.clearance = { -64, 96, 40, 88, { 0b0100, 0 }, {} },
.allowedWallEdges = 0b0110,
.blockedSegments = { {
EnumsToFlags(PS::top, PS::centre, PS::topLeft, PS::topRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kDiagFlatToUp60LongBaseSeq8 = {
.clearance = { -96, 64, 40, 88, { 0b0001, 0 }, {} },
.allowedWallEdges = 0b1001,
.blockedSegments = { {
EnumsToFlags(PS::bottom, PS::centre, PS::bottomLeft, PS::bottomRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kDiagFlatToUp60LongBaseSeq9 = {
.clearance = { -96, 96, 40, 104, { 0b0010, 0 }, {} },
.allowedWallEdges = 0b0000,
.blockedSegments = { {
EnumsToFlags(PS::left, PS::centre, PS::topLeft, PS::bottomLeft), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kDiagUp60ToFlatLongBaseSeq0 = {
.clearance = { 0, 0, 0, 64, { 0b1101, 0 }, {} },
.allowedWallEdges = 0b0000,
.flags = { SequenceFlag::hasHeightMarker },
.blockedSegments = { {
EnumsToFlags(PS::right, PS::centre, PS::topRight, PS::bottomRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kDiagUp60ToFlatLongBaseSeq1 = {
.clearance = { 0, 32, 0, 72, { 0b0100, 0 }, {} },
.allowedWallEdges = 0b0110,
.blockedSegments = { {
EnumsToFlags(PS::top, PS::centre, PS::topLeft, PS::topRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kDiagUp60ToFlatLongBaseSeq2 = {
.clearance = { -32, 0, 0, 72, { 0b0001, 0 }, {} },
.allowedWallEdges = 0b1001,
.blockedSegments = { {
EnumsToFlags(PS::bottom, PS::centre, PS::bottomLeft, PS::bottomRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kDiagUp60ToFlatLongBaseSeq3 = {
.clearance = { -32, 32, 0, 80, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0000,
.blockedSegments = { {
EnumsToFlags(PS::left, PS::right, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft, PS::bottomRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kDiagUp60ToFlatLongBaseSeq4 = {
.clearance = { -32, 64, 56, 32, { 0b0100, 0 }, {} },
.allowedWallEdges = 0b0110,
.blockedSegments = { {
EnumsToFlags(PS::top, PS::centre, PS::topLeft, PS::topRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kDiagUp60ToFlatLongBaseSeq5 = {
.clearance = { -64, 32, 56, 32, { 0b0001, 0 }, {} },
.allowedWallEdges = 0b1001,
.blockedSegments = { {
EnumsToFlags(PS::bottom, PS::centre, PS::bottomLeft, PS::bottomRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kDiagUp60ToFlatLongBaseSeq6 = {
.clearance = { -64, 64, 56, 8, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0000,
.blockedSegments = { {
EnumsToFlags(PS::left, PS::right, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft, PS::bottomRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kDiagUp60ToFlatLongBaseSeq7 = {
.clearance = { -64, 96, 80, 8, { 0b0100, 0 }, {} },
.allowedWallEdges = 0b0110,
.blockedSegments = { {
EnumsToFlags(PS::top, PS::centre, PS::topLeft, PS::topRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kDiagUp60ToFlatLongBaseSeq8 = {
.clearance = { -96, 64, 80, 8, { 0b0001, 0 }, {} },
.allowedWallEdges = 0b1001,
.blockedSegments = { {
EnumsToFlags(PS::bottom, PS::centre, PS::bottomLeft, PS::bottomRight), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kDiagUp60ToFlatLongBaseSeq9 = {
.clearance = { -96, 96, 80, 8, { 0b0010, 0 }, {} },
.allowedWallEdges = 0b0000,
.blockedSegments = { {
EnumsToFlags(PS::left, PS::centre, PS::topLeft, PS::bottomLeft), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsUnimplemented, // wide
} },
};
static constexpr SequenceDescriptor kDiagFlatToDown60LongBaseSeq0 = {
.clearance = { 0, 0, 80, 8, { 0b1101, 0 }, {} },
.allowedWallEdges = 0b0000,
.blockedSegments = blockedSegmentsRotate(kDiagUp60ToFlatLongBaseSeq9.blockedSegments, 2),
};
static constexpr SequenceDescriptor kDiagFlatToDown60LongBaseSeq1 = {
.clearance = { 0, 32, 80, 8, { 0b0100, 0 }, {} },
.allowedWallEdges = 0b0110,
.blockedSegments = blockedSegmentsRotate(kDiagUp60ToFlatLongBaseSeq8.blockedSegments, 2),
};
static constexpr SequenceDescriptor kDiagFlatToDown60LongBaseSeq2 = {
.clearance = { -32, 0, 80, 8, { 0b0001, 0 }, {} },
.allowedWallEdges = 0b1001,
.blockedSegments = blockedSegmentsRotate(kDiagUp60ToFlatLongBaseSeq7.blockedSegments, 2),
};
static constexpr SequenceDescriptor kDiagFlatToDown60LongBaseSeq3 = {
.clearance = { -32, 32, 56, 8, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0000,
.blockedSegments = blockedSegmentsRotate(kDiagUp60ToFlatLongBaseSeq6.blockedSegments, 2),
};
static constexpr SequenceDescriptor kDiagFlatToDown60LongBaseSeq4 = {
.clearance = { -32, 64, 56, 32, { 0b0100, 0 }, {} },
.allowedWallEdges = 0b0110,
.blockedSegments = blockedSegmentsRotate(kDiagUp60ToFlatLongBaseSeq5.blockedSegments, 2),
};
static constexpr SequenceDescriptor kDiagFlatToDown60LongBaseSeq5 = {
.clearance = { -64, 32, 56, 32, { 0b0001, 0 }, {} },
.allowedWallEdges = 0b1001,
.blockedSegments = blockedSegmentsRotate(kDiagUp60ToFlatLongBaseSeq4.blockedSegments, 2),
};
static constexpr SequenceDescriptor kDiagFlatToDown60LongBaseSeq6 = {
.clearance = { -64, 64, 0, 80, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0000,
.blockedSegments = blockedSegmentsRotate(kDiagUp60ToFlatLongBaseSeq3.blockedSegments, 2),
};
static constexpr SequenceDescriptor kDiagFlatToDown60LongBaseSeq7 = {
.clearance = { -64, 96, 0, 72, { 0b0100, 0 }, {} },
.allowedWallEdges = 0b0110,
.blockedSegments = blockedSegmentsRotate(kDiagUp60ToFlatLongBaseSeq2.blockedSegments, 2),
};
static constexpr SequenceDescriptor kDiagFlatToDown60LongBaseSeq8 = {
.clearance = { -96, 64, 0, 72, { 0b0001, 0 }, {} },
.allowedWallEdges = 0b1001,
.blockedSegments = blockedSegmentsRotate(kDiagUp60ToFlatLongBaseSeq1.blockedSegments, 2),
};
static constexpr SequenceDescriptor kDiagFlatToDown60LongBaseSeq9 = {
.clearance = { -96, 96, 0, 64, { 0b0010, 0 }, {} },
.allowedWallEdges = 0b0000,
.flags = { SequenceFlag::hasHeightMarker },
.blockedSegments = blockedSegmentsRotate(kDiagUp60ToFlatLongBaseSeq0.blockedSegments, 2),
};
static constexpr SequenceDescriptor kDiagDown60ToFlatLongBaseSeq0 = {
.clearance = { 0, 0, 40, 104, { 0b1101, 0 }, {} },
.allowedWallEdges = 0b0000,
.blockedSegments = blockedSegmentsRotate(kDiagFlatToUp60LongBaseSeq9.blockedSegments, 2),
};
static constexpr SequenceDescriptor kDiagDown60ToFlatLongBaseSeq1 = {
.clearance = { 0, 32, 40, 88, { 0b0100, 0 }, {} },
.allowedWallEdges = 0b0110,
.blockedSegments = blockedSegmentsRotate(kDiagFlatToUp60LongBaseSeq8.blockedSegments, 2),
};
static constexpr SequenceDescriptor kDiagDown60ToFlatLongBaseSeq2 = {
.clearance = { -32, 0, 40, 88, { 0b0001, 0 }, {} },
.allowedWallEdges = 0b1001,
.blockedSegments = blockedSegmentsRotate(kDiagFlatToUp60LongBaseSeq7.blockedSegments, 2),
};
static constexpr SequenceDescriptor kDiagDown60ToFlatLongBaseSeq3 = {
.clearance = { -32, 32, 8, 64, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0000,
.blockedSegments = blockedSegmentsRotate(kDiagFlatToUp60LongBaseSeq6.blockedSegments, 2),
};
static constexpr SequenceDescriptor kDiagDown60ToFlatLongBaseSeq4 = {
.clearance = { -32, 64, 8, 40, { 0b0100, 0 }, {} },
.allowedWallEdges = 0b0110,
.blockedSegments = blockedSegmentsRotate(kDiagFlatToUp60LongBaseSeq5.blockedSegments, 2),
};
static constexpr SequenceDescriptor kDiagDown60ToFlatLongBaseSeq5 = {
.clearance = { -64, 32, 8, 40, { 0b0001, 0 }, {} },
.allowedWallEdges = 0b1001,
.blockedSegments = blockedSegmentsRotate(kDiagFlatToUp60LongBaseSeq4.blockedSegments, 2),
};
static constexpr SequenceDescriptor kDiagDown60ToFlatLongBaseSeq6 = {
.clearance = { -64, 64, 0, 32, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b0000,
.blockedSegments = blockedSegmentsRotate(kDiagFlatToUp60LongBaseSeq3.blockedSegments, 2),
};
static constexpr SequenceDescriptor kDiagDown60ToFlatLongBaseSeq7 = {
.clearance = { -64, 96, 0, 16, { 0b0100, 0 }, {} },
.allowedWallEdges = 0b0110,
.blockedSegments = blockedSegmentsRotate(kDiagFlatToUp60LongBaseSeq2.blockedSegments, 2),
};
static constexpr SequenceDescriptor kDiagDown60ToFlatLongBaseSeq8 = {
.clearance = { -96, 64, 0, 16, { 0b0001, 0 }, {} },
.allowedWallEdges = 0b1001,
.blockedSegments = blockedSegmentsRotate(kDiagFlatToUp60LongBaseSeq1.blockedSegments, 2),
};
static constexpr SequenceDescriptor kDiagDown60ToFlatLongBaseSeq9 = {
.clearance = { -96, 96, 0, 0, { 0b0010, 0 }, {} },
.allowedWallEdges = 0b0000,
.flags = { SequenceFlag::hasHeightMarker },
.blockedSegments = blockedSegmentsRotate(kDiagFlatToUp60LongBaseSeq0.blockedSegments, 2),
};
constexpr auto kTEDFlatToUp60LongBase = TrackElementDescriptor{
.coordinates = { 0, 0, 0, 88, -96, 0 },
.pieceLength = 165,
.curveChain = { TrackCurve::none, TrackCurve::none },
.priceModifier = 376832,
.mirrorElement = TrackElemType::flatToUp60LongBase,
.flags = { TrackElementFlag::up },
.definition = { TrackGroup::slopeSteepLong, TrackPitch::up60, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.verticalFactor = EvaluatorConst<160>,
.sequenceData = { 4,
{ kFlatToUp60LongBaseSeq0, kFlatToUp60LongBaseSeq1, kFlatToUp60LongBaseSeq2,
kFlatToUp60LongBaseSeq3 } },
};
constexpr auto kTEDUp60ToFlatLongBase = TrackElementDescriptor{
.coordinates = { 0, 0, 0, 88, -96, 0 },
.pieceLength = 165,
.curveChain = { TrackCurve::none, TrackCurve::none },
.priceModifier = 376832,
.mirrorElement = TrackElemType::up60ToFlatLongBase,
.flags = { TrackElementFlag::up, TrackElementFlag::startsAtHalfHeight },
.definition = { TrackGroup::slopeSteepLong, TrackPitch::none, TrackPitch::up60, TrackRoll::none, TrackRoll::none, 0 },
.verticalFactor = EvaluatorConst<-160>,
.sequenceData = { 4,
{ kUp60ToFlatLongBaseSeq0, kUp60ToFlatLongBaseSeq1, kUp60ToFlatLongBaseSeq2,
kUp60ToFlatLongBaseSeq3 } },
};
constexpr auto kTEDDown60ToFlatLongBase = TrackElementDescriptor{
.coordinates = { 0, 0, 88, 0, -96, 0 },
.pieceLength = 165,
.curveChain = { TrackCurve::none, TrackCurve::none },
.priceModifier = 376832,
.mirrorElement = TrackElemType::down60ToFlatLongBase,
.flags = { TrackElementFlag::down },
.definition = { TrackGroup::slopeSteepLong, TrackPitch::none, TrackPitch::down60, TrackRoll::none, TrackRoll::none, 0 },
.verticalFactor = EvaluatorConst<160>,
.sequenceData = { 4,
{ kDown60ToFlatLongBaseSeq0, kDown60ToFlatLongBaseSeq1, kDown60ToFlatLongBaseSeq2,
kDown60ToFlatLongBaseSeq3 } },
};
constexpr auto kTEDFlatToDown60LongBase = TrackElementDescriptor{
.coordinates = { 0, 0, 88, 0, -96, 0 },
.pieceLength = 165,
.curveChain = { TrackCurve::none, TrackCurve::none },
.priceModifier = 376832,
.mirrorElement = TrackElemType::flatToDown60LongBase,
.flags = { TrackElementFlag::down, TrackElementFlag::startsAtHalfHeight },
.definition = { TrackGroup::slopeSteepLong, TrackPitch::down60, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.verticalFactor = EvaluatorConst<-160>,
.sequenceData = { 4,
{ kFlatToDown60LongBaseSeq0, kFlatToDown60LongBaseSeq1, kFlatToDown60LongBaseSeq2,
kFlatToDown60LongBaseSeq3 } },
};
} // namespace OpenRCT2::TrackMetadata
File diff suppressed because it is too large Load Diff
+116
View File
@@ -0,0 +1,116 @@
/*****************************************************************************
* Copyright (c) 2014-2026 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
#pragma once
#include "../../localisation/StringIds.h"
#include "TrackElementDescriptor.h"
#include <cstdint>
namespace OpenRCT2::TrackMetadata
{
using PS = PaintSegment;
// Maze sequence blocks do not have the height marker flag set because they are handled differently
static constexpr SequenceDescriptor kMazeSeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW,
SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin },
.woodenSupports = { WoodenSupportSubType::neSw },
};
static constexpr SequenceDescriptor kMazeSeq1 = {
.flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW,
SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin },
};
static constexpr SequenceDescriptor kMazeSeq2 = {
.flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW,
SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin },
};
static constexpr SequenceDescriptor kMazeSeq3 = {
.flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW,
SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin },
};
static constexpr SequenceDescriptor kMazeSeq4 = {
.flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW,
SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin },
};
static constexpr SequenceDescriptor kMazeSeq5 = {
.flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW,
SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin },
};
static constexpr SequenceDescriptor kMazeSeq6 = {
.flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW,
SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin },
};
static constexpr SequenceDescriptor kMazeSeq7 = {
.flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW,
SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin },
};
static constexpr SequenceDescriptor kMazeSeq8 = {
.flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW,
SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin },
};
static constexpr SequenceDescriptor kMazeSeq9 = {
.flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW,
SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin },
};
static constexpr SequenceDescriptor kMazeSeq10 = {
.flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW,
SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin },
};
static constexpr SequenceDescriptor kMazeSeq11 = {
.flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW,
SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin },
};
static constexpr SequenceDescriptor kMazeSeq12 = {
.flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW,
SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin },
};
static constexpr SequenceDescriptor kMazeSeq13 = {
.flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW,
SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin },
};
static constexpr SequenceDescriptor kMazeSeq14 = {
.flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW,
SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin },
};
static constexpr SequenceDescriptor kMazeSeq15 = {
.flags = { SequenceFlag::entranceConnectionNE, SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionSW,
SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin },
};
constexpr auto kTEDMaze = TrackElementDescriptor{
.coordinates = { 0, 0, 0, 0, 0, 0 },
.pieceLength = 32,
.curveChain = { TrackCurve::none, TrackCurve::none },
.priceModifier = 65536,
.mirrorElement = TrackElemType::maze,
.flags = { TrackElementFlag::onlyAboveGround },
.definition = { TrackGroup::flat, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.sequenceData = { 1,
{ kMazeSeq0, kMazeSeq1, kMazeSeq2, kMazeSeq3, kMazeSeq4, kMazeSeq5, kMazeSeq6, kMazeSeq7, kMazeSeq8,
kMazeSeq9, kMazeSeq10, kMazeSeq11, kMazeSeq12, kMazeSeq13, kMazeSeq14, kMazeSeq15 } },
};
} // namespace OpenRCT2::TrackMetadata
+208
View File
@@ -0,0 +1,208 @@
/*****************************************************************************
* Copyright (c) 2014-2026 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
#pragma once
#include "../../localisation/StringIds.h"
#include "TrackElementDescriptor.h"
namespace OpenRCT2::TrackMetadata
{
using PS = PaintSegment;
static constexpr SequenceDescriptor kMinigolfHoleASeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
kSegmentsAll, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kMinigolfHoleASeq1 = {
.clearance = { -32, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
kSegmentsAll, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kMinigolfHoleBSeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
kSegmentsAll, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kMinigolfHoleBSeq1 = {
.clearance = { -32, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
kSegmentsAll, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kMinigolfHoleCSeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
kSegmentsAll, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kMinigolfHoleCSeq1 = {
.clearance = { -32, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
kSegmentsAll, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kMinigolfHoleDSeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
kSegmentsAll, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kMinigolfHoleDSeq1 = {
.clearance = { -32, 0, 0, 0, { 0b1111, 0 }, {} },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
kSegmentsAll, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kMinigolfHoleDSeq2 = {
.clearance = { -32, 32, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::nwSe },
.blockedSegments = { {
kSegmentsAll, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kMinigolfHoleESeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
kSegmentsAll, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kMinigolfHoleESeq1 = {
.clearance = { -32, 0, 0, 0, { 0b1111, 0 }, {} },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
kSegmentsAll, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kMinigolfHoleESeq2 = {
.clearance = { -32, -32, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::nwSe },
.blockedSegments = { {
kSegmentsAll, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
constexpr auto kTEDMinigolfHoleA = TrackElementDescriptor{
.description = STR_GOLF_HOLE_A,
.coordinates = { 0, 0, 0, 0, -32, 0 },
.pieceLength = 32,
.curveChain = { TrackCurve::none, TrackCurve::none },
.priceModifier = 159744,
.mirrorElement = TrackElemType::minigolfHoleA,
.flags = { TrackElementFlag::isGolfHole },
.definition = { TrackGroup::miniGolfHole, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.sequenceData = { 2, { kMinigolfHoleASeq0, kMinigolfHoleASeq1 } },
};
constexpr auto kTEDMinigolfHoleB = TrackElementDescriptor{
.description = STR_GOLF_HOLE_B,
.coordinates = { 0, 0, 0, 0, -32, 0 },
.pieceLength = 32,
.curveChain = { TrackCurve::none, TrackCurve::none },
.priceModifier = 167936,
.mirrorElement = TrackElemType::minigolfHoleB,
.flags = { TrackElementFlag::isGolfHole },
.definition = { TrackGroup::miniGolfHole, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.sequenceData = { 2, { kMinigolfHoleBSeq0, kMinigolfHoleBSeq1 } },
};
constexpr auto kTEDMinigolfHoleC = TrackElementDescriptor{
.description = STR_GOLF_HOLE_C,
.coordinates = { 0, 0, 0, 0, -32, 0 },
.pieceLength = 32,
.curveChain = { TrackCurve::none, TrackCurve::none },
.priceModifier = 172032,
.mirrorElement = TrackElemType::minigolfHoleC,
.flags = { TrackElementFlag::isGolfHole },
.definition = { TrackGroup::miniGolfHole, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.sequenceData = { 2, { kMinigolfHoleCSeq0, kMinigolfHoleCSeq1 } },
};
constexpr auto kTEDMinigolfHoleD = TrackElementDescriptor{
.description = STR_GOLF_HOLE_D,
.coordinates = { 0, 1, 0, 0, -32, 32 },
.pieceLength = 32,
.curveChain = { TrackCurve::none, TrackCurve::none },
.priceModifier = 184320,
.mirrorElement = TrackElemType::minigolfHoleE,
.flags = { TrackElementFlag::isGolfHole },
.definition = { TrackGroup::miniGolfHole, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.sequenceData = { 3, { kMinigolfHoleDSeq0, kMinigolfHoleDSeq1, kMinigolfHoleDSeq2 } },
};
constexpr auto kTEDMinigolfHoleE = TrackElementDescriptor{
.description = STR_GOLF_HOLE_E,
.coordinates = { 0, 3, 0, 0, -32, -32 },
.pieceLength = 32,
.curveChain = { TrackCurve::none, TrackCurve::none },
.priceModifier = 184320,
.mirrorElement = TrackElemType::minigolfHoleD,
.flags = { TrackElementFlag::isGolfHole },
.definition = { TrackGroup::miniGolfHole, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.sequenceData = { 3, { kMinigolfHoleESeq0, kMinigolfHoleESeq1, kMinigolfHoleESeq2 } },
};
} // namespace OpenRCT2::TrackMetadata
+211
View File
@@ -0,0 +1,211 @@
/*****************************************************************************
* Copyright (c) 2014-2026 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
#pragma once
#include "../../localisation/StringIds.h"
#include "TrackElementDescriptor.h"
#include <cstdint>
namespace OpenRCT2::TrackMetadata
{
using PS = PaintSegment;
static int32_t EvaluatorSBendLeft(const int16_t progress)
{
return (progress < 48) ? 98 : -98;
}
static int32_t EvaluatorSBendRight(const int16_t progress)
{
return (progress < 48) ? -98 : 98;
}
static constexpr SequenceDescriptor kSBendLeftSeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
EnumsToFlags(PS::top, PS::centre, PS::topRight, PS::bottomLeft), // narrow
EnumsToFlags(PS::top, PS::centre, PS::topRight, PS::bottomLeft), // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kSBendLeftSeq1 = {
.clearance = { -32, 0, 0, 0, { 0b0111, 0 }, {} },
.allowedWallEdges = 0b0011,
.woodenSupports = { WoodenSupportSubType::corner3 },
.blockedSegments = blockedSegmentsAllTypes(
EnumsToFlags(PS::top, PS::left, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft)),
};
static constexpr SequenceDescriptor kSBendLeftSeq2 = {
.clearance = { -32, -32, 0, 0, { 0b1101, 0 }, {} },
.allowedWallEdges = 0b1100,
.woodenSupports = { WoodenSupportSubType::corner1 },
.blockedSegments = blockedSegmentsAllTypes(
EnumsToFlags(PS::right, PS::bottom, PS::centre, PS::topRight, PS::bottomLeft, PS::bottomRight)),
};
static constexpr SequenceDescriptor kSBendLeftSeq3 = {
.clearance = { -64, -32, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
EnumsToFlags(PS::bottom, PS::centre, PS::topRight, PS::bottomLeft), // narrow
EnumsToFlags(PS::bottom, PS::centre, PS::topRight, PS::bottomLeft), // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kSBendRightSeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = blockedSegmentsFlipXAxis(kSBendLeftSeq0.blockedSegments),
};
static constexpr SequenceDescriptor kSBendRightSeq1 = {
.clearance = { -32, 0, 0, 0, { 0b1011, 0 }, {} },
.allowedWallEdges = 0b1001,
.woodenSupports = { WoodenSupportSubType::corner2 },
.blockedSegments = blockedSegmentsFlipXAxis(kSBendLeftSeq1.blockedSegments),
};
static constexpr SequenceDescriptor kSBendRightSeq2 = {
.clearance = { -32, 32, 0, 0, { 0b1110, 0 }, {} },
.allowedWallEdges = 0b0110,
.woodenSupports = { WoodenSupportSubType::corner0 },
.blockedSegments = blockedSegmentsFlipXAxis(kSBendLeftSeq2.blockedSegments),
};
static constexpr SequenceDescriptor kSBendRightSeq3 = {
.clearance = { -64, 32, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = blockedSegmentsFlipXAxis(kSBendLeftSeq3.blockedSegments),
};
static constexpr SequenceDescriptor kSBendLeftCoveredSeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.blockedSegments = kSBendLeftSeq0.blockedSegments,
};
static constexpr SequenceDescriptor kSBendLeftCoveredSeq1 = {
.clearance = { -32, 0, 0, 0, { 0b0111, 0 }, {} },
.allowedWallEdges = 0b0011,
.blockedSegments = kSBendLeftSeq1.blockedSegments,
};
static constexpr SequenceDescriptor kSBendLeftCoveredSeq2 = {
.clearance = { -32, -32, 0, 0, { 0b1101, 0 }, {} },
.allowedWallEdges = 0b1100,
.blockedSegments = kSBendLeftSeq2.blockedSegments,
};
static constexpr SequenceDescriptor kSBendLeftCoveredSeq3 = {
.clearance = { -64, -32, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.blockedSegments = kSBendLeftSeq3.blockedSegments,
};
static constexpr SequenceDescriptor kSBendRightCoveredSeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.blockedSegments = kSBendRightSeq0.blockedSegments,
};
static constexpr SequenceDescriptor kSBendRightCoveredSeq1 = {
.clearance = { -32, 0, 0, 0, { 0b1011, 0 }, {} },
.allowedWallEdges = 0b1001,
.blockedSegments = kSBendRightSeq1.blockedSegments,
};
static constexpr SequenceDescriptor kSBendRightCoveredSeq2 = {
.clearance = { -32, 32, 0, 0, { 0b1110, 0 }, {} },
.allowedWallEdges = 0b0110,
.blockedSegments = kSBendRightSeq2.blockedSegments,
};
static constexpr SequenceDescriptor kSBendRightCoveredSeq3 = {
.clearance = { -64, 32, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.blockedSegments = kSBendRightSeq3.blockedSegments,
};
constexpr auto kTEDSBendLeft = TrackElementDescriptor{
.description = STR_S_BEND_LEFT,
.coordinates = { 0, 0, 0, 0, -64, -32 },
.pieceLength = 96,
.curveChain = { TrackCurve::none, TrackCurve::none },
.alternativeType = TrackElemType::sBendLeftCovered,
.priceModifier = 229376,
.mirrorElement = TrackElemType::sBendRight,
.flags = {},
.definition = { TrackGroup::sBend, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.spinFunction = SpinFunction::lr,
.lateralFactor = EvaluatorSBendLeft,
.sequenceData = { 4, { kSBendLeftSeq0, kSBendLeftSeq1, kSBendLeftSeq2, kSBendLeftSeq3 } },
};
constexpr auto kTEDSBendRight = TrackElementDescriptor{
.description = STR_S_BEND_RIGHT,
.coordinates = { 0, 0, 0, 0, -64, 32 },
.pieceLength = 96,
.curveChain = { TrackCurve::none, TrackCurve::none },
.alternativeType = TrackElemType::sBendRightCovered,
.priceModifier = 229376,
.mirrorElement = TrackElemType::sBendLeft,
.flags = {},
.definition = { TrackGroup::sBend, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.spinFunction = SpinFunction::rl,
.lateralFactor = EvaluatorSBendRight,
.sequenceData = { 4, { kSBendRightSeq0, kSBendRightSeq1, kSBendRightSeq2, kSBendRightSeq3 } },
};
constexpr auto kTEDSBendLeftCovered = TrackElementDescriptor{
.description = STR_S_BEND_LEFT,
.coordinates = { 0, 0, 0, 0, -64, -32 },
.pieceLength = 96,
.curveChain = { TrackCurve::none, TrackCurve::none },
.priceModifier = 233472,
.mirrorElement = TrackElemType::sBendRightCovered,
.flags = {},
.definition = { TrackGroup::flat, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.spinFunction = SpinFunction::lr,
.lateralFactor = EvaluatorSBendLeft,
.sequenceData = { 4, { kSBendLeftCoveredSeq0, kSBendLeftCoveredSeq1, kSBendLeftCoveredSeq2, kSBendLeftCoveredSeq3 } },
};
constexpr auto kTEDSBendRightCovered = TrackElementDescriptor{
.description = STR_S_BEND_RIGHT,
.coordinates = { 0, 0, 0, 0, -64, 32 },
.pieceLength = 96,
.curveChain = { TrackCurve::none, TrackCurve::none },
.priceModifier = 233472,
.mirrorElement = TrackElemType::sBendLeftCovered,
.flags = {},
.definition = { TrackGroup::flat, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.spinFunction = SpinFunction::rl,
.lateralFactor = EvaluatorSBendRight,
.sequenceData = { 4,
{ kSBendRightCoveredSeq0, kSBendRightCoveredSeq1, kSBendRightCoveredSeq2, kSBendRightCoveredSeq3 } },
};
} // namespace OpenRCT2::TrackMetadata
+81
View File
@@ -0,0 +1,81 @@
/*****************************************************************************
* Copyright (c) 2014-2026 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
#pragma once
#include "../../localisation/StringIds.h"
#include "TrackElementDescriptor.h"
#include <cstdint>
namespace OpenRCT2::TrackMetadata
{
using PS = PaintSegment;
static constexpr SequenceDescriptor kEndStationSeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin,
SequenceFlag::disallowDoors, SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.metalSupports = { MetalSupportPlace::centre, true },
.blockedSegments = blockedSegmentsAllTypes(kSegmentsAll),
};
static constexpr SequenceDescriptor kBeginStationSeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin,
SequenceFlag::disallowDoors, SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.metalSupports = { MetalSupportPlace::centre, true },
.blockedSegments = blockedSegmentsAllTypes(kSegmentsAll),
};
static constexpr SequenceDescriptor kMiddleStationSeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.flags = { SequenceFlag::entranceConnectionSE, SequenceFlag::entranceConnectionNW, SequenceFlag::trackOrigin,
SequenceFlag::disallowDoors, SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.metalSupports = { MetalSupportPlace::centre, true },
.blockedSegments = blockedSegmentsAllTypes(kSegmentsAll),
};
constexpr auto kTEDEndStation = TrackElementDescriptor{
.description = STR_STATION_PLATFORM,
.coordinates = { 0, 0, 0, 0, 0, 0 },
.pieceLength = 32,
.curveChain = { TrackElemType::endStation, TrackElemType::endStation },
.priceModifier = 98304,
.mirrorElement = TrackElemType::endStation,
.flags = {},
.definition = { TrackGroup::stationEnd, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.sequenceData = { 1, { kEndStationSeq0 } },
};
constexpr auto kTEDBeginStation = TrackElementDescriptor{
.coordinates = { 0, 0, 0, 0, 0, 0 },
.pieceLength = 32,
.curveChain = { TrackElemType::endStation, TrackElemType::endStation },
.priceModifier = 98304,
.mirrorElement = TrackElemType::beginStation,
.flags = {},
.definition = { TrackGroup::stationEnd, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.sequenceData = { 1, { kBeginStationSeq0 } },
};
constexpr auto kTEDMiddleStation = TrackElementDescriptor{
.coordinates = { 0, 0, 0, 0, 0, 0 },
.pieceLength = 32,
.curveChain = { TrackElemType::endStation, TrackElemType::endStation },
.priceModifier = 98304,
.mirrorElement = TrackElemType::middleStation,
.flags = {},
.definition = { TrackGroup::stationEnd, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.sequenceData = { 1, { kMiddleStationSeq0 } },
};
} // namespace OpenRCT2::TrackMetadata
+173
View File
@@ -0,0 +1,173 @@
/*****************************************************************************
* Copyright (c) 2014-2026 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
#pragma once
#include "../../localisation/StringIds.h"
#include "TrackElementDescriptor.h"
#include <cstdint>
namespace OpenRCT2::TrackMetadata
{
using PS = PaintSegment;
static int32_t EvaluatorWaterSplash(const int16_t progress)
{
if (progress < 32)
return -150;
if (progress < 64)
return 150;
if (progress < 96)
return 0;
if (progress < 128)
return 150;
return -150;
}
static constexpr SequenceDescriptor kWaterfallSeq0 = {
.clearance = { 0, 0, 0, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
kSegmentsUnimplemented, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kWaterSplashSeq0 = {
.clearance = { 0, 0, 0, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
kSegmentsUnimplemented, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kWaterSplashSeq1 = {
.clearance = { -32, 0, 0, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
kSegmentsUnimplemented, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kWaterSplashSeq2 = {
.clearance = { -64, 0, 0, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
kSegmentsUnimplemented, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kWaterSplashSeq3 = {
.clearance = { -96, 0, 0, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
kSegmentsUnimplemented, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kWaterSplashSeq4 = {
.clearance = { -128, 0, 0, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
kSegmentsUnimplemented, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kWhirlpoolSeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
kSegmentsUnimplemented, // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kRapidsSeq0 = {
.clearance = { 0, 0, 0, 0, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = kFlatStraightBlockedSegments,
};
constexpr auto kTEDWaterfall = TrackElementDescriptor{
.description = STR_WATERFALLS,
.coordinates = { 0, 0, 0, 0, 0, 0 },
.pieceLength = 32,
.curveChain = { TrackElemType::waterfall, TrackElemType::waterfall },
.priceModifier = 143360,
.mirrorElement = TrackElemType::waterfall,
.flags = {},
.definition = { TrackGroup::waterfall, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.sequenceData = { 1, { kWaterfallSeq0 } },
};
constexpr auto kTEDRapids = TrackElementDescriptor{
.description = STR_RAPIDS,
.coordinates = { 0, 0, 0, 0, 0, 0 },
.pieceLength = 32,
.curveChain = { TrackElemType::rapids, TrackElemType::rapids },
.priceModifier = 118784,
.mirrorElement = TrackElemType::rapids,
.flags = {},
.definition = { TrackGroup::rapids, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.spinFunction = SpinFunction::sp,
.sequenceData = { 1, { kRapidsSeq0 } },
};
constexpr auto kTEDWaterSplash = TrackElementDescriptor{
.description = STR_WATER_SPLASH,
.coordinates = { 0, 0, 16, 16, -128, 0 },
.pieceLength = 128,
.curveChain = { TrackCurve::none, TrackCurve::none },
.priceModifier = 393216,
.mirrorElement = TrackElemType::waterSplash,
.flags = {},
.definition = { TrackGroup::waterSplash, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.verticalFactor = EvaluatorWaterSplash,
.sequenceData = { 5, { kWaterSplashSeq0, kWaterSplashSeq1, kWaterSplashSeq2, kWaterSplashSeq3, kWaterSplashSeq4 } },
};
constexpr auto kTEDWhirlpool = TrackElementDescriptor{
.description = STR_WHIRLPOOL,
.coordinates = { 0, 0, 0, 0, 0, 0 },
.pieceLength = 32,
.curveChain = { TrackCurve::none, TrackCurve::none },
.priceModifier = 126976,
.mirrorElement = TrackElemType::whirlpool,
.flags = {},
.definition = { TrackGroup::whirlpool, TrackPitch::none, TrackPitch::none, TrackRoll::none, TrackRoll::none, 0 },
.spinFunction = SpinFunction::r5,
.sequenceData = { 1, { kWhirlpoolSeq0 } },
};
} // namespace OpenRCT2::TrackMetadata
+452
View File
@@ -0,0 +1,452 @@
/*****************************************************************************
* Copyright (c) 2014-2026 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
#pragma once
#include "../../localisation/StringIds.h"
#include "TrackElementDescriptor.h"
#include <cstdint>
namespace OpenRCT2::TrackMetadata
{
using PS = PaintSegment;
static int32_t EvaluatorLargeZeroGRollUp(const int16_t progress)
{
if (progress > 114)
return (371 - 2 * progress);
return 0;
}
static int32_t EvaluatorLargeZeroGRollDown(const int16_t progress)
{
if (progress < 38)
return 67 + 2 * progress;
return 0;
}
static int32_t EvaluatorLargeZeroGRollUpLeft(const int16_t progress)
{
return 387 - 2 * progress;
}
static int32_t EvaluatorLargeZeroGRollUpRight(const int16_t progress)
{
return 2 * progress - 387;
}
static int32_t EvaluatorLargeZeroGRollDownLeft(const int16_t progress)
{
return 83 + 2 * progress;
}
static int32_t EvaluatorLargeZeroGRollDownRight(const int16_t progress)
{
return -(83 + 2 * progress);
}
static int32_t EvaluatorZeroGRollUpLeft(const int16_t progress)
{
return 174 - progress;
}
static int32_t EvaluatorZeroGRollUpRight(const int16_t progress)
{
return progress - 174;
}
static int32_t EvaluatorZeroGRollDownLeft(const int16_t progress)
{
return 73 + progress;
}
static int32_t EvaluatorZeroGRollDownRight(const int16_t progress)
{
return -(73 + progress);
}
static constexpr SequenceDescriptor kLeftZeroGRollUpSeq0 = {
.clearance = { 0, 0, 0, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kLeftZeroGRollUpSeq1 = {
.clearance = { -32, 0, 8, 24, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
EnumsToFlags(PS::top, PS::left, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kLeftZeroGRollUpSeq2 = {
.clearance = { -64, 0, 24, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.invertSegmentBlocking = true,
.blockedSegments = { {
EnumsToFlags(PS::top, PS::left, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kRightZeroGRollUpSeq0 = {
.clearance = { 0, 0, 0, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftZeroGRollUpSeq0.blockedSegments),
};
static constexpr SequenceDescriptor kRightZeroGRollUpSeq1 = {
.clearance = { -32, 0, 8, 24, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftZeroGRollUpSeq1.blockedSegments),
};
static constexpr SequenceDescriptor kRightZeroGRollUpSeq2 = {
.clearance = { -64, 0, 24, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.invertSegmentBlocking = true,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftZeroGRollUpSeq2.blockedSegments),
};
static constexpr SequenceDescriptor kLeftZeroGRollDownSeq0 = {
.clearance = { 0, 0, -32, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.invertSegmentBlocking = true,
.blockedSegments = blockedSegmentsRotate(kLeftZeroGRollUpSeq2.blockedSegments, 2),
};
static constexpr SequenceDescriptor kLeftZeroGRollDownSeq1 = {
.clearance = { -32, 0, -48, 24, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = blockedSegmentsRotate(kLeftZeroGRollUpSeq1.blockedSegments, 2),
};
static constexpr SequenceDescriptor kLeftZeroGRollDownSeq2 = {
.clearance = { -64, 0, -56, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = blockedSegmentsRotate(kLeftZeroGRollUpSeq0.blockedSegments, 2),
};
static constexpr SequenceDescriptor kRightZeroGRollDownSeq0 = {
.clearance = { 0, 0, -32, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.invertSegmentBlocking = true,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftZeroGRollDownSeq0.blockedSegments),
};
static constexpr SequenceDescriptor kRightZeroGRollDownSeq1 = {
.clearance = { -32, 0, -48, 24, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftZeroGRollDownSeq1.blockedSegments),
};
static constexpr SequenceDescriptor kRightZeroGRollDownSeq2 = {
.clearance = { -64, 0, -56, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftZeroGRollDownSeq2.blockedSegments),
};
static constexpr SequenceDescriptor kLeftLargeZeroGRollUpSeq0 = {
.clearance = { 0, 0, 0, 64, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kLeftLargeZeroGRollUpSeq1 = {
.clearance = { -32, 0, 56, 48, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
EnumsToFlags(PS::centre, PS::topRight, PS::bottomLeft), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kLeftLargeZeroGRollUpSeq2 = {
.clearance = { -64, 0, 96, 40, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = { {
EnumsToFlags(PS::top, PS::left, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kLeftLargeZeroGRollUpSeq3 = {
.clearance = { -96, 0, 120, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.invertSegmentBlocking = true,
.blockedSegments = { {
EnumsToFlags(PS::top, PS::left, PS::centre, PS::topLeft, PS::topRight, PS::bottomLeft), // narrow
kSegmentsUnimplemented, // inverted
kSegmentsAll, // wide
} },
};
static constexpr SequenceDescriptor kRightLargeZeroGRollUpSeq0 = {
.clearance = { 0, 0, 0, 64, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeZeroGRollUpSeq0.blockedSegments),
};
static constexpr SequenceDescriptor kRightLargeZeroGRollUpSeq1 = {
.clearance = { -32, 0, 56, 48, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeZeroGRollUpSeq1.blockedSegments),
};
static constexpr SequenceDescriptor kRightLargeZeroGRollUpSeq2 = {
.clearance = { -64, 0, 96, 40, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeZeroGRollUpSeq2.blockedSegments),
};
static constexpr SequenceDescriptor kRightLargeZeroGRollUpSeq3 = {
.clearance = { -96, 0, 120, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.invertSegmentBlocking = true,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeZeroGRollUpSeq3.blockedSegments),
};
static constexpr SequenceDescriptor kLeftLargeZeroGRollDownSeq0 = {
.clearance = { 0, 0, -32, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.invertSegmentBlocking = true,
.blockedSegments = blockedSegmentsRotate(kLeftLargeZeroGRollUpSeq3.blockedSegments, 2),
};
static constexpr SequenceDescriptor kLeftLargeZeroGRollDownSeq1 = {
.clearance = { -32, 0, -56, 40, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = blockedSegmentsRotate(kLeftLargeZeroGRollUpSeq2.blockedSegments, 2),
};
static constexpr SequenceDescriptor kLeftLargeZeroGRollDownSeq2 = {
.clearance = { -64, 0, -96, 48, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = blockedSegmentsRotate(kLeftLargeZeroGRollUpSeq1.blockedSegments, 2),
};
static constexpr SequenceDescriptor kLeftLargeZeroGRollDownSeq3 = {
.clearance = { -96, 0, -152, 64, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = blockedSegmentsRotate(kLeftLargeZeroGRollUpSeq0.blockedSegments, 2),
};
static constexpr SequenceDescriptor kRightLargeZeroGRollDownSeq0 = {
.clearance = { 0, 0, -32, 16, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.invertSegmentBlocking = true,
.blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeZeroGRollDownSeq0.blockedSegments),
};
static constexpr SequenceDescriptor kRightLargeZeroGRollDownSeq1 = {
.clearance = { -32, 0, -56, 40, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeZeroGRollDownSeq1.blockedSegments),
};
static constexpr SequenceDescriptor kRightLargeZeroGRollDownSeq2 = {
.clearance = { -64, 0, -96, 48, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeZeroGRollDownSeq2.blockedSegments),
};
static constexpr SequenceDescriptor kRightLargeZeroGRollDownSeq3 = {
.clearance = { -96, 0, -152, 64, { 0b1111, 0 }, {} },
.allowedWallEdges = 0b1010,
.flags = { SequenceFlag::hasHeightMarker },
.woodenSupports = { WoodenSupportSubType::neSw },
.blockedSegments = blockedSegmentsFlipXAxis(kLeftLargeZeroGRollDownSeq3.blockedSegments),
};
constexpr auto kTEDLeftZeroGRollUp = TrackElementDescriptor{
.description = STR_ZERO_G_ROLL_LEFT,
.coordinates = { 0, 0, 0, 56, -64, 0 },
.pieceLength = 96,
.curveChain = { TrackElemType::leftZeroGRollDown, TrackCurve::none },
.priceModifier = 229376,
.mirrorElement = TrackElemType::rightZeroGRollUp,
.flags = { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::startsAtHalfHeight,
TrackElementFlag::inversionToNormal },
.definition = { TrackGroup::zeroGRoll, TrackPitch::none, TrackPitch::up25, TrackRoll::upsideDown, TrackRoll::none, 0 },
.verticalFactor = EvaluatorConst<250>,
.lateralFactor = EvaluatorZeroGRollUpLeft,
.sequenceData = { 3, { kLeftZeroGRollUpSeq0, kLeftZeroGRollUpSeq1, kLeftZeroGRollUpSeq2 } },
};
constexpr auto kTEDRightZeroGRollUp = TrackElementDescriptor{
.description = STR_ZERO_G_ROLL_RIGHT,
.coordinates = { 0, 0, 0, 56, -64, 0 },
.pieceLength = 96,
.curveChain = { TrackElemType::rightZeroGRollDown, TrackCurve::none },
.priceModifier = 229376,
.mirrorElement = TrackElemType::leftZeroGRollUp,
.flags = { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::startsAtHalfHeight,
TrackElementFlag::inversionToNormal },
.definition = { TrackGroup::zeroGRoll, TrackPitch::none, TrackPitch::up25, TrackRoll::upsideDown, TrackRoll::none, 0 },
.verticalFactor = EvaluatorConst<250>,
.lateralFactor = EvaluatorZeroGRollUpRight,
.sequenceData = { 3, { kRightZeroGRollUpSeq0, kRightZeroGRollUpSeq1, kRightZeroGRollUpSeq2 } },
};
constexpr auto kTEDLeftZeroGRollDown = TrackElementDescriptor{
.description = STR_ZERO_G_ROLL_LEFT,
.coordinates = { 0, 0, 0, -56, -64, 0 },
.pieceLength = 96,
.curveChain = { TrackCurve::none, TrackElemType::leftZeroGRollUp },
.priceModifier = 229376,
.mirrorElement = TrackElemType::rightZeroGRollDown,
.flags = { TrackElementFlag::down, TrackElementFlag::inversionToNormal },
.definition = { TrackGroup::zeroGRoll, TrackPitch::down25, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown,
0 },
.verticalFactor = EvaluatorConst<250>,
.lateralFactor = EvaluatorZeroGRollDownLeft,
.sequenceData = { 3, { kLeftZeroGRollDownSeq0, kLeftZeroGRollDownSeq1, kLeftZeroGRollDownSeq2 } },
};
constexpr auto kTEDRightZeroGRollDown = TrackElementDescriptor{
.description = STR_ZERO_G_ROLL_RIGHT,
.coordinates = { 0, 0, 0, -56, -64, 0 },
.pieceLength = 96,
.curveChain = { TrackCurve::none, TrackElemType::rightZeroGRollUp },
.priceModifier = 229376,
.mirrorElement = TrackElemType::leftZeroGRollDown,
.flags = { TrackElementFlag::down, TrackElementFlag::inversionToNormal },
.definition = { TrackGroup::zeroGRoll, TrackPitch::down25, TrackPitch::none, TrackRoll::none, TrackRoll::upsideDown,
0 },
.verticalFactor = EvaluatorConst<250>,
.lateralFactor = EvaluatorZeroGRollDownRight,
.sequenceData = { 3, { kRightZeroGRollDownSeq0, kRightZeroGRollDownSeq1, kRightZeroGRollDownSeq2 } },
};
constexpr auto kTEDLeftLargeZeroGRollUp = TrackElementDescriptor{
.description = STR_LARGE_ZERO_G_ROLL_LEFT,
.coordinates = { 0, 0, 0, 152, -96, 0 },
.pieceLength = 165,
.curveChain = { TrackElemType::leftLargeZeroGRollDown, TrackCurve::none },
.priceModifier = 425984,
.mirrorElement = TrackElemType::rightLargeZeroGRollUp,
.flags = { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::startsAtHalfHeight,
TrackElementFlag::inversionToNormal },
.definition = { TrackGroup::zeroGRollLarge, TrackPitch::none, TrackPitch::up60, TrackRoll::upsideDown, TrackRoll::none,
64 },
.verticalFactor = EvaluatorLargeZeroGRollUp,
.lateralFactor = EvaluatorLargeZeroGRollUpLeft,
.sequenceData = { 4,
{ kLeftLargeZeroGRollUpSeq0, kLeftLargeZeroGRollUpSeq1, kLeftLargeZeroGRollUpSeq2,
kLeftLargeZeroGRollUpSeq3 } },
};
constexpr auto kTEDRightLargeZeroGRollUp = TrackElementDescriptor{
.description = STR_LARGE_ZERO_G_ROLL_RIGHT,
.coordinates = { 0, 0, 0, 152, -96, 0 },
.pieceLength = 165,
.curveChain = { TrackElemType::rightLargeZeroGRollDown, TrackCurve::none },
.priceModifier = 425984,
.mirrorElement = TrackElemType::leftLargeZeroGRollUp,
.flags = { TrackElementFlag::up, TrackElementFlag::normalToInversion, TrackElementFlag::startsAtHalfHeight,
TrackElementFlag::inversionToNormal },
.definition = { TrackGroup::zeroGRollLarge, TrackPitch::none, TrackPitch::up60, TrackRoll::upsideDown, TrackRoll::none,
64 },
.verticalFactor = EvaluatorLargeZeroGRollUp,
.lateralFactor = EvaluatorLargeZeroGRollUpRight,
.sequenceData = { 4,
{ kRightLargeZeroGRollUpSeq0, kRightLargeZeroGRollUpSeq1, kRightLargeZeroGRollUpSeq2,
kRightLargeZeroGRollUpSeq3 } },
};
constexpr auto kTEDLeftLargeZeroGRollDown = TrackElementDescriptor{
.description = STR_LARGE_ZERO_G_ROLL_LEFT,
.coordinates = { 0, 0, 0, -152, -96, 0 },
.pieceLength = 165,
.curveChain = { TrackCurve::none, TrackElemType::leftLargeZeroGRollUp },
.priceModifier = 425984,
.mirrorElement = TrackElemType::rightLargeZeroGRollDown,
.flags = { TrackElementFlag::down, TrackElementFlag::inversionToNormal },
.definition = { TrackGroup::zeroGRollLarge, TrackPitch::down60, TrackPitch::none, TrackRoll::none,
TrackRoll::upsideDown, -64 },
.verticalFactor = EvaluatorLargeZeroGRollDown,
.lateralFactor = EvaluatorLargeZeroGRollDownLeft,
.sequenceData = { 4,
{ kLeftLargeZeroGRollDownSeq0, kLeftLargeZeroGRollDownSeq1, kLeftLargeZeroGRollDownSeq2,
kLeftLargeZeroGRollDownSeq3 } },
};
constexpr auto kTEDRightLargeZeroGRollDown = TrackElementDescriptor{
.description = STR_LARGE_ZERO_G_ROLL_RIGHT,
.coordinates = { 0, 0, 0, -152, -96, 0 },
.pieceLength = 165,
.curveChain = { TrackCurve::none, TrackElemType::rightLargeZeroGRollUp },
.priceModifier = 425984,
.mirrorElement = TrackElemType::leftLargeZeroGRollDown,
.flags = { TrackElementFlag::down, TrackElementFlag::inversionToNormal },
.definition = { TrackGroup::zeroGRollLarge, TrackPitch::down60, TrackPitch::none, TrackRoll::none,
TrackRoll::upsideDown, -64 },
.verticalFactor = EvaluatorLargeZeroGRollDown,
.lateralFactor = EvaluatorLargeZeroGRollDownRight,
.sequenceData = { 4,
{ kRightLargeZeroGRollDownSeq0, kRightLargeZeroGRollDownSeq1, kRightLargeZeroGRollDownSeq2,
kRightLargeZeroGRollDownSeq3 } },
};
} // namespace OpenRCT2::TrackMetadata
@@ -214,6 +214,13 @@ namespace OpenRCT2::TrackMetadata
uint8_t alternates = false;
};
using BlockedSegmentsPerType = std::array<uint16_t, kBlockedSegmentsTypeCount>;
constexpr BlockedSegmentsPerType kFlatStraightBlockedSegments = { {
EnumsToFlags(PaintSegment::centre, PaintSegment::topRight, PaintSegment::bottomLeft), // narrow
EnumsToFlags(PaintSegment::centre, PaintSegment::topRight, PaintSegment::bottomLeft), // inverted
kSegmentsAll, // wide
} };
struct SequenceDescriptor
{
SequenceClearance clearance{};
@@ -225,7 +232,7 @@ namespace OpenRCT2::TrackMetadata
SequenceMetalSupport metalSupports{};
int8_t extraSupportRotation = 0;
bool invertSegmentBlocking = false;
std::array<uint16_t, kBlockedSegmentsTypeCount> blockedSegments{ kSegmentsNone, kSegmentsNone, kSegmentsNone };
BlockedSegmentsPerType blockedSegments{ kSegmentsNone, kSegmentsNone, kSegmentsNone };
constexpr uint8_t getEntranceConnectionSides() const
{