Implements Aurora Veil

This commit is contained in:
2022-09-10 11:12:27 +02:00
parent 19d2705221
commit c29201b36f
11 changed files with 177 additions and 4 deletions

View File

@@ -16,6 +16,7 @@ pub mod moves;
pub mod pokemon;
pub mod util_scripts;
pub(crate) mod utils;
pub mod weather;
#[no_mangle]
#[cfg(not(test))]

View File

@@ -0,0 +1,101 @@
use crate::moves::light_screen::LightScreenEffect;
use crate::moves::reflect::ReflectEffect;
use crate::script;
use crate::weather::hail::Hail;
use alloc::boxed::Box;
use core::any::Any;
use core::sync::atomic::{AtomicU32, Ordering};
use pkmn_lib_interface::app_interface::{BattleSide, ExecutingMove, MoveCategory, Pokemon};
use pkmn_lib_interface::handling::ScriptCapabilities::OnEndTurn;
use pkmn_lib_interface::handling::{Script, ScriptCapabilities};
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();
}
let script = target
.battle_side()
.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] {
&[ScriptCapabilities::ChangeIncomingDamage, OnEndTurn]
}
fn change_incoming_damage(
&self,
mv: ExecutingMove,
target: Pokemon,
hit: u8,
damage: &mut u32,
) {
if mv.get_hit_data(&target, hit).is_critical() {
return;
}
let side: BattleSide = self.get_owner().unwrap();
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
}
}

View File

@@ -0,0 +1,4 @@
// TODO: Implementation
use crate::script;
script!(LightScreenEffect, "light_screen_effect");

View File

@@ -4,4 +4,7 @@ pub mod after_you;
pub mod assist;
pub mod assurance;
pub mod attract;
pub mod aurora_veil;
pub mod light_screen;
pub mod multi_hit_move;
pub mod reflect;

View File

@@ -0,0 +1,5 @@
use crate::script;
// TODO: Implementation
script!(ReflectEffect, "reflect_effect");

View File

@@ -0,0 +1,25 @@
use crate::script;
use core::any::Any;
use pkmn_lib_interface::handling::{Script, ScriptCapabilities};
script!(Hail, "hail");
impl Script for Hail {
fn new() -> Self
where
Self: Sized,
{
Self {}
}
fn get_name(&self) -> &'static str {
Self::get_const_name()
}
fn get_capabilities(&self) -> &[ScriptCapabilities] {
todo!()
}
fn as_any(&self) -> &dyn Any {
self
}
}

View File

@@ -0,0 +1 @@
pub mod hail;