added fruit queue up to three fruits while brewing is busy

main
Artur 2026-06-02 17:25:08 +02:00
parent 7d17c1312e
commit ec27fa03e4
4 changed files with 52 additions and 4 deletions

View File

@ -4,6 +4,7 @@ class_name DropsBase
var witch var witch
var player var player
var is_spawning = true var is_spawning = true
var in_orbit: bool = false
signal collected signal collected
var _collect_sfx = preload("res://assets/music&sfx/sfx/lesiakower-coin-collect-retro-8-bit-sound-effect-145251.mp3") 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 is_spawning = false
func _on_body_entered(body: Node2D) -> void: func _on_body_entered(body: Node2D) -> void:
if body == player and not is_spawning: 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() collect()
pass
func collect(): func collect():
_sfx_player.pitch_scale = randf_range(0.85, 1.15) _sfx_player.pitch_scale = randf_range(0.85, 1.15)

View File

@ -13,6 +13,7 @@ var progres_index = 0
var is_brewing var is_brewing
var brew_explosion = true var brew_explosion = true
@onready var witch = get_parent() @onready var witch = get_parent()
@onready var player = get_node("/root/Game/Player")
var explosion_scene = preload("res://scenes/explosion.tscn") 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_sfx = preload("res://assets/music&sfx/sfx/data_pion-sfx9-fwoosh-324525.mp3")
var _ignite_player: AudioStreamPlayer var _ignite_player: AudioStreamPlayer
@ -122,6 +123,7 @@ func brew(fruits):
SpellLibrary.LASER: witch.shoot_laser() SpellLibrary.LASER: witch.shoot_laser()
reset_texture() reset_texture()
is_brewing = false is_brewing = false
player.flush_queue()
func get_unique_fruits() -> Array: func get_unique_fruits() -> Array:
var unique = [] var unique = []

View File

@ -3,6 +3,13 @@ extends CanvasLayer
@onready var _spawn_control = get_node("/root/Game/SpawnControl") @onready var _spawn_control = get_node("/root/Game/SpawnControl")
@onready var _witch = get_node("/root/Game/Witch") @onready var _witch = get_node("/root/Game/Witch")
@onready var _drop_manager = get_node("/root/Game/DropManager") @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 _spell_dispatch: Dictionary
var _lvl_disable_btn: Button var _lvl_disable_btn: Button
@ -73,6 +80,10 @@ func _build_ui() -> void:
btn.pressed.connect(_skip_time.bind(float(secs))) btn.pressed.connect(_skip_time.bind(float(secs)))
hbox_time.add_child(btn) 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") _add_section(vbox, "SPELLS")
for spell_id in SpellLibrary.recipes.keys(): for spell_id in SpellLibrary.recipes.keys():
if _spell_dispatch.has(spell_id): if _spell_dispatch.has(spell_id):
@ -100,6 +111,11 @@ func _add_button(parent: VBoxContainer, label: String, callback: Callable) -> vo
btn.pressed.connect(callback) btn.pressed.connect(callback)
parent.add_child(btn) 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: func _kill_all_enemies() -> void:
for enemy in get_tree().get_nodes_in_group("enemies"): for enemy in get_tree().get_nodes_in_group("enemies"):
if is_instance_valid(enemy): if is_instance_valid(enemy):

View File

@ -6,11 +6,22 @@ var level = 1
var speed = 60 var speed = 60
var strength = 3 var strength = 3
var attacks = false 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): func _physics_process(delta):
var direction = Input.get_vector("move_left", "move_right", "move_up", "move_down") var direction = Input.get_vector("move_left", "move_right", "move_up", "move_down")
velocity = direction * speed velocity = direction * speed
move_and_slide() 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: if attacks == true:
return return
if direction == Vector2.ZERO: 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: func _on_melee_area_body_entered(body: Node2D) -> void:
if body.is_in_group("enemies"): if body.is_in_group("enemies"):
if $AttackSpeed.is_stopped(): if $AttackSpeed.is_stopped():