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:
2022-06-04 12:40:32 +02:00
parent 310bf857d2
commit df662ce6b5
7 changed files with 57 additions and 57 deletions

View File

@@ -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;