From 264a8d972374306212f6ab364dcd8f8ee61b0dea Mon Sep 17 00:00:00 2001 From: rendo Date: Wed, 1 Apr 2026 09:06:25 +0500 Subject: [PATCH] Gene source and serde --- rust-pvz-genetics/Cargo.lock | 2 ++ rust-pvz-genetics/Cargo.toml | 1 + rust-pvz-genetics/src/genetics/gene.rs | 29 +++++++++++++++--- .../src/genetics/plant_templates.rs | 30 +++++++++---------- rust-pvz-genetics/src/genetics/tests.rs | 24 +++++++-------- 5 files changed, 55 insertions(+), 31 deletions(-) diff --git a/rust-pvz-genetics/Cargo.lock b/rust-pvz-genetics/Cargo.lock index 9292de9..0e71028 100644 --- a/rust-pvz-genetics/Cargo.lock +++ b/rust-pvz-genetics/Cargo.lock @@ -333,6 +333,7 @@ version = "0.1.0" dependencies = [ "godot", "rand", + "serde", ] [[package]] @@ -348,6 +349,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", + "serde_derive", ] [[package]] diff --git a/rust-pvz-genetics/Cargo.toml b/rust-pvz-genetics/Cargo.toml index 0462e89..86b8d32 100644 --- a/rust-pvz-genetics/Cargo.toml +++ b/rust-pvz-genetics/Cargo.toml @@ -6,6 +6,7 @@ edition = "2024" [dependencies] godot = "0.4.5" rand = "0.10.0" +serde = { version = "1.0.228", features = ["derive"] } [lib] crate-type = ["cdylib"] diff --git a/rust-pvz-genetics/src/genetics/gene.rs b/rust-pvz-genetics/src/genetics/gene.rs index e52089e..b24436a 100644 --- a/rust-pvz-genetics/src/genetics/gene.rs +++ b/rust-pvz-genetics/src/genetics/gene.rs @@ -4,7 +4,7 @@ use crate::genetics::flow::Flow; #[derive(PartialEq,Eq,Clone)] pub struct Gene { - pub plant_name: String, + pub plant_source: GeneSource, pub place: String, pub kind: GeneType } @@ -13,6 +13,14 @@ pub struct GeneContext { pub flow: Flow } +#[derive(PartialEq,Eq,Clone,Copy)] +pub enum GeneSource { + Peashooter, + Sunflower, + CherryBomb, + PotatoMine, +} + /// GeneType is an enum that defines behaviour of gene. #[derive(PartialEq,Eq,Clone)] pub enum GeneType { @@ -67,18 +75,30 @@ pub enum ProduceDecision { } impl Gene { - pub fn new(plant_str: impl Into, place_str: impl Into, kind: GeneType) -> Self { + pub fn new(plant_source: GeneSource, place_str: impl Into, kind: GeneType) -> Self { Self { - plant_name: plant_str.into(), + plant_source, place: place_str.into(), kind, } } } +impl Display for GeneSource { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f,"{}",match self { + GeneSource::Peashooter => "Peashooter", + GeneSource::Sunflower => "Sunflower", + GeneSource::CherryBomb => "CherryBomb", + GeneSource::PotatoMine => "PotatoMine", + }); + Ok(()) + } +} + impl Display for Gene { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f,"({}) {}",self.plant_name,self.place); + write!(f,"({}) {}",self.plant_source,self.place); Ok(()) } } @@ -121,3 +141,4 @@ impl GeneType { ChildDistribution::All } } + diff --git a/rust-pvz-genetics/src/genetics/plant_templates.rs b/rust-pvz-genetics/src/genetics/plant_templates.rs index ae91664..ae9ed56 100644 --- a/rust-pvz-genetics/src/genetics/plant_templates.rs +++ b/rust-pvz-genetics/src/genetics/plant_templates.rs @@ -1,12 +1,12 @@ -use crate::genetics::{flow::Flow, prelude::*}; +use crate::genetics::{gene::GeneSource,flow::Flow, prelude::*}; pub fn peashooter_template() -> Genome { Genome::from_edges(vec![ - Gene::new("Peashooter","root", GeneType::pure_producer(|_|{Flow::empty()})), - Gene::new("Peashooter","stem", GeneType::fill_all()), - Gene::new("Peashooter","head",GeneType::random_distribution()), - Gene::new("Peashooter","leaf",GeneType::modifier(|_|{Flow::empty()})), - Gene::new("Peashooter","face",GeneType::consumer(|_|{})) + Gene::new(GeneSource::Peashooter,"root", GeneType::pure_producer(|_|{Flow::empty()})), + Gene::new(GeneSource::Peashooter,"stem", GeneType::fill_all()), + Gene::new(GeneSource::Peashooter,"head",GeneType::random_distribution()), + Gene::new(GeneSource::Peashooter,"leaf",GeneType::modifier(|_|{Flow::empty()})), + Gene::new(GeneSource::Peashooter,"face",GeneType::consumer(|_|{})) ],vec![ (0,1), (1,2), @@ -17,10 +17,10 @@ pub fn peashooter_template() -> Genome { pub fn sunflower_template() -> Genome { Genome::from_edges(vec![ - Gene::new("Sunflower","root", GeneType::Dummy), - Gene::new("Sunflower","stem", GeneType::Dummy), - Gene::new("Sunflower","head", GeneType::modifier(|_|{Flow::empty()})), - Gene::new("Sunflower","face", GeneType::consumer(|_|{})), + Gene::new(GeneSource::Sunflower,"root", GeneType::Dummy), + Gene::new(GeneSource::Sunflower,"stem", GeneType::Dummy), + Gene::new(GeneSource::Sunflower,"head", GeneType::modifier(|_|{Flow::empty()})), + Gene::new(GeneSource::Sunflower,"face", GeneType::consumer(|_|{})), ], vec![ (0,1), (1,2), @@ -30,11 +30,11 @@ pub fn sunflower_template() -> Genome { pub fn cherry_bomb_template() -> Genome { Genome::from_edges(vec![ - Gene::new("Cherry bomb","root", GeneType::modifier(|_|{Flow::empty()})), - Gene::new("Cherry bomb","head", GeneType::consumer(|_|{})), - Gene::new("Cherry bomb","head", GeneType::consumer(|_|{})), - Gene::new("Cherry bomb","face", GeneType::Dummy), - Gene::new("Cherry bomb","face", GeneType::Dummy), + Gene::new(GeneSource::CherryBomb,"root", GeneType::modifier(|_|{Flow::empty()})), + Gene::new(GeneSource::CherryBomb,"head", GeneType::consumer(|_|{})), + Gene::new(GeneSource::CherryBomb,"head", GeneType::consumer(|_|{})), + Gene::new(GeneSource::CherryBomb,"face", GeneType::Dummy), + Gene::new(GeneSource::CherryBomb,"face", GeneType::Dummy), ], vec![ (0,1), (0,2), diff --git a/rust-pvz-genetics/src/genetics/tests.rs b/rust-pvz-genetics/src/genetics/tests.rs index 2b8e627..be0ac93 100644 --- a/rust-pvz-genetics/src/genetics/tests.rs +++ b/rust-pvz-genetics/src/genetics/tests.rs @@ -1,4 +1,4 @@ -use crate::genetics::{flow::Flow, gene::{Gene, GeneType}, genome::Genome, manipulations::PairGenomeModificator, plant_templates::{peashooter_template, sunflower_template}}; +use crate::genetics::{flow::Flow, gene::{Gene, GeneType,GeneSource}, genome::Genome, manipulations::PairGenomeModificator, plant_templates::{peashooter_template, sunflower_template}}; #[test] fn test_display() { @@ -11,8 +11,8 @@ fn test_allelic_crossingover() { let mut peashooter = peashooter_template(); let mut sunflower = sunflower_template(); - println!("Peashooter:\n{}",peashooter); - println!("Sunflower:\n{}",sunflower); + println!("Peashooter\n{}",peashooter); + println!("Sunflower\n{}",sunflower); (peashooter,sunflower) = PairGenomeModificator::with_seed(peashooter, sunflower,3996684975687038250u64).allelic_crossingover(None); @@ -20,11 +20,11 @@ fn test_allelic_crossingover() { println!("Sunflower:\n{}",sunflower); assert!(peashooter.to_string() == Genome::from_edges(vec![ - Gene::new("Sunflower","root", GeneType::Dummy), - Gene::new("Peashooter","stem", GeneType::fill_all()), - Gene::new("Peashooter","head",GeneType::random_distribution()), - Gene::new("Sunflower","face", GeneType::consumer(|_|{})), - Gene::new("Peashooter","face",GeneType::consumer(|_|{})) + Gene::new(GeneSource::Sunflower,"root", GeneType::Dummy), + Gene::new(GeneSource::Peashooter,"stem", GeneType::fill_all()), + Gene::new(GeneSource::Peashooter,"head",GeneType::random_distribution()), + Gene::new(GeneSource::Sunflower,"face", GeneType::consumer(|_|{})), + Gene::new(GeneSource::Peashooter,"face",GeneType::consumer(|_|{})) ],vec![ (0,1), (1,2), @@ -33,10 +33,10 @@ fn test_allelic_crossingover() { ]).unwrap().to_string()); assert!(sunflower.to_string() == Genome::from_edges(vec![ - Gene::new("Peashooter","root", GeneType::pure_producer(|_|{Flow::empty()})), - Gene::new("Sunflower","stem", GeneType::Dummy), - Gene::new("Sunflower","head", GeneType::modifier(|_|{Flow::empty()})), - Gene::new("Peashooter","leaf",GeneType::modifier(|_|{Flow::empty()})), + Gene::new(GeneSource::Peashooter,"root", GeneType::pure_producer(|_|{Flow::empty()})), + Gene::new(GeneSource::Sunflower,"stem", GeneType::Dummy), + Gene::new(GeneSource::Sunflower,"head", GeneType::modifier(|_|{Flow::empty()})), + Gene::new(GeneSource::Peashooter,"leaf",GeneType::modifier(|_|{Flow::empty()})), ], vec![ (0,1), (1,2),