Exemplo n.º 1
0
static void DrawLives(
	const GraphicsDevice *device, const PlayerData *player, const Vec2i pos,
	const FontAlign hAlign, const FontAlign vAlign)
{
	const int xStep = hAlign == ALIGN_START ? 10 : -10;
	const Vec2i offset = Vec2iNew(5, 20);
	Vec2i drawPos = Vec2iAdd(pos, offset);
	if (hAlign == ALIGN_END)
	{
		const int w = device->cachedConfig.Res.x;
		drawPos.x = w - drawPos.x - offset.x;
	}
	if (vAlign == ALIGN_END)
	{
		const int h = device->cachedConfig.Res.y;
		drawPos.y = h - drawPos.y + offset.y + 5;
	}
	const TOffsetPic head = GetHeadPic(
		BODY_ARMED, DIRECTION_DOWN, player->Char.looks.Face, STATE_IDLE);
	for (int i = 0; i < player->Lives; i++)
	{
		BlitOld(
			drawPos.x + head.dx, drawPos.y + head.dy,
			PicManagerGetOldPic(&gPicManager, head.picIndex),
			&player->Char.table, BLIT_TRANSPARENT);
		drawPos.x += xStep;
	}
}
Exemplo n.º 2
0
void DrawHead(
	const Character *c, const direction_e dir, const Vec2i pos)
{
	const Pic *head = GetHeadPic(c->Class, dir, GUNSTATE_READY);
	const Vec2i drawPos = Vec2iMinus(pos, Vec2iNew(
		head->size.x / 2, head->size.y / 2));
	BlitCharMultichannel(&gGraphicsDevice, head, drawPos, &c->Colors);
}
Exemplo n.º 3
0
static void GetCharacterPics(
	ActorPics *pics, Character *c, const direction_e dir, const int frame,
	const NamedSprites *gunPics, const gunstate_e gunState,
	const bool isTransparent, HSV *tint, color_t *mask,
	const int deadPic)
{
	memset(pics, 0, sizeof *pics);
	pics->DrawOrder[0] = pics->DrawOrder[1] = pics->DrawOrder[2] = -1;
	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->DrawOrder[0] = BODY_PART_BODY;
		}
		return;
	}

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

	// Head
	direction_e headDir = dir;
	int headFrame = frame;
	// If firing, draw the firing head pic
	if (gunState == GUNSTATE_FIRING || gunState == GUNSTATE_RECOIL)
	{
		headFrame = STATE_COUNT + gunState - GUNSTATE_FIRING;
	}
	// If idle, turn head left/right on occasion
	if (headFrame == STATE_IDLELEFT) headDir = (dir + 7) % 8;
	else if (headFrame == STATE_IDLERIGHT) headDir = (dir + 1) % 8;

	pics->Head = GetHeadPic(c->Class, headDir, headFrame);

	// Body
	const bool isArmed = gunPics != NULL;
	pics->Body = GetBodyPic(&gPicManager, dir, frame, isArmed);

	// Gun
	pics->Gun = NULL;
	if (isArmed)
	{
		pics->Gun = GetGunPic(gunPics, dir, gunState);
	}

	// Determine draw order based on the direction the player is facing
	// Order is: 0: head, 1: body, 2: gun
	switch (dir)
	{
	case DIRECTION_UP:
	case DIRECTION_UPRIGHT:
		pics->DrawOrder[0] = BODY_PART_GUN;
		pics->DrawOrder[1] = BODY_PART_HEAD;
		pics->DrawOrder[2] = BODY_PART_BODY;
		break;

	case DIRECTION_RIGHT:
	case DIRECTION_DOWNRIGHT:
	case DIRECTION_DOWN:
	case DIRECTION_DOWNLEFT:
		pics->DrawOrder[0] = BODY_PART_BODY;
		pics->DrawOrder[1] = BODY_PART_HEAD;
		pics->DrawOrder[2] = BODY_PART_GUN;
		break;

	case DIRECTION_LEFT:
	case DIRECTION_UPLEFT:
		pics->DrawOrder[0] = BODY_PART_GUN;
		pics->DrawOrder[1] = BODY_PART_BODY;
		pics->DrawOrder[2] = BODY_PART_HEAD;
		break;
	default:
		CASSERT(false, "invalid direction");
		return;
	}
}
Exemplo n.º 4
0
void DrawCharacterSimple(
    const Character *c, const Vec2i pos,
    const direction_e dir, const int state,
    const int gunPic, const gunstate_e gunState,
    const TranslationTable *table)
{
    TOffsetPic body, head, gun;
    TOffsetPic pic1, pic2, pic3;
    direction_e headDir = dir;
    int headState = state;
    if (gunState == GUNSTATE_FIRING || gunState == GUNSTATE_RECOIL)
    {
        headState = STATE_COUNT + gunState - GUNSTATE_FIRING;
    }
    if (state == STATE_IDLELEFT)
    {
        headDir = (direction_e)((dir + 7) % 8);
    }
    else if (state == STATE_IDLERIGHT)
    {
        headDir = (direction_e)((dir + 1) % 8);
    }

    int bodyType = gunPic < 0 ? BODY_UNARMED : BODY_ARMED;

    body.dx = cBodyOffset[bodyType][dir].dx;
    body.dy = cBodyOffset[bodyType][dir].dy;
    body.picIndex = cBodyPic[bodyType][dir][state];

    head = GetHeadPic(bodyType, headDir, c->looks.Face, headState);

    gun.picIndex = -1;
    if (gunPic >= 0)
    {
        gun.dx =
            cGunHandOffset[bodyType][dir].dx +
            cGunPics[gunPic][dir][gunState].dx;
        gun.dy =
            cGunHandOffset[bodyType][dir].dy +
            cGunPics[gunPic][dir][gunState].dy;
        gun.picIndex = cGunPics[gunPic][dir][gunState].picIndex;
    }

    switch (dir)
    {
    case DIRECTION_UP:
    case DIRECTION_UPRIGHT:
        pic1 = gun;
        pic2 = head;
        pic3 = body;
        break;

    case DIRECTION_RIGHT:
    case DIRECTION_DOWNRIGHT:
    case DIRECTION_DOWN:
    case DIRECTION_DOWNLEFT:
        pic1 = body;
        pic2 = head;
        pic3 = gun;
        break;

    case DIRECTION_LEFT:
    case DIRECTION_UPLEFT:
        pic1 = gun;
        pic2 = body;
        pic3 = head;
        break;
    default:
        assert(0 && "invalid direction");
        return;
    }

    if (pic1.picIndex >= 0)
    {
        BlitOld(
            pos.x + pic1.dx, pos.y + pic1.dy,
            PicManagerGetOldPic(&gPicManager, pic1.picIndex),
            table, BLIT_TRANSPARENT);
    }
    if (pic2.picIndex >= 0)
    {
        BlitOld(
            pos.x + pic2.dx, pos.y + pic2.dy,
            PicManagerGetOldPic(&gPicManager, pic2.picIndex),
            table, BLIT_TRANSPARENT);
    }
    if (pic3.picIndex >= 0)
    {
        BlitOld(
            pos.x + pic3.dx, pos.y + pic3.dy,
            PicManagerGetOldPic(&gPicManager, pic3.picIndex),
            table, BLIT_TRANSPARENT);
    }
}
Exemplo n.º 5
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;
}