From 30a51940859bfb23d1c8513ff609ff7e43010b03 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Thu, 28 Mar 2019 18:29:51 +0000 Subject: [PATCH] Use a vector for map selection tiles --- src/openrct2-ui/windows/Footpath.cpp | 6 +- src/openrct2-ui/windows/Map.cpp | 14 +- src/openrct2-ui/windows/RideConstruction.cpp | 33 ++--- src/openrct2-ui/windows/TopToolbar.cpp | 7 +- src/openrct2/paint/VirtualFloor.cpp | 20 +-- .../paint/tile_element/Paint.Surface.cpp | 4 +- src/openrct2/ride/TrackDesign.cpp | 125 ++++++++---------- src/openrct2/world/Map.cpp | 8 +- src/openrct2/world/Map.h | 2 +- 9 files changed, 96 insertions(+), 123 deletions(-) diff --git a/src/openrct2-ui/windows/Footpath.cpp b/src/openrct2-ui/windows/Footpath.cpp index 52de8443fb..eeab5df7c7 100644 --- a/src/openrct2-ui/windows/Footpath.cpp +++ b/src/openrct2-ui/windows/Footpath.cpp @@ -1165,9 +1165,9 @@ static void window_footpath_set_enabled_and_pressed_widgets() gMapSelectFlags |= MAP_SELECT_FLAG_GREEN; int32_t direction = gFootpathConstructDirection; - gMapSelectionTiles[0].x = gFootpathConstructFromPosition.x + CoordsDirectionDelta[direction].x; - gMapSelectionTiles[0].y = gFootpathConstructFromPosition.y + CoordsDirectionDelta[direction].y; - gMapSelectionTiles[1].x = -1; + gMapSelectionTiles.clear(); + gMapSelectionTiles.push_back({ gFootpathConstructFromPosition.x + CoordsDirectionDelta[direction].x, + gFootpathConstructFromPosition.y + CoordsDirectionDelta[direction].y }); map_invalidate_map_selection_tiles(); } diff --git a/src/openrct2-ui/windows/Map.cpp b/src/openrct2-ui/windows/Map.cpp index 66fc7d905d..2e70b6a74f 100644 --- a/src/openrct2-ui/windows/Map.cpp +++ b/src/openrct2-ui/windows/Map.cpp @@ -1235,14 +1235,12 @@ static void window_map_place_park_entrance_tool_update(int32_t x, int32_t y) } sideDirection = (direction + 1) & 3; - gMapSelectionTiles[0].x = mapX; - gMapSelectionTiles[0].y = mapY; - gMapSelectionTiles[1].x = mapX + CoordsDirectionDelta[sideDirection].x; - gMapSelectionTiles[1].y = mapY + CoordsDirectionDelta[sideDirection].y; - gMapSelectionTiles[2].x = mapX - CoordsDirectionDelta[sideDirection].x; - gMapSelectionTiles[2].y = mapY - CoordsDirectionDelta[sideDirection].y; - gMapSelectionTiles[3].x = -1; - gMapSelectionTiles[3].y = -1; + gMapSelectionTiles.clear(); + gMapSelectionTiles.push_back({ mapX, mapY }); + gMapSelectionTiles.push_back( + { mapX + CoordsDirectionDelta[sideDirection].x, mapY + CoordsDirectionDelta[sideDirection].y }); + gMapSelectionTiles.push_back( + { mapX - CoordsDirectionDelta[sideDirection].x, mapY - CoordsDirectionDelta[sideDirection].y }); gMapSelectArrowPosition.x = mapX; gMapSelectArrowPosition.y = mapY; diff --git a/src/openrct2-ui/windows/RideConstruction.cpp b/src/openrct2-ui/windows/RideConstruction.cpp index c34145b3e9..07d53be375 100644 --- a/src/openrct2-ui/windows/RideConstruction.cpp +++ b/src/openrct2-ui/windows/RideConstruction.cpp @@ -3345,7 +3345,7 @@ static void window_ride_construction_select_map_tiles( trackBlock = get_track_def_from_ride(ride, trackType); trackDirection &= 3; - int32_t selectionTileIndex = 0; + gMapSelectionTiles.clear(); while (trackBlock->index != 255) { switch (trackDirection) @@ -3368,13 +3368,10 @@ static void window_ride_construction_select_map_tiles( offsetY = trackBlock->x; break; } - gMapSelectionTiles[selectionTileIndex].x = x + offsetX; - gMapSelectionTiles[selectionTileIndex].y = y + offsetY; - selectionTileIndex++; + + gMapSelectionTiles.push_back({ x + offsetX, y + offsetY }); trackBlock++; } - gMapSelectionTiles[selectionTileIndex].x = -1; - gMapSelectionTiles[selectionTileIndex].y = -1; } /** @@ -3510,10 +3507,8 @@ void ride_construction_toolupdate_construct(int32_t screenX, int32_t screenY) gMapSelectArrowPosition.x = x; gMapSelectArrowPosition.y = y; gMapSelectArrowPosition.z = z; - gMapSelectionTiles[0].x = x; - gMapSelectionTiles[0].y = y; - gMapSelectionTiles[1].x = -1; - gMapSelectionTiles[1].y = -1; + gMapSelectionTiles.clear(); + gMapSelectionTiles.push_back({ x, y }); ride_id_t rideIndex; int32_t trackType, trackDirection, liftHillAndAlternativeState; @@ -3539,16 +3534,14 @@ void ride_construction_toolupdate_construct(int32_t screenX, int32_t screenY) if (gMapSelectFlags & MAP_SELECT_FLAG_ENABLE_CONSTRUCT) { int32_t highestZ = 0; - LocationXY16* selectedTile = gMapSelectionTiles; - while (selectedTile->x != -1) + for (const auto& selectedTile : gMapSelectionTiles) { - if (selectedTile->x < (256 * 32) && selectedTile->y < (256 * 32)) + if (selectedTile.x < (256 * 32) && selectedTile.y < (256 * 32)) { - z = map_get_highest_z(selectedTile->x >> 5, selectedTile->y >> 5); + z = map_get_highest_z(selectedTile.x / 32, selectedTile.y / 32); if (z > highestZ) highestZ = z; } - selectedTile++; } } // loc_6CC8BF: @@ -3764,17 +3757,15 @@ void ride_construction_tooldown_construct(int32_t screenX, int32_t screenY) highestZ = 0; if (gMapSelectFlags & MAP_SELECT_FLAG_ENABLE_CONSTRUCT) { - LocationXY16* selectedTile = gMapSelectionTiles; - while (selectedTile->x != -1) + + for (const auto& selectedTile : gMapSelectionTiles) { - if (selectedTile->x >= (256 * 32) || selectedTile->y >= (256 * 32)) + if (selectedTile.x >= (256 * 32) || selectedTile.y >= (256 * 32)) continue; - z = map_get_highest_z(selectedTile->x >> 5, selectedTile->y >> 5); + z = map_get_highest_z(selectedTile.x / 32, selectedTile.y / 32); if (z > highestZ) highestZ = z; - - selectedTile++; } } diff --git a/src/openrct2-ui/windows/TopToolbar.cpp b/src/openrct2-ui/windows/TopToolbar.cpp index b1c8fddf82..3f2bf4363f 100644 --- a/src/openrct2-ui/windows/TopToolbar.cpp +++ b/src/openrct2-ui/windows/TopToolbar.cpp @@ -2757,7 +2757,7 @@ static void top_toolbar_tool_update_scenery(int16_t x, int16_t y) case SCENERY_TYPE_LARGE: { scenery = get_large_scenery_entry(selected_scenery); - LocationXY16* selectedTile = gMapSelectionTiles; + gMapSelectionTiles.clear(); for (rct_large_scenery_tile* tile = scenery->large_scenery.tiles; tile->x_offset != (int16_t)(uint16_t)0xFFFF; tile++) @@ -2769,11 +2769,8 @@ static void top_toolbar_tool_update_scenery(int16_t x, int16_t y) tileLocation.x += mapTile.x; tileLocation.y += mapTile.y; - selectedTile->x = tileLocation.x; - selectedTile->y = tileLocation.y; - selectedTile++; + gMapSelectionTiles.push_back({tileLocation.x, tileLocation.y}); } - selectedTile->x = -1; gMapSelectFlags |= MAP_SELECT_FLAG_ENABLE_CONSTRUCT; map_invalidate_map_selection_tiles(); diff --git a/src/openrct2/paint/VirtualFloor.cpp b/src/openrct2/paint/VirtualFloor.cpp index ac4cb17e82..5aadd3508a 100644 --- a/src/openrct2/paint/VirtualFloor.cpp +++ b/src/openrct2/paint/VirtualFloor.cpp @@ -105,12 +105,12 @@ void virtual_floor_invalidate() if (gMapSelectFlags & MAP_SELECT_FLAG_ENABLE_CONSTRUCT) { - for (LocationXY16* tile = gMapSelectionTiles; tile->x != -1; tile++) + for (const auto& tile : gMapSelectionTiles) { - min_position.x = std::min(min_position.x, tile->x); - min_position.y = std::min(min_position.y, tile->y); - max_position.x = std::max(max_position.x, tile->x); - max_position.y = std::max(max_position.y, tile->y); + min_position.x = std::min(min_position.x, tile.x); + min_position.y = std::min(min_position.y, tile.y); + max_position.x = std::max(max_position.x, tile.x); + max_position.y = std::max(max_position.y, tile.y); } } @@ -186,10 +186,10 @@ bool virtual_floor_tile_is_floor(int16_t x, int16_t y) else if (gMapSelectFlags & MAP_SELECT_FLAG_ENABLE_CONSTRUCT) { // Check if we are anywhere near the selection tiles (larger scenery / rides) - for (LocationXY16* tile = gMapSelectionTiles; tile->x != -1; tile++) + for (const auto& tile : gMapSelectionTiles) { - if (x >= tile->x - _virtualFloorBaseSize && y >= tile->y - _virtualFloorBaseSize - && x <= tile->x + _virtualFloorBaseSize && y <= tile->y + _virtualFloorBaseSize) + if (x >= tile.x - _virtualFloorBaseSize && y >= tile.y - _virtualFloorBaseSize + && x <= tile.x + _virtualFloorBaseSize && y <= tile.y + _virtualFloorBaseSize) { return true; } @@ -223,9 +223,9 @@ static void virtual_floor_get_tile_properties( // See if we are on top of the selection tiles if (gMapSelectFlags & MAP_SELECT_FLAG_ENABLE_CONSTRUCT) { - for (LocationXY16* tile = gMapSelectionTiles; tile->x != -1; tile++) + for (const auto& tile : gMapSelectionTiles) { - if (x == tile->x && y == tile->y) + if (x == tile.x && y == tile.y) { *outLit = true; break; diff --git a/src/openrct2/paint/tile_element/Paint.Surface.cpp b/src/openrct2/paint/tile_element/Paint.Surface.cpp index 8833f7b3da..9a74e4e411 100644 --- a/src/openrct2/paint/tile_element/Paint.Surface.cpp +++ b/src/openrct2/paint/tile_element/Paint.Surface.cpp @@ -1193,9 +1193,9 @@ void surface_paint(paint_session* session, uint8_t direction, uint16_t height, c { const LocationXY16& pos = session->MapPosition; - for (const LocationXY16* tile = gMapSelectionTiles; tile->x != -1; tile++) + for (const auto& tile : gMapSelectionTiles) { - if (tile->x != pos.x || tile->y != pos.y) + if (tile.x != pos.x || tile.y != pos.y) { continue; } diff --git a/src/openrct2/ride/TrackDesign.cpp b/src/openrct2/ride/TrackDesign.cpp index d05c429501..dd926b6280 100644 --- a/src/openrct2/ride/TrackDesign.cpp +++ b/src/openrct2/ride/TrackDesign.cpp @@ -673,24 +673,14 @@ void track_design_mirror(rct_track_td6* td6) static void track_design_add_selection_tile(int16_t x, int16_t y) { - LocationXY16* selectionTile = gMapSelectionTiles; - // Subtract 2 because the tile gets incremented later on - for (; (selectionTile < gMapSelectionTiles + std::size(gMapSelectionTiles) - 2) && (selectionTile->x != -1); - selectionTile++) + for (const auto tile:gMapSelectionTiles) { - if (selectionTile->x == x && selectionTile->y == y) - { - return; - } - if (selectionTile + 1 >= &gMapSelectionTiles[300]) + if (tile.x == x && tile.y == y) { return; } } - selectionTile->x = x; - selectionTile->y = y; - selectionTile++; - selectionTile->x = -1; + gMapSelectionTiles.push_back(CoordsXY{x,y}); } static void track_design_update_max_min_coordinates(int16_t x, int16_t y, int16_t z) @@ -703,11 +693,51 @@ static void track_design_update_max_min_coordinates(int16_t x, int16_t y, int16_ gTrackPreviewMax.z = std::max(gTrackPreviewMax.z, z); } -static bool TrackDesignPlaceSceneryTileRemoveGhost( +static bool TrackDesignPlaceSceneryElementGetEntry(uint8_t& entry_type, uint8_t& entry_index, rct_td6_scenery_element* scenery) +{ + if (!find_object_in_entry_group(&scenery->scenery_object, &entry_type, &entry_index)) + { + entry_type = object_entry_get_type(&scenery->scenery_object); + if (entry_type != OBJECT_TYPE_PATHS) + { + _trackDesignPlaceStateSceneryUnavailable = true; + return true; + } + + if (gScreenFlags & SCREEN_FLAGS_TRACK_DESIGNER) + { + _trackDesignPlaceStateSceneryUnavailable = true; + return true; + } + + entry_index = 0; + for (PathSurfaceEntry* path = get_path_surface_entry(0); entry_index < object_entry_group_counts[OBJECT_TYPE_PATHS]; + path = get_path_surface_entry(entry_index), entry_index++) + { + if (path == nullptr) + { + return true; + } + if (path->flags & FOOTPATH_ENTRY_FLAG_SHOW_ONLY_IN_SCENARIO_EDITOR) + { + return true; + } + } + + if (entry_index == object_entry_group_counts[OBJECT_TYPE_PATHS]) + { + _trackDesignPlaceStateSceneryUnavailable = true; + return true; + } + } + return false; +} + +static bool TrackDesignPlaceSceneryElementRemoveGhost( CoordsXY mapCoord, rct_td6_scenery_element* scenery, uint8_t rotation, int32_t originZ) { uint8_t entry_type, entry_index; - if (TrackDesignPlaceSceneryTileGetEntry(entry_type, entry_index, scenery)) + if (TrackDesignPlaceSceneryElementGetEntry(entry_type, entry_index, scenery)) { return true; } @@ -771,48 +801,7 @@ static bool TrackDesignPlaceSceneryTileRemoveGhost( return true; } -static bool TrackDesignPlaceSceneryTileGetEntry(uint8_t& entry_type, uint8_t& entry_index, rct_td6_scenery_element* scenery) -{ - uint8_t entry_type, entry_index; - if (!find_object_in_entry_group(&scenery->scenery_object, &entry_type, &entry_index)) - { - entry_type = object_entry_get_type(&scenery->scenery_object); - if (entry_type != OBJECT_TYPE_PATHS) - { - _trackDesignPlaceStateSceneryUnavailable = true; - return true; - } - - if (gScreenFlags & SCREEN_FLAGS_TRACK_DESIGNER) - { - _trackDesignPlaceStateSceneryUnavailable = true; - return true; - } - - entry_index = 0; - for (PathSurfaceEntry* path = get_path_surface_entry(0); entry_index < object_entry_group_counts[OBJECT_TYPE_PATHS]; - path = get_path_surface_entry(entry_index), entry_index++) - { - if (path == nullptr) - { - return true; - } - if (path->flags & FOOTPATH_ENTRY_FLAG_SHOW_ONLY_IN_SCENARIO_EDITOR) - { - return true; - } - } - - if (entry_index == object_entry_group_counts[OBJECT_TYPE_PATHS]) - { - _trackDesignPlaceStateSceneryUnavailable = true; - return true; - } - } - return false; -} - -static bool TrackDesignPlaceSceneryTileGetPlaceZ(rct_td6_scenery_element* scenery) +static bool TrackDesignPlaceSceneryElementGetPlaceZ(rct_td6_scenery_element* scenery) { int32_t z = scenery->z * 8 + _trackDesignPlaceZ; if (z < _trackDesignPlaceSceneryZ) @@ -821,28 +810,28 @@ static bool TrackDesignPlaceSceneryTileGetPlaceZ(rct_td6_scenery_element* scener } uint8_t entry_type, entry_index; - TrackDesignPlaceSceneryTileGetEntry(entry_type, entry_index, scenery); + TrackDesignPlaceSceneryElementGetEntry(entry_type, entry_index, scenery); return true; } -static bool TrackDesignPlaceSceneryTile( +static bool TrackDesignPlaceSceneryElement( CoordsXY mapCoord, LocationXY8 tile, uint8_t mode, rct_td6_scenery_element* scenery, uint8_t rotation, int32_t originZ) { if (_trackDesignPlaceOperation == PTD_OPERATION_DRAW_OUTLINES && mode == 0) { - track_design_add_selection_tile(tile.x, tile.y); + track_design_add_selection_tile(mapCoord.x, mapCoord.y); return true; } if (_trackDesignPlaceOperation == PTD_OPERATION_REMOVE_GHOST && mode == 0) { - return TrackDesignPlaceSceneryTileRemoveGhost(mapCoord, scenery, rotation, originZ); + return TrackDesignPlaceSceneryElementRemoveGhost(mapCoord, scenery, rotation, originZ); } if (_trackDesignPlaceOperation == PTD_OPERATION_GET_PLACE_Z) { - return TrackDesignPlaceSceneryTileGetPlaceZ(scenery); + return TrackDesignPlaceSceneryElementGetPlaceZ(scenery); } if (_trackDesignPlaceOperation == PTD_OPERATION_PLACE_QUERY || _trackDesignPlaceOperation == PTD_OPERATION_PLACE @@ -850,7 +839,7 @@ static bool TrackDesignPlaceSceneryTile( || _trackDesignPlaceOperation == PTD_OPERATION_PLACE_TRACK_PREVIEW) { uint8_t entry_type, entry_index; - if (TrackDesignPlaceSceneryTileGetEntry(entry_type, entry_index, scenery)) + if (TrackDesignPlaceSceneryElementGetEntry(entry_type, entry_index, scenery)) { return true; } @@ -1097,7 +1086,7 @@ static bool TrackDesignPlaceSceneryTile( * * rct2: 0x006D0964 */ -static int32_t track_design_place_scenery( +static int32_t track_design_place_all_scenery( rct_td6_scenery_element* scenery_start, int32_t originX, int32_t originY, int32_t originZ) { for (uint8_t mode = 0; mode <= 1; mode++) @@ -1139,7 +1128,7 @@ static int32_t track_design_place_scenery( CoordsXY mapCoord = { tile.x * 32, tile.y * 32 }; track_design_update_max_min_coordinates(mapCoord.x, mapCoord.y, originZ); - if (!TrackDesignPlaceSceneryTile(mapCoord, tile, mode, scenery, rotation, originZ)) + if (!TrackDesignPlaceSceneryElement(mapCoord, tile, mode, scenery, rotation, originZ)) { return 0; } @@ -1152,7 +1141,7 @@ static int32_t track_design_place_maze(rct_track_td6* td6, int16_t x, int16_t y, { if (_trackDesignPlaceOperation == PTD_OPERATION_DRAW_OUTLINES) { - gMapSelectionTiles->x = -1; + gMapSelectionTiles.clear(); gMapSelectArrowPosition.x = x; gMapSelectArrowPosition.y = y; gMapSelectArrowPosition.z = tile_element_height(x, y) & 0xFFFF; @@ -1366,7 +1355,7 @@ static bool track_design_place_ride(rct_track_td6* td6, int16_t x, int16_t y, in gTrackPreviewOrigin.z = z; if (_trackDesignPlaceOperation == PTD_OPERATION_DRAW_OUTLINES) { - gMapSelectionTiles->x = -1; + gMapSelectionTiles.clear(); gMapSelectArrowPosition.x = x; gMapSelectArrowPosition.y = y; gMapSelectArrowPosition.z = tile_element_height(x, y) & 0xFFFF; @@ -1698,7 +1687,7 @@ int32_t place_virtual_track( rct_td6_scenery_element* scenery = td6->scenery_elements; if (track_place_success && scenery != nullptr) { - if (!track_design_place_scenery(scenery, gTrackPreviewOrigin.x, gTrackPreviewOrigin.y, gTrackPreviewOrigin.z)) + if (!track_design_place_all_scenery(scenery, gTrackPreviewOrigin.x, gTrackPreviewOrigin.y, gTrackPreviewOrigin.z)) { return _trackDesignPlaceCost; } diff --git a/src/openrct2/world/Map.cpp b/src/openrct2/world/Map.cpp index 3d39d6e68c..83762955bc 100644 --- a/src/openrct2/world/Map.cpp +++ b/src/openrct2/world/Map.cpp @@ -88,7 +88,7 @@ int16_t gMapBaseZ; TileElement gTileElements[MAX_TILE_TILE_ELEMENT_POINTERS * 3]; TileElement* gTileElementTilePointers[MAX_TILE_TILE_ELEMENT_POINTERS]; -LocationXY16 gMapSelectionTiles[300]; +std::vector gMapSelectionTiles; std::vector gPeepSpawns; TileElement* gNextFreeTileElement; @@ -1394,13 +1394,11 @@ void map_remove_all_rides() */ void map_invalidate_map_selection_tiles() { - LocationXY16* position; - if (!(gMapSelectFlags & MAP_SELECT_FLAG_ENABLE_CONSTRUCT)) return; - for (position = gMapSelectionTiles; position->x != -1; position++) - map_invalidate_tile_full(position->x, position->y); + for (const auto& position : gMapSelectionTiles) + map_invalidate_tile_full(position.x, position.y); } void map_get_bounding_box( diff --git a/src/openrct2/world/Map.h b/src/openrct2/world/Map.h index 3328e74d56..90a907d653 100644 --- a/src/openrct2/world/Map.h +++ b/src/openrct2/world/Map.h @@ -107,7 +107,7 @@ extern uint8_t gMapGroundFlags; extern TileElement gTileElements[MAX_TILE_TILE_ELEMENT_POINTERS * 3]; extern TileElement* gTileElementTilePointers[MAX_TILE_TILE_ELEMENT_POINTERS]; -extern LocationXY16 gMapSelectionTiles[300]; +extern std::vector gMapSelectionTiles; extern std::vector gPeepSpawns; extern TileElement* gNextFreeTileElement;