1
0
Fork 0
Cleanomancer/Script/Player.gd

159 lines
4.1 KiB
GDScript3
Raw Normal View History

2021-04-24 21:35:17 +02:00
tool
extends Area2D
2021-04-25 19:44:16 +02:00
class_name Player
2021-04-24 21:35:17 +02:00
2021-04-24 22:28:55 +02:00
export var speed : float = 1
2021-04-25 16:16:48 +02:00
export var speed_dash : float = 3
2021-04-24 22:28:55 +02:00
export var rest : float = 1
2021-04-25 23:32:24 +02:00
export var reservoir : int = 1
2021-04-24 21:35:17 +02:00
2021-04-25 19:44:16 +02:00
var level
2021-04-26 13:51:52 +02:00
onready var footsteps = $FootSteps
onready var deny = $Deny
2021-04-24 21:35:17 +02:00
2021-04-27 21:22:03 +02:00
var tile_position := Vector2(0,0) setget update_position
2021-04-24 22:28:55 +02:00
var last_move_time := 0.0
2021-04-25 02:22:07 +02:00
var step_count := 0
var stepped := false
2021-04-25 16:16:48 +02:00
var dashing := false
2021-04-24 22:28:55 +02:00
2021-04-24 21:35:17 +02:00
class Movement:
var action: String
var direction: Vector2
var animation: String
func _init(_action, _direction, _animation):
action = _action
direction = _direction
animation = _animation
var movements = [
Movement.new("ui_right", Vector2.RIGHT, "right"),
Movement.new("ui_left", Vector2.LEFT, "left"),
Movement.new("ui_up", Vector2.UP, "back"),
Movement.new("ui_down", Vector2.DOWN, "front")
]
2021-04-25 23:32:24 +02:00
class Sweep:
var action: String
var tile_limit
var waste_limit
var cost: int
2021-04-26 13:51:52 +02:00
var sound: AudioStreamPlayer
2021-04-25 23:32:24 +02:00
2021-04-26 13:51:52 +02:00
func _init(_action, _tlimit, _wlimit, _cost, _sound):
2021-04-25 23:32:24 +02:00
action = _action
tile_limit = _tlimit
waste_limit = _wlimit
cost = _cost
2021-04-26 13:51:52 +02:00
sound = _sound
2021-04-25 23:32:24 +02:00
2021-04-26 13:51:52 +02:00
onready var sweeps = [
Sweep.new("dash", INF, INF, 3, $Hoover),
Sweep.new("whoosh", INF, 1, 2, null)
2021-04-25 23:32:24 +02:00
]
2021-04-24 21:35:17 +02:00
var movement_queue = []
var current_target = null
2021-04-27 21:22:03 +02:00
var current_direction : Movement = movements.back() setget update_animation
2021-04-24 21:35:17 +02:00
onready var sprite = $AnimatedSprite as AnimatedSprite
func _process(delta):
2021-04-25 19:44:16 +02:00
2021-04-24 21:35:17 +02:00
if Engine.editor_hint:
2021-04-25 19:44:16 +02:00
return
2021-04-27 21:22:03 +02:00
if Input.is_action_just_pressed("reset"):
2021-04-26 19:14:49 +02:00
level.reset()
2021-04-27 21:22:03 +02:00
if Input.is_action_just_pressed("undo"):
level.undo()
2021-04-26 01:44:38 +02:00
2021-04-25 19:44:16 +02:00
if (last_move_time + rest) * 1000 < OS.get_ticks_msec():
for movement in movements:
if Input.is_action_pressed(movement.action):
current_direction = movement
if not Input.is_action_pressed("lock_move"):
var target = level.get_tile_v(tile_position + movement.direction)
if target.can_walk(movement.direction) or target.can_push(movement.direction):
2021-04-25 19:44:16 +02:00
movement_queue.push_back(movement)
update_animation()
if not movement_queue.empty():
var current_movement : Movement = movement_queue.front()
if current_target == null:
current_target = tile_position + current_movement.direction
var tile = level.get_tile_v(current_target)
if not tile.can_walk(current_movement.direction) and not tile.can_push(current_movement.direction):
2021-04-25 19:44:16 +02:00
current_target = null
movement_queue.pop_front()
else:
tile.push(current_movement.direction)
2021-04-26 13:51:52 +02:00
footsteps.play()
2021-04-27 21:22:03 +02:00
level.take_snap()
2021-04-24 21:35:17 +02:00
2021-04-25 19:44:16 +02:00
if current_target != null:
tile_position += current_movement.direction * delta * (speed_dash if dashing else speed)
2021-04-24 21:35:17 +02:00
2021-04-25 19:44:16 +02:00
var remaining : Vector2 = current_target - tile_position
2021-04-24 21:35:17 +02:00
2021-04-25 19:44:16 +02:00
if remaining.dot(current_movement.direction) <= 0:
tile_position = current_target
current_target = null
movement_queue.pop_front()
2021-04-27 04:16:02 +02:00
if dashing:
level.check_player_stairs()
2021-04-25 19:44:16 +02:00
stepped = false
dashing = false
if level.get_tile_v(tile_position).is_stairs_entrance():
level.end_of_level()
2021-04-25 19:44:16 +02:00
elif remaining.length() < 0.5 and not stepped:
step_count += 1
stepped = true
2021-04-24 21:35:17 +02:00
update_position()
2021-04-25 19:44:16 +02:00
last_move_time = OS.get_ticks_msec() / 1000.0
2021-04-24 21:35:17 +02:00
2021-04-25 23:32:24 +02:00
for sweep in sweeps:
2021-04-24 21:35:17 +02:00
2021-04-26 13:51:52 +02:00
if Input.is_action_just_pressed(sweep.action):
if reservoir >= sweep.cost:
2021-04-24 21:35:17 +02:00
2021-04-26 13:51:52 +02:00
if not current_target == null:
tile_position = current_target
var current = level.get_tile_v(tile_position)
var end = current.dash(current_direction.direction, sweep.tile_limit, sweep.waste_limit)
if current != end:
movement_queue = [current_direction]
current_target = Vector2 (end.x, end.y)
dashing = true
reservoir = reservoir - sweep.cost
level.update_reservoir()
if sweep.sound != null:
sweep.sound.play()
break
else:
deny.play()
2021-04-25 23:32:24 +02:00
2021-04-26 13:51:52 +02:00
else:
deny.play()
2021-04-25 23:32:24 +02:00
2021-04-24 21:35:17 +02:00
2021-04-27 21:22:03 +02:00
func update_position(var new_pos = false):
if new_pos is Vector2:
tile_position = new_pos
2021-04-26 18:15:56 +02:00
position = level._floor.cell_custom_transform * (tile_position + Vector2.ONE / 2 )
2021-04-24 21:35:17 +02:00
2021-04-27 21:22:03 +02:00
func update_animation(var new_dir = false):
if new_dir is Movement:
current_direction = new_dir
2021-04-25 16:16:48 +02:00
sprite.animation = current_direction.animation
2021-04-26 01:24:29 +02:00
sprite.frame = step_count % 2 + (0 if reservoir > 0 else 2)