2024-09-16 23:25:08 +03:00
|
|
|
class_name Player
|
2024-09-15 23:25:12 +03:00
|
|
|
extends CharacterBody2D
|
|
|
|
|
|
|
|
@onready var raycast: RayCast2D = $RayCast2D
|
2024-09-17 21:37:22 +03:00
|
|
|
@onready var sprite: Sprite2D = $Sprite2D
|
|
|
|
@onready var map: MainLevel = get_tree().root.get_child(0).get_node("TileMap")
|
|
|
|
@onready var tile_map: TileMapLayer = get_tree().root.get_child(0).get_node("TileMap/TileMapLayer")
|
2024-09-21 18:25:26 +03:00
|
|
|
@onready var camera: Camera2D = $Sprite2D/Camera2D
|
2024-09-16 23:25:08 +03:00
|
|
|
|
|
|
|
@export var speed: float = 40
|
|
|
|
@export var respawn_point: Marker2D
|
2024-09-15 23:25:12 +03:00
|
|
|
|
2024-09-16 00:32:56 +03:00
|
|
|
const TILE_SIZE = 8
|
|
|
|
|
|
|
|
var is_moving = false
|
2024-09-16 23:25:08 +03:00
|
|
|
var should_move = false
|
2024-09-17 21:37:22 +03:00
|
|
|
var is_dead = false
|
2024-09-16 00:32:56 +03:00
|
|
|
var input_dir: Vector2
|
2024-09-17 21:37:22 +03:00
|
|
|
var respawn_time: int = 10
|
2024-09-21 18:25:26 +03:00
|
|
|
var can_teleport := true
|
|
|
|
var rng := RandomNumberGenerator.new()
|
|
|
|
var camera_shake: float = 0.0
|
|
|
|
var camera_shake_fade: float = 0.0
|
2024-09-16 00:32:56 +03:00
|
|
|
|
2024-09-15 23:25:12 +03:00
|
|
|
func _ready():
|
2024-09-16 23:25:08 +03:00
|
|
|
_respawn()
|
2024-09-15 23:25:12 +03:00
|
|
|
pass
|
|
|
|
|
2024-09-16 00:32:56 +03:00
|
|
|
func _process(delta):
|
2024-09-17 21:37:22 +03:00
|
|
|
if not is_dead:
|
|
|
|
_try_get_input()
|
|
|
|
_try_interact()
|
2024-09-21 18:25:26 +03:00
|
|
|
_shake_camera(delta)
|
2024-09-17 21:37:22 +03:00
|
|
|
if is_dead:
|
|
|
|
if respawn_time > 0:
|
|
|
|
respawn_time -= 1
|
|
|
|
elif respawn_time <= 0:
|
|
|
|
_respawn()
|
2024-09-16 00:32:56 +03:00
|
|
|
|
|
|
|
func _physics_process(delta):
|
2024-09-17 21:37:22 +03:00
|
|
|
_try_move(delta)
|
2024-09-16 00:32:56 +03:00
|
|
|
|
2024-09-16 23:25:08 +03:00
|
|
|
func _respawn():
|
|
|
|
position = respawn_point.position
|
2024-09-17 21:37:22 +03:00
|
|
|
sprite.global_position = position
|
|
|
|
is_dead = false
|
|
|
|
is_moving = false
|
|
|
|
should_move = false
|
|
|
|
|
|
|
|
func _try_get_input():
|
2024-09-16 23:25:08 +03:00
|
|
|
should_move = false
|
2024-09-15 23:25:12 +03:00
|
|
|
if Input.is_action_pressed("move_up"):
|
2024-09-16 00:32:56 +03:00
|
|
|
input_dir = Vector2.UP
|
2024-09-16 23:25:08 +03:00
|
|
|
should_move = true
|
2024-09-15 23:25:12 +03:00
|
|
|
elif Input.is_action_pressed("move_right"):
|
2024-09-16 00:32:56 +03:00
|
|
|
input_dir = Vector2.RIGHT
|
2024-09-16 23:25:08 +03:00
|
|
|
should_move = true
|
2024-09-15 23:25:12 +03:00
|
|
|
elif Input.is_action_pressed("move_down"):
|
2024-09-16 00:32:56 +03:00
|
|
|
input_dir = Vector2.DOWN
|
2024-09-16 23:25:08 +03:00
|
|
|
should_move = true
|
2024-09-15 23:25:12 +03:00
|
|
|
elif Input.is_action_pressed("move_left"):
|
2024-09-16 00:32:56 +03:00
|
|
|
input_dir = Vector2.LEFT
|
2024-09-16 23:25:08 +03:00
|
|
|
should_move = true
|
2024-09-15 23:25:12 +03:00
|
|
|
|
2024-09-17 21:37:22 +03:00
|
|
|
if should_move and not is_moving:
|
2024-09-16 00:32:56 +03:00
|
|
|
raycast.target_position = input_dir * 8
|
2024-09-16 23:25:08 +03:00
|
|
|
raycast.force_raycast_update()
|
2024-09-17 21:37:22 +03:00
|
|
|
|
2024-09-16 00:32:56 +03:00
|
|
|
if raycast.is_colliding():
|
|
|
|
return
|
|
|
|
|
2024-09-17 21:37:22 +03:00
|
|
|
var current_tile: Vector2i = tile_map.local_to_map(global_position)
|
|
|
|
var target_tile: Vector2i = Vector2i(
|
|
|
|
current_tile.x + input_dir.x,
|
|
|
|
current_tile.y + input_dir.y
|
2024-09-16 00:32:56 +03:00
|
|
|
)
|
2024-09-15 23:25:12 +03:00
|
|
|
|
2024-09-17 21:37:22 +03:00
|
|
|
global_position = tile_map.map_to_local(target_tile)
|
|
|
|
|
|
|
|
var is_death_tile = map.is_death_tile(global_position)
|
|
|
|
if is_death_tile:
|
|
|
|
die()
|
|
|
|
return
|
|
|
|
|
|
|
|
is_moving = true
|
|
|
|
sprite.global_position = tile_map.map_to_local(current_tile)
|
|
|
|
|
|
|
|
|
|
|
|
func _try_move(delta: int):
|
|
|
|
if not is_moving or is_dead:
|
|
|
|
return
|
|
|
|
|
|
|
|
sprite.global_position = sprite.global_position.move_toward(global_position, 0.5)
|
|
|
|
|
|
|
|
if global_position == sprite.global_position:
|
|
|
|
is_moving = false
|
|
|
|
return
|
2024-09-16 23:25:08 +03:00
|
|
|
|
|
|
|
func die():
|
2024-09-17 21:37:22 +03:00
|
|
|
is_dead = true
|
|
|
|
is_moving = false
|
|
|
|
respawn_time = 10
|
2024-09-16 23:25:08 +03:00
|
|
|
|
2024-09-21 18:25:26 +03:00
|
|
|
func apply_camera_shake(strength: float = 10.0, fade: float = 5.0):
|
|
|
|
camera_shake = strength
|
|
|
|
camera_shake_fade = fade
|
|
|
|
|
2024-09-15 23:25:12 +03:00
|
|
|
func _try_interact():
|
2024-09-16 23:25:08 +03:00
|
|
|
raycast.target_position = input_dir * 8
|
|
|
|
raycast.force_raycast_update()
|
|
|
|
|
|
|
|
var collider = raycast.get_collider()
|
|
|
|
if Input.is_action_just_pressed("attack") and collider:
|
|
|
|
if collider is PuzzleElement:
|
|
|
|
(collider as PuzzleElement).interact(self)
|
2024-09-15 23:25:12 +03:00
|
|
|
pass
|
|
|
|
pass
|
2024-09-21 18:25:26 +03:00
|
|
|
|
|
|
|
func teleport(pos: Vector2i):
|
|
|
|
global_position = pos
|
|
|
|
can_teleport = false
|
|
|
|
|
|
|
|
func _shake_camera(delta):
|
|
|
|
if camera_shake > 0:
|
|
|
|
camera_shake = lerpf(camera_shake, 0, camera_shake_fade * delta)
|
|
|
|
camera.offset = Vector2(rng.randf_range(-camera_shake, camera_shake), rng.randf_range(-camera_shake, camera_shake))
|
|
|
|
|
|
|
|
func _on_area_entered(area: Area2D):
|
|
|
|
if area.is_in_group("death"):
|
|
|
|
die()
|