Files
scrap-signal/entities/player/player.gd
Kellan KOZUME decd182b3e feat(atelier): complete zone 2 level design and game systems
- Add atelier tilemap (14x14 tiles) with dark atmosphere
- Add Journal D-891 interactable with Matteo Corda narrative
- Add pushable frozen robot (reuses PushableBox logic)
- Add PassageTrigger to reveal hidden path via TileMapLayer
- Add RepairStation for SCRAP-09 self-repair mini-game
- Add scrap09 puzzle in RepairMinigame with valid connections
- Add door to cour unlocked by scrap09_repaired flag
2026-04-25 12:54:33 -04:00

90 lines
2.5 KiB
GDScript

extends CharacterBody2D
const SPEED := 120
const TILE_SIZE := 16
@onready var sprite := $AnimatedSprite2D
@onready var interaction_area := $InteractionArea
@onready var push_ray := $PushRay
@onready var hud : HUD = get_tree().get_first_node_in_group("hud")
var last_direction := Vector2.DOWN
var interactable : Node = null
var is_locked := false :
set(value):
is_locked = value
if value:
velocity = Vector2.ZERO
sprite.play("idle_" + _dir_name(last_direction))
func _ready() -> void:
add_to_group("player")
interaction_area.area_entered.connect(_on_interaction_area_area_entered)
interaction_area.area_exited.connect(_on_interaction_area_area_exited)
if push_ray:
push_ray.target_position = Vector2(17, 0)
func _physics_process(_delta: float) -> void:
if is_locked:
velocity = Vector2.ZERO
move_and_slide()
return
var direction := Input.get_vector(
"move_left", "move_right", "move_up", "move_down"
)
if push_ray and direction != Vector2.ZERO:
var dominant := _dominant_direction(direction)
push_ray.target_position = dominant * (TILE_SIZE / 2.0 + 1)
push_ray.force_raycast_update()
if push_ray.is_colliding():
var collider = push_ray.get_collider()
if collider.is_in_group("pushable"):
collider.try_push(dominant, TILE_SIZE)
velocity = direction * SPEED
move_and_slide()
position = position.round()
_update_animation(direction)
func _dominant_direction(dir: Vector2) -> Vector2:
if abs(dir.x) > abs(dir.y):
return Vector2(sign(dir.x), 0)
else:
return Vector2(0, sign(dir.y))
func _unhandled_input(event: InputEvent) -> void:
if event.is_action_pressed("interact") and interactable:
interactable.interact()
# --- Animation ---
func _update_animation(direction: Vector2) -> void:
if direction != Vector2.ZERO:
last_direction = direction
sprite.play("walk_" + _dir_name(direction))
else:
sprite.play("idle_" + _dir_name(last_direction))
func _dir_name(dir: Vector2) -> String:
if abs(dir.x) > abs(dir.y):
return "right" if dir.x > 0 else "left"
else:
return "down" if dir.y > 0 else "up"
# --- Interaction ---
func _on_interaction_area_area_entered(area: Area2D) -> void:
print("Area détectée : ", area.name, " | has interact: ", area.has_method("interact"))
if area.has_method("interact"):
interactable = area
if hud:
hud.show_prompt(area.prompt_text if "prompt_text" in area else "[E] Interagir")
func _on_interaction_area_area_exited(area: Area2D) -> void:
if area == interactable:
interactable = null
if hud:
hud.hide_prompt()