diff --git a/src/openrct2-ui/interface/ViewportInteraction.cpp b/src/openrct2-ui/interface/ViewportInteraction.cpp index 0723bbabb8..0d897f68cf 100644 --- a/src/openrct2-ui/interface/ViewportInteraction.cpp +++ b/src/openrct2-ui/interface/ViewportInteraction.cpp @@ -296,8 +296,12 @@ int32_t viewport_interaction_get_item_right(int32_t x, int32_t y, viewport_inter set_map_tooltip_format_arg(6, uint32_t, ride->name_arguments); set_map_tooltip_format_arg( 10, rct_string_id, RideComponentNames[RideNameConvention[ride->type].station].capitalised); - - stationIndex = tile_element_get_station(tileElement); + + if (tileElement->GetType() == TILE_ELEMENT_TYPE_ENTRANCE) + stationIndex = tileElement->AsEntrance()->GetStationIndex(); + else + stationIndex = tileElement->AsTrack()->GetStationIndex(); + for (i = stationIndex; i >= 0; i--) if (ride->station_starts[i].xy == RCT_XY8_UNDEFINED) stationIndex--; diff --git a/src/openrct2-ui/windows/Ride.cpp b/src/openrct2-ui/windows/Ride.cpp index 03ccd39e8e..2de404b0e6 100644 --- a/src/openrct2-ui/windows/Ride.cpp +++ b/src/openrct2-ui/windows/Ride.cpp @@ -1634,12 +1634,17 @@ static rct_window* window_ride_open_station(int32_t rideIndex, int32_t stationIn rct_window* window_ride_open_track(rct_tile_element* tileElement) { + // This function *should* only be called with an EntranceElement or TrackElement. int32_t rideIndex = track_element_get_ride_index(tileElement); - if ((tileElement->GetType() == TILE_ELEMENT_TYPE_ENTRANCE) - || (tileElement->GetType() == TILE_ELEMENT_TYPE_TRACK && TrackSequenceProperties[tileElement->AsTrack()->GetTrackType()][0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + if (tileElement->GetType() == TILE_ELEMENT_TYPE_ENTRANCE) { // Open ride window in station view - return window_ride_open_station(rideIndex, tile_element_get_station(tileElement)); + return window_ride_open_station(rideIndex, tileElement->AsEntrance()->GetStationIndex()); + } + else if (tileElement->GetType() == TILE_ELEMENT_TYPE_TRACK && TrackSequenceProperties[tileElement->AsTrack()->GetTrackType()][0] & TRACK_SEQUENCE_FLAG_ORIGIN) + { + // Open ride window in station view + return window_ride_open_station(rideIndex, tileElement->AsTrack()->GetStationIndex()); } else { diff --git a/src/openrct2/peep/Guest.cpp b/src/openrct2/peep/Guest.cpp index 5f98271193..5803e9bbaf 100644 --- a/src/openrct2/peep/Guest.cpp +++ b/src/openrct2/peep/Guest.cpp @@ -4046,7 +4046,7 @@ void rct_peep::UpdateRideLeaveVehicle() break; } - uint8_t stationIndex = tile_element_get_station(inner_map); + uint8_t stationIndex = inner_map->AsTrack()->GetStationIndex(); if (stationIndex == current_ride_station) break; } diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index 4a0e628b70..6979e025b5 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -3557,7 +3557,7 @@ static void ride_station_set_map_tooltip(rct_tile_element* tileElement) rideIndex = track_element_get_ride_index(tileElement); ride = get_ride(rideIndex); - stationIndex = tile_element_get_station(tileElement); + stationIndex = tileElement->AsTrack()->GetStationIndex(); for (i = stationIndex; i >= 0; i--) if (ride->station_starts[i].xy == RCT_XY8_UNDEFINED) stationIndex--; @@ -3585,7 +3585,7 @@ static void ride_entrance_set_map_tooltip(rct_tile_element* tileElement) ride = get_ride(rideIndex); // Get the station - stationIndex = tile_element_get_station(tileElement); + stationIndex = tileElement->AsEntrance()->GetStationIndex(); for (i = stationIndex; i >= 0; i--) if (ride->station_starts[i].xy == RCT_XY8_UNDEFINED) stationIndex--; @@ -3619,7 +3619,7 @@ static void ride_entrance_set_map_tooltip(rct_tile_element* tileElement) else { // Get the station - stationIndex = tile_element_get_station(tileElement); + stationIndex = tileElement->AsEntrance()->GetStationIndex(); for (i = stationIndex; i >= 0; i--) if (ride->station_starts[i].xy == RCT_XY8_UNDEFINED) stationIndex--; @@ -4873,7 +4873,7 @@ static rct_vehicle* vehicle_create_car( vehicle->track_x = x; vehicle->track_y = y; vehicle->track_z = z; - vehicle->current_station = tile_element_get_station(tileElement); + vehicle->current_station = tileElement->AsTrack()->GetStationIndex(); z += RideData5[ride->type].z_offset; @@ -4966,7 +4966,7 @@ static rct_vehicle* vehicle_create_car( y += word_9A2A60[direction].y; vehicle->track_z = tileElement->base_height * 8; - vehicle->current_station = tile_element_get_station(tileElement); + vehicle->current_station = tileElement->AsTrack()->GetStationIndex(); z = tileElement->base_height * 8; z += RideData5[ride->type].z_offset; @@ -7085,7 +7085,7 @@ void ride_get_entrance_or_exit_position_from_screen_position( } else { - gRideEntranceExitPlaceStationIndex = tile_element_get_station(tileElement); + gRideEntranceExitPlaceStationIndex = tileElement->AsTrack()->GetStationIndex(); } } } @@ -7152,7 +7152,7 @@ void ride_get_entrance_or_exit_position_from_screen_position( *outDirection = direction ^ 2; return; } - if (tile_element_get_station(tileElement) != gRideEntranceExitPlaceStationIndex) + if (tileElement->AsTrack()->GetStationIndex() != gRideEntranceExitPlaceStationIndex) continue; int32_t eax = (direction + 2 - tileElement->GetDirection()) & TILE_ELEMENT_DIRECTION_MASK; @@ -7201,7 +7201,7 @@ void ride_get_entrance_or_exit_position_from_screen_position( continue; if (track_element_get_ride_index(tileElement) != gRideEntranceExitPlaceRideIndex) continue; - if (tile_element_get_station(tileElement) != gRideEntranceExitPlaceStationIndex) + if (tileElement->AsTrack()->GetStationIndex() != gRideEntranceExitPlaceStationIndex) continue; switch (tileElement->AsTrack()->GetTrackType()) @@ -8024,7 +8024,7 @@ void sub_6CB945(int32_t rideIndex) break; } - tile_element_set_station(tileElement, stationId); + tileElement->AsTrack()->SetStationIndex(stationId); direction = tileElement->GetDirection(); if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_3)) @@ -8065,7 +8065,7 @@ void sub_6CB945(int32_t rideIndex) break; } - tile_element_set_station(tileElement, stationId); + tileElement->AsTrack()->SetStationIndex(stationId); } } } @@ -8152,7 +8152,7 @@ void sub_6CB945(int32_t rideIndex) uint8_t stationId = 0; if (trackType != TRACK_ELEM_INVERTED_90_DEG_UP_TO_FLAT_QUARTER_LOOP) { - stationId = tile_element_get_station(trackElement); + stationId = trackElement->AsTrack()->GetStationIndex(); } if (tileElement->properties.entrance.type == ENTRANCE_TYPE_RIDE_EXIT) @@ -8777,7 +8777,7 @@ void determine_ride_entrance_and_exit_locations() tileElement = map_get_ride_entrance_element_at(entranceLoc.x * 32, entranceLoc.y * 32, entranceLoc.z, false); if (tileElement == nullptr || tileElement->properties.entrance.ride_index != rideIndex - || tile_element_get_station(tileElement) != stationIndex) + || tileElement->AsEntrance()->GetStationIndex() != stationIndex) { fixEntrance = true; } @@ -8792,7 +8792,7 @@ void determine_ride_entrance_and_exit_locations() tileElement = map_get_ride_exit_element_at(exitLoc.x * 32, exitLoc.y * 32, entranceLoc.z, false); if (tileElement == nullptr || tileElement->properties.entrance.ride_index != rideIndex - || tile_element_get_station(tileElement) != stationIndex) + || tileElement->AsEntrance()->GetStationIndex() != stationIndex) { fixExit = true; } @@ -8829,7 +8829,7 @@ void determine_ride_entrance_and_exit_locations() { continue; } - if (tile_element_get_station(tileElement) != stationIndex) + if (tileElement->AsEntrance()->GetStationIndex() != stationIndex) { continue; } diff --git a/src/openrct2/ride/RideRatings.cpp b/src/openrct2/ride/RideRatings.cpp index c770779625..5a522be14a 100644 --- a/src/openrct2/ride/RideRatings.cpp +++ b/src/openrct2/ride/RideRatings.cpp @@ -214,7 +214,7 @@ static void ride_ratings_update_state_2() { if (trackType == TRACK_ELEM_END_STATION) { - int32_t entranceIndex = tile_element_get_station(tileElement); + int32_t entranceIndex = tileElement->AsTrack()->GetStationIndex(); gRideRatingsCalcData.station_flags &= ~RIDE_RATING_STATION_FLAG_NO_ENTRANCE; if (ride_get_entrance_location(rideIndex, entranceIndex).isNull()) { diff --git a/src/openrct2/ride/Track.cpp b/src/openrct2/ride/Track.cpp index 17d275c3ee..682c2fe819 100644 --- a/src/openrct2/ride/Track.cpp +++ b/src/openrct2/ride/Track.cpp @@ -2244,23 +2244,6 @@ void track_element_set_colour_scheme(rct_tile_element* tileElement, uint8_t colo tileElement->properties.track.colour |= (colourScheme & 0x3); } -void tile_element_set_station(rct_tile_element* tileElement, uint32_t stationIndex) -{ - tileElement->properties.track.sequence &= ~MAP_ELEM_TRACK_SEQUENCE_STATION_INDEX_MASK; - tileElement->properties.track.sequence |= (stationIndex << 4); -} - -uint8_t TrackElement::GetSequenceIndex() const -{ - return sequence & MAP_ELEM_TRACK_SEQUENCE_SEQUENCE_MASK; -} - -void TrackElement::SetSequenceIndex(uint8_t newSequenceIndex) -{ - sequence &= ~MAP_ELEM_TRACK_SEQUENCE_SEQUENCE_MASK; - sequence |= (newSequenceIndex & MAP_ELEM_TRACK_SEQUENCE_SEQUENCE_MASK); -} - bool tile_element_get_green_light(const rct_tile_element* tileElement) { return (tileElement->properties.track.sequence & MAP_ELEM_TRACK_SEQUENCE_GREEN_LIGHT) != 0; @@ -2331,6 +2314,28 @@ void TrackElement::SetTrackType(uint8_t newType) trackType = newType; } +uint8_t TrackElement::GetSequenceIndex() const +{ + return sequence & MAP_ELEM_TRACK_SEQUENCE_SEQUENCE_MASK; +} + +void TrackElement::SetSequenceIndex(uint8_t newSequenceIndex) +{ + sequence &= ~MAP_ELEM_TRACK_SEQUENCE_SEQUENCE_MASK; + sequence |= (newSequenceIndex & MAP_ELEM_TRACK_SEQUENCE_SEQUENCE_MASK); +} + +uint8_t TrackElement::GetStationIndex() const +{ + return (sequence & MAP_ELEM_TRACK_SEQUENCE_STATION_INDEX_MASK) >> 4; +} + +void TrackElement::SetStationIndex(uint8_t newStationIndex) +{ + sequence &= ~MAP_ELEM_TRACK_SEQUENCE_STATION_INDEX_MASK; + sequence |= (newStationIndex << 4); +} + uint8_t TrackElement::GetDoorAState() const { return (colour & TRACK_ELEMENT_DOOR_A_MASK) >> 2; diff --git a/src/openrct2/ride/Track.h b/src/openrct2/ride/Track.h index a72dba9995..c4c7c065f0 100644 --- a/src/openrct2/ride/Track.h +++ b/src/openrct2/ride/Track.h @@ -568,8 +568,6 @@ bool track_element_is_booster(uint8_t rideType, uint8_t trackType); bool track_element_has_speed_setting(uint8_t trackType); uint8_t track_element_get_colour_scheme(const rct_tile_element* tileElement); void track_element_set_colour_scheme(rct_tile_element* tileElement, uint8_t colourScheme); -int32_t tile_element_get_station(const rct_tile_element* tileElement); -void tile_element_set_station(rct_tile_element* tileElement, uint32_t stationIndex); bool tile_element_get_green_light(const rct_tile_element* tileElement); void tile_element_set_green_light(rct_tile_element* tileElement, bool greenLight); int32_t tile_element_get_brake_booster_speed(const rct_tile_element* tileElement); diff --git a/src/openrct2/ride/TrackDesign.cpp b/src/openrct2/ride/TrackDesign.cpp index 72c185dd95..ec6bf666e3 100644 --- a/src/openrct2/ride/TrackDesign.cpp +++ b/src/openrct2/ride/TrackDesign.cpp @@ -1563,7 +1563,7 @@ static bool track_design_place_ride(rct_track_td6* td6, int16_t x, int16_t y, in continue; } - int32_t stationIndex = tile_element_get_station(tile_element); + int32_t stationIndex = tile_element->AsTrack()->GetStationIndex(); uint8_t bl = 1; if (_trackDesignPlaceOperation == PTD_OPERATION_GET_COST) { diff --git a/src/openrct2/ride/TrackPaint.cpp b/src/openrct2/ride/TrackPaint.cpp index f6a98e8df6..9d7bebbabc 100644 --- a/src/openrct2/ride/TrackPaint.cpp +++ b/src/openrct2/ride/TrackPaint.cpp @@ -223,7 +223,7 @@ bool track_paint_util_has_fence( int32_t entranceX = (position.x / 32) + offset.x; int32_t entranceY = (position.y / 32) + offset.y; - int32_t entranceId = tile_element_get_station(tileElement); + int32_t entranceId = tileElement->AsTrack()->GetStationIndex(); const TileCoordsXYZD entrance = ride_get_entrance_location(ride, entranceId); const TileCoordsXYZD exit = ride_get_exit_location(ride, entranceId); diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index 02d8160953..69d6d1b380 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -2752,7 +2752,7 @@ static bool try_add_synchronised_station(int32_t x, int32_t y, int32_t z) * to sync with adjacent stations, so it will return true. * Still to determine if a vehicle to sync can be identified. */ - int32_t stationIndex = tile_element_get_station(tileElement); + int32_t stationIndex = tileElement->AsTrack()->GetStationIndex(); rct_synchronised_vehicle* sv = _lastSynchronisedVehicle; sv->ride_id = rideIndex; @@ -4001,7 +4001,7 @@ loc_6D8E36: return; } - vehicle->current_station = tile_element_get_station(tileElement); + vehicle->current_station = tileElement->AsTrack()->GetStationIndex(); vehicle->num_laps++; if (vehicle->sub_state != 0) @@ -7881,7 +7881,7 @@ static void sub_6DBF3E(rct_vehicle* vehicle) if (_vehicleStationIndex == 0xFF) { - _vehicleStationIndex = tile_element_get_station(tileElement); + _vehicleStationIndex = tileElement->AsTrack()->GetStationIndex(); } if (trackType == TRACK_ELEM_TOWER_BASE && vehicle == gCurrentVehicle) diff --git a/src/openrct2/world/Entrance.cpp b/src/openrct2/world/Entrance.cpp index 0ac465ec00..cb35e5184f 100644 --- a/src/openrct2/world/Entrance.cpp +++ b/src/openrct2/world/Entrance.cpp @@ -365,7 +365,7 @@ static money32 RideEntranceExitRemove(int16_t x, int16_t y, uint8_t rideIndex, u if (tile_element_get_ride_index(tileElement) != rideIndex) continue; - if (tile_element_get_station(tileElement) != stationNum) + if (tileElement->AsEntrance()->GetStationIndex() != stationNum) continue; if (flags & GAME_COMMAND_FLAG_5 && !(tileElement->flags & TILE_ELEMENT_FLAG_GHOST)) @@ -630,3 +630,14 @@ void fix_park_entrance_locations(void) } } } + +uint8_t EntranceElement::GetStationIndex() const +{ + return (temp.index & MAP_ELEM_TRACK_SEQUENCE_STATION_INDEX_MASK) >> 4; +} + +void EntranceElement::SetStationIndex(uint8_t stationIndex) +{ + temp.index &= ~MAP_ELEM_TRACK_SEQUENCE_STATION_INDEX_MASK; + temp.index |= (stationIndex << 4); +} diff --git a/src/openrct2/world/Map.cpp b/src/openrct2/world/Map.cpp index 9c95000930..d3cb9ecc96 100644 --- a/src/openrct2/world/Map.cpp +++ b/src/openrct2/world/Map.cpp @@ -3096,11 +3096,6 @@ void game_command_place_large_scenery( } } -int32_t tile_element_get_station(const rct_tile_element* tileElement) -{ - return (tileElement->properties.track.sequence & MAP_ELEM_TRACK_SEQUENCE_STATION_INDEX_MASK) >> 4; -} - /** * * rct2: 0x0068B280 diff --git a/src/openrct2/world/TileElement.h b/src/openrct2/world/TileElement.h index 7370888c32..9b969b02aa 100644 --- a/src/openrct2/world/TileElement.h +++ b/src/openrct2/world/TileElement.h @@ -260,6 +260,15 @@ public: uint8_t GetSequenceIndex() const; void SetSequenceIndex(uint8_t newSequenceIndex); + uint8_t GetRideIndex() const; + void SetRideIndex(uint8_t newRideIndex); + + uint8_t GetColourScheme() const; + void SetColourScheme(uint8_t newColourScheme); + + uint8_t GetStationIndex() const; + void SetStationIndex(uint8_t newStationIndex); + uint8_t GetSeatRotation() const; void SetSeatRotation(uint8_t newSeatRotation); @@ -364,6 +373,9 @@ assert_struct_size(WallElement, 8); struct EntranceElement : TileElementBase { rct_tile_element_entrance_properties temp; +public: + uint8_t GetStationIndex() const; + void SetStationIndex(uint8_t stationIndex); }; assert_struct_size(EntranceElement, 8); diff --git a/test/testpaint/Compat.cpp b/test/testpaint/Compat.cpp index fbfb671828..cb4d92994f 100644 --- a/test/testpaint/Compat.cpp +++ b/test/testpaint/Compat.cpp @@ -174,17 +174,6 @@ rct_tile_element* map_get_first_element_at(int x, int y) return gTileElementTilePointers[x + y * 256]; } -int tile_element_get_station(const rct_tile_element* tileElement) -{ - return (tileElement->properties.track.sequence & MAP_ELEM_TRACK_SEQUENCE_STATION_INDEX_MASK) >> 4; -} - -void tile_element_set_station(rct_tile_element* tileElement, uint32_t stationIndex) -{ - tileElement->properties.track.sequence &= ~MAP_ELEM_TRACK_SEQUENCE_STATION_INDEX_MASK; - tileElement->properties.track.sequence |= (stationIndex << 4); -} - bool tile_element_get_green_light(const rct_tile_element* tileElement) { return (tileElement->properties.track.sequence & MAP_ELEM_TRACK_SEQUENCE_GREEN_LIGHT) != 0;