diff --git a/entities/Bee.tscn b/entities/Bee.tscn index df85c63..0b97982 100644 --- a/entities/Bee.tscn +++ b/entities/Bee.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=13 format=3 uid="uid://deek6uv574xas"] +[gd_scene load_steps=14 format=3 uid="uid://deek6uv574xas"] [ext_resource type="Script" path="res://entities/scripts/bee.gd" id="1_pnu7x"] [ext_resource type="Script" path="res://entities/scripts/finite_state_machine.gd" id="1_t3s5d"] @@ -7,9 +7,7 @@ [ext_resource type="Script" path="res://entities/scripts/bee_hit_box.gd" id="5_agq38"] [ext_resource type="Script" path="res://entities/bee/states/bee_travelling.gd" id="5_qtx0r"] [ext_resource type="Script" path="res://entities/bee/states/bee_sleeping.gd" id="7_6qlbu"] - -[sub_resource type="Animation" id="Animation_t75ra"] -resource_name = "Idle" +[ext_resource type="Script" path="res://entities/bee/states/bee_returning.gd" id="8_dptvu"] [sub_resource type="Animation" id="Animation_iys4n"] resource_name = "Flying" @@ -29,6 +27,9 @@ tracks/0/keys = { "values": [Vector2(0, 0), Vector2(0, 10), Vector2(0, -10), Vector2(0, 10), Vector2(0, 0)] } +[sub_resource type="Animation" id="Animation_t75ra"] +resource_name = "Idle" + [sub_resource type="Animation" id="Animation_0encb"] length = 0.001 tracks/0/type = "value" @@ -93,7 +94,11 @@ script = ExtResource("5_4vs4l") [node name="Sleeping" type="Node" parent="StateMachine"] script = ExtResource("7_6qlbu") +[node name="Returning" type="Node" parent="StateMachine"] +script = ExtResource("8_dptvu") + [node name="Polygon2D" type="Polygon2D" parent="."] +scale = Vector2(0.152885, 0.15978) color = Color(1, 1, 0.0745098, 1) polygon = PackedVector2Array(-18, -11, -6, -21, 17, -19, 23, 1, 3, 12, -18, 7) @@ -101,5 +106,40 @@ polygon = PackedVector2Array(-18, -11, -6, -21, 17, -19, 23, 1, 3, 12, -18, 7) position = Vector2(0, 2.46663) gravity = Vector2(0, 0) +[node name="Polygon2D" type="Polygon2D" parent="Polygon2D"] +position = Vector2(-13.0817, -6.25862) +scale = Vector2(0.5, 0.5) +color = Color(0, 0, 0, 1) +offset = Vector2(-9.53674e-07, -9.53674e-07) +polygon = PackedVector2Array(32.7043, -12.5172, 39.2451, -18.7759, 45.786, -12.5172, 39.2451, -6.25862) + +[node name="Polygon2D5" type="Polygon2D" parent="Polygon2D"] +position = Vector2(-13.0817, 18.7759) +scale = Vector2(0.5, 0.5) +color = Color(0, 0, 0, 1) +offset = Vector2(-9.53674e-07, -9.53674e-07) +polygon = PackedVector2Array(32.7043, -12.5172, 39.2451, -18.7759, 45.786, -12.5172, 39.2451, -6.25862) + +[node name="Polygon2D4" type="Polygon2D" parent="Polygon2D"] +position = Vector2(-26.1634, 18.7759) +scale = Vector2(0.5, 0.5) +color = Color(0, 0, 0, 1) +offset = Vector2(-9.53674e-07, -9.53674e-07) +polygon = PackedVector2Array(32.7043, -12.5172, 39.2451, -18.7759, 45.786, -12.5172, 39.2451, -6.25862) + +[node name="Polygon2D3" type="Polygon2D" parent="Polygon2D"] +position = Vector2(-26.1634, -6.25862) +scale = Vector2(0.5, 0.5) +color = Color(0.30032, 0.200213, 0.0690995, 1) +offset = Vector2(-9.53674e-07, -9.53674e-07) +polygon = PackedVector2Array(32.7043, -12.5172, 39.2451, -18.7759, 78.4903, 12.5172, 65.4086, 25.0345) + +[node name="Polygon2D2" type="Polygon2D" parent="Polygon2D"] +position = Vector2(-6.54086, 0) +scale = Vector2(0.5, 0.5) +color = Color(0, 0, 0, 1) +offset = Vector2(-9.53674e-07, -9.53674e-07) +polygon = PackedVector2Array(32.7043, -12.5172, 39.2451, -18.7759, 45.786, -12.5172, 39.2451, -6.25862) + [connection signal="area_entered" from="HitBox" to="HitBox" method="_on_area_entered"] [connection signal="area_exited" from="HitBox" to="HitBox" method="_on_area_exited"] diff --git a/entities/bee/states/bee_idle.gd b/entities/bee/states/bee_idle.gd index 12ea54e..c1f4577 100644 --- a/entities/bee/states/bee_idle.gd +++ b/entities/bee/states/bee_idle.gd @@ -5,9 +5,6 @@ class_name BeeIdle var idle_time : float = 0.0 -func _ready(): - Log.pr(bee, bee.nectar) - func enter(_msg := {}): Log.pr("I sit by idl-bee") #animator.play("Idle") diff --git a/entities/bee/states/bee_returning.gd b/entities/bee/states/bee_returning.gd new file mode 100644 index 0000000..0d59fa2 --- /dev/null +++ b/entities/bee/states/bee_returning.gd @@ -0,0 +1,25 @@ +extends State +class_name BeeReturning + +@onready var bee = get_parent().get_parent() as Bee # I think this is bad but I dont care it works +@onready var target = get_tree().get_first_node_in_group("beehive") + +func enter(_msg := {}): + Log.pr("I return to the hive!") + + bee.animation_player.play("Flying") + + +func update(delta : float) -> void: + + if target: + if bee.position.distance_to(target.position) > 3: + + bee.velocity = (target.get_global_position() - bee.position).normalized() * bee.speed * delta + bee.move_and_collide(bee.velocity) + bee.look_at(target.position) + + else: + # Deposit the nectar and return it idle state + bee.deposit_nectar() + state_transition.emit(self, "Idle") diff --git a/entities/bee/states/bee_travelling.gd b/entities/bee/states/bee_travelling.gd index 2251d9d..b08f7c5 100644 --- a/entities/bee/states/bee_travelling.gd +++ b/entities/bee/states/bee_travelling.gd @@ -5,10 +5,11 @@ class_name BeeTravelling @onready var bee = get_parent().get_parent() as Bee # I think this is bad but I dont care it works -var t = 0 +var return_to_hive : bool = false func enter(_msg := {}): Log.pr("I am on the move!") + return_to_hive = false ## Get the next target location from the bee if bee.just_gathering: target = bee.get_current_director() # We want to go back the way we came @@ -16,12 +17,22 @@ func enter(_msg := {}): else: target = bee.get_next_target() + Log.pr(bee, target) + + # If we have no target, we are returning to the hive + if !target: + Log.pr("No more drones to visit, going to go back to the hive") + return_to_hive = true + bee.animation_player.play("Flying") - - pass + func update(delta : float) -> void: + if return_to_hive: + state_transition.emit(self, "Returning") + return + if target: if bee.position.distance_to(target.position) > 3: @@ -36,4 +47,3 @@ func update(delta : float) -> void: else: state_transition.emit(self, "Idle") - pass diff --git a/entities/scripts/bee.gd b/entities/scripts/bee.gd index d7d7f2e..7cd87fa 100644 --- a/entities/scripts/bee.gd +++ b/entities/scripts/bee.gd @@ -56,7 +56,13 @@ func get_next_target(): latest_target_director = previous_drone.visit_order return previous_drone - pass +func deposit_nectar(): + GameState.add_nectar() + nectar = 0 + latest_target_director = 0 + just_gathering = false + + diff --git a/project.godot b/project.godot index da053f7..784258a 100644 --- a/project.godot +++ b/project.godot @@ -15,6 +15,10 @@ run/main_scene="res://scenes/test_level.tscn" config/features=PackedStringArray("4.2", "Forward Plus") config/icon="res://icon.svg" +[autoload] + +GameState="*res://utility/game_state.gd" + [display] window/size/viewport_width=1280 diff --git a/resources/theme/game_theme.tres b/resources/theme/game_theme.tres new file mode 100644 index 0000000..25dd81e --- /dev/null +++ b/resources/theme/game_theme.tres @@ -0,0 +1,3 @@ +[gd_resource type="Theme" format=3 uid="uid://cpkvret5gi66h"] + +[resource] diff --git a/scenes/scripts/bee_spawner.gd b/scenes/scripts/bee_spawner.gd index 58bd0ee..051c242 100644 --- a/scenes/scripts/bee_spawner.gd +++ b/scenes/scripts/bee_spawner.gd @@ -6,8 +6,8 @@ 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 max_bees = 100 +var spawn_interval = 0.5 var spawn_timer = 0.0 func _ready(): @@ -17,7 +17,6 @@ func spawn_bee(): var bee_instance = bee.instantiate() add_child(bee_instance) bee_instance.position = beehive.global_position - # bee_instance.connect("bee_died", self, "bee_died") func _process(delta): spawn_timer += delta diff --git a/scenes/test_level.tscn b/scenes/test_level.tscn index 0d48409..37f85c5 100644 --- a/scenes/test_level.tscn +++ b/scenes/test_level.tscn @@ -1,10 +1,12 @@ -[gd_scene load_steps=7 format=3 uid="uid://mk5n0hrwk4yi"] +[gd_scene load_steps=9 format=3 uid="uid://mk5n0hrwk4yi"] [ext_resource type="Script" path="res://scenes/scripts/test_level.gd" id="1_lgt1m"] [ext_resource type="PackedScene" uid="uid://dyu4mucawjlu6" path="res://entities/Beehive.tscn" id="2_5ueyo"] [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="Theme" uid="uid://cpkvret5gi66h" path="res://resources/theme/game_theme.tres" id="6_1kbwe"] +[ext_resource type="PackedScene" uid="uid://b7eeptlk47ymd" path="res://ui/UiComponent.tscn" id="6_xuemm"] [sub_resource type="CircleShape2D" id="CircleShape2D_usqp5"] radius = 142.316 @@ -17,7 +19,8 @@ position = Vector2(52, -26) color = Color(0.329412, 0.494118, 0.392157, 1) polygon = PackedVector2Array(-141, -86, 1456, -97, 1337, 753, -193, 771) -[node name="Beehive" parent="." instance=ExtResource("2_5ueyo")] +[node name="Beehive" parent="." groups=["beehive"] instance=ExtResource("2_5ueyo")] +unique_name_in_owner = true position = Vector2(163, 489) [node name="Flower" type="Polygon2D" parent="."] @@ -54,8 +57,13 @@ polygon = PackedVector2Array(819, 301, 866, 278, 888, 364, 842, 319, 832, 373, 8 [node name="BeeSpawner" type="Node2D" parent="."] script = ExtResource("2_qqqq4") +[node name="UiComponent" parent="." instance=ExtResource("6_xuemm")] +offset_right = 1280.0 +offset_bottom = 720.0 + [node name="DroneManager" type="Node2D" parent="." groups=["dronemanager"]] unique_name_in_owner = true +z_index = 50 script = ExtResource("2_474nc") [node name="SpawnedDrones" type="Node2D" parent="DroneManager"] @@ -82,6 +90,11 @@ offset_top = -31.0 offset_right = 155.5 grow_horizontal = 2 grow_vertical = 0 +theme = ExtResource("6_1kbwe") +theme_override_constants/margin_left = 10 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_right = 10 +theme_override_constants/margin_bottom = 10 [node name="DroneControls" type="HBoxContainer" parent="DroneManager/Control/MarginContainer"] unique_name_in_owner = true diff --git a/ui/UiComponent.tscn b/ui/UiComponent.tscn new file mode 100644 index 0000000..327a7ba --- /dev/null +++ b/ui/UiComponent.tscn @@ -0,0 +1,28 @@ +[gd_scene load_steps=2 format=3 uid="uid://b7eeptlk47ymd"] + +[ext_resource type="Script" path="res://ui/scripts/ui_component.gd" id="1_6lnte"] + +[node name="UiComponent" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_6lnte") + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 10 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_right = 10 +theme_override_constants/margin_bottom = 10 + +[node name="NectarBar" type="ProgressBar" parent="MarginContainer"] +unique_name_in_owner = true +layout_mode = 2 diff --git a/ui/scripts/ui_component.gd b/ui/scripts/ui_component.gd new file mode 100644 index 0000000..9b0abd1 --- /dev/null +++ b/ui/scripts/ui_component.gd @@ -0,0 +1,23 @@ +extends Control +class_name UIComponent + +var update_interval : float = 1 +var last_update : float = 0 + +@onready var nectar_bar = get_node("%NectarBar") + +func _ready(): + Log.pr("UIComponent ready") + update_ui() + +func _process(delta): + last_update += delta + + if last_update > update_interval: + last_update = 0 + update_ui() + +func update_ui(): + Log.pr("UIComponent update_ui") + + nectar_bar.value = GameState.gathered_nectar diff --git a/utility/game_state.gd b/utility/game_state.gd new file mode 100644 index 0000000..343419f --- /dev/null +++ b/utility/game_state.gd @@ -0,0 +1,10 @@ +class_name GameStateManager extends Node + +var gathered_nectar : int = 0 + +func _ready(): + Log.pr("GameStateManager ready") + +func add_nectar(): + gathered_nectar += 1 + Log.pr("Nectar gathered", gathered_nectar) \ No newline at end of file