add: Dynamic changes to Behaviour Patterns at runtime#47
add: Dynamic changes to Behaviour Patterns at runtime#47SirPigeonz wants to merge 2 commits intoThePat02:2.0.0from
Conversation
|
Keep in mind that some things might change how everything is handled, since #17 requires every script to be a |
Yup :) I already added few guards with |
e1368a1 to
4898f61
Compare
4898f61 to
99b8ef0
Compare
|
@ThePat02 This time for sure xD |
|
Good work! I'll look into it when I finished implementing #17 to avoid any breaking conflicts. |
Senkyu! :3
Do as you prefer :) That said I tried to test it diligently as I could. Each node was tested alone and with others and main example also runs as used to. What I want the most is it for you to look into the design and tell me what you think and if I missed something, or should change something :) |
ThePat02
left a comment
There was a problem hiding this comment.
The FSM looks good. I'll check the BT later and do some testing!
addons/behaviour_toolkit/finite_state_machine/fsm_state_integrated_bt.gd
Outdated
Show resolved
Hide resolved
addons/behaviour_toolkit/finite_state_machine/fsm_state_integrated_bt.gd
Outdated
Show resolved
Hide resolved
addons/behaviour_toolkit/finite_state_machine/fsm_state_integrated_bt.gd
Outdated
Show resolved
Hide resolved
ThePat02
left a comment
There was a problem hiding this comment.
The FSM looks good. I'll check the BT later and do some testing!
ThePat02
left a comment
There was a problem hiding this comment.
One other thing I noticed: When changing states of a FSM, what happens if you change the active state? Did the current state exit?
Good question! When you change state with We could add method to What do you think? |
|
@ThePat02
|
Well what is the workflow with dynamic changing of nodes? There needs to be some kind of failsafe when changin states manually and via code. |
Ahhh now I understand, sorry 😁 Ok yeah, there should be some safe API to model states the way user needs for their use case. I will think more about it and write my API ideas. |
|
I think it is best to push this feature to a later version of the plugin (possibliy 2.1) as there are some other pitfalls and problems that come with this. I think it is very important to release the new syntax changes, as more and more people are interested in using it. I'd like to avoid problems like people having to rewrite their code with the new syntax too much. |
I'm fine if it will be in 2.1 if you want to release 2.0 early due to changes in API. I use latest code in my game either way. Furthermore, I just finished a bigger commission for a client, so I will have more free time now to work on this and my game. I will probably finish a new version of this PR today or tomorrow. |
6642533 to
b194734
Compare
|
Sounds great. If you need anything, make sure to add me. I'll unsub for now so I don't get notis for every commit! |
b0eab07 to
7984206
Compare
This PR makes both FSM and BTree systems work properly when their nodes are moved, removed, added at runtime. On top of that many nodes are now fine when they don't have important for them nodes as a child or property references. This allows for preparing "empty" slots for intended behaviours or branches and modeling main behaviours with them, that is "slots", in mind. Upcomming warning system can be used instead for important configuration warnings when behaviours are created by hand in the Editor. Changes: - `BTRoot`, `FiniteStateMachine`, `BTComposite`, `BTDecorator`, `FSMStateIntegratedBT` and `BTIntegratedFSM` nodes now can reconfigure themselves when their children are modified at run-time - allow `BTRoot` to not have any BTBehaviour as a child - allow `FiniteStateMachine` to not have any FSMStates as a children - allow `FiniteStateMachine` to not have a initial state - allow `FSMStateIntegratedBT` to not have any BTRoot as a child - allow `BTIntegratedFSM` to not have any FSM as a child - `BTIntegratedFSM` has now default_status property enum for case where it doesn't have FSM child - new method in `BTRoot` - `swap_entry_point()` - new method in `FSMStateIntegratedBT` - `swap_behaviour_tree()` - new method in `BTIntegratedFSM` - `swap_finite_state_machine()` - make `FSMStates` and extended nodes update their transitions list when children are added/removed - `FSMStateIntegratedBT` disables autostart of its BTRoot - `BTIntegratedFSM` disables autostart of its FSM - made `FSMState` extensible without need to call super() on _ready() - made `BTRandom` extensible without need to call super() on _ready() - Added few missing documentation comments, to outline how nodes are intended to work and how they should be edited also at run-time. Changes after review 1 - removed `_disable_autostart()` in FSM and BTRoot - made `BTRoot` and `FSM `set their `autostart` to `false` and hide them in Editor Inspector if their parent is a integration type node - made `BTRoot` and `FSM` a @tool - added Engine.is_engine_hint guards to ready, callbacks and processes for `BTRoot` and `FSM` - added `keep_group` optional property to `swap_'nodetype'()` methods, it allows to preserve original nodes groups from swapped node in the new node Changes after review 2 If you wish to add, remove, move `FSMState` nodes at run-time first add new `FSMStates` stop the FSM with method `FiniteStateMachine.exit_active_state_and_stop` and re-start it with method method `FiniteStateMachine.start` providing one of the new states either as start method property or change member `FiniteStateMachine.initial_state` before running `start()`. After this procedure you can delete unused states. - made `active` property read-only - modified `start()` in fsm.gd to accept `FSMState` property as a start point - new method exit_active_state_and_stop() to pair with `start()` - above two changes make FSM startable and stoppable for example to safely modify `FSMStates` and resume running of the FSM - removed some `if` guards from proccess function and made checks when something changes in the setup - made BTRoot cleanups and made it to not check for entry point in processing - changed some configuration warnings. Mostly changed statement that state "nodes must have child nodes", to "nodes SHOULD have child nodes to work" to inform user that they wont work but nothing bad will happen if they don't - removed warning for `BTLeaf` that "BTLeaf node must not have any children.". Reason is that there is no issue if it has one, it can prevent user to use some nice composition on top of `BTLeaf` for no reason :)
7984206 to
7adf554
Compare
Formatting will format it :)
|
@ThePat02 |
|
I'll take a look at it after finishing up the other changes. BTW I added a formatting action you can steal for your own projects. |
This PR makes both FSM and BTree systems work properly when their nodes are moved, removed, added at runtime.
On top of that many nodes are now fine when they don't have important for them nodes as a child or property references. This allows for preparing "empty" slots for intended behaviours or branches and modeling main behaviours with them, that is "slots", in mind.
Upcomming warning system can be used instead for important configuration warnings when behaviours are created by hand in the Editor.
Changes:
BTRoot,FiniteStateMachine,BTComposite,BTDecorator,FSMStateIntegratedBTandBTIntegratedFSMnodes now can reconfigure themselves when their children are modified at run-timeBTRootto not have any BTBehaviour as a childFiniteStateMachineto not have any FSMStates as a childrenFiniteStateMachineto not have a initial stateFSMStateIntegratedBTto not have any BTRoot as a childBTIntegratedFSMto not have any FSM as a childBTIntegratedFSMhas now default_status property enum for case where it doesn't have FSM childBTRoot-swap_entry_point()FSMStateIntegratedBT-swap_behaviour_tree()BTIntegratedFSM-swap_finite_state_machine()FSMStatesand extended nodes update their transitions list when children are added/removedFSMStateIntegratedBTdisables autostart of its BTRootBTIntegratedFSMdisables autostart of its FSMFSMStateextensible without need to call super() on _ready()BTRandomextensible without need to call super() on _ready()Changes after review 1
_disable_autostart()in FSM and BTRootBTRootandFSMset theirautostarttofalseand hide them in Editor Inspector if their parent is a integration type nodeBTRootandFSMa @toolBTRootandFSMkeep_groupoptional property toswap_'nodetype'()methods, it allows to preserve original nodes groups from swapped node in the new nodeChanges after review 2
If you wish to add, remove, move
FSMStatenodes at run-time first add newFSMStatesstop the FSM with methodFiniteStateMachine.exit_active_state_and_stopand re-start it with method methodFiniteStateMachine.startproviding one of the new states either as start method property or change memberFiniteStateMachine.initial_statebefore runningstart(). After this procedure you can delete unused states.activeproperty read-onlystart()in fsm.gd to acceptFSMStateproperty as a start pointstart()FSMStatesand resume running of the FSMifguards from proccess function and made checks when something changes in the setupBTLeafthat "BTLeaf node must not have any children.". Reason is that there is no issue if it has one, it can prevent user to use some nice composition on top ofBTLeaffor no reason :)