diff --git a/rust-pvz-genetics/src/genetics/gene/mod.rs b/rust-pvz-genetics/src/genetics/gene/mod.rs index a2f79c1..09914e4 100644 --- a/rust-pvz-genetics/src/genetics/gene/mod.rs +++ b/rust-pvz-genetics/src/genetics/gene/mod.rs @@ -15,7 +15,7 @@ pub struct Gene { pub place: GenePlace, pub kind: GeneType, pub sprite: Option, - pub get_child_position: fn(GeneType) -> Vector2 + pub get_child_position: fn(GenePlace) -> Vector2 } impl Gene { @@ -28,7 +28,7 @@ impl Gene { get_child_position: |_| Vector2::ZERO, } } - pub fn structural(plant_source: GeneSource, place: GenePlace, kind: GeneType, get_child_position: fn(GeneType) -> Vector2) -> Self { + pub fn structural(plant_source: GeneSource, place: GenePlace, kind: GeneType, get_child_position: fn(GenePlace) -> Vector2) -> Self { Self { plant_source, place, @@ -46,7 +46,7 @@ impl Gene { get_child_position: |_| Vector2::ZERO, } } - pub fn new(plant_source: GeneSource, place: GenePlace, kind: GeneType, sprite: String, get_child_position: fn(GeneType) -> Vector2) -> Self { + pub fn new(plant_source: GeneSource, place: GenePlace, kind: GeneType, sprite: String, get_child_position: fn(GenePlace) -> Vector2) -> Self { Self { plant_source, place, diff --git a/rust-pvz-genetics/src/genetics/plants/peashooter.rs b/rust-pvz-genetics/src/genetics/plants/peashooter.rs index 336818b..34883e9 100644 --- a/rust-pvz-genetics/src/genetics/plants/peashooter.rs +++ b/rust-pvz-genetics/src/genetics/plants/peashooter.rs @@ -1,27 +1,43 @@ -use crate::genetics::{gene::{Gene, GenePlace}, genome::Genome}; +use crate::genetics::{gene::{Gene, GenePlace, GeneSource, GeneType}, genome::Genome}; use godot::builtin::Vector2; pub fn peashooter_template() -> Genome { Genome::from_edges(vec![ - Gene::new() + Gene::new(GeneSource::Peashooter, GenePlace::Root, GeneType::pure_producer(|_|{todo!()}), "peashooter/peashooter_base.tres".to_string(), get_place_base), + Gene::new(GeneSource::Peashooter, GenePlace::Stem, GeneType::fill_all(),"peashooter/peashooter_stem.tres".to_string(),get_place_stem), + Gene::new(GeneSource::Peashooter, GenePlace::Head, GeneType::fill_all(),"peashooter/peashooter_head.tres".to_string(),get_place_head), + Gene::visible(GeneSource::Peashooter, GenePlace::Eyes, GeneType::Structural,"peashooter/peashooter_eyes.tres".to_string()), + Gene::visible(GeneSource::Peashooter, GenePlace::Mouth, GeneType::consumer(|_|{}), "peashooter/peashooter_mouth.tres".to_string()), + Gene::visible(GeneSource::Peashooter, GenePlace::Leaf, GeneType::modifier(|_|{todo!()}), "peashooter/peashooter_leaf.tres".to_string()), ], vec![ - - ]) + (0,1), + (1,2), + (2,3), + (2,4), + (2,5) + ]).unwrap() } fn get_place_base(place: GenePlace) -> Vector2 { - Vector2::ZERO + match place { + GenePlace::Stem => Vector2::new(-1.5,-10.5), + _ => Vector2::ZERO, + } } fn get_place_stem(place: GenePlace) -> Vector2 { - Vector2::ZERO + match place { + GenePlace::Head => Vector2::new(4.,-15.), + _ => Vector2::ZERO, + } } fn get_place_head(place: GenePlace) -> Vector2 { - Vector2::ZERO -} - -fn get_place_leaf(place: GenePlace) -> Vector2 { - Vector2::ZERO + match place { + GenePlace::Eyes => Vector2::new(1.5,-3.5), + GenePlace::Leaf => Vector2::new(-12.,-13.), + GenePlace::Mouth => Vector2::new(6.5,5.), + _ => Vector2::ZERO, + } } diff --git a/rust-pvz-genetics/src/genetics/plants/sunflower.rs b/rust-pvz-genetics/src/genetics/plants/sunflower.rs index e69de29..39f1291 100644 --- a/rust-pvz-genetics/src/genetics/plants/sunflower.rs +++ b/rust-pvz-genetics/src/genetics/plants/sunflower.rs @@ -0,0 +1,38 @@ +use crate::genetics::{gene::{Gene, GenePlace, GeneSource, GeneType}, genome::Genome}; +use godot::builtin::Vector2; + +pub fn sunflower_template() -> Genome { + Genome::from_edges(vec![ + Gene::new(GeneSource::Sunflower, GenePlace::Root, GeneType::Structural,"sunflower/sunflower_base.tres".to_string(),get_place_base), + Gene::new(GeneSource::Sunflower, GenePlace::Stem, GeneType::Structural,"sunflower/sunflower_stem.tres".to_string(),get_place_stem), + Gene::new(GeneSource::Sunflower, GenePlace::Head, GeneType::Structural, "sunflower/sunflower_head.tres".to_string(),get_place_head), // Needs to be Producer + Gene::visible(GeneSource::Sunflower, GenePlace::Eyes, GeneType::Structural, "sunflower/sunflower_eyes.tres".to_string()), + Gene::visible(GeneSource::Sunflower, GenePlace::Mouth, GeneType::consumer(|_|{}),"sunflower/sunflower_mouth.tres".to_string()) + ], vec![ + (0,1), + (1,2), + (2,3), + (2,4) + ]).unwrap() +} + +fn get_place_base(place: GenePlace) -> Vector2 { + match place { + GenePlace::Stem => Vector2::new(-1.,-12.), + _ => Vector2::ZERO + } +} + +fn get_place_stem(place: GenePlace) -> Vector2 { + match place { + GenePlace::Head => Vector2::new(4.,-13.), + _ => Vector2::ZERO + } +} +fn get_place_head(place: GenePlace) -> Vector2 { + match place { + GenePlace::Mouth => Vector2::new(1.,4.), + GenePlace::Eyes => Vector2::new(1.,-2.), + _ =>return Vector2::ZERO + } +} diff --git a/rust-pvz-genetics/src/godot_wrapper/godot_genome.rs b/rust-pvz-genetics/src/godot_wrapper/godot_genome.rs index d723142..a7cbd6a 100644 --- a/rust-pvz-genetics/src/godot_wrapper/godot_genome.rs +++ b/rust-pvz-genetics/src/godot_wrapper/godot_genome.rs @@ -2,7 +2,8 @@ use godot::prelude::*; use godot::classes::{Node,INode}; use crate::genetics::genome::Genome; -use crate::genetics::plant_templates::{cherry_bomb_template, peashooter_template, sunflower_template}; +use crate::genetics::plants::peashooter::peashooter_template; +use crate::genetics::plants::sunflower::sunflower_template; #[derive(GodotConvert, Var, Export, Default, Clone)] #[godot(via = GString)] @@ -36,7 +37,7 @@ impl INode for GodotGenome { self.genome = match self.from_plant { PlantType::Peashooter => Some(peashooter_template()), PlantType::Sunflower => Some(sunflower_template()), - PlantType::CherryBomb => Some(cherry_bomb_template()), + PlantType::CherryBomb => Some(peashooter_template()), _ => None, } } diff --git a/rust-pvz-genetics/src/godot_wrapper/plant.rs b/rust-pvz-genetics/src/godot_wrapper/plant.rs index 16517ce..1f7b47a 100644 --- a/rust-pvz-genetics/src/godot_wrapper/plant.rs +++ b/rust-pvz-genetics/src/godot_wrapper/plant.rs @@ -1,5 +1,5 @@ use godot::prelude::*; -use godot::classes::{Sprite2D,Node2D,INode2D}; +use godot::classes::{INode2D, Node2D, Sprite2D, Texture2D}; use crate::godot_wrapper::godot_genome::GodotGenome; @@ -13,27 +13,36 @@ pub struct Plant { #[godot_api] impl INode2D for Plant { - // fn ready(&mut self) { - let Some(genome) = self.genome.clone() else { return; }; + let Some(godot_genome) = self.genome.clone() else { return; }; - let Some(graph )= genome.bind().get_genome() else { return; }; + let Some(genome)= godot_genome.bind().get_genome() else { return; }; let mut children = { let mut result = Vec::new(); - for _ in 0..graph.graph.len() { - result.push(Sprite2D::new_alloc()); + for i in 0..genome.graph.len() { + result.push((Sprite2D::new_alloc(),&genome.graph[i])); } result }; - for i in 0..graph.graph.len() { - children[i].set_name(&graph.graph[i].0.place.to_string()); - for edge in &graph.graph[i].1 { - let edge_handle = children[*edge].clone(); - children[i].add_child(&edge_handle); + + for i in 0..genome.graph.len() { + children[i].0.set_name(&genome.graph[i].0.place.to_string()); + // Setting up genes + if let Some(sprite) = genome.graph[i].0.sprite.clone() { + children[i].0.set_texture(&load::(&("res://assets/sprites/".to_string() + &sprite))); + } + + // Setting up children + for edge in &genome.graph[i].1 { + let mut gene_sprite = children[*edge].0.clone(); + + gene_sprite.set_position((children[i].1.0.get_child_position)(children[*edge].1.0.place.clone())); + + children[i].0.add_child(&gene_sprite); } } - self.base_mut().add_child(&children[0]); + self.base_mut().add_child(&children[0].0); } }