From cfeb039ad2353371c25cc9489811f9e5fdb4317f Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Thu, 2 Apr 2015 22:00:59 +0100 Subject: [PATCH 1/2] Added install_track window --- projects/openrct2.vcxproj | 1 + projects/openrct2.vcxproj.filters | 3 + src/interface/window.h | 5 +- src/ride/track.c | 129 +++++++ src/ride/track.h | 3 + src/windows/editor_object_selection.c | 7 +- src/windows/install_track.c | 492 ++++++++++++++++++++++++++ src/windows/loadsave.c | 29 ++ src/windows/track_list.c | 18 - 9 files changed, 662 insertions(+), 25 deletions(-) create mode 100644 src/windows/install_track.c diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 8568736198..1f3deaaf20 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -94,6 +94,7 @@ + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index e07f978270..68fc0779b8 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -431,6 +431,9 @@ Source + + Source\Windows + diff --git a/src/interface/window.h b/src/interface/window.h index 37e953678d..9a933caa21 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -393,6 +393,7 @@ enum { WC_EDTIOR_OBJECTIVE_OPTIONS = 46, WC_MANAGE_TRACK_DESIGN = 47, WC_TRACK_DELETE_PROMPT = 48, + WC_INSTALL_TRACK = 49, WC_CLEAR_SCENERY = 50, WC_CHEATS = 110, WC_RESEARCH = 111, @@ -425,7 +426,8 @@ enum { LOADSAVETYPE_GAME = 0 << 1, LOADSAVETYPE_LANDSCAPE = 1 << 1, - LOADSAVETYPE_SCENARIO = 2 << 1 + LOADSAVETYPE_SCENARIO = 2 << 1, + LOADSAVETYPE_TRACK = 3 << 1, }; @@ -542,6 +544,7 @@ rct_window * window_construction_open(); void window_track_place_open(); rct_window *window_new_ride_open(); rct_window *window_new_ride_open_research(); +void window_install_track_open(const char* path); void window_banner_open(rct_windownumber number); void window_sign_open(rct_windownumber number); void window_sign_small_open(rct_windownumber number); diff --git a/src/ride/track.c b/src/ride/track.c index 438c4581b3..8eabc9846f 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -1349,3 +1349,132 @@ int save_track_design(uint8 rideIndex){ gfx_invalidate_screen(); return 1; } + +/** +* +* rct2: 0x006D399D +*/ +rct_track_design *temp_track_get_info(char* path, uint8** preview) +{ + rct_track_design *trackDesign; + uint8 *trackDesignList = RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, uint8); + int i; + + trackDesign = NULL; + + // Check if track design has already been loaded + for (i = 0; i < 4; i++) { + if (RCT2_ADDRESS(RCT2_ADDRESS_TRACK_DESIGN_INDEX_CACHE, uint32)[i] == 0) { + trackDesign = &RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_CACHE, rct_track_design*)[i]; + break; + } + } + + if (trackDesign == NULL) { + // Load track design + i = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_NEXT_INDEX_CACHE, uint32)++; + if (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_NEXT_INDEX_CACHE, uint32) >= 4) + RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_NEXT_INDEX_CACHE, uint32) = 0; + + RCT2_ADDRESS(RCT2_ADDRESS_TRACK_DESIGN_INDEX_CACHE, uint32)[i] = 0; + + rct_track_td6* loaded_track = NULL; + + log_verbose("Loading track: %s", path); + + if (!(loaded_track = load_track_design(path))) { + if (preview != NULL) *preview = NULL; + log_error("Failed to load track: %s", path); + return NULL; + } + + trackDesign = &RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_CACHE, rct_track_design*)[i]; + + object_unload_all(); + if (loaded_track->type == RIDE_TYPE_NULL){ + if (preview != NULL) *preview = NULL; + log_error("Failed to load track (ride type null): %s", path); + return NULL; + } + + if (!object_load(0, &loaded_track->vehicle_object, NULL)){ + if (preview != NULL) *preview = NULL; + log_error("Failed to load track (vehicle load fail): %s", path); + return NULL; + } + + // Copy the track design apart from the preview image + memcpy(&trackDesign->track_td6, loaded_track, sizeof(rct_track_td6)); + // Load in a new preview image, calculate cost variable, calculate var_06 + draw_track_preview((uint8**)trackDesign->preview); + //RCT2_CALLPROC_X(0x006D1EF0, 0, 0, 0, 0, 0, (int)&trackDesign->preview, 0); + + trackDesign->track_td6.cost = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_COST, money32); + trackDesign->track_td6.var_06 = RCT2_GLOBAL(0x00F44151, uint8) & 7; + } + + // Set preview to correct preview image based on rotation + if (preview != NULL) + *preview = trackDesign->preview[RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8)]; + + return trackDesign; +} + +void window_track_list_format_name(char *dst, const char *src, char colour, char quotes) +{ + if (colour != 0) + *dst++ = colour; + + if (quotes != 0) + *dst++ = FORMAT_OPENQUOTES; + + while (*src != '.' && *src != 0) { + *dst++ = *src++; + } + + if (quotes != 0) + *dst++ = FORMAT_ENDQUOTES; + + *dst = 0; +} + + +/** +* +* rct2: 0x006D40B2 +* returns 0 for copy fail, 1 for success, 2 for file exists. +*/ +int install_track(char* source_path, char* dest_name){ + + // Make a copy of the track name (no extension) + char track_name[MAX_PATH] = { 0 }; + char* dest = track_name; + char* dest_name_pointer = dest_name; + while (*dest_name_pointer != '.') *dest++ = *dest_name_pointer++; + + // Check if .TD4 file exists under that name + char* temp_extension_pointer = dest; + strcat(track_name, ".TD4"); + + char dest_path[MAX_PATH]; + subsitute_path(dest_path, RCT2_ADDRESS(RCT2_ADDRESS_TRACKS_PATH, char), track_name); + + if (platform_file_exists(dest_path)) + return 2; + + // Allow a concat onto the track_name but before extension + *temp_extension_pointer = '\0'; + + // Check if .TD6 file exists under that name + strcat(track_name, ".TD6"); + + subsitute_path(dest_path, RCT2_ADDRESS(RCT2_ADDRESS_TRACKS_PATH, char), track_name); + + if (platform_file_exists(dest_path)) + return 2; + + // Set path for actual copy + subsitute_path(dest_path, RCT2_ADDRESS(RCT2_ADDRESS_TRACKS_PATH, char), dest_name); + + return platform_file_copy(source_path, dest_path); +} \ No newline at end of file diff --git a/src/ride/track.h b/src/ride/track.h index 3c7528bfa2..29aad1a2dd 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -411,6 +411,7 @@ extern const rct_trackdefinition *gTrackDefinitions; void track_load_list(ride_list_item item); int sub_67726A(const char *path); rct_track_design *track_get_info(int index, uint8** preview); +rct_track_design *temp_track_get_info(char* path, uint8** preview); rct_track_td6* load_track_design(const char *path); int track_rename(const char *text); int track_delete(); @@ -418,5 +419,7 @@ void reset_track_list_cache(); int track_is_connected_by_shape(rct_map_element *a, rct_map_element *b); int sub_6D01B3(int bl, int x, int y, int z); int save_track_design(uint8 rideIndex); +int install_track(char* source_path, char* dest_name); +void window_track_list_format_name(char *dst, const char *src, char colour, char quotes); #endif diff --git a/src/windows/editor_object_selection.c b/src/windows/editor_object_selection.c index 011dd6a7f4..52d17873c5 100644 --- a/src/windows/editor_object_selection.c +++ b/src/windows/editor_object_selection.c @@ -303,12 +303,7 @@ static void window_editor_object_selection_mouseup() } window_invalidate(w); - int eax, ebx, ecx, edx, esi, edi, ebp; - RCT2_CALLFUNC_X(0x00674FCE, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - if (eax == 1) { - window_close(w); - RCT2_CALLPROC_EBPSAFE(0x006D386D); - } + window_loadsave_open(LOADSAVETYPE_LOAD | LOADSAVETYPE_TRACK); break; } } diff --git a/src/windows/install_track.c b/src/windows/install_track.c new file mode 100644 index 0000000000..bac4127704 --- /dev/null +++ b/src/windows/install_track.c @@ -0,0 +1,492 @@ +/***************************************************************************** +* Copyright (c) 2014 Ted John +* OpenRCT2, an open source clone of Roller Coaster Tycoon 2. +* +* This file is part of OpenRCT2. +* +* OpenRCT2 is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. + +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. + +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +*****************************************************************************/ + +#include "../addresses.h" +#include "../audio/audio.h" +#include "../editor.h" +#include "../localisation/localisation.h" +#include "../interface/widget.h" +#include "../interface/window.h" +#include "../ride/ride.h" +#include "../ride/track.h" +#include "../sprites.h" +#include "error.h" + +enum { + WIDX_BACKGROUND, + WIDX_TITLE, + WIDX_CLOSE, + WIDX_TRACK_PREVIEW, + WIDX_ROTATE, + WIDX_TOGGLE_SCENERY, + WIDX_INSTALL, + WIDX_CANCEL +}; + +static rct_widget window_install_track_widgets[] = { + { WWT_FRAME, 0, 0, 401, 0, 399, 0xFFFFFFFF, STR_NONE }, + { WWT_CAPTION, 0, 1, 400, 1, 14, 2309, STR_WINDOW_TITLE_TIP }, + { WWT_CLOSEBOX, 0, 389, 399, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, + { WWT_FLATBTN, 0, 15, 386, 18, 236, 0xFFFFFFFF, STR_NONE }, + { WWT_FLATBTN, 0, 376, 399, 374, 397, 5169, STR_ROTATE_90_TIP }, + { WWT_FLATBTN, 0, 376, 399, 350, 373, 5171, STR_TOGGLE_SCENERY_TIP }, + { WWT_DROPDOWN_BUTTON, 0, 303, 397, 241, 252, 3378, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 0, 303, 397, 256, 267, 3379, STR_NONE }, + { WIDGETS_END }, +}; + +static void window_install_track_emptysub() { } +static void window_install_track_close(); +static void window_install_track_mouseup(); +static void window_install_track_invalidate(); +static void window_install_track_paint(); +static void window_install_track_text_input(); + +static void* window_install_track_events[] = { + (uint32*)window_install_track_close, + (uint32*)window_install_track_mouseup, + (uint32*)window_install_track_emptysub, + (uint32*)window_install_track_emptysub, + (uint32*)window_install_track_emptysub, + (uint32*)window_install_track_emptysub, + (uint32*)window_install_track_emptysub, + (uint32*)window_install_track_emptysub, + (uint32*)window_install_track_emptysub, + (uint32*)window_install_track_emptysub, + (uint32*)window_install_track_emptysub, + (uint32*)window_install_track_emptysub, + (uint32*)window_install_track_emptysub, + (uint32*)window_install_track_emptysub, + (uint32*)window_install_track_emptysub, + (uint32*)window_install_track_emptysub, + (uint32*)window_install_track_emptysub, + (uint32*)window_install_track_emptysub, + (uint32*)window_install_track_emptysub, + (uint32*)window_install_track_text_input, + (uint32*)window_install_track_emptysub, + (uint32*)window_install_track_emptysub, + (uint32*)window_install_track_emptysub, + (uint32*)window_install_track_emptysub, + (uint32*)window_install_track_emptysub, + (uint32*)window_install_track_invalidate, + (uint32*)window_install_track_paint, + (uint32*)window_install_track_emptysub +}; + +ride_list_item _window_install_track_item; + +char track_dest_name[MAX_PATH]; +char track_path[MAX_PATH]; + +/** +* +* rct2: 0x006D386D +*/ +void window_install_track_open(const char* path) +{ + rct_window *w; + int x, y; + void *mem; + + window_close_by_class(WC_EDITOR_OBJECT_SELECTION); + + window_close_construction_windows(); + ride_list_item item = { + .type = 0xFF, + .entry_index = 0 + }; + _window_install_track_item = item; + + mem = malloc(1285292); + if (mem == NULL) + return; + + RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_CACHE, void*) = mem; + RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_SCENERY_TOGGLE, uint8) = 0; + RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) = 2; + reset_track_list_cache(); + + x = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) / 2 - 201; + y = max(28, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) / 2 - 200); + + w = window_create(x, y, 402, 400, (uint32*)window_install_track_events, WC_INSTALL_TRACK, 0); + w->widgets = window_install_track_widgets; + w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_ROTATE) | (1 << WIDX_TOGGLE_SCENERY) | (1 << WIDX_INSTALL) | (1 << WIDX_CANCEL); + window_init_scroll_widgets(w); + w->colours[0] = 26; + w->colours[1] = 26; + w->colours[2] = 26; + w->track_list.var_482 = 0; + w->track_list.var_484 = 0; + window_push_others_right(w); + + memset(track_path, 0, MAX_PATH - 1); + strcpy(track_path, path); + + char* track_name_pointer = track_path; + while (*track_name_pointer++ != '\0'); + while (*--track_name_pointer != '\\'); + track_name_pointer++; + + strcpy(track_dest_name, track_name_pointer); + + window_invalidate(w); +} + +/** +* +* rct2: 0x006CFB82 +*/ +static void window_install_track_select(rct_window *w, int index) +{ + uint8 *trackDesignItem, *trackDesignList = RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, uint8); + rct_track_design *trackDesign; + + w->track_list.var_480 = index; + + sound_play_panned(SOUND_CLICK_1, w->x + (w->width / 2), 0, 0, 0); + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) && index == 0) { + window_close(w); + ride_construct_new(_window_install_track_item); + return; + } + + if (RCT2_GLOBAL(0x00F44153, uint8) != 0) + RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_SCENERY_TOGGLE, uint8) = 1; + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER)) + index--; + + trackDesignItem = trackDesignList + (index * 128); + RCT2_GLOBAL(0x00F4403C, uint8*) = trackDesignItem; + + window_track_list_format_name( + (char*)0x009BC313, + trackDesignItem, + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER ? + 0 : + FORMAT_WHITE, + 1); + + char track_path[MAX_PATH] = { 0 }; + subsitute_path(track_path, (char*)RCT2_ADDRESS_TRACKS_PATH, trackDesignItem); + + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) { + window_track_manage_open(); + return; + } + + if (!load_track_design(track_path)) { + w->track_list.var_480 = 0xFFFF; + window_invalidate(w); + return; + } + + trackDesign = track_get_info(index, NULL); + if (trackDesign == NULL) return; + if (trackDesign->track_td6.var_06 & 4) + window_error_open(STR_THIS_DESIGN_WILL_BE_BUILT_WITH_AN_ALTERNATIVE_VEHICLE_TYPE, -1); + + window_close(w); + window_track_place_open(); +} + +/** +* +* rct2: 0x006D41DC +*/ +static void window_install_track_close() +{ + free(RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_CACHE, void*)); +} + +/** +* +* rct2: 0x006D407A +*/ +static void window_install_track_mouseup() +{ + rct_window *w; + short widgetIndex, result; + + window_widget_get_registers(w, widgetIndex); + + switch (widgetIndex) { + case WIDX_CLOSE: + case WIDX_CANCEL: + window_close(w); + break; + case WIDX_ROTATE: + RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8)++; + RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) %= 4; + window_invalidate(w); + break; + case WIDX_TOGGLE_SCENERY: + RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_SCENERY_TOGGLE, uint8) ^= 1; + reset_track_list_cache(); + window_invalidate(w); + break; + case WIDX_INSTALL: + result = install_track(track_path, track_dest_name); + + if (result == 1) + window_close(w); + else if(result == 0){ + window_error_open(3380, 3382); + window_close(w); + } + else{ + // Copy the track name into the string buffer. + window_track_list_format_name(RCT2_ADDRESS(0x009BC677, char), track_dest_name, 0, 0); + window_text_input_open(w, WIDX_INSTALL, 3383, 3384, 3165, 0, 255); + } + break; + } +} + + +/** +* +* rct2: 0x006D3B06 +*/ +static void window_install_track_invalidate() +{ + rct_window *w; + window_get_register(w); + + w->pressed_widgets |= 1 << WIDX_TRACK_PREVIEW; + if (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_SCENERY_TOGGLE, uint8) == 0) + w->pressed_widgets |= (1 << WIDX_TOGGLE_SCENERY); + else + w->pressed_widgets &= ~(1 << WIDX_TOGGLE_SCENERY); + + if (w->track_list.var_482 != 0xFFFF) { + w->disabled_widgets &= ~(1 << WIDX_TRACK_PREVIEW); + } + else { + w->disabled_widgets |= (1 << WIDX_TRACK_PREVIEW); + } +} + +/** +* +* rct2: 0x006D3B1F +*/ +static void window_install_track_paint() +{ + rct_window *w; + rct_drawpixelinfo *dpi; + rct_widget *widget; + rct_track_design *trackDesign = NULL; + uint8 *image, *trackDesignList = RCT2_ADDRESS(RCT2_ADDRESS_TRACK_LIST, uint8); + uint16 holes, speed, drops, dropHeight, inversions; + fixed32_2dp rating; + int x, y, colour, gForces, airTime; + rct_g1_element tmpElement, *subsituteElement, *g1Elements = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element); + + window_paint_get_registers(w, dpi); + + window_draw_widgets(w, dpi); + + if (w->track_list.var_482 == 0xFFFF) + return; + + // Track preview + widget = &window_install_track_widgets[WIDX_TRACK_PREVIEW]; + x = w->x + widget->left + 1; + y = w->y + widget->top + 1; + colour = RCT2_GLOBAL(0x0141FC44 + (w->colours[0] * 8), uint8); + gfx_fill_rect(dpi, x, y, x + 369, y + 216, colour); + + //call 6d3993 (load track) + trackDesign = temp_track_get_info(track_path, &image); + if (trackDesign == NULL) + return; + + rct_track_td6* track_td6 = &trackDesign->track_td6; + + subsituteElement = &g1Elements[0]; + tmpElement = *subsituteElement; + subsituteElement->offset = image; + subsituteElement->width = 370; + subsituteElement->height = 217; + subsituteElement->x_offset = 0; + subsituteElement->y_offset = 0; + subsituteElement->flags = G1_FLAG_BMP; + gfx_draw_sprite(dpi, 0, x, y, 0); + *subsituteElement = tmpElement; + + x = w->x + (widget->left + widget->right) / 2; + y = w->y + widget->bottom - 12; + + RCT2_GLOBAL(0x00F44153, uint8) = 0; + + // Warnings + if (track_td6->var_06 & 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, (char*)0x009E3504, 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; + // 0x006D3CF1 -- 0x006d3d71 missing + + if (track_td6->var_6C & 0x80000000) { + // Six flags logo + gfx_draw_sprite(dpi, SPR_SIX_FLAGS, w->x + widget->right - 50, y + 4, 0); + } + + // 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(0x013CE952 + 0, uint16) = 1345; + RCT2_GLOBAL(0x013CE952 + 2, uint16) = track_td6->ride_length; + gfx_draw_string_left_clipped(dpi, STR_TRACK_LIST_RIDE_LENGTH, (void*)0x013CE952, 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_negitive_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 (track_td6->var_07 / 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(0x013CE952 + 0, uint16) = track_td6->space_required_x; + RCT2_GLOBAL(0x013CE952 + 2, uint16) = track_td6->space_required_y; + gfx_draw_string_left(dpi, STR_TRACK_LIST_SPACE_REQUIRED, (void*)0x013CE952, 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: 0x006D40A7 +*/ +static void window_install_track_text_input(){ + short widgetIndex; + rct_window *w; + char _cl; + char* new_name; + + window_text_input_get_registers(w, widgetIndex, _cl, new_name); + if (_cl == 0) + { + window_close(w); + return; + } + + if (widgetIndex == WIDX_INSTALL){ + + char* extension_pointer = track_dest_name; + while (*extension_pointer++ != '.'); + --extension_pointer; + strcat(new_name, extension_pointer); + strcpy(track_dest_name, new_name); + window_event_mouse_up_call(w, WIDX_INSTALL); + } +} \ No newline at end of file diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index 8bafaf6606..0ffdb04abd 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -154,6 +154,9 @@ rct_window *window_loadsave_open(int type) case (LOADSAVETYPE_SAVE | LOADSAVETYPE_SCENARIO) : w->widgets[WIDX_TITLE].image = STR_SAVE_SCENARIO; break; + case (LOADSAVETYPE_LOAD | LOADSAVETYPE_TRACK) : + w->widgets[WIDX_TITLE].image = 1039; + break; } w->no_list_items = 0; @@ -200,6 +203,25 @@ rct_window *window_loadsave_open(int type) window_loadsave_populate_list(includeNewItem, TRUE, path, ".sc6"); break; + case LOADSAVETYPE_TRACK: + /* + Uncomment when user tracks are separated + + platform_get_user_directory(path, "tracks"); + if (!platform_ensure_directory_exists(path)) { + fprintf(stderr, "Unable to create tracks directory."); + window_close(w); + return NULL; + } + */ + + strcpy(path, RCT2_ADDRESS(RCT2_ADDRESS_TRACKS_PATH, char)); + ch = strchr(path, '*'); + if (ch != NULL) + *ch = 0; + + window_loadsave_populate_list(includeNewItem, TRUE, path, ".td?"); + break; } w->no_list_items = _listItemsCount; window_init_scroll_widgets(w); @@ -253,6 +275,9 @@ static void window_loadsave_mouseup() case (LOADSAVETYPE_SAVE | LOADSAVETYPE_SCENARIO) : result = platform_open_common_file_dialog(0, (char*)language_get_string(STR_SAVE_SCENARIO), filename, filter, _extension); break; + case (LOADSAVETYPE_LOAD | LOADSAVETYPE_TRACK) : + result = platform_open_common_file_dialog(1, (char*)language_get_string(1039), filename, filter, _extension); + break; } if (result){ if (!hasExtension(filename, _extension)){ @@ -626,6 +651,10 @@ static void window_loadsave_select(rct_window *w, const char *path) } } break; + case (LOADSAVETYPE_LOAD | LOADSAVETYPE_TRACK) : + window_install_track_open(path); + window_close_by_class(WC_LOADSAVE); + break; } } diff --git a/src/windows/track_list.c b/src/windows/track_list.c index 6b72f80970..9267c94fc3 100644 --- a/src/windows/track_list.c +++ b/src/windows/track_list.c @@ -94,24 +94,6 @@ static void* window_track_list_events[] = { ride_list_item _window_track_list_item; -void window_track_list_format_name(char *dst, const char *src, char colour, char quotes) -{ - if (colour != 0) - *dst++ = colour; - - if (quotes != 0) - *dst++ = FORMAT_OPENQUOTES; - - while (*src != '.' && *src != 0) { - *dst++ = *src++; - } - - if (quotes != 0) - *dst++ = FORMAT_ENDQUOTES; - - *dst = 0; -} - /** * * rct2: 0x006CF1A2 From d04bba1ab37fb6224a6c50e14e5faa7a01598e20 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Thu, 2 Apr 2015 22:11:34 +0100 Subject: [PATCH 2/2] Fix travis --- src/windows/install_track.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/windows/install_track.c b/src/windows/install_track.c index bac4127704..7cdb6d7a1e 100644 --- a/src/windows/install_track.c +++ b/src/windows/install_track.c @@ -471,9 +471,9 @@ static void window_install_track_text_input(){ short widgetIndex; rct_window *w; char _cl; - char* new_name; + char* text; - window_text_input_get_registers(w, widgetIndex, _cl, new_name); + window_text_input_get_registers(w, widgetIndex, _cl, text); if (_cl == 0) { window_close(w); @@ -485,8 +485,8 @@ static void window_install_track_text_input(){ char* extension_pointer = track_dest_name; while (*extension_pointer++ != '.'); --extension_pointer; - strcat(new_name, extension_pointer); - strcpy(track_dest_name, new_name); + strcat(text, extension_pointer); + strcpy(track_dest_name, text); window_event_mouse_up_call(w, WIDX_INSTALL); } } \ No newline at end of file