feat: implement weapon set system (t_p2_weapons)
- WeaponData resource class with configurable weapon properties and pre-configured constants for rifle, pistol, shotgun, and SMG - WeaponDefinitions singleton/static registry with WEAPONS dictionary - WeaponServer node for server-authoritative weapon logic including fire rate cooldowns, ammo tracking, reload state machine, and multi-pellet hit-scan raycasting - Extended WeaponManager with weapon inventory array, weapon switching, per-weapon state persistence, fire_animation_triggered signal
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
## WeaponData — A resource defining a weapon's static properties.
|
||||
##
|
||||
## Used as the data contract between weapon_definitions.gd, weapon_server.gd,
|
||||
## and weapon_manager.gd. Each weapon type is pre-configured and accessible
|
||||
## via the class-level constants (RIFLE, PISTOL, SHOTGUN, SMG).
|
||||
##
|
||||
## Usage:
|
||||
## var data: WeaponData = WeaponData.RIFLE
|
||||
## print(data.display_name) # "Assault Rifle"
|
||||
##
|
||||
extends Resource
|
||||
class_name WeaponData
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Properties
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
## Unique identifier string (e.g., "rifle", "pistol").
|
||||
@export var weapon_id: String = ""
|
||||
|
||||
## Human-readable weapon name.
|
||||
@export var display_name: String = ""
|
||||
|
||||
## Base damage per projectile/pellet.
|
||||
@export var damage: float = 0.0
|
||||
|
||||
## Rate of fire in rounds per second (Hz).
|
||||
@export var fire_rate: float = 0.0
|
||||
|
||||
## Magazine capacity (max ammo per reload).
|
||||
@export var mag_size: int = 0
|
||||
|
||||
## Reload duration in seconds.
|
||||
@export var reload_time: float = 0.0
|
||||
|
||||
## If true, hold to fire continuously. If false, single-shot per press.
|
||||
@export var is_automatic: bool = false
|
||||
|
||||
## Base weapon spread in degrees (used for accuracy cone).
|
||||
@export var spread_degrees: float = 0.0
|
||||
|
||||
## Effective range in Godot units (metres conceptual).
|
||||
@export var range: float = 0.0
|
||||
|
||||
## Number of pellets/projectiles per shot (1 for most weapons, 8 for shotgun).
|
||||
@export var pellets_per_shot: int = 1
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Pre-configured weapon instances (class-level constants)
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
## Assault Rifle — 30 dmg, 10 rps, 30 mag, 2.1s reload, automatic, 0.5° spread, 200m range.
|
||||
const RIFLE: Resource = pref(
|
||||
"rifle", "Assault Rifle",
|
||||
30.0, 10.0, 30, 2.1, true, 0.5, 200.0, 1
|
||||
)
|
||||
|
||||
## Pistol — 25 dmg, 4 rps, 12 mag, 1.5s reload, semi-auto, 0.3° spread, 80m range.
|
||||
const PISTOL: Resource = pref(
|
||||
"pistol", "Pistol",
|
||||
25.0, 4.0, 12, 1.5, false, 0.3, 80.0, 1
|
||||
)
|
||||
|
||||
## Shotgun — 8 dmg × 8 pellets, 1 rps, 8 mag, 3.0s reload, semi-auto, 3° spread, 30m range.
|
||||
const SHOTGUN: Resource = pref(
|
||||
"shotgun", "Shotgun",
|
||||
8.0, 1.0, 8, 3.0, false, 3.0, 30.0, 8
|
||||
)
|
||||
|
||||
## SMG — 18 dmg, 12 rps, 25 mag, 1.8s reload, automatic, 1.5° spread, 100m range.
|
||||
const SMG: Resource = pref(
|
||||
"smg", "Submachine Gun",
|
||||
18.0, 12.0, 25, 1.8, true, 1.5, 100.0, 1
|
||||
)
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Factory helper
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
## Internal helper that constructs a WeaponData instance from raw values.
|
||||
## This avoids repeating the constructor boilerplate for every constant.
|
||||
static func pref(
|
||||
_weapon_id: String,
|
||||
_display_name: String,
|
||||
_damage: float,
|
||||
_fire_rate: float,
|
||||
_mag_size: int,
|
||||
_reload_time: float,
|
||||
_is_automatic: bool,
|
||||
_spread_degrees: float,
|
||||
_range: float,
|
||||
_pellets: int = 1
|
||||
) -> WeaponData:
|
||||
var w := WeaponData.new()
|
||||
w.weapon_id = _weapon_id
|
||||
w.display_name = _display_name
|
||||
w.damage = _damage
|
||||
w.fire_rate = _fire_rate
|
||||
w.mag_size = _mag_size
|
||||
w.reload_time = _reload_time
|
||||
w.is_automatic = _is_automatic
|
||||
w.spread_degrees = _spread_degrees
|
||||
w.range = _range
|
||||
w.pellets_per_shot = _pellets
|
||||
return w
|
||||
@@ -0,0 +1,34 @@
|
||||
## WeaponDefinitions — Central registry of all weapon definitions.
|
||||
##
|
||||
## Provides a WEAPONS dictionary keyed by weapon_id for runtime lookup,
|
||||
## plus a convenience getter. The data itself lives in WeaponData constants,
|
||||
## so this file serves as a single import point for the full arsenal.
|
||||
##
|
||||
## Usage (as autoload singleton or direct preload):
|
||||
## var data = WeaponDefinitions.get_weapon("rifle")
|
||||
## # or:
|
||||
## var all = WeaponDefinitions.WEAPONS
|
||||
##
|
||||
extends RefCounted
|
||||
class_name WeaponDefinitions
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Weapon Registry
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
## All weapons indexed by weapon_id — the single source of truth for the
|
||||
## game's starter arsenal. Add new weapons here and in WeaponData.
|
||||
const WEAPONS: Dictionary = {
|
||||
"rifle": WeaponData.RIFLE,
|
||||
"pistol": WeaponData.PISTOL,
|
||||
"shotgun": WeaponData.SHOTGUN,
|
||||
"smg": WeaponData.SMG,
|
||||
}
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Lookup
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
## Return the WeaponData for the given weapon_id, or null if unknown.
|
||||
static func get_weapon(id: String) -> WeaponData:
|
||||
return WEAPONS.get(id, null) as WeaponData
|
||||
Reference in New Issue
Block a user