extends CharacterBody3D var speed = 6 @onready var arm: Node3D = $arm @onready var model: Node3D = $model @onready var mesh_instance: MeshInstance3D = $character/Root/Skeleton3D/characterMedium # GESTION CAMERA -------------------------- @onready var spring_arm: SpringArm3D = $arm/SpringArm3D @onready var camera: Camera3D = $arm/SpringArm3D/Camera3D @onready var camera_pov: Camera3D = $Camera3D_POV var third_person : bool = true @onready var sprite_tuto: Sprite3D = $SpriteTuto @onready var label_tuto: Label = $SpriteTuto/SubViewport/Label @onready var audio_footstep: AudioStreamPlayer3D = $Audio_Footstep var footstep_sounds: Array[AudioStream] = [ preload("res://assets/audio/sound-effects/footsteps/dirt_step_1.wav"), preload("res://assets/audio/sound-effects/footsteps/dirt_step_2.wav"), preload("res://assets/audio/sound-effects/footsteps/dirt_step_3.wav"), preload("res://assets/audio/sound-effects/footsteps/dirt_step_4.wav") ] var footstep_timer: float = 0.0 var FOOTSTEP_DELAY: float = 0.35 @onready var pause: CanvasLayer = $pause @onready var tuto: CanvasLayer = $tuto # animations @onready var anim_player: AnimationPlayer = $character/AnimationPlayer # boulangerie MOULIN var item : int = 0 # 0 rien, 1 abricot, 2 citron, 3 mirtylle var topping : int = 0 # 0 rien, 1 meringue, 2 croisillon @onready var area_tarte: Area3D = $Area3DTarte @onready var tarte_holded: StaticBody3D = $tarte # tps pour servir un client @onready var client_spawner: Node3D = $"../WaterMILL/client_spawner" var action_start_time: int = 0 func _start_action() -> void: action_start_time = Time.get_ticks_msec() func _end_action() -> void: var duration_ms := Time.get_ticks_msec() - action_start_time var duration_sec := duration_ms / 1000.0 if duration_sec < 6: duration_sec = 6 elif duration_sec > 35: duration_sec = 34 client_spawner.x_seconds = duration_sec var cpt_client : int = 0 var is_client_game_launched : bool = false var one_time_client_game : bool = true var one_time_cpt_feather : bool = true var cpt_feather : int = 0 var one_time_fox_grabbed : bool = true var fox_grabbed : int = 0 var can_run : bool = false @onready var frog: CharacterBody3D = $"../frog" @onready var area_3d_tuto_3: Area3D = $"../WaterMILL/Area3DTuto3" @onready var musique: AudioStreamPlayer3D = $Musique @onready var zip_effect: AudioStreamPlayer3D = $ZipEffect var can_play : bool = true func _ready(): Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) if third_person: camera.make_current() else: camera_pov.make_current() model.visible = false await get_tree().create_timer( .5 ).timeout tuto.show_text( "tuto1" ) func _input(_event): if Input.is_action_just_pressed("ui_cancel"): if !get_tree().paused: pause.pause() else: pause.resume() func _process(delta: float) -> void: if Input.is_action_just_pressed("give"): var objects_in_front = area_tarte.get_overlapping_bodies() # check if there is a client in the box for obj in objects_in_front: if obj.is_in_group("client"): if obj.get_parent().ready_to_take_pie: var l = get_conversion_pie() obj.get_parent().give_item( l[0], l[1] ) cpt_client += 1 reset_pie() return # no client was found for obj in objects_in_front: if obj.is_in_group("tarte"): set_item_topping( obj.item, obj.topping, obj.reset) return func _physics_process(delta: float) -> void: #print("global position; ", global_position) if can_run: speed = 8 FOOTSTEP_DELAY = 0.25 if is_client_game_launched: if one_time_client_game: var mat = mesh_instance.mesh.surface_get_material(0) mat.albedo_texture = load("res://assets/img/textures/faces/player_employe.png") mesh_instance.set_surface_override_material(0, mat) zip_effect.play() cpt_feather = 0 one_time_client_game = false if cpt_feather == 2: if one_time_cpt_feather: AudioServer.set_bus_volume_db( 1, -10.0) musique.stream = load("res://assets/audio/music/Daniel Balavoine - Tous les cris les S.O.S.mp3") musique.play() set_dialog_mode( Vector3.ZERO, true ) Dialogic.start("corinne_help") Dialogic.timeline_ended.connect( corinne_help_cinematic_end ) one_time_cpt_feather = false if fox_grabbed == 2: if one_time_fox_grabbed: set_dialog_mode( Vector3.ZERO, true ) Dialogic.start("fin") Dialogic.timeline_ended.connect( fin_cinematic_end ) one_time_fox_grabbed = false fade_out_music() if not is_on_floor(): velocity += get_gravity() * delta # Get the input direction and handle the movement/deceleration. var input_dir := Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down") if input_dir.length() < 0.1: input_dir = Vector2.ZERO var direction = (spring_arm.transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized() # On ne déplace et on ne tourne le joueur que si une vraie direction est donnée if can_play: if direction.length() > 0.1: if can_run: anim_player.play("walking", -1, 2) else: anim_player.play("walking", -1, 1.5) velocity.x = direction.x * speed velocity.z = direction.z * speed # 2. CORRECTION DE LA ROTATION INVERSÉE # Si le joueur tourne toujours à l'envers, enlève les signes "-" devant velocity.x et velocity.z var target_angle = atan2(-velocity.x, -velocity.z) # Le 10.0 est bien, il permet au modèle 3D de se tourner vite sans faire de coup sec. rotation.y = lerp_angle(rotation.y, target_angle, 10.0 * delta) else: anim_player.play("Idling") # Le joueur s'arrête doucement velocity.x = move_toward(velocity.x, 0, speed) velocity.z = move_toward(velocity.z, 0, speed) else: anim_player.stop() # footstep sounds if is_on_floor() and Vector2(velocity.x, velocity.z).length() > 0.5 and can_play: footstep_timer -= delta if footstep_timer <= 0.0: play_random_footstep() footstep_timer = FOOTSTEP_DELAY else: footstep_timer = 0.0 if can_play: move_and_slide() func corinne_help_cinematic_end(): set_dialog_mode( Vector3.ZERO, true ) set_default_cam() frog.size = .5 frog.can_scale = false func fade_out_music() -> void: var fade_tween = create_tween() if fade_tween and fade_tween.is_valid(): fade_tween.kill() var start_db := AudioServer.get_bus_volume_db(2) fade_tween = create_tween() fade_tween.tween_method( func(db: float): AudioServer.set_bus_volume_db(2, db), start_db, -20, 30 ) func fin_cinematic_end(): Sauvegarde.can_see_credit = true Transition.change_scene("res://ui/credit.tscn") # PARTIE BOULANGERIE MOULIN func set_item_topping( new_item : int, new_topping : int, reset:bool ): if reset: tarte_holded.visible = false else: tarte_holded.visible = true if new_item != 0 or reset: item = new_item tarte_holded.item = new_item if new_topping != 0 or reset: topping = new_topping tarte_holded.topping = topping tarte_holded.setup_color_and_name() func reset_pie(): item = 0 tarte_holded.item = 0 topping = 0 tarte_holded.topping = 0 tarte_holded.visible = false func get_conversion_pie(): var possible_pies = [Sauvegarde.get_text("pie1"), Sauvegarde.get_text("pie2"), Sauvegarde.get_text("pie3")] var possible_toppings = [Sauvegarde.get_text("topping1"), Sauvegarde.get_text("topping2"), "Aucun"] if item != 0: return [ possible_pies[ item - 1 ], possible_toppings[ topping -1 ] ] return [ "", possible_toppings[ topping -1 ] ] func play_random_footstep( pitch=[0.85, 1.15] ) -> void: var random_index = randi() % footstep_sounds.size() audio_footstep.stream = footstep_sounds[random_index] audio_footstep.pitch_scale = randf_range( pitch[0], pitch[1] ) audio_footstep.play() func set_dialog_mode( npc_pos=Vector3.ZERO, is_cinematic=false): can_play = !can_play if !is_cinematic: spring_arm.set_dialog_mode( npc_pos) anim_player.play("talking") func set_default_cam(): if third_person: camera.set_current(true) else: camera_pov.set_current(true) func set_pov_cam(): camera_pov.set_current(true) func reset_musique_position(): await get_tree().create_timer( .2 ).timeout musique.global_position = global_position musique.volume_db += 10 func _on_area_3d_tuto_3_body_entered(body: Node3D) -> void: if body.is_in_group("player"): tuto.show_text( "tuto3", true) area_3d_tuto_3.queue_free()