Пример #1
0
void DrawActorHighlight(
	const ActorPics *pics, const Vec2i pos, const color_t color,
	const direction_e d)
{
	// Do not highlight dead, dying or transparent characters
	if (pics->IsDead || pics->IsTransparent)
	{
		return;
	}
	const Vec2i headPos = GetActorDrawOffset(
		pos, pics->Head, BODY_PART_HEAD, d);
	BlitPicHighlight(&gGraphicsDevice, pics->Head, headPos, color);
	if (pics->Body != NULL)
	{
		const Vec2i bodyPos = GetActorDrawOffset(
			pos, pics->Body, BODY_PART_BODY, d);
		BlitPicHighlight(&gGraphicsDevice, pics->Body, bodyPos, color);
	}
	if (pics->Gun != NULL)
	{
		const Vec2i gunPos = GetActorDrawOffset(
			pos, pics->Gun, BODY_PART_GUN, d);
		BlitPicHighlight(&gGraphicsDevice, pics->Gun, gunPos, color);
	}
}
Пример #2
0
void DrawActorPics(
	const ActorPics *pics, const Vec2i picPos, const direction_e d)
{
	if (pics->IsDead)
	{
		if (pics->IsDying)
		{
			DrawBody(&gGraphicsDevice, pics, picPos);
		}
	}
	else
	{
		// Draw shadow
		if (!pics->IsTransparent)
		{
			DrawShadow(&gGraphicsDevice, picPos, Vec2iNew(8, 6));
		}
		for (int i = 0; i < 3; i++)
		{
			const Pic *picp = NULL;
			switch (pics->DrawOrder[i])
			{
			case BODY_PART_HEAD:
				picp = pics->Head;
				break;
			case BODY_PART_BODY:
				picp = pics->Body;
				break;
			case BODY_PART_GUN:
				picp = pics->Gun;
				break;
			}
			if (picp == NULL)
			{
				continue;
			}
			const Vec2i drawPos = GetActorDrawOffset(
				picPos, picp, pics->DrawOrder[i], d);
			if (pics->IsTransparent)
			{
				BlitBackground(
					&gGraphicsDevice, picp, drawPos, pics->Tint, true);
			}
			else if (pics->Mask != NULL)
			{
				BlitMasked(&gGraphicsDevice, picp, drawPos, *pics->Mask, true);
			}
			else
			{
				BlitCharMultichannel(
					&gGraphicsDevice, picp, drawPos, pics->Colors);
			}
		}
	}
}
Пример #3
0
ActorPics GetCharacterPics(
	Character *c, const direction_e dir,
	const ActorAnimation anim, const int frame,
	const NamedSprites *gunPics, const gunstate_e gunState,
	const bool isTransparent, HSV *tint, color_t *mask,
	const int deadPic)
{
	ActorPics pics;
	memset(&pics, 0, sizeof pics);
	pics.Colors = &c->Colors;

	// If the actor is dead, simply draw a dying animation
	pics.IsDead = deadPic > 0;
	if (pics.IsDead)
	{
		if (deadPic < DEATH_MAX)
		{
			pics.IsDying = true;
			pics.Body = GetDeathPic(&gPicManager, deadPic - 1);
			pics.OrderedPics[0] = pics.Body;
		}
		return pics;
	}

	pics.IsTransparent = isTransparent;
	if (pics.IsTransparent)
	{
		pics.Tint = &tintDarker;
	}
	else if (tint != NULL)
	{
		pics.Tint = tint;
		pics.Mask = mask;
	}

	// Head
	direction_e headDir = dir;
	// If idle, turn head left/right on occasion
	if (anim == ACTORANIMATION_IDLE)
	{
		if (frame == IDLEHEAD_LEFT) headDir = (dir + 7) % 8;
		else if (frame == IDLEHEAD_RIGHT) headDir = (dir + 1) % 8;
	}
	pics.Head = GetHeadPic(c->Class, headDir, gunState);
	pics.HeadOffset = GetActorDrawOffset(
		pics.Head, BODY_PART_HEAD, c->Class->Sprites, anim, frame, dir);

	// Body
	const bool isArmed = gunPics != NULL;
	pics.Body = GetBodyPic(
		&gPicManager, c->Class->Sprites, dir, anim, frame, isArmed);
	pics.BodyOffset = GetActorDrawOffset(
		pics.Body, BODY_PART_BODY, c->Class->Sprites, anim, frame, dir);

	// Legs
	pics.Legs = GetLegsPic(
		&gPicManager, c->Class->Sprites, dir, anim, frame);
	pics.LegsOffset = GetActorDrawOffset(
		pics.Legs, BODY_PART_LEGS, c->Class->Sprites, anim, frame, dir);

	// Gun
	pics.Gun = NULL;
	if (isArmed)
	{
		pics.Gun = GetGunPic(gunPics, dir, gunState);
		pics.GunOffset = GetActorDrawOffset(
			pics.Gun, BODY_PART_GUN, c->Class->Sprites, anim, frame, dir);
	}

	// Determine draw order based on the direction the player is facing
	for (BodyPart bp = BODY_PART_HEAD; bp < BODY_PART_COUNT; bp++)
	{
		const BodyPart drawOrder = c->Class->Sprites->Order[dir][bp];
		switch (drawOrder)
		{
		case BODY_PART_HEAD:
			pics.OrderedPics[bp] = pics.Head;
			pics.OrderedOffsets[bp] = pics.HeadOffset;
			break;
		case BODY_PART_BODY:
			pics.OrderedPics[bp] = pics.Body;
			pics.OrderedOffsets[bp] = pics.BodyOffset;
			break;
		case BODY_PART_LEGS:
			pics.OrderedPics[bp] = pics.Legs;
			pics.OrderedOffsets[bp] = pics.LegsOffset;
			break;
		case BODY_PART_GUN:
			pics.OrderedPics[bp] = pics.Gun;
			pics.OrderedOffsets[bp] = pics.GunOffset;
			break;
		default:
			break;
		}
	}

	pics.Sprites = c->Class->Sprites;

	return pics;
}