HUD tracking: offset ice cube button above player's head

This commit is contained in:
James R 2024-04-02 05:59:03 -07:00
parent c429dfb880
commit 4d93503dee

View file

@ -28,8 +28,6 @@
using namespace srb2; using namespace srb2;
using TextElement = srb2::Draw::TextElement;
extern "C" consvar_t cv_debughudtracker, cv_battleufotest, cv_kartdebugwaypoints; extern "C" consvar_t cv_debughudtracker, cv_battleufotest, cv_kartdebugwaypoints;
namespace namespace
@ -66,12 +64,28 @@ struct TargetTracking
std::optional<SplitscreenPair> far; std::optional<SplitscreenPair> far;
}; };
struct Tooltip
{
Tooltip(srb2::Draw::TextElement&& text_) : text(text_) {}
Tooltip& offset3d(fixed_t x, fixed_t y, fixed_t z)
{
ofs.x = x;
ofs.y = y;
ofs.z = z;
return *this;
}
srb2::Draw::TextElement text;
vector3_t ofs = {};
};
mobj_t* mobj; mobj_t* mobj;
trackingResult_t result; trackingResult_t result;
fixed_t camDist; fixed_t camDist;
bool foreground; bool foreground;
playertagtype_t nametag; playertagtype_t nametag;
std::optional<TextElement> tooltip; std::optional<Tooltip> tooltip;
skincolornum_t color() const skincolornum_t color() const
{ {
@ -356,11 +370,14 @@ bool is_object_tracking_target(const mobj_t* mobj)
} }
} }
std::optional<TextElement> object_tooltip(const mobj_t* mobj) std::optional<TargetTracking::Tooltip> object_tooltip(const mobj_t* mobj)
{ {
auto conditional = [](bool val, auto&& f) { return val ? std::optional<TextElement> {f()} : std::nullopt; };
using srb2::Draw; using srb2::Draw;
using TextElement = Draw::TextElement;
using Tooltip = TargetTracking::Tooltip;
auto conditional = [](bool val, auto&& f) { return val ? std::optional<Tooltip> {f()} : std::nullopt; };
Draw::Font splitfont = (r_splitscreen > 1) ? Draw::Font::kThin : Draw::Font::kMenu; Draw::Font splitfont = (r_splitscreen > 1) ? Draw::Font::kThin : Draw::Font::kMenu;
switch (mobj->type) switch (mobj->type)
@ -398,7 +415,7 @@ std::optional<TextElement> object_tooltip(const mobj_t* mobj)
case MT_PLAYER: case MT_PLAYER:
return conditional( return conditional(
mobj->player == stplyr && stplyr->icecube.frozen, mobj->player == stplyr && stplyr->icecube.frozen,
[&] { return TextElement("\xA7"); } [&] { return Tooltip(TextElement("\xA7")).offset3d(0, 0, 64 * mobj->scale * P_MobjFlip(mobj)); }
); );
default: default:
@ -446,7 +463,7 @@ void K_DrawTargetTracking(const TargetTracking& target)
srb2::Draw(FixedToFloat(result.x), FixedToFloat(result.y)) srb2::Draw(FixedToFloat(result.x), FixedToFloat(result.y))
.align(srb2::Draw::Align::kCenter) .align(srb2::Draw::Align::kCenter)
.text(*target.tooltip); .text(target.tooltip->text);
return; return;
} }
@ -773,7 +790,7 @@ void K_drawTargetHUD(const vector3_t* origin, player_t* player)
bool tracking = is_object_tracking_target(mobj); bool tracking = is_object_tracking_target(mobj);
playertagtype_t nametag = mobj->player ? K_WhichPlayerTag(mobj->player) : PLAYERTAG_NONE; playertagtype_t nametag = mobj->player ? K_WhichPlayerTag(mobj->player) : PLAYERTAG_NONE;
std::optional<TextElement> tooltip = object_tooltip(mobj); auto tooltip = object_tooltip(mobj);
if (tracking == false && nametag == PLAYERTAG_NONE && !tooltip) if (tracking == false && nametag == PLAYERTAG_NONE && !tooltip)
{ {
@ -793,22 +810,24 @@ void K_drawTargetHUD(const vector3_t* origin, player_t* player)
tr.foreground = false; tr.foreground = false;
tr.nametag = PLAYERTAG_NONE; tr.nametag = PLAYERTAG_NONE;
if (tracking || tooltip)
{
K_ObjectTracking(&tr.result, &pos, false);
if (tracking) if (tracking)
{ {
K_ObjectTracking(&tr.result, &pos, false);
targetList.push_back(tr); targetList.push_back(tr);
} }
if (tooltip) if (tooltip)
{ {
tooltip->flags(tooltip->flags().value_or(0) | V_SPLITSCREEN); tooltip->text.flags(tooltip->text.flags().value_or(0) | V_SPLITSCREEN);
tr.tooltip = tooltip; tr.tooltip = tooltip;
const vector3_t copy = pos;
FV3_Add(&pos, &tooltip->ofs);
K_ObjectTracking(&tr.result, &pos, false);
pos = copy;
targetList.push_back(tr); targetList.push_back(tr);
} }
}
if (!mobj->player) if (!mobj->player)
{ {