/** * * rct2: 0x0068B089 */ void sub_68B089() { int i; rct_map_element *mapElementFirst, *mapElement; if (RCT2_GLOBAL(0x009DEA6F, uint8) & 1) return; i = RCT2_GLOBAL(0x0010E63B8, uint32); do { i++; if (i >= MAX_TILE_MAP_ELEMENT_POINTERS) i = 0; } while (TILE_MAP_ELEMENT_POINTER(i) == TILE_UNDEFINED_MAP_ELEMENT); RCT2_GLOBAL(0x0010E63B8, uint32) = i; mapElementFirst = mapElement = TILE_MAP_ELEMENT_POINTER(i); do { mapElement--; if (mapElement < (rct_map_element*)RCT2_ADDRESS_MAP_ELEMENTS) break; } while (mapElement->base_height == 255); mapElement++; if (mapElement == mapElementFirst) return; // TILE_MAP_ELEMENT_POINTER(i) = mapElement; do { *mapElement = *mapElementFirst; mapElementFirst->base_height = 255; mapElement++; mapElementFirst++; } while (!((mapElement - 1)->flags & MAP_ELEMENT_FLAG_LAST_TILE)); // Update next free element? mapElement = RCT2_GLOBAL(0x0140E9A4, rct_map_element*); do { mapElement--; } while (mapElement->base_height == 255); mapElement++; RCT2_GLOBAL(0x0140E9A4, rct_map_element*) = mapElement; }
rct_map_element *map_get_surface_element_at(int x, int y) { // Get first element of the tile rct_map_element *mapElement = TILE_MAP_ELEMENT_POINTER(y * 256 + x); // Find the first surface element while ((mapElement->type & MAP_ELEMENT_TYPE_MASK) != MAP_ELEMENT_TYPE_SURFACE) { // Check if last element on tile if (mapElement->flags & MAP_ELEMENT_FLAG_LAST_TILE) return NULL; mapElement++; } return mapElement; }
/** * * rct2: 0x0068AFFD */ void map_update_tile_pointers() { int i, x, y, lastTile; for (i = 0; i < MAX_TILE_MAP_ELEMENT_POINTERS; i++) TILE_MAP_ELEMENT_POINTER(i) = TILE_UNDEFINED_MAP_ELEMENT; rct_map_element *mapElement = RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS, rct_map_element); rct_map_element **tile = RCT2_ADDRESS(RCT2_ADDRESS_TILE_MAP_ELEMENT_POINTERS, rct_map_element*); for (y = 0; y < 256; y++) { for (x = 0; x < 256; x++) { *tile++ = mapElement; do { lastTile = (mapElement->flags & MAP_ELEMENT_FLAG_LAST_TILE); mapElement++; } while (!lastTile); } } // Possible next free map element RCT2_GLOBAL(0x0140E9A4, rct_map_element*) = mapElement; }
/** * * rct2: 0x006BA305 */ void window_banner_open(rct_windownumber number) { rct_window* w; rct_widget *viewportWidget; // Check if window is already open w = window_bring_to_front_by_number(WC_BANNER, number); if (w != NULL) return; w = window_create_auto_pos(WW, WH, (uint32*)window_banner_events, WC_BANNER, 0); w->widgets = window_banner_widgets; w->enabled_widgets = (1 << WIDX_CLOSE) | (1 << WIDX_BANNER_TEXT) | (1 << WIDX_BANNER_NO_ENTRY) | (1 << WIDX_BANNER_DEMOLISH) | (1 << WIDX_MAIN_COLOR) | (1 << WIDX_TEXT_COLOR_DROPDOWN) | (1 << WIDX_TEXT_COLOR_DROPDOWN_BUTTON); w->number = number; window_init_scroll_widgets(w); w->colours[0] = 24; w->colours[1] = 24; w->colours[2] = 24; int view_x = gBanners[w->number].x << 5; int view_y = gBanners[w->number].y << 5; int ebp = ((view_y << 8) | view_x) >> 5; rct_map_element* map_element = TILE_MAP_ELEMENT_POINTER(ebp); while(1){ if (((map_element->type & MAP_ELEMENT_TYPE_MASK) == MAP_ELEMENT_TYPE_BANNER) && (map_element->properties.banner.index == w->number)) break; map_element++; } int view_z = map_element->base_height<<3; w->frame_no = view_z; view_x += 16; view_y += 16; // Create viewport viewportWidget = &window_banner_widgets[WIDX_VIEWPORT]; viewport_create( w, w->x + viewportWidget->left + 1, w->y + viewportWidget->top + 1, (viewportWidget->right - viewportWidget->left) - 2, (viewportWidget->bottom - viewportWidget->top) - 2, 0, view_x, view_y, view_z, 0, -1 ); w->viewport->flags = (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_ALWAYS_SHOW_GRIDLINES) ? VIEWPORT_FLAG_GRIDLINES : 0; w->flags |= WF_2; window_invalidate(w); }