diff --git a/rust-pvz-genetics/src/genetics/arguments.rs b/rust-pvz-genetics/src/genetics/arguments.rs new file mode 100644 index 0000000..c82f60f --- /dev/null +++ b/rust-pvz-genetics/src/genetics/arguments.rs @@ -0,0 +1,13 @@ +use std::collections::HashMap; + +pub enum Variant { + Int(isize), + Float(f32) +} +pub struct ArgumentList(HashMap); + +/*impl ArgumentList { + pub fn get(name: impl Into) -> Option<&Variant> { + + } +}*/ diff --git a/rust-pvz-genetics/src/genetics/gene.rs b/rust-pvz-genetics/src/genetics/gene.rs index 02eff57..dd20748 100644 --- a/rust-pvz-genetics/src/genetics/gene.rs +++ b/rust-pvz-genetics/src/genetics/gene.rs @@ -6,10 +6,24 @@ pub struct Gene { #[derive(PartialEq,Eq,Clone)] pub enum GeneType { - Producer, - Transport, - Consumer, - Modifier, + PureProducer { + create_flow: fn() + }, + Transport { + distribute_between_children: fn() + }, + Consumer { + consume: fn() + }, + Modifier { + modify_flow: fn() + }, + Trigger { + check_trigger: fn() + }, + Observer { + observe: fn() + }, } impl Gene { @@ -20,3 +34,27 @@ impl Gene { } } } + +impl GeneType { + pub fn pure_producer(flow_function: fn()) -> Self { + Self::PureProducer { create_flow: flow_function } + } + pub fn random_distribution() -> Self { + Self::Transport { distribute_between_children: ||{} } + } + pub fn fill_all() -> Self { + Self::Transport { distribute_between_children: ||{} } + } + pub fn consumer(consumer_function: fn()) -> Self { + Self::Consumer { consume: consumer_function } + } + pub fn modifier(modifier_function: fn()) -> Self { + Self::Modifier { modify_flow: modifier_function } + } + pub fn trigger(trigger_function: fn()) -> Self { + Self::Trigger { check_trigger: trigger_function } + } + pub fn observer(observer_function: fn()) -> Self { + Self::Observer { observe: observer_function } + } +} diff --git a/rust-pvz-genetics/src/genetics/genome_builder.rs b/rust-pvz-genetics/src/genetics/genome_builder.rs index d7dbe31..73f4290 100644 --- a/rust-pvz-genetics/src/genetics/genome_builder.rs +++ b/rust-pvz-genetics/src/genetics/genome_builder.rs @@ -20,6 +20,7 @@ impl GenomeBuilder { } pub fn create_root(mut self, root: Gene) -> Result { + // Check for root existance if self.genome.genes.len() > 0 { return Err(GenomeBuilderError::RootExists); } @@ -29,15 +30,12 @@ impl GenomeBuilder { } pub fn insert_gene(mut self, gene: Gene, parent: Gene) -> Result { + // Check for gene collision if self.genome.genes.contains(&gene){ return Err(GenomeBuilderError::GeneExists); } let edge = Edge::new(parent,gene.clone()); - if self.genome.edges.contains(&edge) { - return Err(GenomeBuilderError::EdgeExists); - } - self.genome.edges.push(edge); self.current_gene = self.genome.genes.len(); @@ -46,10 +44,37 @@ impl GenomeBuilder { Ok(self) } pub fn add_gene(mut self, gene: Gene) -> Result { - if self.genome.genes.len() == 0 { + // Check for root existance + if self.genome.genes.len() == 0 { return Err(GenomeBuilderError::RootDoesntExist); - } - todo!(); + } + // Check for gene collision + if self.genome.genes.contains(&gene){ + return Err(GenomeBuilderError::GeneExists); + } + let edge = Edge::new(self.get_current_gene().clone(),gene.clone()); + self.genome.edges.push(edge); + + self.current_gene = self.genome.genes.len(); + self.genome.genes.push(gene); + + Ok(self) + + } + pub fn back(mut self, amount: Option) -> Self { + for _ in 0..amount.unwrap_or(0) { + + } + self + } + #[inline(always)] + pub fn get_current_gene(&self) -> &Gene { + &self.genome.genes[self.current_gene] + } + + #[inline(always)] + pub fn get_current_gene_mut(&mut self) -> &mut Gene { + &mut self.genome.genes[self.current_gene] } } diff --git a/rust-pvz-genetics/src/genetics/mod.rs b/rust-pvz-genetics/src/genetics/mod.rs index 91e1dc0..1d2e255 100644 --- a/rust-pvz-genetics/src/genetics/mod.rs +++ b/rust-pvz-genetics/src/genetics/mod.rs @@ -5,6 +5,7 @@ pub mod edge; pub mod gene; pub mod genome; pub mod genome_builder; +pub mod arguments; pub mod prelude { pub use crate::genetics::edge::*; diff --git a/rust-pvz-genetics/src/genetics/plant_templates.rs b/rust-pvz-genetics/src/genetics/plant_templates.rs index 6abc0a8..700d66f 100644 --- a/rust-pvz-genetics/src/genetics/plant_templates.rs +++ b/rust-pvz-genetics/src/genetics/plant_templates.rs @@ -2,6 +2,11 @@ use crate::genetics::{genome_builder::GenomeBuilder, prelude::*}; pub fn peashooter_template() -> PlantGenome { GenomeBuilder::new() - .create_root(Gene::new("base", GeneType::Producer)).unwrap() + .create_root(Gene::new("root", GeneType::pure_producer(||{}))).unwrap() + .add_gene(Gene::new("stem", GeneType::fill_all())).unwrap() + .add_gene(Gene::new("head",GeneType::random_distribution())).unwrap() + .add_gene(Gene::new("leaf",GeneType::modifier(||{}))).unwrap() + .back(None) + .add_gene(Gene::new("face",GeneType::consumer(||{}))).unwrap() .finish() }