From e4b3919b815929e9523838b1cfa324cc82e3a998 Mon Sep 17 00:00:00 2001 From: djairoh Date: Sat, 17 Jan 2026 13:00:54 +0100 Subject: [PATCH] ft: improved npc spawning logic --- .../molecular/molecular_stage.tscn | 14 +++++-- .../molecular/nucleotide_prey.gd | 1 - evolve-die-repeat/molecular/preyManager.gd | 27 ------------ .../molecular/preyManager.gd.uid | 1 - evolve-die-repeat/molecular/prey_manager.gd | 13 ++++++ .../molecular/prey_manager.gd.uid | 1 + evolve-die-repeat/shared/npc/npc2D.gd | 3 ++ .../shared/npc/spawnManager2D.tscn | 6 +++ .../shared/npc/spawn_manager_2d.gd | 41 +++++++++++++++++++ .../shared/npc/spawn_manager_2d.gd.uid | 1 + 10 files changed, 75 insertions(+), 33 deletions(-) delete mode 100644 evolve-die-repeat/molecular/preyManager.gd delete mode 100644 evolve-die-repeat/molecular/preyManager.gd.uid create mode 100644 evolve-die-repeat/molecular/prey_manager.gd create mode 100644 evolve-die-repeat/molecular/prey_manager.gd.uid create mode 100644 evolve-die-repeat/shared/npc/spawnManager2D.tscn create mode 100644 evolve-die-repeat/shared/npc/spawn_manager_2d.gd create mode 100644 evolve-die-repeat/shared/npc/spawn_manager_2d.gd.uid diff --git a/evolve-die-repeat/molecular/molecular_stage.tscn b/evolve-die-repeat/molecular/molecular_stage.tscn index b3ef05f..96d0119 100644 --- a/evolve-die-repeat/molecular/molecular_stage.tscn +++ b/evolve-die-repeat/molecular/molecular_stage.tscn @@ -1,10 +1,11 @@ -[gd_scene load_steps=6 format=3 uid="uid://b55w56d4twno1"] +[gd_scene load_steps=7 format=3 uid="uid://b55w56d4twno1"] [ext_resource type="Texture2D" uid="uid://dnlrq8gxiix6" path="res://molecular/assets/bg-far-placeholder.jpg" id="1_cthuy"] [ext_resource type="Texture2D" uid="uid://bfjf6dxvbq5cj" path="res://dirt-specs.png" id="2_a5cls"] [ext_resource type="PackedScene" uid="uid://dxluckxdkpv4f" path="res://molecular/molecular_player.tscn" id="3_b1jr0"] [ext_resource type="Script" uid="uid://ceut2lrvkns75" path="res://debug_label.gd" id="4_mys4o"] -[ext_resource type="Script" uid="uid://2pmjtnrg5471" path="res://molecular/preyManager.gd" id="5_ojt85"] +[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/nucleotide_prey.tscn" id="6_a5cls"] [node name="MolecularStage" type="Node2D"] @@ -57,5 +58,10 @@ text = "Debug: You made it into the game! This is running from C++: " script = ExtResource("4_mys4o") -[node name="Prey" type="Node" parent="."] -script = ExtResource("5_ojt85") +[node name="PreyManager" type="Node" parent="." node_paths=PackedStringArray("cam")] +script = ExtResource("5_cthuy") +cam = NodePath("../player/Camera2D") +scene = ExtResource("6_a5cls") +minCount = 500 +maxCount = 1000 +metadata/_custom_type_script = "uid://coetidfssb80w" diff --git a/evolve-die-repeat/molecular/nucleotide_prey.gd b/evolve-die-repeat/molecular/nucleotide_prey.gd index c778e73..7ac25bd 100644 --- a/evolve-die-repeat/molecular/nucleotide_prey.gd +++ b/evolve-die-repeat/molecular/nucleotide_prey.gd @@ -6,7 +6,6 @@ extends AbstractPrey2D func _ready() -> void: $AnimatedSprite2D.animation = "Healthy" $AnimatedSprite2D.play() - pass # Replace with function body. # Called every frame. 'delta' is the elapsed time since the previous frame. diff --git a/evolve-die-repeat/molecular/preyManager.gd b/evolve-die-repeat/molecular/preyManager.gd deleted file mode 100644 index f170db1..0000000 --- a/evolve-die-repeat/molecular/preyManager.gd +++ /dev/null @@ -1,27 +0,0 @@ -extends Node - -var preyScene = preload("res://molecular/nucleotide_prey.tscn") -#var predatorScene = preload("res://Predator.tscn") -var score - -# Called when the node enters the scene tree for the first time. -func _ready() -> void: - for i in range(0, 100, 10): - spawn_creature(preyScene, Vector2(i, i)) - spawn_random() - spawn_random() - spawn_random() - spawn_random() - - -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta: float) -> void: - pass - -func spawn_random() -> void: - spawn_creature(preyScene, Vector2(randfn(100, 100), randfn(100, 100))) - -func spawn_creature(scene, position: Vector2) -> void: - var instance = scene.instantiate() - instance.position = position - add_child(instance) diff --git a/evolve-die-repeat/molecular/preyManager.gd.uid b/evolve-die-repeat/molecular/preyManager.gd.uid deleted file mode 100644 index 8b2a6ce..0000000 --- a/evolve-die-repeat/molecular/preyManager.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://2pmjtnrg5471 diff --git a/evolve-die-repeat/molecular/prey_manager.gd b/evolve-die-repeat/molecular/prey_manager.gd new file mode 100644 index 0000000..8e6b926 --- /dev/null +++ b/evolve-die-repeat/molecular/prey_manager.gd @@ -0,0 +1,13 @@ +extends SpawnManager2D + +@export var cam: Camera2D + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + spawnRange = cam.get_viewport_rect() + _spawn_minimum() + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + pass diff --git a/evolve-die-repeat/molecular/prey_manager.gd.uid b/evolve-die-repeat/molecular/prey_manager.gd.uid new file mode 100644 index 0000000..f5730d6 --- /dev/null +++ b/evolve-die-repeat/molecular/prey_manager.gd.uid @@ -0,0 +1 @@ +uid://umx4w11edif diff --git a/evolve-die-repeat/shared/npc/npc2D.gd b/evolve-die-repeat/shared/npc/npc2D.gd index d9125c9..c9c33ae 100644 --- a/evolve-die-repeat/shared/npc/npc2D.gd +++ b/evolve-die-repeat/shared/npc/npc2D.gd @@ -4,6 +4,8 @@ class_name NPC2D @export var maxHealth: int = 0 var health: int = maxHealth +signal died + # Called when the node enters the scene tree for the first time. func _ready() -> void: spawn() @@ -30,6 +32,7 @@ func feed(source ) -> void: push_error("Function feed() not implemented.") func die() -> void: + died.emit() queue_free() # TODO: should associate this class with a loot table (or equivalent), and can then implement logic for dying in parent class here. diff --git a/evolve-die-repeat/shared/npc/spawnManager2D.tscn b/evolve-die-repeat/shared/npc/spawnManager2D.tscn new file mode 100644 index 0000000..d99ac24 --- /dev/null +++ b/evolve-die-repeat/shared/npc/spawnManager2D.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://dje58m1cj34gn"] + +[ext_resource type="Script" uid="uid://coetidfssb80w" path="res://shared/npc/spawn_manager_2d.gd" id="1_624qc"] + +[node name="SpawnManager2d" type="Node"] +script = ExtResource("1_624qc") diff --git a/evolve-die-repeat/shared/npc/spawn_manager_2d.gd b/evolve-die-repeat/shared/npc/spawn_manager_2d.gd new file mode 100644 index 0000000..4bf6f5b --- /dev/null +++ b/evolve-die-repeat/shared/npc/spawn_manager_2d.gd @@ -0,0 +1,41 @@ +extends Node +class_name SpawnManager2D + +#var scene = preload("res://molecular/nucleotide_prey.tscn") +@export var scene: PackedScene +@export var minCount = 1 +@export var maxCount = 2 +@export var spawnRange: Rect2 +var _currentCount = 0 + + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + _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 and _currentCount < maxCount: + _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_creature(pos) + _currentCount += 1 + +func _spawn_creature(position: Vector2) -> void: + var instance = scene.instantiate() + instance.position = position + add_child(instance) + if instance.has_signal("died"): + instance.died.connect(_on_entity_died) + +func _on_entity_died() -> void: + _currentCount = max(0, _currentCount-1) + _spawn_minimum() diff --git a/evolve-die-repeat/shared/npc/spawn_manager_2d.gd.uid b/evolve-die-repeat/shared/npc/spawn_manager_2d.gd.uid new file mode 100644 index 0000000..041c864 --- /dev/null +++ b/evolve-die-repeat/shared/npc/spawn_manager_2d.gd.uid @@ -0,0 +1 @@ +uid://coetidfssb80w