Ejemplo n.º 1
0
static void DrawLOSPic(
	const Tile *tile, const Pic *pic, const struct vec2i pos,
	const bool useFog)
{
	color_t mask = colorWhite;
	switch (GetTileLOS(tile, useFog))
	{
	case TILE_LOS_NORMAL:
		break;
	case TILE_LOS_FOG:
		mask = colorFog;
		break;
	case TILE_LOS_NONE:
	default:
		// don't draw
		pic = NULL;
		break;
	}
	if (pic != NULL)
	{
		PicRender(
			pic, gGraphicsDevice.gameWindow.renderer, pos, mask, 0, svec2_one()
		);
	}
}
Ejemplo n.º 2
0
static void DrawFloor(DrawBuffer *b, Vec2i offset)
{
	int x, y;
	Vec2i pos;
	const Tile *tile = &b->tiles[0][0];
	const bool useFog = ConfigGetBool(&gConfig, "Game.Fog");
	for (y = 0, pos.y = b->dy + offset.y;
		 y < Y_TILES;
		 y++, pos.y += TILE_HEIGHT)
	{
		for (x = 0, pos.x = b->dx + offset.x;
			x < b->Size.x;
			x++, tile++, pos.x += TILE_WIDTH)
		{
			if (tile->pic != NULL && tile->pic->pic.Data != NULL &&
				!(tile->flags & MAPTILE_IS_WALL))
			{
				switch (GetTileLOS(tile, useFog))
				{
				case TILE_LOS_NORMAL:
					Blit(&gGraphicsDevice, &tile->pic->pic, pos);
					break;
				case TILE_LOS_FOG:
					BlitMasked(
						&gGraphicsDevice,
						&tile->pic->pic,
						pos,
						colorFog,
						false);
					break;
				case TILE_LOS_NONE:
				default:
					// don't draw
					break;
				}
			}
		}
		tile += X_TILES - b->Size.x;
	}
}
Ejemplo n.º 3
0
void DrawWallColumn(int y, Vec2i pos, Tile *tile)
{
	const bool useFog = ConfigGetBool(&gConfig, "Game.Fog");
	while (y >= 0 && (tile->flags & MAPTILE_IS_WALL))
	{
		switch (GetTileLOS(tile, useFog))
		{
		case TILE_LOS_NORMAL:
			Blit(&gGraphicsDevice, &tile->pic->pic, pos);
			break;
		case TILE_LOS_FOG:
			BlitMasked(&gGraphicsDevice, &tile->pic->pic, pos, colorFog, false);
			break;
		case TILE_LOS_NONE:
		default:
			// don't draw anything
			break;
		}
		pos.y -= TILE_HEIGHT;
		tile -= X_TILES;
		y--;
	}
}
Ejemplo n.º 4
0
static void DrawWallsAndThings(DrawBuffer *b, Vec2i offset)
{
	Vec2i pos;
	Tile *tile = &b->tiles[0][0];
	pos.y = b->dy + WALL_OFFSET_Y + offset.y;
	const bool useFog = ConfigGetBool(&gConfig, "Game.Fog");
	for (int y = 0; y < Y_TILES; y++, pos.y += TILE_HEIGHT)
	{
		CArrayClear(&b->displaylist);
		pos.x = b->dx + offset.x;
		for (int x = 0; x < b->Size.x; x++, tile++, pos.x += TILE_WIDTH)
		{
			if (tile->flags & MAPTILE_IS_WALL)
			{
				if (!(tile->flags & MAPTILE_DELAY_DRAW))
				{
					DrawWallColumn(y, pos, tile);
				}
			}
			else if (tile->flags & MAPTILE_OFFSET_PIC)
			{
				// Drawing doors
				// Doors may be offset; vertical doors are drawn centered
				// horizontal doors are bottom aligned
				Vec2i doorPos = pos;
				doorPos.x += (TILE_WIDTH - tile->picAlt->pic.size.x) / 2;
				if (tile->picAlt->pic.size.y > 16)
				{
					doorPos.y +=
						TILE_HEIGHT - (tile->picAlt->pic.size.y % TILE_HEIGHT);
				}
				switch (GetTileLOS(tile, useFog))
				{
				case TILE_LOS_NORMAL:
					Blit(&gGraphicsDevice, &tile->picAlt->pic, doorPos);
					break;
				case TILE_LOS_FOG:
					BlitMasked(
						&gGraphicsDevice,
						&tile->picAlt->pic,
						doorPos,
						colorFog,
						false);
					break;
				case TILE_LOS_NONE:
				default:
					// don't draw anything
					break;
				}
			}

			// Draw the items that are in LOS
			if (tile->flags & MAPTILE_OUT_OF_SIGHT)
			{
				continue;
			}
			CA_FOREACH(ThingId, tid, tile->things)
				const TTileItem *ti = ThingIdGetTileItem(tid);
				// Drawn later
				if (TileItemDrawLast(ti))
				{
					continue;
				}
				CArrayPushBack(&b->displaylist, &ti);
			CA_FOREACH_END()
		}
		DrawBufferSortDisplayList(b);
		CA_FOREACH(const TTileItem *, tp, b->displaylist)
			DrawThing(b, *tp, offset);
		CA_FOREACH_END()
		tile += X_TILES - b->Size.x;
	}
}