OpenRCT2/src/openrct2/ride/coaster/MultiDimensionRollerCoaster...

15609 lines
710 KiB
C++

/*****************************************************************************
* 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 "../../drawing/Drawing.h"
#include "../../interface/Viewport.h"
#include "../../paint/Paint.h"
#include "../../paint/support/MetalSupports.h"
#include "../../paint/tile_element/Paint.TileElement.h"
#include "../../sprites.h"
#include "../../world/Map.h"
#include "../RideData.h"
#include "../TrackData.h"
#include "../TrackPaint.h"
static constexpr uint32_t MULTI_DIM_STATION_BLOCK_BRAKE_SW_NE_OPEN = 15812;
static constexpr uint32_t MULTI_DIM_STATION_BLOCK_BRAKE_NW_SE_OPEN = 15813;
static constexpr uint32_t MULTI_DIM_STATION_BLOCK_BRAKE_SW_NE_CLOSED = 15814;
static constexpr uint32_t MULTI_DIM_STATION_BLOCK_BRAKE_NW_SE_CLOSED = 15815;
static constexpr uint32_t MULTI_DIM_NON_INVERTED_BLOCK_BRAKE_SW_NE_OPEN = 16220;
static constexpr uint32_t MULTI_DIM_NON_INVERTED_BLOCK_BRAKE_NW_SE_OPEN = 16221;
static constexpr uint32_t MULTI_DIM_NON_INVERTED_BLOCK_BRAKE_SW_NE_CLOSED = 16222;
static constexpr uint32_t MULTI_DIM_NON_INVERTED_BLOCK_BRAKE_NW_SE_CLOSED = 16223;
static constexpr uint32_t MULTI_DIM_INVERTED_BLOCK_BRAKE_SW_NE_OPEN = 26551;
static constexpr uint32_t MULTI_DIM_INVERTED_BLOCK_BRAKE_NW_SE_OPEN = 26552;
static constexpr uint32_t MULTI_DIM_INVERTED_BLOCK_BRAKE_SW_NE_CLOSED = 26553;
static constexpr uint32_t MULTI_DIM_INVERTED_BLOCK_BRAKE_NW_SE_CLOSED = 26554;
static constexpr const uint32_t MultidimDiagBrakeImages[2][NumOrthogonalDirections] = {
{
SPR_G2_MULTIDIM_UPRIGHT_DIAG_BRAKES,
SPR_G2_MULTIDIM_UPRIGHT_DIAG_BRAKES + 1,
SPR_G2_MULTIDIM_UPRIGHT_DIAG_BRAKES,
SPR_G2_MULTIDIM_UPRIGHT_DIAG_BRAKES + 1,
},
{
SPR_G2_MULTIDIM_INVERTED_DIAG_BRAKES,
SPR_G2_MULTIDIM_INVERTED_DIAG_BRAKES + 1,
SPR_G2_MULTIDIM_INVERTED_DIAG_BRAKES,
SPR_G2_MULTIDIM_INVERTED_DIAG_BRAKES + 1,
},
};
static constexpr const uint32_t MultidimDiagBlockBrakeImages[2][2][NumOrthogonalDirections] = {
{
{
SPR_G2_MULTIDIM_UPRIGHT_DIAG_BRAKES + 3,
SPR_G2_MULTIDIM_UPRIGHT_DIAG_BRAKES + 5,
SPR_G2_MULTIDIM_UPRIGHT_DIAG_BRAKES + 3,
SPR_G2_MULTIDIM_UPRIGHT_DIAG_BRAKES + 5,
},
{
SPR_G2_MULTIDIM_UPRIGHT_DIAG_BRAKES + 2,
SPR_G2_MULTIDIM_UPRIGHT_DIAG_BRAKES + 4,
SPR_G2_MULTIDIM_UPRIGHT_DIAG_BRAKES + 2,
SPR_G2_MULTIDIM_UPRIGHT_DIAG_BRAKES + 4,
},
},
{
{
SPR_G2_MULTIDIM_INVERTED_DIAG_BRAKES + 2,
SPR_G2_MULTIDIM_INVERTED_DIAG_BRAKES + 4,
SPR_G2_MULTIDIM_INVERTED_DIAG_BRAKES + 2,
SPR_G2_MULTIDIM_INVERTED_DIAG_BRAKES + 4,
},
{
SPR_G2_MULTIDIM_INVERTED_DIAG_BRAKES + 2,
SPR_G2_MULTIDIM_INVERTED_DIAG_BRAKES + 3,
SPR_G2_MULTIDIM_INVERTED_DIAG_BRAKES + 2,
SPR_G2_MULTIDIM_INVERTED_DIAG_BRAKES + 3,
},
},
};
/** rct2: 0x00792D88 */
static void MultiDimensionRCTrackFlat(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
if (trackElement.HasChain())
{
switch (direction)
{
case 0:
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15808), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15809), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
}
}
else
{
switch (direction)
{
case 0:
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15806), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15807), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
}
}
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
}
else
{
switch (direction)
{
case 0:
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26227), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 1 } });
break;
case 1:
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26228), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 1 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topRightSide, PaintSegment::bottomLeftSide), direction),
0xFFFF, 0);
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36, session.SupportColours);
}
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
}
}
/** rct2: 0x00792F98, 0x00792FA8, 0x00792FB8 */
static void MultiDimensionRCTrackStation(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
static constexpr uint32_t imageIds[NumOrthogonalDirections][3] = {
{ 15810, MULTI_DIM_STATION_BLOCK_BRAKE_SW_NE_OPEN, MULTI_DIM_STATION_BLOCK_BRAKE_SW_NE_CLOSED },
{ 15811, MULTI_DIM_STATION_BLOCK_BRAKE_NW_SE_OPEN, MULTI_DIM_STATION_BLOCK_BRAKE_NW_SE_CLOSED },
{ 15810, MULTI_DIM_STATION_BLOCK_BRAKE_SW_NE_OPEN, MULTI_DIM_STATION_BLOCK_BRAKE_SW_NE_CLOSED },
{ 15811, MULTI_DIM_STATION_BLOCK_BRAKE_NW_SE_OPEN, MULTI_DIM_STATION_BLOCK_BRAKE_NW_SE_CLOSED },
};
if (trackElement.GetTrackType() == TrackElemType::EndStation)
{
bool isClosed = trackElement.IsBrakeClosed();
uint8_t offset = isClosed ? 2 : 1;
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(imageIds[direction][offset]), { 0, 0, height },
{ { 0, 3, height + 3 }, { 32, 26, 1 } });
}
else
{
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(imageIds[direction][0]), { 0, 0, height },
{ { 0, 3, height + 3 }, { 32, 26, 1 } });
}
DrawSupportsSideBySide(session, direction, height, session.SupportColours, MetalSupportType::TubesInverted);
auto stationColour = GetStationColourScheme(session, trackElement);
const auto* stationObj = ride.GetStationObject();
bool hasFence;
if (direction == 0 || direction == 2)
{
hasFence = TrackPaintUtilHasFence(EDGE_NW, session.MapPosition, trackElement, ride, session.CurrentRotation);
TrackPaintUtilDrawStationCovers(session, EDGE_NW, hasFence, stationObj, height, stationColour);
}
else
{
hasFence = TrackPaintUtilHasFence(EDGE_NE, session.MapPosition, trackElement, ride, session.CurrentRotation);
TrackPaintUtilDrawStationCovers(session, EDGE_NE, hasFence, stationObj, height, stationColour);
}
if (direction == 0 || direction == 2)
{
hasFence = TrackPaintUtilHasFence(EDGE_SE, session.MapPosition, trackElement, ride, session.CurrentRotation);
TrackPaintUtilDrawStationCovers(session, EDGE_SE, hasFence, stationObj, height, stationColour);
}
else
{
hasFence = TrackPaintUtilHasFence(EDGE_SW, session.MapPosition, trackElement, ride, session.CurrentRotation);
TrackPaintUtilDrawStationCovers(session, EDGE_SW, hasFence, stationObj, height, stationColour);
}
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
}
/** rct2: 0x00792D98 */
static void MultiDimensionRCTrack25DegUp(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
if (trackElement.HasChain())
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15908), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15909), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15910), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15911), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 8, height, session.SupportColours);
}
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15880), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15881), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15882), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15883), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 8, height, session.SupportColours);
}
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height - 8, TUNNEL_SQUARE_7);
}
else
{
PaintUtilPushTunnelRotated(session, direction, height + 8, TUNNEL_SQUARE_8);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26253), { 0, 0, height + 24 },
{ { 0, 6, height + 40 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26254), { 0, 0, height + 24 },
{ { 0, 6, height + 40 }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26255), { 0, 0, height + 24 },
{ { 0, 6, height + 40 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26256), { 0, 0, height + 24 },
{ { 0, 6, height + 40 }, { 32, 20, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topRightSide, PaintSegment::bottomLeftSide), direction),
0xFFFF, 0);
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopRightSide, 0, height + 54,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomRightSide, 0, height + 54,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomLeftSide, 0, height + 54,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopLeftSide, 0, height + 54,
session.SupportColours);
break;
}
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height - 8, TUNNEL_SQUARE_7);
}
else
{
PaintUtilPushTunnelRotated(session, direction, height + 8, TUNNEL_SQUARE_8);
}
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
}
}
/** rct2: 0x00792DA8 */
static void MultiDimensionRCTrack60DegUp(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15896), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15897), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 98 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15898), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 98 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15899), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 24, height, session.SupportColours);
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height - 8, TUNNEL_SQUARE_7);
}
else
{
PaintUtilPushTunnelRotated(session, direction, height + 56, TUNNEL_SQUARE_8);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 104, 0x20);
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26269), { 0, 0, height + 24 },
{ { 0, 6, height + 88 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26270), { 0, 0, height + 24 },
{ { 0, 4, height + 6 }, { 32, 2, 81 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26271), { 0, 0, height + 24 },
{ { 0, 4, height + 6 }, { 32, 2, 81 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26272), { 0, 0, height + 24 },
{ { 0, 6, height + 88 }, { 32, 20, 3 } });
break;
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height - 8, TUNNEL_SQUARE_7);
}
else
{
PaintUtilPushTunnelRotated(session, direction, height + 56, TUNNEL_SQUARE_8);
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topRightSide, PaintSegment::bottomLeftSide), direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 104, 0x20);
}
}
/** rct2: 0x00792DB8 */
static void MultiDimensionRCTrackFlatTo25DegUp(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
if (trackElement.HasChain())
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15900), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15901), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15902), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15903), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 3, height, session.SupportColours);
}
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15872), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15873), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15874), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15875), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 3, height, session.SupportColours);
}
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
else
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_8);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26245), { 0, 0, height + 24 },
{ { 0, 6, height + 32 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26246), { 0, 0, height + 24 },
{ { 0, 6, height + 32 }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26247), { 0, 0, height + 24 },
{ { 0, 6, height + 32 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26248), { 0, 0, height + 24 },
{ { 0, 6, height + 32 }, { 32, 20, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topRightSide, PaintSegment::bottomLeftSide), direction),
0xFFFF, 0);
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopRightSide, 0, height + 46,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomRightSide, 0, height + 46,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomLeftSide, 0, height + 46,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopLeftSide, 0, height + 46,
session.SupportColours);
break;
}
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
else
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_8);
}
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
}
}
/** rct2: 0x00792DC8 */
static void MultiDimensionRCTrack25DegUpTo60DegUp(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15884), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15885), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15888), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 66 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15886), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15889), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 66 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15887), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 8, height, session.SupportColours);
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height - 8, TUNNEL_SQUARE_7);
}
else
{
PaintUtilPushTunnelRotated(session, direction, height + 24, TUNNEL_SQUARE_8);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26257), { 0, 0, height + 24 },
{ { 0, 6, height + 56 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26261), { 0, 0, height + 24 },
{ { 0, 10, height + 6 }, { 32, 10, 49 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26258), { 0, 0, height + 24 },
{ { 0, 4, height + 6 }, { 32, 2, 49 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26262), { 0, 0, height + 24 },
{ { 0, 10, height + 6 }, { 32, 10, 49 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26259), { 0, 0, height + 24 },
{ { 0, 4, height + 6 }, { 32, 2, 49 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26260), { 0, 0, height + 24 },
{ { 0, 6, height + 56 }, { 32, 20, 3 } });
break;
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height - 8, TUNNEL_SQUARE_7);
}
else
{
PaintUtilPushTunnelRotated(session, direction, height + 24, TUNNEL_SQUARE_8);
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topRightSide, PaintSegment::bottomLeftSide), direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
}
}
/** rct2: 0x00792DD8 */
static void MultiDimensionRCTrack60DegUpTo25DegUp(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15890), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15891), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15894), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 66 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15892), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15895), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 66 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15893), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 16, height, session.SupportColours);
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height - 8, TUNNEL_SQUARE_7);
}
else
{
PaintUtilPushTunnelRotated(session, direction, height + 24, TUNNEL_SQUARE_8);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26263), { 0, 0, height + 24 },
{ { 0, 6, height + 56 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26267), { 0, 0, height + 24 },
{ { 0, 10, height + 6 }, { 32, 10, 49 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26264), { 0, 0, height + 24 },
{ { 0, 4, height + 6 }, { 32, 2, 49 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26268), { 0, 0, height + 24 },
{ { 0, 10, height + 6 }, { 32, 10, 49 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26265), { 0, 0, height + 24 },
{ { 0, 4, height + 6 }, { 32, 2, 49 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26266), { 0, 0, height + 24 },
{ { 0, 6, height + 56 }, { 32, 20, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topRightSide, PaintSegment::bottomLeftSide), direction),
0xFFFF, 0);
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopRightSide, 0, height + 68,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomRightSide, 0, height + 68,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomLeftSide, 0, height + 68,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopLeftSide, 0, height + 68,
session.SupportColours);
break;
}
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height - 8, TUNNEL_SQUARE_7);
}
else
{
PaintUtilPushTunnelRotated(session, direction, height + 24, TUNNEL_SQUARE_8);
}
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
}
}
/** rct2: 0x00792DE8 */
static void MultiDimensionRCTrack25DegUpToFlat(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
if (trackElement.HasChain())
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15904), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15905), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15906), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15907), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 6, height, session.SupportColours);
}
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15876), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15877), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15878), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15879), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 6, height, session.SupportColours);
}
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height - 8, TUNNEL_SQUARE_FLAT);
}
else
{
PaintUtilPushTunnelRotated(session, direction, height + 8, TUNNEL_14);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 40, 0x20);
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26249), { 0, 0, height + 24 },
{ { 0, 6, height + 32 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26250), { 0, 0, height + 24 },
{ { 0, 6, height + 32 }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26251), { 0, 0, height + 24 },
{ { 0, 6, height + 32 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26252), { 0, 0, height + 24 },
{ { 0, 6, height + 32 }, { 32, 20, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topRightSide, PaintSegment::bottomLeftSide), direction),
0xFFFF, 0);
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopRightSide, 0, height + 44,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomRightSide, 0, height + 44,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomLeftSide, 0, height + 44,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopLeftSide, 0, height + 44,
session.SupportColours);
break;
}
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height - 8, TUNNEL_SQUARE_FLAT);
}
else
{
PaintUtilPushTunnelRotated(session, direction, height + 8, TUNNEL_14);
}
PaintUtilSetGeneralSupportHeight(session, height + 40, 0x20);
}
}
/** rct2: 0x00792DF8 */
static void MultiDimensionRCTrack25DegDown(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
MultiDimensionRCTrack25DegUp(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
}
/** rct2: 0x00792E08 */
static void MultiDimensionRCTrack60DegDown(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
MultiDimensionRCTrack60DegUp(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
}
/** rct2: 0x00792E18 */
static void MultiDimensionRCTrackFlatTo25DegDown(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
MultiDimensionRCTrack25DegUpToFlat(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
}
/** rct2: 0x00792E28 */
static void MultiDimensionRCTrack25DegDownTo60DegDown(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
MultiDimensionRCTrack60DegUpTo25DegUp(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
}
/** rct2: 0x00792E38 */
static void MultiDimensionRCTrack60DegDownTo25DegDown(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
MultiDimensionRCTrack25DegUpTo60DegUp(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
}
/** rct2: 0x00792E48 */
static void MultiDimensionRCTrack25DegDownToFlat(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
MultiDimensionRCTrackFlatTo25DegUp(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
}
/** rct2: 0x00792E58 */
static void MultiDimensionRCTrackLeftQuarterTurn5(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15921), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15926), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15931), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15916), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15920), { 0, 0, height },
{ { 0, 0, height }, { 32, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15925), { 0, 0, height },
{ { 0, 0, height }, { 32, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15930), { 0, 0, height },
{ { 0, 16, height }, { 32, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15915), { 0, 0, height },
{ { 0, 16, height }, { 32, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15919), { 0, 0, height },
{ { 0, 16, height }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15924), { 0, 0, height },
{ { 16, 16, height }, { 16, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15929), { 0, 0, height },
{ { 16, 0, height }, { 16, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15914), { 0, 0, height },
{ { 0, 0, height }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 4:
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 5:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15918), { 0, 0, height },
{ { 16, 0, height }, { 16, 32, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15923), { 0, 0, height },
{ { 0, 0, height }, { 16, 32, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15928), { 0, 0, height },
{ { 0, 0, height }, { 16, 32, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15913), { 0, 0, height },
{ { 16, 0, height }, { 16, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::bottomCorner, PaintSegment::centre,
PaintSegment::topLeftSide, PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 6:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15917), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15922), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15927), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15912), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
switch (direction)
{
case 2:
PaintUtilPushTunnelRight(session, height, TUNNEL_SQUARE_FLAT);
break;
case 3:
PaintUtilPushTunnelLeft(session, height, TUNNEL_SQUARE_FLAT);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26310), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26315), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26320), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26305), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36,
session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26309), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 32, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26314), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 32, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26319), { 0, 0, height + 24 },
{ { 0, 16, height + 22 }, { 32, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26304), { 0, 0, height + 24 },
{ { 0, 16, height + 22 }, { 32, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26308), { 0, 0, height + 24 },
{ { 0, 16, height + 22 }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26313), { 0, 0, height + 24 },
{ { 16, 16, height + 22 }, { 16, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26318), { 0, 0, height + 24 },
{ { 16, 0, height + 22 }, { 16, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26303), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 4:
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 5:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26307), { 0, 0, height + 24 },
{ { 16, 0, height + 22 }, { 16, 32, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26312), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 16, 32, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26317), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 16, 32, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26302), { 0, 0, height + 24 },
{ { 16, 0, height + 22 }, { 16, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::bottomCorner, PaintSegment::centre,
PaintSegment::topLeftSide, PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 6:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26306), { 0, 0, height + 24 },
{ { 6, 0, height + 22 }, { 20, 32, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26311), { 0, 0, height + 24 },
{ { 6, 0, height + 22 }, { 20, 32, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26316), { 0, 0, height + 24 },
{ { 6, 0, height + 22 }, { 20, 32, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26301), { 0, 0, height + 24 },
{ { 6, 0, height + 22 }, { 20, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36,
session.SupportColours);
switch (direction)
{
case 2:
PaintUtilPushTunnelRight(session, height, TUNNEL_SQUARE_FLAT);
break;
case 3:
PaintUtilPushTunnelLeft(session, height, TUNNEL_SQUARE_FLAT);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
}
/** rct2: 0x00792E68 */
static void MultiDimensionRCTrackRightQuarterTurn5(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
trackSequence = mapLeftQuarterTurn5TilesToRightQuarterTurn5Tiles[trackSequence];
MultiDimensionRCTrackLeftQuarterTurn5(session, ride, trackSequence, (direction - 1) & 3, height, trackElement);
}
/** rct2: 0x00792E78 */
static void MultiDimensionRCTrackFlatToLeftBank(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15832), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15840), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15833), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15841), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15834), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15835), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
}
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26273), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26274), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26275), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26276), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36, session.SupportColours);
}
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
}
}
/** rct2: 0x00792E88 */
static void MultiDimensionRCTrackFlatToRightBank(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15836), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15837), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15838), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15842), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15839), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15843), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
}
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
}
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26277), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26278), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26279), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26280), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36, session.SupportColours);
}
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
}
}
/** rct2: 0x00792E98 */
static void MultiDimensionRCTrackLeftBankToFlat(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15838), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15842), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15839), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15843), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15836), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15837), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
}
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26279), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26280), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26277), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26278), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36, session.SupportColours);
}
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
}
}
/** rct2: 0x00792EA8 */
static void MultiDimensionRCTrackRightBankToFlat(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15834), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15835), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15832), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15840), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15833), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15841), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
}
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
}
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26275), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26276), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26273), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26274), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36, session.SupportColours);
}
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
}
}
/** rct2: 0x00792EB8 */
static void MultiDimensionRCTrackBankedLeftQuarterTurn5(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15941), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15952), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15946), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15951), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15936), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15940), { 0, 0, height },
{ { 0, 0, height }, { 32, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15945), { 0, 0, height },
{ { 0, 0, height + 27 }, { 32, 16, 1 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15950), { 0, 0, height },
{ { 0, 16, height }, { 32, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15935), { 0, 0, height },
{ { 0, 16, height }, { 32, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15939), { 0, 0, height },
{ { 0, 16, height }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15944), { 0, 0, height },
{ { 16, 16, height + 27 }, { 16, 16, 1 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15949), { 0, 0, height },
{ { 16, 0, height }, { 16, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15934), { 0, 0, height },
{ { 0, 0, height }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 4:
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 5:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15938), { 0, 0, height },
{ { 16, 0, height }, { 16, 32, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15943), { 0, 0, height },
{ { 0, 0, height + 27 }, { 16, 32, 1 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15948), { 0, 0, height },
{ { 0, 0, height }, { 16, 32, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15933), { 0, 0, height },
{ { 16, 0, height }, { 16, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::bottomCorner, PaintSegment::centre,
PaintSegment::topLeftSide, PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 6:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15937), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15942), { 0, 0, height },
{ { 27, 0, height }, { 1, 32, 26 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15947), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15953), { 0, 0, height },
{ { 27, 0, height }, { 1, 32, 26 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15932), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
switch (direction)
{
case 2:
PaintUtilPushTunnelRight(session, height, TUNNEL_SQUARE_FLAT);
break;
case 3:
PaintUtilPushTunnelLeft(session, height, TUNNEL_SQUARE_FLAT);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26354), { 0, 0, height + 24 },
{ { 0, 6, height + 24 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26359), { 0, 0, height + 24 },
{ { 0, 6, height + 24 }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26364), { 0, 0, height + 24 },
{ { 0, 6, height + 24 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26349), { 0, 0, height + 24 },
{ { 0, 6, height + 24 }, { 32, 20, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36,
session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26353), { 0, 0, height + 24 }, { 32, 16, 3 });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26358), { 0, 0, height + 24 }, { 32, 16, 3 });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26363), { 0, 0, height + 24 },
{ { 0, 16, height + 24 }, { 32, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26348), { 0, 0, height + 24 },
{ { 0, 16, height + 24 }, { 32, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26352), { 0, 0, height + 24 },
{ { 0, 16, height + 24 }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26357), { 0, 0, height + 24 },
{ { 16, 16, height + 24 }, { 16, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26362), { 0, 0, height + 24 },
{ { 16, 0, height + 24 }, { 16, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26347), { 0, 0, height + 24 }, { 16, 16, 3 });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 4:
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 5:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26351), { 0, 0, height + 24 },
{ { 16, 0, height + 24 }, { 16, 32, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26356), { 0, 0, height + 24 }, { 16, 32, 3 });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26361), { 0, 0, height + 24 }, { 16, 32, 3 });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26346), { 0, 0, height + 24 },
{ { 16, 0, height + 24 }, { 16, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::bottomCorner, PaintSegment::centre,
PaintSegment::topLeftSide, PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 6:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26350), { 0, 0, height + 24 },
{ { 6, 0, height + 24 }, { 20, 32, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26355), { 0, 0, height + 24 },
{ { 6, 0, height + 24 }, { 20, 32, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26360), { 0, 0, height + 24 },
{ { 6, 0, height + 24 }, { 20, 32, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26345), { 0, 0, height + 24 },
{ { 6, 0, height + 24 }, { 20, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36,
session.SupportColours);
switch (direction)
{
case 2:
PaintUtilPushTunnelRight(session, height, TUNNEL_SQUARE_FLAT);
break;
case 3:
PaintUtilPushTunnelLeft(session, height, TUNNEL_SQUARE_FLAT);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
}
/** rct2: 0x00792EC8 */
static void MultiDimensionRCTrackBankedRightQuarterTurn5(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
trackSequence = mapLeftQuarterTurn5TilesToRightQuarterTurn5Tiles[trackSequence];
MultiDimensionRCTrackBankedLeftQuarterTurn5(session, ride, trackSequence, (direction - 1) & 3, height, trackElement);
}
/** rct2: 0x00792ED8 */
static void MultiDimensionRCTrackLeftBankTo25DegUp(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15844), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15848), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 34 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15845), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15849), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 34 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15846), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15847), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 3, height, session.SupportColours);
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
else
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_8);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26281), { 0, 0, height + 24 },
{ { 0, 6, height + 32 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26282), { 0, 0, height + 24 },
{ { 0, 6, height + 32 }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26283), { 0, 0, height + 24 },
{ { 0, 6, height + 32 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26284), { 0, 0, height + 24 },
{ { 0, 6, height + 32 }, { 32, 20, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopRightSide, 0, height + 44,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomRightSide, 0, height + 44,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomLeftSide, 0, height + 44,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopLeftSide, 0, height + 44,
session.SupportColours);
break;
}
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
else
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_8);
}
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
}
}
/** rct2: 0x00792EE8 */
static void MultiDimensionRCTrackRightBankTo25DegUp(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15850), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15851), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15852), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15854), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 34 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15853), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15855), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 34 } });
break;
}
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 3, height, session.SupportColours);
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
else
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_8);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26285), { 0, 0, height + 24 },
{ { 0, 6, height + 32 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26286), { 0, 0, height + 24 },
{ { 0, 6, height + 32 }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26287), { 0, 0, height + 24 },
{ { 0, 6, height + 32 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26288), { 0, 0, height + 24 },
{ { 0, 6, height + 32 }, { 32, 20, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopRightSide, 0, height + 44,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomRightSide, 0, height + 44,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomLeftSide, 0, height + 44,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopLeftSide, 0, height + 44,
session.SupportColours);
break;
}
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
else
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_8);
}
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
}
}
/** rct2: 0x00792EF8 */
static void MultiDimensionRCTrack25DegUpToLeftBank(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15856), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15860), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 34 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15857), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15861), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 34 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15858), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15859), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 6, height, session.SupportColours);
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height - 8, TUNNEL_SQUARE_FLAT);
}
else
{
PaintUtilPushTunnelRotated(session, direction, height + 8, TUNNEL_14);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 40, 0x20);
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26289), { 0, 0, height + 24 },
{ { 0, 6, height + 32 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26290), { 0, 0, height + 24 },
{ { 0, 6, height + 32 }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26291), { 0, 0, height + 24 },
{ { 0, 6, height + 32 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26292), { 0, 0, height + 24 },
{ { 0, 6, height + 32 }, { 32, 20, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopRightSide, 0, height + 44,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomRightSide, 0, height + 44,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomLeftSide, 0, height + 44,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopLeftSide, 0, height + 44,
session.SupportColours);
break;
}
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height - 8, TUNNEL_SQUARE_FLAT);
}
else
{
PaintUtilPushTunnelRotated(session, direction, height + 8, TUNNEL_14);
}
PaintUtilSetGeneralSupportHeight(session, height + 40, 0x20);
}
}
/** rct2: 0x00792F08 */
static void MultiDimensionRCTrack25DegUpToRightBank(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15862), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15863), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15864), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15866), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 34 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15865), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15867), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 34 } });
break;
}
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 6, height, session.SupportColours);
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height - 8, TUNNEL_SQUARE_FLAT);
}
else
{
PaintUtilPushTunnelRotated(session, direction, height + 8, TUNNEL_14);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 40, 0x20);
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26293), { 0, 0, height + 24 },
{ { 0, 6, height + 32 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26294), { 0, 0, height + 24 },
{ { 0, 6, height + 32 }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26295), { 0, 0, height + 24 },
{ { 0, 6, height + 32 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26296), { 0, 0, height + 24 },
{ { 0, 6, height + 32 }, { 32, 20, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopRightSide, 0, height + 44,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomRightSide, 0, height + 44,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomLeftSide, 0, height + 44,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopLeftSide, 0, height + 44,
session.SupportColours);
break;
}
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height - 8, TUNNEL_SQUARE_FLAT);
}
else
{
PaintUtilPushTunnelRotated(session, direction, height + 8, TUNNEL_14);
}
PaintUtilSetGeneralSupportHeight(session, height + 40, 0x20);
}
}
/** rct2: 0x00792F18 */
static void MultiDimensionRCTrackLeftBankTo25DegDown(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
MultiDimensionRCTrack25DegUpToRightBank(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
}
/** rct2: 0x00792F28 */
static void MultiDimensionRCTrackRightBankTo25DegDown(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
MultiDimensionRCTrack25DegUpToLeftBank(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
}
/** rct2: 0x00792F38 */
static void MultiDimensionRCTrack25DegDownToLeftBank(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
MultiDimensionRCTrackRightBankTo25DegUp(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
}
/** rct2: 0x00792F48 */
static void MultiDimensionRCTrack25DegDownToRightBank(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
MultiDimensionRCTrackLeftBankTo25DegUp(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
}
/** rct2: 0x00792F58 */
static void MultiDimensionRCTrackLeftBank(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15868), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15869), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15870), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15871), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
}
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26297), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26298), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26299), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26300), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36, session.SupportColours);
}
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
}
}
/** rct2: 0x00792F68 */
static void MultiDimensionRCTrackRightBank(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
MultiDimensionRCTrackLeftBank(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
}
/** rct2: 0x00792F78 */
static void MultiDimensionRCTrackSBendLeft(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15816), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15820), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15819), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15823), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15817), { 0, 0, height }, { 32, 26, 3 });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopLeftSide, 0, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15821), { 0, 0, height }, { 32, 26, 3 });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopRightSide, 1, height,
session.SupportColours);
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15818), { 0, 0, height },
{ { 0, 6, height }, { 32, 26, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15822), { 0, 0, height },
{ { 0, 6, height }, { 32, 26, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15818), { 0, 0, height },
{ { 0, 6, height }, { 32, 26, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15822), { 0, 0, height },
{ { 0, 6, height }, { 32, 26, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15817), { 0, 0, height }, { 32, 26, 3 });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopLeftSide, 0, height,
session.SupportColours);
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15821), { 0, 0, height }, { 32, 26, 3 });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopRightSide, 1, height,
session.SupportColours);
break;
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15819), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15823), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15816), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15820), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
switch (direction)
{
case 1:
PaintUtilPushTunnelRight(session, height, TUNNEL_SQUARE_FLAT);
break;
case 2:
PaintUtilPushTunnelLeft(session, height, TUNNEL_SQUARE_FLAT);
break;
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26229), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26233), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26232), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26236), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36,
session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26230), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 32, 26, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26234), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 32, 26, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26231), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 26, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26235), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 26, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopLeftSide, 0, height + 36,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopRightSide, 0, height + 36,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26231), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 26, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26235), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 26, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26230), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 32, 26, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26234), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 32, 26, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre,
PaintSegment::topRightSide, PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopLeftSide, 0, height + 36,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopRightSide, 0, height + 36,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26232), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26236), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26229), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26233), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36,
session.SupportColours);
switch (direction)
{
case 1:
PaintUtilPushTunnelRight(session, height, TUNNEL_SQUARE_FLAT);
break;
case 2:
PaintUtilPushTunnelLeft(session, height, TUNNEL_SQUARE_FLAT);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
}
/** rct2: 0x00792F88 */
static void MultiDimensionRCTrackSBendRight(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15824), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15828), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15827), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15831), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15825), { 0, 0, height },
{ { 0, 6, height }, { 32, 26, 3 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomRightSide, 0, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15829), { 0, 0, height },
{ { 0, 6, height }, { 32, 26, 3 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomLeftSide, 0, height,
session.SupportColours);
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15826), { 0, 0, height }, { 32, 26, 3 });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15830), { 0, 0, height }, { 32, 26, 3 });
break;
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15826), { 0, 0, height }, { 32, 26, 3 });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15830), { 0, 0, height }, { 32, 26, 3 });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15825), { 0, 0, height },
{ { 0, 6, height }, { 32, 26, 3 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomRightSide, 0, height,
session.SupportColours);
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15829), { 0, 0, height },
{ { 0, 6, height }, { 32, 26, 3 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomLeftSide, 0, height,
session.SupportColours);
break;
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15827), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15831), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15824), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15828), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
switch (direction)
{
case 1:
PaintUtilPushTunnelRight(session, height, TUNNEL_SQUARE_FLAT);
break;
case 2:
PaintUtilPushTunnelLeft(session, height, TUNNEL_SQUARE_FLAT);
break;
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26237), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26241), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26240), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26244), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36,
session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26238), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 26, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26242), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 26, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26239), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 32, 26, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26243), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 32, 26, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre,
PaintSegment::topRightSide, PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomRightSide, 0, height + 36,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomLeftSide, 0, height + 36,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26239), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 32, 26, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26243), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 32, 26, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26238), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 26, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26242), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 26, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomRightSide, 0, height + 36,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomLeftSide, 0, height + 36,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26240), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26244), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26237), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26241), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36,
session.SupportColours);
switch (direction)
{
case 1:
PaintUtilPushTunnelRight(session, height, TUNNEL_SQUARE_FLAT);
break;
case 2:
PaintUtilPushTunnelLeft(session, height, TUNNEL_SQUARE_FLAT);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
}
/** rct2: 0x00792FC8 */
static void MultiDimensionRCTrackLeftQuarterTurn3(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15959), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15962), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15965), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15956), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15958), { 0, 0, height },
{ { 16, 0, height }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15961), { 0, 0, height },
{ { 0, 0, height }, { 16, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15964), { 0, 0, height },
{ { 0, 16, height }, { 16, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15955), { 0, 0, height },
{ { 16, 16, height }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15957), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15960), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15963), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15954), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
switch (direction)
{
case 2:
PaintUtilPushTunnelRight(session, height, TUNNEL_SQUARE_FLAT);
break;
case 3:
PaintUtilPushTunnelLeft(session, height, TUNNEL_SQUARE_FLAT);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26326), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26329), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26332), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26323), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36,
session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26325), { 0, 0, height + 24 },
{ { 16, 0, height + 22 }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26328), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 16, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26331), { 0, 0, height + 24 },
{ { 0, 16, height + 22 }, { 16, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26322), { 0, 0, height + 24 },
{ { 16, 16, height + 22 }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26324), { 0, 0, height + 24 },
{ { 6, 0, height + 22 }, { 20, 32, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26327), { 0, 0, height + 24 },
{ { 6, 0, height + 22 }, { 20, 32, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26330), { 0, 0, height + 24 },
{ { 6, 0, height + 22 }, { 20, 32, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26321), { 0, 0, height + 24 },
{ { 6, 0, height + 22 }, { 20, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36,
session.SupportColours);
switch (direction)
{
case 2:
PaintUtilPushTunnelRight(session, height, TUNNEL_SQUARE_FLAT);
break;
case 3:
PaintUtilPushTunnelLeft(session, height, TUNNEL_SQUARE_FLAT);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
}
/** rct2: 0x00792FD8 */
static void MultiDimensionRCTrackRightQuarterTurn3(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
trackSequence = mapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence];
MultiDimensionRCTrackLeftQuarterTurn3(session, ride, trackSequence, (direction - 1) & 3, height, trackElement);
}
/** rct2: 0x00792FE8 */
static void MultiDimensionRCTrackLeftQuarterTurn3Bank(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15971), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15978), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15974), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15977), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15968), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15970), { 0, 0, height },
{ { 16, 0, height }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15973), { 0, 0, height },
{ { 0, 0, height + 27 }, { 16, 16, 1 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15976), { 0, 0, height },
{ { 0, 16, height }, { 16, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15967), { 0, 0, height },
{ { 16, 16, height }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15969), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15972), { 0, 0, height },
{ { 27, 0, height }, { 1, 32, 26 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15975), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15979), { 0, 0, height },
{ { 27, 0, height }, { 1, 32, 26 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15966), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
switch (direction)
{
case 2:
PaintUtilPushTunnelRight(session, height, TUNNEL_SQUARE_FLAT);
break;
case 3:
PaintUtilPushTunnelLeft(session, height, TUNNEL_SQUARE_FLAT);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26338), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26341), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26344), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26335), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36,
session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26337), { 0, 0, height + 24 },
{ { 16, 0, height + 22 }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26340), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 16, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26343), { 0, 0, height + 24 },
{ { 0, 16, height + 22 }, { 16, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26334), { 0, 0, height + 24 },
{ { 16, 16, height + 22 }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26336), { 0, 0, height + 24 },
{ { 6, 0, height + 22 }, { 20, 32, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26339), { 0, 0, height + 24 },
{ { 6, 0, height + 22 }, { 20, 32, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26342), { 0, 0, height + 24 },
{ { 6, 0, height + 22 }, { 20, 32, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26333), { 0, 0, height + 24 },
{ { 6, 0, height + 22 }, { 20, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36,
session.SupportColours);
switch (direction)
{
case 2:
PaintUtilPushTunnelRight(session, height, TUNNEL_SQUARE_FLAT);
break;
case 3:
PaintUtilPushTunnelLeft(session, height, TUNNEL_SQUARE_FLAT);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
}
/** rct2: 0x00792FF8 */
static void MultiDimensionRCTrackRightQuarterTurn3Bank(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
trackSequence = mapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence];
MultiDimensionRCTrackLeftQuarterTurn3Bank(session, ride, trackSequence, (direction - 1) & 3, height, trackElement);
}
/** rct2: 0x00793008 */
static void MultiDimensionRCTrackLeftHalfBankedHelixUpSmall(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16197), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16204), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16200), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16203), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16194), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 2, height, session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16196), { 0, 0, height },
{ { 16, 0, height }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16199), { 0, 0, height },
{ { 0, 0, height + 27 }, { 16, 16, 1 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16202), { 0, 0, height },
{ { 0, 16, height }, { 16, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16193), { 0, 0, height },
{ { 16, 16, height }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16195), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16198), { 0, 0, height },
{ { 27, 0, height }, { 1, 32, 26 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16201), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16205), { 0, 0, height },
{ { 27, 0, height }, { 1, 32, 26 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16192), { 0, 0, height },
{ { 6, 0, height + 8 }, { 20, 32, 3 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 6, height, session.SupportColours);
switch (direction)
{
case 2:
PaintUtilPushTunnelRight(session, height + 8, TUNNEL_SQUARE_FLAT);
break;
case 3:
PaintUtilPushTunnelLeft(session, height + 8, TUNNEL_SQUARE_FLAT);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 4:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16194), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16197), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16204), { 0, 0, height },
{ { 27, 0, height }, { 1, 32, 26 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16200), { 0, 0, height },
{ { 27, 0, height }, { 1, 32, 26 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16203), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 2, height, session.SupportColours);
switch (direction)
{
case 0:
PaintUtilPushTunnelRight(session, height, TUNNEL_SQUARE_FLAT);
break;
case 1:
PaintUtilPushTunnelLeft(session, height, TUNNEL_SQUARE_FLAT);
break;
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 5:
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 6:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16193), { 0, 0, height },
{ { 16, 16, height }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16196), { 0, 0, height },
{ { 0, 16, height }, { 16, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16199), { 0, 0, height },
{ { 0, 0, height + 27 }, { 16, 16, 1 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16202), { 0, 0, height },
{ { 16, 0, height }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 7:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16192), { 0, 0, height },
{ { 0, 6, height + 8 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16195), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16198), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16201), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16205), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 6, height, session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height + 8, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
/** rct2: 0x00793018 */
static void MultiDimensionRCTrackRightHalfBankedHelixUpSmall(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16178), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16181), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16184), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16187), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16191), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 2, height, session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16179), { 0, 0, height },
{ { 16, 16, height }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16182), { 0, 0, height },
{ { 0, 16, height }, { 16, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16185), { 0, 0, height },
{ { 0, 0, height + 27 }, { 16, 16, 1 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16188), { 0, 0, height },
{ { 16, 0, height }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16180), { 0, 0, height },
{ { 6, 0, height + 8 }, { 20, 32, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16183), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16190), { 0, 0, height },
{ { 27, 0, height }, { 1, 32, 26 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16186), { 0, 0, height },
{ { 27, 0, height }, { 1, 32, 26 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16189), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 6, height, session.SupportColours);
switch (direction)
{
case 0:
PaintUtilPushTunnelRight(session, height + 8, TUNNEL_SQUARE_FLAT);
break;
case 1:
PaintUtilPushTunnelLeft(session, height + 8, TUNNEL_SQUARE_FLAT);
break;
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 4:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16181), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16184), { 0, 0, height },
{ { 27, 0, height }, { 1, 32, 26 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16187), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16191), { 0, 0, height },
{ { 27, 0, height }, { 1, 32, 26 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16178), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 2, height, session.SupportColours);
switch (direction)
{
case 2:
PaintUtilPushTunnelRight(session, height, TUNNEL_SQUARE_FLAT);
break;
case 3:
PaintUtilPushTunnelLeft(session, height, TUNNEL_SQUARE_FLAT);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 5:
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 6:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16182), { 0, 0, height },
{ { 16, 0, height }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16185), { 0, 0, height },
{ { 0, 0, height + 27 }, { 16, 16, 1 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16188), { 0, 0, height },
{ { 0, 16, height }, { 16, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16179), { 0, 0, height },
{ { 16, 16, height }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 7:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16183), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16190), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16186), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16189), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16180), { 0, 0, height },
{ { 0, 6, height + 8 }, { 32, 20, 3 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 6, height, session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height + 8, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
/** rct2: 0x00793028 */
static void MultiDimensionRCTrackLeftHalfBankedHelixDownSmall(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (trackSequence >= 4)
{
trackSequence -= 4;
direction = (direction - 1) & 3;
}
trackSequence = mapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence];
MultiDimensionRCTrackRightHalfBankedHelixUpSmall(session, ride, trackSequence, (direction + 1) & 3, height, trackElement);
}
/** rct2: 0x00793038 */
static void MultiDimensionRCTrackRightHalfBankedHelixDownSmall(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (trackSequence >= 4)
{
trackSequence -= 4;
direction = (direction + 1) & 3;
}
trackSequence = mapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence];
MultiDimensionRCTrackLeftHalfBankedHelixUpSmall(session, ride, trackSequence, (direction - 1) & 3, height, trackElement);
}
/** rct2: 0x00793048 */
static void MultiDimensionRCTrackLeftHalfBankedHelixUpLarge(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16165), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16176), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16170), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16175), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16160), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 1, height, session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16164), { 0, 0, height },
{ { 0, 0, height }, { 32, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16169), { 0, 0, height },
{ { 0, 0, height + 27 }, { 32, 16, 1 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16174), { 0, 0, height },
{ { 0, 16, height }, { 32, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16159), { 0, 0, height },
{ { 0, 16, height }, { 32, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16163), { 0, 0, height },
{ { 0, 16, height }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16168), { 0, 0, height },
{ { 16, 16, height + 27 }, { 16, 16, 1 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16173), { 0, 0, height },
{ { 16, 0, height }, { 16, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16158), { 0, 0, height },
{ { 0, 0, height }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 4:
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 5:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16162), { 0, 0, height },
{ { 16, 0, height }, { 16, 32, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16167), { 0, 0, height },
{ { 0, 0, height + 27 }, { 16, 32, 1 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16172), { 0, 0, height },
{ { 0, 0, height }, { 16, 32, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16157), { 0, 0, height },
{ { 16, 0, height }, { 16, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 6:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16161), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16166), { 0, 0, height },
{ { 27, 0, height }, { 1, 32, 26 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16171), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16177), { 0, 0, height },
{ { 27, 0, height }, { 1, 32, 26 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16156), { 0, 0, height },
{ { 6, 0, height + 8 }, { 20, 32, 3 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 7, height, session.SupportColours);
switch (direction)
{
case 2:
PaintUtilPushTunnelRight(session, height + 8, TUNNEL_SQUARE_FLAT);
break;
case 3:
PaintUtilPushTunnelLeft(session, height + 8, TUNNEL_SQUARE_FLAT);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 7:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16160), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16165), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16176), { 0, 0, height },
{ { 27, 0, height }, { 1, 32, 26 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16170), { 0, 0, height },
{ { 27, 0, height }, { 1, 32, 26 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16175), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 1, height, session.SupportColours);
switch (direction)
{
case 0:
PaintUtilPushTunnelRight(session, height, TUNNEL_SQUARE_FLAT);
break;
case 1:
PaintUtilPushTunnelLeft(session, height, TUNNEL_SQUARE_FLAT);
break;
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 8:
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 9:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16159), { 0, 0, height },
{ { 16, 0, height }, { 16, 32, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16164), { 0, 0, height },
{ { 0, 0, height }, { 16, 32, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16169), { 0, 0, height },
{ { 0, 0, height + 27 }, { 16, 32, 1 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16174), { 0, 0, height },
{ { 16, 0, height }, { 16, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 10:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16158), { 0, 0, height },
{ { 0, 0, height }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16163), { 0, 0, height },
{ { 16, 0, height }, { 16, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16168), { 0, 0, height },
{ { 16, 16, height + 27 }, { 16, 16, 1 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16173), { 0, 0, height },
{ { 0, 16, height }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 11:
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 12:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16157), { 0, 0, height },
{ { 0, 16, height }, { 32, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16162), { 0, 0, height },
{ { 0, 16, height }, { 32, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16167), { 0, 0, height },
{ { 0, 0, height + 27 }, { 32, 16, 1 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16172), { 0, 0, height },
{ { 0, 0, height }, { 32, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 13:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16156), { 0, 0, height },
{ { 0, 6, height + 8 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16161), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16166), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16171), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16177), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 7, height, session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height + 8, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
/** rct2: 0x00793058 */
static void MultiDimensionRCTrackRightHalfBankedHelixUpLarge(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16134), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16139), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16144), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16149), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16155), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 1, height, session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16135), { 0, 0, height },
{ { 0, 16, height }, { 32, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16140), { 0, 0, height },
{ { 0, 16, height }, { 32, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16145), { 0, 0, height },
{ { 0, 0, height + 27 }, { 32, 16, 1 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16150), { 0, 0, height },
{ { 0, 0, height }, { 32, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16136), { 0, 0, height },
{ { 0, 0, height }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16141), { 0, 0, height },
{ { 16, 0, height }, { 16, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16146), { 0, 0, height },
{ { 16, 16, height + 27 }, { 16, 16, 1 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16151), { 0, 0, height },
{ { 0, 16, height }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 4:
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 5:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16137), { 0, 0, height },
{ { 16, 0, height }, { 16, 32, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16142), { 0, 0, height },
{ { 0, 0, height }, { 16, 32, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16147), { 0, 0, height },
{ { 0, 0, height + 27 }, { 16, 32, 1 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16152), { 0, 0, height },
{ { 16, 0, height }, { 16, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 6:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16138), { 0, 0, height },
{ { 6, 0, height + 8 }, { 20, 32, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16143), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16154), { 0, 0, height },
{ { 27, 0, height }, { 1, 32, 26 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16148), { 0, 0, height },
{ { 27, 0, height }, { 1, 32, 26 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16153), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 7, height, session.SupportColours);
switch (direction)
{
case 0:
PaintUtilPushTunnelRight(session, height + 8, TUNNEL_SQUARE_FLAT);
break;
case 1:
PaintUtilPushTunnelLeft(session, height + 8, TUNNEL_SQUARE_FLAT);
break;
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 7:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16139), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16144), { 0, 0, height },
{ { 27, 0, height }, { 1, 32, 26 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16149), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16155), { 0, 0, height },
{ { 27, 0, height }, { 1, 32, 26 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16134), { 0, 0, height },
{ { 6, 0, height }, { 20, 32, 3 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 1, height, session.SupportColours);
switch (direction)
{
case 2:
PaintUtilPushTunnelRight(session, height, TUNNEL_SQUARE_FLAT);
break;
case 3:
PaintUtilPushTunnelLeft(session, height, TUNNEL_SQUARE_FLAT);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 8:
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 9:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16140), { 0, 0, height },
{ { 16, 0, height }, { 16, 32, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16145), { 0, 0, height },
{ { 0, 0, height + 27 }, { 16, 32, 1 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16150), { 0, 0, height },
{ { 0, 0, height }, { 16, 32, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16135), { 0, 0, height },
{ { 16, 0, height }, { 16, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 10:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16141), { 0, 0, height },
{ { 0, 16, height }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16146), { 0, 0, height },
{ { 16, 16, height + 27 }, { 16, 16, 1 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16151), { 0, 0, height },
{ { 16, 0, height }, { 16, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16136), { 0, 0, height },
{ { 0, 0, height }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 11:
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 12:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16142), { 0, 0, height },
{ { 0, 0, height }, { 32, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16147), { 0, 0, height },
{ { 0, 0, height + 27 }, { 32, 16, 1 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16152), { 0, 0, height },
{ { 0, 16, height }, { 32, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16137), { 0, 0, height },
{ { 0, 16, height }, { 32, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 13:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16143), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16154), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16148), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16153), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16138), { 0, 0, height },
{ { 0, 6, height + 8 }, { 32, 20, 3 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 7, height, session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height + 8, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
/** rct2: 0x00793068 */
static void MultiDimensionRCTrackLeftHalfBankedHelixDownLarge(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (trackSequence >= 7)
{
trackSequence -= 7;
direction = (direction - 1) & 3;
}
trackSequence = mapLeftQuarterTurn5TilesToRightQuarterTurn5Tiles[trackSequence];
MultiDimensionRCTrackRightHalfBankedHelixUpLarge(session, ride, trackSequence, (direction + 1) & 3, height, trackElement);
}
/** rct2: 0x00793078 */
static void MultiDimensionRCTrackRightHalfBankedHelixDownLarge(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (trackSequence >= 7)
{
trackSequence -= 7;
direction = (direction + 1) & 3;
}
trackSequence = mapLeftQuarterTurn5TilesToRightQuarterTurn5Tiles[trackSequence];
MultiDimensionRCTrackLeftHalfBankedHelixUpLarge(session, ride, trackSequence, (direction - 1) & 3, height, trackElement);
}
/** rct2: 0x00793088 */
static void MultiDimensionRCTrackBrakes(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (direction)
{
case 0:
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16218), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16219), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
}
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
}
else
{
switch (direction)
{
case 0:
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26549), { 0, 0, height + 24 },
{ { 0, 6, height + 24 }, { 32, 20, 3 } });
break;
case 1:
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26550), { 0, 0, height + 24 },
{ { 0, 6, height + 24 }, { 32, 20, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topRightSide, PaintSegment::bottomLeftSide), direction),
0xFFFF, 0);
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36, session.SupportColours);
}
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
}
}
/** rct2: 0x00793098 */
static void MultiDimensionRCTrackOnRidePhoto(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
TrackPaintUtilOnridePhotoPlatformPaint(session, direction, height, MetalSupportType::TubesInverted);
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15806), { 0, 0, height },
{ { 0, 6, height + 3 }, { 32, 20, 0 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15807), { 0, 0, height },
{ { 0, 6, height + 3 }, { 32, 20, 0 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15806), { 0, 0, height },
{ { 0, 6, height + 3 }, { 32, 20, 0 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15807), { 0, 0, height },
{ { 0, 6, height + 3 }, { 32, 20, 0 } });
break;
}
TrackPaintUtilOnridePhotoPaint(session, direction, height + 3, trackElement);
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, ImageId(SPR_STATION_BASE_D, COLOUR_BLACK), { 0, 0, height }, { 32, 32, 1 });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopLeftSide, 0, height,
session.SupportColours);
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomRightSide, 0, height,
session.SupportColours);
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26227), { 0, 0, height + 24 },
{ { 0, 6, height + 24 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, ImageId(SPR_STATION_BASE_D, COLOUR_BLACK), { 0, 0, height }, { 32, 32, 1 });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopRightSide, 0, height,
session.SupportColours);
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomLeftSide, 0, height,
session.SupportColours);
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26228), { 0, 0, height + 24 },
{ { 0, 6, height + 24 }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, ImageId(SPR_STATION_BASE_D, COLOUR_BLACK), { 0, 0, height }, { 32, 32, 1 });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopLeftSide, 0, height,
session.SupportColours);
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomRightSide, 0, height,
session.SupportColours);
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26227), { 0, 0, height + 24 },
{ { 0, 6, height + 24 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, ImageId(SPR_STATION_BASE_D, COLOUR_BLACK), { 0, 0, height }, { 32, 32, 1 });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopRightSide, 0, height,
session.SupportColours);
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomLeftSide, 0, height,
session.SupportColours);
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26228), { 0, 0, height + 24 },
{ { 0, 6, height + 24 }, { 32, 20, 3 } });
break;
}
TrackPaintUtilOnridePhotoPaint(session, direction, height + 3, trackElement);
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 64, 0x20);
}
}
/** rct2: 0x00793328 */
static void MultiDimensionRCTrack90DegUp(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16130), { 0, 0, height },
{ { 4, 6, height + 8 }, { 2, 20, 31 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16131), { 0, 0, height },
{ { 24, 6, height + 8 }, { 2, 20, 31 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16132), { 0, 0, height },
{ { 24, 6, height + 8 }, { 2, 20, 31 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16133), { 0, 0, height },
{ { 4, 6, height + 8 }, { 2, 20, 31 } });
break;
}
PaintUtilSetVerticalTunnel(session, height + 32);
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26533), { 0, 0, height + 24 },
{ { 0, 6, height + 56 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26534), { 0, 0, height + 24 },
{ { 0, 4, height + 6 }, { 32, 2, 31 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26535), { 0, 0, height + 24 },
{ { 0, 4, height + 6 }, { 32, 2, 31 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26536), { 0, 0, height + 24 },
{ { 0, 6, height + 56 }, { 32, 20, 3 } });
break;
}
PaintUtilSetVerticalTunnel(session, height + 32);
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
break;
}
}
}
/** rct2: 0x00793338 */
static void MultiDimensionRCTrack90DegDown(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
MultiDimensionRCTrack90DegUp(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
}
/** rct2: 0x00793348 */
static void MultiDimensionRCTrack60DegUpTo90DegUp(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16122), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16123), { 0, 0, height },
{ { 24, 6, height }, { 2, 20, 55 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16124), { 0, 0, height },
{ { 24, 6, height }, { 2, 20, 55 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16125), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height - 8, TUNNEL_SQUARE_7);
}
PaintUtilSetVerticalTunnel(session, height + 56);
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 1:
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26525), { 0, 0, height + 24 },
{ { 0, 6, height + 80 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26526), { 0, 0, height + 24 },
{ { 0, 4, height + 6 }, { 32, 2, 55 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26527), { 0, 0, height + 24 },
{ { 0, 4, height + 6 }, { 32, 2, 55 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26528), { 0, 0, height + 24 },
{ { 0, 6, height + 80 }, { 32, 20, 3 } });
break;
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height - 8, TUNNEL_INVERTED_4);
}
PaintUtilSetVerticalTunnel(session, height + 56);
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
case 1:
break;
}
}
}
/** rct2: 0x00793358 */
static void MultiDimensionRCTrack90DegDownTo60DegDown(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
MultiDimensionRCTrack60DegUpTo90DegUp(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
}
/** rct2: 0x00793368 */
static void MultiDimensionRCTrack90DegUpTo60DegUp(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16126), { 0, 0, height },
{ { 0, 6, height + 2 }, { 6, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16127), { 0, 0, height },
{ { 39, 6, height + 8 }, { 2, 20, 31 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16128), { 0, 0, height },
{ { 39, 6, height + 8 }, { 2, 20, 31 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16129), { 0, 0, height },
{ { 0, 6, height + 2 }, { 6, 20, 3 } });
break;
}
switch (direction)
{
case 1:
PaintUtilPushTunnelRight(session, height + 48, TUNNEL_SQUARE_8);
break;
case 2:
PaintUtilPushTunnelLeft(session, height + 48, TUNNEL_SQUARE_8);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topRightSide, PaintSegment::bottomLeftSide), direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 80, 0x20);
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26529), { 0, 0, height + 24 },
{ { 0, 6, height + 80 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26530), { 0, 0, height + 24 },
{ { 0, 4, height + 6 }, { 32, 2, 55 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26531), { 0, 0, height + 24 },
{ { 0, 4, height + 6 }, { 32, 2, 55 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26532), { 0, 0, height + 24 },
{ { 0, 6, height + 80 }, { 32, 20, 3 } });
break;
}
switch (direction)
{
case 1:
PaintUtilPushTunnelRight(session, height + 48, TUNNEL_INVERTED_5);
break;
case 2:
PaintUtilPushTunnelLeft(session, height + 48, TUNNEL_INVERTED_5);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topRightSide, PaintSegment::bottomLeftSide), direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 96, 0x20);
}
}
/** rct2: 0x00793378 */
static void MultiDimensionRCTrack60DegDownTo90DegDown(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16128), { 0, 0, height },
{ { 39, 6, height + 8 }, { 2, 20, 31 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16129), { 0, 0, height },
{ { 0, 6, height + 2 }, { 6, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16126), { 0, 0, height },
{ { 0, 6, height + 2 }, { 6, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16127), { 0, 0, height },
{ { 39, 6, height + 8 }, { 2, 20, 31 } });
break;
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height + 48, TUNNEL_SQUARE_8);
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 80, 0x20);
break;
case 1:
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26531), { 0, 0, height + 24 },
{ { 0, 4, height + 6 }, { 32, 2, 55 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26532), { 0, 0, height + 24 },
{ { 0, 6, height + 80 }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26529), { 0, 0, height + 24 },
{ { 0, 6, height + 80 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26530), { 0, 0, height + 24 },
{ { 0, 4, height + 6 }, { 32, 2, 55 } });
break;
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height + 48, TUNNEL_INVERTED_5);
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 96, 0x20);
break;
case 1:
break;
}
}
}
/** rct2: 0x007930B8 */
static void MultiDimensionRCTrackLeftEighthToDiag(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15996), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16000), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16004), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16008), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15997), { 0, 0, height },
{ { 0, 0, height }, { 32, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16001), { 0, 0, height },
{ { 0, 0, height }, { 34, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16005), { 0, 0, height },
{ { 0, 16, height }, { 32, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16009), { 0, 0, height },
{ { 0, 16, height }, { 32, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15998), { 0, 0, height },
{ { 0, 16, height }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16002), { 0, 0, height },
{ { 16, 16, height }, { 16, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16006), { 0, 0, height },
{ { 16, 0, height }, { 16, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16010), { 0, 0, height },
{ { 0, 0, height }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre,
PaintSegment::topRightSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 4:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15999), { 0, 0, height },
{ { 16, 16, height }, { 16, 16, 3 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16003), { 0, 0, height },
{ { 0, 16, height }, { 16, 18, 3 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height,
session.SupportColours);
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16007), { 0, 0, height },
{ { 0, 0, height }, { 16, 16, 3 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height,
session.SupportColours);
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16011), { 0, 0, height },
{ { 16, 0, height }, { 16, 16, 3 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height,
session.SupportColours);
break;
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26405), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26409), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26413), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26417), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36,
session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26406), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 32, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26410), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 34, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26414), { 0, 0, height + 24 },
{ { 0, 16, height + 22 }, { 32, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26418), { 0, 0, height + 24 },
{ { 0, 16, height + 22 }, { 32, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26407), { 0, 0, height + 24 },
{ { 0, 16, height + 22 }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26411), { 0, 0, height + 24 },
{ { 16, 16, height + 22 }, { 16, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26415), { 0, 0, height + 24 },
{ { 16, 0, height + 22 }, { 16, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26419), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre,
PaintSegment::topRightSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 4:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26408), { 0, 0, height + 24 },
{ { 16, 16, height + 22 }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26412), { 0, 0, height + 24 },
{ { 0, 16, height + 22 }, { 16, 18, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26416), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 16, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26420), { 0, 0, height + 24 },
{ { 16, 0, height + 22 }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide, PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height + 36,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height + 36,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height + 36,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height + 36,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
}
/** rct2: 0x007930C8 */
static void MultiDimensionRCTrackRightEighthToDiag(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15980), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15984), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15988), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15992), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15981), { 0, 0, height },
{ { 0, 16, height }, { 32, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15985), { 0, 0, height },
{ { 0, 16, height }, { 32, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15989), { 0, 0, height },
{ { 0, 0, height }, { 34, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15993), { 0, 0, height },
{ { 0, 0, height }, { 32, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15982), { 0, 0, height },
{ { 0, 0, height }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15986), { 0, 0, height },
{ { 16, 0, height }, { 16, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15990), { 0, 0, height },
{ { 4, 4, height }, { 28, 28, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15994), { 0, 0, height },
{ { 0, 16, height }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 4:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15983), { 0, 0, height },
{ { 16, 0, height }, { 16, 16, 3 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15987), { 0, 0, height },
{ { 0, 0, height }, { 16, 16, 3 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height,
session.SupportColours);
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15991), { 0, 0, height },
{ { 0, 16, height }, { 16, 18, 3 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height,
session.SupportColours);
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(15995), { 0, 0, height },
{ { 16, 16, height }, { 16, 16, 3 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height,
session.SupportColours);
break;
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26389), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26393), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26397), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26401), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36,
session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26390), { 0, 0, height + 24 },
{ { 0, 16, height + 22 }, { 32, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26394), { 0, 0, height + 24 },
{ { 0, 16, height + 22 }, { 32, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26398), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 34, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26402), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 32, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre,
PaintSegment::topRightSide, PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26391), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26395), { 0, 0, height + 24 },
{ { 16, 0, height + 22 }, { 16, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26399), { 0, 0, height + 24 },
{ { 4, 4, height + 22 }, { 28, 28, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26403), { 0, 0, height + 24 },
{ { 0, 16, height + 22 }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 4:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26392), { 0, 0, height + 24 },
{ { 16, 0, height + 22 }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26396), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 16, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26400), { 0, 0, height + 24 },
{ { 0, 16, height + 22 }, { 16, 18, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26404), { 0, 0, height + 24 },
{ { 16, 16, height + 22 }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide, PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height + 36,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height + 36,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height + 36,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height + 36,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
}
/** rct2: 0x007930D8 */
static void MultiDimensionRCTrackLeftEighthToOrthogonal(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
trackSequence = mapLeftEighthTurnToOrthogonal[trackSequence];
MultiDimensionRCTrackRightEighthToDiag(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
}
/** rct2: 0x007930E8 */
static void MultiDimensionRCTrackRightEighthToOrthogonal(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
trackSequence = mapLeftEighthTurnToOrthogonal[trackSequence];
MultiDimensionRCTrackLeftEighthToDiag(session, ride, trackSequence, (direction + 3) & 3, height, trackElement);
}
/** rct2: 0x007930F8 */
static void MultiDimensionRCTrackLeftEighthBankToDiag(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16028), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16032), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16036), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16040), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16029), { 0, 0, height },
{ { 0, 0, height }, { 32, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16033), { 0, 0, height },
{ { 0, 0, height + 27 }, { 34, 16, 0 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16037), { 0, 0, height },
{ { 0, 16, height }, { 32, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16041), { 0, 0, height },
{ { 0, 16, height }, { 32, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16030), { 0, 0, height },
{ { 0, 16, height }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16034), { 0, 0, height },
{ { 16, 16, height + 27 }, { 16, 16, 0 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16038), { 0, 0, height },
{ { 16, 0, height }, { 16, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16042), { 0, 0, height },
{ { 0, 0, height }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre,
PaintSegment::topRightSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 4:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16031), { 0, 0, height },
{ { 16, 16, height }, { 16, 16, 3 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16035), { 0, 0, height },
{ { 0, 16, height + 27 }, { 16, 18, 0 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height,
session.SupportColours);
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16039), { 0, 0, height },
{ { 0, 0, height }, { 16, 16, 3 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height,
session.SupportColours);
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16043), { 0, 0, height },
{ { 16, 0, height }, { 16, 16, 3 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height,
session.SupportColours);
break;
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26437), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26441), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26445), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26449), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::centre, PaintSegment::topRightSide, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36,
session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26438), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 32, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26442), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 34, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26446), { 0, 0, height + 24 },
{ { 0, 16, height + 22 }, { 32, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26450), { 0, 0, height + 24 },
{ { 0, 16, height + 22 }, { 32, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26439), { 0, 0, height + 24 },
{ { 0, 16, height + 22 }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26443), { 0, 0, height + 24 },
{ { 16, 16, height + 22 }, { 16, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26447), { 0, 0, height + 24 },
{ { 16, 0, height + 22 }, { 16, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26451), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre,
PaintSegment::topRightSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 4:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26440), { 0, 0, height + 24 },
{ { 16, 16, height + 22 }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26444), { 0, 0, height + 24 },
{ { 0, 16, height + 22 }, { 16, 18, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26448), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 16, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26452), { 0, 0, height + 24 },
{ { 16, 0, height + 22 }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre,
PaintSegment::topLeftSide, PaintSegment::topRightSide, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height + 36,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height + 36,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height + 36,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height + 36,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
}
/** rct2: 0x00793108 */
static void MultiDimensionRCTrackRightEighthBankToDiag(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16012), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16016), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16020), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16024), { 0, 0, height },
{ { 0, 27, height }, { 32, 1, 26 } });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16013), { 0, 0, height },
{ { 0, 0, height }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16017), { 0, 0, height },
{ { 0, 16, height }, { 32, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16021), { 0, 0, height },
{ { 0, 0, height + 27 }, { 34, 16, 0 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16025), { 0, 0, height },
{ { 0, 0, height }, { 32, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16014), { 0, 0, height },
{ { 0, 0, height }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16018), { 0, 0, height },
{ { 16, 0, height }, { 16, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16022), { 0, 0, height },
{ { 4, 4, height + 27 }, { 28, 28, 0 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16026), { 0, 0, height },
{ { 0, 16, height }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 4:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16015), { 0, 0, height },
{ { 16, 0, height }, { 16, 16, 3 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16019), { 0, 0, height },
{ { 0, 0, height }, { 16, 16, 3 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height,
session.SupportColours);
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16023), { 0, 0, height },
{ { 0, 16, height + 27 }, { 16, 18, 0 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height,
session.SupportColours);
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16027), { 0, 0, height },
{ { 16, 16, height }, { 16, 16, 3 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height,
session.SupportColours);
break;
}
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26421), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26425), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26429), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26433), { 0, 0, height + 24 },
{ { 0, 6, height + 22 }, { 32, 20, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36,
session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26422), { 0, 0, height + 24 },
{ { 0, 16, height + 22 }, { 32, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26426), { 0, 0, height + 24 },
{ { 0, 16, height + 22 }, { 32, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26430), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 34, 16, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26434), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 32, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre,
PaintSegment::topRightSide, PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26423), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26427), { 0, 0, height + 24 },
{ { 16, 0, height + 22 }, { 16, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26431), { 0, 0, height + 24 },
{ { 4, 4, height + 22 }, { 28, 28, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26435), { 0, 0, height + 24 },
{ { 0, 16, height + 22 }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 4:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26424), { 0, 0, height + 24 },
{ { 16, 0, height + 22 }, { 16, 16, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26428), { 0, 0, height + 24 },
{ { 0, 0, height + 22 }, { 16, 16, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26432), { 0, 0, height + 24 },
{ { 0, 16, height + 22 }, { 16, 18, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26436), { 0, 0, height + 24 },
{ { 16, 16, height + 22 }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide, PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height + 36,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height + 36,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height + 36,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height + 36,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
}
/** rct2: 0x00793118 */
static void MultiDimensionRCTrackLeftEighthBankToOrthogonal(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
trackSequence = mapLeftEighthTurnToOrthogonal[trackSequence];
MultiDimensionRCTrackRightEighthBankToDiag(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
}
/** rct2: 0x00793128 */
static void MultiDimensionRCTrackRightEighthBankToOrthogonal(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
trackSequence = mapLeftEighthTurnToOrthogonal[trackSequence];
MultiDimensionRCTrackLeftEighthBankToDiag(session, ride, trackSequence, (direction + 3) & 3, height, trackElement);
}
/** rct2: 0x007930A8 */
static void MultiDimensionRCTrackDiagFlat(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
if (trackElement.HasChain())
{
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16109), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16047), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
if (trackElement.HasChain())
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16106), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16044), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
if (trackElement.HasChain())
{
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16108), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16046), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
if (trackElement.HasChain())
{
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16107), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height,
session.SupportColours);
break;
}
}
else
{
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16045), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height,
session.SupportColours);
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
if (trackElement.HasChain())
{
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26484), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26456), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
if (trackElement.HasChain())
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26481), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26453), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
if (trackElement.HasChain())
{
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26483), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26455), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
if (trackElement.HasChain())
{
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26482), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26454), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height + 36,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height + 36,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height + 36,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height + 36,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
}
static void MultiDimensionRCTrackDiagBrakes(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
int32_t blockedSegments = kDiagBlockedSegments[trackSequence];
if (trackElement.IsInverted())
{
TrackPaintUtilDiagTilesPaint(
session, -3, height + 24, direction, trackSequence, session.TrackColours, MultidimDiagBrakeImages[1],
defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr);
PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
if (trackSequence == 3)
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, DiagSupportPlacement[direction], 0, height + 36,
session.SupportColours);
}
}
else
{
TrackPaintUtilDiagTilesPaint(
session, 3, height, direction, trackSequence, session.TrackColours, MultidimDiagBrakeImages[0],
defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr);
if (trackSequence == 3)
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, DiagSupportPlacement[direction], 0, height, session.SupportColours);
}
PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
}
}
static void MultiDimensionRCTrackDiagBlockBrakes(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
int32_t blockedSegments = kDiagBlockedSegments[trackSequence];
if (trackElement.IsInverted())
{
TrackPaintUtilDiagTilesPaint(
session, -3, height + 24, direction, trackSequence, session.TrackColours,
MultidimDiagBlockBrakeImages[1][trackElement.IsBrakeClosed()], defaultDiagTileOffsets, defaultDiagBoundLengths,
nullptr);
PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
if (trackSequence == 3)
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, DiagSupportPlacement[direction], 0, height + 36,
session.SupportColours);
}
}
else
{
TrackPaintUtilDiagTilesPaint(
session, 3, height, direction, trackSequence, session.TrackColours,
MultidimDiagBlockBrakeImages[0][trackElement.IsBrakeClosed()], defaultDiagTileOffsets, defaultDiagBoundLengths,
nullptr);
if (trackSequence == 3)
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, DiagSupportPlacement[direction], 0, height, session.SupportColours);
}
PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
}
}
/** rct2: 0x00793158 */
static void MultiDimensionRCTrackDiag25DegUp(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
if (trackElement.HasChain())
{
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16121), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16059), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 1:
if (trackElement.HasChain())
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16118), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16056), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 2:
if (trackElement.HasChain())
{
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16120), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16058), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 3:
if (trackElement.HasChain())
{
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 8, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16119), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 8, height,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 8, height,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 8, height,
session.SupportColours);
break;
}
}
else
{
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 8, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16057), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 8, height,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 8, height,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 8, height,
session.SupportColours);
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
if (trackElement.HasChain())
{
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26496), { -16, -16, height + 24 },
{ { -16, -16, height + 40 }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26468), { -16, -16, height + 24 },
{ { -16, -16, height + 40 }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 1:
if (trackElement.HasChain())
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26493), { -16, -16, height + 24 },
{ { -16, -16, height + 40 }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26465), { -16, -16, height + 24 },
{ { -16, -16, height + 40 }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 2:
if (trackElement.HasChain())
{
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26495), { -16, -16, height + 24 },
{ { -16, -16, height + 40 }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26467), { -16, -16, height + 24 },
{ { -16, -16, height + 40 }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 3:
if (trackElement.HasChain())
{
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26494), { -16, -16, height + 24 },
{ { -16, -16, height + 40 }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26466), { -16, -16, height + 24 },
{ { -16, -16, height + 40 }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height + 48,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height + 48,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height + 48,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height + 48,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
}
}
}
/** rct2: 0x007931B8 */
static void MultiDimensionRCTrackDiag60DegUp(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16071), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 104, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16068), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 104, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16070), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 104, 0x20);
break;
case 3:
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 32, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16069), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 36, height,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 32, height,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 36, height,
session.SupportColours);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 104, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26480), { -16, -16, height + 24 },
{ { -16, -16, height + 88 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 104, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26477), { -16, -16, height + 24 },
{ { -16, -16, height + 88 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 104, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26479), { -16, -16, height + 24 },
{ { -16, -16, height + 88 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 104, 0x20);
break;
case 3:
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26478), { -16, -16, height + 24 },
{ { -16, -16, height + 24 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 32, height + 36,
session.SupportColours);
break;
case 1:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 36, height + 36,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 32, height + 36,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 36, height + 36,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 104, 0x20);
break;
}
}
}
/** rct2: 0x00793138 */
static void MultiDimensionRCTrackDiagFlatTo25DegUp(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
if (trackElement.HasChain())
{
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16113), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16051), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 1:
if (trackElement.HasChain())
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16110), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16048), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 2:
if (trackElement.HasChain())
{
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16112), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16050), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 3:
if (trackElement.HasChain())
{
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16111), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height,
session.SupportColours);
break;
}
}
else
{
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16049), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height,
session.SupportColours);
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
if (trackElement.HasChain())
{
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26488), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26460), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 1:
if (trackElement.HasChain())
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26485), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26457), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 2:
if (trackElement.HasChain())
{
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26487), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26459), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 3:
if (trackElement.HasChain())
{
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26486), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26458), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height + 40,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height + 40,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height + 40,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height + 40,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
}
}
}
/** rct2: 0x00793198 */
static void MultiDimensionRCTrackDiag25DegUpTo60DegUp(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16063), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16060), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16062), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
case 3:
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 16, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16061), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 16, height,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 16, height,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 16, height,
session.SupportColours);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26472), { -16, -16, height + 24 },
{ { -16, -16, height + 56 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26469), { -16, -16, height + 24 },
{ { -16, -16, height + 56 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26471), { -16, -16, height + 24 },
{ { -16, -16, height + 56 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
case 3:
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26470), { -16, -16, height + 24 },
{ { -16, -16, height + 56 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 16, height + 36,
session.SupportColours);
break;
case 1:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 16, height + 36,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 16, height + 36,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 16, height + 36,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
}
}
}
/** rct2: 0x007931A8 */
static void MultiDimensionRCTrackDiag60DegUpTo25DegUp(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16067), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16064), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16066), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
case 3:
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 21, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16065), { -16, -16, height },
{ { 0, 0, height }, { 16, 16, 3 } });
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 21, height,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 21, height,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 21, height,
session.SupportColours);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26476), { -16, -16, height + 24 },
{ { -16, -16, height + 56 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26473), { -16, -16, height + 24 },
{ { -16, -16, height + 56 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26475), { -16, -16, height + 24 },
{ { -16, -16, height + 56 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
case 3:
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26474), { -16, -16, height + 24 },
{ { 0, 0, height + 56 }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 21, height + 36,
session.SupportColours);
break;
case 1:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 21, height + 36,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 21, height + 36,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 21, height + 36,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
}
}
}
/** rct2: 0x00793148 */
static void MultiDimensionRCTrackDiag25DegUpToFlat(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
if (trackElement.HasChain())
{
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16117), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16055), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 1:
if (trackElement.HasChain())
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16114), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16052), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 2:
if (trackElement.HasChain())
{
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16116), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16054), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 3:
if (trackElement.HasChain())
{
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 4, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16115), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 4, height,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 4, height,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 4, height,
session.SupportColours);
break;
}
}
else
{
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 4, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16053), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 4, height,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 4, height,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 4, height,
session.SupportColours);
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
if (trackElement.HasChain())
{
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26492), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26464), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 1:
if (trackElement.HasChain())
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26489), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26461), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 2:
if (trackElement.HasChain())
{
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26491), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26463), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 3:
if (trackElement.HasChain())
{
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26490), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26462), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height + 42,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height + 42,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height + 42,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height + 42,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
}
}
}
/** rct2: 0x00793188 */
static void MultiDimensionRCTrackDiag25DegDown(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
if (trackElement.HasChain())
{
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16119), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16057), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 1:
if (trackElement.HasChain())
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16120), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16058), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 2:
if (trackElement.HasChain())
{
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16118), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16056), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 3:
if (trackElement.HasChain())
{
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 8, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16121), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 8, height,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 8, height,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 8, height,
session.SupportColours);
break;
}
}
else
{
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 8, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16059), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 8, height,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 8, height,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 8, height,
session.SupportColours);
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26466), { -16, -16, height + 24 },
{ { -16, -16, height + 40 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26467), { -16, -16, height + 24 },
{ { -16, -16, height + 40 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26465), { -16, -16, height + 24 },
{ { -16, -16, height + 40 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 3:
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26468), { -16, -16, height + 24 },
{ { -16, -16, height + 40 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height + 48,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height + 48,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height + 48,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height + 48,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
}
}
}
/** rct2: 0x007931E8 */
static void MultiDimensionRCTrackDiag60DegDown(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16069), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 104, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16070), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 104, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16068), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 104, 0x20);
break;
case 3:
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 24, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16071), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 28, height,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 24, height,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 28, height,
session.SupportColours);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 104, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26478), { -16, -16, height + 24 },
{ { -16, -16, height + 24 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 104, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26479), { -16, -16, height + 24 },
{ { -16, -16, height + 88 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 104, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26477), { -16, -16, height + 24 },
{ { -16, -16, height + 88 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 104, 0x20);
break;
case 3:
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26480), { -16, -16, height + 24 },
{ { -16, -16, height + 88 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 24, height + 36,
session.SupportColours);
break;
case 1:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 28, height + 36,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 24, height + 36,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 28, height + 36,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 104, 0x20);
break;
}
}
}
/** rct2: 0x00793168 */
static void MultiDimensionRCTrackDiagFlatTo25DegDown(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
if (trackElement.HasChain())
{
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16115), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16053), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
break;
case 1:
if (trackElement.HasChain())
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16116), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16054), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
break;
case 2:
if (trackElement.HasChain())
{
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16114), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16052), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
break;
case 3:
if (trackElement.HasChain())
{
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 4, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16117), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 4, height,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 4, height,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 4, height,
session.SupportColours);
break;
}
}
else
{
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 4, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16055), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 4, height,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 4, height,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 4, height,
session.SupportColours);
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26462), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26463), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26461), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 3:
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26464), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height + 42,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height + 42,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height + 42,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height + 42,
session.SupportColours);
break;
}
break;
}
}
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
}
/** rct2: 0x007931C8 */
static void MultiDimensionRCTrackDiag25DegDownTo60DegDown(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16065), { -16, -16, height },
{ { 0, 0, height }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16066), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16064), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
case 3:
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 17, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16067), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 17, height,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 17, height,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 17, height,
session.SupportColours);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26474), { -16, -16, height + 24 },
{ { 0, 0, height + 56 }, { 16, 16, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26475), { -16, -16, height + 24 },
{ { -16, -16, height + 56 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26473), { -16, -16, height + 24 },
{ { -16, -16, height + 56 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
case 3:
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26476), { -16, -16, height + 24 },
{ { -16, -16, height + 56 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 17, height + 36,
session.SupportColours);
break;
case 1:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 17, height + 36,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 17, height + 36,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 17, height + 36,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
}
}
}
/** rct2: 0x007931D8 */
static void MultiDimensionRCTrackDiag60DegDownTo25DegDown(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16061), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16062), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16060), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
case 3:
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 8, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16063), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 8, height,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 8, height,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 8, height,
session.SupportColours);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26470), { -16, -16, height + 24 },
{ { -16, -16, height + 56 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26471), { -16, -16, height + 24 },
{ { -16, -16, height + 56 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26469), { -16, -16, height + 24 },
{ { -16, -16, height + 56 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
case 3:
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26472), { -16, -16, height + 24 },
{ { -16, -16, height + 56 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 8, height + 36,
session.SupportColours);
break;
case 1:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 8, height + 36,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 8, height + 36,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 8, height + 36,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
}
}
}
/** rct2: 0x00793178 */
static void MultiDimensionRCTrackDiag25DegDownToFlat(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
if (trackElement.HasChain())
{
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16111), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16049), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 1:
if (trackElement.HasChain())
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16112), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16050), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 2:
if (trackElement.HasChain())
{
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16110), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
else
{
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16048), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 3:
if (trackElement.HasChain())
{
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16113), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height,
session.SupportColours);
break;
}
}
else
{
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16051), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height,
session.SupportColours);
break;
}
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26458), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26459), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26457), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 3:
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26460), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height + 40,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height + 40,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height + 40,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height + 40,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
}
}
}
/** rct2: 0x00793218 */
static void MultiDimensionRCTrackDiagFlatToLeftBank(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16079), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16076), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16080), { -16, -16, height },
{ { -16, -16, height + 27 }, { 32, 32, 0 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16078), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16077), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height,
session.SupportColours);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26504), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26501), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26503), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26502), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::bottomCorner, PaintSegment::centre,
PaintSegment::topLeftSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height + 36,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height + 36,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height + 36,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height + 36,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
}
/** rct2: 0x00793228 */
static void MultiDimensionRCTrackDiagFlatToRightBank(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16084), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16081), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16083), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16085), { -16, -16, height },
{ { -16, -16, height + 27 }, { 32, 32, 0 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16082), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height,
session.SupportColours);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26508), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26505), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26507), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26506), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height + 36,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height + 36,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height + 36,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height + 36,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
}
/** rct2: 0x00793238 */
static void MultiDimensionRCTrackDiagLeftBankToFlat(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16082), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16083), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16085), { -16, -16, height },
{ { -16, -16, height + 27 }, { 32, 32, 0 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16081), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16084), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height,
session.SupportColours);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26506), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26507), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26505), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26508), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::bottomCorner, PaintSegment::centre,
PaintSegment::topLeftSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height + 36,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height + 36,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height + 36,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height + 36,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
}
/** rct2: 0x00793248 */
static void MultiDimensionRCTrackDiagRightBankToFlat(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16077), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16078), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16076), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16080), { -16, -16, height },
{ { -16, -16, height + 27 }, { 32, 32, 0 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16079), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height,
session.SupportColours);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26502), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26503), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26501), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26504), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height + 36,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height + 36,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height + 36,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height + 36,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
}
/** rct2: 0x00793278 */
static void MultiDimensionRCTrackDiagLeftBankTo25DegUp(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16099), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16096), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16100), { -16, -16, height },
{ { -16, -16, height + 35 }, { 32, 32, 0 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16098), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 3:
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16097), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height,
session.SupportColours);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26520), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26517), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26519), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 3:
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26518), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height + 40,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height + 40,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height + 40,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height + 40,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
}
}
}
/** rct2: 0x00793288 */
static void MultiDimensionRCTrackDiagRightBankTo25DegUp(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16104), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16101), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16103), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16105), { -16, -16, height },
{ { -16, -16, height + 35 }, { 32, 32, 0 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 3:
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16102), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height,
session.SupportColours);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26524), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26521), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26523), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 3:
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26522), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height + 40,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height + 40,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height + 40,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height + 40,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
}
}
}
/** rct2: 0x00793258 */
static void MultiDimensionRCTrackDiag25DegUpToLeftBank(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16089), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16086), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16090), { -16, -16, height },
{ { -16, -16, height + 35 }, { 32, 32, 0 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16088), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 3:
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 4, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16087), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 4, height,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 4, height,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 4, height,
session.SupportColours);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26512), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26509), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26511), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 3:
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26510), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height + 42,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height + 42,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height + 42,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height + 42,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
}
}
}
/** rct2: 0x00793268 */
static void MultiDimensionRCTrackDiag25DegUpToRightBank(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16094), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16091), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16093), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16095), { -16, -16, height },
{ { -16, -16, height + 35 }, { 32, 32, 0 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 3:
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 4, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16092), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 4, height,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 4, height,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 4, height,
session.SupportColours);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26516), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26513), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26515), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
case 3:
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26514), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height + 42,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height + 42,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height + 42,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height + 42,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
break;
}
}
}
/** rct2: 0x00793298 */
static void MultiDimensionRCTrackDiagLeftBankTo25DegDown(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16092), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16093), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16095), { -16, -16, height },
{ { -16, -16, height + 35 }, { 32, 32, 0 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16091), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
break;
case 3:
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 4, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16094), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 4, height,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 4, height,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 4, height,
session.SupportColours);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26514), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26515), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26513), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
break;
case 3:
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26516), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height + 42,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height + 42,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height + 42,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height + 42,
session.SupportColours);
break;
}
break;
}
}
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
}
/** rct2: 0x007932A8 */
static void MultiDimensionRCTrackDiagRightBankTo25DegDown(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16087), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16088), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16086), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16090), { -16, -16, height },
{ { -16, -16, height + 35 }, { 32, 32, 0 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
break;
case 3:
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 4, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16089), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 4, height,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 4, height,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 4, height,
session.SupportColours);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26510), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26511), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26509), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
break;
case 3:
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26512), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height + 42,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height + 42,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height + 42,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height + 42,
session.SupportColours);
break;
}
break;
}
}
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
}
/** rct2: 0x007932B8 */
static void MultiDimensionRCTrackDiag25DegDownToLeftBank(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16102), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16103), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16105), { -16, -16, height },
{ { -16, -16, height + 35 }, { 32, 32, 0 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16101), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 3:
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16104), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height,
session.SupportColours);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26522), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26523), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26521), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 3:
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26524), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height + 40,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height + 40,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height + 40,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height + 40,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
}
}
}
/** rct2: 0x007932C8 */
static void MultiDimensionRCTrackDiag25DegDownToRightBank(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16097), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16098), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16096), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16100), { -16, -16, height },
{ { -16, -16, height + 35 }, { 32, 32, 0 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 3:
switch (direction)
{
case 0:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16099), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height,
session.SupportColours);
break;
case 2:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height,
session.SupportColours);
break;
case 3:
MetalBSupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height,
session.SupportColours);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26518), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26519), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26517), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 3:
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26520), { -16, -16, height + 24 },
{ { -16, -16, height + 32 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height + 40,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height + 40,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height + 40,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height + 40,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
}
}
}
/** rct2: 0x007931F8 */
static void MultiDimensionRCTrackDiagLeftBank(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16075), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16072), { -16, -16, height },
{ { -16, -16, height + 27 }, { 32, 32, 0 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16074), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16073), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height,
session.SupportColours);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26500), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26497), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26499), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26498), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::bottomCorner, PaintSegment::centre,
PaintSegment::topLeftSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height + 36,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height + 36,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height + 36,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height + 36,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
}
/** rct2: 0x00793208 */
static void MultiDimensionRCTrackDiagRightBank(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16073), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16074), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16072), { -16, -16, height },
{ { -16, -16, height + 27 }, { 32, 32, 0 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height,
session.SupportColours);
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16075), { -16, -16, height },
{ { -16, -16, height }, { 32, 32, 3 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height,
session.SupportColours);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26498), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26499), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26497), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide,
PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 3:
switch (direction)
{
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26500), { -16, -16, height + 24 },
{ { -16, -16, height + 22 }, { 32, 32, 3 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
switch (direction)
{
case 0:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::LeftCorner, 0, height + 36,
session.SupportColours);
break;
case 1:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::TopCorner, 0, height + 36,
session.SupportColours);
break;
case 2:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::RightCorner, 0, height + 36,
session.SupportColours);
break;
case 3:
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::BottomCorner, 0, height + 36,
session.SupportColours);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
}
/** rct2: 0x007932D8 */
static void MultiDimensionRCTrackLeftFlyerTwistUp(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26368), { 0, 6, height }, { 32, 20, 3 });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26374), { 0, 6, height }, { 32, 20, 3 });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26367), { 0, 6, height }, { 32, 20, 3 });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26373), { 0, 6, height }, { 32, 20, 3 });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26369), { 0, 6, height + 24 },
{ { 0, 6, height + 24 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26375), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26366), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26372), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26370), { 0, 6, height + 24 },
{ { 0, 6, height + 24 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26376), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26365), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26371), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36, session.SupportColours);
switch (direction)
{
case 1:
PaintUtilPushTunnelRight(session, height, TUNNEL_SQUARE_FLAT);
break;
case 2:
PaintUtilPushTunnelLeft(session, height, TUNNEL_SQUARE_FLAT);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
/** rct2: 0x007932E8 */
static void MultiDimensionRCTrackRightFlyerTwistUp(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26380), { 0, 6, height }, { 32, 20, 3 });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26386), { 0, 6, height }, { 32, 20, 3 });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26379), { 0, 6, height }, { 32, 20, 3 });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26385), { 0, 6, height }, { 32, 20, 3 });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26381), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26387), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26378), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26384), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26382), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26388), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26377), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26383), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36, session.SupportColours);
switch (direction)
{
case 1:
PaintUtilPushTunnelRight(session, height, TUNNEL_SQUARE_FLAT);
break;
case 2:
PaintUtilPushTunnelLeft(session, height, TUNNEL_SQUARE_FLAT);
break;
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
/** rct2: 0x007932F8 */
static void MultiDimensionRCTrackLeftFlyerTwistDown(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26365), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26371), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26370), { 0, 6, height + 24 },
{ { 0, 6, height + 24 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26376), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36, session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26366), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26372), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26369), { 0, 6, height + 24 },
{ { 0, 6, height + 24 }, { 32, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26375), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26367), { 0, 6, height }, { 32, 20, 3 });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26373), { 0, 6, height }, { 32, 20, 3 });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26368), { 0, 6, height }, { 32, 20, 3 });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26374), { 0, 6, height }, { 32, 20, 3 });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
switch (direction)
{
case 1:
PaintUtilPushTunnelRight(session, height, TUNNEL_SQUARE_FLAT);
break;
case 2:
PaintUtilPushTunnelLeft(session, height, TUNNEL_SQUARE_FLAT);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide,
PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
/** rct2: 0x00793308 */
static void MultiDimensionRCTrackRightFlyerTwistDown(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26377), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26383), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26382), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26388), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36, session.SupportColours);
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26378), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26384), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26381), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26387), { 0, 6, height + 24 }, { 32, 20, 3 });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26379), { 0, 6, height }, { 32, 20, 3 });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26385), { 0, 6, height }, { 32, 20, 3 });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26380), { 0, 6, height }, { 32, 20, 3 });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26386), { 0, 6, height }, { 32, 20, 3 });
break;
}
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
switch (direction)
{
case 1:
PaintUtilPushTunnelRight(session, height, TUNNEL_SQUARE_FLAT);
break;
case 2:
PaintUtilPushTunnelLeft(session, height, TUNNEL_SQUARE_FLAT);
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(
PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide,
PaintSegment::topRightSide, PaintSegment::bottomLeftSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
/** rct2: 0x00793398 */
static void MultiDimensionRCTrackMultidimInvertedFlatTo90DegQuarterLoopDown(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26539), { 0, 0, height + 16 },
{ { 0, 6, height + 16 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26542), { 0, 0, height + 16 },
{ { 0, 6, height + 18 }, { 2, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26545), { 0, 0, height + 16 },
{ { 0, 6, height + 18 }, { 2, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26548), { 0, 0, height + 16 },
{ { 0, 6, height + 16 }, { 32, 20, 3 } });
break;
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height + 32, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 64, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26538), { 0, 0, height + 16 },
{ { 24, 6, height + 16 }, { 2, 20, 31 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26541), { 0, 0, height + 16 },
{ { 0, 6, height + 18 }, { 2, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26544), { 0, 0, height + 16 },
{ { 0, 6, height + 18 }, { 2, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26547), { 0, 0, height + 16 },
{ { 24, 6, height + 16 }, { 2, 20, 31 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 80, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26537), { 0, 0, height + 16 },
{ { 28, 6, height + 24 }, { 2, 20, 31 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26540), { 0, 0, height + 16 },
{ { 0, 6, height + 24 }, { 2, 20, 31 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26543), { 0, 0, height + 16 },
{ { 0, 6, height + 24 }, { 2, 20, 31 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26546), { 0, 0, height + 16 },
{ { 29, 6, height + 24 }, { 2, 20, 31 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 104, 0x20);
break;
case 3:
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16208), { 0, 0, height },
{ { 0, 6, height + 24 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16211), { 0, 0, height },
{ { 24, 6, height + 8 }, { 2, 20, 31 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16214), { 0, 0, height },
{ { 24, 6, height + 8 }, { 2, 20, 31 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16217), { 0, 0, height },
{ { 0, 6, height + 24 }, { 32, 20, 3 } });
break;
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height + 16, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16207), { 0, 0, height },
{ { -8, 6, height }, { 2, 20, 31 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16210), { 0, 0, height },
{ { 24, 6, height + 8 }, { 2, 20, 63 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16213), { 0, 0, height },
{ { 24, 6, height + 8 }, { 2, 20, 63 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16216), { 0, 0, height },
{ { -8, 6, height }, { 2, 20, 31 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 64, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16206), { 0, 0, height },
{ { 4, 6, height + 8 }, { 2, 20, 31 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16209), { 0, 0, height },
{ { 24, 6, height + 8 }, { 2, 20, 31 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16212), { 0, 0, height },
{ { 24, 6, height + 8 }, { 2, 20, 31 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16215), { 0, 0, height },
{ { 4, 6, height + 8 }, { 2, 20, 31 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 88, 0x20);
break;
case 3:
break;
}
}
}
/** rct2: 0x00793318 */
static void MultiDimensionRCTrackBlockBrakes(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
bool isClosed = trackElement.IsBrakeClosed();
if (!trackElement.IsInverted())
{
static constexpr uint32_t imageIds[NumOrthogonalDirections][2] = {
{ MULTI_DIM_NON_INVERTED_BLOCK_BRAKE_SW_NE_OPEN, MULTI_DIM_NON_INVERTED_BLOCK_BRAKE_SW_NE_CLOSED },
{ MULTI_DIM_NON_INVERTED_BLOCK_BRAKE_NW_SE_OPEN, MULTI_DIM_NON_INVERTED_BLOCK_BRAKE_NW_SE_CLOSED },
{ MULTI_DIM_NON_INVERTED_BLOCK_BRAKE_SW_NE_OPEN, MULTI_DIM_NON_INVERTED_BLOCK_BRAKE_SW_NE_CLOSED },
{ MULTI_DIM_NON_INVERTED_BLOCK_BRAKE_NW_SE_OPEN, MULTI_DIM_NON_INVERTED_BLOCK_BRAKE_NW_SE_CLOSED },
};
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(imageIds[direction][isClosed]), { 0, 0, height },
{ { 0, 6, height }, { 32, 20, 3 } });
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height, session.SupportColours);
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
}
else
{
static constexpr uint32_t imageIds[NumOrthogonalDirections][2] = {
{ MULTI_DIM_INVERTED_BLOCK_BRAKE_SW_NE_OPEN, MULTI_DIM_INVERTED_BLOCK_BRAKE_SW_NE_CLOSED },
{ MULTI_DIM_INVERTED_BLOCK_BRAKE_NW_SE_OPEN, MULTI_DIM_INVERTED_BLOCK_BRAKE_NW_SE_CLOSED },
{ MULTI_DIM_INVERTED_BLOCK_BRAKE_SW_NE_OPEN, MULTI_DIM_INVERTED_BLOCK_BRAKE_SW_NE_CLOSED },
{ MULTI_DIM_INVERTED_BLOCK_BRAKE_NW_SE_OPEN, MULTI_DIM_INVERTED_BLOCK_BRAKE_NW_SE_CLOSED },
};
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(imageIds[direction][isClosed]), { 0, 0, height + 24 },
{ { 0, 6, height + 24 }, { 32, 20, 3 } });
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topRightSide, PaintSegment::bottomLeftSide), direction),
0xFFFF, 0);
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
{
MetalASupportsPaintSetup(
session, MetalSupportType::TubesInverted, MetalSupportPlace::Centre, 0, height + 36, session.SupportColours);
}
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
}
}
/** rct2: 0x00793388 */
static void MultiDimensionRCTrackMultidim90DegUpToInvertedFlatQuarterLoop(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16206), { 0, 0, height },
{ { 4, 6, height + 8 }, { 2, 20, 31 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16209), { 0, 0, height },
{ { 24, 6, height + 8 }, { 2, 20, 31 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16212), { 0, 0, height },
{ { 24, 6, height + 8 }, { 2, 20, 31 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16215), { 0, 0, height },
{ { 4, 6, height + 8 }, { 2, 20, 31 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 88, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16207), { 0, 0, height },
{ { -8, 6, height }, { 2, 20, 31 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16210), { 0, 0, height },
{ { 24, 6, height + 8 }, { 2, 20, 63 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16213), { 0, 0, height },
{ { 24, 6, height + 8 }, { 2, 20, 63 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16216), { 0, 0, height },
{ { -8, 6, height }, { 2, 20, 31 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 64, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16208), { 0, 0, height },
{ { 0, 6, height + 24 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16211), { 0, 0, height },
{ { 24, 6, height + 8 }, { 2, 20, 31 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16214), { 0, 0, height },
{ { 24, 6, height + 8 }, { 2, 20, 31 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16217), { 0, 0, height },
{ { 0, 6, height + 24 }, { 32, 20, 3 } });
break;
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height + 16, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26537), { 0, 0, height - 16 },
{ { 28, 6, height - 8 }, { 2, 20, 31 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26540), { 0, 0, height - 16 },
{ { 0, 6, height - 8 }, { 2, 20, 31 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26543), { 0, 0, height - 16 },
{ { 0, 6, height - 8 }, { 2, 20, 31 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26546), { 0, 0, height - 16 },
{ { 28, 6, height - 8 }, { 2, 20, 31 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26538), { 0, 0, height - 16 },
{ { 24, 6, height - 16 }, { 2, 20, 31 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26541), { 0, 0, height - 16 },
{ { 0, 6, height - 8 }, { 2, 20, 63 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26544), { 0, 0, height - 16 },
{ { 0, 6, height - 8 }, { 2, 20, 63 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26547), { 0, 0, height - 16 },
{ { 24, 6, height - 16 }, { 2, 20, 31 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26539), { 0, 0, height - 16 },
{ { 0, 6, height - 16 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26542), { 0, 0, height - 16 },
{ { 0, 6, height - 8 }, { 2, 20, 31 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26545), { 0, 0, height - 16 },
{ { 0, 6, height - 8 }, { 2, 20, 31 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26548), { 0, 0, height - 16 },
{ { 0, 6, height - 16 }, { 32, 20, 3 } });
break;
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
}
/** rct2: 0x00793398 */
static void MultiDimensionRCTrackMultidimFlatTo90DegDownQuarterLoop(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26539), { 0, 0, height + 16 },
{ { 0, 6, height + 16 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26542), { 0, 0, height + 16 },
{ { 0, 6, height + 18 }, { 2, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26545), { 0, 0, height + 16 },
{ { 0, 6, height + 18 }, { 2, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26548), { 0, 0, height + 16 },
{ { 0, 6, height + 16 }, { 32, 20, 3 } });
break;
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height + 32, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 64, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26538), { 0, 0, height + 16 },
{ { 24, 6, height + 16 }, { 2, 20, 31 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26541), { 0, 0, height + 16 },
{ { 0, 6, height + 18 }, { 2, 20, 3 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26544), { 0, 0, height + 16 },
{ { 0, 6, height + 18 }, { 2, 20, 3 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26547), { 0, 0, height + 16 },
{ { 24, 6, height + 16 }, { 2, 20, 31 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 80, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26537), { 0, 0, height + 16 },
{ { 28, 6, height + 24 }, { 2, 20, 31 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26540), { 0, 0, height + 16 },
{ { 0, 6, height + 24 }, { 2, 20, 31 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26543), { 0, 0, height + 16 },
{ { 0, 6, height + 24 }, { 2, 20, 31 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26546), { 0, 0, height + 16 },
{ { 29, 6, height + 24 }, { 2, 20, 31 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 104, 0x20);
break;
case 3:
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16208), { 0, 0, height },
{ { 0, 6, height + 24 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16211), { 0, 0, height },
{ { 24, 6, height + 8 }, { 2, 20, 31 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16214), { 0, 0, height },
{ { 24, 6, height + 8 }, { 2, 20, 31 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16217), { 0, 0, height },
{ { 0, 6, height + 24 }, { 32, 20, 3 } });
break;
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height + 16, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16207), { 0, 0, height },
{ { -8, 6, height }, { 2, 20, 31 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16210), { 0, 0, height },
{ { 24, 6, height + 8 }, { 2, 20, 63 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16213), { 0, 0, height },
{ { 24, 6, height + 8 }, { 2, 20, 63 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16216), { 0, 0, height },
{ { -8, 6, height }, { 2, 20, 31 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 64, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16206), { 0, 0, height },
{ { 4, 6, height + 8 }, { 2, 20, 31 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16209), { 0, 0, height },
{ { 24, 6, height + 8 }, { 2, 20, 31 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16212), { 0, 0, height },
{ { 24, 6, height + 8 }, { 2, 20, 31 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16215), { 0, 0, height },
{ { 4, 6, height + 8 }, { 2, 20, 31 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 88, 0x20);
break;
case 3:
break;
}
}
}
/** rct2: 0x00793388 */
static void MultiDimensionRCTrackMultidimInverted90DegUpToFlatQuarterLoop(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
if (!trackElement.IsInverted())
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16206), { 0, 0, height },
{ { 4, 6, height + 8 }, { 2, 20, 31 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16209), { 0, 0, height },
{ { 24, 6, height + 8 }, { 2, 20, 31 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16212), { 0, 0, height },
{ { 24, 6, height + 8 }, { 2, 20, 31 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16215), { 0, 0, height },
{ { 4, 6, height + 8 }, { 2, 20, 31 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 88, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16207), { 0, 0, height },
{ { -8, 6, height }, { 2, 20, 31 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16210), { 0, 0, height },
{ { 24, 6, height + 8 }, { 2, 20, 63 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16213), { 0, 0, height },
{ { 24, 6, height + 8 }, { 2, 20, 63 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16216), { 0, 0, height },
{ { -8, 6, height }, { 2, 20, 31 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 64, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16208), { 0, 0, height },
{ { 0, 6, height + 24 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16211), { 0, 0, height },
{ { 24, 6, height + 8 }, { 2, 20, 31 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16214), { 0, 0, height },
{ { 24, 6, height + 8 }, { 2, 20, 31 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(16217), { 0, 0, height },
{ { 0, 6, height + 24 }, { 32, 20, 3 } });
break;
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height + 16, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
}
}
else
{
switch (trackSequence)
{
case 0:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26537), { 0, 0, height - 16 },
{ { 28, 6, height - 8 }, { 2, 20, 31 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26540), { 0, 0, height - 16 },
{ { 0, 6, height - 8 }, { 2, 20, 31 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26543), { 0, 0, height - 16 },
{ { 0, 6, height - 8 }, { 2, 20, 31 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26546), { 0, 0, height - 16 },
{ { 28, 6, height - 8 }, { 2, 20, 31 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20);
break;
case 1:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26538), { 0, 0, height - 16 },
{ { 24, 6, height - 16 }, { 2, 20, 31 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26541), { 0, 0, height - 16 },
{ { 0, 6, height - 8 }, { 2, 20, 63 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26544), { 0, 0, height - 16 },
{ { 0, 6, height - 8 }, { 2, 20, 63 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26547), { 0, 0, height - 16 },
{ { 24, 6, height - 16 }, { 2, 20, 31 } });
break;
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
break;
case 2:
switch (direction)
{
case 0:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26539), { 0, 0, height - 16 },
{ { 0, 6, height - 16 }, { 32, 20, 3 } });
break;
case 1:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26542), { 0, 0, height - 16 },
{ { 0, 6, height - 8 }, { 2, 20, 31 } });
break;
case 2:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26545), { 0, 0, height - 16 },
{ { 0, 6, height - 8 }, { 2, 20, 31 } });
break;
case 3:
PaintAddImageAsParentRotated(
session, direction, session.TrackColours.WithIndex(26548), { 0, 0, height - 16 },
{ { 0, 6, height - 16 }, { 32, 20, 3 } });
break;
}
if (direction == 0 || direction == 3)
{
PaintUtilPushTunnelRotated(session, direction, height, TUNNEL_SQUARE_FLAT);
}
PaintUtilSetSegmentSupportHeight(
session,
PaintUtilRotateSegments(
EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide),
direction),
0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
break;
}
}
}
TRACK_PAINT_FUNCTION GetTrackPaintFunctionMultiDimensionRC(int32_t trackType)
{
switch (trackType)
{
case TrackElemType::Flat:
return MultiDimensionRCTrackFlat;
case TrackElemType::EndStation:
case TrackElemType::BeginStation:
case TrackElemType::MiddleStation:
return MultiDimensionRCTrackStation;
case TrackElemType::Up25:
return MultiDimensionRCTrack25DegUp;
case TrackElemType::Up60:
return MultiDimensionRCTrack60DegUp;
case TrackElemType::FlatToUp25:
return MultiDimensionRCTrackFlatTo25DegUp;
case TrackElemType::Up25ToUp60:
return MultiDimensionRCTrack25DegUpTo60DegUp;
case TrackElemType::Up60ToUp25:
return MultiDimensionRCTrack60DegUpTo25DegUp;
case TrackElemType::Up25ToFlat:
return MultiDimensionRCTrack25DegUpToFlat;
case TrackElemType::Down25:
return MultiDimensionRCTrack25DegDown;
case TrackElemType::Down60:
return MultiDimensionRCTrack60DegDown;
case TrackElemType::FlatToDown25:
return MultiDimensionRCTrackFlatTo25DegDown;
case TrackElemType::Down25ToDown60:
return MultiDimensionRCTrack25DegDownTo60DegDown;
case TrackElemType::Down60ToDown25:
return MultiDimensionRCTrack60DegDownTo25DegDown;
case TrackElemType::Down25ToFlat:
return MultiDimensionRCTrack25DegDownToFlat;
case TrackElemType::LeftQuarterTurn5Tiles:
return MultiDimensionRCTrackLeftQuarterTurn5;
case TrackElemType::RightQuarterTurn5Tiles:
return MultiDimensionRCTrackRightQuarterTurn5;
case TrackElemType::FlatToLeftBank:
return MultiDimensionRCTrackFlatToLeftBank;
case TrackElemType::FlatToRightBank:
return MultiDimensionRCTrackFlatToRightBank;
case TrackElemType::LeftBankToFlat:
return MultiDimensionRCTrackLeftBankToFlat;
case TrackElemType::RightBankToFlat:
return MultiDimensionRCTrackRightBankToFlat;
case TrackElemType::BankedLeftQuarterTurn5Tiles:
return MultiDimensionRCTrackBankedLeftQuarterTurn5;
case TrackElemType::BankedRightQuarterTurn5Tiles:
return MultiDimensionRCTrackBankedRightQuarterTurn5;
case TrackElemType::LeftBankToUp25:
return MultiDimensionRCTrackLeftBankTo25DegUp;
case TrackElemType::RightBankToUp25:
return MultiDimensionRCTrackRightBankTo25DegUp;
case TrackElemType::Up25ToLeftBank:
return MultiDimensionRCTrack25DegUpToLeftBank;
case TrackElemType::Up25ToRightBank:
return MultiDimensionRCTrack25DegUpToRightBank;
case TrackElemType::LeftBankToDown25:
return MultiDimensionRCTrackLeftBankTo25DegDown;
case TrackElemType::RightBankToDown25:
return MultiDimensionRCTrackRightBankTo25DegDown;
case TrackElemType::Down25ToLeftBank:
return MultiDimensionRCTrack25DegDownToLeftBank;
case TrackElemType::Down25ToRightBank:
return MultiDimensionRCTrack25DegDownToRightBank;
case TrackElemType::LeftBank:
return MultiDimensionRCTrackLeftBank;
case TrackElemType::RightBank:
return MultiDimensionRCTrackRightBank;
case TrackElemType::SBendLeft:
return MultiDimensionRCTrackSBendLeft;
case TrackElemType::SBendRight:
return MultiDimensionRCTrackSBendRight;
case TrackElemType::LeftQuarterTurn3Tiles:
return MultiDimensionRCTrackLeftQuarterTurn3;
case TrackElemType::RightQuarterTurn3Tiles:
return MultiDimensionRCTrackRightQuarterTurn3;
case TrackElemType::LeftBankedQuarterTurn3Tiles:
return MultiDimensionRCTrackLeftQuarterTurn3Bank;
case TrackElemType::RightBankedQuarterTurn3Tiles:
return MultiDimensionRCTrackRightQuarterTurn3Bank;
case TrackElemType::LeftHalfBankedHelixUpSmall:
return MultiDimensionRCTrackLeftHalfBankedHelixUpSmall;
case TrackElemType::RightHalfBankedHelixUpSmall:
return MultiDimensionRCTrackRightHalfBankedHelixUpSmall;
case TrackElemType::LeftHalfBankedHelixDownSmall:
return MultiDimensionRCTrackLeftHalfBankedHelixDownSmall;
case TrackElemType::RightHalfBankedHelixDownSmall:
return MultiDimensionRCTrackRightHalfBankedHelixDownSmall;
case TrackElemType::LeftHalfBankedHelixUpLarge:
return MultiDimensionRCTrackLeftHalfBankedHelixUpLarge;
case TrackElemType::RightHalfBankedHelixUpLarge:
return MultiDimensionRCTrackRightHalfBankedHelixUpLarge;
case TrackElemType::LeftHalfBankedHelixDownLarge:
return MultiDimensionRCTrackLeftHalfBankedHelixDownLarge;
case TrackElemType::RightHalfBankedHelixDownLarge:
return MultiDimensionRCTrackRightHalfBankedHelixDownLarge;
case TrackElemType::Brakes:
return MultiDimensionRCTrackBrakes;
case TrackElemType::OnRidePhoto:
return MultiDimensionRCTrackOnRidePhoto;
case TrackElemType::Up90:
return MultiDimensionRCTrack90DegUp;
case TrackElemType::Down90:
return MultiDimensionRCTrack90DegDown;
case TrackElemType::Up60ToUp90:
return MultiDimensionRCTrack60DegUpTo90DegUp;
case TrackElemType::Down90ToDown60:
return MultiDimensionRCTrack90DegDownTo60DegDown;
case TrackElemType::Up90ToUp60:
return MultiDimensionRCTrack90DegUpTo60DegUp;
case TrackElemType::Down60ToDown90:
return MultiDimensionRCTrack60DegDownTo90DegDown;
case TrackElemType::LeftEighthToDiag:
return MultiDimensionRCTrackLeftEighthToDiag;
case TrackElemType::RightEighthToDiag:
return MultiDimensionRCTrackRightEighthToDiag;
case TrackElemType::LeftEighthToOrthogonal:
return MultiDimensionRCTrackLeftEighthToOrthogonal;
case TrackElemType::RightEighthToOrthogonal:
return MultiDimensionRCTrackRightEighthToOrthogonal;
case TrackElemType::LeftEighthBankToDiag:
return MultiDimensionRCTrackLeftEighthBankToDiag;
case TrackElemType::RightEighthBankToDiag:
return MultiDimensionRCTrackRightEighthBankToDiag;
case TrackElemType::LeftEighthBankToOrthogonal:
return MultiDimensionRCTrackLeftEighthBankToOrthogonal;
case TrackElemType::RightEighthBankToOrthogonal:
return MultiDimensionRCTrackRightEighthBankToOrthogonal;
case TrackElemType::DiagFlat:
return MultiDimensionRCTrackDiagFlat;
case TrackElemType::DiagUp25:
return MultiDimensionRCTrackDiag25DegUp;
case TrackElemType::DiagUp60:
return MultiDimensionRCTrackDiag60DegUp;
case TrackElemType::DiagFlatToUp25:
return MultiDimensionRCTrackDiagFlatTo25DegUp;
case TrackElemType::DiagUp25ToUp60:
return MultiDimensionRCTrackDiag25DegUpTo60DegUp;
case TrackElemType::DiagUp60ToUp25:
return MultiDimensionRCTrackDiag60DegUpTo25DegUp;
case TrackElemType::DiagUp25ToFlat:
return MultiDimensionRCTrackDiag25DegUpToFlat;
case TrackElemType::DiagDown25:
return MultiDimensionRCTrackDiag25DegDown;
case TrackElemType::DiagDown60:
return MultiDimensionRCTrackDiag60DegDown;
case TrackElemType::DiagFlatToDown25:
return MultiDimensionRCTrackDiagFlatTo25DegDown;
case TrackElemType::DiagDown25ToDown60:
return MultiDimensionRCTrackDiag25DegDownTo60DegDown;
case TrackElemType::DiagDown60ToDown25:
return MultiDimensionRCTrackDiag60DegDownTo25DegDown;
case TrackElemType::DiagDown25ToFlat:
return MultiDimensionRCTrackDiag25DegDownToFlat;
case TrackElemType::DiagFlatToLeftBank:
return MultiDimensionRCTrackDiagFlatToLeftBank;
case TrackElemType::DiagFlatToRightBank:
return MultiDimensionRCTrackDiagFlatToRightBank;
case TrackElemType::DiagLeftBankToFlat:
return MultiDimensionRCTrackDiagLeftBankToFlat;
case TrackElemType::DiagRightBankToFlat:
return MultiDimensionRCTrackDiagRightBankToFlat;
case TrackElemType::DiagLeftBankToUp25:
return MultiDimensionRCTrackDiagLeftBankTo25DegUp;
case TrackElemType::DiagRightBankToUp25:
return MultiDimensionRCTrackDiagRightBankTo25DegUp;
case TrackElemType::DiagUp25ToLeftBank:
return MultiDimensionRCTrackDiag25DegUpToLeftBank;
case TrackElemType::DiagUp25ToRightBank:
return MultiDimensionRCTrackDiag25DegUpToRightBank;
case TrackElemType::DiagLeftBankToDown25:
return MultiDimensionRCTrackDiagLeftBankTo25DegDown;
case TrackElemType::DiagRightBankToDown25:
return MultiDimensionRCTrackDiagRightBankTo25DegDown;
case TrackElemType::DiagDown25ToLeftBank:
return MultiDimensionRCTrackDiag25DegDownToLeftBank;
case TrackElemType::DiagDown25ToRightBank:
return MultiDimensionRCTrackDiag25DegDownToRightBank;
case TrackElemType::DiagLeftBank:
return MultiDimensionRCTrackDiagLeftBank;
case TrackElemType::DiagRightBank:
return MultiDimensionRCTrackDiagRightBank;
case TrackElemType::LeftFlyerTwistUp:
return MultiDimensionRCTrackLeftFlyerTwistUp;
case TrackElemType::RightFlyerTwistUp:
return MultiDimensionRCTrackRightFlyerTwistUp;
case TrackElemType::LeftFlyerTwistDown:
return MultiDimensionRCTrackLeftFlyerTwistDown;
case TrackElemType::RightFlyerTwistDown:
return MultiDimensionRCTrackRightFlyerTwistDown;
case TrackElemType::MultiDimInvertedFlatToDown90QuarterLoop:
return MultiDimensionRCTrackMultidimInvertedFlatTo90DegQuarterLoopDown;
case TrackElemType::BlockBrakes:
return MultiDimensionRCTrackBlockBrakes;
case TrackElemType::MultiDimUp90ToInvertedFlatQuarterLoop:
return MultiDimensionRCTrackMultidim90DegUpToInvertedFlatQuarterLoop;
case TrackElemType::MultiDimFlatToDown90QuarterLoop:
return MultiDimensionRCTrackMultidimFlatTo90DegDownQuarterLoop;
case TrackElemType::MultiDimInvertedUp90ToFlatQuarterLoop:
return MultiDimensionRCTrackMultidimInverted90DegUpToFlatQuarterLoop;
case TrackElemType::DiagBrakes:
return MultiDimensionRCTrackDiagBrakes;
case TrackElemType::DiagBlockBrakes:
return MultiDimensionRCTrackDiagBlockBrakes;
}
return nullptr;
}