Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- extends CharacterBody2D
- class_name Player
- signal healthChanged
- signal DirectionChanged(new_direction: Vector2)
- const DIR_8 = [
- Vector2.RIGHT,
- Vector2.DOWN + Vector2.RIGHT, Vector2.DOWN, Vector2.DOWN + Vector2.LEFT,
- Vector2.LEFT,
- Vector2.UP + Vector2.LEFT,
- Vector2.UP,
- Vector2.UP + Vector2.RIGHT,
- ]
- @export var current_item: ItemData:
- set(value):
- current_item = value
- change_weapon()
- @onready var weapon_sprite: Sprite2D = $weapon/WeaponSprite
- @onready var animation_player = $AnimationPlayer
- @onready var attack_animation_player = $AttackAnimationPlayer
- @onready var sprite: Sprite2D = $Sprite2D
- @onready var effects = $Effects
- @onready var hurtBox = $hurtBox
- @onready var hurtTimer = $hurtTimer
- @onready var weapon: Node2D = $weapon
- @onready var shape = $CollisionShape2D
- @onready var damage_interval_timer = $DamageIntervalTimer
- @onready var health_component = $HealthComponent
- @onready var health_bar = $HealthBar
- @onready var damage_bar: ProgressBar = $DamageBar
- @onready var abilities = $Abilities
- @onready var combo_timer = $weapon/combo_timer
- @onready var state_machine: PlayerStateMachine = $StateMachine
- var cardinal_direction: Vector2 = Vector2.DOWN
- var direction: Vector2 = Vector2.ZERO
- var isAttacking = false
- var combo_step = 0
- var number_colliding_bodies = 0
- var isHurt: bool = false
- var isDashing = false
- func _ready():
- state_machine.Initialize(self)
- effects.play("RESET")
- hurtBox.body_entered.connect(on_body_entered)
- hurtBox.body_exited.connect(on_body_exited)
- damage_interval_timer.timeout.connect(on_damage_interval_timer_timeout)
- health_component.health_changed.connect(on_health_changed)
- health_component.died.connect(on_died)
- combo_timer.connect("timeout", Callable(self, "_on_combo_timer_timeout"))
- GameEvents.ability_upgrade_added.connect(on_ability_upgrade_added)
- update_health_display()
- func _process(delta):
- direction = Vector2(
- Input.get_axis("ui_left", "ui_right"),
- Input.get_axis("ui_up", "ui_down")
- ).normalized()
- func _physics_process(delta):
- move_and_slide()
- func SetDirection() -> bool:
- if direction == Vector2.ZERO:
- return false
- var direction_id: int = int(round((direction + cardinal_direction * 0.1).angle() / TAU * DIR_8.size()))
- var new_dir = DIR_8[direction_id]
- if new_dir == cardinal_direction:
- return false
- cardinal_direction = new_dir
- DirectionChanged.emit(new_dir)
- return true
- func UpdateAnimation(state: String) -> void:
- animation_player.play(state + "_" + AnimDirection())
- func UpdateAttackAnimation(state: String):
- attack_animation_player.play(state + "_" + AnimDirection())
- func AnimDirection() -> String:
- if cardinal_direction == Vector2.DOWN:
- return "down"
- elif cardinal_direction == Vector2.UP:
- return "up"
- elif cardinal_direction == Vector2.LEFT:
- return "left"
- elif cardinal_direction == Vector2.RIGHT:
- return "right"
- elif cardinal_direction == Vector2.DOWN + Vector2.RIGHT:
- return "down_right"
- elif cardinal_direction == Vector2.UP + Vector2.RIGHT:
- return "up_right"
- elif cardinal_direction == Vector2.UP + Vector2.LEFT:
- return "up_left"
- else:
- return "down_left"
- func check_deal_damage():
- if number_colliding_bodies == 0 || !damage_interval_timer.is_stopped():
- return
- health_component.damage(1)
- damage_interval_timer.start()
- effects.play("hurtBlink")
- await damage_interval_timer.timeout
- effects.play("RESET")
- func update_health_display():
- var current_health = health_bar.value
- damage_bar.value = health_bar.value
- health_bar.value = health_component.get_health_percent()
- var new_health_percent = health_component.get_health_percent()
- health_bar.visible = true
- damage_bar.visible = true
- var tween_health = get_tree().create_tween()
- tween_health.tween_property(health_bar, "value", new_health_percent, 0.2)
- tween_health.set_ease(Tween.EASE_IN_OUT)
- tween_health.set_trans(Tween.TRANS_QUAD)
- await tween_health.finished
- damage_bar.value = health_bar.value
- var tween_damage = get_tree().create_tween()
- tween_damage.tween_property(damage_bar, "value", new_health_percent, 0.5)
- tween_damage.set_ease(Tween.EASE_IN_OUT)
- tween_damage.set_trans(Tween.TRANS_QUAD)
- func on_body_entered(other_body: Node2D):
- number_colliding_bodies += 1
- check_deal_damage()
- func on_body_exited(other_body: Node2D):
- number_colliding_bodies -=1
- func on_damage_interval_timer_timeout():
- check_deal_damage()
- func on_health_changed():
- update_health_display()
- func on_died():
- $AnimationPlayer.play("death")
- func on_ability_upgrade_added(ability_upgrade: AbilityUpgrade, current_upgrades: Dictionary):
- if not ability_upgrade is Ability:
- return
- var ability = ability_upgrade as Ability
- abilities.add_child(ability.ability_controller_scene.instantiate())
- func change_weapon():
- if current_item != null and weapon_sprite != null:
- weapon_sprite.texture = current_item.texture
- weapon.update_damage()
Add Comment
Please, Sign In to add comment