Merge pull request #1584 from zsilencer/bugfixes

fix #1570 and possibly #1572
This commit is contained in:
Ted John 2015-07-09 16:59:26 +01:00
commit be4ba5ed1b
1 changed files with 50 additions and 8 deletions

View File

@ -65,6 +65,7 @@ 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_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); static void map_set_grass_length(int x, int y, rct_map_element *mapElement, int length);
static void sub_68AE2A(int x, int y); static void sub_68AE2A(int x, int y);
static void translate_3d_to_2d(int rotation, int *x, int *y);
void rotate_map_coordinates(sint16 *x, sint16 *y, int rotation) void rotate_map_coordinates(sint16 *x, sint16 *y, int rotation)
{ {
@ -2775,25 +2776,66 @@ void map_invalidate_map_selection_tiles()
map_invalidate_tile_full(position->x, position->y); map_invalidate_tile_full(position->x, position->y);
} }
void map_get_bounding_box(int ax, int ay, int bx, int by, int *left, int *top, int *right, int *bottom)
{
int x, y;
x = ax;
y = ay;
translate_3d_to_2d(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32), &x, &y);
*left = x;
*right = x;
*top = y;
*bottom = y;
x = bx;
y = ay;
translate_3d_to_2d(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32), &x, &y);
if (x < *left) *left = x;
if (x > *right) *right = x;
if (y > *bottom) *bottom = y;
if (y < *top) *top = y;
x = bx;
y = by;
translate_3d_to_2d(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32), &x, &y);
if (x < *left) *left = x;
if (x > *right) *right = x;
if (y > *bottom) *bottom = y;
if (y < *top) *top = y;
x = ax;
y = by;
translate_3d_to_2d(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32), &x, &y);
if (x < *left) *left = x;
if (x > *right) *right = x;
if (y > *bottom) *bottom = y;
if (y < *top) *top = y;
}
/** /**
* *
* rct2: 0x0068AAE1 * rct2: 0x0068AAE1
*/ */
void map_invalidate_selection_rect() void map_invalidate_selection_rect()
{ {
int x, y, x0, y0, x1, y1; int x0, y0, x1, y1, left, right, top, bottom;
rct_viewport *viewport;
if (!(RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) & (1 << 0))) if (!(RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16) & (1 << 0)))
return; return;
x0 = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, sint16); x0 = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_X, sint16) + 16;
y0 = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, sint16); y0 = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_A_Y, sint16) + 16;
x1 = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, sint16); x1 = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_X, sint16) + 16;
y1 = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, sint16); y1 = RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_B_Y, sint16) + 16;
map_get_bounding_box(x0, y0, x1, y1, &left, &top, &right, &bottom);
left -= 32;
right += 32;
bottom += 32;
top -= 32 + 2080;
for (x = x0; x <= x1; x++) viewport = RCT2_GLOBAL(RCT2_ADDRESS_ACTIVE_VIEWPORT_PTR_ARRAY, rct_viewport*);
for (y = y0; y <= y1; y++) while (viewport->width != 0) {
map_invalidate_tile_full(x, y); viewport_invalidate(viewport, left, top, right, bottom);
viewport++;
}
} }
/** /**