Exemplo n.º 1
0
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);
        }
    }
}
Exemplo n.º 2
0
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);
        }
    }
}