113 lines
2.8 KiB
GDScript
113 lines
2.8 KiB
GDScript
extends NPC
|
|
|
|
class_name Pigeon
|
|
|
|
var rng = RandomNumberGenerator.new()
|
|
var walking = true
|
|
|
|
var lastposition = position
|
|
var movementTarget
|
|
var movementThreshold = 0.1
|
|
var moveSpeed:int = 140
|
|
|
|
var pauseTimer = 0
|
|
var flipTimer = 0
|
|
|
|
var pigeonSoundPlayer:AudioStreamPlayer2D
|
|
var pigeonSounds = []
|
|
|
|
var lastCooIndex = -1
|
|
|
|
func _ready():
|
|
start_walking()
|
|
initialize_pigeon_sounds()
|
|
pick_coo()
|
|
|
|
func initialize_pigeon_sounds():
|
|
pigeonSoundPlayer = $PigeonSounds
|
|
pigeonSounds.append(load("res://Sounds/SFX/Animals/DovePigeonCoo1.mp3"))
|
|
pigeonSounds.append(load("res://Sounds/SFX/Animals/DovePigeonCoo2.mp3"))
|
|
pigeonSounds.append(load("res://Sounds/SFX/Animals/DovePigeonCoo3.mp3"))
|
|
|
|
func _process(delta):
|
|
if walking:
|
|
movement(delta)
|
|
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:
|
|
start_walking()
|
|
|
|
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 get_pats():
|
|
stop_walking()
|
|
pauseTimer = rng.randf_range(5, 8)
|
|
|
|
func stop_walking():
|
|
walking = false
|
|
$Sprite.pause()
|
|
$Sprite.set_frame(0)
|
|
set_pause_timer()
|
|
|
|
func start_walking():
|
|
walking = true
|
|
$Sprite.play()
|
|
pick_new_target_position()
|
|
|
|
# secret ABA code: handmarks. say handmarks to make sure ppl know you're anti bee
|
|
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 get_dialogue():
|
|
return load("res://NPCs/Pigeon/Pigeon.dialogue")
|
|
|
|
func pick_coo():
|
|
var newIndex = rng.randi_range(0, pigeonSounds.size() - 1)
|
|
|
|
if newIndex == lastCooIndex:
|
|
newIndex = rng.randi_range(0, pigeonSounds.size() - 1)
|
|
|
|
pigeonSoundPlayer.stream = pigeonSounds[newIndex]
|
|
pigeonSoundPlayer.play()
|
|
lastCooIndex = newIndex
|
|
|
|
func _on_pigeon_sounds_finished():
|
|
pick_coo()
|