diff --git a/src/ride/ride.c b/src/ride/ride.c index f28e41de56..b8e625a092 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -5472,13 +5472,58 @@ int ride_get_smallest_station_length(rct_ride *ride) return (int)result; } -static int sub_6CB3AA(rct_ride *ride) +/** + * + * rct2: 0x006CB3AA + */ +static int ride_get_track_length(rct_ride *ride) { - int eax, ebx, ecx, edx, esi, edi, ebp; + rct_window *w; + rct_map_element *mapElement; + track_circuit_iterator it; + int x, y, z, trackType, rideIndex, result; - edi = (int)ride; - RCT2_CALLFUNC_X(0x006CB3AA, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - return eax; + for (int i = 0; i < 4; i++) { + uint16 xy = ride->station_starts[i]; + if (xy == 0xFFFF) + continue; + + x = (xy & 0xFF) * 32; + y = (xy >> 8) * 32; + z = ride->station_heights[i]; + + mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) + continue; + + trackType = mapElement->properties.track.type; + if (!RCT2_GLOBAL(0x0099BA64 + (trackType * 16), uint32) & 0x10) + continue; + + if (mapElement->base_height != z) + continue; + + goto foundTrack; + } while (!map_element_is_last_for_tile(mapElement++)); + } + return 0; + +foundTrack: + rideIndex = mapElement->properties.track.ride_index; + + w = window_find_by_class(WC_RIDE_CONSTRUCTION); + if (w != NULL && _rideConstructionState != RIDE_CONSTRUCTION_STATE_0 && _currentRideIndex == rideIndex) { + sub_6C9627(); + } + + result = 0; + track_circuit_iterator_begin(&it, (rct_xy_element){ x, y, mapElement }); + while (track_circuit_iterator_next(&it)) { + trackType = it.current.element->properties.track.type; + result += TrackPieceLengths[trackType]; + } + return result; } /** @@ -5576,23 +5621,17 @@ void ride_update_max_vehicles(int rideIndex) } totalSpacing >>= 13; - int unk2 = sub_6CB3AA(ride) / 4; - if (unk > 10) { - unk2 = (unk2 * 3) / 4; - } - if (unk > 25) { - unk2 = (unk2 * 3) / 4; - } - if (unk > 40) { - unk2 = (unk2 * 3) / 4; - } + int trackLength = ride_get_track_length(ride) / 4; + if (unk > 10) trackLength = (trackLength * 3) / 4; + if (unk > 25) trackLength = (trackLength * 3) / 4; + if (unk > 40) trackLength = (trackLength * 3) / 4; maxNumTrains = 0; - int unk3 = 0; + int length = 0; do { maxNumTrains++; - unk3 += totalSpacing; - } while (maxNumTrains < 31 && unk3 < unk2); + length += totalSpacing; + } while (maxNumTrains < 31 && length < trackLength); } break; } @@ -5601,10 +5640,10 @@ void ride_update_max_vehicles(int rideIndex) numCarsPerTrain = min(ride->var_0CB, maxCarsPerTrain); numVehicles = min(ride->var_0CA, maxNumTrains); } else { - ride->max_trains = rideEntry->cars_per_flat_ride; - ride->min_max_cars_per_train = rideEntry->max_cars_in_train | (rideEntry->min_cars_in_train << 4); - numCarsPerTrain = rideEntry->max_cars_in_train; - numVehicles = min(ride->var_0CA, rideEntry->cars_per_flat_ride); + ride->max_trains = rideEntry->cars_per_flat_ride; + ride->min_max_cars_per_train = rideEntry->max_cars_in_train | (rideEntry->min_cars_in_train << 4); + numCarsPerTrain = rideEntry->max_cars_in_train; + numVehicles = min(ride->var_0CA, rideEntry->cars_per_flat_ride); } // Refresh new current num vehicles / num cars per vehicle diff --git a/src/ride/track_data.c b/src/ride/track_data.c index 42d539eba7..1700176162 100644 --- a/src/ride/track_data.c +++ b/src/ride/track_data.c @@ -4689,3 +4689,262 @@ const rct_preview_track *FlatRideTrackBlocks[255] = { FlatRideTrackBlocks253, FlatRideTrackBlocks254 }; + +const uint8 TrackPieceLengths[256] = { + 32, // TRACK_ELEM_FLAT + 32, // TRACK_ELEM_END_STATION + 32, // TRACK_ELEM_BEGIN_STATION + 32, // TRACK_ELEM_MIDDLE_STATION + 33, // TRACK_ELEM_25_DEG_UP + 40, // TRACK_ELEM_60_DEG_UP + 32, // TRACK_ELEM_FLAT_TO_25_DEG_UP + 34, // TRACK_ELEM_25_DEG_UP_TO_60_DEG_UP + 34, // TRACK_ELEM_60_DEG_UP_TO_25_DEG_UP + 32, // TRACK_ELEM_25_DEG_UP_TO_FLAT + 33, // TRACK_ELEM_25_DEG_DOWN + 40, // TRACK_ELEM_60_DEG_DOWN + 32, // TRACK_ELEM_FLAT_TO_25_DEG_DOWN + 34, // TRACK_ELEM_25_DEG_DOWN_TO_60_DEG_DOWN + 34, // TRACK_ELEM_60_DEG_DOWN_TO_25_DEG_DOWN + 32, // TRACK_ELEM_25_DEG_DOWN_TO_FLAT + 124, // TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES + 124, // TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES + 32, // TRACK_ELEM_FLAT_TO_LEFT_BANK + 32, // TRACK_ELEM_FLAT_TO_RIGHT_BANK + 32, // TRACK_ELEM_LEFT_BANK_TO_FLAT + 32, // TRACK_ELEM_RIGHT_BANK_TO_FLAT + 124, // TRACK_ELEM_BANKED_LEFT_QUARTER_TURN_5_TILES + 124, // TRACK_ELEM_BANKED_RIGHT_QUARTER_TURN_5_TILES + 32, // TRACK_ELEM_LEFT_BANK_TO_25_DEG_UP + 32, // TRACK_ELEM_RIGHT_BANK_TO_25_DEG_UP + 32, // TRACK_ELEM_25_DEG_UP_TO_LEFT_BANK + 32, // TRACK_ELEM_25_DEG_UP_TO_RIGHT_BANK + 32, // TRACK_ELEM_LEFT_BANK_TO_25_DEG_DOWN + 32, // TRACK_ELEM_RIGHT_BANK_TO_25_DEG_DOWN + 32, // TRACK_ELEM_25_DEG_DOWN_TO_LEFT_BANK + 32, // TRACK_ELEM_25_DEG_DOWN_TO_RIGHT_BANK + 32, // TRACK_ELEM_LEFT_BANK + 32, // TRACK_ELEM_RIGHT_BANK + 130, // TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP + 130, // TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP + 130, // TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_DOWN + 130, // TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_DOWN + 96, // TRACK_ELEM_S_BEND_LEFT + 96, // TRACK_ELEM_S_BEND_RIGHT + 120, // TRACK_ELEM_LEFT_VERTICAL_LOOP + 120, // TRACK_ELEM_RIGHT_VERTICAL_LOOP + 75, // TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES + 75, // TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES + 75, // TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_BANK + 75, // TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_BANK + 77, // TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP + 77, // TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP + 77, // TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN + 77, // TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN + 24, // TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE + 24, // TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE + 96, // TRACK_ELEM_LEFT_TWIST_DOWN_TO_UP + 96, // TRACK_ELEM_RIGHT_TWIST_DOWN_TO_UP + 96, // TRACK_ELEM_LEFT_TWIST_UP_TO_DOWN + 96, // TRACK_ELEM_RIGHT_TWIST_UP_TO_DOWN + 60, // TRACK_ELEM_HALF_LOOP_UP + 60, // TRACK_ELEM_HALF_LOOP_DOWN + 55, // TRACK_ELEM_LEFT_CORKSCREW_UP + 55, // TRACK_ELEM_RIGHT_CORKSCREW_UP + 55, // TRACK_ELEM_LEFT_CORKSCREW_DOWN + 55, // TRACK_ELEM_RIGHT_CORKSCREW_DOWN + 36, // TRACK_ELEM_FLAT_TO_60_DEG_UP + 36, // TRACK_ELEM_60_DEG_UP_TO_FLAT + 36, // TRACK_ELEM_FLAT_TO_60_DEG_DOWN + 36, // TRACK_ELEM_60_DEG_DOWN_TO_FLAT + 32, // TRACK_ELEM_TOWER_BASE + 32, // TRACK_ELEM_TOWER_SECTION + 32, // TRACK_ELEM_FLAT_COVERED + 33, // TRACK_ELEM_25_DEG_UP_COVERED + 40, // TRACK_ELEM_60_DEG_UP_COVERED + 32, // TRACK_ELEM_FLAT_TO_25_DEG_UP_COVERED + 34, // TRACK_ELEM_25_DEG_UP_TO_60_DEG_UP_COVERED + 34, // TRACK_ELEM_60_DEG_UP_TO_25_DEG_UP_COVERED + 32, // TRACK_ELEM_25_DEG_UP_TO_FLAT_COVERED + 33, // TRACK_ELEM_25_DEG_DOWN_COVERED + 40, // TRACK_ELEM_60_DEG_DOWN_COVERED + 32, // TRACK_ELEM_FLAT_TO_25_DEG_DOWN_COVERED + 34, // TRACK_ELEM_25_DEG_DOWN_TO_60_DEG_DOWN_COVERED + 34, // TRACK_ELEM_60_DEG_DOWN_TO_25_DEG_DOWN_COVERED + 32, // TRACK_ELEM_25_DEG_DOWN_TO_FLAT_COVERED + 124, // TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES_COVERED + 124, // TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES_COVERED + 96, // TRACK_ELEM_S_BEND_LEFT_COVERED + 96, // TRACK_ELEM_S_BEND_RIGHT_COVERED + 75, // TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_COVERED + 75, // TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_COVERED + 150, // TRACK_ELEM_LEFT_HALF_BANKED_HELIX_UP_SMALL + 150, // TRACK_ELEM_RIGHT_HALF_BANKED_HELIX_UP_SMALL + 150, // TRACK_ELEM_LEFT_HALF_BANKED_HELIX_DOWN_SMALL + 150, // TRACK_ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL + 248, // TRACK_ELEM_LEFT_HALF_BANKED_HELIX_UP_LARGE + 248, // TRACK_ELEM_RIGHT_HALF_BANKED_HELIX_UP_LARGE + 248, // TRACK_ELEM_LEFT_HALF_BANKED_HELIX_DOWN_LARGE + 248, // TRACK_ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE + 64, // TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_UP + 64, // TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_UP + 64, // TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_DOWN + 64, // TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_DOWN + 32, // TRACK_ELEM_BRAKES + 32, // TRACK_ELEM_ROTATION_CONTROL_TOGGLE + 32, // TRACK_ELEM_INVERTED_90_DEG_UP_TO_FLAT_QUARTER_LOOP + 124, // TRACK_ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_UP + 124, // TRACK_ELEM_RIGHT_QUARTER_BANKED_HELIX_LARGE_UP + 124, // TRACK_ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_DOWN + 124, // TRACK_ELEM_RIGHT_QUARTER_BANKED_HELIX_LARGE_DOWN + 124, // TRACK_ELEM_LEFT_QUARTER_HELIX_LARGE_UP + 124, // TRACK_ELEM_RIGHT_QUARTER_HELIX_LARGE_UP + 124, // TRACK_ELEM_LEFT_QUARTER_HELIX_LARGE_DOWN + 124, // TRACK_ELEM_RIGHT_QUARTER_HELIX_LARGE_DOWN + 33, // TRACK_ELEM_25_DEG_UP_LEFT_BANKED + 33, // TRACK_ELEM_25_DEG_UP_RIGHT_BANKED + 32, // TRACK_ELEM_WATERFALL + 32, // TRACK_ELEM_RAPIDS + 32, // TRACK_ELEM_ON_RIDE_PHOTO + 33, // TRACK_ELEM_25_DEG_DOWN_LEFT_BANKED + 33, // TRACK_ELEM_25_DEG_DOWN_RIGHT_BANKED + 128, // TRACK_ELEM_WATER_SPLASH + 165, // TRACK_ELEM_FLAT_TO_60_DEG_UP_LONG_BASE + 165, // TRACK_ELEM_60_DEG_UP_TO_FLAT_LONG_BASE + 32, // TRACK_ELEM_WHIRLPOOL + 165, // TRACK_ELEM_FLAT_TO_60_DEG_DOWN_LONG_BASE + 165, // TRACK_ELEM_60_DEG_UP_TO_FLAT_LONG_BASE_122 + 138, // TRACK_ELEM_CABLE_LIFT_HILL + 32, // TRACK_ELEM_REVERSE_WHOA_BELLY_SLOPE + 32, // TRACK_ELEM_REVERSE_WHOA_BELLY_VERTICAL + 32, // TRACK_ELEM_90_DEG_UP + 32, // TRACK_ELEM_90_DEG_DOWN + 32, // TRACK_ELEM_60_DEG_UP_TO_90_DEG_UP + 32, // TRACK_ELEM_90_DEG_DOWN_TO_60_DEG_DOWN + 32, // TRACK_ELEM_90_DEG_UP_TO_60_DEG_UP + 32, // TRACK_ELEM_60_DEG_DOWN_TO_90_DEG_DOWN + 32, // TRACK_ELEM_BRAKE_FOR_DROP + 87, // TRACK_ELEM_LEFT_EIGHTH_TO_DIAG + 87, // TRACK_ELEM_RIGHT_EIGHTH_TO_DIAG + 87, // TRACK_ELEM_LEFT_EIGHTH_TO_ORTHOGONAL + 87, // TRACK_ELEM_RIGHT_EIGHTH_TO_ORTHOGONAL + 87, // TRACK_ELEM_LEFT_EIGHTH_BANK_TO_DIAG + 87, // TRACK_ELEM_RIGHT_EIGHTH_BANK_TO_DIAG + 87, // TRACK_ELEM_LEFT_EIGHTH_BANK_TO_ORTHOGONAL + 87, // TRACK_ELEM_RIGHT_EIGHTH_BANK_TO_ORTHOGONAL + 45, // TRACK_ELEM_DIAG_FLAT + 45, // TRACK_ELEM_DIAG_25_DEG_UP + 45, // TRACK_ELEM_DIAG_60_DEG_UP + 45, // TRACK_ELEM_DIAG_FLAT_TO_25_DEG_UP + 45, // TRACK_ELEM_DIAG_25_DEG_UP_TO_60_DEG_UP + 45, // TRACK_ELEM_DIAG_60_DEG_UP_TO_25_DEG_UP + 45, // TRACK_ELEM_DIAG_25_DEG_UP_TO_FLAT + 45, // TRACK_ELEM_DIAG_25_DEG_DOWN + 45, // TRACK_ELEM_DIAG_60_DEG_DOWN + 45, // TRACK_ELEM_DIAG_FLAT_TO_25_DEG_DOWN + 45, // TRACK_ELEM_DIAG_25_DEG_DOWN_TO_60_DEG_DOWN + 45, // TRACK_ELEM_DIAG_60_DEG_DOWN_TO_25_DEG_DOWN + 45, // TRACK_ELEM_DIAG_25_DEG_DOWN_TO_FLAT + 45, // TRACK_ELEM_DIAG_FLAT_TO_60_DEG_UP + 45, // TRACK_ELEM_DIAG_60_DEG_UP_TO_FLAT + 45, // TRACK_ELEM_DIAG_FLAT_TO_60_DEG_DOWN + 45, // TRACK_ELEM_DIAG_60_DEG_DOWN_TO_FLAT + 45, // TRACK_ELEM_DIAG_FLAT_TO_LEFT_BANK + 45, // TRACK_ELEM_DIAG_FLAT_TO_RIGHT_BANK + 45, // TRACK_ELEM_DIAG_LEFT_BANK_TO_FLAT + 45, // TRACK_ELEM_DIAG_RIGHT_BANK_TO_FLAT + 45, // TRACK_ELEM_DIAG_LEFT_BANK_TO_25_DEG_UP + 45, // TRACK_ELEM_DIAG_RIGHT_BANK_TO_25_DEG_UP + 45, // TRACK_ELEM_DIAG_25_DEG_UP_TO_LEFT_BANK + 45, // TRACK_ELEM_DIAG_25_DEG_UP_TO_RIGHT_BANK + 45, // TRACK_ELEM_DIAG_LEFT_BANK_TO_25_DEG_DOWN + 45, // TRACK_ELEM_DIAG_RIGHT_BANK_TO_25_DEG_DOWN + 45, // TRACK_ELEM_DIAG_25_DEG_DOWN_TO_LEFT_BANK + 45, // TRACK_ELEM_DIAG_25_DEG_DOWN_TO_RIGHT_BANK + 45, // TRACK_ELEM_DIAG_LEFT_BANK + 45, // TRACK_ELEM_DIAG_RIGHT_BANK + 16, // TRACK_ELEM_LOG_FLUME_REVERSER + 32, // TRACK_ELEM_SPINNING_TUNNEL + 96, // TRACK_ELEM_LEFT_BARREL_ROLL_UP_TO_DOWN + 96, // TRACK_ELEM_RIGHT_BARREL_ROLL_UP_TO_DOWN + 96, // TRACK_ELEM_LEFT_BARREL_ROLL_DOWN_TO_UP + 96, // TRACK_ELEM_RIGHT_BARREL_ROLL_DOWN_TO_UP + 64, // TRACK_ELEM_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP + 64, // TRACK_ELEM_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP + 64, // TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_LEFT_BANK + 64, // TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_RIGHT_BANK + 32, // TRACK_ELEM_POWERED_LIFT + 100, // TRACK_ELEM_LEFT_LARGE_HALF_LOOP_UP + 100, // TRACK_ELEM_RIGHT_LARGE_HALF_LOOP_UP + 100, // TRACK_ELEM_RIGHT_LARGE_HALF_LOOP_DOWN + 100, // TRACK_ELEM_LEFT_LARGE_HALF_LOOP_DOWN + 96, // + 96, // + 96, // + 96, // + 64, // + 64, // + 64, // + 64, // + 64, // + 64, // + 16, // + 16, // + 64, // + 64, // + 32, // + 32, // + 32, // + 32, // + 32, // + 80, // + 80, // + 80, // + 64, // + 64, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 32, // + 80, // + 80, // + 80, // +}; diff --git a/src/ride/track_data.h b/src/ride/track_data.h index 932e01636f..e34d3f23ea 100644 --- a/src/ride/track_data.h +++ b/src/ride/track_data.h @@ -28,3 +28,5 @@ extern const rct_track_coordinates* FlatTrackCoordinates; extern const uint64 RideTypePossibleTrackConfigurations[91]; extern const rct_preview_track *TrackBlocks[256]; extern const rct_preview_track *FlatRideTrackBlocks[255]; + +extern const uint8 TrackPieceLengths[256];