Change to RwLock over Mutex, so we can read without locking, changes to BattleRandom to allow for cloning, and prevent race conditions.
This commit is contained in:
@@ -15,11 +15,11 @@ use crate::static_data::statistics::Statistic;
|
||||
use crate::utils::random::Random;
|
||||
use derive_getters::Getters;
|
||||
use std::collections::HashSet;
|
||||
use std::sync::{Mutex, Weak};
|
||||
use std::sync::{RwLock, Weak};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct PokemonBattleData<'a> {
|
||||
battle: Weak<Mutex<Battle<'a>>>,
|
||||
battle: Weak<RwLock<Battle<'a>>>,
|
||||
battle_side_index: u8,
|
||||
index: u8,
|
||||
on_battle_field: bool,
|
||||
@@ -27,7 +27,7 @@ pub struct PokemonBattleData<'a> {
|
||||
}
|
||||
|
||||
impl<'a> PokemonBattleData<'a> {
|
||||
pub fn battle(&'a mut self) -> &'a mut Weak<Mutex<Battle<'a>>> {
|
||||
pub fn battle(&'a mut self) -> &'a mut Weak<RwLock<Battle<'a>>> {
|
||||
&mut self.battle
|
||||
}
|
||||
pub fn battle_side_index(&self) -> u8 {
|
||||
@@ -141,16 +141,18 @@ impl<'a> Pokemon<'a> {
|
||||
// If the pokemon is genderless, but it's new species is not, we want to set its gender
|
||||
if self.gender != Gender::Genderless && *species.gender_rate() < 0.0 {
|
||||
if self.battle_data.is_some() {
|
||||
let battle = self.battle_data.as_mut().unwrap();
|
||||
let battle_data = self.battle_data.as_mut().unwrap();
|
||||
self.gender = species.get_random_gender(
|
||||
battle
|
||||
&mut battle_data
|
||||
.battle
|
||||
.upgrade()
|
||||
.unwrap()
|
||||
.lock()
|
||||
.read()
|
||||
.unwrap()
|
||||
.random()
|
||||
.get_rng(),
|
||||
.get_rng()
|
||||
.lock()
|
||||
.unwrap(),
|
||||
);
|
||||
} else {
|
||||
self.gender = species.get_random_gender(&mut Random::default());
|
||||
@@ -167,7 +169,7 @@ impl<'a> Pokemon<'a> {
|
||||
todo!()
|
||||
}
|
||||
|
||||
pub fn set_battle_data(&mut self, battle: Weak<Mutex<Battle<'a>>>, battle_side_index: u8) {
|
||||
pub fn set_battle_data(&mut self, battle: Weak<RwLock<Battle<'a>>>, battle_side_index: u8) {
|
||||
if let Some(battle_data) = &mut self.battle_data {
|
||||
battle_data.battle = battle;
|
||||
battle_data.battle_side_index = battle_side_index;
|
||||
|
||||
Reference in New Issue
Block a user