mirror of https://github.com/OpenRCT2/OpenRCT2.git
Merge pull request #952 from Garogolun/footpath-functions
Decompiled some footpath stuff
This commit is contained in:
commit
eac4e28efd
|
@ -399,7 +399,7 @@ static void viewport_interaction_remove_footpath(rct_map_element *mapElement, in
|
||||||
|
|
||||||
w = window_find_by_class(WC_FOOTPATH);
|
w = window_find_by_class(WC_FOOTPATH);
|
||||||
if (w != NULL)
|
if (w != NULL)
|
||||||
sub_6A7831();
|
footpath_provisional_update();
|
||||||
|
|
||||||
mapElement2 = map_get_first_element_at(x / 32, y / 32);
|
mapElement2 = map_get_first_element_at(x / 32, y / 32);
|
||||||
do {
|
do {
|
||||||
|
|
|
@ -223,7 +223,7 @@ static void window_footpath_close()
|
||||||
|
|
||||||
window_get_register(w);
|
window_get_register(w);
|
||||||
|
|
||||||
sub_6A7831();
|
footpath_provisional_update();
|
||||||
viewport_set_visibility(0);
|
viewport_set_visibility(0);
|
||||||
map_invalidate_map_selection_tiles();
|
map_invalidate_map_selection_tiles();
|
||||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~2;
|
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~2;
|
||||||
|
@ -258,7 +258,7 @@ static void window_footpath_mouseup()
|
||||||
|
|
||||||
_window_footpath_cost = MONEY32_UNDEFINED;
|
_window_footpath_cost = MONEY32_UNDEFINED;
|
||||||
tool_cancel();
|
tool_cancel();
|
||||||
sub_6A7831();
|
footpath_provisional_update();
|
||||||
map_invalidate_map_selection_tiles();
|
map_invalidate_map_selection_tiles();
|
||||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~2;
|
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~2;
|
||||||
RCT2_GLOBAL(RCT2_ADDRESS_PATH_CONSTRUCTION_MODE, uint8) = PATH_CONSTRUCTION_MODE_LAND;
|
RCT2_GLOBAL(RCT2_ADDRESS_PATH_CONSTRUCTION_MODE, uint8) = PATH_CONSTRUCTION_MODE_LAND;
|
||||||
|
@ -273,7 +273,7 @@ static void window_footpath_mouseup()
|
||||||
|
|
||||||
_window_footpath_cost = MONEY32_UNDEFINED;
|
_window_footpath_cost = MONEY32_UNDEFINED;
|
||||||
tool_cancel();
|
tool_cancel();
|
||||||
sub_6A7831();
|
footpath_provisional_update();
|
||||||
map_invalidate_map_selection_tiles();
|
map_invalidate_map_selection_tiles();
|
||||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~2;
|
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~2;
|
||||||
RCT2_GLOBAL(RCT2_ADDRESS_PATH_CONSTRUCTION_MODE, uint8) = PATH_CONSTRUCTION_MODE_BRIDGE_OR_TUNNEL_TOOL;
|
RCT2_GLOBAL(RCT2_ADDRESS_PATH_CONSTRUCTION_MODE, uint8) = PATH_CONSTRUCTION_MODE_BRIDGE_OR_TUNNEL_TOOL;
|
||||||
|
@ -369,7 +369,7 @@ static void window_footpath_dropdown()
|
||||||
|
|
||||||
// Set selected path id
|
// Set selected path id
|
||||||
RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_PATH_ID, sint16) = pathId;
|
RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_PATH_ID, sint16) = pathId;
|
||||||
sub_6A7831();
|
footpath_provisional_update();
|
||||||
_window_footpath_cost = MONEY32_UNDEFINED;
|
_window_footpath_cost = MONEY32_UNDEFINED;
|
||||||
window_invalidate(w);
|
window_invalidate(w);
|
||||||
}
|
}
|
||||||
|
@ -424,7 +424,7 @@ static void window_footpath_tooldrag()
|
||||||
window_tool_get_registers(w, widgetIndex, x, y);
|
window_tool_get_registers(w, widgetIndex, x, y);
|
||||||
|
|
||||||
if (widgetIndex == WIDX_CONSTRUCT_ON_LAND) {
|
if (widgetIndex == WIDX_CONSTRUCT_ON_LAND) {
|
||||||
RCT2_CALLPROC_X(0x006A82C5, x, y, 0, 0, (int)w, 0, 0);
|
window_footpath_place_path_at_point(x, y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -441,7 +441,8 @@ static void window_footpath_toolup()
|
||||||
window_tool_get_registers(w, widgetIndex, x, y);
|
window_tool_get_registers(w, widgetIndex, x, y);
|
||||||
|
|
||||||
if (widgetIndex == WIDX_CONSTRUCT_ON_LAND) {
|
if (widgetIndex == WIDX_CONSTRUCT_ON_LAND) {
|
||||||
RCT2_CALLPROC_X(0x006A8380, x, y, 0, 0, (int)w, 0, 0);
|
// The function at 0x006A8380 in rct2 is just the following:
|
||||||
|
RCT2_GLOBAL(RCT2_ADDRESS_PATH_ERROR_OCCURED, uint8) = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -641,7 +642,7 @@ static void window_footpath_show_footpath_types_dialog(rct_window *w, rct_widget
|
||||||
*/
|
*/
|
||||||
static void window_footpath_mousedown_direction(int direction)
|
static void window_footpath_mousedown_direction(int direction)
|
||||||
{
|
{
|
||||||
sub_6A7831();
|
footpath_provisional_update();
|
||||||
RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_DIRECTION, uint8) = (direction - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)) & 3;
|
RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_DIRECTION, uint8) = (direction - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)) & 3;
|
||||||
_window_footpath_cost = MONEY32_UNDEFINED;
|
_window_footpath_cost = MONEY32_UNDEFINED;
|
||||||
window_footpath_set_enabled_and_pressed_widgets();
|
window_footpath_set_enabled_and_pressed_widgets();
|
||||||
|
@ -653,7 +654,7 @@ static void window_footpath_mousedown_direction(int direction)
|
||||||
*/
|
*/
|
||||||
static void window_footpath_mousedown_slope(int slope)
|
static void window_footpath_mousedown_slope(int slope)
|
||||||
{
|
{
|
||||||
sub_6A7831();
|
footpath_provisional_update();
|
||||||
RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_SLOPE, uint8) = slope;
|
RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_SLOPE, uint8) = slope;
|
||||||
_window_footpath_cost = MONEY32_UNDEFINED;
|
_window_footpath_cost = MONEY32_UNDEFINED;
|
||||||
window_footpath_set_enabled_and_pressed_widgets();
|
window_footpath_set_enabled_and_pressed_widgets();
|
||||||
|
@ -675,7 +676,7 @@ static void window_footpath_set_provisional_path_at_point(int x, int y)
|
||||||
|
|
||||||
if (z == 0) {
|
if (z == 0) {
|
||||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 << 0);
|
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) &= ~(1 << 0);
|
||||||
sub_6A7831();
|
footpath_provisional_update();
|
||||||
} else {
|
} else {
|
||||||
// Check for change
|
// Check for change
|
||||||
if ((RCT2_GLOBAL(RCT2_ADDRESS_PROVISIONAL_PATH_FLAGS, uint8) & (1 << 1)) && RCT2_GLOBAL(RCT2_ADDRESS_PROVISIONAL_PATH_X, uint16) == x && RCT2_GLOBAL(RCT2_ADDRESS_PROVISIONAL_PATH_Y, uint16) == y && RCT2_GLOBAL(RCT2_ADDRESS_PROVISIONAL_PATH_Z, uint8) == mapElement->base_height)
|
if ((RCT2_GLOBAL(RCT2_ADDRESS_PROVISIONAL_PATH_FLAGS, uint8) & (1 << 1)) && RCT2_GLOBAL(RCT2_ADDRESS_PROVISIONAL_PATH_X, uint16) == x && RCT2_GLOBAL(RCT2_ADDRESS_PROVISIONAL_PATH_Y, uint16) == y && RCT2_GLOBAL(RCT2_ADDRESS_PROVISIONAL_PATH_Z, uint8) == mapElement->base_height)
|
||||||
|
@ -689,7 +690,7 @@ static void window_footpath_set_provisional_path_at_point(int x, int y)
|
||||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, uint16) = x;
|
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, uint16) = x;
|
||||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, uint16) = y;
|
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, uint16) = y;
|
||||||
|
|
||||||
sub_6A7831();
|
footpath_provisional_update();
|
||||||
|
|
||||||
// Set provisional path
|
// Set provisional path
|
||||||
slope = RCT2_ADDRESS(0x0098D8B4, uint8)[mapElement->properties.surface.slope & 0x1F];
|
slope = RCT2_ADDRESS(0x0098D8B4, uint8)[mapElement->properties.surface.slope & 0x1F];
|
||||||
|
@ -714,7 +715,7 @@ static void window_footpath_place_path_at_point(int x, int y)
|
||||||
if (RCT2_GLOBAL(RCT2_ADDRESS_PATH_ERROR_OCCURED, uint8) != 0)
|
if (RCT2_GLOBAL(RCT2_ADDRESS_PATH_ERROR_OCCURED, uint8) != 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
sub_6A7831();
|
footpath_provisional_update();
|
||||||
|
|
||||||
get_map_coordinates_from_pos(x, y, 0xFFDE, &x, &y, &z, &mapElement);
|
get_map_coordinates_from_pos(x, y, 0xFFDE, &x, &y, &z, &mapElement);
|
||||||
if (z == 0)
|
if (z == 0)
|
||||||
|
@ -755,14 +756,17 @@ static void window_footpath_start_bridge_at_point(int screenX, int screenY)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_SURFACE) {
|
if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_SURFACE) {
|
||||||
// ?
|
// If we start the path on a slope, the arrow is slightly raised, so we
|
||||||
uint8 dl = ((mapElement->properties.surface.slope & 0x0F) << direction) & 0xFF;
|
// expect the path to be slightly raised as well.
|
||||||
uint8 dh = dl;
|
uint8_t slope = mapElement->properties.surface.slope;
|
||||||
dl = (dl >> 4) & 0x0F;
|
|
||||||
dh = (dh & 0x0F) | dl;
|
|
||||||
z = mapElement->base_height;
|
z = mapElement->base_height;
|
||||||
if ((dh & 0x0C) == 0x0C)
|
if (slope & 0x10) {
|
||||||
|
// Steep diagonal slope
|
||||||
|
z += 4;
|
||||||
|
} else if (slope & 0x0f) {
|
||||||
|
// Normal slope
|
||||||
z += 2;
|
z += 2;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
z = mapElement->base_height;
|
z = mapElement->base_height;
|
||||||
if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_PATH) {
|
if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_PATH) {
|
||||||
|
@ -787,12 +791,66 @@ static void window_footpath_start_bridge_at_point(int screenX, int screenY)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
* Construct a piece of footpath while in bridge building mode.
|
||||||
* rct2: 0x006A79B7
|
* rct2: 0x006A79B7
|
||||||
*/
|
*/
|
||||||
static void window_footpath_construct()
|
static void window_footpath_construct()
|
||||||
{
|
{
|
||||||
RCT2_CALLPROC_EBPSAFE(0x006A79B7);
|
_window_footpath_cost = MONEY32_UNDEFINED;
|
||||||
|
footpath_provisional_update();
|
||||||
|
|
||||||
|
int type, x, y, z, slope;
|
||||||
|
footpath_get_next_path_info(&type, &x, &y, &z, &slope);
|
||||||
|
|
||||||
|
// Try to place the path at the desired location
|
||||||
|
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = 0x498;
|
||||||
|
money32 cost = footpath_place(type, x, y, z, slope, 0);
|
||||||
|
|
||||||
|
if (cost != MONEY32_UNDEFINED) {
|
||||||
|
// It is possible, let's remove walls between the old and new piece of path
|
||||||
|
uint8 direction = RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_DIRECTION, uint8);
|
||||||
|
map_remove_intersecting_walls(x, y, z, z + 4 + (slope & 0xf ? 2 : 0), direction ^ 2);
|
||||||
|
map_remove_intersecting_walls(
|
||||||
|
x - TileDirectionDelta[direction].x,
|
||||||
|
y - TileDirectionDelta[direction].y,
|
||||||
|
z, z + 4, direction
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Actually place the path now
|
||||||
|
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = 0x498;
|
||||||
|
cost = footpath_place(type, x, y, z, slope, GAME_COMMAND_FLAG_APPLY);
|
||||||
|
|
||||||
|
if (cost != MONEY32_UNDEFINED) {
|
||||||
|
sound_play_panned(
|
||||||
|
SOUND_PLACE_ITEM,
|
||||||
|
0x8001,
|
||||||
|
RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_FROM_X, uint16),
|
||||||
|
RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_FROM_Y, uint16),
|
||||||
|
RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_FROM_Z, uint16)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_SLOPE, uint8) == 0) {
|
||||||
|
RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_VALID_DIRECTIONS, uint8) = 0xff;
|
||||||
|
} else {
|
||||||
|
RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_VALID_DIRECTIONS, uint8) = RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_DIRECTION, uint8);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RCT2_GLOBAL(0x00F3EFA4, uint8) & 2)
|
||||||
|
viewport_set_visibility(1);
|
||||||
|
|
||||||
|
// If we have just built an upwards slope, the next path to construct is
|
||||||
|
// a bit higher. Note that the z returned by footpath_get_next_path_info
|
||||||
|
// already is lowered if we are building a downwards slope.
|
||||||
|
if (RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_SLOPE, uint8) == 2)
|
||||||
|
z += 2;
|
||||||
|
|
||||||
|
RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_FROM_X, uint16) = x;
|
||||||
|
RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_FROM_Y, uint16) = y;
|
||||||
|
RCT2_GLOBAL(RCT2_ADDRESS_CONSTRUCT_PATH_FROM_Z, uint16) = z << 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
window_footpath_set_enabled_and_pressed_widgets();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -894,7 +952,7 @@ static void window_footpath_remove()
|
||||||
rct_map_element *mapElement;
|
rct_map_element *mapElement;
|
||||||
|
|
||||||
_window_footpath_cost = MONEY32_UNDEFINED;
|
_window_footpath_cost = MONEY32_UNDEFINED;
|
||||||
sub_6A7831();
|
footpath_provisional_update();
|
||||||
|
|
||||||
mapElement = footpath_get_map_element_to_remove();
|
mapElement = footpath_get_map_element_to_remove();
|
||||||
if (mapElement != NULL)
|
if (mapElement != NULL)
|
||||||
|
|
|
@ -459,7 +459,7 @@ void footpath_provisional_remove()
|
||||||
*
|
*
|
||||||
* rct2: 0x006A7831
|
* rct2: 0x006A7831
|
||||||
*/
|
*/
|
||||||
void sub_6A7831()
|
void footpath_provisional_update()
|
||||||
{
|
{
|
||||||
if (RCT2_GLOBAL(RCT2_ADDRESS_PROVISIONAL_PATH_FLAGS, uint8) & PROVISIONAL_PATH_FLAG_SHOW_ARROW) {
|
if (RCT2_GLOBAL(RCT2_ADDRESS_PROVISIONAL_PATH_FLAGS, uint8) & PROVISIONAL_PATH_FLAG_SHOW_ARROW) {
|
||||||
RCT2_GLOBAL(RCT2_ADDRESS_PROVISIONAL_PATH_FLAGS, uint8) &= ~PROVISIONAL_PATH_FLAG_SHOW_ARROW;
|
RCT2_GLOBAL(RCT2_ADDRESS_PROVISIONAL_PATH_FLAGS, uint8) &= ~PROVISIONAL_PATH_FLAG_SHOW_ARROW;
|
||||||
|
|
|
@ -45,7 +45,7 @@ money32 footpath_place(int type, int x, int y, int z, int slope, int flags);
|
||||||
void footpath_remove(int x, int y, int z, int flags);
|
void footpath_remove(int x, int y, int z, int flags);
|
||||||
money32 footpath_provisional_set(int type, int x, int y, int z, int slope);
|
money32 footpath_provisional_set(int type, int x, int y, int z, int slope);
|
||||||
void footpath_provisional_remove();
|
void footpath_provisional_remove();
|
||||||
void sub_6A7831();
|
void footpath_provisional_update();
|
||||||
void sub_68A0C9(int screenX, int screenY, int *x, int *y, int *direction, rct_map_element **mapElement);
|
void sub_68A0C9(int screenX, int screenY, int *x, int *y, int *direction, rct_map_element **mapElement);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue