Rewrite function clear_elements_at() in a more readable way.

Also, some code has been taken out the main loop, making calls
to this function return faster.
This commit is contained in:
Daniel Trujillo 2016-07-13 01:21:03 +02:00
parent 964cf66f6b
commit d9a2ef1066

View file

@ -4503,35 +4503,15 @@ void map_extend_boundary_surface()
} }
/** /**
* Clears all elements properly from a certain tile. * Clears the provided element properly from a certain tile.
* rct2: 0x0068AE2A
*/ */
static void clear_elements_at(int x, int y) void clear_element_at(int x, int y, rct_map_element *element)
{ {
for (;;) { switch (map_element_get_type(element)) {
for (int i = 0; i < 2; i++) {
rct2_peep_spawn *peepSpawn = &gPeepSpawns[i];
if (floor2(peepSpawn->x, 32) == x && floor2(peepSpawn->y, 32) == y) {
peepSpawn->x = UINT16_MAX;
}
}
rct_map_element *mapElement = map_get_first_element_at(x >> 5, y >> 5);
next_element:
switch (map_element_get_type(mapElement)) {
case MAP_ELEMENT_TYPE_SURFACE: case MAP_ELEMENT_TYPE_SURFACE:
mapElement->base_height = 2; break;
mapElement->clearance_height = 2;
mapElement->properties.surface.slope = 0;
mapElement->properties.surface.terrain = 0;
mapElement->properties.surface.grass_length = 1;
mapElement->properties.surface.ownership = 0;
if (!map_element_is_last_for_tile(mapElement++))
goto next_element;
return;
case MAP_ELEMENT_TYPE_ENTRANCE: case MAP_ELEMENT_TYPE_ENTRANCE:
viewport_interaction_remove_park_entrance(mapElement, x, y); viewport_interaction_remove_park_entrance(element, x, y);
break; break;
case MAP_ELEMENT_TYPE_FENCE: case MAP_ELEMENT_TYPE_FENCE:
gGameCommandErrorTitle = STR_CANT_REMOVE_THIS; gGameCommandErrorTitle = STR_CANT_REMOVE_THIS;
@ -4539,7 +4519,7 @@ static void clear_elements_at(int x, int y)
x, x,
GAME_COMMAND_FLAG_APPLY, GAME_COMMAND_FLAG_APPLY,
y, y,
(mapElement->type & MAP_ELEMENT_DIRECTION_MASK) | (mapElement->base_height << 8), (element->type & MAP_ELEMENT_DIRECTION_MASK) | (element->base_height << 8),
GAME_COMMAND_REMOVE_FENCE, GAME_COMMAND_REMOVE_FENCE,
0, 0,
0 0
@ -4549,9 +4529,9 @@ static void clear_elements_at(int x, int y)
gGameCommandErrorTitle = STR_CANT_REMOVE_THIS; gGameCommandErrorTitle = STR_CANT_REMOVE_THIS;
game_do_command( game_do_command(
x, x,
(GAME_COMMAND_FLAG_APPLY) | ((mapElement->type & MAP_ELEMENT_DIRECTION_MASK) << 8), (GAME_COMMAND_FLAG_APPLY) | ((element->type & MAP_ELEMENT_DIRECTION_MASK) << 8),
y, y,
(mapElement->base_height) | (((mapElement->properties.scenerymultiple.type >> 8) >> 2) << 8), (element->base_height) | (((element->properties.scenerymultiple.type >> 8) >> 2) << 8),
GAME_COMMAND_REMOVE_LARGE_SCENERY, GAME_COMMAND_REMOVE_LARGE_SCENERY,
0, 0,
0 0
@ -4563,17 +4543,48 @@ static void clear_elements_at(int x, int y)
x, x,
GAME_COMMAND_FLAG_APPLY, GAME_COMMAND_FLAG_APPLY,
y, y,
(mapElement->base_height) | ((mapElement->properties.banner.position & 3) << 8), (element->base_height) | ((element->properties.banner.position & 3) << 8),
GAME_COMMAND_REMOVE_BANNER, GAME_COMMAND_REMOVE_BANNER,
0, 0,
0 0
); );
break; break;
default: default:
map_element_remove(mapElement); map_element_remove(element);
break; break;
} }
}
/**
* Clears all elements properly from a certain tile.
* rct2: 0x0068AE2A
*/
static void clear_elements_at(int x, int y)
{
for (int i = 0; i < 2; i++) {
rct2_peep_spawn *peepSpawn = &gPeepSpawns[i];
if (floor2(peepSpawn->x, 32) == x && floor2(peepSpawn->y, 32) == y) {
peepSpawn->x = UINT16_MAX;
} }
}
rct_map_element *mapElement = map_get_first_element_at(x >> 5, y >> 5);
if(map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_SURFACE){
mapElement->base_height = 2;
mapElement->clearance_height = 2;
mapElement->properties.surface.slope = 0;
mapElement->properties.surface.terrain = 0;
mapElement->properties.surface.grass_length = 1;
mapElement->properties.surface.ownership = 0;
if (map_element_is_last_for_tile(mapElement++))
return;
}
while(!map_element_is_last_for_tile(mapElement))
clear_element_at(x, y, mapElement);
clear_element_at(x, y, mapElement);
} }
int map_get_highest_z(int tileX, int tileY) int map_get_highest_z(int tileX, int tileY)