Files
frog/scripts/client.gd
T
2026-09-03 09:43:13 +02:00

128 lines
3.9 KiB
GDScript

extends CharacterBody3D
# --- ÉTATS DU CLIENT ---
enum State { ENTERING, WAITING, LEAVING }
var current_state: State = State.ENTERING
# --- PARAMÈTRES ---
@export var speed: float = 12
@export var entry_path: Array[Marker3D]
@export var exit_path: Array[Marker3D]
var current_path_index: int = 0
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"]
var pie_icons = {
Sauvegarde.get_text("pie1"): "res://assets/img/ui/client/orange.png",
Sauvegarde.get_text("pie2"): "res://assets/img/ui/client/yellow.png",
Sauvegarde.get_text("pie3"): "res://assets/img/ui/client/purple.png",
}
var topping_icons = {
Sauvegarde.get_text("topping1"): "res://assets/img/ui/client/meringue.png",
Sauvegarde.get_text("topping2"): "res://assets/img/ui/client/croisillon.png",
}
var desired_pie: String = ""
var desired_topping: String = ""
var ready_to_take_pie : bool = false
# --- RÉFÉRENCES UI ---
@onready var sprite: Sprite3D = $Sprite3D
@onready var label: RichTextLabel = $Sprite3D/SubViewport/RichTextLabel
func _ready() -> void:
sprite.visible = false
desired_pie = possible_pies.pick_random()
desired_topping = possible_toppings.pick_random()
func _physics_process(delta: float) -> void:
if not is_on_floor():
velocity.y -= 9.8 * delta
match current_state:
State.ENTERING:
move_along_path(entry_path, delta)
State.WAITING:
velocity.x = move_toward(velocity.x, 0, speed)
velocity.z = move_toward(velocity.z, 0, speed)
State.LEAVING:
move_along_path(exit_path, delta)
move_and_slide()
# --- FONCTION DE DÉPLACEMENT ---
func move_along_path(path_array: Array[Marker3D], delta: float) -> void:
if path_array.is_empty() or current_path_index >= path_array.size():
if current_state == State.ENTERING:
start_waiting()
elif current_state == State.LEAVING:
queue_free()
return
var target = path_array[current_path_index].global_position
var direction = global_position.direction_to(target)
direction.y = 0
direction = direction.normalized()
if global_position.distance_to(Vector3(target.x, global_position.y, target.z)) > 0.5:
velocity.x = direction.x * speed
velocity.z = direction.z * speed
var target_angle = atan2(velocity.x, velocity.z)
rotation.y = lerp_angle(rotation.y, target_angle, 10.0 * delta)
else:
current_path_index += 1
# --- ACTIONS DU CLIENT ---
func start_waiting() -> void:
ready_to_take_pie = true
current_state = State.WAITING
velocity = Vector3.ZERO
var p_icon = pie_icons[ desired_pie ]
var order_text = Sauvegarde.get_text("desire") + desired_pie
order_text += " [img=60]" + p_icon + "[/img]"
if desired_topping != "Aucun":
var t_icon = topping_icons[ desired_topping ]
order_text += "\n+ " + desired_topping + " [img=80]" + t_icon + "[/img]"
set_dialogue(order_text)
sprite.visible = true
# pour tests
#await get_tree().create_timer( 3 ).timeout
#leave_store()
# FONCTION MISE À JOUR : Le joueur doit donner la tarte ET le nappage
func give_item(pie_given: String, topping_given: String) -> void:
if current_state != State.WAITING:
return
#print("pie_given: ", pie_given, " | topping_given:", topping_given)
#print("desired_pie: ", desired_pie, " | desired_topping:", desired_topping)
# On vérifie les deux conditions
if pie_given == desired_pie and topping_given == desired_topping:
set_dialogue( Sauvegarde.get_text("goodpie") )
elif pie_given == desired_pie and topping_given != desired_topping:
set_dialogue( Sauvegarde.get_text("mixpie") )
else:
set_dialogue( Sauvegarde.get_text("badpie") )
leave_store()
func leave_store() -> void:
ready_to_take_pie = false
await get_tree().create_timer(2.0).timeout
sprite.visible = false
current_path_index = 0
current_state = State.LEAVING
func set_dialogue(text: String) -> void:
label.text = text