Files
ScrapFrontier/game/entities/weapons/minelayer/minelayer_projectile.gd
T

100 lines
2.0 KiB
GDScript

class_name MinelayerProjectile
extends BlastProjectile
@export var deceleration : int
@onready var sprite_on := $Sprite2D_On
@onready var sprite_off := $Sprite2D_Off
@onready var livetime_timer := $LivetimeTimer
@onready var sprite_on_timer := $SpriteOnTimer
@onready var sprite_off_timer := $SpriteOffTimer
const OFF_TIMES = [
1.0, 1.0, 0.5, 0.25, 0.05, 0.05, 0.05, 0.05, 0.05,
]
const ON_TIME = 0.05
enum Sprite {
ON,
OFF,
}
var _bodies_inside: Array[Node2D] = []
var current_off_time_index := 0
func _ready() -> void:
_switch_sprite(Sprite.OFF)
super._ready()
func _physics_process(delta: float) -> void:
_process_acceleration(delta)
super._physics_process(delta)
func _process_acceleration(delta: float) -> void:
var current_deceleration := deceleration * delta
if _velocity.length() > current_deceleration:
_velocity -= _velocity.normalized() * current_deceleration
else:
_velocity = Vector2.ZERO
func _on_livetime_timer_timeout() -> void:
queue_free()
func _on_blast_body_entered(body: Node2D) -> void:
_bodies_inside.append(body)
_switch_sprite(Sprite.ON)
if sprite_on_timer.is_stopped() and sprite_off_timer.is_stopped():
sprite_on_timer.start(ON_TIME)
func _on_blast_body_exited(body: Node2D) -> void:
if not body in _bodies_inside: return
_bodies_inside.erase(body)
if _bodies_inside.size() == 0:
_reset()
func _on_sprite_on_timer_timeout() -> void:
current_off_time_index += 1
if current_off_time_index >= OFF_TIMES.size():
_try_to_damage_by_blast()
_process_hit_for_projectile(null)
else:
_switch_sprite(Sprite.OFF)
sprite_off_timer.start(OFF_TIMES[current_off_time_index])
func _on_sprite_off_timer_timeout() -> void:
_switch_sprite(Sprite.ON)
sprite_on_timer.start(ON_TIME)
func _reset() -> void:
_switch_sprite(Sprite.OFF)
sprite_on_timer.stop()
sprite_off_timer.stop()
current_off_time_index = 0
func _switch_sprite(sprite: Sprite) -> void:
match sprite:
Sprite.ON:
sprite_on.show()
sprite_off.hide()
Sprite.OFF:
sprite_on.hide()
sprite_off.show()