From 0f6c8b8760d34cd841c94e63d26c0bea4095955b Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sat, 16 Jan 2016 11:04:06 +0000 Subject: [PATCH] Refactor get small scenery to prevent repeats of #2735. --- src/world/map.c | 28 ++++++---------------------- src/world/map.h | 2 +- 2 files changed, 7 insertions(+), 23 deletions(-) diff --git a/src/world/map.c b/src/world/map.c index 1729b5ceea..43ee97ee1f 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -985,9 +985,8 @@ void game_command_set_scenery_colour(int* eax, int* ebx, int* ecx, int* edx, int uint8 color1 = *ebp; uint8 color2 = *ebp >> 8; uint8 flags = *ebx & 0xFF; - // Note this is not just the type it also contains quadrant information - // for small tiles that take up less than a full tile. - uint8 type = (*ebx >> 8) & 0xFF; + // Note this function is passed type. + uint8 quadrant = ((*ebx >> 8) & 0xFF) >> 6; int z = base_height * 8; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_X, uint16) = x + 16; RCT2_GLOBAL(RCT2_ADDRESS_COMMAND_MAP_Y, uint16) = y + 16; @@ -1001,30 +1000,13 @@ void game_command_set_scenery_colour(int* eax, int* ebx, int* ecx, int* edx, int } bool found = false; - rct_map_element *map_element = map_get_first_element_at(x >> 5, y >> 5); + rct_map_element *map_element = map_get_small_scenery_element_at(x, y, base_height, scenery_type, quadrant); if (map_element == NULL) { *ebx = 0; return; } - do { - // Note this is not just checking for type. See above. - if (map_element->type != type) - continue; - if (map_element->base_height != base_height) - continue; - if (map_element->properties.scenery.type != scenery_type) - continue; - found = true; - break; - } while (!map_element_is_last_for_tile(map_element++)); - - if (found == false) { - *ebx = 0; - return; - } - if((flags & GAME_COMMAND_FLAG_GHOST) && !(map_element->flags & MAP_ELEMENT_FLAG_GHOST)){ *ebx = 0; return; @@ -4389,12 +4371,14 @@ rct_map_element *map_get_fence_element_at(int x, int y, int z, int direction) return NULL; } -rct_map_element *map_get_small_scenery_element_at(int x, int y, int z, int type) +rct_map_element *map_get_small_scenery_element_at(int x, int y, int z, int type, uint8 quadrant) { rct_map_element *mapElement = map_get_first_element_at(x >> 5, y >> 5); do { if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_SCENERY) continue; + if (mapElement->type >> 6 != quadrant) + continue; if (mapElement->base_height != z) continue; if (mapElement->properties.scenery.type != type) diff --git a/src/world/map.h b/src/world/map.h index ae00c163d6..b7607ec970 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -293,7 +293,7 @@ rct_map_element* map_get_banner_element_at(int x, int y, int z, uint8 direction) rct_map_element *map_get_surface_element_at(int x, int y); rct_map_element* map_get_path_element_at(int x, int y, int z); rct_map_element *map_get_fence_element_at(int x, int y, int z, int direction); -rct_map_element *map_get_small_scenery_element_at(int x, int y, int z, int type); +rct_map_element *map_get_small_scenery_element_at(int x, int y, int z, int type, uint8 quadrant); int map_element_height(int x, int y); void sub_68B089(); int map_coord_is_connected(int x, int y, int z, uint8 faceDirection);