diff --git a/src/ride/track.c b/src/ride/track.c index 0d46dc8bff..41f3b395b6 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -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; diff --git a/src/windows/game_bottom_toolbar.c b/src/windows/game_bottom_toolbar.c index 3c8fabe69b..e76cdd5a5f 100644 --- a/src/windows/game_bottom_toolbar.c +++ b/src/windows/game_bottom_toolbar.c @@ -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; diff --git a/src/windows/guest.c b/src/windows/guest.c index ce9189ad42..18f45f6e30 100644 --- a/src/windows/guest.c +++ b/src/windows/guest.c @@ -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){ diff --git a/src/world/map.c b/src/world/map.c index b99d793d60..b328292405 100644 --- a/src/world/map.c +++ b/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; } /** diff --git a/src/world/park.c b/src/world/park.c index 91b92bfff7..d487006ad6 100644 --- a/src/world/park.c +++ b/src/world/park.c @@ -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