76 lines
2.3 KiB
GDScript
76 lines
2.3 KiB
GDScript
extends Node2D
|
|
|
|
class_name Shield
|
|
|
|
@export var max_capacity : int = 8
|
|
@export var shield_charge_rate : float = 1
|
|
@export var recharge_timer : Timer
|
|
@export var laser_timer : Timer
|
|
@export var laser_charge_rate : float = 20
|
|
@export var id : String = "startershield"
|
|
|
|
@onready var ship = get_parent()
|
|
@onready var capacity : float = max_capacity
|
|
var can_recharge : bool = false
|
|
var laser_recharge : bool = true
|
|
|
|
var wave_distances = [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]
|
|
var wave_positions = [Vector2.ZERO,Vector2.ZERO,Vector2.ZERO,Vector2.ZERO,Vector2.ZERO,Vector2.ZERO,Vector2.ZERO,Vector2.ZERO,Vector2.ZERO,Vector2.ZERO]
|
|
|
|
func _ready():
|
|
recharge_timer.timeout.connect(recharging_timer_out)
|
|
laser_timer.timeout.connect(laser_timer_out)
|
|
material = ship.material
|
|
|
|
func deal_damage(damage : float,hit_position : Vector2):
|
|
# Shield wave
|
|
var shield_tween = create_tween()
|
|
var wave_index = find_free_index()
|
|
shield_tween.tween_method(set_wave_distance.bind(wave_index),0,material.get_shader_parameter("max_distance"),0.5)
|
|
shield_tween.tween_callback(reset_wave_distance.bind(wave_index))
|
|
shield_tween.custom_step(0.1)
|
|
|
|
wave_positions[wave_index] = hit_position
|
|
|
|
material.set_shader_parameter("wave_centers",wave_positions)
|
|
material.set_shader_parameter("wave_distances",wave_distances)
|
|
|
|
capacity -= damage
|
|
if capacity < 0:
|
|
ship.hull.hp += capacity
|
|
capacity = 0
|
|
can_recharge = false
|
|
recharge_timer.start()
|
|
laser_timer.start()
|
|
|
|
func set_wave_distance(value,index):
|
|
wave_distances[index] = value
|
|
material.set_shader_parameter("wave_distances",wave_distances)
|
|
|
|
func reset_wave_distance(index):
|
|
wave_distances[index] = -1
|
|
material.set_shader_parameter("wave_distances",wave_distances)
|
|
|
|
func find_free_index() -> int:
|
|
for i in range(wave_distances.size()):
|
|
if wave_distances[i] == -1:
|
|
return i
|
|
return 0
|
|
|
|
func recharging_timer_out():
|
|
can_recharge = true
|
|
|
|
func _physics_process(delta):
|
|
if can_recharge:
|
|
capacity += shield_charge_rate * delta
|
|
if capacity > max_capacity:
|
|
capacity = max_capacity
|
|
can_recharge = false
|
|
if laser_recharge:
|
|
ship.hull.ammunition["Laser Energy"] += laser_charge_rate * delta
|
|
if ship.hull.ammunition["Laser Energy"] > ship.hull.max_ammunition["Laser Energy"]:
|
|
ship.hull.ammunition["Laser Energy"] = ship.hull.max_ammunition["Laser Energy"]
|
|
laser_recharge = false
|
|
|
|
func laser_timer_out():
|
|
laser_recharge = true
|