Wooden Twister: Add type and implement flat-to-steep transitions

This commit is contained in:
Gymnasiast 2024-10-09 10:44:40 +02:00
parent 36f0ce04e7
commit 55f0892106
No known key found for this signature in database
GPG key ID: DBFFF47AB2CA3EDD
14 changed files with 614 additions and 337 deletions

View file

@ -100,6 +100,7 @@ STR_0095 :Alpine Coaster
STR_0096 :Classic Wooden Roller Coaster
STR_0097 :Classic Stand-up Roller Coaster
STR_0098 :LSM Launched Roller Coaster
STR_0099 :Classic Wooden Twister Roller Coaster
STR_0512 :A compact roller coaster with a spiral lift hill and smooth, twisting drops.
STR_0513 :A looping roller coaster where the riders ride in a standing position
STR_0514 :Trains suspended beneath the roller coaster track swing out to the side around corners
@ -185,6 +186,7 @@ STR_0605 :Riders toboggan down a meandering steel track, braking to control t
STR_0606 :An older-style wooden roller coaster with a fast and rough ride, with plenty of air-time, some lateral Gs, and designed to feel out-of-control
STR_0607 :An intense, older-style steel looping roller coaster where the riders ride in a standing position
STR_0608 :Roller coaster trains are accelerated by linear synchronous motors, speeding through tight twists and turns
STR_0609 :An older-style wooden roller coaster with a fast and rough ride featuring articulated trains, plenty of air-time and twisting track
STR_0767 :Guest {INT32}
STR_0768 :Handyman {INT32}
STR_0769 :Mechanic {INT32}

View file

@ -68,6 +68,7 @@ namespace OpenRCT2::Ui::Windows
RIDE_TYPE_VIRGINIA_REEL,
RIDE_TYPE_REVERSER_ROLLER_COASTER,
RIDE_TYPE_CLASSIC_WOODEN_ROLLER_COASTER,
RIDE_TYPE_CLASSIC_WOODEN_TWISTER_ROLLER_COASTER,
RIDE_TYPE_WOODEN_ROLLER_COASTER,
RIDE_TYPE_WOODEN_WILD_MOUSE,
RIDE_TYPE_STEEL_WILD_MOUSE,

View file

@ -380,7 +380,7 @@
<ClInclude Include="paint\tile_element\Paint.TileElement.h" />
<ClInclude Include="paint\tile_element\Segment.h" />
<ClInclude Include="paint\tile_element\Paint.Tunnel.h" />
<ClInclude Include="paint\track\coaster\WoodenRollerCoaster.h" />
<ClInclude Include="paint\track\coaster\WoodenRollerCoaster.hpp" />
<ClInclude Include="paint\track\Segment.h" />
<ClInclude Include="paint\track\Support.h" />
<ClInclude Include="paint\vehicle\Vehicle.MiniGolf.h" />
@ -435,6 +435,7 @@
<ClInclude Include="ride\rtd\coaster\ClassicMiniRollerCoaster.h" />
<ClInclude Include="ride\rtd\coaster\ClassicStandUpRollerCoaster.h" />
<ClInclude Include="ride\rtd\coaster\ClassicWoodenRollerCoaster.h" />
<ClInclude Include="ride\rtd\coaster\ClassicWoodenTwisterRollerCoaster.h" />
<ClInclude Include="ride\rtd\coaster\CompactInvertedCoaster.h" />
<ClInclude Include="ride\rtd\coaster\CorkscrewRollerCoaster.h" />
<ClInclude Include="ride\rtd\coaster\FlyingRollerCoaster.h" />
@ -916,6 +917,7 @@
<ClCompile Include="paint\track\coaster\BobsleighCoaster.cpp" />
<ClCompile Include="paint\track\coaster\ClassicStandUpRollerCoaster.cpp" />
<ClCompile Include="paint\track\coaster\ClassicWoodenRollerCoaster.cpp" />
<ClCompile Include="paint\track\coaster\ClassicWoodenTwisterRollerCoaster.cpp" />
<ClCompile Include="paint\track\coaster\CompactInvertedCoaster.cpp" />
<ClCompile Include="paint\track\coaster\CorkscrewRollerCoaster.cpp" />
<ClCompile Include="paint\track\coaster\FlyingRollerCoaster.cpp" />

View file

@ -22,11 +22,11 @@
#include "../../tile_element/Segment.h"
#include "../../track/Segment.h"
#include "../../track/Support.h"
#include "WoodenRollerCoaster.h"
#include "WoodenRollerCoaster.hpp"
using namespace OpenRCT2;
static constexpr TunnelGroup kTunnelGroup = TunnelGroup::Square;
// static constexpr TunnelGroup kTunnelGroup = TunnelGroup::Square;
enum
{

View file

@ -0,0 +1,248 @@
/*****************************************************************************
* Copyright (c) 2014-2024 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.
*****************************************************************************/
#include "../../../ride/Track.h"
#include "../../../ride/TrackPaint.h"
#include "../../../sprites.h"
#include "../../tile_element/Paint.Tunnel.h"
#include "../../tile_element/Segment.h"
#include "WoodenRollerCoaster.hpp"
using namespace OpenRCT2;
// static constexpr TunnelGroup kTunnelGroup = TunnelGroup::Square;
enum
{
SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_0 = SPR_CSG_BEGIN + 65447,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_1 = SPR_CSG_BEGIN + 65448,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_2 = SPR_CSG_BEGIN + 65449,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_3 = SPR_CSG_BEGIN + 65450,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_0 = SPR_CSG_BEGIN + 65451,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_1 = SPR_CSG_BEGIN + 65452,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_2 = SPR_CSG_BEGIN + 65453,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_3 = SPR_CSG_BEGIN + 65454,
SPR_CLASSIC_WOODEN_RC_LEFT_BANK_0 = SPR_CSG_BEGIN + 65455,
SPR_CLASSIC_WOODEN_RC_LEFT_BANK_1 = SPR_CSG_BEGIN + 65456,
SPR_CLASSIC_WOODEN_RC_LEFT_BANK_2 = SPR_CSG_BEGIN + 65457,
SPR_CLASSIC_WOODEN_RC_LEFT_BANK_3 = SPR_CSG_BEGIN + 65458,
SPR_CLASSIC_WOODEN_RC_UP25_TO_LEFT_BANK_0 = SPR_CSG_BEGIN + 65459,
SPR_CLASSIC_WOODEN_RC_UP25_TO_LEFT_BANK_1 = SPR_CSG_BEGIN + 65460,
SPR_CLASSIC_WOODEN_RC_UP25_TO_LEFT_BANK_2 = SPR_CSG_BEGIN + 65461,
SPR_CLASSIC_WOODEN_RC_UP25_TO_LEFT_BANK_3 = SPR_CSG_BEGIN + 65462,
SPR_CLASSIC_WOODEN_RC_UP25_TO_RIGHT_BANK_0 = SPR_CSG_BEGIN + 65463,
SPR_CLASSIC_WOODEN_RC_UP25_TO_RIGHT_BANK_1 = SPR_CSG_BEGIN + 65464,
SPR_CLASSIC_WOODEN_RC_UP25_TO_RIGHT_BANK_2 = SPR_CSG_BEGIN + 65465,
SPR_CLASSIC_WOODEN_RC_UP25_TO_RIGHT_BANK_3 = SPR_CSG_BEGIN + 65466,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_FRONT_1 = SPR_CSG_BEGIN + 65475,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_FRONT_3 = SPR_CSG_BEGIN + 65476,
// SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_FRONT_0 = SPR_CSG_BEGIN + 65477,
// SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_FRONT_2 = SPR_CSG_BEGIN + 65478,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_HANDRAIL_0 = SPR_CSG_BEGIN + 66203,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_HANDRAIL_1 = SPR_CSG_BEGIN + 66204,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_HANDRAIL_2 = SPR_CSG_BEGIN + 66205,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_HANDRAIL_3 = SPR_CSG_BEGIN + 66206,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_HANDRAIL_0 = SPR_CSG_BEGIN + 66207,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_HANDRAIL_1 = SPR_CSG_BEGIN + 66208,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_HANDRAIL_2 = SPR_CSG_BEGIN + 66209,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_HANDRAIL_3 = SPR_CSG_BEGIN + 66210,
SPR_CLASSIC_WOODEN_RC_LEFT_BANK_HANDRAIL_0 = SPR_CSG_BEGIN + 66211,
SPR_CLASSIC_WOODEN_RC_LEFT_BANK_HANDRAIL_1 = SPR_CSG_BEGIN + 66212,
SPR_CLASSIC_WOODEN_RC_LEFT_BANK_HANDRAIL_2 = SPR_CSG_BEGIN + 66213,
SPR_CLASSIC_WOODEN_RC_LEFT_BANK_HANDRAIL_3 = SPR_CSG_BEGIN + 66214,
SPR_CLASSIC_WOODEN_RC_UP25_TO_LEFT_BANK_HANDRAIL_0 = SPR_CSG_BEGIN + 66215,
SPR_CLASSIC_WOODEN_RC_UP25_TO_LEFT_BANK_HANDRAIL_1 = SPR_CSG_BEGIN + 66216,
SPR_CLASSIC_WOODEN_RC_UP25_TO_LEFT_BANK_HANDRAIL_2 = SPR_CSG_BEGIN + 66217,
SPR_CLASSIC_WOODEN_RC_UP25_TO_LEFT_BANK_HANDRAIL_3 = SPR_CSG_BEGIN + 66218,
SPR_CLASSIC_WOODEN_RC_UP25_TO_RIGHT_BANK_HANDRAIL_0 = SPR_CSG_BEGIN + 66219,
SPR_CLASSIC_WOODEN_RC_UP25_TO_RIGHT_BANK_HANDRAIL_1 = SPR_CSG_BEGIN + 66220,
SPR_CLASSIC_WOODEN_RC_UP25_TO_RIGHT_BANK_HANDRAIL_2 = SPR_CSG_BEGIN + 66221,
SPR_CLASSIC_WOODEN_RC_UP25_TO_RIGHT_BANK_HANDRAIL_3 = SPR_CSG_BEGIN + 66222,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_FRONT_HANDRAIL_1 = SPR_CSG_BEGIN + 66231,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_FRONT_HANDRAIL_3 = SPR_CSG_BEGIN + 66232,
// SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_FRONT_HANDRAIL_0 = SPR_CSG_BEGIN + 66233,
// SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_FRONT_HANDRAIL_2 = SPR_CSG_BEGIN + 66234,
};
static constexpr std::array<StraightWoodenTrack, kNumOrthogonalDirections> kFlatToLeftBankImages = { {
{
SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_0,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_HANDRAIL_0,
},
{
SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_1,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_HANDRAIL_1,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_FRONT_1,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_FRONT_HANDRAIL_1,
},
{
SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_2,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_HANDRAIL_2,
},
{
SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_3,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_HANDRAIL_3,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_FRONT_3,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_FRONT_HANDRAIL_3,
},
} };
static constexpr std::array<StraightWoodenTrack, kNumOrthogonalDirections> kFlatToRightBankImages = { {
{
SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_0, SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_HANDRAIL_0,
// SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_FRONT_0,
// SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_FRONT_HANDRAIL_0,
},
{
SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_1,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_HANDRAIL_1,
},
{
SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_2, SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_HANDRAIL_2,
// SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_FRONT_2,
// SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_FRONT_HANDRAIL_2,
},
{
SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_3,
SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_HANDRAIL_3,
},
} };
static constexpr std::array<StraightWoodenTrack, kNumOrthogonalDirections> kLeftBankImages = { {
{ SPR_CLASSIC_WOODEN_RC_LEFT_BANK_0, SPR_CLASSIC_WOODEN_RC_LEFT_BANK_HANDRAIL_0 },
{ SPR_CLASSIC_WOODEN_RC_LEFT_BANK_1, SPR_CLASSIC_WOODEN_RC_LEFT_BANK_HANDRAIL_1 },
{ SPR_CLASSIC_WOODEN_RC_LEFT_BANK_2, SPR_CLASSIC_WOODEN_RC_LEFT_BANK_HANDRAIL_2 },
{ SPR_CLASSIC_WOODEN_RC_LEFT_BANK_3, SPR_CLASSIC_WOODEN_RC_LEFT_BANK_HANDRAIL_3 },
} };
static constexpr std::array<StraightWoodenTrack, kNumOrthogonalDirections> kUp25ToLeftBankImages = { {
{
SPR_CLASSIC_WOODEN_RC_UP25_TO_LEFT_BANK_0,
SPR_CLASSIC_WOODEN_RC_UP25_TO_LEFT_BANK_HANDRAIL_0,
},
{
SPR_CLASSIC_WOODEN_RC_UP25_TO_LEFT_BANK_1,
SPR_CLASSIC_WOODEN_RC_UP25_TO_LEFT_BANK_HANDRAIL_1,
},
{
SPR_CLASSIC_WOODEN_RC_UP25_TO_LEFT_BANK_2,
SPR_CLASSIC_WOODEN_RC_UP25_TO_LEFT_BANK_HANDRAIL_2,
},
{
SPR_CLASSIC_WOODEN_RC_UP25_TO_LEFT_BANK_3,
SPR_CLASSIC_WOODEN_RC_UP25_TO_LEFT_BANK_HANDRAIL_3,
},
} };
static constexpr std::array<StraightWoodenTrack, kNumOrthogonalDirections> kUp25ToRightBankImages = { {
{
SPR_CLASSIC_WOODEN_RC_UP25_TO_RIGHT_BANK_0,
SPR_CLASSIC_WOODEN_RC_UP25_TO_RIGHT_BANK_HANDRAIL_0,
},
{
SPR_CLASSIC_WOODEN_RC_UP25_TO_RIGHT_BANK_1,
SPR_CLASSIC_WOODEN_RC_UP25_TO_RIGHT_BANK_HANDRAIL_1,
},
{
SPR_CLASSIC_WOODEN_RC_UP25_TO_RIGHT_BANK_2,
SPR_CLASSIC_WOODEN_RC_UP25_TO_RIGHT_BANK_HANDRAIL_2,
},
{
SPR_CLASSIC_WOODEN_RC_UP25_TO_RIGHT_BANK_3,
SPR_CLASSIC_WOODEN_RC_UP25_TO_RIGHT_BANK_HANDRAIL_3,
},
} };
static void ClassicWoodenTwisterRCTrackLeftBankToFlat(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement, SupportType supportType)
{
WoodenRCTrackFlatToBank<false, kFlatToRightBankImages>(
session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType);
}
static void ClassicWoodenTwisterRCTrackRightBankToFlat(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement, SupportType supportType)
{
WoodenRCTrackFlatToBank<false, kFlatToLeftBankImages>(
session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType);
}
static void ClassicWoodenTwisterRCTrackRightBank(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement, SupportType supportType)
{
WoodenRCTrackFlatToBank<false, kLeftBankImages>(
session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType);
}
static void ClassicWoodenTwisterRCTrackLeftBankTo25DegDown(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement, SupportType supportType)
{
WoodenRCTrack25DegUpToBank<false, kUp25ToRightBankImages>(
session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType);
}
static void ClassicWoodenTwisterRCTrackRightBankTo25DegDown(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement, SupportType supportType)
{
WoodenRCTrack25DegUpToBank<false, kUp25ToLeftBankImages>(
session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType);
}
// Stylistically, this coaster is _very_ similar to the regular Wooden Roller Coaster.
// The only difference is the degree of the banking.
// As such, all non-banked pieces are simply drawn as regular wooden roller coaster pieces.
TRACK_PAINT_FUNCTION GetTrackPaintFunctionClassicWoodenTwisterRC(OpenRCT2::TrackElemType trackType)
{
if (!IsCsgLoaded())
{
return GetTrackPaintFunctionWoodenRC(trackType);
}
switch (trackType)
{
case TrackElemType::FlatToLeftBank:
return WoodenRCTrackFlatToBank<false, kFlatToLeftBankImages>;
case TrackElemType::FlatToRightBank:
return WoodenRCTrackFlatToBank<false, kFlatToRightBankImages>;
case TrackElemType::LeftBankToFlat:
return ClassicWoodenTwisterRCTrackLeftBankToFlat;
case TrackElemType::RightBankToFlat:
return ClassicWoodenTwisterRCTrackRightBankToFlat;
case TrackElemType::LeftBank:
return WoodenRCTrackFlatToBank<false, kLeftBankImages>;
case TrackElemType::RightBank:
return ClassicWoodenTwisterRCTrackRightBank;
case TrackElemType::Up25ToLeftBank:
return WoodenRCTrack25DegUpToBank<false, kUp25ToLeftBankImages>;
case TrackElemType::Up25ToRightBank:
return WoodenRCTrack25DegUpToBank<false, kUp25ToRightBankImages>;
case TrackElemType::LeftBankToDown25:
return ClassicWoodenTwisterRCTrackLeftBankTo25DegDown;
case TrackElemType::RightBankToDown25:
return ClassicWoodenTwisterRCTrackRightBankTo25DegDown;
default:
return GetTrackPaintFunctionWoodenRC(trackType);
}
}

View file

@ -7,7 +7,7 @@
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
#include "WoodenRollerCoaster.h"
#include "WoodenRollerCoaster.hpp"
#include "../../../config/Config.h"
#include "../../../drawing/Drawing.h"
@ -29,7 +29,7 @@
using namespace OpenRCT2;
static constexpr TunnelGroup kTunnelGroup = TunnelGroup::Square;
// static constexpr TunnelGroup kTunnelGroup = TunnelGroup::Square;
enum
{
@ -479,6 +479,105 @@ static constexpr const uint32_t WoodenRCDiagBlockBrakeImages[2][kNumOrthogonalDi
},
};
static constexpr std::array<StraightWoodenTrack, kNumOrthogonalDirections> kFlatToLeftBankImages = { {
{
SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_SW_NE,
SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_RAILS_SW_NE,
},
{
SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_NW_SE,
SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_RAILS_NW_SE,
SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_FRONT_NW_SE,
SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_RAILS_FRONT_NW_SE,
},
{
SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_NE_SW,
SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_RAILS_NE_SW,
},
{
SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_SE_NW,
SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_RAILS_SE_NW,
SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_FRONT_SE_NW,
SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_RAILS_FRONT_SE_NW,
},
} };
static constexpr std::array<StraightWoodenTrack, kNumOrthogonalDirections> kFlatToRightBankImages = { {
{
SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_SW_NE,
SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_RAILS_SW_NE,
SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_FRONT_SW_NE,
SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_RAILS_FRONT_SW_NE,
},
{
SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_NW_SE,
SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_RAILS_NW_SE,
},
{
SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_NE_SW,
SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_RAILS_NE_SW,
SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_FRONT_NE_SW,
SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_RAILS_FRONT_NE_SW,
},
{
SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_SE_NW,
SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_RAILS_SE_NW,
},
} };
static constexpr std::array<StraightWoodenTrack, kNumOrthogonalDirections> kLeftBankImages = { {
{ SPR_WOODEN_RC_LEFT_BANK_SW_NE, SPR_WOODEN_RC_LEFT_BANK_RAILS_SW_NE },
{ SPR_WOODEN_RC_LEFT_BANK_NW_SE, SPR_WOODEN_RC_LEFT_BANK_RAILS_NW_SE },
{ SPR_WOODEN_RC_LEFT_BANK_NE_SW, SPR_WOODEN_RC_LEFT_BANK_RAILS_NE_SW },
{ SPR_WOODEN_RC_LEFT_BANK_SE_NW, SPR_WOODEN_RC_LEFT_BANK_RAILS_SE_NW },
} };
static constexpr std::array<StraightWoodenTrack, kNumOrthogonalDirections> kUp25ToLeftBankImages = { {
{
SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_SW_NE,
SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_RAILS_SW_NE,
},
{
SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_NW_SE,
SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_RAILS_NW_SE,
SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_FRONT_NW_SE,
SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_RAILS_FRONT_NW_SE,
},
{
SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_NE_SW,
SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_RAILS_NE_SW,
SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_FRONT_NE_SW,
SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_RAILS_FRONT_NE_SW,
},
{
SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_SE_NW,
SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_RAILS_SE_NW,
},
} };
static constexpr std::array<StraightWoodenTrack, kNumOrthogonalDirections> kUp25ToRightBankImages = { {
{
SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_SW_NE,
SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_RAILS_SW_NE,
},
{
SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_NW_SE,
SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_RAILS_NW_SE,
SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_FRONT_NW_SE,
SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_RAILS_FRONT_NW_SE,
},
{
SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_NE_SW,
SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_RAILS_NE_SW,
SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_FRONT_NE_SW,
SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_RAILS_FRONT_NE_SW,
},
{
SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_SE_NW,
SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_RAILS_SE_NW,
},
} };
ImageId WoodenRCGetRailsColour(PaintSession& session)
{
return session.TrackColours;
@ -1523,111 +1622,13 @@ static void WoodenRCTrackLeftQuarterTurn5(
session, ride, trackSequence, (direction + 1) & 3, height, trackElement, supportType);
}
/** rct2: 0x008AC658 */
template<bool isClassic>
static void WoodenRCTrackFlatToLeftBank(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement, SupportType supportType)
{
static constexpr uint32_t imageIds[4][4] = {
{
SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_SW_NE,
SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_RAILS_SW_NE,
0,
0,
},
{
SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_NW_SE,
SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_RAILS_NW_SE,
SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_FRONT_NW_SE,
SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_RAILS_FRONT_NW_SE,
},
{
SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_NE_SW,
SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_RAILS_NE_SW,
0,
0,
},
{
SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_SE_NW,
SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_RAILS_SE_NW,
SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_FRONT_SE_NW,
SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_RAILS_FRONT_SE_NW,
},
};
WoodenRCTrackPaint<isClassic>(
session, direction, imageIds[direction][0], imageIds[direction][1], { 0, 0, height },
{ { 0, 3, height }, { 32, 25, 2 } });
if (direction == 1 || direction == 3)
{
WoodenRCTrackPaint<isClassic>(
session, direction, imageIds[direction][2], imageIds[direction][3], { 0, 0, height },
{ { 0, 26, height + 5 }, { 32, 1, 9 } });
}
WoodenASupportsPaintSetupRotated(
session, supportType.wooden, WoodenSupportSubType::NeSw, direction, height, session.SupportColours);
PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat);
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight);
}
/** rct2: 0x008AC668 */
template<bool isClassic>
static void WoodenRCTrackFlatToRightBank(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement, SupportType supportType)
{
static constexpr uint32_t imageIds[4][4] = {
{
SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_SW_NE,
SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_RAILS_SW_NE,
SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_FRONT_SW_NE,
SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_RAILS_FRONT_SW_NE,
},
{
SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_NW_SE,
SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_RAILS_NW_SE,
0,
0,
},
{
SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_NE_SW,
SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_RAILS_NE_SW,
SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_FRONT_NE_SW,
SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_RAILS_FRONT_NE_SW,
},
{
SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_SE_NW,
SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_RAILS_SE_NW,
0,
0,
},
};
WoodenRCTrackPaint<isClassic>(
session, direction, imageIds[direction][0], imageIds[direction][1], { 0, 0, height },
{ { 0, 3, height }, { 32, 25, 2 } });
if (direction == 0 || direction == 2)
{
WoodenRCTrackPaint<isClassic>(
session, direction, imageIds[direction][2], imageIds[direction][3], { 0, 0, height },
{ { 0, 26, height + 5 }, { 32, 1, 9 } });
}
WoodenASupportsPaintSetupRotated(
session, supportType.wooden, WoodenSupportSubType::NeSw, direction, height, session.SupportColours);
PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat);
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight);
}
/** rct2: 0x008AC678 */
template<bool isClassic>
static void WoodenRCTrackLeftBankToFlat(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement, SupportType supportType)
{
WoodenRCTrackFlatToRightBank<isClassic>(
WoodenRCTrackFlatToBank<isClassic, kFlatToRightBankImages>(
session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType);
}
@ -1637,7 +1638,7 @@ static void WoodenRCTrackRightBankToFlat(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement, SupportType supportType)
{
WoodenRCTrackFlatToLeftBank<isClassic>(
WoodenRCTrackFlatToBank<isClassic, kFlatToLeftBankImages>(
session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType);
}
@ -2115,119 +2116,7 @@ static void WoodenRCTrackRightBankTo25DegUp(
PaintUtilSetGeneralSupportHeight(session, height + 48);
}
/** rct2: 0x008AC6D8 */
template<bool isClassic>
static void WoodenRCTrack25DegUpToLeftBank(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement, SupportType supportType)
{
static constexpr uint32_t imageIds[4][4] = {
{
SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_SW_NE,
SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_RAILS_SW_NE,
0,
0,
},
{
SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_NW_SE,
SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_RAILS_NW_SE,
SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_FRONT_NW_SE,
SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_RAILS_FRONT_NW_SE,
},
{
SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_NE_SW,
SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_RAILS_NE_SW,
SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_FRONT_NE_SW,
SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_RAILS_FRONT_NE_SW,
},
{
SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_SE_NW,
SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_RAILS_SE_NW,
0,
0,
},
};
WoodenRCTrackPaint<isClassic>(
session, direction, imageIds[direction][0], imageIds[direction][1], { 0, 0, height },
{ { 0, 3, height }, { 32, 25, 2 } });
if (direction == 1 || direction == 2)
{
WoodenRCTrackPaint<isClassic>(
session, direction, imageIds[direction][2], imageIds[direction][3], { 0, 0, height },
{ { 0, 26, height + 5 }, { 32, 1, 9 } });
}
WoodenASupportsPaintSetupRotated(
session, supportType.wooden, WoodenSupportSubType::NeSw, direction, height, session.SupportColours,
WoodenSupportTransitionType::Up25DegToFlat);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::Flat);
}
else
{
PaintUtilPushTunnelRotated(session, direction, height + 8, kTunnelGroup, TunnelSubType::FlatTo25Deg);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 40);
}
/** rct2: 0x008AC6E8 */
template<bool isClassic>
static void WoodenRCTrack25DegUpToRightBank(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement, SupportType supportType)
{
static constexpr uint32_t imageIds[4][4] = {
{
SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_SW_NE,
SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_RAILS_SW_NE,
0,
0,
},
{
SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_NW_SE,
SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_RAILS_NW_SE,
SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_FRONT_NW_SE,
SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_RAILS_FRONT_NW_SE,
},
{
SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_NE_SW,
SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_RAILS_NE_SW,
SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_FRONT_NE_SW,
SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_RAILS_FRONT_NE_SW,
},
{
SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_SE_NW,
SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_RAILS_SE_NW,
0,
0,
},
};
WoodenRCTrackPaint<isClassic>(
session, direction, imageIds[direction][0], imageIds[direction][1], { 0, 0, height },
{ { 0, 3, height }, { 32, 25, 2 } });
if (direction == 1 || direction == 2)
{
WoodenRCTrackPaint<isClassic>(
session, direction, imageIds[direction][2], imageIds[direction][3], { 0, 0, height },
{ { 0, 26, height + 5 }, { 32, 1, 9 } });
}
WoodenASupportsPaintSetupRotated(
session, supportType.wooden, WoodenSupportSubType::NeSw, direction, height, session.SupportColours,
WoodenSupportTransitionType::Up25DegToFlat);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::Flat);
}
else
{
PaintUtilPushTunnelRotated(session, direction, height + 8, kTunnelGroup, TunnelSubType::FlatTo25Deg);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 40);
}
/** rct2: */
/** rct2: 0x008AC6F8 */
template<bool isClassic>
@ -2235,7 +2124,7 @@ static void WoodenRCTrackLeftBankTo25DegDown(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement, SupportType supportType)
{
WoodenRCTrack25DegUpToRightBank<isClassic>(
WoodenRCTrack25DegUpToBank<isClassic, kUp25ToRightBankImages>(
session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType);
}
@ -2245,7 +2134,7 @@ static void WoodenRCTrackRightBankTo25DegDown(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement, SupportType supportType)
{
WoodenRCTrack25DegUpToLeftBank<isClassic>(
WoodenRCTrack25DegUpToBank<isClassic, kUp25ToLeftBankImages>(
session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType);
}
@ -2269,36 +2158,14 @@ static void WoodenRCTrack25DegDownToRightBank(
session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType);
}
/** rct2: 0x008AC738 */
template<bool isClassic>
static void WoodenRCTrackLeftBank(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement, SupportType supportType)
{
static constexpr uint32_t imageIds[4][2] = {
{ SPR_WOODEN_RC_LEFT_BANK_SW_NE, SPR_WOODEN_RC_LEFT_BANK_RAILS_SW_NE },
{ SPR_WOODEN_RC_LEFT_BANK_NW_SE, SPR_WOODEN_RC_LEFT_BANK_RAILS_NW_SE },
{ SPR_WOODEN_RC_LEFT_BANK_NE_SW, SPR_WOODEN_RC_LEFT_BANK_RAILS_NE_SW },
{ SPR_WOODEN_RC_LEFT_BANK_SE_NW, SPR_WOODEN_RC_LEFT_BANK_RAILS_SE_NW },
};
WoodenRCTrackPaint<isClassic>(
session, direction, imageIds[direction][0], imageIds[direction][1], { 0, 0, height },
{ { 0, 3, height }, { 32, 25, 2 } });
WoodenASupportsPaintSetupRotated(
session, supportType.wooden, WoodenSupportSubType::NeSw, direction, height, session.SupportColours);
PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat);
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight);
}
/** rct2: 0x008AC748 */
template<bool isClassic>
static void WoodenRCTrackRightBank(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement, SupportType supportType)
{
WoodenRCTrackLeftBank<isClassic>(session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType);
WoodenRCTrackFlatToBank<isClassic, kLeftBankImages>(
session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType);
}
/** rct2: 0x008AC758 */
@ -17668,9 +17535,9 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionWoodenAndClassicWoodenRC(OpenRCT2::Tra
case TrackElemType::RightQuarterTurn5Tiles:
return WoodenRCTrackRightQuarterTurn5<isClassic>;
case TrackElemType::FlatToLeftBank:
return WoodenRCTrackFlatToLeftBank<isClassic>;
return WoodenRCTrackFlatToBank<isClassic, kFlatToLeftBankImages>;
case TrackElemType::FlatToRightBank:
return WoodenRCTrackFlatToRightBank<isClassic>;
return WoodenRCTrackFlatToBank<isClassic, kFlatToRightBankImages>;
case TrackElemType::LeftBankToFlat:
return WoodenRCTrackLeftBankToFlat<isClassic>;
case TrackElemType::RightBankToFlat:
@ -17684,9 +17551,9 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionWoodenAndClassicWoodenRC(OpenRCT2::Tra
case TrackElemType::RightBankToUp25:
return WoodenRCTrackRightBankTo25DegUp<isClassic>;
case TrackElemType::Up25ToLeftBank:
return WoodenRCTrack25DegUpToLeftBank<isClassic>;
return WoodenRCTrack25DegUpToBank<isClassic, kUp25ToLeftBankImages>;
case TrackElemType::Up25ToRightBank:
return WoodenRCTrack25DegUpToRightBank<isClassic>;
return WoodenRCTrack25DegUpToBank<isClassic, kUp25ToRightBankImages>;
case TrackElemType::LeftBankToDown25:
return WoodenRCTrackLeftBankTo25DegDown<isClassic>;
case TrackElemType::RightBankToDown25:
@ -17696,7 +17563,7 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionWoodenAndClassicWoodenRC(OpenRCT2::Tra
case TrackElemType::Down25ToRightBank:
return WoodenRCTrack25DegDownToRightBank<isClassic>;
case TrackElemType::LeftBank:
return WoodenRCTrackLeftBank<isClassic>;
return WoodenRCTrackFlatToBank<isClassic, kLeftBankImages>;
case TrackElemType::RightBank:
return WoodenRCTrackRightBank<isClassic>;
case TrackElemType::LeftQuarterTurn5TilesUp25:

View file

@ -20,6 +20,16 @@
#include <cstdint>
static constexpr TunnelGroup kTunnelGroup = TunnelGroup::Square;
struct StraightWoodenTrack
{
ImageIndex track;
ImageIndex handrail;
ImageIndex frontTrack = ImageIndexUndefined;
ImageIndex frontHandrail = ImageIndexUndefined;
};
struct SpriteBoundBox2
{
ImageIndex ImageIdA;
@ -82,4 +92,54 @@ void WoodenRCTrackPaintBb(PaintSession& session, const SpriteBoundBox2* bb, int1
}
}
template<bool isClassic, std::array<StraightWoodenTrack, kNumOrthogonalDirections> imageIds>
static void WoodenRCTrackStraightBankTrack(PaintSession& session, uint8_t direction, int32_t height)
{
WoodenRCTrackPaint<isClassic>(
session, direction, imageIds[direction].track, imageIds[direction].handrail, { 0, 0, height },
{ { 0, 3, height }, { 32, 25, 2 } });
if (imageIds[direction].frontTrack != ImageIndexUndefined)
{
WoodenRCTrackPaint<isClassic>(
session, direction, imageIds[direction].frontTrack, imageIds[direction].frontHandrail, { 0, 0, height },
{ { 0, 26, height + 5 }, { 32, 1, 9 } });
}
}
/** rct2: 0x008AC658, 0x008AC668, 0x008AC738 */
template<bool isClassic, std::array<StraightWoodenTrack, kNumOrthogonalDirections> imageIds>
void WoodenRCTrackFlatToBank(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement, SupportType supportType)
{
WoodenRCTrackStraightBankTrack<isClassic, imageIds>(session, direction, height);
WoodenASupportsPaintSetupRotated(
session, supportType.wooden, WoodenSupportSubType::NeSw, direction, height, session.SupportColours);
PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat);
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight);
}
/** rct2: 0x008AC6D8, 0x008AC6E8 */
template<bool isClassic, std::array<StraightWoodenTrack, kNumOrthogonalDirections> imageIds>
static void WoodenRCTrack25DegUpToBank(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement, SupportType supportType)
{
WoodenRCTrackStraightBankTrack<isClassic, imageIds>(session, direction, height);
WoodenASupportsPaintSetupRotated(
session, supportType.wooden, WoodenSupportSubType::NeSw, direction, height, session.SupportColours,
WoodenSupportTransitionType::Up25DegToFlat);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::Flat);
}
else
{
PaintUtilPushTunnelRotated(session, direction, height + 8, kTunnelGroup, TunnelSubType::FlatTo25Deg);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 40);
}
TRACK_PAINT_FUNCTION GetTrackPaintFunctionClassicWoodenRCFallback(OpenRCT2::TrackElemType trackType);

View file

@ -171,91 +171,91 @@ namespace OpenRCT2::RCT1
static uint8_t map[] =
{
RIDE_TYPE_CLASSIC_WOODEN_ROLLER_COASTER,// RCT1_RIDE_TYPE_WOODEN_ROLLER_COASTER
RIDE_TYPE_CLASSIC_STAND_UP_ROLLER_COASTER, // RCT1_RIDE_TYPE_STAND_UP_STEEL_ROLLER_COASTER
RIDE_TYPE_SUSPENDED_SWINGING_COASTER, // RCT1_RIDE_TYPE_SUSPENDED_ROLLER_COASTER
RIDE_TYPE_INVERTED_ROLLER_COASTER, // RCT1_RIDE_TYPE_INVERTED_ROLLER_COASTER
RIDE_TYPE_CLASSIC_MINI_ROLLER_COASTER, // RCT1_RIDE_TYPE_STEEL_MINI_ROLLER_COASTER
RIDE_TYPE_MINIATURE_RAILWAY, // RCT1_RIDE_TYPE_MINIATURE_RAILWAY
RIDE_TYPE_MONORAIL, // RCT1_RIDE_TYPE_MONORAIL
RIDE_TYPE_MINI_SUSPENDED_COASTER, // RCT1_RIDE_TYPE_SUSPENDED_SINGLE_RAIL_ROLLER_COASTER
RIDE_TYPE_BOAT_HIRE, // RCT1_RIDE_TYPE_BOAT_HIRE
RIDE_TYPE_WOODEN_WILD_MOUSE, // RCT1_RIDE_TYPE_WOODEN_CRAZY_RODENT_ROLLER_COASTER
RIDE_TYPE_STEEPLECHASE, // RCT1_RIDE_TYPE_SINGLE_RAIL_ROLLER_COASTER
RIDE_TYPE_CAR_RIDE, // RCT1_RIDE_TYPE_CAR_RIDE
RIDE_TYPE_LAUNCHED_FREEFALL, // RCT1_RIDE_TYPE_LAUNCHED_FREEFALL
RIDE_TYPE_BOBSLEIGH_COASTER, // RCT1_RIDE_TYPE_BOBSLED_ROLLER_COASTER
RIDE_TYPE_OBSERVATION_TOWER, // RCT1_RIDE_TYPE_OBSERVATION_TOWER
RIDE_TYPE_LOOPING_ROLLER_COASTER, // RCT1_RIDE_TYPE_STEEL_ROLLER_COASTER
RIDE_TYPE_DINGHY_SLIDE, // RCT1_RIDE_TYPE_WATER_SLIDE
RIDE_TYPE_MINE_TRAIN_COASTER, // RCT1_RIDE_TYPE_MINE_TRAIN_ROLLER_COASTER
RIDE_TYPE_CHAIRLIFT, // RCT1_RIDE_TYPE_CHAIRLIFT
RIDE_TYPE_CORKSCREW_ROLLER_COASTER, // RCT1_RIDE_TYPE_STEEL_CORKSCREW_ROLLER_COASTER
RIDE_TYPE_MAZE, // RCT1_RIDE_TYPE_HEDGE_MAZE
RIDE_TYPE_SPIRAL_SLIDE, // RCT1_RIDE_TYPE_SPIRAL_SLIDE
RIDE_TYPE_GO_KARTS, // RCT1_RIDE_TYPE_GO_KARTS
RIDE_TYPE_LOG_FLUME, // RCT1_RIDE_TYPE_LOG_FLUME
RIDE_TYPE_RIVER_RAPIDS, // RCT1_RIDE_TYPE_RIVER_RAPIDS
RIDE_TYPE_DODGEMS, // RCT1_RIDE_TYPE_DODGEMS
RIDE_TYPE_SWINGING_SHIP, // RCT1_RIDE_TYPE_SWINGING_SHIP
RIDE_TYPE_SWINGING_INVERTER_SHIP, // RCT1_RIDE_TYPE_SWINGING_INVERTER_SHIP
RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_ICE_CREAM_STALL
RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_CHIPS_STALL
RIDE_TYPE_DRINK_STALL, // RCT1_RIDE_TYPE_DRINK_STALL
RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_CANDYFLOSS_STALL
RIDE_TYPE_SHOP, // RCT1_RIDE_TYPE_BURGER_BAR
RIDE_TYPE_MERRY_GO_ROUND, // RCT1_RIDE_TYPE_MERRY_GO_ROUND
RIDE_TYPE_SHOP, // RCT1_RIDE_TYPE_BALLOON_STALL
RIDE_TYPE_INFORMATION_KIOSK, // RCT1_RIDE_TYPE_INFORMATION_KIOSK
RIDE_TYPE_TOILETS, // RCT1_RIDE_TYPE_TOILETS
RIDE_TYPE_FERRIS_WHEEL, // RCT1_RIDE_TYPE_FERRIS_WHEEL
RIDE_TYPE_MOTION_SIMULATOR, // RCT1_RIDE_TYPE_MOTION_SIMULATOR
RIDE_TYPE_3D_CINEMA, // RCT1_RIDE_TYPE_3D_CINEMA
RIDE_TYPE_TOP_SPIN, // RCT1_RIDE_TYPE_TOP_SPIN
RIDE_TYPE_SPACE_RINGS, // RCT1_RIDE_TYPE_SPACE_RINGS
RIDE_TYPE_REVERSE_FREEFALL_COASTER, // RCT1_RIDE_TYPE_REVERSE_FREEFALL_ROLLER_COASTER
RIDE_TYPE_SHOP, // RCT1_RIDE_TYPE_SOUVENIR_STALL
RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER, // RCT1_RIDE_TYPE_VERTICAL_ROLLER_COASTER
RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_PIZZA_STALL
RIDE_TYPE_TWIST, // RCT1_RIDE_TYPE_TWIST
RIDE_TYPE_HAUNTED_HOUSE, // RCT1_RIDE_TYPE_HAUNTED_HOUSE
RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_POPCORN_STALL
RIDE_TYPE_CIRCUS, // RCT1_RIDE_TYPE_CIRCUS
RIDE_TYPE_GHOST_TRAIN, // RCT1_RIDE_TYPE_GHOST_TRAIN
RIDE_TYPE_TWISTER_ROLLER_COASTER, // RCT1_RIDE_TYPE_STEEL_TWISTER_ROLLER_COASTER
RIDE_TYPE_WOODEN_ROLLER_COASTER, // RCT1_RIDE_TYPE_WOODEN_TWISTER_ROLLER_COASTER
RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER, // RCT1_RIDE_TYPE_WOODEN_SIDE_FRICTION_ROLLER_COASTER
RIDE_TYPE_STEEL_WILD_MOUSE, // RCT1_RIDE_TYPE_STEEL_WILD_MOUSE_ROLLER_COASTER
RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_HOT_DOG_STALL
RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_EXOTIC_SEA_FOOD_STALL
RIDE_TYPE_SHOP, // RCT1_RIDE_TYPE_HAT_STALL
RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_TOFFEE_APPLE_STALL
RIDE_TYPE_VIRGINIA_REEL, // RCT1_RIDE_TYPE_VIRGINIA_REEL
RIDE_TYPE_SPLASH_BOATS, // RCT1_RIDE_TYPE_RIVER_RIDE
RIDE_TYPE_MINI_HELICOPTERS, // RCT1_RIDE_TYPE_CYCLE_MONORAIL
RIDE_TYPE_LAY_DOWN_ROLLER_COASTER, // RCT1_RIDE_TYPE_FLYING_ROLLER_COASTER
RIDE_TYPE_SUSPENDED_MONORAIL, // RCT1_RIDE_TYPE_SUSPENDED_MONORAIL
RIDE_TYPE_NULL, // RCT1_RIDE_TYPE_40
RIDE_TYPE_REVERSER_ROLLER_COASTER, // RCT1_RIDE_TYPE_WOODEN_REVERSER_ROLLER_COASTER
RIDE_TYPE_HEARTLINE_TWISTER_COASTER, // RCT1_RIDE_TYPE_HEARTLINE_TWISTER_ROLLER_COASTER
RIDE_TYPE_MINI_GOLF, // RCT1_RIDE_TYPE_MINIATURE_GOLF
RIDE_TYPE_NULL, // RCT1_RIDE_TYPE_44
RIDE_TYPE_ROTO_DROP, // RCT1_RIDE_TYPE_ROTO_DROP
RIDE_TYPE_FLYING_SAUCERS, // RCT1_RIDE_TYPE_FLYING_SAUCERS
RIDE_TYPE_CROOKED_HOUSE, // RCT1_RIDE_TYPE_CROOKED_HOUSE
RIDE_TYPE_MONORAIL_CYCLES, // RCT1_RIDE_TYPE_CYCLE_RAILWAY
RIDE_TYPE_COMPACT_INVERTED_COASTER, // RCT1_RIDE_TYPE_SUSPENDED_LOOPING_ROLLER_COASTER
RIDE_TYPE_WATER_COASTER, // RCT1_RIDE_TYPE_WATER_COASTER
RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER, // RCT1_RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER
RIDE_TYPE_INVERTED_HAIRPIN_COASTER, // RCT1_RIDE_TYPE_INVERTED_WILD_MOUSE_COASTER
RIDE_TYPE_BOAT_HIRE, // RCT1_RIDE_TYPE_JET_SKIS
RIDE_TYPE_SHOP, // RCT1_RIDE_TYPE_T_SHIRT_STALL
RIDE_TYPE_RIVER_RAFTS, // RCT1_RIDE_TYPE_RAFT_RIDE
RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_DOUGHNUT_SHOP
RIDE_TYPE_ENTERPRISE, // RCT1_RIDE_TYPE_ENTERPRISE
RIDE_TYPE_DRINK_STALL, // RCT1_RIDE_TYPE_COFFEE_SHOP
RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_FRIED_CHICKEN_STALL
RIDE_TYPE_DRINK_STALL, // RCT1_RIDE_TYPE_LEMONADE_STALL
RIDE_TYPE_CLASSIC_WOODEN_ROLLER_COASTER, // RCT1_RIDE_TYPE_WOODEN_ROLLER_COASTER
RIDE_TYPE_CLASSIC_STAND_UP_ROLLER_COASTER, // RCT1_RIDE_TYPE_STAND_UP_STEEL_ROLLER_COASTER
RIDE_TYPE_SUSPENDED_SWINGING_COASTER, // RCT1_RIDE_TYPE_SUSPENDED_ROLLER_COASTER
RIDE_TYPE_INVERTED_ROLLER_COASTER, // RCT1_RIDE_TYPE_INVERTED_ROLLER_COASTER
RIDE_TYPE_CLASSIC_MINI_ROLLER_COASTER, // RCT1_RIDE_TYPE_STEEL_MINI_ROLLER_COASTER
RIDE_TYPE_MINIATURE_RAILWAY, // RCT1_RIDE_TYPE_MINIATURE_RAILWAY
RIDE_TYPE_MONORAIL, // RCT1_RIDE_TYPE_MONORAIL
RIDE_TYPE_MINI_SUSPENDED_COASTER, // RCT1_RIDE_TYPE_SUSPENDED_SINGLE_RAIL_ROLLER_COASTER
RIDE_TYPE_BOAT_HIRE, // RCT1_RIDE_TYPE_BOAT_HIRE
RIDE_TYPE_WOODEN_WILD_MOUSE, // RCT1_RIDE_TYPE_WOODEN_CRAZY_RODENT_ROLLER_COASTER
RIDE_TYPE_STEEPLECHASE, // RCT1_RIDE_TYPE_SINGLE_RAIL_ROLLER_COASTER
RIDE_TYPE_CAR_RIDE, // RCT1_RIDE_TYPE_CAR_RIDE
RIDE_TYPE_LAUNCHED_FREEFALL, // RCT1_RIDE_TYPE_LAUNCHED_FREEFALL
RIDE_TYPE_BOBSLEIGH_COASTER, // RCT1_RIDE_TYPE_BOBSLED_ROLLER_COASTER
RIDE_TYPE_OBSERVATION_TOWER, // RCT1_RIDE_TYPE_OBSERVATION_TOWER
RIDE_TYPE_LOOPING_ROLLER_COASTER, // RCT1_RIDE_TYPE_STEEL_ROLLER_COASTER
RIDE_TYPE_DINGHY_SLIDE, // RCT1_RIDE_TYPE_WATER_SLIDE
RIDE_TYPE_MINE_TRAIN_COASTER, // RCT1_RIDE_TYPE_MINE_TRAIN_ROLLER_COASTER
RIDE_TYPE_CHAIRLIFT, // RCT1_RIDE_TYPE_CHAIRLIFT
RIDE_TYPE_CORKSCREW_ROLLER_COASTER, // RCT1_RIDE_TYPE_STEEL_CORKSCREW_ROLLER_COASTER
RIDE_TYPE_MAZE, // RCT1_RIDE_TYPE_HEDGE_MAZE
RIDE_TYPE_SPIRAL_SLIDE, // RCT1_RIDE_TYPE_SPIRAL_SLIDE
RIDE_TYPE_GO_KARTS, // RCT1_RIDE_TYPE_GO_KARTS
RIDE_TYPE_LOG_FLUME, // RCT1_RIDE_TYPE_LOG_FLUME
RIDE_TYPE_RIVER_RAPIDS, // RCT1_RIDE_TYPE_RIVER_RAPIDS
RIDE_TYPE_DODGEMS, // RCT1_RIDE_TYPE_DODGEMS
RIDE_TYPE_SWINGING_SHIP, // RCT1_RIDE_TYPE_SWINGING_SHIP
RIDE_TYPE_SWINGING_INVERTER_SHIP, // RCT1_RIDE_TYPE_SWINGING_INVERTER_SHIP
RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_ICE_CREAM_STALL
RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_CHIPS_STALL
RIDE_TYPE_DRINK_STALL, // RCT1_RIDE_TYPE_DRINK_STALL
RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_CANDYFLOSS_STALL
RIDE_TYPE_SHOP, // RCT1_RIDE_TYPE_BURGER_BAR
RIDE_TYPE_MERRY_GO_ROUND, // RCT1_RIDE_TYPE_MERRY_GO_ROUND
RIDE_TYPE_SHOP, // RCT1_RIDE_TYPE_BALLOON_STALL
RIDE_TYPE_INFORMATION_KIOSK, // RCT1_RIDE_TYPE_INFORMATION_KIOSK
RIDE_TYPE_TOILETS, // RCT1_RIDE_TYPE_TOILETS
RIDE_TYPE_FERRIS_WHEEL, // RCT1_RIDE_TYPE_FERRIS_WHEEL
RIDE_TYPE_MOTION_SIMULATOR, // RCT1_RIDE_TYPE_MOTION_SIMULATOR
RIDE_TYPE_3D_CINEMA, // RCT1_RIDE_TYPE_3D_CINEMA
RIDE_TYPE_TOP_SPIN, // RCT1_RIDE_TYPE_TOP_SPIN
RIDE_TYPE_SPACE_RINGS, // RCT1_RIDE_TYPE_SPACE_RINGS
RIDE_TYPE_REVERSE_FREEFALL_COASTER, // RCT1_RIDE_TYPE_REVERSE_FREEFALL_ROLLER_COASTER
RIDE_TYPE_SHOP, // RCT1_RIDE_TYPE_SOUVENIR_STALL
RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER, // RCT1_RIDE_TYPE_VERTICAL_ROLLER_COASTER
RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_PIZZA_STALL
RIDE_TYPE_TWIST, // RCT1_RIDE_TYPE_TWIST
RIDE_TYPE_HAUNTED_HOUSE, // RCT1_RIDE_TYPE_HAUNTED_HOUSE
RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_POPCORN_STALL
RIDE_TYPE_CIRCUS, // RCT1_RIDE_TYPE_CIRCUS
RIDE_TYPE_GHOST_TRAIN, // RCT1_RIDE_TYPE_GHOST_TRAIN
RIDE_TYPE_TWISTER_ROLLER_COASTER, // RCT1_RIDE_TYPE_STEEL_TWISTER_ROLLER_COASTER
RIDE_TYPE_CLASSIC_WOODEN_TWISTER_ROLLER_COASTER, // RCT1_RIDE_TYPE_WOODEN_TWISTER_ROLLER_COASTER
RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER, // RCT1_RIDE_TYPE_WOODEN_SIDE_FRICTION_ROLLER_COASTER
RIDE_TYPE_STEEL_WILD_MOUSE, // RCT1_RIDE_TYPE_STEEL_WILD_MOUSE_ROLLER_COASTER
RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_HOT_DOG_STALL
RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_EXOTIC_SEA_FOOD_STALL
RIDE_TYPE_SHOP, // RCT1_RIDE_TYPE_HAT_STALL
RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_TOFFEE_APPLE_STALL
RIDE_TYPE_VIRGINIA_REEL, // RCT1_RIDE_TYPE_VIRGINIA_REEL
RIDE_TYPE_SPLASH_BOATS, // RCT1_RIDE_TYPE_RIVER_RIDE
RIDE_TYPE_MINI_HELICOPTERS, // RCT1_RIDE_TYPE_CYCLE_MONORAIL
RIDE_TYPE_LAY_DOWN_ROLLER_COASTER, // RCT1_RIDE_TYPE_FLYING_ROLLER_COASTER
RIDE_TYPE_SUSPENDED_MONORAIL, // RCT1_RIDE_TYPE_SUSPENDED_MONORAIL
RIDE_TYPE_NULL, // RCT1_RIDE_TYPE_40
RIDE_TYPE_REVERSER_ROLLER_COASTER, // RCT1_RIDE_TYPE_WOODEN_REVERSER_ROLLER_COASTER
RIDE_TYPE_HEARTLINE_TWISTER_COASTER, // RCT1_RIDE_TYPE_HEARTLINE_TWISTER_ROLLER_COASTER
RIDE_TYPE_MINI_GOLF, // RCT1_RIDE_TYPE_MINIATURE_GOLF
RIDE_TYPE_NULL, // RCT1_RIDE_TYPE_44
RIDE_TYPE_ROTO_DROP, // RCT1_RIDE_TYPE_ROTO_DROP
RIDE_TYPE_FLYING_SAUCERS, // RCT1_RIDE_TYPE_FLYING_SAUCERS
RIDE_TYPE_CROOKED_HOUSE, // RCT1_RIDE_TYPE_CROOKED_HOUSE
RIDE_TYPE_MONORAIL_CYCLES, // RCT1_RIDE_TYPE_CYCLE_RAILWAY
RIDE_TYPE_COMPACT_INVERTED_COASTER, // RCT1_RIDE_TYPE_SUSPENDED_LOOPING_ROLLER_COASTER
RIDE_TYPE_WATER_COASTER, // RCT1_RIDE_TYPE_WATER_COASTER
RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER, // RCT1_RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER
RIDE_TYPE_INVERTED_HAIRPIN_COASTER, // RCT1_RIDE_TYPE_INVERTED_WILD_MOUSE_COASTER
RIDE_TYPE_BOAT_HIRE, // RCT1_RIDE_TYPE_JET_SKIS
RIDE_TYPE_SHOP, // RCT1_RIDE_TYPE_T_SHIRT_STALL
RIDE_TYPE_RIVER_RAFTS, // RCT1_RIDE_TYPE_RAFT_RIDE
RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_DOUGHNUT_SHOP
RIDE_TYPE_ENTERPRISE, // RCT1_RIDE_TYPE_ENTERPRISE
RIDE_TYPE_DRINK_STALL, // RCT1_RIDE_TYPE_COFFEE_SHOP
RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_FRIED_CHICKEN_STALL
RIDE_TYPE_DRINK_STALL, // RCT1_RIDE_TYPE_LEMONADE_STALL
};
const auto index = EnumValue(rideType);
@ -755,7 +755,7 @@ namespace OpenRCT2::RCT1
"rct2.ride.circus1", // RCT1_RIDE_TYPE_CIRCUS
"rct1aa.ride.ghost_train_cars", // RCT1_RIDE_TYPE_GHOST_TRAIN
"rct1aa.ride.twister_trains", // RCT1_RIDE_TYPE_STEEL_TWISTER_ROLLER_COASTER
"rct2.ride.mft", // RCT1_RIDE_TYPE_WOODEN_TWISTER_ROLLER_COASTER
"rct1aa.ride.woodtrc", // RCT1_RIDE_TYPE_WOODEN_TWISTER_ROLLER_COASTER
"rct1aa.ride.side_friction_cars", // RCT1_RIDE_TYPE_WOODEN_SIDE_FRICTION_ROLLER_COASTER
"rct1aa.ride.steel_wild_mouse_cars", // RCT1_RIDE_TYPE_STEEL_WILD_MOUSE_ROLLER_COASTER
"rct2.ride.hotds", // RCT1_RIDE_TYPE_HOT_DOG_STALL
@ -856,7 +856,7 @@ namespace OpenRCT2::RCT1
"rct2.ride.circus1", // VehicleType::CircusTent
"rct1aa.ride.ghost_train_cars", // VehicleType::GhostTrainCars
"rct1aa.ride.twister_trains", // VehicleType::SteelTwisterRollerCoasterTrain
"rct2.ride.mft", // VehicleType::WoodenTwisterRollerCoasterTrain
"rct1aa.ride.woodtrc", // VehicleType::WoodenTwisterRollerCoasterTrain
"rct1aa.ride.side_friction_cars", // VehicleType::WoodenSideFrictionCars
"rct1aa.ride.vintage_cars", // VehicleType::VintageCars
"rct1aa.ride.steam_trains_covered", // VehicleType::SteamTrainCoveredCars

View file

@ -620,6 +620,7 @@ enum
RIDE_TYPE_CLASSIC_WOODEN_ROLLER_COASTER,
RIDE_TYPE_CLASSIC_STAND_UP_ROLLER_COASTER,
RIDE_TYPE_LSM_LAUNCHED_ROLLER_COASTER,
RIDE_TYPE_CLASSIC_WOODEN_TWISTER_ROLLER_COASTER,
RIDE_TYPE_COUNT
};

View file

@ -36,6 +36,7 @@
#include "rtd/coaster/ClassicMiniRollerCoaster.h"
#include "rtd/coaster/ClassicStandUpRollerCoaster.h"
#include "rtd/coaster/ClassicWoodenRollerCoaster.h"
#include "rtd/coaster/ClassicWoodenTwisterRollerCoaster.h"
#include "rtd/coaster/CompactInvertedCoaster.h"
#include "rtd/coaster/CorkscrewRollerCoaster.h"
#include "rtd/coaster/FlyingRollerCoaster.h"
@ -354,6 +355,7 @@ constexpr RideTypeDescriptor RideTypeDescriptors[RIDE_TYPE_COUNT] = {
/* RIDE_TYPE_CLASSIC_WOODEN_ROLLER_COASTER */ ClassicWoodenRollerCoasterRTD,
/* RIDE_TYPE_CLASSIC_STAND_UP_ROLLER_COASTER */ ClassicStandUpRollerCoasterRTD,
/* RIDE_TYPE_LSM_LAUNCHED_ROLLER_COASTER */ LSMLaunchedRollerCoasterRTD,
/* RIDE_TYPE_CLASSIC_WOODEN_TWISTER_ROLLER_COASTER */ ClassicWoodenTwisterRollerCoasterRTD,
};
bool RideTypeDescriptor::HasFlag(RtdFlag flag) const

View file

@ -23,6 +23,7 @@ enum : StringId
STR_RIDE_NAME_CLASSIC_MINI_ROLLER_COASTER = 6111,
STR_RIDE_NAME_CLASSIC_STAND_UP_ROLLER_COASTER = 97,
STR_RIDE_NAME_CLASSIC_WOODEN_ROLLER_COASTER = 96,
STR_RIDE_NAME_CLASSIC_WOODEN_TWISTER_ROLLER_COASTER = 99,
STR_RIDE_NAME_COMPACT_INVERTED_COASTER = 75,
STR_RIDE_NAME_CORKSCREW_ROLLER_COASTER = 21,
STR_RIDE_NAME_FLYING_ROLLER_COASTER = 59,
@ -66,6 +67,7 @@ enum : StringId
STR_RIDE_DESCRIPTION_CLASSIC_MINI_COASTER = 6119,
STR_RIDE_DESCRIPTION_CLASSIC_STAND_UP_ROLLER_COASTER = 607,
STR_RIDE_DESCRIPTION_CLASSIC_WOODEN_ROLLER_COASTER = 606,
STR_RIDE_DESCRIPTION_CLASSIC_WOODEN_TWISTER_ROLLER_COASTER = 609,
STR_RIDE_DESCRIPTION_COMPACT_INVERTED_COASTER = 585,
STR_RIDE_DESCRIPTION_CORKSCREW_ROLLER_COASTER = 531,
STR_RIDE_DESCRIPTION_FLYING_ROLLER_COASTER = 569,

View file

@ -639,3 +639,4 @@ namespace OpenRCT2::AlpineRC
}
TRACK_PAINT_FUNCTION GetTrackPaintFunctionClassicWoodenRC(OpenRCT2::TrackElemType trackType);
TRACK_PAINT_FUNCTION GetTrackPaintFunctionClassicStandUpRC(OpenRCT2::TrackElemType trackType);
TRACK_PAINT_FUNCTION GetTrackPaintFunctionClassicWoodenTwisterRC(OpenRCT2::TrackElemType trackType);

View file

@ -23,7 +23,7 @@ constexpr RideTypeDescriptor ClassicWoodenRollerCoasterRTD =
.Drawer = GetTrackPaintFunctionClassicWoodenRC,
.supportType = WoodenSupportType::Truss,
.enabledTrackGroups = {TrackGroup::flat, TrackGroup::straight, TrackGroup::stationEnd, TrackGroup::liftHill, TrackGroup::flatRollBanking, TrackGroup::verticalLoop, TrackGroup::slope, TrackGroup::slopeSteepUp, TrackGroup::slopeSteepDown, TrackGroup::slopeCurve, TrackGroup::sBend, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::brakes, TrackGroup::onridePhoto, TrackGroup::waterSplash, TrackGroup::blockBrakes, TrackGroup::diagBrakes, TrackGroup::diagBlockBrakes, TrackGroup::slopeSteepLong, TrackGroup::halfLoopMedium, TrackGroup::halfLoopLarge},
.extraTrackGroups = {TrackGroup::booster},
.extraTrackGroups = {TrackGroup::booster, TrackGroup::slopeCurveSteep},
}),
.InvertedTrackPaintFunctions = {},
.Flags = kRtdFlagsHasThreeColours | kRtdFlagsCommonCoaster | kRtdFlagsCommonCoasterNonAlt |

View file

@ -0,0 +1,91 @@
/*****************************************************************************
* Copyright (c) 2014-2024 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 "../../../sprites.h"
#include "../../RideData.h"
#include "../../ShopItem.h"
#include "../../Track.h"
// clang-format off
constexpr RideTypeDescriptor ClassicWoodenTwisterRollerCoasterRTD =
{
.Category = RIDE_CATEGORY_ROLLERCOASTER,
.StartTrackPiece = OpenRCT2::TrackElemType::EndStation,
.TrackPaintFunctions = TrackDrawerDescriptor({
.Drawer = GetTrackPaintFunctionClassicWoodenTwisterRC,
.supportType = WoodenSupportType::Truss,
.enabledTrackGroups = { TrackGroup::flat, TrackGroup::straight, TrackGroup::stationEnd, TrackGroup::liftHill, TrackGroup::flatRollBanking, TrackGroup::slope, TrackGroup::slopeSteepUp, TrackGroup::slopeSteepDown, TrackGroup::slopeCurve, TrackGroup::sBend, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::brakes, TrackGroup::onridePhoto, TrackGroup::blockBrakes, TrackGroup::diagBrakes, TrackGroup::diagBlockBrakes, TrackGroup::slopeSteepLong, TrackGroup::helixDownBankedHalf, TrackGroup::helixUpBankedHalf, TrackGroup::slopeCurveSteep },
.extraTrackGroups = { TrackGroup::verticalLoop, TrackGroup::waterSplash },
}),
.InvertedTrackPaintFunctions = {},
.Flags = kRtdFlagsHasThreeColours | kRtdFlagsCommonCoaster | kRtdFlagsCommonCoasterNonAlt |
EnumsToFlags(RtdFlag::hasLeaveWhenAnotherVehicleArrivesAtStation, RtdFlag::checkGForces,
RtdFlag::allowMultipleCircuits, RtdFlag::allowReversedTrains),
.RideModes = EnumsToFlags(RideMode::ContinuousCircuit, RideMode::ContinuousCircuitBlockSectioned),
.DefaultMode = RideMode::ContinuousCircuit,
.BoosterSettings = { 0, 68 },
.LegacyBoosterSettings = { 0, 68 },
.Naming = { STR_RIDE_NAME_CLASSIC_WOODEN_TWISTER_ROLLER_COASTER, STR_RIDE_DESCRIPTION_CLASSIC_WOODEN_TWISTER_ROLLER_COASTER },
.NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station },
.EnumName = "RIDE_TYPE_CLASSIC_WOODEN_TWISTER_ROLLER_COASTER",
.AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE),
.Heights = { 24, 24, 8, 11, },
.MaxMass = 19,
.LiftData = { OpenRCT2::Audio::SoundId::LiftWood, 3, 5 },
.RatingsMultipliers = { 52, 33, 4 },
.UpkeepCosts = { 40, 20, 80, 10, 3, 10 },
.BuildCosts = {37.50_GBP, 3.50_GBP, 50, },
.DefaultPrices = { 20, 20 },
.DefaultMusic = MUSIC_OBJECT_WILD_WEST,
.PhotoItem = ShopItem::Photo3,
.BonusValue = 105,
.ColourPresets = TRACK_COLOUR_PRESETS(
{ COLOUR_BORDEAUX_RED, COLOUR_BLACK, COLOUR_WHITE },
{ COLOUR_BRIGHT_RED, COLOUR_BLACK, COLOUR_GREY },
{ COLOUR_YELLOW, COLOUR_DARK_BROWN, COLOUR_DARK_BROWN },
{ COLOUR_TEAL, COLOUR_BORDEAUX_RED, COLOUR_WHITE },
{ COLOUR_LIGHT_BLUE, COLOUR_BLACK, COLOUR_BLACK },
{ COLOUR_LIGHT_BLUE, COLOUR_BLACK, COLOUR_DARK_BROWN },
),
.ColourPreview = { SPR_RIDE_DESIGN_PREVIEW_CLASSIC_WOODEN_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_CLASSIC_WOODEN_ROLLER_COASTER_SUPPORTS },
.ColourKey = RideColourKey::Ride,
.Name = "classic_wooden_twister_rc",
.RatingsData =
{
RatingsCalculationType::Normal,
{ RIDE_RATING(2, 80), RIDE_RATING(2, 60), RIDE_RATING(2, 00) },
19,
-1,
false,
{
{ RatingsModifierType::BonusLength, 6000, 873, 0, 0 },
{ RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 },
{ RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 },
{ RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 },
{ RatingsModifierType::BonusAverageSpeed, 0, 364088, 655360, 0 },
{ RatingsModifierType::BonusDuration, 150, 26214, 0, 0 },
{ RatingsModifierType::BonusGForces, 0, 40960, 34555, 49648 },
{ RatingsModifierType::BonusTurns, 0, 26749, 43458, 45749 },
{ RatingsModifierType::BonusDrops, 0, 40777, 46811, 49152 },
{ RatingsModifierType::BonusSheltered, 0, 16705, 30583, 35108 },
{ RatingsModifierType::BonusReversedTrains, 0, 2, 12, 22 },
{ RatingsModifierType::BonusProximity, 0, 22367, 0, 0 },
{ RatingsModifierType::BonusScenery, 0, 11155, 0, 0 },
{ RatingsModifierType::RequirementDropHeight, 12, 2, 1, 2 },
{ RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 1, 2 },
{ RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 10), 2, 1, 2 },
{ RatingsModifierType::RequirementLength, 0x1720000, 2, 1, 2 },
{ RatingsModifierType::RequirementNumDrops, 2, 2, 1, 2 },
{ RatingsModifierType::PenaltyLateralGs, 0, 40960, 34555, 49648 },
},
},
};
// clang-format on