mirror of https://github.com/OpenRCT2/OpenRCT2.git
fix placing and saving of mazes
This commit is contained in:
parent
52ab86fdcf
commit
7564d0e5a6
|
@ -243,13 +243,14 @@ static rct_track_td6 *track_design_open_from_buffer(uint8 *src, size_t srcLength
|
||||||
|
|
||||||
// Set the element helper pointers
|
// Set the element helper pointers
|
||||||
uintptr_t entranceElementsStart;
|
uintptr_t entranceElementsStart;
|
||||||
|
uintptr_t sceneryElementsStart;
|
||||||
if (td6->type == RIDE_TYPE_MAZE) {
|
if (td6->type == RIDE_TYPE_MAZE) {
|
||||||
td6->track_elements = NULL;
|
td6->track_elements = NULL;
|
||||||
td6->maze_elements = (rct_td6_maze_element*)td6->elements;
|
td6->maze_elements = (rct_td6_maze_element*)td6->elements;
|
||||||
|
|
||||||
rct_td6_maze_element *maze = td6->maze_elements;
|
rct_td6_maze_element *maze = td6->maze_elements;
|
||||||
for (; maze->all != 0; maze++) { }
|
for (; maze->all != 0; maze++) { }
|
||||||
entranceElementsStart = (uintptr_t)(++maze);
|
sceneryElementsStart = (uintptr_t)(++maze);
|
||||||
} else {
|
} else {
|
||||||
td6->maze_elements = NULL;
|
td6->maze_elements = NULL;
|
||||||
td6->track_elements = (rct_td6_track_element*)td6->elements;
|
td6->track_elements = (rct_td6_track_element*)td6->elements;
|
||||||
|
@ -257,13 +258,12 @@ static rct_track_td6 *track_design_open_from_buffer(uint8 *src, size_t srcLength
|
||||||
rct_td6_track_element *track = td6->track_elements;
|
rct_td6_track_element *track = td6->track_elements;
|
||||||
for (; track->type != 0xFF; track++) { }
|
for (; track->type != 0xFF; track++) { }
|
||||||
entranceElementsStart = (uintptr_t)track + 1;
|
entranceElementsStart = (uintptr_t)track + 1;
|
||||||
}
|
|
||||||
|
|
||||||
uintptr_t sceneryElementsStart;
|
rct_td6_entrance_element *entranceElement = (rct_td6_entrance_element*)entranceElementsStart;
|
||||||
rct_td6_entrance_element *entranceElement = (rct_td6_entrance_element*)entranceElementsStart;
|
td6->entrance_elements = entranceElement;
|
||||||
td6->entrance_elements = entranceElement;
|
for (; entranceElement->z != -1; entranceElement++) { }
|
||||||
for (; entranceElement->z != -1; entranceElement++) { }
|
sceneryElementsStart = (uintptr_t)entranceElement + 1;
|
||||||
sceneryElementsStart = (uintptr_t)entranceElement + 1;
|
}
|
||||||
|
|
||||||
rct_td6_scenery_element *sceneryElement = (rct_td6_scenery_element*)sceneryElementsStart;
|
rct_td6_scenery_element *sceneryElement = (rct_td6_scenery_element*)sceneryElementsStart;
|
||||||
td6->scenery_elements = sceneryElement;
|
td6->scenery_elements = sceneryElement;
|
||||||
|
@ -884,6 +884,7 @@ int track_design_place_maze(rct_track_td6 *td6, sint16 x, sint16 y, sint16 z, ui
|
||||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) = _currentTrackPieceDirection;
|
RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_DIRECTION, uint8) = _currentTrackPieceDirection;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
word_F440D5 = 0;
|
||||||
dword_F440D5 = 0;
|
dword_F440D5 = 0;
|
||||||
|
|
||||||
rct_td6_maze_element *maze = td6->maze_elements;
|
rct_td6_maze_element *maze = td6->maze_elements;
|
||||||
|
|
|
@ -688,7 +688,7 @@ static bool track_design_save_copy_scenery_to_td6(rct_track_td6 *td6)
|
||||||
|
|
||||||
sint16 x = ((uint8)scenery->x) * 32 - gTrackPreviewOrigin.x;
|
sint16 x = ((uint8)scenery->x) * 32 - gTrackPreviewOrigin.x;
|
||||||
sint16 y = ((uint8)scenery->y) * 32 - gTrackPreviewOrigin.y;
|
sint16 y = ((uint8)scenery->y) * 32 - gTrackPreviewOrigin.y;
|
||||||
rotate_map_coordinates(&x, &y, _trackSaveDirection ^ 2);
|
rotate_map_coordinates(&x, &y, (0 - _trackSaveDirection) & 3);
|
||||||
x /= 32;
|
x /= 32;
|
||||||
y /= 32;
|
y /= 32;
|
||||||
|
|
||||||
|
@ -851,7 +851,7 @@ static bool track_design_save_to_td6_for_maze(uint8 rideIndex, rct_track_td6 *td
|
||||||
maze++;
|
maze++;
|
||||||
numMazeElements++;
|
numMazeElements++;
|
||||||
|
|
||||||
if (maze >= RCT2_ADDRESS(0x009DA151, rct_td6_maze_element)) {
|
if (numMazeElements >= 2000) {
|
||||||
gGameCommandErrorText = STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY;
|
gGameCommandErrorText = STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY;
|
||||||
SafeFree(td6->maze_elements);
|
SafeFree(td6->maze_elements);
|
||||||
return false;
|
return false;
|
||||||
|
@ -917,8 +917,13 @@ static bool track_design_save_to_td6_for_maze(uint8 rideIndex, rct_track_td6 *td
|
||||||
maze++;
|
maze++;
|
||||||
numMazeElements++;
|
numMazeElements++;
|
||||||
|
|
||||||
td6->maze_elements = realloc(td6->maze_elements, numMazeElements * sizeof(rct_td6_maze_element) + 1);
|
// Write end marker
|
||||||
*((uint8*)&td6->maze_elements[numMazeElements]) = 0xFF;
|
maze->all = 0;
|
||||||
|
maze++;
|
||||||
|
numMazeElements++;
|
||||||
|
|
||||||
|
// Trim memory
|
||||||
|
td6->maze_elements = realloc(td6->maze_elements, numMazeElements * sizeof(rct_td6_maze_element));
|
||||||
|
|
||||||
// Save global vars as they are still used by scenery
|
// Save global vars as they are still used by scenery
|
||||||
sint16 startZ = gTrackPreviewOrigin.z;
|
sint16 startZ = gTrackPreviewOrigin.z;
|
||||||
|
@ -1243,6 +1248,7 @@ static void auto_buffer_write(auto_buffer *buffer, const void *src, size_t len)
|
||||||
*/
|
*/
|
||||||
static bool track_design_save_to_file(rct_track_td6 *td6, utf8 *path)
|
static bool track_design_save_to_file(rct_track_td6 *td6, utf8 *path)
|
||||||
{
|
{
|
||||||
|
const rct_td6_maze_element EndMarkerForMaze = { 0 };
|
||||||
const uint8 EndMarker = 0xFF;
|
const uint8 EndMarker = 0xFF;
|
||||||
|
|
||||||
window_close_construction_windows();
|
window_close_construction_windows();
|
||||||
|
@ -1252,17 +1258,15 @@ static bool track_design_save_to_file(rct_track_td6 *td6, utf8 *path)
|
||||||
auto_buffer_write(&td6Buffer, td6, 0xA3);
|
auto_buffer_write(&td6Buffer, td6, 0xA3);
|
||||||
if (td6->type == RIDE_TYPE_MAZE) {
|
if (td6->type == RIDE_TYPE_MAZE) {
|
||||||
auto_buffer_write(&td6Buffer, td6->maze_elements, track_design_get_maze_elements_count(td6) * sizeof(rct_td6_maze_element));
|
auto_buffer_write(&td6Buffer, td6->maze_elements, track_design_get_maze_elements_count(td6) * sizeof(rct_td6_maze_element));
|
||||||
auto_buffer_write(&td6Buffer, &EndMarker, sizeof(EndMarker));
|
auto_buffer_write(&td6Buffer, &EndMarkerForMaze, sizeof(EndMarkerForMaze));
|
||||||
auto_buffer_write(&td6Buffer, &EndMarker, sizeof(EndMarker));
|
|
||||||
auto_buffer_write(&td6Buffer, &EndMarker, sizeof(EndMarker));
|
|
||||||
} else {
|
} else {
|
||||||
auto_buffer_write(&td6Buffer, td6->track_elements, track_design_get_track_elements_count(td6) * sizeof(rct_td6_track_element));
|
auto_buffer_write(&td6Buffer, td6->track_elements, track_design_get_track_elements_count(td6) * sizeof(rct_td6_track_element));
|
||||||
auto_buffer_write(&td6Buffer, &EndMarker, sizeof(EndMarker));
|
auto_buffer_write(&td6Buffer, &EndMarker, sizeof(EndMarker));
|
||||||
auto_buffer_write(&td6Buffer, td6->entrance_elements, track_design_get_entrance_elements_count(td6) * sizeof(rct_td6_entrance_element));
|
auto_buffer_write(&td6Buffer, td6->entrance_elements, track_design_get_entrance_elements_count(td6) * sizeof(rct_td6_entrance_element));
|
||||||
auto_buffer_write(&td6Buffer, &EndMarker, sizeof(EndMarker));
|
auto_buffer_write(&td6Buffer, &EndMarker, sizeof(EndMarker));
|
||||||
auto_buffer_write(&td6Buffer, td6->scenery_elements, track_design_get_scenery_elements_count(td6) * sizeof(rct_td6_scenery_element));
|
|
||||||
auto_buffer_write(&td6Buffer, &EndMarker, sizeof(EndMarker));
|
|
||||||
}
|
}
|
||||||
|
auto_buffer_write(&td6Buffer, td6->scenery_elements, track_design_get_scenery_elements_count(td6) * sizeof(rct_td6_scenery_element));
|
||||||
|
auto_buffer_write(&td6Buffer, &EndMarker, sizeof(EndMarker));
|
||||||
|
|
||||||
// Encode TD6 data
|
// Encode TD6 data
|
||||||
uint8 *encodedData = malloc(0x8000);
|
uint8 *encodedData = malloc(0x8000);
|
||||||
|
|
Loading…
Reference in New Issue