From 76fda20859596e67a7120b80c2fde79082326937 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 3 Sep 2014 19:13:37 +0100 Subject: [PATCH] implement ride window drawing --- src/news_item.c | 2 +- src/ride.c | 46 +++++++ src/ride.h | 11 +- src/ride_ratings.c | 4 +- src/scenario.c | 4 +- src/string_ids.h | 36 +++++- src/vehicle.h | 46 ++++++- src/window.h | 2 +- src/window_peep.c | 2 +- src/window_ride.c | 265 +++++++++++++++++++++++++++++++++++++++-- src/window_ride_list.c | 46 ------- 11 files changed, 389 insertions(+), 75 deletions(-) diff --git a/src/news_item.c b/src/news_item.c index 986502d1fe..cc95a0dfcb 100644 --- a/src/news_item.c +++ b/src/news_item.c @@ -212,7 +212,7 @@ void news_item_get_subject_location(int type, int subject, int *x, int *y, int * } // Find the first car of the train peep is on - vehicle = &(g_sprite_list[ride->train_car_map[peep->current_train]]).vehicle; + vehicle = &(g_sprite_list[ride->vehicles[peep->current_train]]).vehicle; // Find the actual car peep is on for (i = 0; i < peep->current_car; i++) vehicle = &(g_sprite_list[vehicle->next_vehicle_on_train]).vehicle; diff --git a/src/ride.c b/src/ride.c index 43798a15db..3a0add0314 100644 --- a/src/ride.c +++ b/src/ride.c @@ -475,3 +475,49 @@ int ride_try_construct(rct_map_element *trackMapElement) RCT2_CALLPROC_X(0x006CC056, 0, 0, 0, (int)trackMapElement, 0, 0, 0); return 1; } + +/** + * + * rct2: 0x006AF561 + */ +void ride_get_status(int rideIndex, int *formatSecondary, int *argument) +{ + rct_ride *ride = &g_ride_list[rideIndex]; + + if (ride->lifecycle_flags & RIDE_LIFECYCLE_CRASHED) { + *formatSecondary = STR_CRASHED; + return; + } + if (ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN) { + *formatSecondary = STR_BROKEN_DOWN; + return; + } + if (ride->status == RIDE_STATUS_CLOSED) { + *formatSecondary = STR_CLOSED; + return; + } + if (ride->status == RIDE_STATUS_TESTING) { + *formatSecondary = STR_TEST_RUN; + return; + } + rct_peep *peep = GET_PEEP(ride->race_winner); + if (ride->mode == RIDE_MODE_RACE && !(ride->lifecycle_flags & RIDE_LIFECYCLE_PASS_STATION_NO_STOPPING) && ride->race_winner != 0xFFFF && peep->sprite_identifier == SPRITE_IDENTIFIER_PEEP) { + if (peep->name_string_idx == STR_GUEST) { + *argument = peep->id; + *formatSecondary = STR_RACE_WON_BY_GUEST; + } else { + *argument = peep->name_string_idx; + *formatSecondary = STR_RACE_WON_BY; + } + } else { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + ride->type * 8, uint32) & 0x20000)) { + *argument = ride->num_riders; + *formatSecondary = STR_PERSON_ON_RIDE; + if(*argument != 1) + *formatSecondary = STR_PEOPLE_ON_RIDE; + + } else { + *formatSecondary = STR_OPEN; + } + } +} \ No newline at end of file diff --git a/src/ride.h b/src/ride.h index 0700fdec32..44c9f506c4 100644 --- a/src/ride.h +++ b/src/ride.h @@ -70,7 +70,7 @@ typedef struct { uint16 pad_002; uint8 mode; // 0x004 uint8 colour_scheme_type; // 0x005 - uint16 car_colours[32]; // 0x006 + uint16 vehicle_colours[32]; // 0x006 uint8 pad_046[0x03]; // 0 = closed, 1 = open, 2 = test uint8 status; // 0x049 @@ -83,12 +83,12 @@ typedef struct { uint16 entrances[4]; // 0x06A uint16 exits[4]; // 0x072 uint8 pad_07A[0x0C]; - uint16 train_car_map[1]; // 0x086 Points to the first car in the train - uint8 pad_088[0x3F]; + uint16 vehicles[32]; // 0x086 Points to the first car in the train + uint8 pad_C6; // Not sure if these should be uint or sint. - uint8 var_0C7; - uint8 var_0C8; + uint8 num_stations; // 0x0C7 + uint8 num_vehicles; // 0x0C8 uint8 var_0C9; uint8 pad_0CA[0x1A]; @@ -387,5 +387,6 @@ rct_map_element *sub_6CAF80(int rideIndex, int *outX, int *outY); rct_map_element *ride_find_track_gap(rct_map_element *startTrackElement, int *outX, int *outY); void ride_construct_new(int list_item); int ride_try_construct(rct_map_element *trackMapElement); +void ride_get_status(int rideIndex, int *formatSecondary, int *argument); #endif diff --git a/src/ride_ratings.c b/src/ride_ratings.c index d18fef2753..b479d72d72 100644 --- a/src/ride_ratings.c +++ b/src/ride_ratings.c @@ -130,7 +130,7 @@ uint16 compute_upkeep(rct_ride *ride) // various variables set on the ride itself. // https://gist.github.com/kevinburke/e19b803cd2769d96c540 - upkeep += rideUnknownData1[ride->type] * ride->var_0C8; + upkeep += rideUnknownData1[ride->type] * ride->num_vehicles; // either set to 3 or 0, extra boosts for some rides including mini golf if (rideUnknownData2[ride->type]) { @@ -139,7 +139,7 @@ uint16 compute_upkeep(rct_ride *ride) // slight upkeep boosts for some rides - 5 for mini railroad, 10 for log // flume/rapids, 10 for roller coaster, 28 for giga coaster - upkeep += rideUnknownData3[ride->type] * ride->var_0C7; + upkeep += rideUnknownData3[ride->type] * ride->num_stations; if (ride->mode == RIDE_MODE_REVERSE_INCLINED_SHUTTLE) { upkeep += 30; diff --git a/src/scenario.c b/src/scenario.c index 9154ce9e81..13925312d1 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -420,10 +420,10 @@ void scenario_objective8_check() ride->excitement >= RIDE_RATING(7,00) && type_already_counted[subtype_id] == 0){ // this calculates the length, no idea why it's done so complicated though. - uint8 limit = ride->pad_088[63]; + uint8 limit = ride->num_stations; uint32 sum = 0; for (int j = 0; j < limit; ++j) { - sum += ((uint32*)&ride->pad_088[92])[j]; + sum += ((uint32*)&ride->var_0E4)[j]; } if ((sum >> 16) > (uint32)objective_length) { type_already_counted[subtype_id]++; diff --git a/src/string_ids.h b/src/string_ids.h index f642ba161f..78e580e5e0 100644 --- a/src/string_ids.h +++ b/src/string_ids.h @@ -288,6 +288,38 @@ enum { STR_CANT_RENAME_RIDE_ATTRACTION = 1059, STR_INVALID_RIDE_ATTRACTION_NAME = 1060, + STR_MOVING_TO_END_OF = 1098, + STR_WAITING_FOR_PASSENGERS_AT = 1099, + STR_WAITING_TO_DEPART = 1100, + STR_DEPARTING = 1101, + STR_TRAVELLING_AT_0 = 1102, + STR_ARRIVING_AT = 1103, + STR_UNLOADING_PASSENGERS_AT = 1104, + STR_TRAVELLING_AT_1 = 1105, + STR_CRASHING = 1106, + STR_CRASHED_0 = 1107, + STR_TRAVELLING_AT_2 = 1108, + STR_SWINGING = 1109, + STR_ROTATING_0 = 1110, + STR_ROTATING_1 = 1111, + STR_OPERATING_0 = 1112, + STR_SHOWING_FILM = 1113, + STR_ROTATING_2 = 1114, + STR_OPERATING_1 = 1115, + STR_OPERATING_2 = 1116, + STR_DOING_CIRCUS_SHOW = 1117, + STR_OPERATING_3 = 1118, + STR_WAITING_FOR_CABLE_LIFT = 1119, + STR_TRAVELLING_AT_3 = 1120, + STR_STOPPING_0 = 1121, + STR_WAITING_FOR_PASSENGERS = 1122, + STR_WAITING_TO_START = 1123, + STR_STARTING = 1124, + STR_OPERATING = 1125, + STR_STOPPING_1 = 1126, + STR_UNLOADING_PASSENGERS = 1127, + STR_STOPPED_BY_BLOCK_BRAKES = 1128, + STR_PLACE_SCENERY_TIP = 1159, STR_ADJUST_WATER_TIP = 1160, @@ -327,7 +359,9 @@ enum { STR_NUMERIC_UP = 1218, STR_NUMERIC_DOWN = 1219, - + STR_EXIT_ONLY = 1220, + STR_NO_ENTRANCE = 1221, + STR_NO_EXIT = 1222, STR_TRANSPORT_RIDES_TIP = 1223, STR_GENTLE_RIDES_TIP = 1224, STR_ROLLER_COASTERS_TIP = 1225, diff --git a/src/vehicle.h b/src/vehicle.h index 046d719a34..7d45ea9e2b 100644 --- a/src/vehicle.h +++ b/src/vehicle.h @@ -48,16 +48,20 @@ typedef struct { rct_widthheight view; // 0x1A uint16 var_1E; uint8 pad_20[0x08]; - uint32 var_28; + sint32 velocity; uint8 pad_2C[0x04]; uint8 ride; // 0x30 uint8 var_31; - uint8 pad_32[0x0C]; + uint8 pad_32[0x04]; + sint16 var_36; + uint8 pad_38[0x06]; uint16 next_vehicle_on_train; // 0x3E uint8 pad_40[0x08]; uint16 var_48; - uint8 pad_4A[0x06]; - uint8 var_50; + uint8 pad_4A; + uint8 var_4B; + uint8 pad_4C[0x4]; + uint8 status; uint8 var_51; uint8 pad_52[0x2E]; uint8 var_BB; @@ -69,6 +73,40 @@ typedef struct { uint8 var_D6; } rct_vehicle; +enum { + VEHICLE_STATUS_MOVING_TO_END_OF_STATION, + VEHICLE_STATUS_WAITING_FOR_PASSENGERS, + VEHICLE_STATUS_WAITING_TO_DEPART, + VEHICLE_STATUS_DEPARTING, + VEHICLE_STATUS_TRAVELLING, + VEHICLE_STATUS_ARRIVING, + VEHICLE_STATUS_UNLOADING_PASSENGERS, + VEHICLE_STATUS_TRAVELLING_07, + VEHICLE_STATUS_CRASHING, + VEHICLE_STATUS_CRASHED, + VEHICLE_STATUS_TRAVELLING_0A, + VEHICLE_STATUS_SWINGING, + VEHICLE_STATUS_ROTATING, + VEHICLE_STATUS_ROTATING_0D, + VEHICLE_STATUS_OPERATING, + VEHICLE_STATUS_SHOWING_FILM, + VEHICLE_STATUS_ROTATING_10, + VEHICLE_STATUS_OPERATING_11, + VEHICLE_STATUS_OPERATING_12, + VEHICLE_STATUS_DOING_CIRCUS_SHOW, + VEHICLE_STATUS_OPERATING_13, + VEHICLE_STATUS_WAITING_FOR_CABLE_LIFT, + VEHICLE_STATUS_TRAVELLING_15, + VEHICLE_STATUS_STOPPING, + VEHICLE_STATUS_WAITING_FOR_PASSENGERS_17, + VEHICLE_STATUS_WAITING_TO_START, + VEHICLE_STATUS_STARTING, + VEHICLE_STATUS_OPERATING_1A, + VEHICLE_STATUS_STOPPING_1B, + VEHICLE_STATUS_UNLOADING_PASSENGERS_1C, + VEHICLE_STATUS_STOPPED_BY_BLOCK_BRAKES +}; + void vehicle_update_all(); /** Helper macro until rides are stored in this module. */ diff --git a/src/window.h b/src/window.h index b7e129c043..0ba56b43ba 100644 --- a/src/window.h +++ b/src/window.h @@ -158,7 +158,7 @@ typedef struct{ } map_variables; typedef struct { - sint16 var_480; + sint16 view; sint32 var_482; sint32 var_486; } ride_variables; diff --git a/src/window_peep.c b/src/window_peep.c index a85331101c..494011da55 100644 --- a/src/window_peep.c +++ b/src/window_peep.c @@ -674,7 +674,7 @@ void window_peep_viewport_init(rct_window* w){ rct_ride* ride = &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[peep->current_ride]); if (ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK){ - rct_vehicle* train = GET_VEHICLE(ride->train_car_map[peep->current_train]); + rct_vehicle* train = GET_VEHICLE(ride->vehicles[peep->current_train]); int car = peep->current_car; for (; car != 0; car--){ diff --git a/src/window_ride.c b/src/window_ride.c index 614d4f197d..05dcd31628 100644 --- a/src/window_ride.c +++ b/src/window_ride.c @@ -163,6 +163,7 @@ const uint64 window_ride_page_enabled_widgets[] = { static void window_ride_emptysub() { } static void window_ride_main_mouseup(); +static void window_ride_main_resize(); static void window_ride_main_mousedown(int widgetIndex, rct_window *w, rct_widget *widget); static void window_ride_main_dropdown(); static void window_ride_main_update(rct_window *w); @@ -181,7 +182,7 @@ static void window_ride_music_paint(); static void* window_ride_main_events[] = { window_ride_emptysub, window_ride_main_mouseup, - window_ride_emptysub, + window_ride_main_resize, window_ride_main_mousedown, window_ride_main_dropdown, window_ride_emptysub, @@ -342,7 +343,7 @@ void window_ride_main_open(int rideIndex) w->pressed_widgets = 0; RCT2_CALLPROC_X(0x006AEB9F, 0, 0, 0, 0, (int)w, 0, 0); window_init_scroll_widgets(w); - w->ride.var_480 = 0; + w->ride.view = 0; RCT2_CALLPROC_X(0x006AF994, 0, 0, 0, 0, (int)w, 0, 0); } @@ -409,6 +410,15 @@ static void window_ride_anchor_border_widgets(rct_window *w) #pragma region Main +/** + * + * rct2: 0x006AF994 + */ +static void window_ride_init_viewport(rct_window *w) +{ + RCT2_CALLPROC_X(0x006AF994, 0, 0, 0, 0, (int)w, 0, 0); +} + /** * * rct2: 0x006B4971 @@ -552,6 +562,21 @@ static void window_ride_main_mouseup() } } +/** + * + * rct2: 0x006AF4A2 + */ +static void window_ride_main_resize() +{ + rct_window *w; + + window_get_register(w); + + w->flags |= WF_RESIZABLE; + window_set_resize(w, 316, 180, 500, 450); + window_ride_init_viewport(w); +} + /** * * rct2: 0x006AF825 @@ -567,8 +592,8 @@ static void window_ride_show_view_dropdown(rct_window *w, rct_widget *widget) numItems = 1; if (!(RCT2_GLOBAL(0x0097CF40 + (ride->type * 8), uint32) & 0x2000)) { - numItems += ride->var_0C7; - numItems += ride->var_0C8; + numItems += ride->num_stations; + numItems += ride->num_vehicles; } window_dropdown_show_text_custom_width( @@ -588,7 +613,7 @@ static void window_ride_show_view_dropdown(rct_window *w, rct_widget *widget) // Vehicles name = RideNameConvention[ride->type].vehicle_name + 6; - for (i = 1; i <= ride->var_0C8; i++) { + for (i = 1; i <= ride->num_vehicles; i++) { gDropdownItemsFormat[currentItem] = 1142; gDropdownItemsArgs[currentItem] = name | (currentItem << 16); currentItem++; @@ -596,7 +621,7 @@ static void window_ride_show_view_dropdown(rct_window *w, rct_widget *widget) // Stations name = RideNameConvention[ride->type].station_name + 6; - for (i = 1; i <= ride->var_0C7; i++) { + for (i = 1; i <= ride->num_stations; i++) { gDropdownItemsFormat[currentItem] = 1142; gDropdownItemsArgs[currentItem] = name | (i << 16); currentItem++; @@ -605,14 +630,14 @@ static void window_ride_show_view_dropdown(rct_window *w, rct_widget *widget) // Set highlighted item if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK)) { j = 2; - for (i = 0; i < ride->var_0C8; i++) { + for (i = 0; i < ride->num_vehicles; i++) { RCT2_GLOBAL(0x009DED34, uint32) |= j; j <<= 1; } } // Set checked item - gDropdownItemsChecked |= (1 << w->ride.var_480); + gDropdownItemsChecked |= (1 << w->ride.view); } /** @@ -723,17 +748,17 @@ static void window_ride_main_dropdown() switch (widgetIndex) { case WIDX_VIEW_DROPDOWN: if (dropdownIndex == -1) { - dropdownIndex = w->ride.var_480; + dropdownIndex = w->ride.view; ride = GET_RIDE(w->number); dropdownIndex++; - if (dropdownIndex != 0 && dropdownIndex <= ride->var_0C8 && !(ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK)) - dropdownIndex = ride->var_0C8 + 1; + if (dropdownIndex != 0 && dropdownIndex <= ride->num_vehicles && !(ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK)) + dropdownIndex = ride->num_vehicles + 1; if (dropdownIndex >= gDropdownNumItems) dropdownIndex = 0; } - w->ride.var_480 = dropdownIndex; + w->ride.view = dropdownIndex; RCT2_CALLPROC_X(0x006AF994, 0, 0, 0, 0, (int)w, 0, 0); window_invalidate(w); break; @@ -773,7 +798,42 @@ static void window_ride_main_dropdown() */ static void window_ride_main_update(rct_window *w) { + rct_ride *ride; + int vehicleIndex; + uint16 vehicleSpriteIndex; + rct_vehicle *vehicle; + // Update tab animation + w->frame_no++; + RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, (int)w, 0, 0); + widget_invalidate(WC_RIDE, w->number, WIDX_TAB_1); + + // Update status + ride = GET_RIDE(w->number); + if (!(ride->var_14D & 4)) { + if (w->ride.view == 0) + return; + + if (w->ride.view <= ride->num_vehicles) { + vehicleIndex = w->ride.view - 1; + vehicleSpriteIndex = ride->vehicles[vehicleIndex]; + if (vehicleSpriteIndex == 0xFFFF) + return; + + vehicle = &(g_sprite_list[vehicleSpriteIndex].vehicle); + if ( + vehicle->status != 4 && + vehicle->status != 22 && + vehicle->status != 10 && + vehicle->status != 7 + ) { + return; + } + } + } + + ride->var_14D &= ~4; + widget_invalidate(WC_RIDE, w->number, WIDX_STATUS); } /** @@ -849,6 +909,140 @@ static void window_ride_main_invalidate() window_align_tabs(w, WIDX_TAB_1, WIDX_TAB_10); } +/** + * + * rct2: 0x006AF10A + */ +static rct_string_id window_ride_get_status_overall_view(rct_window *w, void *arguments) +{ + int formatSecondary, argument; + rct_string_id stringId; + + ride_get_status(w->number, &formatSecondary, &argument); + RCT2_GLOBAL((int)arguments + 0, uint16) = formatSecondary; + RCT2_GLOBAL((int)arguments + 2, uint32) = argument; + stringId = STR_LOSS; + if (formatSecondary != STR_BROKEN_DOWN && formatSecondary != STR_CRASHED) + stringId = STR_COST; + + return stringId; +} + +/** + * + * rct2: 0x006AEFEF + */ +static rct_string_id window_ride_get_status_vehicle(rct_window *w, void *arguments) +{ + rct_ride *ride; + rct_vehicle *vehicle; + int vehicleIndex; + uint16 vehicleSpriteIndex; + rct_string_id stringId; + + ride = GET_RIDE(w->number); + + vehicleIndex = w->ride.view - 1; + vehicleSpriteIndex = ride->vehicles[vehicleIndex]; + if (vehicleSpriteIndex == 0xFFFF) + return 0; + + vehicle = &(g_sprite_list[vehicleSpriteIndex].vehicle); + if (vehicle->status != VEHICLE_STATUS_CRASHING && vehicle->status != VEHICLE_STATUS_CRASHED) { + int ax = vehicle->var_36 / 4; + if (ax == 216 || ax == 123 || ax == 9 || ax == 63 || ax == 147 || ax == 155) { + if (!(RCT2_ADDRESS(0x01357644, uint32)[ride->type] & 0x40) && vehicle->velocity == 0) { + RCT2_GLOBAL((int)arguments + 0, uint16) = STR_STOPPED_BY_BLOCK_BRAKES; + return 1191; + } + } + } + + stringId = STR_MOVING_TO_END_OF + vehicle->status; + + // Get speed in mph + RCT2_GLOBAL((int)arguments + 2, uint16) = (abs(vehicle->velocity) * 9) >> 18; + + if (ride->type == RIDE_TYPE_MINI_GOLF) + return 0; + + if ((RCT2_GLOBAL(0x0097D4F2 + (ride->type * 8), uint16) & 0x100) && stringId > 1104) + stringId += 23; + + RCT2_GLOBAL((int)arguments + 4, uint16) = RideNameConvention[ride->type].station_name; + RCT2_GLOBAL((int)arguments + 6, uint16) = vehicle->var_4B + 1; + if (ride->num_stations > 1) + RCT2_GLOBAL((int)arguments + 4, uint16) += 6; + + RCT2_GLOBAL((int)arguments + 0, uint16) = stringId; + return stringId != 1106 && stringId != 1107 ? 1191 : 1192; +} + +/** + * + * rct2: 0x006AEF65 + */ +static rct_string_id window_ride_get_status_station(rct_window *w, void *arguments) +{ + rct_ride *ride; + int stationIndex, count, queueLength; + rct_string_id stringId; + + ride = GET_RIDE(w->number); + + count = w->ride.view - ride->num_vehicles - 1; + stationIndex = -1; + do { + stationIndex++; + if (ride->station_starts[stationIndex] != 0xFFFF) + count--; + } while (count >= 0); + + stringId = 0; + + // Entrance / exit + if (ride->status == RIDE_STATUS_CLOSED) { + if (ride->entrances[stationIndex] == 0xFFFF) + stringId = STR_NO_ENTRANCE; + else if (ride->exits[stationIndex] == 0xFFFF) + stringId = STR_NO_EXIT; + } else { + if (ride->entrances[stationIndex] == 0xFFFF) + stringId = STR_EXIT_ONLY; + } + + // Queue length + if (stringId == 0) { + queueLength = ride->queue_length[stationIndex]; + RCT2_GLOBAL((int)arguments + 2, uint16) = queueLength; + stringId = STR_QUEUE_EMPTY; + if (queueLength == 1) + stringId++; + else if (queueLength > 1) + stringId += 2; + } + + RCT2_GLOBAL((int)arguments + 0, uint16) = stringId; + return 1191; +} + +/** + * + * rct2: 0x006AEE73 + */ +static rct_string_id window_ride_get_status(rct_window *w, void *arguments) +{ + rct_ride *ride = GET_RIDE(w->number); + + if (w->ride.view == 0) + return window_ride_get_status_overall_view(w, arguments); + if (w->ride.view <= ride->num_vehicles) + return window_ride_get_status_vehicle(w, arguments); + if (ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN) + return window_ride_get_status_overall_view(w, arguments); + return window_ride_get_status_station(w, arguments); +} + /** * * rct2: 0x006AEE73 @@ -857,10 +1051,57 @@ static void window_ride_main_paint() { rct_window *w; rct_drawpixelinfo *dpi; + rct_ride *ride; + rct_widget *widget; + rct_string_id stringId; window_paint_get_registers(w, dpi); window_draw_widgets(w, dpi); + // window_ride_draw_tabs(w); + + // Viewport and ear icon + if (w->viewport != NULL) { + window_draw_viewport(dpi, w); + if (w->viewport->flags & VIEWPORT_FLAG_SOUND_ON) + gfx_draw_sprite(dpi, SPR_HEARING_VIEWPORT, w->x + 2, w->y + 2, 0); + } + + // View dropdown + ride = GET_RIDE(w->number); + stringId = STR_OVERALL_VIEW; + if (w->ride.view != 0) { + stringId = RideNameConvention[ride->type].vehicle_name + 6; + if (w->ride.view > ride->num_vehicles) { + RCT2_GLOBAL(0x013CE952 + 2, uint16) = w->ride.view - ride->num_vehicles; + stringId = RideNameConvention[ride->type].station_name + 6; + } else { + RCT2_GLOBAL(0x013CE952 + 2, uint16) = w->ride.view; + } + } + RCT2_GLOBAL(0x013CE952, uint16) = stringId; + + widget = &window_ride_main_widgets[WIDX_VIEW]; + gfx_draw_string_centred( + dpi, + 1193, + w->x + (widget->left + widget->right - 11) / 2, + w->y + widget->top, + 0, + (void*)0x013CE952 + ); + + // Status + widget = &window_ride_main_widgets[WIDX_STATUS]; + gfx_draw_string_centred_clipped( + dpi, + window_ride_get_status(w, (void*)0x013CE952), + (void*)0x013CE952, + 0, + w->x + (widget->left + widget->right) / 2, + w->y + widget->top - 1, + widget->right - widget->left + ); } #pragma endregion diff --git a/src/window_ride_list.c b/src/window_ride_list.c index 1a876b8457..ccef8266c6 100644 --- a/src/window_ride_list.c +++ b/src/window_ride_list.c @@ -432,52 +432,6 @@ static void window_ride_list_paint() window_ride_list_draw_tab_images(dpi, w); } -/** - * - * rct2: 0x006AF561 - */ -static void ride_get_status(int rideIndex, int *formatSecondary, int *argument) -{ - rct_ride *ride = &g_ride_list[rideIndex]; - - if (ride->lifecycle_flags & RIDE_LIFECYCLE_CRASHED) { - *formatSecondary = STR_CRASHED; - return; - } - if (ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN) { - *formatSecondary = STR_BROKEN_DOWN; - return; - } - if (ride->status == RIDE_STATUS_CLOSED) { - *formatSecondary = STR_CLOSED; - return; - } - if (ride->status == RIDE_STATUS_TESTING) { - *formatSecondary = STR_TEST_RUN; - return; - } - rct_peep *peep = GET_PEEP(ride->race_winner); - if (ride->mode == RIDE_MODE_RACE && !(ride->lifecycle_flags & RIDE_LIFECYCLE_PASS_STATION_NO_STOPPING) && ride->race_winner != 0xFFFF && peep->sprite_identifier == SPRITE_IDENTIFIER_PEEP) { - if (peep->name_string_idx == STR_GUEST) { - *argument = peep->id; - *formatSecondary = STR_RACE_WON_BY_GUEST; - } else { - *argument = peep->name_string_idx; - *formatSecondary = STR_RACE_WON_BY; - } - } else { - if (!(RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + ride->type * 8, uint32) & 0x20000)) { - *argument = ride->num_riders; - *formatSecondary = STR_PERSON_ON_RIDE; - if(*argument != 1) - *formatSecondary = STR_PEOPLE_ON_RIDE; - - } else { - *formatSecondary = STR_OPEN; - } - } -} - /** * * rct2: 0x006B3240