Gen7ScriptsRs/gen_7_scripts/src/side/double_power_if_target_dama...

69 lines
1.6 KiB
Rust

use crate::common_usings::*;
use spin::RwLock;
script!(
DoublePowerIfTargetDamagedInTurnData,
"double_power_if_target_damaged_in_turn_data",
hits: RwLock<Vec<Pokemon>>
);
impl Script for DoublePowerIfTargetDamagedInTurnData {
fn new() -> Self {
Self {
hits: Default::default(),
}
}
fn get_name(&self) -> &'static str {
Self::get_const_name()
}
fn get_capabilities(&self) -> &[ScriptCapabilities] {
&[ScriptCapabilities::OnEndTurn, ScriptCapabilities::OnDamage]
}
fn on_end_turn(&self) -> PkmnResult<()> {
let side = self.get_owner().unwrap().as_side();
side.remove_volatile(self)?;
Ok(())
}
fn on_damage(
&self,
pokemon: Pokemon,
_source: DamageSource,
_old_health: u32,
_new_health: u32,
) -> PkmnResult<()> {
let mut write_lock = self.hits.write();
for hit_pokemon in write_lock.iter() {
if hit_pokemon.reference() == pokemon.reference() {
return Ok(());
}
}
write_lock.push(pokemon);
Ok(())
}
fn as_any(&self) -> &dyn Any {
self
}
}
impl DoublePowerIfTargetDamagedInTurnData {
pub fn create_for_assurance() -> Box<dyn Script> {
Box::new(Self {
hits: Default::default(),
})
}
pub fn has_hit_for_pokemon(&self, pokemon: &Pokemon) -> bool {
for hit_pokemon in self.hits.read().iter() {
if hit_pokemon.reference() == pokemon.reference() {
return true;
}
}
false
}
}