Add RulesComponent, GameRulesResource, and BeeDeath state. Update Bee entity with death animation. Include new textures for particles. Add Highlight animation to Beehive.

This commit is contained in:
Dan 2024-05-09 15:08:57 +01:00
parent 1da411cacd
commit d879ca30bd
222 changed files with 3980 additions and 149 deletions

View file

@ -45,27 +45,35 @@ size_flags_vertical = 10
alignment = 1
script = ExtResource("3_idi5h")
[node name="SpawnDirector" type="Button" parent="Control/MarginContainer/DroneControls"]
layout_mode = 2
tooltip_text = "Place a director drone, these are the main drones that define the path bees should follow. The order bees should visit these drones can be defined by clicking on them."
text = "Director"
[node name="SpawnCollector" type="Button" parent="Control/MarginContainer/DroneControls"]
layout_mode = 2
tooltip_text = "Place a drone that encourages bees to collect pollen near this area."
text = "Collector"
[node name="SpawnDistractor" type="Button" parent="Control/MarginContainer/DroneControls"]
layout_mode = 2
tooltip_text = "Place a distracting drone that will (hopefully) divert threats attention so they ignore the bees."
text = "Distractor"
[node name="SpawnDancer" type="Button" parent="Control/MarginContainer/DroneControls"]
unique_name_in_owner = true
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"
[connection signal="pressed" from="Control/MarginContainer/DroneControls/SpawnDirector" to="." method="_on_spawn_director_pressed"]
[connection signal="pressed" from="Control/MarginContainer/DroneControls/SpawnCollector" to="." method="_on_spawn_collector_pressed"]
[connection signal="pressed" from="Control/MarginContainer/DroneControls/SpawnDistractor" to="." method="_on_spawn_distractor_pressed"]
[node name="SpawnCollector" type="Button" parent="Control/MarginContainer/DroneControls"]
unique_name_in_owner = true
layout_mode = 2
text = "Collector"
[node name="SpawnDirector" type="Button" parent="Control/MarginContainer/DroneControls"]
unique_name_in_owner = true
layout_mode = 2
text = "Director"
[node name="SpawnDistractor" type="Button" parent="Control/MarginContainer/DroneControls"]
unique_name_in_owner = true
layout_mode = 2
text = "Distractor"
[connection signal="mouse_entered" from="Control/MarginContainer/DroneControls/SpawnDancer" to="." method="_on_spawn_dancer_mouse_entered"]
[connection signal="mouse_exited" from="Control/MarginContainer/DroneControls/SpawnDancer" to="." method="_on_button_mouse_exited"]
[connection signal="pressed" from="Control/MarginContainer/DroneControls/SpawnDancer" to="." method="_on_spawn_dancer_pressed"]
[connection signal="mouse_entered" from="Control/MarginContainer/DroneControls/SpawnCollector" to="." method="_on_spawn_collector_mouse_entered"]
[connection signal="mouse_exited" from="Control/MarginContainer/DroneControls/SpawnCollector" to="." method="_on_button_mouse_exited"]
[connection signal="pressed" from="Control/MarginContainer/DroneControls/SpawnCollector" to="." method="_on_spawn_collector_pressed"]
[connection signal="mouse_entered" from="Control/MarginContainer/DroneControls/SpawnDirector" to="." method="_on_spawn_director_mouse_entered"]
[connection signal="mouse_exited" from="Control/MarginContainer/DroneControls/SpawnDirector" to="." method="_on_button_mouse_exited"]
[connection signal="pressed" from="Control/MarginContainer/DroneControls/SpawnDirector" to="." method="_on_spawn_director_pressed"]
[connection signal="mouse_entered" from="Control/MarginContainer/DroneControls/SpawnDistractor" to="." method="_on_spawn_distractor_mouse_entered"]
[connection signal="mouse_exited" from="Control/MarginContainer/DroneControls/SpawnDistractor" to="." method="_on_button_mouse_exited"]
[connection signal="pressed" from="Control/MarginContainer/DroneControls/SpawnDistractor" to="." method="_on_spawn_distractor_pressed"]

View file

@ -1,213 +0,0 @@
[gd_scene load_steps=16 format=3 uid="uid://dalh10tit6qg"]
[ext_resource type="PackedScene" uid="uid://d1uawawum16b0" path="res://scenes/elements/background.tscn" id="1_qvqyj"]
[ext_resource type="PackedScene" uid="uid://dyu4mucawjlu6" path="res://entities/Beehive.tscn" id="2_3g2rt"]
[ext_resource type="PackedScene" uid="uid://dwuc6byusf1r3" path="res://scenes/decor/bush.tscn" id="2_k5umc"]
[ext_resource type="PackedScene" uid="uid://d3mas42mbgec1" path="res://scenes/decor/tree.tscn" id="3_n0i7v"]
[ext_resource type="PackedScene" uid="uid://ddf2mkkw1trkj" path="res://scenes/elements/bee_spawner.tscn" id="3_yxsy7"]
[ext_resource type="PackedScene" uid="uid://b7eeptlk47ymd" path="res://ui/UiComponent.tscn" id="4_ms7q4"]
[ext_resource type="PackedScene" uid="uid://dj51rgpihnhi" path="res://scenes/decor/naked_tree.tscn" id="4_tb08n"]
[ext_resource type="PackedScene" uid="uid://eiyribk1ijcu" path="res://scenes/decor/mushroom.tscn" id="5_751s5"]
[ext_resource type="PackedScene" uid="uid://ct3c16xm33r2a" path="res://scenes/elements/drone_manager.tscn" id="5_fxm58"]
[ext_resource type="PackedScene" uid="uid://cwutwy11pityw" path="res://ui/LevelCompleteComponent.tscn" id="6_6j5sw"]
[ext_resource type="PackedScene" uid="uid://rnykx61eqxyk" path="res://scenes/decor/flower_1.tscn" id="11_o3nm3"]
[ext_resource type="PackedScene" uid="uid://b7quc1hxenh5p" path="res://scenes/decor/flower_2.tscn" id="12_cill4"]
[ext_resource type="AudioStream" uid="uid://bgcbd6xf0lyrr" path="res://resources/music/bee_background.ogg" id="13_n8ob3"]
[ext_resource type="AudioStream" uid="uid://dvsjpsh5dyixq" path="res://resources/SFX/mixkit-european-spring-forest-ambience-1219.wav" id="14_v1rue"]
[sub_resource type="CircleShape2D" id="CircleShape2D_1tovu"]
radius = 142.316
[node name="Level1" type="Node2D"]
[node name="Grass" parent="." instance=ExtResource("1_qvqyj")]
[node name="LevelDecor" type="Node" parent="."]
[node name="BushGroup" type="Node2D" parent="LevelDecor"]
[node name="Bush" parent="LevelDecor/BushGroup" instance=ExtResource("2_k5umc")]
position = Vector2(1110, 28)
scale = Vector2(0.25, 0.25)
[node name="Bush3" parent="LevelDecor/BushGroup" instance=ExtResource("2_k5umc")]
position = Vector2(1272, 123)
scale = Vector2(0.25, 0.25)
[node name="Bush2" parent="LevelDecor/BushGroup" instance=ExtResource("2_k5umc")]
position = Vector2(1214, 47)
rotation = 0.60912
scale = Vector2(0.4, 0.4)
[node name="BushGroup3" type="Node2D" parent="LevelDecor"]
position = Vector2(-928, 592)
scale = Vector2(0.75, 0.75)
[node name="Bush" parent="LevelDecor/BushGroup3" instance=ExtResource("2_k5umc")]
position = Vector2(1110, 28)
scale = Vector2(0.25, 0.25)
[node name="Bush3" parent="LevelDecor/BushGroup3" instance=ExtResource("2_k5umc")]
position = Vector2(1272, 123)
scale = Vector2(0.25, 0.25)
[node name="Bush2" parent="LevelDecor/BushGroup3" instance=ExtResource("2_k5umc")]
position = Vector2(1214, 47)
rotation = 0.60912
scale = Vector2(0.4, 0.4)
[node name="BushGroup2" type="Node2D" parent="LevelDecor"]
position = Vector2(456, 1669)
rotation = 5.29882
[node name="Bush" parent="LevelDecor/BushGroup2" instance=ExtResource("2_k5umc")]
position = Vector2(1110, 28)
scale = Vector2(0.25, 0.25)
[node name="Bush3" parent="LevelDecor/BushGroup2" instance=ExtResource("2_k5umc")]
position = Vector2(1272, 123)
scale = Vector2(0.25, 0.25)
[node name="Bush2" parent="LevelDecor/BushGroup2" instance=ExtResource("2_k5umc")]
position = Vector2(1214, 47)
rotation = 0.60912
scale = Vector2(0.4, 0.4)
[node name="NakedTree" parent="LevelDecor" instance=ExtResource("4_tb08n")]
position = Vector2(53, 336)
scale = Vector2(0.6, 0.6)
[node name="Tree" parent="LevelDecor" instance=ExtResource("3_n0i7v")]
position = Vector2(119, 100)
scale = Vector2(0.6, 0.6)
[node name="Tree2" parent="LevelDecor" instance=ExtResource("3_n0i7v")]
position = Vector2(64, 473)
rotation = -0.42237
scale = Vector2(0.4, 0.4)
[node name="Mushrooms" type="Node2D" parent="LevelDecor"]
[node name="Mushroom" parent="LevelDecor/Mushrooms" instance=ExtResource("5_751s5")]
position = Vector2(232, 250)
scale = Vector2(0.5, 0.5)
[node name="Mushroom2" parent="LevelDecor/Mushrooms" instance=ExtResource("5_751s5")]
position = Vector2(252, 289)
rotation = 1.13446
scale = Vector2(0.3, 0.3)
[node name="Mushroom3" parent="LevelDecor/Mushrooms" instance=ExtResource("5_751s5")]
position = Vector2(260, 225)
rotation = 1.13446
scale = Vector2(0.3, 0.3)
[node name="Mushrooms2" type="Node2D" parent="LevelDecor"]
position = Vector2(1553, 732)
rotation = 2.81347
[node name="Mushroom" parent="LevelDecor/Mushrooms2" instance=ExtResource("5_751s5")]
position = Vector2(232, 250)
scale = Vector2(0.5, 0.5)
[node name="Mushroom2" parent="LevelDecor/Mushrooms2" instance=ExtResource("5_751s5")]
position = Vector2(252, 289)
rotation = 1.13446
scale = Vector2(0.3, 0.3)
[node name="Mushroom3" parent="LevelDecor/Mushrooms2" instance=ExtResource("5_751s5")]
position = Vector2(260, 225)
rotation = 1.13446
scale = Vector2(0.3, 0.3)
[node name="Flowers" type="Node2D" parent="."]
position = Vector2(-291, 65)
[node name="Flower1" parent="Flowers" instance=ExtResource("11_o3nm3")]
position = Vector2(1080, 377)
scale = Vector2(0.5, 0.5)
[node name="Flower4" parent="Flowers" instance=ExtResource("11_o3nm3")]
position = Vector2(1040, 261)
scale = Vector2(0.5, 0.5)
[node name="Flower5" parent="Flowers" instance=ExtResource("11_o3nm3")]
position = Vector2(1037, 332)
scale = Vector2(0.5, 0.5)
[node name="Flower6" parent="Flowers" instance=ExtResource("11_o3nm3")]
position = Vector2(1135, 267)
scale = Vector2(0.5, 0.5)
[node name="Flower7" parent="Flowers" instance=ExtResource("11_o3nm3")]
position = Vector2(1154, 353)
scale = Vector2(0.5, 0.5)
[node name="Flower8" parent="Flowers" instance=ExtResource("11_o3nm3")]
position = Vector2(1006, 396)
scale = Vector2(0.5, 0.5)
[node name="Flower9" parent="Flowers" instance=ExtResource("11_o3nm3")]
position = Vector2(1120, 404)
scale = Vector2(0.5, 0.5)
[node name="Flower10" parent="Flowers" instance=ExtResource("11_o3nm3")]
position = Vector2(1090, 275)
scale = Vector2(0.5, 0.5)
[node name="Flower11" parent="Flowers" instance=ExtResource("11_o3nm3")]
position = Vector2(1091, 213)
scale = Vector2(0.5, 0.5)
[node name="Flower12" parent="Flowers" instance=ExtResource("11_o3nm3")]
position = Vector2(1022, 453)
scale = Vector2(0.5, 0.5)
[node name="Flower13" parent="Flowers" instance=ExtResource("11_o3nm3")]
position = Vector2(1103, 444)
scale = Vector2(0.5, 0.5)
[node name="Flower2" parent="Flowers" instance=ExtResource("12_cill4")]
position = Vector2(1059, 419)
scale = Vector2(0.5, 0.5)
[node name="Flower3" parent="Flowers" instance=ExtResource("12_cill4")]
position = Vector2(1094, 320)
scale = Vector2(0.5, 0.5)
[node name="Area2D" type="Area2D" parent="Flowers" groups=["flowers"]]
position = Vector2(1022, 326)
collision_layer = 7
collision_mask = 7
[node name="CollisionShape2D" type="CollisionShape2D" parent="Flowers/Area2D"]
shape = SubResource("CircleShape2D_1tovu")
[node name="Beehive" parent="." groups=["beehive"] instance=ExtResource("2_3g2rt")]
unique_name_in_owner = true
position = Vector2(629, 360)
[node name="BeeSpawner" parent="." instance=ExtResource("3_yxsy7")]
[node name="UiComponent" parent="." instance=ExtResource("4_ms7q4")]
z_index = 20
offset_right = 1280.0
offset_bottom = 720.0
[node name="DroneManager" parent="." instance=ExtResource("5_fxm58")]
unique_name_in_owner = true
[node name="LevelCompleteComponent" parent="." instance=ExtResource("6_6j5sw")]
visible = false
z_index = 999
offset_right = 1280.0
offset_bottom = 720.0
[node name="BackgroundMusic" type="AudioStreamPlayer" parent="."]
stream = ExtResource("13_n8ob3")
volume_db = -18.0
autoplay = true
[node name="AtmosphericSounds" type="AudioStreamPlayer" parent="."]
stream = ExtResource("14_v1rue")
autoplay = true

View file

@ -7,11 +7,11 @@ var bee = preload("res://entities/Bee.tscn")
@onready var bee_sound = get_node("BigBeeSound")
@onready var small_bee_sound = get_node("BeeSound")
var bee_count = 0
var max_bees = 100
var spawn_interval = 0.5
var spawn_timer = 0.0
var bee_sound_timer = 0.0
var bee_count : int = 0
var max_bees : int = 100
var spawn_interval : float = 0.5
var spawn_timer : float = 0.0
var bee_sound_timer : float = 0.0
func spawn_bee():
var bee_instance = bee.instantiate()

View file

@ -6,7 +6,11 @@ var spawning_type : String = ""
var director_drones : Array = [] # List of all director drones in the world
@onready var rules = get_parent().get_node("RulesComponent")
@onready var beehive = get_parent().get_node("Beehive")
@onready var flowers = get_parent().get_node("Flowers")
@onready var drone_controls = %DroneControls
@onready var ui_controls = get_parent().get_node("UiComponent")
@onready var spawned_drones_container = get_node("SpawnedDrones")
@onready var cursor = preload("res://resources/cursors/launch_drone.png")
@ -16,6 +20,17 @@ var director_drones : Array = [] # List of all director drones in the world
@onready var distractor_drone = preload("res://entities/DistractorDrone.tscn")
@onready var collector_drone = preload("res://entities/CollectorDrone.tscn")
func _ready():
if !rules.game_rules.collector_enabled:
%SpawnCollector.visible = false
if !rules.game_rules.dancer_enabled:
%SpawnDancer.visible = false
if !rules.game_rules.director_enabled:
%SpawnDirector.visible = false
if !rules.game_rules.distractor_enabled:
%SpawnDistractor.visible = false
## Function to detect right click event
func _input(event) -> void:
if spawning_drone:
@ -36,10 +51,14 @@ func spawn_drone(drone_type : String) -> void:
# new_drone.visit_order = spawned_drones_container.get_child_count()
elif drone_type == "dancer":
new_drone = dancer_drone.instantiate()
# Hide the dancer button
%SpawnDancer.visible = false
elif drone_type == "distractor":
new_drone = distractor_drone.instantiate()
elif drone_type == "collector":
new_drone = collector_drone.instantiate()
# Hide the collector button
%SpawnCollector.visible = false
else:
Log.pr("Unknown drone type: " + drone_type)
@ -52,6 +71,8 @@ func spawn_drone(drone_type : String) -> void:
# Update the director drone list
update_director_drone_list()
reset_node_highlights()
func place_drone(drone_type : String) -> void:
if !spawning_drone:
Input.set_custom_mouse_cursor(cursor, Input.CURSOR_ARROW, Vector2(32, 32))
@ -66,19 +87,51 @@ func cancel_spawning() -> void:
drone_controls.enable_buttons()
spawning_drone = false
spawning_type = ""
reset_node_highlights()
func _on_spawn_director_pressed() -> void:
ui_controls.show_help_text("Help_Drone_Placement_Director")
place_drone("director")
func _on_spawn_collector_pressed() -> void:
flowers.show_outline()
ui_controls.show_help_text("Help_Drone_Placement_Collector")
place_drone("collector")
func _on_spawn_distractor_pressed() -> void:
place_drone("distractor")
func _on_spawn_dancer_pressed() -> void:
beehive.show_outline()
ui_controls.show_help_text("Help_Drone_Placement_Dancer")
place_drone("dancer")
func _on_spawn_director_mouse_entered():
reset_node_highlights()
ui_controls.show_help_text("Help_Drone_Placement_Director")
func _on_spawn_collector_mouse_entered():
reset_node_highlights()
flowers.show_outline()
ui_controls.show_help_text("Help_Drone_Placement_Collector")
func _on_spawn_distractor_mouse_entered():
reset_node_highlights()
ui_controls.show_help_text("Help_Drone_Placement_Distractor")
func _on_spawn_dancer_mouse_entered():
reset_node_highlights()
beehive.show_outline()
ui_controls.show_help_text("Help_Drone_Placement_Dancer")
## Function to clear highlights when a button is mouse exited, if we arent spawning a drone
func _on_button_mouse_exited() -> void:
## Update this to trigger something that hides help messages and resets highlights after a second or so
#if !spawning_drone:
# reset_node_highlights.call_deferred()
pass
func update_director_drone_list():
director_drones.clear()
for drone in spawned_drones_container.get_children():
@ -111,4 +164,9 @@ func get_collector():
for drone in spawned_drones_container.get_children():
if drone is CollectorDrone:
return drone
return null
return null
func reset_node_highlights():
ui_controls.hide_help_text()
beehive.hide_outline()
flowers.hide_outline()

View file

@ -1,4 +1,4 @@
[gd_scene load_steps=16 format=3 uid="uid://mk5n0hrwk4yi"]
[gd_scene load_steps=15 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"]
@ -9,7 +9,6 @@
[ext_resource type="PackedScene" uid="uid://b7eeptlk47ymd" path="res://ui/UiComponent.tscn" id="6_xuemm"]
[ext_resource type="PackedScene" uid="uid://cwutwy11pityw" path="res://ui/LevelCompleteComponent.tscn" id="8_4k5cm"]
[ext_resource type="PackedScene" uid="uid://ddf2mkkw1trkj" path="res://scenes/elements/bee_spawner.tscn" id="8_admu4"]
[ext_resource type="Script" path="res://ui/scripts/level_complete_component.gd" id="9_qrlto"]
[ext_resource type="PackedScene" uid="uid://ct3c16xm33r2a" path="res://scenes/elements/drone_manager.tscn" id="10_rmaj1"]
[ext_resource type="AudioStream" uid="uid://bgcbd6xf0lyrr" path="res://resources/music/bee_background.ogg" id="12_5cn5j"]
[ext_resource type="AudioStream" uid="uid://dvsjpsh5dyixq" path="res://resources/SFX/mixkit-european-spring-forest-ambience-1219.wav" id="13_nttuq"]
@ -89,7 +88,6 @@ visible = false
z_index = 999
offset_right = 1280.0
offset_bottom = 720.0
script = ExtResource("9_qrlto")
[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."]
stream = ExtResource("12_5cn5j")