Beispiel #1
0
static void window_tile_inspector_tool_down()
{
	short widgetIndex;
	rct_window* w;
	short x, y;
	int direction;

	window_tool_get_registers(w, widgetIndex, x, y);
	screen_pos_to_map_pos(&x, &y, &direction);

	if (x == (short)0x8000) {
		return;
	}

	window_tile_inspector_tile_x = x >> 5;
	window_tile_inspector_tile_y = y >> 5;

	rct_map_element *element = map_get_first_element_at(window_tile_inspector_tile_x, window_tile_inspector_tile_y);
	int numItems = 0;
	do {
		numItems++;
	} while (!map_element_is_last_for_tile(element++));

	window_tile_inspector_item_count = numItems;

	w->scrolls[0].v_top = 0;
	window_invalidate(w);
}
Beispiel #2
0
/**
 *
 *  rct2: 0x006B7EAB
 */
static int banner_get_ride_index_at(int x, int y, int z)
{
	rct_map_element *mapElement;
	rct_ride *ride;
	int rideIndex, resultRideIndex;

	resultRideIndex = -1;
	mapElement = map_get_first_element_at(x >> 5, y >> 5);
	do {
		if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK)
			continue;

		rideIndex = mapElement->properties.track.ride_index;
		ride = get_ride(rideIndex);
		if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IS_SHOP))
			continue;

		if ((mapElement->clearance_height * 8) + 32 <= z)
			continue;

		resultRideIndex = rideIndex;
	} while (!map_element_is_last_for_tile(mapElement++));

	return resultRideIndex;
}
Beispiel #3
0
rct_map_element *banner_get_map_element(int bannerIndex)
{
	rct_banner *banner = &gBanners[bannerIndex];
	rct_map_element *mapElement = map_get_first_element_at(banner->x, banner->y);
	do {
		if (map_element_get_banner_index(mapElement) == bannerIndex) {
			return mapElement;
		}
	} while (!map_element_is_last_for_tile(mapElement++));
	return NULL;
}
/**
 *
 *  rct2: 0x006D303D
 */
void track_design_save_select_nearby_scenery(sint32 rideIndex)
{
    rct_map_element *mapElement;

    for (sint32 y = 0; y < 256; y++) {
        for (sint32 x = 0; x < 256; x++) {
            mapElement = map_get_first_element_at(x, y);
            do {
                if (track_design_save_should_select_scenery_around(rideIndex, mapElement)) {
                    track_design_save_select_nearby_scenery_for_tile(rideIndex, x, y);
                    break;
                }
            } while (!map_element_is_last_for_tile(mapElement++));
        }
    }
    gfx_invalidate_screen();
}
Beispiel #5
0
/** rct2: 0x008861A4 */
static void paint_roto_drop_tower_section(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement)
{
	if (trackSequence == 1) {
		return;
	}

	uint32 imageId = SPR_ROTO_DROP_TOWER_SEGMENT | gTrackColours[SCHEME_TRACK];
	sub_98197C(imageId, 0, 0, 2, 2, 30, height, 8, 8, height, get_current_rotation());

	rct_map_element * nextMapElement = mapElement + 1;
	if (map_element_is_last_for_tile(mapElement) || mapElement->clearance_height != nextMapElement->base_height) {
		uint32 imageId = SPR_ROTO_DROP_TOWER_SEGMENT_TOP | gTrackColours[SCHEME_TRACK];
		sub_98199C(imageId, 0, 0, 2, 2, 30, height, 8, 8, height, get_current_rotation());
	}

	paint_util_set_segment_support_height(SEGMENTS_ALL, 0xFFFF, 0);

	paint_util_set_vertical_tunnel(height + 32);
	paint_util_set_general_support_height(height + 32, 0x20);
}
Beispiel #6
0
void scenery_update_tile(int x, int y)
{
	rct_map_element *mapElement;

	mapElement = map_get_first_element_at(x >> 5, y >> 5);
	do {
		if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_SCENERY) {
			scenery_update_age(x, y, mapElement);
		} else if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_PATH) {
			if (footpath_element_has_path_scenery(mapElement) && !footpath_element_path_scenery_is_ghost(mapElement)) {
				rct_scenery_entry *sceneryEntry;
				sceneryEntry = g_pathBitSceneryEntries[footpath_element_get_path_scenery_index(mapElement)];
				if (sceneryEntry->path_bit.var_06 & PATH_BIT_FLAG_JUMPING_FOUNTAIN_WATER) {
					jumping_fountain_begin(JUMPING_FOUNTAIN_TYPE_WATER, x, y, mapElement);
				} else if (sceneryEntry->path_bit.var_06 & PATH_BIT_FLAG_JUMPING_FOUNTAIN_SNOW) {
					jumping_fountain_begin(JUMPING_FOUNTAIN_TYPE_SNOW, x, y, mapElement);
				}
			}
		}
	} while (!map_element_is_last_for_tile(mapElement++));
}
Beispiel #7
0
void scenery_update_tile(int x, int y)
{
	rct_map_element *mapElement;

	mapElement = map_get_first_element_at(x >> 5, y >> 5);
	do {
		if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_SCENERY) {
			scenery_update_age(x, y, mapElement);
		} else if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_PATH) {
			int additions = mapElement->properties.path.additions & 0x0F;
			if (additions != 0 && !(mapElement->properties.path.additions & 0x80)) {
				rct_scenery_entry *sceneryEntry;
				sceneryEntry = g_pathBitSceneryEntries[additions - 1];
				if (sceneryEntry->path_bit.var_06 & PATH_BIT_FLAG_JUMPING_FOUNTAIN_WATER) {
					jumping_fountain_begin(JUMPING_FOUNTAIN_TYPE_WATER, x, y, mapElement);
				} else if (sceneryEntry->path_bit.var_06 & PATH_BIT_FLAG_JUMPING_FOUNTAIN_SNOW) {
					jumping_fountain_begin(JUMPING_FOUNTAIN_TYPE_SNOW, x, y, mapElement);
				}
			}
		}
	} while (!map_element_is_last_for_tile(mapElement++));
}
Beispiel #8
0
static void window_tile_inspector_scrollpaint()
{
	int x = 15, y = 11 * (window_tile_inspector_item_count - 1), i = 0;
	rct_window *w;
	rct_drawpixelinfo *dpi;
	char buffer[256];

	window_paint_get_registers(w, dpi);

	if (window_tile_inspector_tile_x == -1)
		return;

	rct_map_element *element = map_get_first_element_at(window_tile_inspector_tile_x, window_tile_inspector_tile_y);

	do {

		int type = map_element_get_type(element);
		char *type_name;
		int base_height = element->base_height;
		int clearance_height = element->clearance_height;

		if ((i & 1) != 0)
			gfx_fill_rect(dpi, x - 15, y, x + WW - 20, y + 11, RCT2_GLOBAL(0x0141FC4A + (w->colours[1] * 8), uint8) | 0x1000000);

		switch (type) {
			case MAP_ELEMENT_TYPE_SURFACE:
				sprintf(
					buffer,
					"Surface (%s, %s)",
					language_get_string(STR_TILE_INSPECTOR_TERRAIN_START + map_element_get_terrain(element)),
					language_get_string(STR_TILE_INSPECTOR_TERRAIN_EDGE_START + map_element_get_terrain_edge(element))
				);
				type_name = buffer;
				break;
			case MAP_ELEMENT_TYPE_PATH:
			{
				// TODO: use these
				uint8 pathType, pathDirection;
				pathType = element->properties.path.type >> 2;
				pathDirection = element->properties.path.type & 3;
			}
			sprintf(
				buffer,
				"Path (%s)",
				"" // TODO: queue? has bins? has benches? e.t.c.
			);
			type_name = buffer;
			break;
			case MAP_ELEMENT_TYPE_TRACK:
				type_name = "Track"; // TODO: show type?
				break;
			case MAP_ELEMENT_TYPE_SCENERY:
				sprintf(
					buffer,
					"Scenery (%s)",
					language_get_string(g_smallSceneryEntries[element->properties.scenery.type]->name)
				);
				type_name = buffer;
				break;
			case MAP_ELEMENT_TYPE_ENTRANCE:
				sprintf(
					buffer,
					"Entrance (%s)",
					language_get_string(STR_TILE_INSPECTOR_ENTRANCE_START + element->properties.entrance.type)
					);
				type_name = buffer;
				break;
			case MAP_ELEMENT_TYPE_FENCE:
				sprintf(
					buffer,
					"Fence (%s)",
					language_get_string(g_wallSceneryEntries[element->properties.scenery.type]->name)
					);
				type_name = buffer;
				break;
			case MAP_ELEMENT_TYPE_SCENERY_MULTIPLE:
				type_name = "Scenery multiple";
				break;
			case MAP_ELEMENT_TYPE_BANNER:
				sprintf(
					buffer,
					"Banner (%d)",
					element->properties.banner.index
				);
				type_name = buffer;
				break;
		}

		gfx_draw_string(dpi, type_name, 12, x, y);
		gfx_draw_string_left(dpi, 5182, &base_height, 12, x + 200, y);
		gfx_draw_string_left(dpi, 5182, &clearance_height, 12, x + 280, y);

		uint8 flags = element->flags;
		char j;

		buffer[8] = '\0';

		for (j = 7; j >= 0; j--, flags >>= 1) {
			buffer[j] = flags & 1 ? '1' : '0';
		}

		gfx_draw_string(dpi, buffer, 12, x + 390, y);

		y -= 11;
		i++;

	} while (!map_element_is_last_for_tile(element++));

}
Beispiel #9
0
/**
 *
 *  rct2: 0x0068B3FB
 */
static void sub_68B3FB(sint32 x, sint32 y)
{
    rct_drawpixelinfo *dpi = unk_140E9A8;

    gLeftTunnelCount = 0;
    gRightTunnelCount = 0;
    gLeftTunnels[0] = (tunnel_entry){0xFF, 0xFF};
    gRightTunnels[0] = (tunnel_entry){0xFF, 0xFF};

    gVerticalTunnelHeight = 0xFF;

#ifndef NO_RCT2
    RCT2_GLOBAL(0x009DE56A, uint16) = x;
    RCT2_GLOBAL(0x009DE56E, uint16) = y;
#endif
    gPaintMapPosition.x = x;
    gPaintMapPosition.y = y;

    rct_map_element* map_element = map_get_first_element_at(x >> 5, y >> 5);
    uint8 rotation = get_current_rotation();

    /* Check if the first (lowest) map_element is below the clip
     * height. */
    if ((gCurrentViewportFlags & VIEWPORT_FLAG_PAINT_CLIP_TO_HEIGHT) && (map_element->base_height > gClipHeight)) {
        blank_tiles_paint(x, y);
        return;
    }

    sint32 dx = 0;
    switch (rotation) {
    case 0:
        dx = x + y;
        break;
    case 1:
        x += 32;
        dx = y - x;
        break;
    case 2:
        x += 32;
        y += 32;
        dx = -(x + y);
        break;
    case 3:
        y += 32;
        dx = x - y;
        break;
    }
    dx >>= 1;
    // Display little yellow arrow when building footpaths?
    if ((gMapSelectFlags & MAP_SELECT_FLAG_ENABLE_ARROW) &&
        gPaintMapPosition.x == gMapSelectArrowPosition.x &&
        gPaintMapPosition.y == gMapSelectArrowPosition.y
    ) {
        uint8 arrowRotation =
            (rotation
            + (gMapSelectArrowDirection & 3)) & 3;

        uint32 imageId =
            arrowRotation +
            (gMapSelectArrowDirection & 0xFC) +
            0x20900C27;
        sint32 arrowZ = gMapSelectArrowPosition.z;

        gUnk9DE568 = x;
        gUnk9DE56C = y;
        gPaintInteractionType = VIEWPORT_INTERACTION_ITEM_NONE;

        sub_98197C(imageId, 0, 0, 32, 32, 0xFF, arrowZ, 0, 0, arrowZ + 18, rotation);
    }
    sint32 bx = dx + 52;

    if (bx <= dpi->y)
        return;

    const rct_map_element* element = map_element;//push map_element

    sint16 max_height = 0;
    do{
        max_height = max(max_height, element->clearance_height);
    } while (!map_element_is_last_for_tile(element++));

    element--;

    if (map_element_get_type(element) == MAP_ELEMENT_TYPE_SURFACE &&
        (map_get_water_height(element) > 0))
    {
        max_height = map_get_water_height(element) * 2;
    }

    max_height *= 8;

    dx -= max_height + 32;

    element = map_element;//pop map_element
    dx -= dpi->height;
    if (dx >= dpi->y)
        return;

    gUnk9DE568 = x;
    gUnk9DE56C = y;
    gDidPassSurface = false;
    do {
        // Only paint map_elements below the clip height.
        if ((gCurrentViewportFlags & VIEWPORT_FLAG_PAINT_CLIP_TO_HEIGHT) && (map_element->base_height > gClipHeight)) break;

        sint32 direction = map_element_get_direction_with_offset(map_element, rotation);
        sint32 height = map_element->base_height * 8;

        rct_xy16 dword_9DE574 = gPaintMapPosition;
        g_currently_drawn_item = map_element;
        // Setup the painting of for example: the underground, signs, rides, scenery, etc.
        switch (map_element_get_type(map_element))
        {
        case MAP_ELEMENT_TYPE_SURFACE:
            surface_paint(direction, height, map_element);
            break;
        case MAP_ELEMENT_TYPE_PATH:
            path_paint(direction, height, map_element);
            break;
        case MAP_ELEMENT_TYPE_TRACK:
            track_paint(direction, height, map_element);
            break;
        case MAP_ELEMENT_TYPE_SCENERY:
            scenery_paint(direction, height, map_element);
            break;
        case MAP_ELEMENT_TYPE_ENTRANCE:
            entrance_paint(direction, height, map_element);
            break;
        case MAP_ELEMENT_TYPE_WALL:
            fence_paint(direction, height, map_element);
            break;
        case MAP_ELEMENT_TYPE_SCENERY_MULTIPLE:
            scenery_multiple_paint(direction, height, map_element);
            break;
        case MAP_ELEMENT_TYPE_BANNER:
            banner_paint(direction, height, map_element);
            break;
        // A corrupt element inserted by OpenRCT2 itself, which skips the drawing of the next element only.
        case MAP_ELEMENT_TYPE_CORRUPT:
            if (map_element_is_last_for_tile(map_element))
                return;
            map_element++;
            break;
        default:
            // An undefined map element is most likely a corrupt element inserted by 8 cars' MOM feature to skip drawing of all elements after it.
            return;
        }
        gPaintMapPosition = dword_9DE574;
    } while (!map_element_is_last_for_tile(map_element++));

    if (!gShowSupportSegmentHeights) {
        return;
    }

    if (map_element_get_type(map_element - 1) == MAP_ELEMENT_TYPE_SURFACE) {
        return;
    }

    static const sint32 segmentPositions[][3] = {
        {0, 6, 2},
        {5, 4, 8},
        {1, 7, 3},
    };

    for (sint32 sy = 0; sy < 3; sy++) {
        for (sint32 sx = 0; sx < 3; sx++) {
            uint16 segmentHeight = gSupportSegments[segmentPositions[sy][sx]].height;
            sint32 imageColourFlats = 0b101111 << 19 | IMAGE_TYPE_TRANSPARENT;
            if (segmentHeight == 0xFFFF) {
                segmentHeight = gSupport.height;
                // white: 0b101101
                imageColourFlats = 0b111011 << 19 | IMAGE_TYPE_TRANSPARENT;
            }

            // Only draw supports below the clipping height.
            if ((gCurrentViewportFlags & VIEWPORT_FLAG_PAINT_CLIP_TO_HEIGHT) && (segmentHeight > gClipHeight)) continue;

            sint32 xOffset = sy * 10;
            sint32 yOffset = -22 + sx * 10;
            paint_struct * ps = sub_98197C(5504 | imageColourFlats, xOffset, yOffset, 10, 10, 1, segmentHeight, xOffset + 1, yOffset + 16, segmentHeight, get_current_rotation());
            if (ps != NULL) {
                ps->flags &= PAINT_STRUCT_FLAG_IS_MASKED;
                ps->colour_image_id = COLOUR_BORDEAUX_RED;
            }

        }
    }
}
Beispiel #10
0
/**
 *
 *  rct2: 0x006E2712
 */
void scenery_remove_ghost_tool_placement(){
	sint16 x, y, z;

	x = RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_X, sint16);
	y = RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Y, sint16);
	z = RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_Z, uint8);

	if (RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) & (1 << 0)){
		RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) &= ~(1 << 0);
		game_do_command(
			x,
			105 | (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_MAP_ELEMENT_TYPE, uint8) << 8),
			y,
			z | (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_SELECTED_OBJECT, uint8) << 8),
			GAME_COMMAND_REMOVE_SCENERY,
			0,
			0);
	}

	if (RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) & (1 << 1)){
		RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) &= ~(1 << 1);
		rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32);

		do{
			if (map_element_get_type(map_element) != MAP_ELEMENT_TYPE_PATH)
				continue;

			if (map_element->base_height != z)
				continue;

			game_do_command(
				x,
				233 | (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_TARGET_PATH_INCLINE, uint8) << 8),
				y,
				z | (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_TARGET_PATH_TYPE, uint8) << 8),
				GAME_COMMAND_PLACE_PATH,
				RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_PATH_OBJECT_TYPE, uint32) & 0xFFFF0000,
				0);
			break;
		} while (!map_element_is_last_for_tile(map_element++));
	}

	if (RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) & (1 << 2)){
		RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) &= ~(1 << 2);
		game_do_command(
			x,
			105 | (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_MAP_ELEMENT_TYPE, uint8) << 8),
			y,
			RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_WALL_ROTATION, uint8) |(z << 8),
			GAME_COMMAND_REMOVE_FENCE,
			0,
			0);
	}

	if (RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) & (1 << 3)){
		RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) &= ~(1 << 3);
		game_do_command(
			x,
			105 | (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_ROTATION, uint8) << 8),
			y,
			z,
			GAME_COMMAND_REMOVE_LARGE_SCENERY,
			0,
			0);
	}

	if (RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) & (1 << 4)){
		RCT2_GLOBAL(RCT2_ADDRESS_GHOST_SCENERY_TYPE, uint8) &= ~(1 << 4);
		game_do_command(
			x,
			105,
			y,
			z | (RCT2_GLOBAL(RCT2_ADDRESS_SCENERY_ROTATION, uint8) << 8),
			GAME_COMMAND_REMOVE_BANNER,
			0,
			0);
	}
}
Beispiel #11
0
/* 0x006E2712 */
void scenery_remove_ghost_tool_placement(){
	sint16 x, y, z;

	x = RCT2_GLOBAL(0x00F64EC4, sint16);
	y = RCT2_GLOBAL(0x00F64EC6, sint16);
	z = RCT2_GLOBAL(0x00F64F09, uint8);

	if (RCT2_GLOBAL(0x00F64F0D, uint8) & (1 << 0)){
		RCT2_GLOBAL(0x00F64F0D, uint8) &= ~(1 << 0);

		game_do_command(
			x, 
			105 | (RCT2_GLOBAL(0x00F64F0C, uint8) << 8), 
			y, 
			z | (RCT2_GLOBAL(0x00F64EDA, uint8) << 8), 
			GAME_COMMAND_REMOVE_SCENERY,
			0, 
			0);
	}

	if (RCT2_GLOBAL(0x00F64F0D, uint8) & (1 << 1)){
		RCT2_GLOBAL(0x00F64F0D, uint8) &= ~(1 << 1);

		rct_map_element* map_element = map_get_first_element_at(x / 32, y / 32);

		do{
			if (map_element_get_type(map_element) != MAP_ELEMENT_TYPE_PATH)
				continue;

			if (map_element->base_height != z)
				continue;

			game_do_command(
				x,
				233 | (RCT2_GLOBAL(0x00F64F0F, uint8) << 8),
				y,
				z | (RCT2_GLOBAL(0x00F64F10, uint8) << 8),
				GAME_COMMAND_PLACE_PATH,
				RCT2_GLOBAL(0x00F64EAC, uint32) & 0xFFFF0000,
				0);
			break;
		} while (!map_element_is_last_for_tile(map_element++));
	}

	if (RCT2_GLOBAL(0x00F64F0D, uint8) & (1 << 2)){
		RCT2_GLOBAL(0x00F64F0D, uint8) &= ~(1 << 2);

		game_do_command(
			x,
			105 | (RCT2_GLOBAL(0x00F64F0C, uint8) << 8),
			y,
			RCT2_GLOBAL(0x00F64F11, uint8) |(z << 8),
			GAME_COMMAND_REMOVE_FENCE,
			0,
			0);
	}

	if (RCT2_GLOBAL(0x00F64F0D, uint8) & (1 << 3)){
		RCT2_GLOBAL(0x00F64F0D, uint8) &= ~(1 << 3);

		game_do_command(
			x,
			105 | (RCT2_GLOBAL(0x00F64EC0, uint8) << 8),
			y,
			z,
			GAME_COMMAND_REMOVE_LARGE_SCENERY,
			0,
			0);
	}

	if (RCT2_GLOBAL(0x00F64F0D, uint8) & (1 << 4)){
		RCT2_GLOBAL(0x00F64F0D, uint8) &= ~(1 << 4);

		game_do_command(
			x,
			105,
			y,
			z | (RCT2_GLOBAL(0x00F64EC0, uint8) << 8),
			GAME_COMMAND_REMOVE_BANNER,
			0,
			0);
	}
}