mirror of https://github.com/OpenRCT2/OpenRCT2.git
594 lines
24 KiB
C++
594 lines
24 KiB
C++
/*****************************************************************************
|
|
* Copyright (c) 2014-2019 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/Supports.h"
|
|
#include "../Track.h"
|
|
#include "../TrackPaint.h"
|
|
#include "../VehiclePaint.h"
|
|
|
|
// 0x009927E6:
|
|
static constexpr const vehicle_boundbox _virginiaReelBoundbox[] = {
|
|
{ -11, -11, 1, 22, 22, 13 }, { -11, -11, 1, 22, 22, 13 }, { -11, -11, 1, 22, 22, 13 },
|
|
{ -11, -11, 1, 22, 22, 13 }, { -11, -11, 1, 22, 22, 13 }, { -11, -11, 1, 22, 22, 13 },
|
|
{ -11, -11, 1, 22, 22, 13 }, { -11, -11, 1, 22, 22, 13 }, { -11, -11, 1, 22, 22, 13 },
|
|
};
|
|
|
|
enum
|
|
{
|
|
SPR_VIRGINIA_REEL_FLAT_SW_NE = 21458,
|
|
SPR_VIRGINIA_REEL_FLAT_NW_SE = 21459,
|
|
SPR_VIRGINIA_REEL_FLAT_TO_25_DEG_UP_SW_NE = 21460,
|
|
SPR_VIRGINIA_REEL_FLAT_TO_25_DEG_UP_NW_SE = 21461,
|
|
SPR_VIRGINIA_REEL_FLAT_TO_25_DEG_UP_NE_SW = 21462,
|
|
SPR_VIRGINIA_REEL_FLAT_TO_25_DEG_UP_SE_NW = 21463,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_TO_FLAT_SW_NE = 21464,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_TO_FLAT_NW_SE = 21465,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_TO_FLAT_NE_SW = 21466,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_TO_FLAT_SE_NW = 21467,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_SW_NE = 21468,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_NW_SE = 21469,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_NE_SW = 21470,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_SE_NW = 21471,
|
|
SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_3_TILES_SW_SE_PART_0 = 21472,
|
|
SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_3_TILES_SW_SE_PART_1 = 21473,
|
|
SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_3_TILES_SW_SE_PART_2 = 21474,
|
|
SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_3_TILES_NW_SW_PART_0 = 21475,
|
|
SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_3_TILES_NW_SW_PART_1 = 21476,
|
|
SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_3_TILES_NW_SW_PART_2 = 21477,
|
|
SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_3_TILES_NE_NW_PART_0 = 21478,
|
|
SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_3_TILES_NE_NW_PART_1 = 21479,
|
|
SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_3_TILES_NE_NW_PART_2 = 21480,
|
|
SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_3_TILES_SE_NE_PART_0 = 21481,
|
|
SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_3_TILES_SE_NE_PART_1 = 21482,
|
|
SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_3_TILES_SE_NE_PART_2 = 21483,
|
|
SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_1_TILE_SW_NW = 21484,
|
|
SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_1_TILE_NW_NE = 21485,
|
|
SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_1_TILE_NE_SE = 21486,
|
|
SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_1_TILE_SE_SW = 21487,
|
|
SPR_VIRGINIA_REEL_FLAT_LIFT_HILL_SW_NE = 21488,
|
|
SPR_VIRGINIA_REEL_FLAT_LIFT_HILL_NW_SE = 21489,
|
|
SPR_VIRGINIA_REEL_FLAT_LIFT_HILL_NE_SW = 21490,
|
|
SPR_VIRGINIA_REEL_FLAT_LIFT_HILL_SE_NW = 21491,
|
|
SPR_VIRGINIA_REEL_FLAT_TO_25_DEG_UP_LIFT_HILL_SW_NE = 21492,
|
|
SPR_VIRGINIA_REEL_FLAT_TO_25_DEG_UP_LIFT_HILL_NW_SE = 21493,
|
|
SPR_VIRGINIA_REEL_FLAT_TO_25_DEG_UP_LIFT_HILL_NE_SW = 21494,
|
|
SPR_VIRGINIA_REEL_FLAT_TO_25_DEG_UP_LIFT_HILL_SE_NW = 21495,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_TO_FLAT_LIFT_HILL_SW_NE = 21496,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_TO_FLAT_LIFT_HILL_NW_SE = 21497,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_TO_FLAT_LIFT_HILL_NE_SW = 21498,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_TO_FLAT_LIFT_HILL_SE_NW = 21499,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_LIFT_HILL_SW_NE = 21500,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_LIFT_HILL_NW_SE = 21501,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_LIFT_HILL_NE_SW = 21502,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_LIFT_HILL_SE_NW = 21503,
|
|
};
|
|
|
|
static constexpr const uint32_t virginia_reel_track_pieces_flat[4] = {
|
|
SPR_VIRGINIA_REEL_FLAT_SW_NE,
|
|
SPR_VIRGINIA_REEL_FLAT_NW_SE,
|
|
SPR_VIRGINIA_REEL_FLAT_SW_NE,
|
|
SPR_VIRGINIA_REEL_FLAT_NW_SE,
|
|
};
|
|
|
|
static constexpr const uint32_t virginia_reel_track_pieces_flat_lift_hill[4] = {
|
|
SPR_VIRGINIA_REEL_FLAT_LIFT_HILL_SW_NE,
|
|
SPR_VIRGINIA_REEL_FLAT_LIFT_HILL_NW_SE,
|
|
SPR_VIRGINIA_REEL_FLAT_LIFT_HILL_NE_SW,
|
|
SPR_VIRGINIA_REEL_FLAT_LIFT_HILL_SE_NW,
|
|
};
|
|
|
|
static constexpr const uint32_t virginia_reel_track_pieces_flat_to_25_deg_up[4] = {
|
|
SPR_VIRGINIA_REEL_FLAT_TO_25_DEG_UP_SW_NE,
|
|
SPR_VIRGINIA_REEL_FLAT_TO_25_DEG_UP_NW_SE,
|
|
SPR_VIRGINIA_REEL_FLAT_TO_25_DEG_UP_NE_SW,
|
|
SPR_VIRGINIA_REEL_FLAT_TO_25_DEG_UP_SE_NW,
|
|
};
|
|
|
|
static constexpr const uint32_t virginia_reel_track_pieces_flat_to_25_deg_up_lift_hill[4] = {
|
|
SPR_VIRGINIA_REEL_FLAT_TO_25_DEG_UP_LIFT_HILL_SW_NE,
|
|
SPR_VIRGINIA_REEL_FLAT_TO_25_DEG_UP_LIFT_HILL_NW_SE,
|
|
SPR_VIRGINIA_REEL_FLAT_TO_25_DEG_UP_LIFT_HILL_NE_SW,
|
|
SPR_VIRGINIA_REEL_FLAT_TO_25_DEG_UP_LIFT_HILL_SE_NW,
|
|
};
|
|
|
|
static constexpr const uint32_t virginia_reel_track_pieces_25_deg_up_to_flat[4] = {
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_TO_FLAT_SW_NE,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_TO_FLAT_NW_SE,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_TO_FLAT_NE_SW,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_TO_FLAT_SE_NW,
|
|
};
|
|
|
|
static constexpr const uint32_t virginia_reel_track_pieces_25_deg_up_to_flat_lift_hill[4] = {
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_TO_FLAT_LIFT_HILL_SW_NE,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_TO_FLAT_LIFT_HILL_NW_SE,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_TO_FLAT_LIFT_HILL_NE_SW,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_TO_FLAT_LIFT_HILL_SE_NW,
|
|
};
|
|
|
|
static constexpr const uint32_t virginia_reel_track_pieces_25_deg_up[4] = {
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_SW_NE,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_NW_SE,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_NE_SW,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_SE_NW,
|
|
};
|
|
|
|
static constexpr const uint32_t virginia_reel_track_pieces_25_deg_up_lift_hill[4] = {
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_LIFT_HILL_SW_NE,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_LIFT_HILL_NW_SE,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_LIFT_HILL_NE_SW,
|
|
SPR_VIRGINIA_REEL_25_DEG_UP_LIFT_HILL_SE_NW,
|
|
};
|
|
|
|
static constexpr const uint32_t virginia_reel_track_pieces_flat_quarter_turn_3_tiles[4][3] = {
|
|
{ SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_3_TILES_SW_SE_PART_0, SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_3_TILES_SW_SE_PART_1,
|
|
SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_3_TILES_SW_SE_PART_2 },
|
|
{ SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_3_TILES_NW_SW_PART_0, SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_3_TILES_NW_SW_PART_1,
|
|
SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_3_TILES_NW_SW_PART_2 },
|
|
{ SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_3_TILES_NE_NW_PART_0, SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_3_TILES_NE_NW_PART_1,
|
|
SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_3_TILES_NE_NW_PART_2 },
|
|
{ SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_3_TILES_SE_NE_PART_0, SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_3_TILES_SE_NE_PART_1,
|
|
SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_3_TILES_SE_NE_PART_2 }
|
|
};
|
|
|
|
static constexpr const uint32_t virginia_reel_track_pieces_flat_quarter_turn_1_tile[4] = {
|
|
SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_1_TILE_SW_NW,
|
|
SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_1_TILE_NW_NE,
|
|
SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_1_TILE_NE_SE,
|
|
SPR_VIRGINIA_REEL_FLAT_QUARTER_TURN_1_TILE_SE_SW,
|
|
};
|
|
|
|
/**
|
|
*
|
|
* rct2: 0x006D5B48
|
|
*/
|
|
void vehicle_visual_virginia_reel(
|
|
paint_session* session, int32_t x, int32_t imageDirection, int32_t y, int32_t z, const rct_vehicle* vehicle,
|
|
const rct_ride_entry_vehicle* vehicleEntry)
|
|
{
|
|
int32_t image_id;
|
|
int32_t baseImage_id = imageDirection;
|
|
const uint8_t rotation = session->CurrentRotation;
|
|
int32_t ecx = ((vehicle->spin_sprite / 8) + (rotation * 8)) & 31;
|
|
int32_t j = 0;
|
|
if (vehicle->vehicle_sprite_type == 0)
|
|
{
|
|
baseImage_id = ecx & 7;
|
|
}
|
|
else
|
|
{
|
|
if (vehicle->vehicle_sprite_type == 1 || vehicle->vehicle_sprite_type == 5)
|
|
{
|
|
if (vehicle->vehicle_sprite_type == 5)
|
|
{
|
|
baseImage_id = imageDirection ^ 16;
|
|
}
|
|
baseImage_id &= 24;
|
|
j = (baseImage_id / 8) + 1;
|
|
baseImage_id += (ecx & 7);
|
|
baseImage_id += 8;
|
|
}
|
|
else if (vehicle->vehicle_sprite_type == 2 || vehicle->vehicle_sprite_type == 6)
|
|
{
|
|
if (vehicle->vehicle_sprite_type == 6)
|
|
{
|
|
baseImage_id = imageDirection ^ 16;
|
|
}
|
|
baseImage_id &= 24;
|
|
j = (baseImage_id / 8) + 5;
|
|
baseImage_id += (ecx & 7);
|
|
baseImage_id += 40;
|
|
}
|
|
else
|
|
{
|
|
baseImage_id = ecx & 7;
|
|
}
|
|
}
|
|
baseImage_id += vehicleEntry->base_image_id;
|
|
|
|
const vehicle_boundbox* bb = &_virginiaReelBoundbox[j];
|
|
image_id = baseImage_id | SPRITE_ID_PALETTE_COLOUR_2(vehicle->colours.body_colour, vehicle->colours.trim_colour);
|
|
if (vehicle->IsGhost())
|
|
{
|
|
image_id = (image_id & 0x7FFFF) | CONSTRUCTION_MARKER;
|
|
}
|
|
sub_98197C(
|
|
session, image_id, 0, 0, bb->length_x, bb->length_y, bb->length_z, z, bb->offset_x, bb->offset_y, bb->offset_z + z);
|
|
|
|
if (session->DPI.zoom_level < 2 && vehicle->num_peeps > 0 && !vehicle->IsGhost())
|
|
{
|
|
uint8_t riding_peep_sprites[4] = { 0xFF, 0xFF, 0xFF, 0xFF };
|
|
for (int32_t i = 0; i < vehicle->num_peeps; i++)
|
|
{
|
|
riding_peep_sprites[((ecx / 8) + i) & 3] = vehicle->peep_tshirt_colours[i];
|
|
}
|
|
int32_t draw_order[4] = { 0, 1, 3, 2 };
|
|
for (auto i : draw_order)
|
|
{
|
|
if (riding_peep_sprites[i] != 0xFF)
|
|
{
|
|
image_id = (baseImage_id + ((i + 1) * 72)) | SPRITE_ID_PALETTE_COLOUR_1(riding_peep_sprites[i]);
|
|
sub_98199C(
|
|
session, image_id, 0, 0, bb->length_x, bb->length_y, bb->length_z, z, bb->offset_x, bb->offset_y,
|
|
bb->offset_z + z);
|
|
}
|
|
}
|
|
}
|
|
|
|
assert(vehicleEntry->effect_visual == 1);
|
|
}
|
|
|
|
/** rct2: 0x00811264 */
|
|
static void paint_virginia_reel_track_flat(
|
|
paint_session* session, ride_id_t rideIndex, uint8_t trackSequence, uint8_t direction, int32_t height,
|
|
const TileElement* tileElement)
|
|
{
|
|
const uint32_t* sprites = virginia_reel_track_pieces_flat;
|
|
if (tileElement->AsTrack()->HasChain())
|
|
{
|
|
sprites = virginia_reel_track_pieces_flat_lift_hill;
|
|
}
|
|
|
|
uint32_t imageId = sprites[direction] | session->TrackColours[SCHEME_TRACK];
|
|
if (direction & 1)
|
|
{
|
|
sub_98197C(session, imageId, 0, 0, 27, 32, 2, height, 2, 0, height);
|
|
paint_util_push_tunnel_right(session, height, TUNNEL_6);
|
|
}
|
|
else
|
|
{
|
|
sub_98197C(session, imageId, 0, 0, 32, 27, 2, height, 0, 2, height);
|
|
paint_util_push_tunnel_left(session, height, TUNNEL_6);
|
|
}
|
|
|
|
wooden_a_supports_paint_setup(session, (direction & 1), 0, height, session->TrackColours[SCHEME_SUPPORTS], nullptr);
|
|
|
|
paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
|
|
paint_util_set_general_support_height(session, height + 32, 0x20);
|
|
}
|
|
|
|
/** rct2: 0x00811274 */
|
|
static void paint_virginia_reel_track_25_deg_up(
|
|
paint_session* session, ride_id_t rideIndex, uint8_t trackSequence, uint8_t direction, int32_t height,
|
|
const TileElement* tileElement)
|
|
{
|
|
const uint32_t* sprites = virginia_reel_track_pieces_25_deg_up;
|
|
if (tileElement->AsTrack()->HasChain())
|
|
{
|
|
sprites = virginia_reel_track_pieces_25_deg_up_lift_hill;
|
|
}
|
|
|
|
uint32_t imageId = sprites[direction] | session->TrackColours[SCHEME_TRACK];
|
|
paint_struct* ps;
|
|
|
|
if (direction & 1)
|
|
{
|
|
ps = sub_98197C(session, imageId, 0, 0, 27, 32, 2, height, 2, 0, height);
|
|
}
|
|
else
|
|
{
|
|
ps = sub_98197C(session, imageId, 0, 0, 32, 27, 2, height, 0, 2, height);
|
|
}
|
|
|
|
if (direction == 1 || direction == 2)
|
|
{
|
|
session->WoodenSupportsPrependTo = ps;
|
|
}
|
|
|
|
switch (direction)
|
|
{
|
|
case 0:
|
|
wooden_a_supports_paint_setup(session, 0, 9, height, session->TrackColours[SCHEME_SUPPORTS], nullptr);
|
|
paint_util_push_tunnel_left(session, height - 8, TUNNEL_7);
|
|
break;
|
|
case 1:
|
|
wooden_a_supports_paint_setup(session, 1, 10, height, session->TrackColours[SCHEME_SUPPORTS], nullptr);
|
|
paint_util_push_tunnel_right(session, height + 8, TUNNEL_8);
|
|
break;
|
|
case 2:
|
|
wooden_a_supports_paint_setup(session, 0, 11, height, session->TrackColours[SCHEME_SUPPORTS], nullptr);
|
|
paint_util_push_tunnel_left(session, height + 8, TUNNEL_8);
|
|
break;
|
|
case 3:
|
|
wooden_a_supports_paint_setup(session, 1, 12, height, session->TrackColours[SCHEME_SUPPORTS], nullptr);
|
|
paint_util_push_tunnel_right(session, height - 8, TUNNEL_7);
|
|
break;
|
|
}
|
|
|
|
paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
|
|
paint_util_set_general_support_height(session, height + 56, 0x20);
|
|
}
|
|
|
|
/** rct2: 0x00811294 */
|
|
static void paint_virginia_reel_track_flat_to_25_deg_up(
|
|
paint_session* session, ride_id_t rideIndex, uint8_t trackSequence, uint8_t direction, int32_t height,
|
|
const TileElement* tileElement)
|
|
{
|
|
const uint32_t* sprites = virginia_reel_track_pieces_flat_to_25_deg_up;
|
|
if (tileElement->AsTrack()->HasChain())
|
|
{
|
|
sprites = virginia_reel_track_pieces_flat_to_25_deg_up_lift_hill;
|
|
}
|
|
|
|
uint32_t imageId = sprites[direction] | session->TrackColours[SCHEME_TRACK];
|
|
paint_struct* ps;
|
|
switch (direction)
|
|
{
|
|
case 0:
|
|
sub_98197C(session, imageId, 0, 0, 32, 27, 2, height, 0, 2, height);
|
|
|
|
wooden_a_supports_paint_setup(session, 0, 1, height, session->TrackColours[SCHEME_SUPPORTS], nullptr);
|
|
paint_util_push_tunnel_left(session, height, TUNNEL_6);
|
|
break;
|
|
case 1:
|
|
ps = sub_98197C(session, imageId, 0, 0, 27, 32, 2, height, 2, 0, height);
|
|
session->WoodenSupportsPrependTo = ps;
|
|
|
|
wooden_a_supports_paint_setup(session, 1, 2, height, session->TrackColours[SCHEME_SUPPORTS], nullptr);
|
|
paint_util_push_tunnel_right(session, height, TUNNEL_8);
|
|
break;
|
|
case 2:
|
|
ps = sub_98197C(session, imageId, 0, 0, 32, 27, 2, height, 0, 2, height);
|
|
session->WoodenSupportsPrependTo = ps;
|
|
|
|
wooden_a_supports_paint_setup(session, 0, 3, height, session->TrackColours[SCHEME_SUPPORTS], nullptr);
|
|
paint_util_push_tunnel_left(session, height, TUNNEL_8);
|
|
break;
|
|
case 3:
|
|
sub_98197C(session, imageId, 0, 0, 27, 32, 2, height, 2, 0, height);
|
|
|
|
wooden_a_supports_paint_setup(session, 1, 4, height, session->TrackColours[SCHEME_SUPPORTS], nullptr);
|
|
paint_util_push_tunnel_right(session, height, TUNNEL_6);
|
|
break;
|
|
}
|
|
|
|
paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
|
|
paint_util_set_general_support_height(session, height + 48, 0x20);
|
|
}
|
|
|
|
/** rct2: 0x00811294 */
|
|
static void paint_virginia_reel_track_25_deg_up_to_flat(
|
|
paint_session* session, ride_id_t rideIndex, uint8_t trackSequence, uint8_t direction, int32_t height,
|
|
const TileElement* tileElement)
|
|
{
|
|
const uint32_t* sprites = virginia_reel_track_pieces_25_deg_up_to_flat;
|
|
if (tileElement->AsTrack()->HasChain())
|
|
{
|
|
sprites = virginia_reel_track_pieces_25_deg_up_to_flat_lift_hill;
|
|
}
|
|
|
|
uint32_t imageId = sprites[direction] | session->TrackColours[SCHEME_TRACK];
|
|
paint_struct* ps;
|
|
|
|
if (direction & 1)
|
|
{
|
|
ps = sub_98197C(session, imageId, 0, 0, 27, 32, 2, height, 2, 0, height);
|
|
}
|
|
else
|
|
{
|
|
ps = sub_98197C(session, imageId, 0, 0, 32, 27, 2, height, 0, 2, height);
|
|
}
|
|
|
|
if (direction == 1 || direction == 2)
|
|
{
|
|
session->WoodenSupportsPrependTo = ps;
|
|
}
|
|
|
|
switch (direction)
|
|
{
|
|
case 0:
|
|
wooden_a_supports_paint_setup(session, 0, 5, height, session->TrackColours[SCHEME_SUPPORTS], nullptr);
|
|
paint_util_push_tunnel_left(session, height - 8, TUNNEL_6);
|
|
break;
|
|
case 1:
|
|
wooden_a_supports_paint_setup(session, 1, 6, height, session->TrackColours[SCHEME_SUPPORTS], nullptr);
|
|
paint_util_push_tunnel_right(session, height + 8, TUNNEL_14);
|
|
break;
|
|
case 2:
|
|
wooden_a_supports_paint_setup(session, 0, 7, height, session->TrackColours[SCHEME_SUPPORTS], nullptr);
|
|
paint_util_push_tunnel_left(session, height + 8, TUNNEL_14);
|
|
break;
|
|
case 3:
|
|
wooden_a_supports_paint_setup(session, 1, 8, height, session->TrackColours[SCHEME_SUPPORTS], nullptr);
|
|
paint_util_push_tunnel_right(session, height - 8, TUNNEL_6);
|
|
break;
|
|
}
|
|
|
|
paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
|
|
paint_util_set_general_support_height(session, height + 40, 0x20);
|
|
}
|
|
|
|
/** rct2: 0x008112A4 */
|
|
static void paint_virginia_reel_track_25_deg_down(
|
|
paint_session* session, ride_id_t rideIndex, uint8_t trackSequence, uint8_t direction, int32_t height,
|
|
const TileElement* tileElement)
|
|
{
|
|
paint_virginia_reel_track_25_deg_up(session, rideIndex, trackSequence, (direction + 2) % 4, height, tileElement);
|
|
}
|
|
|
|
/** rct2: 0x008112B4 */
|
|
static void paint_virginia_reel_track_flat_to_25_deg_down(
|
|
paint_session* session, ride_id_t rideIndex, uint8_t trackSequence, uint8_t direction, int32_t height,
|
|
const TileElement* tileElement)
|
|
{
|
|
paint_virginia_reel_track_25_deg_up_to_flat(session, rideIndex, trackSequence, (direction + 2) % 4, height, tileElement);
|
|
}
|
|
|
|
/** rct2: 0x008112C4 */
|
|
static void paint_virginia_reel_track_25_deg_down_to_flat(
|
|
paint_session* session, ride_id_t rideIndex, uint8_t trackSequence, uint8_t direction, int32_t height,
|
|
const TileElement* tileElement)
|
|
{
|
|
paint_virginia_reel_track_flat_to_25_deg_up(session, rideIndex, trackSequence, (direction + 2) % 4, height, tileElement);
|
|
}
|
|
|
|
/** rct2: 0x008112D4, 0x008112E4, 0x008112F4 */
|
|
static void paint_virginia_reel_station(
|
|
paint_session* session, ride_id_t rideIndex, [[maybe_unused]] uint8_t trackSequence, uint8_t direction, int32_t height,
|
|
const TileElement* tileElement)
|
|
{
|
|
uint32_t imageId;
|
|
|
|
if (direction == 0 || direction == 2)
|
|
{
|
|
imageId = SPR_STATION_BASE_B_SW_NE | session->TrackColours[SCHEME_MISC];
|
|
sub_98197C(session, imageId, 0, 0, 32, 28, 2, height - 2, 0, 2, height);
|
|
|
|
imageId = SPR_VIRGINIA_REEL_FLAT_SW_NE | session->TrackColours[SCHEME_TRACK];
|
|
sub_98199C(session, imageId, 0, 0, 32, 20, 2, height, 0, 0, height);
|
|
|
|
paint_util_push_tunnel_left(session, height, TUNNEL_6);
|
|
}
|
|
else if (direction == 1 || direction == 3)
|
|
{
|
|
imageId = SPR_STATION_BASE_B_NW_SE | session->TrackColours[SCHEME_MISC];
|
|
sub_98197C(session, imageId, 0, 0, 28, 32, 2, height - 2, 2, 0, height);
|
|
|
|
imageId = SPR_VIRGINIA_REEL_FLAT_NW_SE | session->TrackColours[SCHEME_TRACK];
|
|
sub_98199C(session, imageId, 0, 0, 20, 32, 2, height, 0, 0, height);
|
|
|
|
paint_util_push_tunnel_right(session, height, TUNNEL_6);
|
|
}
|
|
|
|
wooden_a_supports_paint_setup(session, (direction & 1), 0, height, session->TrackColours[SCHEME_SUPPORTS], nullptr);
|
|
track_paint_util_draw_station(session, rideIndex, direction, height, tileElement);
|
|
|
|
paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
|
|
paint_util_set_general_support_height(session, height + 32, 0x20);
|
|
}
|
|
|
|
static constexpr const uint8_t virginia_reel_left_quarter_turn_supports[] = { 5, 2, 3, 4 };
|
|
|
|
/** rct2: 0x00811304 */
|
|
static void paint_virginia_reel_track_left_quarter_turn_3_tiles(
|
|
paint_session* session, ride_id_t rideIndex, uint8_t trackSequence, uint8_t direction, int32_t height,
|
|
const TileElement* tileElement)
|
|
{
|
|
track_paint_util_left_quarter_turn_3_tiles_paint(
|
|
session, 2, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
|
|
virginia_reel_track_pieces_flat_quarter_turn_3_tiles);
|
|
track_paint_util_left_quarter_turn_3_tiles_tunnel(session, height, TUNNEL_6, direction, trackSequence);
|
|
|
|
switch (trackSequence)
|
|
{
|
|
case 2:
|
|
paint_util_set_segment_support_height(
|
|
session, paint_util_rotate_segments(SEGMENT_C8 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_B8, direction), 0xFFFF, 0);
|
|
break;
|
|
case 0:
|
|
case 3:
|
|
wooden_a_supports_paint_setup(
|
|
session, virginia_reel_left_quarter_turn_supports[direction], 0, height, session->TrackColours[SCHEME_SUPPORTS],
|
|
nullptr);
|
|
paint_util_set_segment_support_height(session, paint_util_rotate_segments(SEGMENTS_ALL, direction), 0xFFFF, 0);
|
|
break;
|
|
}
|
|
|
|
paint_util_set_general_support_height(session, height + 32, 0x20);
|
|
}
|
|
|
|
static constexpr const uint8_t virginia_reel_right_quarter_turn_3_tiles_to_left_turn_map[] = { 3, 1, 2, 0 };
|
|
|
|
/** rct2: 0x00811314 */
|
|
static void paint_virginia_reel_track_right_quarter_turn_3_tiles(
|
|
paint_session* session, ride_id_t rideIndex, uint8_t trackSequence, uint8_t direction, int32_t height,
|
|
const TileElement* tileElement)
|
|
{
|
|
trackSequence = virginia_reel_right_quarter_turn_3_tiles_to_left_turn_map[trackSequence];
|
|
paint_virginia_reel_track_left_quarter_turn_3_tiles(
|
|
session, rideIndex, trackSequence, (direction + 3) % 4, height, tileElement);
|
|
}
|
|
|
|
/** rct2: 0x00811324 */
|
|
static void paint_virginia_reel_track_left_quarter_turn_1_tile(
|
|
paint_session* session, ride_id_t rideIndex, uint8_t trackSequence, uint8_t direction, int32_t height,
|
|
const TileElement* tileElement)
|
|
{
|
|
track_paint_util_left_quarter_turn_1_tile_paint(
|
|
session, 2, height, 0, direction, session->TrackColours[SCHEME_TRACK],
|
|
virginia_reel_track_pieces_flat_quarter_turn_1_tile);
|
|
|
|
switch (direction)
|
|
{
|
|
case 0:
|
|
wooden_a_supports_paint_setup(session, 5, 0, height, session->TrackColours[SCHEME_SUPPORTS], nullptr);
|
|
paint_util_push_tunnel_left(session, height, TUNNEL_6);
|
|
break;
|
|
case 1:
|
|
wooden_a_supports_paint_setup(session, 2, 0, height, session->TrackColours[SCHEME_SUPPORTS], nullptr);
|
|
break;
|
|
case 2:
|
|
wooden_a_supports_paint_setup(session, 3, 0, height, session->TrackColours[SCHEME_SUPPORTS], nullptr);
|
|
paint_util_push_tunnel_right(session, height, TUNNEL_6);
|
|
break;
|
|
case 3:
|
|
wooden_a_supports_paint_setup(session, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS], nullptr);
|
|
paint_util_push_tunnel_right(session, height, TUNNEL_6);
|
|
paint_util_push_tunnel_left(session, height, TUNNEL_6);
|
|
break;
|
|
}
|
|
|
|
paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
|
|
paint_util_set_general_support_height(session, height + 32, 0x20);
|
|
}
|
|
|
|
/** rct2: 0x00811334 */
|
|
static void paint_virginia_reel_track_right_quarter_turn_1_tile(
|
|
paint_session* session, ride_id_t rideIndex, uint8_t trackSequence, uint8_t direction, int32_t height,
|
|
const TileElement* tileElement)
|
|
{
|
|
paint_virginia_reel_track_left_quarter_turn_1_tile(
|
|
session, rideIndex, trackSequence, (direction + 3) % 4, height, tileElement);
|
|
}
|
|
|
|
/**
|
|
* rct2: 0x00811184
|
|
*/
|
|
TRACK_PAINT_FUNCTION get_track_paint_function_virginia_reel(int32_t trackType, int32_t direction)
|
|
{
|
|
switch (trackType)
|
|
{
|
|
case TRACK_ELEM_FLAT:
|
|
return paint_virginia_reel_track_flat;
|
|
|
|
case TRACK_ELEM_END_STATION:
|
|
case TRACK_ELEM_BEGIN_STATION:
|
|
case TRACK_ELEM_MIDDLE_STATION:
|
|
return paint_virginia_reel_station;
|
|
|
|
case TRACK_ELEM_25_DEG_UP:
|
|
return paint_virginia_reel_track_25_deg_up;
|
|
case TRACK_ELEM_FLAT_TO_25_DEG_UP:
|
|
return paint_virginia_reel_track_flat_to_25_deg_up;
|
|
case TRACK_ELEM_25_DEG_UP_TO_FLAT:
|
|
return paint_virginia_reel_track_25_deg_up_to_flat;
|
|
|
|
case TRACK_ELEM_25_DEG_DOWN:
|
|
return paint_virginia_reel_track_25_deg_down;
|
|
case TRACK_ELEM_FLAT_TO_25_DEG_DOWN:
|
|
return paint_virginia_reel_track_flat_to_25_deg_down;
|
|
case TRACK_ELEM_25_DEG_DOWN_TO_FLAT:
|
|
return paint_virginia_reel_track_25_deg_down_to_flat;
|
|
|
|
case TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES:
|
|
return paint_virginia_reel_track_left_quarter_turn_3_tiles;
|
|
case TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES:
|
|
return paint_virginia_reel_track_right_quarter_turn_3_tiles;
|
|
|
|
case TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE:
|
|
return paint_virginia_reel_track_left_quarter_turn_1_tile;
|
|
case TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE:
|
|
return paint_virginia_reel_track_right_quarter_turn_1_tile;
|
|
}
|
|
|
|
return nullptr;
|
|
}
|