Skip to content
Snippets Groups Projects
choices.rs 1.34 KiB
Newer Older
use bevy::prelude::*;
Kat Marchán's avatar
Kat Marchán committed
use serde::Deserialize;

use crate::{
    actions::{Action, ActionState},
    scorers::{Scorer, Score},
Kat Marchán's avatar
Kat Marchán committed
    measures::{Measure, WeightedMeasure},
    thinker::{ActionEnt, ScorerEnt},
Kat Marchán's avatar
Kat Marchán committed
};

// Contains different types of Considerations and Actions
#[derive(Debug)]
pub struct Choice {
    pub measure: Box<dyn Measure>,
    pub utilities: Vec<ScorerEnt>,
Kat Marchán's avatar
Kat Marchán committed
    pub action_state: ActionEnt,
}
impl Choice {
    pub fn calculate(&self, utilities: &Query<&Score>) -> f32 {
Kat Marchán's avatar
Kat Marchán committed
        self.measure.calculate(
            self.utilities
                .iter()
                .map(|choice_cons| {
                    utilities
                        .get(choice_cons.0)
Kat Marchán's avatar
Kat Marchán committed
                        .expect("Where did the utility go?")
                })
                .collect(),
        )
    }
}

#[derive(Debug, Deserialize)]
pub struct ChoiceBuilder {
    pub consider: Vec<Box<dyn Scorer>>,
Kat Marchán's avatar
Kat Marchán committed
    pub then: Box<dyn Action>,
}
impl ChoiceBuilder {
    pub fn build(self, actor: Entity, cmd: &mut Commands) -> Choice {
Kat Marchán's avatar
Kat Marchán committed
        let action = self.then;
        Choice {
            measure: Box::new(WeightedMeasure),
            utilities: self
                .consider
                .iter()
                .map(|cons| cons.build(actor, cmd))
Kat Marchán's avatar
Kat Marchán committed
                .collect(),
            action_state: ActionState::build(action, actor, cmd),