Bee State Machine

This commit is contained in:
Dan 2024-05-03 15:43:05 +01:00
parent 20bcab01b1
commit 752131c955
16 changed files with 467 additions and 13 deletions

View file

@ -0,0 +1,29 @@
extends Node2D
class_name BeeSpawner
var bee = preload("res://entities/Bee.tscn")
@onready var beehive = get_node("../Beehive")
var bee_count = 0
var max_bees = 10
var spawn_interval = 3
var spawn_timer = 0.0
func _ready():
Log.pr("Bee Spawner ready")
func spawn_bee():
var bee_instance = bee.instantiate()
add_child(bee_instance)
bee_instance.position = beehive.position
# bee_instance.connect("bee_died", self, "bee_died")
func _process(delta):
spawn_timer += delta
if spawn_timer > spawn_interval and bee_count < max_bees:
spawn_bee()
spawn_timer = 0.0
bee_count += 1
Log.pr("Bee count: " + str(bee_count))

View file

@ -1,8 +1,11 @@
extends Node2D
class_name DroneManager
var spawning_drone : bool = false
var spawning_type : String = ""
var director_drones : Array = [] # List of all director drones in the world
@onready var drone_controls = %DroneControls
@onready var spawned_drones_container = get_node("SpawnedDrones")
@onready var cursor = preload("res://resources/cursors/launch_drone.png")
@ -33,6 +36,7 @@ func spawn_drone(drone_type : String) -> void:
# Create a new instance of the drone
if drone_type == "director":
new_drone = director_drone.instantiate()
# new_drone.visit_order = spawned_drones_container.get_child_count()
elif drone_type == "dancer":
new_drone = dancer_drone.instantiate()
elif drone_type == "distractor":
@ -45,6 +49,12 @@ func spawn_drone(drone_type : String) -> void:
spawned_drones_container.add_child(new_drone)
new_drone.position = get_viewport().get_mouse_position()
if drone_type == "director":
# Set this drones visit order to the next in line
new_drone.visit_order = director_drones.size() + 1
# Update the director drone list
update_director_drone_list()
func place_drone(drone_type : String) -> void:
if !spawning_drone:
Input.set_custom_mouse_cursor(cursor, Input.CURSOR_ARROW, Vector2(32, 32))
@ -53,8 +63,6 @@ func place_drone(drone_type : String) -> void:
spawning_drone = true
spawning_type = drone_type
func cancel_spawning() -> void:
Input.set_custom_mouse_cursor(null)
drone_controls.reset_button_focus()
@ -73,3 +81,31 @@ func _on_spawn_distractor_pressed() -> void:
func _on_spawn_dancer_pressed() -> void:
place_drone("dancer")
func update_director_drone_list():
director_drones.clear()
for drone in spawned_drones_container.get_children():
if drone is DirectorDrone:
director_drones.append(drone)
Log.pr(director_drones.size())
func get_next_director(current_director_number : int) -> DirectorDrone:
for drone in director_drones:
if drone.visit_order == current_director_number + 1:
return drone
return null
func get_previous_director(current_director_number : int) -> DirectorDrone:
for drone in director_drones:
if drone.visit_order == current_director_number - 1:
return drone
return null
## For now this just returns the first collector drone it finds
## This will need to be updated to return the closest collector drone potentially?
func get_collector():
for drone in spawned_drones_container.get_children():
if drone is CollectorDrone:
return drone
return null

View file

@ -1,8 +1,13 @@
[gd_scene load_steps=4 format=3 uid="uid://mk5n0hrwk4yi"]
[gd_scene load_steps=7 format=3 uid="uid://mk5n0hrwk4yi"]
[ext_resource type="Script" path="res://scenes/scripts/test_level.gd" id="1_lgt1m"]
[ext_resource type="Script" path="res://scenes/scripts/drone_manager.gd" id="2_474nc"]
[ext_resource type="Script" path="res://scenes/scripts/bee_spawner.gd" id="2_qqqq4"]
[ext_resource type="Script" path="res://scenes/scripts/drone_controls.gd" id="3_rqkyv"]
[ext_resource type="PackedScene" uid="uid://deek6uv574xas" path="res://entities/Bee.tscn" id="4_336fp"]
[sub_resource type="CircleShape2D" id="CircleShape2D_usqp5"]
radius = 142.316
[node name="TestLevel" type="Node2D"]
script = ExtResource("1_lgt1m")
@ -18,11 +23,25 @@ color = Color(0.588235, 0.423529, 0.423529, 1)
polygon = PackedVector2Array(95, 146, 203, 134, 186, 274, 78, 287)
[node name="Flower" type="Polygon2D" parent="."]
position = Vector2(648, 225)
scale = Vector2(0.435897, 0.276596)
position = Vector2(278, -97)
color = Color(0.301961, 0.607843, 0.901961, 1)
polygon = PackedVector2Array(752, 145, 875, 200, 893, 272, 866, 359, 781, 427, 715, 362, 659, 226)
[node name="Area2D" type="Area2D" parent="Flower" groups=["flowers"]]
position = Vector2(777.707, 282)
collision_layer = 7
collision_mask = 7
[node name="CollisionShape2D" type="CollisionShape2D" parent="Flower/Area2D"]
shape = SubResource("CircleShape2D_usqp5")
[node name="Label" type="Label" parent="Flower"]
offset_left = 721.0
offset_top = 243.0
offset_right = 852.0
offset_bottom = 266.0
text = "Flower patch bro"
[node name="Pesticide" type="Polygon2D" parent="."]
position = Vector2(74.7948, -103.963)
scale = Vector2(0.851611, 0.815599)
@ -34,7 +53,11 @@ position = Vector2(-354, 53)
color = Color(0.803922, 0.407843, 0.239216, 1)
polygon = PackedVector2Array(819, 301, 866, 278, 888, 364, 842, 319, 832, 373, 806, 423, 775, 424, 754, 377, 762, 319, 728, 360, 739, 263, 765, 284)
[node name="DroneManager" type="Node2D" parent="."]
[node name="BeeSpawner" type="Node2D" parent="."]
script = ExtResource("2_qqqq4")
[node name="DroneManager" type="Node2D" parent="." groups=["dronemanager"]]
unique_name_in_owner = true
script = ExtResource("2_474nc")
[node name="SpawnedDrones" type="Node2D" parent="DroneManager"]
@ -89,6 +112,9 @@ layout_mode = 2
tooltip_text = "Spawn a dancing drone that will encourage bees to leave the hive. Best to put this near to the hive. "
text = "Dancer"
[node name="Bee" parent="." instance=ExtResource("4_336fp")]
position = Vector2(704, 196)
[connection signal="pressed" from="DroneManager/Control/MarginContainer/DroneControls/SpawnDirector" to="DroneManager" method="_on_spawn_director_pressed"]
[connection signal="pressed" from="DroneManager/Control/MarginContainer/DroneControls/SpawnCollector" to="DroneManager" method="_on_spawn_collector_pressed"]
[connection signal="pressed" from="DroneManager/Control/MarginContainer/DroneControls/SpawnDistractor" to="DroneManager" method="_on_spawn_distractor_pressed"]