The behavior tree's execution flow is semi-recursive, so the root node calls on its only child's Execute() function,
which calls on a function in the appropriate function array, which, depending on node type,
does its logic and then calls Execute() on its respective child/children, and so on.
A node returns either Failure, Success, or Running, as is customary for behavior trees.
The first nodes I created were some staples which always should be part of any behavior tree, such as
Sequence, Selector, Failer, Succeeder, Inverter. Then I added some for the gameplay specifically,
such as "move to position", "wait", and "get new target".
Sequence and Move to position seen on the right, with an implementation example from the AI controller in the game.
Over all I am very pleased with how this turned out, and I am in retrospect happy with the restrictions I put on
myself, with no inheritance or heap allocations. They made me think twice about structure, and finding ways around them was a fun challenge.