mirror of
https://github.com/Steffo99/hella-farm.git
synced 2024-11-23 08:34:22 +00:00
THINGS YAY
This commit is contained in:
parent
9739a089d5
commit
da0180c5be
12 changed files with 102 additions and 27 deletions
|
@ -1,16 +1,33 @@
|
|||
@icon("res://behaviours/spawner.svg")
|
||||
extends Area2D
|
||||
extends Node2D
|
||||
class_name Spawner
|
||||
|
||||
|
||||
## Emitted when a new scene is spawned.
|
||||
signal spawned(entity: Node2D)
|
||||
|
||||
## Emitted when the [field blocking_tracker] prevents something from spawning.
|
||||
signal spawn_blocked
|
||||
|
||||
|
||||
## The scene to spawn.
|
||||
@export var scene: PackedScene
|
||||
|
||||
## Where the scene should be parented to in the tree.
|
||||
@export var target: Node2D
|
||||
|
||||
## If set, requires the tracker to not be tracking anything before spawning a scene.
|
||||
@export var blocking_tracker: Tracker
|
||||
|
||||
|
||||
## Spawn [field scene] at [field target] and the position of this node.
|
||||
func spawn():
|
||||
if blocking_tracker != null:
|
||||
if not blocking_tracker.tracking.is_empty():
|
||||
spawn_blocked.emit()
|
||||
return # Perhaps enqueue the spawn?
|
||||
if not target:
|
||||
target = MainGame.get_ancestor(self).default_spawn_parent
|
||||
target = MainGame.get_via_group(self).default_spawn_parent
|
||||
if not target:
|
||||
target = self
|
||||
var entity = scene.instantiate()
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
extends Area2D
|
||||
class_name Tracker
|
||||
|
||||
## Abstract base class for [Area2D]s tracking a certain subset of [Node2D]s.
|
||||
## [Area2D]s tracking a certain subset of [Node2D]s.
|
||||
|
||||
|
||||
signal tracked(body: Node2D)
|
||||
|
@ -11,6 +11,9 @@ signal untracked(body: Node2D)
|
|||
var tracking: Array = []
|
||||
|
||||
|
||||
## Start [field tracking] a [Node2D].
|
||||
##
|
||||
## Returns whether the body was added to the [field tracking] array.
|
||||
func track(body: Node2D) -> bool:
|
||||
var act: bool = not body in tracking
|
||||
if act:
|
||||
|
@ -18,9 +21,12 @@ func track(body: Node2D) -> bool:
|
|||
tracked.emit(body)
|
||||
# Handle TrackerTracker
|
||||
for tracker_tracker in body.find_children("*", "TrackerTracker", true, false):
|
||||
tracker_tracker.track(self)
|
||||
tracker_tracker.track_if_detected(self)
|
||||
return act
|
||||
|
||||
## Stop [field tracking] a [Node2D].
|
||||
##
|
||||
## Returns whether the body was removed from the [field tracking] array.
|
||||
func untrack(body: Node2D) -> bool:
|
||||
var act: bool = body in tracking
|
||||
if act:
|
||||
|
|
12
behaviours/tracker.tscn
Normal file
12
behaviours/tracker.tscn
Normal file
|
@ -0,0 +1,12 @@
|
|||
[gd_scene load_steps=2 format=3 uid="uid://8jkesanu4hrn"]
|
||||
|
||||
[ext_resource type="Script" path="res://behaviours/tracker.gd" id="1_4joji"]
|
||||
|
||||
[node name="Tracker" type="Area2D"]
|
||||
collision_layer = 0
|
||||
collision_mask = 56
|
||||
monitorable = false
|
||||
script = ExtResource("1_4joji")
|
||||
|
||||
[connection signal="body_entered" from="." to="." method="track"]
|
||||
[connection signal="body_exited" from="." to="." method="untrack"]
|
|
@ -2,5 +2,23 @@ extends Tracker
|
|||
class_name TrackerTracker
|
||||
|
||||
## Tracks [Tracker]s tracking the parent.
|
||||
|
||||
|
||||
## Start [field tracking] a [Node2D] if it overlaps this [Area2D].
|
||||
##
|
||||
## Shape is ignored.
|
||||
## Returns whether the body was added to the [field tracking] array.
|
||||
func track_if_detected(body: Node2D) -> bool:
|
||||
if overlaps_body(body):
|
||||
return track(body)
|
||||
return false
|
||||
|
||||
## Start [field tracking] a [Node2D] if it has a [Tracker] tracking this node or one of its ancestors.
|
||||
##
|
||||
## Returns whether the body was added to the [field tracking] array.
|
||||
func track_if_tracked(body: Node2D) -> bool:
|
||||
var act: bool = false
|
||||
for tracker in body.find_children("*", "Tracker", true, false):
|
||||
for ancestor in Traversal.get_ancestors(self): # Make more efficient, perhaps?
|
||||
if ancestor in tracker.tracking:
|
||||
act = track(body) or act
|
||||
return act
|
||||
|
|
|
@ -4,7 +4,9 @@
|
|||
|
||||
[node name="TrackerTracker" type="Area2D"]
|
||||
collision_layer = 0
|
||||
collision_mask = 0
|
||||
monitoring = false
|
||||
collision_mask = 24
|
||||
monitorable = false
|
||||
script = ExtResource("1_7b21r")
|
||||
|
||||
[connection signal="body_entered" from="." to="." method="track_if_tracked"]
|
||||
[connection signal="body_exited" from="." to="." method="untrack"]
|
||||
|
|
|
@ -9,7 +9,7 @@ func _on_move(movement: Vector2) -> void:
|
|||
position += movement
|
||||
|
||||
func _on_collected(tag: StringName) -> void:
|
||||
var game = MainGame.get_ancestor(self)
|
||||
var game = MainGame.get_via_group(self)
|
||||
|
||||
# TODO: Perhaps use a dictionary in game to store multiple currencies?
|
||||
match tag:
|
||||
|
|
|
@ -60,7 +60,6 @@ default_priority = 10
|
|||
alternative_priority = 10
|
||||
|
||||
[node name="ChangeDirectionTimer" parent="MovementWander" instance=ExtResource("10_phvea")]
|
||||
wait_time = 0.001
|
||||
autostart = true
|
||||
mean_secs = 2.0
|
||||
deviation = 2.0
|
||||
|
|
|
@ -153,6 +153,10 @@ alternative_priority = 40
|
|||
|
||||
[node name="HunterSense" parent="MovementRunFromHunter" instance=ExtResource("14_eqowb")]
|
||||
|
||||
[node name="Shape" type="CollisionShape2D" parent="MovementRunFromHunter/HunterSense"]
|
||||
shape = SubResource("CircleShape2D_etpf6")
|
||||
debug_color = Color(1, 1, 0, 0)
|
||||
|
||||
[node name="TargetPicker" parent="MovementRunFromHunter/HunterSense" node_paths=PackedStringArray("tracker") instance=ExtResource("13_jf6em")]
|
||||
tracker = NodePath("..")
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ class_name Cursor
|
|||
## A [CharacterBody2D] syncing its position with the mouse on each physics timestep.
|
||||
|
||||
|
||||
@onready var game := MainGame.get_ancestor(self)
|
||||
@onready var game := MainGame.get_via_group(self)
|
||||
|
||||
|
||||
func _physics_process(_delta: float) -> void:
|
||||
|
|
|
@ -2,17 +2,13 @@ extends Node2D
|
|||
class_name MainGame
|
||||
|
||||
|
||||
## Get the first possible [MainGame] instance by climbing the scene tree one ancestor at a time.
|
||||
static func get_ancestor(start: Node) -> MainGame:
|
||||
var current = start
|
||||
while current is Node:
|
||||
if current is MainGame:
|
||||
return current
|
||||
current = current.get_parent()
|
||||
Log.w(start, "MainGame ancestor not found.")
|
||||
return null
|
||||
|
||||
|
||||
@onready var gold_counter: Counter = $"GoldCounter"
|
||||
@onready var camera: GameCamera = $"GameCamera"
|
||||
@onready var default_spawn_parent: Node2D = %"DefaultSpawnParent"
|
||||
|
||||
|
||||
static func get_via_group(node: Node) -> MainGame:
|
||||
var result = node.get_tree().get_nodes_in_group("game")
|
||||
if result.is_empty():
|
||||
return null
|
||||
return result[0]
|
||||
|
|
File diff suppressed because one or more lines are too long
11
traversal.gd
Normal file
11
traversal.gd
Normal file
|
@ -0,0 +1,11 @@
|
|||
class_name Traversal
|
||||
|
||||
|
||||
## Get the first possible [MainGame] instance by climbing the scene tree one ancestor at a time.
|
||||
static func get_ancestors(start: Node) -> Array[Node]:
|
||||
var result: Array[Node] = []
|
||||
var current = start
|
||||
while current is Node:
|
||||
result.push_back(current)
|
||||
current = current.get_parent()
|
||||
return result
|
Loading…
Reference in a new issue