mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
HUD tracking: offset ice cube button above player's head
This commit is contained in:
parent
c429dfb880
commit
4d93503dee
1 changed files with 39 additions and 20 deletions
|
|
@ -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,21 +810,23 @@ 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)
|
if (tracking)
|
||||||
{
|
{
|
||||||
K_ObjectTracking(&tr.result, &pos, false);
|
K_ObjectTracking(&tr.result, &pos, false);
|
||||||
|
targetList.push_back(tr);
|
||||||
|
}
|
||||||
|
|
||||||
if (tracking)
|
if (tooltip)
|
||||||
{
|
{
|
||||||
targetList.push_back(tr);
|
tooltip->text.flags(tooltip->text.flags().value_or(0) | V_SPLITSCREEN);
|
||||||
}
|
tr.tooltip = tooltip;
|
||||||
|
|
||||||
if (tooltip)
|
const vector3_t copy = pos;
|
||||||
{
|
FV3_Add(&pos, &tooltip->ofs);
|
||||||
tooltip->flags(tooltip->flags().value_or(0) | V_SPLITSCREEN);
|
K_ObjectTracking(&tr.result, &pos, false);
|
||||||
tr.tooltip = tooltip;
|
pos = copy;
|
||||||
targetList.push_back(tr);
|
|
||||||
}
|
targetList.push_back(tr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mobj->player)
|
if (!mobj->player)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue