extends Area2D var enemy_type: String = "crt" var bullet_scene = preload("res://scenes/enemy_bullet.tscn") var start_pos = Vector2.ZERO var move_break var speed = 0 var direction = Vector2(0,1) var tween_speed: float = 1.4 var exploding = false var can_shoot = true var vulnerable = true var stunned = false var blocking = false var shader_active = false var enemy_move_aggression = randf_range(5, 20) var enemy_shoot_aggression = randf_range(4, 20) const TILE = 32 @onready var screensize = get_viewport_rect().size @onready var timer = $MoveTimer @onready var crt = get_node("CRT") func _ready(): timer.start() func start(pos): speed = 2 $CRT.frame = 0 #var pos_mod = randf_range(-TILE,TILE) #modify the start position randomly #position = Vector2(pos.x + pos_mod, -pos.y) #add the modifier position = Vector2(pos.x, -pos.y) start_pos = pos await get_tree().create_timer(randf_range(0.25, 0.55)).timeout var tween = create_tween().set_trans(Tween.TRANS_BACK) tween.tween_property(self, "position:y", start_pos.y, tween_speed) await tween.finished $MoveTimer.wait_time = enemy_move_aggression $MoveTimer.start() $ShootTimer.wait_time = enemy_shoot_aggression $ShootTimer.start() func _on_timer_timeout(): speed = randf_range(75, 100) $DirectionTimer.start() func _on_direction_timer_timeout(): var move_direction = int(randf_range(0,3)) match move_direction: 0: $CRT.frame = 0 direction = Vector2(0,1) can_shoot = true vulnerable = true 1: $CRT.frame = 1 direction = Vector2(1,0) can_shoot = false vulnerable = false 2: $CRT.frame = 2 direction = Vector2(-1,0) can_shoot = false vulnerable = false $DirectionTimer.start() func _on_shoot_timer_timeout(): if can_shoot == true: var b = bullet_scene.instantiate() get_tree().root.add_child(b) b.start(position) $ShootTimer.wait_time = randf_range(4, 20) $ShootTimer.start() else: $ShootTimer.start() func _process(delta): if stunned == true: return position += direction * speed * delta if position.x > screensize.x + 32: start(start_pos) if position.y > screensize.y + 32: start(start_pos) func hit_detection(): if exploding: return exploding = true EventBus.enemy_hit.emit(5) speed = 0 $ImpactCRT.play() $AnimationPlayer.play("explode") #set_deferred("monitoring", false) await $AnimationPlayer.animation_finished queue_free() EventBus.enemy_died.emit() func block(): if blocking: return blocking = true stunned = true await get_tree().create_timer(5).timeout shader_active = true crt.material.set_shader_parameter("toggle", 1.0) await get_tree().create_timer(1).timeout shader_active = false crt.material.set_shader_parameter("toggle", 0.0) stunned = false