feat: implement weapon system, loadout manager, and specialized projectile behaviors with associated assets
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user