From 10e93949e40cab4a714b0479c9c8cde514ce84db Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Mon, 6 Jun 2022 16:24:13 +0200 Subject: [PATCH] Cleaner handling of tracking seen opponents. Instead of keeping track of unique identifiers, keep track of weak pointers to the pokemon, so we can just try and upgrade them later. --- src/dynamic_data/models/battle_side.rs | 8 ++++---- src/dynamic_data/models/pokemon.rs | 16 ++++++++++------ 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/dynamic_data/models/battle_side.rs b/src/dynamic_data/models/battle_side.rs index 286fe3f..16a663f 100644 --- a/src/dynamic_data/models/battle_side.rs +++ b/src/dynamic_data/models/battle_side.rs @@ -137,10 +137,10 @@ impl<'a> BattleSide<'a> { if side.index() == self.index { continue; } - for opponent in side.pokemon().iter().flatten() { - let mut opponent = opponent.write().unwrap(); - opponent.mark_opponent_as_seen(pokemon.unique_identifier()); - pokemon.mark_opponent_as_seen(opponent.unique_identifier()); + for opponent_mutex in side.pokemon().iter().flatten() { + let mut opponent = opponent_mutex.write().unwrap(); + opponent.mark_opponent_as_seen(Arc::downgrade(pokemon_mutex)); + pokemon.mark_opponent_as_seen(Arc::downgrade(opponent_mutex)); } } battle.event_hook().trigger(Event::Switch { diff --git a/src/dynamic_data/models/pokemon.rs b/src/dynamic_data/models/pokemon.rs index 7d5d2a9..2a18726 100644 --- a/src/dynamic_data/models/pokemon.rs +++ b/src/dynamic_data/models/pokemon.rs @@ -16,7 +16,6 @@ use crate::static_data::statistic_set::{ClampedStatisticSet, StatisticSet}; use crate::static_data::statistics::Statistic; use crate::utils::random::Random; use crate::{PkmnResult, ScriptCategory}; -use std::collections::HashSet; use std::sync::{Arc, RwLock, Weak}; #[derive(Debug)] @@ -25,7 +24,7 @@ pub struct PokemonBattleData<'a> { battle_side_index: u8, index: u8, on_battle_field: bool, - seen_opponents: HashSet, + seen_opponents: Vec>>>, } impl<'a> PokemonBattleData<'a> { @@ -38,7 +37,7 @@ impl<'a> PokemonBattleData<'a> { pub fn on_battle_field(&'a mut self) -> &mut bool { &mut self.on_battle_field } - pub fn seen_opponents(&'a mut self) -> &'a mut HashSet { + pub fn seen_opponents(&'a mut self) -> &'a mut Vec>>> { &mut self.seen_opponents } } @@ -253,7 +252,7 @@ impl<'a> Pokemon<'a> { pub fn active_ability(&self) -> &Option> { &self.ability_script } - pub fn seen_opponents(&self) -> Option<&HashSet> { + pub fn seen_opponents(&self) -> Option<&Vec>>>> { if let Some(data) = &self.battle_data { Some(&data.seen_opponents) } else { @@ -351,9 +350,14 @@ impl<'a> Pokemon<'a> { } } - pub fn mark_opponent_as_seen(&mut self, unique_identifier: u32) { + pub fn mark_opponent_as_seen(&mut self, pokemon: Weak>>) { if let Some(battle_data) = &mut self.battle_data { - battle_data.seen_opponents.insert(unique_identifier); + for seen_opponent in &battle_data.seen_opponents { + if seen_opponent.ptr_eq(&pokemon) { + return; + } + } + battle_data.seen_opponents.push(pokemon); } } }