128 lines
2.9 KiB
GDScript
128 lines
2.9 KiB
GDScript
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()
|