/** * * rct2: 0x006B7EAB */ static sint32 banner_get_ride_index_at(sint32 x, sint32 y, sint32 z) { rct_tile_element *tileElement; Ride *ride; sint32 rideIndex, resultRideIndex; resultRideIndex = -1; tileElement = map_get_first_element_at(x >> 5, y >> 5); do { if (tile_element_get_type(tileElement) != TILE_ELEMENT_TYPE_TRACK) continue; rideIndex = track_element_get_ride_index(tileElement); ride = get_ride(rideIndex); if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IS_SHOP)) continue; if ((tileElement->clearance_height * 8) + 32 <= z) continue; resultRideIndex = rideIndex; } while (!tile_element_is_last_for_tile(tileElement++)); return resultRideIndex; }
/** * * rct2: 0x006B7EAB */ static int banner_get_ride_index_at(int x, int y, int z) { rct_map_element *mapElement; rct_ride *ride; int rideIndex, resultRideIndex; resultRideIndex = -1; mapElement = map_get_first_element_at(x >> 5, y >> 5); do { if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK) continue; rideIndex = mapElement->properties.track.ride_index; ride = get_ride(rideIndex); if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IS_SHOP)) continue; if ((mapElement->clearance_height * 8) + 32 <= z) continue; resultRideIndex = rideIndex; } while (!map_element_is_last_for_tile(mapElement++)); return resultRideIndex; }
/** * * rct2: 0x006C825F */ static void window_maze_construction_entrance_tooldown(sint32 x, sint32 y, rct_window* w){ ride_construction_invalidate_current_track(); map_invalidate_selection_rect(); gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE; gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE_ARROW; sint32 direction = 0; ride_get_entrance_or_exit_position_from_screen_position(x, y, &x, &y, &direction); if (gRideEntranceExitPlaceDirection == 0xFF) return; uint8 rideIndex = gRideEntranceExitPlaceRideIndex; uint8 entranceExitType = gRideEntranceExitPlaceType; if (entranceExitType == ENTRANCE_TYPE_RIDE_ENTRANCE) { gGameCommandErrorTitle = STR_CANT_BUILD_MOVE_ENTRANCE_FOR_THIS_RIDE_ATTRACTION; } else { gGameCommandErrorTitle = STR_CANT_BUILD_MOVE_EXIT_FOR_THIS_RIDE_ATTRACTION; } money32 cost = game_do_command( x, GAME_COMMAND_FLAG_APPLY | ((direction ^ 2) << 8), y, rideIndex | (entranceExitType << 8), GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, gRideEntranceExitPlaceStationIndex, 0); if (cost == MONEY32_UNDEFINED) return; audio_play_sound_at_location( SOUND_PLACE_ITEM, gCommandPosition.x, gCommandPosition.y, gCommandPosition.z); rct_ride* ride = get_ride(rideIndex); if (ride_are_all_possible_entrances_and_exits_built(ride)){ tool_cancel(); if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_HAS_NO_TRACK)) window_close(w); } else{ gRideEntranceExitPlaceType = entranceExitType ^ 1; window_invalidate_by_class(WC_RIDE_CONSTRUCTION); gCurrentToolWidget.widget_index = entranceExitType ? WIDX_MAZE_ENTRANCE : WIDX_MAZE_EXIT; } }
/** * * rct2: 0x006B7D86 */ sint32 banner_get_closest_ride_index(sint32 x, sint32 y, sint32 z) { sint32 i, rideIndex; Ride *ride; static constexpr const LocationXY16 NeighbourCheckOrder[] = { { 32, 0 }, { -32, 0 }, { 0, 32 }, { 0, -32 }, { -32, +32 }, { +32, -32 }, { +32, +32 }, { -32, +32 }, { 0, 0 } }; for (i = 0; i < (sint32)Util::CountOf(NeighbourCheckOrder); i++) { rideIndex = banner_get_ride_index_at(x + NeighbourCheckOrder[i].x, y + NeighbourCheckOrder[i].y, z); if (rideIndex != -1) { return rideIndex; } } rideIndex = -1; sint32 resultDistance = std::numeric_limits<sint32>::max(); FOR_ALL_RIDES(i, ride) { if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IS_SHOP)) continue; LocationXY8 location = ride->overall_view; if (location.xy == RCT_XY8_UNDEFINED) continue; sint32 rideX = location.x * 32; sint32 rideY = location.y * 32; sint32 distance = abs(x - rideX) + abs(y - rideY); if (distance < resultDistance) { resultDistance = distance; rideIndex = i; } } return rideIndex; }
/** * * rct2: 0x006B7D86 */ int banner_get_closest_ride_index(int x, int y, int z) { int i, rideIndex; rct_ride *ride; static const rct_xy16 NeighbourCheckOrder[] = { { 32, 0 }, { -32, 0 }, { 0, 32 }, { 0, -32 }, { -32, +32 }, { +32, -32 }, { +32, +32 }, { -32, +32 }, { 0, 0 } }; for (i = 0; i < countof(NeighbourCheckOrder); i++) { rideIndex = banner_get_ride_index_at(x + NeighbourCheckOrder[i].x, y + NeighbourCheckOrder[i].y, z); if (rideIndex != -1) { return rideIndex; } } rideIndex = -1; int resultDistance = INT_MAX; FOR_ALL_RIDES(i, ride) { if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IS_SHOP)) continue; uint16 xy = ride->overall_view; if (xy == 0xFFFF) continue; int rideX = (xy & 0xFF) * 32; int rideY = (xy >> 8) * 32; int distance = abs(x - rideX) + abs(y - rideY); if (distance < resultDistance) { resultDistance = distance; rideIndex = i; } } return rideIndex; }
/** * * rct2: 0x006D2804, 0x006D264D */ bool track_design_save(uint8 rideIndex) { rct_ride* ride = get_ride(rideIndex); if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)){ window_error_open(STR_CANT_SAVE_TRACK_DESIGN, gGameCommandErrorText); return false; } if (!ride_has_ratings(ride)) { window_error_open(STR_CANT_SAVE_TRACK_DESIGN, gGameCommandErrorText); return false; } if (!ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_HAS_TRACK)) { window_error_open(STR_CANT_SAVE_TRACK_DESIGN, gGameCommandErrorText); return false; } _trackDesign = track_design_save_to_td6(rideIndex); if (_trackDesign == NULL) { window_error_open(STR_CANT_SAVE_TRACK_DESIGN, gGameCommandErrorText); return false; } if (gTrackDesignSaveMode) { if (!track_design_save_copy_scenery_to_td6(_trackDesign)) { free(_trackDesign->track_elements); free(_trackDesign->entrance_elements); free(_trackDesign); return false; } } utf8 track_name[256]; format_string(track_name, sizeof(track_name), ride->name, &ride->name_arguments); window_loadsave_open(LOADSAVETYPE_TRACK | LOADSAVETYPE_SAVE, track_name); window_loadsave_set_loadsave_callback(track_design_save_callback); return true; }
bool rideTypeShouldLoseSeparateFlag(const rct_ride_entry *rideEntry) { if (!gConfigInterface.select_by_track_type) { return false; } bool remove_flag = true; for (sint32 j = 0; j < 3; j++) { if (rideEntry->ride_type[j] == RIDE_TYPE_NULL) { continue; } if (ride_type_has_flag(rideEntry->ride_type[j], RIDE_TYPE_FLAG_FLAT_RIDE)) { remove_flag = false; } if (rideEntry->ride_type[j] == RIDE_TYPE_MAZE || rideEntry->ride_type[j] == RIDE_TYPE_MINI_GOLF) { remove_flag = false; } } return remove_flag; }
/** * * rct2: 0x006CF387 */ static void window_track_list_paint(rct_window *w, rct_drawpixelinfo *dpi) { rct_widget *widget; rct_track_design *trackDesign = NULL; uint8 *image; utf8 *trackDesignList = RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, utf8); uint16 holes, speed, drops, dropHeight, inversions; fixed32_2dp rating; int trackIndex, x, y, colour, gForces, airTime; rct_g1_element tmpElement, *substituteElement; window_draw_widgets(w, dpi); trackIndex = w->track_list.var_482; if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) { if (*trackDesignList == 0 || trackIndex == -1) return; } else if (trackIndex-- == 0) { return; } // Track preview widget = &window_track_list_widgets[WIDX_TRACK_PREVIEW]; x = w->x + widget->left + 1; y = w->y + widget->top + 1; colour = ColourMapA[w->colours[0]].darkest; gfx_fill_rect(dpi, x, y, x + 369, y + 216, colour); trackDesign = track_get_info(trackIndex, &image); if (trackDesign == NULL) return; rct_track_td6* track_td6 = &trackDesign->track_td6; substituteElement = &g1Elements[0]; tmpElement = *substituteElement; substituteElement->offset = image; substituteElement->width = 370; substituteElement->height = 217; substituteElement->x_offset = 0; substituteElement->y_offset = 0; substituteElement->flags = G1_FLAG_BMP; gfx_draw_sprite(dpi, 0, x, y, 0); *substituteElement = tmpElement; x = w->x + (widget->left + widget->right) / 2; y = w->y + widget->bottom - 12; RCT2_GLOBAL(0x00F44153, uint8) = 0; // Warnings if ((track_td6->track_flags & 4) && !(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER)) { // Vehicle design not available gfx_draw_string_centred_clipped(dpi, STR_VEHICLE_DESIGN_UNAVAILABLE, NULL, 0, x, y, 368); y -= 10; } if (track_td6->track_flags & 1) { RCT2_GLOBAL(0x00F44153, uint8) = 1; if (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_SCENERY_TOGGLE, uint8) == 0) { // Scenery not available gfx_draw_string_centred_clipped(dpi, STR_DESIGN_INCLUDES_SCENERY_WHICH_IS_UNAVAILABLE, NULL, 0, x, y, 368); y -= 10; } } // Track design name window_track_list_format_name((char*)0x009BC677, trackDesignList + (trackIndex * 128), FORMAT_WINDOW_COLOUR_1, 1); gfx_draw_string_centred_clipped(dpi, 3165, NULL, 0, x, y, 368); // Information x = w->x + widget->left + 1; y = w->y + widget->bottom + 2; // Stats rating = track_td6->excitement * 10; gfx_draw_string_left(dpi, STR_TRACK_LIST_EXCITEMENT_RATING, &rating, 0, x, y); y += 10; rating = track_td6->intensity * 10; gfx_draw_string_left(dpi, STR_TRACK_LIST_INTENSITY_RATING, &rating, 0, x, y); y += 10; rating = track_td6->nausea * 10; gfx_draw_string_left(dpi, STR_TRACK_LIST_NAUSEA_RATING, &rating, 0, x, y); y += 14; if (track_td6->type != RIDE_TYPE_MAZE) { if (track_td6->type == RIDE_TYPE_MINI_GOLF) { // Holes holes = track_td6->holes & 0x1F; gfx_draw_string_left(dpi, STR_HOLES, &holes, 0, x, y); y += 10; } else { // Maximum speed speed = ((track_td6->max_speed << 16) * 9) >> 18; gfx_draw_string_left(dpi, STR_MAX_SPEED, &speed, 0, x, y); y += 10; // Average speed speed = ((track_td6->average_speed << 16) * 9) >> 18; gfx_draw_string_left(dpi, STR_AVERAGE_SPEED, &speed, 0, x, y); y += 10; } // Ride length RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint16) = 1345; RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 2, uint16) = track_td6->ride_length; gfx_draw_string_left_clipped(dpi, STR_TRACK_LIST_RIDE_LENGTH, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS, 0, x, y, 214); y += 10; } if (ride_type_has_flag(track_td6->type, RIDE_TYPE_FLAG_HAS_G_FORCES)) { // Maximum positive vertical Gs gForces = track_td6->max_positive_vertical_g * 32; gfx_draw_string_left(dpi, STR_MAX_POSITIVE_VERTICAL_G, &gForces, 0, x, y); y += 10; // Maximum negative verical Gs gForces = track_td6->max_negative_vertical_g * 32; gfx_draw_string_left(dpi, STR_MAX_NEGATIVE_VERTICAL_G, &gForces, 0, x, y); y += 10; // Maximum lateral Gs gForces = track_td6->max_lateral_g * 32; gfx_draw_string_left(dpi, STR_MAX_LATERAL_G, &gForces, 0, x, y); y += 10; // If .TD6 if (track_td6->version_and_colour_scheme / 4 >= 2) { if (track_td6->total_air_time != 0) { // Total air time airTime = track_td6->total_air_time * 25; gfx_draw_string_left(dpi, STR_TOTAL_AIR_TIME, &airTime, 0, x, y); y += 10; } } } if (ride_type_has_flag(track_td6->type, RIDE_TYPE_FLAG_HAS_DROPS)) { // Drops drops = track_td6->drops & 0x3F; gfx_draw_string_left(dpi, STR_DROPS, &drops, 0, x, y); y += 10; // Drop height is multiplied by 0.75 dropHeight = (track_td6->highest_drop_height + (track_td6->highest_drop_height / 2)) / 2; gfx_draw_string_left(dpi, STR_HIGHEST_DROP_HEIGHT, &drops, 0, x, y); y += 10; } if (track_td6->type != RIDE_TYPE_MINI_GOLF) { inversions = track_td6->inversions & 0x1F; if (inversions != 0) { // Inversions gfx_draw_string_left(dpi, STR_INVERSIONS, &inversions, 0, x, y); y += 10; } } y += 4; if (track_td6->space_required_x != 0xFF) { // Space required RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint16) = track_td6->space_required_x; RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 2, uint16) = track_td6->space_required_y; gfx_draw_string_left(dpi, STR_TRACK_LIST_SPACE_REQUIRED, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS, 0, x, y); y += 10; } if (track_td6->cost != 0) { gfx_draw_string_left(dpi, STR_TRACK_LIST_COST_AROUND, &track_td6->cost, 0, x, y); y += 14; } }
/** * * rct2: 0x006D3B1F */ static void window_install_track_paint(rct_window* w, rct_drawpixelinfo* dpi) { window_draw_widgets(w, dpi); // Track preview rct_widget* widget = &window_install_track_widgets[WIDX_TRACK_PREVIEW]; int32_t x = w->x + widget->left + 1; int32_t y = w->y + widget->top + 1; int32_t colour = ColourMapA[w->colours[0]].darkest; gfx_fill_rect(dpi, x, y, x + 369, y + 216, colour); rct_g1_element g1temp = {}; g1temp.offset = _trackDesignPreviewPixels.data() + (_currentTrackPieceDirection * TRACK_PREVIEW_IMAGE_SIZE); g1temp.width = 370; g1temp.height = 217; g1temp.flags = G1_FLAG_BMP; gfx_set_g1_element(SPR_TEMP, &g1temp); gfx_draw_sprite(dpi, SPR_TEMP, x, y, 0); x = w->x + (widget->left + widget->right) / 2; y = w->y + widget->bottom - 12; // Warnings rct_track_td6* td6 = _trackDesign; if (td6->track_flags & TRACK_DESIGN_FLAG_SCENERY_UNAVAILABLE) { if (!gTrackDesignSceneryToggle) { // Scenery not available gfx_draw_string_centred_clipped( dpi, STR_DESIGN_INCLUDES_SCENERY_WHICH_IS_UNAVAILABLE, nullptr, COLOUR_BLACK, x, y, 368); y -= LIST_ROW_HEIGHT; } } // Information x = w->x + widget->left + 1; y = w->y + widget->bottom + 4; // 0x006D3CF1 -- 0x006d3d71 missing // Track design name & type auto trackName = _trackName.c_str(); gfx_draw_string_left(dpi, STR_TRACK_DESIGN_NAME, &trackName, COLOUR_BLACK, x - 1, y); y += LIST_ROW_HEIGHT; rct_ride_name rideName; rct_string_id friendlyTrackName; void* objectEntry = object_manager_load_object(&td6->vehicle_object); if (objectEntry != nullptr) { int32_t groupIndex = object_manager_get_loaded_object_entry_index(objectEntry); rideName = get_ride_naming(td6->type, get_ride_entry(groupIndex)); friendlyTrackName = rideName.name; } else { // Fall back on the technical track name if the vehicle object cannot be loaded friendlyTrackName = RideNaming[td6->type].name; } gfx_draw_string_left(dpi, STR_TRACK_DESIGN_TYPE, &friendlyTrackName, COLOUR_BLACK, x, y); y += LIST_ROW_HEIGHT + 4; // Stats fixed32_2dp rating = td6->excitement * 10; gfx_draw_string_left(dpi, STR_TRACK_LIST_EXCITEMENT_RATING, &rating, COLOUR_BLACK, x, y); y += LIST_ROW_HEIGHT; rating = td6->intensity * 10; gfx_draw_string_left(dpi, STR_TRACK_LIST_INTENSITY_RATING, &rating, COLOUR_BLACK, x, y); y += LIST_ROW_HEIGHT; rating = td6->nausea * 10; gfx_draw_string_left(dpi, STR_TRACK_LIST_NAUSEA_RATING, &rating, COLOUR_BLACK, x, y); y += LIST_ROW_HEIGHT + 4; if (td6->type != RIDE_TYPE_MAZE) { if (td6->type == RIDE_TYPE_MINI_GOLF) { // Holes uint16_t holes = td6->holes & 0x1F; gfx_draw_string_left(dpi, STR_HOLES, &holes, COLOUR_BLACK, x, y); y += LIST_ROW_HEIGHT; } else { // Maximum speed uint16_t speed = ((td6->max_speed << 16) * 9) >> 18; gfx_draw_string_left(dpi, STR_MAX_SPEED, &speed, COLOUR_BLACK, x, y); y += LIST_ROW_HEIGHT; // Average speed speed = ((td6->average_speed << 16) * 9) >> 18; gfx_draw_string_left(dpi, STR_AVERAGE_SPEED, &speed, COLOUR_BLACK, x, y); y += LIST_ROW_HEIGHT; } // Ride length set_format_arg(0, rct_string_id, STR_RIDE_LENGTH_ENTRY); set_format_arg(2, uint16_t, td6->ride_length); gfx_draw_string_left_clipped(dpi, STR_TRACK_LIST_RIDE_LENGTH, gCommonFormatArgs, COLOUR_BLACK, x, y, 214); y += LIST_ROW_HEIGHT; } if (ride_type_has_flag(td6->type, RIDE_TYPE_FLAG_HAS_G_FORCES)) { // Maximum positive vertical Gs int32_t gForces = td6->max_positive_vertical_g * 32; gfx_draw_string_left(dpi, STR_MAX_POSITIVE_VERTICAL_G, &gForces, COLOUR_BLACK, x, y); y += LIST_ROW_HEIGHT; // Maximum negative vertical Gs gForces = td6->max_negative_vertical_g * 32; gfx_draw_string_left(dpi, STR_MAX_NEGATIVE_VERTICAL_G, &gForces, COLOUR_BLACK, x, y); y += LIST_ROW_HEIGHT; // Maximum lateral Gs gForces = td6->max_lateral_g * 32; gfx_draw_string_left(dpi, STR_MAX_LATERAL_G, &gForces, COLOUR_BLACK, x, y); y += LIST_ROW_HEIGHT; // If .TD6 if (td6->version_and_colour_scheme / 4 >= 2) { if (td6->total_air_time != 0) { // Total air time int32_t airTime = td6->total_air_time * 25; gfx_draw_string_left(dpi, STR_TOTAL_AIR_TIME, &airTime, COLOUR_BLACK, x, y); y += LIST_ROW_HEIGHT; } } } if (ride_type_has_flag(td6->type, RIDE_TYPE_FLAG_HAS_DROPS)) { // Drops uint16_t drops = td6->drops & 0x3F; gfx_draw_string_left(dpi, STR_DROPS, &drops, COLOUR_BLACK, x, y); y += LIST_ROW_HEIGHT; // Drop height is multiplied by 0.75 gfx_draw_string_left(dpi, STR_HIGHEST_DROP_HEIGHT, &drops, COLOUR_BLACK, x, y); y += LIST_ROW_HEIGHT; } if (td6->type != RIDE_TYPE_MINI_GOLF) { uint16_t inversions = td6->inversions & 0x1F; if (inversions != 0) { // Inversions gfx_draw_string_left(dpi, STR_INVERSIONS, &inversions, COLOUR_BLACK, x, y); y += LIST_ROW_HEIGHT; } } y += 4; if (td6->space_required_x != 0xFF) { // Space required set_format_arg(0, uint16_t, td6->space_required_x); set_format_arg(2, uint16_t, td6->space_required_y); gfx_draw_string_left(dpi, STR_TRACK_LIST_SPACE_REQUIRED, gCommonFormatArgs, COLOUR_BLACK, x, y); y += LIST_ROW_HEIGHT; } if (td6->cost != 0) { gfx_draw_string_left(dpi, STR_TRACK_LIST_COST_AROUND, &td6->cost, COLOUR_BLACK, x, y); } }
/** * type == 0 -> guests on ride * type == 1 -> guests in queue * type == 2 -> guests thinking about ride * type == 3 -> guests thinking X, opened from news item * index is number of the ride or index of the thought * values of eax and edx probably determine the filter name string * * rct2: 0x006993BA */ void window_guest_list_open_with_filter(int type, int index) { uint32 eax, edx; window_guest_list_open(); _window_guest_list_selected_page = 0; _window_guest_list_num_pages = 1; _window_guest_list_tracking_only = false; RCT2_GLOBAL(0x009AC7E0, uint8) = 0; RCT2_GLOBAL(0x009AC7F0, uint8) = 0; rct_ride *ride = NULL; if (type != 3) { // common for cases 0, 1, 2 ride = get_ride(index & 0x000000FF); eax = ride->name; edx = ride->name_arguments; } switch(type) { case 0: _window_guest_list_selected_filter = 0; eax = (eax << 16) + 1435; if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IN_RIDE)) eax++; RCT2_GLOBAL(0x00F1EDF6, uint32) = eax; RCT2_GLOBAL(0x00F1EDFA, uint32) = edx; _window_guest_list_highlighted_index = 0xFFFF; _window_guest_list_selected_tab = 0; _window_guest_list_selected_view = 0; break; case 1: _window_guest_list_selected_filter = 0; eax = (eax << 16) + 1433; RCT2_GLOBAL(0x00F1EDF6, uint32) = eax; RCT2_GLOBAL(0x00F1EDFA, uint32) = edx; _window_guest_list_highlighted_index = 0xFFFF; _window_guest_list_selected_tab = 0; _window_guest_list_selected_view = 0; break; case 2: _window_guest_list_selected_filter = 1; eax = (eax << 16) + 0xFFFF; RCT2_GLOBAL(0x00F1EDF6, uint32) = eax; RCT2_GLOBAL(0x00F1EDFA, uint32) = edx; _window_guest_list_highlighted_index = 0xFFFF; _window_guest_list_selected_tab = 0; _window_guest_list_selected_view = 1; break; case 3: _window_guest_list_selected_filter = 1; index = (index & 0x000000FF) + 1480; RCT2_GLOBAL(0x00F1EDF6, uint32) = index; RCT2_GLOBAL(0x00F1EDFA, uint32) = 0; _window_guest_list_highlighted_index = 0xFFFF; _window_guest_list_selected_tab = 0; _window_guest_list_selected_view = 1; break; } }
/** * * rct2: 0x006CF387 */ static void window_track_list_paint(rct_window *w, rct_drawpixelinfo *dpi) { window_draw_widgets(w, dpi); sint32 trackIndex = w->selected_list_item; if (gScreenFlags & SCREEN_FLAGS_TRACK_MANAGER) { if (_trackDesignsCount == 0 || trackIndex == -1) { return; } } else if (trackIndex-- == 0) { return; } // Track preview sint32 x, y, colour; rct_widget *widget = &window_track_list_widgets[WIDX_TRACK_PREVIEW]; x = w->x + widget->left + 1; y = w->y + widget->top + 1; colour = ColourMapA[w->colours[0]].darkest; gfx_fill_rect(dpi, x, y, x + 369, y + 216, colour); if (_loadedTrackDesignIndex != trackIndex) { utf8 *path = _trackDesigns[trackIndex].path; if (track_list_load_design_for_preview(path)) { _loadedTrackDesignIndex = trackIndex; } else { _loadedTrackDesignIndex = TRACK_DESIGN_INDEX_UNLOADED; return; } } rct_track_td6 *td6 = _loadedTrackDesign; if (td6 == NULL) { return; } rct_g1_element *substituteElement = &g1Elements[SPR_TEMP]; rct_g1_element tmpElement = *substituteElement; substituteElement->offset = _trackDesignPreviewPixels + (_currentTrackPieceDirection * TRACK_PREVIEW_IMAGE_SIZE); substituteElement->width = 370; substituteElement->height = 217; substituteElement->x_offset = 0; substituteElement->y_offset = 0; substituteElement->flags = G1_FLAG_BMP; gfx_draw_sprite(dpi, 0, x, y, 0); *substituteElement = tmpElement; x = w->x + (widget->left + widget->right) / 2; y = w->y + widget->bottom - 12; // Warnings if ((td6->track_flags & TRACK_DESIGN_FLAG_VEHICLE_UNAVAILABLE) && !(gScreenFlags & SCREEN_FLAGS_TRACK_MANAGER)) { // Vehicle design not available gfx_draw_string_centred_clipped(dpi, STR_VEHICLE_DESIGN_UNAVAILABLE, NULL, COLOUR_BLACK, x, y, 368); y -= 10; } if (td6->track_flags & TRACK_DESIGN_FLAG_SCENERY_UNAVAILABLE) { if (!gTrackDesignSceneryToggle) { // Scenery not available gfx_draw_string_centred_clipped(dpi, STR_DESIGN_INCLUDES_SCENERY_WHICH_IS_UNAVAILABLE, NULL, COLOUR_BLACK, x, y, 368); y -= 10; } } // Track design name utf8 *trackName = _trackDesigns[trackIndex].name; gfx_draw_string_centred_clipped(dpi, STR_TRACK_PREVIEW_NAME_FORMAT, &trackName, COLOUR_BLACK, x, y, 368); // Information x = w->x + widget->left + 1; y = w->y + widget->bottom + 2; // Stats fixed32_2dp rating = td6->excitement * 10; gfx_draw_string_left(dpi, STR_TRACK_LIST_EXCITEMENT_RATING, &rating, COLOUR_BLACK, x, y); y += 10; rating = td6->intensity * 10; gfx_draw_string_left(dpi, STR_TRACK_LIST_INTENSITY_RATING, &rating, COLOUR_BLACK, x, y); y += 10; rating = td6->nausea * 10; gfx_draw_string_left(dpi, STR_TRACK_LIST_NAUSEA_RATING, &rating, COLOUR_BLACK, x, y); y += 14; if (td6->type != RIDE_TYPE_MAZE) { if (td6->type == RIDE_TYPE_MINI_GOLF) { // Holes uint16 holes = td6->holes & 0x1F; gfx_draw_string_left(dpi, STR_HOLES, &holes, COLOUR_BLACK, x, y); y += 10; } else { // Maximum speed uint16 speed = ((td6->max_speed << 16) * 9) >> 18; gfx_draw_string_left(dpi, STR_MAX_SPEED, &speed, COLOUR_BLACK, x, y); y += 10; // Average speed speed = ((td6->average_speed << 16) * 9) >> 18; gfx_draw_string_left(dpi, STR_AVERAGE_SPEED, &speed, COLOUR_BLACK, x, y); y += 10; } // Ride length set_format_arg(0, rct_string_id, STR_RIDE_LENGTH_ENTRY); set_format_arg(2, uint16, td6->ride_length); gfx_draw_string_left_clipped(dpi, STR_TRACK_LIST_RIDE_LENGTH, gCommonFormatArgs, COLOUR_BLACK, x, y, 214); y += 10; } if (ride_type_has_flag(td6->type, RIDE_TYPE_FLAG_HAS_G_FORCES)) { // Maximum positive vertical Gs sint32 gForces = td6->max_positive_vertical_g * 32; gfx_draw_string_left(dpi, STR_MAX_POSITIVE_VERTICAL_G, &gForces, COLOUR_BLACK, x, y); y += 10; // Maximum negative vertical Gs gForces = td6->max_negative_vertical_g * 32; gfx_draw_string_left(dpi, STR_MAX_NEGATIVE_VERTICAL_G, &gForces, COLOUR_BLACK, x, y); y += 10; // Maximum lateral Gs gForces = td6->max_lateral_g * 32; gfx_draw_string_left(dpi, STR_MAX_LATERAL_G, &gForces, COLOUR_BLACK, x, y); y += 10; // If .TD6 if (td6->version_and_colour_scheme / 4 >= 2) { if (td6->total_air_time != 0) { // Total air time sint32 airTime = td6->total_air_time * 25; gfx_draw_string_left(dpi, STR_TOTAL_AIR_TIME, &airTime, COLOUR_BLACK, x, y); y += 10; } } } if (ride_type_has_flag(td6->type, RIDE_TYPE_FLAG_HAS_DROPS)) { // Drops uint16 drops = td6->drops & 0x3F; gfx_draw_string_left(dpi, STR_DROPS, &drops, COLOUR_BLACK, x, y); y += 10; // Drop height is multiplied by 0.75 uint16 highestDropHeight = (td6->highest_drop_height * 3) / 4; gfx_draw_string_left(dpi, STR_HIGHEST_DROP_HEIGHT, &highestDropHeight, COLOUR_BLACK, x, y); y += 10; } if (td6->type != RIDE_TYPE_MINI_GOLF) { uint16 inversions = td6->inversions & 0x1F; if (inversions != 0) { // Inversions gfx_draw_string_left(dpi, STR_INVERSIONS, &inversions, COLOUR_BLACK, x, y); y += 10; } } y += 4; if (td6->space_required_x != 0xFF) { // Space required set_format_arg(0, uint16, td6->space_required_x); set_format_arg(2, uint16, td6->space_required_y); gfx_draw_string_left(dpi, STR_TRACK_LIST_SPACE_REQUIRED, gCommonFormatArgs, COLOUR_BLACK, x, y); y += 10; } if (td6->cost != 0) { gfx_draw_string_left(dpi, STR_TRACK_LIST_COST_AROUND, &td6->cost, COLOUR_BLACK, x, y); } }
/** * * rct2: 0x006993BA * * @param index The number of the ride or index of the thought */ rct_window * window_guest_list_open_with_filter(sint32 type, sint32 index) { rct_window * w = window_guest_list_open(); _window_guest_list_selected_page = 0; _window_guest_list_num_pages = 1; _window_guest_list_tracking_only = false; switch(type) { case GLFT_GUESTS_ON_RIDE: { Ride *ride = get_ride(index & 0x000000FF); _window_guest_list_filter_arguments[0] = STR_ON_RIDE; if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IN_RIDE)) { _window_guest_list_filter_arguments[0] = STR_IN_RIDE; } _window_guest_list_filter_arguments[1] = ride->name; _window_guest_list_filter_arguments[2] = ride->name_arguments_type_name; _window_guest_list_filter_arguments[3] = ride->name_arguments_number; _window_guest_list_selected_filter = 0; _window_guest_list_highlighted_index = 0xFFFF; _window_guest_list_selected_tab = 0; _window_guest_list_selected_view = 0; break; } case GLFT_GUESTS_IN_QUEUE: { Ride *ride = get_ride(index & 0x000000FF); _window_guest_list_filter_arguments[0] = STR_QUEUING_FOR; _window_guest_list_filter_arguments[1] = ride->name; _window_guest_list_filter_arguments[2] = ride->name_arguments_type_name; _window_guest_list_filter_arguments[3] = ride->name_arguments_number; _window_guest_list_selected_filter = 0; _window_guest_list_highlighted_index = 0xFFFF; _window_guest_list_selected_tab = 0; _window_guest_list_selected_view = 0; break; } case GLFT_GUESTS_THINKING_ABOUT_RIDE: { Ride *ride = get_ride(index & 0x000000FF); _window_guest_list_filter_arguments[0] = STR_NONE; _window_guest_list_filter_arguments[1] = ride->name; _window_guest_list_filter_arguments[2] = ride->name_arguments_type_name; _window_guest_list_filter_arguments[3] = ride->name_arguments_number; _window_guest_list_selected_filter = 1; _window_guest_list_highlighted_index = 0xFFFF; _window_guest_list_selected_tab = 0; _window_guest_list_selected_view = 1; break; } case GLFT_GUESTS_THINKING_X: { _window_guest_list_filter_arguments[0] = PeepThoughts[(index & 0x000000FF)]; _window_guest_list_filter_arguments[1] = 0; _window_guest_list_filter_arguments[2] = 0; _window_guest_list_filter_arguments[3] = 0; _window_guest_list_selected_filter = 1; _window_guest_list_highlighted_index = 0xFFFF; _window_guest_list_selected_tab = 0; _window_guest_list_selected_view = 1; break; } } return w; }
/** * * rct2: 0x0069E16F */ rct_window* window_new_campaign_open(int16_t campaignType) { rct_window* w; Ride* ride; int32_t i, numApplicableRides; w = window_bring_to_front_by_class(WC_NEW_CAMPAIGN); if (w != nullptr) { if (w->campaign.campaign_type == campaignType) return w; window_close(w); } w = window_create_auto_pos(350, 107, &window_new_campaign_events, WC_NEW_CAMPAIGN, 0); w->widgets = window_new_campaign_widgets; w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_RIDE_DROPDOWN) | (1 << WIDX_RIDE_DROPDOWN_BUTTON) | (1 << WIDX_WEEKS_INCREASE_BUTTON) | (1 << WIDX_WEEKS_DECREASE_BUTTON) | (1 << WIDX_START_BUTTON); w->hold_down_widgets = (1 << WIDX_WEEKS_INCREASE_BUTTON) | (1 << WIDX_WEEKS_DECREASE_BUTTON); window_init_scroll_widgets(w); window_new_campaign_widgets[WIDX_TITLE].text = MarketingCampaignNames[campaignType][0]; // Campaign type w->campaign.campaign_type = campaignType; // Number of weeks w->campaign.no_weeks = 2; // Currently selected ride w->campaign.ride_id = SELECTED_RIDE_UNDEFINED; // Get all applicable rides numApplicableRides = 0; window_new_campaign_rides[0] = RIDE_ID_NULL; FOR_ALL_RIDES (i, ride) { if (ride->status != RIDE_STATUS_OPEN) { continue; } if (ride_type_has_flag( ride->type, RIDE_TYPE_FLAG_IS_SHOP | RIDE_TYPE_FLAG_SELLS_FOOD | RIDE_TYPE_FLAG_SELLS_DRINKS | RIDE_TYPE_FLAG_IS_BATHROOM)) { continue; } window_new_campaign_rides[numApplicableRides++] = i; } // Take top 128 most valuable rides if (numApplicableRides > DROPDOWN_ITEMS_MAX_SIZE) { qsort(window_new_campaign_rides, numApplicableRides, sizeof(uint8_t), ride_value_compare); numApplicableRides = DROPDOWN_ITEMS_MAX_SIZE; } // Sort rides by name qsort(window_new_campaign_rides, numApplicableRides, sizeof(uint8_t), ride_name_compare); window_new_campaign_rides[numApplicableRides] = RIDE_ID_NULL; return w; }