mirror of https://github.com/OpenRCT2/OpenRCT2.git
implement footpath_chain_ride_queue
This commit is contained in:
parent
4acb7ff5e1
commit
8113c9562b
|
@ -3720,7 +3720,7 @@ void sub_6B5952(int rideIndex)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
int direction = mapElement->type & MAP_ELEMENT_DIRECTION_MASK;
|
int direction = mapElement->type & MAP_ELEMENT_DIRECTION_MASK;
|
||||||
sub_6A742F(rideIndex, i, x, y, mapElement, direction ^ 2);
|
footpath_chain_ride_queue(rideIndex, i, x, y, mapElement, direction ^ 2);
|
||||||
} while (!map_element_is_last_for_tile(mapElement++));
|
} while (!map_element_is_last_for_tile(mapElement++));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,15 +19,16 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#include "../addresses.h"
|
#include "../addresses.h"
|
||||||
#include "../game.h"
|
|
||||||
#include "../localisation/localisation.h"
|
|
||||||
#include "../util/util.h"
|
|
||||||
#include "footpath.h"
|
|
||||||
#include "../management/finance.h"
|
|
||||||
#include "map.h"
|
|
||||||
#include "scenery.h"
|
|
||||||
#include "../cheats.h"
|
#include "../cheats.h"
|
||||||
#include "../config.h"
|
#include "../config.h"
|
||||||
|
#include "../game.h"
|
||||||
|
#include "../localisation/localisation.h"
|
||||||
|
#include "../management/finance.h"
|
||||||
|
#include "../util/util.h"
|
||||||
|
#include "footpath.h"
|
||||||
|
#include "map.h"
|
||||||
|
#include "map_animation.h"
|
||||||
|
#include "scenery.h"
|
||||||
|
|
||||||
void footpath_interrupt_peeps(int x, int y, int z);
|
void footpath_interrupt_peeps(int x, int y, int z);
|
||||||
|
|
||||||
|
@ -210,7 +211,7 @@ static money32 footpath_element_update(int x, int y, rct_map_element *mapElement
|
||||||
return MONEY32_UNDEFINED;
|
return MONEY32_UNDEFINED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((unk6 & 0x40) && (mapElement->type & 1)) {
|
if ((unk6 & 0x40) && footpath_element_is_queue(mapElement)) {
|
||||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CANNOT_PLACE_THESE_ON_QUEUE_LINE_AREA;
|
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CANNOT_PLACE_THESE_ON_QUEUE_LINE_AREA;
|
||||||
return MONEY32_UNDEFINED;
|
return MONEY32_UNDEFINED;
|
||||||
}
|
}
|
||||||
|
@ -220,7 +221,7 @@ static money32 footpath_element_update(int x, int y, rct_map_element *mapElement
|
||||||
return MONEY32_UNDEFINED;
|
return MONEY32_UNDEFINED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((unk6 & 0x100) && !(mapElement->type & 1)) {
|
if ((unk6 & 0x100) && !footpath_element_is_queue(mapElement)) {
|
||||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CAN_ONLY_PLACE_THESE_ON_QUEUE_AREA;
|
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_CAN_ONLY_PLACE_THESE_ON_QUEUE_AREA;
|
||||||
return MONEY32_UNDEFINED;
|
return MONEY32_UNDEFINED;
|
||||||
}
|
}
|
||||||
|
@ -686,9 +687,95 @@ void sub_6A6C66(int x, int y, rct_map_element *mapElement, int flags)
|
||||||
*
|
*
|
||||||
* rct2: 0x006A742F
|
* rct2: 0x006A742F
|
||||||
*/
|
*/
|
||||||
void sub_6A742F(int rideIndex, int entranceIndex, int x, int y, rct_map_element *mapElement, int direction)
|
void footpath_chain_ride_queue(int rideIndex, int entranceIndex, int x, int y, rct_map_element *mapElement, int direction)
|
||||||
{
|
{
|
||||||
RCT2_CALLPROC_X(0x006A742F, x, direction, y, (entranceIndex << 8) | rideIndex, (int)mapElement, 0, 0);
|
rct_map_element *lastPathElement, *lastQueuePathElement;
|
||||||
|
int lastPathX, lastPathY, lastPathDirection;
|
||||||
|
|
||||||
|
lastPathElement = NULL;
|
||||||
|
lastQueuePathElement = NULL;
|
||||||
|
int z = mapElement->base_height;
|
||||||
|
for (;;) {
|
||||||
|
if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_PATH) {
|
||||||
|
lastPathElement = mapElement;
|
||||||
|
lastPathX = x;
|
||||||
|
lastPathY = y;
|
||||||
|
lastPathDirection = direction;
|
||||||
|
if (footpath_element_is_sloped(mapElement)) {
|
||||||
|
if (footpath_element_get_slope_direction(mapElement) == direction) {
|
||||||
|
z += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
x += TileDirectionDelta[direction].x;
|
||||||
|
y += TileDirectionDelta[direction].y;
|
||||||
|
mapElement = map_get_first_element_at(x >> 5, y >> 5);
|
||||||
|
do {
|
||||||
|
if (lastQueuePathElement == mapElement)
|
||||||
|
continue;
|
||||||
|
if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_PATH)
|
||||||
|
continue;
|
||||||
|
if (mapElement->base_height == z) {
|
||||||
|
if (footpath_element_is_sloped(mapElement)) {
|
||||||
|
if (footpath_element_get_slope_direction(mapElement) != direction)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
goto foundNextPath;
|
||||||
|
}
|
||||||
|
if (mapElement->base_height == z - 2) {
|
||||||
|
if (!footpath_element_is_sloped(mapElement))
|
||||||
|
break;
|
||||||
|
|
||||||
|
if ((footpath_element_get_slope_direction(mapElement) ^ 2) != direction)
|
||||||
|
break;
|
||||||
|
|
||||||
|
z -= 2;
|
||||||
|
goto foundNextPath;
|
||||||
|
}
|
||||||
|
} while (!map_element_is_last_for_tile(mapElement++));
|
||||||
|
break;
|
||||||
|
|
||||||
|
foundNextPath:
|
||||||
|
if (footpath_element_is_queue(mapElement)) {
|
||||||
|
mapElement->properties.path.type &= ~(1 << 3);
|
||||||
|
mapElement->properties.path.edges |= (1 << (direction ^ 2));
|
||||||
|
mapElement->properties.path.ride_index = rideIndex;
|
||||||
|
mapElement->properties.path.additions &= 0x8F;
|
||||||
|
mapElement->properties.path.additions |= (entranceIndex & 7) << 4;
|
||||||
|
if (lastQueuePathElement == NULL) {
|
||||||
|
lastQueuePathElement = mapElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mapElement->properties.path.edges & (1 << direction))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
direction = (direction + 1) & 3;
|
||||||
|
if (mapElement->properties.path.edges & (1 << direction))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
direction ^= 2;
|
||||||
|
if (mapElement->properties.path.edges & (1 << direction))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rideIndex != 255 && lastPathElement != NULL) {
|
||||||
|
if (footpath_element_is_queue(lastPathElement)) {
|
||||||
|
lastPathElement->properties.path.type |= (1 << 3);
|
||||||
|
lastPathElement->type &= 0x3F;
|
||||||
|
lastPathElement->type |= lastPathDirection << 6;
|
||||||
|
|
||||||
|
map_animation_create(
|
||||||
|
MAP_ANIMATION_TYPE_QUEUE_BANNER,
|
||||||
|
lastPathX,
|
||||||
|
lastPathY,
|
||||||
|
lastPathElement->base_height
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -726,7 +813,7 @@ void sub_6A759F()
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
direction = (mapElement->type & 3) ^ 2;
|
direction = (mapElement->type & 3) ^ 2;
|
||||||
sub_6A742F(rideIndex, i, x << 5, y << 5, mapElement, direction);
|
footpath_chain_ride_queue(rideIndex, i, x << 5, y << 5, mapElement, direction);
|
||||||
} while (!map_element_is_last_for_tile(mapElement++));
|
} while (!map_element_is_last_for_tile(mapElement++));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -885,13 +972,9 @@ int footpath_element_get_slope_direction(rct_map_element *mapElement)
|
||||||
return mapElement->properties.path.type & 3;
|
return mapElement->properties.path.type & 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
bool footpath_element_is_queue(rct_map_element *mapElement)
|
||||||
*
|
|
||||||
* rct2: 0x006A7642
|
|
||||||
*/
|
|
||||||
void sub_6A7642(int x, int y, rct_map_element *mapElement)
|
|
||||||
{
|
{
|
||||||
RCT2_CALLPROC_X(0x006A7642, x, 0, y, 0, (int)mapElement, 0, 0);
|
return mapElement->type & 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -907,6 +990,34 @@ void sub_6A76E9(int rideIndex)
|
||||||
RCT2_GLOBAL(0x00F3EFF4, uint8*)++;
|
RCT2_GLOBAL(0x00F3EFF4, uint8*)++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* rct2: 0x006A7642
|
||||||
|
*/
|
||||||
|
void sub_6A7642(int x, int y, rct_map_element *mapElement)
|
||||||
|
{
|
||||||
|
int elementType = map_element_get_type(mapElement);
|
||||||
|
switch (elementType) {
|
||||||
|
case MAP_ELEMENT_TYPE_PATH:
|
||||||
|
if (footpath_element_is_queue(mapElement)) {
|
||||||
|
sub_6A76E9(mapElement->properties.path.ride_index);
|
||||||
|
for (int direction = 0; direction < 4; direction++) {
|
||||||
|
if (mapElement->properties.path.edges & (1 << direction)) {
|
||||||
|
footpath_chain_ride_queue(255, 0, x, y, mapElement, direction);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mapElement->properties.path.ride_index = 255;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MAP_ELEMENT_TYPE_ENTRANCE:
|
||||||
|
if (mapElement->properties.entrance.type == ENTRANCE_TYPE_RIDE_ENTRANCE) {
|
||||||
|
sub_6A76E9(mapElement->properties.entrance.ride_index);
|
||||||
|
footpath_chain_ride_queue(255, 0, x, y, mapElement, (mapElement->type & MAP_ELEMENT_DIRECTION_MASK) ^ 2);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* rct2: 0x006A6B7F
|
* rct2: 0x006A6B7F
|
||||||
|
@ -915,8 +1026,8 @@ static void footpath_remove_edges_towards_here(int x, int y, int z, int directio
|
||||||
{
|
{
|
||||||
int d;
|
int d;
|
||||||
|
|
||||||
if (mapElement->type & 1) {
|
if (footpath_element_is_queue(mapElement)) {
|
||||||
sub_6A76E9(mapElement->properties.path.addition_status);
|
sub_6A76E9(mapElement->properties.path.ride_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
d = direction ^ 2;
|
d = direction ^ 2;
|
||||||
|
|
|
@ -60,13 +60,14 @@ void footpath_bridge_get_info_from_pos(int screenX, int screenY, int *x, int *y,
|
||||||
void footpath_remove_litter(int x, int y, int z);
|
void footpath_remove_litter(int x, int y, int z);
|
||||||
void sub_6A6C66(int x, int y, rct_map_element *mapElement, int flags);
|
void sub_6A6C66(int x, int y, rct_map_element *mapElement, int flags);
|
||||||
void sub_6A759F();
|
void sub_6A759F();
|
||||||
void sub_6A742F(int rideIndex, int entranceIndex, int x, int y, rct_map_element *mapElement, int direction);
|
void footpath_chain_ride_queue(int rideIndex, int entranceIndex, int x, int y, rct_map_element *mapElement, int direction);
|
||||||
|
|
||||||
void footpath_bridge_get_info_from_pos(int screenX, int screenY, int *x, int *y, int *direction, rct_map_element **mapElement);
|
void footpath_bridge_get_info_from_pos(int screenX, int screenY, int *x, int *y, int *direction, rct_map_element **mapElement);
|
||||||
|
|
||||||
int footpath_is_connected_to_map_edge(int x, int y, int z, int direction, int flags);
|
int footpath_is_connected_to_map_edge(int x, int y, int z, int direction, int flags);
|
||||||
bool footpath_element_is_sloped(rct_map_element *mapElement);
|
bool footpath_element_is_sloped(rct_map_element *mapElement);
|
||||||
int footpath_element_get_slope_direction(rct_map_element *mapElement);
|
int footpath_element_get_slope_direction(rct_map_element *mapElement);
|
||||||
|
bool footpath_element_is_queue(rct_map_element *mapElement);
|
||||||
void footpath_remove_edges_at(int x, int y, rct_map_element *mapElement);
|
void footpath_remove_edges_at(int x, int y, rct_map_element *mapElement);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -34,7 +34,10 @@ typedef struct {
|
||||||
uint8 type; //4
|
uint8 type; //4
|
||||||
uint8 additions; //5
|
uint8 additions; //5
|
||||||
uint8 edges; //6
|
uint8 edges; //6
|
||||||
|
union {
|
||||||
uint8 addition_status; //7
|
uint8 addition_status; //7
|
||||||
|
uint8 ride_index;
|
||||||
|
};
|
||||||
} rct_map_element_path_properties;
|
} rct_map_element_path_properties;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
Loading…
Reference in New Issue