From 232184afbaa2bc8a4635bacaa335a7a0e31738ed Mon Sep 17 00:00:00 2001 From: MartinOpat Date: Sat, 7 Feb 2026 15:31:43 +0100 Subject: [PATCH] (wip) Player food --- .../molecular/food/abstract_food.gd | 17 +++++++ .../{food.gd.uid => abstract_food.gd.uid} | 0 evolve-die-repeat/molecular/food/food.gd | 21 -------- .../molecular/food/food_manager.gd | 50 +++++++++++++++++++ .../molecular/food/food_manager.gd.uid | 1 + .../molecular/food/food_manager.tscn | 7 +++ evolve-die-repeat/molecular/food/food_mol.gd | 12 +++++ .../molecular/food/food_mol.tscn | 6 +++ .../molecular/molecular_player.tscn | 2 +- .../molecular/molecular_stage.tscn | 8 +++ .../predator/hammerhead_predator.tscn | 5 +- evolve-die-repeat/project.godot | 1 + 12 files changed, 104 insertions(+), 26 deletions(-) create mode 100644 evolve-die-repeat/molecular/food/abstract_food.gd rename evolve-die-repeat/molecular/food/{food.gd.uid => abstract_food.gd.uid} (100%) delete mode 100644 evolve-die-repeat/molecular/food/food.gd create mode 100644 evolve-die-repeat/molecular/food/food_manager.gd create mode 100644 evolve-die-repeat/molecular/food/food_manager.gd.uid create mode 100644 evolve-die-repeat/molecular/food/food_manager.tscn diff --git a/evolve-die-repeat/molecular/food/abstract_food.gd b/evolve-die-repeat/molecular/food/abstract_food.gd new file mode 100644 index 0000000..e01a4e9 --- /dev/null +++ b/evolve-die-repeat/molecular/food/abstract_food.gd @@ -0,0 +1,17 @@ +@abstract +class_name AbstractFood +extends Area2D + +@export var val: int = 1 +@export var food_name: String = "Food" + +signal consumed + +func _ready() -> void: + pass + +func _on_body_entered(body: Node2D) -> void: + pass + +func eat(consumer: Node2D) -> void: + pass diff --git a/evolve-die-repeat/molecular/food/food.gd.uid b/evolve-die-repeat/molecular/food/abstract_food.gd.uid similarity index 100% rename from evolve-die-repeat/molecular/food/food.gd.uid rename to evolve-die-repeat/molecular/food/abstract_food.gd.uid diff --git a/evolve-die-repeat/molecular/food/food.gd b/evolve-die-repeat/molecular/food/food.gd deleted file mode 100644 index f0b5aa1..0000000 --- a/evolve-die-repeat/molecular/food/food.gd +++ /dev/null @@ -1,21 +0,0 @@ -@abstract -class_name AbstractFood -extends Area2D - -@export var val: int = 1 -@export var food_name: String = "Food" - -func _ready() -> void: - body_entered.connect(_on_body_entered) - -func _on_body_entered(body: Node2D) -> void: - if body.has_method("collect_resource"): # TODO: Define a "consumer" group instead? - eat(body) - -func eat(consumer: Node2D) -> void: - print("Player ate: ", food_name) - apply_effect(consumer) - queue_free() - -func apply_effect(consumer: Node2D) -> void: - pass diff --git a/evolve-die-repeat/molecular/food/food_manager.gd b/evolve-die-repeat/molecular/food/food_manager.gd new file mode 100644 index 0000000..054da2a --- /dev/null +++ b/evolve-die-repeat/molecular/food/food_manager.gd @@ -0,0 +1,50 @@ +extends Node +class_name FoodManager2D + +var minCount: int = 20 +var _currentCount: int = 0 + +var rng = RandomNumberGenerator.new() + +@export var foodTypes: Array[PackedScene] = [] + +## The probabilities have to add up to 1.0 +@export var foodProbs: Array[float] = [] + +@export var spawnRange: Rect2 = Rect2(0, 0, 0, 0) + + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + spawnRange = GameManager.extent + call_deferred("_spawn_minimum") + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + pass + +func _spawn_minimum() -> void: + while _currentCount < minCount: + _spawn_random() + +func _random_pos() -> Vector2: + return Vector2(randf_range(spawnRange.position[0], spawnRange.size[0]), randf_range(spawnRange.position[1], spawnRange.size[1])) + +func _spawn_random() -> void: + var pos = _random_pos() + _spawn_food(pos) + _currentCount += 1 + +func _spawn_food(position: Vector2) -> void: + var instance = foodTypes[rng.rand_weighted(foodProbs)].instantiate() + instance.position = position + add_child(instance) + if instance.has_signal("consumed"): + instance.consumed.connect(_on_entity_consumed) + + +func _on_entity_consumed() -> void: + _currentCount = max(0, _currentCount-1) + call_deferred("_spawn_minimum") + +# TODO: Spawn food when an entity (any) dies diff --git a/evolve-die-repeat/molecular/food/food_manager.gd.uid b/evolve-die-repeat/molecular/food/food_manager.gd.uid new file mode 100644 index 0000000..294a980 --- /dev/null +++ b/evolve-die-repeat/molecular/food/food_manager.gd.uid @@ -0,0 +1 @@ +uid://7ua0qgyhphao diff --git a/evolve-die-repeat/molecular/food/food_manager.tscn b/evolve-die-repeat/molecular/food/food_manager.tscn new file mode 100644 index 0000000..87657c7 --- /dev/null +++ b/evolve-die-repeat/molecular/food/food_manager.tscn @@ -0,0 +1,7 @@ +[gd_scene format=3 uid="uid://cuqw17010qgob"] + +[ext_resource type="Script" uid="uid://7ua0qgyhphao" path="res://molecular/food/food_manager.gd" id="1_7iais"] + +[node name="FoodManager" type="Node2D" unique_id=858744014] +script = ExtResource("1_7iais") +metadata/_custom_type_script = "uid://7ua0qgyhphao" diff --git a/evolve-die-repeat/molecular/food/food_mol.gd b/evolve-die-repeat/molecular/food/food_mol.gd index 8223b50..16a054f 100644 --- a/evolve-die-repeat/molecular/food/food_mol.gd +++ b/evolve-die-repeat/molecular/food/food_mol.gd @@ -1,6 +1,18 @@ extends AbstractFood class_name FoodMolecular +func _on_body_entered(body: Node2D) -> void: + if body.has_method("collect_resource"): # TODO: Define a "consumer" group instead? + eat(body) + +func eat(consumer: Node2D) -> void: + print("Player ate: ", food_name) + consumed.emit() + + apply_effect(consumer) + + queue_free() + func apply_effect(consumer: Node2D) -> void: if consumer.has_method("collect_resource"): consumer.collect_resource(val) # val is from parent (default 1), override if required diff --git a/evolve-die-repeat/molecular/food/food_mol.tscn b/evolve-die-repeat/molecular/food/food_mol.tscn index d6cc0ae..857b41e 100644 --- a/evolve-die-repeat/molecular/food/food_mol.tscn +++ b/evolve-die-repeat/molecular/food/food_mol.tscn @@ -1,14 +1,20 @@ [gd_scene format=3 uid="uid://dmvmu218pc0pe"] +[ext_resource type="Script" uid="uid://cayxffay17o0u" path="res://molecular/food/food_mol.gd" id="1_0vfbj"] [ext_resource type="Texture2D" uid="uid://dcedkos6vgv51" path="res://molecular/assets/food/food-normal.png" id="2_68e2u"] [sub_resource type="CircleShape2D" id="CircleShape2D_0vfbj"] radius = 5.0 [node name="FoodMol" type="Area2D" unique_id=595352294] +collision_layer = 8 +collision_mask = 7 +script = ExtResource("1_0vfbj") [node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=762721134] shape = SubResource("CircleShape2D_0vfbj") [node name="Sprite2D" type="Sprite2D" parent="." unique_id=98693723] texture = ExtResource("2_68e2u") + +[connection signal="body_entered" from="." to="." method="_on_body_entered"] diff --git a/evolve-die-repeat/molecular/molecular_player.tscn b/evolve-die-repeat/molecular/molecular_player.tscn index 9a2a4fc..6f55749 100644 --- a/evolve-die-repeat/molecular/molecular_player.tscn +++ b/evolve-die-repeat/molecular/molecular_player.tscn @@ -31,7 +31,7 @@ radius = 191.95984 height = 1295.8773 [node name="player" type="CharacterBody2D" unique_id=2032508208] -collision_mask = 6 +collision_mask = 14 script = ExtResource("1_0ix7k") [node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="." unique_id=1745800698] diff --git a/evolve-die-repeat/molecular/molecular_stage.tscn b/evolve-die-repeat/molecular/molecular_stage.tscn index 9a858b2..62852cd 100644 --- a/evolve-die-repeat/molecular/molecular_stage.tscn +++ b/evolve-die-repeat/molecular/molecular_stage.tscn @@ -7,6 +7,8 @@ [ext_resource type="Script" uid="uid://umx4w11edif" path="res://molecular/prey_manager.gd" id="5_cthuy"] [ext_resource type="PackedScene" uid="uid://c3iw2v3x6ngrb" path="res://molecular/prey/nucleotide_prey.tscn" id="6_a5cls"] [ext_resource type="PackedScene" uid="uid://s4s66oaexava" path="res://molecular/predator/hammerhead_predator.tscn" id="7_b1jr0"] +[ext_resource type="Script" uid="uid://7ua0qgyhphao" path="res://molecular/food/food_manager.gd" id="8_mys4o"] +[ext_resource type="PackedScene" uid="uid://dmvmu218pc0pe" path="res://molecular/food/food_mol.tscn" id="9_ojt85"] [sub_resource type="TileMapPattern" id="TileMapPattern_a5cls"] tile_data = PackedInt32Array(0, 65536, 2, 65536, 65536, 3, 1, 131072, 2, 65537, 131072, 3) @@ -122,3 +124,9 @@ scene = ExtResource("7_b1jr0") minCount = 10 maxCount = 20 metadata/_custom_type_script = "uid://coetidfssb80w" + +[node name="FoodManager" type="Node" parent="." unique_id=449460585] +script = ExtResource("8_mys4o") +foodTypes = [ExtResource("9_ojt85")] +foodProbs = Array[float]([1.0]) +metadata/_custom_type_script = "uid://7ua0qgyhphao" diff --git a/evolve-die-repeat/molecular/predator/hammerhead_predator.tscn b/evolve-die-repeat/molecular/predator/hammerhead_predator.tscn index cea4fa0..a11b1d5 100644 --- a/evolve-die-repeat/molecular/predator/hammerhead_predator.tscn +++ b/evolve-die-repeat/molecular/predator/hammerhead_predator.tscn @@ -7,7 +7,7 @@ [ext_resource type="Script" uid="uid://xbiqj7ubmj7d" path="res://molecular/prey/state_idle.gd" id="4_8a23j"] [ext_resource type="Texture2D" uid="uid://jyuf4lgjo64" path="res://molecular/assets/predator/hammerheadRibozyme-hurt.png" id="4_shhro"] [ext_resource type="Script" uid="uid://ubcu8fdfxxj1" path="res://molecular/prey/state_random_movement.gd" id="5_6rsu5"] -[ext_resource type="Script" uid="uid://bc7apl71t0q04" path="res://molecular/predator/state_hunting.gd" id="8_7qt2q"] +[ext_resource type="Script" path="res://molecular/predator/state_hunting.gd" id="8_7qt2q"] [sub_resource type="AtlasTexture" id="AtlasTexture_8a23j"] atlas = ExtResource("2_34kwa") @@ -118,21 +118,18 @@ metadata/_custom_type_script = "uid://ck7k8ht54snsy" [node name="Idle" type="Node" parent="StateMachine" unique_id=265876039] script = ExtResource("4_8a23j") -metadata/_custom_type_script = "uid://co2xp7gauamql" [node name="Timer" type="Timer" parent="StateMachine/Idle" unique_id=1870665609] one_shot = true [node name="RandomMovement" type="Node" parent="StateMachine" unique_id=105315122] script = ExtResource("5_6rsu5") -metadata/_custom_type_script = "uid://co2xp7gauamql" [node name="Timer" type="Timer" parent="StateMachine/RandomMovement" unique_id=447822526] one_shot = true [node name="Hunting" type="Node" parent="StateMachine" unique_id=1569866955] script = ExtResource("8_7qt2q") -metadata/_custom_type_script = "uid://co2xp7gauamql" [node name="Sight" type="Area2D" parent="." unique_id=1608385873] collision_layer = 0 diff --git a/evolve-die-repeat/project.godot b/evolve-die-repeat/project.godot index 5ac15e3..4486875 100644 --- a/evolve-die-repeat/project.godot +++ b/evolve-die-repeat/project.godot @@ -68,6 +68,7 @@ try_attack={ 2d_physics/layer_1="Player" 2d_physics/layer_2="Prey" 2d_physics/layer_3="Predator" +2d_physics/layer_4="Food" [rendering]