static void track_design_save_add_large_scenery(sint32 x, sint32 y, rct_tile_element *tileElement) { rct_large_scenery_tile *sceneryTiles, *tile; sint32 x0, y0, z0, z; sint32 direction, sequence; sint32 entryType = scenery_large_get_type(tileElement); auto entry = object_entry_get_entry(OBJECT_TYPE_LARGE_SCENERY, entryType); sceneryTiles = get_large_scenery_entry(entryType)->large_scenery.tiles; z = tileElement->base_height; direction = tileElement->type & 3; sequence = scenery_large_get_sequence(tileElement); if (!map_large_scenery_get_origin(x, y, z, direction, sequence, &x0, &y0, &z0, NULL)) { return; } // Iterate through each tile of the large scenery element sequence = 0; for (tile = sceneryTiles; tile->x_offset != -1; tile++, sequence++) { sint16 offsetX = tile->x_offset; sint16 offsetY = tile->y_offset; rotate_map_coordinates(&offsetX, &offsetY, direction); x = x0 + offsetX; y = y0 + offsetY; z = (z0 + tile->z_offset) / 8; tileElement = map_get_large_scenery_segment(x, y, z, direction, sequence); if (tileElement != nullptr) { if (sequence == 0) { uint8 flags = tileElement->type & 3; uint8 primaryColour = scenery_large_get_primary_colour(tileElement); uint8 secondaryColour = scenery_large_get_secondary_colour(tileElement); track_design_save_push_tile_element_desc(entry, x, y, z, flags, primaryColour, secondaryColour); } track_design_save_push_tile_element(x, y, tileElement); } } }
static void track_design_save_add_large_scenery(sint32 x, sint32 y, rct_map_element *mapElement) { rct_large_scenery_tile *sceneryTiles, *tile; sint32 x0, y0, z0, z; sint32 direction, sequence; sint32 entryType = mapElement->properties.scenerymultiple.type & 0x3FF; rct_object_entry *entry = (rct_object_entry*)&object_entry_groups[OBJECT_TYPE_LARGE_SCENERY].entries[entryType]; sceneryTiles = get_large_scenery_entry(entryType)->large_scenery.tiles; z = mapElement->base_height; direction = mapElement->type & 3; sequence = mapElement->properties.scenerymultiple.type >> 10; if (!map_large_scenery_get_origin(x, y, z, direction, sequence, &x0, &y0, &z0, NULL)) { return; } // Iterate through each tile of the large scenery element sequence = 0; for (tile = sceneryTiles; tile->x_offset != -1; tile++, sequence++) { sint16 offsetX = tile->x_offset; sint16 offsetY = tile->y_offset; rotate_map_coordinates(&offsetX, &offsetY, direction); x = x0 + offsetX; y = y0 + offsetY; z = (z0 + tile->z_offset) / 8; mapElement = map_get_large_scenery_segment(x, y, z, direction, sequence); if (mapElement != NULL) { if (sequence == 0) { uint8 flags = mapElement->type & 3; uint8 primaryColour = mapElement->properties.scenerymultiple.colour[0] & 0x1F; uint8 secondaryColour = mapElement->properties.scenerymultiple.colour[1] & 0x1F; track_design_save_push_map_element_desc(entry, x, y, z, flags, primaryColour, secondaryColour); } track_design_save_push_map_element(x, y, mapElement); } } }