Implements Aurora Veil
This commit is contained in:
		
							
								
								
									
										101
									
								
								gen_7_scripts/src/moves/aurora_veil.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								gen_7_scripts/src/moves/aurora_veil.rs
									
									
									
									
									
										Normal 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 | ||||
|     } | ||||
| } | ||||
							
								
								
									
										4
									
								
								gen_7_scripts/src/moves/light_screen.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								gen_7_scripts/src/moves/light_screen.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| // TODO: Implementation | ||||
|  | ||||
| use crate::script; | ||||
| script!(LightScreenEffect, "light_screen_effect"); | ||||
| @@ -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; | ||||
|   | ||||
							
								
								
									
										5
									
								
								gen_7_scripts/src/moves/reflect.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								gen_7_scripts/src/moves/reflect.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| use crate::script; | ||||
|  | ||||
| // TODO: Implementation | ||||
|  | ||||
| script!(ReflectEffect, "reflect_effect"); | ||||
		Reference in New Issue
	
	Block a user