If I get it correctly, you want to pool template characters, then initialize them on the fly when you change a character in the player's party? Not sure if it's necessary: you could just instantiate new characters on the fly from their inherited scene and queue_free() when you remove him from the party. That way you don't have to handle initializing characters on your own and you make use of Godot's powerful scene/inheritance features.
But it seems possible. If you want to have the nodes ready to use anytime, add them directly to the scene, under a pool node and let a "manager" type of singleton store a reference to them in an array, i.e.:
for node in get_node("Characters").get_children():
array.append(node)
Then it's up to you to decide how you keep track track of who is whom. I'd use a member variable on each of the character like:
var identity = BATMAN
- Pool the instances at the start of the game, and leave them be
- When the character enters the team, loop through the array, break off the loop as soon as you find a character who's identity is null
- Loading the data is trickier. If you write your characters using a dedicated tool, you can easily parse JSON or CSV, get a dictionary, and you'll need a function to initialize everything on your character. It's just like saving and loading the game. Call it, maybe re-parent the character in the tree if you'd like, and set it to process.
But again, I'd just make each character in a [inherited] scene, preload them all at the start of the game, and create instances on the fly. Go with something more complicated only if it appears to be an issue - but you can benchmark it for that.