From 0a633647e46f89aa2aa73f9dd21218ce8efe7aea Mon Sep 17 00:00:00 2001 From: ZehM4tt Date: Sat, 24 Jun 2017 00:52:26 +0200 Subject: [PATCH] Fix ghost scenery removing objects with "Disable Clearance check" enabled. Fix footpath_remove ignoring the ghost flag removing the wrong path. Replaced some constants with the known flags. --- src/openrct2/network/network.h | 2 +- src/openrct2/ride/track.c | 2 +- src/openrct2/ride/track_design.c | 18 +++++++++++----- src/openrct2/world/footpath.c | 35 ++++++++++++++++++++++++-------- 4 files changed, 41 insertions(+), 16 deletions(-) diff --git a/src/openrct2/network/network.h b/src/openrct2/network/network.h index a3b27b0d88..bcfbc35e92 100644 --- a/src/openrct2/network/network.h +++ b/src/openrct2/network/network.h @@ -55,7 +55,7 @@ extern "C" { // This define specifies which version of network stream current build uses. // It is used for making sure only compatible builds get connected, even within // single OpenRCT2 version. -#define NETWORK_STREAM_VERSION "21" +#define NETWORK_STREAM_VERSION "22" #define NETWORK_STREAM_ID OPENRCT2_VERSION "-" NETWORK_STREAM_VERSION #ifdef __cplusplus diff --git a/src/openrct2/ride/track.c b/src/openrct2/ride/track.c index 6f71ed15cf..8b8413955e 100644 --- a/src/openrct2/ride/track.c +++ b/src/openrct2/ride/track.c @@ -1397,7 +1397,7 @@ static money32 track_place(sint32 rideIndex, sint32 type, sint32 originX, sint32 mapElement = surfaceElement; } - if (!gCheatsDisableClearanceChecks || !(flags & (1 << 6))) { + if (!gCheatsDisableClearanceChecks || !(flags & GAME_COMMAND_FLAG_GHOST)) { footpath_connect_edges(x, y, mapElement, flags); } map_invalidate_tile_full(x, y); diff --git a/src/openrct2/ride/track_design.c b/src/openrct2/ride/track_design.c index 0ed399bc30..52eaffaa6c 100644 --- a/src/openrct2/ride/track_design.c +++ b/src/openrct2/ride/track_design.c @@ -635,6 +635,11 @@ static sint32 track_design_place_scenery(rct_td6_scenery_element *scenery_start, } } sint32 z; + const uint32 flags = GAME_COMMAND_FLAG_APPLY | + GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | + GAME_COMMAND_FLAG_5 | + GAME_COMMAND_FLAG_GHOST; + switch (entry_type) { case OBJECT_TYPE_SMALL_SCENERY: //bl @@ -654,11 +659,10 @@ static sint32 track_design_place_scenery(rct_td6_scenery_element *scenery_start, { bh &= 0x3F; } - z = (scenery->z * 8 + originZ) / 8; game_do_command( mapCoord.x, - 0x69 | bh << 8, + flags | bh << 8, mapCoord.y, (entry_index << 8) | z, GAME_COMMAND_REMOVE_SCENERY, @@ -669,7 +673,7 @@ static sint32 track_design_place_scenery(rct_td6_scenery_element *scenery_start, z = (scenery->z * 8 + originZ) / 8; game_do_command( mapCoord.x, - 0x69 | (((rotation + scenery->flags) & 0x3) << 8), + flags | (((rotation + scenery->flags) & 0x3) << 8), mapCoord.y, z, GAME_COMMAND_REMOVE_LARGE_SCENERY, @@ -680,7 +684,7 @@ static sint32 track_design_place_scenery(rct_td6_scenery_element *scenery_start, z = (scenery->z * 8 + originZ) / 8; game_do_command( mapCoord.x, - 0x69, + flags, mapCoord.y, (z << 8) | ((rotation + scenery->flags) & 0x3), GAME_COMMAND_REMOVE_WALL, @@ -689,7 +693,11 @@ static sint32 track_design_place_scenery(rct_td6_scenery_element *scenery_start, break; case OBJECT_TYPE_PATHS: z = (scenery->z * 8 + originZ) / 8; - footpath_remove(mapCoord.x, mapCoord.y, z, 0x69); + footpath_remove( + mapCoord.x, + mapCoord.y, + z, + flags); break; } } diff --git a/src/openrct2/world/footpath.c b/src/openrct2/world/footpath.c index 5b8bc3891c..e783faf0c1 100644 --- a/src/openrct2/world/footpath.c +++ b/src/openrct2/world/footpath.c @@ -412,6 +412,7 @@ static void remove_banners_at_element(sint32 x, sint32 y, rct_map_element* mapEl money32 footpath_remove_real(sint32 x, sint32 y, sint32 z, sint32 flags) { rct_map_element *mapElement; + rct_map_element *footpathElement = NULL; gCommandExpenditureType = RCT_EXPENDITURE_TYPE_LANDSCAPING; gCommandPosition.x = x + 16; @@ -423,7 +424,7 @@ money32 footpath_remove_real(sint32 x, sint32 y, sint32 z, sint32 flags) return MONEY32_UNDEFINED; } - if (flags & GAME_COMMAND_FLAG_APPLY) { + if ((flags & GAME_COMMAND_FLAG_APPLY) && !(flags & GAME_COMMAND_FLAG_GHOST)) { footpath_interrupt_peeps(x, y, z * 8); footpath_remove_litter(x, y, z * 8); } @@ -441,19 +442,35 @@ money32 footpath_remove_real(sint32 x, sint32 y, sint32 z, sint32 flags) network_set_player_last_action_coord(network_get_player_index(game_command_playerid), coord); } - footpath_queue_chain_reset(); - remove_banners_at_element(x, y, mapElement); - footpath_remove_edges_at(x, y, mapElement); - map_invalidate_tile_full(x, y); - map_element_remove(mapElement); - footpath_update_queue_chains(); + // If the ghost flag is present we have to make sure to only delete ghost footpaths as they may be + // at the same origin. + if ((flags & GAME_COMMAND_FLAG_GHOST) && map_element_is_ghost(mapElement) == false) { + while (!map_element_is_last_for_tile(mapElement++)) { + if (mapElement->type != MAP_ELEMENT_TYPE_PATH && !map_element_is_ghost(mapElement)) { + continue; + } + footpathElement = mapElement; + break; + } + } else { + footpathElement = mapElement; + } + + if (footpathElement != NULL) { + footpath_queue_chain_reset(); + remove_banners_at_element(x, y, footpathElement); + footpath_remove_edges_at(x, y, footpathElement); + map_invalidate_tile_full(x, y); + map_element_remove(footpathElement); + footpath_update_queue_chains(); + } } money32 cost = -MONEY(10,00); - bool isNotOwnedByPark = (flags & (1 << 5)); + bool isNotOwnedByPark = (flags & GAME_COMMAND_FLAG_5); bool moneyDisabled = (gParkFlags & PARK_FLAGS_NO_MONEY); - bool isGhost = (mapElement == NULL) || (map_element_is_ghost(mapElement)); + bool isGhost = (footpathElement == NULL) || (map_element_is_ghost(footpathElement)); if (isNotOwnedByPark || moneyDisabled || isGhost) { cost = 0;