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
+82
View File
@@ -0,0 +1,82 @@
extends BaseProjectileWeapon
class_name Mortar
func _init() -> void:
weapon_name = "Mortar"
fire_rate = 1.5 # Slow
max_ammo = 1
reload_time = 3.0 # Extremely long
base_damage = 200.0 # Huge damage
min_damage = 20.0
falloff_start = 0.0
max_range = 500.0
automatic = false
spread_angle = 0.0
projectile_speed = 25.0 # Very slow
projectile_gravity = 15.0 # Heavy drop
func _build_model() -> void:
position = Vector3(0.3, -0.4, -0.5)
var mat_olive = StandardMaterial3D.new()
mat_olive.albedo_color = Color(0.2, 0.3, 0.1)
# Thick short tube
var body = MeshInstance3D.new()
var b_mesh = CylinderMesh.new()
b_mesh.top_radius = 0.12
b_mesh.bottom_radius = 0.12
b_mesh.height = 0.5
b_mesh.material = mat_olive
body.mesh = b_mesh
body.rotation.x = deg_to_rad(90)
model_root.add_child(body)
# Audio
fire_sound = AudioStreamPlayer3D.new()
fire_sound.stream = load("res://assets/sounds/mortar_fire.wav")
model_root.add_child(fire_sound)
reload_sound = AudioStreamPlayer3D.new()
reload_sound.stream = load("res://assets/sounds/shotgun_reload.wav") # Reusing
model_root.add_child(reload_sound)
func _spawn_custom_projectile(origin: Vector3, fire_dir: Vector3) -> void:
var proj = load("res://weapons/bouncing_projectile.gd").new()
# Mesh
var mesh_instance = MeshInstance3D.new()
var p_mesh = SphereMesh.new()
p_mesh.radius = 0.1
p_mesh.height = 0.2
var mat = StandardMaterial3D.new()
mat.albedo_color = Color(0.1, 0.1, 0.1) # Black bomb
p_mesh.material = mat
mesh_instance.mesh = p_mesh
proj.add_child(mesh_instance)
# Logic
proj.position = origin + fire_dir * 0.2
proj.logical_source = origin
proj.velocity = fire_dir * projectile_speed
proj.damage = base_damage
proj.min_damage = min_damage
proj.falloff_start = falloff_start
proj.max_range = max_range
proj.drop_gravity = projectile_gravity
proj.owner_player = player
# Mortar Bouncing logic
proj.fuse_time = 3.0 # Explodes 3 seconds after launch if it bounces
proj.impact_detonate_time = 2.0 # If flying > 2s, explode on impact instead
proj.bounciness = 0.4 # Heavy, loses momentum on bounce
# Explosive stats
proj.explosion_radius = 12.0 # Very large AoE
proj.explosion_knockback = 60.0 # Massive knockback
proj.falloff_curve = 2.0 # Steep dropoff: "Should be an instant kill in closest 50%"
# (0-50% = dist<6. 6/12 = 0.5. 1.0 - 0.5^2 = 0.75 multiplier. 200 * 0.75 = 150 damage -> 1 shot kill)
proj.can_self_damage = true # Can self damage
get_tree().current_scene.add_child(proj)