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); } }
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); } } } }
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; }