Gen7ScriptsRs/gen_7_scripts/src/side/aurora_veil_effect.rs

64 lines
1.6 KiB
Rust

use crate::common_usings::*;
use crate::pokemon::reflect_effect::ReflectEffect;
use crate::script;
use crate::side::light_screen::LightScreenEffect;
script!(AuroraVeilEffect, "aurora_veil_effect", pub(crate) turns: AtomicU32);
impl Script for AuroraVeilEffect {
fn new() -> Self {
Self {
turns: Default::default(),
}
}
fn get_name(&self) -> &'static str {
Self::get_const_name()
}
fn get_capabilities(&self) -> &[ScriptCapabilities] {
&[
ScriptCapabilities::ChangeIncomingDamage,
ScriptCapabilities::OnEndTurn,
]
}
fn change_incoming_damage(
&self,
mv: ExecutingMove,
target: Pokemon,
hit: u8,
damage: &mut Saturating<u32>,
) -> PkmnResult<()> {
if mv.get_hit_data(&target, hit)?.is_critical()? {
return Ok(());
}
let side = self.get_owner().unwrap().as_side();
if side.has_volatile(ReflectEffect::get_const_name())?
&& mv.use_move().category() == MoveCategory::Physical
{
return Ok(());
}
if side.has_volatile(LightScreenEffect::get_const_name())?
&& mv.use_move().category() == MoveCategory::Special
{
return Ok(());
}
let mut modifier = 2.0;
if target.battle()?.unwrap().pokemon_per_side()? > 1 {
modifier = 1.5
}
damage.0 = (damage.0 as f32 / modifier) as u32;
Ok(())
}
fn on_end_turn(&self) -> PkmnResult<()> {
// TODO
Ok(())
}
fn as_any(&self) -> &dyn Any {
self
}
}