diff --git a/src/k_hud.c b/src/k_hud.c index 4b199dd31..e6f88d224 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -203,6 +203,9 @@ patch_t *kp_capsuletarget_near[2][8]; 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_b[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); } + 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[1], 'N'); K_LoadButtonGraphics(kp_button_b[0], 'B'); diff --git a/src/k_hud.h b/src/k_hud.h index de2e788c2..b16c15e2c 100644 --- a/src/k_hud.h +++ b/src/k_hud.h @@ -61,6 +61,9 @@ extern patch_t *kp_capsuletarget_near[2][8]; 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_button_a[2][2]; diff --git a/src/k_hud_track.cpp b/src/k_hud_track.cpp index 94b628e1d..9862425b6 100644 --- a/src/k_hud_track.cpp +++ b/src/k_hud_track.cpp @@ -33,6 +33,7 @@ struct TargetTracking int frames; int tics_per_frame; StaticVec layers; + int32_t video_flags = 0; }; struct Graphics @@ -85,6 +86,18 @@ struct TargetTracking return anim; } + bool uses_off_screen_arrow() const + { + switch (mobj->type) + { + case MT_SPRAYCAN: + return false; + + default: + return true; + } + } + StaticVec player_emeralds_vec() const { StaticVec 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: return { { // Near @@ -178,6 +203,11 @@ void K_DrawTargetTracking(const TargetTracking& target) // Off-screen, draw alongside the borders of the screen. // Probably the most complicated thing. + if (target.uses_off_screen_arrow() == false) + { + return; + } + int32_t scrVal = 240; vector2_t screenSize = {}; @@ -339,7 +369,7 @@ void K_DrawTargetTracking(const TargetTracking& target) targetPos.x - ((patch->width << FRACBITS) >> 1), targetPos.y - ((patch->height << FRACBITS) >> 1), FRACUNIT, - V_SPLITSCREEN, + V_SPLITSCREEN | anim.video_flags, patch, colormap ); @@ -421,6 +451,9 @@ bool is_object_tracking_target(const mobj_t* mobj) case MT_SUPER_FLICKY: return Obj_IsSuperFlickyTargettingYou(mobj, stplyr->mo); + case MT_SPRAYCAN: + return !(mobj->renderflags & (RF_TRANSMASK | RF_DONTDRAW)); // the spraycan wasn't collected yet + default: return false; } @@ -434,6 +467,10 @@ bool is_object_visible(mobj_t* mobj) // Always flickers. return (leveltime & 1); + case MT_SPRAYCAN: + // Flickers, but only when visible. + return P_CheckSight(stplyr->mo, mobj) && (leveltime & 1); + default: // Flicker when not visible. return P_CheckSight(stplyr->mo, mobj) || (leveltime & 1); diff --git a/src/p_mobj.c b/src/p_mobj.c index 50f05b680..5189ef4f0 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -5342,6 +5342,7 @@ static boolean P_IsTrackerType(INT32 type) case MT_EMERALD: case MT_BATTLEUFO: case MT_SUPER_FLICKY: + case MT_SPRAYCAN: return true; default: