diff --git a/Game.tscn b/Game.tscn index 70cb5da..f1dbe40 100644 --- a/Game.tscn +++ b/Game.tscn @@ -1,17 +1,20 @@ -[gd_scene load_steps=5 format=3 uid="uid://d3srnfkpx01we"] +[gd_scene load_steps=6 format=3 uid="uid://d3srnfkpx01we"] [ext_resource type="PackedScene" uid="uid://d3hul8b7hlmj7" path="res://scenes/Map.tscn" id="1_nnb57"] +[ext_resource type="Script" path="res://scripts/game.gd" id="1_ult6o"] [ext_resource type="PackedScene" uid="uid://dha8pa1les53a" path="res://scenes/Gui.tscn" id="2_d5c8m"] [ext_resource type="Script" path="res://scripts/camera.gd" id="3_7olyu"] [ext_resource type="PackedScene" uid="uid://qpdlnll5pihe" path="res://objects/Planter.tscn" id="3_qx0o7"] [node name="Game" type="Node2D"] +script = ExtResource("1_ult6o") [node name="Map" parent="." instance=ExtResource("1_nnb57")] [node name="Interface" type="CanvasLayer" parent="."] -[node name="Gui" parent="Interface" instance=ExtResource("2_d5c8m")] +[node name="Gui" parent="Interface" node_paths=PackedStringArray("planter") instance=ExtResource("2_d5c8m")] +planter = NodePath("../../Planter") [node name="Camera2D" type="Camera2D" parent="."] position = Vector2(709, 382) @@ -21,3 +24,4 @@ script = ExtResource("3_7olyu") camera = NodePath("../Camera2D") [connection signal="scanner_selected" from="Interface/Gui" to="Map" method="_on_gui_scanner_selected"] +[connection signal="seed_list_updated" from="Planter" to="Interface/Gui" method="_on_planter_seed_list_updated"] diff --git a/assets/grille_seeds.png b/assets/grille_seeds.png new file mode 100644 index 0000000..d4da84b Binary files /dev/null and b/assets/grille_seeds.png differ diff --git a/assets/grille_seeds.png.import b/assets/grille_seeds.png.import new file mode 100644 index 0000000..b144e30 --- /dev/null +++ b/assets/grille_seeds.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b3kjaw1hajc6s" +path="res://.godot/imported/grille_seeds.png-e1abfe5b80bdca5644f3d1e62fa17daf.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/grille_seeds.png" +dest_files=["res://.godot/imported/grille_seeds.png-e1abfe5b80bdca5644f3d1e62fa17daf.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/objects/Planter.tscn b/objects/Planter.tscn index 87ec324..188bc1f 100644 --- a/objects/Planter.tscn +++ b/objects/Planter.tscn @@ -6,9 +6,10 @@ [ext_resource type="Resource" uid="uid://dnahox31xqy6l" path="res://objects/plant_types/peuplier.tres" id="4_tmfl1"] [ext_resource type="Resource" uid="uid://b6ufxuqdcgwmx" path="res://objects/plant_types/chene.tres" id="5_j34av"] -[node name="Planter" type="Node"] +[node name="Planter" type="Node2D"] +y_sort_enabled = true script = ExtResource("1_l7lry") -plants = Array[ExtResource("2_7h3ga")]([ExtResource("3_lgbrc"), ExtResource("5_j34av"), ExtResource("4_tmfl1")]) +plants = Array[ExtResource("2_7h3ga")]([ExtResource("3_lgbrc"), ExtResource("4_tmfl1"), ExtResource("5_j34av")]) [node name="Timer" type="Timer" parent="."] wait_time = 0.2 diff --git a/objects/gui/Seed_card.tscn b/objects/gui/Seed_card.tscn index ddaf302..58d9595 100644 --- a/objects/gui/Seed_card.tscn +++ b/objects/gui/Seed_card.tscn @@ -1,4 +1,6 @@ -[gd_scene load_steps=4 format=3 uid="uid://iaf4md4cbwqh"] +[gd_scene load_steps=5 format=3 uid="uid://iaf4md4cbwqh"] + +[ext_resource type="Script" path="res://scripts/gui/seed_card.gd" id="1_ecgsq"] [sub_resource type="Gradient" id="Gradient_lissx"] offsets = PackedFloat32Array(1) @@ -14,6 +16,7 @@ layout_mode = 3 anchors_preset = 0 size_flags_horizontal = 8 size_flags_vertical = 8 +script = ExtResource("1_ecgsq") [node name="Card" type="PanelContainer" parent="."] layout_mode = 1 diff --git a/objects/gui/Seed_queue.tscn b/objects/gui/Seed_queue.tscn index 7673912..b0c9dd4 100644 --- a/objects/gui/Seed_queue.tscn +++ b/objects/gui/Seed_queue.tscn @@ -1,4 +1,6 @@ -[gd_scene load_steps=2 format=3 uid="uid://bm8nlb7kmaa6k"] +[gd_scene load_steps=3 format=3 uid="uid://bm8nlb7kmaa6k"] + +[ext_resource type="Script" path="res://scripts/gui/seed_queue.gd" id="1_6lrhe"] [sub_resource type="NoiseTexture2D" id="NoiseTexture2D_reedq"] @@ -9,6 +11,7 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +script = ExtResource("1_6lrhe") [node name="HBoxContainer" type="HBoxContainer" parent="."] layout_mode = 1 @@ -20,12 +23,6 @@ grow_horizontal = 2 grow_vertical = 0 theme_override_constants/separation = 10 -[node name="NextSeed" type="TextureRect" parent="HBoxContainer"] -custom_minimum_size = Vector2(80, 80) -layout_mode = 2 -texture = SubResource("NoiseTexture2D_reedq") -expand_mode = 2 - [node name="Queue" type="HBoxContainer" parent="HBoxContainer"] layout_mode = 2 theme_override_constants/separation = 10 @@ -70,3 +67,9 @@ size_flags_horizontal = 4 size_flags_vertical = 8 texture = SubResource("NoiseTexture2D_reedq") expand_mode = 2 + +[node name="NextSeed" type="TextureRect" parent="HBoxContainer"] +custom_minimum_size = Vector2(80, 80) +layout_mode = 2 +texture = SubResource("NoiseTexture2D_reedq") +expand_mode = 2 diff --git a/objects/plant.tscn b/objects/plant.tscn index 3e13b0a..6f4b677 100644 --- a/objects/plant.tscn +++ b/objects/plant.tscn @@ -1,4 +1,6 @@ -[gd_scene load_steps=3 format=3 uid="uid://x4kv2y5f52cm"] +[gd_scene load_steps=6 format=3 uid="uid://x4kv2y5f52cm"] + +[ext_resource type="Texture2D" uid="uid://b3kjaw1hajc6s" path="res://assets/grille_seeds.png" id="1_n5onq"] [sub_resource type="GDScript" id="GDScript_x3g5o"] script/source = "class_name Plant @@ -11,24 +13,31 @@ signal grown signal died @onready var growing_timer: Timer = $Growing -@onready var sprite_node: AnimatedSprite2D = $AnimatedSprite2D @onready var need_checker: Timer = $NeedChecker +@onready var sapling_count_down: Timer = $SaplingCountDown +@onready var reproduction: Timer = $Reproduction +@onready var sprite_node: AnimatedSprite2D = $AnimatedSprite2D -const NEEDCHECKPERIOD := 1.0 +const NEED_CHECK_PERIOD := 0.5 +const SAPLING_LIFETIME_MULT := 2.0 # this multiplies the time to grow to tell the time it can stay as a sapling +const OFFSET_REPRODUCTION_PERCT_DIST := 0.5 var parameter: PlantType var state := PlantState.SAPLING +var sapling_time_left: float var can_grow := true func init(plant_parameter: PlantType): parameter = plant_parameter + sapling_count_down.start(SAPLING_LIFETIME_MULT * parameter.growing_time) sprite_node.sprite_frames = parameter.sprite_frames - need_checker.start(NEEDCHECKPERIOD) + need_checker.start(NEED_CHECK_PERIOD) func _on_need_checker_timeout() -> void: can_grow = check_terrain_viability() - growing_timer.paused = not can_grow + growing_timer.paused = not can_grow and state == PlantState.SAPLING + reproduction.paused = not can_grow func check_terrain_viability() -> bool: var water := GameTerrain.get_stat(position, GameTerrain.Stats.WATER) @@ -41,20 +50,26 @@ func check_terrain_viability() -> bool: var presence := GameTerrain.get_stat(position, GameTerrain.Stats.PRESENCE) presence += GameTerrain.LEVELS_NUMBER / 2 - if presence < parameter.presence_need[0] or parameter.presence_need[1]: + if presence < parameter.presence_need[0] or presence > parameter.presence_need[1]: return false return true func _on_growing_timeout() -> void: + if state == PlantState.SAPLING: + can_grow = check_terrain_viability() + if not can_grow: + growing_timer.start() + return + match state: PlantState.SAPLING: grow() PlantState.GROWN: die() PlantState.DEAD: - push_error(\"Already dead\") + remove() func plant(new_position: Vector2): @@ -69,6 +84,7 @@ func grow(): push_error(\"Tried to grow \" + parameter.type + \", but was not at sapling state\") return state = PlantState.GROWN + sapling_count_down.stop() growing_timer.start(parameter.dying_time) GameTerrain.modify_zone(position, parameter.distance_prod, @@ -82,25 +98,87 @@ func grow(): parameter.distance_prod, GameTerrain.Stats.PRESENCE, parameter.presence_prod) + + reproduction.start(parameter.dying_time / (parameter.offspring_per_lifetime + 1) + 0.1) + grown.emit() sprite_node.play(\"GROWN\") func die(): state = PlantState.DEAD + # remove alive prod and add dead prod + GameTerrain.modify_zone(position, + parameter.distance_prod, + GameTerrain.Stats.WATER, + -parameter.water_prod + parameter.dead_water_prod) + GameTerrain.modify_zone(position, + parameter.distance_prod, + GameTerrain.Stats.FERTILITY, + -parameter.fertility_prod + parameter.dead_fertility_prod) + GameTerrain.modify_zone(position, + parameter.distance_prod, + GameTerrain.Stats.PRESENCE, + -parameter.presence_prod) + growing_timer.start(parameter.dead_time) died.emit() sprite_node.play(\"DEAD\") + +func remove(was_dead: bool = true): + if was_dead: + GameTerrain.modify_zone(position, + parameter.distance_prod, + GameTerrain.Stats.WATER, + -parameter.dead_water_prod) + GameTerrain.modify_zone(position, + parameter.distance_prod, + GameTerrain.Stats.FERTILITY, + -parameter.dead_fertility_prod) + queue_free() + + +func _on_sapling_count_down_timeout() -> void: + remove(false) + + +func _on_reproduction_timeout() -> void: + var min_dist := parameter.distance_prod - parameter.distance_prod * OFFSET_REPRODUCTION_PERCT_DIST + var max_dist := parameter.distance_prod + parameter.distance_prod * OFFSET_REPRODUCTION_PERCT_DIST + var plant_pos = position + (Vector2.RIGHT * randf_range(min_dist, max_dist)).rotated(randf_range(0, PI)) + var space := get_world_2d().direct_space_state + var parameters = PhysicsPointQueryParameters2D.new() + parameters.position = plant_pos + parameters.collide_with_areas = true + parameters.collide_with_bodies = false + var result := space.intersect_point(parameters, 1) + if result.size() > 0: + return + + var offspring = self.duplicate() + self.get_parent().add_child(offspring) + offspring.init(parameter) + offspring.plant(plant_pos) " +[sub_resource type="AtlasTexture" id="AtlasTexture_5did5"] +atlas = ExtResource("1_n5onq") +region = Rect2(810, 540, 270, 270) + [sub_resource type="SpriteFrames" id="SpriteFrames_667un"] animations = [{ -"frames": [], +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_5did5") +}], "loop": true, "name": &"SEED", "speed": 5.0 }] +[sub_resource type="CircleShape2D" id="CircleShape2D_jksuk"] +radius = 36.0 + [node name="Plant" type="Node2D"] script = SubResource("GDScript_x3g5o") @@ -109,10 +187,23 @@ one_shot = true [node name="NeedChecker" type="Timer" parent="."] +[node name="SaplingCountDown" type="Timer" parent="."] +one_shot = true + +[node name="Reproduction" type="Timer" parent="."] + [node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."] scale = Vector2(0.2, 0.2) sprite_frames = SubResource("SpriteFrames_667un") animation = &"SEED" +offset = Vector2(0, -250) + +[node name="Area2D" type="Area2D" parent="."] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"] +shape = SubResource("CircleShape2D_jksuk") [connection signal="timeout" from="Growing" to="." method="_on_growing_timeout"] [connection signal="timeout" from="NeedChecker" to="." method="_on_need_checker_timeout"] +[connection signal="timeout" from="SaplingCountDown" to="." method="_on_sapling_count_down_timeout"] +[connection signal="timeout" from="Reproduction" to="." method="_on_reproduction_timeout"] diff --git a/objects/plant_types/chardon.tres b/objects/plant_types/chardon.tres index 4b2bdc3..320d4ca 100644 --- a/objects/plant_types/chardon.tres +++ b/objects/plant_types/chardon.tres @@ -1,8 +1,13 @@ -[gd_resource type="Resource" script_class="PlantType" load_steps=7 format=3 uid="uid://bgi2lo7kb3d2v"] +[gd_resource type="Resource" script_class="PlantType" load_steps=9 format=3 uid="uid://bgi2lo7kb3d2v"] [ext_resource type="Script" path="res://scripts/plant_type.gd" id="1_i8xe4"] +[ext_resource type="Texture2D" uid="uid://b3kjaw1hajc6s" path="res://assets/grille_seeds.png" id="2_4rpny"] [ext_resource type="Texture2D" uid="uid://r1bq2tgt1yxf" path="res://assets/gamejam_plantes_props1.png" id="2_gaemm"] +[sub_resource type="AtlasTexture" id="AtlasTexture_1lwna"] +atlas = ExtResource("2_4rpny") +region = Rect2(0, 0, 270, 270) + [sub_resource type="AtlasTexture" id="AtlasTexture_fxqnu"] atlas = ExtResource("2_gaemm") region = Rect2(1920, 1620, 320, 540) @@ -45,15 +50,18 @@ animations = [{ [resource] script = ExtResource("1_i8xe4") type = "Chardon" +seed_sprite = SubResource("AtlasTexture_1lwna") sprite_frames = SubResource("SpriteFrames_fxtnk") -growing_time = 0.5 -dying_time = 10.0 -water_need = [0, 0] -fertility_need = [0, 0] -presence_need = [0, 0] -water_prod = 1 -fertility_prod = -1 -presence_prod = 1 +growing_time = 1.0 +offspring_per_lifetime = 1 +dying_time = 30.0 +dead_time = 10.0 +water_need = [-5, 5] +fertility_need = [-5, 5] +presence_need = [0, 5] +water_prod = 2 +fertility_prod = 0 +presence_prod = 2 dead_water_prod = 0 dead_fertility_prod = 1 -distance_prod = 50 +distance_prod = 150 diff --git a/objects/plant_types/chene.tres b/objects/plant_types/chene.tres index 200dc8e..80e3ca4 100644 --- a/objects/plant_types/chene.tres +++ b/objects/plant_types/chene.tres @@ -1,7 +1,12 @@ -[gd_resource type="Resource" script_class="PlantType" load_steps=7 format=3 uid="uid://b6ufxuqdcgwmx"] +[gd_resource type="Resource" script_class="PlantType" load_steps=9 format=3 uid="uid://b6ufxuqdcgwmx"] [ext_resource type="Script" path="res://scripts/plant_type.gd" id="1_meppe"] [ext_resource type="Texture2D" uid="uid://r1bq2tgt1yxf" path="res://assets/gamejam_plantes_props1.png" id="2_jkmk8"] +[ext_resource type="Texture2D" uid="uid://b3kjaw1hajc6s" path="res://assets/grille_seeds.png" id="2_m81be"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_bqj8q"] +atlas = ExtResource("2_m81be") +region = Rect2(270, 0, 270, 270) [sub_resource type="AtlasTexture" id="AtlasTexture_vmgwa"] atlas = ExtResource("2_jkmk8") @@ -45,15 +50,18 @@ animations = [{ [resource] script = ExtResource("1_meppe") type = "Chene" +seed_sprite = SubResource("AtlasTexture_bqj8q") sprite_frames = SubResource("SpriteFrames_shufc") -growing_time = 50.0 +growing_time = 20.0 +offspring_per_lifetime = 3 dying_time = 100.0 -water_need = [0, 0] -fertility_need = [0, 0] -presence_need = [0, 0] -water_prod = 1 -fertility_prod = 2 -presence_prod = 1 +dead_time = 200.0 +water_need = [1, 5] +fertility_need = [1, 5] +presence_need = [3, 7] +water_prod = 3 +fertility_prod = 0 +presence_prod = 5 dead_water_prod = 0 -dead_fertility_prod = 1 -distance_prod = 50 +dead_fertility_prod = 5 +distance_prod = 400 diff --git a/objects/plant_types/peuplier.tres b/objects/plant_types/peuplier.tres index c38b755..ea7db27 100644 --- a/objects/plant_types/peuplier.tres +++ b/objects/plant_types/peuplier.tres @@ -1,7 +1,12 @@ -[gd_resource type="Resource" script_class="PlantType" load_steps=7 format=3 uid="uid://dnahox31xqy6l"] +[gd_resource type="Resource" script_class="PlantType" load_steps=9 format=3 uid="uid://dnahox31xqy6l"] [ext_resource type="Script" path="res://scripts/plant_type.gd" id="1_mhtmv"] [ext_resource type="Texture2D" uid="uid://r1bq2tgt1yxf" path="res://assets/gamejam_plantes_props1.png" id="2_gcjog"] +[ext_resource type="Texture2D" uid="uid://b3kjaw1hajc6s" path="res://assets/grille_seeds.png" id="2_od2qm"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_dkacp"] +atlas = ExtResource("2_od2qm") +region = Rect2(540, 0, 270, 270) [sub_resource type="AtlasTexture" id="AtlasTexture_ncq3n"] atlas = ExtResource("2_gcjog") @@ -44,16 +49,19 @@ animations = [{ [resource] script = ExtResource("1_mhtmv") -type = "Peuplier" +type = "Buisson" +seed_sprite = SubResource("AtlasTexture_dkacp") sprite_frames = SubResource("SpriteFrames_d15np") growing_time = 2.0 -dying_time = 2.0 -water_need = [0, 0] -fertility_need = [0, 0] -presence_need = [0, 0] -water_prod = 2 +offspring_per_lifetime = 1 +dying_time = 45.0 +dead_time = 15.0 +water_need = [1, 5] +fertility_need = [-5, 5] +presence_need = [1, 10] +water_prod = 0 fertility_prod = 2 -presence_prod = 1 +presence_prod = 3 dead_water_prod = 0 dead_fertility_prod = 1 -distance_prod = 25.0 +distance_prod = 250 diff --git a/scripts/game.gd b/scripts/game.gd new file mode 100644 index 0000000..71b5861 --- /dev/null +++ b/scripts/game.gd @@ -0,0 +1,12 @@ +extends Node2D + +@onready var gui: Gui = $Interface/Gui +@onready var planter: Planter = $Planter + +func _ready() -> void: + pass # Replace with function body. + + + +func _on_planter_seed_list_updated() -> void: + pass # Replace with function body. diff --git a/scripts/gui.gd b/scripts/gui.gd index 756cf9f..bfe93ef 100644 --- a/scripts/gui.gd +++ b/scripts/gui.gd @@ -3,5 +3,20 @@ extends Control signal scanner_selected +@onready var seed_queue: Control = $MarginContainer/SeedQueue +@onready var seed_card: Control = $MarginContainer/SeedCard + +@export var planter: Planter + +func _ready() -> void: + seed_queue.planter = planter + seed_card.planter = planter + + func _on_scanner_modes_scanner_selected(type : Scanners.Type): emit_signal("scanner_selected", type) + + +func _on_planter_seed_list_updated() -> void: + seed_queue.update_queue() + seed_card.update_card() diff --git a/scripts/gui/seed_card.gd b/scripts/gui/seed_card.gd new file mode 100644 index 0000000..7ca96db --- /dev/null +++ b/scripts/gui/seed_card.gd @@ -0,0 +1,15 @@ +extends Control + +@onready var nom: Label = $Card/MarginContainer/VBoxContainer/Nom +@onready var image: TextureRect = $Card/MarginContainer/VBoxContainer/Image +@onready var besoins: Label = $Card/MarginContainer/VBoxContainer/Besoins +@onready var apports: Label = $Card/MarginContainer/VBoxContainer/Apports + +var planter: Planter + +func update_card(): + var next_seed_param := planter.get_plant_from_queue() + nom.text = next_seed_param.type + image.texture = next_seed_param.sprite_frames.get_frame_texture("GROWN", 0) + besoins.text = "w: [" + str(next_seed_param.water_need[0]) + ", " + str(next_seed_param.water_need[1]) + "]\nf: [" + str(next_seed_param.fertility_need[0]) + ", " + str(next_seed_param.fertility_need[1]) + "]" + apports.text = "w: " + str(next_seed_param.water_prod) + "\nf: " + str(next_seed_param.fertility_prod) diff --git a/scripts/gui/seed_queue.gd b/scripts/gui/seed_queue.gd new file mode 100644 index 0000000..3997352 --- /dev/null +++ b/scripts/gui/seed_queue.gd @@ -0,0 +1,15 @@ +extends Control + +@onready var next_seed: TextureRect = $HBoxContainer/NextSeed +@onready var queue: HBoxContainer = $HBoxContainer/Queue + +var planter: Planter + +func update_queue(): + var next_seed_param := planter.get_plant_from_queue() + next_seed.texture = next_seed_param.seed_sprite + var index := 0 + for child in queue.get_children(): + var seed_param := planter.get_plant_from_queue(index) + child.texture = seed_param.seed_sprite + index += 1 diff --git a/scripts/plant_type.gd b/scripts/plant_type.gd index c14f157..81bae97 100644 --- a/scripts/plant_type.gd +++ b/scripts/plant_type.gd @@ -4,14 +4,17 @@ extends Resource @export var type: String +@export var seed_sprite: AtlasTexture @export var sprite_frames: SpriteFrames @export var growing_time := 1.0 -@export var dying_time := 30.0 +@export var offspring_per_lifetime := 1 +@export var dying_time := 30.0 # time to die +@export var dead_time := 10.0 # time being dead -@export var water_need := [0, 0] # min max -@export var fertility_need := [0, 0] # min max -@export var presence_need := [0, 0] # min max +@export var water_need := [-5, 5] # min max +@export var fertility_need := [-5, 5] # min max +@export var presence_need := [0, 10] # min max @export var water_prod := 0 @export var fertility_prod := 0 @@ -19,4 +22,5 @@ extends Resource @export var dead_water_prod := 0 @export var dead_fertility_prod := 1 + @export var distance_prod := 50 diff --git a/scripts/planter.gd b/scripts/planter.gd index 3ef4c2f..0fc9618 100644 --- a/scripts/planter.gd +++ b/scripts/planter.gd @@ -1,18 +1,50 @@ class_name Planter -extends Node +extends Node2D -@export var plants: Array[PlantType] +signal seed_list_updated + +const QUEUE_LENGTH := 6 # ENORME @onready var plant_scene = preload("res://objects/Plant.tscn") @onready var timer: Timer = $Timer +@export var plants: Array[PlantType] + @export var camera: Camera2D +# index of the PlantType in plants +var seed_queue: Array[int] +var can_plant := true -func _unhandled_input(event: InputEvent) -> void: - if Input.is_action_just_pressed("plant") and timer.is_stopped(): - var chosen_type: PlantType = plants[randi_range(0, plants.size() - 1)] +func get_plant_from_queue(index: int = -1) -> PlantType: + if index == -1: + return plants[seed_queue.back()] + return plants[seed_queue[index]] + +func _ready() -> void: + for i in range(QUEUE_LENGTH): + seed_queue.push_front(randi_range(0, plants.size() - 1)) + seed_list_updated.emit() + +func _process(delta: float) -> void: + var space := get_world_2d().direct_space_state + var parameters = PhysicsPointQueryParameters2D.new() + parameters.position = camera.get_global_mouse_position() + parameters.collide_with_areas = true + parameters.collide_with_bodies = false + var result := space.intersect_point(parameters, 1) + can_plant = result.size() == 0 + +func take_next_seed() -> PlantType: + var plant_ind: int = seed_queue.pop_back() + seed_queue.push_front(randi_range(0, plants.size() - 1)) + seed_list_updated.emit() + return plants[plant_ind] + +func _unhandled_input(_event: InputEvent) -> void: + if can_plant and Input.is_action_just_pressed("plant") and timer.is_stopped(): + var chosen_type: PlantType = take_next_seed() var plant = plant_scene.instantiate() add_child(plant) plant.init(chosen_type)