mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-15 19:13:07 +01:00
@@ -2618,20 +2618,14 @@ int tracked_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* tra
|
||||
return 0;
|
||||
}
|
||||
|
||||
int x = trackElement.x, y = trackElement.y, z = 0;
|
||||
rct_map_element* map_element = trackElement.element;
|
||||
|
||||
int z = 0;
|
||||
//6ce69e
|
||||
|
||||
if (!(sub_6C6402(&map_element, &x, &y, &z))){
|
||||
trackElement.element = map_element;
|
||||
trackElement.x = x;
|
||||
trackElement.y = y;
|
||||
rct_map_element* initial_map = map_element;
|
||||
if (!(sub_6C6402(&trackElement.element, &trackElement.x, &trackElement.y, &z))){
|
||||
rct_map_element* initial_map = trackElement.element;
|
||||
do {
|
||||
x = trackElement.x;
|
||||
y = trackElement.y;
|
||||
map_element = trackElement.element;
|
||||
int x = trackElement.x;
|
||||
int y = trackElement.y;
|
||||
rct_map_element* map_element = trackElement.element;
|
||||
if (sub_6C6402(&map_element, &x, &y, &z)){
|
||||
break;
|
||||
}
|
||||
@@ -2641,9 +2635,9 @@ int tracked_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* tra
|
||||
} while (initial_map != trackElement.element);
|
||||
}
|
||||
|
||||
z = map_element->base_height * 8;
|
||||
uint8 track_type = map_element->properties.track.type;
|
||||
uint8 direction = map_element->type & MAP_ELEMENT_DIRECTION_MASK;
|
||||
z = trackElement.element->base_height * 8;
|
||||
uint8 track_type = trackElement.element->properties.track.type;
|
||||
uint8 direction = trackElement.element->type & MAP_ELEMENT_DIRECTION_MASK;
|
||||
RCT2_GLOBAL(0x00F4414D, uint8) = direction;
|
||||
|
||||
if (sub_6C683D(&trackElement.x, &trackElement.y, &z, direction, track_type, 0, &trackElement.element, 0)){
|
||||
@@ -2762,10 +2756,10 @@ int tracked_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* tra
|
||||
if (location == 0xFFFF)
|
||||
continue;
|
||||
|
||||
x = (location & 0xFF) * 32;
|
||||
y = ((location & 0xFF00) >> 8) * 32;
|
||||
int x = (location & 0xFF) * 32;
|
||||
int y = ((location & 0xFF00) >> 8) * 32;
|
||||
|
||||
map_element = map_get_first_element_at(x / 32, y / 32);
|
||||
rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32);
|
||||
|
||||
do{
|
||||
if (map_element_get_type(map_element) != MAP_ELEMENT_TYPE_ENTRANCE)
|
||||
@@ -2849,10 +2843,10 @@ int tracked_ride_to_td6(uint8 rideIndex, rct_track_td6* track_design, uint8* tra
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, sint16) &= 0xFFF9;
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, sint16) &= 0xFFF7;
|
||||
|
||||
x = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_X_MAX, sint16) -
|
||||
int x = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_X_MAX, sint16) -
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_X_MIN, sint16);
|
||||
|
||||
y = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_Y_MAX, sint16) -
|
||||
int y = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_Y_MAX, sint16) -
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_Y_MIN, sint16);
|
||||
|
||||
x /= 32;
|
||||
|
||||
@@ -150,6 +150,10 @@ void window_game_bottom_toolbar_open()
|
||||
window->frame_no = 0;
|
||||
window_init_scroll_widgets(window);
|
||||
|
||||
// Reset the middle widget to not show by default.
|
||||
// If it is required to be shown news_update will reshow it.
|
||||
window_game_bottom_toolbar_widgets[WIDX_MIDDLE_OUTSET].type = WWT_EMPTY;
|
||||
|
||||
if(!gConfigInterface.rct1_colour_scheme)
|
||||
{
|
||||
window->colours[0] = 140;
|
||||
|
||||
@@ -1579,8 +1579,8 @@ void window_guest_rides_update(){
|
||||
uint8 curr_list_position = 0;
|
||||
for (uint8 ride_id = 0; ride_id < 255; ++ride_id){
|
||||
// Offset to the ride_id bit in peep_rides_been_on
|
||||
uint8 ride_id_bit = ride_id & 0x3;
|
||||
uint8 ride_id_offset = ride_id / 8;
|
||||
uint8 ride_id_bit = ride_id & 0x1F;
|
||||
uint8 ride_id_offset = ride_id / 32;
|
||||
if (peep->rides_been_on[ride_id_offset] & (1 << ride_id_bit)){
|
||||
rct_ride* ride = GET_RIDE(ride_id);
|
||||
if (RCT2_ADDRESS(0x97C3AF, uint8)[ride->type] == 0){
|
||||
|
||||
199
src/world/map.c
199
src/world/map.c
@@ -58,6 +58,28 @@ static void sub_6A87BB(int x, int y);
|
||||
static void map_update_grass_length(int x, int y, rct_map_element *mapElement);
|
||||
static void map_set_grass_length(int x, int y, rct_map_element *mapElement, int length);
|
||||
|
||||
void rotate_map_coordinates(sint16* x, sint16* y, uint8 rotation){
|
||||
int temp;
|
||||
switch (rotation){
|
||||
case MAP_ELEMENT_DIRECTION_WEST:
|
||||
break;
|
||||
case MAP_ELEMENT_DIRECTION_NORTH:
|
||||
temp = *x;
|
||||
*x = *y;
|
||||
*y = -temp;
|
||||
break;
|
||||
case MAP_ELEMENT_DIRECTION_EAST:
|
||||
*x = -*x;
|
||||
*y = -*y;
|
||||
break;
|
||||
case MAP_ELEMENT_DIRECTION_SOUTH:
|
||||
temp = *y;
|
||||
*y = *x;
|
||||
*x = -temp;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void map_element_iterator_begin(map_element_iterator *it)
|
||||
{
|
||||
it->x = 0;
|
||||
@@ -691,17 +713,30 @@ void game_command_remove_large_scenery(int* eax, int* ebx, int* ecx, int* edx, i
|
||||
return;
|
||||
}
|
||||
|
||||
uint8 element_found = 0;
|
||||
rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32);
|
||||
while(map_element_get_type(map_element) != MAP_ELEMENT_TYPE_SCENERY_MULTIPLE ||
|
||||
map_element->base_height != base_height ||
|
||||
map_element->properties.scenerymultiple.type >> 10 != scenerymultiple_index ||
|
||||
(map_element->type & MAP_ELEMENT_DIRECTION_MASK) != map_element_direction){
|
||||
map_element++;
|
||||
if((map_element - 1)->flags & MAP_ELEMENT_FLAG_LAST_TILE){
|
||||
*ebx = 0;
|
||||
return;
|
||||
}
|
||||
do {
|
||||
if (map_element_get_type(map_element) != MAP_ELEMENT_TYPE_SCENERY_MULTIPLE)
|
||||
continue;
|
||||
|
||||
if (map_element->base_height != base_height)
|
||||
continue;
|
||||
|
||||
if ((map_element->properties.scenerymultiple.type >> 10) != scenerymultiple_index)
|
||||
continue;
|
||||
|
||||
if ((map_element->type & MAP_ELEMENT_DIRECTION_MASK) != map_element_direction)
|
||||
continue;
|
||||
|
||||
element_found = 1;
|
||||
break;
|
||||
} while (!map_element_is_last_for_tile(map_element++));
|
||||
|
||||
if (!element_found){
|
||||
*ebx = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
if((*ebx & 0x40) && !(map_element->flags & MAP_ELEMENT_FLAG_5)){
|
||||
*ebx = 0;
|
||||
return;
|
||||
@@ -718,99 +753,75 @@ void game_command_remove_large_scenery(int* eax, int* ebx, int* ecx, int* edx, i
|
||||
user_string_free(gBanners[banner_num].string_idx);
|
||||
}
|
||||
}
|
||||
int x2 = scenery_entry->large_scenery.tiles[ecx2].x_offset;
|
||||
int y2 = scenery_entry->large_scenery.tiles[ecx2].y_offset;
|
||||
int z2 = (base_height * 8) - scenery_entry->large_scenery.tiles[ecx2].z_offset;
|
||||
switch(map_element->type & MAP_ELEMENT_DIRECTION_MASK){
|
||||
case MAP_ELEMENT_DIRECTION_WEST:
|
||||
break;
|
||||
case MAP_ELEMENT_DIRECTION_NORTH:{
|
||||
int temp = x2;
|
||||
x2 = y2;
|
||||
y2 = -temp;
|
||||
}break;
|
||||
case MAP_ELEMENT_DIRECTION_EAST:
|
||||
x2 = -x2;
|
||||
y2 = -y2;
|
||||
break;
|
||||
case MAP_ELEMENT_DIRECTION_SOUTH:{
|
||||
int temp = y2;
|
||||
y2 = x2;
|
||||
x2 = -temp;
|
||||
}break;
|
||||
}
|
||||
x2 = -x2 + x;
|
||||
y2 = -y2 + y;
|
||||
int i = 0;
|
||||
while(1){
|
||||
if(scenery_entry->large_scenery.tiles[i].x_offset == -1){
|
||||
*ebx = scenery_entry->large_scenery.removal_price * 10;
|
||||
if(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY){
|
||||
*ebx = 0;
|
||||
}
|
||||
return;
|
||||
}
|
||||
int x3 = scenery_entry->large_scenery.tiles[i].x_offset;
|
||||
int y3 = scenery_entry->large_scenery.tiles[i].y_offset;
|
||||
int z3 = scenery_entry->large_scenery.tiles[i].z_offset;
|
||||
switch(map_element->type & MAP_ELEMENT_DIRECTION_MASK){
|
||||
case MAP_ELEMENT_DIRECTION_WEST:
|
||||
break;
|
||||
case MAP_ELEMENT_DIRECTION_NORTH:{
|
||||
int temp = x3;
|
||||
x3 = y3;
|
||||
y3 = -temp;
|
||||
}break;
|
||||
case MAP_ELEMENT_DIRECTION_EAST:
|
||||
x3 = -x3;
|
||||
y3 = -y3;
|
||||
break;
|
||||
case MAP_ELEMENT_DIRECTION_SOUTH:{
|
||||
int temp = y3;
|
||||
y3 = x3;
|
||||
x3 = -temp;
|
||||
}break;
|
||||
}
|
||||
x3 += x2;
|
||||
y3 += y2;
|
||||
z3 += z2;
|
||||
|
||||
rct_xyz16 firstTile = {
|
||||
.x = scenery_entry->large_scenery.tiles[ecx2].x_offset,
|
||||
.y = scenery_entry->large_scenery.tiles[ecx2].y_offset,
|
||||
.z = (base_height * 8) - scenery_entry->large_scenery.tiles[ecx2].z_offset
|
||||
};
|
||||
|
||||
rotate_map_coordinates(&firstTile.x, &firstTile.y, map_element_direction);
|
||||
|
||||
firstTile.x = x - firstTile.x;
|
||||
firstTile.y = y - firstTile.y;
|
||||
|
||||
for (int i = 0; scenery_entry->large_scenery.tiles[i].x_offset != -1; i++){
|
||||
|
||||
rct_xyz16 currentTile = {
|
||||
.x = scenery_entry->large_scenery.tiles[i].x_offset,
|
||||
.y = scenery_entry->large_scenery.tiles[i].y_offset,
|
||||
.z = scenery_entry->large_scenery.tiles[i].z_offset
|
||||
};
|
||||
|
||||
rotate_map_coordinates(¤tTile.x, ¤tTile.y, map_element_direction);
|
||||
|
||||
currentTile.x += firstTile.x;
|
||||
currentTile.y += firstTile.y;
|
||||
currentTile.z += firstTile.z;
|
||||
|
||||
if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR)){
|
||||
if (!map_is_location_owned(x3, y3, z3)){
|
||||
if (!map_is_location_owned(currentTile.x, currentTile.y, currentTile.z)){
|
||||
*ebx = MONEY32_UNDEFINED;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if(*ebx & GAME_COMMAND_FLAG_APPLY){
|
||||
rct_map_element* map_element = map_get_first_element_at(x3 / 32, y3 / 32);
|
||||
uint8 tile_not_found = 1;
|
||||
do
|
||||
{
|
||||
if (map_element_get_type(map_element) != MAP_ELEMENT_TYPE_SCENERY_MULTIPLE)
|
||||
continue;
|
||||
|
||||
if ((map_element->type & MAP_ELEMENT_DIRECTION_MASK) != map_element_direction)
|
||||
continue;
|
||||
|
||||
if ((map_element->properties.scenerymultiple.type >> 10) != i)
|
||||
continue;
|
||||
|
||||
if (map_element->base_height != z3 / 8)
|
||||
continue;
|
||||
|
||||
map_invalidate_tile_full(x3, y3);
|
||||
map_element_remove(map_element);
|
||||
tile_not_found = 0;
|
||||
break;
|
||||
} while (!map_element_is_last_for_tile(map_element++));
|
||||
|
||||
if (tile_not_found){
|
||||
log_error("Tile not found when trying to remove element!");
|
||||
}
|
||||
}
|
||||
// If not applying then no need to delete the actual element
|
||||
if (!(*ebx & GAME_COMMAND_FLAG_APPLY))
|
||||
continue;
|
||||
|
||||
i++;
|
||||
rct_map_element* sceneryElement = map_get_first_element_at(currentTile.x / 32, currentTile.y / 32);
|
||||
uint8 tile_not_found = 1;
|
||||
do
|
||||
{
|
||||
if (map_element_get_type(sceneryElement) != MAP_ELEMENT_TYPE_SCENERY_MULTIPLE)
|
||||
continue;
|
||||
|
||||
if ((sceneryElement->type & MAP_ELEMENT_DIRECTION_MASK) != map_element_direction)
|
||||
continue;
|
||||
|
||||
if ((sceneryElement->properties.scenerymultiple.type >> 10) != i)
|
||||
continue;
|
||||
|
||||
if (sceneryElement->base_height != currentTile.z / 8)
|
||||
continue;
|
||||
|
||||
map_invalidate_tile_full(currentTile.x, currentTile.y);
|
||||
map_element_remove(sceneryElement);
|
||||
tile_not_found = 0;
|
||||
break;
|
||||
} while (!map_element_is_last_for_tile(sceneryElement++));
|
||||
|
||||
if (tile_not_found){
|
||||
log_error("Tile not found when trying to remove element!");
|
||||
}
|
||||
}
|
||||
|
||||
*ebx = scenery_entry->large_scenery.removal_price * 10;
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY){
|
||||
*ebx = 0;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -769,7 +769,7 @@ void update_park_fences(int x, int y)
|
||||
fence_required = 0;
|
||||
break;
|
||||
}
|
||||
} while (!map_element_is_last_for_tile(mapElement));
|
||||
} while (!map_element_is_last_for_tile(mapElement++));
|
||||
|
||||
if (fence_required) {
|
||||
// As map_is_location_in_park sets the error text
|
||||
|
||||
Reference in New Issue
Block a user