-
-
Notifications
You must be signed in to change notification settings - Fork 12
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
add: Dynamic changes to Behaviour Patterns at runtime #47
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 :) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The FSM looks good. I'll check the BT later and do some testing!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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
,FSMStateIntegratedBT
andBTIntegratedFSM
nodes now can reconfigure themselves when their children are modified at run-timeBTRoot
to not have any BTBehaviour as a childFiniteStateMachine
to not have any FSMStates as a childrenFiniteStateMachine
to not have a initial stateFSMStateIntegratedBT
to not have any BTRoot as a childBTIntegratedFSM
to not have any FSM as a childBTIntegratedFSM
has 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()
FSMStates
and extended nodes update their transitions list when children are added/removedFSMStateIntegratedBT
disables autostart of its BTRootBTIntegratedFSM
disables autostart of its FSMFSMState
extensible without need to call super() on _ready()BTRandom
extensible without need to call super() on _ready()Changes after review 1
_disable_autostart()
in FSM and BTRootBTRoot
andFSM
set theirautostart
tofalse
and hide them in Editor Inspector if their parent is a integration type nodeBTRoot
andFSM
a @toolBTRoot
andFSM
keep_group
optional 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
FSMState
nodes at run-time first add newFSMStates
stop the FSM with methodFiniteStateMachine.exit_active_state_and_stop
and re-start it with method methodFiniteStateMachine.start
providing one of the new states either as start method property or change memberFiniteStateMachine.initial_state
before runningstart()
. After this procedure you can delete unused states.active
property read-onlystart()
in fsm.gd to acceptFSMState
property as a start pointstart()
FSMStates
and resume running of the FSMif
guards from proccess function and made checks when something changes in the setupBTLeaf
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 ofBTLeaf
for no reason :)