From b3916ebb8d952384492074b1766ab3eecd0924b9 Mon Sep 17 00:00:00 2001 From: "James R." Date: Wed, 6 Sep 2023 21:50:04 -0700 Subject: [PATCH 1/5] k_hud_track.cpp: refactor to separate graphics switching and flickering conditions from main drawing code --- src/k_hud_track.cpp | 117 +++++++++++++++++++++++++++++++------------- 1 file changed, 82 insertions(+), 35 deletions(-) diff --git a/src/k_hud_track.cpp b/src/k_hud_track.cpp index 5b07a975f..97c43d9fd 100644 --- a/src/k_hud_track.cpp +++ b/src/k_hud_track.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include "core/static_vec.hpp" @@ -25,6 +26,27 @@ namespace struct TargetTracking { + static constexpr int kMaxLayers = 2; + + struct Animation + { + int frames; + int tics_per_frame; + StaticVec layers; + }; + + struct Graphics + { + struct SplitscreenPair + { + Animation p1; + std::optional p4; + }; + + SplitscreenPair near; + std::optional far; + }; + mobj_t* mobj; vector3_t point; fixed_t camDist; @@ -45,11 +67,24 @@ struct TargetTracking case MT_SUPER_FLICKY: return static_cast(Obj_SuperFlickyOwner(mobj)->color); + default: return SKINCOLOR_NONE; } } + Animation animation() const + { + const fixed_t farDistance = 1280 * mapobjectscale; + bool useNear = (camDist < farDistance); + + Graphics gfx = graphics(); + Graphics::SplitscreenPair& pair = useNear || !gfx.far ? gfx.near : *gfx.far; + Animation& anim = r_splitscreen <= 1 || !pair.p4 ? pair.p1 : *pair.p4; + + return anim; + } + StaticVec player_emeralds_vec() const { StaticVec emeralds; @@ -100,6 +135,30 @@ struct TargetTracking return nullptr; } + +private: + Graphics graphics() const + { + switch (mobj->type) + { + case MT_SUPER_FLICKY: + return { + { // Near + {4, 2, {kp_superflickytarget}}, // 1P + }, + }; + + default: + return { + { // Near + {8, 2, {kp_capsuletarget_near}}, // 1P + }, + { // Far + {2, 3, {kp_capsuletarget_far, kp_capsuletarget_far_text}}, // 1P + }, + }; + } + } }; void K_DrawTargetTracking(const TargetTracking& target) @@ -265,24 +324,14 @@ void K_DrawTargetTracking(const TargetTracking& target) else { // Draw simple overlay. - const fixed_t farDistance = 1280 * mapobjectscale; - bool useNear = (target.camDist < farDistance); + vector2_t targetPos = {result.x, result.y}; - vector2_t targetPos = {}; + TargetTracking::Animation anim = target.animation(); - bool visible = P_CheckSight(stplyr->mo, target.mobj); - - if ((visible == false || target.mobj->type == MT_SUPER_FLICKY) && (leveltime & 1)) + for (patch_t** array : anim.layers) { - // Flicker when not visible. - return; - } + patch_t* patch = array[(leveltime / anim.tics_per_frame) % anim.frames]; - targetPos.x = result.x; - targetPos.y = result.y; - - auto draw = [&](patch_t* patch) - { V_DrawFixedPatch( targetPos.x - ((patch->width << FRACBITS) >> 1), targetPos.y - ((patch->height << FRACBITS) >> 1), @@ -292,27 +341,6 @@ void K_DrawTargetTracking(const TargetTracking& target) colormap ); }; - - if (target.mobj->type == MT_SUPER_FLICKY) - { - timer = (leveltime / 2); - draw(kp_superflickytarget[timer % 4]); - } - else if (useNear == true) - { - timer = (leveltime / 2); - draw(kp_capsuletarget_near[timer % 8]); - } - else - { - timer = (leveltime / 3); - draw(kp_capsuletarget_far[timer & 1]); - - if (r_splitscreen <= 1) - { - draw(kp_capsuletarget_far_text[timer & 1]); - } - } } } @@ -395,6 +423,20 @@ bool is_object_tracking_target(const mobj_t* mobj) } } +bool is_object_visible(mobj_t* mobj) +{ + switch (mobj->type) + { + case MT_SUPER_FLICKY: + // Always flickers. + return (leveltime & 1); + + default: + // Flicker when not visible. + return P_CheckSight(stplyr->mo, mobj) || (leveltime & 1); + } +} + }; // namespace void K_drawTargetHUD(const vector3_t* origin, player_t* player) @@ -418,6 +460,11 @@ void K_drawTargetHUD(const vector3_t* origin, player_t* player) continue; } + if (is_object_visible(mobj) == false) + { + continue; + } + vector3_t pos = { R_InterpolateFixed(mobj->old_x, mobj->x) + mobj->sprxoff, R_InterpolateFixed(mobj->old_y, mobj->y) + mobj->spryoff, From 11f428b67ae6f2d7835a6a7c4c73d62555241115 Mon Sep 17 00:00:00 2001 From: "James R." Date: Thu, 7 Sep 2023 00:08:42 -0700 Subject: [PATCH 2/5] Add 4P variants for TARGET HUD tracking --- src/k_hud.c | 33 +++++++++++++++++++++++++++------ src/k_hud.h | 6 +++--- src/k_hud_track.cpp | 13 ++++++++----- 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/src/k_hud.c b/src/k_hud.c index b245aa91d..4b199dd31 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -197,11 +197,11 @@ patch_t *kp_autoroulette; patch_t *kp_capsuletarget_arrow[2][2]; patch_t *kp_capsuletarget_icon[2]; -patch_t *kp_capsuletarget_far[2]; +patch_t *kp_capsuletarget_far[2][2]; patch_t *kp_capsuletarget_far_text[2]; -patch_t *kp_capsuletarget_near[8]; +patch_t *kp_capsuletarget_near[2][8]; -patch_t *kp_superflickytarget[4]; +patch_t *kp_superflickytarget[2][4]; patch_t *kp_button_a[2][2]; patch_t *kp_button_b[2][2]; @@ -758,23 +758,44 @@ void K_LoadKartHUDGraphics(void) for (i = 0; i < 2; i++) { buffer[7] = '0'+i; - HU_UpdatePatch(&kp_capsuletarget_far[i], "%s", buffer); + HU_UpdatePatch(&kp_capsuletarget_far[0][i], "%s", buffer); + } + + sprintf(buffer, "HUDC4PBx"); + for (i = 0; i < 2; i++) + { + buffer[7] = '0'+i; + HU_UpdatePatch(&kp_capsuletarget_far[1][i], "%s", buffer); } sprintf(buffer, "HUDCAPAx"); for (i = 0; i < 8; i++) { buffer[7] = '0'+i; - HU_UpdatePatch(&kp_capsuletarget_near[i], "%s", buffer); + HU_UpdatePatch(&kp_capsuletarget_near[0][i], "%s", buffer); + } + + sprintf(buffer, "HUDC4PAx"); + for (i = 0; i < 8; i++) + { + buffer[7] = '0'+i; + HU_UpdatePatch(&kp_capsuletarget_near[1][i], "%s", buffer); } sprintf(buffer, "HUDFLKAx"); for (i = 0; i < 4; i++) { buffer[7] = '0'+i; - HU_UpdatePatch(&kp_superflickytarget[i], "%s", buffer); + HU_UpdatePatch(&kp_superflickytarget[0][i], "%s", buffer); } + sprintf(buffer, "H4PFLKAx"); + for (i = 0; i < 4; i++) + { + buffer[7] = '0'+i; + HU_UpdatePatch(&kp_superflickytarget[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 d982c851b..de2e788c2 100644 --- a/src/k_hud.h +++ b/src/k_hud.h @@ -55,11 +55,11 @@ void K_DrawSticker(INT32 x, INT32 y, INT32 width, INT32 flags, boolean isSmall); extern patch_t *kp_capsuletarget_arrow[2][2]; extern patch_t *kp_capsuletarget_icon[2]; -extern patch_t *kp_capsuletarget_far[2]; +extern patch_t *kp_capsuletarget_far[2][2]; extern patch_t *kp_capsuletarget_far_text[2]; -extern patch_t *kp_capsuletarget_near[8]; +extern patch_t *kp_capsuletarget_near[2][8]; -extern patch_t *kp_superflickytarget[4]; +extern patch_t *kp_superflickytarget[2][4]; extern patch_t *kp_autoroulette; diff --git a/src/k_hud_track.cpp b/src/k_hud_track.cpp index 97c43d9fd..94b628e1d 100644 --- a/src/k_hud_track.cpp +++ b/src/k_hud_track.cpp @@ -144,18 +144,21 @@ private: case MT_SUPER_FLICKY: return { { // Near - {4, 2, {kp_superflickytarget}}, // 1P + {4, 2, {kp_superflickytarget[0]}}, // 1P + {{4, 2, {kp_superflickytarget[1]}}}, // 4P }, }; default: return { { // Near - {8, 2, {kp_capsuletarget_near}}, // 1P - }, - { // Far - {2, 3, {kp_capsuletarget_far, kp_capsuletarget_far_text}}, // 1P + {8, 2, {kp_capsuletarget_near[0]}}, // 1P + {{8, 2, {kp_capsuletarget_near[1]}}}, // 4P }, + {{ // Far + {2, 3, {kp_capsuletarget_far[0], kp_capsuletarget_far_text}}, // 1P + {{2, 3, {kp_capsuletarget_far[1]}}}, // 4P + }}, }; } } From c45484383750e3ff2dc48b437a3fa1f77c839f36 Mon Sep 17 00:00:00 2001 From: "James R." Date: Thu, 7 Sep 2023 01:01:23 -0700 Subject: [PATCH 3/5] Spraycan HUD tracking --- src/k_hud.c | 31 +++++++++++++++++++++++++++++++ src/k_hud.h | 3 +++ src/k_hud_track.cpp | 39 ++++++++++++++++++++++++++++++++++++++- src/p_mobj.c | 1 + 4 files changed, 73 insertions(+), 1 deletion(-) 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: From 9a409c5e93db8fef5f7433c9bf65c62a6786e913 Mon Sep 17 00:00:00 2001 From: "James R." Date: Thu, 7 Sep 2023 01:02:10 -0700 Subject: [PATCH 4/5] P_DefaultMobjShadowScale: add shadow for Spraycans --- src/p_mobj.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/p_mobj.c b/src/p_mobj.c index 5189ef4f0..77e2872cf 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10413,6 +10413,7 @@ static void P_DefaultMobjShadowScale(mobj_t *thing) case MT_SPECIAL_UFO: case MT_CDUFO: case MT_BATTLEUFO: + case MT_SPRAYCAN: thing->shadowscale = FRACUNIT; break; case MT_SMALLMACE: From 7e33f92049dee76adb961f8ade5cfbbc047eddba Mon Sep 17 00:00:00 2001 From: VelocitOni Date: Thu, 7 Sep 2023 17:20:13 -0400 Subject: [PATCH 5/5] undef "near" and "far" Eidolon: "they're legacy code compatibility defines that don't seem to have any way to be disabled other than undefing them" --- src/k_hud_track.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/k_hud_track.cpp b/src/k_hud_track.cpp index 9862425b6..d6c108dc6 100644 --- a/src/k_hud_track.cpp +++ b/src/k_hud_track.cpp @@ -19,6 +19,11 @@ #include "st_stuff.h" #include "v_video.h" +#ifdef WIN32 +#undef near +#undef far +#endif + using namespace srb2; namespace