From 055ecccf36f3ebe157019693d9029c8ea16a9041 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Wed, 4 Oct 2017 17:14:53 +0200 Subject: [PATCH] Clean up more track flags --- src/openrct2/ride/TrackDesign.cpp | 10 ++-- src/openrct2/ride/ride.c | 58 ++++++++++++--------- src/openrct2/ride/track.c | 62 ++++++++++++++++++----- src/openrct2/ride/track.h | 7 ++- src/openrct2/ride/track_design_save.c | 25 +++++---- src/openrct2/ride/track_paint.c | 2 +- src/openrct2/ride/vehicle.c | 28 ++++++---- src/openrct2/windows/Ride.cpp | 2 +- src/openrct2/windows/RideConstruction.cpp | 8 ++- test/testpaint/compat.c | 5 ++ 10 files changed, 145 insertions(+), 62 deletions(-) diff --git a/src/openrct2/ride/TrackDesign.cpp b/src/openrct2/ride/TrackDesign.cpp index 34cfecb147..c33ce10d44 100644 --- a/src/openrct2/ride/TrackDesign.cpp +++ b/src/openrct2/ride/TrackDesign.cpp @@ -1419,10 +1419,14 @@ static bool track_design_place_ride(rct_track_td6 * td6, sint16 x, sint16 y, sin //di sint16 tempZ = z - trackCoordinates->z_begin; + uint32 trackColour = (track->flags >> 4) & 0x3; + uint32 brakeSpeed = (track->flags & 0x0F) * 2; + uint32 seatRotation = track->flags & 0x0F; + uint32 edi = - ((track->flags & 0x0F) << 17) | - ((uint32) (track->flags & 0x0F) << 28) | - (((track->flags >> 4) & 0x03) << 24) | + (brakeSpeed << 16) | + (seatRotation << 28) | + (trackColour << 24) | (tempZ & 0xFFFF); sint32 edx = _currentRideIndex | (trackType << 8); diff --git a/src/openrct2/ride/ride.c b/src/openrct2/ride/ride.c index ab39c711c6..ba08879e2d 100644 --- a/src/openrct2/ride/ride.c +++ b/src/openrct2/ride/ride.c @@ -1330,36 +1330,39 @@ sint32 sub_6C683D(sint32* x, sint32* y, sint32* z, sint32 direction, sint32 type successMapElement = mapElement; break; } - } while (!map_element_is_last_for_tile(mapElement++)); + } + while (!map_element_is_last_for_tile(mapElement++)); - if (successMapElement == NULL) { + if (successMapElement == NULL) + { return 1; } - if (i == 0 && output_element != NULL) { + if (i == 0 && output_element != NULL) + { *output_element = mapElement; } - if (flags & (1 << 0)) { - // Switch highlight off + if (flags & (1 << 0)) + { mapElement->type &= ~MAP_ELEMENT_TYPE_FLAG_HIGHLIGHT; } - if (flags & (1 << 1)) { - // Switch highlight on + if (flags & (1 << 1)) + { mapElement->type |= MAP_ELEMENT_TYPE_FLAG_HIGHLIGHT; } - if (flags & (1 << 2)) { - mapElement->properties.track.colour &= 0xFC; - mapElement->properties.track.colour |= extra_params & 0xFF; + if (flags & (1 << 2)) + { + track_element_set_colour_scheme(mapElement, (uint8)(extra_params & 0xFF)); } - if (flags & (1 << 5)) { - // Seat rotation - mapElement->properties.track.colour &= 0x0F; - mapElement->properties.track.colour |= (extra_params & 0xFF) << 4; + if (flags & (1 << 5)) + { + track_element_set_seat_rotation(mapElement, (uint8)(extra_params & 0xFF)); } if (flags & (1 << 3)) { track_element_set_cable_lift(mapElement); } - if (flags & (1 << 4)) { + if (flags & (1 << 4)) + { track_element_clear_cable_lift(mapElement); } } @@ -1546,8 +1549,10 @@ void ride_construction_set_default_next_piece() // Set whether track is covered _currentTrackAlternative &= ~RIDE_TYPE_ALTERNATIVE_TRACK_TYPE; - if (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_HAS_ALTERNATIVE_TRACK_TYPE) { - if (mapElement->properties.track.colour & TRACK_ELEMENT_COLOUR_FLAG_INVERTED) { + if (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_HAS_ALTERNATIVE_TRACK_TYPE) + { + if (track_element_is_inverted(mapElement)) + { _currentTrackAlternative |= RIDE_TYPE_ALTERNATIVE_TRACK_TYPE; } } @@ -1601,17 +1606,22 @@ void ride_construction_set_default_next_piece() // Set whether track is covered _currentTrackAlternative &= ~RIDE_TYPE_ALTERNATIVE_TRACK_TYPE; - if (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_HAS_ALTERNATIVE_TRACK_TYPE) { - if (mapElement->properties.track.colour & TRACK_ELEMENT_COLOUR_FLAG_INVERTED) { + if (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_HAS_ALTERNATIVE_TRACK_TYPE) + { + if (track_element_is_inverted(mapElement)) + { _currentTrackAlternative |= RIDE_TYPE_ALTERNATIVE_TRACK_TYPE; } } - if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) { + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) + { curve = gFlatRideTrackCurveChain[trackType].previous; bank = FlatRideTrackDefinitions[trackType].bank_start; slope = FlatRideTrackDefinitions[trackType].vangle_start; - } else { + } + else + { if (track_element_is_booster(ride->type, trackType)) { curve = 0x100 | TRACK_ELEM_BOOSTER; } else { @@ -4656,8 +4666,10 @@ static rct_vehicle *vehicle_create_car( vehicle->track_progress = 15; } vehicle->update_flags = VEHICLE_UPDATE_FLAG_1; - if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_HAS_INVERTED_SPRITE_SET) { - if (mapElement->properties.track.colour & TRACK_ELEMENT_COLOUR_FLAG_INVERTED) { + if (vehicleEntry->flags & VEHICLE_ENTRY_FLAG_HAS_INVERTED_SPRITE_SET) + { + if (track_element_is_inverted(mapElement)) + { vehicle->update_flags |= VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES; } } diff --git a/src/openrct2/ride/track.c b/src/openrct2/ride/track.c index fab2ad4e70..5e044a9bef 100644 --- a/src/openrct2/ride/track.c +++ b/src/openrct2/ride/track.c @@ -37,6 +37,7 @@ #include "station.h" #include "track.h" #include "track_data.h" +#include "../world/map.h" uint8 gTrackGroundFlags; @@ -897,7 +898,7 @@ static bool track_remove_station_element(sint32 x, sint32 y, sint32 z, sint32 di return true; } -static money32 track_place(sint32 rideIndex, sint32 type, sint32 originX, sint32 originY, sint32 originZ, sint32 direction, sint32 properties_1, sint32 properties_2, sint32 properties_3, sint32 liftHillAndAlternativeState, sint32 flags) +static money32 track_place(sint32 rideIndex, sint32 type, sint32 originX, sint32 originY, sint32 originZ, sint32 direction, sint32 brakeSpeed, sint32 colour, sint32 seatRotation, sint32 liftHillAndAlternativeState, sint32 flags) { Ride *ride = get_ride(rideIndex); if (ride == NULL) @@ -1330,7 +1331,8 @@ static money32 track_place(sint32 rideIndex, sint32 type, sint32 originX, sint32 mapElement->properties.track.ride_index = rideIndex; mapElement->properties.track.type = type; mapElement->properties.track.colour = 0; - if (flags & GAME_COMMAND_FLAG_GHOST){ + if (flags & GAME_COMMAND_FLAG_GHOST) + { mapElement->flags |= MAP_ELEMENT_FLAG_GHOST; } @@ -1348,18 +1350,20 @@ static money32 track_place(sint32 rideIndex, sint32 type, sint32 originX, sint32 map_animation_create(MAP_ANIMATION_TYPE_TRACK_SPINNINGTUNNEL, x, y, mapElement->base_height); break; } - if (track_element_has_speed_setting(type)) { - map_element_set_brake_booster_speed(mapElement, properties_1); + if (track_element_has_speed_setting(type)) + { + map_element_set_brake_booster_speed(mapElement, brakeSpeed); } - else { - mapElement->properties.track.colour = properties_3 << 4; + else + { + track_element_set_seat_rotation(mapElement, seatRotation); } - uint8 colour = properties_2; - if (liftHillAndAlternativeState & RIDE_TYPE_ALTERNATIVE_TRACK_TYPE){ - colour |= TRACK_ELEMENT_COLOUR_FLAG_INVERTED; + if (liftHillAndAlternativeState & RIDE_TYPE_ALTERNATIVE_TRACK_TYPE) + { + track_element_set_inverted(mapElement, true); } - mapElement->properties.track.colour |= colour; + track_element_set_colour_scheme(mapElement, colour); if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) { entranceDirections = FlatRideTrackSequenceProperties[type][0]; @@ -2173,9 +2177,21 @@ void track_element_clear_cable_lift(rct_map_element *trackElement) { trackElement->properties.track.colour &= ~TRACK_ELEMENT_COLOUR_FLAG_CABLE_LIFT; } -bool track_element_is_inverted(rct_map_element *trackElement) +bool track_element_is_inverted(rct_map_element * mapElement) { - return trackElement->properties.track.colour & TRACK_ELEMENT_COLOUR_FLAG_INVERTED; + return mapElement->properties.track.colour & TRACK_ELEMENT_COLOUR_FLAG_INVERTED; +} + +void track_element_set_inverted(rct_map_element * mapElement, bool inverted) +{ + if (inverted) + { + mapElement->properties.track.colour |= TRACK_ELEMENT_COLOUR_FLAG_INVERTED; + } + else + { + mapElement->properties.track.colour &= ~TRACK_ELEMENT_COLOUR_FLAG_INVERTED; + } } sint32 track_get_actual_bank(rct_map_element *mapElement, sint32 bank) @@ -2269,3 +2285,25 @@ bool track_element_has_speed_setting(uint8 trackType) } return false; } + +uint8 track_element_get_seat_rotation(const rct_map_element * mapElement) +{ + return mapElement->properties.track.colour >> 4; +} + +void track_element_set_seat_rotation(rct_map_element * mapElement, uint8 seatRotation) +{ + mapElement->properties.track.colour &= 0x0F; + mapElement->properties.track.colour |= (seatRotation << 4); +} + +uint8 track_element_get_colour_scheme(const rct_map_element * mapElement) +{ + return mapElement->properties.track.colour & 0x3; +} + +void track_element_set_colour_scheme(rct_map_element * mapElement, uint8 colourScheme) +{ + mapElement->properties.track.colour &= ~0x3; + mapElement->properties.track.colour |= (colourScheme & 0x3); +} diff --git a/src/openrct2/ride/track.h b/src/openrct2/ride/track.h index 3ed838f2f6..73394820a8 100644 --- a/src/openrct2/ride/track.h +++ b/src/openrct2/ride/track.h @@ -541,7 +541,8 @@ bool track_element_is_lift_hill(rct_map_element *trackElement); bool track_element_is_cable_lift(rct_map_element *trackElement); void track_element_set_cable_lift(rct_map_element *trackElement); void track_element_clear_cable_lift(rct_map_element *trackElement); -bool track_element_is_inverted(rct_map_element *trackElement); +bool track_element_is_inverted(rct_map_element * mapElement); +void track_element_set_inverted(rct_map_element * mapElement, bool inverted); sint32 track_get_actual_bank(rct_map_element *mapElement, sint32 bank); sint32 track_get_actual_bank_2(sint32 rideType, sint32 trackColour, sint32 bank); @@ -553,6 +554,10 @@ void game_command_set_maze_track(sint32 *eax, sint32 *ebx, sint32 *ecx, sint32 * void game_command_set_brakes_speed(sint32 *eax, sint32 *ebx, sint32 *ecx, sint32 *edx, sint32 *esi, sint32 *edi, sint32 *ebp); bool track_element_is_booster(uint8 rideType, uint8 trackType); bool track_element_has_speed_setting(uint8 trackType); +uint8 track_element_get_seat_rotation(const rct_map_element * mapElement); +void track_element_set_seat_rotation(rct_map_element * mapElement, uint8 seatRotation); +uint8 track_element_get_colour_scheme(const rct_map_element * mapElement); +void track_element_set_colour_scheme(rct_map_element * mapElement, uint8 colourScheme); #ifdef __cplusplus } diff --git a/src/openrct2/ride/track_design_save.c b/src/openrct2/ride/track_design_save.c index 70776b7dfa..9d0847fd94 100644 --- a/src/openrct2/ride/track_design_save.c +++ b/src/openrct2/ride/track_design_save.c @@ -1008,18 +1008,21 @@ static bool track_design_save_to_td6_for_tracked_ride(uint8 rideIndex, rct_track } uint8 bh; - if (track_element_has_speed_setting(track->type)) { + if (track_element_has_speed_setting(track->type)) + { bh = map_element_get_brake_booster_speed(trackElement.element) >> 1; - } else { - bh = trackElement.element->properties.track.colour >> 4; + } + else + { + bh = track_element_get_seat_rotation(trackElement.element); } uint8 flags = (trackElement.element->type & (1 << 7)) | bh; - flags |= (trackElement.element->properties.track.colour & 3) << 4; + flags |= track_element_get_colour_scheme(trackElement.element) << 4; if ( RideData4[ride->type].flags & RIDE_TYPE_FLAG4_HAS_ALTERNATIVE_TRACK_TYPE && - trackElement.element->properties.track.colour & TRACK_ELEMENT_COLOUR_FLAG_INVERTED - ) { + track_element_is_inverted(trackElement.element)) + { flags |= TRACK_ELEMENT_FLAG_INVERTED; } @@ -1027,7 +1030,8 @@ static bool track_design_save_to_td6_for_tracked_ride(uint8 rideIndex, rct_track track++; numTrackElements++; - if (!track_block_get_next(&trackElement, &trackElement, NULL, NULL)) { + if (!track_block_get_next(&trackElement, &trackElement, NULL, NULL)) + { break; } @@ -1035,10 +1039,13 @@ static bool track_design_save_to_td6_for_tracked_ride(uint8 rideIndex, rct_track direction = map_element_get_direction(trackElement.element); track_type = trackElement.element->properties.track.type; - if (sub_6C683D(&trackElement.x, &trackElement.y, &z, direction, track_type, 0, &trackElement.element, 0)) { + if (sub_6C683D(&trackElement.x, &trackElement.y, &z, direction, track_type, 0, &trackElement.element, 0)) + { break; } - } while (trackElement.element != initialMap); + } + while (trackElement.element != initialMap); + td6->track_elements = realloc(td6->track_elements, numTrackElements * sizeof(rct_td6_track_element) + 1); *((uint8*)&td6->track_elements[numTrackElements]) = 0xFF; diff --git a/src/openrct2/ride/track_paint.c b/src/openrct2/ride/track_paint.c index 5840850f10..aa6e9faa5c 100644 --- a/src/openrct2/ride/track_paint.c +++ b/src/openrct2/ride/track_paint.c @@ -1754,7 +1754,7 @@ void track_paint(paint_session * session, uint8 direction, sint32 height, rct_ma if (!gTrackDesignSaveMode || rideIndex == gTrackDesignSaveRideIndex) { sint32 trackType = mapElement->properties.track.type; sint32 trackSequence = map_element_get_track_sequence(mapElement); - sint32 trackColourScheme = mapElement->properties.track.colour & 3; + sint32 trackColourScheme = track_element_get_colour_scheme(mapElement); if ((gCurrentViewportFlags & VIEWPORT_FLAG_TRACK_HEIGHTS) && dpi->zoom_level == 0) { session->InteractionType = VIEWPORT_INTERACTION_ITEM_NONE; diff --git a/src/openrct2/ride/vehicle.c b/src/openrct2/ride/vehicle.c index 09dca8337b..634e1104b6 100644 --- a/src/openrct2/ride/vehicle.c +++ b/src/openrct2/ride/vehicle.c @@ -7504,8 +7504,10 @@ loc_6DB358: // Update VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES flag vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES; sint32 rideType = get_ride(mapElement->properties.track.ride_index)->type; - if (RideData4[rideType].flags & RIDE_TYPE_FLAG4_HAS_ALTERNATIVE_TRACK_TYPE) { - if (mapElement->properties.track.colour & TRACK_ELEMENT_COLOUR_FLAG_INVERTED) { + if (RideData4[rideType].flags & RIDE_TYPE_FLAG4_HAS_ALTERNATIVE_TRACK_TYPE) + { + if (track_element_is_inverted(mapElement)) + { vehicle->update_flags |= VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES; } } @@ -7555,7 +7557,7 @@ loc_6DB41D: trackType = mapElement->properties.track.type; rideType = get_ride(mapElement->properties.track.ride_index)->type; if (trackType != TRACK_ELEM_BRAKES) { - vehicle->target_seat_rotation = mapElement->properties.track.colour >> 4; + vehicle->target_seat_rotation = track_element_get_seat_rotation(mapElement); } vehicle->track_direction = regs.bl & 3; vehicle->track_type |= trackType << 2; @@ -7854,8 +7856,10 @@ static bool vehicle_update_track_motion_backwards_get_new_track(rct_vehicle *veh // Update VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES; - if (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_HAS_ALTERNATIVE_TRACK_TYPE) { - if (mapElement->properties.track.colour & TRACK_ELEMENT_COLOUR_FLAG_INVERTED) { + if (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_HAS_ALTERNATIVE_TRACK_TYPE) + { + if (track_element_is_inverted(mapElement)) + { vehicle->update_flags |= VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES; } } @@ -7929,7 +7933,7 @@ static bool vehicle_update_track_motion_backwards_get_new_track(rct_vehicle *veh trackType = mapElement->properties.track.type; if (trackType != TRACK_ELEM_BRAKES) { - vehicle->target_seat_rotation = mapElement->properties.track.colour >> 4; + vehicle->target_seat_rotation = track_element_get_seat_rotation(mapElement); } direction &= 3; vehicle->track_type = trackType << 2; @@ -8222,8 +8226,10 @@ loc_6DC476: sint32 rideType = get_ride(mapElement->properties.track.ride_index)->type; vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES; - if (RideData4[rideType].flags & RIDE_TYPE_FLAG4_HAS_ALTERNATIVE_TRACK_TYPE) { - if (mapElement->properties.track.colour & TRACK_ELEMENT_COLOUR_FLAG_INVERTED) { + if (RideData4[rideType].flags & RIDE_TYPE_FLAG4_HAS_ALTERNATIVE_TRACK_TYPE) + { + if (track_element_is_inverted(mapElement)) + { vehicle->update_flags |= VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES; } } @@ -8439,8 +8445,10 @@ loc_6DCA9A: rideType = get_ride(mapElement->properties.track.ride_index)->type; vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES; - if (RideData4[rideType].flags & RIDE_TYPE_FLAG4_HAS_ALTERNATIVE_TRACK_TYPE) { - if (mapElement->properties.track.colour & TRACK_ELEMENT_COLOUR_FLAG_INVERTED) { + if (RideData4[rideType].flags & RIDE_TYPE_FLAG4_HAS_ALTERNATIVE_TRACK_TYPE) + { + if (track_element_is_inverted(mapElement)) + { vehicle->update_flags |= VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES; } } diff --git a/src/openrct2/windows/Ride.cpp b/src/openrct2/windows/Ride.cpp index f5a7b3ba76..0d35d78ddd 100644 --- a/src/openrct2/windows/Ride.cpp +++ b/src/openrct2/windows/Ride.cpp @@ -4113,7 +4113,7 @@ static void window_ride_set_track_colour_scheme(rct_window *w, sint32 x, sint32 return; if (mapElement->properties.track.ride_index != w->number) return; - if ((mapElement->properties.track.colour & 3) == newColourScheme) + if (track_element_get_colour_scheme(mapElement) == newColourScheme) return; z = mapElement->base_height * 8; diff --git a/src/openrct2/windows/RideConstruction.cpp b/src/openrct2/windows/RideConstruction.cpp index d1c8721100..ac7a8d783a 100644 --- a/src/openrct2/windows/RideConstruction.cpp +++ b/src/openrct2/windows/RideConstruction.cpp @@ -2407,8 +2407,12 @@ static void sub_6CBCE2( _tempTrackMapElement.clearance_height = clearanceZ; _tempTrackMapElement.properties.track.type = trackType; map_element_set_track_sequence(&_tempTrackMapElement, trackBlock->index); - _tempTrackMapElement.properties.track.colour = (edx & 0x20000) ? 4 : 0; + _tempTrackMapElement.properties.track.colour = 0; _tempTrackMapElement.properties.track.ride_index = rideIndex; + if (edx & 0x20000) + { + track_element_set_inverted(&_tempTrackMapElement, true); + } // Draw this map tile sub_68B2B7(session, x, y); @@ -2460,7 +2464,7 @@ void window_ride_construction_update_active_elements() _selectedTrackType = mapElement->properties.track.type; if (track_element_has_speed_setting(mapElement->properties.track.type)) _currentBrakeSpeed2 = map_element_get_brake_booster_speed(mapElement); - _currentSeatRotationAngle = mapElement->properties.track.colour >> 4; + _currentSeatRotationAngle = track_element_get_seat_rotation(mapElement); } } diff --git a/test/testpaint/compat.c b/test/testpaint/compat.c index 077d3d153d..3bda63d5d9 100644 --- a/test/testpaint/compat.c +++ b/test/testpaint/compat.c @@ -240,3 +240,8 @@ bool is_csg_loaded() { return false; } + +uint8 track_element_get_colour_scheme(const rct_map_element * mapElement) +{ + return mapElement->properties.track.colour & 0x3; +}