From a19e5feadf935bdf99ea6875bf08cf7b6db64ae6 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sun, 1 May 2016 19:41:48 +0100 Subject: [PATCH] fix track design mirror and ride name --- src/editor.c | 2 +- src/ride/track_design.c | 13 ++++++++++++- src/ride/track_design.h | 14 +++++++++----- src/windows/track_list.c | 33 +++++++++++++++++++-------------- src/windows/track_place.c | 18 ++++++++++++------ src/world/map.c | 11 +---------- 6 files changed, 54 insertions(+), 37 deletions(-) diff --git a/src/editor.c b/src/editor.c index 5ccdfd3be5..3931b86f58 100644 --- a/src/editor.c +++ b/src/editor.c @@ -227,7 +227,7 @@ static void set_all_land_owned() { int mapSize = gMapSize; - game_do_command(64, 1, 64, 2, GAME_COMMAND_SET_LAND_OWNERSHIP, (mapSize - 2) * 32, (mapSize - 2) * 32); + game_do_command(64, 1, 64, 2, GAME_COMMAND_SET_LAND_OWNERSHIP, (mapSize - 3) * 32, (mapSize - 3) * 32); } /** diff --git a/src/ride/track_design.c b/src/ride/track_design.c index f2d24a4333..d28e55e180 100644 --- a/src/ride/track_design.c +++ b/src/ride/track_design.c @@ -68,6 +68,8 @@ bool track_design_open(rct_track_td6 *td6, const utf8 *path) } else { track_design_open_from_buffer(td6, decoded, decodedLength); free(decoded); + + td6->name = track_design_get_name_from_path(path); return true; } } @@ -264,6 +266,15 @@ static bool td4_track_has_boosters(rct_track_td6* track_design, uint8* track_ele return false; } +void track_design_dispose(rct_track_td6 *td6) +{ + if (td6 != NULL) { + free(td6->elements); + free(td6->name); + free(td6); + } +} + uint32 *sub_6AB49A(rct_object_entry* entry) { rct_object_entry* object_list_entry = object_list_find(entry); @@ -1559,7 +1570,7 @@ money32 place_track_design(sint16 x, sint16 y, sint16 z, uint8 flags, uint8 *out ride->vehicle_colours_extended[i] = td6->vehicle_additional_colour[i]; } - ride_set_name(rideIndex, RCT2_ADDRESS(0x009E3504, const char)); + ride_set_name(rideIndex, td6->name); gCommandExpenditureType = RCT_EXPENDITURE_TYPE_RIDE_CONSTRUCTION; *outRideIndex = rideIndex; diff --git a/src/ride/track_design.h b/src/ride/track_design.h index 48fa7a8d49..05576f4916 100644 --- a/src/ride/track_design.h +++ b/src/ride/track_design.h @@ -122,6 +122,8 @@ typedef struct { rct_td6_track_element *track_elements; rct_td6_entrance_element *entrance_elements; rct_td6_scenery_element *scenery_elements; + + utf8 *name; } rct_track_td6; typedef struct{ @@ -159,14 +161,11 @@ extern rct_track_td6 *gActiveTrackDesign; extern money32 gTrackDesignCost; extern uint8 gTrackDesignPlaceFlags; -// void track_load_list(ride_list_item item); -// rct_track_design *track_get_info(int index, uint8** preview); rct_track_design *temp_track_get_info(char* path, uint8** preview); -// int track_rename(const char *text); int track_delete(); -void track_design_mirror(); +void track_design_mirror(rct_track_td6 *td6); bool track_design_open(rct_track_td6 *td6, const utf8 *path); -void draw_track_preview(rct_track_td6 *td6, uint8** preview); +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); int install_track(char* source_path, char* dest_name); @@ -179,6 +178,11 @@ utf8 *track_design_get_name_from_path(const utf8 *path); void game_command_place_track_design(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void game_command_place_maze_design(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); +/////////////////////////////////////////////////////////////////////////////// +// Track design preview +/////////////////////////////////////////////////////////////////////////////// +void draw_track_preview(rct_track_td6 *td6, uint8** preview); + /////////////////////////////////////////////////////////////////////////////// // Track design saving /////////////////////////////////////////////////////////////////////////////// diff --git a/src/windows/track_list.c b/src/windows/track_list.c index 32c59d8d91..ad91196d65 100644 --- a/src/windows/track_list.c +++ b/src/windows/track_list.c @@ -97,7 +97,7 @@ ride_list_item _window_track_list_item; static track_design_file_ref *_trackDesigns = NULL; static size_t _trackDesignsCount = 0; static uint16 _loadedTrackDesignIndex; -static rct_track_td6 _loadedTrackDesign; +static rct_track_td6 *_loadedTrackDesign; static uint8 _loadedTrackDesignPreview[4][TRACK_PREVIEW_IMAGE_SIZE]; static void track_list_load_designs(ride_list_item item); @@ -151,8 +151,8 @@ void window_track_list_open(ride_list_item item) */ static void window_track_list_close(rct_window *w) { - // Dispose loaded track - SafeFree(_loadedTrackDesign.elements); + free(_loadedTrackDesign); + _loadedTrackDesign = NULL; // Dispose track list for (size_t i = 0; i < _trackDesignsCount; i++) { @@ -202,7 +202,7 @@ static void window_track_list_select(rct_window *w, int index) return; } - if (_loadedTrackDesignIndex != -1 && _loadedTrackDesign.track_flags & 4) { + if (_loadedTrackDesignIndex != -1 && (_loadedTrackDesign->track_flags & 4)) { window_error_open(STR_THIS_DESIGN_WILL_BE_BUILT_WITH_AN_ALTERNATIVE_VEHICLE_TYPE, STR_NONE); } @@ -384,7 +384,6 @@ static void window_track_list_paint(rct_window *w, rct_drawpixelinfo *dpi) colour = ColourMapA[w->colours[0]].darkest; gfx_fill_rect(dpi, x, y, x + 369, y + 216, colour); - rct_track_td6 *td6 = &_loadedTrackDesign; if (_loadedTrackDesignIndex != trackIndex) { uint8 *path = _trackDesigns[trackIndex].path; if (track_list_load_design_for_preview(path)) { @@ -395,11 +394,12 @@ static void window_track_list_paint(rct_window *w, rct_drawpixelinfo *dpi) } } + rct_track_td6 *td6 = _loadedTrackDesign; + if (td6 == NULL) { + return; + } + uint8 *image = _loadedTrackDesignPreview[_currentTrackPieceDirection]; - // trackDesign = track_get_info(trackIndex, &image); - // if (trackDesign == NULL) { - // return; - // } rct_g1_element *substituteElement = &g1Elements[0]; rct_g1_element tmpElement = *substituteElement; @@ -617,15 +617,20 @@ static void track_list_load_designs(ride_list_item item) static bool track_list_load_design_for_preview(utf8 *path) { // Dispose currently loaded track - SafeFree(_loadedTrackDesign.elements); + track_design_dispose(_loadedTrackDesign); + _loadedTrackDesign = NULL; - if (track_design_open(&_loadedTrackDesign, path)) { + _loadedTrackDesign = calloc(sizeof(rct_track_td6), 1); + if (track_design_open(_loadedTrackDesign, path)) { // Load in a new preview image, calculate cost variable, calculate var_06 - draw_track_preview(&_loadedTrackDesign, (uint8**)_loadedTrackDesignPreview); + draw_track_preview(_loadedTrackDesign, (uint8**)_loadedTrackDesignPreview); - _loadedTrackDesign.cost = gTrackDesignCost; - _loadedTrackDesign.track_flags = RCT2_GLOBAL(0x00F44151, uint8) & 7; + _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 115b8711c8..6577298368 100644 --- a/src/windows/track_place.c +++ b/src/windows/track_place.c @@ -16,18 +16,19 @@ #include "../addresses.h" #include "../audio/audio.h" +#include "../cheats.h" #include "../game.h" #include "../input.h" +#include "../interface/themes.h" #include "../interface/viewport.h" #include "../interface/widget.h" #include "../interface/window.h" #include "../localisation/localisation.h" -#include "../sprites.h" #include "../ride/track.h" #include "../ride/track_data.h" #include "../ride/track_design.h" -#include "../interface/themes.h" -#include "../cheats.h" +#include "../sprites.h" +#include "../util/util.h" #define TRACK_MINI_PREVIEW_WIDTH 168 #define TRACK_MINI_PREVIEW_HEIGHT 78 @@ -142,7 +143,8 @@ void window_track_place_open(utf8 *tdPath) _trackDesign = malloc(sizeof(rct_track_td6)); if (!track_design_open(_trackDesign, tdPath)) { - SafeFree(_trackDesign); + track_design_dispose(_trackDesign); + _trackDesign = NULL; return; } @@ -169,6 +171,9 @@ void window_track_place_open(utf8 *tdPath) _window_track_place_last_x = 0xFFFF; _currentTrackPieceDirection = (2 - get_current_rotation()) & 3; window_track_place_draw_mini_preview(_trackDesign); + + char *title = (char*)language_get_string(3155); + format_string(title, STR_TRACK_LIST_NAME_FORMAT, &_trackDesign->name); } /** @@ -183,7 +188,8 @@ static void window_track_place_close(rct_window *w) RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~6; hide_gridlines(); SafeFree(_window_track_place_mini_preview); - SafeFree(_trackDesign); + track_design_dispose(_trackDesign); + _trackDesign = NULL; } /** @@ -204,7 +210,7 @@ static void window_track_place_mouseup(rct_window *w, int widgetIndex) window_track_place_draw_mini_preview(_trackDesign); break; case WIDX_MIRROR: - track_design_mirror(); + track_design_mirror(_trackDesign); _currentTrackPieceDirection = (0 - _currentTrackPieceDirection) & 3; window_invalidate(w); _window_track_place_last_x = 0xFFFF; diff --git a/src/world/map.c b/src/world/map.c index 28c0a1c3d5..521beecd52 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -1820,16 +1820,7 @@ money32 map_set_land_ownership(uint8 flags, sint16 x1, sint16 y1, sint16 x2, sin y1 = clamp(0, y1, gMapSizeUnits); x2 = min(x2, gMapSizeUnits); y2 = min(y2, gMapSizeUnits); - for (sint16 y = y1; y <= y2; y += 32) { - for (sint16 x = x1; x <= x2; x += 32) { - if (x > gMapSizeUnits) - continue; - if (y > gMapSizeUnits) - continue; - - map_buy_land_rights(x, y, x2, y2, 6, flags | (newOwnership << 8)); - } - } + map_buy_land_rights(x1, y1, x2, y2, 6, flags | (newOwnership << 8)); if (!(RCT2_GLOBAL(0x9E2E28, uint8) & 1)) { return 0;