1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-30 10:15:36 +01:00
Files
OpenRCT2/src/openrct2/ride/thrill/GoKarts.cpp
2024-02-19 21:59:59 +01:00

575 lines
24 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 "../../common.h"
#include "../../interface/Viewport.h"
#include "../../paint/Paint.h"
#include "../../paint/support/WoodenSupports.h"
#include "../../world/Map.h"
#include "../Ride.h"
#include "../Track.h"
#include "../TrackPaint.h"
#include "../VehiclePaint.h"
enum
{
SPR_GO_KARTS_FLAT_SW_NE = 20752,
SPR_GO_KARTS_FLAT_NW_SE = 20753,
SPR_GO_KARTS_FLAT_FRONT_SW_NE = 20754,
SPR_GO_KARTS_FLAT_FRONT_NW_SE = 20755,
SPR_GO_KARTS_STARTING_GRID_END_SW_NE = 20756,
SPR_GO_KARTS_STARTING_GRID_END_NW_SE = 20757,
SPR_GO_KARTS_STARTING_GRID_END_NE_SW = 20758,
SPR_GO_KARTS_STARTING_GRID_END_SE_NW = 20759,
SPR_GO_KARTS_STARTING_GRID_END_FRONT_SW_NE = 20760,
SPR_GO_KARTS_STARTING_GRID_END_FRONT_NW_SE = 20761,
SPR_GO_KARTS_STARTING_GRID_END_FRONT_NE_SW = 20762,
SPR_GO_KARTS_STARTING_GRID_END_FRONT_SE_NW = 20763,
SPR_GO_KARTS_STARTING_GRID_SW_NE = 20764,
SPR_GO_KARTS_STARTING_GRID_NW_SE = 20765,
SPR_GO_KARTS_STARTING_GRID_NE_SW = 20766,
SPR_GO_KARTS_STARTING_GRID_SE_NW = 20767,
SPR_GO_KARTS_STARTING_GRID_FRONT_SW_NE = 20768,
SPR_GO_KARTS_STARTING_GRID_FRONT_NW_SE = 20769,
SPR_GO_KARTS_STARTING_GRID_FRONT_NE_SW = 20770,
SPR_GO_KARTS_STARTING_GRID_FRONT_SE_NW = 20771,
SPR_GO_KARTS_FLAT_TO_25_DEG_UP_SW_NE = 20772,
SPR_GO_KARTS_FLAT_TO_25_DEG_UP_NW_SE = 20773,
SPR_GO_KARTS_FLAT_TO_25_DEG_UP_NE_SW = 20774,
SPR_GO_KARTS_FLAT_TO_25_DEG_UP_SE_NW = 20775,
SPR_GO_KARTS_25_DEG_UP_TO_FLAT_SW_NE = 20776,
SPR_GO_KARTS_25_DEG_UP_TO_FLAT_NW_SE = 20777,
SPR_GO_KARTS_25_DEG_UP_TO_FLAT_NE_SW = 20778,
SPR_GO_KARTS_25_DEG_UP_TO_FLAT_SE_NW = 20779,
SPR_GO_KARTS_25_DEG_UP_SW_NE = 20780,
SPR_GO_KARTS_25_DEG_UP_NW_SE = 20781,
SPR_GO_KARTS_25_DEG_UP_NE_SW = 20782,
SPR_GO_KARTS_25_DEG_UP_SE_NW = 20783,
SPR_GO_KARTS_FLAT_TO_25_DEG_UP_FRONT_SW_NE = 20784,
SPR_GO_KARTS_FLAT_TO_25_DEG_UP_FRONT_NW_SE = 20785,
SPR_GO_KARTS_FLAT_TO_25_DEG_UP_FRONT_NE_SW = 20786,
SPR_GO_KARTS_FLAT_TO_25_DEG_UP_FRONT_SE_NW = 20787,
SPR_GO_KARTS_25_DEG_UP_TO_FLAT_FRONT_SW_NE = 20788,
SPR_GO_KARTS_25_DEG_UP_TO_FLAT_FRONT_NW_SE = 20789,
SPR_GO_KARTS_25_DEG_UP_TO_FLAT_FRONT_NE_SW = 20790,
SPR_GO_KARTS_25_DEG_UP_TO_FLAT_FRONT_SE_NW = 20791,
SPR_GO_KARTS_25_DEG_UP_FRONT_SW_NE = 20792,
SPR_GO_KARTS_25_DEG_UP_FRONT_NW_SE = 20793,
SPR_GO_KARTS_25_DEG_UP_FRONT_NE_SW = 20794,
SPR_GO_KARTS_25_DEG_UP_FRONT_SE_NW = 20795,
SPR_GO_KARTS_FLAT_QUARTER_TURN_1_TILE_SW_NW = 20796,
SPR_GO_KARTS_FLAT_QUARTER_TURN_1_TILE_NW_NE = 20797,
SPR_GO_KARTS_FLAT_QUARTER_TURN_1_TILE_NE_SE = 20798,
SPR_GO_KARTS_FLAT_QUARTER_TURN_1_TILE_SE_SW = 20799,
SPR_GO_KARTS_FLAT_QUARTER_TURN_1_TILE_EDGE_A_SW_NW = 20800,
SPR_GO_KARTS_FLAT_QUARTER_TURN_1_TILE_EDGE_A_NW_NE = 20801,
SPR_GO_KARTS_FLAT_QUARTER_TURN_1_TILE_EDGE_A_NE_SE = 20802,
SPR_GO_KARTS_FLAT_QUARTER_TURN_1_TILE_EDGE_A_SE_SW = 20803,
SPR_GO_KARTS_FLAT_QUARTER_TURN_1_TILE_EDGE_B_SW_NW = 20804, // Empty
SPR_GO_KARTS_FLAT_QUARTER_TURN_1_TILE_EDGE_B_NW_NE = 20805,
SPR_GO_KARTS_FLAT_QUARTER_TURN_1_TILE_EDGE_B_NE_SE = 20806,
SPR_GO_KARTS_FLAT_QUARTER_TURN_1_TILE_EDGE_B_SE_SW = 20807,
SPR_GO_KARTS_START_POLE_RED_SW_NE = 20808,
SPR_GO_KARTS_START_POLE_GREEN_SW_NE = 20809,
SPR_GO_KARTS_START_POLE_NW_SE = 20810,
SPR_GO_KARTS_START_POLE_NE_SW = 20811,
SPR_GO_KARTS_START_POLE_RED_SE_NW = 20812,
SPR_GO_KARTS_START_POLE_GREEN_SE_NW = 20813,
SPR_GO_KARTS_START_LIGHTS_RED_SW_NE = 20814,
SPR_GO_KARTS_START_LIGHTS_GREEN_SW_NE = 20815,
SPR_GO_KARTS_START_LIGHTS_NW_SE = 20816,
SPR_GO_KARTS_START_LIGHTS_NE_SW = 20817,
SPR_GO_KARTS_START_LIGHTS_RED_SE_NW = 20818,
SPR_GO_KARTS_START_LIGHTS_GREEN_SE_NW = 20819,
};
static constexpr uint32_t go_karts_track_pieces_starting_grid_end[4][2] = {
{ SPR_GO_KARTS_STARTING_GRID_END_SW_NE, SPR_GO_KARTS_STARTING_GRID_END_FRONT_SW_NE },
{ SPR_GO_KARTS_STARTING_GRID_END_NW_SE, SPR_GO_KARTS_STARTING_GRID_END_FRONT_NW_SE },
{ SPR_GO_KARTS_STARTING_GRID_END_NE_SW, SPR_GO_KARTS_STARTING_GRID_END_FRONT_NE_SW },
{ SPR_GO_KARTS_STARTING_GRID_END_SE_NW, SPR_GO_KARTS_STARTING_GRID_END_FRONT_SE_NW },
};
static constexpr uint32_t go_karts_track_pieces_starting_grid[4][2] = {
{ SPR_GO_KARTS_STARTING_GRID_SW_NE, SPR_GO_KARTS_STARTING_GRID_FRONT_SW_NE },
{ SPR_GO_KARTS_STARTING_GRID_NW_SE, SPR_GO_KARTS_STARTING_GRID_FRONT_NW_SE },
{ SPR_GO_KARTS_STARTING_GRID_NE_SW, SPR_GO_KARTS_STARTING_GRID_FRONT_NE_SW },
{ SPR_GO_KARTS_STARTING_GRID_SE_NW, SPR_GO_KARTS_STARTING_GRID_FRONT_SE_NW },
};
static constexpr uint32_t go_karts_track_pieces_25_deg_up[4][2] = {
{ SPR_GO_KARTS_25_DEG_UP_SW_NE, SPR_GO_KARTS_25_DEG_UP_FRONT_SW_NE },
{ SPR_GO_KARTS_25_DEG_UP_NW_SE, SPR_GO_KARTS_25_DEG_UP_FRONT_NW_SE },
{ SPR_GO_KARTS_25_DEG_UP_NE_SW, SPR_GO_KARTS_25_DEG_UP_FRONT_NE_SW },
{ SPR_GO_KARTS_25_DEG_UP_SE_NW, SPR_GO_KARTS_25_DEG_UP_FRONT_SE_NW },
};
static constexpr uint32_t go_karts_track_pieces_flat_to_25_deg_up[4][2] = {
{ SPR_GO_KARTS_FLAT_TO_25_DEG_UP_SW_NE, SPR_GO_KARTS_FLAT_TO_25_DEG_UP_FRONT_SW_NE },
{ SPR_GO_KARTS_FLAT_TO_25_DEG_UP_NW_SE, SPR_GO_KARTS_FLAT_TO_25_DEG_UP_FRONT_NW_SE },
{ SPR_GO_KARTS_FLAT_TO_25_DEG_UP_NE_SW, SPR_GO_KARTS_FLAT_TO_25_DEG_UP_FRONT_NE_SW },
{ SPR_GO_KARTS_FLAT_TO_25_DEG_UP_SE_NW, SPR_GO_KARTS_FLAT_TO_25_DEG_UP_FRONT_SE_NW },
};
static constexpr uint32_t go_karts_track_pieces_25_deg_up_to_flat[4][2] = {
{ SPR_GO_KARTS_25_DEG_UP_TO_FLAT_SW_NE, SPR_GO_KARTS_25_DEG_UP_TO_FLAT_FRONT_SW_NE },
{ SPR_GO_KARTS_25_DEG_UP_TO_FLAT_NW_SE, SPR_GO_KARTS_25_DEG_UP_TO_FLAT_FRONT_NW_SE },
{ SPR_GO_KARTS_25_DEG_UP_TO_FLAT_NE_SW, SPR_GO_KARTS_25_DEG_UP_TO_FLAT_FRONT_NE_SW },
{ SPR_GO_KARTS_25_DEG_UP_TO_FLAT_SE_NW, SPR_GO_KARTS_25_DEG_UP_TO_FLAT_FRONT_SE_NW },
};
/** rct2: 0x0074A748 */
static void PaintGoKartsTrackFlat(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
ImageId imageId;
if (direction == 0 || direction == 2)
{
imageId = session.TrackColours.WithIndex(SPR_GO_KARTS_FLAT_SW_NE);
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 0, 2, height }, { 32, 28, 1 } });
imageId = session.TrackColours.WithIndex(SPR_GO_KARTS_FLAT_FRONT_SW_NE);
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 0, 29, height + 2 }, { 32, 1, 3 } });
PaintUtilPushTunnelLeft(session, height, TUNNEL_SQUARE_FLAT);
}
else
{
imageId = session.TrackColours.WithIndex(SPR_GO_KARTS_FLAT_NW_SE);
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 2, 0, height }, { 28, 32, 1 } });
imageId = session.TrackColours.WithIndex(SPR_GO_KARTS_FLAT_FRONT_NW_SE);
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 29, 0, height + 2 }, { 1, 32, 3 } });
PaintUtilPushTunnelRight(session, height, TUNNEL_SQUARE_FLAT);
}
WoodenASupportsPaintSetupRotated(
session, WoodenSupportType::Truss, WoodenSupportSubType::NeSw, direction, height, session.SupportColours);
PaintUtilSetSegmentSupportHeight(session, SEGMENTS_ALL, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
}
/** rct2: 0x0074A758 */
static void PaintGoKartsTrack25DegUp(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
ImageId imageId;
PaintStruct* ps;
imageId = session.TrackColours.WithIndex(go_karts_track_pieces_25_deg_up[direction][0]);
if (direction == 0 || direction == 2)
{
ps = PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 0, 2, height }, { 32, 28, 1 } });
}
else
{
ps = PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 2, 0, height }, { 28, 32, 1 } });
}
imageId = session.TrackColours.WithIndex(go_karts_track_pieces_25_deg_up[direction][1]);
if (direction == 0 || direction == 2)
{
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 0, 29, height + 2 }, { 32, 1, 11 } });
}
else
{
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 29, 0, height + 2 }, { 1, 32, 11 } });
}
session.WoodenSupportsPrependTo = ps;
WoodenASupportsPaintSetupRotated(
session, WoodenSupportType::Truss, WoodenSupportSubType::NeSw, direction, height, session.SupportColours,
WoodenSupportTransitionType::Up25Deg);
switch (direction)
{
case 0:
PaintUtilPushTunnelLeft(session, height - 8, TUNNEL_SQUARE_7);
break;
case 1:
PaintUtilPushTunnelRight(session, height + 8, TUNNEL_SQUARE_8);
break;
case 2:
PaintUtilPushTunnelLeft(session, height + 8, TUNNEL_SQUARE_8);
break;
case 3:
PaintUtilPushTunnelRight(session, height - 8, TUNNEL_SQUARE_7);
break;
}
PaintUtilSetSegmentSupportHeight(session, SEGMENTS_ALL, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20);
}
/** rct2: 0x0074A768 */
static void PaintGoKartsTrackFlatTo25DegUp(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
ImageId imageId;
PaintStruct* ps;
imageId = session.TrackColours.WithIndex(go_karts_track_pieces_flat_to_25_deg_up[direction][0]);
if (direction == 0 || direction == 2)
{
ps = PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 0, 2, height }, { 32, 28, 1 } });
}
else
{
ps = PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 2, 0, height }, { 28, 32, 1 } });
}
imageId = session.TrackColours.WithIndex(go_karts_track_pieces_flat_to_25_deg_up[direction][1]);
if (direction == 0 || direction == 2)
{
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 0, 29, height + 2 }, { 32, 1, 11 } });
}
else
{
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 29, 0, height + 2 }, { 1, 32, 11 } });
}
session.WoodenSupportsPrependTo = ps;
WoodenASupportsPaintSetupRotated(
session, WoodenSupportType::Truss, WoodenSupportSubType::NeSw, direction, height, session.SupportColours,
WoodenSupportTransitionType::FlatToUp25Deg);
switch (direction)
{
case 0:
PaintUtilPushTunnelLeft(session, height, TUNNEL_SQUARE_FLAT);
break;
case 1:
PaintUtilPushTunnelRight(session, height, TUNNEL_SQUARE_8);
break;
case 2:
PaintUtilPushTunnelLeft(session, height, TUNNEL_SQUARE_8);
break;
case 3:
PaintUtilPushTunnelRight(session, height, TUNNEL_SQUARE_FLAT);
break;
}
PaintUtilSetSegmentSupportHeight(session, SEGMENTS_ALL, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20);
}
/** rct2: 0x */
static void PaintGoKartsTrack25DegUpToFlat(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
ImageId imageId;
PaintStruct* ps;
imageId = session.TrackColours.WithIndex(go_karts_track_pieces_25_deg_up_to_flat[direction][0]);
if (direction == 0 || direction == 2)
{
ps = PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 0, 2, height }, { 32, 28, 1 } });
}
else
{
ps = PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 2, 0, height }, { 28, 32, 1 } });
}
imageId = session.TrackColours.WithIndex(go_karts_track_pieces_25_deg_up_to_flat[direction][1]);
if (direction == 0 || direction == 2)
{
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 0, 29, height + 2 }, { 32, 1, 11 } });
}
else
{
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 29, 0, height + 2 }, { 1, 32, 11 } });
}
session.WoodenSupportsPrependTo = ps;
WoodenASupportsPaintSetupRotated(
session, WoodenSupportType::Truss, WoodenSupportSubType::NeSw, direction, height, session.SupportColours,
WoodenSupportTransitionType::Up25DegToFlat);
switch (direction)
{
case 0:
PaintUtilPushTunnelLeft(session, height - 8, TUNNEL_SQUARE_FLAT);
break;
case 1:
PaintUtilPushTunnelRight(session, height + 8, TUNNEL_14);
break;
case 2:
PaintUtilPushTunnelLeft(session, height + 8, TUNNEL_14);
break;
case 3:
PaintUtilPushTunnelRight(session, height - 8, TUNNEL_SQUARE_FLAT);
break;
}
PaintUtilSetSegmentSupportHeight(session, SEGMENTS_ALL, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 40, 0x20);
}
/** rct2: 0x0074A788 */
static void PaintGoKartsTrack25DegDown(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
PaintGoKartsTrack25DegUp(session, ride, trackSequence, (direction + 2) % 4, height, trackElement);
}
/** rct2: 0x0074A798 */
static void PaintGoKartsTrackFlatTo25DegDown(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
PaintGoKartsTrack25DegUpToFlat(session, ride, trackSequence, (direction + 2) % 4, height, trackElement);
}
/** rct2: 0x0074A7A8 */
static void PaintGoKartsTrack25DegDownToFlat(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
PaintGoKartsTrackFlatTo25DegUp(session, ride, trackSequence, (direction + 2) % 4, height, trackElement);
}
/** rct2: 0x */
static void PaintGoKartsStation(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
const auto* stationObj = ride.GetStationObject();
bool hasFence;
ImageId imageId;
const uint32_t(*sprites)[2] = go_karts_track_pieces_starting_grid;
if (trackElement.GetTrackType() == TrackElemType::EndStation)
{
sprites = go_karts_track_pieces_starting_grid_end;
}
imageId = session.TrackColours.WithIndex(sprites[direction][0]);
if (direction == 0 || direction == 2)
{
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 0, 2, height }, { 32, 28, 1 } });
}
else
{
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 2, 0, height }, { 28, 32, 1 } });
}
auto stationColour = GetStationColourScheme(session, trackElement);
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);
}
imageId = session.TrackColours.WithIndex(sprites[direction][1]);
if (direction == 0 || direction == 2)
{
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 0, 29, height + 2 }, { 32, 1, 3 } });
PaintUtilPushTunnelLeft(session, height, TUNNEL_SQUARE_FLAT);
}
else
{
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 29, 0, height + 2 }, { 1, 32, 3 } });
PaintUtilPushTunnelRight(session, height, TUNNEL_SQUARE_FLAT);
}
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);
}
if (trackElement.GetTrackType() == TrackElemType::EndStation)
{
const bool hasGreenLight = trackElement.HasGreenLight();
switch (direction)
{
case 0:
imageId = session.TrackColours.WithIndex(
(hasGreenLight ? SPR_GO_KARTS_START_POLE_GREEN_SW_NE : SPR_GO_KARTS_START_POLE_RED_SW_NE));
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 1, 1, height + 4 }, { 3, 3, 13 } });
imageId = session.TrackColours.WithIndex(
(hasGreenLight ? SPR_GO_KARTS_START_LIGHTS_GREEN_SW_NE : SPR_GO_KARTS_START_LIGHTS_RED_SW_NE));
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 1, 28, height + 4 }, { 3, 3, 13 } });
break;
case 1:
imageId = session.TrackColours.WithIndex(SPR_GO_KARTS_START_POLE_NW_SE);
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 1, 28, height + 4 }, { 3, 3, 13 } });
imageId = session.TrackColours.WithIndex(SPR_GO_KARTS_START_LIGHTS_NW_SE);
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 28, 28, height + 4 }, { 3, 3, 13 } });
break;
case 2:
imageId = session.TrackColours.WithIndex(SPR_GO_KARTS_START_POLE_NE_SW);
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 28, 1, height + 4 }, { 3, 3, 13 } });
imageId = session.TrackColours.WithIndex(SPR_GO_KARTS_START_LIGHTS_NE_SW);
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 28, 28, height + 4 }, { 3, 3, 13 } });
break;
case 3:
imageId = session.TrackColours.WithIndex(
(hasGreenLight ? SPR_GO_KARTS_START_POLE_GREEN_SE_NW : SPR_GO_KARTS_START_POLE_RED_SE_NW));
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 1, 1, height + 4 }, { 3, 3, 13 } });
imageId = session.TrackColours.WithIndex(
(hasGreenLight ? SPR_GO_KARTS_START_LIGHTS_GREEN_SE_NW : SPR_GO_KARTS_START_LIGHTS_RED_SE_NW));
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 28, 1, height + 4 }, { 3, 3, 13 } });
break;
}
}
WoodenASupportsPaintSetupRotated(
session, WoodenSupportType::Truss, WoodenSupportSubType::NeSw, direction, height, session.SupportColours);
PaintUtilSetSegmentSupportHeight(session, SEGMENTS_ALL, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
}
/** rct2: 0x0074A7E8 */
static void PaintGoKartsTrackLeftQuarterTurn1Tile(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
ImageId imageId;
switch (direction)
{
case 0:
imageId = session.TrackColours.WithIndex(SPR_GO_KARTS_FLAT_QUARTER_TURN_1_TILE_NW_NE);
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 0, 2, height }, { 32, 28, 1 } });
imageId = session.TrackColours.WithIndex(SPR_GO_KARTS_FLAT_QUARTER_TURN_1_TILE_EDGE_A_NW_NE);
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 29, 2, height + 2 }, { 1, 1, 3 } });
imageId = session.TrackColours.WithIndex(SPR_GO_KARTS_FLAT_QUARTER_TURN_1_TILE_EDGE_B_NW_NE);
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 14, 29, height + 2 }, { 16, 1, 3 } });
break;
case 1:
imageId = session.TrackColours.WithIndex(SPR_GO_KARTS_FLAT_QUARTER_TURN_1_TILE_NE_SE);
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 0, 0, height }, { 30, 30, 1 } });
imageId = session.TrackColours.WithIndex(SPR_GO_KARTS_FLAT_QUARTER_TURN_1_TILE_EDGE_A_NE_SE);
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 2, 29, height + 2 }, { 16, 1, 3 } });
imageId = session.TrackColours.WithIndex(SPR_GO_KARTS_FLAT_QUARTER_TURN_1_TILE_EDGE_B_NE_SE);
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 29, 2, height + 2 }, { 1, 16, 3 } });
break;
case 2:
imageId = session.TrackColours.WithIndex(SPR_GO_KARTS_FLAT_QUARTER_TURN_1_TILE_SE_SW);
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 2, 0, height }, { 28, 32, 1 } });
imageId = session.TrackColours.WithIndex(SPR_GO_KARTS_FLAT_QUARTER_TURN_1_TILE_EDGE_A_SE_SW);
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 2, 2, height + 2 }, { 1, 1, 3 } });
imageId = session.TrackColours.WithIndex(SPR_GO_KARTS_FLAT_QUARTER_TURN_1_TILE_EDGE_B_SE_SW);
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 29, 14, height + 2 }, { 1, 16, 3 } });
break;
case 3:
imageId = session.TrackColours.WithIndex(SPR_GO_KARTS_FLAT_QUARTER_TURN_1_TILE_SW_NW);
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 0, 0, height }, { 32, 32, 1 } });
imageId = session.TrackColours.WithIndex(SPR_GO_KARTS_FLAT_QUARTER_TURN_1_TILE_EDGE_A_SW_NW);
PaintAddImageAsParent(session, imageId, { 0, 0, height }, { { 29, 29, height + 2 }, { 1, 1, 3 } });
// The empty sprite isn't drawn
break;
}
switch (direction)
{
case 0:
PaintUtilPushTunnelLeft(session, height, TUNNEL_SQUARE_FLAT);
break;
case 2:
PaintUtilPushTunnelRight(session, height, TUNNEL_SQUARE_FLAT);
break;
case 3:
PaintUtilPushTunnelLeft(session, height, TUNNEL_SQUARE_FLAT);
PaintUtilPushTunnelRight(session, height, TUNNEL_SQUARE_FLAT);
break;
}
WoodenASupportsPaintSetupRotated(
session, WoodenSupportType::Truss, WoodenSupportSubType::NeSw, direction, height, session.SupportColours);
PaintUtilSetSegmentSupportHeight(session, SEGMENTS_ALL, 0xFFFF, 0);
PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20);
}
/** rct2: 0x0074A7F8 */
static void PaintGoKartsTrackRightQuarterTurn1Tile(
PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
const TrackElement& trackElement)
{
PaintGoKartsTrackLeftQuarterTurn1Tile(session, ride, trackSequence, (direction + 3) % 4, height, trackElement);
}
/**
* rct2: 0x0074A668
*/
TRACK_PAINT_FUNCTION GetTrackPaintFunctionGoKarts(int32_t trackType)
{
switch (trackType)
{
case TrackElemType::Flat:
return PaintGoKartsTrackFlat;
case TrackElemType::EndStation:
case TrackElemType::BeginStation:
case TrackElemType::MiddleStation:
return PaintGoKartsStation;
case TrackElemType::Up25:
return PaintGoKartsTrack25DegUp;
case TrackElemType::FlatToUp25:
return PaintGoKartsTrackFlatTo25DegUp;
case TrackElemType::Up25ToFlat:
return PaintGoKartsTrack25DegUpToFlat;
case TrackElemType::Down25:
return PaintGoKartsTrack25DegDown;
case TrackElemType::FlatToDown25:
return PaintGoKartsTrackFlatTo25DegDown;
case TrackElemType::Down25ToFlat:
return PaintGoKartsTrack25DegDownToFlat;
case TrackElemType::LeftQuarterTurn1Tile:
return PaintGoKartsTrackLeftQuarterTurn1Tile;
case TrackElemType::RightQuarterTurn1Tile:
return PaintGoKartsTrackRightQuarterTurn1Tile;
}
return nullptr;
}