1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-19 04:53:12 +01:00

Add setting small scenery quadrant location to MP

This commit is contained in:
Broxzier
2017-02-07 15:07:31 +01:00
committed by Michał Janiszewski
parent 06b73d03ab
commit 2682639393
4 changed files with 51 additions and 15 deletions

View File

@@ -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:

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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);