using Godot;
using Theriapolis.Core;
namespace Theriapolis.GodotHost.Rendering;
///
/// Player marker — small dot with a thin facing tick. Drawn at
/// /2 wp; the owner sets
/// = 1/zoom every frame so the on-screen size
/// stays constant across the seamless zoom range. Facing is driven by
/// the owner via ; the tick is drawn along
/// the local +X axis so rotating the node rotates the tick without
/// invalidating the cached _Draw commands.
///
public partial class PlayerMarker : Node2D
{
private const float RadiusWorldPx = C.PLAYER_MARKER_SCREEN_PX * 0.5f;
private const float FacingTickPx = RadiusWorldPx * 1.4f;
private bool _showFacingTick = true;
/// When true, draws a small tick along the local +X axis
/// so the player can read facing without a full sprite. Hidden at
/// low zoom to avoid clutter. Triggers
/// on change.
public bool ShowFacingTick
{
get => _showFacingTick;
set
{
if (_showFacingTick == value) return;
_showFacingTick = value;
QueueRedraw();
}
}
public override void _Draw()
{
DrawCircle(Vector2.Zero, RadiusWorldPx, new Color(0, 0, 0, 0.78f));
DrawCircle(Vector2.Zero, RadiusWorldPx * 0.85f, new Color(0.86f, 0.31f, 0.24f));
if (_showFacingTick)
{
DrawLine(
new Vector2(RadiusWorldPx * 0.4f, 0),
new Vector2(FacingTickPx, 0),
new Color(1f, 0.96f, 0.86f),
width: RadiusWorldPx * 0.18f,
antialiased: false);
}
}
}