diff --git a/big-brain-derive/src/lib.rs b/big-brain-derive/src/lib.rs index 0b9aaaf7a52dd6ebf904f0e4a88f7db55c82d692..24e9d814afefa51c255498c57ae2d56e49940699 100644 --- a/big-brain-derive/src/lib.rs +++ b/big-brain-derive/src/lib.rs @@ -3,10 +3,10 @@ use quote::quote; use syn::{parse_macro_input, DeriveInput}; use action::Action; -use consideration::Consideration; +use scorer::Scorer; mod action; -mod consideration; +mod scorer; /** `Action`s in `big-brain` are defined through this derive macro. Once defined, @@ -198,9 +198,9 @@ impl<'a> System<'a> for ConsiderHunger { ) ``` */ -#[proc_macro_derive(Consideration, attributes(consideration))] -pub fn derive_consideration_builder(input: proc_macro::TokenStream) -> proc_macro::TokenStream { +#[proc_macro_derive(Scorer, attributes(scorer))] +pub fn derive_scorer_builder(input: proc_macro::TokenStream) -> proc_macro::TokenStream { let input = parse_macro_input!(input as DeriveInput); - let consideration = Consideration::from_derive_input(&input).unwrap(); - (quote!(#consideration)).into() + let scorer = Scorer::from_derive_input(&input).unwrap(); + (quote!(#scorer)).into() } diff --git a/big-brain-derive/src/consideration.rs b/big-brain-derive/src/scorer.rs similarity index 77% rename from big-brain-derive/src/consideration.rs rename to big-brain-derive/src/scorer.rs index c73564805677f02f55aa2735394c00b6e9d0cc76..824dd10e650668e83ece7ab1113c74beb33d9e5c 100644 --- a/big-brain-derive/src/consideration.rs +++ b/big-brain-derive/src/scorer.rs @@ -3,16 +3,16 @@ use proc_macro2::TokenStream; use quote::quote; #[derive(Debug, FromDeriveInput)] -#[darling(attributes(consideration), supports(struct_named))] -pub struct Consideration { +#[darling(attributes(scorer))] +pub struct Scorer { ident: syn::Ident, generics: syn::Generics, - data: ast::Data<(), ConsiderationField>, + data: ast::Data<(), ScorerField>, } #[derive(Debug, FromField)] -#[darling(attributes(consideration))] -struct ConsiderationField { +#[darling(attributes(scorer))] +struct ScorerField { ident: Option<syn::Ident>, ty: syn::Type, #[darling(default)] @@ -21,9 +21,9 @@ struct ConsiderationField { default: bool, } -impl ToTokens for Consideration { +impl ToTokens for Scorer { fn to_tokens(&self, tokens: &mut TokenStream) { - let Consideration { + let Scorer { ref ident, ref data, .. @@ -34,7 +34,7 @@ impl ToTokens for Consideration { .expect("Enums not supported") .fields; let field_defs = fields.clone().into_iter().filter_map(|field| { - let ConsiderationField { + let ScorerField { ident, ty, param, .. } = field; let ident = ident.clone().unwrap(); @@ -45,7 +45,7 @@ impl ToTokens for Consideration { } }); let field_assignments = fields.into_iter().map(|field| { - let ConsiderationField { + let ScorerField { ident, param, default, @@ -69,10 +69,10 @@ impl ToTokens for Consideration { } }); let ts = quote! { - mod big_brain_cons_builder { + mod big_brain_scorer_builder { use super::#ident as Comp; - use big_brain::{typetag, serde::Deserialize, Consideration, bevy::prelude::*, ConsiderationEnt}; + use big_brain::{typetag, serde::Deserialize, Scorer, bevy::prelude::*, ScorerEnt}; // use typetag; #[derive(Debug, Deserialize)] @@ -80,11 +80,11 @@ impl ToTokens for Consideration { #(#field_defs),* } #[typetag::deserialize] - impl Consideration for #ident { - fn build(&self, actor: Entity, cmd: &mut Commands) -> ConsiderationEnt { - let ent = ConsiderationEnt(cmd.spawn().id()); + impl Scorer for #ident { + fn build(&self, actor: Entity, cmd: &mut Commands) -> ScorerEnt { + let ent = ScorerEnt(cmd.spawn().id()); cmd.entity(ent.0) - .insert(big_brain::Utility::default()) + .insert(big_brain::Score::default()) .insert(Comp { #(#field_assignments),* }); diff --git a/examples/thirst.rs b/examples/thirst.rs index 34ce2315f138641ca830f638c33eb45edd58a429..7c30b46be7f72f0071389ffb233a1410978002a1 100644 --- a/examples/thirst.rs +++ b/examples/thirst.rs @@ -20,9 +20,7 @@ impl Thirst { pub fn thirst_system(time: Res<Time>, mut thirsts: Query<&mut Thirst>) { for mut thirst in thirsts.iter_mut() { - thirst.thirst += - thirst.per_second * (time.delta().as_micros() as f32 / 1000000.0); - println!("Getting thirstier...{}%", thirst.thirst); + thirst.thirst += thirst.per_second * (time.delta().as_micros() as f32 / 1000000.0); } } @@ -76,29 +74,29 @@ fn drink_action_system( } } -// Then, we have something called "Considerations". These are special -// components that run in the background, calculating a "Utility" value, which -// is what Big Brain will use to pick which actions to execute. +// Then, we have something called "Scorers". These are special components that +// run in the background, calculating a "Score" value, which is what Big Brain +// will use to pick which actions to execute. // // Additionally, though, we pull in an evaluator and define a weight. Which is // just mathy stuff you can tweak to get the behavior you want. More on this // in the docs (later), but for now, just put them in there and trust the // system. :) -#[derive(Debug, Consideration)] -pub struct ThirstConsideration { - #[consideration(default)] +#[derive(Debug, Scorer)] +pub struct ScoreThirst { + #[scorer(default)] pub evaluator: PowerEvaluator, - #[consideration(param)] + #[scorer(param)] pub weight: f32, } // Look familiar? Similar dance to Actions here. -pub fn thirst_consideration_system( +pub fn score_thirst_system( thirsts: Query<&Thirst>, // Same dance with the Parent here, but now we've added a Utility! - mut query: Query<(&Parent, &ThirstConsideration, &mut Utility)>, + mut query: Query<(&Parent, &ScoreThirst, &mut Score)>, ) { - for (Parent(actor), conser, mut util) in query.iter_mut() { + for (Parent(actor), scorer, mut score) in query.iter_mut() { if let Ok(thirst) = thirsts.get(*actor) { // This is really what the job of a Consideration is. To calculate // a generic Utility value that the Big Brain engine will compare @@ -111,9 +109,9 @@ pub fn thirst_consideration_system( // literally just use linear values here and set thresholds // accordingly. The evaluator is just there to give the value a // bit of a curve. - *util = Utility { - value: conser.evaluator.evaluate(thirst.thirst), - weight: conser.weight, + *score = Score { + value: scorer.evaluator.evaluate(thirst.thirst), + weight: scorer.weight, }; } } @@ -157,7 +155,7 @@ fn main() { .add_plugin(BigBrainPlugin) .add_startup_system(init_entities.system()) .add_system(thirst_system.system()) - .add_system(thirst_consideration_system.system()) + .add_system(score_thirst_system.system()) .add_system(drink_action_system.system()) .run(); } diff --git a/src/choices.rs b/src/choices.rs index efd21c1a0050aec136519cb2253cf9d4e44b22db..8bd5103c219293e7b4ba14457debe358ca722fb1 100644 --- a/src/choices.rs +++ b/src/choices.rs @@ -3,20 +3,20 @@ use serde::Deserialize; use crate::{ actions::{Action, ActionState}, - considerations::{Consideration, Utility}, + scorers::{Scorer, Score}, measures::{Measure, WeightedMeasure}, - thinker::{ActionEnt, ConsiderationEnt}, + thinker::{ActionEnt, ScorerEnt}, }; // Contains different types of Considerations and Actions #[derive(Debug)] pub struct Choice { pub measure: Box<dyn Measure>, - pub utilities: Vec<ConsiderationEnt>, + pub utilities: Vec<ScorerEnt>, pub action_state: ActionEnt, } impl Choice { - pub fn calculate(&self, utilities: &Query<&Utility>) -> f32 { + pub fn calculate(&self, utilities: &Query<&Score>) -> f32 { self.measure.calculate( self.utilities .iter() @@ -32,7 +32,7 @@ impl Choice { #[derive(Debug, Deserialize)] pub struct ChoiceBuilder { - pub consider: Vec<Box<dyn Consideration>>, + pub consider: Vec<Box<dyn Scorer>>, pub then: Box<dyn Action>, } impl ChoiceBuilder { diff --git a/src/lib.rs b/src/lib.rs index 22991884280d549036d344d01d276fc3625dbd39..7aa262de456350631786e9d198819388a83e296b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,7 +5,7 @@ pub use typetag; pub use actions::*; pub use choices::*; -pub use considerations::*; +pub use scorers::*; pub use thinker::*; pub mod evaluators; @@ -14,7 +14,7 @@ pub mod pickers; mod actions; mod choices; -mod considerations; +mod scorers; mod thinker; use bevy::prelude::*; diff --git a/src/measures.rs b/src/measures.rs index 7866ef3c8274cc21c2908dd9e8d368f65a84beaf..57f914473f3c4d4bdba1797c0c122c0999593316 100644 --- a/src/measures.rs +++ b/src/measures.rs @@ -1,10 +1,10 @@ use serde::{Deserialize, Serialize}; -use crate::Utility; +use crate::Score; #[typetag::serde] pub trait Measure: std::fmt::Debug + Sync + Send { - fn calculate(&self, utilities: Vec<&Utility>) -> f32; + fn calculate(&self, utilities: Vec<&Score>) -> f32; } #[derive(Debug, Clone, Default, Serialize, Deserialize)] @@ -12,7 +12,7 @@ pub struct WeightedMeasure; #[typetag::serde] impl Measure for WeightedMeasure { - fn calculate(&self, utilities: Vec<&Utility>) -> f32 { + fn calculate(&self, utilities: Vec<&Score>) -> f32 { let wsum: f32 = utilities.iter().map(|el| el.weight).sum(); if wsum == 0.0 { 0.0 diff --git a/src/pickers.rs b/src/pickers.rs index 463ab5a6ac51c1c31f290ade56459b435f7b19fa..468e7a14e96f2ffcdefa1871eed96650ec8fb9f4 100644 --- a/src/pickers.rs +++ b/src/pickers.rs @@ -2,11 +2,11 @@ use bevy::prelude::*; use serde::{Deserialize, Serialize}; -use crate::{choices::Choice, considerations::Utility, thinker::ActionEnt}; +use crate::{choices::Choice, scorers::Score, thinker::ActionEnt}; #[typetag::serde] pub trait Picker: std::fmt::Debug + Sync + Send { - fn pick(&self, _choices: &[Choice], _utilities: &Query<&Utility>) -> Option<ActionEnt>; + fn pick(&self, _choices: &[Choice], _utilities: &Query<&Score>) -> Option<ActionEnt>; } #[derive(Debug, Clone, Default, Serialize, Deserialize)] @@ -16,7 +16,7 @@ pub struct FirstToScore { #[typetag::serde] impl Picker for FirstToScore { - fn pick(&self, choices: &[Choice], utilities: &Query<&Utility>) -> Option<ActionEnt> { + fn pick(&self, choices: &[Choice], utilities: &Query<&Score>) -> Option<ActionEnt> { for choice in choices { let value = choice.calculate(utilities); if value >= self.threshold { diff --git a/src/considerations.rs b/src/scorers.rs similarity index 58% rename from src/considerations.rs rename to src/scorers.rs index 78687d8993f28a7b411bc7406363a6e72dcfa5c6..7f80f24c64f8db6b3ec4055a9b59a5b2220c29f9 100644 --- a/src/considerations.rs +++ b/src/scorers.rs @@ -1,9 +1,9 @@ use bevy::prelude::*; -use crate::ConsiderationEnt; +use crate::ScorerEnt; #[derive(Debug, Clone, Default)] -pub struct Utility { +pub struct Score { pub value: f32, pub weight: f32, } @@ -12,6 +12,6 @@ pub struct Utility { This trait defines new considerations. In general, you should use the [derive macro](derive.Consideration.html) instead. */ #[typetag::deserialize] -pub trait Consideration: std::fmt::Debug + Sync + Send { - fn build(&self, entity: Entity, cmd: &mut Commands) -> ConsiderationEnt; +pub trait Scorer: std::fmt::Debug + Sync + Send { + fn build(&self, entity: Entity, cmd: &mut Commands) -> ScorerEnt; } diff --git a/src/thinker.rs b/src/thinker.rs index 41c979a087bc0b3ec48e1edf66fd32f4c31122ec..d4ef4ddc9be35d953255d7385d97815e80e95cb5 100644 --- a/src/thinker.rs +++ b/src/thinker.rs @@ -8,7 +8,7 @@ use serde::Deserialize; use crate::{ actions::{self, Action, ActionManager, ActionManagerWrapper, ActionState}, choices::{Choice, ChoiceBuilder}, - considerations::Utility, + scorers::Score, pickers::Picker, }; @@ -16,7 +16,7 @@ use crate::{ pub struct ActionEnt(pub Entity); #[derive(Debug, Clone, Copy)] -pub struct ConsiderationEnt(pub Entity); +pub struct ScorerEnt(pub Entity); #[derive(Debug)] pub struct Thinker { @@ -123,7 +123,7 @@ pub fn thinker_system( mut cmd: Commands, mut iterations: Local<ThinkerIterations>, mut thinker_q: Query<(Entity, &Parent, &mut Thinker, &ActiveThinker)>, - utilities: Query<&Utility>, + utilities: Query<&Score>, mut action_states: Query<&mut actions::ActionState>, builder_wrappers: Query<&ActionManagerWrapper>, ) {