We're building a 4X game where there's a resource node that emits a signal on every
Timer.timeout (tick) to signal to the
Player class that it has "gained" more resources. On the Player's
_ready() call, we add the resources by
get_tree().get_nodes_in_group(x) whose property
overlord, which is a connected node export, matches the
Player class so only the Player gets the resources that belong to them.
How does one collect all values send by these signals so the UI can reflect a total amount of resources collected? E.g.:
gold: 242 (x), wood: 211 (x), food: 137 (x), where
x is value we want to collect the total of.
We haven't tried these solutions but thought of a few:
Using an ID system to detect if the resource has been collected already this tick, but this could result in dropped resources leaving them a tick behind. We thought then maybe a queue in addition to this could be implemented but that could leave it open to overload and an ever expanding list of nodes queued up. If you clear the queue then we're back to the problem of dropped resource values.
resource_current variables to store the max resources connected to the Player class and every time the signal is called it would increment the
resources_current variable until the total was hit and reset. This isn't a good solution due to it could allow for the same resource to fire a signal prior to another resource that should be collected first. This doesn't really solve the issue.
Moving the tick function to the Player class is an option but not the preferred solution. E.g.:
var for_collection := 
var resources := Vector3.ZERO
@onready var tick_timer : Timer = get_node("TickTimer")
for resource in get_tree().get_nodes_in_group("resources"):
if (resource.overlord == self):
var collect = Vector3.ZERO
for resource in collection:
collect += collection.collect_resource()
This should work, but we'd like to keep game super modular in the designer, which is the best practice to go for in this scenario?
Open to all suggestions.