mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-15 19:13:07 +01:00
fix memory issue and add variable for scenery toggle
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user