From a132b52766d27c1bf4cceb5472f04420c5ee4fbc Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 9 Sep 2014 14:16:09 +0100 Subject: [PATCH] finish invalidate event for ride window --- src/ride.c | 21 +++++ src/ride.h | 37 ++++++-- src/ride_ratings.c | 6 +- src/string_ids.h | 68 ++++++++++++++ src/window_ride.c | 225 ++++++++++++++++++++++++++++++++++++++++----- 5 files changed, 321 insertions(+), 36 deletions(-) diff --git a/src/ride.c b/src/ride.c index a705148105..fe280689cb 100644 --- a/src/ride.c +++ b/src/ride.c @@ -548,3 +548,24 @@ int ride_get_total_length(rct_ride *ride) totalLength += ride->length[i]; return totalLength; } + +int ride_can_have_multiple_circuits(rct_ride *ride) +{ + if (!(RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 0x200)) + return 0; + + // Only allow circuit or launch modes + if ( + ride->mode != RIDE_MODE_CONTINUOUS_CIRCUIT && + ride->mode != RIDE_MODE_REVERSE_INCLINE_LAUNCHED_SHUTTLE && + ride->mode != RIDE_MODE_POWERED_LAUNCH + ) { + return 0; + } + + // Must have no more than one vehicle and one station + if (ride->num_vehicles > 1 || ride->num_stations > 1) + return 0; + + return 1; +} \ No newline at end of file diff --git a/src/ride.h b/src/ride.h index dc71186c06..80239a1067 100644 --- a/src/ride.h +++ b/src/ride.h @@ -56,7 +56,9 @@ typedef struct { sint8 excitement_multipler; // 0x1B2 sint8 intensity_multipler; // 0x1B3 sint8 nausea_multipler; // 0x1B4 - uint8 pad_1B5[0x09]; + uint8 pad_1B5; + uint32 var_1B6; + uint8 pad_1BA[0x04]; uint8 category[2]; // 0x1BE uint8 shop_item; // 0x1C0 uint8 shop_item_secondary; // 0x1C1 @@ -88,14 +90,17 @@ typedef struct { uint16 exits[4]; // 0x072 uint8 pad_07A[0x0C]; uint16 vehicles[32]; // 0x086 Points to the first car in the train - uint8 pad_C6; + uint8 depart_flags; // 0x0C6 // Not sure if these should be uint or sint. uint8 num_stations; // 0x0C7 uint8 num_vehicles; // 0x0C8 uint8 var_0C9; - - uint8 pad_0CA[0xE]; + uint8 pad_0CA[0x4]; + uint8 min_waiting_time; // 0x0CE + uint8 max_waiting_time; // 0x0CF + uint8 var_0D0; + uint8 pad_0D1[0x7]; sint32 max_speed; // 0x0D8 sint32 average_speed; // 0x0DC uint8 pad_0E0[0x4]; @@ -166,7 +171,7 @@ typedef struct { uint8 music; uint8 pad_1C9[0x03]; uint8 num_block_brakes; // 0x1CC - uint8 var_1CD; + uint8 lift_hill_speed; // 0x1CD uint16 guests_favourite; // 0x1CE uint32 lifecycle_flags; // 0x1D0 uint8 var_1D4; @@ -175,7 +180,9 @@ typedef struct { // I tried searching the IDA file for "1F4" but couldn't find places where // this is written to. uint16 total_air_time; // 0x1F4 - uint8 pad_1F6[0x0a]; + uint8 pad_1F6; + uint8 num_circuits; // 0x1F7 + uint8 pad_1F8[0x8]; uint16 queue_length[4]; // 0x200 uint8 pad_208[0x58]; } rct_ride; @@ -319,9 +326,9 @@ enum { }; enum { - RIDE_MODE_NORMAL = 0, + RIDE_MODE_NORMAL, RIDE_MODE_CONTINUOUS_CIRCUIT, - RIDE_MODE_REVERSE_INCLINED_SHUTTLE, + RIDE_MODE_REVERSE_INCLINE_LAUNCHED_SHUTTLE, RIDE_MODE_POWERED_LAUNCH, // RCT1 style? RIDE_MODE_SHUTTLE, RIDE_MODE_BOAT_HIRE, @@ -342,7 +349,7 @@ enum { RIDE_MODE_3D_FILM_MOUSE_TAILS, RIDE_MODE_SPACE_RINGS, RIDE_MODE_BEGINNERS, - RIDE_MODE_LIM_POWERED_LAUNCH, // 0x17 + RIDE_MODE_LIM_POWERED_LAUNCH, RIDE_MODE_FILM_THRILL_RIDERS, RIDE_MODE_3D_FILM_STORM_CHASERS, RIDE_MODE_3D_FILM_SPACE_RAIDERS, @@ -354,7 +361,7 @@ enum { RIDE_MODE_CROOKED_HOUSE, RIDE_MODE_FREEFALL_DROP, RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, - RIDE_MODE_POWERED_LAUNCH2, // 0x23. RCT2 style? + RIDE_MODE_POWERED_LAUNCH_35, // RCT2 style? RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED }; @@ -427,6 +434,15 @@ enum { RIDE_MECHANIC_STATUS_FIXING = 3, }; +enum { + RIDE_DEPART_WAIT_FOR_LOAD_MASK = 7, + RIDE_DEPART_WAIT_FOR_LOAD = 1 << 3, + RIDE_DEPART_LEAVE_WHEN_ANOTHER_ARRIVES = 1 << 4, + RIDE_DEPART_SYNCHRONISE_WITH_ADJACENT_STATIONS = 1 << 5, + RIDE_DEPART_WAIT_FOR_MINIMUM_LENGTH = 1 << 6, + RIDE_DEPART_WAIT_FOR_MAXIMUM_LENGTH = 1 << 7 +}; + #define MAX_RIDES 255 #define MAX_RIDE_MEASUREMENTS 8 @@ -465,5 +481,6 @@ int ride_try_construct(rct_map_element *trackMapElement); void ride_get_status(int rideIndex, int *formatSecondary, int *argument); rct_peep *ride_get_assigned_mechanic(rct_ride *ride); int ride_get_total_length(rct_ride *ride); +int ride_can_have_multiple_circuits(rct_ride *ride); #endif diff --git a/src/ride_ratings.c b/src/ride_ratings.c index 5b438dcd69..bbb1676489 100644 --- a/src/ride_ratings.c +++ b/src/ride_ratings.c @@ -136,13 +136,13 @@ uint16 compute_upkeep(rct_ride *ride) // flume/rapids, 10 for roller coaster, 28 for giga coaster upkeep += rideUnknownData3[ride->type] * ride->num_stations; - if (ride->mode == RIDE_MODE_REVERSE_INCLINED_SHUTTLE) { + if (ride->mode == RIDE_MODE_REVERSE_INCLINE_LAUNCHED_SHUTTLE) { upkeep += 30; } else if (ride->mode == RIDE_MODE_POWERED_LAUNCH) { upkeep += 160; } else if (ride->mode == RIDE_MODE_LIM_POWERED_LAUNCH) { upkeep += 320; - } else if (ride->mode == RIDE_MODE_POWERED_LAUNCH2 || + } else if (ride->mode == RIDE_MODE_POWERED_LAUNCH_35 || ride->mode == RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED) { upkeep += 220; } @@ -239,7 +239,7 @@ ride_rating apply_intensity_penalty(ride_rating excitement, ride_rating intensit */ void sub_655FD6(rct_ride *ride) { - uint8 al = ride->var_1CD; + uint8 al = ride->lift_hill_speed; // No idea what this address is; maybe like compensation of some kind? The // maximum possible value? // List of ride names/values is here: diff --git a/src/string_ids.h b/src/string_ids.h index 86e7f599a1..ef6854deaf 100644 --- a/src/string_ids.h +++ b/src/string_ids.h @@ -290,6 +290,45 @@ enum { STR_CANT_RENAME_RIDE_ATTRACTION = 1059, STR_INVALID_RIDE_ATTRACTION_NAME = 1060, + STR_RIDE_MODE_START = 1061, + STR_RIDE_MODE_NORMAL = STR_RIDE_MODE_START + 0, + STR_RIDE_MODE_CONTINUOUS_CIRCUIT = STR_RIDE_MODE_START + 1, + STR_RIDE_MODE_REVERSE_INCLINE_LAUNCHED_SHUTTLE = STR_RIDE_MODE_START + 2, + STR_RIDE_MODE_POWERED_LAUNCH = STR_RIDE_MODE_START + 3, + STR_RIDE_MODE_SHUTTLE = STR_RIDE_MODE_START + 4, + STR_RIDE_MODE_BOAT_HIRE = STR_RIDE_MODE_START + 5, + STR_RIDE_MODE_UPWARD_LAUNCH = STR_RIDE_MODE_START + 6, + STR_RIDE_MODE_ROTATING_LIFT = STR_RIDE_MODE_START + 7, + STR_RIDE_MODE_STATION_TO_STATION = STR_RIDE_MODE_START + 8, + STR_RIDE_MODE_SINGLE_RIDE_PER_ADMISSION = STR_RIDE_MODE_START + 9, + STR_RIDE_MODE_UNLIMITED_RIDES_PER_ADMISSION = STR_RIDE_MODE_START + 10, + STR_RIDE_MODE_MAZE = STR_RIDE_MODE_START + 11, + STR_RIDE_MODE_RACE = STR_RIDE_MODE_START + 12, + STR_RIDE_MODE_BUMPER_CAR = STR_RIDE_MODE_START + 13, + STR_RIDE_MODE_SWING = STR_RIDE_MODE_START + 14, + STR_RIDE_MODE_SHOP_STALL = STR_RIDE_MODE_START + 15, + STR_RIDE_MODE_ROTATION = STR_RIDE_MODE_START + 16, + STR_RIDE_MODE_FORWARD_ROTATION = STR_RIDE_MODE_START + 17, + STR_RIDE_MODE_BACKWARD_ROTATION = STR_RIDE_MODE_START + 18, + STR_RIDE_MODE_FILM_AVENGING_AVIATORS = STR_RIDE_MODE_START + 19, + STR_RIDE_MODE_3D_FILM_MOUSE_TAILS = STR_RIDE_MODE_START + 20, + STR_RIDE_MODE_SPACE_RINGS = STR_RIDE_MODE_START + 21, + STR_RIDE_MODE_BEGINNERS = STR_RIDE_MODE_START + 22, + STR_RIDE_MODE_LIM_POWERED_LAUNCH = STR_RIDE_MODE_START + 23, + STR_RIDE_MODE_FILM_THRILL_RIDERS = STR_RIDE_MODE_START + 24, + STR_RIDE_MODE_3D_FILM_STORM_CHASERS = STR_RIDE_MODE_START + 25, + STR_RIDE_MODE_3D_FILM_SPACE_RAIDERS = STR_RIDE_MODE_START + 26, + STR_RIDE_MODE_INTENSE = STR_RIDE_MODE_START + 27, + STR_RIDE_MODE_BERSERK = STR_RIDE_MODE_START + 28, + STR_RIDE_MODE_HAUNTED_HOUSE = STR_RIDE_MODE_START + 29, + STR_RIDE_MODE_CIRCUS_SHOW = STR_RIDE_MODE_START + 30, + STR_RIDE_MODE_DOWNWARD_LAUNCH = STR_RIDE_MODE_START + 31, + STR_RIDE_MODE_CROOKED_HOUSE = STR_RIDE_MODE_START + 32, + STR_RIDE_MODE_FREEFALL_DROP = STR_RIDE_MODE_START + 33, + STR_RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED = STR_RIDE_MODE_START + 34, + STR_RIDE_MODE_POWERED_LAUNCH_35 = STR_RIDE_MODE_START + 35, + STR_RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED_MODE = STR_RIDE_MODE_START + 36, + STR_MOVING_TO_END_OF = 1098, STR_WAITING_FOR_PASSENGERS_AT = 1099, STR_WAITING_TO_DEPART = 1100, @@ -322,6 +361,12 @@ enum { STR_UNLOADING_PASSENGERS = 1127, STR_STOPPED_BY_BLOCK_BRAKES = 1128, + STR_QUARTER_LOAD = 1148, + STR_HALF_LOAD = 1149, + STR_THREE_QUARTER_LOAD = 1150, + STR_FULL_LOAD = 1151, + STR_ANY_LOAD = 1152, + STR_PLACE_SCENERY_TIP = 1159, STR_ADJUST_WATER_TIP = 1160, @@ -360,7 +405,10 @@ enum { STR_QUEUE_TIME_PLURAL_LABEL = 1205, STR_WAIT_FOR = 1206, + STR_LEAVE_IF_ANOTHER_TRAIN_ARRIVES = 1207, + STR_LEAVE_IF_ANOTHER_BOAT_ARRIVES = 1208, STR_WAIT_FOR_PASSENGERS_BEFORE_DEPARTING_TIP = 1209, + STR_LEAVE_IF_ANOTHER_VEHICLE_ARRIVES_TIP = 1210, STR_MINIMUM_WAITING_TIME = 1211, STR_MAXIMUM_WAITING_TIME = 1212, STR_MINIMUM_LENGTH_BEFORE_DEPARTING_TIP = 1213, @@ -381,6 +429,8 @@ enum { STR_SHOPS_STALLS_TIP = 1228, STR_ROTATE_OBJECTS_90 = 1327, + STR_LAUNCH_SPEED = 1329, + STR_LAUNCH_SPEED_TIP = 1330, STR_NO_TEST_RESULTS_YET = 1339, STR_MAX_SPEED = 1340, @@ -442,6 +492,9 @@ enum { STR_GUESTS = 1463, STR_STAFF = 1468, + + STR_SPEED = 1471, + STR_SPEED_TIP = 1472, STR_EXCITEMENT_RATING = 1473, STR_EXCITEMENT_RATING_NOT_YET_AVAILABLE = 1474, @@ -490,14 +543,26 @@ enum { STR_CANT_OPEN_PARK = 1723, STR_CANT_CLOSE_PARK = 1724, + STR_NUMBER_OF_LAPS = 1734, + STR_NUMBER_OF_LAPS_TIP = 1735, + STR_RACE_WON_BY_GUEST = 1739, STR_RACE_WON_BY = 1740, + STR_MAX_PEOPLE_ON_RIDE = 1742, + STR_MAX_PEOPLE_ON_RIDE_TIP = 1743, + + STR_TIME_LIMIT = 1747, + STR_TIME_LIMIT_TIP = 1748, + STR_INDIVIDUAL_GUESTS_TIP = 1752, STR_SUMMARISED_GUESTS_TIP = 1753, STR_ADMISSION_PRICE = 1756, STR_RELIABILITY_LABEL_1757 = 1757, + STR_NUMBER_OF_SWINGS = 1769, + STR_NUMBER_OF_SWINGS_TIP = 1770, + STR_OFF = 1775, STR_ON = 1776, STR_MUSIC = 1777, @@ -578,6 +643,9 @@ enum { STR_ENTERTAINER_SINGULAR = 1866, STR_STAFF_LIST_COUNTER = 1867, + STR_NUMBER_OF_ROTATIONS = 1869, + STR_NUMBER_OF_ROTATIONS_TIP = 1870, + STR_INCOME_PER_HOUR = 1873, STR_PROFIT_PER_HOUR = 1874, diff --git a/src/window_ride.c b/src/window_ride.c index 4339ffa6ff..6c7d33e160 100644 --- a/src/window_ride.c +++ b/src/window_ride.c @@ -75,14 +75,14 @@ enum { WIDX_LOCATE, WIDX_DEMOLISH, - WIDX_OPERATE_UNK_14 = 14, - WIDX_OPERATION_UNK_14_INCREASE, - WIDX_OPERATION_UNK_14_DECREASE, + WIDX_MODE_TWEAK = 14, + WIDX_MODE_TWEAK_INCREASE, + WIDX_MODE_TWEAK_DECREASE, WIDX_LIFT_HILL_SPEED, WIDX_LIFT_HILL_SPEED_INCREASE, WIDX_LIFT_HILL_SPEED_DECREASE, - WIDX_WAIT_FOR_PASSENGERS, - WIDX_OPERATE_UNK_21, + WIDX_LOAD_CHECKBOX, + WIDX_LEAVE_WHEN_ANOTHER_ARRIVES_CHECKBOX, WIDX_MINIMUM_LENGTH_CHECKBOX, WIDX_MINIMUM_LENGTH, WIDX_MINIMUM_LENGTH_INCREASE, @@ -92,12 +92,12 @@ enum { WIDX_MAXIMUM_LENGTH_INCREASE, WIDX_MAXIMUM_LENGTH_DECREASE, WIDX_SYNCHRONISE_WITH_ADJACENT_STATIONS_CHECKBOX, - WIDX_OPERATE_UNK_31, - WIDX_OPERATE_UNK_32, - WIDX_OPERATE_UNK_33, - WIDX_OPERATE_UNK_34, - WIDX_OPERATE_UNK_35, - WIDX_OPERATE_UNK_36, + WIDX_MODE_TWEAK_LABEL, + WIDX_LIFT_HILL_SPEED_LABEL, + WIDX_MODE, + WIDX_MODE_DROPDOWN, + WIDX_LOAD, + WIDX_LOAD_DROPDOWN, WIDX_OPERATE_NUMBER_OF_CIRCUITS_LABEL, WIDX_OPERATE_NUMBER_OF_CIRCUITS, WIDX_OPERATE_NUMBER_OF_CIRCUITS_INCREASE, @@ -1723,9 +1723,9 @@ static void window_ride_operating_mouseup() case WIDX_TAB_10: window_ride_set_page(w, widgetIndex - WIDX_TAB_1); break; - case WIDX_WAIT_FOR_PASSENGERS: + case WIDX_LOAD_CHECKBOX: break; - case WIDX_OPERATE_UNK_21: + case WIDX_LEAVE_WHEN_ANOTHER_ARRIVES_CHECKBOX: break; case WIDX_MINIMUM_LENGTH_CHECKBOX: break; @@ -1756,9 +1756,9 @@ static void window_ride_operating_resize() static void window_ride_operating_mousedown(int widgetIndex, rct_window *w, rct_widget *widget) { switch (widgetIndex) { - case WIDX_OPERATION_UNK_14_INCREASE: + case WIDX_MODE_TWEAK_INCREASE: break; - case WIDX_OPERATION_UNK_14_DECREASE: + case WIDX_MODE_TWEAK_DECREASE: break; case WIDX_LIFT_HILL_SPEED_INCREASE: break; @@ -1772,9 +1772,9 @@ static void window_ride_operating_mousedown(int widgetIndex, rct_window *w, rct_ break; case WIDX_MAXIMUM_LENGTH_DECREASE: break; - case WIDX_OPERATE_UNK_34: + case WIDX_MODE_DROPDOWN: break; - case WIDX_OPERATE_UNK_36: + case WIDX_LOAD_DROPDOWN: break; case WIDX_OPERATE_NUMBER_OF_CIRCUITS_INCREASE: break; @@ -1795,9 +1795,9 @@ static void window_ride_operating_dropdown() window_dropdown_get_registers(w, widgetIndex, dropdownIndex); switch (widgetIndex) { - case WIDX_OPERATE_UNK_34: + case WIDX_MODE_DROPDOWN: break; - case WIDX_OPERATE_UNK_36: + case WIDX_LOAD_DROPDOWN: break; } } @@ -1829,6 +1829,9 @@ static void window_ride_operating_invalidate() { rct_window *w; rct_widget *widgets; + rct_ride *ride; + rct_ride_type *rideEntry, **rideEntries = (rct_ride_type**)0x009ACFA4; + rct_string_id format, caption, tooltip; window_get_register(w); @@ -1840,11 +1843,186 @@ static void window_ride_operating_invalidate() window_ride_set_pressed_tab(w); - rct_ride *ride = GET_RIDE(w->number); + ride = GET_RIDE(w->number); + rideEntry = rideEntries[ride->subtype]; + RCT2_GLOBAL(0x013CE952 + 0, uint16) = ride->name; RCT2_GLOBAL(0x013CE952 + 2, uint32) = ride->name_arguments; - // TODO lots of widget setup + // Widget setup + w->pressed_widgets &= ~0x44700000; + + // Lift hill speed + if ((rideEntry->var_1B6 & RCT2_ADDRESS(0x01357444, uint32)[ride->type]) & 8) { + window_ride_operating_widgets[WIDX_LIFT_HILL_SPEED_LABEL].type = WWT_24; + window_ride_operating_widgets[WIDX_LIFT_HILL_SPEED].type = WWT_SPINNER; + window_ride_operating_widgets[WIDX_LIFT_HILL_SPEED_INCREASE].type = WWT_DROPDOWN_BUTTON; + window_ride_operating_widgets[WIDX_LIFT_HILL_SPEED_DECREASE].type = WWT_DROPDOWN_BUTTON; + RCT2_GLOBAL(0x013CE966, uint16) = ride->lift_hill_speed; + } else { + window_ride_operating_widgets[WIDX_LIFT_HILL_SPEED_LABEL].type = WWT_EMPTY; + window_ride_operating_widgets[WIDX_LIFT_HILL_SPEED].type = WWT_EMPTY; + window_ride_operating_widgets[WIDX_LIFT_HILL_SPEED_INCREASE].type = WWT_EMPTY; + window_ride_operating_widgets[WIDX_LIFT_HILL_SPEED_DECREASE].type = WWT_EMPTY; + } + + // Number of circuits + if (ride_can_have_multiple_circuits(ride)) { + window_ride_operating_widgets[WIDX_OPERATE_NUMBER_OF_CIRCUITS_LABEL].type = WWT_24; + window_ride_operating_widgets[WIDX_OPERATE_NUMBER_OF_CIRCUITS].type = WWT_SPINNER; + window_ride_operating_widgets[WIDX_OPERATE_NUMBER_OF_CIRCUITS_INCREASE].type = WWT_DROPDOWN_BUTTON; + window_ride_operating_widgets[WIDX_OPERATE_NUMBER_OF_CIRCUITS_DECREASE].type = WWT_DROPDOWN_BUTTON; + RCT2_GLOBAL(0x013CE968, uint16) = ride->num_circuits; + } else { + window_ride_operating_widgets[WIDX_OPERATE_NUMBER_OF_CIRCUITS_LABEL].type = WWT_EMPTY; + window_ride_operating_widgets[WIDX_OPERATE_NUMBER_OF_CIRCUITS].type = WWT_EMPTY; + window_ride_operating_widgets[WIDX_OPERATE_NUMBER_OF_CIRCUITS_INCREASE].type = WWT_EMPTY; + window_ride_operating_widgets[WIDX_OPERATE_NUMBER_OF_CIRCUITS_DECREASE].type = WWT_EMPTY; + } + + // Leave if another vehicle arrives at station + if ( + (RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + (ride->type * 8), uint32) & 0x10) && + ride->num_vehicles > 1 && + ride->mode != RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED && + ride->mode != RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED + ) { + window_ride_operating_widgets[WIDX_LEAVE_WHEN_ANOTHER_ARRIVES_CHECKBOX].type = WWT_CHECKBOX; + window_ride_operating_widgets[WIDX_LEAVE_WHEN_ANOTHER_ARRIVES_CHECKBOX].tooltip = STR_LEAVE_IF_ANOTHER_VEHICLE_ARRIVES_TIP; + window_ride_operating_widgets[WIDX_LEAVE_WHEN_ANOTHER_ARRIVES_CHECKBOX].image = RideNameConvention[ride->type].vehicle_name == 1236 ? + STR_LEAVE_IF_ANOTHER_BOAT_ARRIVES : + STR_LEAVE_IF_ANOTHER_TRAIN_ARRIVES; + } else { + window_ride_operating_widgets[WIDX_LEAVE_WHEN_ANOTHER_ARRIVES_CHECKBOX].type = WWT_EMPTY; + } + + // Synchronise with adjacent stations + if (RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + (ride->type * 8), uint32) & 0x20) { + window_ride_operating_widgets[WIDX_SYNCHRONISE_WITH_ADJACENT_STATIONS_CHECKBOX].type = WWT_CHECKBOX; + window_ride_operating_widgets[WIDX_SYNCHRONISE_WITH_ADJACENT_STATIONS_CHECKBOX].image = STR_SYNCHRONISE_WITH_ADJACENT_STATIONS; + window_ride_operating_widgets[WIDX_SYNCHRONISE_WITH_ADJACENT_STATIONS_CHECKBOX].tooltip = STR_SYNCHRONISE_WITH_ADJACENT_STATIONS_TIP; + } else { + window_ride_operating_widgets[WIDX_SYNCHRONISE_WITH_ADJACENT_STATIONS_CHECKBOX].type = WWT_EMPTY; + } + + // Mode + window_ride_operating_widgets[WIDX_MODE].image = STR_RIDE_MODE_START + ride->mode; + + // Waiting + window_ride_operating_widgets[WIDX_LOAD].image = STR_QUARTER_LOAD + (ride->depart_flags & RIDE_DEPART_WAIT_FOR_LOAD_MASK); + if (RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + (ride->type * 8), uint32) & 0x4000) { + window_ride_operating_widgets[WIDX_LOAD_CHECKBOX].type = WWT_CHECKBOX; + window_ride_operating_widgets[WIDX_LOAD].type = WWT_DROPDOWN; + window_ride_operating_widgets[WIDX_LOAD_DROPDOWN].type = WWT_DROPDOWN_BUTTON; + + window_ride_operating_widgets[WIDX_MINIMUM_LENGTH_CHECKBOX].type = WWT_CHECKBOX; + window_ride_operating_widgets[WIDX_MINIMUM_LENGTH].type = WWT_SPINNER; + window_ride_operating_widgets[WIDX_MINIMUM_LENGTH_INCREASE].type = WWT_DROPDOWN_BUTTON; + window_ride_operating_widgets[WIDX_MINIMUM_LENGTH_DECREASE].type = WWT_DROPDOWN_BUTTON; + + window_ride_operating_widgets[WIDX_MAXIMUM_LENGTH_CHECKBOX].type = WWT_CHECKBOX; + window_ride_operating_widgets[WIDX_MAXIMUM_LENGTH].type = WWT_SPINNER; + window_ride_operating_widgets[WIDX_MAXIMUM_LENGTH_INCREASE].type = WWT_DROPDOWN_BUTTON; + window_ride_operating_widgets[WIDX_MAXIMUM_LENGTH_DECREASE].type = WWT_DROPDOWN_BUTTON; + + RCT2_GLOBAL(0x013CE952 + 10, uint16) = 1217; + RCT2_GLOBAL(0x013CE95E, uint16) = ride->min_waiting_time; + RCT2_GLOBAL(0x013CE960, uint16) = 1217; + RCT2_GLOBAL(0x013CE962, uint16) = ride->max_waiting_time; + + if (ride->depart_flags & RIDE_DEPART_WAIT_FOR_LOAD) + w->pressed_widgets |= (1 << WIDX_LOAD_CHECKBOX); + } else { + window_ride_operating_widgets[WIDX_LOAD_CHECKBOX].type = WWT_EMPTY; + window_ride_operating_widgets[WIDX_LOAD].type = WWT_EMPTY; + window_ride_operating_widgets[WIDX_LOAD_DROPDOWN].type = WWT_EMPTY; + + window_ride_operating_widgets[WIDX_MINIMUM_LENGTH_CHECKBOX].type = WWT_EMPTY; + window_ride_operating_widgets[WIDX_MINIMUM_LENGTH].type = WWT_EMPTY; + window_ride_operating_widgets[WIDX_MINIMUM_LENGTH_INCREASE].type = WWT_EMPTY; + window_ride_operating_widgets[WIDX_MINIMUM_LENGTH_DECREASE].type = WWT_EMPTY; + + window_ride_operating_widgets[WIDX_MAXIMUM_LENGTH_CHECKBOX].type = WWT_EMPTY; + window_ride_operating_widgets[WIDX_MAXIMUM_LENGTH].type = WWT_EMPTY; + window_ride_operating_widgets[WIDX_MAXIMUM_LENGTH_INCREASE].type = WWT_EMPTY; + window_ride_operating_widgets[WIDX_MAXIMUM_LENGTH_DECREASE].type = WWT_EMPTY; + } + + if (ride->depart_flags & RIDE_DEPART_LEAVE_WHEN_ANOTHER_ARRIVES) + w->pressed_widgets |= (1 << WIDX_LEAVE_WHEN_ANOTHER_ARRIVES_CHECKBOX); + if (ride->depart_flags & RIDE_DEPART_SYNCHRONISE_WITH_ADJACENT_STATIONS) + w->pressed_widgets |= (1 << WIDX_SYNCHRONISE_WITH_ADJACENT_STATIONS_CHECKBOX); + if (ride->depart_flags & RIDE_DEPART_WAIT_FOR_MINIMUM_LENGTH) + w->pressed_widgets |= (1 << WIDX_MINIMUM_LENGTH_CHECKBOX); + if (ride->depart_flags & RIDE_DEPART_WAIT_FOR_MAXIMUM_LENGTH) + w->pressed_widgets |= (1 << WIDX_MAXIMUM_LENGTH_CHECKBOX); + + // Mode specific functionality + RCT2_GLOBAL(0x013CE964, uint16) = ride->var_0D0; + switch (ride->mode) { + case RIDE_MODE_POWERED_LAUNCH: + case RIDE_MODE_POWERED_LAUNCH_35: + case RIDE_MODE_UPWARD_LAUNCH: + case RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED: + RCT2_GLOBAL(0x013CE964, uint16) = (ride->var_0D0 * 9) / 4; + format = 1331; + caption = STR_LAUNCH_SPEED; + tooltip = STR_LAUNCH_SPEED_TIP; + case RIDE_MODE_STATION_TO_STATION: + RCT2_GLOBAL(0x013CE964, uint16) = (ride->var_0D0 * 9) / 4; + caption = STR_SPEED; + tooltip = STR_SPEED_TIP; + break; + case RIDE_MODE_RACE: + RCT2_GLOBAL(0x013CE964, uint16) = ride->var_0D0; + format = 1736; + caption = STR_NUMBER_OF_LAPS; + tooltip = STR_NUMBER_OF_LAPS_TIP; + break; + case RIDE_MODE_BUMPERCAR: + format = 1749; + caption = STR_TIME_LIMIT; + tooltip = STR_TIME_LIMIT_TIP; + break; + case RIDE_MODE_SWING: + format = 1771; + caption = STR_NUMBER_OF_SWINGS; + tooltip = STR_NUMBER_OF_SWINGS_TIP; + break; + case RIDE_MODE_ROTATION: + case RIDE_MODE_FORWARD_ROTATION: + case RIDE_MODE_BACKWARD_ROTATION: + format = 1871; + caption = STR_NUMBER_OF_ROTATIONS; + tooltip = STR_NUMBER_OF_ROTATIONS_TIP; + break; + default: + format = 1736; + caption = STR_MAX_PEOPLE_ON_RIDE; + tooltip = STR_MAX_PEOPLE_ON_RIDE_TIP; + if (!(RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + (ride->type * 8), uint32) & 0x2000)) + format = 0; + break; + } + + if (format != 0) { + if (ride->type == RIDE_TYPE_TWIST) + RCT2_GLOBAL(0x013CE964, uint16) *= 3; + + window_ride_operating_widgets[WIDX_MODE_TWEAK_LABEL].type = WWT_24; + window_ride_operating_widgets[WIDX_MODE_TWEAK_LABEL].image = caption; + window_ride_operating_widgets[WIDX_MODE_TWEAK_LABEL].tooltip = tooltip; + window_ride_operating_widgets[WIDX_MODE_TWEAK].type = WWT_SPINNER; + window_ride_operating_widgets[WIDX_MODE_TWEAK].image = format; + window_ride_operating_widgets[WIDX_MODE_TWEAK_INCREASE].type = WWT_DROPDOWN_BUTTON; + window_ride_operating_widgets[WIDX_MODE_TWEAK_DECREASE].type = WWT_DROPDOWN_BUTTON; + w->pressed_widgets &= ~(1 << WIDX_LEAVE_WHEN_ANOTHER_ARRIVES_CHECKBOX); + } else { + window_ride_operating_widgets[WIDX_MODE_TWEAK_LABEL].type = WWT_EMPTY; + window_ride_operating_widgets[WIDX_MODE_TWEAK].type = WWT_EMPTY; + window_ride_operating_widgets[WIDX_MODE_TWEAK_INCREASE].type = WWT_EMPTY; + window_ride_operating_widgets[WIDX_MODE_TWEAK_DECREASE].type = WWT_EMPTY; + } window_ride_anchor_border_widgets(w); window_align_tabs(w, WIDX_TAB_1, WIDX_TAB_10); @@ -1868,6 +2046,7 @@ static void window_ride_operating_paint() ride = GET_RIDE(w->number); + // Horizontal rule between mode settings and depart settings gfx_fill_rect_inset( dpi, w->x + window_ride_operating_widgets[WIDX_PAGE_BACKGROUND].left + 4, @@ -1878,11 +2057,11 @@ static void window_ride_operating_paint() 0x20 ); - if (ride->mode == 34 || ride->mode == 36) { + // Number of block sections + if (ride->mode == RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED || ride->mode == RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED) { blockSections = ride->num_block_brakes + ride->num_stations; gfx_draw_string_left(dpi, STR_BLOCK_SECTIONS, &blockSections, 0, w->x + 21, ride->mode == 36 ? w->y + 76 : w->y + 61); } - } #pragma endregion