fix placing and saving of mazes

This commit is contained in:
Ted John 2016-05-02 23:29:28 +01:00
parent 52ab86fdcf
commit 7564d0e5a6
2 changed files with 21 additions and 16 deletions

View File

@ -243,13 +243,14 @@ static rct_track_td6 *track_design_open_from_buffer(uint8 *src, size_t srcLength
// Set the element helper pointers
uintptr_t entranceElementsStart;
uintptr_t sceneryElementsStart;
if (td6->type == RIDE_TYPE_MAZE) {
td6->track_elements = NULL;
td6->maze_elements = (rct_td6_maze_element*)td6->elements;
rct_td6_maze_element *maze = td6->maze_elements;
for (; maze->all != 0; maze++) { }
entranceElementsStart = (uintptr_t)(++maze);
sceneryElementsStart = (uintptr_t)(++maze);
} else {
td6->maze_elements = NULL;
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;
for (; track->type != 0xFF; track++) { }
entranceElementsStart = (uintptr_t)track + 1;
}
uintptr_t sceneryElementsStart;
rct_td6_entrance_element *entranceElement = (rct_td6_entrance_element*)entranceElementsStart;
td6->entrance_elements = entranceElement;
for (; entranceElement->z != -1; entranceElement++) { }
sceneryElementsStart = (uintptr_t)entranceElement + 1;
rct_td6_entrance_element *entranceElement = (rct_td6_entrance_element*)entranceElementsStart;
td6->entrance_elements = entranceElement;
for (; entranceElement->z != -1; entranceElement++) { }
sceneryElementsStart = (uintptr_t)entranceElement + 1;
}
rct_td6_scenery_element *sceneryElement = (rct_td6_scenery_element*)sceneryElementsStart;
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;
}
word_F440D5 = 0;
dword_F440D5 = 0;
rct_td6_maze_element *maze = td6->maze_elements;

View File

@ -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 y = ((uint8)scenery->y) * 32 - gTrackPreviewOrigin.y;
rotate_map_coordinates(&x, &y, _trackSaveDirection ^ 2);
rotate_map_coordinates(&x, &y, (0 - _trackSaveDirection) & 3);
x /= 32;
y /= 32;
@ -851,7 +851,7 @@ static bool track_design_save_to_td6_for_maze(uint8 rideIndex, rct_track_td6 *td
maze++;
numMazeElements++;
if (maze >= RCT2_ADDRESS(0x009DA151, rct_td6_maze_element)) {
if (numMazeElements >= 2000) {
gGameCommandErrorText = STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY;
SafeFree(td6->maze_elements);
return false;
@ -917,8 +917,13 @@ static bool track_design_save_to_td6_for_maze(uint8 rideIndex, rct_track_td6 *td
maze++;
numMazeElements++;
td6->maze_elements = realloc(td6->maze_elements, numMazeElements * sizeof(rct_td6_maze_element) + 1);
*((uint8*)&td6->maze_elements[numMazeElements]) = 0xFF;
// Write end marker
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
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)
{
const rct_td6_maze_element EndMarkerForMaze = { 0 };
const uint8 EndMarker = 0xFF;
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);
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, &EndMarker, sizeof(EndMarker));
auto_buffer_write(&td6Buffer, &EndMarker, sizeof(EndMarker));
auto_buffer_write(&td6Buffer, &EndMarker, sizeof(EndMarker));
auto_buffer_write(&td6Buffer, &EndMarkerForMaze, sizeof(EndMarkerForMaze));
} else {
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, 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, 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
uint8 *encodedData = malloc(0x8000);