class_name Player extends CharacterBody2D @export var camera: Camera2D @export var main_ui: MainUI @onready var sprite_2d: Sprite2D = $Sprite2D var player_stats: PlayerStats = PlayerStats.new() var modifiers: Array[PlayerStatsModifier] = [] var dead: bool = false var death_anim_done: bool = false var god_mode: bool = false func _ready() -> void: camera.position = global_position main_ui.player_ui.set_hp(100) GlobalConst.sig_debug_god_mode.connect(toggle_god_mode) func _physics_process(delta: float) -> void: if dead: return var input_direction = Input.get_vector("left", "right", "up", "down") var move_speed = player_stats.get_final("move_speed", modifiers) velocity = input_direction * move_speed move_and_slide() func _process(delta: float) -> void: camera.position_smoothing_enabled = true camera.position = global_position if dead and !death_anim_done: death_animation(delta) func take_damage(value: float) -> void: if dead or god_mode: return player_stats.current_health -= value var dm = preload("res://scenes/damage_numbers.tscn").instantiate() dm.damage_taken = value dm.player_damage = false add_child(dm) main_ui.player_ui.set_hp((player_stats.current_health / player_stats.get_final("max_health", modifiers)) * 100) if player_stats.current_health <= 0: die() func die(): dead = true remove_from_group("damagable") get_tree().call_group("enemy", "cheer_anim") GlobalConst.sig_stop_spawning.emit(true) sprite_2d.z_index += 10 get_taunted() func death_animation(delta: float): # Engine.time_scale = clampf(lerpf(Engine.time_scale, 0.25, 0.5), 0.25, 0.9*delta) camera.zoom = lerp(camera.zoom, Vector2(8, 8), 0.99 * delta) rotation_degrees = lerpf(rotation_degrees, 90, 0.99 * delta) if rotation_degrees > 88: main_ui.pause_ui.toggle_pause_ui() death_anim_done = true func get_taunted(): var taunting_enemies: Array[Enemy] = [] for body in get_tree().get_nodes_in_group(GlobalConst.GROUP_ENEMY): if global_position.distance_to(body.global_position) < 500.0: taunting_enemies.append(body) for i in range(taunting_enemies.size()): var angle = (TAU / taunting_enemies.size()) * i var target_pos = Vector2(cos(angle), sin(angle)) * 50 print_debug("my_pos: %s" % position) print_debug("pos: %s" % target_pos) var new_target = StaticBody2D.new() var collision = CollisionShape2D.new() new_target.position = target_pos add_child(new_target) new_target.add_child(collision) taunting_enemies[i].target = new_target func toggle_god_mode(value: bool): god_mode = value func _on_pickup_area_area_entered(area: Area2D) -> void: var body: XPOrb = area.get_parent() if body.is_in_group(GlobalConst.GROUP_XP_ORB): player_stats.current_xp += body.value GlobalConst.sig_debug_stats_set.emit("player_xp", "%s" % player_stats.current_xp) body.queue_free()