Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
61 lines
1.5 KiB
GDScript
61 lines
1.5 KiB
GDScript
extends Control
|
|
|
|
## D-053: Stance indicator — shows current movement stance on HUD.
|
|
## Sprint/Walk/Careful/Crouch. Color-coded for quick read.
|
|
## Lives on UILayer (z-layer 7).
|
|
|
|
const STANCE_COLORS := {
|
|
"Sprint": Color("#d45d5d"), # Red — fast, loud, dangerous
|
|
"Walk": Color("#c8d0e0"), # Default — neutral white-blue
|
|
"Careful": Color("#6bc9a6"), # Green — quiet, observant
|
|
"Crouch": Color("#e8c547"), # Amber — very quiet, slow
|
|
}
|
|
|
|
const STANCE_DEFAULT_COLOR := Color("#c8d0e0")
|
|
const BG_COLOR := Color(0.05, 0.05, 0.08, 0.5)
|
|
const FONT_SIZE := 13
|
|
const PADDING := Vector2(10, 6)
|
|
|
|
var _current_stance: String = "Walk"
|
|
|
|
|
|
func _ready() -> void:
|
|
mouse_filter = Control.MOUSE_FILTER_IGNORE
|
|
|
|
|
|
func update_from_state() -> void:
|
|
var stance: String = GameState.player_stance
|
|
if stance == _current_stance:
|
|
return
|
|
_current_stance = stance
|
|
queue_redraw()
|
|
|
|
|
|
func _draw() -> void:
|
|
var font := ThemeDB.fallback_font
|
|
var text := _current_stance
|
|
var text_size := font.get_string_size(text, HORIZONTAL_ALIGNMENT_LEFT, -1, FONT_SIZE)
|
|
var box_size := text_size + PADDING * 2
|
|
|
|
# Background
|
|
draw_rect(Rect2(Vector2.ZERO, box_size), BG_COLOR)
|
|
|
|
# Stance text
|
|
var color: Color = STANCE_COLORS.get(_current_stance, STANCE_DEFAULT_COLOR)
|
|
draw_string(
|
|
font,
|
|
PADDING + Vector2(0, text_size.y),
|
|
text,
|
|
HORIZONTAL_ALIGNMENT_LEFT,
|
|
-1,
|
|
FONT_SIZE,
|
|
color
|
|
)
|
|
|
|
|
|
# -- Public API ---------------------------------------------------------------
|
|
|
|
|
|
func get_current_stance() -> String:
|
|
return _current_stance
|