/** * * rct2: 0x006CD435 */ static void window_maze_construction_invalidate(rct_window *w) { rct_ride *ride = get_ride(_currentRideIndex); // Set window title arguments set_format_arg(4, rct_string_id, ride->name); set_format_arg(6, uint32, ride->name_arguments); }
static void window_about_openrct2_common_paint(rct_window * w, rct_drawpixelinfo * dpi) { sint32 x1, x2, y; x1 = w->x + (&w->widgets[WIDX_TAB_ABOUT_OPENRCT2])->left + 45; x2 = w->x + (&w->widgets[WIDX_TAB_ABOUT_RCT2])->left + 45; y = w->y + (((&w->widgets[WIDX_TAB_ABOUT_OPENRCT2])->top + (&w->widgets[WIDX_TAB_ABOUT_OPENRCT2])->bottom) / 2) - 3; set_format_arg(0, rct_string_id, STR_TITLE_SEQUENCE_OPENRCT2); gfx_draw_string_centred_wrapped(dpi, gCommonFormatArgs, x1, y, 87, STR_WINDOW_COLOUR_2_STRINGID, COLOUR_AQUAMARINE); set_format_arg(0, rct_string_id, STR_TITLE_SEQUENCE_RCT2); gfx_draw_string_centred_wrapped(dpi, gCommonFormatArgs, x2, y, 87, STR_WINDOW_COLOUR_2_STRINGID, COLOUR_AQUAMARINE); }
/** * * rct2: 0x006B48E5 */ static void window_ride_demolish_paint(rct_window *w, rct_drawpixelinfo *dpi) { window_draw_widgets(w, dpi); Ride* ride = get_ride(w->number); set_format_arg(0, rct_string_id, ride->name); set_format_arg(2, uint32, ride->name_arguments); sint32 x = w->x + WW / 2; sint32 y = w->y + (WH / 2) - 3; gfx_draw_string_centred_wrapped(dpi, gCommonFormatArgs, x, y, WW - 4, STR_DEMOLISH_RIDE_ID, COLOUR_BLACK); }
static void custom_currency_window_paint(rct_window *w, rct_drawpixelinfo *dpi) { sint32 x, y; set_format_arg(0, sint32, 100); window_draw_widgets(w, dpi); x = w->x + 10; y = w->y + 30; gfx_draw_string_left(dpi, STR_RATE, nullptr, w->colours[1], x, y); sint32 baseExchange = CurrencyDescriptors[CURRENCY_POUNDS].rate; set_format_arg(0, sint32, baseExchange); gfx_draw_string_left(dpi, STR_CUSTOM_CURRENCY_EQUIVALENCY, gCommonFormatArgs, w->colours[1], x + 200, y); y += 20; gfx_draw_string_left(dpi, STR_CURRENCY_SYMBOL_TEXT, nullptr, w->colours[1], x, y); gfx_draw_string( dpi, CurrencyDescriptors[CURRENCY_CUSTOM].symbol_unicode, w->colours[1], w->x + window_custom_currency_widgets[WIDX_SYMBOL_TEXT].left + 1, w->y + window_custom_currency_widgets[WIDX_SYMBOL_TEXT].top); if(CurrencyDescriptors[CURRENCY_CUSTOM].affix_unicode == CURRENCY_PREFIX) { gfx_draw_string_left( dpi, STR_PREFIX, w, w->colours[1], w->x + window_custom_currency_widgets[WIDX_AFFIX_DROPDOWN].left + 1, w->y + window_custom_currency_widgets[WIDX_AFFIX_DROPDOWN].top ); } else { gfx_draw_string_left( dpi, STR_SUFFIX, w, w->colours[1], w->x + window_custom_currency_widgets[WIDX_AFFIX_DROPDOWN].left + 1, w->y + window_custom_currency_widgets[WIDX_AFFIX_DROPDOWN].top ); } }
void window_themes_paint(rct_window *w, rct_drawpixelinfo *dpi) { // Widgets window_draw_widgets(w, dpi); window_themes_draw_tab_images(dpi, w); if (_selected_tab == WINDOW_THEMES_TAB_SETTINGS) { size_t activeAvailableThemeIndex = theme_manager_get_active_available_theme_index(); const utf8 * activeThemeName = theme_manager_get_available_theme_name(activeAvailableThemeIndex); set_format_arg(0, uintptr_t, (uintptr_t)activeThemeName); gfx_draw_string_left(dpi, STR_THEMES_LABEL_CURRENT_THEME, NULL, w->colours[1], w->x + 10, w->y + window_themes_widgets[WIDX_THEMES_PRESETS].top + 1); gfx_draw_string_left_clipped( dpi, STR_STRING, gCommonFormatArgs, w->colours[1], w->x + window_themes_widgets[WIDX_THEMES_PRESETS].left + 1, w->y + window_themes_widgets[WIDX_THEMES_PRESETS].top, w->x + window_themes_widgets[WIDX_THEMES_PRESETS_DROPDOWN].left - window_themes_widgets[WIDX_THEMES_PRESETS].left - 4 ); } else if (_selected_tab == WINDOW_THEMES_TAB_FEATURES) { } else { gfx_draw_string_left(dpi, STR_THEMES_HEADER_WINDOW, w, w->colours[1], w->x + 6, 58 - 12 + w->y + 1); gfx_draw_string_left(dpi, STR_THEMES_HEADER_PALETTE, w, w->colours[1], w->x + 220, 58 - 12 + w->y + 1); } }
static void window_title_editor_paint(rct_window * w, rct_drawpixelinfo * dpi) { // Widgets window_draw_widgets(w, dpi); window_title_editor_draw_tab_images(dpi, w); // Draw strings switch (w->selected_tab) { case WINDOW_TITLE_EDITOR_TAB_PRESETS: set_format_arg(0, uintptr_t, _sequenceName); gfx_draw_string_left(dpi, STR_TITLE_SEQUENCE, nullptr, w->colours[1], w->x + 10, w->y + window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS].top + 1); gfx_draw_string_left_clipped( dpi, STR_STRING, gCommonFormatArgs, w->colours[1], w->x + window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS].left + 1, w->y + window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS].top, w->x + window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS_DROPDOWN].left - window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS].left - 4); break; case WINDOW_TITLE_EDITOR_TAB_SAVES: break; case WINDOW_TITLE_EDITOR_TAB_SCRIPT: break; } }
/** * * rct2: 0x006995CC */ static void window_guest_list_paint(rct_window* w, rct_drawpixelinfo* dpi) { int32_t i, x, y; rct_string_id format; // Widgets window_draw_widgets(w, dpi); // Tab 1 image i = (_window_guest_list_selected_tab == 0 ? w->list_information_type & 0x0FFFFFFFC : 0); i += g_peep_animation_entries[PEEP_SPRITE_TYPE_NORMAL].sprite_animation->base_image + 1; i |= 0xA1600000; gfx_draw_sprite( dpi, i, (window_guest_list_widgets[WIDX_TAB_1].left + window_guest_list_widgets[WIDX_TAB_1].right) / 2 + w->x, window_guest_list_widgets[WIDX_TAB_1].bottom - 6 + w->y, 0); // Tab 2 image i = (_window_guest_list_selected_tab == 1 ? w->list_information_type / 4 : 0); gfx_draw_sprite( dpi, SPR_TAB_GUESTS_0 + i, window_guest_list_widgets[WIDX_TAB_2].left + w->x, window_guest_list_widgets[WIDX_TAB_2].top + w->y, 0); // Filter description x = w->x + 6; y = w->y + window_guest_list_widgets[WIDX_TAB_CONTENT_PANEL].top + 3; if (_window_guest_list_selected_tab == PAGE_INDIVIDUAL) { if (_window_guest_list_selected_filter != -1) { if (_window_guest_list_filter_arguments[0] != 0xFFFF) { format = filterNames[_window_guest_list_selected_filter]; // Not sure whether the index will ever be 2 } else { format = STR_GUESTS_FILTER_THINKING_ABOUT; } } else { format = STR_ALL_GUESTS; } } else { format = STR_ALL_GUESTS_SUMMARISED; } gfx_draw_string_left_clipped(dpi, format, _window_guest_list_filter_arguments, COLOUR_BLACK, x, y, 310); // Number of guests (list items) if (_window_guest_list_selected_tab == PAGE_INDIVIDUAL) { x = w->x + 4; y = w->y + window_guest_list_widgets[WIDX_GUEST_LIST].bottom + 2; set_format_arg(0, int16_t, w->var_492); gfx_draw_string_left( dpi, (w->var_492 == 1 ? STR_FORMAT_NUM_GUESTS_SINGULAR : STR_FORMAT_NUM_GUESTS_PLURAL), gCommonFormatArgs, COLOUR_BLACK, x, y); } }
static void window_title_editor_scrollpaint_saves(rct_window * w, rct_drawpixelinfo * dpi) { sint32 currentSaveIndex = -1; // ITitleSequencePlayer * player = window_title_editor_get_player(); // sint32 position = title_sequence_player_get_current_position(player); // const TitleCommand * command = &_editingTitleSequence->Commands[position]; sint32 x = 0; sint32 y = 0; if (_editingTitleSequence == nullptr) return; for (sint32 i = 0; i < (sint32)_editingTitleSequence->NumSaves; i++, y += SCROLLABLE_ROW_HEIGHT) { bool selected = false; bool hover = false; if (i == w->selected_list_item) { selected = true; gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + SCROLLABLE_ROW_HEIGHT - 1, ColourMapA[w->colours[1]].dark); } else if (i == _window_title_editor_highlighted_index || i == currentSaveIndex) { hover = true; gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + SCROLLABLE_ROW_HEIGHT - 1, ColourMapA[w->colours[1]].mid_dark); } else if (i & 1) { gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + SCROLLABLE_ROW_HEIGHT - 1, ColourMapA[w->colours[1]].lighter | 0x1000000); } char buffer[256]; set_format_arg(0, uintptr_t, _editingTitleSequence->Saves[i]); if (selected || hover) { format_string(buffer, 256, STR_STRING, gCommonFormatArgs); } else { format_string(buffer + 1, 255, STR_STRING, gCommonFormatArgs); buffer[0] = (utf8)(uint8)FORMAT_BLACK; } set_format_arg(0, uintptr_t, &buffer); gfx_draw_string_left(dpi, STR_STRING, gCommonFormatArgs, w->colours[1], x + 5, y); } }
/** * * rct2: 0x006E3A9F */ static void window_shortcut_change_paint(rct_window *w, rct_drawpixelinfo *dpi) { window_draw_widgets(w, dpi); sint32 x = w->x + 125; sint32 y = w->y + 30; set_format_arg(0, rct_string_id, ShortcutStringIds[gKeyboardShortcutChangeId]); gfx_draw_string_centred_wrapped(dpi, gCommonFormatArgs, x, y, 242, STR_SHORTCUT_CHANGE_PROMPT, COLOUR_BLACK); }
/** * Update status of marketing campaigns and send produce a news item when they have finished. * rct2: 0x0069E0C1 */ void marketing_update() { for (sint32 campaign = 0; campaign < ADVERTISING_CAMPAIGN_COUNT; campaign++) { if (gCheatsNeverendingMarketing) continue; sint32 active = (gMarketingCampaignDaysLeft[campaign] & CAMPAIGN_ACTIVE_FLAG) != 0; if (gMarketingCampaignDaysLeft[campaign] == 0) continue; window_invalidate_by_class(WC_FINANCES); // High bit marks the campaign as inactive, on first check the campaign is set active // this makes campaigns run a full x weeks even when started in the middle of a week gMarketingCampaignDaysLeft[campaign] &= ~CAMPAIGN_ACTIVE_FLAG; if (active) continue; if (--gMarketingCampaignDaysLeft[campaign] != 0) continue; sint32 campaignItem = gMarketingCampaignRideIndex[campaign]; // This sets the string parameters for the marketing types that have an argument. if (campaign == ADVERTISING_CAMPAIGN_RIDE_FREE || campaign == ADVERTISING_CAMPAIGN_RIDE) { Ride * ride = get_ride(campaignItem); set_format_arg(0, rct_string_id, ride->name); set_format_arg(2, uint32, ride->name_arguments); } else if (campaign == ADVERTISING_CAMPAIGN_FOOD_OR_DRINK_FREE) { set_format_arg(0, rct_string_id, ShopItemStringIds[campaignItem].plural); } if (gConfigNotifications.park_marketing_campaign_finished) { news_item_add_to_queue(NEWS_ITEM_MONEY, MarketingCampaignNames[campaign][2], 0); } } }
static rct_string_id window_editor_inventions_list_prepare_name(const rct_research_item* researchItem, bool withGap) { rct_string_id drawString; rct_string_id stringId = research_item_get_name(researchItem); if (researchItem->type == RESEARCH_ENTRY_TYPE_RIDE && !RideGroupManager::RideTypeIsIndependent(researchItem->baseRideType)) { drawString = withGap ? STR_INVENTIONS_LIST_RIDE_AND_VEHICLE_NAME_DRAG : STR_WINDOW_COLOUR_2_STRINGID_STRINGID; rct_string_id rideGroupName = get_ride_naming(researchItem->baseRideType, get_ride_entry(researchItem->entryIndex)) .name; set_format_arg(0, rct_string_id, rideGroupName); set_format_arg(2, rct_string_id, stringId); } else { drawString = STR_WINDOW_COLOUR_2_STRINGID; set_format_arg(0, rct_string_id, stringId); } return drawString; }
static void window_ride_refurbish_paint(rct_window *w, rct_drawpixelinfo *dpi) { window_draw_widgets(w, dpi); Ride* ride = get_ride(w->number); set_format_arg(0, rct_string_id, ride->name); set_format_arg(2, uint32, ride->name_arguments); set_format_arg(6, money32, _demolishRideCost / 2); sint32 x = w->x + WW / 2; sint32 y = w->y + (WH / 2) - 3; if (gParkFlags & PARK_FLAGS_NO_MONEY) { gfx_draw_string_centred_wrapped(dpi, gCommonFormatArgs, x, y, WW - 4, STR_REFURBISH_RIDE_ID_NO_MONEY, COLOUR_BLACK); } else { gfx_draw_string_centred_wrapped(dpi, gCommonFormatArgs, x, y, WW - 4, STR_REFURBISH_RIDE_ID_MONEY, COLOUR_BLACK); } }
/** * * rct2: 0x006CF8CD */ static void window_track_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, sint32 scrollIndex) { uint8 paletteIndex = ColourMapA[w->colours[0]].mid_light; gfx_clear(dpi, paletteIndex); sint32 x = 0; sint32 y = 0; size_t listIndex = 0; if (gScreenFlags & SCREEN_FLAGS_TRACK_MANAGER) { if (_trackDesignsCount == 0) { // No track designs gfx_draw_string_left(dpi, STR_NO_TRACK_DESIGNS_OF_THIS_TYPE, NULL, COLOUR_BLACK, x, y - 1); return; } } else { // Build custom track item rct_string_id stringId; if (listIndex == (size_t)w->selected_list_item) { // Highlight gfx_filter_rect(dpi, x, y, w->width, y + 9, PALETTE_DARKEN_1); stringId = STR_WINDOW_COLOUR_2_STRINGID; } else { stringId = STR_BLACK_STRING; } rct_string_id stringId2 = STR_BUILD_CUSTOM_DESIGN; gfx_draw_string_left(dpi, stringId, &stringId2, COLOUR_BLACK, x, y - 1); y += 10; listIndex++; } for (size_t i = 0; i < _trackDesignsCount; i++, listIndex++) { if (y + 10 >= dpi->y && y < dpi->y + dpi->height) { rct_string_id stringId; if (listIndex == (size_t)w->selected_list_item) { // Highlight gfx_filter_rect(dpi, x, y, w->width, y + 9, PALETTE_DARKEN_1); stringId = STR_WINDOW_COLOUR_2_STRINGID; } else { stringId = STR_BLACK_STRING; } // Draw track name set_format_arg(0, rct_string_id, STR_TRACK_LIST_NAME_FORMAT); set_format_arg(2, utf8*, _trackDesigns[i].name); gfx_draw_string_left(dpi, stringId, gCommonFormatArgs, COLOUR_BLACK, x, y - 1); } y += 10; }
/** * * rct2: 0x006CF2D6 */ static void window_track_list_invalidate(rct_window *w) { rct_string_id stringId = STR_NONE; rct_ride_entry *entry = get_ride_entry(_window_track_list_item.entry_index); if (entry != NULL && entry != (rct_ride_entry*)-1) { rct_ride_name rideName = get_ride_naming(_window_track_list_item.type, entry); stringId = rideName.name; } set_format_arg(0, rct_string_id, stringId); if (gScreenFlags & SCREEN_FLAGS_TRACK_MANAGER) { window_track_list_widgets[WIDX_TITLE].text = STR_TRACK_DESIGNS; window_track_list_widgets[WIDX_TRACK_LIST].tooltip = STR_CLICK_ON_DESIGN_TO_RENAME_OR_DELETE_IT; } else { window_track_list_widgets[WIDX_TITLE].text = STR_SELECT_DESIGN; window_track_list_widgets[WIDX_TRACK_LIST].tooltip = STR_CLICK_ON_DESIGN_TO_BUILD_IT_TIP; } if ((gScreenFlags & SCREEN_FLAGS_TRACK_MANAGER) || w->selected_list_item != 0) { w->pressed_widgets |= 1 << WIDX_TRACK_PREVIEW; w->disabled_widgets &= ~(1 << WIDX_TRACK_PREVIEW); window_track_list_widgets[WIDX_ROTATE].type = WWT_FLATBTN; window_track_list_widgets[WIDX_TOGGLE_SCENERY].type = WWT_FLATBTN; if (gTrackDesignSceneryToggle) { w->pressed_widgets &= ~(1 << WIDX_TOGGLE_SCENERY); } else { w->pressed_widgets |= (1 << WIDX_TOGGLE_SCENERY); } } else { w->pressed_widgets &= ~(1 << WIDX_TRACK_PREVIEW); w->disabled_widgets |= (1 << WIDX_TRACK_PREVIEW); window_track_list_widgets[WIDX_ROTATE].type = WWT_EMPTY; window_track_list_widgets[WIDX_TOGGLE_SCENERY].type = WWT_EMPTY; } }
/** * * 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: 0x00699701 */ static void window_guest_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, sint32 scrollIndex) { sint32 spriteIndex, numGuests, i, j, y; rct_string_id format; rct_peep *peep; rct_peep_thought *thought; uint32 argument_1, argument_2; // Background fill gfx_fill_rect(dpi, dpi->x, dpi->y, dpi->x + dpi->width - 1, dpi->y + dpi->height - 1, ColourMapA[w->colours[1]].mid_light); switch (_window_guest_list_selected_tab) { case PAGE_INDIVIDUAL: i = 0; y = _window_guest_list_selected_page * -0x7BF2; // For each guest FOR_ALL_GUESTS(spriteIndex, peep) { sprite_set_flashing((rct_sprite*)peep, false); if (peep->outside_of_park != 0) continue; if (_window_guest_list_selected_filter != -1) { if (window_guest_list_is_peep_in_filter(peep)) continue; gWindowMapFlashingFlags |= (1 << 0); sprite_set_flashing((rct_sprite*)peep, true); } if (!guest_should_be_visible(peep)) continue; // Check if y is beyond the scroll control if (y + SCROLLABLE_ROW_HEIGHT + 1 >= -0x7FFF && y + SCROLLABLE_ROW_HEIGHT + 1 > dpi->y && y < 0x7FFF && y < dpi->y + dpi->height) { // Highlight backcolour and text colour (format) format = STR_BLACK_STRING; if (i == _window_guest_list_highlighted_index) { gfx_filter_rect(dpi, 0, y, 800, y + SCROLLABLE_ROW_HEIGHT - 1, PALETTE_DARKEN_1); format = STR_WINDOW_COLOUR_2_STRINGID; } // Guest name set_format_arg(0, rct_string_id, peep->name_string_idx); set_format_arg(2, uint32, peep->id); gfx_draw_string_left_clipped(dpi, format, gCommonFormatArgs, COLOUR_BLACK, 0, y, 113); switch (_window_guest_list_selected_view) { case VIEW_ACTIONS: // Guest face gfx_draw_sprite(dpi, get_peep_face_sprite_small(peep), 118, y + 1, 0); // Tracking icon if (peep->peep_flags & PEEP_FLAGS_TRACKING) gfx_draw_sprite(dpi, STR_ENTER_SELECTION_SIZE, 112, y + 1, 0); // Action get_arguments_from_action(peep, &argument_1, &argument_2); set_format_arg(0, uint32, argument_1); set_format_arg(4, uint32, argument_2); gfx_draw_string_left_clipped(dpi, format, gCommonFormatArgs, COLOUR_BLACK, 133, y, 314); break; case VIEW_THOUGHTS: // For each thought for (j = 0; j < PEEP_MAX_THOUGHTS; j++) { thought = &peep->thoughts[j]; if (thought->type == PEEP_THOUGHT_TYPE_NONE) break; if (thought->var_2 == 0) continue; if (thought->var_2 > 5) break; peep_thought_set_format_args(&peep->thoughts[j]); gfx_draw_string_left_clipped(dpi, format, gCommonFormatArgs, COLOUR_BLACK, 118, y, 329); break; } break; } } // Increment list item index and y i++; y += SCROLLABLE_ROW_HEIGHT; } break; case PAGE_SUMMARISED: y = 0; // For each group of guests for (i = 0; i < _window_guest_list_num_groups; i++) { // Check if y is beyond the scroll control if (y + SUMMARISED_GUEST_ROW_HEIGHT + 1 >= dpi->y) { // Check if y is beyond the scroll control if (y >= dpi->y + dpi->height) break; // Highlight backcolour and text colour (format) format = STR_BLACK_STRING; if (i == _window_guest_list_highlighted_index) { gfx_filter_rect(dpi, 0, y, 800, y + SUMMARISED_GUEST_ROW_HEIGHT, PALETTE_DARKEN_1); format = STR_WINDOW_COLOUR_2_STRINGID; } // Draw guest faces numGuests = _window_guest_list_groups_num_guests[i]; for (j = 0; j < 56 && j < numGuests; j++) gfx_draw_sprite(dpi, _window_guest_list_groups_guest_faces[i * 56 + j] + SPR_PEEP_SMALL_FACE_VERY_VERY_UNHAPPY, j * 8, y + 12, 0); // Draw action set_format_arg(0, uint32, _window_guest_list_groups_argument_1[i]); set_format_arg(4, uint32, _window_guest_list_groups_argument_2[i]); set_format_arg(10, uint32, numGuests); gfx_draw_string_left_clipped(dpi, format, gCommonFormatArgs, COLOUR_BLACK, 0, y, 414); // Draw guest count set_format_arg(8, rct_string_id, STR_GUESTS_COUNT_COMMA_SEP); gfx_draw_string_right(dpi, format, gCommonFormatArgs + 8, COLOUR_BLACK, 326, y); } y += SUMMARISED_GUEST_ROW_HEIGHT; } break; }
static void window_multiplayer_players_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, sint32 scrollIndex) { sint32 y; y = 0; for (sint32 i = 0; i < network_get_num_players(); i++) { if (y > dpi->y + dpi->height) { break; } if (y + 11 >= dpi->y) { char buffer[300]; // Draw player name char* lineCh = buffer; sint32 colour = COLOUR_BLACK; if (i == w->selected_list_item) { gfx_filter_rect(dpi, 0, y, 800, y + 9, PALETTE_DARKEN_1); safe_strcpy(buffer, network_get_player_name(i), sizeof(buffer)); colour = w->colours[2]; } else { if (network_get_player_flags(i) & NETWORK_PLAYER_FLAG_ISSERVER) { lineCh = utf8_write_codepoint(lineCh, FORMAT_BABYBLUE); } else { lineCh = utf8_write_codepoint(lineCh, FORMAT_BLACK); } safe_strcpy(lineCh, network_get_player_name(i), sizeof(buffer) - (lineCh - buffer)); } gfx_clip_string(buffer, 230); gfx_draw_string(dpi, buffer, colour, 0, y - 1); // Draw group name lineCh = buffer; sint32 group = network_get_group_index(network_get_player_group(i)); if (group != -1) { lineCh = utf8_write_codepoint(lineCh, FORMAT_BLACK); safe_strcpy(lineCh, network_get_group_name(group), sizeof(buffer) - (lineCh - buffer)); gfx_clip_string(buffer, 80); gfx_draw_string(dpi, buffer, colour, 173, y - 1); } // Draw last action sint32 action = network_get_player_last_action(i, 2000); set_format_arg(0, rct_string_id, STR_ACTION_NA); if (action != -999) { set_format_arg(0, rct_string_id, network_get_action_name_string_id(action)); } gfx_draw_string_left_clipped(dpi, STR_BLACK_STRING, gCommonFormatArgs, COLOUR_BLACK, 256, y - 1, 100); // Draw ping lineCh = buffer; sint32 ping = network_get_player_ping(i); if (ping <= 100) { lineCh = utf8_write_codepoint(lineCh, FORMAT_GREEN); } else if (ping <= 250) { lineCh = utf8_write_codepoint(lineCh, FORMAT_YELLOW); } else { lineCh = utf8_write_codepoint(lineCh, FORMAT_RED); } snprintf(lineCh, sizeof(buffer) - (lineCh - buffer), "%d ms", ping); gfx_draw_string(dpi, buffer, colour, 356, y - 1); } y += 10; } }
/** * * rct2: 0x0066E4EE */ static void window_news_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, sint32 scrollIndex) { sint32 lineHeight = font_get_line_height(gCurrentFontSpriteBase); sint32 itemHeight = window_news_get_item_height(); sint32 i, x, y, yy, press; y = 0; for (i = 11; i < 61; i++) { NewsItem * const newsItem = news_item_get(i); if (news_item_is_empty(i)) break; if (y >= dpi->y + dpi->height) break; if (y + itemHeight < dpi->y) { y += itemHeight; continue; } // Background gfx_fill_rect_inset(dpi, -1, y, 383, y + itemHeight - 1, w->colours[1], (INSET_RECT_FLAG_BORDER_INSET | INSET_RECT_FLAG_FILL_GREY)); // Date text set_format_arg(0, rct_string_id, DateDayNames[newsItem->Day - 1]); set_format_arg(2, rct_string_id, DateGameMonthNames[date_get_month(newsItem->MonthYear)]); gfx_draw_string_left(dpi, STR_NEWS_DATE_FORMAT, gCommonFormatArgs, COLOUR_WHITE, 2, y); // Item text utf8 *text = newsItem->Text; gfx_draw_string_left_wrapped(dpi, &text, 2, y + lineHeight, 325, STR_BOTTOM_TOOLBAR_NEWS_TEXT, COLOUR_BRIGHT_GREEN); // Subject button if ((news_type_properties[newsItem->Type] & NEWS_TYPE_HAS_SUBJECT) && !(newsItem->Flags & NEWS_FLAG_HAS_BUTTON)) { x = 328; yy = y + lineHeight + 4; press = 0; if (w->news.var_480 != -1) { const uint8 idx = 11 + w->news.var_480; news_item_is_valid_idx(idx); if (i == idx && w->news.var_482 == 1) press = INSET_RECT_FLAG_BORDER_INSET; } gfx_fill_rect_inset(dpi, x, yy, x + 23, yy + 23, w->colours[2], press); switch (newsItem->Type) { case NEWS_ITEM_RIDE: gfx_draw_sprite(dpi, SPR_RIDE, x, yy, 0); break; case NEWS_ITEM_PEEP: case NEWS_ITEM_PEEP_ON_RIDE: { rct_drawpixelinfo cliped_dpi; if (!clip_drawpixelinfo(&cliped_dpi, dpi, x + 1, yy + 1, 22, 22)) { break; } rct_peep* peep = GET_PEEP(newsItem->Assoc); sint32 clip_x = 10, clip_y = 19; // If normal peep set sprite to normal (no food) // If staff set sprite to staff sprite sint32 sprite_type = 0; if (peep->type == PEEP_TYPE_STAFF){ sprite_type = peep->sprite_type; if (peep->staff_type == STAFF_TYPE_ENTERTAINER){ clip_y += 3; } } uint32 image_id = g_peep_animation_entries[sprite_type].sprite_animation->base_image; image_id += 0xA0000001; image_id |= (peep->tshirt_colour << 19) | (peep->trousers_colour << 24); gfx_draw_sprite(&cliped_dpi, image_id, clip_x, clip_y, 0); break; } case NEWS_ITEM_MONEY: gfx_draw_sprite(dpi, SPR_FINANCE, x, yy, 0); break; case NEWS_ITEM_RESEARCH: gfx_draw_sprite(dpi, newsItem->Assoc < 0x10000 ? SPR_NEW_SCENERY : SPR_NEW_RIDE, x, yy, 0); break; case NEWS_ITEM_PEEPS: gfx_draw_sprite(dpi, SPR_GUESTS, x, yy, 0); break; case NEWS_ITEM_AWARD: gfx_draw_sprite(dpi, SPR_AWARD, x, yy, 0); break; case NEWS_ITEM_GRAPH: gfx_draw_sprite(dpi, SPR_GRAPH, x, yy, 0); break; } } // Location button if ((news_type_properties[newsItem->Type] & NEWS_TYPE_HAS_LOCATION) && !(newsItem->Flags & NEWS_FLAG_HAS_BUTTON)) { x = 352; yy = y + lineHeight + 4; press = 0; if (w->news.var_480 != -1) { const uint8 idx = 11 + w->news.var_480; news_item_is_valid_idx(idx); if (i == idx && w->news.var_482 == 2) press = 0x20; } gfx_fill_rect_inset(dpi, x, yy, x + 23, yy + 23, w->colours[2], press); gfx_draw_sprite(dpi, SPR_LOCATE, x, yy, 0); } y += itemHeight; } }
/** * * rct2: 0x006848D4 */ void research_finish_item(rct_research_item* researchItem) { gResearchLastItem = *researchItem; research_invalidate_related_windows(); if (researchItem->type == RESEARCH_ENTRY_TYPE_RIDE) { // Ride uint32_t base_ride_type = researchItem->baseRideType; int32_t rideEntryIndex = researchItem->entryIndex; rct_ride_entry* rideEntry = get_ride_entry(rideEntryIndex); if (rideEntry != nullptr && base_ride_type != RIDE_TYPE_NULL) { bool ride_group_was_invented_before = false; bool ride_type_was_invented_before = ride_type_is_invented(base_ride_type); rct_string_id availabilityString; // Determine if the ride group this entry belongs to was invented before. if (RideGroupManager::RideTypeHasRideGroups(base_ride_type)) { const RideGroup* rideGroup = RideGroupManager::GetRideGroup(base_ride_type, rideEntry); if (rideGroup->IsInvented()) { ride_group_was_invented_before = true; } } ride_type_set_invented(base_ride_type); openrct2_assert( base_ride_type < std::size(RideTypePossibleTrackConfigurations), "Invalid base_ride_type = %d", base_ride_type); ride_entry_set_invented(rideEntryIndex); bool seenRideEntry[MAX_RIDE_OBJECTS]{}; rct_research_item* researchItem2 = gResearchItems; for (; researchItem2->rawValue != RESEARCHED_ITEMS_END; researchItem2++) { if (researchItem2->rawValue != RESEARCHED_ITEMS_SEPARATOR && researchItem2->type == RESEARCH_ENTRY_TYPE_RIDE) { uint8_t index = researchItem2->entryIndex; seenRideEntry[index] = true; } } // RCT2 made non-separated vehicles available at once, by removing all but one from research. // To ensure old files keep working, look for ride entries not in research, and make them available as well. for (int32_t i = 0; i < MAX_RIDE_OBJECTS; i++) { if (!seenRideEntry[i]) { rct_ride_entry* rideEntry2 = get_ride_entry(i); if (rideEntry2 != nullptr) { for (uint8_t j = 0; j < MAX_RIDE_TYPES_PER_RIDE_ENTRY; j++) { if (rideEntry2->ride_type[j] == base_ride_type) { ride_entry_set_invented(i); break; } } } } } // If a vehicle should be listed separately (maze, mini golf, flat rides, shops) if (RideGroupManager::RideTypeIsIndependent(base_ride_type)) { availabilityString = STR_NEWS_ITEM_RESEARCH_NEW_RIDE_AVAILABLE; set_format_arg(0, rct_string_id, rideEntry->naming.name); } // If a vehicle is the first to be invented for its ride group, show the ride group name. else if ( !ride_type_was_invented_before || (RideGroupManager::RideTypeHasRideGroups(base_ride_type) && !ride_group_was_invented_before)) { rct_ride_name naming = get_ride_naming(base_ride_type, rideEntry); availabilityString = STR_NEWS_ITEM_RESEARCH_NEW_RIDE_AVAILABLE; set_format_arg(0, rct_string_id, naming.name); } // If the vehicle should not be listed separately and it isn't the first to be invented for its ride group, // report it as a new vehicle for the existing ride group. else { availabilityString = STR_NEWS_ITEM_RESEARCH_NEW_VEHICLE_AVAILABLE; rct_ride_name baseRideNaming = get_ride_naming(base_ride_type, rideEntry); set_format_arg(0, rct_string_id, baseRideNaming.name); set_format_arg(2, rct_string_id, rideEntry->naming.name); } if (!gSilentResearch) { if (gConfigNotifications.ride_researched) { news_item_add_to_queue(NEWS_ITEM_RESEARCH, availabilityString, researchItem->rawValue); } } research_invalidate_related_windows(); } } else { // Scenery rct_scenery_group_entry* sceneryGroupEntry = get_scenery_group_entry(researchItem->entryIndex); if (sceneryGroupEntry != nullptr) { scenery_group_set_invented(researchItem->entryIndex); set_format_arg(0, rct_string_id, sceneryGroupEntry->name); if (!gSilentResearch) { if (gConfigNotifications.ride_researched) { news_item_add_to_queue( NEWS_ITEM_RESEARCH, STR_NEWS_ITEM_RESEARCH_NEW_SCENERY_SET_AVAILABLE, researchItem->rawValue); } } research_invalidate_related_windows(); init_scenery(); } } }
void window_themes_tooltip(rct_window* w, rct_widgetindex widgetIndex, rct_string_id *stringId) { set_format_arg(0, rct_string_id, STR_LIST); }
/** * * rct2: 0x006CFD6C */ static void window_track_list_tooltip(rct_window* w, rct_widgetindex widgetIndex, rct_string_id *stringId) { set_format_arg(0, rct_string_id, STR_LIST); }
static void window_title_editor_scrollpaint_commands(rct_window * w, rct_drawpixelinfo * dpi) { sint32 position = -1; if (title_is_previewing_sequence() && _selectedTitleSequence == title_get_current_sequence()) { ITitleSequencePlayer * player = window_title_editor_get_player(); position = title_sequence_player_get_current_position(player); } sint32 x = 0; sint32 y = 0; for (sint32 i = 0; i < (sint32)_editingTitleSequence->NumCommands; i++, y += SCROLLABLE_ROW_HEIGHT) { TitleCommand * command = &_editingTitleSequence->Commands[i]; bool selected = false; bool hover = false; bool error = false; if (i == w->selected_list_item) { selected = true; gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + SCROLLABLE_ROW_HEIGHT - 1, ColourMapA[w->colours[1]].dark); } else if (i == (sint32)_window_title_editor_highlighted_index || i == position) { hover = true; gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + SCROLLABLE_ROW_HEIGHT - 1, ColourMapA[w->colours[1]].mid_dark); } else if (i & 1) { gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + SCROLLABLE_ROW_HEIGHT - 1, ColourMapA[w->colours[1]].lighter | 0x1000000); } rct_string_id commandName = STR_NONE; switch (command->Type) { case TITLE_SCRIPT_LOAD: commandName = STR_TITLE_EDITOR_COMMAND_LOAD_FILE; if (command->SaveIndex == SAVE_INDEX_INVALID) { commandName = STR_TITLE_EDITOR_COMMAND_LOAD_NO_SAVE; error = true; } else { set_format_arg(0, uintptr_t, _editingTitleSequence->Saves[command->SaveIndex]); } break; case TITLE_SCRIPT_LOADMM: commandName = STR_TITLE_EDITOR_COMMAND_LOAD_SFMM; break; case TITLE_SCRIPT_LOCATION: commandName = STR_TITLE_EDITOR_COMMAND_LOCATION; set_format_arg(0, uint16, command->X); set_format_arg(2, uint16, command->Y); break; case TITLE_SCRIPT_ROTATE: commandName = STR_TITLE_EDITOR_COMMAND_ROTATE; set_format_arg(0, uint16, command->Rotations); break; case TITLE_SCRIPT_ZOOM: commandName = STR_TITLE_EDITOR_COMMAND_ZOOM; set_format_arg(0, uint16, command->Zoom); break; case TITLE_SCRIPT_SPEED: commandName = STR_TITLE_EDITOR_COMMAND_SPEED; set_format_arg(0, rct_string_id, SpeedNames[command->Speed - 1]); break; case TITLE_SCRIPT_FOLLOW: commandName = STR_TITLE_EDITOR_COMMAND_FOLLOW; if (command->SpriteIndex == SPRITE_INDEX_NULL) { commandName = STR_TITLE_EDITOR_COMMAND_FOLLOW_NO_SPRITE; } else { set_format_arg(0, uintptr_t, (uintptr_t)command->SpriteName); } break; case TITLE_SCRIPT_WAIT: commandName = STR_TITLE_EDITOR_COMMAND_WAIT; set_format_arg(0, uint16, command->Milliseconds); break; case TITLE_SCRIPT_RESTART: commandName = STR_TITLE_EDITOR_RESTART; break; case TITLE_SCRIPT_END: commandName = STR_TITLE_EDITOR_END; break; case TITLE_SCRIPT_LOADRCT1: { commandName = STR_TITLE_EDITOR_COMMAND_LOAD_FILE; const char * name = ""; source_desc desc; if (scenario_get_source_desc_by_id(command->SaveIndex, &desc)) { name = desc.title; } set_format_arg(0, uintptr_t, name); break; } case TITLE_SCRIPT_LOADSC: { commandName = STR_TITLE_EDITOR_COMMAND_LOAD_FILE; const char * name = ""; auto scenario = GetScenarioRepository()->GetByInternalName(command->Scenario); if (command->Scenario[0] == '\0') { commandName = STR_TITLE_EDITOR_COMMAND_LOAD_NO_SCENARIO; } else if (scenario != nullptr) { name = scenario->name; } else { commandName = STR_TITLE_EDITOR_COMMAND_LOAD_MISSING_SCENARIO; } set_format_arg(0, uintptr_t, name); break; } default: log_warning("Unknown command %d", command->Type); } char buffer[256]; if ((selected || hover) && !error) { format_string(buffer, 256, commandName, gCommonFormatArgs); } else { format_string(buffer + 1, 255, commandName, gCommonFormatArgs); buffer[0] = (utf8)(error ? ((selected || hover) ? FORMAT_LIGHTPINK : FORMAT_RED) : FORMAT_BLACK); } set_format_arg(0, uintptr_t, &buffer); gfx_draw_string_left(dpi, STR_STRING, gCommonFormatArgs, w->colours[1], x + 5, y); } }
/** * * 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); } }
/** * * rct2: 0x0066508C, 0x00665540 */ static void ride_entrance_exit_paint(paint_session* session, uint8_t direction, int32_t height, const TileElement* tile_element) { uint8_t is_exit = tile_element->AsEntrance()->GetEntranceType() == ENTRANCE_TYPE_RIDE_EXIT; if (gTrackDesignSaveMode || (session->ViewFlags & VIEWPORT_FLAG_HIGHLIGHT_PATH_ISSUES)) { if (tile_element->AsEntrance()->GetRideIndex() != gTrackDesignSaveRideIndex) return; } #ifdef __ENABLE_LIGHTFX__ if (lightfx_is_available()) { if (!is_exit) { lightfx_add_3d_light_magic_from_drawing_tile(session->MapPosition, 0, 0, height + 45, LIGHTFX_LIGHT_TYPE_LANTERN_3); } switch (tile_element->GetDirection()) { case 0: lightfx_add_3d_light_magic_from_drawing_tile( session->MapPosition, 16, 0, height + 16, LIGHTFX_LIGHT_TYPE_LANTERN_2); break; case 1: lightfx_add_3d_light_magic_from_drawing_tile( session->MapPosition, 0, -16, height + 16, LIGHTFX_LIGHT_TYPE_LANTERN_2); break; case 2: lightfx_add_3d_light_magic_from_drawing_tile( session->MapPosition, -16, 0, height + 16, LIGHTFX_LIGHT_TYPE_LANTERN_2); break; case 3: lightfx_add_3d_light_magic_from_drawing_tile( session->MapPosition, 0, 16, height + 16, LIGHTFX_LIGHT_TYPE_LANTERN_2); break; }; } #endif Ride* ride = get_ride(tile_element->AsEntrance()->GetRideIndex()); auto stationObj = ride_get_station_object(ride); if (stationObj == nullptr || stationObj->BaseImageId == 0) { return; } uint8_t colour_1, colour_2; uint32_t transparant_image_id = 0, image_id = 0; if (stationObj->Flags & STATION_OBJECT_FLAGS::IS_TRANSPARENT) { colour_1 = GlassPaletteIds[ride->track_colour[0].main]; transparant_image_id = (colour_1 << 19) | IMAGE_TYPE_TRANSPARENT; } colour_1 = ride->track_colour[0].main; colour_2 = ride->track_colour[0].additional; image_id = (colour_1 << 19) | (colour_2 << 24) | IMAGE_TYPE_REMAP | IMAGE_TYPE_REMAP_2_PLUS; session->InteractionType = VIEWPORT_INTERACTION_ITEM_RIDE; _unk9E32BC = 0; if (tile_element->IsGhost()) { session->InteractionType = VIEWPORT_INTERACTION_ITEM_NONE; image_id = CONSTRUCTION_MARKER; _unk9E32BC = image_id; if (transparant_image_id) transparant_image_id = image_id; } if (is_exit) { image_id |= stationObj->BaseImageId + direction + 8; } else { image_id |= stationObj->BaseImageId + direction; } // Format modified to stop repeated code // Each entrance is split into 2 images for drawing // Certain entrance styles have another 2 images to draw for coloured windows int8_t ah = is_exit ? 0x23 : 0x33; int16_t lengthY = (direction & 1) ? 28 : 2; int16_t lengthX = (direction & 1) ? 2 : 28; sub_98197C(session, image_id, 0, 0, lengthX, lengthY, ah, height, 2, 2, height); if (transparant_image_id) { if (is_exit) { transparant_image_id |= stationObj->BaseImageId + direction + 24; } else { transparant_image_id |= stationObj->BaseImageId + direction + 16; } sub_98199C(session, transparant_image_id, 0, 0, lengthX, lengthY, ah, height, 2, 2, height); } image_id += 4; sub_98197C( session, image_id, 0, 0, lengthX, lengthY, ah, height, (direction & 1) ? 28 : 2, (direction & 1) ? 2 : 28, height); if (transparant_image_id) { transparant_image_id += 4; sub_98199C( session, transparant_image_id, 0, 0, lengthX, lengthY, ah, height, (direction & 1) ? 28 : 2, (direction & 1) ? 2 : 28, height); } if (direction & 1) { paint_util_push_tunnel_right(session, height, TUNNEL_6); } else { paint_util_push_tunnel_left(session, height, TUNNEL_6); } if (!is_exit && !(tile_element->IsGhost()) && tile_element->AsEntrance()->GetRideIndex() != RIDE_ID_NULL && stationObj->ScrollingMode != SCROLLING_MODE_NONE) { set_format_arg(0, uint32_t, 0); set_format_arg(4, uint32_t, 0); rct_string_id string_id = STR_RIDE_ENTRANCE_CLOSED; if (ride->status == RIDE_STATUS_OPEN && !(ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN)) { set_format_arg(0, rct_string_id, ride->name); set_format_arg(2, uint32_t, ride->name_arguments); string_id = STR_RIDE_ENTRANCE_NAME; } utf8 entrance_string[256]; if (gConfigGeneral.upper_case_banners) { format_string_to_upper(entrance_string, sizeof(entrance_string), string_id, gCommonFormatArgs); } else { format_string(entrance_string, sizeof(entrance_string), string_id, gCommonFormatArgs); } gCurrentFontSpriteBase = FONT_SPRITE_BASE_TINY; uint16_t string_width = gfx_get_string_width(entrance_string); uint16_t scroll = (gCurrentTicks / 2) % string_width; sub_98199C( session, scrolling_text_setup(session, string_id, scroll, stationObj->ScrollingMode), 0, 0, 0x1C, 0x1C, 0x33, height + stationObj->Height, 2, 2, height + stationObj->Height); } image_id = _unk9E32BC; if (image_id == 0) { image_id = SPRITE_ID_PALETTE_COLOUR_1(COLOUR_SATURATED_BROWN); } wooden_a_supports_paint_setup(session, direction & 1, 0, height, image_id, nullptr); paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0); height += is_exit ? 40 : 56; paint_util_set_general_support_height(session, height, 0x20); }
static void window_scenarioselect_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex) { int colour; uint8 paletteIndex = ColourMapA[w->colours[1]].mid_light; gfx_clear(dpi, paletteIndex); rct_string_id highlighted_format = (theme_get_flags() & UITHEME_FLAG_USE_ALTERNATIVE_SCENARIO_SELECT_FONT) ? STR_WHITE_STRING : STR_WINDOW_COLOUR_2_STRINGID; rct_string_id unhighlighted_format = (theme_get_flags() & UITHEME_FLAG_USE_ALTERNATIVE_SCENARIO_SELECT_FONT) ? STR_WHITE_STRING : STR_BLACK_STRING; bool wide = gConfigGeneral.scenario_select_mode == SCENARIO_SELECT_MODE_ORIGIN; rct_widget *listWidget = &w->widgets[WIDX_SCENARIOLIST]; int listWidth = listWidget->right - listWidget->left - 12; int y = 0; for (sc_list_item *listItem = _listItems; listItem->type != LIST_ITEM_TYPE_END; listItem++) { if (y > dpi->y + dpi->height) { continue; } switch (listItem->type) { case LIST_ITEM_TYPE_HEADING:; const int horizontalRuleMargin = 4; draw_category_heading(w, dpi, horizontalRuleMargin, listWidth - horizontalRuleMargin, y + 2, listItem->heading.string_id); y += 18; break; case LIST_ITEM_TYPE_SCENARIO:; // Draw hover highlight const scenario_index_entry *scenario = listItem->scenario.scenario; bool isHighlighted = w->highlighted_scenario == scenario; if (isHighlighted) { gfx_filter_rect(dpi, 0, y, w->width, y + 23, PALETTE_DARKEN_1); } bool isCompleted = scenario->highscore != NULL; bool isDisabled = listItem->scenario.is_locked; // Draw scenario name char buffer[64]; safe_strcpy(buffer, scenario->name, sizeof(buffer)); rct_string_id format = isDisabled ? STR_STRINGID : (isHighlighted ? highlighted_format : unhighlighted_format); set_format_arg(0, rct_string_id, STR_STRING); set_format_arg(2, char *, buffer); colour = isDisabled ? w->colours[1] | COLOUR_FLAG_INSET : COLOUR_BLACK; if (isDisabled) { gCurrentFontSpriteBase = FONT_SPRITE_BASE_MEDIUM_DARK; } gfx_draw_string_centred(dpi, format, wide ? 270 : 210, y + 1, colour, gCommonFormatArgs); // Check if scenario is completed if (isCompleted) { // Draw completion tick gfx_draw_sprite(dpi, SPR_MENU_CHECKMARK, wide ? 500 : 395, y + 1, 0); // Draw completion score const utf8 *completedByName = "???"; if (!str_is_null_or_empty(scenario->highscore->name)) { completedByName = scenario->highscore->name; } safe_strcpy(buffer, completedByName, 64); set_format_arg(0, rct_string_id, STR_COMPLETED_BY); set_format_arg(2, rct_string_id, STR_STRING); set_format_arg(4, char *, buffer); gfx_draw_string_centred(dpi, format, wide ? 270 : 210, y + 11, COLOUR_BLACK, gCommonFormatArgs); } y += 24; break; } } }
static void window_scenarioselect_paint(rct_window *w, rct_drawpixelinfo *dpi) { int i, x, y, format; rct_widget *widget; const scenario_index_entry *scenario; window_draw_widgets(w, dpi); format = (theme_get_flags() & UITHEME_FLAG_USE_ALTERNATIVE_SCENARIO_SELECT_FONT) ? STR_SMALL_WINDOW_COLOUR_2_STRINGID : STR_WINDOW_COLOUR_2_STRINGID; // Text for each tab for (i = 0; i < 8; i++) { widget = &window_scenarioselect_widgets[WIDX_TAB1 + i]; if (widget->type == WWT_EMPTY) continue; x = (widget->left + widget->right) / 2 + w->x; y = (widget->top + widget->bottom) / 2 + w->y - 3; if (gConfigGeneral.scenario_select_mode == SCENARIO_SELECT_MODE_ORIGIN) { set_format_arg(0, rct_string_id, ScenarioOriginStringIds[i]); } else { // old-style set_format_arg(0, rct_string_id, ScenarioCategoryStringIds[i]); } gfx_draw_string_centred_wrapped(dpi, gCommonFormatArgs, x, y, 87, format, COLOUR_AQUAMARINE); } // Return if no scenario highlighted scenario = w->highlighted_scenario; if (scenario == NULL) { if (_showLockedInformation) { // Show locked information x = w->x + window_scenarioselect_widgets[WIDX_SCENARIOLIST].right + 4; y = w->y + window_scenarioselect_widgets[WIDX_TABCONTENT].top + 5; gfx_draw_string_centred_clipped(dpi, STR_SCENARIO_LOCKED, NULL, COLOUR_BLACK, x + 85, y, 170); y += 15; y += gfx_draw_string_left_wrapped(dpi, NULL, x, y, 170, STR_SCENARIO_LOCKED_DESC, COLOUR_BLACK) + 5; } return; } // Scenario path if (gConfigGeneral.debugging_tools) { utf8 path[MAX_PATH]; gCurrentFontSpriteBase = FONT_SPRITE_BASE_MEDIUM; shorten_path(path, sizeof(path), scenario->path, w->width - 6); const utf8 *pathPtr = path; gfx_draw_string_left(dpi, STR_STRING, (void*)&pathPtr, w->colours[1], w->x + 3, w->y + w->height - 3 - 11); } // Scenario name x = w->x + window_scenarioselect_widgets[WIDX_SCENARIOLIST].right + 4; y = w->y + window_scenarioselect_widgets[WIDX_TABCONTENT].top + 5; set_format_arg(0, rct_string_id, STR_STRING); set_format_arg(2, const char *, scenario->name); gfx_draw_string_centred_clipped(dpi, STR_WINDOW_COLOUR_2_STRINGID, gCommonFormatArgs, COLOUR_BLACK, x + 85, y, 170); y += 15; // Scenario details set_format_arg(0, rct_string_id, STR_STRING); set_format_arg(2, const char *, scenario->details); y += gfx_draw_string_left_wrapped(dpi, gCommonFormatArgs, x, y, 170, STR_BLACK_STRING, COLOUR_BLACK) + 5; // Scenario objective set_format_arg(0, rct_string_id, ObjectiveNames[scenario->objective_type]); set_format_arg(2, short, scenario->objective_arg_3); set_format_arg(4, short, date_get_total_months(MONTH_OCTOBER, scenario->objective_arg_1)); set_format_arg(6, int, scenario->objective_arg_2); y += gfx_draw_string_left_wrapped(dpi, gCommonFormatArgs, x, y, 170, STR_OBJECTIVE, COLOUR_BLACK) + 5; // Scenario score if (scenario->highscore != NULL) { // TODO: Should probably be translateable const utf8 *completedByName = "???"; if (!str_is_null_or_empty(scenario->highscore->name)) { completedByName = scenario->highscore->name; } set_format_arg(0, rct_string_id, STR_STRING); set_format_arg(2, const char *, completedByName); set_format_arg(2 + sizeof(const char *), money32, scenario->highscore->company_value); y += gfx_draw_string_left_wrapped(dpi, gCommonFormatArgs, x, y, 170, STR_COMPLETED_BY_WITH_COMPANY_VALUE, COLOUR_BLACK); } }
static void window_title_editor_tooltip(rct_window * w, rct_widgetindex widgetIndex, rct_string_id * stringId) { set_format_arg(0, rct_string_id, STR_LIST); }
/** * * rct2: 0x006B6BBF */ static void window_new_ride_tooltip(rct_window* w, int widgetIndex, rct_string_id *stringId) { set_format_arg(0, rct_string_id, STR_LIST); }
/** * * rct2: 0x006658ED */ static void park_entrance_paint(paint_session* session, uint8_t direction, int32_t height, const TileElement* tile_element) { if (gTrackDesignSaveMode || (session->ViewFlags & VIEWPORT_FLAG_HIGHLIGHT_PATH_ISSUES)) return; #ifdef __ENABLE_LIGHTFX__ if (lightfx_is_available()) { lightfx_add_3d_light_magic_from_drawing_tile(session->MapPosition, 0, 0, 155, LIGHTFX_LIGHT_TYPE_LANTERN_3); } #endif session->InteractionType = VIEWPORT_INTERACTION_ITEM_PARK; _unk9E32BC = 0; uint32_t image_id, ghost_id = 0; if (tile_element->IsGhost()) { session->InteractionType = VIEWPORT_INTERACTION_ITEM_NONE; ghost_id = CONSTRUCTION_MARKER; _unk9E32BC = ghost_id; } // Index to which part of the entrance // Middle, left, right uint8_t part_index = tile_element->AsEntrance()->GetSequenceIndex(); PathSurfaceEntry* path_entry = nullptr; // The left and right of the park entrance often have this set to 127. // So only attempt to get the footpath type if we're dealing with the middle bit of the entrance. if (part_index == 0) path_entry = get_path_surface_entry(tile_element->AsEntrance()->GetPathType()); rct_entrance_type* entrance; uint8_t di = ((direction / 2 + part_index / 2) & 1) ? 0x1A : 0x20; switch (part_index) { case 0: if (path_entry != nullptr) { image_id = (path_entry->image + 5 * (1 + (direction & 1))) | ghost_id; sub_98197C(session, image_id, 0, 0, 32, 0x1C, 0, height, 0, 2, height); } entrance = (rct_entrance_type*)object_entry_get_chunk(OBJECT_TYPE_PARK_ENTRANCE, 0); if (entrance == nullptr) { return; } image_id = (entrance->image_id + direction * 3) | ghost_id; sub_98197C(session, image_id, 0, 0, 0x1C, 0x1C, 0x2F, height, 2, 2, height + 32); if ((direction + 1) & (1 << 1)) break; if (ghost_id != 0) break; { rct_string_id park_text_id = STR_BANNER_TEXT_CLOSED; set_format_arg(0, uint32_t, 0); set_format_arg(4, uint32_t, 0); if (gParkFlags & PARK_FLAGS_PARK_OPEN) { set_format_arg(0, rct_string_id, gParkName); set_format_arg(2, uint32_t, gParkNameArgs); park_text_id = STR_BANNER_TEXT_FORMAT; } utf8 park_name[256]; if (gConfigGeneral.upper_case_banners) { format_string_to_upper(park_name, sizeof(park_name), park_text_id, gCommonFormatArgs); } else { format_string(park_name, sizeof(park_name), park_text_id, gCommonFormatArgs); } gCurrentFontSpriteBase = FONT_SPRITE_BASE_TINY; uint16_t string_width = gfx_get_string_width(park_name); uint16_t scroll = (gCurrentTicks / 2) % string_width; if (entrance->scrolling_mode == SCROLLING_MODE_NONE) break; int32_t stsetup = scrolling_text_setup(session, park_text_id, scroll, entrance->scrolling_mode + direction / 2); int32_t text_height = height + entrance->text_height; sub_98199C(session, stsetup, 0, 0, 0x1C, 0x1C, 0x2F, text_height, 2, 2, text_height); } break; case 1: case 2: entrance = (rct_entrance_type*)object_entry_get_chunk(OBJECT_TYPE_PARK_ENTRANCE, 0); if (entrance == nullptr) { return; } image_id = (entrance->image_id + part_index + direction * 3) | ghost_id; sub_98197C(session, image_id, 0, 0, 0x1A, di, 0x4F, height, 3, 3, height); break; } image_id = ghost_id; if (image_id == 0) { image_id = SPRITE_ID_PALETTE_COLOUR_1(COLOUR_SATURATED_BROWN); } wooden_a_supports_paint_setup(session, direction & 1, 0, height, image_id, nullptr); paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0); paint_util_set_general_support_height(session, height + 80, 0x20); }