diff --git a/src/openrct2/windows/tile_inspector.c b/src/openrct2/windows/tile_inspector.c index d344d3d483..820ab3fdaf 100644 --- a/src/openrct2/windows/tile_inspector.c +++ b/src/openrct2/windows/tile_inspector.c @@ -823,22 +823,20 @@ static void window_tile_inspector_track_block_set_lift(sint32 element_index, boo ); } -static void window_tile_inspector_quarter_tile_set(rct_map_element *const mapElement, const sint32 index) +static void window_tile_inspector_quarter_tile_set(sint32 element_index, const sint32 quarter_index) { - // index is widget index relative to WIDX_SCENERY_CHECK_QUARTER_N, so a value from 0-3 - openrct2_assert(index >= 0 && index < 4, "index out of range"); + // quarter_index is widget index relative to WIDX_SCENERY_CHECK_QUARTER_N, so a value from 0-3 + openrct2_assert(quarter_index >= 0 && quarter_index < 4, "quarter_index out of range"); - const sint32 clickedDirection = (index - get_current_rotation()) & 3; - - // Set quadrant index - mapElement->type &= ~MAP_ELEMENT_QUADRANT_MASK; - mapElement->type |= clickedDirection << 6; - - // Update collision - mapElement->flags &= 0xF0; - mapElement->flags |= 1 << ((index + 6 - get_current_rotation()) & 3); - - map_invalidate_tile_full(windowTileInspectorTileX << 5, windowTileInspectorTileY << 5); + game_do_command( + TILE_INSPECTOR_SCENERY_SET_QUARTER_LOCATION, + GAME_COMMAND_FLAG_APPLY, + windowTileInspectorTileX | (windowTileInspectorTileY << 8), + element_index, + GAME_COMMAND_MODIFY_TILE, + quarter_index - get_current_rotation() & 3, + 0 + ); } static void window_tile_inspector_mouseup(rct_window *w, sint32 widgetIndex) @@ -1014,7 +1012,7 @@ static void window_tile_inspector_mouseup(rct_window *w, sint32 widgetIndex) case WIDX_SCENERY_CHECK_QUARTER_E: case WIDX_SCENERY_CHECK_QUARTER_S: case WIDX_SCENERY_CHECK_QUARTER_W: - window_tile_inspector_quarter_tile_set(mapElement, widgetIndex - WIDX_SCENERY_CHECK_QUARTER_N); + window_tile_inspector_quarter_tile_set(w->selected_list_item, widgetIndex - WIDX_SCENERY_CHECK_QUARTER_N); window_invalidate(w); break; case WIDX_SCENERY_CHECK_COLLISION_N: diff --git a/src/openrct2/world/map.c b/src/openrct2/world/map.c index a918a8176c..c4dcb355c7 100644 --- a/src/openrct2/world/map.c +++ b/src/openrct2/world/map.c @@ -5713,6 +5713,13 @@ void game_command_modify_tile(sint32* eax, sint32* ebx, sint32* ecx, sint32* edx *ebx = tile_inspector_track_set_chain(x, y, element_index, entire_track_block, set_chain, flags); break; } + case TILE_INSPECTOR_SCENERY_SET_QUARTER_LOCATION: + { + const sint32 element_index = *edx; + const sint32 quarter_index = *edi; + *ebx = tile_inspector_scenery_set_quarter_location(x, y, element_index, quarter_index, flags); + break; + } default: log_error("invalid instruction"); *ebx = MONEY32_UNDEFINED; diff --git a/src/openrct2/world/tile_inspector.c b/src/openrct2/world/tile_inspector.c index 5c06f1ac03..631ab09adf 100644 --- a/src/openrct2/world/tile_inspector.c +++ b/src/openrct2/world/tile_inspector.c @@ -802,3 +802,32 @@ sint32 tile_inspector_track_set_chain(sint32 x, sint32 y, sint32 element_index, return 0; } + +sint32 tile_inspector_scenery_set_quarter_location(sint32 x, sint32 y, sint32 element_index, sint32 quarter_index, sint32 flags) +{ + rct_map_element *mapElement = map_get_first_element_at(x, y) + element_index; + + if (!mapElement || map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_SCENERY) + { + return MONEY32_UNDEFINED; + } + + if (flags & GAME_COMMAND_FLAG_APPLY) + { + // Set quadrant index + mapElement->type &= ~MAP_ELEMENT_QUADRANT_MASK; + mapElement->type |= quarter_index << 6; + + // Update collision + mapElement->flags &= 0xF0; + mapElement->flags |= 1 << ((quarter_index + 2) & 3); + + map_invalidate_tile_full(x << 5, y << 5); + if ((uint32)x == windowTileInspectorTileX && (uint32)y == windowTileInspectorTileY) + { + window_invalidate_by_class(WC_TILE_INSPECTOR); + } + } + + return 0; +} diff --git a/src/openrct2/world/tile_inspector.h b/src/openrct2/world/tile_inspector.h index 7a03005a80..717858e496 100644 --- a/src/openrct2/world/tile_inspector.h +++ b/src/openrct2/world/tile_inspector.h @@ -48,6 +48,7 @@ typedef enum { TILE_INSPECTOR_FENCE_SET_SLOPE, TILE_INSPECTOR_TRACK_BASE_HEIGHT_OFFSET, TILE_INSPECTOR_TRACK_SET_CHAIN, + TILE_INSPECTOR_SCENERY_SET_QUARTER_LOCATION, } tile_inspector_instruction; sint32 tile_inspector_insert_corrupt_at(sint32 x, sint32 y, sint16 element_index, sint32 flags); @@ -65,3 +66,4 @@ sint32 tile_inspector_path_toggle_edge(sint32 x, sint32 y, sint32 element_index, sint32 tile_inspector_fence_set_slope(sint32 x, sint32 y, sint32 element_index, sint32 slope_value, sint32 flags); sint32 tile_inspector_track_base_height_offset(sint32 x, sint32 y, sint32 element_index, sint8 offset, sint32 flags); sint32 tile_inspector_track_set_chain(sint32 x, sint32 y, sint32 element_index, bool entire_track_block, bool set_chain, sint32 flags); +sint32 tile_inspector_scenery_set_quarter_location(sint32 x, sint32 y, sint32 element_index, sint32 quarter_index, sint32 flags);