Files
GMTK25/player/player.gd
Minimata 3e0f1c99d5
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 5s
Create tag and build when new code gets to main / Export (push) Successful in 2m12s
feat: them skeletons man + reload after dancing
2025-08-02 23:57:02 +02:00

142 lines
3.1 KiB
GDScript

extends CharacterBody2D
@export_range(10, 1000, 10, "or_greater")
var speed = 300.0
@export_range(0, 0.2, 0.001, "or_greater")
var acceleration = 0.5
@export_group("Airborne")
@export_range(0, 1000, 10, "or_greater")
var jump_velocity = 400.0
@export_range(0, 10, 0.1, "or_greater")
var gravity_modifier = 1
@onready var hitting: Timer = $Hitting
@onready var hitbox: Area2D = $Hitbox
@onready var sword: AnimatedSprite2D = $Sword
@onready var damageable: Damageable = $Damageable
@onready var shield: AnimatedSprite2D = $Shield
@onready var base: AnimatedSprite2D = $Base
var current_sprite: AnimatedSprite2D
var is_in_cutscene = false # back to true on build
var current_animation = "idle"
var is_hitting = false
var has_shield = false
var has_sword = false
var has_armor = false
func play_anim():
current_sprite.play(current_animation)
func play_anim_run():
current_animation = "run"
func play_anim_idle():
current_animation = "idle"
func play_anim_jump():
current_animation = "jump"
func play_anim_dance():
current_animation = "dance"
func set_in_cutscene():
is_in_cutscene = true
play_anim_idle()
func set_in_play():
is_in_cutscene = false
func look_left():
current_sprite.flip_h = true
func look_right():
current_sprite.flip_h = false
func _ready() -> void:
current_sprite = base
func _physics_process(delta: float) -> void:
play_anim()
if is_in_cutscene:
velocity.x = move_toward(velocity.x, 0, speed)
move_and_slide()
return
if is_hitting:
current_animation = "hit"
velocity.x = move_toward(velocity.x, 0, speed)
move_and_slide()
return
if not is_on_floor():
velocity += get_gravity() * delta * gravity_modifier
var direction := Input.get_axis("move_left", "move_right")
damageable.set_active(has_shield and direction != 0)
if direction > 0 and is_on_floor():
look_right()
if direction < 0 and is_on_floor():
look_left()
if not is_on_floor():
current_animation = "got_hit"
else:
if velocity.x != 0:
play_anim_run()
else:
play_anim_idle()
if is_on_floor():
if direction:
var smoothed_speed = speed * smoothstep(0, 1, acceleration)
velocity.x += direction * smoothed_speed
velocity.x = clampf(velocity.x, -speed, speed)
else:
velocity.x = move_toward(velocity.x, 0, speed)
if Input.is_action_just_pressed("hit") and has_sword:
hit()
move_and_slide()
func hit():
is_hitting = true
hitting.start()
hitbox.monitorable = true
hitbox.monitoring = true
func _on_hitting_timeout() -> void:
is_hitting = false
hitbox.monitorable = false
hitbox.monitoring = false
func _on_dialogue_manager_dialogue_ended() -> void:
set_in_play()
func _on_trigger_dialogue_body_entered(body: Node2D) -> void:
set_in_cutscene()
func _on_start_dancing() -> void:
play_anim_dance()
func _on_npc_shield_dialogue_dialogue_ended() -> void:
set_in_play()
current_sprite.visible = false
current_sprite = shield
current_sprite.play("idle")
current_sprite.visible = true
has_shield = true
func _on_red_hood_sword_dialogue_dialogue_ended() -> void:
set_in_play()
current_sprite.visible = false
current_sprite = sword
current_sprite.play("idle")
current_sprite.visible = true
has_sword = true