Well, I looked at the code, and I'm not 100% sure I understand the need, but I do think signals would solve this problem. Basically a signal is a type of event, where you can alert other objects that something has happened, and also pass information between objects with a looser coupling.
You can think of a signal like a church bell that goes off every hour. The bell is the signal (the event) which lets you know it's the top of the hour, and the number of bells rung tells you the time. Same basic concept. With signals there is one object that "rings the bell" (e.g. emits a signal) and then other objects can opt-in to "listen" (e.g. connect) to the signal and provide a function that will be called to handle the event (with optional data). That's the idea at least.
Here is a simple example to get you started. Father and Son are both Sprites, Son is a child node.
Father script:
extends Sprite
signal print_text
signal print_num
func _ready():
connect("print_num", self, "on_print_num")
func on_print_num(num):
print("the number is: ", num)
func _input(event):
if event.is_action_released("click"):
get_node("Son").emit_signal("print_text", "Hello Son.")
Son script:
extends Sprite
signal print_text
signal print_num
func _ready():
connect("print_text", self, "on_print_text")
func on_print_text(txt):
print("the text is: ", txt)
func _input(event):
if event.is_action_released("click"):
get_node("/root/Game/Father").emit_signal("print_num", event.position.x)
You can see they can communicate with each other without a tight coupling. Hope that helps.