Refactor track_design_save.c to C++

This commit is contained in:
Ted John 2018-01-18 22:04:09 +00:00
parent d09134e64a
commit 6a8cce710c
1 changed files with 20 additions and 14 deletions

View File

@ -14,6 +14,7 @@
*****************************************************************************/
#pragma endregion
#include <algorithm>
#include "../audio/audio.h"
#include "../config/Config.h"
#include "../Context.h"
@ -39,6 +40,9 @@
#define TRACK_NEARBY_SCENERY_DISTANCE 1
#define TRACK_TD6_MAX_ELEMENTS 8192
extern "C"
{
bool gTrackDesignSaveMode = false;
uint8 gTrackDesignSaveRideIndex = 255;
@ -632,7 +636,7 @@ static bool track_design_save_copy_scenery_to_td6(rct_track_td6 *td6)
{
// Copy TD6 scenery elements to new memory and add end marker
size_t totalSceneryElementsSize = _trackSavedTileElementsDescCount * sizeof(rct_td6_scenery_element);
td6->scenery_elements = malloc(totalSceneryElementsSize + 1);
td6->scenery_elements = (rct_td6_scenery_element *)malloc(totalSceneryElementsSize + 1);
memcpy(td6->scenery_elements, _trackSavedTileElementsDesc, totalSceneryElementsSize);
*((uint8*)&td6->scenery_elements[_trackSavedTileElementsDescCount]) = 0xFF;
@ -715,7 +719,7 @@ static bool track_design_save_copy_scenery_to_td6(rct_track_td6 *td6)
*/
static rct_track_td6 *track_design_save_to_td6(uint8 rideIndex)
{
rct_track_td6 *td6 = calloc(1, sizeof(rct_track_td6));
rct_track_td6 *td6 = (rct_track_td6 *)calloc(1, sizeof(rct_track_td6));
Ride *ride = get_ride(rideIndex);
td6->type = ride->type;
rct_object_entry_extended *object = &object_entry_groups[OBJECT_TYPE_RIDE].entries[ride->subtype];
@ -825,10 +829,10 @@ static bool track_design_save_to_td6_for_maze(uint8 rideIndex, rct_track_td6 *td
return false;
}
gTrackPreviewOrigin = (LocationXYZ16) { startX, startY, tileElement->base_height * 8 };
gTrackPreviewOrigin = (LocationXYZ16) { startX, startY, (sint16)(tileElement->base_height * 8) };
size_t numMazeElements = 0;
td6->maze_elements = calloc(8192, sizeof(rct_td6_maze_element));
td6->maze_elements = (rct_td6_maze_element *)calloc(8192, sizeof(rct_td6_maze_element));
rct_td6_maze_element *maze = td6->maze_elements;
// x is defined here as we can start the search
@ -919,7 +923,7 @@ static bool track_design_save_to_td6_for_maze(uint8 rideIndex, rct_track_td6 *td
numMazeElements++;
// Trim memory
td6->maze_elements = realloc(td6->maze_elements, numMazeElements * sizeof(rct_td6_maze_element));
td6->maze_elements = (rct_td6_maze_element *)realloc(td6->maze_elements, numMazeElements * sizeof(rct_td6_maze_element));
// Save global vars as they are still used by scenery
sint16 startZ = gTrackPreviewOrigin.z;
@ -957,9 +961,9 @@ static bool track_design_save_to_td6_for_tracked_ride(uint8 rideIndex, rct_track
rct_tile_element* initial_map = trackElement.element;
do {
rct_xy_element lastGood = {
.element = trackBeginEnd.begin_element,
.x = trackBeginEnd.begin_x,
.y = trackBeginEnd.begin_y
/* .x = */ trackBeginEnd.begin_x,
/* .y = */ trackBeginEnd.begin_y,
/* .element = */ trackBeginEnd.begin_element
};
if (!track_block_get_previous(trackBeginEnd.end_x, trackBeginEnd.end_y, trackBeginEnd.begin_element, &trackBeginEnd)) {
@ -991,7 +995,7 @@ static bool track_design_save_to_td6_for_tracked_ride(uint8 rideIndex, rct_track
gTrackPreviewOrigin = (LocationXYZ16) { start_x, start_y, start_z };
size_t numTrackElements = 0;
td6->track_elements = calloc(TRACK_TD6_MAX_ELEMENTS, sizeof(rct_td6_track_element));
td6->track_elements = (rct_td6_track_element *)calloc(TRACK_TD6_MAX_ELEMENTS, sizeof(rct_td6_track_element));
rct_td6_track_element *track = td6->track_elements;
do {
track->type = track_element_get_type(trackElement.element);
@ -1045,11 +1049,11 @@ static bool track_design_save_to_td6_for_tracked_ride(uint8 rideIndex, rct_track
}
while (trackElement.element != initialMap);
td6->track_elements = realloc(td6->track_elements, numTrackElements * sizeof(rct_td6_track_element) + 1);
td6->track_elements = (rct_td6_track_element *)realloc(td6->track_elements, numTrackElements * sizeof(rct_td6_track_element) + 1);
*((uint8*)&td6->track_elements[numTrackElements]) = 0xFF;
size_t numEntranceElements = 0;
td6->entrance_elements = calloc(32, sizeof(rct_td6_entrance_element));
td6->entrance_elements = (rct_td6_entrance_element *)calloc(32, sizeof(rct_td6_entrance_element));
rct_td6_entrance_element *entrance = td6->entrance_elements;
// First entrances, second exits
@ -1114,7 +1118,7 @@ static bool track_design_save_to_td6_for_tracked_ride(uint8 rideIndex, rct_track
numEntranceElements++;
}
}
td6->entrance_elements = realloc(td6->entrance_elements, numEntranceElements * sizeof(rct_td6_entrance_element) + 1);
td6->entrance_elements = (rct_td6_entrance_element *)realloc(td6->entrance_elements, numEntranceElements * sizeof(rct_td6_entrance_element) + 1);
*((uint8*)&td6->entrance_elements[numEntranceElements]) = 0xFF;
place_virtual_track(td6, PTD_OPERATION_DRAW_OUTLINES, true, 0, 4096, 4096, 0);
@ -1188,7 +1192,7 @@ static void auto_buffer_write(auto_buffer *buffer, const void *src, size_t len)
size_t remainingSpace = buffer->capacity - buffer->length;
if (remainingSpace < len) {
do {
buffer->capacity = max(8, buffer->capacity * 2);
buffer->capacity = std::max<size_t>(8, buffer->capacity * 2);
remainingSpace = buffer->capacity - buffer->length;
} while (remainingSpace < len);
@ -1227,7 +1231,7 @@ bool track_design_save_to_file(const utf8 *path)
auto_buffer_write(&td6Buffer, &EndMarker, sizeof(EndMarker));
// Encode TD6 data
uint8 *encodedData = malloc(0x8000);
uint8 *encodedData = (uint8 *)malloc(0x8000);
assert(td6Buffer.ptr != NULL);
size_t encodedDataLength = sawyercoding_encode_td6((uint8*)td6Buffer.ptr, encodedData, td6Buffer.length);
@ -1243,3 +1247,5 @@ bool track_design_save_to_file(const utf8 *path)
free(td6Buffer.ptr);
return result;
}
}