From ec27fa03e4bc96cb79cfdd603b2170e749199ff1 Mon Sep 17 00:00:00 2001 From: Artur <2123806@stud.th-mannheim.de> Date: Tue, 2 Jun 2026 17:25:08 +0200 Subject: [PATCH] added fruit queue up to three fruits while brewing is busy --- scripts/DropsBase.gd | 12 +++++++++--- scripts/cauldron_bar.gd | 4 +++- scripts/debug_menu.gd | 16 ++++++++++++++++ scripts/player.gd | 24 ++++++++++++++++++++++++ 4 files changed, 52 insertions(+), 4 deletions(-) diff --git a/scripts/DropsBase.gd b/scripts/DropsBase.gd index 855c6ba..9c6a9aa 100644 --- a/scripts/DropsBase.gd +++ b/scripts/DropsBase.gd @@ -4,6 +4,7 @@ class_name DropsBase var witch var player var is_spawning = true +var in_orbit: bool = false signal collected var _collect_sfx = preload("res://assets/music&sfx/sfx/lesiakower-coin-collect-retro-8-bit-sound-effect-145251.mp3") @@ -44,9 +45,14 @@ func _animate_spawn() -> void: is_spawning = false func _on_body_entered(body: Node2D) -> void: - if body == player and not is_spawning: - collect() - pass + if body == player and not is_spawning and not in_orbit: + var cauldron = witch.get_node("CauldronBar") + if cauldron.is_brewing and player.fruit_queue.size() < 3: + _sfx_player.pitch_scale = randf_range(0.85, 1.15) + _sfx_player.play() + player.add_to_queue(self) + else: + collect() func collect(): _sfx_player.pitch_scale = randf_range(0.85, 1.15) diff --git a/scripts/cauldron_bar.gd b/scripts/cauldron_bar.gd index 1817727..6553097 100644 --- a/scripts/cauldron_bar.gd +++ b/scripts/cauldron_bar.gd @@ -13,6 +13,7 @@ var progres_index = 0 var is_brewing var brew_explosion = true @onready var witch = get_parent() +@onready var player = get_node("/root/Game/Player") var explosion_scene = preload("res://scenes/explosion.tscn") var _ignite_sfx = preload("res://assets/music&sfx/sfx/data_pion-sfx9-fwoosh-324525.mp3") var _ignite_player: AudioStreamPlayer @@ -122,7 +123,8 @@ func brew(fruits): SpellLibrary.LASER: witch.shoot_laser() reset_texture() is_brewing = false - + player.flush_queue() + func get_unique_fruits() -> Array: var unique = [] for fruit in slot_states: diff --git a/scripts/debug_menu.gd b/scripts/debug_menu.gd index 6d44c4a..3cefc53 100644 --- a/scripts/debug_menu.gd +++ b/scripts/debug_menu.gd @@ -3,6 +3,13 @@ extends CanvasLayer @onready var _spawn_control = get_node("/root/Game/SpawnControl") @onready var _witch = get_node("/root/Game/Witch") @onready var _drop_manager = get_node("/root/Game/DropManager") +@onready var _player = get_node("/root/Game/Player") + +var _fruit_scenes: Dictionary = { + "Apple": preload("res://scenes/apple.tscn"), + "Grape": preload("res://scenes/grape.tscn"), + "Chili": preload("res://scenes/chili.tscn"), +} var _spell_dispatch: Dictionary var _lvl_disable_btn: Button @@ -73,6 +80,10 @@ func _build_ui() -> void: btn.pressed.connect(_skip_time.bind(float(secs))) hbox_time.add_child(btn) + _add_section(vbox, "FRUITS") + for fruit_name in _fruit_scenes.keys(): + _add_button(vbox, fruit_name, _spawn_fruit.bind(fruit_name)) + _add_section(vbox, "SPELLS") for spell_id in SpellLibrary.recipes.keys(): if _spell_dispatch.has(spell_id): @@ -100,6 +111,11 @@ func _add_button(parent: VBoxContainer, label: String, callback: Callable) -> vo btn.pressed.connect(callback) parent.add_child(btn) +func _spawn_fruit(fruit_name: String) -> void: + var fruit = _fruit_scenes[fruit_name].instantiate() + fruit.global_position = _player.global_position + Vector2(randf_range(-30, 30), randf_range(-30, 30)) + get_node("/root/Game").add_child(fruit) + func _kill_all_enemies() -> void: for enemy in get_tree().get_nodes_in_group("enemies"): if is_instance_valid(enemy): diff --git a/scripts/player.gd b/scripts/player.gd index d621ab6..2d3697d 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -6,11 +6,22 @@ var level = 1 var speed = 60 var strength = 3 var attacks = false +var fruit_queue: Array = [] +var orbit_angle: float = 0.0 +const ORBIT_RADIUS := 20.0 +const ORBIT_SPEED := 2.5 func _physics_process(delta): var direction = Input.get_vector("move_left", "move_right", "move_up", "move_down") velocity = direction * speed move_and_slide() + orbit_angle += ORBIT_SPEED * delta + for i in fruit_queue.size(): + var fruit = fruit_queue[i] + if is_instance_valid(fruit): + var angle = orbit_angle + (TAU / fruit_queue.size()) * i + var target_pos = global_position + Vector2.from_angle(angle) * ORBIT_RADIUS + fruit.global_position = fruit.global_position.lerp(target_pos, 1.0 - exp(-12.0 * delta)) if attacks == true: return if direction == Vector2.ZERO: @@ -76,6 +87,19 @@ func _on_attack_speed_timeout() -> void: +func add_to_queue(fruit) -> void: + fruit.in_orbit = true + fruit_queue.append(fruit) + +func flush_queue() -> void: + var to_flush = fruit_queue.duplicate() + fruit_queue.clear() + for fruit in to_flush: + if is_instance_valid(fruit): + fruit.in_orbit = false + fruit.collect() + await get_tree().create_timer(0.15).timeout + func _on_melee_area_body_entered(body: Node2D) -> void: if body.is_in_group("enemies"): if $AttackSpeed.is_stopped():