104 lines
2.6 KiB
GDScript
104 lines
2.6 KiB
GDScript
class_name Player extends Entity
|
|
|
|
@export var dash_base_cd: float = 0.7
|
|
|
|
@onready var player_sprite :AnimatedSprite2D = $PlayerSprite
|
|
@onready var mask_sprite : Sprite2D = $PlayerSprite/MaskSprite
|
|
|
|
var dash_active := false
|
|
var dash_cd_timer := 0.0
|
|
|
|
var mask_start_time = 10
|
|
var mask_time_remaining := 15.0
|
|
|
|
var closest_mask_drop: MaskDrop
|
|
var last_mask_drop : MaskDrop
|
|
const INTERACT_DIST = 60.0
|
|
|
|
var dead = false
|
|
|
|
func _ready() -> void:
|
|
health_changed.connect(EventBus.health_changed.emit)
|
|
health_changed.emit(health)
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
if dead: return
|
|
var input_vector := Input.get_vector("move_left", "move_right", "move_up", "move_down")
|
|
|
|
if input_vector != Vector2.ZERO:
|
|
velocity += input_vector * move_speed
|
|
|
|
dash_cd_timer -= delta
|
|
if Input.is_action_just_pressed("dash") and dash_cd_timer <= 0:
|
|
start_dash(input_vector)
|
|
|
|
_handle_mask_durability(delta)
|
|
|
|
_check_items()
|
|
|
|
super._physics_process(delta)
|
|
|
|
func die():
|
|
if dead: return
|
|
super.die()
|
|
dead = true
|
|
visible = false
|
|
|
|
func revive():
|
|
if not dead: return
|
|
dead = false
|
|
visible = true
|
|
|
|
|
|
func start_dash(dir: Vector2):
|
|
dash_active = true
|
|
dash_cd_timer = dash_base_cd
|
|
velocity += dir * move_speed * 40
|
|
|
|
var tween = create_tween()
|
|
tween.tween_property(player_sprite, "scale:x", 0.5, 0.1)
|
|
tween.tween_property(player_sprite, "scale:x", 1, 0.1)
|
|
|
|
func _input(event: InputEvent) -> void:
|
|
if event.is_action_pressed("attack") and current_mask_data:
|
|
use_mask(get_global_mouse_position())
|
|
|
|
if event.is_action_pressed("interact") and closest_mask_drop:
|
|
equip_mask(closest_mask_drop)
|
|
|
|
func equip_mask(drop_node : MaskDrop):
|
|
if drop_node.has_method("collect"):
|
|
drop_node.collect(global_position)
|
|
|
|
current_mask_data = drop_node.mask_type
|
|
mask_time_remaining = mask_start_time
|
|
|
|
mask_sprite.texture = current_mask_data.texture
|
|
EventBus.mask_changed.emit(current_mask_data.mask_name)
|
|
|
|
func _handle_mask_durability(delta : float):
|
|
if get_tree().get_node_count_in_group("enemy") > 0:
|
|
mask_time_remaining -= delta
|
|
if mask_time_remaining <= 0:
|
|
die()
|
|
EventBus.mask_time_changed.emit(mask_time_remaining / mask_start_time)
|
|
|
|
func _check_items():
|
|
var masks : Array[Node] = get_tree().get_nodes_in_group("mask")
|
|
closest_mask_drop = null
|
|
var min_dist := INF
|
|
|
|
for mask : MaskDrop in masks:
|
|
var dist := global_position.distance_to(mask.global_position)
|
|
if dist < INTERACT_DIST + 10:
|
|
min_dist = dist
|
|
closest_mask_drop = mask
|
|
|
|
if last_mask_drop and closest_mask_drop != last_mask_drop:
|
|
last_mask_drop.hide_popup()
|
|
last_mask_drop = closest_mask_drop
|
|
if closest_mask_drop:
|
|
if min_dist < INTERACT_DIST:
|
|
closest_mask_drop.show_popup()
|
|
else:
|
|
closest_mask_drop.hide_popup()
|