genetics-vs-zombies/rust-pvz-genetics/src/godot_wrapper/reference_modifiers.rs
2026-04-06 00:47:05 +05:00

57 lines
1.7 KiB
Rust

use godot::prelude::*;
use crate::{genetics::manipulations::{PairGenomeModificator,SingleGenomeModificator}, godot_wrapper::godot_genome::GodotGenome};
#[derive(GodotClass)]
#[class(base=Node)]
pub struct ReferencePairModifier {
#[export]
godot_genome_a: Option<Gd<GodotGenome>>,
#[export]
godot_genome_b: Option<Gd<GodotGenome>>,
modifier: Option<PairGenomeModificator>,
base: Base<Node>,
}
#[godot_api]
impl INode for ReferencePairModifier{
fn init(base: Base<Node>) -> Self {
Self {
godot_genome_a: None,
godot_genome_b: None,
modifier: None,
base
}
}
fn ready(&mut self) {
if self.godot_genome_a.is_none() || self.godot_genome_b.is_none() {
godot_warn!("One of the genomes is not specified!");
return;
}
let (genome_a, genome_b) = (self.godot_genome_a.as_ref().unwrap().bind().get_genome(),self.godot_genome_b.as_ref().unwrap().bind().get_genome());
if genome_a.is_none() || genome_b.is_none() {
godot_warn!("One of genomes does not contain a genome!");
return;
}
self.modifier = Some(PairGenomeModificator::new(genome_a.unwrap(),genome_b.unwrap()));
}
}
#[godot_api]
impl ReferencePairModifier {
#[func]
fn allelic_crossingover(&mut self) {
if let Some(pair) = self.modifier.as_mut() {
let (genome_a,genome_b) = pair.allelic_crossingover(None);
self.godot_genome_a.as_mut().unwrap().bind_mut().set_genome(genome_a);
self.godot_genome_b.as_mut().unwrap().bind_mut().set_genome(genome_b);
godot_print!("Kukayan");
}
else {
godot_error!("Modifier is not initialized!");
}
}
}