implement ride_get_track_length

This commit is contained in:
IntelOrca 2015-07-12 15:16:15 +01:00
parent ed5c6eb866
commit 4a8b5843f7
3 changed files with 322 additions and 22 deletions

View File

@ -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

View File

@ -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, //
};

View File

@ -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];