/** rct2: 0x */ static void paint_mini_helicopters_track_station(uint8 rideIndex, uint8 trackSequence, uint8 direction, sint32 height, rct_map_element * mapElement) { uint32 imageId; if (direction == 0 || direction == 2) { imageId = SPR_STATION_BASE_B_SW_NE | gTrackColours[SCHEME_MISC]; sub_98197C(imageId, 0, 0, 32, 28, 1, height - 2, 0, 2, height, get_current_rotation()); imageId = SPR_TRACK_SUBMARINE_RIDE_MINI_HELICOPTERS_FLAT_NE_SW | gTrackColours[SCHEME_TRACK]; sub_98199C(imageId, 0, 0, 32, 20, 1, height, 0, 0, height, get_current_rotation()); metal_a_supports_paint_setup(METAL_SUPPORTS_BOXED, 5, 0, height, gTrackColours[SCHEME_SUPPORTS]); metal_a_supports_paint_setup(METAL_SUPPORTS_BOXED, 8, 0, height, gTrackColours[SCHEME_SUPPORTS]); paint_util_push_tunnel_left(height, TUNNEL_6); } else if (direction == 1 || direction == 3) { imageId = SPR_STATION_BASE_B_NW_SE | gTrackColours[SCHEME_MISC]; sub_98197C(imageId, 0, 0, 28, 32, 1, height - 2, 2, 0, height, get_current_rotation()); imageId = SPR_TRACK_SUBMARINE_RIDE_MINI_HELICOPTERS_FLAT_SE_NW | gTrackColours[SCHEME_TRACK]; sub_98199C(imageId, 0, 0, 20, 32, 1, height, 0, 0, height, get_current_rotation()); metal_a_supports_paint_setup(METAL_SUPPORTS_BOXED, 6, 0, height, gTrackColours[SCHEME_SUPPORTS]); metal_a_supports_paint_setup(METAL_SUPPORTS_BOXED, 7, 0, height, gTrackColours[SCHEME_SUPPORTS]); paint_util_push_tunnel_right(height, TUNNEL_6); } track_paint_util_draw_station(rideIndex, trackSequence, direction, height, mapElement); paint_util_set_segment_support_height(SEGMENTS_ALL, 0xFFFF, 0); paint_util_set_general_support_height(height + 32, 0x20); }
/** rct2: 0x008112D4, 0x008112E4, 0x008112F4 */ static void paint_virginia_reel_station(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) { uint32 imageId; if (direction == 0 || direction == 2) { imageId = SPR_STATION_BASE_B_SW_NE | gTrackColours[SCHEME_MISC]; sub_98197C(imageId, 0, 0, 32, 28, 2, height - 2, 0, 2, height, get_current_rotation()); imageId = SPR_VIRGINIA_REEL_FLAT_SW_NE | gTrackColours[SCHEME_TRACK]; sub_98199C(imageId, 0, 0, 32, 20, 2, height, 0, 0, height, get_current_rotation()); paint_util_push_tunnel_left(height, TUNNEL_6); } else if (direction == 1 || direction == 3) { imageId = SPR_STATION_BASE_B_NW_SE | gTrackColours[SCHEME_MISC]; sub_98197C(imageId, 0, 0, 28, 32, 2, height - 2, 2, 0, height, get_current_rotation()); imageId = SPR_VIRGINIA_REEL_FLAT_NW_SE | gTrackColours[SCHEME_TRACK]; sub_98199C(imageId, 0, 0, 20, 32, 2, height, 0, 0, height, get_current_rotation()); paint_util_push_tunnel_right(height, TUNNEL_6); } wooden_a_supports_paint_setup((direction & 1), 0, height, gTrackColours[SCHEME_SUPPORTS], NULL); track_paint_util_draw_station(rideIndex, trackSequence, direction, height, mapElement); paint_util_set_segment_support_height(SEGMENTS_ALL, 0xFFFF, 0); paint_util_set_general_support_height(height + 32, 0x20); }
/** rct2: 0x00770C5C, 0x00770C6C, 0x00770C7C */ static void paint_ghost_train_station( paint_session * session, uint8 rideIndex, [[maybe_unused]] uint8 trackSequence, uint8 direction, sint32 height, const rct_tile_element * tileElement) { uint32 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, 3, height - 2, 0, 2, height); } 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, 3, height - 2, 2, 0, height); } imageId = ghost_train_track_pieces_flat[direction] | session->TrackColours[SCHEME_TRACK]; if (direction == 0 || direction == 2) { sub_98199C(session, imageId, 0, 0, 32, 20, 3, height, 0, 0, height); } else { sub_98199C(session, imageId, 0, 0, 20, 32, 3, height, 0, 0, height); } if (direction == 0 || direction == 2) { paint_util_push_tunnel_left(session, height, TUNNEL_6); } else { paint_util_push_tunnel_right(session, height, TUNNEL_6); } if (direction == 0 || direction == 2) { metal_a_supports_paint_setup(session, METAL_SUPPORTS_BOXED, 5, 0, height, session->TrackColours[SCHEME_SUPPORTS]); metal_a_supports_paint_setup(session, METAL_SUPPORTS_BOXED, 8, 0, height, session->TrackColours[SCHEME_SUPPORTS]); } else { metal_a_supports_paint_setup(session, METAL_SUPPORTS_BOXED, 6, 0, height, session->TrackColours[SCHEME_SUPPORTS]); metal_a_supports_paint_setup(session, METAL_SUPPORTS_BOXED, 7, 0, height, session->TrackColours[SCHEME_SUPPORTS]); } 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 void paint_swinging_inverter_ship_structure(rct_ride * ride, uint8 direction, sint8 axisOffset, uint16 height) { rct_map_element * savedMapElement = g_currently_drawn_item; rct_ride_entry * rideType = get_ride_entry(ride->subtype); rct_vehicle * vehicle = NULL; sint8 xOffset = !(direction & 1) ? axisOffset : 0; sint8 yOffset = (direction & 1) ? axisOffset : 0; if (ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK && ride->vehicles[0] != SPRITE_INDEX_NULL) { vehicle = GET_VEHICLE(ride->vehicles[0]); gPaintInteractionType = VIEWPORT_INTERACTION_ITEM_SPRITE; g_currently_drawn_item = vehicle; } uint32 vehicleImageId = rideType->vehicles[0].base_image_id + swinging_inverter_ship_base_sprite_offset[direction]; if (vehicle != NULL) { sint32 rotation = (sint8) vehicle->vehicle_sprite_type; if (rotation != 0) { vehicleImageId = rideType->vehicles[0].base_image_id + swinging_inverter_ship_animating_base_sprite_offset[direction]; if (direction & 2) { rotation = -rotation; } if (rotation < 0) { rotation += 72; } vehicleImageId += (rotation - 1) << 1; } } uint32 colourFlags = gTrackColours[SCHEME_MISC]; if (colourFlags == 0x20000000) { colourFlags = ride->vehicle_colours[0].body_colour << 19 | ride->vehicle_colours[0].trim_colour << 24 | 0xA0000000; } swinging_inverter_ship_bound_box boundBox = swinging_inverter_ship_bounds[direction]; vehicleImageId = vehicleImageId | colourFlags; uint32 frameImageId = swinging_inverter_ship_frame_sprites[direction] | gTrackColours[SCHEME_TRACK]; if (direction & 2) { sub_98197C(vehicleImageId, xOffset, yOffset, boundBox.length_x, boundBox.length_y, 127, height, boundBox.offset_x, boundBox.offset_y, height, get_current_rotation()); sub_98199C(frameImageId, xOffset, yOffset, boundBox.length_x, boundBox.length_y, 127, height, boundBox.offset_x, boundBox.offset_y, height, get_current_rotation()); } else { sub_98197C(frameImageId, xOffset, yOffset, boundBox.length_x, boundBox.length_y, 127, height, boundBox.offset_x, boundBox.offset_y, height, get_current_rotation()); sub_98199C(vehicleImageId, xOffset, yOffset, boundBox.length_x, boundBox.length_y, 127, height, boundBox.offset_x, boundBox.offset_y, height, get_current_rotation()); } g_currently_drawn_item = savedMapElement; gPaintInteractionType = VIEWPORT_INTERACTION_ITEM_RIDE; }
/** rct2: 0x00760260 */ static void paint_swinging_inverter_ship(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) { uint8 relativeTrackSequence = track_map_1x4[direction][trackSequence]; rct_ride * ride = get_ride(rideIndex); uint32 imageId; if (relativeTrackSequence != 1 && relativeTrackSequence != 3) { if (direction & 1) { metal_a_supports_paint_setup(0, 6, 0, height, gTrackColours[SCHEME_SUPPORTS]); metal_a_supports_paint_setup(0, 7, 0, height, gTrackColours[SCHEME_SUPPORTS]); } else { metal_a_supports_paint_setup(0, 5, 0, height, gTrackColours[SCHEME_SUPPORTS]); metal_a_supports_paint_setup(0, 8, 0, height, gTrackColours[SCHEME_SUPPORTS]); } imageId = SPR_STATION_BASE_D | gTrackColours[SCHEME_SUPPORTS]; sub_98196C(imageId, 0, 0, 32, 32, 1, height, get_current_rotation()); switch (direction) { case 0: imageId = SPR_STATION_PLATFORM_SW_NE | gTrackColours[SCHEME_TRACK]; sub_98196C(imageId, 0, 24, 32, 8, 1, height + 9, get_current_rotation()); break; case 1: imageId = SPR_STATION_PLATFORM_NW_SE | gTrackColours[SCHEME_TRACK]; sub_98196C(imageId, 24, 0, 8, 32, 1, height + 9, get_current_rotation()); break; case 2: imageId = SPR_STATION_PLATFORM_SW_NE | gTrackColours[SCHEME_TRACK]; sub_98199C(imageId, 0, 0, 32, 8, 1, height + 9, -2, 0, height, get_current_rotation()); break; case 3: imageId = SPR_STATION_PLATFORM_NW_SE | gTrackColours[SCHEME_TRACK]; sub_98199C(imageId, 0, 0, 8, 32, 1, height + 9, 0, -2, height, get_current_rotation()); break; } } switch (relativeTrackSequence) { case 1: paint_swinging_inverter_ship_structure(ride, direction, 48, height + 7); break; case 2: paint_swinging_inverter_ship_structure(ride, direction, 16, height + 7); break; case 0: paint_swinging_inverter_ship_structure(ride, direction, -16, height + 7); break; case 3: paint_swinging_inverter_ship_structure(ride, direction, -48, height + 7); break; } paint_util_set_segment_support_height(SEGMENTS_ALL, 0xFFFF, 0); paint_util_set_general_support_height(height + 176, 0x20); }
/** rct2: 0x0070DD7C */ static void paint_observation_tower_section( paint_session * session, uint8 rideIndex, uint8 trackSequence, uint8 direction, sint32 height, const rct_tile_element * tileElement) { if (trackSequence == 1) { return; } uint32 imageId = SPR_OBSERVATION_TOWER_SEGMENT | session->TrackColours[SCHEME_TRACK]; sub_98197C(session, imageId, 0, 0, 2, 2, 30, height, 8, 8, height); const rct_tile_element * nextTileElement = tileElement + 1; if (tileElement->IsLastForTile() || tileElement->clearance_height != nextTileElement->base_height) { imageId = SPR_OBSERVATION_TOWER_SEGMENT_TOP | session->TrackColours[SCHEME_TRACK]; sub_98199C(session, imageId, 0, 0, 2, 2, 30, height, 8, 8, height); } paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0); paint_util_set_vertical_tunnel(session, height + 32); paint_util_set_general_support_height(session, height + 32, 0x20); }
/** * * rct2: 0x006D5B48 */ void vehicle_visual_virginia_reel(int x, int imageDirection, int y, int z, rct_vehicle *vehicle, const rct_ride_entry_vehicle *vehicleEntry) { int image_id; int baseImage_id = imageDirection; const uint8 rotation = get_current_rotation(); int ecx = ((vehicle->var_BA / 8) + (rotation * 8)) & 31; int 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 | (vehicle->colours.body_colour << 19) | (vehicle->colours.trim_colour << 24) | 0xA0000000; sub_98197C(image_id, 0, 0, bb->length_x, bb->length_y, bb->length_z, z, bb->offset_x, bb->offset_y, bb->offset_z + z, rotation); if (unk_140E9A8->zoom_level < 2 && vehicle->num_peeps > 0) { uint8 riding_peep_sprites[4] = {0xFF, 0xFF, 0xFF, 0xFF}; for (int i = 0; i < vehicle->num_peeps; i++) { riding_peep_sprites[((ecx / 8) + i) & 3] = vehicle->peep_tshirt_colours[i]; } int draw_order[4] = {0, 1, 3, 2}; for (int i = 0; i < countof(draw_order); i++) { if (riding_peep_sprites[draw_order[i]] != 0xFF) { image_id = (baseImage_id + ((draw_order[i] + 1) * 72)) | (riding_peep_sprites[draw_order[i]] << 19) | 0x20000000; sub_98199C(image_id, 0, 0, bb->length_x, bb->length_y, bb->length_z, z, bb->offset_x, bb->offset_y, bb->offset_z + z, rotation); } } } assert(vehicleEntry->effect_visual == 1); }
/** * rct2: 0x0076F72C */ static void paint_haunted_house_structure(paint_session * session, uint8 rideIndex, uint8 direction, sint8 xOffset, sint8 yOffset, uint8 part, uint16 height) { const rct_tile_element * savedTileElement = static_cast<const rct_tile_element *>(session->CurrentlyDrawnItem); uint8 frameNum = 0; Ride * ride = get_ride(rideIndex); rct_ride_entry * rideEntry = get_ride_entry(ride->subtype); uint32 baseImageId = rideEntry->vehicles[0].base_image_id; if (ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK && ride->vehicles[0] != SPRITE_INDEX_NULL) { session->InteractionType = VIEWPORT_INTERACTION_ITEM_SPRITE; rct_vehicle * vehicle = GET_VEHICLE(ride->vehicles[0]); session->CurrentlyDrawnItem = vehicle; frameNum = vehicle->vehicle_sprite_type; } uint32 imageId = (baseImageId + direction) | session->TrackColours[SCHEME_MISC]; haunted_house_bound_box boundBox = haunted_house_data[part]; sub_98197C( session, imageId, xOffset, yOffset, boundBox.length_x, boundBox.length_y, 127, height, boundBox.offset_x, boundBox.offset_y, height); rct_drawpixelinfo * dpi = session->Unk140E9A8; if (dpi->zoom_level == 0 && frameNum != 0) { switch (direction) { case 0: imageId = baseImageId + 3 + frameNum; break; case 1: imageId = baseImageId + 21 + frameNum; break; case 2: imageId = baseImageId + 39 + frameNum; break; case 3: imageId = baseImageId + 57 + frameNum; break; } imageId = imageId | session->TrackColours[SCHEME_MISC]; sub_98199C( session, imageId, xOffset, yOffset, boundBox.length_x, boundBox.length_y, 127, height, boundBox.offset_x, boundBox.offset_y, height); } session->CurrentlyDrawnItem = savedTileElement; session->InteractionType = VIEWPORT_INTERACTION_ITEM_RIDE; }
/** * * rct2: 0x006D5FAB */ void vehicle_visual_launched_freefall(sint32 x, sint32 imageDirection, sint32 y, sint32 z, rct_vehicle *vehicle, const rct_ride_entry_vehicle *vehicleEntry) { sint32 image_id; sint32 baseImage_id = vehicleEntry->base_image_id + ((vehicle->restraints_position / 64) * 2); const uint8 rotation = get_current_rotation(); // Draw back: image_id = (baseImage_id + 2) | (vehicle->colours.body_colour << 19) | (vehicle->colours.trim_colour << 24) | 0xA0000000; sub_98197C(image_id, 0, 0, 2, 2, 41, z, -11, -11, z + 1, rotation); // Draw front: image_id = (baseImage_id + 1) | (vehicle->colours.body_colour << 19) | (vehicle->colours.trim_colour << 24) | 0xA0000000; sub_98197C(image_id, 0, 0, 16, 16, 41, z, -5, -5, z + 1, rotation); // Draw peeps: if (unk_140E9A8->zoom_level < 2) { if (vehicle->num_peeps > 0) { baseImage_id = vehicleEntry->base_image_id + 9; if ((vehicle->restraints_position / 64) == 3) { baseImage_id += 2; // Draw peeps sitting without transparent area between them for restraints } image_id = (baseImage_id + ((((imageDirection / 8) + 0) & 3) * 3)) | (vehicle->peep_tshirt_colours[0] << 19) | (vehicle->peep_tshirt_colours[1] << 24) | 0xA0000000; sub_98199C(image_id, 0, 0, 16, 16, 41, z, -5, -5, z + 1, rotation); if (vehicle->num_peeps > 2) { image_id = (baseImage_id + ((((imageDirection / 8) + 1) & 3) * 3)) | (vehicle->peep_tshirt_colours[2] << 19) | (vehicle->peep_tshirt_colours[3] << 24) | 0xA0000000; sub_98199C(image_id, 0, 0, 16, 16, 41, z, -5, -5, z + 1, rotation); } if (vehicle->num_peeps > 4) { image_id = (baseImage_id + ((((imageDirection / 8) + 2) & 3) * 3)) | (vehicle->peep_tshirt_colours[4] << 19) | (vehicle->peep_tshirt_colours[5] << 24) | 0xA0000000; sub_98199C(image_id, 0, 0, 16, 16, 41, z, -5, -5, z + 1, rotation); } if (vehicle->num_peeps > 6) { image_id = (baseImage_id + ((((imageDirection / 8) + 3) & 3) * 3)) | (vehicle->peep_tshirt_colours[6] << 19) | (vehicle->peep_tshirt_colours[7] << 24) | 0xA0000000; sub_98199C(image_id, 0, 0, 16, 16, 41, z, -5, -5, z + 1, rotation); } } } assert(vehicleEntry->effect_visual == 1); }
static void paint_magic_carpet_vehicle(rct_ride *ride, uint8 direction, uint32 swingImageId, rct_xyz16 offset, rct_xyz16 bbOffset, rct_xyz16 bbSize) { rct_ride_entry *rideEntry = get_ride_entry_by_ride(ride); uint32 vehicleImageId = rideEntry->vehicles[0].base_image_id + direction; // Vehicle uint32 imageColourFlags = gTrackColours[SCHEME_MISC]; if (imageColourFlags == IMAGE_TYPE_REMAP) { imageColourFlags = SPRITE_ID_PALETTE_COLOUR_2(ride->vehicle_colours[0].body_colour, ride->vehicle_colours[0].trim_colour); } sint8 directionalOffset = MagicCarpetOscillationXY[swingImageId]; switch (direction) { case 0: offset.x -= directionalOffset; break; case 1: offset.y += directionalOffset; break; case 2: offset.x += directionalOffset; break; case 3: offset.y -= directionalOffset; break; } offset.z += MagicCarpetOscillationZ[swingImageId]; sub_98199C(vehicleImageId | imageColourFlags, (sint8)offset.x, (sint8)offset.y, bbSize.x, bbSize.y, 127, offset.z, bbOffset.x, bbOffset.y, bbOffset.z, get_current_rotation()); // Riders rct_drawpixelinfo *dpi = unk_140E9A8; if (dpi->zoom_level <= 1 && (ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK)) { rct_vehicle *vehicle = get_first_vehicle(ride); if (vehicle != NULL) { uint32 baseImageId = IMAGE_TYPE_REMAP | IMAGE_TYPE_REMAP_2_PLUS | (vehicleImageId + 4); for (uint8 peepIndex = 0; peepIndex < vehicle->num_peeps; peepIndex += 2) { uint32 imageId = baseImageId + (peepIndex * 2); imageId |= (vehicle->peep_tshirt_colours[peepIndex + 0] << 19); imageId |= (vehicle->peep_tshirt_colours[peepIndex + 1] << 24); sub_98199C(imageId, (sint8)offset.x, (sint8)offset.y, bbSize.x, bbSize.y, 127, offset.z, bbOffset.x, bbOffset.y, bbOffset.z, get_current_rotation()); } } } }
/** rct2: 0x008AE25C, 0x008AE26C, 0x008AE27C */ static void paint_monorail_station(uint8 rideIndex, uint8 trackSequence, uint8 direction, sint32 height, rct_map_element * mapElement) { uint32 imageId; if (direction == 0 || direction == 2) { imageId = SPR_STATION_BASE_B_SW_NE | gTrackColours[SCHEME_MISC]; sub_98197C(imageId, 0, 0, 32, 28, 2, height - 2, 0, 2, height, get_current_rotation()); } else if (direction == 1 || direction == 3) { imageId = SPR_STATION_BASE_B_NW_SE | gTrackColours[SCHEME_MISC]; sub_98197C(imageId, 0, 0, 28, 32, 2, height - 2, 2, 0, height, get_current_rotation()); } imageId = monorail_track_pieces_flat[direction] | gTrackColours[SCHEME_TRACK]; if (direction == 0 || direction == 2) { sub_98199C(imageId, 0, 6, 32, 20, 2, height, 0, 0, height, get_current_rotation()); } else { sub_98199C(imageId, 6, 0, 20, 32, 2, height, 0, 0, height, get_current_rotation()); } if (direction == 0 || direction == 2) { paint_util_push_tunnel_left(height, TUNNEL_6); } else { paint_util_push_tunnel_right(height, TUNNEL_6); } if (direction == 0 || direction == 2) { metal_a_supports_paint_setup(METAL_SUPPORTS_BOXED, 5, 0, height, gTrackColours[SCHEME_SUPPORTS]); metal_a_supports_paint_setup(METAL_SUPPORTS_BOXED, 8, 0, height, gTrackColours[SCHEME_SUPPORTS]); } else { metal_a_supports_paint_setup(METAL_SUPPORTS_BOXED, 6, 0, height, gTrackColours[SCHEME_SUPPORTS]); metal_a_supports_paint_setup(METAL_SUPPORTS_BOXED, 7, 0, height, gTrackColours[SCHEME_SUPPORTS]); } track_paint_util_draw_station(rideIndex, trackSequence, direction, height, mapElement); paint_util_set_segment_support_height(SEGMENTS_ALL, 0xFFFF, 0); paint_util_set_general_support_height(height + 32, 0x20); }
/** rct2: 0x008112D4, 0x008112E4, 0x008112F4 */ static void paint_virginia_reel_station( paint_session * session, uint8 rideIndex, uint8 trackSequence, uint8 direction, sint32 height, const rct_tile_element * tileElement) { uint32 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, trackSequence, direction, height, tileElement); paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0); paint_util_set_general_support_height(session, height + 32, 0x20); }
/** rct2: 0x */ static void paint_mini_helicopters_track_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, 1, height - 2, 0, 2, height); imageId = SPR_TRACK_SUBMARINE_RIDE_MINI_HELICOPTERS_FLAT_NE_SW | session->TrackColours[SCHEME_TRACK]; sub_98199C(session, imageId, 0, 0, 32, 20, 1, height, 0, 0, height); metal_a_supports_paint_setup(session, METAL_SUPPORTS_BOXED, 5, 0, height, session->TrackColours[SCHEME_SUPPORTS]); metal_a_supports_paint_setup(session, METAL_SUPPORTS_BOXED, 8, 0, height, session->TrackColours[SCHEME_SUPPORTS]); 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, 1, height - 2, 2, 0, height); imageId = SPR_TRACK_SUBMARINE_RIDE_MINI_HELICOPTERS_FLAT_SE_NW | session->TrackColours[SCHEME_TRACK]; sub_98199C(session, imageId, 0, 0, 20, 32, 1, height, 0, 0, height); metal_a_supports_paint_setup(session, METAL_SUPPORTS_BOXED, 6, 0, height, session->TrackColours[SCHEME_SUPPORTS]); metal_a_supports_paint_setup(session, METAL_SUPPORTS_BOXED, 7, 0, height, session->TrackColours[SCHEME_SUPPORTS]); paint_util_push_tunnel_right(session, height, TUNNEL_6); } 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 void paint_magic_carpet_pendulum(uint8 plane, uint32 swingImageId, uint8 direction, rct_xyz16 offset, rct_xyz16 bbOffset, rct_xyz16 bbSize) { uint32 imageId = swingImageId; if (direction & 2) { imageId = (0 - ((sint32)imageId)) & 31; } if (direction & 1) { imageId += plane == PLANE_BACK ? SPR_MAGIC_CARPET_PENDULUM_NE : SPR_MAGIC_CARPET_PENDULUM_SW; } else { imageId += plane == PLANE_BACK ? SPR_MAGIC_CARPET_PENDULUM_NW : SPR_MAGIC_CARPET_PENDULUM_SE; } imageId |= gTrackColours[SCHEME_TRACK]; sub_98199C(imageId, (sint8)offset.x, (sint8)offset.y, bbSize.x, bbSize.y, 127, offset.z, bbOffset.x, bbOffset.y, bbOffset.z, get_current_rotation()); }
/** * * rct2: 0x006D5DA9 */ void vehicle_visual_roto_drop(int x, int imageDirection, int y, int z, rct_vehicle *vehicle, const rct_ride_entry_vehicle *vehicleEntry) { int image_id; int baseImage_id = (vehicleEntry->base_image_id + 4) + ((vehicle->var_C5 / 4) & 0x3); if (vehicle->restraints_position >= 64) { baseImage_id += 7; baseImage_id += (vehicle->restraints_position / 64); } const uint8 rotation = get_current_rotation(); // Draw back: image_id = baseImage_id | (vehicle->colours.body_colour << 19) | (vehicle->colours.trim_colour << 24) | 0xA0000000; sub_98197C(image_id, 0, 0, 2, 2, 41, z, -11, -11, z + 1, rotation); // Draw front: image_id = (baseImage_id + 4) | (vehicle->colours.body_colour << 19) | (vehicle->colours.trim_colour << 24) | 0xA0000000; sub_98197C(image_id, 0, 0, 16, 16, 41, z, -5, -5, z + 1, rotation); uint8 riding_peep_sprites[64]; memset(riding_peep_sprites, 0xFF, sizeof(riding_peep_sprites)); for (int i = 0; i < vehicle->num_peeps; i++) { uint8 cl = (i & 3) * 16; cl += (i & 0xFC); cl += vehicle->var_C5 / 4; cl += (imageDirection / 8) * 16; cl &= 0x3F; riding_peep_sprites[cl] = vehicle->peep_tshirt_colours[i]; } // Draw riding peep sprites in back to front order: for (int j = 0; j <= 48; j++) { int i = (j % 2) ? (48 - (j / 2)) : (j / 2); if (riding_peep_sprites[i] != 0xFF) { baseImage_id = vehicleEntry->base_image_id + 20 + i; if (vehicle->restraints_position >= 64) { baseImage_id += 64; baseImage_id += vehicle->restraints_position / 64; } image_id = baseImage_id | (riding_peep_sprites[i] << 19) | 0x20000000; sub_98199C(image_id, 0, 0, 16, 16, 41, z, -5, -5, z + 1, rotation); } }; assert(vehicleEntry->effect_visual == 1); // Although called in original code, effect_visual (splash effects) are not used for many rides and does not make sense so it was taken out }
/** rct2: 0x00768A3B */ static void paint_space_rings_structure(rct_ride * ride, uint8 direction, uint32 segment, sint32 height) { rct_map_element * savedMapElement = g_currently_drawn_item; uint32 vehicleIndex = (segment - direction) & 0x3; if (ride->num_stations == 0 || vehicleIndex < ride->num_vehicles) { rct_ride_entry * ride_type = get_ride_entry(ride->subtype); rct_vehicle * vehicle = NULL; sint32 frameNum = direction; uint32 baseImageId = ride_type->vehicles[0].base_image_id; if (ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK && ride->vehicles[0] != SPRITE_INDEX_NULL) { gPaintInteractionType = VIEWPORT_INTERACTION_ITEM_SPRITE; vehicle = GET_VEHICLE(ride->vehicles[vehicleIndex]); g_currently_drawn_item = vehicle; frameNum += (sint8) vehicle->vehicle_sprite_type * 4; } uint32 imageColourFlags = gTrackColours[SCHEME_MISC]; if ((ride->colour_scheme_type & 3) != RIDE_COLOUR_SCHEME_DIFFERENT_PER_TRAIN) { vehicleIndex = 0; } if (imageColourFlags == IMAGE_TYPE_REMAP) { imageColourFlags = SPRITE_ID_PALETTE_COLOUR_2(ride->vehicle_colours[vehicleIndex].body_colour, ride->vehicle_colours[0].trim_colour); } uint32 imageId = (baseImageId + frameNum) | imageColourFlags; sub_98197C(imageId, 0, 0, 20, 20, 23, height, -10, -10, height, get_current_rotation()); if (vehicle != NULL && vehicle->num_peeps > 0) { rct_peep * rider = GET_PEEP(vehicle->peep[0]); imageColourFlags = SPRITE_ID_PALETTE_COLOUR_2(rider->tshirt_colour, rider->trousers_colour); imageId = ((baseImageId & 0x7FFFF) + 352 + frameNum) | imageColourFlags; sub_98199C(imageId, 0, 0, 20, 20, 23, height, -10, -10, height, get_current_rotation()); } } g_currently_drawn_item = savedMapElement; gPaintInteractionType = VIEWPORT_INTERACTION_ITEM_RIDE; }
static void paint_magic_carpet_frame(uint8 plane, uint8 direction, rct_xyz16 offset, rct_xyz16 bbOffset, rct_xyz16 bbSize) { uint32 imageId; if (direction & 1) { imageId = plane == PLANE_BACK ? SPR_MAGIC_CARPET_FRAME_NE : SPR_MAGIC_CARPET_FRAME_SW; } else { imageId = plane == PLANE_BACK ? SPR_MAGIC_CARPET_FRAME_NW : SPR_MAGIC_CARPET_FRAME_SE; } imageId |= gTrackColours[SCHEME_TRACK]; if (plane == PLANE_BACK) { sub_98197C(imageId, (sint8)offset.x, (sint8)offset.y, bbSize.x, bbSize.y, 127, offset.z, bbOffset.x, bbOffset.y, bbOffset.z, get_current_rotation()); } else { sub_98199C(imageId, (sint8)offset.x, (sint8)offset.y, bbSize.x, bbSize.y, 127, offset.z, bbOffset.x, bbOffset.y, bbOffset.z, get_current_rotation()); } }
/** rct2: 0x008861A4 */ static void paint_roto_drop_tower_section(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) { if (trackSequence == 1) { return; } uint32 imageId = SPR_ROTO_DROP_TOWER_SEGMENT | gTrackColours[SCHEME_TRACK]; sub_98197C(imageId, 0, 0, 2, 2, 30, height, 8, 8, height, get_current_rotation()); rct_map_element * nextMapElement = mapElement + 1; if (map_element_is_last_for_tile(mapElement) || mapElement->clearance_height != nextMapElement->base_height) { uint32 imageId = SPR_ROTO_DROP_TOWER_SEGMENT_TOP | gTrackColours[SCHEME_TRACK]; sub_98199C(imageId, 0, 0, 2, 2, 30, height, 8, 8, height, get_current_rotation()); } paint_util_set_segment_support_height(SEGMENTS_ALL, 0xFFFF, 0); paint_util_set_vertical_tunnel(height + 32); paint_util_set_general_support_height(height + 32, 0x20); }
/** * * rct2: 0x006658ED */ static void park_entrance_paint(paint_session* session, uint8_t direction, int32_t height, const TileElement* tile_element) { if (gTrackDesignSaveMode || (session->ViewFlags & VIEWPORT_FLAG_HIGHLIGHT_PATH_ISSUES)) return; #ifdef __ENABLE_LIGHTFX__ if (lightfx_is_available()) { lightfx_add_3d_light_magic_from_drawing_tile(session->MapPosition, 0, 0, 155, LIGHTFX_LIGHT_TYPE_LANTERN_3); } #endif session->InteractionType = VIEWPORT_INTERACTION_ITEM_PARK; _unk9E32BC = 0; uint32_t image_id, ghost_id = 0; if (tile_element->IsGhost()) { session->InteractionType = VIEWPORT_INTERACTION_ITEM_NONE; ghost_id = CONSTRUCTION_MARKER; _unk9E32BC = ghost_id; } // Index to which part of the entrance // Middle, left, right uint8_t part_index = tile_element->AsEntrance()->GetSequenceIndex(); PathSurfaceEntry* path_entry = nullptr; // The left and right of the park entrance often have this set to 127. // So only attempt to get the footpath type if we're dealing with the middle bit of the entrance. if (part_index == 0) path_entry = get_path_surface_entry(tile_element->AsEntrance()->GetPathType()); rct_entrance_type* entrance; uint8_t di = ((direction / 2 + part_index / 2) & 1) ? 0x1A : 0x20; switch (part_index) { case 0: if (path_entry != nullptr) { image_id = (path_entry->image + 5 * (1 + (direction & 1))) | ghost_id; sub_98197C(session, image_id, 0, 0, 32, 0x1C, 0, height, 0, 2, height); } entrance = (rct_entrance_type*)object_entry_get_chunk(OBJECT_TYPE_PARK_ENTRANCE, 0); if (entrance == nullptr) { return; } image_id = (entrance->image_id + direction * 3) | ghost_id; sub_98197C(session, image_id, 0, 0, 0x1C, 0x1C, 0x2F, height, 2, 2, height + 32); if ((direction + 1) & (1 << 1)) break; if (ghost_id != 0) break; { rct_string_id park_text_id = STR_BANNER_TEXT_CLOSED; set_format_arg(0, uint32_t, 0); set_format_arg(4, uint32_t, 0); if (gParkFlags & PARK_FLAGS_PARK_OPEN) { set_format_arg(0, rct_string_id, gParkName); set_format_arg(2, uint32_t, gParkNameArgs); park_text_id = STR_BANNER_TEXT_FORMAT; } utf8 park_name[256]; if (gConfigGeneral.upper_case_banners) { format_string_to_upper(park_name, sizeof(park_name), park_text_id, gCommonFormatArgs); } else { format_string(park_name, sizeof(park_name), park_text_id, gCommonFormatArgs); } gCurrentFontSpriteBase = FONT_SPRITE_BASE_TINY; uint16_t string_width = gfx_get_string_width(park_name); uint16_t scroll = (gCurrentTicks / 2) % string_width; if (entrance->scrolling_mode == SCROLLING_MODE_NONE) break; int32_t stsetup = scrolling_text_setup(session, park_text_id, scroll, entrance->scrolling_mode + direction / 2); int32_t text_height = height + entrance->text_height; sub_98199C(session, stsetup, 0, 0, 0x1C, 0x1C, 0x2F, text_height, 2, 2, text_height); } break; case 1: case 2: entrance = (rct_entrance_type*)object_entry_get_chunk(OBJECT_TYPE_PARK_ENTRANCE, 0); if (entrance == nullptr) { return; } image_id = (entrance->image_id + part_index + direction * 3) | ghost_id; sub_98197C(session, image_id, 0, 0, 0x1A, di, 0x4F, height, 3, 3, height); break; } image_id = ghost_id; if (image_id == 0) { image_id = SPRITE_ID_PALETTE_COLOUR_1(COLOUR_SATURATED_BROWN); } wooden_a_supports_paint_setup(session, direction & 1, 0, height, image_id, nullptr); paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0); paint_util_set_general_support_height(session, height + 80, 0x20); }
/** * * rct2: 0x0076750D */ static void top_spin_paint_vehicle( paint_session * session, sint8 al, sint8 cl, uint8 rideIndex, uint8 direction, sint32 height, const rct_tile_element * tileElement) { uint16 boundBoxOffsetX, boundBoxOffsetY, boundBoxOffsetZ; // As we will be drawing a vehicle we need to backup the tileElement that // is assigned to the drawings. const rct_tile_element * curTileElement = static_cast<const rct_tile_element *>(session->CurrentlyDrawnItem); height += 3; Ride * ride = get_ride(rideIndex); rct_ride_entry * rideEntry = get_ride_entry(ride->subtype); rct_vehicle * vehicle = nullptr; uint8 seatRotation = 0; sint8 armRotation = 0; if (ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK && ride->vehicles[0] != SPRITE_INDEX_NULL) { vehicle = GET_VEHICLE(ride->vehicles[0]); session->InteractionType = VIEWPORT_INTERACTION_ITEM_SPRITE; session->CurrentlyDrawnItem = vehicle; armRotation = vehicle->vehicle_sprite_type; seatRotation = vehicle->bank_rotation; } boundBoxOffsetX = al + 16; boundBoxOffsetY = cl + 16; boundBoxOffsetZ = height; // di uint8 lengthX = 24; // si uint8 lengthY = 24; uint32 image_id = session->TrackColours[SCHEME_MISC]; if (image_id == IMAGE_TYPE_REMAP) { image_id = SPRITE_ID_PALETTE_COLOUR_2(ride->track_colour_main[0], ride->track_colour_supports[0]); } image_id += (direction & 1) << 1; image_id += rideEntry->vehicles[0].base_image_id; // Left back bottom support image_id += 572; sub_98197C(session, image_id, al, cl, lengthX, lengthY, 90, height, boundBoxOffsetX, boundBoxOffsetY, boundBoxOffsetZ); image_id = session->TrackColours[SCHEME_MISC]; if (image_id == IMAGE_TYPE_REMAP) { image_id = SPRITE_ID_PALETTE_COLOUR_2(ride->track_colour_main[0], ride->track_colour_additional[0]); } sint32 var_1F = armRotation; if (direction & 2) { var_1F = -var_1F; if (var_1F != 0) var_1F += 48; } image_id += var_1F; image_id += (direction & 1) * 48; image_id += rideEntry->vehicles[0].base_image_id; // Left hand arm image_id += 380; sub_98199C(session, image_id, al, cl, lengthX, lengthY, 90, height, boundBoxOffsetX, boundBoxOffsetY, boundBoxOffsetZ); uint32 seatImageId; if (vehicle != nullptr && vehicle->restraints_position >= 64) { // Open Restraints image_id = (vehicle->restraints_position - 64) >> 6; image_id += direction * 3; image_id += rideEntry->vehicles[0].base_image_id; image_id += 64; seatImageId = image_id; }
/** * * rct2: 0x006DFF47 */ void scenery_paint(uint8 direction, sint32 height, rct_map_element* mapElement) { //RCT2_CALLPROC_X(0x6DFF47, 0, 0, direction, height, (sint32)mapElement, 0, 0); return; gPaintInteractionType = VIEWPORT_INTERACTION_ITEM_SCENERY; rct_xyz16 boxlength; rct_xyz16 boxoffset; boxoffset.x = 0; boxoffset.y = 0; boxoffset.z = height; sint32 baseImageid = 0; const sint32 rotation = get_current_rotation(); if (gTrackDesignSaveMode) { if (!track_design_save_contains_map_element(mapElement)) { baseImageid = 0x21700000; } } if (mapElement->flags & MAP_ELEMENT_FLAG_GHOST) { gPaintInteractionType = VIEWPORT_INTERACTION_ITEM_NONE; baseImageid = construction_markers[gConfigGeneral.construction_marker_colour]; } uint32 dword_F64EB0 = baseImageid; rct_scenery_entry *entry = get_small_scenery_entry(mapElement->properties.scenery.type); baseImageid = entry->image + direction; boxlength.x = 2; boxlength.y = 2; sint8 x_offset = 0; sint8 y_offset = 0; if (entry->small_scenery.flags & SMALL_SCENERY_FLAG_FULL_TILE) { if (entry->small_scenery.flags & SMALL_SCENERY_FLAG24) { // 6DFFE3: boxoffset.x = offsets[direction].x; boxoffset.y = offsets[direction].y; boxlength.x = lengths[direction].x; boxlength.y = lengths[direction].y; x_offset = 3; y_offset = 3; } else { x_offset = 15; y_offset = 15; if (entry->small_scenery.flags & SMALL_SCENERY_FLAG_VOFFSET_CENTRE) { x_offset = 3; y_offset = 3; boxlength.x = 26; boxlength.y = 26; if (entry->small_scenery.flags & SMALL_SCENERY_FLAG_ALLOW_WALLS) { x_offset = 1; y_offset = 1; boxlength.x = 30; boxlength.y = 30; } } boxoffset.x = x_offset; boxoffset.y = y_offset; } } else { // 6DFFC2: uint8 ecx = (map_element_get_scenery_quadrant(mapElement) + rotation) & 3; x_offset = ScenerySubTileOffsets[ecx].x; y_offset = ScenerySubTileOffsets[ecx].y; boxoffset.x = x_offset; boxoffset.y = y_offset; } // 6E007F: boxlength.z = entry->small_scenery.height - 4; if (boxlength.z > 128 || boxlength.z < 0) { boxlength.z = 128; } if (entry->small_scenery.flags & SMALL_SCENERY_FLAG6) { if (mapElement->properties.scenery.age >= 40) { baseImageid += 4; } if (mapElement->properties.scenery.age >= 55) { baseImageid += 4; } } if (entry->small_scenery.flags & SMALL_SCENERY_FLAG_HAS_PRIMARY_COLOUR) { baseImageid |= ((mapElement->properties.scenery.colour_1 & 0x1F) << 19) | 0x20000000; if (entry->small_scenery.flags & SMALL_SCENERY_FLAG_HAS_SECONDARY_COLOUR) { baseImageid |= ((mapElement->properties.scenery.colour_2 & 0x1F) << 24) | 0x80000000; } } if (dword_F64EB0 != 0) { baseImageid = (baseImageid & 0x7FFFF) | dword_F64EB0; } if (!(entry->small_scenery.flags & SMALL_SCENERY_FLAG21)) { sub_98197C(baseImageid, x_offset, y_offset, boxlength.x, boxlength.y, boxlength.z - 1, height, boxoffset.x, boxoffset.y, boxoffset.z, rotation); } if (entry->small_scenery.flags & SMALL_SCENERY_FLAG_HAS_GLASS) { if (dword_F64EB0 == 0) { // Draw translucent overlay: // TODO: Name palette entries sint32 image_id = (baseImageid & 0x7FFFF) + (GlassPaletteIds[(mapElement->properties.scenery.colour_1 & 0x1F)] << 19) + 0x40000004; sub_98199C(image_id, x_offset, y_offset, boxlength.x, boxlength.y, boxlength.z - 1, height, boxoffset.x, boxoffset.y, boxoffset.z, rotation); } } if (entry->small_scenery.flags & SMALL_SCENERY_FLAG_ANIMATED) { rct_drawpixelinfo* dpi = unk_140E9A8; if ( (entry->small_scenery.flags & SMALL_SCENERY_FLAG21) || (dpi->zoom_level <= 1) ) { // 6E01A9: if (entry->small_scenery.flags & SMALL_SCENERY_FLAG12) { // 6E0512: sint32 image_id = ((gCurrentTicks / 2) & 0xF) + entry->image + 4; if (dword_F64EB0 != 0) { image_id = (image_id & 0x7FFFF) | dword_F64EB0; } sub_98199C(image_id, x_offset, y_offset, boxlength.x, boxlength.y, boxlength.z - 1, height, boxoffset.x, boxoffset.y, boxoffset.z, rotation); } else if (entry->small_scenery.flags & SMALL_SCENERY_FLAG13) { // 6E043B: sint32 image_id = ((gCurrentTicks / 2) & 0xF) + entry->image + 8; if (dword_F64EB0 != 0) { image_id = (image_id & 0x7FFFF) | dword_F64EB0; } sub_98199C(image_id, x_offset, y_offset, boxlength.x, boxlength.y, boxlength.z - 1, height, boxoffset.x, boxoffset.y, boxoffset.z, rotation); image_id = direction + entry->image + 4; if (dword_F64EB0 != 0) { image_id = (image_id & 0x7FFFF) | dword_F64EB0; } sub_98199C(image_id, x_offset, y_offset, boxlength.x, boxlength.y, boxlength.z - 1, height, boxoffset.x, boxoffset.y, boxoffset.z, rotation); image_id = ((gCurrentTicks / 2) & 0xF) + entry->image + 24; if (dword_F64EB0 != 0) { image_id = (image_id & 0x7FFFF) | dword_F64EB0; } sub_98199C(image_id, x_offset, y_offset, boxlength.x, boxlength.y, boxlength.z - 1, height, boxoffset.x, boxoffset.y, boxoffset.z, rotation); } else if (entry->small_scenery.flags & SMALL_SCENERY_FLAG_IS_CLOCK) { // 6E035C: sint32 minuteImageOffset = ((gRealTimeOfDay.minute + 6) * 17) / 256; sint32 timeImageBase = gRealTimeOfDay.hour; while (timeImageBase >= 12) { timeImageBase -= 12; } timeImageBase = (timeImageBase * 4) + minuteImageOffset; if (timeImageBase >= 48) { timeImageBase -= 48; } sint32 image_id = timeImageBase + (direction * 12); if (image_id >= 48) { image_id -= 48; } image_id = image_id + entry->image + 68; if (dword_F64EB0 != 0) { image_id = (image_id & 0x7FFFF) | dword_F64EB0; } sub_98199C(image_id, x_offset, y_offset, boxlength.x, boxlength.y, boxlength.z - 1, height, boxoffset.x, boxoffset.y, boxoffset.z, rotation); image_id = gRealTimeOfDay.minute + (direction * 15); if (image_id >= 60) { image_id -= 60; } image_id = image_id + entry->image + 8; if (dword_F64EB0 != 0) { image_id = (image_id & 0x7FFFF) | dword_F64EB0; } sub_98199C(image_id, x_offset, y_offset, boxlength.x, boxlength.y, boxlength.z - 1, height, boxoffset.x, boxoffset.y, boxoffset.z, rotation); } else if (entry->small_scenery.flags & SMALL_SCENERY_FLAG15) { // 6E02F6: sint32 image_id = gCurrentTicks; image_id += gUnk9DE568 / 4; image_id += gUnk9DE56C / 4; image_id = (image_id / 4) & 15; image_id += entry->image; if (dword_F64EB0 != 0) { image_id = (image_id & 0x7FFFF) | dword_F64EB0; } sub_98199C(image_id, x_offset, y_offset, boxlength.x, boxlength.y, boxlength.z - 1, height, boxoffset.x, boxoffset.y, boxoffset.z, rotation); } else { if (entry->small_scenery.flags & SMALL_SCENERY_FLAG16) { // nothing } sint32 esi = gCurrentTicks; if (!(entry->small_scenery.flags & SMALL_SCENERY_FLAG22)) { // 6E01F8: esi += ((gUnk9DE568 / 4) + (gUnk9DE56C / 4)); esi += (mapElement->type & 0xC0) / 16; } // 6E0222: uint16 cx = entry->small_scenery.var_14; uint8 cl = cx & 0xFF; esi >>= cl; esi &= entry->small_scenery.var_16; sint32 image_id = 0; if (esi < entry->small_scenery.var_18) { image_id = entry->small_scenery.var_10[esi]; } image_id = (image_id * 4) + direction + entry->image; if (entry->small_scenery.flags & (SMALL_SCENERY_FLAG21 | SMALL_SCENERY_FLAG17)) { image_id += 4; } if (entry->small_scenery.flags & SMALL_SCENERY_FLAG_HAS_PRIMARY_COLOUR) { image_id |= ((mapElement->properties.scenery.colour_1 & 0x1F) << 19) | 0x20000000; if (entry->small_scenery.flags & SMALL_SCENERY_FLAG_HAS_SECONDARY_COLOUR) { image_id |= ((mapElement->properties.scenery.colour_2 & 0x1F) << 24) | 0x80000000; } } if (dword_F64EB0 != 0) { image_id = (image_id & 0x7FFFF) | dword_F64EB0; } if (entry->small_scenery.flags & SMALL_SCENERY_FLAG21) { sub_98197C(image_id, x_offset, y_offset, boxlength.x, boxlength.y, boxlength.z - 1, height, boxoffset.x, boxoffset.y, boxoffset.z, rotation); } else { sub_98199C(image_id, x_offset, y_offset, boxlength.x, boxlength.y, boxlength.z - 1, height, boxoffset.x, boxoffset.y, boxoffset.z, rotation); } } } }
/** * * rct2: 0x0066508C, 0x00665540 */ static void ride_entrance_exit_paint(paint_session* session, uint8_t direction, int32_t height, const TileElement* tile_element) { uint8_t is_exit = tile_element->AsEntrance()->GetEntranceType() == ENTRANCE_TYPE_RIDE_EXIT; if (gTrackDesignSaveMode || (session->ViewFlags & VIEWPORT_FLAG_HIGHLIGHT_PATH_ISSUES)) { if (tile_element->AsEntrance()->GetRideIndex() != gTrackDesignSaveRideIndex) return; } #ifdef __ENABLE_LIGHTFX__ if (lightfx_is_available()) { if (!is_exit) { lightfx_add_3d_light_magic_from_drawing_tile(session->MapPosition, 0, 0, height + 45, LIGHTFX_LIGHT_TYPE_LANTERN_3); } switch (tile_element->GetDirection()) { case 0: lightfx_add_3d_light_magic_from_drawing_tile( session->MapPosition, 16, 0, height + 16, LIGHTFX_LIGHT_TYPE_LANTERN_2); break; case 1: lightfx_add_3d_light_magic_from_drawing_tile( session->MapPosition, 0, -16, height + 16, LIGHTFX_LIGHT_TYPE_LANTERN_2); break; case 2: lightfx_add_3d_light_magic_from_drawing_tile( session->MapPosition, -16, 0, height + 16, LIGHTFX_LIGHT_TYPE_LANTERN_2); break; case 3: lightfx_add_3d_light_magic_from_drawing_tile( session->MapPosition, 0, 16, height + 16, LIGHTFX_LIGHT_TYPE_LANTERN_2); break; }; } #endif Ride* ride = get_ride(tile_element->AsEntrance()->GetRideIndex()); auto stationObj = ride_get_station_object(ride); if (stationObj == nullptr || stationObj->BaseImageId == 0) { return; } uint8_t colour_1, colour_2; uint32_t transparant_image_id = 0, image_id = 0; if (stationObj->Flags & STATION_OBJECT_FLAGS::IS_TRANSPARENT) { colour_1 = GlassPaletteIds[ride->track_colour[0].main]; transparant_image_id = (colour_1 << 19) | IMAGE_TYPE_TRANSPARENT; } colour_1 = ride->track_colour[0].main; colour_2 = ride->track_colour[0].additional; image_id = (colour_1 << 19) | (colour_2 << 24) | IMAGE_TYPE_REMAP | IMAGE_TYPE_REMAP_2_PLUS; session->InteractionType = VIEWPORT_INTERACTION_ITEM_RIDE; _unk9E32BC = 0; if (tile_element->IsGhost()) { session->InteractionType = VIEWPORT_INTERACTION_ITEM_NONE; image_id = CONSTRUCTION_MARKER; _unk9E32BC = image_id; if (transparant_image_id) transparant_image_id = image_id; } if (is_exit) { image_id |= stationObj->BaseImageId + direction + 8; } else { image_id |= stationObj->BaseImageId + direction; } // Format modified to stop repeated code // Each entrance is split into 2 images for drawing // Certain entrance styles have another 2 images to draw for coloured windows int8_t ah = is_exit ? 0x23 : 0x33; int16_t lengthY = (direction & 1) ? 28 : 2; int16_t lengthX = (direction & 1) ? 2 : 28; sub_98197C(session, image_id, 0, 0, lengthX, lengthY, ah, height, 2, 2, height); if (transparant_image_id) { if (is_exit) { transparant_image_id |= stationObj->BaseImageId + direction + 24; } else { transparant_image_id |= stationObj->BaseImageId + direction + 16; } sub_98199C(session, transparant_image_id, 0, 0, lengthX, lengthY, ah, height, 2, 2, height); } image_id += 4; sub_98197C( session, image_id, 0, 0, lengthX, lengthY, ah, height, (direction & 1) ? 28 : 2, (direction & 1) ? 2 : 28, height); if (transparant_image_id) { transparant_image_id += 4; sub_98199C( session, transparant_image_id, 0, 0, lengthX, lengthY, ah, height, (direction & 1) ? 28 : 2, (direction & 1) ? 2 : 28, height); } if (direction & 1) { paint_util_push_tunnel_right(session, height, TUNNEL_6); } else { paint_util_push_tunnel_left(session, height, TUNNEL_6); } if (!is_exit && !(tile_element->IsGhost()) && tile_element->AsEntrance()->GetRideIndex() != RIDE_ID_NULL && stationObj->ScrollingMode != SCROLLING_MODE_NONE) { set_format_arg(0, uint32_t, 0); set_format_arg(4, uint32_t, 0); rct_string_id string_id = STR_RIDE_ENTRANCE_CLOSED; if (ride->status == RIDE_STATUS_OPEN && !(ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN)) { set_format_arg(0, rct_string_id, ride->name); set_format_arg(2, uint32_t, ride->name_arguments); string_id = STR_RIDE_ENTRANCE_NAME; } utf8 entrance_string[256]; if (gConfigGeneral.upper_case_banners) { format_string_to_upper(entrance_string, sizeof(entrance_string), string_id, gCommonFormatArgs); } else { format_string(entrance_string, sizeof(entrance_string), string_id, gCommonFormatArgs); } gCurrentFontSpriteBase = FONT_SPRITE_BASE_TINY; uint16_t string_width = gfx_get_string_width(entrance_string); uint16_t scroll = (gCurrentTicks / 2) % string_width; sub_98199C( session, scrolling_text_setup(session, string_id, scroll, stationObj->ScrollingMode), 0, 0, 0x1C, 0x1C, 0x33, height + stationObj->Height, 2, 2, height + stationObj->Height); } image_id = _unk9E32BC; if (image_id == 0) { image_id = SPRITE_ID_PALETTE_COLOUR_1(COLOUR_SATURATED_BROWN); } wooden_a_supports_paint_setup(session, direction & 1, 0, height, image_id, nullptr); paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0); height += is_exit ? 40 : 56; paint_util_set_general_support_height(session, height, 0x20); }
/** * * rct2: 0x006D5B48 */ void vehicle_visual_virginia_reel(paint_session * session, sint32 x, sint32 imageDirection, sint32 y, sint32 z, rct_vehicle * vehicle, const rct_ride_entry_vehicle * vehicleEntry) { sint32 image_id; sint32 baseImage_id = imageDirection; const uint8 rotation = session->CurrentRotation; sint32 ecx = ((vehicle->spin_sprite / 8) + (rotation * 8)) & 31; sint32 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); 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->Unk140E9A8->zoom_level < 2 && vehicle->num_peeps > 0) { uint8 riding_peep_sprites[4] = { 0xFF, 0xFF, 0xFF, 0xFF }; for (sint32 i = 0; i < vehicle->num_peeps; i++) { riding_peep_sprites[((ecx / 8) + i) & 3] = vehicle->peep_tshirt_colours[i]; } sint32 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); }