Ejemplo n.º 1
0
static void DrawWallsAndThings(DrawBuffer *b, Vec2i offset)
{
	Vec2i pos;
	Tile *tile = &b->tiles[0][0];
	pos.y = b->dy + cWallOffset.dy + offset.y;
	for (int y = 0; y < Y_TILES; y++, pos.y += TILE_HEIGHT)
	{
		TTileItem *displayList = NULL;
		pos.x = b->dx + cWallOffset.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
				BlitMasked(
					&gGraphicsDevice,
					&tile->picAlt,
					pos,
					GetTileLOSMask(tile),
					0);
			}
			if (!(tile->flags & MAPTILE_OUT_OF_SIGHT))
			{
				// Draw the items that are in LOS
				for (int i = 0; i < (int)tile->things.size; i++)
				{
					TTileItem *ti =
						ThingIdGetTileItem(CArrayGet(&tile->things, i));
					if (!(ti->flags & TILEITEM_IS_WRECK))
					{
						AddItemToDisplayList(ti, &displayList);
					}
				}
			}
		}
		for (TTileItem *t = displayList; t; t = t->nextToDisplay)
		{
			Vec2i picPos = Vec2iNew(
				t->x - b->xTop + offset.x, t->y - b->yTop + offset.y);
			if (t->getPicFunc)
			{
				Vec2i picOffset;
				const Pic *pic = t->getPicFunc(t->id, &picOffset);
				Blit(&gGraphicsDevice, pic, Vec2iAdd(picPos, picOffset));
			}
			else if (t->getActorPicsFunc)
			{
				ActorPics pics = t->getActorPicsFunc(t->id);
				if (pics.IsDead)
				{
					if (pics.IsDying)
					{
						int pic = pics.OldPics[0];
						if (pic == 0)
						{
							continue;
						}
						if (pics.IsTransparent)
						{
							DrawBTPic(
								&gGraphicsDevice,
								PicManagerGetFromOld(&gPicManager, pic),
								Vec2iAdd(picPos, pics.Pics[0].offset),
								pics.Tint);
						}
						else
						{
							DrawTTPic(
								picPos.x + pics.Pics[0].offset.x,
								picPos.y + pics.Pics[0].offset.y,
								PicManagerGetOldPic(&gPicManager, pic),
								pics.Table);
						}
					}
				}
				else if (pics.IsTransparent)
				{
					for (int i = 0; i < 3; i++)
					{
						Pic *oldPic = PicManagerGetFromOld(
							&gPicManager, pics.OldPics[i]);
						if (oldPic == NULL)
						{
							continue;
						}
						DrawBTPic(
							&gGraphicsDevice,
							oldPic,
							Vec2iAdd(picPos, pics.Pics[i].offset),
							pics.Tint);
					}
				}
				else
				{
					DrawShadow(&gGraphicsDevice, picPos, Vec2iNew(8, 6));
					for (int i = 0; i < 3; i++)
					{
						PicPaletted *oldPic = PicManagerGetOldPic(
							&gPicManager, pics.OldPics[i]);
						if (oldPic == NULL)
						{
							continue;
						}
						BlitOld(
							picPos.x + pics.Pics[i].offset.x,
							picPos.y + pics.Pics[i].offset.y,
							oldPic,
							pics.Table, BLIT_TRANSPARENT);
					}
				}
			}
			else
			{
				(*(t->drawFunc))(picPos, &t->drawData);
			}
		}
		tile += X_TILES - b->Size.x;
	}
}
Ejemplo n.º 2
0
static void DrawActorPics(const TTileItem *t, const Vec2i picPos)
{
    const ActorPics pics = t->getActorPicsFunc(t->id);
    if (pics.IsDead)
    {
        if (pics.IsDying)
        {
            int pic = pics.OldPics[0];
            if (pic == 0)
            {
                return;
            }
            if (pics.IsTransparent)
            {
                DrawBTPic(
                    &gGraphicsDevice,
                    PicManagerGetFromOld(&gPicManager, pic),
                    Vec2iAdd(picPos, pics.Pics[0].offset),
                    pics.Tint);
            }
            else
            {
                DrawTTPic(
                    picPos.x + pics.Pics[0].offset.x,
                    picPos.y + pics.Pics[0].offset.y,
                    PicManagerGetOldPic(&gPicManager, pic),
                    pics.Table);
            }
        }
    }
    else if (pics.IsTransparent)
    {
        for (int i = 0; i < 3; i++)
        {
            Pic *oldPic = PicManagerGetFromOld(
                              &gPicManager, pics.OldPics[i]);
            if (oldPic == NULL)
            {
                continue;
            }
            DrawBTPic(
                &gGraphicsDevice,
                oldPic,
                Vec2iAdd(picPos, pics.Pics[i].offset),
                pics.Tint);
        }
    }
    else
    {
        DrawShadow(&gGraphicsDevice, picPos, Vec2iNew(8, 6));
        for (int i = 0; i < 3; i++)
        {
            PicPaletted *oldPic = PicManagerGetOldPic(
                                      &gPicManager, pics.OldPics[i]);
            if (oldPic == NULL)
            {
                continue;
            }
            BlitOld(
                picPos.x + pics.Pics[i].offset.x,
                picPos.y + pics.Pics[i].offset.y,
                oldPic,
                pics.Table, BLIT_TRANSPARENT);
        }

        const TActor *a = CArrayGet(&gActors, t->id);

        // Draw weapon indicators
        if (ConfigGetEnum(&gConfig, "Game.LaserSight") == LASER_SIGHT_ALL ||
                (ConfigGetEnum(&gConfig, "Game.LaserSight") == LASER_SIGHT_PLAYERS && a->PlayerUID >= 0))
        {
            DrawLaserSight(a, picPos);
        }
    }
}