From f4f8801f2b3ec28efa1b09bb42d587174bde06fe Mon Sep 17 00:00:00 2001 From: Ted John Date: Sun, 1 May 2016 22:46:08 +0100 Subject: [PATCH] fix memory issue and add variable for scenery toggle --- src/addresses.h | 3 +-- src/interface/window.h | 2 +- src/ride/track_design.c | 30 +++++++++++++++++------------- src/ride/track_design.h | 3 ++- src/ride/track_design_index.c | 11 +++++------ src/windows/install_track.c | 19 ++++++++++--------- src/windows/track_list.c | 25 +++++++++++-------------- src/windows/track_place.c | 22 ++++++++++------------ 8 files changed, 57 insertions(+), 58 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index 9377fdc0e3..9fad01604c 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -252,8 +252,6 @@ #define RCT2_ADDRESS_TRACK_DESIGN_INDEX_CACHE 0x00F44109 #define RCT2_ADDRESS_TRACK_DESIGN_NEXT_INDEX_CACHE 0x00F44119 -#define RCT2_ADDRESS_TRACK_DESIGN_SCENERY_TOGGLE 0x00F44152 - #define RCT2_ADDRESS_ABOVE_GROUND_FLAGS 0x00F441D4 #define RCT2_ADDRESS_TRACK_LIST 0x00F441EC @@ -602,6 +600,7 @@ #define RCT2_ADDRESS_CONSTRUCT_PATH_VALID_DIRECTIONS 0x00F3EF9E #define RCT2_ADDRESS_TRACK_PREVIEW_ROTATION 0x00F440AE #define RCT2_ADDRESS_TRACK_DESIGN_COST 0x00F4411D +#define RCT2_ADDRESS_TRACK_DESIGN_SCENERY_TOGGLE 0x00F44152 #define RCT2_ADDRESS_NEXT_FREE_MAP_ELEMENT 0x0140E9A4 diff --git a/src/interface/window.h b/src/interface/window.h index 0ec1468778..f43bc69b12 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -628,7 +628,7 @@ void ride_construction_toolupdate_construct(int screenX, int screenY); void ride_construction_tooldown_construct(int screenX, int screenY); void window_maze_construction_update_pressed_widgets(); -void window_track_place_open(utf8 *tdPath); +void window_track_place_open(const track_design_file_ref *tdFileRef); rct_window *window_new_ride_open(); rct_window *window_new_ride_open_research(); void window_install_track_open(const char* path); diff --git a/src/ride/track_design.c b/src/ride/track_design.c index d28e55e180..a614883349 100644 --- a/src/ride/track_design.c +++ b/src/ride/track_design.c @@ -18,12 +18,13 @@ #include "track_design.h" #include "track.h" -static bool track_design_open_from_buffer(rct_track_td6 *td6, uint8 *src, size_t srcLength); +static rct_track_td6 *track_design_open_from_buffer(uint8 *src, size_t srcLength); rct_map_element **gTrackSavedMapElements = (rct_map_element**)0x00F63674; rct_track_td6 *gActiveTrackDesign; money32 gTrackDesignCost; uint8 gTrackDesignPlaceFlags; +bool gTrackDesignSceneryToggle; static bool track_design_preview_backup_map(); static void track_design_preview_restore_map(); @@ -37,7 +38,7 @@ static void copy(void *dst, uint8 **src, int length) *src += length; } -bool track_design_open(rct_track_td6 *td6, const utf8 *path) +rct_track_td6 *track_design_open(const utf8 *path) { SDL_RWops *file = SDL_RWFromFile(path, "rb"); if (file != NULL) { @@ -55,7 +56,7 @@ bool track_design_open(rct_track_td6 *td6, const utf8 *path) if (!sawyercoding_validate_track_checksum(buffer, bufferLength)) { log_error("Track checksum failed."); free(buffer); - return false; + return NULL; } // Decode the track data @@ -66,18 +67,19 @@ bool track_design_open(rct_track_td6 *td6, const utf8 *path) if (decoded == NULL) { log_error("failed to realloc"); } else { - track_design_open_from_buffer(td6, decoded, decodedLength); + rct_track_td6 *td6 = track_design_open_from_buffer(decoded, decodedLength); free(decoded); td6->name = track_design_get_name_from_path(path); - return true; + return td6; } } - return false; + return NULL; } -static bool track_design_open_from_buffer(rct_track_td6 *td6, uint8 *src, size_t srcLength) +static rct_track_td6 *track_design_open_from_buffer(uint8 *src, size_t srcLength) { + rct_track_td6 *td6 = calloc(sizeof(rct_track_td6), 1); uint8 *readPtr = src; // Clear top of track_design as this is not loaded from the td4 files @@ -89,7 +91,8 @@ static bool track_design_open_from_buffer(rct_track_td6 *td6, uint8 *src, size_t uint8 version = td6->version_and_colour_scheme >> 2; if (version > 2) { log_error("Unsupported track design."); - return false; + free(td6); + return NULL; } // In TD6 there are 32 sets of two byte vehicle colour specifiers @@ -110,7 +113,8 @@ static bool track_design_open_from_buffer(rct_track_td6 *td6, uint8 *src, size_t uint8 *elementData = malloc(elementDataLength); if (elementData == NULL) { log_error("Unable to allocate memory for TD6 element data."); - return false; + free(td6); + return NULL; } copy(elementData, &readPtr, elementDataLength); td6->elements = elementData; @@ -162,8 +166,8 @@ static bool track_design_open_from_buffer(rct_track_td6 *td6, uint8 *src, size_t if (td4_track_has_boosters(td6, elementData)) { log_error("Track design contains RCT1 boosters which are not yet supported."); free(td6->elements); - td6->elements = NULL; - return false; + free(td6); + return NULL; } // Convert RCT1 ride type to RCT2 ride type @@ -245,7 +249,7 @@ static bool track_design_open_from_buffer(rct_track_td6 *td6, uint8 *src, size_t rct_td6_scenery_element *sceneryElement = (rct_td6_scenery_element*)sceneryElementsStart; td6->scenery_elements = sceneryElement; - return true; + return td6; } /** @@ -1253,7 +1257,7 @@ int sub_6D01B3(rct_track_td6 *td6, uint8 bl, uint8 rideIndex, int x, int y, int { RCT2_GLOBAL(0x00F4414E, uint8) = bl & 0x80; RCT2_GLOBAL(0x00F440D4, uint8) = bl & 0x7F; - if (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_SCENERY_TOGGLE, uint8) != 0){ + if (gTrackDesignSceneryToggle) { RCT2_GLOBAL(0x00F4414E, uint8) |= 0x80; } _currentRideIndex = rideIndex; diff --git a/src/ride/track_design.h b/src/ride/track_design.h index 05576f4916..5d74f7f66e 100644 --- a/src/ride/track_design.h +++ b/src/ride/track_design.h @@ -160,11 +160,12 @@ extern rct_map_element **gTrackSavedMapElements; extern rct_track_td6 *gActiveTrackDesign; extern money32 gTrackDesignCost; extern uint8 gTrackDesignPlaceFlags; +extern bool gTrackDesignSceneryToggle; rct_track_design *temp_track_get_info(char* path, uint8** preview); int track_delete(); void track_design_mirror(rct_track_td6 *td6); -bool track_design_open(rct_track_td6 *td6, const utf8 *path); +rct_track_td6 *track_design_open(const utf8 *path); void track_design_dispose(rct_track_td6 *td6); int sub_6D01B3(rct_track_td6 *td6, uint8 bl, uint8 rideIndex, int x, int y, int z); diff --git a/src/ride/track_design_index.c b/src/ride/track_design_index.c index db12157800..01316bb4c5 100644 --- a/src/ride/track_design_index.c +++ b/src/ride/track_design_index.c @@ -218,15 +218,14 @@ static void track_design_index_include(const utf8 *directory) static void track_design_add_file(const utf8 *path) { - rct_track_td6 td6; - if (track_design_open(&td6, path)) { + rct_track_td6 *td6 = track_design_open(path); + if (td6 != NULL) { td_index_item tdIndexItem = { 0 }; safe_strcpy(tdIndexItem.path, path, sizeof(tdIndexItem.path)); - memcpy(tdIndexItem.ride_entry, td6.vehicle_object.name, 8); - tdIndexItem.ride_type = td6.type; + memcpy(tdIndexItem.ride_entry, td6->vehicle_object.name, 8); + tdIndexItem.ride_type = td6->type; track_design_add(&tdIndexItem); - - free(td6.elements); + track_design_dispose(td6); } } diff --git a/src/windows/install_track.c b/src/windows/install_track.c index 120352d8b5..a3f29c7ca8 100644 --- a/src/windows/install_track.c +++ b/src/windows/install_track.c @@ -116,7 +116,7 @@ void window_install_track_open(const char* path) return; RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_CACHE, void*) = mem; - RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_SCENERY_TOGGLE, uint8) = 0; + gTrackDesignSceneryToggle = false; _currentTrackPieceDirection = 2; // reset_track_list_cache(); @@ -161,8 +161,9 @@ static void window_install_track_select(rct_window *w, int index) return; } - if (RCT2_GLOBAL(0x00F44153, uint8) != 0) - RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_SCENERY_TOGGLE, uint8) = 1; + if (RCT2_GLOBAL(0x00F44153, uint8) != 0) { + gTrackDesignSceneryToggle = true; + } if (!(gScreenFlags & SCREEN_FLAGS_TRACK_MANAGER)) index--; @@ -229,7 +230,7 @@ static void window_install_track_mouseup(rct_window *w, int widgetIndex) window_invalidate(w); break; case WIDX_TOGGLE_SCENERY: - RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_SCENERY_TOGGLE, uint8) ^= 1; + gTrackDesignSceneryToggle = !gTrackDesignSceneryToggle; // reset_track_list_cache(); window_invalidate(w); break; @@ -261,15 +262,15 @@ static void window_install_track_invalidate(rct_window *w) colour_scheme_update(w); w->pressed_widgets |= 1 << WIDX_TRACK_PREVIEW; - if (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_SCENERY_TOGGLE, uint8) == 0) + if (!gTrackDesignSceneryToggle) { w->pressed_widgets |= (1 << WIDX_TOGGLE_SCENERY); - else + } else { w->pressed_widgets &= ~(1 << WIDX_TOGGLE_SCENERY); + } if (w->track_list.var_482 != 0xFFFF) { w->disabled_widgets &= ~(1 << WIDX_TRACK_PREVIEW); - } - else { + } else { w->disabled_widgets |= (1 << WIDX_TRACK_PREVIEW); } } @@ -326,7 +327,7 @@ static void window_install_track_paint(rct_window *w, rct_drawpixelinfo *dpi) // Warnings if (track_td6->track_flags & 1) { RCT2_GLOBAL(0x00F44153, uint8) = 1; - if (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_SCENERY_TOGGLE, uint8) == 0) { + if (!gTrackDesignSceneryToggle) { // Scenery not available gfx_draw_string_centred_clipped(dpi, STR_DESIGN_INCLUDES_SCENERY_WHICH_IS_UNAVAILABLE, NULL, 0, x, y, 368); y -= 10; diff --git a/src/windows/track_list.c b/src/windows/track_list.c index 4590bba108..9f6a92eee4 100644 --- a/src/windows/track_list.c +++ b/src/windows/track_list.c @@ -140,7 +140,7 @@ void window_track_list_open(ride_list_item item) w->track_list.var_480 = 0xFFFF; w->track_list.var_482 = gScreenFlags & SCREEN_FLAGS_TRACK_MANAGER ? 0 : 1; w->track_list.var_484 = 0; - RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_SCENERY_TOGGLE, uint8) = 0; + gTrackDesignSceneryToggle = false; window_push_others_right(w); _currentTrackPieceDirection = 2; } @@ -182,7 +182,7 @@ static void window_track_list_select(rct_window *w, int index) } if (RCT2_GLOBAL(0x00F44153, uint8) != 0) { - RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_SCENERY_TOGGLE, uint8) = 1; + gTrackDesignSceneryToggle = true; } track_design_file_ref *tdRef = &_trackDesigns[index]; @@ -193,8 +193,7 @@ static void window_track_list_select(rct_window *w, int index) window_error_open(STR_THIS_DESIGN_WILL_BE_BUILT_WITH_AN_ALTERNATIVE_VEHICLE_TYPE, STR_NONE); } - window_close(w); - window_track_place_open(tdRef->path); + window_track_place_open(tdRef); } } @@ -234,7 +233,7 @@ static void window_track_list_mouseup(rct_window *w, int widgetIndex) window_invalidate(w); break; case WIDX_TOGGLE_SCENERY: - RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_SCENERY_TOGGLE, uint8) ^= 1; + gTrackDesignSceneryToggle = !gTrackDesignSceneryToggle; _loadedTrackDesignIndex = -1; window_invalidate(w); break; @@ -335,10 +334,11 @@ static void window_track_list_invalidate(rct_window *w) 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 (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_SCENERY_TOGGLE, uint8) == 0) - w->pressed_widgets |= (1 << WIDX_TOGGLE_SCENERY); - else + 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); @@ -413,7 +413,7 @@ static void window_track_list_paint(rct_window *w, rct_drawpixelinfo *dpi) if (td6->track_flags & 1) { RCT2_GLOBAL(0x00F44153, uint8) = 1; - if (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_DESIGN_SCENERY_TOGGLE, uint8) == 0) { + if (!gTrackDesignSceneryToggle) { // Scenery not available gfx_draw_string_centred_clipped(dpi, STR_DESIGN_INCLUDES_SCENERY_WHICH_IS_UNAVAILABLE, NULL, 0, x, y, 368); y -= 10; @@ -605,17 +605,14 @@ static bool track_list_load_design_for_preview(utf8 *path) track_design_dispose(_loadedTrackDesign); _loadedTrackDesign = NULL; - _loadedTrackDesign = calloc(sizeof(rct_track_td6), 1); - if (track_design_open(_loadedTrackDesign, path)) { + _loadedTrackDesign = track_design_open(path); + if (_loadedTrackDesign != NULL) { // Load in a new preview image, calculate cost variable, calculate var_06 draw_track_preview(_loadedTrackDesign, (uint8**)_loadedTrackDesignPreview); _loadedTrackDesign->cost = gTrackDesignCost; _loadedTrackDesign->track_flags = RCT2_GLOBAL(0x00F44151, uint8) & 7; return true; - } else { - track_design_dispose(_loadedTrackDesign); - _loadedTrackDesign = NULL; } return false; } diff --git a/src/windows/track_place.c b/src/windows/track_place.c index 6577298368..8ab9e97fec 100644 --- a/src/windows/track_place.c +++ b/src/windows/track_place.c @@ -135,23 +135,19 @@ static void window_track_place_clear_mini_preview() * * rct2: 0x006CFCA0 */ -void window_track_place_open(utf8 *tdPath) +void window_track_place_open(const track_design_file_ref *tdFileRef) { - rct_window *w; - - window_close_construction_windows(); - - _trackDesign = malloc(sizeof(rct_track_td6)); - if (!track_design_open(_trackDesign, tdPath)) { - track_design_dispose(_trackDesign); - _trackDesign = NULL; + rct_track_td6 *td6 = track_design_open(tdFileRef->path); + if (td6 == NULL) { return; } + window_close_construction_windows(); + _window_track_place_mini_preview = malloc(TRACK_MINI_PREVIEW_SIZE); window_track_place_clear_mini_preview(); - w = window_create( + rct_window *w = window_create( 0, 29, 200, @@ -170,10 +166,12 @@ void window_track_place_open(utf8 *tdPath) _window_track_place_last_cost = MONEY32_UNDEFINED; _window_track_place_last_x = 0xFFFF; _currentTrackPieceDirection = (2 - get_current_rotation()) & 3; - window_track_place_draw_mini_preview(_trackDesign); + window_track_place_draw_mini_preview(td6); char *title = (char*)language_get_string(3155); - format_string(title, STR_TRACK_LIST_NAME_FORMAT, &_trackDesign->name); + format_string(title, STR_TRACK_LIST_NAME_FORMAT, &td6->name); + + _trackDesign = td6; } /**