feat: implement weapon system, loadout manager, and specialized projectile behaviors with associated assets

This commit is contained in:
DottsGit
2026-06-04 18:14:50 -04:00
parent c32f45a8aa
commit e6a2199777
36 changed files with 700 additions and 4 deletions
+19 -4
View File
@@ -12,6 +12,9 @@ class_name BaseHitscanWeapon
@export var automatic: bool = true
@export var spread_angle: float = 0.01
@export var penetration_count: int = 0
@export var penetration_damage_penalty: float = 0.5
var current_ammo: int = 30
var reloading: bool = false
var reload_timer: float = 0.0
@@ -125,14 +128,26 @@ func _shoot_hitscan() -> void:
if player:
query.exclude = [player.get_rid()]
var result = space_state.intersect_ray(query)
if result:
var hits_remaining = penetration_count + 1
var current_damage_mult = 1.0
while hits_remaining > 0:
var result = space_state.intersect_ray(query)
if not result:
break # Nothing else in the way
var hit_dist = origin.distance_to(result.position)
var damage = base_damage
var damage = base_damage * current_damage_mult
if hit_dist > falloff_start:
var falloff_factor = clampf((hit_dist - falloff_start) / (max_range - falloff_start), 0.0, 1.0)
damage = lerpf(base_damage, min_damage, falloff_factor)
damage = lerpf(base_damage * current_damage_mult, min_damage * current_damage_mult, falloff_factor)
if result.collider.has_method("take_damage"):
result.collider.take_damage(damage, result.position, player)
# Add this hit to exclude so next loop goes through it
query.exclude.append(result.rid)
hits_remaining -= 1
current_damage_mult *= penetration_damage_penalty