Skip to main content

PlanExecutor

Struct PlanExecutor 

Source
pub struct PlanExecutor {
    pub state: ExecutorState,
    pub max_depth: usize,
    pub sim_time: f32,
    pub replan_count: u32,
    pub max_replans: u32,
    pub history: Vec<String>,
    /* private fields */
}
Expand description

Drives execution of a GOAP plan, applying each action’s effects to the simulated world state, and replanning when the actual state diverges from the expected state.

§Replanning policy

After each action completes, the executor compares the observed world state (provided by the game) against the expected state (computed by applying planned effects). If they differ in any condition that the next action cares about, the executor discards the remainder of the plan and calls the planner again.

§Interruption

An external caller can call PlanExecutor::interrupt at any time. The current step is marked Interrupted and the executor transitions to the Interrupted state. The caller may then push a new goal and call PlanExecutor::start to begin fresh.

Fields§

§state: ExecutorState

Current executor state.

§max_depth: usize

Maximum plan depth for the A* search.

§sim_time: f32

Total simulation time elapsed.

§replan_count: u32

How many times the executor has replanned this goal.

§max_replans: u32

Maximum replanning attempts before giving up.

§history: Vec<String>

Log of completed action names in order.

Implementations§

Source§

impl PlanExecutor

Source

pub fn new(actions: Vec<Action>, max_depth: usize) -> Self

Source

pub fn set_world_state(&mut self, state: WorldState)

Set the initial world state.

Source

pub fn update_bool(&mut self, key: &str, value: bool)

Update a single bool condition in the simulated world state.

Source

pub fn update_float(&mut self, key: &str, value: f32)

Update a single float condition in the simulated world state.

Source

pub fn start(&mut self, goal: WorldState) -> Result<usize, PlanError>

Push a new goal and (re)plan immediately.

Returns Ok(plan_length) on success or Err if no plan exists.

Source

pub fn interrupt(&mut self)

Interrupt the current plan.

Source

pub fn tick( &mut self, dt: f32, observe_state: impl Fn(&WorldState) -> WorldState, ) -> Option<&str>

Tick the executor by dt seconds.

observe_state should return the current observed world state, incorporating any changes that happened outside the planner (e.g. enemy died unexpectedly, health changed).

Returns the name of the action that should be executing this tick, or None if idle/finished.

Source

pub fn current_action(&self) -> Option<&str>

The name of the action currently executing, if any.

Source

pub fn plan_names(&self) -> Vec<&str>

The full current plan as action names.

Source

pub fn progress(&self) -> (usize, usize)

Progress through the current plan: (completed_steps, total_steps).

Source

pub fn has_succeeded(&self) -> bool

True if the executor has successfully completed its goal.

Source

pub fn has_failed(&self) -> bool

True if the executor has permanently failed.

Source

pub fn reset(&mut self)

Reset the executor to idle without changing the action library.

Source

pub fn world_state(&self) -> &WorldState

Access the current simulated world state.

Trait Implementations§

Source§

impl Debug for PlanExecutor

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<S> FromSample<S> for S

Source§

fn from_sample_(s: S) -> S

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> ToSample<U> for T
where U: FromSample<T>,

Source§

fn to_sample_(self) -> U

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<S, T> Duplex<S> for T
where T: FromSample<S> + ToSample<S>,