mirror of https://github.com/OpenRCT2/OpenRCT2.git
Refactor track_design_save.c to C++
This commit is contained in:
parent
d09134e64a
commit
6a8cce710c
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue