Files
slopvivors/scenes/player.gd
2025-08-19 16:14:48 +02:00

97 lines
2.8 KiB
GDScript

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()