extends Area2D signal damage_taken # signal shield_damage # signal shield_ui @export var speed: int = 150 @export var cooldown: float = 0.25 @export var bullet_scene : PackedScene @export var max_shield: int = 10 var shield: int = 1: set = set_shield var can_shoot = false var shader_active = false var clamp_shield = clamp(shield, 0, max_shield) @onready var screensize = get_viewport_rect().size @onready var explosion = $Explosion @onready var wait_time = $GunCooldown @onready var ship = $Ship func _ready(): set_process(false) print(shield) # start() func start(): print(shield) shader_active = false $Ship.frame = 1 $Ship.show() position = Vector2(screensize.x / 2, screensize.y) var tween = create_tween() tween.tween_property(self, "position:y", 32 * -1, .25).as_relative() $GunCooldown.wait_time = cooldown set_shield(max_shield) print(shield) await get_tree().create_timer(2).timeout set_process(true) can_shoot = true # EventBus.shield_changed.emit(max_shield, old_value, shield) func _process(delta): var input = Input.get_vector("left", "right", "up", "down") if input.x > 0: $Ship.frame = 2 $Ship/Boosters.animation = "right" elif input.x < 0: $Ship.frame = 0 $Ship/Boosters.animation = "left" else: $Ship.frame = 1 $Ship/Boosters.animation = "forward" position += input * speed * delta position = position.clamp(Vector2(8, 8), screensize - Vector2(8, 8)) if Input.is_action_pressed("shoot"): shoot() func shoot(): if not can_shoot: return can_shoot = false $GunCooldown.start() var b = bullet_scene.instantiate() get_tree().root.add_child(b) b.start(position + ship.position + Vector2(0, -1)) var tween = create_tween().set_parallel(false) tween.tween_property(ship, "position:y", 1, 0.1) tween.tween_property(ship, "position:y", 0, 0.05) func set_shield(value: int): var old_value = shield shield = clamp(value, 0, max_shield) EventBus.shield_changed.emit(max_shield, old_value, shield) print("Shield set to:", shield) if shield <= 0: print("Shader deactivated!") EventBus.player_died.emit() set_process(false) $Ship.hide() $Explosion.show() $Explosion/AnimationPlayer.play("explosion-one-shot") await $Explosion/AnimationPlayer.animation_finished shader_active = false func _on_gun_cooldown_timeout() -> void: can_shoot = true func _on_area_entered(area): if area.is_in_group("enemies"): area.explode() shield -= int(max_shield / 2) damage_taken.emit() if area.is_in_group("enemy_bullets") and self.monitoring == true: damage_taken.emit() func _on_damage_taken() -> void: shader_active = true print("Shader active!") $Ship.material.set_shader_parameter("toggle", 1.0) await get_tree().create_timer(1).timeout $Ship.material.set_shader_parameter("toggle", 0.0) shader_active = false print("Shader deactivated!") func _on_player_victory() -> void: print("Victory!") set_process(false) $Ship.frame = 1 await get_tree().create_timer(2).timeout var tween = create_tween() tween.tween_property(self, "position:y", 60 * -1, .25).set_ease(tween.EASE_IN) await tween.finished queue_free()