2023-01-28 12:59:54 +00:00
|
|
|
use crate::common_usings::*;
|
2022-09-10 09:12:27 +00:00
|
|
|
use crate::moves::light_screen::LightScreenEffect;
|
|
|
|
use crate::moves::reflect::ReflectEffect;
|
|
|
|
use crate::weather::hail::Hail;
|
|
|
|
|
|
|
|
script!(AuroraVeil, "aurora_veil");
|
|
|
|
|
|
|
|
impl Script for AuroraVeil {
|
|
|
|
fn new() -> Self {
|
|
|
|
Self {}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn get_name(&self) -> &'static str {
|
|
|
|
Self::get_const_name()
|
|
|
|
}
|
|
|
|
|
|
|
|
fn get_capabilities(&self) -> &[ScriptCapabilities] {
|
|
|
|
&[ScriptCapabilities::OnSecondaryEffect]
|
|
|
|
}
|
|
|
|
|
|
|
|
fn on_secondary_effect(&self, mv: ExecutingMove, target: Pokemon, hit: u8) {
|
|
|
|
if target.battle().unwrap().has_weather(Hail::get_const_name()) {
|
|
|
|
return mv.get_hit_data(&target, hit).fail();
|
|
|
|
}
|
2023-01-04 17:39:27 +00:00
|
|
|
let binding = target.battle_side();
|
|
|
|
let script = binding
|
2022-09-10 09:12:27 +00:00
|
|
|
.add_volatile(Box::new(AuroraVeilEffect::new()))
|
|
|
|
.as_any()
|
|
|
|
.downcast_ref::<AuroraVeilEffect>()
|
|
|
|
.unwrap();
|
|
|
|
if mv.user().has_held_item("light_clay") {
|
|
|
|
script.turns.store(8, Ordering::SeqCst);
|
|
|
|
} else {
|
|
|
|
script.turns.store(5, Ordering::SeqCst);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn as_any(&self) -> &dyn Any {
|
|
|
|
self
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
script!(AuroraVeilEffect, "aurora_veil_effect", 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] {
|
2023-01-28 12:59:54 +00:00
|
|
|
&[
|
|
|
|
ScriptCapabilities::ChangeIncomingDamage,
|
|
|
|
ScriptCapabilities::OnEndTurn,
|
|
|
|
]
|
2022-09-10 09:12:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
fn change_incoming_damage(
|
|
|
|
&self,
|
|
|
|
mv: ExecutingMove,
|
|
|
|
target: Pokemon,
|
|
|
|
hit: u8,
|
|
|
|
damage: &mut u32,
|
|
|
|
) {
|
|
|
|
if mv.get_hit_data(&target, hit).is_critical() {
|
|
|
|
return;
|
|
|
|
}
|
2023-01-06 10:10:30 +00:00
|
|
|
let side = self.get_owner().unwrap().as_side();
|
2022-09-10 09:12:27 +00:00
|
|
|
if side.has_volatile(ReflectEffect::get_const_name())
|
|
|
|
&& mv.use_move().category() == MoveCategory::Physical
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if side.has_volatile(LightScreenEffect::get_const_name())
|
|
|
|
&& mv.use_move().category() == MoveCategory::Special
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
let mut modifier = 2.0;
|
|
|
|
if target.battle().unwrap().pokemon_per_side() > 1 {
|
|
|
|
modifier = 1.5
|
|
|
|
}
|
|
|
|
*damage = (*damage as f32 / modifier) as u32;
|
|
|
|
}
|
|
|
|
|
|
|
|
fn on_end_turn(&self) {
|
|
|
|
todo!()
|
|
|
|
}
|
|
|
|
|
|
|
|
fn as_any(&self) -> &dyn Any {
|
|
|
|
self
|
|
|
|
}
|
|
|
|
}
|