gae_wild_jam/scripts/drop_manager.gd

60 lines
1.7 KiB
GDScript

extends Node2D
@onready var player = get_node("/root/Game/Player")
@onready var bar = get_node("/root/Game/CanvasLayer/ProgressBar")
signal leveled_up
@export var fruit_drop_threshold: int = 7
@export var fruit_drop_ceiling: int = 15
var level_up_disabled: bool = false # FOR DEBUG MENU
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
assert(fruit_drop_threshold <= fruit_drop_ceiling)
bar.max_value = player.max_xp
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass
func on_enemy_died(enemy):
call_deferred("drop_item", enemy)
var enemy_xp = enemy.xp
player.current_xp += enemy.xp
bar.value = player.current_xp
if player.current_xp >= player.max_xp:
leveled_up.emit()
player.max_xp = player.max_xp * 1.3
bar.max_value = player.max_xp
player.current_xp = 0
bar.value = 0
player.level += 1
func drop_item(enemy):
if not is_instance_valid(enemy):
return
var fruit_count = get_children().filter(func(c): return c is DropsBase).size()
for entry in enemy.drop_table:
var effective_chance = entry.chance
if fruit_count >= fruit_drop_ceiling:
continue
elif fruit_count > fruit_drop_threshold:
var chance_scale = 1.0 - float(fruit_count - fruit_drop_threshold) / float(fruit_drop_ceiling - fruit_drop_threshold)
effective_chance *= chance_scale
if randf() < effective_chance:
var drop = entry.drop.instantiate()
drop.global_position = enemy.global_position
add_child(drop)
# FOR DEBUG MENU
func force_level_up() -> void:
leveled_up.emit()
player.max_xp = player.max_xp * 1.3
bar.max_value = player.max_xp
player.current_xp = 0
bar.value = 0
player.level += 1