Spraycan HUD tracking

This commit is contained in:
James R. 2023-09-07 01:01:23 -07:00
parent 11f428b67a
commit c454843837
4 changed files with 73 additions and 1 deletions

View file

@ -203,6 +203,9 @@ patch_t *kp_capsuletarget_near[2][8];
patch_t *kp_superflickytarget[2][4]; patch_t *kp_superflickytarget[2][4];
patch_t *kp_spraycantarget_far[2][6];
patch_t *kp_spraycantarget_near[2][6];
patch_t *kp_button_a[2][2]; patch_t *kp_button_a[2][2];
patch_t *kp_button_b[2][2]; patch_t *kp_button_b[2][2];
patch_t *kp_button_c[2][2]; patch_t *kp_button_c[2][2];
@ -796,6 +799,34 @@ void K_LoadKartHUDGraphics(void)
HU_UpdatePatch(&kp_superflickytarget[1][i], "%s", buffer); HU_UpdatePatch(&kp_superflickytarget[1][i], "%s", buffer);
} }
sprintf(buffer, "SPCNBFAx");
for (i = 0; i < 6; i++)
{
buffer[7] = '1'+i;
HU_UpdatePatch(&kp_spraycantarget_far[0][i], "%s", buffer);
}
sprintf(buffer, "SPCNSFAx");
for (i = 0; i < 6; i++)
{
buffer[7] = '1'+i;
HU_UpdatePatch(&kp_spraycantarget_far[1][i], "%s", buffer);
}
sprintf(buffer, "SPCNBCLx");
for (i = 0; i < 6; i++)
{
buffer[7] = '1'+i;
HU_UpdatePatch(&kp_spraycantarget_near[0][i], "%s", buffer);
}
sprintf(buffer, "SPCNSCLx");
for (i = 0; i < 6; i++)
{
buffer[7] = '1'+i;
HU_UpdatePatch(&kp_spraycantarget_near[1][i], "%s", buffer);
}
K_LoadButtonGraphics(kp_button_a[0], 'A'); K_LoadButtonGraphics(kp_button_a[0], 'A');
K_LoadButtonGraphics(kp_button_a[1], 'N'); K_LoadButtonGraphics(kp_button_a[1], 'N');
K_LoadButtonGraphics(kp_button_b[0], 'B'); K_LoadButtonGraphics(kp_button_b[0], 'B');

View file

@ -61,6 +61,9 @@ extern patch_t *kp_capsuletarget_near[2][8];
extern patch_t *kp_superflickytarget[2][4]; extern patch_t *kp_superflickytarget[2][4];
extern patch_t *kp_spraycantarget_far[2][6];
extern patch_t *kp_spraycantarget_near[2][6];
extern patch_t *kp_autoroulette; extern patch_t *kp_autoroulette;
extern patch_t *kp_button_a[2][2]; extern patch_t *kp_button_a[2][2];

View file

@ -33,6 +33,7 @@ struct TargetTracking
int frames; int frames;
int tics_per_frame; int tics_per_frame;
StaticVec<patch_t**, kMaxLayers> layers; StaticVec<patch_t**, kMaxLayers> layers;
int32_t video_flags = 0;
}; };
struct Graphics struct Graphics
@ -85,6 +86,18 @@ struct TargetTracking
return anim; return anim;
} }
bool uses_off_screen_arrow() const
{
switch (mobj->type)
{
case MT_SPRAYCAN:
return false;
default:
return true;
}
}
StaticVec<uint32_t, 7> player_emeralds_vec() const StaticVec<uint32_t, 7> player_emeralds_vec() const
{ {
StaticVec<uint32_t, 7> emeralds; StaticVec<uint32_t, 7> emeralds;
@ -149,6 +162,18 @@ private:
}, },
}; };
case MT_SPRAYCAN:
return {
{ // Near
{6, 2, {kp_spraycantarget_near[0]}, V_ADD}, // 1P
{{6, 2, {kp_spraycantarget_near[1]}, V_ADD}}, // 4P
},
{{ // Far
{6, 2, {kp_spraycantarget_far[0]}, V_ADD}, // 1P
{{6, 2, {kp_spraycantarget_far[1]}, V_ADD}}, // 4P
}},
};
default: default:
return { return {
{ // Near { // Near
@ -178,6 +203,11 @@ void K_DrawTargetTracking(const TargetTracking& target)
// Off-screen, draw alongside the borders of the screen. // Off-screen, draw alongside the borders of the screen.
// Probably the most complicated thing. // Probably the most complicated thing.
if (target.uses_off_screen_arrow() == false)
{
return;
}
int32_t scrVal = 240; int32_t scrVal = 240;
vector2_t screenSize = {}; vector2_t screenSize = {};
@ -339,7 +369,7 @@ void K_DrawTargetTracking(const TargetTracking& target)
targetPos.x - ((patch->width << FRACBITS) >> 1), targetPos.x - ((patch->width << FRACBITS) >> 1),
targetPos.y - ((patch->height << FRACBITS) >> 1), targetPos.y - ((patch->height << FRACBITS) >> 1),
FRACUNIT, FRACUNIT,
V_SPLITSCREEN, V_SPLITSCREEN | anim.video_flags,
patch, patch,
colormap colormap
); );
@ -421,6 +451,9 @@ bool is_object_tracking_target(const mobj_t* mobj)
case MT_SUPER_FLICKY: case MT_SUPER_FLICKY:
return Obj_IsSuperFlickyTargettingYou(mobj, stplyr->mo); return Obj_IsSuperFlickyTargettingYou(mobj, stplyr->mo);
case MT_SPRAYCAN:
return !(mobj->renderflags & (RF_TRANSMASK | RF_DONTDRAW)); // the spraycan wasn't collected yet
default: default:
return false; return false;
} }
@ -434,6 +467,10 @@ bool is_object_visible(mobj_t* mobj)
// Always flickers. // Always flickers.
return (leveltime & 1); return (leveltime & 1);
case MT_SPRAYCAN:
// Flickers, but only when visible.
return P_CheckSight(stplyr->mo, mobj) && (leveltime & 1);
default: default:
// Flicker when not visible. // Flicker when not visible.
return P_CheckSight(stplyr->mo, mobj) || (leveltime & 1); return P_CheckSight(stplyr->mo, mobj) || (leveltime & 1);

View file

@ -5342,6 +5342,7 @@ static boolean P_IsTrackerType(INT32 type)
case MT_EMERALD: case MT_EMERALD:
case MT_BATTLEUFO: case MT_BATTLEUFO:
case MT_SUPER_FLICKY: case MT_SUPER_FLICKY:
case MT_SPRAYCAN:
return true; return true;
default: default: