diff --git a/src/ride/track_design.c b/src/ride/track_design.c index 8adc913eac..43feeb7d04 100644 --- a/src/ride/track_design.c +++ b/src/ride/track_design.c @@ -35,6 +35,7 @@ uint8 gTrackDesignPlaceFlags; bool gTrackDesignSceneryToggle; rct_xyz16 gTrackPreviewMin; rct_xyz16 gTrackPreviewMax; +rct_xyz16 gTrackPreviewOrigin; uint8 byte_F4414E; static uint8 byte_F440D4; @@ -999,18 +1000,13 @@ int track_place_maze(rct_track_td6 *td6, sint16 x, sint16 y, sint16 z, uint8 rid game_do_command(0, 0x69, 0, rideIndex, GAME_COMMAND_DEMOLISH_RIDE, 0, 0); } - RCT2_GLOBAL(0x00F44142, sint16) = x; - RCT2_GLOBAL(0x00F44144, sint16) = y; - RCT2_GLOBAL(0x00F44146, sint16) = z; + gTrackPreviewOrigin = (rct_xyz16) { x, y, z }; return 1; } int track_place_ride(rct_track_td6 *td6, sint16 x, sint16 y, sint16 z, uint8 rideIndex) { - RCT2_GLOBAL(0x00F44142, sint16) = x; - RCT2_GLOBAL(0x00F44144, sint16) = y; - RCT2_GLOBAL(0x00F44146, sint16) = z; - + gTrackPreviewOrigin = (rct_xyz16) { x, y, z }; if (byte_F440D4== 0) { gMapSelectionTiles->x = -1; RCT2_GLOBAL(RCT2_ADDRESS_MAP_ARROW_X, sint16) = x; @@ -1143,8 +1139,8 @@ int track_place_ride(rct_track_td6 *td6, sint16 x, sint16 y, sint16 z, uint8 rid x = entrance->x; y = entrance->y; rotate_map_coordinates(&x, &y, rotation); - x += RCT2_GLOBAL(0x00F44142, sint16); - y += RCT2_GLOBAL(0x00F44144, sint16); + x += gTrackPreviewOrigin.x; + y += gTrackPreviewOrigin.y; track_design_update_max_min_coordinates(x, y, z); @@ -1169,7 +1165,7 @@ int track_place_ride(rct_track_td6 *td6, sint16 x, sint16 y, sint16 z, uint8 rid y + TileDirectionDelta[rotation].y }; rct_map_element* map_element = map_get_first_element_at(tile.x >> 5, tile.y >> 5); - z = RCT2_GLOBAL(0x00F44146, sint16) / 8; + z = gTrackPreviewOrigin.z / 8; z += (entrance->z == (sint8)0x80) ? -1 : entrance->z; do { @@ -1197,7 +1193,7 @@ int track_place_ride(rct_track_td6 *td6, sint16 x, sint16 y, sint16 z, uint8 rid //dl z = (entrance->z == (sint8)0x80) ? -1 : entrance->z; z *= 8; - z += RCT2_GLOBAL(0x00F44146, sint16); + z += gTrackPreviewOrigin.z; z >>= 4; gGameCommandErrorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; @@ -1271,9 +1267,10 @@ int sub_6D01B3(rct_track_td6 *td6, uint8 bl, uint8 rideIndex, int x, int y, int if (!track_place_scenery( scenery, rideIndex, - RCT2_GLOBAL(0x00F44142, sint16), - RCT2_GLOBAL(0x00F44144, sint16), - RCT2_GLOBAL(0x00F44146, sint16))){ + gTrackPreviewOrigin.x, + gTrackPreviewOrigin.y, + gTrackPreviewOrigin.z + )) { return RCT2_GLOBAL(0x00F440D5, money32); } } diff --git a/src/ride/track_design.h b/src/ride/track_design.h index e2ced2b25a..23167ef6da 100644 --- a/src/ride/track_design.h +++ b/src/ride/track_design.h @@ -160,6 +160,7 @@ extern uint8 gTrackDesignPlaceFlags; extern bool gTrackDesignSceneryToggle; extern rct_xyz16 gTrackPreviewMin; extern rct_xyz16 gTrackPreviewMax; +extern rct_xyz16 gTrackPreviewOrigin; extern uint8 byte_F4414E; diff --git a/src/ride/track_design_save.c b/src/ride/track_design_save.c index 66b6d7578a..ed403dc3db 100644 --- a/src/ride/track_design_save.c +++ b/src/ride/track_design_save.c @@ -687,8 +687,8 @@ static bool track_design_save_copy_scenery_to_td6(rct_track_td6 *td6) } } - sint16 x = ((uint8)scenery->x) * 32 - RCT2_GLOBAL(0x00F44142, sint16); - sint16 y = ((uint8)scenery->y) * 32 - RCT2_GLOBAL(0x00F44144, sint16); + sint16 x = ((uint8)scenery->x) * 32 - gTrackPreviewOrigin.x; + sint16 y = ((uint8)scenery->y) * 32 - gTrackPreviewOrigin.y; rotate_map_coordinates(&x, &y, RCT2_GLOBAL(0x00F4414D, uint8) ^ 2); x /= 32; y /= 32; @@ -702,7 +702,7 @@ static bool track_design_save_copy_scenery_to_td6(rct_track_td6 *td6) scenery->x = (sint8)x; scenery->y = (sint8)y; - int z = scenery->z * 8 - RCT2_GLOBAL(0xF44146, sint16); + int z = scenery->z * 8 - gTrackPreviewOrigin.z; z /= 8; if (z > 127 || z < -126) { window_error_open(3346, STR_TRACK_TOO_LARGE_OR_TOO_MUCH_SCENERY); @@ -830,9 +830,7 @@ static bool track_design_save_to_td6_for_maze(uint8 rideIndex, rct_track_td6 *td return false; } - RCT2_GLOBAL(0x00F44142, sint16) = startX; - RCT2_GLOBAL(0x00F44144, sint16) = startY; - RCT2_GLOBAL(0x00F44146, sint16) = mapElement->base_height * 8; + gTrackPreviewOrigin = (rct_xyz16) { startX, startY, mapElement->base_height * 8 }; size_t numMazeElements = 0; td6->maze_elements = calloc(8192, sizeof(rct_td6_maze_element)); @@ -924,11 +922,9 @@ static bool track_design_save_to_td6_for_maze(uint8 rideIndex, rct_track_td6 *td *((uint8*)&td6->maze_elements[numMazeElements]) = 0xFF; // Save global vars as they are still used by scenery - sint16 start_z = RCT2_GLOBAL(0x00F44146, sint16); + sint16 startZ = gTrackPreviewOrigin.z; sub_6D01B3(td6, PTD_OPERATION_DRAW_OUTLINES, 0, 4096, 4096, 0); - RCT2_GLOBAL(0x00F44142, sint16) = startX; - RCT2_GLOBAL(0x00F44144, sint16) = startY; - RCT2_GLOBAL(0x00F44146, sint16) = start_z; + gTrackPreviewOrigin = (rct_xyz16) { startX, startY, startZ }; RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, sint16) &= 0xFFF9; RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, sint16) &= 0xFFF7; @@ -991,9 +987,7 @@ static bool track_design_save_to_td6_for_tracked_ride(uint8 rideIndex, rct_track sint16 start_x = trackElement.x; sint16 start_y = trackElement.y; sint16 start_z = z + trackCoordinates->z_begin; - RCT2_GLOBAL(0x00F44142, sint16) = start_x; - RCT2_GLOBAL(0x00F44144, sint16) = start_y; - RCT2_GLOBAL(0x00F44146, sint16) = start_z; + gTrackPreviewOrigin = (rct_xyz16) { start_x, start_y, start_z }; size_t numTrackElements = 0; td6->track_elements = calloc(8192, sizeof(rct_td6_track_element)); @@ -1130,15 +1124,15 @@ static bool track_design_save_to_td6_for_tracked_ride(uint8 rideIndex, rct_track entrance_direction &= MAP_ELEMENT_DIRECTION_MASK; entrance->direction = entrance_direction; - x -= RCT2_GLOBAL(0x00F44142, sint16); - y -= RCT2_GLOBAL(0x00F44144, sint16); + x -= gTrackPreviewOrigin.x; + y -= gTrackPreviewOrigin.y; rotate_map_coordinates(&x, &y, RCT2_GLOBAL(0x00F4414D, uint8) ^ 2); entrance->x = x; entrance->y = y; z *= 8; - z -= RCT2_GLOBAL(0x00F44146, sint16); + z -= gTrackPreviewOrigin.z; z /= 8; if (z > 127 || z < -126) { @@ -1166,9 +1160,7 @@ static bool track_design_save_to_td6_for_tracked_ride(uint8 rideIndex, rct_track sub_6D01B3(td6, PTD_OPERATION_DRAW_OUTLINES, 0, 4096, 4096, 0); // Resave global vars for scenery reasons. - RCT2_GLOBAL(0x00F44142, sint16) = start_x; - RCT2_GLOBAL(0x00F44144, sint16) = start_y; - RCT2_GLOBAL(0x00F44146, sint16) = start_z; + gTrackPreviewOrigin = (rct_xyz16) { start_x, start_y, start_z }; RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, sint16) &= 0xFFF9; RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, sint16) &= 0xFFF7;