feat: implement damage dummy system, floating UI numbers, and double-barrel shotgun mechanics

This commit is contained in:
DottsGit
2026-06-04 13:15:26 -04:00
parent d8cb91e593
commit a8b3619f2e
7 changed files with 206 additions and 0 deletions
+21
View File
@@ -8,6 +8,7 @@ signal chain_updated(count: int, bonus: float)
var _machine: MovementStateMachine = null
var head_pivot: Node3D = null # FPSCameraRig node
var camera: Camera3D = null
var _damage_layer: CanvasLayer = null
func _ready() -> void:
@@ -22,9 +23,29 @@ func _ready() -> void:
if head_pivot:
camera = head_pivot.get_node_or_null("Camera3D")
_damage_layer = CanvasLayer.new()
add_child(_damage_layer)
set_process(true)
set_physics_process(true)
func spawn_damage_number(amount: float, hit_pos: Vector3) -> void:
if not camera or not _damage_layer: return
var label = load("res://ui/floating_damage_text.gd").new()
label.text = str(round(amount))
label.add_theme_font_size_override("font_size", 32)
label.add_theme_color_override("font_color", Color(1.0, 0.6, 0.1))
label.add_theme_color_override("font_outline_color", Color(0, 0, 0, 0.8))
label.add_theme_constant_override("outline_size", 6)
# Small random offset in 3D space so multiple pellets don't perfectly overlap
var offset = Vector3(randf_range(-0.4, 0.4), randf_range(-0.4, 0.4), randf_range(-0.4, 0.4))
label.target_pos = hit_pos + offset
label.camera = camera
_damage_layer.add_child(label)
func _ensure_machine() -> MovementStateMachine:
if is_instance_valid(_machine):