extends NPC class_name Seagull var rng = RandomNumberGenerator.new() var walking = true var cawing = false var lastposition = position var movementTarget var movementThreshold = 0.1 var moveSpeed:int = 140 var pauseTimer = 0 var flipTimer = 0 var seagullSoundPlayer:AudioStreamPlayer2D var cawSounds = [] var lastCawIndex = -1 func _ready(): dialogueResource = preload("res://NPCs/Seagulls/Seagull.dialogue") start_walking() initialize_seagull_sounds() func initialize_seagull_sounds(): seagullSoundPlayer = $SeagullSounds cawSounds.append(preload("res://Sounds/SFX/Seagulls/SeagullCaws1.mp3")) func _process(delta): if walking: movement(delta) elif cawing: pass else: pauseTimer -= delta flipTimer -= delta if flipTimer <= 0: flipTimer += 0.2 if rng.randf_range(0, 16) <= 1: $Sprite.flip_h = !$Sprite.flip_h if pauseTimer <= 0: pick_next_action() func start_cawing(): cawing = true $Sprite.play("Caw") pick_caw() func stop_cawing(): cawing = false $Sprite.animation = "default" $Sprite.pause() $Sprite.set_frame(0) set_pause_timer() func pick_next_action(): if rng.randi_range(0, 5) >= 3: start_walking() elif rng.randi_range(0, 5) >= 2: set_pause_timer() else: start_cawing() func set_pause_timer(): #short pause if rng.randi_range(0, 4) >= 1: pauseTimer = rng.randf_range(0.2, 1) else: pauseTimer = rng.randf_range(2, 8) func stop_walking(): walking = false $Sprite.animation = "default" $Sprite.pause() $Sprite.set_frame(0) set_pause_timer() func start_walking(): walking = true $Sprite.play("default") pick_new_target_position() func movement(delta): var distanceToTarget = global_position.distance_to(movementTarget) lastposition = position if distanceToTarget > movementThreshold: if walking == true: var movementVector = global_position.move_toward(movementTarget, moveSpeed*delta) - global_position var collisions = move_and_collide(movementVector) if collisions != null: stop_walking() else: global_position = movementTarget stop_walking() if position > lastposition: $Sprite.flip_h = true if position < lastposition: $Sprite.flip_h = false func pick_new_target_position(): movementTarget = global_position - Vector2(rng.randf_range(-300, 300), rng.randf_range(-300, 300)) #extra chance to pick target if collision would happen quickly var movementVector = global_position.move_toward(movementTarget, moveSpeed*0.1) - global_position var collided = test_move(transform, movementVector) if collided: movementTarget = global_position - Vector2(rng.randf_range(-300, 300), rng.randf_range(-300, 300)) func pick_caw(): var newIndex = rng.randi_range(0, cawSounds.size() - 1) if newIndex == lastCawIndex: newIndex = rng.randi_range(0, cawSounds.size() - 1) seagullSoundPlayer.stream = cawSounds[newIndex] seagullSoundPlayer.play() lastCawIndex = newIndex func _on_seagull_sounds_finished(): stop_cawing()