Cow_Life_Sim_RPG/NPCs/Seagulls/Seagull.gd

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()