100 lines
2.0 KiB
GDScript
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()
|