Merge pull request #4963 from Gymnasiast/add-boosters

Re-add boosters
This commit is contained in:
Ted John 2017-01-01 21:31:33 +00:00 committed by GitHub
commit 84ddd12a3c
18 changed files with 100 additions and 47 deletions

View File

@ -4303,6 +4303,8 @@ STR_5991 :Can't paste element...
STR_5992 :The map elements limit has been reached
STR_5993 :{SMALLFONT}{BLACK}Copy selected element
STR_5994 :{SMALLFONT}{BLACK}Paste copied element
STR_5995 :Booster
STR_5996 :Booster speed
#############
# Scenarios #

View File

@ -3,6 +3,7 @@
- Feature: Allow entertainers' costume changes even in absence of required scenery
- Feature: FreeBSD support
- Feature: Allow loading of parks from URLs
- Feature: Add boosters (from RCT1 and RCTC) [#4963]
- Improved: Checksum calculations speeded up
- Improved: Pathfinding [#4847]
- Improved: Guests and staff are now imported when loading SC4 / SV4 parks.

View File

@ -3644,6 +3644,9 @@ enum {
STR_TILE_INSPECTOR_COPY_TIP = 5993,
STR_TILE_INSPECTOR_PASTE_TIP = 5994,
STR_BOOSTER = 5995,
STR_RIDE_CONSTRUCTION_BOOSTER_SPEED = 5996,
// Have to include resource strings (from scenarios and objects) for the time being now that language is partially working
STR_COUNT = 32768
};

View File

@ -27,6 +27,7 @@ extern "C"
#include "../drawing/drawing.h"
#include "../localisation/localisation.h"
#include "../rct1.h"
#include "../ride/track.h"
}
RideObject::~RideObject()
@ -76,9 +77,27 @@ void RideObject::ReadLegacy(IReadObjectContext * context, IStream * stream)
GetStringTable()->Read(context, stream, OBJ_STRING_ID_DESCRIPTION);
// TODO: Move to its own function when ride construction window is merged.
if (gConfigInterface.select_by_track_type) {
if (gConfigInterface.select_by_track_type)
{
_legacyType.enabledTrackPieces = 0xFFFFFFFFFFFFFFFF;
}
else
{
// When not in select by track type mode, add boosters if the track type is eligible
for (int i = 0; i < 3; i++)
{
if (_legacyType.ride_type[i] == RIDE_TYPE_LOOPING_ROLLER_COASTER ||
_legacyType.ride_type[i] == RIDE_TYPE_CORKSCREW_ROLLER_COASTER ||
_legacyType.ride_type[i] == RIDE_TYPE_TWISTER_ROLLER_COASTER ||
_legacyType.ride_type[i] == RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER ||
_legacyType.ride_type[i] == RIDE_TYPE_GIGA_COASTER ||
_legacyType.ride_type[i] == RIDE_TYPE_JUNIOR_ROLLER_COASTER)
{
_legacyType.enabledTrackPieces |= (1ULL << TRACK_BOOSTER);
}
}
}
GetStringTable()->Read(context, stream, OBJ_STRING_ID_CAPACITY);

View File

@ -6084,6 +6084,9 @@ TRACK_PAINT_FUNCTION get_track_paint_function_corkscrew_rc(int trackType, int di
return corkscrew_rc_track_diag_right_bank;
case TRACK_ELEM_BLOCK_BRAKES:
return corkscrew_rc_track_block_brakes;
case TRACK_ELEM_BOOSTER:
return corkscrew_rc_track_brakes;
}
return NULL;
}

View File

@ -6430,6 +6430,9 @@ TRACK_PAINT_FUNCTION get_track_paint_function_giga_rc(int trackType, int directi
return giga_rc_track_left_banked_25_deg_down_to_flat;
case TRACK_ELEM_RIGHT_BANKED_25_DEG_DOWN_TO_FLAT:
return giga_rc_track_right_banked_25_deg_down_to_flat;
case TRACK_ELEM_BOOSTER:
return giga_rc_track_brakes;
}
return NULL;
}

View File

@ -4873,6 +4873,9 @@ TRACK_PAINT_FUNCTION get_track_paint_function_junior_rc(int trackType, int direc
case TRACK_ELEM_BLOCK_BRAKES:
return junior_rc_block_brake_paint_setup;
case TRACK_ELEM_BOOSTER:
return junior_rc_brake_paint_setup;
}
return NULL;
}

View File

@ -6551,6 +6551,9 @@ TRACK_PAINT_FUNCTION get_track_paint_function_looping_rc(int trackType, int dire
return looping_rc_track_left_banked_25_deg_down_to_flat;
case TRACK_ELEM_RIGHT_BANKED_25_DEG_DOWN_TO_FLAT:
return looping_rc_track_right_banked_25_deg_down_to_flat;
case TRACK_ELEM_BOOSTER:
return looping_rc_track_brakes;
}
return NULL;
}

View File

@ -1453,6 +1453,9 @@ TRACK_PAINT_FUNCTION get_track_paint_function_twister_rc(int trackType, int dire
return twister_rc_track_90_deg_to_inverted_flat_quarter_loop_up;
case TRACK_ELEM_INVERTED_FLAT_TO_90_DEG_QUARTER_LOOP_DOWN:
return twister_rc_track_inverted_flat_to_90_deg_quarter_loop_down;
case TRACK_ELEM_BOOSTER:
return twister_rc_track_brakes;
}
return NULL;
}

View File

@ -1432,6 +1432,9 @@ TRACK_PAINT_FUNCTION get_track_paint_function_vertical_drop_rc(int trackType, in
return vertical_drop_rc_track_90_deg_to_inverted_flat_quarter_loop_up;
case TRACK_ELEM_INVERTED_FLAT_TO_90_DEG_QUARTER_LOOP_DOWN:
return vertical_drop_rc_track_inverted_flat_to_90_deg_quarter_loop_down;
case TRACK_ELEM_BOOSTER:
return vertical_drop_rc_track_brakes;
}
return NULL;
}

View File

@ -1957,7 +1957,7 @@ const rct_ride_properties RideProperties[91] = {
RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_DROPS | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS |
RIDE_TYPE_FLAG_20 | RIDE_TYPE_FLAG_26 | RIDE_TYPE_FLAG_CHECK_FOR_STALLING | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 |
RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR,
0, 0, 0, 0}, // RIDE_TYPE_JUNIOR_ROLLER_COASTER
0, 0, 0, 17}, // RIDE_TYPE_JUNIOR_ROLLER_COASTER
{RIDE_TYPE_FLAG_HAS_TRACK_COLOUR_SUPPORTS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION |
RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | RIDE_TYPE_FLAG_26 |
RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_30 | RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR,

View File

@ -1344,7 +1344,7 @@ static money32 track_place(int rideIndex, int type, int originX, int originY, in
map_animation_create(MAP_ANIMATION_TYPE_TRACK_SPINNINGTUNNEL, x, y, mapElement->base_height);
break;
}
if (type == TRACK_ELEM_BRAKES) {
if (type == TRACK_ELEM_BRAKES || type == TRACK_ELEM_BOOSTER) {
mapElement->properties.track.sequence = (properties_1 >> 1) << 4;
}
else {

View File

@ -138,6 +138,7 @@ enum {
TRACK_RAPIDS,
TRACK_HALF_LOOP_UNINVERTED,
TRACK_HALF_LOOP_INVERTED,
TRACK_BOOSTER = TRACK_ROTATION_CONTROL_TOGGLE,
TRACK_WATERFALL = 152,
TRACK_WHIRLPOOL = 152,
@ -309,7 +310,7 @@ enum {
TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_DOWN,
TRACK_ELEM_BRAKES,
TRACK_ELEM_ROTATION_CONTROL_TOGGLE = 100,
TRACK_ELEM_RCTC_BOOSTER = 100,
TRACK_ELEM_BOOSTER = 100,
TRACK_ELEM_INVERTED_90_DEG_UP_TO_FLAT_QUARTER_LOOP,
TRACK_ELEM_MAZE = 101,
TRACK_ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_UP,

View File

@ -1059,7 +1059,7 @@ const uint64 RideTypePossibleTrackConfigurations[91] = {
/* RIDE_TYPE_STAND_UP_ROLLER_COASTER */ (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_VERTICAL_LOOP) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HALF_LOOP) | (1ULL << TRACK_CORKSCREW) | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_ON_RIDE_PHOTO) | (1ULL << TRACK_BLOCK_BRAKES),
/* RIDE_TYPE_SUSPENDED_SWINGING_COASTER */ (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HELIX_LARGE_UNBANKED) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_BLOCK_BRAKES),
/* RIDE_TYPE_INVERTED_ROLLER_COASTER */ (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_VERTICAL_LOOP) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_SLOPE_CURVE_STEEP) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_TWIST) | (1ULL << TRACK_HALF_LOOP) | (1ULL << TRACK_CORKSCREW) | (1ULL << TRACK_HELIX_LARGE) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_ON_RIDE_PHOTO) | (1ULL << TRACK_HALF_LOOP_LARGE) | (1ULL << TRACK_BLOCK_BRAKES) | (1ULL << TRACK_SLOPE_ROLL_BANKING),
/* RIDE_TYPE_JUNIOR_ROLLER_COASTER */ (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_LIFT_HILL_CURVE) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_LONG) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_BLOCK_BRAKES),
/* RIDE_TYPE_JUNIOR_ROLLER_COASTER */ (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_LIFT_HILL_CURVE) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_LONG) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_BLOCK_BRAKES) | (1ULL << TRACK_BOOSTER),
/* RIDE_TYPE_MINIATURE_RAILWAY */ (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE),
/* RIDE_TYPE_MONORAIL */ (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE),
/* RIDE_TYPE_MINI_SUSPENDED_COASTER */ (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE),
@ -1070,11 +1070,11 @@ const uint64 RideTypePossibleTrackConfigurations[91] = {
/* RIDE_TYPE_LAUNCHED_FREEFALL */ (1ULL << TRACK_TOWER_BASE),
/* RIDE_TYPE_BOBSLEIGH_COASTER */ (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_BLOCK_BRAKES),
/* RIDE_TYPE_OBSERVATION_TOWER */ (1ULL << TRACK_TOWER_BASE),
/* RIDE_TYPE_LOOPING_ROLLER_COASTER */ (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_VERTICAL_LOOP) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_SLOPE_CURVE_STEEP) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_ON_RIDE_PHOTO) | (1ULL << TRACK_BLOCK_BRAKES) | (1ULL << TRACK_SLOPE_ROLL_BANKING),
/* RIDE_TYPE_LOOPING_ROLLER_COASTER */ (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_VERTICAL_LOOP) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_SLOPE_CURVE_STEEP) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_ON_RIDE_PHOTO) | (1ULL << TRACK_BLOCK_BRAKES) | (1ULL << TRACK_SLOPE_ROLL_BANKING) | (1ULL << TRACK_BOOSTER),
/* RIDE_TYPE_DINGHY_SLIDE */ (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE),
/* RIDE_TYPE_MINE_TRAIN_COASTER */ (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_ON_RIDE_PHOTO) | (1ULL << TRACK_BLOCK_BRAKES),
/* RIDE_TYPE_CHAIRLIFT */ (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_CURVE_VERY_SMALL),
/* RIDE_TYPE_CORKSCREW_ROLLER_COASTER */ (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_VERTICAL_LOOP) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_SLOPE_CURVE_STEEP) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HALF_LOOP) | (1ULL << TRACK_CORKSCREW) | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_ON_RIDE_PHOTO) | (1ULL << TRACK_BLOCK_BRAKES) | (1ULL << TRACK_SLOPE_STEEP_LONG),
/* RIDE_TYPE_CORKSCREW_ROLLER_COASTER */ (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_VERTICAL_LOOP) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_SLOPE_CURVE_STEEP) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HALF_LOOP) | (1ULL << TRACK_CORKSCREW) | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_ON_RIDE_PHOTO) | (1ULL << TRACK_BLOCK_BRAKES) | (1ULL << TRACK_SLOPE_STEEP_LONG) | (1ULL << TRACK_BOOSTER),
/* RIDE_TYPE_MAZE */ 0,
/* RIDE_TYPE_SPIRAL_SLIDE */ 0,
/* RIDE_TYPE_GO_KARTS */ (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_CURVE_VERY_SMALL),
@ -1106,7 +1106,7 @@ const uint64 RideTypePossibleTrackConfigurations[91] = {
/* RIDE_TYPE_FIRST_AID */ 0,
/* RIDE_TYPE_CIRCUS_SHOW */ 0,
/* RIDE_TYPE_GHOST_TRAIN */ (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_CURVE_VERY_SMALL) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_SPINNING_TUNNEL),
/* RIDE_TYPE_TWISTER_ROLLER_COASTER */ (1ULL << TRACK_FLAT) | (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_VERTICAL_LOOP) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_SLOPE_CURVE_STEEP) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HALF_LOOP) | (1ULL << TRACK_CORKSCREW) | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_ON_RIDE_PHOTO) | (1ULL << TRACK_SLOPE_VERTICAL) | (1ULL << TRACK_BARREL_ROLL) | (1ULL << TRACK_POWERED_LIFT) | (1ULL << TRACK_HALF_LOOP_LARGE) | (1ULL << TRACK_SLOPE_CURVE_BANKED) | (1ULL << TRACK_BLOCK_BRAKES) | (1ULL << TRACK_SLOPE_ROLL_BANKING) | (1ULL << TRACK_SLOPE_STEEP_LONG) | (1ULL << TRACK_CURVE_VERTICAL) | (1ULL << TRACK_QUARTER_LOOP),
/* RIDE_TYPE_TWISTER_ROLLER_COASTER */ (1ULL << TRACK_FLAT) | (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_VERTICAL_LOOP) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_SLOPE_CURVE_STEEP) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HALF_LOOP) | (1ULL << TRACK_CORKSCREW) | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_ON_RIDE_PHOTO) | (1ULL << TRACK_SLOPE_VERTICAL) | (1ULL << TRACK_BARREL_ROLL) | (1ULL << TRACK_POWERED_LIFT) | (1ULL << TRACK_HALF_LOOP_LARGE) | (1ULL << TRACK_SLOPE_CURVE_BANKED) | (1ULL << TRACK_BLOCK_BRAKES) | (1ULL << TRACK_SLOPE_ROLL_BANKING) | (1ULL << TRACK_SLOPE_STEEP_LONG) | (1ULL << TRACK_CURVE_VERTICAL) | (1ULL << TRACK_QUARTER_LOOP) | (1ULL << TRACK_BOOSTER),
/* RIDE_TYPE_WOODEN_ROLLER_COASTER */ (1ULL << TRACK_FLAT) | (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_VERTICAL_LOOP) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_SLOPE_CURVE_STEEP) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_ON_RIDE_PHOTO) | (1ULL << TRACK_WATER_SPLASH) | (1ULL << TRACK_SLOPE_CURVE_BANKED) | (1ULL << TRACK_BLOCK_BRAKES) | (1ULL << TRACK_SLOPE_ROLL_BANKING),
/* RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER */ (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_BRAKES),
/* RIDE_TYPE_WILD_MOUSE */ (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_LIFT_HILL_STEEP) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_LONG) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_CURVE_VERY_SMALL) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_BLOCK_BRAKES) | (1ULL << TRACK_ROTATION_CONTROL_TOGGLE),
@ -1123,7 +1123,7 @@ const uint64 RideTypePossibleTrackConfigurations[91] = {
/* RIDE_TYPE_REVERSER_ROLLER_COASTER */ (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_REVERSER),
/* RIDE_TYPE_HEARTLINE_TWISTER_COASTER */ (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_LIFT_HILL_STEEP) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_HEARTLINE_ROLL),
/* RIDE_TYPE_MINI_GOLF */ (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_CURVE_VERY_SMALL),
/* RIDE_TYPE_GIGA_COASTER */ (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_SLOPE_CURVE_STEEP) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_ON_RIDE_PHOTO) | (1ULL << TRACK_BLOCK_BRAKES) | (1ULL << TRACK_SLOPE_ROLL_BANKING) | (1ULL << TRACK_SLOPE_STEEP_LONG) | (1ULL << TRACK_LIFT_HILL_CABLE),
/* RIDE_TYPE_GIGA_COASTER */ (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_SLOPE_CURVE_STEEP) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_ON_RIDE_PHOTO) | (1ULL << TRACK_BLOCK_BRAKES) | (1ULL << TRACK_SLOPE_ROLL_BANKING) | (1ULL << TRACK_SLOPE_STEEP_LONG) | (1ULL << TRACK_LIFT_HILL_CABLE) | (1ULL << TRACK_BOOSTER),
/* RIDE_TYPE_ROTO_DROP */ (1ULL << TRACK_TOWER_BASE),
/* RIDE_TYPE_FLYING_SAUCERS */ 0,
/* RIDE_TYPE_CROOKED_HOUSE */ 0,

View File

@ -256,15 +256,6 @@ static rct_track_td6 * track_design_open_from_td4(uint8 *src, size_t srcLength)
td6->space_required_y = 255;
td6->lift_hill_speed_num_circuits = 5;
// If it has boosters then sadly track has to be discarded.
if (td4_track_has_boosters(td4)) {
log_error("Track design contains RCT1 boosters which are not yet supported.");
SafeFree(td4->elements);
SafeFree(td4);
SafeFree(td6);
return NULL;
}
// Move elements across
td6->elements = td4->elements;
td6->elementsSize = td4->elementsSize;
@ -356,26 +347,6 @@ static void td6_set_element_helper_pointers(rct_track_td6 * td6)
td6->scenery_elements = sceneryElement;
}
/**
*
* rct2: 0x00677530
* Returns true if it has booster track elements
*/
static bool td4_track_has_boosters(rct_track_td4 * td4)
{
if (td4->type != RCT1_RIDE_TYPE_HEDGE_MAZE) {
rct_td6_track_element * track = (rct_td6_track_element *)td4->elements;
size_t numElements = td4->elementsSize / sizeof(rct_td6_track_element);
for (size_t i = 0; i < numElements; i++) {
if (track[i].type == 0xFF) break;
if (track[i].type == RCT1_TRACK_ELEM_BOOSTER) {
return true;
}
}
}
return false;
}
void track_design_dispose(rct_track_td6 *td6)
{
if (td6 != NULL) {

View File

@ -7425,7 +7425,7 @@ loc_6DB41D:
}
vehicle->track_direction = regs.bl & 3;
vehicle->track_type |= trackType << 2;
vehicle->break_speed = (mapElement->properties.track.sequence >> 4) << 1;
vehicle->brake_speed = (mapElement->properties.track.sequence >> 4) << 1;
if (trackType == TRACK_ELEM_ON_RIDE_PHOTO) {
vehicle_trigger_on_ride_photo(vehicle, mapElement);
}
@ -7466,7 +7466,7 @@ loc_6DAEB9:
ride->breakdown_reason_pending == BREAKDOWN_BRAKES_FAILURE &&
ride->mechanic_status == RIDE_MECHANIC_STATUS_4
)) {
regs.eax = vehicle->break_speed << 16;
regs.eax = vehicle->brake_speed << 16;
if (regs.eax < _vehicleVelocityF64E08) {
vehicle->acceleration = -_vehicleVelocityF64E08 * 16;
}
@ -7478,6 +7478,18 @@ loc_6DAEB9:
}
}
}
else if (trackType == TRACK_ELEM_BOOSTER && ride->type != RIDE_TYPE_WILD_MOUSE) {
if (!(
ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN &&
ride->breakdown_reason_pending == BREAKDOWN_BRAKES_FAILURE &&
ride->mechanic_status == RIDE_MECHANIC_STATUS_4
)) {
regs.eax = (vehicle->brake_speed << 16);
if (regs.eax > _vehicleVelocityF64E08) {
vehicle->acceleration = RideProperties[ride->type].acceleration << 16; //_vehicleVelocityF64E08 * 1.2;
}
}
}
if ((trackType == TRACK_ELEM_FLAT && ride->type == RIDE_TYPE_REVERSE_FREEFALL_COASTER) ||
(trackType == TRACK_ELEM_POWERED_LIFT)
@ -7790,7 +7802,7 @@ static bool vehicle_update_track_motion_backwards_get_new_track(rct_vehicle *veh
direction &= 3;
vehicle->track_type = trackType << 2;
vehicle->track_direction |= direction;
vehicle->break_speed = (mapElement->properties.track.sequence >> 4) << 1;
vehicle->brake_speed = (mapElement->properties.track.sequence >> 4) << 1;
// There are two bytes before the move info list
uint16 trackTotalProgress = vehicle_get_move_info_size(vehicle->var_CD, vehicle->track_type);
@ -7816,13 +7828,22 @@ loc_6DBA33:;
}
if (trackType == TRACK_ELEM_BRAKES) {
regs.eax = -(vehicle->break_speed << 16);
regs.eax = -(vehicle->brake_speed << 16);
if (regs.eax > _vehicleVelocityF64E08) {
regs.eax = _vehicleVelocityF64E08 * -16;
vehicle->acceleration = regs.eax;
}
}
// Boosters share their ID with the Spinning Control track.
if (trackType == TRACK_ELEM_BOOSTER && ride->type != RIDE_TYPE_WILD_MOUSE) {
regs.eax = (vehicle->brake_speed << 16);
if (regs.eax < _vehicleVelocityF64E08) {
regs.eax = RideProperties[ride->type].acceleration << 16;
vehicle->acceleration = regs.eax;
}
}
regs.ax = vehicle->track_progress - 1;
if (regs.ax == -1) {
if (!vehicle_update_track_motion_backwards_get_new_track(vehicle, trackType, ride, rideEntry, (uint16 *)&regs.ax)) {

View File

@ -187,7 +187,7 @@ typedef struct rct_vehicle {
};
union {
uint8 var_CF;
uint8 break_speed; // 0xCF
uint8 brake_speed; // 0xCF
};
uint16 lost_time_out; // 0xD0
sint8 vertical_drop_countdown; // 0xD1

View File

@ -32,6 +32,7 @@
#include "../world/footpath.h"
#include "dropdown.h"
#include "../sprites.h"
#include "../world/map.h"
/* move to ride.c */
static void sub_6B2FA9(rct_windownumber number)
@ -2140,6 +2141,8 @@ static void window_ride_construction_invalidate(rct_window *w)
stringId = RideConfigurationStringIds[_currentTrackCurve & 0xFF];
if (stringId == STR_RAPIDS && ride->type == RIDE_TYPE_CAR_RIDE)
stringId = STR_LOG_BUMPS;
if (stringId == STR_SPINNING_CONTROL_TOGGLE_TRACK && ride->type != RIDE_TYPE_WILD_MOUSE)
stringId = STR_BOOSTER;
}
set_format_arg(0, uint16, stringId);
@ -2440,7 +2443,7 @@ void sub_6C84CE()
int z = _currentTrackBeginZ;
if (!sub_6C683D(&x, &y, &z, _currentTrackPieceDirection & 3, _currentTrackPieceType, 0, &mapElement, 0)) {
_selectedTrackType = mapElement->properties.track.type;
if (mapElement->properties.track.type == TRACK_ELEM_BRAKES)
if (mapElement->properties.track.type == TRACK_ELEM_BRAKES || mapElement->properties.track.type == TRACK_ELEM_BOOSTER)
_currentBrakeSpeed2 = (mapElement->properties.track.sequence >> 4) << 1;
_currentSeatRotationAngle = mapElement->properties.track.colour >> 4;
}
@ -2665,7 +2668,7 @@ bool sub_6CA2DF(int *_trackType, int *_trackDirection, int *_rideIndex, int *_ed
}
if (trackType == TRACK_ELEM_BRAKES) {
if (trackType == TRACK_ELEM_BRAKES || trackType == TRACK_ELEM_BOOSTER) {
properties = _currentBrakeSpeed2;
} else {
properties = _currentSeatRotationAngle << 12;
@ -3226,7 +3229,11 @@ static void window_ride_construction_update_widgets(rct_window *w)
window_ride_construction_widgets[WIDX_BANK_RIGHT].type = WWT_EMPTY;
window_ride_construction_widgets[WIDX_U_TRACK].type = WWT_EMPTY;
window_ride_construction_widgets[WIDX_O_TRACK].type = WWT_EMPTY;
if (_selectedTrackType != TRACK_ELEM_BRAKES && _currentTrackCurve != (0x100 | TRACK_ELEM_BRAKES)) {
bool brakesSelected = _selectedTrackType == TRACK_ELEM_BRAKES || _currentTrackCurve == (0x100 | TRACK_ELEM_BRAKES);
bool boosterSelected = ride->type != RIDE_TYPE_WILD_MOUSE && (_selectedTrackType == TRACK_ELEM_BOOSTER || _currentTrackCurve == (0x100 | TRACK_ELEM_BOOSTER));
if (!brakesSelected && !boosterSelected) {
if (is_track_enabled(TRACK_FLAT_ROLL_BANKING)) {
window_ride_construction_widgets[WIDX_BANK_LEFT].type = WWT_FLATBTN;
window_ride_construction_widgets[WIDX_BANK_STRAIGHT].type = WWT_FLATBTN;
@ -3254,7 +3261,11 @@ static void window_ride_construction_update_widgets(rct_window *w)
}
}
} else {
window_ride_construction_widgets[WIDX_BANKING_GROUPBOX].text = STR_RIDE_CONSTRUCTION_BRAKE_SPEED;
if (brakesSelected)
window_ride_construction_widgets[WIDX_BANKING_GROUPBOX].text = STR_RIDE_CONSTRUCTION_BRAKE_SPEED;
else
window_ride_construction_widgets[WIDX_BANKING_GROUPBOX].text = STR_RIDE_CONSTRUCTION_BOOSTER_SPEED;
_currentlyShowingBrakeSpeed = 1;
window_ride_construction_widgets[WIDX_BANK_LEFT].text = STR_RIDE_CONSTRUCTION_BRAKE_SPEED_VELOCITY;
window_ride_construction_widgets[WIDX_BANK_LEFT].tooltip = STR_RIDE_CONSTRUCTION_BRAKE_SPEED_LIMIT_TIP;
@ -3492,6 +3503,12 @@ static void window_ride_construction_show_special_track_dropdown(rct_window *w,
rct_ride *ride = get_ride(_currentRideIndex);
if (ride->type == RIDE_TYPE_CAR_RIDE)
trackPieceStringId = STR_LOG_BUMPS;
}
if (trackPieceStringId == STR_SPINNING_CONTROL_TOGGLE_TRACK) {
rct_ride *ride = get_ride(_currentRideIndex);
if (ride->type != RIDE_TYPE_WILD_MOUSE)
trackPieceStringId = STR_BOOSTER;
}
gDropdownItemsFormat[i] = trackPieceStringId;
if ((trackPiece | 0x100) == _currentTrackCurve) {