1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-17 12:03:07 +01:00

Strengthen the checks for adjacent stations

Existing checks only checked for a track piece of a snychronised ride at the adjacent location.  Add check that the track piece must also be a station platform.

Refactor common code for syncing stations and applying rating bonus for synchronised rides.
This commit is contained in:
zaxcav
2016-10-05 11:13:28 +02:00
parent 5fdfb397d2
commit c68571392a
3 changed files with 42 additions and 43 deletions

View File

@@ -8691,18 +8691,23 @@ money16 ride_get_price(rct_ride * ride)
}
/**
* Check for an adjacent station at x,y,z(+-2).
* Return the map_element of an adjacent station at x,y,z(+-2).
* Returns NULL if no suitable map_element is found.
*/
static bool check_adjacent_station(int x, int y, int z) {
rct_map_element *get_station_platform(int x, int y, int z, int z_tolerance) {
bool foundMapElement = false;
rct_map_element *mapElement = map_get_first_element_at(x >> 5, y >> 5);
if (mapElement != NULL) {
do {
if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) continue;
if (z != mapElement->base_height &&
z != mapElement->base_height - 2 &&
z != mapElement->base_height + 2
/* Check if mapElement is a station platform. */
if (!track_element_is_station(mapElement)) continue;
if (z - z_tolerance > mapElement->base_height ||
z + z_tolerance < mapElement->base_height
) {
/* The base height if mapElement is not within
* the z tolerance. */
continue;
}
@@ -8711,15 +8716,28 @@ static bool check_adjacent_station(int x, int y, int z) {
} while (!map_element_is_last_for_tile(mapElement++));
}
if (!foundMapElement) {
return false;
return NULL;
}
int rideIndex = mapElement->properties.track.ride_index;
rct_ride *ride = get_ride(rideIndex);
if (!(ride->depart_flags & RIDE_DEPART_SYNCHRONISE_WITH_ADJACENT_STATIONS)) {
return false;
return mapElement;
}
/**
* Check for an adjacent station to x,y,z in direction.
*/
static bool check_for_adjacent_station(int x, int y, int z, uint8 direction) {
bool found = false;
int adjX = x + TileDirectionDelta[direction].x;
int adjY = y + TileDirectionDelta[direction].y;
rct_map_element *stationElement = get_station_platform(adjX, adjY, z, 2);
if (stationElement != NULL) {
int rideIndex = stationElement->properties.track.ride_index;
rct_ride *ride = get_ride(rideIndex);
if (ride->depart_flags & RIDE_DEPART_SYNCHRONISE_WITH_ADJACENT_STATIONS) {
found = true;
}
}
return true;
return found;
}
/**
@@ -8730,35 +8748,27 @@ bool ride_has_adjacent_station(rct_ride *ride)
bool found = false;
/* Loop through all of the ride stations, checking for an
* adjacent station anywhere. */
* adjacent station on either side. */
for (int stationNum = 0; stationNum <= 3; stationNum++) {
if (ride->station_starts[stationNum] != 0xFFFF) {
/* Get the map element for the station start. */
uint16 stationX = (ride->station_starts[stationNum] & 0xFF) * 32;
uint16 stationY = (ride->station_starts[stationNum] >> 8) * 32;
uint8 stationZ = ride->station_heights[stationNum];
rct_map_element *stationElement = map_get_track_element_at(stationX, stationY, stationZ);
rct_map_element *stationElement = get_station_platform(stationX, stationY, stationZ, 0);
if (stationElement == NULL) {
continue;
}
/* Check the first side of the station */
int direction = (stationElement->type + 1) & 3;
int adjStationX = stationX + TileDirectionDelta[direction].x;
int adjStationY = stationY + TileDirectionDelta[direction].y;
if (check_adjacent_station(adjStationX, adjStationY, stationZ)) {
found = true;
break;
}
found = check_for_adjacent_station(stationX, stationY, stationZ, direction);
if (found) break;
/* Check the other side of the station */
direction ^= 2;
adjStationX = stationX + TileDirectionDelta[direction].x;
adjStationY = stationY + TileDirectionDelta[direction].y;
if (check_adjacent_station(adjStationX, adjStationY, stationZ)) {
found = true;
break;
}
found = check_for_adjacent_station(stationX, stationY, stationZ, direction);
if (found) break;
}
}
return found;
}

View File

@@ -1142,6 +1142,7 @@ void game_command_callback_place_ride_entrance_or_exit(int eax, int ebx, int ecx
void ride_delete(uint8 rideIndex);
money16 ride_get_price(rct_ride * ride);
rct_map_element *get_station_platform(int x, int y, int z, int z_tolerance);
bool ride_has_adjacent_station(rct_ride *ride);
#endif

View File

@@ -2283,29 +2283,17 @@ static rct_synchronised_vehicle* _lastSynchronisedVehicle = NULL;
*/
static bool try_add_synchronised_station(int x, int y, int z)
{
bool foundMapElement = false;
rct_map_element *mapElement = map_get_first_element_at(x >> 5, y >> 5);
if (mapElement != NULL) {
do {
if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) continue;
if (z != mapElement->base_height &&
z != mapElement->base_height - 2 &&
z != mapElement->base_height + 2
) {
continue;
}
foundMapElement = true;
break;
} while (!map_element_is_last_for_tile(mapElement++));
}
if (!foundMapElement) {
rct_map_element *mapElement = get_station_platform(x, y, z, 2);
if (mapElement == NULL) {
/* No station platform element found,
* so no station to synchronise */
return false;
}
int rideIndex = mapElement->properties.track.ride_index;
rct_ride *ride = get_ride(rideIndex);
if (!(ride->depart_flags & RIDE_DEPART_SYNCHRONISE_WITH_ADJACENT_STATIONS)) {
/* Ride is not set to synchronise with adjacent stations. */
return false;
}