extends Entity @export var GRAVITY = 30 @export var JUMP_FORCE = 500 @onready var animated_sprite = $AnimatedSprite2D @onready var attack_timer = $AttackTimer @onready var collider = $CollisionShape2D @onready var punch_hitbox = $PunchHitbox var jumping = false var facing_right = true const ATTACK_DAMAGE = 25 const INITIAL_HEALTH = 100 const SPEED_MULTIPLIER = 300 const ATTACK_KNOCKBACK = 5000 func _init() -> void: super._init(INITIAL_HEALTH, SPEED_MULTIPLIER, ATTACK_DAMAGE) func _ready(): animated_sprite.play("idle") punch_hitbox.body_entered.connect(punch_connect) punch_hitbox.visible = false func _physics_process(delta): super._physics_process(delta) if is_on_floor(): # allow the player to jump if jumping: jumping = false if Input.is_action_just_pressed("jump"): velocity.y = -JUMP_FORCE jumping = true animated_sprite.play("jump") else: # apply gravity velocity.y += GRAVITY if velocity.y > 1000: velocity.y = 1000 # perform horizontal movement var horizontal_direction = Input.get_axis("move_left", "move_right") velocity.x = speed * horizontal_direction move_and_slide() # ensure the player faces the correct direction if horizontal_direction > 0 && !facing_right: animated_sprite.flip_h = false elif horizontal_direction < 0 && facing_right: animated_sprite.flip_h = true if horizontal_direction != 0: facing_right = horizontal_direction > 0 # figure out which animation should be played # respecting the jump animation above all if !jumping and attack_timer.is_stopped(): if is_on_floor() && horizontal_direction != 0: animated_sprite.play("walk") else: animated_sprite.play("idle") punch_hitbox.visible = true if !attack_timer.is_stopped() else false func punch_connect(node: Node): if node is Entity and node != self and !attack_timer.is_stopped(): node.health -= damage node.take_knockback(ATTACK_KNOCKBACK) func _process(delta: float) -> void: if attack_timer.is_stopped() and Input.is_action_just_pressed("attack"): attack_timer.start() animated_sprite.play(" punch") # TODO: Implement hitbox/endlag