124 lines
3.8 KiB
GDScript
124 lines
3.8 KiB
GDScript
extends CharacterBody3D
|
|
|
|
@export var player: Node3D
|
|
@export var follow_speed: float = 5.6
|
|
@export var right_offset: float = 2.5
|
|
@export var forward_offset: float = 1
|
|
@export var car_cinematic : bool = false
|
|
|
|
@onready var anim_player: AnimationPlayer = $frog/AnimationPlayer
|
|
var size : float = .7
|
|
|
|
@onready var arms: MeshInstance3D = $frog/Armature/Skeleton3D/arms
|
|
@onready var body: MeshInstance3D = $frog/Armature/Skeleton3D/body
|
|
@onready var eyes: MeshInstance3D = $frog/Armature/Skeleton3D/eyes
|
|
@onready var feet: MeshInstance3D = $frog/Armature/Skeleton3D/feet
|
|
@onready var hands: MeshInstance3D = $frog/Armature/Skeleton3D/hands
|
|
@onready var legs: MeshInstance3D = $frog/Armature/Skeleton3D/legs
|
|
@onready var mesh = [ arms, body, eyes, feet, hands, legs ]
|
|
|
|
@onready var audio_player: AudioStreamPlayer3D = $AudioStreamPlayer3D
|
|
@onready var frog_launch_step = load("res://assets/audio/sound-effects/frog/frog_launch_step.mp3")
|
|
@onready var frog_quiet_step = load("res://assets/audio/sound-effects/frog/frog_quiet_step.mp3")
|
|
@onready var frog_loud_step = load("res://assets/audio/sound-effects/frog/frog_loud_step.wav")
|
|
|
|
@onready var audio_croak: AudioStreamPlayer3D = $AudioCroak
|
|
@onready var croak_timer: Timer = $CroakTimer
|
|
|
|
var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")
|
|
|
|
var can_scale : bool = false
|
|
|
|
func _ready() -> void:
|
|
if !car_cinematic:
|
|
scale = Vector3( size, size, size )
|
|
|
|
func _process(delta: float) -> void:
|
|
if car_cinematic:
|
|
if anim_player.current_animation != "idle":
|
|
anim_player.play("idle")
|
|
else:
|
|
scale_frog()
|
|
# transparent blue color
|
|
var dist = global_transform.origin.distance_to(player.camera.global_transform.origin)
|
|
for m in mesh:
|
|
for i in m.get_surface_override_material_count():
|
|
var mat = m.get_active_material(i)
|
|
if mat:
|
|
mat.set_shader_parameter("object_dist_to_camera", dist)
|
|
|
|
func _physics_process(delta):
|
|
if not player or car_cinematic:
|
|
return
|
|
|
|
if can_scale:
|
|
if player.is_client_game_launched:
|
|
size += 0.00025
|
|
else:
|
|
size += 0.00012
|
|
|
|
|
|
# Appliquer la gravité
|
|
if not is_on_floor():
|
|
velocity.y -= gravity * delta
|
|
|
|
|
|
var target_position = player.global_position + (player.global_transform.basis.x * right_offset) + (-player.global_transform.basis.z * forward_offset)
|
|
global_position.y = target_position.y
|
|
|
|
var direction = global_position.direction_to(target_position)
|
|
var distance = global_position.distance_to(target_position)
|
|
|
|
if distance > 15: # tp
|
|
target_position = player.global_position + (player.global_transform.basis.x * right_offset) + (-player.global_transform.basis.z * (-forward_offset*4) )
|
|
|
|
global_position = target_position
|
|
velocity.x = 0
|
|
velocity.z = 0
|
|
elif distance > 0.5: # walk
|
|
velocity.x = direction.x * follow_speed
|
|
velocity.z = direction.z * follow_speed
|
|
else: # idle
|
|
velocity.x = 0
|
|
velocity.z = 0
|
|
|
|
var look_target = player.global_position
|
|
look_target.y = global_position.y
|
|
look_at(look_target, Vector3.UP)
|
|
|
|
var real_speed = Vector2(get_real_velocity().x, get_real_velocity().z).length()
|
|
# Si frog n'est pas bloquée par un mur
|
|
if real_speed > 0.1:
|
|
if anim_player.current_animation != "walk":
|
|
anim_player.play("walk", 0.2)
|
|
_play_jump_sound()
|
|
else:
|
|
if anim_player.current_animation != "idle":
|
|
anim_player.play("idle", 0.2)
|
|
_play_land_sound()
|
|
|
|
move_and_slide()
|
|
|
|
func scale_frog():
|
|
var tween = create_tween()
|
|
var final_scale = Vector3(size, size, size)
|
|
|
|
tween.tween_property(self, "scale", final_scale, 2)
|
|
|
|
func _play_jump_sound() -> void:
|
|
audio_player.stream = frog_launch_step
|
|
audio_player.play()
|
|
|
|
func _play_land_sound() -> void:
|
|
if size < 2:
|
|
audio_player.stream = frog_quiet_step
|
|
else:
|
|
audio_player.stream = frog_loud_step
|
|
audio_player.play()
|
|
|
|
func _on_timer_timeout() -> void:
|
|
croak_timer.wait_time = randf_range(30, 45)
|
|
audio_croak.pitch_scale = randf_range( .9, 1.1 )
|
|
audio_croak.play()
|
|
|