69 lines
1.3 KiB
GDScript
69 lines
1.3 KiB
GDScript
extends Resource
|
|
class_name GatlingReloader
|
|
|
|
|
|
@export_range(1, 1500) var firerate : int = 1:
|
|
set(value):
|
|
firerate = value
|
|
_calculate_delay()
|
|
|
|
@export_range(1, 25) var spin_out_time : int = 1:
|
|
set(value):
|
|
spin_out_time = value
|
|
_calculate_delay()
|
|
|
|
|
|
const INITIAL_DELAY = 1.0
|
|
|
|
|
|
var _target_delay : float
|
|
var _current_delay : float = INITIAL_DELAY
|
|
var _delay_decrement : float
|
|
var _cooldown : float
|
|
var _last_delta : float
|
|
|
|
|
|
func _init() -> void:
|
|
resource_local_to_scene = true
|
|
|
|
|
|
func _ready() -> void:
|
|
_calculate_delay()
|
|
|
|
|
|
func process(delta: float) -> void:
|
|
if _cooldown > 0:
|
|
_cooldown -= delta
|
|
|
|
if _current_delay < INITIAL_DELAY:
|
|
_decrease_delay(_delay_decrement * -delta)
|
|
|
|
_last_delta = delta
|
|
|
|
|
|
func can_shoot() -> bool:
|
|
_decrease_delay(_delay_decrement * 2 * _last_delta)
|
|
return _cooldown <= 0
|
|
|
|
|
|
func shoot() -> void:
|
|
_cooldown = _current_delay
|
|
|
|
|
|
func reload() -> void:
|
|
pass
|
|
|
|
|
|
func get_process_percent() -> int:
|
|
return 100 - int(_cooldown * 100 / _current_delay)
|
|
|
|
|
|
func _calculate_delay() -> void:
|
|
_target_delay = 60.0 / firerate
|
|
_delay_decrement = (INITIAL_DELAY - _target_delay)/spin_out_time
|
|
|
|
|
|
func _decrease_delay(delay_decrement: float) -> void:
|
|
_current_delay = _current_delay - delay_decrement
|
|
_current_delay = clampf(_current_delay, _target_delay, INITIAL_DELAY)
|