Comments (8)
This is working as intended. FirstToScore means "every cycle, check from top to bottom, and pick the first item that scores above the threshold". If that item changes between cycles, the cancellation will happen. The picker is about which action is picked on every individual test, not between action runs.
from big-brain.
I think your best bet for this one is to create a Steps that forces completion of all the steps, but this whole thing pushes a little against the default model of "you will only continue doing things as long as they still make sense to you"
from big-brain.
Got it, thanks for clarifying that! I wonder how it would be possible to implement it so that it would behave as I'd like? Should I try to implement a custom Picker that would achieve that? Or is there a better/simpler way?
from big-brain.
@ZilvinasAbr unless I'm missing something, you shouldn't need to implement a custom picker or anything: move_and_eat
should continue executing until you set the action state to either ActionState::Success
or ActionState::Failure
. You will receive ActionState::Cancelled
when the thinker cancels the action, but the "next" action won't be executed until you've completed the current one, so it's your choice when the next one actually starts. Would that work?
from big-brain.
Ok, so I tried to do this:
ActionState::Executing | ActionState::Cancelled => {
for all the actions (eat food,drink water and go to food/water). Essentially, finishing the current action even if thinker tries to cancel it. But now the issue is that I don't know how to enforce that a multi step action would be completed before moving to do another multi step action.
E.g.
- thirst: 0.4, hunger: 0.8
go to food
action executing- while it is executing, thirst reaches 0.8
- Thinker tries to cancel
go to food
action, but we are still trying to complete it before cancelling. - Human reaches
food
, but the stepeat food
does not get executed because the whole multistep action got cancelled. go to water
action starts execution.
from big-brain.
You should take ActionState::Cancelled
as a sign that some cancellation has been requested and act accordingly, instead of continuing as if it never happened. It means "wrap up your work". If you treat it that way, it should behave as you want it to, I think, in the bigger picture.
from big-brain.
I think I'm having a similar issue as @ZilvinasAbr and apologies if I don't understand the internals properly.
There is a set of Action steps that shouldn't be cancelled, and FirstToScore is cancelling it. I want the whole Steps
to complete before a new action is evaluated.
Maybe another option is to somehow ignore the CancelledState and be able to complete the Action and the steps afterwards. e.g. ActionState::Cancelled => *state = ActionState::Continue
My use case is a little ant colony:
AntType::Scout => Thinker::build()
.label("ScoutThinker")
.picker(FirstToScore { threshold: 0.5 })
.when(HungryScorer, eat_food())
.otherwise(discover_food_and_offer_to_the_queen_steps()),
pub fn eat_food() -> StepsBuilder {
Steps::build()
.label("Eat")
.step(SetPathToStoredFoodAction)
.step(PathfindingAction)
.step(EatAction::default())
}
pub fn discover_food_and_offer_to_the_queen_steps() -> StepsBuilder {
Steps::build()
.label("DiscoverFood")
.step(SetPathToRandomOutsideAction)
.step(PathfindingAction)
.step(MapTransitionAction::exit())
.step(OutsideMapDiscoveringNewFoodAction::default())
.step(MapTransitionAction::enter())
.step(SetPathToQueenAction)
.step(PathfindingAction)
.step(OfferFoodDiscoveryToQueenAction)
}
For example, when the DiscoverFood Steps
is cancelled half way because of HungryScorer, I couldn't find a way to complete all the steps.
from big-brain.
I ran into the same confusion. I have two scorers that are multi step with Drink being one of the actions. If the drink quenches thirst over multiple frames then Drink Until thirst = x doesn’t work because another scorer comes in higher so the actor stops drinking. Then thirst quickly scores higher again and it goes back to drinking quickly.
I think some of the confusion is the example “drink until” gives people the impression the actor will do nothing else until it’s drunk enough to reach the desired threshold.
I assume the way to handle this is in the scorers to add some logic to the thirst scorer. Score thirst low until it hits say 0.8 BUT if the actor is currently drinking then even if thirst is lower score it higher.
from big-brain.
Related Issues (20)
- Debugging and logging HOT 4
- Support Bevy 0.9 HOT 1
- Require deriving explicitly `ActionBuilder` or `ScorerBuilder` HOT 2
- Implement Reflect
- Allow thinker to restart a given action
- Stop action_builders on entity despawn
- Thinker `ThinkerIterations` question HOT 3
- Combining scorers produces incorrect behavior
- Crate docs mention bevy 0.9 not 0.11 HOT 1
- Ability to support generics in ActionBuilder derived Component struct. HOT 1
- Make big-brain Game Engine independent HOT 1
- Need guide for real beginner HOT 2
- Ability for the Action to modify the Scorer Entity? HOT 4
- Make `ThinkerBuilder` be `Clone`
- Alt design pattern with In Out Systems HOT 1
- docs.rs build failing for version 0.19.0 HOT 6
- Bevy 0.13 HOT 2
- Thirsty example broken in 0.19.0 HOT 11
- MAINTAINER open to adding others? HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from big-brain.